001package com.ericlam.mc.minigames.core.commands; 002 003import com.ericlam.mc.minigames.core.arena.Arena; 004import com.ericlam.mc.minigames.core.exception.arena.create.ArenaNotExistException; 005import com.ericlam.mc.minigames.core.game.GameState; 006import com.ericlam.mc.minigames.core.main.MinigamesCore; 007import com.ericlam.mc.minigames.core.manager.ArenaCreateManager; 008import com.hypernite.mc.hnmc.core.config.MessageGetter; 009import com.hypernite.mc.hnmc.core.main.HyperNiteMC; 010import com.hypernite.mc.hnmc.core.managers.CoreConfig; 011import com.hypernite.mc.hnmc.core.misc.commands.CommandNode; 012import org.apache.commons.lang.Validate; 013import org.bukkit.command.CommandSender; 014import org.bukkit.entity.Player; 015 016import javax.annotation.Nonnull; 017import java.util.Arrays; 018import java.util.LinkedList; 019import java.util.List; 020import java.util.stream.Collectors; 021 022/** 023 * 場地指令接口,用於新增額外場地設置指令是掛接。 024 */ 025public abstract class ArenaCommandNode extends CommandNode { 026 027 private final MessageGetter messageGetter; 028 029 030 /** 031 * @param parent 父指令 032 * @param command 指令名稱 033 * @param permission 權限 034 * @param description 描述 035 * @param placeholder 參數 036 * @param alias 別稱 037 */ 038 public ArenaCommandNode(CommandNode parent, @Nonnull String command, String permission, @Nonnull String description, String placeholder, String... alias) { 039 super(parent, command, permission, description, placeholder, alias); 040 messageGetter = MinigamesCore.getProperties().getMessageGetter(); 041 } 042 043 @Override 044 public boolean executeCommand(@Nonnull CommandSender commandSender, @Nonnull List<String> list) { 045 CoreConfig coreConfig = HyperNiteMC.getAPI().getCoreConfig(); 046 String prefix = MinigamesCore.getApi().getGameManager().getGamePrefix(); 047 if (!(commandSender instanceof Player)) { 048 commandSender.sendMessage(coreConfig.getPrefix() + coreConfig.getNotPlayer()); 049 return true; 050 } 051 052 Player player = (Player) commandSender; 053 final ArenaCreateManager arenaCreateManager = MinigamesCore.getApi().getArenaCreateManager(); 054 Validate.notNull(arenaCreateManager, "Arena Create Manager is null"); 055 056 if (MinigamesCore.getApi().getGameManager().getGameState() != GameState.STOPPED) { 057 player.sendMessage(prefix + messageGetter.getPure("game-not-stopped")); 058 return true; 059 } 060 061 try { 062 return executeArenaOperation(player, list, arenaCreateManager); 063 } catch (ArenaNotExistException e) { 064 player.sendMessage(prefix + messageGetter.getPure("arena.not-exist").replace("<arena>", e.getArena())); 065 return true; 066 } 067 } 068 069 @Override 070 public List<String> executeTabCompletion(@Nonnull CommandSender commandSender, @Nonnull List<String> list) { 071 if (this.getPlaceholder() == null) return null; 072 String[] placeholders = Arrays.stream(this.getPlaceholder().split(" ")).map(l -> l.replace("<", "").replace(">", "").replace("[", "").replace("]", "")).toArray(String[]::new); 073 List<Integer> arenaTab = new LinkedList<>(); 074 List<Integer> warpTab = new LinkedList<>(); 075 for (int i = 0; i < placeholders.length; i++) { 076 final String var = placeholders[i]; 077 if (var.equalsIgnoreCase("arena")) { 078 arenaTab.add(i); 079 } else if (var.equalsIgnoreCase("warp")) { 080 warpTab.add(i); 081 } 082 } 083 final ArenaCreateManager arenaCreateManager = MinigamesCore.getApi().getArenaCreateManager(); 084 Validate.notNull(arenaCreateManager, "Arena Create Manager is null"); 085 final int index = list.size() - 1; 086 if (arenaTab.contains(index)) { 087 return arenaCreateManager.getArenaList().stream().map(Arena::getArenaName).collect(Collectors.toList()); 088 } else if (warpTab.contains(index)) { 089 final int arenaIndex = index - 1; 090 if (placeholders.length > arenaIndex && placeholders[arenaIndex].equalsIgnoreCase("arena")) { 091 try { 092 return arenaCreateManager.getWarpList(list.get(arenaIndex)); 093 } catch (ArenaNotExistException ignored) { 094 } 095 } 096 } 097 return null; 098 } 099 100 /** 101 * 指令運行 102 * 103 * @param player 指令發送者 104 * @param list 參數 105 * @param arenaCreateManager 場地設置管理器 106 * @return 執行成功 107 * @throws ArenaNotExistException 場地不存在 108 */ 109 protected abstract boolean executeArenaOperation(@Nonnull Player player, @Nonnull List<String> list, @Nonnull ArenaCreateManager arenaCreateManager) throws ArenaNotExistException; 110 111 112}