package me.km.effects.passive; import me.km.KajetansMod; import me.km.api.Location; import me.km.api.Module; import me.km.api.ModuleListener; import me.km.api.Utils; import me.km.data.EntityData; import me.km.effects.Effect; import me.km.effects.EffectBlockChanger; import me.km.effects.EffectUtils; import me.km.events.ArrowHitGroundEvent; import me.km.events.ArrowLaunchEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntitySnowball; import net.minecraft.entity.projectile.EntityThrowable; import net.minecraft.init.Blocks; import net.minecraft.init.MobEffects; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldServer; import net.minecraftforge.event.entity.ThrowableImpactEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class ArrowEffects extends ModuleListener { public ArrowEffects(Module m) { super(m); } @SubscribeEvent public void saveArrows(ArrowLooseEvent e) { if(KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills && EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.ARROW_SAVER) >= Utils.randomInt(1, 5)) { e.setCanceled(true); } } @SubscribeEvent public void onArrowLaunch(ArrowLaunchEvent e) { if(KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills) { int fast = EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.FASTER_ARROWS); if(fast >= 1) { Utils.scaleVelocity(e.getEntityArrow(), (fast / 5f) + 1); } } } @SubscribeEvent(receiveCanceled = false, priority = EventPriority.LOW) public void handleHurtShots(LivingHurtEvent e) { EntityLivingBase liv = e.getEntityLiving(); if(!KajetansMod.worldManager.getWorldPreferences(liv.world).skills) { return; } EntityData data = KajetansMod.data.get(e.getSource().getImmediateSource()); if(data != null) { if(data.hasTeleportEntity()) { Utils.teleportEntity(liv, data.getTeleportEntity()); } if(data.hasOnHitHealEntity()) { data.getOnHitHealEntity().heal(2); } } } @SubscribeEvent(receiveCanceled = false) public void handleDragonSkin(LivingAttackEvent e) { EntityLivingBase liv = e.getEntityLiving(); if(!KajetansMod.worldManager.getWorldPreferences(liv.world).skills || !(liv instanceof EntityPlayerMP)) { return; } Entity ent = e.getSource().getImmediateSource(); if(ent instanceof EntityArrow && KajetansMod.data.get(liv).hasArrowImmunity()) { e.setCanceled(true); Utils.scaleVelocity(ent, -0.1); } } private void runArrowEffects(EntityArrow arrow) { EntityPlayer player = Utils.getPlayerFromProjectile(arrow); if(player == null || !(player instanceof EntityPlayerMP)) { return; } EntityPlayerMP p = (EntityPlayerMP) player; WorldServer w = p.getServerWorld(); int clusterPower = KajetansMod.data.get(arrow).getClusterPower(); if(clusterPower > 0) { int power = clusterPower * 600; int damage = clusterPower * 3; EffectUtils.spawnParticle(w, EnumParticleTypes.EXPLOSION_LARGE, arrow, 1); EffectUtils.spawnParticleCircle(w, arrow, EnumParticleTypes.EXPLOSION_LARGE, 3, 9); DamageSource ds = DamageSource.causePlayerDamage(p); EffectUtils.getEntsOfNotGuild(p, w, arrow.posX, arrow.posY, arrow.posZ, 4).forEach(e -> { e.attackEntityFrom(ds, damage); EffectUtils.addPotionTo(e, MobEffects.BLINDNESS, power, 0); }); arrow.setDead(); } else if(KajetansMod.data.get(p).hasArrowHook()) { EffectBlockChanger list = new EffectBlockChanger(w); BlockPos pos = arrow.getPosition(); for(int x = -1; x <= 1; x++) { for(int y = -1; y <= 1; y++) { list.addBlock(pos, Blocks.GLASS); } } list.run(600); Utils.teleportEntity(p, new Location(p.world, pos.add(0, 1, 0))); } } @SubscribeEvent public void handleHitShots(ArrowHitGroundEvent e) { if(KajetansMod.worldManager.getWorldPreferences(e.getEntityArrow().world).skills) { runArrowEffects(e.getEntityArrow()); } } @SubscribeEvent public void handleHitShots(LivingHurtEvent e) { Entity ent = e.getSource().getImmediateSource(); if(ent != null && ent instanceof EntityArrow && KajetansMod.worldManager.getWorldPreferences(ent.world).skills) { runArrowEffects((EntityArrow) ent); } } @SubscribeEvent public void handleSmokeBomb(ThrowableImpactEvent e) { EntityThrowable pro = e.getEntityThrowable(); if(!(pro instanceof EntitySnowball) || !(pro.getThrower() instanceof EntityPlayerMP) || !KajetansMod.data.get(pro).isSmokeBomb() || !KajetansMod.worldManager.getWorldPreferences(pro.world).skills) { return; } EntityPlayerMP p = (EntityPlayerMP) pro.getThrower(); if(p == null) { return; } DamageSource ds = DamageSource.causePlayerDamage(p); EffectUtils.spawnParticle(p.getServerWorld(), EnumParticleTypes.EXPLOSION_LARGE, pro, 1); EffectUtils.getEntsOfNotGuild(p, p.getServerWorld(), pro.posX, pro.posY, pro.posZ, 3).forEach(ent -> { ent.attackEntityFrom(ds, 4); EffectUtils.addPotionTo(ent, MobEffects.BLINDNESS, 200, 0); }); } }