Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
87 changes: 87 additions & 0 deletions src/main/java/ch/njol/skript/expressions/ExprFuseTicks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
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.util.Math2;
import ch.njol.util.coll.CollectionUtils;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.registration.SyntaxRegistry;

@Name("Fuse Ticks")
@Description("The fuse ticks of a creeper or primed TNT. This is how many ticks remain before the entity explodes.")
@Example("""
on spawn of a creeper:
set the fuse ticks of the event-entity to 100
""")
@Example("""
on spawn of primed tnt:
set fuse ticks of event-entity to 200
""")
@Since("INSERT VERSION")
public class ExprFuseTicks extends SimplePropertyExpression<Entity, Number> {

public static void register(SyntaxRegistry registry) {
registry.register(
SyntaxRegistry.EXPRESSION,
infoBuilder(ExprFuseTicks.class, Number.class, "fuse tick[s]", "entities", false).build()
);
}

@Override
public @Nullable Number convert(Entity entity) {
if (entity instanceof Creeper creeper)
return creeper.getMaxFuseTicks();
else if (entity instanceof TNTPrimed tnt)
return tnt.getFuseTicks();
return null;
}

@Override
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
return switch (mode) {
case SET, DELETE, ADD, REMOVE -> CollectionUtils.array(Number.class);
default -> null;
};
}

@Override
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
int value = delta != null ? Math2.fit(0, ((Number) delta[0]).intValue(), Integer.MAX_VALUE) : 0;
for (Entity entity : getExpr().getArray(event)) {
if (entity instanceof Creeper creeper) {
creeper.setMaxFuseTicks(Math2.fit(0, switch (mode) {
case SET, DELETE -> value;
case ADD -> creeper.getMaxFuseTicks() + value;
case REMOVE -> creeper.getMaxFuseTicks() - value;
default -> throw new IllegalArgumentException("Unexpected mode: " + mode);
}, Integer.MAX_VALUE));
} else if (entity instanceof TNTPrimed tnt) {
tnt.setFuseTicks(Math2.fit(0, switch (mode) {
case SET, DELETE -> value;
case ADD -> tnt.getFuseTicks() + value;
case REMOVE -> tnt.getFuseTicks() - value;
default -> throw new IllegalArgumentException("Unexpected mode: " + mode);
}, Integer.MAX_VALUE));
}
}
}

@Override
public Class<Number> getReturnType() {
return Number.class;
}

@Override
protected String getPropertyName() {
return "fuse ticks";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import ch.njol.skript.Skript;
import ch.njol.skript.entity.SimpleEntityData;
import ch.njol.skript.expressions.ExprFuseTicks;
import org.bukkit.entity.AbstractNautilus;
import org.skriptlang.skript.addon.AddonModule;
import org.skriptlang.skript.addon.HierarchicalAddonModule;
Expand Down Expand Up @@ -38,7 +39,8 @@ protected void loadSelf(SkriptAddon addon) {
}

register(addon,
ExprDeathMessage::register
ExprDeathMessage::register,
ExprFuseTicks::register
);
}

Expand Down
25 changes: 25 additions & 0 deletions src/test/skript/tests/syntaxes/expressions/ExprFuseTicks.sk
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
test "creeper fuse ticks":
spawn a creeper at test-location:
assert fuse ticks of entity is 30 with "fuse ticks of a creeper should be 30 by default"
set fuse ticks of entity to 100
assert fuse ticks of entity is 100 with "fuse ticks of creeper should be 100 after setting to 100"
add 50 to fuse ticks of entity
assert fuse ticks of entity is 150 with "fuse ticks of creeper should be 150 after adding 50"
remove 200 from fuse ticks of entity
assert fuse ticks of entity is 0 with "fuse ticks of creeper should be capped at 0 minimum"
delete fuse ticks of entity
assert fuse ticks of entity is 0 with "fuse ticks of creeper should be 0 after deletion"
delete entity

test "primed tnt fuse ticks":
spawn a primed tnt at test-location:
assert fuse ticks of entity is 80 with "fuse ticks of primed tnt should be 80 by default"
set fuse ticks of entity to 200
assert fuse ticks of entity is 200 with "fuse ticks of primed tnt should be 200 after setting to 200"
add 50 to fuse ticks of entity
assert fuse ticks of entity is 250 with "fuse ticks of primed tnt should be 250 after adding 50"
remove 300 from fuse ticks of entity
assert fuse ticks of entity is 0 with "fuse ticks of primed tnt should be capped at 0 minimum"
delete fuse ticks of entity
assert fuse ticks of entity is 0 with "fuse ticks of primed tnt should be 0 after deletion"
delete entity