From 371514eb42335e498ab9328e6605fdd56a5eaabd Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Thu, 16 Apr 2026 17:28:35 +0200 Subject: [PATCH 1/4] fix: Expression support --- .../com/nisovin/magicspells/util/EntityData.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) 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 341e4fec8..b5c6911a3 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java +++ b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java @@ -250,12 +250,13 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Tameable tamed = addBoolean(transformers, config, "tamed", false, Tameable.class, Tameable::setTamed, forceOptional); - if (config.getBoolean("tamed-owner")) { - transformers.put(Tameable.class, (Tameable tameable, SpellData data) -> { - if (!(data.recipient() instanceof AnimalTamer tamer)) return; - tameable.setOwner(tamer); - }); - } + + ConfigData tamedOwner = ConfigDataUtil.getBoolean(config, "tamed-owner", false); + transformers.put(Tameable.class, (Tameable tameable, SpellData data) -> { + if (!tamedOwner.get(data)) return; + if (!(data.recipient() instanceof AnimalTamer tamer)) return; + tameable.setOwner(tamer); + }); // AbstractHorse saddled = addBoolean(transformers, config, "saddled", false, AbstractHorse.class, (horse, saddled) -> { From afe508f9a2464a4d35037c968eedb08ab4165d70 Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Thu, 16 Apr 2026 17:38:37 +0200 Subject: [PATCH 2/4] refactor: Migrate to sections (part 1/2) This isn't handled through `fallback` because these are new options added in #1056. --- .../nisovin/magicspells/util/EntityData.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) 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 b5c6911a3..a4a395f15 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java +++ b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java @@ -269,7 +269,8 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addBoolean(transformers, config, "visible", true, ArmorStand.class, ArmorStand::setVisible, forceOptional); addBoolean(transformers, config, "has-arms", true, ArmorStand.class, ArmorStand::setArms, forceOptional); addBoolean(transformers, config, "has-base-plate", true, ArmorStand.class, ArmorStand::setBasePlate, forceOptional); - addBoolean(transformers, config, "disable-slots", false, ArmorStand.class, (stand, disabled) -> { + + addBoolean(transformers, config, "armor-stand.disable-slots", false, ArmorStand.class, (stand, disabled) -> { if (disabled) stand.setDisabledSlots(EquipmentSlot.values()); }, forceOptional); @@ -280,7 +281,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addEulerAngle(transformers, config, "left-leg-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftLegPose, forceOptional); addEulerAngle(transformers, config, "right-leg-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightLegPose, forceOptional); - for (String slotName : config.getStringList("disable-slots")) { + for (String slotName : config.getStringList("armor-stand.disable-slots")) { ConfigData slotData = ConfigDataUtil.getEnum(slotName, EquipmentSlot.class, null); transformers.put(ArmorStand.class, (ArmorStand stand, SpellData data) -> { @@ -291,7 +292,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { }); } - for (Object object : config.getList("equipment-locks", new ArrayList<>())) { + for (Object object : config.getList("armor-stand.equipment-locks", new ArrayList<>())) { if (!(object instanceof Map map)) continue; ConfigurationSection section = ConfigReaderUtil.mapToSection(map); @@ -320,7 +321,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Chicken - addOptRegistryEntry(transformers, config, "chicken-variant", Chicken.class, RegistryKey.CHICKEN_VARIANT, Chicken::setVariant); + addOptRegistryEntry(transformers, config, "chicken.variant", Chicken.class, RegistryKey.CHICKEN_VARIANT, Chicken::setVariant); // Copper Golem addOptEnum(transformers, config, "copper-golem.weathering-state", CopperGolem.class, WeatheringCopperState.class, CopperGolem::setWeatheringState); @@ -342,10 +343,10 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // CommandMinecart - addOptString(transformers, config, "command", CommandMinecart.class, CommandMinecart::setCommand); + addOptString(transformers, config, "minecart.command", CommandMinecart.class, CommandMinecart::setCommand); // Cow - addOptRegistryEntry(transformers, config, "cow-variant", Cow.class, RegistryKey.COW_VARIANT, Cow::setVariant); + addOptRegistryEntry(transformers, config, "cow.variant", Cow.class, RegistryKey.COW_VARIANT, Cow::setVariant); // ChestedHorse chested = addBoolean(transformers, config, "chested", false, ChestedHorse.class, ChestedHorse::setCarryingChest, forceOptional); @@ -365,12 +366,12 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { "falling-block", "material" ); - addOptBoolean(transformers, config, "cancel-drop", FallingBlock.class, FallingBlock::setCancelDrop); - addOptBoolean(transformers, config, "hurt-entities", FallingBlock.class, FallingBlock::setHurtEntities); + addOptBoolean(transformers, config, "falling-block.cancel-drop", FallingBlock.class, FallingBlock::setCancelDrop); + addOptBoolean(transformers, config, "falling-block.hurt-entities", FallingBlock.class, FallingBlock::setHurtEntities); - addOptFloat(transformers, config, "damage-per-block", FallingBlock.class, FallingBlock::setDamagePerBlock); + addOptFloat(transformers, config, "falling-block.damage-per-block", FallingBlock.class, FallingBlock::setDamagePerBlock); - addOptInteger(transformers, config, "max-damage", FallingBlock.class, FallingBlock::setMaxDamage); + addOptInteger(transformers, config, "falling-block.max-damage", FallingBlock.class, FallingBlock::setMaxDamage); // Fox fallback( @@ -388,13 +389,13 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Goat - addOptBoolean(transformers, config, "left-horn", Goat.class, Goat::setLeftHorn); - addOptBoolean(transformers, config, "right-horn", Goat.class, Goat::setRightHorn); - addOptBoolean(transformers, config, "screaming", Goat.class, Goat::setScreaming); + addOptBoolean(transformers, config, "goat.left-horn", Goat.class, Goat::setLeftHorn); + addOptBoolean(transformers, config, "goat.right-horn", Goat.class, Goat::setRightHorn); + addOptBoolean(transformers, config, "goat.screaming", Goat.class, Goat::setScreaming); // Hoglin - addOptBoolean(transformers, config, "immune-to-zombification", Hoglin.class, Hoglin::setImmuneToZombification); - addOptBoolean(transformers, config, "able-to-be-hunted", Hoglin.class, Hoglin::setIsAbleToBeHunted); + addOptBoolean(transformers, config, "hoglin.immune-to-zombification", Hoglin.class, Hoglin::setImmuneToZombification); + addOptBoolean(transformers, config, "hoglin.able-to-be-hunted", Hoglin.class, Hoglin::setIsAbleToBeHunted); // Horse horseColor = fallback( @@ -476,13 +477,13 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { transformers.put(Mannequin.class, new TransformerImpl<>(mannequinProfile, Mannequin::setProfile, true)); // Minecart - addOptDouble(transformers, config, "max-speed", Minecart.class, Minecart::setMaxSpeed); + addOptDouble(transformers, config, "minecart.max-speed", Minecart.class, Minecart::setMaxSpeed); - addOptBoolean(transformers, config, "slow-when-empty", Minecart.class, Minecart::setSlowWhenEmpty); + addOptBoolean(transformers, config, "minecart.slow-when-empty", Minecart.class, Minecart::setSlowWhenEmpty); - addOptInteger(transformers, config, "display-block-offset", Minecart.class, Minecart::setDisplayBlockOffset); + addOptInteger(transformers, config, "minecart.display-block-offset", Minecart.class, Minecart::setDisplayBlockOffset); - addOptBlockData(transformers, config, "display-block", Minecart.class, Minecart::setDisplayBlockData); + addOptBlockData(transformers, config, "minecart.display-block", Minecart.class, Minecart::setDisplayBlockData); // Mushroom Cow fallback( @@ -505,11 +506,11 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addOptBoolean(transformers, config, "should-burn-in-day", Phantom.class, Phantom::setShouldBurnInDay); // Piglin - addOptBoolean(transformers, config, "able-to-hunt", Piglin.class, Piglin::setIsAbleToHunt); - addOptInteger(transformers, config, "dancing", Piglin.class, Piglin::setDancing); + addOptBoolean(transformers, config, "piglin.able-to-hunt", Piglin.class, Piglin::setIsAbleToHunt); + addOptInteger(transformers, config, "piglin.dancing", Piglin.class, Piglin::setDancing); // Piglin Abstract - addOptBoolean(transformers, config, "immune-to-zombification", PiglinAbstract.class, PiglinAbstract::setImmuneToZombification); + addOptBoolean(transformers, config, "piglin.immune-to-zombification", PiglinAbstract.class, PiglinAbstract::setImmuneToZombification); // Puffer Fish size = addInteger(transformers, config, "size", 0, PufferFish.class, PufferFish::setPuffState, forceOptional); @@ -521,9 +522,9 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Raider - addOptBoolean(transformers, config, "patrol-leader", Raider.class, Raider::setPatrolLeader); - addOptBoolean(transformers, config, "can-join-raid", Raider.class, Raider::setCanJoinRaid); - addOptBoolean(transformers, config, "celebrating", Raider.class, Raider::setCelebrating); + addOptBoolean(transformers, config, "raider.patrol-leader", Raider.class, Raider::setPatrolLeader); + addOptBoolean(transformers, config, "raider.can-join-raid", Raider.class, Raider::setCanJoinRaid); + addOptBoolean(transformers, config, "raider.celebrating", Raider.class, Raider::setCelebrating); // Sheep sheared = addBoolean(transformers, config, "sheared", false, Sheep.class, Sheep::setSheared, forceOptional); @@ -562,7 +563,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Salmon - addOptEnum(transformers, config, "salmon-variant", Salmon.class, Salmon.Variant.class, Salmon::setVariant); + addOptEnum(transformers, config, "salmon.variant", Salmon.class, Salmon.Variant.class, Salmon::setVariant); // Villager profession = fallback( @@ -572,7 +573,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addOptRegistryEntry(transformers, config, "villager-type", Villager.class, Registry.VILLAGER_TYPE, Villager::setVillagerType); // Vindicator - addOptBoolean(transformers, config, "johnny", Vindicator.class, Vindicator::setJohnny); + addOptBoolean(transformers, config, "vindicator.johnny", Vindicator.class, Vindicator::setJohnny); // Wolf addBoolean(transformers, config, "angry", false, Wolf.class, Wolf::setAngry, forceOptional); @@ -582,8 +583,8 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addOptBoolean(transformers, config, "should-burn-in-day", Zombie.class, Zombie::setShouldBurnInDay); // Zombie Villager - addOptRegistryEntry(transformers, config, "villager-profession", ZombieVillager.class, Registry.VILLAGER_PROFESSION, ZombieVillager::setVillagerProfession); - addOptRegistryEntry(transformers, config, "villager-type", ZombieVillager.class, Registry.VILLAGER_TYPE, ZombieVillager::setVillagerType); + addOptRegistryEntry(transformers, config, "zombie-villager.profession", ZombieVillager.class, Registry.VILLAGER_PROFESSION, ZombieVillager::setVillagerProfession); + addOptRegistryEntry(transformers, config, "zombie-villager.type", ZombieVillager.class, Registry.VILLAGER_TYPE, ZombieVillager::setVillagerType); // Display ConfigData leftRotation = getQuaternion(config, "transformation.left-rotation"); From 8ed4002c4f4e8d8d9a767621c074582579b0952b Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Thu, 16 Apr 2026 18:22:20 +0200 Subject: [PATCH 3/4] refactor: Migrate to sections (part 2/2) --- .../nisovin/magicspells/util/EntityData.java | 196 +++++++++++++----- 1 file changed, 146 insertions(+), 50 deletions(-) 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 a4a395f15..d074647d7 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java +++ b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java @@ -258,28 +258,60 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { tameable.setOwner(tamer); }); - // AbstractHorse + // Abstract Horse saddled = addBoolean(transformers, config, "saddled", false, AbstractHorse.class, (horse, saddled) -> { if (saddled) horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); }, forceOptional); // Armor Stand - addBoolean(transformers, config, "small", false, ArmorStand.class, ArmorStand::setSmall, forceOptional); - addBoolean(transformers, config, "marker", false, ArmorStand.class, ArmorStand::setMarker, forceOptional); - addBoolean(transformers, config, "visible", true, ArmorStand.class, ArmorStand::setVisible, forceOptional); - addBoolean(transformers, config, "has-arms", true, ArmorStand.class, ArmorStand::setArms, forceOptional); - addBoolean(transformers, config, "has-base-plate", true, ArmorStand.class, ArmorStand::setBasePlate, forceOptional); - + fallback( + key -> addBoolean(transformers, config, key, false, ArmorStand.class, ArmorStand::setSmall, forceOptional), + "armor-stand.small", "small" + ); + fallback( + key -> addBoolean(transformers, config, key, false, ArmorStand.class, ArmorStand::setMarker, forceOptional), + "armor-stand.marker", "marker" + ); + fallback( + key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setVisible, forceOptional), + "armor-stand.visible", "visible" + ); + fallback( + key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setArms, forceOptional), + "armor-stand.has-arms", "has-arms" + ); + fallback( + key -> addBoolean(transformers, config, key, true, ArmorStand.class, ArmorStand::setBasePlate, forceOptional), + "armor-stand.has-base-plate", "has-base-plate" + ); addBoolean(transformers, config, "armor-stand.disable-slots", false, ArmorStand.class, (stand, disabled) -> { if (disabled) stand.setDisabledSlots(EquipmentSlot.values()); }, forceOptional); - addEulerAngle(transformers, config, "head-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setHeadPose, forceOptional); - addEulerAngle(transformers, config, "body-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setBodyPose, forceOptional); - addEulerAngle(transformers, config, "left-arm-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftArmPose, forceOptional); - addEulerAngle(transformers, config, "right-arm-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightArmPose, forceOptional); - addEulerAngle(transformers, config, "left-leg-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftLegPose, forceOptional); - addEulerAngle(transformers, config, "right-leg-angle", EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightLegPose, forceOptional); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setHeadPose, forceOptional), + "armor-stand.head-angle", "head-angle" + ); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setBodyPose, forceOptional), + "armor-stand.body-angle", "body-angle" + ); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftArmPose, forceOptional), + "armor-stand.left-arm-angle", "left-arm-angle" + ); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightArmPose, forceOptional), + "armor-stand.right-arm-angle", "right-arm-angle" + ); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setLeftLegPose, forceOptional), + "armor-stand.left-leg-angle", "left-leg-angle" + ); + fallback( + key -> addEulerAngle(transformers, config, key, EulerAngle.ZERO, ArmorStand.class, ArmorStand::setRightLegPose, forceOptional), + "armor-stand.right-leg-angle", "right-leg-angle" + ); for (String slotName : config.getStringList("armor-stand.disable-slots")) { ConfigData slotData = ConfigDataUtil.getEnum(slotName, EquipmentSlot.class, null); @@ -311,13 +343,13 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Axolotl fallback( key -> addOptEnum(transformers, config, key, Axolotl.class, Axolotl.Variant.class, Axolotl::setVariant), - "axolotl-variant", "type" + "axolotl.variant", "axolotl-variant", "type" ); // Cat fallback( key -> addOptRegistryEntry(transformers, config, key, Cat.class, RegistryKey.CAT_VARIANT, Cat::setCatType), - "cat-variant", "type" + "cat.variant", "cat-variant", "type" ); // Chicken @@ -363,7 +395,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Falling Block fallingBlockData = fallback( key -> addOptBlockData(transformers, config, key, FallingBlock.class, FallingBlock::setBlockData), - "falling-block", "material" + "falling-block.block", "falling-block", "material" ); addOptBoolean(transformers, config, "falling-block.cancel-drop", FallingBlock.class, FallingBlock::setCancelDrop); @@ -385,7 +417,7 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Frog fallback( key -> addOptRegistryEntry(transformers, config, key, Frog.class, RegistryKey.FROG_VARIANT, Frog::setVariant), - "frog-variant", "type" + "frog.variant", "frog-variant", "type" ); // Goat @@ -400,38 +432,60 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Horse horseColor = fallback( key -> addOptEnum(transformers, config, key, Horse.class, Horse.Color.class, Horse::setColor), - "horse-color", "color" + "horse.color", "horse-color", "color" ); horseStyle = fallback( key -> addOptEnum(transformers, config, key, Horse.class, Horse.Style.class, Horse::setStyle), - "horse-style", "style" + "horse.style", "horse-style", "style" ); // Item dropItem = fallback( key -> addOptItemStack(transformers, config, key, Item.class, Item::setItemStack), - "dropped-item", "material" + "item.dropped-item", "dropped-item", "material" ); - addOptInteger(transformers, config, "pickup-delay", Item.class, Item::setPickupDelay); + fallback( + key -> addOptInteger(transformers, config, key, Item.class, Item::setPickupDelay), + "item.pickup-delay", "pickup-delay" + ); - addOptBoolean(transformers, config, "will-age", Item.class, Item::setWillAge); - addOptBoolean(transformers, config, "can-mob-pickup", Item.class, Item::setCanMobPickup); - addOptBoolean(transformers, config, "can-player-pickup", Item.class, Item::setCanPlayerPickup); + fallback( + key -> addOptBoolean(transformers, config, key, Item.class, Item::setWillAge), + "item.will-age", "will-age" + ); + fallback( + key -> addOptBoolean(transformers, config, key, Item.class, Item::setCanMobPickup), + "item.can-mob-pickup", "can-mob-pickup" + ); + fallback( + key -> addOptBoolean(transformers, config, key, Item.class, Item::setCanPlayerPickup), + "item.can-player-pickup", "can-player-pickup" + ); // Interaction - addOptFloat(transformers, config, "interaction-height", Interaction.class, Interaction::setInteractionHeight); - addOptFloat(transformers, config, "interaction-width", Interaction.class, Interaction::setInteractionWidth); - addOptBoolean(transformers, config, "responsive", Interaction.class, Interaction::setResponsive); + fallback( + key -> addOptFloat(transformers, config, key, Interaction.class, Interaction::setInteractionHeight), + "interaction.height", "interaction-height" + ); + fallback( + key -> addOptFloat(transformers, config, key, Interaction.class, Interaction::setInteractionWidth), + "interaction.width", "interaction-width" + ); + + fallback( + key -> addOptBoolean(transformers, config, key, Interaction.class, Interaction::setResponsive), + "interaction.responsive", "responsive" + ); // Llama llamaColor = fallback( key -> addOptEnum(transformers, config, key, Llama.class, Llama.Color.class, Llama::setColor), - "llama-variant", "color" + "llama.variant", "llama-variant", "color" ); fallback( key -> addOptMaterial(transformers, config, key, Llama.class, (llama, material) -> llama.getInventory().setDecor(new ItemStack(material))), - "llama-decor", "material" + "llama.decor", "llama-decor", "material" ); // Mannequin @@ -492,8 +546,14 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Panda - addOptEnum(transformers, config, "main-gene", Panda.class, Panda.Gene.class, Panda::setMainGene); - addOptEnum(transformers, config, "hidden-gene", Panda.class, Panda.Gene.class, Panda::setHiddenGene); + fallback( + key -> addOptEnum(transformers, config, key, Panda.class, Panda.Gene.class, Panda::setMainGene), + "panda.main-gene", "main-gene" + ); + fallback( + key -> addOptEnum(transformers, config, key, Panda.class, Panda.Gene.class, Panda::setHiddenGene), + "panda.hidden-gene", "hidden-gene" + ); // Parrot parrotVariant = fallback( @@ -502,8 +562,15 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Phantom - addInteger(transformers, config, "size", 0, Phantom.class, Phantom::setSize, forceOptional); - addOptBoolean(transformers, config, "should-burn-in-day", Phantom.class, Phantom::setShouldBurnInDay); + fallback( + key -> addInteger(transformers, config, key, 0, Phantom.class, Phantom::setSize, forceOptional), + "phantom.size", "size" + ); + + fallback( + key -> addOptBoolean(transformers, config, key, Phantom.class, Phantom::setShouldBurnInDay), + "phantom.should-burn-in-day", "should-burn-in-day" + ); // Piglin addOptBoolean(transformers, config, "piglin.able-to-hunt", Piglin.class, Piglin::setIsAbleToHunt); @@ -513,12 +580,15 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addOptBoolean(transformers, config, "piglin.immune-to-zombification", PiglinAbstract.class, PiglinAbstract::setImmuneToZombification); // Puffer Fish - size = addInteger(transformers, config, "size", 0, PufferFish.class, PufferFish::setPuffState, forceOptional); + size = fallback( + key -> addInteger(transformers, config, key, 0, PufferFish.class, PufferFish::setPuffState, forceOptional), + "pufferfish.size", "size" + ); // Rabbit fallback( key -> addOptEnum(transformers, config, key, Rabbit.class, Rabbit.Type.class, Rabbit::setRabbitType), - "rabbit-type", "type" + "rabbit.type", "rabbit-type", "type" ); // Raider @@ -527,23 +597,29 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { addOptBoolean(transformers, config, "raider.celebrating", Raider.class, Raider::setCelebrating); // Sheep - sheared = addBoolean(transformers, config, "sheared", false, Sheep.class, Sheep::setSheared, forceOptional); + sheared = fallback( + key -> addBoolean(transformers, config, key, false, Sheep.class, Sheep::setSheared, forceOptional), + "sheep.sheared", "sheared" + ); color = fallback( key -> addOptEnum(transformers, config, key, Sheep.class, DyeColor.class, Sheep::setColor), - "sheep-color", "color" + "sheep.color", "sheep-color", "color" ); // Shulker fallback( key -> addOptEnum(transformers, config, key, Shulker.class, DyeColor.class, Shulker::setColor), - "shulker-color", "color" + "shulker.color", "shulker-color", "color" ); // Skeleton addOptBoolean(transformers, config, "should-burn-in-day", Skeleton.class, Skeleton::setShouldBurnInDay); // Slime - addInteger(transformers, config, "size", 0, Slime.class, Slime::setSize, forceOptional); + fallback( + key -> addInteger(transformers, config, key, 0, Slime.class, Slime::setSize, forceOptional), + "slime.size", "size" + ); // Steerable addBoolean(transformers, config, "saddled", false, Steerable.class, Steerable::setSaddle, forceOptional); @@ -568,19 +644,32 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { // Villager profession = fallback( key -> addOptRegistryEntry(transformers, config, key, Villager.class, Registry.VILLAGER_PROFESSION, Villager::setProfession), - "villager-profession", "type" + "villager.profession", "villager-profession", "type" + ); + fallback( + key -> addOptRegistryEntry(transformers, config, key, Villager.class, Registry.VILLAGER_TYPE, Villager::setVillagerType), + "villager.type", "villager-type" ); - addOptRegistryEntry(transformers, config, "villager-type", Villager.class, Registry.VILLAGER_TYPE, Villager::setVillagerType); // Vindicator addOptBoolean(transformers, config, "vindicator.johnny", Vindicator.class, Vindicator::setJohnny); // Wolf - addBoolean(transformers, config, "angry", false, Wolf.class, Wolf::setAngry, forceOptional); - addOptRegistryEntry(transformers, config, "wolf-variant", Wolf.class, RegistryKey.WOLF_VARIANT, Wolf::setVariant); + fallback( + key -> addBoolean(transformers, config, key, false, Wolf.class, Wolf::setAngry, forceOptional), + "wolf.angry", "angry" + ); + + fallback( + key -> addOptRegistryEntry(transformers, config, key, Wolf.class, RegistryKey.WOLF_VARIANT, Wolf::setVariant), + "wolf.variant", "wolf-variant" + ); // Zombie - addOptBoolean(transformers, config, "should-burn-in-day", Zombie.class, Zombie::setShouldBurnInDay); + fallback( + key -> addOptBoolean(transformers, config, key, Zombie.class, Zombie::setShouldBurnInDay), + "zombie.should-burn-in-day", "should-burn-in-day" + ); // Zombie Villager addOptRegistryEntry(transformers, config, "zombie-villager.profession", ZombieVillager.class, Registry.VILLAGER_PROFESSION, ZombieVillager::setVillagerProfession); @@ -938,19 +1027,24 @@ private ConfigData addBlockData(Multimap, Transformer return supplier; } - private void addEulerAngle(Multimap, Transformer> transformers, ConfigurationSection config, String name, EulerAngle def, Class type, BiConsumer setter, boolean forceOptional) { + private ConfigData addEulerAngle(Multimap, Transformer> transformers, ConfigurationSection config, String name, EulerAngle def, Class type, BiConsumer setter, boolean forceOptional) { + ConfigData supplier; + if (forceOptional) { - ConfigData supplier = ConfigDataUtil.getEulerAngle(config, name, null); + supplier = ConfigDataUtil.getEulerAngle(config, name, null); transformers.put(type, new TransformerImpl<>(supplier, setter, true)); } else { - ConfigData supplier = ConfigDataUtil.getEulerAngle(config, name, def); + supplier = ConfigDataUtil.getEulerAngle(config, name, def); transformers.put(type, new TransformerImpl<>(supplier, setter)); } + + return supplier; } - private void addOptBoolean(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { + 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)); + return supplier; } private void addOptByte(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { @@ -958,9 +1052,10 @@ private void addOptByte(Multimap, Transformer> transformers, Con transformers.put(type, new TransformerImpl<>(supplier, setter, true)); } - private void addOptInteger(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { + private ConfigData addOptInteger(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { ConfigData supplier = ConfigDataUtil.getInteger(config, name); transformers.put(type, new TransformerImpl<>(supplier, setter, true)); + return supplier; } private void addOptLong(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { @@ -968,9 +1063,10 @@ private void addOptLong(Multimap, Transformer> transformers, Con transformers.put(type, new TransformerImpl<>(supplier, setter, true)); } - private void addOptFloat(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { + private ConfigData addOptFloat(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { ConfigData supplier = ConfigDataUtil.getFloat(config, name); transformers.put(type, new TransformerImpl<>(supplier, setter, true)); + return supplier; } private void addOptDouble(Multimap, Transformer> transformers, ConfigurationSection config, String name, Class type, BiConsumer setter) { From 230f7fbba50d22296ab7c5deae605c4a7626c9fe Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Thu, 16 Apr 2026 18:22:34 +0200 Subject: [PATCH 4/4] feat: Add EntityData options --- .../java/com/nisovin/magicspells/util/EntityData.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 d074647d7..7275c0ee8 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/EntityData.java +++ b/core/src/main/java/com/nisovin/magicspells/util/EntityData.java @@ -26,6 +26,7 @@ import org.bukkit.*; import org.bukkit.entity.*; import org.bukkit.util.Vector; +import org.bukkit.block.BlockFace; import org.bukkit.util.EulerAngle; import org.bukkit.inventory.MainHand; import org.bukkit.attribute.Attribute; @@ -263,6 +264,9 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { if (saddled) horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); }, forceOptional); + // Abstract Skeleton + addOptBoolean(transformers, config, "skeleton.should-burn-in-day", AbstractSkeleton.class, AbstractSkeleton::setShouldBurnInDay); + // Armor Stand fallback( key -> addBoolean(transformers, config, key, false, ArmorStand.class, ArmorStand::setSmall, forceOptional), @@ -607,10 +611,16 @@ public EntityData(ConfigurationSection config, boolean forceOptional) { ); // Shulker + addOptFloat(transformers, config, "shulker.peek", Shulker.class, Shulker::setPeek); + fallback( key -> addOptEnum(transformers, config, key, Shulker.class, DyeColor.class, Shulker::setColor), "shulker.color", "shulker-color", "color" ); + addOptEnum(transformers, config, "shulker.attached-face", Shulker.class, BlockFace.class, Shulker::setAttachedFace); + + // Sittable + addOptBoolean(transformers, config, "sitting", Sittable.class, Sittable::setSitting); // Skeleton addOptBoolean(transformers, config, "should-burn-in-day", Skeleton.class, Skeleton::setShouldBurnInDay);