package me.kcm.events; import java.lang.reflect.Field; import me.kcm.command.ModServerCommandManager; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerPlayer; import net.minecraft.inventory.ContainerWorkbench; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.ReflectionHelper; public class Hooks { /*public static void onDamageCalculation(EntityLivingBase liv, DamageSource ds, float damage) { if(!liv.isEntityInvulnerable(ds)) { MinecraftForge.EVENT_BUS.post(new LivingDamageCalculationEvent(liv, ds, damage)); } }*/ public static ITextComponent onGetTabListDisplayName(EntityPlayerMP p) { PlayerTabListNameEvent e = new PlayerTabListNameEvent(p); MinecraftForge.EVENT_BUS.post(e); return e.getName(); } public static void onSetEntityActionState(EntityPlayerMP p, float strafe, float forward, boolean jumping, boolean sneaking) { System.out.println("WUSI"); } public static boolean onEntityCanTrample(Entity ent, World w, Block b, BlockPos pos, float fallDistance) { return !MinecraftForge.EVENT_BUS.post(new FarmlandTrampleEvent(w, pos, w.getBlockState(pos), fallDistance, ent)); } public static void onPlayerConnection(EntityPlayerMP p) { MinecraftForge.EVENT_BUS.post(new PlayerConnectionEvent(p)); } public static void onPlayerPreRespawn(EntityPlayerMP p, int dimension, boolean conqueredEnd) { MinecraftForge.EVENT_BUS.post(new PlayerPreRespawnEvent(p)); } public static ModServerCommandManager onCreateCommandManager(MinecraftServer server) { return new ModServerCommandManager(server); } public static IRecipe onfindMatchingRecipe(InventoryCrafting craftMatrix, World w) { for(IRecipe irecipe : CraftingManager.REGISTRY) { if(irecipe.matches(craftMatrix, w)) { Container c = getContainerEventHandler(craftMatrix); EntityPlayer p; if(c == null) { return null; } else if(c instanceof ContainerPlayer) { p = getContainerPlayer((ContainerPlayer) c); } else if(c instanceof ContainerWorkbench) { p = getContainerEventHandler((ContainerWorkbench) c); } else { return null; } System.out.println(p); RecipeChosenEvent e = new RecipeChosenEvent(p, irecipe); if(MinecraftForge.EVENT_BUS.post(e)) { return null; } return e.getRecipe(); } } return null; } private static Field getField(Class c, String... field) { try { return ReflectionHelper.findField(c, field); } catch(SecurityException | ReflectionHelper.UnableToFindFieldException ex) { System.out.println(String.join(", ", field) + " - " + ex); } return null; } private static T getFieldValue(Class cast, Object o, Field f) { try { return (T) f.get(o); } catch(SecurityException | IllegalAccessException | IllegalArgumentException ex) { System.out.println(f + " - " + ex); return null; } } private final static Field CONTAINER_EVENT_HANDLER = getField(InventoryCrafting.class, "field_70465_c", "eventHandler"); public static Container getContainerEventHandler(InventoryCrafting craftMatrix) { return getFieldValue(Container.class, craftMatrix, CONTAINER_EVENT_HANDLER); } private final static Field CONTAINER_PLAYER = getField(ContainerPlayer.class, "field_82862_h", "player"); public static EntityPlayer getContainerPlayer(ContainerPlayer cp) { return getFieldValue(EntityPlayer.class, cp, CONTAINER_PLAYER); } private final static Field CONTAINER_WORKBENCH = getField(ContainerWorkbench.class, "field_192390_i", "player"); public static EntityPlayer getContainerEventHandler(ContainerWorkbench cw) { return getFieldValue(EntityPlayer.class, cw, CONTAINER_WORKBENCH); } }