>我正在尝试制作一个奖励系统,奖励你杀死玩家。所以我完成了基本检查,但我想检测受害者在被攻击或用弓箭射击后是否掉入虚空,问题是,我找不到解决方案。
法典:
@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());
event.getEntity().getKiller().sendMessage("You are the killer, and receives rewards!");
event.getEntity().sendMessage("You died, thats horrible..");
Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
Bukkit.broadcastMessage(ChatColor.DARK_AQUA + event.getEntity().getKiller().getName() + ChatColor.GRAY + " is the damager");
Bukkit.broadcastMessage(ChatColor.DARK_AQUA + event.getEntity().getName() + ChatColor.GRAY + " is the victim");
Bukkit.broadcastMessage(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "-------------[ X ]-------------");
}
@EventHandler
public void onPlayerMovement(PlayerMoveEvent event) {
Player player = (Player)event.getPlayer();
// Checking if the players Y
if(event.getTo().getY() < 25.0) {
// do stuff here
}
}
用try & catch
块包围你的EntityDeathEvent
代码以避免一些错误......
在 PlayerMoveEvent
上,将event.getPlayer()
转换为 Player
是多余的,因为您已经指定了变量。Y也应该低于10,相信我,更好。
好的,现在你首先需要检查哈希图是否包含那个玩家(谁正在虚空中死去(,然后从哈希图中获取杀手(破坏者(的名字,之后你可以向那个杀手发送一条消息,最后杀死在虚空中的玩家
代码:D
if (!damageCheck.containsKey(player.getName())) return;
Player killer = Bukkit.getPlayer(damageCheck.get(player.getName()));
killer.sendMessage(ChatColor.GREEN + "You've earned " + ChatColor.RED + "" + ChatColor.BOLD + "$3" + ChatColor.GREEN + " for killing " + ChatColor.DARK_AQUA + player.getName()); // sends a message to the killer
player.setHealth(0); // kills the player
因此,我们完成了空隙部分的处理。现在你需要检测受害者是否被弓箭击中:
将您的 if 语句更改为 if (!(event.getDamager() instanceof Player || event.getDamager() instanceof Projectile) || !(event.getEntity() instanceof Player)) return;
,以便它可以检测例如箭头是否击中受害者。
现在你需要检测射手/破坏者的名字,这可以通过if
语句轻松完成。
法典:
Player shooterName = event.getDamager() instanceof Projectile ? (Player) ((Projectile) event.getDamager()).getShooter() : null;
String damagerName = event.getDamager() instanceof Player ? event.getDamager().getName() : shooterName.getName();
您也可以删除Bukkit.getLogger().info(damageCheck.toString());
,因为它仅用于调试。
您可能应该这样做:
private enum Cause {
ATTACK,
ARROW,
}
private HashMap<UUID, UUID> lastDamage = new HashMap<UUID, UUID>();
private HashMap<UUID, Cause> lastDamageCause = new HashMap<UUID, Cause>();
@EventHandler
public void onDamage(EntityDamageByEntityEvent e) {
if (!(e.getEntity() instanceof Player)) {
return;
}
Player damaged = (Player) e.getEntity();
if (e.getDamager() instanceof Arrow) {
Arrow a = (Arrow) e.getDamager();
if (a.getShooter() instanceof Player) {
Player damager = (Player) a.getShooter();
lastDamage.put(damaged.getUniqueId(), damager.getUniqueId());
lastDamageCause.put(damaged.getUniqueId(), Cause.ARROW);
}
} else if (e.getDamager() instanceof Player) {
Player damager = (Player) e.getDamager();
lastDamage.put(damaged.getUniqueId(), damager.getUniqueId());
lastDamageCause.put(damaged.getUniqueId(), Cause.ATTACK);
}
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
Player p = e.getEntity();
if (e.getDeathMessage().contains("fell out of the world")) {
if (lastDamage.containsKey(p.getUniqueId())) {
Player killer = Bukkit.getPlayer(lastDamage.get(p.getUniqueId()));
Cause cause = lastDamageCause.get(p.getUniqueId());
switch (cause) {
case ATTACK:
//Do whatever you want
break;
case ARROW:
//Do whatever you want
break;
default:
break;
}
}
}
}
如果您只想检查 Y 高度,请使用PlayerMoveEvent
不要忘记在播放器与服务器断开连接后删除哈希映射中的值,以避免内存泄漏。