Skip to content

Commit f7e2932

Browse files
authored
Replace the Visual Effect system (#8302)
* Initial Planning * rename to GameEffect, create syntaxes for those that need data. * begin implementing GameEffects * Mostly finish GameEffects * Finish game effects * forgot types.gameeffect * Initial EntityEffect Efforts now i have to go through every one, check what it really does, and update its name accordingly fun * verify + name entityeffects * implement particle effects first pass * rework particles use particle builder as a base class separate child impls for properties like directional add expressions for offset/speed/scale/distribution/velocitty/count velocity/scale and distribution automatically change count as supported add serialization for particle datas (required a helper class in yggsdrasil) better particle info registration for particles with data * Unify effect infos between game effects and particles * re-work toString methodology, fix version compat, various bug fixing, add tests all 2.14 tests (1.21+) pass! * JavaDocs and proper module * Update CODEOWNERS * Final syntaxes, polish, docs, and visual effect removal * remove 'show' pattern conflict * requested changes A * requested changes B change registration * Add trail back-compat for serialization * Requested Changes * Update ExprGameEffectWithData.java * requested changes * remove unused class * Update ExprParticleWithSpeed.java
1 parent 62aa3f2 commit f7e2932

45 files changed

Lines changed: 3923 additions & 1580 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/CODEOWNERS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,6 @@
7070

7171
# EntityData
7272
/src/main/java/ch/njol/skript/entity @Absolutionism @skriptlang/core-developers
73+
74+
# Particles/Effects
75+
/src/main/java/org/skriptlang/skript/bukkit/particles @sovdeeth @skriptlang/core-developers

src/main/java/ch/njol/skript/Skript.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
import org.skriptlang.skript.bukkit.itemcomponents.ItemComponentModule;
103103
import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer;
104104
import org.skriptlang.skript.bukkit.loottables.LootTableModule;
105+
import org.skriptlang.skript.bukkit.particles.ParticleModule;
105106
import org.skriptlang.skript.bukkit.potion.PotionModule;
106107
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
107108
import org.skriptlang.skript.bukkit.tags.TagModule;
@@ -449,7 +450,7 @@ public void onEnable() {
449450
if (!aliasesFolder.mkdirs())
450451
throw new IOException("Could not create the directory " + aliasesFolder);
451452
}
452-
453+
453454
f = new ZipFile(getFile());
454455
for (ZipEntry e : new EnumerationIterable<ZipEntry>(f.entries())) {
455456
if (e.isDirectory())
@@ -606,7 +607,8 @@ public void onEnable() {
606607
new EntityModule(),
607608
new DamageSourceModule(),
608609
new ItemComponentModule(),
609-
new PotionModule());
610+
new PotionModule(),
611+
new ParticleModule());
610612
} catch (final Exception e) {
611613
exception(e, "Could not load required .class files: " + e.getLocalizedMessage());
612614
setEnabled(false);

src/main/java/ch/njol/skript/classes/EnumParser.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class EnumParser<E extends Enum<E>> extends PatternedParser<E> implements
2020
private final Class<E> enumClass;
2121
private final String languageNode;
2222
private String[] names;
23-
private final Map<String, E> parseMap = new HashMap<>();
23+
protected final Map<String, E> parseMap = new HashMap<>();
2424
private String[] patterns;
2525

2626
/**
@@ -65,11 +65,17 @@ void refresh() {
6565
String first = strippedOption.getFirst();
6666
Integer second = strippedOption.getSecond();
6767

68+
NonNullPair<String, String> singlePlural = Noun.getPlural(first);
69+
String single = singlePlural.getFirst();
70+
String plural = singlePlural.getSecond();
71+
6872
if (names[ordinal] == null) { // Add to name array if needed
69-
names[ordinal] = first;
73+
names[ordinal] = single;
7074
}
7175

72-
parseMap.put(first, constant);
76+
parseMap.put(single, constant);
77+
if (!plural.isEmpty())
78+
parseMap.put(plural, constant);
7379
if (second != -1) { // There is a gender present
7480
parseMap.put(Noun.getArticleWithSpace(second, Language.F_INDEFINITE_ARTICLE) + first, constant);
7581
}

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

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import ch.njol.skript.localization.RegexMessage;
1919
import ch.njol.skript.registrations.Classes;
2020
import ch.njol.skript.util.*;
21-
import ch.njol.skript.util.visual.VisualEffect;
22-
import ch.njol.skript.util.visual.VisualEffects;
2321
import ch.njol.yggdrasil.Fields;
2422
import org.jetbrains.annotations.NotNull;
2523
import org.jetbrains.annotations.Nullable;
@@ -475,35 +473,6 @@ public String toVariableNameString(final Experience xp) {
475473
})
476474
.serializer(new YggdrasilSerializer<>()));
477475

478-
Classes.registerClass(new ClassInfo<>(VisualEffect.class, "visualeffect")
479-
.name("Visual Effect")
480-
.description("A visible effect, e.g. particles.")
481-
.examples("show wolf hearts on the clicked wolf",
482-
"play mob spawner flames at the targeted block to the player")
483-
.usage(VisualEffects.getAllNames())
484-
.since("2.1")
485-
.user("(visual|particle) effects?")
486-
.after("itemtype")
487-
.parser(new Parser<VisualEffect>() {
488-
@Override
489-
@Nullable
490-
public VisualEffect parse(String s, ParseContext context) {
491-
return VisualEffects.parse(s);
492-
}
493-
494-
@Override
495-
public String toString(VisualEffect e, int flags) {
496-
return e.toString(flags);
497-
}
498-
499-
@Override
500-
public String toVariableNameString(VisualEffect e) {
501-
return e.toString();
502-
}
503-
504-
})
505-
.serializer(new YggdrasilSerializer<>()));
506-
507476
Classes.registerClass(new ClassInfo<>(GameruleValue.class, "gamerulevalue")
508477
.user("gamerule values?")
509478
.name("Gamerule Value")

src/main/java/ch/njol/skript/effects/EffVisualEffect.java

Lines changed: 0 additions & 129 deletions
This file was deleted.

src/main/java/ch/njol/skript/entity/SimpleEntityData.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public static void addSuperEntity(String codeName, Class<? extends Entity> entit
262262
addSuperEntity("mob", Mob.class);
263263
addSuperEntity("creature", Creature.class);
264264
addSuperEntity("animal", Animals.class);
265+
addSuperEntity("tameable", Tameable.class);
265266
addSuperEntity("fish", Fish.class);
266267
addSuperEntity("golem", Golem.class);
267268
addSuperEntity("projectile", Projectile.class);

src/main/java/ch/njol/skript/expressions/ExprVelocity.java

Lines changed: 76 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,101 @@
11
package ch.njol.skript.expressions;
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.classes.Changer.ChangeMode;
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.expressions.base.SimplePropertyExpression;
149
import ch.njol.util.coll.CollectionUtils;
10+
import org.bukkit.entity.Entity;
11+
import org.bukkit.event.Event;
12+
import org.bukkit.util.Vector;
13+
import org.jetbrains.annotations.Nullable;
14+
import org.joml.Vector3d;
15+
import org.skriptlang.skript.bukkit.particles.particleeffects.DirectionalEffect;
1516

16-
/**
17-
* @author Sashie
18-
*/
19-
@Name("Vectors - Velocity")
20-
@Description("Gets or changes velocity of an entity.")
21-
@Examples({"set player's velocity to {_v}"})
17+
// TODO: replace with type property expression
18+
@Name("Velocity")
19+
@Description({
20+
"Gets or changes velocity of an entity or particle.",
21+
"Setting the velocity of a particle will remove its random dispersion and force it to be a single particle."
22+
})
23+
@Example("set player's velocity to {_v}")
24+
@Example("set the velocity of {_particle} to vector(0, 1, 0)")
25+
@Example("""
26+
if the vector length of the player's velocity is greater than 5:
27+
send "You're moving fast!" to the player
28+
""")
2229
@Since("2.2-dev31")
23-
public class ExprVelocity extends SimplePropertyExpression<Entity, Vector> {
30+
public class ExprVelocity extends SimplePropertyExpression<Object, Vector> {
2431

2532
static {
26-
register(ExprVelocity.class, Vector.class, "velocit(y|ies)", "entities");
33+
register(ExprVelocity.class, Vector.class, "velocit(y|ies)", "entities/directionalparticles");
2734
}
2835

2936
@Override
30-
@Nullable
31-
public Vector convert(Entity e) {
32-
return e.getVelocity();
37+
public @Nullable Vector convert(Object object) {
38+
if (object instanceof Entity entity)
39+
return entity.getVelocity();
40+
if (object instanceof DirectionalEffect particleEffect && particleEffect.hasVelocity())
41+
return Vector.fromJOML(particleEffect.velocity());
42+
return null;
3343
}
3444

3545
@Override
36-
@Nullable
37-
@SuppressWarnings("null")
38-
public Class<?>[] acceptChange(ChangeMode mode) {
39-
if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET))
40-
return CollectionUtils.array(Vector.class);
41-
return null;
46+
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
47+
return switch (mode) {
48+
case ADD, REMOVE, SET, RESET, DELETE -> CollectionUtils.array(Vector.class);
49+
default -> null;
50+
};
4251
}
4352

4453
@Override
45-
@SuppressWarnings("null")
46-
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
54+
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
4755
assert mode == ChangeMode.DELETE || mode == ChangeMode.RESET || delta != null;
48-
for (final Entity entity : getExpr().getArray(e)) {
49-
if (entity == null)
50-
return;
51-
switch (mode) {
52-
case ADD:
53-
entity.setVelocity(entity.getVelocity().add((Vector) delta[0]));
54-
break;
55-
case REMOVE:
56-
entity.setVelocity(entity.getVelocity().subtract((Vector) delta[0]));
57-
break;
58-
case REMOVE_ALL:
59-
break;
60-
case DELETE:
61-
case RESET:
62-
entity.setVelocity(new Vector());
63-
break;
64-
case SET:
65-
entity.setVelocity((Vector) delta[0]);
56+
for (Object object : getExpr().getArray(event)) {
57+
// entities
58+
if (object instanceof Entity entity) {
59+
switch (mode) {
60+
case ADD:
61+
entity.setVelocity(entity.getVelocity().add((Vector) delta[0]));
62+
break;
63+
case REMOVE:
64+
entity.setVelocity(entity.getVelocity().subtract((Vector) delta[0]));
65+
break;
66+
case REMOVE_ALL:
67+
break;
68+
case DELETE:
69+
case RESET:
70+
entity.setVelocity(new Vector());
71+
break;
72+
case SET:
73+
entity.setVelocity((Vector) delta[0]);
74+
}
75+
// particles (don't allow add/remove if no velocity is set)
76+
} else if (object instanceof DirectionalEffect particleEffect) {
77+
switch (mode) {
78+
case ADD:
79+
if (!particleEffect.hasVelocity())
80+
continue;
81+
particleEffect.velocity(particleEffect.velocity().add(((Vector) delta[0]).toVector3d()));
82+
break;
83+
case REMOVE:
84+
if (!particleEffect.hasVelocity())
85+
continue;
86+
particleEffect.velocity(particleEffect.velocity().sub(((Vector) delta[0]).toVector3d()));
87+
break;
88+
case REMOVE_ALL:
89+
break;
90+
case DELETE:
91+
case RESET:
92+
if (!particleEffect.hasVelocity())
93+
continue;
94+
particleEffect.velocity(new Vector3d());
95+
break;
96+
case SET:
97+
particleEffect.velocity(((Vector) delta[0]).toVector3d());
98+
}
6699
}
67100
}
68101
}

0 commit comments

Comments
 (0)