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!");
}
}
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?
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;