Search in sources :

Example 46 with Entity

use of org.spongepowered.api.entity.Entity in project Skree by Skelril.

the class CursedMineListener method onPlayerTeleport.

@Listener
public void onPlayerTeleport(MoveEntityEvent.Teleport event) {
    Entity entity = event.getTargetEntity();
    if (!(entity instanceof Player)) {
        return;
    }
    Player player = (Player) entity;
    Optional<CursedMineInstance> optInst = manager.getApplicableZone(player);
    HitList hitList = manager.getHitList();
    if ((optInst.isPresent() && optInst.get().hasRecordForPlayer(player)) || hitList.isOnHitList(player)) {
        event.setCancelled(true);
        player.sendMessage(Text.of(TextColors.RED, "You have been tele-blocked!"));
    }
}
Also used : Entity(org.spongepowered.api.entity.Entity) Player(org.spongepowered.api.entity.living.player.Player) HitList(com.skelril.skree.content.zone.global.cursedmine.hitlist.HitList) Listener(org.spongepowered.api.event.Listener)

Example 47 with Entity

use of org.spongepowered.api.entity.Entity in project Skree by Skelril.

the class JungleRaidEffectListener method onProjectileHit.

@Listener
public void onProjectileHit(CollideEvent.Impact event, @First Entity entity) {
    Optional<JungleRaidInstance> optInst = manager.getApplicableZone(entity);
    if (!optInst.isPresent())
        return;
    JungleRaidInstance inst = optInst.get();
    if (inst.getState() != JungleRaidState.IN_PROGRESS) {
        return;
    }
    int explosionSize = 2;
    if (entity.getType() == EntityTypes.TIPPED_ARROW) {
        if (inst.isFlagEnabled(JungleRaidFlag.TORMENT_ARROWS)) {
            ProjectileSource shooter = ((Arrow) entity).getShooter();
            CuboidContainmentPredicate predicate = new CuboidContainmentPredicate(entity.getLocation().getPosition(), 16, 16, 16);
            for (Entity e : entity.getNearbyEntities(en -> predicate.test(en.getLocation().getPosition()))) {
                if (e.equals(shooter))
                    continue;
                if (e instanceof Living && shooter instanceof Living) {
                    e.damage(1, IndirectEntityDamageSource.builder().type(DamageTypes.PROJECTILE).entity(entity).proxySource((Living) shooter).build());
                    if (Probability.getChance(5)) {
                        EntityHealthUtil.heal((Living) shooter, 1);
                    }
                }
            }
        }
        if (inst.isFlagEnabled(JungleRaidFlag.EXPLOSIVE_ARROWS)) {
            if (inst.isFlagEnabled(JungleRaidFlag.SUPER))
                explosionSize = 4;
        } else
            return;
    }
    if (entity instanceof Snowball) {
        if (inst.isFlagEnabled(JungleRaidFlag.GRENADES)) {
            if (inst.isFlagEnabled(JungleRaidFlag.SUPER))
                explosionSize = 10;
            else
                explosionSize = 6;
        } else
            return;
    }
    if (entity instanceof ThrownPotion) {
        return;
    }
    entity.getLocation().getExtent().triggerExplosion(Explosion.builder().radius(explosionSize).location(entity.getLocation()).shouldDamageEntities(true).shouldBreakBlocks(true).build(), Cause.source(SkreePlugin.container()).build());
}
Also used : Arrow(org.spongepowered.api.entity.projectile.arrow.Arrow) CuboidContainmentPredicate(com.skelril.nitro.position.CuboidContainmentPredicate) Entity(org.spongepowered.api.entity.Entity) Snowball(org.spongepowered.api.entity.projectile.Snowball) Living(org.spongepowered.api.entity.living.Living) ThrownPotion(org.spongepowered.api.entity.projectile.ThrownPotion) ProjectileSource(org.spongepowered.api.entity.projectile.source.ProjectileSource) Listener(org.spongepowered.api.event.Listener)

Example 48 with Entity

use of org.spongepowered.api.entity.Entity in project Skree by Skelril.

the class JungleRaidEffectListener method createFor.

private PlayerCombatParser createFor(Cancellable event, JungleRaidInstance inst) {
    return new PlayerCombatParser() {

        @Override
        public void processPvP(Player attacker, Player defender, @Nullable Entity indirectSource) {
            final boolean isDamageEntityEvent = event instanceof DamageEntityEvent;
            // Do Death Touch before anything else
            if (inst.isFlagEnabled(JungleRaidFlag.DEATH_TOUCH) && isDamageEntityEvent) {
                ((DamageEntityEvent) event).setBaseDamage(Math.pow(defender.get(Keys.MAX_HEALTH).orElse(20D), 3));
                return;
            }
            Optional<JungleRaidClass> optClass = inst.getClass(attacker);
            if (optClass.isPresent()) {
                JungleRaidClass jrClass = optClass.get();
                if (jrClass == JungleRaidClass.SNIPER) {
                    Optional<ItemStack> optHeld = attacker.getItemInHand(HandTypes.MAIN_HAND);
                    boolean hasWoodenSword = optHeld.isPresent() && optHeld.get().getItem() == ItemTypes.WOODEN_SWORD;
                    if (indirectSource != null || !hasWoodenSword) {
                        double distSq = attacker.getLocation().getPosition().distanceSquared(defender.getLocation().getPosition());
                        double targetDistSq = Math.pow(70, 2);
                        double ratio = Math.min(distSq, targetDistSq) / targetDistSq;
                        if (isDamageEntityEvent) {
                            // Handle damage modification
                            ((DamageEntityEvent) event).setBaseDamage(((DamageEntityEvent) event).getBaseDamage() * ratio);
                        } else {
                            // Disable the arrow fire in the Impact event
                            if (ratio < .7 && indirectSource != null) {
                                indirectSource.offer(Keys.FIRE_TICKS, 0);
                            }
                        }
                    }
                }
            }
            if (inst.isFlagEnabled(JungleRaidFlag.TITAN_MODE) && attacker.getUniqueId().equals(inst.getFlagData().titan) && isDamageEntityEvent) {
                ((DamageEntityEvent) event).setBaseDamage(((DamageEntityEvent) event).getBaseDamage() * 2);
            }
        }

        @Override
        public void processNonLivingAttack(DamageSource attacker, Player defender) {
            if (!(event instanceof DamageEntityEvent)) {
                return;
            }
            if (attacker.getType() == DamageTypes.FALL) {
                BlockType belowType = defender.getLocation().add(0, -1, 0).getBlockType();
                if (inst.isFlagEnabled(JungleRaidFlag.TRAMPOLINE)) {
                    Vector3d oldVel = defender.getVelocity();
                    Vector3d newVel = new Vector3d(oldVel.getX(), 0, oldVel.getZ());
                    defender.setVelocity(new Vector3d(0, .1, 0).mul(((DamageEntityEvent) event).getBaseDamage()).add(newVel));
                    event.setCancelled(true);
                } else if (belowType == BlockTypes.LEAVES || belowType == BlockTypes.LEAVES2) {
                    if (Probability.getChance(2)) {
                        Vector3d oldVel = defender.getVelocity();
                        Vector3d newVel = new Vector3d(oldVel.getX() > 0 ? -.5 : .5, 0, oldVel.getZ() > 0 ? -.5 : .5);
                        defender.setVelocity(new Vector3d(0, .1, 0).mul(((DamageEntityEvent) event).getBaseDamage()).add(newVel));
                    }
                    event.setCancelled(true);
                }
            } else if (attacker.getType() == DamageTypes.CUSTOM) {
                if (inst.isFlagEnabled(JungleRaidFlag.EXPLOSIVE_ARROWS) || inst.isFlagEnabled(JungleRaidFlag.GRENADES)) {
                    ((DamageEntityEvent) event).setBaseDamage(Math.min(((DamageEntityEvent) event).getBaseDamage(), 2));
                }
            }
        }
    };
}
Also used : DamageEntityEvent(org.spongepowered.api.event.entity.DamageEntityEvent) Entity(org.spongepowered.api.entity.Entity) Player(org.spongepowered.api.entity.living.player.Player) DamageSource(org.spongepowered.api.event.cause.entity.damage.source.DamageSource) IndirectEntityDamageSource(org.spongepowered.api.event.cause.entity.damage.source.IndirectEntityDamageSource) BlockType(org.spongepowered.api.block.BlockType) Vector3d(com.flowpowered.math.vector.Vector3d) PlayerCombatParser(com.skelril.nitro.combat.PlayerCombatParser) ItemStack(org.spongepowered.api.item.inventory.ItemStack) ItemStackFactory.newItemStack(com.skelril.nitro.item.ItemStackFactory.newItemStack) Nullable(javax.annotation.Nullable)

Example 49 with Entity

use of org.spongepowered.api.entity.Entity in project Skree by Skelril.

the class SnipeeBossManager method handleDamage.

private void handleDamage() {
    List<Instruction<DamageCondition, Boss<Living, ZoneBossDetail<FreakyFourInstance>>>> damageProcessor = getDamageProcessor();
    damageProcessor.add((condition, boss) -> {
        Entity attacked = condition.getAttacked();
        if (attacked instanceof Living) {
            EntityHealthUtil.forceDamage((Living) attacked, EntityHealthUtil.getMaxHealth((Living) attacked) * config.snipeeDamage);
            condition.getEvent().setBaseDamage(0);
        }
        return Optional.empty();
    });
}
Also used : Entity(org.spongepowered.api.entity.Entity) Living(org.spongepowered.api.entity.living.Living) NamedBindInstruction(com.skelril.skree.content.zone.group.catacombs.instruction.bossmove.NamedBindInstruction) Instruction(com.skelril.openboss.Instruction) HealthBindInstruction(com.skelril.skree.content.zone.group.freakyfour.boss.bossmove.HealthBindInstruction) HealableInstruction(com.skelril.skree.content.zone.group.freakyfour.boss.bossmove.HealableInstruction) BackTeleportInstruction(com.skelril.skree.content.zone.group.freakyfour.boss.bossmove.BackTeleportInstruction) ZoneBossDetail(com.skelril.skree.content.zone.ZoneBossDetail)

Example 50 with Entity

use of org.spongepowered.api.entity.Entity in project Skree by Skelril.

the class BackTeleportInstruction method apply.

@Override
public Optional<Instruction<DamagedCondition, Boss<Living, ZoneBossDetail<FreakyFourInstance>>>> apply(DamagedCondition damagedCondition, Boss<Living, ZoneBossDetail<FreakyFourInstance>> livingZoneBossDetailBoss) {
    DamageEntityEvent event = damagedCondition.getEvent();
    new PlayerCombatParser() {

        @Override
        public void processPlayerAttack(Player attacker, Living defender) {
            boolean backTeleport = Probability.getChance(config.backTeleport);
            if (backTeleport || damagedCondition.getDamageSource().get() instanceof IndirectEntityDamageSource) {
                double distSQ = 2;
                double maxDist = 1;
                if (defender instanceof Skeleton) {
                    distSQ = defender.getLocation().getPosition().distanceSquared(attacker.getLocation().getPosition());
                    maxDist = config.snipeeTeleportDist;
                }
                if (backTeleport || distSQ > Math.pow(maxDist, 2)) {
                    final Entity finalDamager = attacker;
                    Task.builder().execute(() -> {
                        defender.setLocation(finalDamager.getLocation());
                        throwBack(defender);
                    }).delayTicks(1).submit(SkreePlugin.inst());
                }
            }
        }
    }.parse(event);
    return Optional.empty();
}
Also used : DamageEntityEvent(org.spongepowered.api.event.entity.DamageEntityEvent) Entity(org.spongepowered.api.entity.Entity) Player(org.spongepowered.api.entity.living.player.Player) Living(org.spongepowered.api.entity.living.Living) Skeleton(org.spongepowered.api.entity.living.monster.Skeleton) IndirectEntityDamageSource(org.spongepowered.api.event.cause.entity.damage.source.IndirectEntityDamageSource) PlayerCombatParser(com.skelril.nitro.combat.PlayerCombatParser)

Aggregations

Entity (org.spongepowered.api.entity.Entity)59 Player (org.spongepowered.api.entity.living.player.Player)23 World (org.spongepowered.api.world.World)19 Living (org.spongepowered.api.entity.living.Living)17 Listener (org.spongepowered.api.event.Listener)13 Vector3d (com.flowpowered.math.vector.Vector3d)10 ArrayList (java.util.ArrayList)8 DamageSource (org.spongepowered.api.event.cause.entity.damage.source.DamageSource)8 Instruction (com.skelril.openboss.Instruction)7 ItemStack (org.spongepowered.api.item.inventory.ItemStack)7 Location (org.spongepowered.api.world.Location)7 Zombie (org.spongepowered.api.entity.living.monster.Zombie)6 IndirectEntityDamageSource (org.spongepowered.api.event.cause.entity.damage.source.IndirectEntityDamageSource)6 ZoneBossDetail (com.skelril.skree.content.zone.ZoneBossDetail)5 PotionEffect (org.spongepowered.api.effect.potion.PotionEffect)5 EntityDamageSource (org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource)5 DamageEntityEvent (org.spongepowered.api.event.entity.DamageEntityEvent)5 TileEntity (org.spongepowered.api.block.tileentity.TileEntity)4 Vector3i (com.flowpowered.math.vector.Vector3i)3 PlayerCombatParser (com.skelril.nitro.combat.PlayerCombatParser)3