【问题标题】:Need help in minecraft bukkit java development with kit command在使用 kit 命令进行 minecraft bukkit java 开发时需要帮助
【发布时间】:2020-08-28 20:08:44
【问题描述】:

我制作的插件有 2 个工具包,第一个名为 Iron,另一个名为 DProtect 所以我希望他们提供物品,我做了一切,我冷静下来问题是当我输入 /kit Iron 或 /kit DProtect 时它不起作用我尝试做很多事情但不起作用这是代码我可以帮忙吗?

package Rivals.iSryMan.Kits.commands;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.UUID;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import Rivals.iSryMan.Kits.Main;

public class Kit implements CommandExecutor{
    private HashMap<UUID,Long> ironcooldown = new HashMap<UUID,Long>();
    private int ironcooldowntime = 300;

    private HashMap<UUID,Long> DProtectcooldown = new HashMap<UUID,Long>();
    private int DProtectcooldowntime = 5259487;

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(sender instanceof Player) {
            Player p = (Player)sender;
            if(args.length == 1) {
                //Kit Iron
                if(args[0].equals("Iron")) {
                if(ironcooldown.containsKey(p.getUniqueId())) {
                    long ironsecondsleft = ( (ironcooldown.get(p.getUniqueId())/ 1000) + ironcooldowntime) - (System.currentTimeMillis() / 1000);
                    if(ironsecondsleft > 0) {
                        p.sendMessage(Main.Color(Main.prefix + "You must wait " + ironsecondsleft + " before you take that kit again!"));
                    }else if(ironsecondsleft == 0) {
                        final ItemStack ironhelmet = new ItemStack(Material.IRON_HELMET);
                        final ItemStack ironchestplate = new ItemStack(Material.IRON_CHESTPLATE);
                        final ItemStack ironleggings = new ItemStack(Material.IRON_LEGGINGS);
                        final ItemStack ironboots = new ItemStack(Material.IRON_BOOTS);
                        p.getInventory().addItem(ironhelmet);
                        p.getInventory().addItem(ironchestplate);
                        p.getInventory().addItem(ironleggings);
                        p.getInventory().addItem(ironboots);

                        p.sendMessage(Main.Color(Main.prefix + " You've got your kit, Enjoy!"));
                    }
                }
                //Kit Iron


                //Kit DProtect
                } else if (args[0].equals("DProtect")) {
                if(DProtectcooldown.containsKey(p.getUniqueId())) {
                    long DProtectsecondsleft = ( (DProtectcooldown.get(p.getUniqueId()) / 1000) + DProtectcooldowntime) - (System.currentTimeMillis() / 1000);
                    if(DProtectsecondsleft > 0) {
                        p.sendMessage(Main.Color(Main.prefix + "You must wait " + DProtectsecondsleft + " before you take that kit again!"));
                    }else if(DProtectcooldowntime == 0) {



                        final ItemStack dphelmet = new ItemStack(Material.IRON_HELMET);
                        final ItemMeta dphelmetmeta = dphelmet.getItemMeta();
                        final ItemStack dpchestplate = new ItemStack(Material.IRON_CHESTPLATE);
                        final ItemMeta dpchestplatemetaa = dphelmet.getItemMeta();
                        final ItemStack dpleggings = new ItemStack(Material.IRON_LEGGINGS);
                        final ItemMeta dpleggingsmeta = dphelmet.getItemMeta();
                        final ItemStack dpboots = new ItemStack(Material.IRON_BOOTS);
                        final ItemMeta dpbootsmeta = dphelmet.getItemMeta();

                        ArrayList<String> dplore = new ArrayList<String>();

                        dplore.add(Main.Color("&bAuthentic Protection 4 Armor"));


                        //Set Meta
                        dphelmet.setItemMeta(dphelmetmeta);
                        dpchestplate.setItemMeta(dpchestplatemetaa);
                        dpleggings.setItemMeta(dpleggingsmeta);
                        dpboots.setItemMeta(dpbootsmeta);
                        //Set Meta

                        //Set Lore
                        dphelmetmeta.setLore(dplore);
                        dpchestplatemetaa.setLore(dplore);
                        dpleggingsmeta.setLore(dplore);
                        dpbootsmeta.setLore(dplore);
                        //Set Lore

                        //Adding Kit
                        p.getInventory().addItem(dphelmet);
                        p.getInventory().addItem(dpchestplate);
                        p.getInventory().addItem(dpleggings);
                        p.getInventory().addItem(dpboots);
                        //Adding Kit

                        p.sendMessage(Main.Color(Main.prefix + " You've got your kit, Enjoy!"));

                    }
                }
                //Kit DProtect
                }
                    return true;
                }

        }
        return false;
    }



}

【问题讨论】:

    标签: java minecraft bukkit


    【解决方案1】:

    你确定了吗:

    1. 你的命令注册在onEnable()plugin.yml?
    2. 您专门键入带有大写 I 的“Iron”?你应该允许不同的情况,使用equalsIgnoreCase()
    3. 这可能是问题所在。您的 HashMap 最初不包含 CommandExecutor 的 UUID,因此它永远不会通过 ironcooldown.containsKey(p.getUniqueId())。我建议检查它们是否在其中。如果是,则检查时间是否为0,否则在代码执行完毕后添加。

    让我知道这是否有效。 此外,您应该修复代码的缩进 - 一开始它让我感到困惑,并且将来可能会让您感到困惑。不过,这没什么大不了的。

    【讨论】:

    • 1.该命令已注册 2. 是的,我做了 3. 没听懂你
    【解决方案2】:

    虽然 Slinthn 回答了你的问题,但我想我还是要补充一点解释。

    您为两个工具包的冷却时间声明了一个私有 HashMap:ironcooldownDProtectcooldown

    您在onCommand 中检查执行命令的玩家是否在您的条件if(ironcooldown.containsKey(p.getUniqueId())) 中的那个HashMap 中,但是,该条件永远不会为真,因为玩家的UUID 从未添加到HashMap 中。

    在我看来你想做如下的事情(半伪代码)

    if(!(sender instanceof Player))
        return true;
    if(args.length == 0)
        return true;
    Player p = (Player) sender;
    if(args[0].equalsIgnoreCase("iron")){
        if(ironcooldown.containsKey(p.getUniqueId())){
            //Do check if they are still on cooldown
            //... if so, return here
        }
        ironcooldown.put(p.getUniqueId(), System.currentTimeMillis());
        givePlayerKit(Kits.IRON, p); //made up function that takes Enum & Player
    }
    //etc
    
    

    【讨论】:

      【解决方案3】:

      您似乎尚未将播放器添加到 HashMap,因此它将返回 false,因此您可能希望将您的 HashMaps 公开和静态并在您的 PlayerJoinEvent(如果有的话)添加

      Kit.ironcooldown.put(p.getUniqueId(), 0);
      

      或者如果您没有 PlayerJoinEvent 和/或您不想这样做,您可以在您的参数检查之前放置

      if (!ironcooldown.containsKey(p.getUniqueId()) {
          ironcooldown.put(p.getUniqueId(), 0);
      }
      

      对 Dprotectcooldown 执行相同操作。

      希望这有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2015-03-20
        • 2016-11-23
        • 2012-12-09
        • 1970-01-01
        • 2011-08-09
        • 2017-11-08
        相关资源
        最近更新 更多