Bukkit / Spigot API:映射破坏者和受害者
Bukkit / Spigot API: Mapping damager and Victim
我正在尝试将 damager name 作为键添加,并将 victim name 作为值添加到我的 hashmap 中称为 damageCheck。这一切都在EntityDamageByEntityEvent
中完成。但是,当我尝试同时存储受害者和破坏者时,一切都出错了。
代码:
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!");
}
}
第一条消息是正确的。 GetSparked 是受害者,Fendyk 是破坏者。但是在第二条消息中,当尝试从哈希图中获取名称时,它输出了错误的值。
编辑:我改变了
damageCheck.put(受害者姓名, 伤害者姓名);
到
damageCheck.put(damagerName, victimName);
但是现在给victim null(第一次命中),为什么?
所以,我正在测试一种全新的方法来做到这一点,因为我不太明白你指的是什么,无论如何这是代码,我认为这是你真正需要的
不需要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());
}
从 hashmap 中删除实体数据虽然有时不准确
@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;
我正在尝试将 damager name 作为键添加,并将 victim name 作为值添加到我的 hashmap 中称为 damageCheck。这一切都在EntityDamageByEntityEvent
中完成。但是,当我尝试同时存储受害者和破坏者时,一切都出错了。
代码:
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!");
}
}
第一条消息是正确的。 GetSparked 是受害者,Fendyk 是破坏者。但是在第二条消息中,当尝试从哈希图中获取名称时,它输出了错误的值。
编辑:我改变了 damageCheck.put(受害者姓名, 伤害者姓名); 到 damageCheck.put(damagerName, victimName);
但是现在给victim null(第一次命中),为什么?
所以,我正在测试一种全新的方法来做到这一点,因为我不太明白你指的是什么,无论如何这是代码,我认为这是你真正需要的
不需要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());
}
从 hashmap 中删除实体数据虽然有时不准确
@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;