001package com.ericlam.mc.bungee.hnmc.commands.caxerx; 002 003import com.ericlam.mc.bungee.hnmc.builders.MessageBuilder; 004import com.ericlam.mc.bungee.hnmc.commands.caxerx.exception.NotExecutableException; 005import com.ericlam.mc.bungee.hnmc.commands.caxerx.functional.AdvCmdExecutor; 006import com.ericlam.mc.bungee.hnmc.commands.caxerx.functional.AdvTabCompleter; 007import com.ericlam.mc.bungee.hnmc.config.MainConfig; 008import com.ericlam.mc.bungee.hnmc.main.HyperNiteMC; 009import net.md_5.bungee.api.ChatColor; 010import net.md_5.bungee.api.CommandSender; 011 012import java.util.List; 013 014/** 015 * 指令節點建造器 016 * 017 * @param <Sender> 發送者指定類別 018 * @author Eric Lam 019 * @see CommandNode 020 */ 021public class AdvCommandNodeBuilder<Sender extends CommandSender> { 022 023 private String command; 024 private String permission; 025 private String description; 026 private String placeholder; 027 private CommandNode parent; 028 private String[] alias = new String[0]; 029 private AdvTabCompleter<Sender> tabCompleterSender; 030 private AdvCmdExecutor<Sender> cmdExecutorSender; 031 032 /** 033 * @param command 指令 034 */ 035 public AdvCommandNodeBuilder(String command) { 036 this.command = command; 037 038 } 039 040 /** 041 * @param permission 權限 042 * @return this 043 */ 044 public AdvCommandNodeBuilder<Sender> permission(String permission) { 045 this.permission = permission; 046 return this; 047 } 048 049 /** 050 * @param description 介紹 051 * @return this 052 */ 053 public AdvCommandNodeBuilder<Sender> description(String description) { 054 this.description = description; 055 return this; 056 } 057 058 /** 059 * @param placeholder 用法 060 * @return this 061 */ 062 public AdvCommandNodeBuilder<Sender> placeholder(String placeholder) { 063 this.placeholder = placeholder; 064 return this; 065 } 066 067 /** 068 * @param parent 父類指令 069 * @return this 070 */ 071 public AdvCommandNodeBuilder<Sender> parent(CommandNode parent) { 072 this.parent = parent; 073 return this; 074 } 075 076 /** 077 * 若果是主指令,將會自動從 plugin.yml 添加 078 * 079 * @param alias 縮寫指令 080 * @return this 081 */ 082 public AdvCommandNodeBuilder<Sender> alias(String... alias) { 083 this.alias = alias; 084 return this; 085 } 086 087 /** 088 * @param tabCompleter tab 執行 089 * @return this 090 */ 091 public AdvCommandNodeBuilder<Sender> tabComplete(AdvTabCompleter<Sender> tabCompleter) { 092 this.tabCompleterSender = tabCompleter; 093 return this; 094 } 095 096 /** 097 * @param cmdExecutor 指令執行 098 * @return this 099 */ 100 public AdvCommandNodeBuilder<Sender> execute(AdvCmdExecutor<Sender> cmdExecutor) { 101 this.cmdExecutorSender = cmdExecutor; 102 return this; 103 } 104 105 /** 106 * @return 指令節點 107 * @throws NotExecutableException 指令無法執行 108 */ 109 @SuppressWarnings("unchecked") 110 public CommandNode build() { 111 MainConfig config = HyperNiteMC.getAPI().getMainConfig(); 112 if (cmdExecutorSender == null) throw new NotExecutableException(command); 113 return new CommandNode(parent, command, permission, description, placeholder, alias) { 114 @Override 115 public void executeCommand(CommandSender sender, List<String> args) { 116 try { 117 cmdExecutorSender.execute((Sender) sender, args); 118 } catch (ClassCastException e) { 119 MessageBuilder.sendMessage(sender, config.getPrefix() + ChatColor.RED + "無法使用此指令。"); 120 } 121 } 122 123 @Override 124 public List<String> executeTabCompletion(CommandSender sender, List<String> args) { 125 try { 126 return tabCompleterSender == null ? null : tabCompleterSender.tabComplete((Sender) sender, args); 127 } catch (ClassCastException e) { 128 MessageBuilder.sendMessage(sender, config.getPrefix() + ChatColor.RED + "無法使用此指令。"); 129 } 130 return null; 131 } 132 }; 133 } 134 135 136} 137//如何使用 138/* 139class AdvCommandNodeUse{ 140 CommandNode getNode(){ 141 return new AdvCommandNodeBuilder<Player>("fly") 142 .description("setfly") 143 .execute((sender, args) -> { 144 sender.setAllowFlight(!sender.getAllowFlight()); 145 sender.sendMessage("You "+(sender.getAllowFlight() ? "can" : "cannot")+" fly now."); 146 return true; 147 }).build(); 148 } 149} 150 151 */ 152 153 154