CustomEventCaller.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package me.km.events;
  2. import java.util.HashMap;
  3. import java.util.LinkedList;
  4. import me.hammerle.snuviscript.code.Script;
  5. import me.km.DamageUtils;
  6. import me.km.playerbank.PlayerManager;
  7. import me.km.scheduler.SnuviScheduler;
  8. import me.km.utils.ReflectionUtils;
  9. import net.minecraft.entity.LivingEntity;
  10. import net.minecraft.entity.SharedMonsterAttributes;
  11. import net.minecraft.server.MinecraftServer;
  12. import net.minecraft.util.CombatRules;
  13. import net.minecraft.util.DamageSource;
  14. import net.minecraftforge.event.entity.living.LivingHurtEvent;
  15. import net.minecraftforge.eventbus.api.EventPriority;
  16. import net.minecraftforge.eventbus.api.SubscribeEvent;
  17. import net.minecraftforge.fml.common.gameevent.TickEvent;
  18. public class CustomEventCaller
  19. {
  20. private final HashMap<Integer, PlayerMoveData> moveData = new HashMap<>();
  21. private final LinkedList<Integer> removeQueue = new LinkedList<>();
  22. private final LinkedList<PlayerMoveData> addQueue = new LinkedList<>();
  23. private final PlayerManager pManager;
  24. private final MinecraftServer server;
  25. private final SnuviScheduler scheduler;
  26. public CustomEventCaller(PlayerManager pManager, MinecraftServer server, SnuviScheduler scheduler)
  27. {
  28. this.pManager = pManager;
  29. this.server = server;
  30. this.scheduler = scheduler;
  31. }
  32. public int registerMoveData(PlayerMoveData data)
  33. {
  34. addQueue.add(data);
  35. return data.getId();
  36. }
  37. public void removeScriptData(Script sc)
  38. {
  39. moveData.entrySet().forEach(e ->
  40. {
  41. if(e.getValue().isSameScript(sc))
  42. {
  43. removeQueue.add(e.getValue().getId());
  44. }
  45. });
  46. }
  47. public void removeMoveData(int id)
  48. {
  49. removeQueue.add(id);
  50. }
  51. @SubscribeEvent
  52. public void onServerTick(TickEvent.ServerTickEvent e)
  53. {
  54. if(e.phase == TickEvent.Phase.END)
  55. {
  56. scheduler.tick();
  57. if(!addQueue.isEmpty())
  58. {
  59. addQueue.forEach(data -> moveData.put(data.getId(), data));
  60. addQueue.clear();
  61. }
  62. moveData.values().removeIf(data ->
  63. {
  64. if(data.tickLiving())
  65. {
  66. return true;
  67. }
  68. if(data.tick())
  69. {
  70. return false;
  71. }
  72. return server.getPlayerList().getPlayers().stream().anyMatch(p -> data.check(p));
  73. });
  74. if(!removeQueue.isEmpty())
  75. {
  76. removeQueue.forEach(i -> moveData.remove(i));
  77. removeQueue.clear();
  78. }
  79. }
  80. }
  81. private float getRealDamage(float damageAmount, DamageSource ds, LivingEntity liv)
  82. {
  83. if(ds != DamageSource.LAVA && ds != DamageSource.IN_WALL && ds != DamageSource.CRAMMING && ds != DamageSource.DROWN)
  84. {
  85. if(ds.isMagicDamage() && !ds.isDamageAbsolute()) // Magic Damage
  86. {
  87. ReflectionUtils.damageArmor(liv, damageAmount);
  88. int armor = DamageUtils.getMagicDefense(liv);
  89. damageAmount = CombatRules.getDamageAfterAbsorb(damageAmount, armor, 0);
  90. }
  91. else if(!ds.isUnblockable())
  92. {
  93. ReflectionUtils.damageArmor(liv, damageAmount);
  94. int armor = liv.getTotalArmorValue();
  95. damageAmount = CombatRules.getDamageAfterAbsorb(damageAmount, armor, (float) liv.getAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getValue());
  96. }
  97. damageAmount = ReflectionUtils.applyPotionDamageCalculations(liv, ds, damageAmount);
  98. }
  99. else
  100. {
  101. damageAmount = liv.getMaxHealth() / 10;
  102. }
  103. return damageAmount;
  104. }
  105. @SubscribeEvent(priority = EventPriority.LOWEST)
  106. public void newDamageSystem(LivingHurtEvent e)
  107. {
  108. // ---------------------------------------------------------------------
  109. // injection of new damage system
  110. // ---------------------------------------------------------------------
  111. if(!e.isCanceled())
  112. {
  113. e.setCanceled(true);
  114. DamageSource ds = e.getSource();
  115. LivingEntity liv = e.getEntityLiving();
  116. float damageAmount = getRealDamage(e.getAmount(), ds, liv);
  117. float f = damageAmount;
  118. damageAmount = Math.max(damageAmount - liv.getAbsorptionAmount(), 0.0f);
  119. liv.setAbsorptionAmount(liv.getAbsorptionAmount() - (f - damageAmount));
  120. if(damageAmount != 0.0f)
  121. {
  122. float f1 = liv.getHealth();
  123. liv.setHealth(f1 - damageAmount);
  124. liv.getCombatTracker().trackDamage(ds, f1, damageAmount);
  125. liv.setAbsorptionAmount(liv.getAbsorptionAmount() - damageAmount);
  126. }
  127. }
  128. }
  129. }