From 93fc38ee88fb3cda397e412ebc1a3ffa8db74d29 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 9 Feb 2026 22:14:37 +0100 Subject: [PATCH 1/6] Add Teleport request (`/tpa`) events API --- .../example/EternalCoreApiExamplePlugin.java | 46 ++++++------ .../PreTeleportRequestEvent.java | 53 ++++++++++++++ .../teleportrequest/TeleportRequestEvent.java | 42 +++++++++++ .../feature/teleportrequest/TpaCommand.java | 17 ++++- .../teleportrequest/self/TpaHereCommand.java | 72 ++++++++++++------- 5 files changed, 181 insertions(+), 49 deletions(-) create mode 100644 eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/PreTeleportRequestEvent.java create mode 100644 eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestEvent.java diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java index f42690bab..93a1bc36d 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java @@ -15,6 +15,7 @@ import com.eternalcode.example.feature.randomteleport.ApiRandomTeleportCommand; import com.eternalcode.example.feature.randomteleport.ApiRandomTeleportListener; import com.eternalcode.example.feature.spawn.ApiSpawnCommand; +import com.eternalcode.example.feature.teleportrequest.ApiTeleportRequestListener; import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; @@ -38,32 +39,33 @@ public void onEnable() { EternalCoreApi provide = EternalCoreApiProvider.provide(); this.liteCommands = LiteBukkitFactory.builder(FALLBACK_PREFIX, this, server) - .message(LiteBukkitMessages.PLAYER_ONLY, input -> "You must be a player to execute this command!") - .message(LiteBukkitMessages.PLAYER_NOT_FOUND, input -> "Player not found!") - .message(LiteMessages.MISSING_PERMISSIONS, input -> "You don't have permission to execute this command!") + .message(LiteBukkitMessages.PLAYER_ONLY, input -> "You must be a player to execute this command!") + .message(LiteBukkitMessages.PLAYER_NOT_FOUND, input -> "Player not found!") + .message(LiteMessages.MISSING_PERMISSIONS, + input -> "You don't have permission to execute this command!") - .commands( - new ApiAfkCommand(provide.getAfkService()), - new ApiIgnoreCommand(provide.getIgnoreService()), - new ApiJailCommand(provide.getJailService()), - new ApiRandomTeleportCommand(provide.getRandomTeleportService()), - new ApiSpawnCommand(provide.getSpawnService()), - new ApiRandomTeleportCommand(provide.getRandomTeleportService()), - new ApiHomeCommand(provide.getHomeService()) - ) + .commands( + new ApiAfkCommand(provide.getAfkService()), + new ApiIgnoreCommand(provide.getIgnoreService()), + new ApiJailCommand(provide.getJailService()), + new ApiRandomTeleportCommand(provide.getRandomTeleportService()), + new ApiSpawnCommand(provide.getSpawnService()), + new ApiRandomTeleportCommand(provide.getRandomTeleportService()), + new ApiHomeCommand(provide.getHomeService())) - .build(); + .build(); Stream.of( - new ApiAfkListener(), - new CatBoyListener(provide.getCatboyService()), - new ApiRandomTeleportListener(provide.getRandomTeleportService()), - new ApiPrivateChatListener(server), - new ApiRandomTeleportListener(provide.getRandomTeleportService()), - new ApiHomeListener(server), - new ApiJailListener(server), - new ApiIgnoreListener() - ).forEach(listener -> server.getPluginManager().registerEvents(listener, this)); + new ApiAfkListener(), + new CatBoyListener(provide.getCatboyService()), + new ApiRandomTeleportListener(provide.getRandomTeleportService()), + new ApiPrivateChatListener(server), + new ApiRandomTeleportListener(provide.getRandomTeleportService()), + new ApiHomeListener(server), + new ApiJailListener(server), + new ApiIgnoreListener(), + new ApiTeleportRequestListener()) + .forEach(listener -> server.getPluginManager().registerEvents(listener, this)); } @Override diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/PreTeleportRequestEvent.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/PreTeleportRequestEvent.java new file mode 100644 index 000000000..35143601f --- /dev/null +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/PreTeleportRequestEvent.java @@ -0,0 +1,53 @@ +package com.eternalcode.core.feature.teleportrequest; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Called before a teleport request is sent (via /tpa or /tpahere). + * If cancelled, the teleport request will not be created. + */ +public class PreTeleportRequestEvent extends Event implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final Player sender; + private final Player target; + private boolean cancelled; + + public PreTeleportRequestEvent(Player sender, Player target) { + super(false); + + this.sender = sender; + this.target = target; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + public Player getSender() { + return this.sender; + } + + public Player getTarget() { + return this.target; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } +} diff --git a/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestEvent.java b/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestEvent.java new file mode 100644 index 000000000..f5d1388d1 --- /dev/null +++ b/eternalcore-api/src/main/java/com/eternalcode/core/feature/teleportrequest/TeleportRequestEvent.java @@ -0,0 +1,42 @@ +package com.eternalcode.core.feature.teleportrequest; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Called after a teleport request has been successfully created (via /tpa or + * /tpahere). + * This event is informational and cannot be cancelled. + */ +public class TeleportRequestEvent extends Event { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final Player sender; + private final Player target; + + public TeleportRequestEvent(Player sender, Player target) { + super(false); + + this.sender = sender; + this.target = target; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + public Player getSender() { + return this.sender; + } + + public Player getTarget() { + return this.target; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } +} diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java index 13cc6730c..5a7fffe28 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java @@ -1,6 +1,7 @@ package com.eternalcode.core.feature.teleportrequest; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.core.event.EventCaller; import com.eternalcode.core.feature.ignore.IgnoreService; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; @@ -19,12 +20,19 @@ class TpaCommand { private final TeleportRequestService requestService; private final IgnoreService ignoreService; private final NoticeService noticeService; + private final EventCaller eventCaller; @Inject - TpaCommand(TeleportRequestService requestService, IgnoreService ignoreService, NoticeService noticeService) { + TpaCommand( + TeleportRequestService requestService, + IgnoreService ignoreService, + NoticeService noticeService, + EventCaller eventCaller + ) { this.requestService = requestService; this.ignoreService = ignoreService; this.noticeService = noticeService; + this.eventCaller = eventCaller; } @Execute @@ -42,6 +50,12 @@ void execute(@Sender Player player, @Arg Player target) { return; } + PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(player, target)); + + if (preEvent.isCancelled()) { + return; + } + this.noticeService .create() .player(player.getUniqueId()) @@ -67,6 +81,7 @@ void execute(@Sender Player player, @Arg Player target) { .send(); this.requestService.createRequest(player.getUniqueId(), target.getUniqueId()); + this.eventCaller.callEvent(new TeleportRequestEvent(player, target)); }); } diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java index 357f5a00b..eff4a1c6e 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java @@ -1,7 +1,10 @@ package com.eternalcode.core.feature.teleportrequest.self; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.core.event.EventCaller; import com.eternalcode.core.feature.ignore.IgnoreService; +import com.eternalcode.core.feature.teleportrequest.PreTeleportRequestEvent; +import com.eternalcode.core.feature.teleportrequest.TeleportRequestEvent; import com.eternalcode.core.injector.annotations.Inject; import com.eternalcode.core.notice.NoticeService; import dev.rollczi.litecommands.annotations.argument.Arg; @@ -9,9 +12,8 @@ import dev.rollczi.litecommands.annotations.context.Sender; import dev.rollczi.litecommands.annotations.execute.Execute; import dev.rollczi.litecommands.annotations.permission.Permission; -import org.bukkit.entity.Player; - import java.util.concurrent.CompletableFuture; +import org.bukkit.entity.Player; @Command(name = "tpahere") @Permission("eternalcore.tpahere") @@ -20,19 +22,26 @@ class TpaHereCommand { private final TeleportHereRequestService requestService; private final IgnoreService ignoreService; private final NoticeService noticeService; + private final EventCaller eventCaller; @Inject - TpaHereCommand(TeleportHereRequestService requestService, IgnoreService ignoreService, NoticeService noticeService) { + TpaHereCommand( + TeleportHereRequestService requestService, + IgnoreService ignoreService, + NoticeService noticeService, + EventCaller eventCaller + ) { this.requestService = requestService; this.ignoreService = ignoreService; this.noticeService = noticeService; + this.eventCaller = eventCaller; } @Execute @DescriptionDocs(description = "Send teleport request to player to teleport to you", arguments = "") void execute(@Sender Player sender, @Arg Player target) { if (sender.equals(target)) { - this.noticeService.player(sender.getUniqueId() , translation -> translation.tpa().tpaSelfMessage()); + this.noticeService.player(sender.getUniqueId(), translation -> translation.tpa().tpaSelfMessage()); return; } @@ -43,34 +52,41 @@ void execute(@Sender Player sender, @Arg Player target) { return; } + PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(sender, target)); + + if (preEvent.isCancelled()) { + return; + } + this.isIgnoring(target, sender).thenAccept(isIgnoring -> { - if (isIgnoring) { - this.noticeService.create() - .player(sender.getUniqueId()) - .notice(translation -> translation.tpa().tpaTargetIgnoresYou()) - .placeholder("{PLAYER}", target.getName()) - .send(); - return; - } - - this.noticeService - .create() - .player(sender.getUniqueId()) - .notice(translation -> translation.tpa().tpaHereSent()) - .placeholder("{PLAYER}", target.getName()) - .send(); - - this.noticeService.create() + if (isIgnoring) { + this.noticeService.create() + .player(sender.getUniqueId()) + .notice(translation -> translation.tpa().tpaTargetIgnoresYou()) + .placeholder("{PLAYER}", target.getName()) + .send(); + return; + } + + this.noticeService + .create() + .player(sender.getUniqueId()) + .notice(translation -> translation.tpa().tpaHereSent()) + .placeholder("{PLAYER}", target.getName()) + .send(); + + this.noticeService.create() .player(target.getUniqueId()) .notice(translation -> translation.tpa().tpaHereReceived()) .placeholder("{PLAYER}", sender.getName()) .send(); - this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId()); + this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId()); + this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)); }); } - @Execute(name = "-all", aliases = { "*" }) + @Execute(name = "-all", aliases = {"*"}) @Permission("eternalcore.tpahere.all") @DescriptionDocs(description = "Send teleport request to all online players to teleport to you") void executeAll(@Sender Player sender) { @@ -83,6 +99,12 @@ void executeAll(@Sender Player sender) { continue; } + PreTeleportRequestEvent preEvent = this.eventCaller.callEvent(new PreTeleportRequestEvent(sender, target)); + + if (preEvent.isCancelled()) { + continue; + } + this.isIgnoring(target, sender).thenAccept(isIgnoring -> { if (isIgnoring) { return; @@ -95,7 +117,7 @@ void executeAll(@Sender Player sender) { .send(); this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId()); - + this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)); }); } @@ -105,8 +127,6 @@ void executeAll(@Sender Player sender) { .send(); } - - private CompletableFuture isIgnoring(Player target, Player sender) { return this.ignoreService.isIgnored(target.getUniqueId(), sender.getUniqueId()); } From 8e7cacdd813d3891b06a6ea60ad3bc7e71f31f85 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Mon, 9 Feb 2026 22:21:24 +0100 Subject: [PATCH 2/6] Add api example. --- .../ApiTeleportRequestListener.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java new file mode 100644 index 000000000..8cad30063 --- /dev/null +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java @@ -0,0 +1,41 @@ +package com.eternalcode.example.feature.teleportrequest; + +import com.eternalcode.core.feature.teleportrequest.PreTeleportRequestEvent; +import com.eternalcode.core.feature.teleportrequest.TeleportRequestEvent; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ApiTeleportRequestListener implements Listener { + + @EventHandler + public void onPreTeleportRequest(final PreTeleportRequestEvent event) { + final Player sender = event.getSender(); + final Player target = event.getTarget(); + + sender.sendMessage(String.format( + "PreTeleportRequestEvent: %s wants to teleport to %s (EternalCore API).", + sender.getName(), + target.getName() + )); + + /* + if (!countryService.areInSameCountry(sender, target)) { + sender.sendMessage("You are not in the same country!"); + event.setCancelled(true); + } + */ + } + + @EventHandler + public void onTeleportRequest(final TeleportRequestEvent event) { + final Player sender = event.getSender(); + final Player target = event.getTarget(); + + sender.sendMessage(String.format( + "TeleportRequestEvent: %s sent a teleport request to %s (EternalCore API).", + sender.getName(), + target.getName() + )); + } +} From 8433c4e0afa262eda027c08fd454966055b365cc Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 21 Feb 2026 12:01:42 +0100 Subject: [PATCH 3/6] code formatting --- .../example/EternalCoreApiExamplePlugin.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java index 93a1bc36d..87d16888c 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java @@ -39,21 +39,21 @@ public void onEnable() { EternalCoreApi provide = EternalCoreApiProvider.provide(); this.liteCommands = LiteBukkitFactory.builder(FALLBACK_PREFIX, this, server) - .message(LiteBukkitMessages.PLAYER_ONLY, input -> "You must be a player to execute this command!") - .message(LiteBukkitMessages.PLAYER_NOT_FOUND, input -> "Player not found!") - .message(LiteMessages.MISSING_PERMISSIONS, - input -> "You don't have permission to execute this command!") + .message(LiteBukkitMessages.PLAYER_ONLY, input -> "You must be a player to execute this command!") + .message(LiteBukkitMessages.PLAYER_NOT_FOUND, input -> "Player not found!") + .message(LiteMessages.MISSING_PERMISSIONS, + input -> "You don't have permission to execute this command!") - .commands( - new ApiAfkCommand(provide.getAfkService()), - new ApiIgnoreCommand(provide.getIgnoreService()), - new ApiJailCommand(provide.getJailService()), - new ApiRandomTeleportCommand(provide.getRandomTeleportService()), - new ApiSpawnCommand(provide.getSpawnService()), - new ApiRandomTeleportCommand(provide.getRandomTeleportService()), - new ApiHomeCommand(provide.getHomeService())) + .commands( + new ApiAfkCommand(provide.getAfkService()), + new ApiIgnoreCommand(provide.getIgnoreService()), + new ApiJailCommand(provide.getJailService()), + new ApiRandomTeleportCommand(provide.getRandomTeleportService()), + new ApiSpawnCommand(provide.getSpawnService()), + new ApiRandomTeleportCommand(provide.getRandomTeleportService()), + new ApiHomeCommand(provide.getHomeService())) - .build(); + .build(); Stream.of( new ApiAfkListener(), @@ -65,7 +65,7 @@ public void onEnable() { new ApiJailListener(server), new ApiIgnoreListener(), new ApiTeleportRequestListener()) - .forEach(listener -> server.getPluginManager().registerEvents(listener, this)); + .forEach(listener -> server.getPluginManager().registerEvents(listener, this)); } @Override From 60f0b2c2ab166857e239ceafdfd3d9151401caf2 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 21 Feb 2026 12:03:26 +0100 Subject: [PATCH 4/6] code formatting --- .../example/EternalCoreApiExamplePlugin.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java index 87d16888c..6dd9dc0d6 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java @@ -41,8 +41,7 @@ public void onEnable() { this.liteCommands = LiteBukkitFactory.builder(FALLBACK_PREFIX, this, server) .message(LiteBukkitMessages.PLAYER_ONLY, input -> "You must be a player to execute this command!") .message(LiteBukkitMessages.PLAYER_NOT_FOUND, input -> "Player not found!") - .message(LiteMessages.MISSING_PERMISSIONS, - input -> "You don't have permission to execute this command!") + .message(LiteMessages.MISSING_PERMISSIONS, input -> "You don't have permission to execute this command!") .commands( new ApiAfkCommand(provide.getAfkService()), @@ -51,21 +50,22 @@ public void onEnable() { new ApiRandomTeleportCommand(provide.getRandomTeleportService()), new ApiSpawnCommand(provide.getSpawnService()), new ApiRandomTeleportCommand(provide.getRandomTeleportService()), - new ApiHomeCommand(provide.getHomeService())) + new ApiHomeCommand(provide.getHomeService()) + ) .build(); Stream.of( - new ApiAfkListener(), - new CatBoyListener(provide.getCatboyService()), - new ApiRandomTeleportListener(provide.getRandomTeleportService()), - new ApiPrivateChatListener(server), - new ApiRandomTeleportListener(provide.getRandomTeleportService()), - new ApiHomeListener(server), - new ApiJailListener(server), - new ApiIgnoreListener(), - new ApiTeleportRequestListener()) - .forEach(listener -> server.getPluginManager().registerEvents(listener, this)); + new ApiAfkListener(), + new CatBoyListener(provide.getCatboyService()), + new ApiRandomTeleportListener(provide.getRandomTeleportService()), + new ApiPrivateChatListener(server), + new ApiRandomTeleportListener(provide.getRandomTeleportService()), + new ApiHomeListener(server), + new ApiJailListener(server), + new ApiIgnoreListener(), + new ApiTeleportRequestListener() + ).forEach(listener -> server.getPluginManager().registerEvents(listener, this)); } @Override From a63084d021a3991a5a4f4b26495943fcf534bb1f Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 27 Feb 2026 20:12:29 +0100 Subject: [PATCH 5/6] Follow review. --- .../example/EternalCoreApiExamplePlugin.java | 2 - .../ApiTeleportRequestListener.java | 8 +- .../feature/teleportrequest/TpaCommand.java | 11 +- .../teleportrequest/self/TpaHereCommand.java | 15 ++- .../configurator/CommandConfigurator.java | 100 ++++++++++++++++-- 5 files changed, 115 insertions(+), 21 deletions(-) diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java index 6dd9dc0d6..3561cbc84 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/EternalCoreApiExamplePlugin.java @@ -49,7 +49,6 @@ public void onEnable() { new ApiJailCommand(provide.getJailService()), new ApiRandomTeleportCommand(provide.getRandomTeleportService()), new ApiSpawnCommand(provide.getSpawnService()), - new ApiRandomTeleportCommand(provide.getRandomTeleportService()), new ApiHomeCommand(provide.getHomeService()) ) @@ -60,7 +59,6 @@ public void onEnable() { new CatBoyListener(provide.getCatboyService()), new ApiRandomTeleportListener(provide.getRandomTeleportService()), new ApiPrivateChatListener(server), - new ApiRandomTeleportListener(provide.getRandomTeleportService()), new ApiHomeListener(server), new ApiJailListener(server), new ApiIgnoreListener(), diff --git a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java index 8cad30063..5208db25c 100644 --- a/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java +++ b/eternalcore-api-example/src/main/java/com/eternalcode/example/feature/teleportrequest/ApiTeleportRequestListener.java @@ -10,8 +10,8 @@ public class ApiTeleportRequestListener implements Listener { @EventHandler public void onPreTeleportRequest(final PreTeleportRequestEvent event) { - final Player sender = event.getSender(); - final Player target = event.getTarget(); + Player sender = event.getSender(); + Player target = event.getTarget(); sender.sendMessage(String.format( "PreTeleportRequestEvent: %s wants to teleport to %s (EternalCore API).", @@ -29,8 +29,8 @@ public void onPreTeleportRequest(final PreTeleportRequestEvent event) { @EventHandler public void onTeleportRequest(final TeleportRequestEvent event) { - final Player sender = event.getSender(); - final Player target = event.getTarget(); + Player sender = event.getSender(); + Player target = event.getTarget(); sender.sendMessage(String.format( "TeleportRequestEvent: %s sent a teleport request to %s (EternalCore API).", diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java index 5a7fffe28..c71eef67a 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/TpaCommand.java @@ -1,6 +1,8 @@ package com.eternalcode.core.feature.teleportrequest; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; +import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.core.event.EventCaller; import com.eternalcode.core.feature.ignore.IgnoreService; import com.eternalcode.core.injector.annotations.Inject; @@ -21,18 +23,21 @@ class TpaCommand { private final IgnoreService ignoreService; private final NoticeService noticeService; private final EventCaller eventCaller; + private final MinecraftScheduler scheduler; @Inject TpaCommand( TeleportRequestService requestService, IgnoreService ignoreService, NoticeService noticeService, - EventCaller eventCaller + EventCaller eventCaller, + MinecraftScheduler scheduler ) { this.requestService = requestService; this.ignoreService = ignoreService; this.noticeService = noticeService; this.eventCaller = eventCaller; + this.scheduler = scheduler; } @Execute @@ -81,8 +86,8 @@ void execute(@Sender Player player, @Arg Player target) { .send(); this.requestService.createRequest(player.getUniqueId(), target.getUniqueId()); - this.eventCaller.callEvent(new TeleportRequestEvent(player, target)); - }); + this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(player, target))); + }).exceptionally(FutureHandler::handleException); } CompletableFuture isIgnoring(Player target, Player sender) { diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java index eff4a1c6e..3394646c2 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java @@ -1,6 +1,8 @@ package com.eternalcode.core.feature.teleportrequest.self; import com.eternalcode.annotations.scan.command.DescriptionDocs; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; +import com.eternalcode.commons.concurrent.FutureHandler; import com.eternalcode.core.event.EventCaller; import com.eternalcode.core.feature.ignore.IgnoreService; import com.eternalcode.core.feature.teleportrequest.PreTeleportRequestEvent; @@ -23,18 +25,21 @@ class TpaHereCommand { private final IgnoreService ignoreService; private final NoticeService noticeService; private final EventCaller eventCaller; + private final MinecraftScheduler scheduler; @Inject TpaHereCommand( TeleportHereRequestService requestService, IgnoreService ignoreService, NoticeService noticeService, - EventCaller eventCaller + EventCaller eventCaller, + MinecraftScheduler scheduler ) { this.requestService = requestService; this.ignoreService = ignoreService; this.noticeService = noticeService; this.eventCaller = eventCaller; + this.scheduler = scheduler; } @Execute @@ -82,8 +87,8 @@ void execute(@Sender Player sender, @Arg Player target) { .send(); this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId()); - this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)); - }); + this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(sender, target))); + }).exceptionally(FutureHandler::handleException); } @Execute(name = "-all", aliases = {"*"}) @@ -117,8 +122,8 @@ void executeAll(@Sender Player sender) { .send(); this.requestService.createRequest(sender.getUniqueId(), target.getUniqueId()); - this.eventCaller.callEvent(new TeleportRequestEvent(sender, target)); - }); + this.scheduler.run(() -> this.eventCaller.callEvent(new TeleportRequestEvent(sender, target))); + }).exceptionally(FutureHandler::handleException); } this.noticeService.create() diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java index 8796e7a55..c4bf58e88 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java @@ -1,6 +1,7 @@ package com.eternalcode.core.litecommand.configurator; +import com.eternalcode.core.configuration.ConfigurationManager; import com.eternalcode.core.litecommand.configurator.config.Command; import com.eternalcode.core.litecommand.configurator.config.CommandConfiguration; import com.eternalcode.core.litecommand.configurator.config.SubCommand; @@ -10,7 +11,12 @@ import dev.rollczi.litecommands.editor.Editor; import dev.rollczi.litecommands.meta.Meta; import dev.rollczi.litecommands.permission.PermissionSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.function.UnaryOperator; import org.bukkit.command.CommandSender; @@ -18,37 +24,117 @@ class CommandConfigurator implements Editor { private final CommandConfiguration commandConfiguration; + private final ConfigurationManager configurationManager; @Inject - CommandConfigurator(CommandConfiguration commandConfiguration) { + CommandConfigurator(CommandConfiguration commandConfiguration, ConfigurationManager configurationManager) { this.commandConfiguration = commandConfiguration; + this.configurationManager = configurationManager; } @Override public CommandBuilder edit(CommandBuilder context) { + boolean changed = this.synchronizeDefaults(context); + if (changed) { + this.configurationManager.save(this.commandConfiguration); + } + Command command = this.commandConfiguration.commands.get(context.name()); if (command == null) { return context; } - for (String child : command.subCommands().keySet()) { - SubCommand subCommand = command.subCommands().get(child); + for (Map.Entry childEntry : command.subCommands().entrySet()) { + String child = childEntry.getKey(); + SubCommand subCommand = childEntry.getValue(); + + if (context.getChild(child).isEmpty()) { + continue; + } context = context.editChild(child, editor -> editor.name(subCommand.name()) - .aliases(subCommand.aliases()) - .applyMeta(editPermissions(command.permissions())) + .aliases(safeList(subCommand.aliases())) + .applyMeta(editPermissions(safeList(subCommand.permissions()))) .enabled(subCommand.isEnabled()) ); } return context .name(command.name()) - .aliases(command.aliases()) - .applyMeta(editPermissions(command.permissions())) + .aliases(safeList(command.aliases())) + .applyMeta(editPermissions(safeList(command.permissions()))) .enabled(command.isEnabled()); } + private boolean synchronizeDefaults(CommandBuilder context) { + this.commandConfiguration.commands = mutableMap(this.commandConfiguration.commands); + + Command current = this.commandConfiguration.commands.get(context.name()); + boolean changed = false; + + if (current == null) { + current = new Command( + context.name(), + new ArrayList<>(context.aliases()), + extractPermissions(context.meta()), + context.isEnabled() + ); + current.subCommands = new LinkedHashMap<>(); + + this.commandConfiguration.commands.put(context.name(), current); + changed = true; + } + + current.subCommands = mutableMap(current.subCommands); + + for (CommandBuilder child : context.children()) { + if (current.subCommands.containsKey(child.name())) { + continue; + } + + current.subCommands.put( + child.name(), + new SubCommand( + child.name(), + child.isEnabled(), + new ArrayList<>(child.aliases()), + extractPermissions(child.meta()) + ) + ); + changed = true; + } + + return changed; + } + + private static List extractPermissions(Meta meta) { + Collection permissionSets = meta.get(Meta.PERMISSIONS); + LinkedHashSet permissions = new LinkedHashSet<>(); + + for (PermissionSet permissionSet : permissionSets) { + permissions.addAll(permissionSet.getPermissions()); + } + + return new ArrayList<>(permissions); + } + + private static Map mutableMap(Map map) { + if (map == null) { + return new LinkedHashMap<>(); + } + + return new LinkedHashMap<>(map); + } + + private static List safeList(List value) { + if (value == null) { + return List.of(); + } + + return value; + } + private static UnaryOperator editPermissions(List permissions) { return meta -> meta.listEditor(Meta.PERMISSIONS) .clear() From 17a85ba87cd0b39ac153bf8da52d2158579f82fc Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Fri, 27 Feb 2026 20:15:14 +0100 Subject: [PATCH 6/6] revert. --- .../configurator/CommandConfigurator.java | 100 ++---------------- 1 file changed, 7 insertions(+), 93 deletions(-) diff --git a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java index c4bf58e88..8796e7a55 100644 --- a/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java +++ b/eternalcore-core/src/main/java/com/eternalcode/core/litecommand/configurator/CommandConfigurator.java @@ -1,7 +1,6 @@ package com.eternalcode.core.litecommand.configurator; -import com.eternalcode.core.configuration.ConfigurationManager; import com.eternalcode.core.litecommand.configurator.config.Command; import com.eternalcode.core.litecommand.configurator.config.CommandConfiguration; import com.eternalcode.core.litecommand.configurator.config.SubCommand; @@ -11,12 +10,7 @@ import dev.rollczi.litecommands.editor.Editor; import dev.rollczi.litecommands.meta.Meta; import dev.rollczi.litecommands.permission.PermissionSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Map; import java.util.function.UnaryOperator; import org.bukkit.command.CommandSender; @@ -24,117 +18,37 @@ class CommandConfigurator implements Editor { private final CommandConfiguration commandConfiguration; - private final ConfigurationManager configurationManager; @Inject - CommandConfigurator(CommandConfiguration commandConfiguration, ConfigurationManager configurationManager) { + CommandConfigurator(CommandConfiguration commandConfiguration) { this.commandConfiguration = commandConfiguration; - this.configurationManager = configurationManager; } @Override public CommandBuilder edit(CommandBuilder context) { - boolean changed = this.synchronizeDefaults(context); - if (changed) { - this.configurationManager.save(this.commandConfiguration); - } - Command command = this.commandConfiguration.commands.get(context.name()); if (command == null) { return context; } - for (Map.Entry childEntry : command.subCommands().entrySet()) { - String child = childEntry.getKey(); - SubCommand subCommand = childEntry.getValue(); - - if (context.getChild(child).isEmpty()) { - continue; - } + for (String child : command.subCommands().keySet()) { + SubCommand subCommand = command.subCommands().get(child); context = context.editChild(child, editor -> editor.name(subCommand.name()) - .aliases(safeList(subCommand.aliases())) - .applyMeta(editPermissions(safeList(subCommand.permissions()))) + .aliases(subCommand.aliases()) + .applyMeta(editPermissions(command.permissions())) .enabled(subCommand.isEnabled()) ); } return context .name(command.name()) - .aliases(safeList(command.aliases())) - .applyMeta(editPermissions(safeList(command.permissions()))) + .aliases(command.aliases()) + .applyMeta(editPermissions(command.permissions())) .enabled(command.isEnabled()); } - private boolean synchronizeDefaults(CommandBuilder context) { - this.commandConfiguration.commands = mutableMap(this.commandConfiguration.commands); - - Command current = this.commandConfiguration.commands.get(context.name()); - boolean changed = false; - - if (current == null) { - current = new Command( - context.name(), - new ArrayList<>(context.aliases()), - extractPermissions(context.meta()), - context.isEnabled() - ); - current.subCommands = new LinkedHashMap<>(); - - this.commandConfiguration.commands.put(context.name(), current); - changed = true; - } - - current.subCommands = mutableMap(current.subCommands); - - for (CommandBuilder child : context.children()) { - if (current.subCommands.containsKey(child.name())) { - continue; - } - - current.subCommands.put( - child.name(), - new SubCommand( - child.name(), - child.isEnabled(), - new ArrayList<>(child.aliases()), - extractPermissions(child.meta()) - ) - ); - changed = true; - } - - return changed; - } - - private static List extractPermissions(Meta meta) { - Collection permissionSets = meta.get(Meta.PERMISSIONS); - LinkedHashSet permissions = new LinkedHashSet<>(); - - for (PermissionSet permissionSet : permissionSets) { - permissions.addAll(permissionSet.getPermissions()); - } - - return new ArrayList<>(permissions); - } - - private static Map mutableMap(Map map) { - if (map == null) { - return new LinkedHashMap<>(); - } - - return new LinkedHashMap<>(map); - } - - private static List safeList(List value) { - if (value == null) { - return List.of(); - } - - return value; - } - private static UnaryOperator editPermissions(List permissions) { return meta -> meta.listEditor(Meta.PERMISSIONS) .clear()