ArrowEffects.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package me.km.effects.passive;
  2. import me.km.KajetansMod;
  3. import me.km.api.Location;
  4. import me.km.api.Module;
  5. import me.km.api.ModuleListener;
  6. import me.km.api.Utils;
  7. import me.km.data.EntityData;
  8. import me.km.effects.Effect;
  9. import me.km.effects.EffectBlockChanger;
  10. import me.km.effects.EffectUtils;
  11. import me.km.events.ArrowHitGroundEvent;
  12. import me.km.events.ArrowLaunchEvent;
  13. import net.minecraft.entity.Entity;
  14. import net.minecraft.entity.EntityLivingBase;
  15. import net.minecraft.entity.player.EntityPlayer;
  16. import net.minecraft.entity.player.EntityPlayerMP;
  17. import net.minecraft.entity.projectile.EntityArrow;
  18. import net.minecraft.entity.projectile.EntitySnowball;
  19. import net.minecraft.entity.projectile.EntityThrowable;
  20. import net.minecraft.init.Blocks;
  21. import net.minecraft.init.MobEffects;
  22. import net.minecraft.util.DamageSource;
  23. import net.minecraft.util.EnumParticleTypes;
  24. import net.minecraft.util.math.BlockPos;
  25. import net.minecraft.world.WorldServer;
  26. import net.minecraftforge.event.entity.ThrowableImpactEvent;
  27. import net.minecraftforge.event.entity.living.LivingAttackEvent;
  28. import net.minecraftforge.event.entity.living.LivingHurtEvent;
  29. import net.minecraftforge.event.entity.player.ArrowLooseEvent;
  30. import net.minecraftforge.fml.common.eventhandler.EventPriority;
  31. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  32. public class ArrowEffects extends ModuleListener
  33. {
  34. public ArrowEffects(Module m)
  35. {
  36. super(m);
  37. }
  38. @SubscribeEvent
  39. public void saveArrows(ArrowLooseEvent e)
  40. {
  41. if(KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills &&
  42. EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.ARROW_SAVER) >= Utils.randomInt(1, 5))
  43. {
  44. e.setCanceled(true);
  45. }
  46. }
  47. @SubscribeEvent
  48. public void onArrowLaunch(ArrowLaunchEvent e)
  49. {
  50. if(KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
  51. {
  52. int fast = EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.FASTER_ARROWS);
  53. if(fast >= 1)
  54. {
  55. Utils.scaleVelocity(e.getEntityArrow(), (fast / 5f) + 1);
  56. }
  57. }
  58. }
  59. @SubscribeEvent(receiveCanceled = false, priority = EventPriority.LOW)
  60. public void handleHurtShots(LivingHurtEvent e)
  61. {
  62. EntityLivingBase liv = e.getEntityLiving();
  63. if(!KajetansMod.worldManager.getWorldPreferences(liv.world).skills)
  64. {
  65. return;
  66. }
  67. EntityData data = KajetansMod.data.get(e.getSource().getImmediateSource());
  68. if(data != null)
  69. {
  70. if(data.hasTeleportEntity())
  71. {
  72. Utils.teleportEntity(liv, data.getTeleportEntity());
  73. }
  74. if(data.hasOnHitHealEntity())
  75. {
  76. data.getOnHitHealEntity().heal(2);
  77. }
  78. }
  79. }
  80. @SubscribeEvent(receiveCanceled = false)
  81. public void handleDragonSkin(LivingAttackEvent e)
  82. {
  83. EntityLivingBase liv = e.getEntityLiving();
  84. if(!KajetansMod.worldManager.getWorldPreferences(liv.world).skills || !(liv instanceof EntityPlayerMP))
  85. {
  86. return;
  87. }
  88. Entity ent = e.getSource().getImmediateSource();
  89. if(ent instanceof EntityArrow && KajetansMod.data.get(liv).hasArrowImmunity())
  90. {
  91. e.setCanceled(true);
  92. Utils.scaleVelocity(ent, -0.1);
  93. }
  94. }
  95. private void runArrowEffects(EntityArrow arrow)
  96. {
  97. EntityPlayer player = Utils.getPlayerFromProjectile(arrow);
  98. if(player == null || !(player instanceof EntityPlayerMP))
  99. {
  100. return;
  101. }
  102. EntityPlayerMP p = (EntityPlayerMP) player;
  103. WorldServer w = p.getServerWorld();
  104. int clusterPower = KajetansMod.data.get(arrow).getClusterPower();
  105. if(clusterPower > 0)
  106. {
  107. int power = clusterPower * 600;
  108. int damage = clusterPower * 3;
  109. EffectUtils.spawnParticle(w, EnumParticleTypes.EXPLOSION_LARGE, arrow, 1);
  110. EffectUtils.spawnParticleCircle(w, arrow, EnumParticleTypes.EXPLOSION_LARGE, 3, 9);
  111. DamageSource ds = DamageSource.causePlayerDamage(p);
  112. EffectUtils.getEntsOfNotGuild(p, w, arrow.posX, arrow.posY, arrow.posZ, 4).forEach(e ->
  113. {
  114. e.attackEntityFrom(ds, damage);
  115. EffectUtils.addPotionTo(e, MobEffects.BLINDNESS, power, 0);
  116. });
  117. arrow.setDead();
  118. }
  119. else if(KajetansMod.data.get(p).hasArrowHook())
  120. {
  121. EffectBlockChanger list = new EffectBlockChanger(w);
  122. BlockPos pos = arrow.getPosition();
  123. for(int x = -1; x <= 1; x++)
  124. {
  125. for(int y = -1; y <= 1; y++)
  126. {
  127. list.addBlock(pos, Blocks.GLASS);
  128. }
  129. }
  130. list.run(600);
  131. Utils.teleportEntity(p, new Location(p.world, pos.add(0, 1, 0)));
  132. }
  133. }
  134. @SubscribeEvent
  135. public void handleHitShots(ArrowHitGroundEvent e)
  136. {
  137. if(KajetansMod.worldManager.getWorldPreferences(e.getEntityArrow().world).skills)
  138. {
  139. runArrowEffects(e.getEntityArrow());
  140. }
  141. }
  142. @SubscribeEvent
  143. public void handleHitShots(LivingHurtEvent e)
  144. {
  145. Entity ent = e.getSource().getImmediateSource();
  146. if(ent != null && ent instanceof EntityArrow && KajetansMod.worldManager.getWorldPreferences(ent.world).skills)
  147. {
  148. runArrowEffects((EntityArrow) ent);
  149. }
  150. }
  151. @SubscribeEvent
  152. public void handleSmokeBomb(ThrowableImpactEvent e)
  153. {
  154. EntityThrowable pro = e.getEntityThrowable();
  155. if(!(pro instanceof EntitySnowball) || !(pro.getThrower() instanceof EntityPlayerMP) ||
  156. !KajetansMod.data.get(pro).isSmokeBomb() ||
  157. !KajetansMod.worldManager.getWorldPreferences(pro.world).skills)
  158. {
  159. return;
  160. }
  161. EntityPlayerMP p = (EntityPlayerMP) pro.getThrower();
  162. if(p == null)
  163. {
  164. return;
  165. }
  166. DamageSource ds = DamageSource.causePlayerDamage(p);
  167. EffectUtils.spawnParticle(p.getServerWorld(), EnumParticleTypes.EXPLOSION_LARGE, pro, 1);
  168. EffectUtils.getEntsOfNotGuild(p, p.getServerWorld(), pro.posX, pro.posY, pro.posZ, 3).forEach(ent ->
  169. {
  170. ent.attackEntityFrom(ds, 4);
  171. EffectUtils.addPotionTo(ent, MobEffects.BLINDNESS, 200, 0);
  172. });
  173. }
  174. }