Hooks.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package me.kcm.events;
  2. import java.lang.reflect.Field;
  3. import me.kcm.command.ModServerCommandManager;
  4. import net.minecraft.block.Block;
  5. import net.minecraft.entity.Entity;
  6. import net.minecraft.entity.player.EntityPlayer;
  7. import net.minecraft.entity.player.EntityPlayerMP;
  8. import net.minecraft.inventory.Container;
  9. import net.minecraft.inventory.ContainerPlayer;
  10. import net.minecraft.inventory.ContainerWorkbench;
  11. import net.minecraft.inventory.InventoryCrafting;
  12. import net.minecraft.item.crafting.CraftingManager;
  13. import net.minecraft.item.crafting.IRecipe;
  14. import net.minecraft.server.MinecraftServer;
  15. import net.minecraft.util.math.BlockPos;
  16. import net.minecraft.util.text.ITextComponent;
  17. import net.minecraft.world.World;
  18. import net.minecraftforge.common.MinecraftForge;
  19. import net.minecraftforge.fml.relauncher.ReflectionHelper;
  20. public class Hooks
  21. {
  22. /*public static void onDamageCalculation(EntityLivingBase liv, DamageSource ds, float damage)
  23. {
  24. if(!liv.isEntityInvulnerable(ds))
  25. {
  26. MinecraftForge.EVENT_BUS.post(new LivingDamageCalculationEvent(liv, ds, damage));
  27. }
  28. }*/
  29. public static ITextComponent onGetTabListDisplayName(EntityPlayerMP p)
  30. {
  31. PlayerTabListNameEvent e = new PlayerTabListNameEvent(p);
  32. MinecraftForge.EVENT_BUS.post(e);
  33. return e.getName();
  34. }
  35. public static boolean onEntityCanTrample(Entity ent, World w, Block b, BlockPos pos, float fallDistance)
  36. {
  37. return !MinecraftForge.EVENT_BUS.post(new FarmlandTrampleEvent(w, pos, w.getBlockState(pos), fallDistance, ent));
  38. }
  39. public static void onPlayerConnection(EntityPlayerMP p)
  40. {
  41. MinecraftForge.EVENT_BUS.post(new PlayerConnectionEvent(p));
  42. }
  43. public static void onPlayerPreRespawn(EntityPlayerMP p, int dimension, boolean conqueredEnd)
  44. {
  45. MinecraftForge.EVENT_BUS.post(new PlayerPreRespawnEvent(p));
  46. }
  47. public static ModServerCommandManager onCreateCommandManager(MinecraftServer server)
  48. {
  49. return new ModServerCommandManager(server);
  50. }
  51. public static IRecipe onfindMatchingRecipe(InventoryCrafting craftMatrix, World w)
  52. {
  53. for(IRecipe irecipe : CraftingManager.REGISTRY)
  54. {
  55. if(irecipe.matches(craftMatrix, w))
  56. {
  57. Container c = getContainerEventHandler(craftMatrix);
  58. EntityPlayer p;
  59. if(c == null)
  60. {
  61. return null;
  62. }
  63. else if(c instanceof ContainerPlayer)
  64. {
  65. p = getContainerPlayer((ContainerPlayer) c);
  66. }
  67. else if(c instanceof ContainerWorkbench)
  68. {
  69. p = getContainerEventHandler((ContainerWorkbench) c);
  70. }
  71. else
  72. {
  73. return null;
  74. }
  75. System.out.println(p);
  76. RecipeChosenEvent e = new RecipeChosenEvent(p, irecipe);
  77. if(MinecraftForge.EVENT_BUS.post(e))
  78. {
  79. return null;
  80. }
  81. return e.getRecipe();
  82. }
  83. }
  84. return null;
  85. }
  86. private static Field getField(Class c, String... field)
  87. {
  88. try
  89. {
  90. return ReflectionHelper.findField(c, field);
  91. }
  92. catch(SecurityException | ReflectionHelper.UnableToFindFieldException ex)
  93. {
  94. System.out.println(String.join(", ", field) + " - " + ex);
  95. }
  96. return null;
  97. }
  98. private static <T> T getFieldValue(Class<T> cast, Object o, Field f)
  99. {
  100. try
  101. {
  102. return (T) f.get(o);
  103. }
  104. catch(SecurityException | IllegalAccessException | IllegalArgumentException ex)
  105. {
  106. System.out.println(f + " - " + ex);
  107. return null;
  108. }
  109. }
  110. private final static Field CONTAINER_EVENT_HANDLER = getField(InventoryCrafting.class, "field_70465_c", "eventHandler");
  111. public static Container getContainerEventHandler(InventoryCrafting craftMatrix)
  112. {
  113. return getFieldValue(Container.class, craftMatrix, CONTAINER_EVENT_HANDLER);
  114. }
  115. private final static Field CONTAINER_PLAYER = getField(ContainerPlayer.class, "field_82862_h", "player");
  116. public static EntityPlayer getContainerPlayer(ContainerPlayer cp)
  117. {
  118. return getFieldValue(EntityPlayer.class, cp, CONTAINER_PLAYER);
  119. }
  120. private final static Field CONTAINER_WORKBENCH = getField(ContainerWorkbench.class, "field_192390_i", "player");
  121. public static EntityPlayer getContainerEventHandler(ContainerWorkbench cw)
  122. {
  123. return getFieldValue(EntityPlayer.class, cw, CONTAINER_WORKBENCH);
  124. }
  125. }