diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 6720eb1b92..3cc94846c8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -23,6 +23,10 @@ public abstract class EntityHelper { + public void setInvisible(Entity entity, boolean invisible) { + // Do nothing on older versions + } + public abstract double getAbsorption(LivingEntity entity); public abstract void setAbsorption(LivingEntity entity, double value); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/InvisibleCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/InvisibleCommand.java index 66ce981b81..23b073f048 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/InvisibleCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/InvisibleCommand.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.scripts.commands.entity; +import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizen.npc.traits.InvisibleTrait; @@ -87,6 +88,23 @@ else if (!scriptEntry.hasObject("target") } } + public void setInvisible(EntityTag entity, boolean visible) { + if (entity.getBukkitEntity() instanceof ArmorStand) { + ((ArmorStand) entity.getBukkitEntity()).setVisible(visible); + } + else if (entity.isLivingEntity() && !entity.isFake) { + if (visible) { + entity.getLivingEntity().removePotionEffect(PotionEffectType.INVISIBILITY); + } + else { + new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1).apply(entity.getLivingEntity()); + } + } + else { + NMSHandler.getEntityHelper().setInvisible(entity.getBukkitEntity(), !visible); + } + } + @Override public void execute(ScriptEntry scriptEntry) { ElementTag state = scriptEntry.getElement("state"); @@ -115,37 +133,17 @@ public void execute(ScriptEntry scriptEntry) { else { switch (Action.valueOf(state.asString().toUpperCase())) { case FALSE: - if (target.getBukkitEntity() instanceof ArmorStand) { - ((ArmorStand) target.getBukkitEntity()).setVisible(true); - } - else { - target.getLivingEntity().removePotionEffect(PotionEffectType.INVISIBILITY); - } + setInvisible(target, true); break; case TRUE: - if (target.getBukkitEntity() instanceof ArmorStand) { - ((ArmorStand) target.getBukkitEntity()).setVisible(false); - } - else { - new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1).apply(target.getLivingEntity()); - } + setInvisible(target, false); break; case TOGGLE: if (target.getBukkitEntity() instanceof ArmorStand) { - if (((ArmorStand) target.getBukkitEntity()).isVisible()) { - ((ArmorStand) target.getBukkitEntity()).setVisible(true); - } - else { - ((ArmorStand) target.getBukkitEntity()).setVisible(false); - } + setInvisible(target, !((ArmorStand) target.getBukkitEntity()).isVisible()); } else { - if (target.getLivingEntity().hasPotionEffect(PotionEffectType.INVISIBILITY)) { - target.getLivingEntity().removePotionEffect(PotionEffectType.INVISIBILITY); - } - else { - new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1).apply(target.getLivingEntity()); - } + setInvisible(target, target.getLivingEntity().hasPotionEffect(PotionEffectType.INVISIBILITY)); } break; } diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/EntityHelperImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/EntityHelperImpl.java index 62b6753535..7cf3349f25 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/EntityHelperImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/EntityHelperImpl.java @@ -41,6 +41,11 @@ public class EntityHelperImpl extends EntityHelper { public static final MethodHandle ENTITY_ONGROUND_SETTER = ReflectionHelper.getFinalSetter(net.minecraft.server.v1_16_R3.Entity.class, "onGround"); + @Override + public void setInvisible(Entity entity, boolean invisible) { + ((CraftEntity) entity).getHandle().setInvisible(invisible); + } + @Override public double getAbsorption(LivingEntity entity) { return entity.getAbsorptionAmount();