Skip to content

Commit a8cec28

Browse files
authored
Allow past/future in ExprLevel via default value (#8295)
Allow default player, past/future states, clean up code
1 parent 72dcc95 commit a8cec28

File tree

1 file changed

+51
-56
lines changed

1 file changed

+51
-56
lines changed

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

Lines changed: 51 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package ch.njol.skript.expressions;
22

3+
import ch.njol.skript.Skript;
4+
import ch.njol.skript.classes.Changer.ChangeMode;
5+
import ch.njol.skript.doc.*;
6+
import ch.njol.skript.effects.Delay;
7+
import ch.njol.skript.expressions.base.SimplePropertyExpression;
38
import org.bukkit.entity.Player;
49
import org.bukkit.event.Event;
510
import org.bukkit.event.entity.EntityDeathEvent;
@@ -8,114 +13,104 @@
813
import org.bukkit.event.player.PlayerRespawnEvent;
914
import org.jetbrains.annotations.Nullable;
1015

11-
import ch.njol.skript.Skript;
12-
import ch.njol.skript.classes.Changer.ChangeMode;
13-
import ch.njol.skript.doc.Description;
14-
import ch.njol.skript.doc.Events;
15-
import ch.njol.skript.doc.Examples;
16-
import ch.njol.skript.doc.Name;
17-
import ch.njol.skript.doc.Since;
18-
import ch.njol.skript.effects.Delay;
19-
import ch.njol.skript.expressions.base.SimplePropertyExpression;
20-
21-
/**
22-
* @author Peter Güttinger
23-
*/
2416
@Name("Level")
25-
@Description("The level of a player.")
26-
@Examples({"reduce the victim's level by 1",
27-
"set the player's level to 0"})
28-
@Since("unknown (before 2.1)")
17+
@Description("The experience level of a player.")
18+
@Example("reduce the victim's level by 1")
19+
@Example("set the player's level to 0")
20+
@Example("""
21+
on level change:
22+
set {_diff} to future xp level - past exp level
23+
broadcast "%player%'s level changed by %{_diff}%!"
24+
""")
25+
@Since("unknown (before 2.1), INSERT VERSION (allow player default)")
2926
@Events("level change")
3027
public class ExprLevel extends SimplePropertyExpression<Player, Long> {
28+
3129
static {
32-
register(ExprLevel.class, Long.class, "level", "players");
30+
registerDefault(ExprLevel.class, Long.class, "[xp|exp[erience]] level", "players");
3331
}
3432

3533
@Override
36-
protected Long[] get(final Event e, final Player[] source) {
37-
return super.get(source, p -> {
38-
if (e instanceof PlayerLevelChangeEvent && ((PlayerLevelChangeEvent) e).getPlayer() == p && !Delay.isDelayed(e)) {
39-
return (long) (getTime() < 0 ? ((PlayerLevelChangeEvent) e).getOldLevel() : ((PlayerLevelChangeEvent) e).getNewLevel());
34+
protected Long[] get(Event event, Player[] source) {
35+
return super.get(source, player -> {
36+
if (event instanceof PlayerLevelChangeEvent playerLevelChangeEvent && playerLevelChangeEvent.getPlayer() == player && !Delay.isDelayed(event)) {
37+
return (long) (getTime() < 0 ? playerLevelChangeEvent.getOldLevel() : playerLevelChangeEvent.getNewLevel());
4038
}
41-
return (long) p.getLevel();
39+
return (long) player.getLevel();
4240
});
4341
}
4442

4543
@Override
46-
@Nullable
47-
public Long convert(final Player p) {
44+
public @Nullable Long convert(Player player) {
4845
assert false;
4946
return null;
5047
}
51-
52-
@Override
53-
public Class<Long> getReturnType() {
54-
return Long.class;
55-
}
56-
48+
5749
@Override
58-
@Nullable
59-
public Class<?>[] acceptChange(final ChangeMode mode) {
50+
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
6051
if (mode == ChangeMode.REMOVE_ALL)
6152
return null;
6253
if (getParser().isCurrentEvent(PlayerRespawnEvent.class) && !getParser().getHasDelayBefore().isTrue()) {
6354
Skript.error("Cannot change a player's level in a respawn event. Add a delay of 1 tick or change the 'new level' in a death event.");
6455
return null;
6556
}
6657
if (getParser().isCurrentEvent(EntityDeathEvent.class) && getTime() == 0 && getExpr().isDefault() && !getParser().getHasDelayBefore().isTrue()) {
67-
Skript.warning("Changing the player's level in a death event will change the player's level before he dies. " +
68-
"Use either 'past level of player' or 'new level of player' to clearly state whether to change the level before or after he dies.");
58+
Skript.warning("Changing the player's level in a death event will change the player's level before they die. " +
59+
"Use either 'past level of player' or 'new level of player' to clearly state whether to change the level before or after they die.");
6960
}
7061
if (getTime() == -1 && !getParser().isCurrentEvent(EntityDeathEvent.class))
7162
return null;
63+
if (getTime() != 0 && getParser().isCurrentEvent(PlayerLevelChangeEvent.class)) {
64+
Skript.error("Changing the past or future level in a level change event has no effect.");
65+
return null;
66+
}
7267
return new Class[] {Number.class};
7368
}
74-
69+
7570
@Override
76-
public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) {
71+
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
7772
assert mode != ChangeMode.REMOVE_ALL;
78-
79-
final int l = delta == null ? 0 : ((Number) delta[0]).intValue();
80-
81-
for (final Player p : getExpr().getArray(e)) {
73+
int deltaAmount = delta == null ? 0 : ((Number) delta[0]).intValue();
74+
75+
for (Player player : getExpr().getArray(event)) {
8276
int level;
83-
if (getTime() > 0 && e instanceof PlayerDeathEvent && ((PlayerDeathEvent) e).getEntity() == p && !Delay.isDelayed(e)) {
84-
level = ((PlayerDeathEvent) e).getNewLevel();
77+
if (getTime() > 0 && event instanceof PlayerDeathEvent playerDeathEvent && playerDeathEvent.getEntity() == player && !Delay.isDelayed(event)) {
78+
level = playerDeathEvent.getNewLevel();
8579
} else {
86-
level = p.getLevel();
80+
level = player.getLevel();
8781
}
8882
switch (mode) {
8983
case SET:
90-
level = l;
84+
level = deltaAmount;
9185
break;
9286
case ADD:
93-
level += l;
87+
level += deltaAmount;
9488
break;
9589
case REMOVE:
96-
level -= l;
90+
level -= deltaAmount;
9791
break;
9892
case DELETE:
9993
case RESET:
10094
level = 0;
10195
break;
102-
case REMOVE_ALL:
103-
assert false;
104-
continue;
10596
}
10697
if (level < 0)
107-
continue;
108-
if (getTime() > 0 && e instanceof PlayerDeathEvent && ((PlayerDeathEvent) e).getEntity() == p && !Delay.isDelayed(e)) {
109-
((PlayerDeathEvent) e).setNewLevel(level);
98+
level = 0;
99+
if (getTime() > 0 && event instanceof PlayerDeathEvent playerDeathEvent && playerDeathEvent.getEntity() == player && !Delay.isDelayed(event)) {
100+
playerDeathEvent.setNewLevel(level);
110101
} else {
111-
p.setLevel(level);
102+
player.setLevel(level);
112103
}
113104
}
114105
}
115106

116-
@SuppressWarnings("unchecked")
117107
@Override
118-
public boolean setTime(final int time) {
108+
public Class<Long> getReturnType() {
109+
return Long.class;
110+
}
111+
112+
@Override
113+
public boolean setTime(int time) {
119114
return super.setTime(time, getExpr(), PlayerLevelChangeEvent.class, PlayerDeathEvent.class);
120115
}
121116

0 commit comments

Comments
 (0)