Skip to content

Commit

Permalink
Merge pull request #992 from TonytheMacaroni/pass-arguments
Browse files Browse the repository at this point in the history
Boolean replacement bugfix, subspell additions
  • Loading branch information
TonytheMacaroni authored Mar 10, 2025
2 parents f96ff18 + 989e4f3 commit 5dab9e4
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 15 deletions.
37 changes: 28 additions & 9 deletions core/src/main/java/com/nisovin/magicspells/Subspell.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,14 @@ public class Subspell {
private CastMode mode = CastMode.PARTIAL;
private CastTargeting targeting = CastTargeting.NORMAL;

private boolean invert = false;
private boolean passPower = true;
private ConfigData<Integer> delay = data -> -1;
private ConfigData<Double> chance = data -> -1D;
private ConfigData<Float> subPower = data -> 1F;
private ConfigData<String[]> args = data -> null;

private ConfigData<Boolean> invert = data -> false;
private ConfigData<Boolean> passArgs = data -> false;
private ConfigData<Boolean> passPower = data -> true;
private ConfigData<Boolean> passTargeting = data -> null;

private boolean isTargetedEntity = false;
Expand Down Expand Up @@ -81,8 +83,9 @@ public Subspell(@NotNull String subspell) {
DebugHandler.debugIllegalArgumentException(e);
}
}
case "invert" -> invert = Boolean.parseBoolean(value);
case "pass-power" -> passPower = Boolean.parseBoolean(value);
case "invert" -> invert = ConfigDataUtil.getBoolean(value, false);
case "pass-args" -> passArgs = ConfigDataUtil.getBoolean(value, false);
case "pass-power" -> passPower = ConfigDataUtil.getBoolean(value, true);
case "pass-targeting" -> {
ConfigData<String> supplier = ConfigDataUtil.getString(value);

Expand Down Expand Up @@ -271,7 +274,7 @@ public SpellCastResult subcast(@NotNull SpellData data, boolean passTargeting, b

@NotNull
public SpellCastResult subcast(@NotNull SpellData data, boolean passTargeting, boolean useTargetForLocation, @NotNull CastTargeting @NotNull [] ordering) {
if (invert) data = data.invert();
if (invert.get(data)) data = data.invert();

boolean hasCaster = data.caster() != null;
boolean hasTarget = data.target() != null;
Expand Down Expand Up @@ -335,7 +338,11 @@ public PostCastAction cast(LivingEntity caster, float power) {

@NotNull
private SpellCastResult cast(@NotNull SpellData data) {
data = data.builder().recipient(null).power((passPower ? data.power() : 1) * subPower.get(data)).args(args.get(data)).build();
data = data.builder()
.recipient(null)
.power((passPower.get(data) ? data.power() : 1) * subPower.get(data))
.args(passArgs.get(data) ? data.args() : args.get(data))
.build();

double chance = this.chance.get(data);
if ((chance > 0 && chance < 1) && random.nextDouble() > chance) return fail(data);
Expand Down Expand Up @@ -381,7 +388,11 @@ private SpellCastResult castAtEntity(@NotNull SpellData data, boolean passTarget
return fail(data);
}

data = data.builder().recipient(null).power((passPower ? data.power() : 1) * subPower.get(data)).args(args.get(data)).build();
data = data.builder()
.recipient(null)
.power((passPower.get(data) ? data.power() : 1) * subPower.get(data))
.args(passArgs.get(data) ? data.args() : args.get(data))
.build();

if (mode != CastMode.HARD && !this.passTargeting.getOr(data, passTargeting)) {
ValidTargetList canTarget = spell.getValidTargetList();
Expand Down Expand Up @@ -458,7 +469,11 @@ public boolean castAtLocation(LivingEntity caster, Location target, float power)
private SpellCastResult castAtLocation(@NotNull SpellData data) {
if (!isTargetedLocation) return fail(data);

data = data.builder().recipient(null).power((passPower ? data.power() : 1) * subPower.get(data)).args(args.get(data)).build();
data = data.builder()
.recipient(null)
.power((passPower.get(data) ? data.power() : 1) * subPower.get(data))
.args(passArgs.get(data) ? data.args() : args.get(data))
.build();

double chance = this.chance.get(data);
if ((chance > 0 && chance < 1) && random.nextDouble() > chance) return fail(data);
Expand Down Expand Up @@ -535,7 +550,11 @@ public boolean castAtEntityFromLocation(LivingEntity caster, Location from, Livi
private SpellCastResult castAtEntityFromLocation(@NotNull SpellData data, boolean passTargeting) {
if (!isTargetedEntityFromLocation) return fail(data);

data = data.builder().recipient(null).power((passPower ? data.power() : 1) * subPower.get(data)).args(args.get(data)).build();
data = data.builder()
.recipient(null)
.power((passPower.get(data) ? data.power() : 1) * subPower.get(data))
.args(passArgs.get(data) ? data.args() : args.get(data))
.build();

if (mode != CastMode.HARD && !this.passTargeting.getOr(data, passTargeting)) {
ValidTargetList canTarget = spell.getValidTargetList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,12 @@ public static ConfigData<Boolean> getBoolean(@NotNull ConfigurationSection confi

if (config.isString(path)) {
ConfigData<String> supplier = getString(config, path, null);
return data -> Boolean.parseBoolean(supplier.get(data));
if (supplier.isConstant()) {
Boolean val = parseBoolean(supplier.get());
return data -> val;
}

return (VariableConfigData<Boolean>) data -> parseBoolean(supplier.get(data));
}

return data -> null;
Expand All @@ -431,8 +436,13 @@ public static ConfigData<Boolean> getBoolean(@NotNull ConfigurationSection confi
}

if (config.isString(path)) {
ConfigData<String> supplier = getString(config, path, Boolean.toString(def));
return data -> Boolean.parseBoolean(supplier.get(data));
ConfigData<String> supplier = getString(config, path, null);
if (supplier.isConstant()) {
boolean val = parseBoolean(supplier.get(), def);
return data -> val;
}

return (VariableConfigData<Boolean>) data -> parseBoolean(supplier.get(data), def);
}

return data -> def;
Expand All @@ -446,15 +456,53 @@ public static ConfigData<Boolean> getBoolean(@NotNull ConfigurationSection confi

if (config.isString(path)) {
ConfigData<String> supplier = getString(config, path, null);
return data -> {
String value = supplier.get(data);
return value == null ? def.get(data) : Boolean.parseBoolean(value);
if (supplier.isConstant()) {
Boolean val = parseBoolean(supplier.get());
if (val == null) return def;

return data -> val;
}

return (VariableConfigData<Boolean>) data -> {
Boolean val = parseBoolean(supplier.get(data));
return val == null ? def.get(data) : val;
};
}

return def;
}

public static ConfigData<Boolean> getBoolean(@NotNull String value, boolean def) {
ConfigData<String> supplier = getString(value);
if (supplier.isConstant()) {
boolean val = parseBoolean(value, def);
return data -> val;
}

return (VariableConfigData<Boolean>) data -> parseBoolean(supplier.get(data), def);
}

@Nullable
private static Boolean parseBoolean(@Nullable String value) {
if (value == null) return null;

return switch (value.toLowerCase()) {
case "true" -> true;
case "false" -> false;
default -> null;
};
}

private static boolean parseBoolean(@Nullable String value, boolean def) {
if (value == null) return def;

return switch (value.toLowerCase()) {
case "true" -> true;
case "false" -> false;
default -> def;
};
}

@NotNull
public static <T extends Enum<T>> ConfigData<T> getEnum(@NotNull ConfigurationSection config,
@NotNull String path,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.nisovin.magicspells.util.config;

public interface VariableConfigData<T> extends ConfigData<T> {

@Override
default boolean isConstant() {
return false;
}

}

0 comments on commit 5dab9e4

Please sign in to comment.