Posted January 19, 20214 yr I just want to overite the Conversion Progress of the Zombie Villager. I use the PlayerInteractEvent.EntityInteractSpecific but the methode which i need is private so i use this to execute the Method: but i got an error. And i dont know where the error is becaus its the first time i just use: "reflect" package net.luis.cave.events.client.entity; imports[..]; @Mod.EventBusSubscriber(modid=Cave.Mod_Id, bus = Mod.EventBusSubscriber.Bus.FORGE) public class OnEntityInteractSpecificEvent { @SubscribeEvent public static void EntityInteractSpecific(PlayerInteractEvent.EntityInteractSpecific event) { PlayerEntity player = event.getPlayer(); LivingEntity target = (LivingEntity) event.getTarget(); World world = event.getWorld(); if (target instanceof ZombieVillagerEntity) { ZombieVillagerEntity zombieVillager = (ZombieVillagerEntity) target; if (player.getHeldItem(event.getHand()).getItem() == Items.GOLDEN_APPLE) { if (target.isPotionActive(Effects.WEAKNESS)) { event.setCanceled(true); if (!player.abilities.isCreativeMode) { player.getHeldItem(event.getHand()).shrink(1); } if (!world.isRemote) { executeMethod(zombieVillager, "startConverting", zombieVillager.getUniqueID(), 1); } } } } } public static Object executeMethod(Object obj, String methodName, Object... params) { int paramCount = params.length; Method method; Object requiredObj = null; Class<?>[] classArray = new Class<?>[paramCount]; for (int i = 0; i < paramCount; i++) { classArray[i] = params[i].getClass(); } try { method = obj.getClass().getDeclaredMethod(methodName, classArray); method.setAccessible(true); requiredObj = method.invoke(obj, params); } catch (Exception e) { e.printStackTrace(); } return requiredObj; } } [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: java.lang.NoSuchMethodException: net.minecraft.entity.monster.ZombieVillagerEntity.startConverting(java.util.UUID,java.lang.Integer) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at java.base/java.lang.Class.getDeclaredMethod(Class.java:2553) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent.genericInvokeMethod(OnEntityInteractSpecificEvent.java:45) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent.EntityInteractSpecific(OnEntityInteractSpecificEvent.java:24) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.eventbus.ASMEventHandler_17_OnEntityInteractSpecificEvent_EntityInteractSpecific_EntityInteractSpecific.invoke(.dynamic) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.eventbus.EventBus.post(EventBus.java:297) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.common.ForgeHooks.onInteractEntityAt(ForgeHooks.java:760) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.common.ForgeHooks.onInteractEntityAt(ForgeHooks.java:754) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.multiplayer.PlayerController.interactWithEntity(PlayerController.java:399) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.Minecraft.rightClickMouse(Minecraft.java:1390) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.Minecraft.processKeyBinds(Minecraft.java:1692) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.Minecraft.runTick(Minecraft.java:1507) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:979) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.Minecraft.run(Minecraft.java:612) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraft.client.main.Main.main(Main.java:184) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at java.base/java.lang.reflect.Method.invoke(Method.java:564) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:52) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [20:37:57] [Render thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:genericInvokeMethod:51]: at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) Edited January 19, 20214 yr by Luis_ST
January 19, 20214 yr Author 13 minutes ago, diesieben07 said: Because you are using an Object[] for params, the 1 will get boxed from int to Integer. If you then call getClass on it you will get the Class for Integer. startConverting however takes an int. okay thanks now i creat this: but now how to set the int? Method startConverting = ObfuscationReflectionHelper.findMethod( zombieVillager.getClass(), "startConverting", zombieVillager.getUniqueID().getClass(), /**int ?**/);
January 19, 20214 yr Author 13 minutes ago, diesieben07 said: Don't use getClass. Use class literals. 13 minutes ago, poopoodice said: int.class then Method#invoke to access it. so like this: Method startConverting = ObfuscationReflectionHelper.findMethod( zombieVillager.getClass(), "startConverting", UUID.class, int.class); startConverting.setAccessible(true); try { startConverting.invoke(zombieVillager.getUniqueID(), 1); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
January 19, 20214 yr Author 13 minutes ago, diesieben07 said: You need to use the SRG name, your mod will not work outside the development environment. i understand but what are SRG names? 13 minutes ago, diesieben07 said: Do not call findMethod every time. Do it once and store it in a static final field. 13 minutes ago, diesieben07 said: You do not need to call setAccessible when using ObfsucationReflectionHelper. okay 13 minutes ago, diesieben07 said: The UUID the method expects is supposed to be a player, not the zombie's UUID. You can use null if the conversion is not started by a player. the conversion is start by a player so i use player.getUniqueID() this is my code: https://github.com/Luis-st/Forge-1.16.4-35.1.4-mdk/blob/main/forge-1.16.4-35.1.4-mdk/src/main/java/net/luis/cave/events/client/entity/OnEntityInteractSpecificEvent.java Edited January 19, 20214 yr by Luis_ST add code
January 19, 20214 yr Author 2 minutes ago, diesieben07 said: you can use forge-bot on the Forge discord to find it. It's necessary for the code to work in the obfuscated environment. is the rest of my code correct: https://github.com/Luis-st/Forge-1.16.4-35.1.4-mdk/blob/main/forge-1.16.4-35.1.4-mdk/src/main/java/net/luis/cave/events/client/entity/OnEntityInteractSpecificEvent.java and which is the comand for the bot? !sgr and then the name -> !sgr startConverting
January 19, 20214 yr Author 1 minute ago, diesieben07 said: Use !commands to get a list of commands. i just use this but i cant find a command with this name i try to get the command with !help <each Command>
January 19, 20214 yr Author 2 minutes ago, diesieben07 said: mcpm / mcpf for methods / classes respectively. when its correct its func_191991_a
January 19, 20214 yr Author 1 minute ago, diesieben07 said: Does it work? nop i got an new Error: [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at java.base/java.lang.reflect.Method.invoke(Method.java:564) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent.EntityInteractSpecific(OnEntityInteractSpecificEvent.java:51) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraftforge.eventbus.ASMEventHandler_16_OnEntityInteractSpecificEvent_EntityInteractSpecific_EntityInteractSpecific.invoke(.dynamic) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraftforge.eventbus.EventBus.post(EventBus.java:297) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraftforge.common.ForgeHooks.onInteractEntityAt(ForgeHooks.java:760) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.network.play.ServerPlayNetHandler.processUseEntity(ServerPlayNetHandler.java:1246) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.network.play.client.CUseEntityPacket.processPacket(CUseEntityPacket.java:89) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.network.play.client.CUseEntityPacket.processPacket(CUseEntityPacket.java:15) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.network.PacketThreadUtil.lambda$checkThreadAndEnqueue$0(PacketThreadUtil.java:19) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.util.concurrent.TickDelayedTask.run(TickDelayedTask.java:20) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.util.concurrent.ThreadTaskExecutor.run(ThreadTaskExecutor.java:139) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.util.concurrent.RecursiveEventLoop.run(RecursiveEventLoop.java:22) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:758) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:159) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.util.concurrent.ThreadTaskExecutor.driveOne(ThreadTaskExecutor.java:109) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.driveOneInternal(MinecraftServer.java:741) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.driveOne(MinecraftServer.java:735) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.util.concurrent.ThreadTaskExecutor.driveUntil(ThreadTaskExecutor.java:122) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.runScheduledTasks(MinecraftServer.java:721) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:667) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at net.minecraft.server.MinecraftServer.lambda$startServer$0(MinecraftServer.java:233) [10:25:09] [Server thread/INFO] [STDERR/]: [net.luis.cave.events.client.entity.OnEntityInteractSpecificEvent:EntityInteractSpecific:59]: at java.base/java.lang.Thread.run(Thread.java:832) this is my code: package net.luis.cave.events.client.entity; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.UUID; import net.luis.cave.Cave; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.monster.ZombieVillagerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Items; import net.minecraft.world.World; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; @Mod.EventBusSubscriber(modid=Cave.Mod_Id, bus = Mod.EventBusSubscriber.Bus.FORGE) public class OnEntityInteractSpecificEvent { private static final Method startConverting = ObfuscationReflectionHelper.findMethod(ZombieVillagerEntity.class, "func_191991_a", UUID.class, int.class); @SubscribeEvent public static void EntityInteractSpecific(PlayerInteractEvent.EntityInteractSpecific event) { PlayerEntity player = event.getPlayer(); LivingEntity target = (LivingEntity) event.getTarget(); World world = event.getWorld(); if (target instanceof ZombieVillagerEntity) { if (player.getHeldItem(event.getHand()).getItem() == Items.GOLDEN_APPLE) { if (!player.abilities.isCreativeMode) { player.getHeldItem(event.getHand()).shrink(1); } if (!world.isRemote) { try { startConverting.invoke(player.getUniqueID(), 1); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } } }
January 19, 20214 yr Author 2 minutes ago, poopoodice said: You did not pass the instance of the object (zombie). but where i have to pass that
January 19, 20214 yr Author 14 minutes ago, diesieben07 said: Read the documentation for invoke. Thanks for your helping.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.