即使设置了值,Java HashMap仍返回0

即使设置了值,Java HashMap仍返回0,java,minecraft,Java,Minecraft,希望这不是一个超级愚蠢的问题,但我是编程新手,不知道为什么我的HashMap返回值0,即使我将值设置为查找的同一个键。如果这很重要,这是一个插口插件的代码 它的作用是,当我仍在偷袭时,电荷值会像正常情况一样继续上升,但一旦退出偷袭模式,它会返回0 public class Leaping extends Enchant{ public Leaping(){ super("leaping"); } public HashMap<Player, In

希望这不是一个超级愚蠢的问题,但我是编程新手,不知道为什么我的HashMap返回值0,即使我将值设置为查找的同一个键。如果这很重要,这是一个插口插件的代码

它的作用是,当我仍在偷袭时,电荷值会像正常情况一样继续上升,但一旦退出偷袭模式,它会返回0

public class Leaping extends Enchant{

    public Leaping(){
        super("leaping");
    }

    public HashMap<Player, Integer> charge = new HashMap<Player, Integer>();

    @Override
    public void setDefaults(){
        typesAllowed.add("leggings");
        displayName = "&7Leaping {enchantlevel}";
        maxLevel = 20;
        event = "onSneak";
        permission = "eg.enchant.leaping.#";
        crystal = new Crystal(this);
        crystal.displayName = "&3Leaping {enchantlevel}";
        crystal.material = new MaterialData(Material.EMERALD);
    }

    @Override
    public void callEvent(ItemStack item, final Player player, Entity target, double value, Block block){
        if(EnchantManager.hasEnchant(item, this.name)) {
            int level = EnchantManager.getEnchantLevel(item, this);
            if(value == 0.0) {
                new BukkitRunnable() {
                    public void run() {
                        if((!(getCharge(player) >= level)) && player.isSneaking()) {
                            setCharge(player, getCharge(player) + 1);
                            player.sendMessage(Integer.toString(getCharge(player)));
                            player.playSound(player.getLocation(), Sound.BLOCK_NOTE_CHIME, 1, 1);
                        }else {
                            cancel();
                        }
                    }
                }.runTaskTimer(Main.plugin, 20, 20);
            }
            if(value == 1.0) {
                jump(player, getCharge(player));
            }
        }
    }

    private void setCharge(Player p, int value) {
        if(charge.containsKey(p)) charge.remove(p);
        charge.put(p, value);
    }

    private int getCharge(Player p) {
        if(!charge.containsKey(p)) {setCharge(p, 0);}
        return charge.get(p);
    }

    private void jump(Player p, int i) {
        p.sendMessage(Integer.toString(i));
        p.setVelocity(p.getLocation().getDirection().multiply(i));
        p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1, 1);
        new BukkitRunnable() {
            public void run() {
                setCharge(p, 0);
            }
        }.runTaskLater(Main.plugin, 20);
    }   
}

public class SneakEvent implements Listener{

Plugin plugin;

public SneakEvent(Plugin pl) {
    this.plugin = pl;
    plugin.getServer().getPluginManager().registerEvents(this, plugin);
}

@EventHandler
public static void onSneak(PlayerToggleSneakEvent e) {
    Player p = e.getPlayer();

    if(e.isSneaking()) {
        EnchantManager.callEvent(p.getInventory().getLeggings(), "onSneak", p, null, 0.0, p.getLocation().getBlock().getRelative(BlockFace.DOWN));
    }else {
        EnchantManager.callEvent(p.getInventory().getLeggings(), "onSneak", p, null, 1.0, p.getLocation().getBlock().getRelative(BlockFace.DOWN));
    }
}
公共类跳跃扩展了Enchant{
公共跳跃{
超级(“跳跃”);
}
公共HashMap费用=新HashMap();
@凌驾
公共void setDefaults(){
类型。添加(“绑腿”);
displayName=“&7Leaping{enchantlevel}”;
maxLevel=20;
event=“onSneak”;
permission=“例如,对跳跃施魔法。”;
水晶=新水晶(此);
crystal.displayName=“&3leapping{enchantlevel}”;
crystal.material=新材料数据(material.EMERALD);
}
@凌驾
public void callEvent(项目堆栈项目、最终玩家、实体目标、双值、块){
if(EnchantManager.hasEnchant(项目,此.name)){
int-level=EnchantManager.getenchanctlevel(项目,此);
如果(值==0.0){
新的bukkitrunable(){
公开募捐{
如果((!(getCharge(player)>=level))&&player.isSneaking(){
设置电荷(玩家,设置电荷(玩家)+1);
player.sendMessage(Integer.toString(getCharge(player));
player.playSound(player.getLocation(),Sound.BLOCK_NOTE_CHIME,1,1);
}否则{
取消();
}
}
}.runTaskTimer(Main.plugin,20,20);
}
如果(值==1.0){
跳跃(玩家,冲锋(玩家));
}
}
}
私有无效设置费用(玩家p,int值){
如果(装药容器)(p))装药移除(p);
费用.投入(p,价值);
}
私人int getCharge(玩家p){
如果(!charge.containsKey(p)){setCharge(p,0);}
退货费用。获取(p);
}
私人空位跳跃(玩家p,智力i){
p、 sendMessage(Integer.toString(i));
p、 setVelocity(p.getLocation().getDirection().multiply(i));
p、 播放声音(p.getLocation(),Sound.ENTITY\u GENERIC\u EXPLODE,1,1);
新的bukkitrunable(){
公开募捐{
设定电荷(p,0);
}
}.runTaskLater(Main.plugin,20);
}   
}
公共类侦听器{
插件;
公共通风口(插件pl){
this.plugin=pl;
plugin.getServer().getPluginManager().registerEvents(此插件);
}
@事件处理程序
NEAK上的公共静态无效(PlayerToggleE){
Player p=e.getPlayer();
如果(例如,isSneaking()){
EnchantManager.callEvent(p.getInventory().getLeggings(),“onSneak”,p,null,0.0,p.getLocation().getBlock().getRelative(BlockFace.DOWN));
}否则{
EnchantManager.callEvent(p.getInventory().getLeggings(),“onSneak”,p,null,1.0,p.getLocation().getBlock().getRelative(BlockFace.DOWN));
}
}

任何形式的帮助都将不胜感激。提前感谢您抽出时间。

我无法理解这种情况

但是,我建议您在
setCharge()
中添加日志,以确保该值不是
0

比如说

private void setCharge(Player p, int value) {
    System.out.println("key is " + p + "; value is " + value);
    if(charge.containsKey(p)) charge.remove(p);
    charge.put(p, value);
}

也许花点时间在你的问题中创建一个?发布你的代码;而不是作为一个链接。这次我为你添加了它。请显示
Player
类的代码,无论是你的类还是libraryAuto提供的类,我对Spigot很熟悉。据我所知,你正在检查
value
是否为1.0,然后运行TaskTimerlly已运行任务(您计划它在一秒钟内运行).因此,在您的BukkitRunnable中增加的电荷值是在您检查之后。在您检查电荷时,它是0。如果您已经可以确认玩家正在偷袭,为什么还要添加第二个延迟?这应该是一个注释,而不是答案。不,它不能。它可以提供调试信息。不是同一件事。