mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-31 21:06:31 +00:00
Merge remote-tracking branch 'upstream/dev' into dev
# Conflicts: # gradle.properties
This commit is contained in:
@@ -7,6 +7,11 @@ import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import dev.dejvokep.boostedyaml.YamlDocument;
|
||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||
import it.unimi.dsi.fastutil.ints.IntArrayList;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
||||
import net.momirealms.craftengine.bukkit.nms.FastNMS;
|
||||
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
|
||||
import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
|
||||
@@ -55,11 +60,11 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
private final BlockParser blockParser;
|
||||
|
||||
// A temporary map used to detect whether the same block state corresponds to multiple models.
|
||||
private final Map<Integer, Key> tempRegistryIdConflictMap = new HashMap<>();
|
||||
private final Map<Integer, Key> tempRegistryIdConflictMap = new Int2ObjectOpenHashMap<>();
|
||||
// A temporary map that converts the custom block registered on the server to the vanilla block ID.
|
||||
private final Map<Integer, Integer> tempBlockAppearanceConvertor = new HashMap<>();
|
||||
private final Map<Integer, Integer> tempBlockAppearanceConvertor = new Int2IntOpenHashMap();
|
||||
// A temporary map that stores the model path of a certain vanilla block state
|
||||
private final Map<Integer, JsonElement> tempVanillaBlockStateModels = new HashMap<>();
|
||||
private final Map<Integer, JsonElement> tempVanillaBlockStateModels = new Int2ObjectOpenHashMap<>();
|
||||
|
||||
// The total amount of blocks registered
|
||||
private int customBlockCount;
|
||||
@@ -79,10 +84,10 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
private ImmutableSet<Object> affectedSoundBlocks;
|
||||
private ImmutableMap<Key, Key> soundMapper;
|
||||
// A list to record the order of registration
|
||||
private List<Key> blockRegisterOrder = new ArrayList<>();
|
||||
private List<Key> blockRegisterOrder = new ObjectArrayList<>();
|
||||
|
||||
// a reverted mapper
|
||||
private final Map<Integer, List<Integer>> appearanceToRealState = new HashMap<>();
|
||||
private final Map<Integer, List<Integer>> appearanceToRealState = new Int2ObjectOpenHashMap<>();
|
||||
// Used to store override information of json files
|
||||
private final Map<Key, Map<String, JsonElement>> blockStateOverrides = new HashMap<>();
|
||||
// for mod, real block id -> state models
|
||||
@@ -232,11 +237,11 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
}
|
||||
|
||||
public ImmutableMap<Key, List<Integer>> blockAppearanceArranger() {
|
||||
return blockAppearanceArranger;
|
||||
return this.blockAppearanceArranger;
|
||||
}
|
||||
|
||||
public ImmutableMap<Key, List<Integer>> realBlockArranger() {
|
||||
return realBlockArranger;
|
||||
return this.realBlockArranger;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -275,7 +280,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
try {
|
||||
Class<?> modClass = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS);
|
||||
Field amountField = ReflectionUtils.getDeclaredField(modClass, "vanillaRegistrySize");
|
||||
vanillaStateCount = (int) amountField.get(null);
|
||||
vanillaStateCount = amountField.getInt(null);
|
||||
} catch (Exception e) {
|
||||
vanillaStateCount = RegistryUtils.currentBlockRegistrySize();
|
||||
plugin.logger().severe("Fatal error", e);
|
||||
@@ -481,7 +486,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
}
|
||||
stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()] = state;
|
||||
tempBlockAppearanceConvertor.put(state.customBlockState().registryId(), state.vanillaBlockState().registryId());
|
||||
appearanceToRealState.computeIfAbsent(state.vanillaBlockState().registryId(), k -> new ArrayList<>()).add(state.customBlockState().registryId());
|
||||
appearanceToRealState.computeIfAbsent(state.vanillaBlockState().registryId(), k -> new IntArrayList()).add(state.customBlockState().registryId());
|
||||
}
|
||||
|
||||
BukkitBlockManager.this.byId.put(id, block);
|
||||
@@ -649,9 +654,9 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
YamlDocument mappings = Config.instance().loadOrCreateYamlData("mappings.yml");
|
||||
Map<String, String> blockStateMappings = loadBlockStateMappings(mappings);
|
||||
this.validateBlockStateMappings(mappingFile, blockStateMappings);
|
||||
Map<Integer, String> stateMap = new HashMap<>();
|
||||
Map<Integer, String> stateMap = new Int2ObjectOpenHashMap<>();
|
||||
Map<Key, Integer> blockTypeCounter = new LinkedHashMap<>();
|
||||
Map<Integer, Integer> appearanceMapper = new HashMap<>();
|
||||
Map<Integer, Integer> appearanceMapper = new Int2IntOpenHashMap();
|
||||
Map<Key, List<Integer>> appearanceArranger = new HashMap<>();
|
||||
for (Map.Entry<String, String> entry : blockStateMappings.entrySet()) {
|
||||
this.processBlockStateMapping(mappingFile, entry, stateMap, blockTypeCounter, appearanceMapper, appearanceArranger);
|
||||
@@ -727,7 +732,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
counter.compute(key, (k, count) -> count == null ? 1 : count + 1);
|
||||
stateMap.put(beforeId, entry.getKey());
|
||||
stateMap.put(afterId, entry.getValue());
|
||||
arranger.computeIfAbsent(key, (k) -> new ArrayList<>()).add(beforeId);
|
||||
arranger.computeIfAbsent(key, (k) -> new IntArrayList()).add(beforeId);
|
||||
} else {
|
||||
String previousState = stateMap.get(previous);
|
||||
plugin.logger().warn(mappingFile, "Duplicate entry: '" + previousState + "' equals '" + entry.getKey() + "'");
|
||||
@@ -776,7 +781,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
|
||||
Object clientSideBlock = getBlockFromRegistry(createResourceLocation(clientSideBlockType));
|
||||
int amount = blockWithCount.getValue();
|
||||
|
||||
List<Integer> stateIds = new ArrayList<>();
|
||||
List<Integer> stateIds = new IntArrayList();
|
||||
|
||||
for (int i = 0; i < amount; i++) {
|
||||
Key realBlockKey = createRealBlockKey(clientSideBlockType, i);
|
||||
|
||||
@@ -26,6 +26,7 @@ public class ComponentTypes {
|
||||
public static final Object CUSTOM_DATA = getComponentType(ComponentKeys.CUSTOM_DATA);
|
||||
public static final Object PROFILE = getComponentType(ComponentKeys.PROFILE);
|
||||
public static final Object DYED_COLOR = getComponentType(ComponentKeys.DYED_COLOR);
|
||||
public static final Object DEATH_PROTECTION = getComponentType(ComponentKeys.DEATH_PROTECTION);
|
||||
|
||||
private ComponentTypes() {}
|
||||
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
package net.momirealms.craftengine.bukkit.plugin.command.feature;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.craftengine.bukkit.item.ComponentTypes;
|
||||
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature;
|
||||
import net.momirealms.craftengine.bukkit.util.MaterialUtils;
|
||||
import net.momirealms.craftengine.bukkit.util.PlayerUtils;
|
||||
import net.momirealms.craftengine.core.item.CustomItem;
|
||||
import net.momirealms.craftengine.core.item.*;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
|
||||
import net.momirealms.craftengine.core.plugin.command.FlagKeys;
|
||||
import net.momirealms.craftengine.core.plugin.locale.MessageConstants;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -23,9 +25,13 @@ import org.incendo.cloud.bukkit.parser.NamespacedKeyParser;
|
||||
import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
import org.incendo.cloud.context.CommandInput;
|
||||
import org.incendo.cloud.parser.flag.CommandFlag;
|
||||
import org.incendo.cloud.parser.standard.StringParser;
|
||||
import org.incendo.cloud.suggestion.Suggestion;
|
||||
import org.incendo.cloud.suggestion.SuggestionProvider;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class TotemAnimationCommand extends BukkitCommandFeature<CommandSender> {
|
||||
@@ -45,18 +51,38 @@ public class TotemAnimationCommand extends BukkitCommandFeature<CommandSender> {
|
||||
return CompletableFuture.completedFuture(plugin().itemManager().cachedTotemSuggestions());
|
||||
}
|
||||
}))
|
||||
.flag(CommandFlag.builder("sound_event").withComponent(NamespacedKeyParser.namespacedKeyParser()).build())
|
||||
.flag(CommandFlag.builder("sound_location").withComponent(NamespacedKeyParser.namespacedKeyParser()).build())
|
||||
.handler(context -> {
|
||||
NamespacedKey namespacedKey = context.get("id");
|
||||
Key key = Key.of(namespacedKey.namespace(), namespacedKey.value());
|
||||
CustomItem<ItemStack> item = plugin().itemManager().getCustomItem(key).orElse(null);
|
||||
if (item == null || MaterialUtils.getMaterial(item.material()) != Material.TOTEM_OF_UNDYING) {
|
||||
CustomItem<ItemStack> customItem = plugin().itemManager().getCustomItem(key).orElse(null);
|
||||
if (customItem == null || (!VersionHelper.isOrAbove1_21_2() && customItem.material().equals(ItemKeys.TOTEM_OF_UNDYING))) {
|
||||
handleFeedback(context, MessageConstants.COMMAND_TOTEM_NOT_TOTEM, Component.text(key.toString()));
|
||||
return;
|
||||
}
|
||||
ItemStack totem = item.buildItemStack();
|
||||
Item<ItemStack> item = customItem.buildItem(ItemBuildContext.EMPTY);
|
||||
if (VersionHelper.isOrAbove1_21_2()) {
|
||||
if (context.flags().contains("sound_location")) {
|
||||
String soundResourceLocation = context.flags().getValue("sound_location").get().toString();
|
||||
if (soundResourceLocation != null) {
|
||||
item.setComponent(ComponentTypes.DEATH_PROTECTION, Map.of("death_effects", List.of(Map.of("type", "play_sound", "sound", Map.of(
|
||||
"sound_id", soundResourceLocation
|
||||
)))));
|
||||
}
|
||||
} else if (context.flags().contains("sound_event")) {
|
||||
String soundEvent = context.flags().getValue("sound_event").get().toString();
|
||||
if (soundEvent != null) {
|
||||
item.setComponent(ComponentTypes.DEATH_PROTECTION, Map.of("death_effects", List.of(Map.of("type", "play_sound", "sound", soundEvent))));
|
||||
}
|
||||
} else {
|
||||
item.setComponent(ComponentTypes.DEATH_PROTECTION, Map.of());
|
||||
}
|
||||
}
|
||||
ItemStack totemItem = item.load();
|
||||
MultiplePlayerSelector selector = context.get("players");
|
||||
for (Player player : selector.values()) {
|
||||
PlayerUtils.sendTotemAnimation(player, totem);
|
||||
PlayerUtils.sendTotemAnimation(player, totemItem);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
package net.momirealms.craftengine.bukkit.plugin.gui;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.gui.AbstractGui;
|
||||
import net.momirealms.craftengine.core.plugin.gui.Gui;
|
||||
import net.momirealms.craftengine.core.plugin.gui.GuiManager;
|
||||
import net.momirealms.craftengine.core.plugin.gui.Inventory;
|
||||
import net.momirealms.craftengine.bukkit.util.ComponentUtils;
|
||||
import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils;
|
||||
import net.momirealms.craftengine.bukkit.util.Reflections;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.gui.*;
|
||||
import net.momirealms.craftengine.core.util.VersionHelper;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@@ -13,6 +16,7 @@ import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||
import org.bukkit.inventory.MenuType;
|
||||
|
||||
public class BukkitGuiManager implements GuiManager, Listener {
|
||||
private final BukkitCraftEngine plugin;
|
||||
@@ -31,6 +35,47 @@ public class BukkitGuiManager implements GuiManager, Listener {
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
|
||||
@SuppressWarnings("UnstableApiUsage")
|
||||
@Override
|
||||
public void openInventory(net.momirealms.craftengine.core.entity.player.Player player, GuiType guiType) {
|
||||
Player bukkitPlayer = (Player) player.platformPlayer();
|
||||
if (VersionHelper.isOrAbove1_21_4()) {
|
||||
switch (guiType) {
|
||||
case ANVIL -> MenuType.ANVIL.create(bukkitPlayer).open();
|
||||
case LOOM -> MenuType.LOOM.create(bukkitPlayer).open();
|
||||
case ENCHANTMENT -> MenuType.ENCHANTMENT.create(bukkitPlayer).open();
|
||||
case CRAFTING -> MenuType.CRAFTING.create(bukkitPlayer).open();
|
||||
case CARTOGRAPHY -> MenuType.CARTOGRAPHY_TABLE.create(bukkitPlayer).open();
|
||||
case SMITHING -> MenuType.SMITHING.create(bukkitPlayer).open();
|
||||
case GRINDSTONE -> MenuType.GRINDSTONE.create(bukkitPlayer).open();
|
||||
}
|
||||
} else {
|
||||
switch (guiType) {
|
||||
case ANVIL -> LegacyInventoryUtils.openAnvil(bukkitPlayer);
|
||||
case LOOM -> LegacyInventoryUtils.openLoom(bukkitPlayer);
|
||||
case GRINDSTONE -> LegacyInventoryUtils.openGrindstone(bukkitPlayer);
|
||||
case SMITHING -> LegacyInventoryUtils.openSmithingTable(bukkitPlayer);
|
||||
case CRAFTING -> LegacyInventoryUtils.openWorkbench(bukkitPlayer);
|
||||
case ENCHANTMENT -> LegacyInventoryUtils.openEnchanting(bukkitPlayer);
|
||||
case CARTOGRAPHY -> LegacyInventoryUtils.openCartographyTable(bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateInventoryTitle(net.momirealms.craftengine.core.entity.player.Player player, Component component) {
|
||||
Object nmsPlayer = player.serverPlayer();
|
||||
try {
|
||||
Object containerMenu = Reflections.field$Player$containerMenu.get(nmsPlayer);
|
||||
int containerId = Reflections.field$AbstractContainerMenu$containerId.getInt(containerMenu);
|
||||
Object menuType = Reflections.field$AbstractContainerMenu$menuType.get(containerMenu);
|
||||
Object packet = Reflections.constructor$ClientboundOpenScreenPacket.newInstance(containerId, menuType, ComponentUtils.adventureToMinecraft(component));
|
||||
player.sendPacket(packet, false);
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().warn("Failed to update inventory title", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Inventory createInventory(Gui gui, int size) {
|
||||
CraftEngineInventoryHolder holder = new CraftEngineInventoryHolder(gui);
|
||||
|
||||
@@ -31,7 +31,7 @@ public class BukkitInventory implements Inventory {
|
||||
Reflections.field$Player$containerMenu.set(nmsPlayer, menu);
|
||||
Reflections.method$ServerPlayer$initMenu.invoke(nmsPlayer, menu);
|
||||
} catch (Exception e) {
|
||||
CraftEngine.instance().logger().warn("Failed to update inventory title", e);
|
||||
CraftEngine.instance().logger().warn("Failed to create bukkit inventory", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user