Implement logging for environmental (non-entity) kills, such as suffocation. Adds #80

This change adds a new config option, logEnvironmentalKills.  When set to true,
Logblock will record entity deaths not directly caused by another entity.
(for example, suffocation, or burning to death)
This commit is contained in:
Philip Cass
2013-11-13 14:28:42 +00:00
parent ab53755eaf
commit fa9a86a3b9
3 changed files with 36 additions and 10 deletions

View File

@ -160,9 +160,9 @@ public class Consumer extends TimerTask
/**
* @param killer
* Can' be null
* Can't be null
* @param victim
* Can' be null
* Can't be null
*/
public void queueKill(Entity killer, Entity victim) {
if (killer == null || victim == null)
@ -173,6 +173,19 @@ public class Consumer extends TimerTask
queueKill(victim.getLocation(), entityName(killer), entityName(victim), weapon);
}
/**
* This form should only be used when the killer is not an entity e.g. for fall or suffocation damage
* @param killer
* Can't be null
* @param victim
* Can't be null
*/
public void queueKill(String killer, Entity victim) {
if (killer == null || victim == null)
return;
queueKill(victim.getLocation(), killer, entityName(victim), 0);
}
/**
* @param world
* World the victim was inside.
@ -539,7 +552,7 @@ public class Consumer extends TimerTask
@Override
public String[] getInserts() {
return new String[]{"INSERT INTO `" + getWorldConfig(loc.getWorld()).table + "-kills` (date, killer, victim, weapon, x, y, z) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(killer) + ", " + playerID(victim) + ", " + weapon + ", " + loc.getBlockX() + ", " + loc.getBlockY() + ", " + loc.getBlockZ() + ");"};
return new String[]{"INSERT INTO `" + getWorldConfig(loc.getWorld()).table + "-kills` (date, killer, victim, weapon, x, y, z) VALUES (FROM_UNIXTIME(" + date + "), " + playerID(killer) + ", " + playerID(victim) + ", " + weapon + ", " + loc.getBlockX() + ", " + (loc.getBlockY() < 0 ? 0 : loc.getBlockY()) + ", " + loc.getBlockZ() + ");"};
}
@Override

View File

@ -46,6 +46,7 @@ public class Config
public static Set<String> ignoredChat;
public static SimpleDateFormat formatter;
public static boolean safetyIdCheck;
public static boolean logEnvironmentalKills;
public static enum LogKillsLevel
{
@ -82,6 +83,7 @@ public class Config
def.put("clearlog.autoClearLogDelay", "6h");
def.put("logging.logCreeperExplosionsAsPlayerWhoTriggeredThese", false);
def.put("logging.logKillsLevel", "PLAYERS");
def.put("logging.logEnvironmentalKills", false);
def.put("logging.logPlayerInfo", false);
def.put("logging.hiddenPlayers", new ArrayList<String>());
def.put("logging.hiddenBlocks", Arrays.asList(0));
@ -149,6 +151,7 @@ public class Config
} catch (final IllegalArgumentException ex) {
throw new DataFormatException("logging.logKillsLevel doesn't appear to be a valid log level. Allowed are 'PLAYERS', 'MONSTERS' and 'ANIMALS'");
}
logEnvironmentalKills = config.getBoolean("logging.logEnvironmentalKills", false);
hiddenPlayers = new HashSet<String>();
for (final String playerName : config.getStringList("logging.hiddenPlayers"))
hiddenPlayers.add(playerName.toLowerCase().trim());

View File

@ -2,6 +2,7 @@ package de.diddiz.LogBlock.listeners;
import static de.diddiz.LogBlock.config.Config.isLogging;
import static de.diddiz.LogBlock.config.Config.logKillsLevel;
import static de.diddiz.LogBlock.config.Config.logEnvironmentalKills;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
@ -15,6 +16,7 @@ import de.diddiz.LogBlock.LogBlock;
import de.diddiz.LogBlock.Logging;
import de.diddiz.LogBlock.config.Config.LogKillsLevel;
public class KillLogging extends LoggingListener
{
@ -26,14 +28,22 @@ public class KillLogging extends LoggingListener
public void onEntityDeath(EntityDeathEvent deathEvent) {
EntityDamageEvent event = deathEvent.getEntity().getLastDamageCause();
// For a death event, there should always be a damage event and it should not be cancelled. Check anyway.
if (event!= null && event.isCancelled() == false && isLogging(event.getEntity().getWorld(), Logging.KILL) && event instanceof EntityDamageByEntityEvent && event.getEntity() instanceof LivingEntity) {
if (event!= null && event.isCancelled() == false && isLogging(event.getEntity().getWorld(), Logging.KILL) && event.getEntity() instanceof LivingEntity) {
final LivingEntity victim = (LivingEntity)event.getEntity();
final Entity killer = ((EntityDamageByEntityEvent)event).getDamager();
if (logKillsLevel == LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player))
return;
else if (logKillsLevel == LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster))
return;
consumer.queueKill(killer, victim);
if (event instanceof EntityDamageByEntityEvent) {
final Entity killer = ((EntityDamageByEntityEvent)event).getDamager();
if (logKillsLevel == LogKillsLevel.PLAYERS && !(victim instanceof Player && killer instanceof Player))
return;
else if (logKillsLevel == LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster) && killer instanceof Player || killer instanceof Monster))
return;
consumer.queueKill(killer, victim);
} else if (logEnvironmentalKills) {
if (logKillsLevel == LogKillsLevel.PLAYERS && !(victim instanceof Player))
return;
else if (logKillsLevel == LogKillsLevel.MONSTERS && !((victim instanceof Player || victim instanceof Monster)))
return;
consumer.queueKill(event.getCause().toString(),victim);
}
}
}
}