Fix last damage-tick by entity attack being reset while dead, renamings.

This commit is contained in:
asofold 2013-01-26 00:08:17 +01:00
parent 53756f7145
commit 333cffd0d5
4 changed files with 23 additions and 32 deletions

View File

@ -79,7 +79,7 @@ public class FightData extends ACheckData {
public double reachVL; public double reachVL;
public double speedVL; public double speedVL;
public long damageTakenTick; public long damageTakenByEntityTick;
// Shared // Shared

View File

@ -92,6 +92,9 @@ public class FightListener extends CheckListener {
// Check for self hit exploits (mind that projectiles should be excluded) // Check for self hit exploits (mind that projectiles should be excluded)
if (damaged instanceof Player){ if (damaged instanceof Player){
final Player damagedPlayer = (Player) damaged; final Player damagedPlayer = (Player) damaged;
if (cc.debug && damagedPlayer.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
damagedPlayer.sendMessage("Attacked by " + player.getName() + ": inv=" + mcAccess.getInvulnerableTicks(damagedPlayer) + " ndt=" + damagedPlayer.getNoDamageTicks());
}
if (selfHit.isEnabled(player) && selfHit.check(player, damagedPlayer, data, cc)) if (selfHit.isEnabled(player) && selfHit.check(player, damagedPlayer, data, cc))
cancelled = true; cancelled = true;
} }
@ -99,7 +102,7 @@ public class FightListener extends CheckListener {
if (cc.cancelDead){ if (cc.cancelDead){
if (damaged.isDead()) cancelled = true; if (damaged.isDead()) cancelled = true;
// Only allow damaging others if taken damage this tick. // Only allow damaging others if taken damage this tick.
if (player.isDead() && data.damageTakenTick != TickTask.getTick()){ if (player.isDead() && data.damageTakenByEntityTick != TickTask.getTick()){
cancelled = true; cancelled = true;
} }
} }
@ -173,13 +176,22 @@ public class FightListener extends CheckListener {
* |_____|_| |_|\__|_|\__|\__, | |____/ \__,_|_| |_| |_|\__,_|\__, |\___| * |_____|_| |_|\__|_|\__|\__, | |____/ \__,_|_| |_| |_|\__,_|\__, |\___|
* |___/ |___/ * |___/ |___/
*/ */
// Filter some unwanted events right now.
final Entity damaged = event.getEntity();
final boolean damagedIsPlayer = damaged instanceof Player;
final boolean damagedIsDead = damaged.isDead();
if (damagedIsPlayer && !damagedIsDead) {
final Player player = (Player) event.getEntity();
if (godMode.isEnabled(player) && godMode.check(player))
// It requested to "cancel" the players invulnerability, so set his noDamageTicks to 0.
player.setNoDamageTicks(0);
}
// Attacking entities.
if (event instanceof EntityDamageByEntityEvent) { if (event instanceof EntityDamageByEntityEvent) {
final EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event; final EntityDamageByEntityEvent e = (EntityDamageByEntityEvent) event;
final Entity damaged = e.getEntity(); if (damagedIsPlayer && !damagedIsDead){
if (damaged instanceof Player){
// TODO: check once more when to set this (!) in terms of order. // TODO: check once more when to set this (!) in terms of order.
FightData.getData((Player) damaged).damageTakenTick = TickTask.getTick(); FightData.getData((Player) damaged).damageTakenByEntityTick = TickTask.getTick();
} }
final Entity damager = e.getDamager(); final Entity damager = e.getDamager();
if (damager instanceof Player){ if (damager instanceof Player){
@ -191,32 +203,6 @@ public class FightListener extends CheckListener {
} }
} }
/**
* We listen to EntityDamage events (again) for obvious reasons.
*
* @param event
* the event
*/
@EventHandler(
ignoreCancelled = true, priority = EventPriority.LOW)
public void onEntityDamage_(final EntityDamageEvent event) {
/*
* _____ _ _ _ ____
* | ____|_ __ | |_(_) |_ _ _ | _ \ __ _ _ __ ___ __ _ __ _ ___
* | _| | '_ \| __| | __| | | | | | | |/ _` | '_ ` _ \ / _` |/ _` |/ _ \
* | |___| | | | |_| | |_| |_| | | |_| | (_| | | | | | | (_| | (_| | __/
* |_____|_| |_|\__|_|\__|\__, | |____/ \__,_|_| |_| |_|\__,_|\__, |\___|
* |___/ |___/
*/
// Filter unwanted events right here.
if (event.getEntity() instanceof Player && !event.getEntity().isDead()) {
final Player player = (Player) event.getEntity();
if (godMode.isEnabled(player) && godMode.check(player))
// It requested to "cancel" the players invulnerability, so set his noDamageTicks to 0.
player.setNoDamageTicks(0);
}
}
/** /**
* We listen to death events to prevent a very specific method of doing godmode. * We listen to death events to prevent a very specific method of doing godmode.
* *

View File

@ -93,6 +93,7 @@ public class GodMode extends Check {
* the player * the player
*/ */
public void death(final Player player) { public void death(final Player player) {
// TODO: Is this still relevant ?
// First check if the player is really dead (e.g. another plugin could have just fired an artificial event). // First check if the player is really dead (e.g. another plugin could have just fired an artificial event).
if (player.getHealth() <= 0 && player.isDead()) if (player.getHealth() <= 0 && player.isDead())
try { try {

View File

@ -7,6 +7,7 @@ import org.bukkit.entity.Vehicle;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import fr.neatmonster.nocheatplus.checks.moving.MovingConfig;
import fr.neatmonster.nocheatplus.checks.moving.MovingData; import fr.neatmonster.nocheatplus.checks.moving.MovingData;
import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.logging.LogUtil;
@ -238,5 +239,8 @@ public class CheckUtils {
// Somewhat check against tp showing something wrong (< 1.0). // Somewhat check against tp showing something wrong (< 1.0).
vehicle.setPassenger(player); vehicle.setPassenger(player);
} }
if (MovingConfig.getConfig(player).debug){
System.out.println(player.getName() + " vehicle set back: " + location);
}
} }
} }