Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9df3e31
Initial Planning
sovdeeth Feb 23, 2024
47ad280
rename to GameEffect, create syntaxes for those that need data.
sovdeeth Feb 24, 2024
217ad60
begin implementing GameEffects
sovdeeth Jun 10, 2024
b35b48a
Merge remote-tracking branch 'upstream/dev/feature' into feature/part…
sovdeeth Jun 29, 2024
c1edbb4
Merge remote-tracking branch 'upstream/dev/feature' into feature/part…
sovdeeth Oct 13, 2024
c738740
Merge branch 'dev/feature' into feature/particle-rework
Efnilite Jan 7, 2025
69ae04f
Merge branch 'dev/feature' into feature/particle-rework
sovdeeth Apr 19, 2025
60415e5
Mostly finish GameEffects
sovdeeth Apr 19, 2025
f20f504
Finish game effects
sovdeeth Apr 21, 2025
6cbe291
forgot types.gameeffect
sovdeeth Apr 21, 2025
1049923
Initial EntityEffect Efforts
sovdeeth Apr 21, 2025
7483445
verify + name entityeffects
sovdeeth Jun 9, 2025
2597f9c
Merge branch 'dev/feature' into feature/particle-rework
sovdeeth Nov 16, 2025
293acfd
implement particle effects first pass
sovdeeth Nov 24, 2025
2515235
rework particles
sovdeeth Nov 30, 2025
dc19415
Unify effect infos between game effects and particles
sovdeeth Nov 30, 2025
12aa9b2
re-work toString methodology, fix version compat, various bug fixing,…
sovdeeth Dec 1, 2025
c7ffe10
JavaDocs and proper module
sovdeeth Dec 1, 2025
e648971
Update CODEOWNERS
sovdeeth Dec 1, 2025
b480047
Merge branch 'dev/feature' into feature/particle-rework
sovdeeth Dec 9, 2025
7de62eb
Final syntaxes, polish, docs, and visual effect removal
sovdeeth Dec 9, 2025
9e1cd26
remove 'show' pattern conflict
sovdeeth Dec 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,6 @@

# EntityData
/src/main/java/ch/njol/skript/entity @Absolutionism @skriptlang/core-developers

# Particles/Effects
/src/main/java/org/skriptlang/skript/bukkit/particles @sovdeeth @skriptlang/core-developers
6 changes: 4 additions & 2 deletions src/main/java/ch/njol/skript/Skript.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
import org.skriptlang.skript.bukkit.itemcomponents.ItemComponentModule;
import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer;
import org.skriptlang.skript.bukkit.loottables.LootTableModule;
import org.skriptlang.skript.bukkit.particles.ParticleModule;
import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys;
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
import org.skriptlang.skript.bukkit.tags.TagModule;
Expand Down Expand Up @@ -444,7 +445,7 @@ public void onEnable() {
if (!aliasesFolder.mkdirs())
throw new IOException("Could not create the directory " + aliasesFolder);
}

f = new ZipFile(getFile());
for (ZipEntry e : new EnumerationIterable<ZipEntry>(f.entries())) {
if (e.isDirectory())
Expand Down Expand Up @@ -599,7 +600,8 @@ public void onEnable() {
new DamageSourceModule(),
new ItemComponentModule(),
new BrewingModule(),
new CommonModule()
new CommonModule(),
new ParticleModule()
);
} catch (final Exception e) {
exception(e, "Could not load required .class files: " + e.getLocalizedMessage());
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/ch/njol/skript/classes/EnumParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class EnumParser<E extends Enum<E>> extends PatternedParser<E> implements
private final Class<E> enumClass;
private final String languageNode;
private String[] names;
private final Map<String, E> parseMap = new HashMap<>();
protected final Map<String, E> parseMap = new HashMap<>();
private String[] patterns;

/**
Expand Down Expand Up @@ -65,11 +65,17 @@ void refresh() {
String first = strippedOption.getFirst();
Integer second = strippedOption.getSecond();

NonNullPair<String, String> singlePlural = Noun.getPlural(first);
String single = singlePlural.getFirst();
String plural = singlePlural.getSecond();

if (names[ordinal] == null) { // Add to name array if needed
names[ordinal] = first;
names[ordinal] = single;
}

parseMap.put(first, constant);
parseMap.put(single, constant);
if (!plural.isEmpty())
parseMap.put(plural, constant);
if (second != -1) { // There is a gender present
parseMap.put(Noun.getArticleWithSpace(second, Language.F_INDEFINITE_ARTICLE) + first, constant);
}
Expand Down
31 changes: 0 additions & 31 deletions src/main/java/ch/njol/skript/classes/data/SkriptClasses.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
import ch.njol.skript.localization.RegexMessage;
import ch.njol.skript.registrations.Classes;
import ch.njol.skript.util.*;
import ch.njol.skript.util.visual.VisualEffect;
import ch.njol.skript.util.visual.VisualEffects;
import ch.njol.yggdrasil.Fields;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -475,35 +473,6 @@ public String toVariableNameString(final Experience xp) {
})
.serializer(new YggdrasilSerializer<>()));

Classes.registerClass(new ClassInfo<>(VisualEffect.class, "visualeffect")
.name("Visual Effect")
.description("A visible effect, e.g. particles.")
.examples("show wolf hearts on the clicked wolf",
"play mob spawner flames at the targeted block to the player")
.usage(VisualEffects.getAllNames())
.since("2.1")
.user("(visual|particle) effects?")
.after("itemtype")
.parser(new Parser<VisualEffect>() {
@Override
@Nullable
public VisualEffect parse(String s, ParseContext context) {
return VisualEffects.parse(s);
}

@Override
public String toString(VisualEffect e, int flags) {
return e.toString(flags);
}

@Override
public String toVariableNameString(VisualEffect e) {
return e.toString();
}

})
.serializer(new YggdrasilSerializer<>()));

Classes.registerClass(new ClassInfo<>(GameruleValue.class, "gamerulevalue")
.user("gamerule values?")
.name("Gamerule Value")
Expand Down
129 changes: 0 additions & 129 deletions src/main/java/ch/njol/skript/effects/EffVisualEffect.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ private static void addSuperEntity(String codeName, Class<? extends Entity> enti
addSuperEntity("mob", Mob.class);
addSuperEntity("creature", Creature.class);
addSuperEntity("animal", Animals.class);
addSuperEntity("tameable", Tameable.class);
addSuperEntity("fish", Fish.class);
addSuperEntity("golem", Golem.class);
addSuperEntity("projectile", Projectile.class);
Expand Down
112 changes: 72 additions & 40 deletions src/main/java/ch/njol/skript/expressions/ExprVelocity.java
Original file line number Diff line number Diff line change
@@ -1,68 +1,100 @@
package ch.njol.skript.expressions;

import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;

import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
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.util.coll.CollectionUtils;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3d;
import org.skriptlang.skript.bukkit.particles.particleeffects.DirectionalEffect;

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

static {
register(ExprVelocity.class, Vector.class, "velocit(y|ies)", "entities");
register(ExprVelocity.class, Vector.class, "velocit(y|ies)", "entities/directionalparticles");
}

@Override
@Nullable
public Vector convert(Entity e) {
return e.getVelocity();
public @Nullable Vector convert(Object object) {
if (object instanceof Entity entity)
return entity.getVelocity();
if (object instanceof DirectionalEffect particleEffect && particleEffect.hasVelocity())
return Vector.fromJOML(particleEffect.velocity());
return null;
}

@Override
@Nullable
@SuppressWarnings("null")
public Class<?>[] acceptChange(ChangeMode mode) {
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET))
return CollectionUtils.array(Vector.class);
return null;
}

@Override
@SuppressWarnings("null")
public void change(Event e, @Nullable Object[] delta, ChangeMode mode) {
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
assert mode == ChangeMode.DELETE || mode == ChangeMode.RESET || delta != null;
for (final Entity entity : getExpr().getArray(e)) {
if (entity == null)
return;
switch (mode) {
case ADD:
entity.setVelocity(entity.getVelocity().add((Vector) delta[0]));
break;
case REMOVE:
entity.setVelocity(entity.getVelocity().subtract((Vector) delta[0]));
break;
case REMOVE_ALL:
break;
case DELETE:
case RESET:
entity.setVelocity(new Vector());
break;
case SET:
entity.setVelocity((Vector) delta[0]);
for (Object object : getExpr().getArray(event)) {
// entities
if (object instanceof Entity entity) {
switch (mode) {
case ADD:
entity.setVelocity(entity.getVelocity().add((Vector) delta[0]));
break;
case REMOVE:
entity.setVelocity(entity.getVelocity().subtract((Vector) delta[0]));
break;
case REMOVE_ALL:
break;
case DELETE:
case RESET:
entity.setVelocity(new Vector());
break;
case SET:
entity.setVelocity((Vector) delta[0]);
}
// particles (don't allow add/remove if no velocity is set)
} else if (object instanceof DirectionalEffect particleEffect) {
switch (mode) {
case ADD:
if (!particleEffect.hasVelocity())
continue;
particleEffect.velocity(particleEffect.velocity().add(((Vector) delta[0]).toVector3d()));
break;
case REMOVE:
if (!particleEffect.hasVelocity())
continue;
particleEffect.velocity(particleEffect.velocity().sub(((Vector) delta[0]).toVector3d()));
break;
case REMOVE_ALL:
break;
case DELETE:
case RESET:
if (!particleEffect.hasVelocity())
continue;
particleEffect.velocity(new Vector3d());
break;
case SET:
particleEffect.velocity(((Vector) delta[0]).toVector3d());
}
}
}
}
Expand Down
Loading