Search code examples
javabukkit

Bukkit / Spigot API: Mapping damager and Victim


I'm trying to add the damager name as a key, and the victim name as the value, into my hashmap that's called damageCheck. This is all done in the EntityDamageByEntityEvent. However, when I try to store both the victim and damager, it all goes wrong.

Code:

    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

First message was correct. GetSparked is the victim and Fendyk is the damager. But in the second message when trying to get the names out of the hashmap it output's wrong values.

EDIT: I'v changed damageCheck.put(victimName, damagerName); to damageCheck.put(damagerName, victimName);

But it now gives victim null (the first time hitting), why is that?

enter image description here


Solution

  • So, i was testing out a complete new way of doing this, since i didn't really understand what you were referring to, anyways this is the code, that i think is what you really need

    No need for the new HashMap <String, String>

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

    Code:

    @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());
    
    }
    

    Removing entity data from the hashmap though it's not accurate sometimes

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

    You can remove the check for players only, it'll work on any entity Just remove

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