Открытие Container

Версия Minecraft
1.6.4
API
Forge
77
2
2
Добрый день, подменяю инвентарь игрока на свой новый контейнер, все работает, но из-за того что контейнер открывается со стороны сервера, у меня есть некоторый промежуток между открытием контейнера. Как можно реализовать открытие без отправления пакета на сервер?

Java:
@ForgeSubscribe
public void onOpen(GuiOpenEvent event) {
    if(event.gui instanceof GuiInventory) {
        EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer;
        if(!player.capabilities.isCreativeMode) {
            event.setCanceled(true);
            PacketDispatcher.sendPacketToServer(new Packet250CustomPayload(Main.channel, new byte[]{(byte)0}));
        }
    }
}

Java:
@Override
public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) {
    if(packet.channel.equalsIgnoreCase(Main.channel)) {
        ((EntityPlayer)player).openGui(Main.instance, 0, null, 0, 0, 0);
    }
}
 
7,099
324
1,509
Попробуй вместо отправки пакета повторно просто подменять контейнер на сервере и гуи на клиенте. Т.е. ловить два события с двух сторон.
Зеленые стрелки: твой мод
1615892110270.png
 
Последнее редактирование:
77
2
2
Попробуй вместо отправки пакета повторно просто подменять контейнер на сервере и гуи на клиенте. Т.е. ловить два события с двух сторон.
Зеленые стрелки: твой мод

Событие "PlayerOpenContainerEvent" вызывается постоянно, вне зависимости открыт гуи или нет :(
 
7,099
324
1,509
Событие "PlayerOpenContainerEvent" вызывается постоянно, вне зависимости открыт гуи или нет
А для какого контейнера вызывается? Ты хочешь заменить контейнер инвентаря игрока?
 
7,099
324
1,509
Ну так там флудит тот контейнер, что тебе нужен? Или ты хочешь заменить все контейнеры?
 
77
2
2
Решил просто добавить в дефолтный контейнер новый слот, для этого использую хук-либу от GloomyFolken.

Java:
public class AmadeusHook extends HookLoader {

    @Override
    public String[] getASMTransformerClass() {
        return new String[]{PrimaryClassTransformer.class.getName()};
    }

    @Override
    protected void registerHooks() {
        registerHookContainer("ru.jok1r.amadeusInventory.hook.AmadeusHook");
    }

    @Hook(targetMethod = "<init>")
    public static void addSlotToContainer(ContainerPlayer containerPlayer, InventoryPlayer p_i1819_1_, boolean p_i1819_2_, EntityPlayer p_i1819_3_) {
        ExtendedPlayer z = ExtendedPlayer.get(p_i1819_3_);
        containerPlayer.addSlotToContainer(new ExtendedSlot(z.inventory, 0, 88, 64, 0));
    }
}

Но метод "addSlotToContainer" является protected, как обойти? (IDEA, gradlew)

1615929847376.png
 
Последнее редактирование:
7,099
324
1,509
Перемести хук в тот же пакет, что и целевой класс или используй рефлексию
 
77
2
2
Вроде бы смог запустить, закинув декомп. класс Container изменив там protected метод на public.
Но теперь при входе в мир (одиночку) в чат выписывает ошибку и слот просто не добавляется, не очень понимаю в чем проблема :9 (Даже заменив строчку с добавлением слота на вывод безобидного сообщения в консоле, то есть дело точно не в методе)
Java:
public class AmadeusHook extends HookLoader {

    @Override
    public String[] getASMTransformerClass() {
        return new String[]{PrimaryClassTransformer.class.getName()};
    }

    @Override
    protected void registerHooks() {
        registerHookContainer("ru.jok1r.amadeusInventory.hook.AmadeusHook");
    }

    @Hook(targetMethod = "<init>")
    public static void addSlotToContainer(ContainerPlayer containerPlayer, InventoryPlayer p_i1819_1_, boolean p_i1819_2_, EntityPlayer p_i1819_3_) {
        containerPlayer.addSlotToContainer(new ExtendedSlot(ExtendedPlayer.get(p_i1819_1_.player).inventory, 46, 88, 64, 0));
    }
}

Java:
2021-03-17 18:50:19 [INFO] [STDOUT] [DEBUG] Injecting hooks into class net.minecraft.inventory.ContainerPlayer
2021-03-17 18:50:19 [INFO] [STDOUT] [SEVERE] A problem has occured during transformation of class net.minecraft.inventory.ContainerPlayer.
2021-03-17 18:50:19 [INFO] [STDOUT] [SEVERE] Attached hooks:
2021-03-17 18:50:19 [INFO] [STDOUT] [SEVERE] Stack trace:
2021-03-17 18:50:19 [INFO] [STDERR] java.lang.ArrayIndexOutOfBoundsException: -1
2021-03-17 18:50:19 [INFO] [STDERR]     at java.util.ArrayList.elementData(ArrayList.java:424)
2021-03-17 18:50:19 [INFO] [STDERR]     at java.util.ArrayList.remove(ArrayList.java:501)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.commons.AdviceAdapter.popValue(AdviceAdapter.java:560)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.commons.AdviceAdapter.visitMethodInsn(AdviceAdapter.java:423)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.asm.AsmHook.injectInvokeStatic(AsmHook.java:188)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.asm.AsmHook.inject(AsmHook.java:85)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.asm.HookInjector.visitHook(HookInjector.java:33)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.asm.HookInjector$MethodEnter.onMethodEnter(HookInjector.java:53)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.commons.AdviceAdapter.visitMethodInsn(AdviceAdapter.java:438)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1320)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:938)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.ClassReader.accept(ClassReader.java:669)
2021-03-17 18:50:19 [INFO] [STDERR]     at org.objectweb.asm.ClassReader.accept(ClassReader.java:506)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.asm.HookClassTransformer.transform(HookClassTransformer.java:51)
2021-03-17 18:50:19 [INFO] [STDERR]     at gloomyfolken.hooklib.minecraft.MinecraftClassTransformer.transform(MinecraftClassTransformer.java:56)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:274)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:172)
2021-03-17 18:50:19 [INFO] [STDERR]     at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
2021-03-17 18:50:19 [INFO] [STDERR]     at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.management.ServerConfigurationManager.createPlayerForUser(ServerConfigurationManager.java:389)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:91)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:691)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:587)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:129)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:484)
2021-03-17 18:50:19 [INFO] [STDERR]     at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:583)
 

will0376

Токсичная личность
2,059
55
572
используй рефлексию
AT ЕСТЬ и на 1.4.7, так что пусть снимет через него (И ОСТЕРЕГАЙТЕСЬ RAILCRAFT! ТАМ (я не разрешал меня оскорблять, как бы не хотелось скрыть маты) ОДНИ, СТАВЯЩИЕ ПРОТЕКТ НА ПОЛЯ)
 
Последнее редактирование:
Сверху