diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SimpleStorageBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SimpleStorageBlockBehavior.java index 07b33233f..8d11bc8c3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SimpleStorageBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SimpleStorageBlockBehavior.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.block.behavior; import net.momirealms.craftengine.bukkit.block.entity.BukkitBlockEntityTypes; import net.momirealms.craftengine.bukkit.block.entity.SimpleStorageBlockEntity; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.nms.StorageContainer; import net.momirealms.craftengine.bukkit.plugin.gui.BukkitInventory; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; @@ -25,9 +26,6 @@ import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.CEWorld; import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,11 +71,9 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E net.momirealms.craftengine.core.entity.player.Player player = context.getPlayer(); BlockEntity blockEntity = world.getBlockEntityAtIfLoaded(context.getClickedPos()); if (player != null && blockEntity instanceof SimpleStorageBlockEntity entity) { - Player bukkitPlayer = (Player) player.platformPlayer(); - Optional.ofNullable(entity.inventory()).ifPresent(inventory -> { + Optional.ofNullable(entity.container()).ifPresent(container -> { entity.onPlayerOpen(player); - bukkitPlayer.openInventory(inventory); - new BukkitInventory(inventory).open(player, AdventureHelper.miniMessage().deserialize(this.containerTitle, PlayerOptionalContext.of(player).tagResolvers())); + new BukkitInventory(container).open(player, AdventureHelper.miniMessage().deserialize(this.containerTitle, PlayerOptionalContext.of(player).tagResolvers())); }); } return InteractionResult.SUCCESS_AND_CANCEL; @@ -156,18 +152,15 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E CEWorld ceWorld = BukkitWorldManager.instance().getWorld(bukkitWorld.getUID()); BlockEntity blockEntity = ceWorld.getBlockEntityAtIfLoaded(pos); if (blockEntity instanceof SimpleStorageBlockEntity entity) { - Inventory inventory = entity.inventory(); - if (inventory != null) { - float signal = 0.0F; - for (int i = 0; i < inventory.getSize(); i++) { - ItemStack item = inventory.getItem(i); - if (item != null) { - signal += (float) item.getAmount() / (float) (Math.min(inventory.getMaxStackSize(), item.getMaxStackSize())); - } - } - signal /= (float) inventory.getSize(); - return MiscUtils.lerpDiscrete(signal, 0, 15); + StorageContainer container = entity.container(); + if (container == null) return 0; + float signal = 0.0F; + for (Object item : container.contents()) { + if (FastNMS.INSTANCE.method$ItemStack$isEmpty(item)) continue; + signal += (float) FastNMS.INSTANCE.field$ItemStack$count(item) / (float) (Math.min(container.maxItemStackSize(), FastNMS.INSTANCE.method$ItemStack$getMaxStackSize(item))); } + signal /= (float) container.containerSize(); + return MiscUtils.lerpDiscrete(signal, 0, 15); } return 0; } @@ -183,7 +176,7 @@ public class SimpleStorageBlockBehavior extends BukkitBlockBehavior implements E BlockPos blockPos = LocationUtils.fromBlockPos(args[2]); BlockEntity blockEntity = ceWorld.getBlockEntityAtIfLoaded(blockPos); if (blockEntity instanceof SimpleStorageBlockEntity entity) { - return FastNMS.INSTANCE.method$CraftInventory$getInventory(entity.inventory()); + return entity.container(); } return null; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java index fcb654c71..0f9d064f8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.block.behavior.SimpleStorageBlockBehavior; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.nms.StorageContainer; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; @@ -23,8 +24,6 @@ import net.momirealms.sparrow.nbt.ListTag; import org.bukkit.GameEvent; import org.bukkit.GameMode; import org.bukkit.entity.HumanEntity; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; @@ -33,7 +32,7 @@ import java.util.Optional; public class SimpleStorageBlockEntity extends BlockEntity { private final SimpleStorageBlockBehavior behavior; - private final Inventory inventory; + private final StorageContainer container; private double maxInteractionDistance; private boolean openState = false; @@ -41,33 +40,31 @@ public class SimpleStorageBlockEntity extends BlockEntity { super(BukkitBlockEntityTypes.SIMPLE_STORAGE, pos, blockState); this.behavior = super.blockState.behavior().getAs(SimpleStorageBlockBehavior.class).orElseThrow(); BlockEntityHolder holder = new BlockEntityHolder(this); - this.inventory = FastNMS.INSTANCE.createSimpleStorageContainer(holder, this.behavior.rows() * 9, this.behavior.canPlaceItem(), this.behavior.canTakeItem()); - holder.setInventory(this.inventory); + this.container = FastNMS.INSTANCE.createSimpleStorageContainer(holder, this.behavior.rows() * 9, this.behavior.canPlaceItem(), this.behavior.canTakeItem()); + holder.setInventory(FastNMS.INSTANCE.constructor$CraftInventory(this.container)); } @Override protected void saveCustomData(CompoundTag tag) { // 保存前先把所有打开此容器的玩家界面关闭 - this.inventory.close(); + this.container.getViewers().forEach(HumanEntity::closeInventory); ListTag itemsTag = new ListTag(); - @Nullable ItemStack[] storageContents = this.inventory.getStorageContents(); - for (int i = 0; i < storageContents.length; i++) { - if (storageContents[i] != null) { - if (VersionHelper.isOrAbove1_20_5()) { - int slot = i; - CoreReflections.instance$ItemStack$CODEC.encodeStart(MRegistryOps.SPARROW_NBT, FastNMS.INSTANCE.field$CraftItemStack$handle(storageContents[i])) - .ifSuccess(success -> { - CompoundTag itemTag = (CompoundTag) success; - itemTag.putInt("slot", slot); - itemsTag.add(itemTag); - }) - .ifError(error -> CraftEngine.instance().logger().severe("Error while saving storage item: " + error)); - } else { - Object nmsTag = FastNMS.INSTANCE.method$itemStack$save(FastNMS.INSTANCE.field$CraftItemStack$handle(storageContents[i]), FastNMS.INSTANCE.constructor$CompoundTag()); - CompoundTag itemTag = (CompoundTag) MRegistryOps.NBT.convertTo(MRegistryOps.SPARROW_NBT, nmsTag); - itemTag.putInt("slot", i); - itemsTag.add(itemTag); - } + List items = this.container.contents(); + for (Object itemStack : items) { + if (FastNMS.INSTANCE.method$ItemStack$isEmpty(itemStack)) continue; + if (VersionHelper.isOrAbove1_20_5()) { + CoreReflections.instance$ItemStack$CODEC.encodeStart(MRegistryOps.SPARROW_NBT, itemStack) + .ifSuccess(success -> { + CompoundTag itemTag = (CompoundTag) success; + itemTag.putInt("slot", items.indexOf(itemStack)); + itemsTag.add(itemTag); + }) + .ifError(error -> CraftEngine.instance().logger().severe("Error while saving storage item: " + error)); + } else { + Object nmsTag = FastNMS.INSTANCE.method$itemStack$save(itemStack, FastNMS.INSTANCE.constructor$CompoundTag()); + CompoundTag itemTag = (CompoundTag) MRegistryOps.NBT.convertTo(MRegistryOps.SPARROW_NBT, nmsTag); + itemTag.putInt("slot", items.indexOf(itemStack)); + itemsTag.add(itemTag); } } tag.put("items", itemsTag); @@ -76,36 +73,34 @@ public class SimpleStorageBlockEntity extends BlockEntity { @Override public void loadCustomData(CompoundTag tag) { ListTag itemsTag = Optional.ofNullable(tag.getList("items")).orElseGet(ListTag::new); - ItemStack[] storageContents = new ItemStack[this.behavior.rows() * 9]; for (int i = 0; i < itemsTag.size(); i++) { CompoundTag itemTag = itemsTag.getCompound(i); int slot = itemTag.getInt("slot"); - if (slot < 0 || slot >= storageContents.length) { + if (slot < 0 || slot >= this.behavior.rows() * 9) { continue; } if (VersionHelper.isOrAbove1_20_5()) { CoreReflections.instance$ItemStack$CODEC.parse(MRegistryOps.SPARROW_NBT, itemTag) .resultOrPartial((s) -> CraftEngine.instance().logger().severe("Tried to load invalid item: '" + itemTag + "'. " + s)) - .ifPresent(nmsStack -> storageContents[slot] = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsStack)); + .ifPresent(nmsStack -> this.container.setItemStack(slot, nmsStack)); } else { Object nmsTag = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.NBT, itemTag); Object itemStack = FastNMS.INSTANCE.method$ItemStack$of(nmsTag); - storageContents[slot] = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack); + this.container.setItemStack(slot, itemStack); } } - this.inventory.setStorageContents(storageContents); } - public Inventory inventory() { + public StorageContainer container() { if (!isValid()) return null; - return this.inventory; + return this.container; } public void onPlayerOpen(Player player) { if (!isValidContainer()) return; if (!player.isSpectatorMode()) { // 有非观察者的人,那么就不触发开启音效和事件 - if (!hasNoViewer(this.inventory.getViewers())) return; + if (!hasNoViewer(this.container.getViewers())) return; this.maxInteractionDistance = Math.max(player.getCachedInteractionRange(), this.maxInteractionDistance); this.setOpen(player); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(super.world.world().serverWorld(), LocationUtils.toBlockPos(this.pos), BlockStateUtils.getBlockOwner(this.blockState.customBlockState().literalObject()), 5); @@ -116,7 +111,7 @@ public class SimpleStorageBlockEntity extends BlockEntity { if (!isValidContainer()) return; if (!player.isSpectatorMode()) { // 有非观察者的人,那么就不触发关闭音效和事件 - for (HumanEntity viewer : this.inventory.getViewers()) { + for (HumanEntity viewer : this.container.getViewers()) { if (viewer.getGameMode() == GameMode.SPECTATOR || viewer == player.platformPlayer()) { continue; } @@ -167,7 +162,7 @@ public class SimpleStorageBlockEntity extends BlockEntity { } private boolean isValidContainer() { - return this.isValid() && this.inventory != null && this.behavior != null; + return this.isValid() && this.container != null && this.behavior != null; } public void updateOpenBlockState(boolean open) { @@ -181,7 +176,7 @@ public class SimpleStorageBlockEntity extends BlockEntity { public void checkOpeners(Object level, Object pos, Object blockState) { if (!this.isValidContainer()) return; double maxInteractionDistance = 0d; - List viewers = this.inventory.getViewers(); + List viewers = this.container.getViewers(); int validViewers = 0; for (HumanEntity viewer : viewers) { if (viewer instanceof org.bukkit.entity.Player player) { @@ -206,13 +201,15 @@ public class SimpleStorageBlockEntity extends BlockEntity { @Override public void preRemove() { - this.inventory.close(); + this.container.getViewers().forEach(HumanEntity::closeInventory); Vec3d pos = Vec3d.atCenterOf(this.pos); - for (ItemStack stack : this.inventory.getContents()) { - if (stack != null) { - super.world.world().dropItemNaturally(pos, BukkitItemManager.instance().wrap(stack)); - } + for (Object stack : this.container.contents()) { + if (FastNMS.INSTANCE.method$ItemStack$isEmpty(stack)) continue; + super.world.world().dropItemNaturally(pos, BukkitItemManager.instance().wrap(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(stack))); + + } + for (int i = 0; i < this.container.containerSize(); ++i) { + this.container.setItemStack(i, CoreReflections.instance$ItemStack$EMPTY); } - this.inventory.clear(); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index a8513327a..821492e0e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -11,8 +11,10 @@ import net.momirealms.craftengine.bukkit.util.ResourcePackUtils; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; +import net.momirealms.craftengine.core.pack.obfuscation.ObfA; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.Base64Utils; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; @@ -21,6 +23,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -124,4 +127,9 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { return null; }); } + + @Override + public String toString() { + return new String(Base64Utils.decode(ObfA.VALUES, Integer.parseInt(String.valueOf(ObfA.VALUES[71]).substring(0, 1))), StandardCharsets.UTF_8); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java index 65feeb73d..513e8237e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java @@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.block.entity.BlockEntityHolder; import net.momirealms.craftengine.bukkit.block.entity.SimpleStorageBlockEntity; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.nms.StorageContainer; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; @@ -87,24 +88,27 @@ public class BukkitGuiManager implements GuiManager, Listener { @Override public Inventory createInventory(Gui gui, int size) { CraftEngineGUIHolder holder = new CraftEngineGUIHolder(gui); - org.bukkit.inventory.Inventory inventory = FastNMS.INSTANCE.createSimpleStorageContainer(holder, size, false, false); - holder.holder().bindValue(inventory); - return new BukkitInventory(inventory); + StorageContainer container = FastNMS.INSTANCE.createSimpleStorageContainer(holder, size, false, false); + holder.holder().bindValue(FastNMS.INSTANCE.constructor$CraftInventory(container)); + return new BukkitInventory(container); } @EventHandler(ignoreCancelled = true) public void onInventoryClick(InventoryClickEvent event) { org.bukkit.inventory.Inventory inventory = event.getInventory(); - if (!InventoryUtils.isCustomContainer(inventory)) return; + Object container = FastNMS.INSTANCE.method$CraftInventory$getInventory(inventory); + if (!(container instanceof StorageContainer storageContainer)) return; if (!(inventory.getHolder() instanceof CraftEngineGUIHolder craftEngineGUIHolder)) { return; } AbstractGui gui = (AbstractGui) craftEngineGUIHolder.gui(); Player player = (Player) event.getWhoClicked(); if (event.getClickedInventory() == player.getInventory()) { - gui.handleInventoryClick(new BukkitClick(event, gui, new BukkitInventory(player.getInventory()))); + Object playerContainer = FastNMS.INSTANCE.method$CraftInventory$getInventory(player.getInventory()); + if (!(playerContainer instanceof StorageContainer playerStorageContainer)) return; + gui.handleInventoryClick(new BukkitClick(event, gui, new BukkitInventory(playerStorageContainer))); } else if (event.getClickedInventory() == inventory) { - gui.handleGuiClick(new BukkitClick(event, gui, new BukkitInventory(inventory))); + gui.handleGuiClick(new BukkitClick(event, gui, new BukkitInventory(storageContainer))); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java index cbf12f265..b2e46876e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java @@ -1,22 +1,21 @@ package net.momirealms.craftengine.bukkit.plugin.gui; import net.kyori.adventure.text.Component; -import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.nms.StorageContainer; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.gui.Inventory; -import org.bukkit.inventory.ItemStack; public class BukkitInventory implements Inventory { - private final org.bukkit.inventory.Inventory inventory; + private final StorageContainer container; - public BukkitInventory(org.bukkit.inventory.Inventory inventory) { - this.inventory = inventory; + public BukkitInventory(StorageContainer container) { + this.container = container; } @Override @@ -24,14 +23,14 @@ public class BukkitInventory implements Inventory { BukkitServerPlayer serverPlayer = (BukkitServerPlayer) player; Object nmsPlayer = serverPlayer.serverPlayer(); try { - Object menuType = CraftBukkitReflections.method$CraftContainer$getNotchInventoryType.invoke(null, inventory); - int nextId = (int) CoreReflections.method$ServerPlayer$nextContainerCounter.invoke(nmsPlayer); - Object menu = CraftBukkitReflections.constructor$CraftContainer.newInstance(inventory, nmsPlayer, nextId); - CoreReflections.field$AbstractContainerMenu$checkReachable.set(menu, false); - Object packet = NetworkReflections.constructor$ClientboundOpenScreenPacket.newInstance(nextId, menuType, ComponentUtils.adventureToMinecraft(title)); + int nextId = FastNMS.INSTANCE.method$ServerPlayer$nextContainerCounter(nmsPlayer); + Object nmsTitle = ComponentUtils.adventureToMinecraft(title); + Object menu = FastNMS.INSTANCE.createSimpleContainerMenu(this.container, nextId, nmsPlayer, nmsTitle); + FastNMS.INSTANCE.field$AbstractContainerMenu$checkReachable(menu, false); + Object packet = FastNMS.INSTANCE.constructor$ClientboundOpenScreenPacket(nextId, this.container.menuType(), nmsTitle); serverPlayer.sendPacket(packet, false); - CoreReflections.field$Player$containerMenu.set(nmsPlayer, menu); - CoreReflections.method$ServerPlayer$initMenu.invoke(nmsPlayer, menu); + FastNMS.INSTANCE.field$Player$containerMenu(nmsPlayer, menu); + FastNMS.INSTANCE.method$ServerPlayer$initMenu(nmsPlayer, menu); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to create bukkit inventory", e); } @@ -39,6 +38,6 @@ public class BukkitInventory implements Inventory { @Override public void setItem(int index, Item item) { - this.inventory.setItem(index, item == null ? null : (ItemStack) item.getItem()); + this.container.setItemStack(index, item == null ? CoreReflections.instance$ItemStack$EMPTY : item.getLiteralObject()); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 9673faee6..86cf080e3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -22,7 +22,6 @@ import net.momirealms.craftengine.core.pack.model.RangeDispatchItemModel; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.pack.model.rangedisptach.CustomModelDataRangeDispatchProperty; -import net.momirealms.craftengine.core.pack.obfuscation.ObfA; import net.momirealms.craftengine.core.pack.revision.Revision; import net.momirealms.craftengine.core.pack.revision.Revisions; import net.momirealms.craftengine.core.plugin.CraftEngine; @@ -45,8 +44,6 @@ import org.yaml.snakeyaml.scanner.ScannerException; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.FileSystem; @@ -242,36 +239,16 @@ public abstract class AbstractPackManager implements PackManager { @Override public void delayedInit() { - try { - Class magicClazz = ReflectionUtils.getClazz(getClass().getSuperclass().getPackageName() + new String(Base64Utils.decode(ObfA.VALUES, Integer.parseInt(String.valueOf(ObfA.VALUES[71]).substring(0,1))), StandardCharsets.UTF_8)); - if (magicClazz != null) { - int fileCount = ObfA.VALUES[1] - ObfA.VALUES[17]; - Constructor magicConstructor = ReflectionUtils.getConstructor(magicClazz, fileCount); - assert magicConstructor != null; -// magicConstructor.newInstance(resourcePackPath(), resourcePackPath()); - Method magicMethod = ReflectionUtils.getMethod(magicClazz, void.class); - assert magicMethod != null; - final String magicStr1 = StringUtils.fromBytes(new byte[]{5, 50, 36, 56, 34, 37, 52, 50, 7, 54, 52, 60, 16, 50, 57, 50, 37, 54, 35, 62, 56, 57, 18, 47, 52, 50, 39, 35, 62, 56, 57}, 87); - final String magicStr2 = StringUtils.fromBytes(new byte[]{4, 35, 43, 46, 39, 38, 98, 54, 45, 98, 37, 39, 44, 39, 48, 35, 54, 39, 98, 48, 39, 49, 45, 55, 48, 33, 39, 98, 50, 35, 33, 41, 120, 98}, 66); - final String magicStr3 = StringUtils.fromBytes(new byte[]{107, 76, 68, 65, 72, 73, 13, 89, 66, 13, 74, 72, 67, 72, 95, 76, 89, 72, 13, 87, 68, 93, 13, 75, 68, 65, 72, 94, 39}, 45); - ReflectionUtils.getDeclaredField(getClass().getSuperclass(), StringUtils.fromBytes(new byte[]{69, 86, 79, 120, 90, 81, 90, 77, 94, 75, 80, 77}, 63)).set(this, (BiConsumer) (p1, p2) -> { - try { - Object magicObject = magicConstructor.newInstance(p1, p2); - magicMethod.invoke(magicObject); - } catch (Throwable e) { - if (e.getClass().getSimpleName().equals(magicStr1)) { - this.plugin.logger().warn(magicStr2 + e.getMessage()); - } else { - this.plugin.logger().warn(magicStr3 + new StringWriter(){{e.printStackTrace(new PrintWriter(this));}}.toString().replaceAll("\\.[Il]{2,}", "").replaceAll("/[Il]{2,}", "")); - } - } - }); - } else { - this.plugin.logger().warn("Magic class doesn't exist"); - } - } catch (Exception e) { - this.plugin.logger().warn("Failed to initialize pack manager", e); - } + Class c = ReflectionUtils.getClazz(this.getClass().getSuperclass().getPackageName() + this); + if (c == null) { + plugin.logger().warn("Failed to initialize pack manager"); + return; + } + try { + if (ReflectionUtils.UNSAFE.allocateInstance(c).equals(this)) initInternalData(); + } catch (Exception e) { + plugin.logger().warn("Failed to initialize pack manager: " + e.getMessage()); + } } @Override diff --git a/gradle.properties b/gradle.properties index 59ea7c186..b0243bdc8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ latest_supported_version=1.21.10 supported_languages=en,zh_cn,zh_tw,es,tr,de,ru_ru # Dependency settings -paper_version=1.21.9 +paper_version=1.21.10 jetbrains_annotations_version=26.0.2 slf4j_version=2.0.17 log4j_version=2.25.2 @@ -40,7 +40,7 @@ commons_io_version=2.20.0 commons_imaging_version=1.0.0-alpha6 commons_lang3_version=3.19.0 sparrow_nbt_version=0.10.3 -sparrow_util_version=0.51 +sparrow_util_version=0.52 fastutil_version=8.5.16 netty_version=4.1.127.Final joml_version=1.10.8 @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.2 -nms_helper_version=1.0.107 +nms_helper_version=1.0.108 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.34.5