diff --git a/core/src/main/java/com/nisovin/magicspells/spells/buff/ext/DisguiseSpell.java b/core/src/main/java/com/nisovin/magicspells/spells/buff/ext/DisguiseSpell.java index 40b58ff42..80310a144 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/buff/ext/DisguiseSpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/buff/ext/DisguiseSpell.java @@ -7,6 +7,7 @@ import org.bukkit.DyeColor; import org.bukkit.entity.Villager; import org.bukkit.entity.LivingEntity; +import org.bukkit.block.data.BlockData; import io.github.retrooper.packetevents.util.SpigotConversionUtil; @@ -154,8 +155,10 @@ public boolean castBuff(SpellData data) { if (watcher instanceof DroppedItemWatcher droppedItemWatcher) droppedItemWatcher.setItemStack(entityData.getDroppedItemStack().get(data)); - if (watcher instanceof EndermanWatcher endermanWatcher) - endermanWatcher.setHeldBlock(SpigotConversionUtil.fromBukkitBlockData(entityData.getCarriedBlockData().get(data))); + if (watcher instanceof EndermanWatcher endermanWatcher) { + BlockData blockData = entityData.getCarriedBlockData().get(data); + if (blockData != null) endermanWatcher.setHeldBlock(SpigotConversionUtil.fromBukkitBlockData(blockData)); + } if (watcher instanceof FallingBlockWatcher fallingBlockWatcher) fallingBlockWatcher.setBlockData(entityData.getFallingBlockData().get(data)); diff --git a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java index f3be8fbd9..83b33470a 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java +++ b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java @@ -264,51 +264,58 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Armor Stand fallback( - key -> addBoolean(transformers, config, key, false, ArmorStand.class, ArmorStand::setSmall, forceOptional), + key -> addOptBoolean(transformers, config, key, ArmorStand.class, ArmorStand::setSmall), "armor-stand.small", "small" ); fallback( - key -> addBoolean(transformers, config, key, false, ArmorStand.class, ArmorStand::setMarker, forceOptional), + key -> addOptBoolean(transformers, config, key, ArmorStand.class, ArmorStand::setMarker), "armor-stand.marker", "marker" ); fallback( - key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setVisible, forceOptional), + key -> addOptBoolean(transformers, config, key, ArmorStand.class, ArmorStand::setVisible), "armor-stand.visible", "visible" ); fallback( - key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setArms, forceOptional), + transformers, key -> ConfigDataUtil.getBoolean(config, key), true, forceOptional, + ArmorStand.class, ArmorStand::setArms, "armor-stand.has-arms", "has-arms" ); fallback( - key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setBasePlate, forceOptional), + key -> addOptBoolean(transformers, config, key, ArmorStand.class, ArmorStand::setBasePlate), "armor-stand.has-base-plate", "has-base-plate" ); - addBoolean(transformers, config, "armor-stand.disable-slots", false, ArmorStand.class, (stand, disabled) -> { + addOptBoolean(transformers, config, "armor-stand.disable-slots", ArmorStand.class, (stand, disabled) -> { if (disabled) stand.setDisabledSlots(EquipmentSlot.values()); - }, forceOptional); + }); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setHeadPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setHeadPose, "armor-stand.head-angle", "head-angle" ); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setBodyPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setBodyPose, "armor-stand.body-angle", "body-angle" ); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftArmPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setLeftArmPose, "armor-stand.left-arm-angle", "left-arm-angle" ); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightArmPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setRightArmPose, "armor-stand.right-arm-angle", "right-arm-angle" ); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftLegPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setLeftLegPose, "armor-stand.left-leg-angle", "left-leg-angle" ); fallback( - key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightLegPose, forceOptional), + transformers, key -> ConfigDataUtil.getEulerAngle(config, key, null), EulerAngle.ZERO, forceOptional, + ArmorStand.class, ArmorStand::setRightLegPose, "armor-stand.right-leg-angle", "right-leg-angle" ); @@ -391,7 +398,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Enderman carriedBlockData = fallback( - key -> addBlockData(transformers, config, key, null, Enderman.class, Enderman::setCarriedBlock, forceOptional), + key -> addOptBlockData(transformers, config, key, Enderman.class, Enderman::setCarriedBlock), "carried-block", "material" ); @@ -566,7 +573,8 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Phantom fallback( - key -> addInteger(transformers, config, key, 0, Phantom.class, Phantom::setSize, forceOptional), + transformers, key -> ConfigDataUtil.getInteger(config, key), 0, forceOptional, + Phantom.class, Phantom::setSize, "phantom.size", "size" ); @@ -588,7 +596,8 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Puffer Fish size = fallback( - key -> addInteger(transformers, config, key, 0, PufferFish.class, PufferFish::setPuffState, forceOptional), + transformers, key -> ConfigDataUtil.getInteger(config, key), 0, forceOptional, + PufferFish.class, PufferFish::setPuffState, "pufferfish.puff-state", "size" ); @@ -605,7 +614,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Sheep sheared = fallback( - key -> addBoolean(transformers, config, key, false, Sheep.class, Sheep::setSheared, forceOptional), + key -> addOptBoolean(transformers, config, key, Sheep.class, Sheep::setSheared), "sheep.sheared", "sheared" ); color = fallback( @@ -635,7 +644,8 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Slime fallback( - key -> addInteger(transformers, config, key, 0, Slime.class, Slime::setSize, forceOptional), + transformers, key -> ConfigDataUtil.getInteger(config, key), 0, forceOptional, + Slime.class, Slime::setSize, "slime.size", "size" ); @@ -674,7 +684,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Wolf fallback( - key -> addBoolean(transformers, config, key, false, Wolf.class, Wolf::setAngry, forceOptional), + key -> addOptBoolean(transformers, config, key, Wolf.class, Wolf::setAngry), "wolf.angry", "angry" ); @@ -1022,46 +1032,6 @@ private ConfigData addBoolean(Multimap, Transformer> tr return supplier; } - private ConfigData addInteger(Multimap, Transformer> transformers, ConfigurationSection config, String name, int def, Class type, BiConsumer setter, boolean forceOptional) { - ConfigData supplier; - if (forceOptional) { - supplier = ConfigDataUtil.getInteger(config, name); - transformers.put(type, new TransformerImpl<>(supplier, setter, true)); - } else { - supplier = ConfigDataUtil.getInteger(config, name, def); - transformers.put(type, new TransformerImpl<>(supplier, setter)); - } - - return supplier; - } - - private ConfigData addBlockData(Multimap, Transformer> transformers, ConfigurationSection config, String name, BlockData def, Class type, BiConsumer setter, boolean forceOptional) { - ConfigData supplier; - if (forceOptional) { - supplier = ConfigDataUtil.getBlockData(config, name, null); - transformers.put(type, new TransformerImpl<>(supplier, setter, true)); - } else { - supplier = ConfigDataUtil.getBlockData(config, name, def); - transformers.put(type, new TransformerImpl<>(supplier, setter)); - } - - return supplier; - } - - private ConfigData addEulerAngle(Multimap, Transformer> transformers, ConfigurationSection config, String name, EulerAngle def, Class type, BiConsumer setter, boolean forceOptional) { - ConfigData supplier; - - if (forceOptional) { - supplier = ConfigDataUtil.getEulerAngle(config, name, null); - transformers.put(type, new TransformerImpl<>(supplier, setter, true)); - } else { - supplier = ConfigDataUtil.getEulerAngle(config, name, def); - transformers.put(type, new TransformerImpl<>(supplier, setter)); - } - - return supplier; - } - private ConfigData addOptBoolean(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { ConfigData supplier = ConfigDataUtil.getBoolean(config, name); transformers.put(type, new TransformerImpl<>(supplier, setter, true)); @@ -1215,6 +1185,9 @@ private ConfigData addOptRegistryEntry(Multimap return supplier; } + /** + * @param function Use {@code addOptX} methods. + */ private ConfigData fallback(Function> function, String... keys) { for (String key : keys) { ConfigData data = function.apply(key); @@ -1224,6 +1197,31 @@ private ConfigData fallback(Function> function, Str return data -> null; } + /** + * @param configDataFun Make its default value {@code null}. + */ + private ConfigData fallback( + Multimap, Transformer> transformers, + Function> configDataFun, + D def, + boolean forceOptional, + Class type, + BiConsumer setter, + String... keys + ) { + for (String key : keys) { + ConfigData supplier = configDataFun.apply(key); + if (supplier.isNull()) continue; + + transformers.put(type, new TransformerImpl<>(supplier, setter, forceOptional)); + return supplier; + } + + ConfigData supplier = _ -> forceOptional ? null : def; + transformers.put(type, new TransformerImpl<>(supplier, setter, forceOptional)); + return supplier; + } + public ConfigData getVector(ConfigurationSection config, String path) { if (config.isString(path)) { String value = config.getString(path);