diff --git a/API/src/main/java/dev/lrxh/api/match/IMatchService.java b/API/src/main/java/dev/lrxh/api/match/IMatchService.java index 8e4e1746..5c7f33c9 100644 --- a/API/src/main/java/dev/lrxh/api/match/IMatchService.java +++ b/API/src/main/java/dev/lrxh/api/match/IMatchService.java @@ -1,5 +1,7 @@ package dev.lrxh.api.match; +import org.bukkit.entity.Player; + public interface IMatchService { - void startMatch(IMatch match); + void startMatch(IMatch match, Player redPlayer, Player bluePlayer); } diff --git a/Plugin/src/main/java/dev/lrxh/neptune/game/arena/ArenaService.java b/Plugin/src/main/java/dev/lrxh/neptune/game/arena/ArenaService.java index d9ac2949..da91771d 100644 --- a/Plugin/src/main/java/dev/lrxh/neptune/game/arena/ArenaService.java +++ b/Plugin/src/main/java/dev/lrxh/neptune/game/arena/ArenaService.java @@ -109,6 +109,9 @@ public Arena getArenaByName(String arenaName) { return null; } + public Arena copyFrom(IArena arena) { + return new Arena(arena.getName(), arena.getDisplayName(), arena.getRedSpawn(), arena.getBlueSpawn(), arena.getMin(), arena.getMax(), arena.getBuildLimit(), arena.isEnabled(), arena.getWhitelistedBlocks(), arena.getDeathY()); + } @Override public ConfigFile getConfigFile() { diff --git a/Plugin/src/main/java/dev/lrxh/neptune/game/kit/Kit.java b/Plugin/src/main/java/dev/lrxh/neptune/game/kit/Kit.java index f0e173ec..c6b81eee 100644 --- a/Plugin/src/main/java/dev/lrxh/neptune/game/kit/Kit.java +++ b/Plugin/src/main/java/dev/lrxh/neptune/game/kit/Kit.java @@ -5,6 +5,7 @@ import dev.lrxh.api.kit.IKitRule; import dev.lrxh.neptune.API; import dev.lrxh.neptune.game.arena.Arena; +import dev.lrxh.neptune.game.arena.ArenaService; import dev.lrxh.neptune.game.arena.VirtualArena; import dev.lrxh.neptune.game.kit.impl.KitRule; import dev.lrxh.neptune.game.match.impl.participant.Participant; diff --git a/Plugin/src/main/java/dev/lrxh/neptune/game/kit/KitService.java b/Plugin/src/main/java/dev/lrxh/neptune/game/kit/KitService.java index 22d3ab15..c6f03b1f 100644 --- a/Plugin/src/main/java/dev/lrxh/neptune/game/kit/KitService.java +++ b/Plugin/src/main/java/dev/lrxh/neptune/game/kit/KitService.java @@ -159,4 +159,21 @@ public ConfigFile getConfigFile() { public LinkedHashSet getAllKits() { return new LinkedHashSet<>(kits); } + + public Kit copyFrom(IKit kit) { + return new Kit( + kit.getName(), + kit.getDisplayName(), + kit.getItems(), + kit.getAllArenas().stream().map(ArenaService.get()::copyFrom).collect(HashSet::new, HashSet::add, HashSet::addAll), + kit.getIcon(), + kit.getRule().entrySet().stream().collect(HashMap::new, + (map, entry) -> map.put((KitRule) entry.getKey(), entry.getValue()), HashMap::putAll), + kit.getSlot(), + kit.getHealth(), + kit.getKitEditorSlot(), + kit.getPotionEffects(), + kit.getDamageMultiplier() + ); + } } diff --git a/Plugin/src/main/java/dev/lrxh/neptune/game/match/MatchService.java b/Plugin/src/main/java/dev/lrxh/neptune/game/match/MatchService.java index 4e9791e7..d4697ff7 100644 --- a/Plugin/src/main/java/dev/lrxh/neptune/game/match/MatchService.java +++ b/Plugin/src/main/java/dev/lrxh/neptune/game/match/MatchService.java @@ -3,10 +3,14 @@ import dev.lrxh.api.events.MatchReadyEvent; import dev.lrxh.api.match.IMatch; import dev.lrxh.api.match.IMatchService; +import dev.lrxh.api.match.participant.IParticipant; import dev.lrxh.neptune.API; import dev.lrxh.neptune.Neptune; +import dev.lrxh.neptune.game.arena.Arena; +import dev.lrxh.neptune.game.arena.ArenaService; import dev.lrxh.neptune.game.arena.VirtualArena; import dev.lrxh.neptune.game.kit.Kit; +import dev.lrxh.neptune.game.kit.KitService; import dev.lrxh.neptune.game.match.impl.ffa.FfaFightMatch; import dev.lrxh.neptune.game.match.impl.participant.Participant; import dev.lrxh.neptune.game.match.impl.participant.ParticipantColor; @@ -19,6 +23,7 @@ import org.bukkit.entity.Player; import java.util.*; +import java.util.stream.Collectors; public class MatchService implements IMatchService { private static MatchService instance; @@ -96,7 +101,7 @@ public void startMatch(List participants, Kit kit, VirtualArena are } @Override - public void startMatch(IMatch match) { + public void startMatch(IMatch match, Player redPlayer, Player bluePlayer) { if (!Neptune.get().isAllowMatches()) return; MatchReadyEvent event = new MatchReadyEvent(match); @@ -105,8 +110,25 @@ public void startMatch(IMatch match) { return; } - matches.add((Match) match); - new MatchStartRunnable((Match) match).start(0L, 20L); + List participants = new ArrayList<>(); + for (IParticipant participant : match.getParticipants()) { + participants.add((Participant) participant); + } + + ArenaService.get().copyFrom(match.getArena()).createDuplicate().thenAccept(virtualArena ->{ + Match neptuneMatch = new SoloFightMatch( + virtualArena, + KitService.get().copyFrom(match.getKit()), + true, + new ArrayList<>(), + new Participant(redPlayer), + new Participant(bluePlayer), + 1 + ); + + matches.add(neptuneMatch); + new MatchStartRunnable(neptuneMatch).start(0L, 20L); + }); } public Optional getMatch(Player player) {