Search in sources :

Example 1 with MirrorTrait

use of com.denizenscript.denizen.npc.traits.MirrorTrait in project Denizen-For-Bukkit by DenizenScript.

the class EntityTag method adjust.

@Override
public void adjust(Mechanism mechanism) {
    if (isGeneric()) {
        mechanisms.add(mechanism);
        mechanism.fulfill();
        return;
    }
    if (getBukkitEntity() == null) {
        if (isCitizensNPC()) {
            mechanism.echoError("Cannot adjust not-spawned NPC " + getDenizenNPC());
        } else {
            mechanism.echoError("Cannot adjust entity " + this);
        }
        return;
    }
    if (mechanism.matches("attach_to")) {
        Deprecations.attachToMech.warn(mechanism.context);
        if (mechanism.hasValue()) {
            ListTag list = mechanism.valueAsType(ListTag.class);
            Vector offset = null;
            boolean rotateWith = true;
            if (list.size() > 1) {
                offset = LocationTag.valueOf(list.get(1), mechanism.context).toVector();
                if (list.size() > 2) {
                    rotateWith = new ElementTag(list.get(2)).asBoolean();
                }
            }
            EntityAttachmentHelper.forceAttachMove(this, EntityTag.valueOf(list.get(0), mechanism.context), offset, rotateWith);
        } else {
            EntityAttachmentHelper.forceAttachMove(this, null, null, false);
        }
    }
    // -->
    if (mechanism.matches("shooter")) {
        setShooter(mechanism.valueAsType(EntityTag.class));
    }
    // -->
    if (mechanism.matches("can_pickup_items") && mechanism.requireBoolean()) {
        getLivingEntity().setCanPickupItems(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("fall_distance") && mechanism.requireFloat()) {
        entity.setFallDistance(mechanism.getValue().asFloat());
    }
    // -->
    if (mechanism.matches("fallingblock_drop_item") && mechanism.requireBoolean() && entity instanceof FallingBlock) {
        ((FallingBlock) entity).setDropItem(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("fallingblock_hurt_entities") && mechanism.requireBoolean() && entity instanceof FallingBlock) {
        ((FallingBlock) entity).setHurtEntities(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("fire_time") && mechanism.requireObject(DurationTag.class)) {
        entity.setFireTicks(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("leash_holder") && mechanism.requireObject(EntityTag.class)) {
        getLivingEntity().setLeashHolder(mechanism.valueAsType(EntityTag.class).getBukkitEntity());
    }
    // -->
    if (mechanism.matches("can_breed") && mechanism.requireBoolean()) {
        ((Ageable) getLivingEntity()).setBreed(true);
    }
    // -->
    if (mechanism.matches("breed") && mechanism.requireBoolean()) {
        ((Animals) getLivingEntity()).setLoveModeTicks(mechanism.getValue().asBoolean() ? 600 : 0);
    }
    // -->
    if (mechanism.matches("passengers")) {
        entity.eject();
        for (EntityTag ent : mechanism.valueAsType(ListTag.class).filter(EntityTag.class, mechanism.context)) {
            if (comparesTo(ent) == 1) {
                continue;
            }
            if (!ent.isSpawned()) {
                ent.spawnAt(getLocation());
            }
            if (ent.isSpawned()) {
                entity.addPassenger(ent.getBukkitEntity());
            }
        }
    }
    // -->
    if (mechanism.matches("passenger") && mechanism.requireObject(EntityTag.class)) {
        EntityTag ent = mechanism.valueAsType(EntityTag.class);
        if (!ent.isSpawned()) {
            ent.spawnAt(getLocation());
        }
        entity.eject();
        if (ent.isSpawned()) {
            entity.addPassenger(ent.getBukkitEntity());
        }
    }
    // -->
    if (mechanism.matches("time_lived") && mechanism.requireObject(DurationTag.class)) {
        NMSHandler.getEntityHelper().setTicksLived(entity, mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("absorption_health") && mechanism.requireFloat()) {
        NMSHandler.getEntityHelper().setAbsorption(getLivingEntity(), mechanism.getValue().asDouble());
    }
    // -->
    if (mechanism.matches("oxygen") && mechanism.requireObject(DurationTag.class)) {
        getLivingEntity().setRemainingAir(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    if (mechanism.matches("remaining_air") && mechanism.requireInteger()) {
        Deprecations.entityRemainingAir.warn(mechanism.context);
        getLivingEntity().setRemainingAir(mechanism.getValue().asInt());
    }
    // -->
    if (mechanism.matches("remove_effects")) {
        for (PotionEffect potionEffect : this.getLivingEntity().getActivePotionEffects()) {
            getLivingEntity().removePotionEffect(potionEffect.getType());
        }
    }
    // -->
    if (mechanism.matches("release_left_shoulder") && getLivingEntity() instanceof HumanEntity) {
        Entity bukkitEnt = ((HumanEntity) getLivingEntity()).getShoulderEntityLeft();
        if (bukkitEnt != null) {
            EntityTag ent = new EntityTag(bukkitEnt);
            String escript = ent.getEntityScript();
            ent = EntityTag.valueOf("e@" + (escript != null && escript.length() > 0 ? escript : ent.getEntityType().getLowercaseName()) + PropertyParser.getPropertiesString(ent), mechanism.context);
            ent.spawnAt(getEyeLocation());
            ((HumanEntity) getLivingEntity()).setShoulderEntityLeft(null);
        }
    }
    // -->
    if (mechanism.matches("release_right_shoulder") && getLivingEntity() instanceof HumanEntity) {
        Entity bukkitEnt = ((HumanEntity) getLivingEntity()).getShoulderEntityRight();
        if (bukkitEnt != null) {
            EntityTag ent = new EntityTag(bukkitEnt);
            String escript = ent.getEntityScript();
            ent = EntityTag.valueOf("e@" + (escript != null && escript.length() > 0 ? escript : ent.getEntityType().getLowercaseName()) + PropertyParser.getPropertiesString(ent), mechanism.context);
            ent.spawnAt(getEyeLocation());
            ((HumanEntity) getLivingEntity()).setShoulderEntityRight(null);
        }
    }
    // -->
    if (mechanism.matches("left_shoulder") && getLivingEntity() instanceof HumanEntity) {
        if (mechanism.hasValue()) {
            if (mechanism.requireObject(EntityTag.class)) {
                ((HumanEntity) getLivingEntity()).setShoulderEntityLeft(mechanism.valueAsType(EntityTag.class).getBukkitEntity());
            }
        } else {
            ((HumanEntity) getLivingEntity()).setShoulderEntityLeft(null);
        }
    }
    // -->
    if (mechanism.matches("right_shoulder") && getLivingEntity() instanceof HumanEntity) {
        if (mechanism.hasValue()) {
            if (mechanism.requireObject(EntityTag.class)) {
                ((HumanEntity) getLivingEntity()).setShoulderEntityRight(mechanism.valueAsType(EntityTag.class).getBukkitEntity());
            }
        } else {
            ((HumanEntity) getLivingEntity()).setShoulderEntityRight(null);
        }
    }
    // -->
    if (mechanism.matches("persistent") && mechanism.requireBoolean()) {
        getLivingEntity().setRemoveWhenFarAway(!mechanism.getValue().asBoolean());
    }
    if (mechanism.matches("remove_when_far_away") && mechanism.requireBoolean()) {
        Deprecations.entityRemoveWhenFar.warn(mechanism.context);
        getLivingEntity().setRemoveWhenFarAway(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("sheared") && mechanism.requireBoolean() && getBukkitEntity() instanceof Sheep) {
        ((Sheep) getBukkitEntity()).setSheared(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("collidable") && mechanism.requireBoolean()) {
        if (isCitizensNPC()) {
            getDenizenNPC().getCitizen().data().setPersistent(NPC.COLLIDABLE_METADATA, mechanism.getValue().asBoolean());
        } else {
            getLivingEntity().setCollidable(mechanism.getValue().asBoolean());
        }
    }
    // -->
    if (mechanism.matches("no_damage_duration") && mechanism.requireObject(DurationTag.class)) {
        getLivingEntity().setNoDamageTicks(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("max_no_damage_duration") && mechanism.requireObject(DurationTag.class)) {
        getLivingEntity().setMaximumNoDamageTicks(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("velocity") && mechanism.requireObject(LocationTag.class)) {
        setVelocity(mechanism.valueAsType(LocationTag.class).toVector());
    }
    // -->
    if (mechanism.matches("move") && mechanism.requireObject(LocationTag.class)) {
        NMSHandler.getEntityHelper().move(getBukkitEntity(), mechanism.valueAsType(LocationTag.class).toVector());
    }
    // -->
    if (mechanism.matches("interact_with") && mechanism.requireObject(LocationTag.class)) {
        LocationTag interactLocation = mechanism.valueAsType(LocationTag.class);
        NMSHandler.getEntityHelper().forceInteraction(getPlayer(), interactLocation);
    }
    if (mechanism.matches("play_death")) {
        Deprecations.entityPlayDeath.warn(mechanism.context);
        getLivingEntity().playEffect(EntityEffect.DEATH);
    }
    // -->
    if ((mechanism.matches("pickup_delay") || mechanism.matches("pickupdelay")) && getBukkitEntity() instanceof Item && mechanism.requireObject(DurationTag.class)) {
        ((Item) getBukkitEntity()).setPickupDelay(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("gliding") && mechanism.requireBoolean()) {
        getLivingEntity().setGliding(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("glowing") && mechanism.requireBoolean()) {
        getBukkitEntity().setGlowing(mechanism.getValue().asBoolean());
        if (Depends.citizens != null && CitizensAPI.getNPCRegistry().isNPC(getLivingEntity())) {
            CitizensAPI.getNPCRegistry().getNPC(getLivingEntity()).data().setPersistent(NPC.GLOWING_METADATA, mechanism.getValue().asBoolean());
        }
    }
    // -->
    if (mechanism.matches("dragon_phase")) {
        EnderDragon ed = (EnderDragon) getLivingEntity();
        ed.setPhase(EnderDragon.Phase.valueOf(mechanism.getValue().asString().toUpperCase()));
    }
    // -->
    if (mechanism.matches("experience") && getBukkitEntity() instanceof ExperienceOrb && mechanism.requireInteger()) {
        ((ExperienceOrb) getBukkitEntity()).setExperience(mechanism.getValue().asInt());
    }
    // -->
    if (mechanism.matches("fuse_ticks") && getBukkitEntity() instanceof TNTPrimed && mechanism.requireInteger()) {
        ((TNTPrimed) getBukkitEntity()).setFuseTicks(mechanism.getValue().asInt());
    }
    // -->
    if (mechanism.matches("show_to_players")) {
        HideEntitiesHelper.unhideEntity(null, getBukkitEntity());
    }
    // -->
    if (mechanism.matches("hide_from_players")) {
        HideEntitiesHelper.hideEntity(null, getBukkitEntity());
    }
    // -->
    if (mechanism.matches("skin_layers")) {
        int flags = 0;
        for (String str : mechanism.valueAsType(ListTag.class)) {
            String upper = str.toUpperCase();
            if (upper.equals("ALL")) {
                flags = 0xFF;
            } else {
                PlayerHelper.SkinLayer layer = PlayerHelper.SkinLayer.valueOf(upper);
                flags |= layer.flag;
            }
        }
        NMSHandler.getPlayerHelper().setSkinLayers((Player) getBukkitEntity(), (byte) flags);
    }
    // -->
    if (mechanism.matches("mirror_player") && mechanism.requireBoolean()) {
        if (isNPC()) {
            NPC npc = getDenizenNPC().getCitizen();
            if (!npc.hasTrait(MirrorTrait.class)) {
                npc.addTrait(MirrorTrait.class);
            }
            MirrorTrait mirror = npc.getOrAddTrait(MirrorTrait.class);
            if (mechanism.getValue().asBoolean()) {
                mirror.enableMirror();
            } else {
                mirror.disableMirror();
            }
        } else {
            if (mechanism.getValue().asBoolean()) {
                ProfileEditor.mirrorUUIDs.add(getUUID());
            } else {
                ProfileEditor.mirrorUUIDs.remove(getUUID());
            }
        }
    }
    // -->
    if (mechanism.matches("swimming") && mechanism.requireBoolean()) {
        getLivingEntity().setSwimming(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("detonate")) {
        if (getBukkitEntity() instanceof Firework) {
            ((Firework) getBukkitEntity()).detonate();
        } else if (getBukkitEntity() instanceof Creeper) {
            ((Creeper) getBukkitEntity()).explode();
        } else {
            Debug.echoError("Cannot detonate entity of type '" + getBukkitEntityType().name() + "'.");
        }
    }
    // -->
    if (mechanism.matches("ignite")) {
        if (getBukkitEntity() instanceof Creeper) {
            ((Creeper) getBukkitEntity()).ignite();
        } else {
            Debug.echoError("Cannot ignite entity of type '" + getBukkitEntityType().name() + "'.");
        }
    }
    // -->
    if (mechanism.matches("head_angle") && mechanism.requireFloat()) {
        NMSHandler.getEntityHelper().setHeadAngle(getBukkitEntity(), mechanism.getValue().asFloat());
    }
    // -->
    if (mechanism.matches("skeleton_arms_raised") && mechanism.requireBoolean()) {
        EntityAnimation entityAnimation = NMSHandler.getAnimationHelper().getEntityAnimation(mechanism.getValue().asBoolean() ? "SKELETON_START_SWING_ARM" : "SKELETON_STOP_SWING_ARM");
        entityAnimation.play(entity);
    }
    // -->
    if (mechanism.matches("polar_bear_standing") && mechanism.requireBoolean()) {
        EntityAnimation entityAnimation = NMSHandler.getAnimationHelper().getEntityAnimation(mechanism.getValue().asBoolean() ? "POLAR_BEAR_START_STANDING" : "POLAR_BEAR_STOP_STANDING");
        entityAnimation.play(entity);
    }
    // -->
    if (mechanism.matches("ghast_attacking") && mechanism.requireBoolean()) {
        NMSHandler.getEntityHelper().setGhastAttacking(getBukkitEntity(), mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("enderman_angry") && mechanism.requireBoolean()) {
        NMSHandler.getEntityHelper().setEndermanAngry(getBukkitEntity(), mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("melee_attack") && mechanism.requireObject(EntityTag.class)) {
        Entity target = mechanism.valueAsType(EntityTag.class).getBukkitEntity();
        if (getLivingEntity() instanceof Player && NMSHandler.getVersion().isAtLeast(NMSVersion.v1_17)) {
            NMSHandler.getPlayerHelper().doAttack((Player) getLivingEntity(), target);
        } else {
            getLivingEntity().attack(target);
        }
    }
    // -->
    if (mechanism.matches("last_hurt_by") && mechanism.requireObject(EntityTag.class)) {
        NMSHandler.getEntityHelper().setLastHurtBy(getLivingEntity(), mechanism.valueAsType(EntityTag.class).getLivingEntity());
    }
    // -->
    if (mechanism.matches("fish_hook_nibble_time") && mechanism.requireObject(DurationTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_nibble_time is only valid for FishHook entities.");
            return;
        }
        NMSHandler.getFishingHelper().setNibble((FishHook) getBukkitEntity(), mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("fish_hook_bite_time") && mechanism.requireObject(DurationTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_hook_time is only valid for FishHook entities.");
            return;
        }
        NMSHandler.getFishingHelper().setHookTime((FishHook) getBukkitEntity(), mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("fish_hook_lure_time") && mechanism.requireObject(DurationTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_lure_time is only valid for FishHook entities.");
            return;
        }
        NMSHandler.getFishingHelper().setLureTime((FishHook) getBukkitEntity(), mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("fish_hook_pull")) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_pull is only valid for FishHook entities.");
            return;
        }
        ((FishHook) getBukkitEntity()).pullHookedEntity();
    }
    // -->
    if (mechanism.matches("fish_hook_apply_lure") && mechanism.requireBoolean()) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_apply_lure is only valid for FishHook entities.");
            return;
        }
        ((FishHook) getBukkitEntity()).setApplyLure(mechanism.getValue().asBoolean());
    }
    // -->
    if (mechanism.matches("fish_hook_hooked_entity") && mechanism.requireObject(EntityTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_hooked_entity is only valid for FishHook entities.");
            return;
        }
        ((FishHook) getBukkitEntity()).setHookedEntity(mechanism.valueAsType(EntityTag.class).getBukkitEntity());
    }
    // -->
    if (mechanism.matches("fish_hook_min_lure_time") && mechanism.requireObject(DurationTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_min_lure_time is only valid for FishHook entities.");
            return;
        }
        ((FishHook) getBukkitEntity()).setMinWaitTime(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("fish_hook_max_lure_time") && mechanism.requireObject(DurationTag.class)) {
        if (!(getBukkitEntity() instanceof FishHook)) {
            mechanism.echoError("fish_hook_max_lure_time is only valid for FishHook entities.");
            return;
        }
        ((FishHook) getBukkitEntity()).setMaxWaitTime(mechanism.valueAsType(DurationTag.class).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("redo_attack_cooldown")) {
        if (!(getLivingEntity() instanceof Player)) {
            mechanism.echoError("Only player-type entities can have attack_cooldowns!");
            return;
        }
        NMSHandler.getPlayerHelper().setAttackCooldown((Player) getLivingEntity(), 0);
    }
    // -->
    if (mechanism.matches("reset_attack_cooldown")) {
        if (!(getLivingEntity() instanceof Player)) {
            mechanism.echoError("Only player-type entities can have attack_cooldowns!");
            return;
        }
        PlayerHelper playerHelper = NMSHandler.getPlayerHelper();
        playerHelper.setAttackCooldown((Player) getLivingEntity(), Math.round(playerHelper.getMaxAttackCooldownTicks((Player) getLivingEntity())));
    }
    // -->
    if (mechanism.matches("attack_cooldown_percent") && mechanism.requireFloat()) {
        if (!(getLivingEntity() instanceof Player)) {
            mechanism.echoError("Only player-type entities can have attack_cooldowns!");
            return;
        }
        float percent = mechanism.getValue().asFloat();
        if (percent >= 0 && percent <= 1) {
            PlayerHelper playerHelper = NMSHandler.getPlayerHelper();
            playerHelper.setAttackCooldown((Player) getLivingEntity(), Math.round(playerHelper.getMaxAttackCooldownTicks((Player) getLivingEntity()) * mechanism.getValue().asFloat()));
        } else {
            com.denizenscript.denizen.utilities.debugging.Debug.echoError("Invalid percentage! \"" + percent + "\" is not between 0 and 1!");
        }
    }
    // -->
    if (mechanism.matches("attack_cooldown") && mechanism.requireObject(DurationTag.class)) {
        if (!(getLivingEntity() instanceof Player)) {
            mechanism.echoError("Only player-type entities can have attack_cooldowns!");
            return;
        }
        NMSHandler.getPlayerHelper().setAttackCooldown((Player) getLivingEntity(), mechanism.getValue().asType(DurationTag.class, mechanism.context).getTicksAsInt());
    }
    // -->
    if (mechanism.matches("fallingblock_type") && mechanism.requireObject(MaterialTag.class)) {
        if (!(getBukkitEntity() instanceof FallingBlock)) {
            mechanism.echoError("'fallingblock_type' is only valid for Falling Block entities.");
            return;
        }
        NMSHandler.getEntityHelper().setFallingBlockType((FallingBlock) getBukkitEntity(), mechanism.valueAsType(MaterialTag.class).getModernData());
    }
    // -->
    if (mechanism.matches("tracking_range") && mechanism.requireInteger()) {
        NMSHandler.getEntityHelper().setTrackingRange(getBukkitEntity(), mechanism.getValue().asInt());
    }
    CoreUtilities.autoPropertyMechanism(this, mechanism);
}
Also used : NPC(net.citizensnpcs.api.npc.NPC) Vector(org.bukkit.util.Vector) EntityAnimation(com.denizenscript.denizen.nms.interfaces.EntityAnimation) FakePlayer(com.denizenscript.denizen.nms.interfaces.FakePlayer) PlayerHelper(com.denizenscript.denizen.nms.interfaces.PlayerHelper) MirrorTrait(com.denizenscript.denizen.npc.traits.MirrorTrait)

Aggregations

EntityAnimation (com.denizenscript.denizen.nms.interfaces.EntityAnimation)1 FakePlayer (com.denizenscript.denizen.nms.interfaces.FakePlayer)1 PlayerHelper (com.denizenscript.denizen.nms.interfaces.PlayerHelper)1 MirrorTrait (com.denizenscript.denizen.npc.traits.MirrorTrait)1 NPC (net.citizensnpcs.api.npc.NPC)1 Vector (org.bukkit.util.Vector)1