|
1 | 1 | package ch.njol.skript.expressions; |
2 | 2 |
|
| 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; |
3 | 8 | import org.bukkit.entity.Player; |
4 | 9 | import org.bukkit.event.Event; |
5 | 10 | import org.bukkit.event.entity.EntityDeathEvent; |
|
8 | 13 | import org.bukkit.event.player.PlayerRespawnEvent; |
9 | 14 | import org.jetbrains.annotations.Nullable; |
10 | 15 |
|
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 | | - */ |
24 | 16 | @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)") |
29 | 26 | @Events("level change") |
30 | 27 | public class ExprLevel extends SimplePropertyExpression<Player, Long> { |
| 28 | + |
31 | 29 | static { |
32 | | - register(ExprLevel.class, Long.class, "level", "players"); |
| 30 | + registerDefault(ExprLevel.class, Long.class, "[xp|exp[erience]] level", "players"); |
33 | 31 | } |
34 | 32 |
|
35 | 33 | @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()); |
40 | 38 | } |
41 | | - return (long) p.getLevel(); |
| 39 | + return (long) player.getLevel(); |
42 | 40 | }); |
43 | 41 | } |
44 | 42 |
|
45 | 43 | @Override |
46 | | - @Nullable |
47 | | - public Long convert(final Player p) { |
| 44 | + public @Nullable Long convert(Player player) { |
48 | 45 | assert false; |
49 | 46 | return null; |
50 | 47 | } |
51 | | - |
52 | | - @Override |
53 | | - public Class<Long> getReturnType() { |
54 | | - return Long.class; |
55 | | - } |
56 | | - |
| 48 | + |
57 | 49 | @Override |
58 | | - @Nullable |
59 | | - public Class<?>[] acceptChange(final ChangeMode mode) { |
| 50 | + public Class<?> @Nullable [] acceptChange(ChangeMode mode) { |
60 | 51 | if (mode == ChangeMode.REMOVE_ALL) |
61 | 52 | return null; |
62 | 53 | if (getParser().isCurrentEvent(PlayerRespawnEvent.class) && !getParser().getHasDelayBefore().isTrue()) { |
63 | 54 | 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."); |
64 | 55 | return null; |
65 | 56 | } |
66 | 57 | 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."); |
69 | 60 | } |
70 | 61 | if (getTime() == -1 && !getParser().isCurrentEvent(EntityDeathEvent.class)) |
71 | 62 | 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 | + } |
72 | 67 | return new Class[] {Number.class}; |
73 | 68 | } |
74 | | - |
| 69 | + |
75 | 70 | @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) { |
77 | 72 | 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)) { |
82 | 76 | 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(); |
85 | 79 | } else { |
86 | | - level = p.getLevel(); |
| 80 | + level = player.getLevel(); |
87 | 81 | } |
88 | 82 | switch (mode) { |
89 | 83 | case SET: |
90 | | - level = l; |
| 84 | + level = deltaAmount; |
91 | 85 | break; |
92 | 86 | case ADD: |
93 | | - level += l; |
| 87 | + level += deltaAmount; |
94 | 88 | break; |
95 | 89 | case REMOVE: |
96 | | - level -= l; |
| 90 | + level -= deltaAmount; |
97 | 91 | break; |
98 | 92 | case DELETE: |
99 | 93 | case RESET: |
100 | 94 | level = 0; |
101 | 95 | break; |
102 | | - case REMOVE_ALL: |
103 | | - assert false; |
104 | | - continue; |
105 | 96 | } |
106 | 97 | 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); |
110 | 101 | } else { |
111 | | - p.setLevel(level); |
| 102 | + player.setLevel(level); |
112 | 103 | } |
113 | 104 | } |
114 | 105 | } |
115 | 106 |
|
116 | | - @SuppressWarnings("unchecked") |
117 | 107 | @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) { |
119 | 114 | return super.setTime(time, getExpr(), PlayerLevelChangeEvent.class, PlayerDeathEvent.class); |
120 | 115 | } |
121 | 116 |
|
|
0 commit comments