feat: add AFK Player kill message
This commit is contained in:
parent
0dc4c3cb80
commit
950fc6ea01
7 changed files with 71 additions and 46 deletions
|
@ -1,18 +1,21 @@
|
||||||
package de.cliffbreak.varo.events;
|
package de.cliffbreak.varo.events;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
public class PlayerInteractNPCEvent extends Event {
|
public class PlayerInteractNPCEvent extends Event {
|
||||||
private static final HandlerList handlers = new HandlerList();
|
private static final HandlerList handlers = new HandlerList();
|
||||||
private final Type type;
|
private final Type type;
|
||||||
|
private final Player damager;
|
||||||
private final int id;
|
private final int id;
|
||||||
private final double damage;
|
private final double damage;
|
||||||
private final boolean isCritical;
|
private final boolean isCritical;
|
||||||
|
|
||||||
public PlayerInteractNPCEvent(Type type, int id, double damage, boolean isCritical) {
|
public PlayerInteractNPCEvent(Type type, Player damager, int id, double damage, boolean isCritical) {
|
||||||
super(true);
|
super(true);
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
this.damager = damager;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.damage = damage;
|
this.damage = damage;
|
||||||
this.isCritical = isCritical;
|
this.isCritical = isCritical;
|
||||||
|
@ -25,6 +28,13 @@ public class PlayerInteractNPCEvent extends Event {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Player who did the Damage
|
||||||
|
*/
|
||||||
|
public Player getDamager() {
|
||||||
|
return damager;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return EntityId of the Event
|
* @return EntityId of the Event
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -30,78 +30,86 @@ public class PlayerDeathListener implements Listener {
|
||||||
final EntityDamageEvent damageCause = e.getEntity().getLastDamageCause();
|
final EntityDamageEvent damageCause = e.getEntity().getLastDamageCause();
|
||||||
final Player killer = e.getEntity().getKiller();
|
final Player killer = e.getEntity().getKiller();
|
||||||
if (killer != null) {
|
if (killer != null) {
|
||||||
System.out.println(killer.getName());
|
|
||||||
this.plugin.getDatabase().addKill(killer.getUniqueId().toString().replace("-", ""),
|
this.plugin.getDatabase().addKill(killer.getUniqueId().toString().replace("-", ""),
|
||||||
e.getEntity().getUniqueId().toString().replace("-", ""));
|
e.getEntity().getUniqueId().toString().replace("-", ""));
|
||||||
} else {
|
|
||||||
System.out.println("No killer");
|
|
||||||
}
|
}
|
||||||
System.out.println(damageCause.getCause());
|
System.out.println(damageCause.getCause());
|
||||||
switch (damageCause.getCause()) {
|
switch (damageCause.getCause()) {
|
||||||
case BLOCK_EXPLOSION:
|
case BLOCK_EXPLOSION:
|
||||||
// TNT
|
// TNT
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.BLOCK_EXPLOSION));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.BLOCK_EXPLOSION));
|
||||||
break;
|
break;
|
||||||
case CONTACT:
|
case CONTACT:
|
||||||
// Cactus
|
// Cactus
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.CONTACT));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.CONTACT));
|
||||||
break;
|
break;
|
||||||
case DROWNING:
|
case DROWNING:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.DROWNING));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.DROWNING));
|
||||||
break;
|
break;
|
||||||
case ENTITY_EXPLOSION:
|
case ENTITY_EXPLOSION:
|
||||||
// Creeper
|
// Creeper
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.ENTITY_EXPLOSION));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.ENTITY_EXPLOSION));
|
||||||
break;
|
break;
|
||||||
case ENTITY_ATTACK:
|
case ENTITY_ATTACK:
|
||||||
case ENTITY_SWEEP_ATTACK:
|
case ENTITY_SWEEP_ATTACK:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.ENTITY_ATTACK));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.ENTITY_ATTACK));
|
||||||
break;
|
break;
|
||||||
case FALL:
|
case FALL:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.FALL));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.FALL));
|
||||||
break;
|
break;
|
||||||
case FALLING_BLOCK:
|
case FALLING_BLOCK:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.FALLING_BLOCK));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.FALLING_BLOCK));
|
||||||
break;
|
break;
|
||||||
case FIRE:
|
case FIRE:
|
||||||
case FIRE_TICK:
|
case FIRE_TICK:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.FIRE));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.FIRE));
|
||||||
break;
|
break;
|
||||||
case HOT_FLOOR:
|
case HOT_FLOOR:
|
||||||
// Magma Block
|
// Magma Block
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.HOT_FLOOR));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.HOT_FLOOR));
|
||||||
break;
|
break;
|
||||||
case LAVA:
|
case LAVA:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.LAVA));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.LAVA));
|
||||||
break;
|
break;
|
||||||
case LIGHTNING:
|
case LIGHTNING:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.LIGHTNING));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.LIGHTNING));
|
||||||
break;
|
break;
|
||||||
case MAGIC:
|
case MAGIC:
|
||||||
// Potion (should be impossible)
|
// Potion (should be impossible)
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.MAGIC));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.MAGIC));
|
||||||
break;
|
break;
|
||||||
case POISON:
|
case POISON:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.POISON));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.POISON));
|
||||||
break;
|
break;
|
||||||
case PROJECTILE:
|
case PROJECTILE:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.PROJECTILE));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.PROJECTILE));
|
||||||
break;
|
break;
|
||||||
case STARVATION:
|
case STARVATION:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.STARVATION));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.STARVATION));
|
||||||
break;
|
break;
|
||||||
case SUFFOCATION:
|
case SUFFOCATION:
|
||||||
// Border damage or sand/gravel
|
// Border damage or sand/gravel
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.SUFFOCATION));
|
e.setDeathMessage(
|
||||||
|
this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.SUFFOCATION));
|
||||||
break;
|
break;
|
||||||
case THORNS:
|
case THORNS:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.THORNS));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.THORNS));
|
||||||
break;
|
break;
|
||||||
case VOID:
|
case VOID:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.VOID));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.VOID));
|
||||||
break;
|
break;
|
||||||
case WITHER:
|
case WITHER:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.WITHER));
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.WITHER));
|
||||||
break;
|
break;
|
||||||
case CRAMMING: // Very rare so handle as default death
|
case CRAMMING: // Very rare so handle as default death
|
||||||
case CUSTOM: // No custom damage provider so impossible
|
case CUSTOM: // No custom damage provider so impossible
|
||||||
|
@ -111,7 +119,7 @@ public class PlayerDeathListener implements Listener {
|
||||||
case MELTING: // No snowman so impossible
|
case MELTING: // No snowman so impossible
|
||||||
case SUICIDE: // No access to /kill command
|
case SUICIDE: // No access to /kill command
|
||||||
default:
|
default:
|
||||||
e.setDeathMessage(this.getDeathMessage(e.getEntity(), killer, DamageCause.CUSTOM)); // CUSTOM == default
|
e.setDeathMessage(this.plugin.getMessageUtils().getDeathMessage(e.getEntity(), killer, DamageCause.CUSTOM)); // CUSTOM == default
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,17 +129,7 @@ public class PlayerDeathListener implements Listener {
|
||||||
|
|
||||||
this.plugin.getBorderManager().addPlayerDeath();
|
this.plugin.getBorderManager().addPlayerDeath();
|
||||||
this.plugin.getBanUtils().addBan(e.getEntity().getUniqueId());
|
this.plugin.getBanUtils().addBan(e.getEntity().getUniqueId());
|
||||||
this.plugin.getDiscordBot().broadcastMessage("Der Spieler <@!"
|
this.plugin.getDiscordBot().broadcastMessage("Der Spieler <@!" + this.plugin.getTeamManager()
|
||||||
+ this.plugin.getTeamManager().getDiscordIdByPlayer(e.getEntity()) + "> ist gestorben.");
|
.getDiscordIdByUuid(e.getEntity().getUniqueId().toString().replace("-", "")) + "> ist gestorben.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getDeathMessage(final Player victim, final Player killer, final DamageCause cause) {
|
|
||||||
if (killer == null) {
|
|
||||||
return this.plugin.getLangUtils().get("Death." + cause.toString()).replace("%player%", victim.getName());
|
|
||||||
} else {
|
|
||||||
return this.plugin.getLangUtils().get("Death." + cause.toString() + "killer")
|
|
||||||
.replace("%player%", victim.getName()).replace("%killer%", killer.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@ public class PlayerInteractNPCListener implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onEntityDamageByEntity(final PlayerInteractNPCEvent e) {
|
public void onEntityDamageByEntity(final PlayerInteractNPCEvent e) {
|
||||||
if (e.getType().equals(Type.ATTACK)) {
|
if (e.getType().equals(Type.ATTACK)) {
|
||||||
this.plugin.getNPCManager().addDamage(e.getId(), e.getDamage(), e.getIsCritical());
|
this.plugin.getNPCManager().addDamage(e.getDamager(), e.getId(), e.getDamage(), e.getIsCritical());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
@ -138,7 +139,7 @@ public class NPCManager {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDamage(final int id, final double damage, final boolean isCritical) {
|
public void addDamage(Player damager, final int id, final double damage, final boolean isCritical) {
|
||||||
for (final EntityPlayer npc : this.npcs) {
|
for (final EntityPlayer npc : this.npcs) {
|
||||||
if (npc.getId() == id) {
|
if (npc.getId() == id) {
|
||||||
npc.setHealth((float) (npc.getHealth() - damage));
|
npc.setHealth((float) (npc.getHealth() - damage));
|
||||||
|
@ -182,8 +183,13 @@ public class NPCManager {
|
||||||
}.runTask(this.plugin); // Run Task in sync to be thread safe
|
}.runTask(this.plugin); // Run Task in sync to be thread safe
|
||||||
|
|
||||||
this.plugin.getBanUtils().addBan(npc.getUniqueID());
|
this.plugin.getBanUtils().addBan(npc.getUniqueID());
|
||||||
// TODO:
|
|
||||||
Bukkit.broadcastMessage("TODO: Player(" + "??" + ") killed AFK Player (" + npc.getName() + ")");
|
Bukkit.broadcastMessage(this.plugin.getMessageUtils()
|
||||||
|
.getDeathMessage(npc.getBukkitEntity().getPlayer(), damager, DamageCause.CUSTOM));
|
||||||
|
this.plugin.getDatabase().addKill(damager.getUniqueId().toString().replace("-", ""),
|
||||||
|
npc.getUniqueID().toString().replace("-", ""));
|
||||||
|
this.plugin.getDiscordBot().broadcastMessage("Der Spieler <@!" + this.plugin.getTeamManager()
|
||||||
|
.getDiscordIdByUuid(npc.getUniqueID().toString().replace("-", "")) + "> ist gestorben.");
|
||||||
|
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -109,13 +109,13 @@ public class TeamManager {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDiscordIdByPlayer(final Player player) {
|
public String getDiscordIdByUuid(final String uuid) {
|
||||||
final JSONArray jsonTeams = config.getArray("teams");
|
final JSONArray jsonTeams = config.getArray("teams");
|
||||||
for (final Object jsonRawTeam : jsonTeams) {
|
for (final Object jsonRawTeam : jsonTeams) {
|
||||||
final JSONObject jsonTeam = (JSONObject) jsonRawTeam;
|
final JSONObject jsonTeam = (JSONObject) jsonRawTeam;
|
||||||
for (final Object rawPlayer : ((JSONArray) jsonTeam.get("players"))) {
|
for (final Object rawPlayer : ((JSONArray) jsonTeam.get("players"))) {
|
||||||
final JSONObject jsonPlayer = (JSONObject) rawPlayer;
|
final JSONObject jsonPlayer = (JSONObject) rawPlayer;
|
||||||
if (jsonPlayer.get("uuid").equals(player.getUniqueId().toString().replace("-", ""))) {
|
if (jsonPlayer.get("uuid").equals(uuid)) {
|
||||||
return jsonPlayer.get("discord").toString();
|
return jsonPlayer.get("discord").toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ package de.cliffbreak.varo.utils;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
import org.bukkit.scoreboard.Team;
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
import de.cliffbreak.varo.Varo;
|
import de.cliffbreak.varo.Varo;
|
||||||
|
@ -58,4 +60,13 @@ public class MessageUtils {
|
||||||
+ String.format("%02d", calendar.get(Calendar.SECOND))).create()));
|
+ String.format("%02d", calendar.get(Calendar.SECOND))).create()));
|
||||||
return component;
|
return component;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDeathMessage(final Player victim, final Player killer, final DamageCause cause) {
|
||||||
|
if (killer == null) {
|
||||||
|
return this.plugin.getLangUtils().get("Death." + cause.toString()).replace("%player%", victim.getName());
|
||||||
|
} else {
|
||||||
|
return this.plugin.getLangUtils().get("Death." + cause.toString() + "killer")
|
||||||
|
.replace("%player%", victim.getName()).replace("%killer%", killer.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -43,7 +43,7 @@ public class PacketReader {
|
||||||
protected void decode(final ChannelHandlerContext arg0, final Packet<?> packet, final List<Object> arg2)
|
protected void decode(final ChannelHandlerContext arg0, final Packet<?> packet, final List<Object> arg2)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
arg2.add(packet);
|
arg2.add(packet);
|
||||||
readPacket(packet);
|
readPacket(player, packet);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public class PacketReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://wiki.vg/Protocol#Interact_Entity
|
// https://wiki.vg/Protocol#Interact_Entity
|
||||||
public void readPacket(final Packet<?> packet) {
|
public void readPacket(final Player player, final Packet<?> packet) {
|
||||||
if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) {
|
if (packet.getClass().getSimpleName().equalsIgnoreCase("PacketPlayInUseEntity")) {
|
||||||
|
|
||||||
final int id = (int) getValue(packet, "a");
|
final int id = (int) getValue(packet, "a");
|
||||||
|
@ -65,8 +65,8 @@ public class PacketReader {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final Type type = Type.valueOf(getValue(packet, "action").toString());
|
final Type type = Type.valueOf(getValue(packet, "action").toString());
|
||||||
final PlayerInteractNPCEvent event = new PlayerInteractNPCEvent(type, id, calculateDamage(this.player),
|
final PlayerInteractNPCEvent event = new PlayerInteractNPCEvent(type, player, id,
|
||||||
isCriticalHit(this.player));
|
calculateDamage(this.player), isCriticalHit(this.player));
|
||||||
Bukkit.getServer().getPluginManager().callEvent(event);
|
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
// noop()
|
// noop()
|
||||||
|
|
Loading…
Reference in a new issue