Skip to content

Commit 5963348

Browse files
committed
Add some entity stat modifier stuff
1 parent 9187f9c commit 5963348

4 files changed

Lines changed: 198 additions & 0 deletions

File tree

src/main/java/com/github/skriptdev/skript/plugin/elements/effects/EffectHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffEntityEffect;
99
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffFreeze;
1010
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffKill;
11+
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffRemoveStatModifier;
1112
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffRide;
1213
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffShoot;
1314
import com.github.skriptdev.skript.plugin.elements.effects.entity.EffSpawnEntity;
@@ -43,6 +44,7 @@ public static void register(SkriptRegistration registration) {
4344
EffFreeze.register(registration);
4445
EffInteraction.register(registration);
4546
EffKill.register(registration);
47+
EffRemoveStatModifier.register(registration);
4648
EffRide.register(registration);
4749
EffShoot.register(registration);
4850
EffSpawnEntity.register(registration);
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.github.skriptdev.skript.plugin.elements.effects.entity;
2+
3+
import com.github.skriptdev.skript.api.hytale.utils.EntityUtils;
4+
import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration;
5+
import com.hypixel.hytale.server.core.entity.Entity;
6+
import com.hypixel.hytale.server.core.modules.entitystats.EntityStatMap;
7+
import com.hypixel.hytale.server.core.modules.entitystats.EntityStatValue;
8+
import com.hypixel.hytale.server.core.modules.entitystats.asset.EntityStatType;
9+
import io.github.syst3ms.skriptparser.lang.Effect;
10+
import io.github.syst3ms.skriptparser.lang.Expression;
11+
import io.github.syst3ms.skriptparser.lang.TriggerContext;
12+
import io.github.syst3ms.skriptparser.parsing.ParseContext;
13+
import org.jetbrains.annotations.NotNull;
14+
15+
public class EffRemoveStatModifier extends Effect {
16+
17+
public static void register(SkriptRegistration reg) {
18+
reg.newEffect(EffRemoveStatModifier.class,
19+
"remove %entitystattype% entity stat modifier with key %string% from %entities%")
20+
.name("Entity Stat Modifier - Remove")
21+
.description("Removes an entity stat modifier from the specified entities.",
22+
"The key will be the key used to apply the modifier.")
23+
.examples("remove health entity stat modifier with key \"MyKey\" from all players")
24+
.since("INSERT VERSION")
25+
.register();
26+
}
27+
28+
private Expression<EntityStatType> entityStatType;
29+
private Expression<String> key;
30+
private Expression<Entity> entities;
31+
32+
@SuppressWarnings("unchecked")
33+
@Override
34+
public boolean init(Expression<?> @NotNull [] expressions, int matchedPattern, @NotNull ParseContext parseContext) {
35+
this.entityStatType = (Expression<EntityStatType>) expressions[0];
36+
this.key = (Expression<String>) expressions[1];
37+
this.entities = (Expression<Entity>) expressions[2];
38+
return true;
39+
}
40+
41+
@Override
42+
protected void execute(@NotNull TriggerContext ctx) {
43+
EntityStatType statType = this.entityStatType.getSingle(ctx).orElse(null);
44+
String key = this.key.getSingle(ctx).orElse(null);
45+
if (statType == null || key == null) return;
46+
47+
int index = EntityStatType.getAssetMap().getIndex(statType.getId());
48+
for (Entity entity : this.entities.getArray(ctx)) {
49+
EntityStatMap component = EntityUtils.getComponent(entity, EntityStatMap.getComponentType());
50+
if (component == null) continue;
51+
52+
EntityStatValue entityStatValue = component.get(index);
53+
if (entityStatValue == null) continue;
54+
55+
component.removeModifier(index, key);
56+
}
57+
}
58+
59+
@Override
60+
public String toString(@NotNull TriggerContext ctx, boolean debug) {
61+
return "remove " + this.entityStatType.toString(ctx, debug) + " entity stat modifier with key " +
62+
this.key.toString(ctx, debug) + " from " + this.entities.toString(ctx, debug);
63+
}
64+
65+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package com.github.skriptdev.skript.plugin.elements.sections;
2+
3+
import com.github.skriptdev.skript.api.hytale.utils.EntityUtils;
4+
import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration;
5+
import com.hypixel.hytale.server.core.entity.Entity;
6+
import com.hypixel.hytale.server.core.modules.entitystats.EntityStatMap;
7+
import com.hypixel.hytale.server.core.modules.entitystats.asset.EntityStatType;
8+
import com.hypixel.hytale.server.core.modules.entitystats.modifier.Modifier.ModifierTarget;
9+
import com.hypixel.hytale.server.core.modules.entitystats.modifier.StaticModifier;
10+
import com.hypixel.hytale.server.core.modules.entitystats.modifier.StaticModifier.CalculationType;
11+
import io.github.syst3ms.skriptparser.file.FileSection;
12+
import io.github.syst3ms.skriptparser.lang.CodeSection;
13+
import io.github.syst3ms.skriptparser.lang.Expression;
14+
import io.github.syst3ms.skriptparser.lang.Statement;
15+
import io.github.syst3ms.skriptparser.lang.TriggerContext;
16+
import io.github.syst3ms.skriptparser.lang.entries.SectionConfiguration;
17+
import io.github.syst3ms.skriptparser.log.SkriptLogger;
18+
import io.github.syst3ms.skriptparser.parsing.ParseContext;
19+
import io.github.syst3ms.skriptparser.parsing.ParserState;
20+
import org.jetbrains.annotations.NotNull;
21+
22+
import java.util.Optional;
23+
24+
public class SecApplyStatModifier extends CodeSection {
25+
26+
public static void register(SkriptRegistration reg) {
27+
reg.newSection(SecApplyStatModifier.class,
28+
"apply entity stat modifier to %entities%")
29+
.name("Entity Stat Modifier - Apply")
30+
.description("Applies a static modifier to the specified entities.",
31+
"**Entries**:",
32+
" - `stat` = The EntityStatType to modify (required).",
33+
" - `key` = The string key used to distinguish your modifier from others (required).",
34+
" - `value` = The numeric value to modify (required).",
35+
" - `target` = Whether to target the min/max of the stat. " +
36+
"[optional: use either `min` or `max`, default = max].",
37+
" - `type` = Whether to use additive or multiplicative calculation. " +
38+
"[optional: use either `additive` or `multiplicative`, default = additive].")
39+
.examples("apply entity stat modifier to player:",
40+
"\tstat: health",
41+
"\tkey: \"MyKey\"",
42+
"\tvalue: 5",
43+
"\ttarget: max",
44+
"\ttype: multiplicative")
45+
.since("INSERT VERSION")
46+
.register();
47+
}
48+
49+
private Expression<Entity> entities;
50+
51+
@SuppressWarnings("unchecked")
52+
@Override
53+
public boolean init(Expression<?> @NotNull [] expressions, int matchedPattern, @NotNull ParseContext parseContext) {
54+
this.entities = (Expression<Entity>) expressions[0];
55+
return true;
56+
}
57+
58+
SectionConfiguration config = new SectionConfiguration.Builder()
59+
.addExpression("stat", EntityStatType.class, false)
60+
.addExpression("key", String.class, false)
61+
.addExpression("value", Number.class, false)
62+
.addOptionalKey("target")
63+
.addOptionalKey("type")
64+
.build();
65+
66+
@Override
67+
public boolean loadSection(@NotNull FileSection section, @NotNull ParserState parserState, @NotNull SkriptLogger logger) {
68+
return this.config.loadConfiguration(null, section, parserState, logger);
69+
}
70+
71+
@Override
72+
public Optional<? extends Statement> walk(@NotNull TriggerContext ctx) {
73+
Optional<? extends Statement> nextStatement = getNext();
74+
Expression<EntityStatType> statExpr = this.config.getExpression("stat", EntityStatType.class).orElse(null);
75+
if (statExpr == null) return nextStatement;
76+
77+
Optional<? extends EntityStatType> statSingle = statExpr.getSingle(ctx);
78+
if (statSingle.isEmpty()) return nextStatement;
79+
80+
EntityStatType stat = statSingle.get();
81+
int statIndex = EntityStatType.getAssetMap().getIndex(stat.getId());
82+
83+
Expression<String> keyExpr = this.config.getExpression("key", String.class).orElse(null);
84+
if (keyExpr == null) return nextStatement;
85+
86+
Optional<? extends String> keyOptional = keyExpr.getSingle(ctx);
87+
if (keyOptional.isEmpty()) return nextStatement;
88+
89+
String key = keyOptional.get();
90+
91+
ModifierTarget target = ModifierTarget.MAX;
92+
Object targetKey = this.config.getValue("target");
93+
if (targetKey != null && targetKey.equals("min")) {
94+
target = ModifierTarget.MIN;
95+
}
96+
97+
CalculationType type = CalculationType.ADDITIVE;
98+
Object calcType = this.config.getValue("type");
99+
if (calcType != null && calcType.equals("multiplicative")) {
100+
type = CalculationType.MULTIPLICATIVE;
101+
}
102+
103+
float amount = 0;
104+
Optional<Expression<Number>> valExpr = this.config.getExpression("value", Number.class);
105+
if (valExpr.isPresent()) {
106+
Optional<? extends Number> single = valExpr.get().getSingle(ctx);
107+
if (single.isPresent()) {
108+
amount = single.get().floatValue();
109+
}
110+
}
111+
112+
StaticModifier modifier = new StaticModifier(target, type, amount);
113+
114+
for (Entity entity : this.entities.getArray(ctx)) {
115+
EntityStatMap component = EntityUtils.getComponent(entity, EntityStatMap.getComponentType());
116+
if (component == null) continue;
117+
118+
component.putModifier(statIndex, key, modifier);
119+
}
120+
121+
122+
return nextStatement;
123+
}
124+
125+
@Override
126+
public String toString(@NotNull TriggerContext ctx, boolean debug) {
127+
return "apply entity stat modifier to " + this.entities.toString(ctx, debug);
128+
}
129+
130+
}

src/main/java/com/github/skriptdev/skript/plugin/elements/sections/SectionHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
public class SectionHandler {
66

77
public static void register(SkriptRegistration registration) {
8+
SecApplyStatModifier.register(registration);
89
SecDropItem.register(registration);
910
SecExecuteInWorld.register(registration);
1011
SecPlaySound.register(registration);

0 commit comments

Comments
 (0)