Skip to content

Commit e433bcd

Browse files
vLuckyyyRollczi
andauthored
GH-1298 Add tpa event api (#1298)
* Add Teleport request (`/tpa`) events API * Add api example. * code formatting * code formatting * Follow review. * revert. * Fix space. --------- Co-authored-by: Rollczi <ndejlich5@gmail.com>
1 parent 254b990 commit e433bcd

6 files changed

Lines changed: 212 additions & 33 deletions

File tree

eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.eternalcode.example.feature.randomteleport.ApiRandomTeleportCommand;
1616
import com.eternalcode.example.feature.randomteleport.ApiRandomTeleportListener;
1717
import com.eternalcode.example.feature.spawn.ApiSpawnCommand;
18+
import com.eternalcode.example.feature.teleportrequest.ApiTeleportRequestListener;
1819
import dev.rollczi.litecommands.LiteCommands;
1920
import dev.rollczi.litecommands.bukkit.LiteBukkitFactory;
2021
import dev.rollczi.litecommands.bukkit.LiteBukkitMessages;
@@ -48,7 +49,6 @@ public void onEnable() {
4849
new ApiJailCommand(provide.getJailService()),
4950
new ApiRandomTeleportCommand(provide.getRandomTeleportService()),
5051
new ApiSpawnCommand(provide.getSpawnService()),
51-
new ApiRandomTeleportCommand(provide.getRandomTeleportService()),
5252
new ApiHomeCommand(provide.getHomeService())
5353
)
5454

@@ -59,10 +59,10 @@ public void onEnable() {
5959
new CatBoyListener(provide.getCatboyService()),
6060
new ApiRandomTeleportListener(provide.getRandomTeleportService()),
6161
new ApiPrivateChatListener(server),
62-
new ApiRandomTeleportListener(provide.getRandomTeleportService()),
6362
new ApiHomeListener(server),
6463
new ApiJailListener(server),
65-
new ApiIgnoreListener()
64+
new ApiIgnoreListener(),
65+
new ApiTeleportRequestListener()
6666
).forEach(listener -> server.getPluginManager().registerEvents(listener, this));
6767
}
6868

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.eternalcode.example.feature.teleportrequest;
2+
3+
import com.eternalcode.core.feature.teleportrequest.PreTeleportRequestEvent;
4+
import com.eternalcode.core.feature.teleportrequest.TeleportRequestEvent;
5+
import org.bukkit.entity.Player;
6+
import org.bukkit.event.EventHandler;
7+
import org.bukkit.event.Listener;
8+
9+
public class ApiTeleportRequestListener implements Listener {
10+
11+
@EventHandler
12+
public void onPreTeleportRequest(final PreTeleportRequestEvent event) {
13+
Player sender = event.getSender();
14+
Player target = event.getTarget();
15+
16+
sender.sendMessage(String.format(
17+
"PreTeleportRequestEvent: %s wants to teleport to %s (EternalCore API).",
18+
sender.getName(),
19+
target.getName()
20+
));
21+
22+
/*
23+
if (!countryService.areInSameCountry(sender, target)) {
24+
sender.sendMessage("You are not in the same country!");
25+
event.setCancelled(true);
26+
}
27+
*/
28+
}
29+
30+
@EventHandler
31+
public void onTeleportRequest(final TeleportRequestEvent event) {
32+
Player sender = event.getSender();
33+
Player target = event.getTarget();
34+
35+
sender.sendMessage(String.format(
36+
"TeleportRequestEvent: %s sent a teleport request to %s (EternalCore API).",
37+
sender.getName(),
38+
target.getName()
39+
));
40+
}
41+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.eternalcode.core.feature.teleportrequest;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.Cancellable;
5+
import org.bukkit.event.Event;
6+
import org.bukkit.event.HandlerList;
7+
8+
/**
9+
* Called before a teleport request is sent (via /tpa or /tpahere).
10+
* If cancelled, the teleport request will not be created.
11+
*/
12+
public class PreTeleportRequestEvent extends Event implements Cancellable {
13+
14+
private static final HandlerList HANDLER_LIST = new HandlerList();
15+
16+
private final Player sender;
17+
private final Player target;
18+
private boolean cancelled;
19+
20+
public PreTeleportRequestEvent(Player sender, Player target) {
21+
super(false);
22+
23+
this.sender = sender;
24+
this.target = target;
25+
}
26+
27+
public static HandlerList getHandlerList() {
28+
return HANDLER_LIST;
29+
}
30+
31+
public Player getSender() {
32+
return this.sender;
33+
}
34+
35+
public Player getTarget() {
36+
return this.target;
37+
}
38+
39+
@Override
40+
public boolean isCancelled() {
41+
return this.cancelled;
42+
}
43+
44+
@Override
45+
public void setCancelled(boolean cancel) {
46+
this.cancelled = cancel;
47+
}
48+
49+
@Override
50+
public HandlerList getHandlers() {
51+
return HANDLER_LIST;
52+
}
53+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.eternalcode.core.feature.teleportrequest;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.Event;
5+
import org.bukkit.event.HandlerList;
6+
7+
/**
8+
* Called after a teleport request has been successfully created (via /tpa or
9+
* /tpahere).
10+
* This event is informational and cannot be cancelled.
11+
*/
12+
public class TeleportRequestEvent extends Event {
13+
14+
private static final HandlerList HANDLER_LIST = new HandlerList();
15+
16+
private final Player sender;
17+
private final Player target;
18+
19+
public TeleportRequestEvent(Player sender, Player target) {
20+
super(false);
21+
22+
this.sender = sender;
23+
this.target = target;
24+
}
25+
26+
public static HandlerList getHandlerList() {
27+
return HANDLER_LIST;
28+
}
29+
30+
public Player getSender() {
31+
return this.sender;
32+
}
33+
34+
public Player getTarget() {
35+
return this.target;
36+
}
37+
38+
@Override
39+
public HandlerList getHandlers() {
40+
return HANDLER_LIST;
41+
}
42+
}

eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.eternalcode.core.feature.teleportrequest;
22

33
import com.eternalcode.annotations.scan.command.DescriptionDocs;
4+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
5+
import com.eternalcode.commons.concurrent.FutureHandler;
6+
import com.eternalcode.core.event.EventCaller;
47
import com.eternalcode.core.feature.ignore.IgnoreService;
58
import com.eternalcode.core.injector.annotations.Inject;
69
import com.eternalcode.core.notice.NoticeService;
@@ -19,12 +22,22 @@ class TpaCommand {
1922
private final TeleportRequestService requestService;
2023
private final IgnoreService ignoreService;
2124
private final NoticeService noticeService;
25+
private final EventCaller eventCaller;
26+
private final MinecraftScheduler scheduler;
2227

2328
@Inject
24-
TpaCommand(TeleportRequestService requestService, IgnoreService ignoreService, NoticeService noticeService) {
29+
TpaCommand(
30+
TeleportRequestService requestService,
31+
IgnoreService ignoreService,
32+
NoticeService noticeService,
33+
EventCaller eventCaller,
34+
MinecraftScheduler scheduler
35+
) {
2536
this.requestService = requestService;
2637
this.ignoreService = ignoreService;
2738
this.noticeService = noticeService;
39+
this.eventCaller = eventCaller;
40+
this.scheduler = scheduler;
2841
}
2942

3043
@Execute
@@ -42,6 +55,12 @@ void execute(@Sender Player player, @Arg Player target) {
4255
return;
4356
}
4457

58+
PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(player, target));
59+
60+
if (preEvent.isCancelled()) {
61+
return;
62+
}
63+
4564
this.noticeService
4665
.create()
4766
.player(player.getUniqueId())
@@ -67,7 +86,8 @@ void execute(@Sender Player player, @Arg Player target) {
6786
.send();
6887

6988
this.requestService.createRequest(player.getUniqueId(), target.getUniqueId());
70-
});
89+
this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(player, target)));
90+
}).exceptionally(FutureHandler::handleException);
7191
}
7292

7393
CompletableFuture<Boolean> isIgnoring(Player target, Player sender) {

eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.eternalcode.core.feature.teleportrequest.self;
22

33
import com.eternalcode.annotations.scan.command.DescriptionDocs;
4+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
5+
import com.eternalcode.commons.concurrent.FutureHandler;
6+
import com.eternalcode.core.event.EventCaller;
47
import com.eternalcode.core.feature.ignore.IgnoreService;
8+
import com.eternalcode.core.feature.teleportrequest.PreTeleportRequestEvent;
9+
import com.eternalcode.core.feature.teleportrequest.TeleportRequestEvent;
510
import com.eternalcode.core.injector.annotations.Inject;
611
import com.eternalcode.core.notice.NoticeService;
712
import dev.rollczi.litecommands.annotations.argument.Arg;
813
import dev.rollczi.litecommands.annotations.command.Command;
914
import dev.rollczi.litecommands.annotations.context.Sender;
1015
import dev.rollczi.litecommands.annotations.execute.Execute;
1116
import dev.rollczi.litecommands.annotations.permission.Permission;
12-
import org.bukkit.entity.Player;
13-
1417
import java.util.concurrent.CompletableFuture;
18+
import org.bukkit.entity.Player;
1519

1620
@Command(name = "tpahere")
1721
@Permission("eternalcore.tpahere")
@@ -20,19 +24,28 @@ class TpaHereCommand {
2024
private final TeleportHereRequestService requestService;
2125
private final IgnoreService ignoreService;
2226
private final NoticeService noticeService;
27+
private final EventCaller eventCaller;
28+
private final MinecraftScheduler scheduler;
2329

2430
@Inject
25-
TpaHereCommand(TeleportHereRequestService requestService, IgnoreService ignoreService, NoticeService noticeService) {
31+
TpaHereCommand(
32+
TeleportHereRequestService requestService,
33+
IgnoreService ignoreService,
34+
NoticeService noticeService,
35+
EventCaller eventCaller,
36+
MinecraftScheduler scheduler) {
2637
this.requestService = requestService;
2738
this.ignoreService = ignoreService;
2839
this.noticeService = noticeService;
40+
this.eventCaller = eventCaller;
41+
this.scheduler = scheduler;
2942
}
3043

3144
@Execute
3245
@DescriptionDocs(description = "Send teleport request to player to teleport to you", arguments = "<player>")
3346
void execute(@Sender Player sender, @Arg Player target) {
3447
if (sender.equals(target)) {
35-
this.noticeService.player(sender.getUniqueId() , translation -> translation.tpa().tpaSelfMessage());
48+
this.noticeService.player(sender.getUniqueId(), translation -> translation.tpa().tpaSelfMessage());
3649

3750
return;
3851
}
@@ -43,34 +56,40 @@ void execute(@Sender Player sender, @Arg Player target) {
4356
return;
4457
}
4558

59+
PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(sender, target));
60+
61+
if (preEvent.isCancelled()) {
62+
return;
63+
}
64+
4665
this.isIgnoring(target, sender).thenAccept(isIgnoring -> {
47-
if (isIgnoring) {
48-
this.noticeService.create()
49-
.player(sender.getUniqueId())
50-
.notice(translation -> translation.tpa().tpaTargetIgnoresYou())
51-
.placeholder("{PLAYER}", target.getName())
52-
.send();
53-
return;
54-
}
55-
56-
this.noticeService
57-
.create()
58-
.player(sender.getUniqueId())
59-
.notice(translation -> translation.tpa().tpaHereSent())
60-
.placeholder("{PLAYER}", target.getName())
61-
.send();
62-
63-
this.noticeService.create()
66+
if (isIgnoring) {
67+
this.noticeService.create()
68+
.player(sender.getUniqueId())
69+
.notice(translation -> translation.tpa().tpaTargetIgnoresYou())
70+
.placeholder("{PLAYER}", target.getName())
71+
.send();
72+
return;
73+
}
74+
75+
this.noticeService.create()
76+
.player(sender.getUniqueId())
77+
.notice(translation -> translation.tpa().tpaHereSent())
78+
.placeholder("{PLAYER}", target.getName())
79+
.send();
80+
81+
this.noticeService.create()
6482
.player(target.getUniqueId())
6583
.notice(translation -> translation.tpa().tpaHereReceived())
6684
.placeholder("{PLAYER}", sender.getName())
6785
.send();
6886

69-
this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId());
70-
});
87+
this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId());
88+
this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)));
89+
}).exceptionally(FutureHandler::handleException);
7190
}
7291

73-
@Execute(name = "-all", aliases = { "*" })
92+
@Execute(name = "-all", aliases = {"*"})
7493
@Permission("eternalcore.tpahere.all")
7594
@DescriptionDocs(description = "Send teleport request to all online players to teleport to you")
7695
void executeAll(@Sender Player sender) {
@@ -83,6 +102,12 @@ void executeAll(@Sender Player sender) {
83102
continue;
84103
}
85104

105+
PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(sender, target));
106+
107+
if (preEvent.isCancelled()) {
108+
continue;
109+
}
110+
86111
this.isIgnoring(target, sender).thenAccept(isIgnoring -> {
87112
if (isIgnoring) {
88113
return;
@@ -95,8 +120,8 @@ void executeAll(@Sender Player sender) {
95120
.send();
96121

97122
this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId());
98-
99-
});
123+
this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)));
124+
}).exceptionally(FutureHandler::handleException);
100125
}
101126

102127
this.noticeService.create()
@@ -105,8 +130,6 @@ void executeAll(@Sender Player sender) {
105130
.send();
106131
}
107132

108-
109-
110133
private CompletableFuture<Boolean> isIgnoring(Player target, Player sender) {
111134
return this.ignoreService.isIgnored(target.getUniqueId(), sender.getUniqueId());
112135
}

0 commit comments

Comments
 (0)