Skip to content

Commit b02d28e

Browse files
authored
Merge branch 'dev/feature' into dev/ExprCenterLocations
2 parents 7f728c2 + ecb7b39 commit b02d28e

31 files changed

+917
-136
lines changed

src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ch.njol.skript.aliases.ItemType;
55
import ch.njol.skript.bukkitutil.InventoryUtils;
66
import ch.njol.skript.command.CommandEvent;
7+
import ch.njol.skript.entity.EntityData;
78
import ch.njol.skript.events.bukkit.ScriptEvent;
89
import ch.njol.skript.events.bukkit.SkriptStartEvent;
910
import ch.njol.skript.events.bukkit.SkriptStopEvent;
@@ -170,6 +171,8 @@ public final class BukkitEventValues {
170171
"Use 'attacker' and/or 'victim' in damage/death events", EntityDamageEvent.class, EntityDeathEvent.class);
171172
EventValues.registerEventValue(EntityEvent.class, World.class, event -> event.getEntity().getWorld());
172173
EventValues.registerEventValue(EntityEvent.class, Location.class, event -> event.getEntity().getLocation());
174+
EventValues.registerEventValue(EntityEvent.class, EntityData.class, event -> EntityData.fromEntity(event.getEntity()),
175+
TIME_NOW, "Use 'type of attacker/victim' in damage/death events.", EntityDamageEvent.class, EntityDeathEvent.class);
173176
// EntityDamageEvent
174177
EventValues.registerEventValue(EntityDamageEvent.class, DamageCause.class, EntityDamageEvent::getCause);
175178
EventValues.registerEventValue(EntityDamageByEntityEvent.class, Projectile.class, event -> {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ch.njol.skript.conditions;
2+
3+
import ch.njol.skript.conditions.base.PropertyCondition;
4+
import ch.njol.skript.doc.Description;
5+
import ch.njol.skript.doc.Example;
6+
import ch.njol.skript.doc.Name;
7+
import ch.njol.skript.doc.Since;
8+
import org.bukkit.entity.LivingEntity;
9+
import org.bukkit.entity.Strider;
10+
11+
@Name("Strider Is Shivering")
12+
@Description("Whether a strider is shivering.")
13+
@Example("""
14+
if last spawned strider is shivering:
15+
make last spawned strider stop shivering
16+
""")
17+
@Since("INSERT VERSION")
18+
public class CondStriderIsShivering extends PropertyCondition<LivingEntity> {
19+
20+
static {
21+
register(CondStriderIsShivering.class, "shivering", "livingentities");
22+
}
23+
24+
@Override
25+
public boolean check(LivingEntity entity) {
26+
return entity instanceof Strider strider && strider.isShivering();
27+
}
28+
29+
@Override
30+
protected String getPropertyName() {
31+
return "shivering";
32+
}
33+
34+
}
Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,70 @@
11
package ch.njol.skript.effects;
22

3-
import org.bukkit.entity.Entity;
4-
import org.bukkit.event.Event;
5-
import org.bukkit.util.Vector;
6-
import org.jetbrains.annotations.Nullable;
7-
83
import ch.njol.skript.Skript;
94
import ch.njol.skript.doc.Description;
10-
import ch.njol.skript.doc.Examples;
5+
import ch.njol.skript.doc.Example;
116
import ch.njol.skript.doc.Name;
127
import ch.njol.skript.doc.Since;
138
import ch.njol.skript.lang.Effect;
149
import ch.njol.skript.lang.Expression;
1510
import ch.njol.skript.lang.SkriptParser.ParseResult;
1611
import ch.njol.skript.util.Direction;
1712
import ch.njol.util.Kleenean;
13+
import org.bukkit.entity.Entity;
14+
import org.bukkit.event.Event;
15+
import org.bukkit.util.Vector;
16+
import org.jetbrains.annotations.Nullable;
1817

19-
/**
20-
* @author Peter Güttinger
21-
*/
2218
@Name("Push")
2319
@Description("Push entities around.")
24-
@Examples({"push the player upwards",
25-
"push the victim downwards at speed 0.5"})
20+
@Example("push the player upwards")
21+
@Example("push the victim downwards at speed 0.5")
22+
@Example("push player along vector from player to player's target at speed 2")
2623
@Since("1.4.6")
2724
public class EffPush extends Effect {
25+
2826
static {
29-
Skript.registerEffect(EffPush.class, "(push|thrust) %entities% %direction% [(at|with) (speed|velocity|force) %-number%]");
27+
Skript.registerEffect(EffPush.class, "(push|thrust) %entities% [along] %direction% [(at|with) (speed|velocity|force) %-number%]");
3028
}
31-
32-
@SuppressWarnings("null")
29+
3330
private Expression<Entity> entities;
34-
@SuppressWarnings("null")
3531
private Expression<Direction> direction;
36-
@Nullable
37-
private Expression<Number> speed = null;
32+
private @Nullable Expression<Number> speed = null;
3833

3934
@SuppressWarnings({"unchecked", "null"})
4035
@Override
41-
public boolean init(final Expression<?>[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) {
36+
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
4237
entities = (Expression<Entity>) exprs[0];
4338
direction = (Expression<Direction>) exprs[1];
4439
speed = (Expression<Number>) exprs[2];
4540
return true;
4641
}
4742

4843
@Override
49-
protected void execute(final Event e) {
50-
final Direction d = direction.getSingle(e);
51-
if (d == null)
44+
protected void execute(Event event) {
45+
Direction direction = this.direction.getSingle(event);
46+
if (direction == null)
5247
return;
53-
final Number v = speed != null ? speed.getSingle(e) : null;
54-
if (speed != null && v == null)
48+
Number speed = this.speed != null ? this.speed.getSingle(event) : null;
49+
if (this.speed != null && speed == null)
5550
return;
56-
final Entity[] ents = entities.getArray(e);
57-
for (final Entity en : ents) {
58-
assert en != null;
59-
final Vector mod = d.getDirection(en);
60-
if (v != null)
61-
mod.normalize().multiply(v.doubleValue());
62-
if (!(Double.isFinite(mod.getX()) && Double.isFinite(mod.getY()) && Double.isFinite(mod.getZ()))) {
51+
Entity[] entities = this.entities.getArray(event);
52+
for (Entity entity : entities) {
53+
Vector pushDirection = direction.getDirection(entity);
54+
if (speed != null)
55+
pushDirection.normalize().multiply(speed.doubleValue());
56+
if (!(Double.isFinite(pushDirection.getX()) && Double.isFinite(pushDirection.getY()) && Double.isFinite(pushDirection.getZ()))) {
6357
// Some component of the mod vector is not finite, so just stop
6458
return;
6559
}
66-
en.setVelocity(en.getVelocity().add(mod)); // REMIND add NoCheatPlus exception to players
60+
entity.setVelocity(entity.getVelocity().add(pushDirection));
6761
}
6862
}
6963

7064
@Override
71-
public String toString(final @Nullable Event e, final boolean debug) {
72-
return "push " + entities.toString(e, debug) + " " + direction.toString(e, debug) + (speed != null ? " at speed " + speed.toString(e, debug) : "");
65+
public String toString(@Nullable Event event, boolean debug) {
66+
return "push " + entities.toString(event, debug) + " " + direction.toString(event, debug) +
67+
(speed != null ? " at speed " + speed.toString(event, debug) : "");
7368
}
7469

7570
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package ch.njol.skript.effects;
2+
3+
import ch.njol.skript.Skript;
4+
import ch.njol.skript.doc.Description;
5+
import ch.njol.skript.doc.Example;
6+
import ch.njol.skript.doc.Name;
7+
import ch.njol.skript.doc.Since;
8+
import ch.njol.skript.lang.Effect;
9+
import ch.njol.skript.lang.Expression;
10+
import ch.njol.skript.lang.SkriptParser.ParseResult;
11+
import ch.njol.skript.lang.SyntaxStringBuilder;
12+
import ch.njol.util.Kleenean;
13+
import org.bukkit.entity.LivingEntity;
14+
import org.bukkit.entity.Strider;
15+
import org.bukkit.event.Event;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
@Name("Strider Shivering")
19+
@Description("Make a strider start/stop shivering.")
20+
@Example("""
21+
if last spawned strider is shivering:
22+
make last spawned strider stop shivering
23+
""")
24+
@Since("INSERT VERSION")
25+
public class EffStriderShivering extends Effect {
26+
27+
static {
28+
Skript.registerEffect(EffStriderShivering.class,
29+
"make %livingentities% start shivering",
30+
"force %livingentities% to start shivering",
31+
"make %livingentities% stop shivering",
32+
"force %livingentities% to stop shivering");
33+
}
34+
35+
private Expression<LivingEntity> entities;
36+
private boolean start;
37+
38+
@Override
39+
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
40+
//noinspection unchecked
41+
entities = (Expression<LivingEntity>) exprs[0];
42+
start = matchedPattern <= 1;
43+
return true;
44+
}
45+
46+
@Override
47+
protected void execute(Event event) {
48+
for (LivingEntity entity : entities.getArray(event)) {
49+
if (entity instanceof Strider strider) {
50+
strider.setShivering(start);
51+
}
52+
}
53+
}
54+
55+
@Override
56+
public String toString(@Nullable Event event, boolean debug) {
57+
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
58+
builder.append("make", entities);
59+
if (start) {
60+
builder.append("start");
61+
} else {
62+
builder.append("stop");
63+
}
64+
builder.append("shivering");
65+
return builder.toString();
66+
}
67+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package ch.njol.skript.entity;
2+
3+
import ch.njol.skript.lang.Literal;
4+
import ch.njol.skript.lang.SkriptParser.ParseResult;
5+
import ch.njol.util.Kleenean;
6+
import org.bukkit.entity.Strider;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
import java.util.Objects;
10+
11+
public class StriderData extends EntityData<Strider> {
12+
13+
static {
14+
register(StriderData.class, "strider", Strider.class, 1,
15+
"warm strider", "strider", "shivering strider");
16+
}
17+
18+
private Kleenean shivering = Kleenean.UNKNOWN;
19+
20+
public StriderData() {}
21+
22+
public StriderData(Kleenean shivering) {
23+
this.shivering = shivering;
24+
}
25+
26+
@Override
27+
protected boolean init(Literal<?>[] exprs, int matchedPattern, ParseResult parseResult) {
28+
shivering = Kleenean.get(matchedPattern - 1);
29+
return true;
30+
}
31+
32+
@Override
33+
protected boolean init(@Nullable Class<? extends Strider> entityClass, @Nullable Strider entity) {
34+
shivering = Kleenean.get(entity == null ? 0 : (entity.isShivering() ? 1 : -1));
35+
return true;
36+
}
37+
38+
@Override
39+
public void set(Strider entity) {
40+
entity.setShivering(shivering.isTrue());
41+
}
42+
43+
@Override
44+
protected boolean match(Strider entity) {
45+
return shivering.isUnknown() || (this.shivering.isTrue() == entity.isShivering());
46+
}
47+
48+
@Override
49+
public boolean isSupertypeOf(EntityData<?> entityData) {
50+
return entityData instanceof StriderData striderData
51+
&& (this.shivering.isUnknown() || striderData.shivering.is(shivering).isTrue());
52+
}
53+
54+
@Override
55+
public Class<? extends Strider> getType() {
56+
return Strider.class;
57+
}
58+
59+
@Override
60+
public EntityData<? super Strider> getSuperType() {
61+
return new StriderData(shivering);
62+
}
63+
64+
@Override
65+
protected int hashCode_i() {
66+
return Objects.hash(shivering);
67+
}
68+
69+
@Override
70+
protected boolean equals_i(EntityData<?> entityData) {
71+
return entityData instanceof StriderData striderData
72+
&& striderData.shivering == this.shivering;
73+
}
74+
75+
@Override
76+
public String toString(int flags) {
77+
StringBuilder builder = new StringBuilder();
78+
switch (shivering) {
79+
case TRUE -> builder.append("shivering ");
80+
case FALSE -> builder.append("warm ");
81+
};
82+
return builder.append("strider").toString();
83+
}
84+
85+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package ch.njol.skript.expressions;
2+
3+
import ch.njol.skript.Skript;
4+
import ch.njol.skript.doc.Description;
5+
import ch.njol.skript.doc.Example;
6+
import ch.njol.skript.doc.Name;
7+
import ch.njol.skript.doc.Since;
8+
import ch.njol.skript.lang.Expression;
9+
import ch.njol.skript.lang.ExpressionType;
10+
import ch.njol.skript.lang.SkriptParser.ParseResult;
11+
import ch.njol.skript.lang.util.SimpleExpression;
12+
import ch.njol.util.Kleenean;
13+
import org.bukkit.event.Event;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
@Name("Last Caught Errors")
17+
@Description("Gets the last caught runtime errors from a 'catch runtime errors' section.")
18+
@Example("""
19+
catch runtime errors:
20+
set worldborder center of {_border} to location(0, 0, NaN value)
21+
if last caught runtime errors contains "Your location can't have a NaN value as one of its components":
22+
set worldborder center of {_border} to location(0, 0, 0)
23+
""")
24+
@Since("INSERT VERSION")
25+
public class ExprCaughtErrors extends SimpleExpression<String> {
26+
27+
static {
28+
Skript.registerExpression(ExprCaughtErrors.class, String.class, ExpressionType.SIMPLE,
29+
"[the] last caught [run[ ]time] errors");
30+
}
31+
32+
public static String[] lastErrors;
33+
34+
@Override
35+
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
36+
return true;
37+
}
38+
39+
@Override
40+
protected String @Nullable [] get(Event event) {
41+
return lastErrors;
42+
}
43+
44+
@Override
45+
public boolean isSingle() {
46+
return false;
47+
}
48+
49+
@Override
50+
public Class<? extends String> getReturnType() {
51+
return String.class;
52+
}
53+
54+
@Override
55+
public String toString(@Nullable Event event, boolean debug) {
56+
return "last caught runtime errors";
57+
}
58+
59+
}

0 commit comments

Comments
 (0)