2017-04-07 12 views
1

私はキーとしてdamager名を追加しようとしている、とdamageCheckと呼ばれています、私のハッシュマップに値として被害者名。これはすべてEntityDamageByEntityEventで行われます。しかし、被害者と被害者の両方を保管しようとすると、すべてが間違っています。Bukkit /インローAPI:マッピングdamagerと被害者

コード:

private HashMap<String, String> damageCheck = new HashMap<String, String>(); 

@EventHandler 
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { 

    if(event.getEntity() instanceof Player || event.getDamager() instanceof Player) { 
     Player victim = (Player) event.getEntity(); 
     Player damager = (Player) event.getDamager(); 

     String victimName = victim.getDisplayName(); // getting the victim name 
     String damagerName = damager.getDisplayName(); // getting the damager name 

     Bukkit.getServer().broadcastMessage(""); 
     Bukkit.getServer().broadcastMessage(victim.getDisplayName() + " is the victim!"); 
     Bukkit.getServer().broadcastMessage(damager.getDisplayName() + " is the damager!"); 
     Bukkit.getServer().broadcastMessage(""); 

     try { 
      if(!damageCheck.containsKey(damagerName)) { 
       damageCheck.put(victimName, damagerName); 

       Bukkit.getServer().broadcastMessage(""); 
       Bukkit.getServer().broadcastMessage(damageCheck.get(victimName) + " is victim!"); 
       Bukkit.getServer().broadcastMessage(damageCheck.get(damagerName) + " is damager!"); 
       Bukkit.getServer().broadcastMessage(""); 
      } else if(damageCheck.containsKey(damagerName)) { 
       damageCheck.replace(damagerName, damagerName, damagerName); 

       Bukkit.getServer().broadcastMessage(""); 
       Bukkit.getServer().broadcastMessage(damageCheck.get(victimName) + " is victim!"); 
       Bukkit.getServer().broadcastMessage(damageCheck.get(damagerName) + " is damager!"); 
       Bukkit.getServer().broadcastMessage(""); 
      } 
     } catch (NullPointerException e) { 
      // do nothing lol 
     } 

    } else { 
     Bukkit.getServer().broadcastMessage("There is no entity or damager!"); 
    } 
} 

enter image description here

まずメッセージは正しかったです。 GetSparkedは犠牲者であり、フェンディクはダメージを受けています。しかし、2番目のメッセージでハッシュマップから名前を取得しようとすると、出力は間違った値になります。

EDIT:I'vは damageCheck.put(victimName、damagerName)に変更。damageCheck.put(damagerName、victimName);

これで被害者はnull(初めての打撃)です、なぜですか?

enter image description here

答えて

1

だから、私は本当にあなたがとにかくこれは、コードは私が考えていること、である、としていたのか理解していなかったことから、これを行うための完全な新しい方法をテストしていたことは、あなたが本当に必要なものです

new HashMap <String, String>

private HashMap<String, String> damageCheck = new HashMap<>(); 

コードは必要ない:

それは時々正確ではないもののハッシュマップ からエンティティデータを削除
@EventHandler 
public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { 

    if(!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) return; 

    String damagerName = event.getDamager().getName(); 
    String victimName = event.getEntity().getName(); 

    damageCheck.put(victimName, damagerName); 

    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------"); 
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + damagerName + ChatColor.GRAY + " is the damager"); 
    Bukkit.broadcastMessage(ChatColor.DARK_AQUA + victimName + ChatColor.GRAY + " is the victim"); 
    Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------"); 

    Bukkit.getLogger().info(damageCheck.toString()); 

} 

@EventHandler 
public void onEntityDeathEvent(EntityDeathEvent event){ 
    damageCheck.remove(event.getEntity().getName()); 
    damageCheck.remove(event.getEntity().getKiller().getName()); 
} 

あなたが唯一のプレーヤーのためのチェックを外すことができ、それだけで

を削除する任意のエンティティ 上で動作します

if(!(event.getDamager() instanceof Player) || !(event.getEntity() instanceof Player)) return;

+0

ご協力いただきありがとうございます。私は本当にそれを感謝します。 –

関連する問題