Skip to content

Commit 92ba72d

Browse files
authored
Prevent cancelling of Swim Toggle event (#7066)
1 parent c8ccc5b commit 92ba72d

File tree

4 files changed

+112
-58
lines changed

4 files changed

+112
-58
lines changed

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

Lines changed: 48 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,5 @@
1-
/**
2-
* This file is part of Skript.
3-
*
4-
* Skript is free software: you can redistribute it and/or modify
5-
* it under the terms of the GNU General Public License as published by
6-
* the Free Software Foundation, either version 3 of the License, or
7-
* (at your option) any later version.
8-
*
9-
* Skript is distributed in the hope that it will be useful,
10-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12-
* GNU General Public License for more details.
13-
*
14-
* You should have received a copy of the GNU General Public License
15-
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
16-
*
17-
* Copyright Peter Güttinger, SkriptLang team and contributors
18-
*/
191
package ch.njol.skript.effects;
202

21-
import org.bukkit.entity.Player;
22-
import org.bukkit.event.Cancellable;
23-
import org.bukkit.event.Event;
24-
import org.bukkit.event.Event.Result;
25-
import org.bukkit.event.block.BlockCanBuildEvent;
26-
import org.bukkit.event.inventory.InventoryInteractEvent;
27-
import org.bukkit.event.player.PlayerDropItemEvent;
28-
import org.bukkit.event.player.PlayerInteractEvent;
29-
import org.bukkit.event.player.PlayerLoginEvent;
30-
import org.jetbrains.annotations.Nullable;
31-
323
import ch.njol.skript.Skript;
334
import ch.njol.skript.bukkitutil.PlayerUtils;
345
import ch.njol.skript.doc.Description;
@@ -42,39 +13,58 @@
4213
import ch.njol.skript.log.ErrorQuality;
4314
import ch.njol.skript.util.Utils;
4415
import ch.njol.util.Kleenean;
16+
import org.bukkit.entity.Player;
17+
import org.bukkit.event.Cancellable;
18+
import org.bukkit.event.Event;
19+
import org.bukkit.event.block.BlockCanBuildEvent;
20+
import org.bukkit.event.entity.EntityToggleSwimEvent;
21+
import org.bukkit.event.inventory.InventoryInteractEvent;
22+
import org.bukkit.event.player.PlayerDropItemEvent;
23+
import org.bukkit.event.player.PlayerInteractEvent;
24+
import org.bukkit.event.player.PlayerLoginEvent;
25+
import org.jetbrains.annotations.Nullable;
4526

46-
/**
47-
* @author Peter Güttinger
48-
*/
4927
@Name("Cancel Event")
5028
@Description("Cancels the event (e.g. prevent blocks from being placed, or damage being taken).")
51-
@Examples({"on damage:",
52-
" victim is a player",
53-
" victim has the permission \"skript.god\"",
54-
" cancel the event"})
29+
@Examples({
30+
"on damage:",
31+
"\tvictim is a player",
32+
"\tvictim has the permission \"skript.god\"",
33+
"\tcancel the event"
34+
})
5535
@Since("1.0")
5636
public class EffCancelEvent extends Effect {
37+
5738
static {
5839
Skript.registerEffect(EffCancelEvent.class, "cancel [the] event", "uncancel [the] event");
5940
}
6041

6142
private boolean cancel;
62-
63-
@SuppressWarnings("null")
43+
6444
@Override
65-
public boolean init(final Expression<?>[] vars, final int matchedPattern, final Kleenean isDelayed, final ParseResult parser) {
45+
public boolean init(Expression<?>[] expressions, int matchedPattern,
46+
Kleenean isDelayed, ParseResult parseResult) {
6647
if (isDelayed == Kleenean.TRUE) {
67-
Skript.error("Can't cancel an event anymore after it has already passed", ErrorQuality.SEMANTIC_ERROR);
48+
Skript.error("An event cannot be cancelled after it has already passed", ErrorQuality.SEMANTIC_ERROR);
6849
return false;
6950
}
51+
7052
cancel = matchedPattern == 0;
71-
final Class<? extends Event>[] es = getParser().getCurrentEvents();
72-
if (es == null)
53+
Class<? extends Event>[] currentEvents = getParser().getCurrentEvents();
54+
55+
if (currentEvents == null)
56+
return false;
57+
58+
if (cancel && getParser().isCurrentEvent(EntityToggleSwimEvent.class)) {
59+
Skript.error("Cancelling a toggle swim event has no effect");
7360
return false;
74-
for (final Class<? extends Event> e : es) {
75-
if (Cancellable.class.isAssignableFrom(e) || BlockCanBuildEvent.class.isAssignableFrom(e))
61+
}
62+
63+
for (Class<? extends Event> event : currentEvents) {
64+
if (Cancellable.class.isAssignableFrom(event) || BlockCanBuildEvent.class.isAssignableFrom(event))
7665
return true; // TODO warning if some event(s) cannot be cancelled even though some can (needs a way to be suppressed)
7766
}
67+
7868
if (getParser().isCurrentEvent(PlayerLoginEvent.class))
7969
Skript.error("A connect event cannot be cancelled, but the player may be kicked ('kick player by reason of \"...\"')", ErrorQuality.SEMANTIC_ERROR);
8070
else
@@ -83,24 +73,24 @@ public boolean init(final Expression<?>[] vars, final int matchedPattern, final
8373
}
8474

8575
@Override
86-
public void execute(final Event e) {
87-
if (e instanceof Cancellable)
88-
((Cancellable) e).setCancelled(cancel);
89-
if (e instanceof PlayerInteractEvent) {
90-
EvtClick.interactTracker.eventModified((Cancellable) e);
91-
((PlayerInteractEvent) e).setUseItemInHand(cancel ? Result.DENY : Result.DEFAULT);
92-
((PlayerInteractEvent) e).setUseInteractedBlock(cancel ? Result.DENY : Result.DEFAULT);
93-
} else if (e instanceof BlockCanBuildEvent) {
94-
((BlockCanBuildEvent) e).setBuildable(!cancel);
95-
} else if (e instanceof PlayerDropItemEvent) {
96-
PlayerUtils.updateInventory(((PlayerDropItemEvent) e).getPlayer());
97-
} else if (e instanceof InventoryInteractEvent) {
98-
PlayerUtils.updateInventory(((Player) ((InventoryInteractEvent) e).getWhoClicked()));
76+
public void execute(Event event) {
77+
if (event instanceof Cancellable)
78+
((Cancellable) event).setCancelled(cancel);
79+
if (event instanceof PlayerInteractEvent) {
80+
EvtClick.interactTracker.eventModified((Cancellable) event);
81+
((PlayerInteractEvent) event).setUseItemInHand(cancel ? Event.Result.DENY : Event.Result.DEFAULT);
82+
((PlayerInteractEvent) event).setUseInteractedBlock(cancel ? Event.Result.DENY : Event.Result.DEFAULT);
83+
} else if (event instanceof BlockCanBuildEvent) {
84+
((BlockCanBuildEvent) event).setBuildable(!cancel);
85+
} else if (event instanceof PlayerDropItemEvent) {
86+
PlayerUtils.updateInventory(((PlayerDropItemEvent) event).getPlayer());
87+
} else if (event instanceof InventoryInteractEvent) {
88+
PlayerUtils.updateInventory(((Player) ((InventoryInteractEvent) event).getWhoClicked()));
9989
}
10090
}
10191

10292
@Override
103-
public String toString(final @Nullable Event e, final boolean debug) {
93+
public String toString(@Nullable Event event, boolean debug) {
10494
return (cancel ? "" : "un") + "cancel event";
10595
}
10696

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.skriptlang.skript.test.tests.syntaxes.effects;
2+
3+
import ch.njol.skript.test.runner.SkriptJUnitTest;
4+
import org.junit.Test;
5+
6+
public class EffCancelEventTest extends SkriptJUnitTest {
7+
8+
static {
9+
setShutdownDelay(1);
10+
}
11+
12+
@Test
13+
public void test() {
14+
spawnTestPig();
15+
}
16+
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
test "EffCancelEventJUnit" when running JUnit:
2+
set {_tests::1} to "event not cancelled by default"
3+
set {_tests::2} to "cancel event"
4+
set {_tests::3} to "uncancel event"
5+
6+
ensure junit test "org.skriptlang.skript.test.tests.syntaxes.effects.EffCancelEventTest" completes {_tests::*}
7+
8+
on spawn of pig:
9+
set {_test} to "org.skriptlang.skript.test.tests.syntaxes.effects.EffCancelEventTest"
10+
junit test is {_test}
11+
12+
if event is not cancelled:
13+
complete objective "event not cancelled by default" for {_test}
14+
15+
cancel event
16+
if event is cancelled:
17+
complete objective "cancel event" for {_test}
18+
19+
uncancel event
20+
if event is not cancelled:
21+
complete objective "uncancel event" for {_test}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
parse:
2+
results: {PlayerLogin::parse::*}
3+
code:
4+
on connect:
5+
cancel event
6+
7+
parse:
8+
results: {PlayerQuit::parse::*}
9+
code:
10+
on quit:
11+
cancel event
12+
13+
parse:
14+
results: {SwimToggle::parse::*}
15+
code:
16+
on swim toggle:
17+
cancel event
18+
19+
test "cancelling swim toggle":
20+
assert {SwimToggle::parse::*} contains "Cancelling a toggle swim event has no effect" with "cancelling swim toggle doesn't error"
21+
22+
test "cancelling player login":
23+
assert {PlayerLogin::parse::*} contains "A connect event cannot be cancelled, but the player may be kicked ('kick player by reason of ""...""')" with "cancelling player login doesn't error"
24+
25+
test "cancelling regular event":
26+
assert {PlayerQuit::parse::*} contains "An on quit event cannot be cancelled" with "cancelling regular event doesn't error"

0 commit comments

Comments
 (0)