Hooks.java 4.8 KB

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