9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

refactor(core): 存储容器逻辑

This commit is contained in:
jhqwqmc
2025-10-10 01:07:27 +08:00
parent 508fbc988d
commit f26ec2a489
7 changed files with 94 additions and 116 deletions

View File

@@ -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;
}

View File

@@ -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<HumanEntity> viewers = this.inventory.getViewers();
List<HumanEntity> 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();
}
}

View File

@@ -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);
}
}

View File

@@ -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)));
}
}

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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