From 2e18a42b66c3c8ed3bc7f44e6d363df0fac0e139 Mon Sep 17 00:00:00 2001 From: DragonsAscent Date: Sun, 23 Aug 2026 12:46:46 -0400 Subject: [PATCH 1/6] feat: Enhance DataSpell --- .../spells/targeted/DataSpell.java | 43 +++++++++++------- .../magicspells/util/data/DataLocation.java | 44 +++++++++++++++++++ 2 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java diff --git a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java index 33f9cb2bb..d4b7e59cc 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java @@ -2,6 +2,7 @@ import java.util.function.Function; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.entity.LivingEntity; @@ -11,39 +12,53 @@ import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.config.ConfigData; import com.nisovin.magicspells.spells.TargetedEntitySpell; +import com.nisovin.magicspells.spells.TargetedLocationSpell; +import com.nisovin.magicspells.util.data.DataLocation; import com.nisovin.magicspells.util.data.DataLivingEntity; import com.nisovin.magicspells.variables.variabletypes.GlobalVariable; import com.nisovin.magicspells.variables.variabletypes.GlobalStringVariable; -public class DataSpell extends TargetedSpell implements TargetedEntitySpell { +public class DataSpell extends TargetedSpell implements TargetedEntitySpell, TargetedLocationSpell { - private final ConfigData> dataElement; + private final ConfigData dataElement; private final ConfigData variableName; public DataSpell(MagicConfig config, String spellName) { super(config, spellName); variableName = getConfigDataString("variable-name", ""); - - ConfigData supplier = getConfigDataString("data-element", "uuid"); - if (supplier.isConstant()) { - Function function = DataLivingEntity.getDataFunction(supplier.get()); - dataElement = data -> function; - } else { - dataElement = data -> DataLivingEntity.getDataFunction(supplier.get(data)); - } + dataElement = getConfigDataString("data-element", "uuid"); } @Override public CastResult cast(SpellData data) { TargetInfo info = getTargetedEntity(data); - if (info.noTarget()) return noTarget(info); + if (info.cancelled()) return noTarget(info); + if (!info.empty()) return castAtEntity(info.spellData()); + + TargetInfo locationInfo = getTargetedBlockLocation(data); + if (locationInfo.noTarget()) return noTarget(locationInfo); - return castAtEntity(info.spellData()); + return castAtLocation(locationInfo.spellData()); } @Override public CastResult castAtEntity(SpellData data) { + Function dataElement = DataLivingEntity.getDataFunction(this.dataElement.get(data)); + if (dataElement == null) return new CastResult(PostCastAction.ALREADY_HANDLED, data); + + return applyValue(data, dataElement.apply(data.target())); + } + + @Override + public CastResult castAtLocation(SpellData data) { + Function dataElement = DataLocation.getDataFunction(this.dataElement.get(data)); + if (dataElement == null) return new CastResult(PostCastAction.ALREADY_HANDLED, data); + + return applyValue(data, dataElement.apply(data.location())); + } + + private CastResult applyValue(SpellData data, String value) { Variable variable = MagicSpells.getVariableManager().getVariable(variableName.get(data)); if (variable == null) return new CastResult(PostCastAction.ALREADY_HANDLED, data); @@ -51,10 +66,6 @@ public CastResult castAtEntity(SpellData data) { if (caster == null && !(variable instanceof GlobalVariable) && !(variable instanceof GlobalStringVariable)) return new CastResult(PostCastAction.ALREADY_HANDLED, data); - Function dataElement = this.dataElement.get(data); - if (dataElement == null) return new CastResult(PostCastAction.ALREADY_HANDLED, data); - - String value = dataElement.apply(data.target()); MagicSpells.getVariableManager().set(variable, caster == null ? null : caster.getName(), value); playSpellEffects(data); diff --git a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java new file mode 100644 index 000000000..96b80f5d7 --- /dev/null +++ b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java @@ -0,0 +1,44 @@ +package com.nisovin.magicspells.util.data; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import org.bukkit.Location; +import org.bukkit.block.Block; + +public class DataLocation { + + private static final Map> dataElements = new HashMap<>(); + + static { + dataElements.put("location.biome", location -> location.getBlock().getBiome().toString()); + dataElements.put("location.block.data", DataLocation::blockData); + dataElements.put("location.block.type", location -> location.getBlock().getType().name()); + dataElements.put("location.elevation", location -> location.getWorld().getHighestBlockYAt(location) + ""); + dataElements.put("location.light", location -> location.getBlock().getLightLevel() + ""); + dataElements.put("location.light.block", location -> location.getBlock().getLightFromBlocks() + ""); + dataElements.put("location.light.sky", location -> location.getBlock().getLightFromSky() + ""); + dataElements.put("location", Location::toString); + dataElements.put("location.blockx", location -> location.getBlockX() + ""); + dataElements.put("location.blocky", location -> location.getBlockY() + ""); + dataElements.put("location.blockz", location -> location.getBlockZ() + ""); + dataElements.put("location.pitch", location -> location.getPitch() + ""); + dataElements.put("location.x", location -> location.getX() + ""); + dataElements.put("location.y", location -> location.getY() + ""); + dataElements.put("location.yaw", location -> location.getYaw() + ""); + dataElements.put("location.z", location -> location.getZ() + ""); + dataElements.put("world", location -> location.getWorld().toString()); + dataElements.put("world.name", location -> location.getWorld().getName()); + } + + private static String blockData(Location location) { + Block block = location.getBlock(); + return block.getBlockData().getAsString(); + } + + public static Function getDataFunction(String elementId) { + return dataElements.get(elementId); + } + +} \ No newline at end of file From 3257b8ea3bf1aa69b71042d589df529c5a62c0c7 Mon Sep 17 00:00:00 2001 From: Dragon Date: Mon, 24 Aug 2026 01:59:56 -0400 Subject: [PATCH 2/6] Update core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java Co-authored-by: JasperLorelai --- .../com/nisovin/magicspells/spells/targeted/DataSpell.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java index d4b7e59cc..191aac45d 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java @@ -11,10 +11,10 @@ import com.nisovin.magicspells.variables.Variable; import com.nisovin.magicspells.spells.TargetedSpell; import com.nisovin.magicspells.util.config.ConfigData; -import com.nisovin.magicspells.spells.TargetedEntitySpell; -import com.nisovin.magicspells.spells.TargetedLocationSpell; import com.nisovin.magicspells.util.data.DataLocation; import com.nisovin.magicspells.util.data.DataLivingEntity; +import com.nisovin.magicspells.spells.TargetedEntitySpell; +import com.nisovin.magicspells.spells.TargetedLocationSpell; import com.nisovin.magicspells.variables.variabletypes.GlobalVariable; import com.nisovin.magicspells.variables.variabletypes.GlobalStringVariable; From b4a2134d3c6240a248d9ce62b16269c310479c8d Mon Sep 17 00:00:00 2001 From: Dragon Date: Mon, 24 Aug 2026 02:00:09 -0400 Subject: [PATCH 3/6] Update core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/spells/targeted/DataSpell.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java index 191aac45d..d9e47651a 100644 --- a/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java +++ b/core/src/main/java/com/nisovin/magicspells/spells/targeted/DataSpell.java @@ -34,6 +34,7 @@ public DataSpell(MagicConfig config, String spellName) { public CastResult cast(SpellData data) { TargetInfo info = getTargetedEntity(data); if (info.cancelled()) return noTarget(info); + if (!info.empty()) return castAtEntity(info.spellData()); TargetInfo locationInfo = getTargetedBlockLocation(data); From b896f86c9ffad9a1be1371103733a6d1db1d96df Mon Sep 17 00:00:00 2001 From: Dragon Date: Mon, 24 Aug 2026 02:00:21 -0400 Subject: [PATCH 4/6] Update core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/util/data/DataLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java index 96b80f5d7..058b5c15e 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java +++ b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java @@ -41,4 +41,4 @@ public static Function getDataFunction(String elementId) { return dataElements.get(elementId); } -} \ No newline at end of file +} From b70db15048a4ef4e044e6eb8abcc17cc98acde11 Mon Sep 17 00:00:00 2001 From: Dragon Date: Mon, 24 Aug 2026 02:57:58 -0400 Subject: [PATCH 5/6] Update core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java Co-authored-by: JasperLorelai --- .../java/com/nisovin/magicspells/util/data/DataLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java index 058b5c15e..e1847cfca 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java +++ b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java @@ -17,7 +17,7 @@ public class DataLocation { dataElements.put("location.block.type", location -> location.getBlock().getType().name()); dataElements.put("location.elevation", location -> location.getWorld().getHighestBlockYAt(location) + ""); dataElements.put("location.light", location -> location.getBlock().getLightLevel() + ""); - dataElements.put("location.light.block", location -> location.getBlock().getLightFromBlocks() + ""); + dataElements.put("location.light.blocks", location -> location.getBlock().getLightFromBlocks() + ""); dataElements.put("location.light.sky", location -> location.getBlock().getLightFromSky() + ""); dataElements.put("location", Location::toString); dataElements.put("location.blockx", location -> location.getBlockX() + ""); From 6a6216b3df643375ec3c3a317653c53620ef0bca Mon Sep 17 00:00:00 2001 From: JasperLorelai Date: Mon, 24 Aug 2026 16:49:18 +0200 Subject: [PATCH 6/6] Update core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java --- .../java/com/nisovin/magicspells/util/data/DataLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java index e1847cfca..2ca323f09 100644 --- a/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java +++ b/core/src/main/java/com/nisovin/magicspells/util/data/DataLocation.java @@ -1,7 +1,7 @@ package com.nisovin.magicspells.util.data; -import java.util.HashMap; import java.util.Map; +import java.util.HashMap; import java.util.function.Function; import org.bukkit.Location;