EntityDamageEffects.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package me.km.effects.passive;
  2. import me.km.KajetansMod;
  3. import me.km.api.Module;
  4. import me.km.api.ModuleListener;
  5. import me.km.api.Utils;
  6. import me.km.capabilities.DamageUtils;
  7. import me.km.effects.Effect;
  8. import me.km.effects.EffectUtils;
  9. import me.km.events.PlayerHurtEvent;
  10. import me.km.playerbank.PlayerData;
  11. import me.km.utils.ReflectionUtils;
  12. import net.minecraft.entity.Entity;
  13. import net.minecraft.entity.EntityLivingBase;
  14. import net.minecraft.entity.player.EntityPlayer;
  15. import net.minecraft.entity.player.EntityPlayerMP;
  16. import net.minecraft.init.MobEffects;
  17. import net.minecraft.util.CombatRules;
  18. import net.minecraft.util.DamageSource;
  19. import net.minecraftforge.event.entity.living.LivingHealEvent;
  20. import net.minecraftforge.event.entity.living.LivingHurtEvent;
  21. import net.minecraftforge.fml.common.eventhandler.EventPriority;
  22. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  23. public class EntityDamageEffects extends ModuleListener
  24. {
  25. public EntityDamageEffects(Module m)
  26. {
  27. super(m);
  28. }
  29. @SubscribeEvent(receiveCanceled = false)
  30. public void damageHandler(PlayerHurtEvent e)
  31. {
  32. EntityPlayerMP p = e.getEntityPlayer();
  33. if(!KajetansMod.worldManager.getWorldPreferences(p.world).skills)
  34. {
  35. return;
  36. }
  37. int reducer = EffectUtils.getEffectLevel(p, Effect.LESS_DAMAGE);
  38. if(reducer > 0)
  39. {
  40. e.setAmount(e.getAmount() / (reducer + 1));
  41. }
  42. PlayerData data = KajetansMod.playerbank.getData(p);
  43. if(data.hasData("shadow"))
  44. {
  45. p.setInvisible(false);
  46. data.removeData("shadow");
  47. }
  48. DamageSource cause = e.getSource();
  49. if(cause.isMagicDamage() && EffectUtils.getEffectLevel(p, Effect.NO_POISON) >= 1)
  50. {
  51. e.setCanceled(true);
  52. }
  53. else if(cause == DamageSource.FALL)
  54. {
  55. if(data.hasData("fallimmunity"))
  56. {
  57. e.setCanceled(true);
  58. return;
  59. }
  60. int fall = EffectUtils.getEffectLevel(p, Effect.LESS_FALL_DAMAGE);
  61. if(fall >= 1)
  62. {
  63. e.setAmount(e.getAmount() / (fall * 2 + 1));
  64. }
  65. }
  66. }
  67. @SubscribeEvent(priority = EventPriority.LOWEST)
  68. public void onEntityDamage(LivingHurtEvent e)
  69. {
  70. // ---------------------------------------------------------------------
  71. // injection of new damage system
  72. // ---------------------------------------------------------------------
  73. if(!e.isCanceled())
  74. {
  75. e.setCanceled(true);
  76. KajetansMod.scheduler.scheduleTask(() ->
  77. {
  78. float damageAmount = e.getAmount();
  79. DamageSource ds = e.getSource();
  80. EntityLivingBase liv = e.getEntityLiving();
  81. if(ds != DamageSource.LAVA && ds != DamageSource.IN_WALL && ds != DamageSource.CRAMMING && ds != DamageSource.DROWN)
  82. {
  83. if(ds.isMagicDamage() && !ds.isDamageAbsolute())
  84. {
  85. ReflectionUtils.damageArmor(liv, damageAmount);
  86. damageAmount = CombatRules.getDamageAfterAbsorb(damageAmount, DamageUtils.getMagicDefense(liv), 0);
  87. }
  88. else
  89. {
  90. damageAmount = ReflectionUtils.applyArmorCalculations(liv, ds, damageAmount);
  91. }
  92. damageAmount = ReflectionUtils.applyPotionDamageCalculations(liv, ds, damageAmount);
  93. }
  94. else
  95. {
  96. damageAmount = liv.getMaxHealth() / 10;
  97. }
  98. float f = damageAmount;
  99. damageAmount = Math.max(damageAmount - liv.getAbsorptionAmount(), 0.0F);
  100. liv.setAbsorptionAmount(liv.getAbsorptionAmount() - (f - damageAmount));
  101. if (damageAmount != 0.0F)
  102. {
  103. float f1 = liv.getHealth();
  104. liv.setHealth(f1 - damageAmount);
  105. liv.getCombatTracker().trackDamage(ds, f1, damageAmount);
  106. liv.setAbsorptionAmount(liv.getAbsorptionAmount() - damageAmount);
  107. }
  108. });
  109. }
  110. else
  111. {
  112. return;
  113. }
  114. // ---------------------------------------------------------------------
  115. // end of new damage system injection
  116. // ---------------------------------------------------------------------
  117. if(!KajetansMod.worldManager.getWorldPreferences(e.getEntity().world).skills)
  118. {
  119. return;
  120. }
  121. Entity pEnt = e.getSource().getImmediateSource();
  122. if(pEnt == null || !(pEnt instanceof EntityPlayerMP))
  123. {
  124. return;
  125. }
  126. EntityPlayerMP p = (EntityPlayerMP) pEnt;
  127. Utils.ToolTypes tt = Utils.getToolType(p.getHeldItemMainhand());
  128. float damageBonus = 1;
  129. if(tt != null)
  130. {
  131. switch(tt)
  132. {
  133. case AXE:
  134. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_AXE_DAMAGE);
  135. break;
  136. case HOE:
  137. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_HOE_DAMAGE);
  138. break;
  139. case PICKAXE:
  140. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_PICKAXE_DAMAGE);
  141. break;
  142. case SHOVEL:
  143. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_SHOVEL_DAMAGE);
  144. break;
  145. case SWORD:
  146. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_SWORD_DAMAGE);
  147. break;
  148. case DAGGER:
  149. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_DAGGER_DAMAGE);
  150. break;
  151. case HAMMER:
  152. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_HAMMER_DAMAGE);
  153. break;
  154. case STICK:
  155. damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_STICK_DAMAGE);
  156. break;
  157. }
  158. }
  159. EntityLivingBase ent = e.getEntityLiving();
  160. PlayerData data = KajetansMod.playerbank.getData(p);
  161. if(data.removeData("shadowhit"))
  162. {
  163. EffectUtils.addPotionTo(p, MobEffects.SPEED, 40, 1);
  164. EffectUtils.addPotionTo(p, MobEffects.INVISIBILITY, 40, 0);
  165. }
  166. if(ent instanceof EntityPlayerMP)
  167. {
  168. EntityPlayerMP victim = (EntityPlayerMP) ent;
  169. EntityPlayer damager = KajetansMod.playerbank.getData(victim).getData("doomed", EntityPlayer.class);
  170. if(damager != null && damager.equals(p))
  171. {
  172. damageBonus *= 1.2f;
  173. }
  174. }
  175. if(data.hasData("poisonedblade"))
  176. {
  177. EffectUtils.addPotionTo(ent, MobEffects.POISON, 80, 1);
  178. }
  179. if(data.hasData("armorpasser"))
  180. {
  181. float reduced = e.getAmount() - Utils.getDamagerAfterArmor(ent, e.getSource(), e.getAmount());
  182. e.setAmount(e.getAmount() + reduced * 0.35f);
  183. }
  184. double powerAttack = data.getDouble("powerattack");
  185. if(powerAttack != 0)
  186. {
  187. damageBonus *= powerAttack;
  188. data.removeData("powerattack");
  189. }
  190. powerAttack = data.getDouble("cpower");
  191. if(powerAttack != 0)
  192. {
  193. damageBonus *= powerAttack;
  194. }
  195. powerAttack = data.getDouble("impactpunch");
  196. if(powerAttack != 0)
  197. {
  198. damageBonus *= powerAttack;
  199. EffectUtils.addPotionTo(ent, MobEffects.SLOWNESS, (int) (powerAttack * 20), 1);
  200. data.removeData("impactpunch");
  201. }
  202. e.setAmount(e.getAmount() * damageBonus);
  203. }
  204. @SubscribeEvent(receiveCanceled = false)
  205. public void onEntityHeal(LivingHealEvent e)
  206. {
  207. if(!KajetansMod.worldManager.getWorldPreferences(e.getEntity().world).skills)
  208. {
  209. return;
  210. }
  211. Entity ent = e.getEntityLiving();
  212. if(!(ent instanceof EntityPlayerMP))
  213. {
  214. return;
  215. }
  216. EntityPlayerMP p = (EntityPlayerMP) ent;
  217. PlayerData data = KajetansMod.playerbank.getData(p);
  218. if(data.hasData("lessheal"))
  219. {
  220. e.setAmount(e.getAmount() / 2);
  221. }
  222. }
  223. }