|
|
@@ -11,17 +11,24 @@ import net.kyori.adventure.text.format.NamedTextColor;
|
|
|
import org.bukkit.Bukkit;
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.UUID;
|
|
|
+import java.util.*;
|
|
|
|
|
|
public class TradeRequestManager {
|
|
|
|
|
|
- private final Map<UUID, UUID> requests = new HashMap<>(); // Sender ; Target
|
|
|
+ private final Map<UUID, List<UUID>> requests = new HashMap<>(); // Sender ; Target
|
|
|
private final Map<UUID, Integer> timeoutTasks = new HashMap<>();
|
|
|
+ private final TradeManager tradeManager;
|
|
|
+
|
|
|
+ public TradeRequestManager(TradeModule tradeModule) {
|
|
|
+ this.tradeManager = tradeModule.getTradeManager();
|
|
|
+ }
|
|
|
|
|
|
public void sendRequest(Player sender, Player target) {
|
|
|
- if(isPending(sender, target)){
|
|
|
+ UUID targetUUID = target.getUniqueId();
|
|
|
+ UUID senderUUID = sender.getUniqueId();
|
|
|
+ requests.putIfAbsent(senderUUID, new ArrayList<>());
|
|
|
+ // If target already proposed a trade
|
|
|
+ if(isPending(targetUUID, senderUUID)){
|
|
|
|
|
|
Component targetmsg = Component.text(sender.getName())
|
|
|
.color(NamedTextColor.GREEN)
|
|
|
@@ -38,21 +45,18 @@ public class TradeRequestManager {
|
|
|
FluxService.get(TradeModule.class).sendText(sender, sendermsg);
|
|
|
FluxService.get(TradeModule.class).sendText(target, targetmsg);
|
|
|
|
|
|
- TradeModule.getTradeManager().startTrade(sender, target);
|
|
|
-
|
|
|
- accept(sender, target);
|
|
|
- accept(target, sender);
|
|
|
- }else{
|
|
|
- if(requests.get(target.getUniqueId()) != null) return;
|
|
|
+ tradeManager.startTrade(sender, target);
|
|
|
|
|
|
- requests.put(target.getUniqueId(), sender.getUniqueId());
|
|
|
+ accept(senderUUID, targetUUID);
|
|
|
+ }else if(!requests.get(senderUUID).contains(targetUUID)){
|
|
|
+ requests.get(senderUUID).add(targetUUID);
|
|
|
|
|
|
Component targetmsg = Component.text(sender.getName() + " möchte mit dir handeln. ")
|
|
|
.color(NamedTextColor.YELLOW)
|
|
|
.append(
|
|
|
Component.text("[Annehmen]")
|
|
|
.color(NamedTextColor.GREEN)
|
|
|
- .clickEvent(ClickEvent.runCommand("/tradeaccept " + sender.getName()))
|
|
|
+ .clickEvent(ClickEvent.runCommand("/trade " + sender.getName()))
|
|
|
);
|
|
|
|
|
|
Component sendermsg = Component.text("Handelsanfrage an ")
|
|
|
@@ -79,8 +83,8 @@ public class TradeRequestManager {
|
|
|
int task = Bukkit.getScheduler().scheduleSyncDelayedTask(
|
|
|
FluxService.get(BazaarFlux.class),
|
|
|
() -> {
|
|
|
- if (isPending(target, sender)) {
|
|
|
- requests.remove(target.getUniqueId());
|
|
|
+ if (isPending(senderUUID, targetUUID)) {
|
|
|
+ requests.get(senderUUID).remove(targetUUID);
|
|
|
FluxService.get(TradeModule.class).sendText(sender, Component.text("Deine Handelsanfrage an " + target.getName() + " ist abgelaufen.", NamedTextColor.RED));
|
|
|
FluxService.get(TradeModule.class).sendText(target, Component.text("Die Handelsanfrage von " + sender.getName() + " ist abgelaufen.", NamedTextColor.RED));
|
|
|
}
|
|
|
@@ -88,19 +92,24 @@ public class TradeRequestManager {
|
|
|
20L * 60 // 1 Minute
|
|
|
);
|
|
|
|
|
|
- timeoutTasks.put(target.getUniqueId(), task);
|
|
|
+
|
|
|
+ timeoutTasks.put(senderUUID, task);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public boolean isPending(Player target, Player sender) {
|
|
|
- return requests.getOrDefault(target.getUniqueId(), null) != null
|
|
|
- && requests.get(target.getUniqueId()).equals(sender.getUniqueId());
|
|
|
+ public boolean isPending(UUID target, UUID sender) {
|
|
|
+
|
|
|
+ return requests.getOrDefault(target, null) != null
|
|
|
+ && requests.get(target).contains(sender);
|
|
|
}
|
|
|
|
|
|
- public void accept(Player target, Player sender) {
|
|
|
- requests.remove(target.getUniqueId());
|
|
|
+ public void accept(UUID sender, UUID target) {
|
|
|
+ requests.get(sender).remove(target);
|
|
|
+ requests.get(target).remove(sender);
|
|
|
|
|
|
- Integer task = timeoutTasks.remove(target.getUniqueId());
|
|
|
+ Integer task = timeoutTasks.remove(target);
|
|
|
+ Integer task2 = timeoutTasks.remove(sender);
|
|
|
if (task != null) Bukkit.getScheduler().cancelTask(task);
|
|
|
+ if (task2 != null) Bukkit.getScheduler().cancelTask(task2);
|
|
|
}
|
|
|
}
|