Package syam.BookEditor.Command

Source Code of syam.BookEditor.Command.BaseCommand

/**
* BookEditor - Package: syam.BookEditor.Command
* Created: 2012/09/08 12:10:18
*/
package syam.BookEditor.Command;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import syam.BookEditor.Book;
import syam.BookEditor.BookEditor;
import syam.BookEditor.Enum.Permission;
import syam.BookEditor.Util.Actions;

/**
* BaseCommand (BaseCommand.java)
* @author syam
*/
public abstract class BaseCommand {
  // Logger
  protected static final Logger log = BookEditor.log;
  protected static final String logPrefix = BookEditor.logPrefix;
  protected static final String msgPrefix = BookEditor.msgPrefix;
  /* コマンド関係 */
  public CommandSender sender;
  public List<String> args = new ArrayList<String>();
  public String name;
  public int argLength = 0;
  public String usage;
  public boolean bePlayer = true;
  public Player player;
  public String command;
  public BookEditor plugin;

  /* BookEditor */
  public Material needInHandBookType = null;
  public Book handBook = null;
  public Permission editOtherPermission = null;


  public boolean run(BookEditor plugin, CommandSender sender, String[] preArgs, String cmd) {
    this.plugin = plugin;
    this.sender = sender;
    this.command = cmd;

    // 引数をソート
    args.clear();
    for (String arg : preArgs)
      args.add(arg);

    // 引数からコマンドの部分を取り除く
    // (コマンド名に含まれる半角スペースをカウント、リストの先頭から順にループで取り除く)
    for (int i = 0; i < name.split(" ").length && i < args.size(); i++)
      args.remove(0);

    // 引数の長さチェック
    if (argLength > args.size()){
      sendUsage();
      return true;
    }

    // 実行にプレイヤーであることが必要かチェックする
    if (bePlayer && !(sender instanceof Player)){
      Actions.message(sender, null, "&cThis command cannot run from Console!");
      return true;
    }
    if (sender instanceof Player){
      player = (Player)sender;
    }

    // 権限チェック
    if (!permission()){
      Actions.message(sender, null, "&cYou don't have permission to use this!");
      return true;
    }

    // 手に持ったアイテムチェック
    if (needInHandBookType != null && player != null){
        ItemStack is = player.getItemInHand();

        switch (needInHandBookType){
            /* 署名済みまたは未署名の本 */
            case BOOK:
                if (is.getType() != Material.BOOK_AND_QUILL && is.getType() != Material.WRITTEN_BOOK){
                    Actions.message(sender, null, "&c持っているアイテムが本ではありません!");
                    return true;
                }
                break;
            /* 署名済み(閉じられた)の本 */
            case WRITTEN_BOOK:
                if (is.getType() != Material.WRITTEN_BOOK){
                    if (is.getType() == Material.BOOK_AND_QUILL) Actions.message(sender, null, "&cこの本は署名されていません!");
                    else Actions.message(sender, null, "&c持っているアイテムが署名済みの本ではありません!");
                    return true;
                }
                break;
            /* 未署名(編集可能)の本 */
            case BOOK_AND_QUILL:
                if (is.getType() != Material.BOOK_AND_QUILL){
                    if (is.getType() == Material.WRITTEN_BOOK) Actions.message(sender, null, "&cこの本は署名されています!");
                    else Actions.message(sender, null, "&c持っているアイテムが未署名の本ではありません!");
                    return true;
                  }
                break;
            /* 未定義 */
            default:
                log.severe(logPrefix+ needInHandBookType.name() + " is not defined on BaseCommand! Please contact developer!");
                Actions.message(sender, null, "&can error occured while running this command. Please contact server administrator!");
                return true;
        }

        handBook = new Book(is);
    }

    // 実行
    execute();

    return true;
  }

  /**
   * コマンドを実際に実行する
   * @return 成功すればtrue それ以外はfalse
   */
  public abstract void execute();

  /**
   * コマンド実行に必要な権限を持っているか検証する
   * @return trueなら権限あり、falseなら権限なし
   */
  public abstract boolean permission();

  /**
   * コマンドの使い方を送信する
   */
  public void sendUsage(){
    Actions.message(sender, null, "&c/"+this.command+" "+name+" "+usage);
  }
}
TOP

Related Classes of syam.BookEditor.Command.BaseCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.