forked from SkriptLang/Skript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExprFuseTicks.java
More file actions
117 lines (101 loc) · 3.55 KB
/
ExprFuseTicks.java
File metadata and controls
117 lines (101 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package ch.njol.skript.expressions;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Example;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.expressions.base.SimplePropertyExpression;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.util.Timespan;
import ch.njol.skript.util.Timespan.TimePeriod;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
@Name("Entity Fuse Duration")
@Description("Get or set how long until a Creeper/Primed TNT explodes. For Creepers, the fuse time will be 0 seconds and if set it will be ticking down even if the entity is not currently in exploding animation.")
@Example("send \"Run! That guy is going to explode in %fuse ticks of player's target%\"")
@Example("send the max fuse ticks of target")
@Since("INSERT VERSION")
public class ExprFuseTicks extends SimplePropertyExpression<Entity, Timespan> {
static {
register(ExprFuseTicks.class, Timespan.class, "[:max[imum]] fuse (duration|length)", "entities");
}
private boolean max;
@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
max = (parseResult.hasTag("max"));
return super.init(expressions, matchedPattern, isDelayed, parseResult);
}
@Override
public @Nullable Timespan convert(Entity entity) {
if (entity instanceof Creeper creeper) {
return new Timespan(TimePeriod.TICK, (max ? creeper.getMaxFuseTicks() : creeper.getFuseTicks()));
}
if (entity instanceof TNTPrimed tntprimed) {
return new Timespan(TimePeriod.TICK, tntprimed.getFuseTicks());
}
return null;
}
@Override
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
if (max) {
Skript.error("The maximum fuse length of an entity cannot be changed.");
return null;
}
return switch (mode) {
case ADD, SET, REMOVE -> CollectionUtils.array(Timespan.class);
case RESET, DELETE -> CollectionUtils.array();
default -> null;
};
}
@Override
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
Entity[] entities = getExpr().getArray(event);
int change = delta == null ? 0 : (int) ((Timespan) delta[0]).getAs(Timespan.TimePeriod.TICK);
switch (mode) {
case REMOVE:
change = -change;
case ADD:
for (Entity entity : entities)
if (entity instanceof Creeper creeper) {
creeper.setFuseTicks(creeper.getFuseTicks() + change);
} else if (entity instanceof TNTPrimed tntprimed) {
tntprimed.setFuseTicks(tntprimed.getFuseTicks() + change);
}
break;
case SET:
for (Entity entity : entities)
if (entity instanceof Creeper creeper) {
creeper.setMaxFuseTicks(change);
creeper.setFuseTicks(change);
} else if (entity instanceof TNTPrimed tntprimed) {
tntprimed.setFuseTicks(change);
}
break;
case DELETE:
case RESET:
for (Entity entity : entities)
if (entity instanceof Creeper creeper) {
creeper.setFuseTicks(creeper.getMaxFuseTicks());
} else if (entity instanceof TNTPrimed tntprimed) {
tntprimed.setFuseTicks(80);
}
break;
default:
assert false;
}
}
@Override
public Class<Timespan> getReturnType() {
return Timespan.class;
}
@Override
protected String getPropertyName() {
return "fuse duration";
}
}