Skip to content

Commit df16173

Browse files
Jakubk15coderabbitai[bot]Rollczi
authored
GH-926 Add teleport timer to TeleportBackCommand, add teleport-here functionality. (#926)
* Add teleport timer to TeleportBackCommand, add self-teleport request functionality * Add LuckPerms to runServer task for testing purposes * Add missing permissions, change translations to reflect Mike's suggestions * Move permissions to constants class * Use class instead of interface * remove unnecessary new lines, inline fields, change access * Update eternalcore-core/src/main/java/com/eternalcode/core/feature/teleportrequest/self/TpaHereCommand.java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Download luckperms from modrinth on startup, fix wrong message being sent on command execution * Remove "Message" suffix --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Rollczi <[email protected]>
1 parent 127fdcf commit df16173

File tree

10 files changed

+358
-6
lines changed

10 files changed

+358
-6
lines changed

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ object Versions {
3636

3737
const val XSERIES = "13.3.3"
3838

39+
const val LUCKPERMS = "5.5.0"
40+
3941
const val BSTATS = "3.1.0"
4042

4143
const val CAFFEINE = "3.2.2"

eternalcore-core/src/main/java/com/eternalcode/core/feature/teleport/command/TeleportBackCommand.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package com.eternalcode.core.feature.teleport.command;
22

33
import com.eternalcode.annotations.scan.command.DescriptionDocs;
4+
import com.eternalcode.commons.bukkit.position.PositionAdapter;
5+
import com.eternalcode.core.feature.teleport.TeleportService;
6+
import com.eternalcode.core.feature.teleport.TeleportTaskService;
7+
import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings;
48
import com.eternalcode.core.injector.annotations.Inject;
59
import com.eternalcode.core.notice.NoticeService;
6-
import com.eternalcode.core.feature.teleport.TeleportService;
710
import com.eternalcode.core.viewer.Viewer;
811
import dev.rollczi.litecommands.annotations.argument.Arg;
12+
import dev.rollczi.litecommands.annotations.command.Command;
913
import dev.rollczi.litecommands.annotations.context.Context;
1014
import dev.rollczi.litecommands.annotations.execute.Execute;
1115
import dev.rollczi.litecommands.annotations.permission.Permission;
12-
import dev.rollczi.litecommands.annotations.command.Command;
1316
import org.bukkit.Location;
1417
import org.bukkit.entity.Player;
1518

@@ -19,11 +22,15 @@
1922
class TeleportBackCommand {
2023

2124
private final TeleportService teleportService;
25+
private final TeleportTaskService teleportTaskService;
26+
private final TeleportRequestSettings settings;
2227
private final NoticeService noticeService;
2328

2429
@Inject
25-
TeleportBackCommand(TeleportService teleportService, NoticeService noticeService) {
30+
TeleportBackCommand(TeleportService teleportService, TeleportTaskService teleportTaskService, TeleportRequestSettings settings, NoticeService noticeService) {
2631
this.teleportService = teleportService;
32+
this.teleportTaskService = teleportTaskService;
33+
this.settings = settings;
2734
this.noticeService = noticeService;
2835
}
2936

@@ -39,7 +46,12 @@ void execute(@Context Player player) {
3946
return;
4047
}
4148

42-
this.teleportService.teleport(player, location.get());
49+
if (player.hasPermission("eternalcore.teleport.bypass")) {
50+
this.teleportService.teleport(player, location.get());
51+
} else {
52+
this.teleportTaskService.createTeleport(player.getUniqueId(), PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(location.get()), this.settings.teleportTime());
53+
}
54+
4355
this.noticeService.player(player.getUniqueId(), translation -> translation.teleport().teleportedToLastLocation());
4456
}
4557

@@ -55,7 +67,11 @@ void execute(@Context Viewer viewer, @Arg Player player) {
5567
return;
5668
}
5769

58-
this.teleportService.teleport(player, location.get());
70+
if (player.hasPermission("eternalcore.teleport.bypass")){
71+
this.teleportService.teleport(player, location.get());
72+
} else {
73+
this.teleportTaskService.createTeleport(player.getUniqueId(), PositionAdapter.convert(player.getLocation()), PositionAdapter.convert(location.get()), this.settings.teleportTime());
74+
}
5975

6076
this.noticeService.player(player.getUniqueId(), translation -> translation.teleport().teleportedToLastLocation());
6177

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,16 @@ public class ENTeleportRequestMessages extends OkaeriConfig implements TeleportR
1313
public Notice tpaAlreadySentMessage =
1414
Notice.chat("<red>✘ <dark_red>You have already sent a teleportation request!");
1515
public Notice tpaSentMessage =
16-
Notice.chat("<green>► <white>You have sent a request for teleportation to a player: <green>{PLAYER}<white>!");
16+
Notice.chat("<green>► <white>You have sent a request for player <green>{PLAYER}<white>{PLAYER} to teleport to you!");
17+
18+
public Notice tpaHereSent = Notice.chat("<green>► <white>You have sent a request for teleportation to you for a player: <green>{PLAYER}<white>!");
19+
public Notice tpaHereReceived = Notice.builder()
20+
.chat("<green>► <white>You have received a request for teleportation TO a player: <gray>{PLAYER}<green>!")
21+
.chat(
22+
"<hover:show_text:'<green>Teleport to the player?</green>'><gold><click:suggest_command:'/tpahereaccept {PLAYER}'><dark_gray>» <gold>/tpahereaccept {PLAYER} <green>to accept! <gray>(Click)</gray></click></gold></hover>")
23+
.chat(
24+
"<hover:show_text:'<red>Decline a teleportation request?</red>'><gold><click:suggest_command:'/tpaheredeny {PLAYER}'><dark_gray>» <gold>/tpaheredeny {PLAYER} <red><green>to deny! <gray>(Click)</gray></click></gold></hover>")
25+
.build();
1726

1827
@Comment({
1928
" ",

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ public class PLTeleportRequestMessages extends OkaeriConfig implements TeleportR
1515
public Notice tpaSentMessage =
1616
Notice.chat("<green>► <white>Wysłałeś prośbę o teleportację do gracza: <green>{PLAYER}<white>!");
1717

18+
public Notice tpaHereSent = Notice.chat("<green>► <white>Wysłałeś prośbę o teleportację gracza <green>{PLAYER}<white> do twojej lokalizacji!");
19+
public Notice tpaHereReceived = Notice.builder()
20+
.chat("<green>► <white>Otrzymałeś prośbę o teleportację do gracza: <green>{PLAYER}<white>!")
21+
.chat(
22+
"<hover:show_text:'<green>Teleportować się do gracza?</green>'><gold><click:suggest_command:'/tpahereaccept {PLAYER}'><dark_gray>» <gold>/tpahereaccept {PLAYER} <green>by ją zaakceptować! <gray>(Kliknij)</gray></click></gold></hover>")
23+
.chat(
24+
"<hover:show_text:'<red>Odrzucić prośbę o teleportacje?</red>'><gold><click:suggest_command:'/tpaheredeny {PLAYER}'><dark_gray>» <gold>/tpaheredeny {PLAYER} <red>by ją odrzucić! <gray>(Kliknij)</gray></click></gold></hover>")
25+
.build();
26+
1827
@Comment({
1928
" ",
2029
"# W tych wiadomościach użyliśmy formatowania MiniMessages",

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ public interface TeleportRequestMessages {
99
Notice tpaReceivedMessage();
1010
Notice tpaTargetIgnoresYou();
1111

12+
Notice tpaHereSent();
13+
Notice tpaHereReceived();
14+
1215
Notice tpaDenyNoRequestMessage();
1316
Notice tpaDenyDoneMessage();
1417
Notice tpaDenyReceivedMessage();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.eternalcode.core.feature.teleportrequest.self;
2+
3+
import com.eternalcode.core.bridge.litecommand.argument.AbstractViewerArgument;
4+
import com.eternalcode.core.injector.annotations.Inject;
5+
import com.eternalcode.core.injector.annotations.lite.LiteArgument;
6+
import com.eternalcode.core.translation.Translation;
7+
import com.eternalcode.core.translation.TranslationManager;
8+
import dev.rollczi.litecommands.argument.Argument;
9+
import dev.rollczi.litecommands.argument.parser.ParseResult;
10+
import dev.rollczi.litecommands.invocation.Invocation;
11+
import dev.rollczi.litecommands.suggestion.SuggestionContext;
12+
import dev.rollczi.litecommands.suggestion.SuggestionResult;
13+
import org.bukkit.Server;
14+
import org.bukkit.command.CommandSender;
15+
import org.bukkit.entity.HumanEntity;
16+
import org.bukkit.entity.Player;
17+
18+
import java.util.Objects;
19+
20+
@LiteArgument(type = Player.class, name = SelfRequesterArgument.KEY)
21+
class SelfRequesterArgument extends AbstractViewerArgument<Player> {
22+
23+
static final String KEY = "selfrequester";
24+
25+
private final TeleportHereRequestService requestService;
26+
private final Server server;
27+
28+
@Inject
29+
SelfRequesterArgument(TeleportHereRequestService requestService, TranslationManager translationManager, Server server) {
30+
super(translationManager);
31+
this.requestService = requestService;
32+
this.server = server;
33+
}
34+
35+
@Override
36+
public ParseResult<Player> parse(Invocation<CommandSender> invocation, String argument, Translation translation) {
37+
Player target = this.server.getPlayer(argument);
38+
39+
if (!(invocation.sender() instanceof Player player)) {
40+
return ParseResult.failure(translation.argument().onlyPlayer());
41+
}
42+
43+
if (target == null || !this.requestService.hasRequest(target.getUniqueId(), player.getUniqueId())) {
44+
return ParseResult.failure(translation.tpa().tpaDenyNoRequestMessage());
45+
}
46+
47+
return ParseResult.success(target);
48+
}
49+
50+
@Override
51+
public SuggestionResult suggest(Invocation<CommandSender> invocation, Argument<Player> argument, SuggestionContext context) {
52+
if (!(invocation.sender() instanceof Player player)) {
53+
return SuggestionResult.empty();
54+
}
55+
56+
return this.requestService.findRequests(player.getUniqueId()).stream()
57+
.map(this.server::getPlayer)
58+
.filter(Objects::nonNull)
59+
.map(HumanEntity::getName)
60+
.collect(SuggestionResult.collector());
61+
}
62+
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.eternalcode.core.feature.teleportrequest.self;
2+
3+
import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings;
4+
import com.eternalcode.core.injector.annotations.Inject;
5+
import com.eternalcode.core.injector.annotations.component.Service;
6+
import com.google.common.cache.Cache;
7+
import com.google.common.cache.CacheBuilder;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.UUID;
13+
14+
@Service
15+
class TeleportHereRequestService {
16+
17+
private final Cache<UUID, UUID> requests;
18+
19+
@Inject
20+
TeleportHereRequestService(TeleportRequestSettings settings) {
21+
this.requests = CacheBuilder
22+
.newBuilder()
23+
.expireAfterWrite(settings.teleportExpire())
24+
.build();
25+
}
26+
27+
void createRequest(UUID requester, UUID target) {
28+
this.requests.put(requester, target);
29+
}
30+
31+
void removeRequest(UUID requester) {
32+
this.requests.asMap().remove(requester);
33+
}
34+
35+
boolean hasRequest(UUID requester, UUID target) {
36+
Map<UUID, UUID> map = this.requests.asMap();
37+
38+
for (Map.Entry<UUID, UUID> entry : map.entrySet()) {
39+
if (entry.getKey().equals(requester) && entry.getValue().equals(target)) {
40+
return true;
41+
}
42+
}
43+
44+
return false;
45+
}
46+
47+
List<UUID> findRequests(UUID target) {
48+
Map<UUID, UUID> map = this.requests.asMap();
49+
50+
List<UUID> requesters = new ArrayList<>();
51+
52+
for (Map.Entry<UUID, UUID> entry : map.entrySet()) {
53+
if (entry.getValue().equals(target)) {
54+
requesters.add(entry.getKey());
55+
}
56+
}
57+
58+
return requesters;
59+
}
60+
61+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package com.eternalcode.core.feature.teleportrequest.self;
2+
3+
import com.eternalcode.annotations.scan.command.DescriptionDocs;
4+
import com.eternalcode.commons.bukkit.position.PositionAdapter;
5+
import com.eternalcode.core.feature.teleport.TeleportTaskService;
6+
import com.eternalcode.core.feature.teleportrequest.TeleportRequestSettings;
7+
import com.eternalcode.core.injector.annotations.Inject;
8+
import com.eternalcode.core.notice.NoticeService;
9+
import dev.rollczi.litecommands.annotations.argument.Arg;
10+
import dev.rollczi.litecommands.annotations.command.RootCommand;
11+
import dev.rollczi.litecommands.annotations.context.Context;
12+
import dev.rollczi.litecommands.annotations.execute.Execute;
13+
import dev.rollczi.litecommands.annotations.permission.Permission;
14+
import org.bukkit.Server;
15+
import org.bukkit.entity.Player;
16+
17+
import java.util.List;
18+
import java.util.UUID;
19+
20+
@RootCommand
21+
class TpaHereActionCommand {
22+
23+
private final TeleportHereRequestService requestService;
24+
private final TeleportTaskService teleportTaskService;
25+
private final TeleportRequestSettings settings;
26+
private final NoticeService noticeService;
27+
private final Server server;
28+
29+
@Inject
30+
TpaHereActionCommand(TeleportHereRequestService requestService, TeleportTaskService teleportTaskService, TeleportRequestSettings settings, NoticeService noticeService, Server server) {
31+
this.requestService = requestService;
32+
this.teleportTaskService = teleportTaskService;
33+
this.settings = settings;
34+
this.noticeService = noticeService;
35+
this.server = server;
36+
}
37+
38+
@Execute(name = "tpahereaccept")
39+
@Permission("eternalcore.tpaccept")
40+
void accept(@Context Player player, @Arg(SelfRequesterArgument.KEY) Player target) {
41+
this.teleportTaskService.createTeleport(
42+
player.getUniqueId(),
43+
PositionAdapter.convert(player.getLocation()),
44+
PositionAdapter.convert(target.getLocation()),
45+
this.settings.teleportTime()
46+
);
47+
48+
this.requestService.removeRequest(target.getUniqueId());
49+
50+
this.noticeService
51+
.create()
52+
.player(player.getUniqueId())
53+
.notice(translation -> translation.tpa().tpaAcceptMessage())
54+
.placeholder("{PLAYER}", target.getName())
55+
.send();
56+
57+
this.noticeService
58+
.create()
59+
.player(target.getUniqueId())
60+
.notice(translation -> translation.tpa().tpaAcceptReceivedMessage())
61+
.placeholder("{PLAYER}", player.getName())
62+
.send();
63+
}
64+
65+
@Execute(name = "tpaheredeny")
66+
@Permission("eternalcore.tpahere.deny")
67+
@DescriptionDocs(description = "Deny a teleport here request")
68+
void executeTarget(@Context Player player, @Arg(SelfRequesterArgument.KEY) Player target) {
69+
this.requestService.removeRequest(target.getUniqueId());
70+
71+
this.noticeService
72+
.create()
73+
.player(player.getUniqueId())
74+
.notice(translation -> translation.tpa().tpaDenyDoneMessage())
75+
.placeholder("{PLAYER}", target.getName())
76+
.send();
77+
78+
this.noticeService
79+
.create()
80+
.player(target.getUniqueId())
81+
.notice(translation -> translation.tpa().tpaDenyReceivedMessage())
82+
.placeholder("{PLAYER}", player.getName())
83+
.send();
84+
}
85+
86+
@Execute(name = "tpaheredeny -all")
87+
@Permission("eternalcore.tpahere.deny")
88+
@DescriptionDocs(description = "Deny all teleport here requests")
89+
void executeAll(@Context Player player) {
90+
List<UUID> requests = this.requestService.findRequests(player.getUniqueId());
91+
92+
if (requests.isEmpty()) {
93+
this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaDenyNoRequestMessage());
94+
return;
95+
}
96+
97+
for (UUID uniqueId : requests) {
98+
Player requester = this.server.getPlayer(uniqueId);
99+
this.requestService.removeRequest(uniqueId);
100+
101+
if (requester != null) {
102+
this.noticeService
103+
.create()
104+
.player(uniqueId)
105+
.notice(translation -> translation.tpa().tpaDenyReceivedMessage())
106+
.placeholder("{PLAYER}", player.getName())
107+
.send();
108+
}
109+
}
110+
111+
this.noticeService.player(player.getUniqueId(), translation -> translation.tpa().tpaDenyAllDenied());
112+
}
113+
114+
}

0 commit comments

Comments
 (0)