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.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.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.util.math.Vec3d; import net.minecraft.world.WorldServer; import net.minecraftforge.event.entity.ThrowableImpactEvent; 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) { Entity ent = e.getEntity(); if(!KajetansMod.worldManager.getWorldPreferences(ent.world).skills) { return; } EntityPlayer p = Utils.getDamager(e.getSource()); if(p != null) { if(KajetansMod.effects.getEntityData(ent, "arcaneshot") != null) { Utils.teleportEntity(ent, p); } else if(KajetansMod.effects.getEntityData(ent, "rapidfire") != null) { p.heal(2); } } } 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(); Integer fromList = (Integer) KajetansMod.effects.getEntityData(p, "clusterbomb"); if(fromList != null) { int power = fromList * 600; int damage = fromList * 3; Vec3d v = arrow.getPositionVector(); EffectUtils.spawnParticle(w, EnumParticleTypes.EXPLOSION_LARGE, v, 1); EffectUtils.playEffectCircle(w, v, EnumParticleTypes.EXPLOSION_LARGE, 3, 9); DamageSource ds = DamageSource.causeMobDamage(p); EffectUtils.getEntsOfNotGuild(p, w, v, 4).forEach(e -> { e.attackEntityFrom(ds, damage); EffectUtils.addPotionTo(e, MobEffects.BLINDNESS, power, 0); }); arrow.setDead(); } else if(KajetansMod.effects.getEntityData(p, "grapplinghook") != null) { 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.effects.getEntityData(pro, "smokebomb") == null || !KajetansMod.worldManager.getWorldPreferences(pro.world).skills) { return; } EntityPlayerMP p = (EntityPlayerMP) pro.getThrower(); if(p == null) { return; } DamageSource ds = DamageSource.causeMobDamage(p); EffectUtils.spawnParticle(p.getServerWorld(), EnumParticleTypes.EXPLOSION_LARGE, pro.getPositionVector(), 1); EffectUtils.getEntsOfNotGuild(p, p.getServerWorld(), pro.getPositionVector(), 3).forEach(ent -> { ent.attackEntityFrom(ds, 4); EffectUtils.addPotionTo(ent, MobEffects.BLINDNESS, 200, 0); }); } }