mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2025-01-02 22:07:50 +01:00
No longer check arrows and other projectiles, even if aimed at other
players - More verbose data for "playerinfo" command - fix potential dupe bug
This commit is contained in:
parent
8dbfc3893c
commit
2f5a726494
2
pom.xml
2
pom.xml
@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>cc.co.evenprime.bukkit</groupId>
|
<groupId>cc.co.evenprime.bukkit</groupId>
|
||||||
<artifactId>NoCheat</artifactId>
|
<artifactId>NoCheat</artifactId>
|
||||||
<version>2.20</version>
|
<version>2.20a</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>NoCheat</name>
|
<name>NoCheat</name>
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -41,6 +41,8 @@ public class FlyingCheck extends MovingCheck {
|
|||||||
final double zDistance = to.z - from.z;
|
final double zDistance = to.z - from.z;
|
||||||
final double horizontalDistance = Math.sqrt((xDistance * xDistance + zDistance * zDistance));
|
final double horizontalDistance = Math.sqrt((xDistance * xDistance + zDistance * zDistance));
|
||||||
|
|
||||||
|
double resultHoriz = 0;
|
||||||
|
double resultVert = 0;
|
||||||
double result = 0;
|
double result = 0;
|
||||||
PreciseLocation newToLocation = null;
|
PreciseLocation newToLocation = null;
|
||||||
|
|
||||||
@ -50,32 +52,42 @@ public class FlyingCheck extends MovingCheck {
|
|||||||
|
|
||||||
speedLimitHorizontal *= player.getSpeedAmplifier();
|
speedLimitHorizontal *= player.getSpeedAmplifier();
|
||||||
|
|
||||||
result += Math.max(0.0D, horizontalDistance - data.horizFreedom - speedLimitHorizontal);
|
resultHoriz = Math.max(0.0D, horizontalDistance - data.horizFreedom - speedLimitHorizontal);
|
||||||
|
|
||||||
boolean sprinting = player.isSprinting();
|
boolean sprinting = player.isSprinting();
|
||||||
|
|
||||||
data.bunnyhopdelay--;
|
data.bunnyhopdelay--;
|
||||||
|
|
||||||
// Did he go too far?
|
// Did he go too far?
|
||||||
if(result > 0 && sprinting) {
|
if(resultHoriz > 0 && sprinting) {
|
||||||
|
|
||||||
// Try to treat it as a the "bunnyhop" problem
|
// Try to treat it as a the "bunnyhop" problem
|
||||||
if(data.bunnyhopdelay <= 0 && result < 0.4D) {
|
if(data.bunnyhopdelay <= 0 && resultHoriz < 0.4D) {
|
||||||
data.bunnyhopdelay = 3;
|
data.bunnyhopdelay = 3;
|
||||||
result = 0;
|
resultHoriz = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resultHoriz *= 100;
|
||||||
|
|
||||||
// super simple, just check distance compared to max distance
|
// super simple, just check distance compared to max distance
|
||||||
result += Math.max(0.0D, yDistance - data.vertFreedom - ccmoving.flyingSpeedLimitVertical);
|
resultVert = Math.max(0.0D, yDistance - data.vertFreedom - ccmoving.flyingSpeedLimitVertical) * 100;
|
||||||
result = result * 100;
|
|
||||||
|
result = resultHoriz + resultVert;
|
||||||
|
|
||||||
if(result > 0) {
|
if(result > 0) {
|
||||||
|
|
||||||
// Increment violation counter
|
// Increment violation counter
|
||||||
data.runflyVL += result;
|
data.runflyVL += result;
|
||||||
data.runflyTotalVL += result;
|
if(resultHoriz > 0) {
|
||||||
data.runflyFailed++;
|
data.runflyRunningTotalVL += resultHoriz;
|
||||||
|
data.runflyRunningFailed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resultVert > 0) {
|
||||||
|
data.runflyFlyingTotalVL += resultVert;
|
||||||
|
data.runflyFlyingFailed++;
|
||||||
|
}
|
||||||
|
|
||||||
boolean cancel = executeActions(player, ccmoving.flyingActions.getActions(data.runflyVL));
|
boolean cancel = executeActions(player, ccmoving.flyingActions.getActions(data.runflyVL));
|
||||||
|
|
||||||
|
@ -77,8 +77,20 @@ public class RunningCheck extends MovingCheck {
|
|||||||
|
|
||||||
// Increment violation counter
|
// Increment violation counter
|
||||||
data.runflyVL += result;
|
data.runflyVL += result;
|
||||||
data.runflyTotalVL += result;
|
|
||||||
data.runflyFailed++;
|
if(data.checknamesuffix.equals("sneaking")) {
|
||||||
|
data.runflySneakingTotalVL += result;
|
||||||
|
data.runflySneakingFailed++;
|
||||||
|
} else if(data.checknamesuffix.equals("swimming")) {
|
||||||
|
data.runflySwimmingTotalVL += result;
|
||||||
|
data.runflySwimmingFailed++;
|
||||||
|
} else if(data.checknamesuffix.equals("vertical")) {
|
||||||
|
data.runflyFlyingTotalVL += result;
|
||||||
|
data.runflyFlyingFailed++;
|
||||||
|
} else {
|
||||||
|
data.runflyRunningTotalVL += result;
|
||||||
|
data.runflyRunningFailed++;
|
||||||
|
}
|
||||||
|
|
||||||
boolean cancel = executeActions(player, cc.actions.getActions(data.runflyVL));
|
boolean cancel = executeActions(player, cc.actions.getActions(data.runflyVL));
|
||||||
|
|
||||||
|
@ -30,11 +30,14 @@ public abstract class Configuration {
|
|||||||
|
|
||||||
private final static OptionNode DEBUG = new OptionNode("debug", ROOT, DataType.PARENT);
|
private final static OptionNode DEBUG = new OptionNode("debug", ROOT, DataType.PARENT);
|
||||||
public final static OptionNode DEBUG_SHOWACTIVECHECKS = new OptionNode("showactivechecks", DEBUG, DataType.BOOLEAN);
|
public final static OptionNode DEBUG_SHOWACTIVECHECKS = new OptionNode("showactivechecks", DEBUG, DataType.BOOLEAN);
|
||||||
public static final OptionNode DEBUG_COMPATIBILITY = new OptionNode("compatibility", DEBUG, DataType.BOOLEAN);
|
public final static OptionNode DEBUG_COMPATIBILITY = new OptionNode("compatibility", DEBUG, DataType.BOOLEAN);
|
||||||
|
|
||||||
private final static OptionNode EMERGENCYFIX = new OptionNode("emergencyfix", ROOT, DataType.PARENT);
|
private final static OptionNode EMERGENCYFIX = new OptionNode("emergencyfix", ROOT, DataType.PARENT);
|
||||||
public final static OptionNode EMERGENCYFIX_ENFORCEPLAYERDEATH = new OptionNode("enforceplayerdeath", EMERGENCYFIX, DataType.BOOLEAN);
|
public final static OptionNode EMERGENCYFIX_ENFORCEPLAYERDEATH = new OptionNode("enforceplayerdeath", EMERGENCYFIX, DataType.BOOLEAN);
|
||||||
|
|
||||||
|
public final static OptionNode INVENTORY = new OptionNode("inventory", ROOT, DataType.PARENT);
|
||||||
|
public final static OptionNode INVENTORY_CLOSEOBEFORETELEPORTS = new OptionNode("closebeforeteleports", INVENTORY, DataType.BOOLEAN);
|
||||||
|
|
||||||
private final static OptionNode MOVING = new OptionNode("moving", ROOT, DataType.PARENT);
|
private final static OptionNode MOVING = new OptionNode("moving", ROOT, DataType.PARENT);
|
||||||
public final static OptionNode MOVING_CHECK = new OptionNode("check", MOVING, DataType.BOOLEAN);
|
public final static OptionNode MOVING_CHECK = new OptionNode("check", MOVING, DataType.BOOLEAN);
|
||||||
public final static OptionNode MOVING_IDENTIFYCREATIVEMODE = new OptionNode("identifycreativemode", MOVING, DataType.BOOLEAN);
|
public final static OptionNode MOVING_IDENTIFYCREATIVEMODE = new OptionNode("identifycreativemode", MOVING, DataType.BOOLEAN);
|
||||||
@ -87,10 +90,10 @@ public abstract class Configuration {
|
|||||||
public final static OptionNode BLOCKPLACE_REACH_ACTIONS = new OptionNode("actions", BLOCKPLACE_REACH, DataType.ACTIONLIST);
|
public final static OptionNode BLOCKPLACE_REACH_ACTIONS = new OptionNode("actions", BLOCKPLACE_REACH, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode BLOCKPLACE_DIRECTION = new OptionNode("direction", BLOCKPLACE, DataType.PARENT);
|
private final static OptionNode BLOCKPLACE_DIRECTION = new OptionNode("direction", BLOCKPLACE, DataType.PARENT);
|
||||||
public static final OptionNode BLOCKPLACE_DIRECTION_CHECK = new OptionNode("check", BLOCKPLACE_DIRECTION, DataType.BOOLEAN); ;
|
public final static OptionNode BLOCKPLACE_DIRECTION_CHECK = new OptionNode("check", BLOCKPLACE_DIRECTION, DataType.BOOLEAN); ;
|
||||||
public static final OptionNode BLOCKPLACE_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKPLACE_DIRECTION, DataType.INTEGER);
|
public final static OptionNode BLOCKPLACE_DIRECTION_PENALTYTIME = new OptionNode("penaltytime", BLOCKPLACE_DIRECTION, DataType.INTEGER);
|
||||||
public final static OptionNode BLOCKPLACE_DIRECTION_PRECISION = new OptionNode("precision", BLOCKPLACE_DIRECTION, DataType.INTEGER);
|
public final static OptionNode BLOCKPLACE_DIRECTION_PRECISION = new OptionNode("precision", BLOCKPLACE_DIRECTION, DataType.INTEGER);
|
||||||
public static final OptionNode BLOCKPLACE_DIRECTION_ACTIONS = new OptionNode("actions", BLOCKPLACE_DIRECTION, DataType.ACTIONLIST);
|
public final static OptionNode BLOCKPLACE_DIRECTION_ACTIONS = new OptionNode("actions", BLOCKPLACE_DIRECTION, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode CHAT = new OptionNode("chat", ROOT, DataType.PARENT);
|
private final static OptionNode CHAT = new OptionNode("chat", ROOT, DataType.PARENT);
|
||||||
public final static OptionNode CHAT_CHECK = new OptionNode("check", CHAT, DataType.BOOLEAN);
|
public final static OptionNode CHAT_CHECK = new OptionNode("check", CHAT, DataType.BOOLEAN);
|
||||||
@ -103,8 +106,8 @@ public abstract class Configuration {
|
|||||||
public final static OptionNode CHAT_SPAM_ACTIONS = new OptionNode("actions", CHAT_SPAM, DataType.ACTIONLIST);
|
public final static OptionNode CHAT_SPAM_ACTIONS = new OptionNode("actions", CHAT_SPAM, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode CHAT_EMPTY = new OptionNode("empty", CHAT, DataType.PARENT);
|
private final static OptionNode CHAT_EMPTY = new OptionNode("empty", CHAT, DataType.PARENT);
|
||||||
public static final OptionNode CHAT_EMPTY_CHECK = new OptionNode("check", CHAT_EMPTY, DataType.BOOLEAN);
|
public final static OptionNode CHAT_EMPTY_CHECK = new OptionNode("check", CHAT_EMPTY, DataType.BOOLEAN);
|
||||||
public static final OptionNode CHAT_EMPTY_ACTIONS = new OptionNode("actions", CHAT_EMPTY, DataType.ACTIONLIST);
|
public final static OptionNode CHAT_EMPTY_ACTIONS = new OptionNode("actions", CHAT_EMPTY, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode FIGHT = new OptionNode("fight", ROOT, DataType.PARENT);
|
private final static OptionNode FIGHT = new OptionNode("fight", ROOT, DataType.PARENT);
|
||||||
public final static OptionNode FIGHT_CHECK = new OptionNode("check", FIGHT, DataType.BOOLEAN);
|
public final static OptionNode FIGHT_CHECK = new OptionNode("check", FIGHT, DataType.BOOLEAN);
|
||||||
@ -116,12 +119,12 @@ public abstract class Configuration {
|
|||||||
public final static OptionNode FIGHT_DIRECTION_ACTIONS = new OptionNode("actions", FIGHT_DIRECTION, DataType.ACTIONLIST);
|
public final static OptionNode FIGHT_DIRECTION_ACTIONS = new OptionNode("actions", FIGHT_DIRECTION, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode FIGHT_SELFHIT = new OptionNode("selfhit", FIGHT, DataType.PARENT);
|
private final static OptionNode FIGHT_SELFHIT = new OptionNode("selfhit", FIGHT, DataType.PARENT);
|
||||||
public static final OptionNode FIGHT_SELFHIT_CHECK = new OptionNode("check", FIGHT_SELFHIT, DataType.BOOLEAN);
|
public final static OptionNode FIGHT_SELFHIT_CHECK = new OptionNode("check", FIGHT_SELFHIT, DataType.BOOLEAN);
|
||||||
public final static OptionNode FIGHT_SELFHIT_ACTIONS = new OptionNode("actions", FIGHT_SELFHIT, DataType.ACTIONLIST);
|
public final static OptionNode FIGHT_SELFHIT_ACTIONS = new OptionNode("actions", FIGHT_SELFHIT, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final static OptionNode FIGHT_NOSWING = new OptionNode("noswing", FIGHT, DataType.PARENT);
|
private final static OptionNode FIGHT_NOSWING = new OptionNode("noswing", FIGHT, DataType.PARENT);
|
||||||
public static final OptionNode FIGHT_NOSWING_CHECK = new OptionNode("check", FIGHT_NOSWING, DataType.BOOLEAN);
|
public final static OptionNode FIGHT_NOSWING_CHECK = new OptionNode("check", FIGHT_NOSWING, DataType.BOOLEAN);
|
||||||
public static final OptionNode FIGHT_NOSWING_ACTIONS = new OptionNode("actions", FIGHT_NOSWING, DataType.ACTIONLIST);
|
public final static OptionNode FIGHT_NOSWING_ACTIONS = new OptionNode("actions", FIGHT_NOSWING, DataType.ACTIONLIST);
|
||||||
|
|
||||||
private final Map<OptionNode, Object> values;
|
private final Map<OptionNode, Object> values;
|
||||||
private final Configuration defaults;
|
private final Configuration defaults;
|
||||||
|
@ -40,6 +40,11 @@ public class DefaultConfiguration extends Configuration {
|
|||||||
setValue(EMERGENCYFIX_ENFORCEPLAYERDEATH, true);
|
setValue(EMERGENCYFIX_ENFORCEPLAYERDEATH, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*** INVENTORY ***/
|
||||||
|
{
|
||||||
|
setValue(INVENTORY_CLOSEOBEFORETELEPORTS, true);
|
||||||
|
}
|
||||||
|
|
||||||
/*** MOVING ***/
|
/*** MOVING ***/
|
||||||
{
|
{
|
||||||
setValue(MOVING_CHECK, true);
|
setValue(MOVING_CHECK, true);
|
||||||
|
@ -29,6 +29,8 @@ public class Explainations {
|
|||||||
|
|
||||||
set(Configuration.EMERGENCYFIX_ENFORCEPLAYERDEATH, "Fix a bug that prevents people from really dying, causing them to not drop XP,\n and still being able to fight, place/destroy blocks etc. in an invulnerable state.");
|
set(Configuration.EMERGENCYFIX_ENFORCEPLAYERDEATH, "Fix a bug that prevents people from really dying, causing them to not drop XP,\n and still being able to fight, place/destroy blocks etc. in an invulnerable state.");
|
||||||
|
|
||||||
|
set(Configuration.INVENTORY_CLOSEOBEFORETELEPORTS, "Close inventory screens of players before they get teleported, preventing creation of real or fake duplicates.");
|
||||||
|
|
||||||
set(Configuration.MOVING_CHECK, "If true, do various checks on PlayerMove events.");
|
set(Configuration.MOVING_CHECK, "If true, do various checks on PlayerMove events.");
|
||||||
set(Configuration.MOVING_IDENTIFYCREATIVEMODE, "If true, NoCheat will automatically identify if players are in creative mode and will allow them to fly, avoid fall damage etc.");
|
set(Configuration.MOVING_IDENTIFYCREATIVEMODE, "If true, NoCheat will automatically identify if players are in creative mode and will allow them to fly, avoid fall damage etc.");
|
||||||
|
|
||||||
|
14
src/cc/co/evenprime/bukkit/nocheat/config/cache/CCInventory.java
vendored
Normal file
14
src/cc/co/evenprime/bukkit/nocheat/config/cache/CCInventory.java
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package cc.co.evenprime.bukkit.nocheat.config.cache;
|
||||||
|
|
||||||
|
import cc.co.evenprime.bukkit.nocheat.config.Configuration;
|
||||||
|
|
||||||
|
|
||||||
|
public class CCInventory {
|
||||||
|
|
||||||
|
public final boolean closebeforeteleports;
|
||||||
|
|
||||||
|
public CCInventory(Configuration data) {
|
||||||
|
|
||||||
|
closebeforeteleports = data.getBoolean(Configuration.INVENTORY_CLOSEOBEFORETELEPORTS);
|
||||||
|
}
|
||||||
|
}
|
@ -19,12 +19,11 @@ public class ConfigurationCache {
|
|||||||
public final CCDebug debug;
|
public final CCDebug debug;
|
||||||
public final CCFight fight;
|
public final CCFight fight;
|
||||||
public final boolean emergencyfix;
|
public final boolean emergencyfix;
|
||||||
|
public final CCInventory inventory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate a config cache and populate it with the data of a
|
* Instantiate a config cache and populate it with the data of a
|
||||||
* Config tree (and its parent tree)
|
* Config tree (and its parent tree)
|
||||||
*
|
|
||||||
* @param data
|
|
||||||
*/
|
*/
|
||||||
public ConfigurationCache(Configuration data, Logger worldSpecificFileLogger) {
|
public ConfigurationCache(Configuration data, Logger worldSpecificFileLogger) {
|
||||||
|
|
||||||
@ -35,6 +34,7 @@ public class ConfigurationCache {
|
|||||||
logging = new CCLogging(data, worldSpecificFileLogger);
|
logging = new CCLogging(data, worldSpecificFileLogger);
|
||||||
debug = new CCDebug(data);
|
debug = new CCDebug(data);
|
||||||
fight = new CCFight(data);
|
fight = new CCFight(data);
|
||||||
|
inventory = new CCInventory(data);
|
||||||
|
|
||||||
emergencyfix = data.getBoolean(Configuration.EMERGENCYFIX_ENFORCEPLAYERDEATH);
|
emergencyfix = data.getBoolean(Configuration.EMERGENCYFIX_ENFORCEPLAYERDEATH);
|
||||||
}
|
}
|
||||||
|
@ -21,12 +21,13 @@ public class FightData extends Data {
|
|||||||
|
|
||||||
public Entity damagee;
|
public Entity damagee;
|
||||||
public boolean armswung = true;
|
public boolean armswung = true;
|
||||||
|
public boolean skipNext = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void collectData(Map<String, Object> map) {
|
public void collectData(Map<String, Object> map) {
|
||||||
map.put("fight.direction.vl", (int)directionTotalVL);
|
map.put("fight.direction.vl", (int) directionTotalVL);
|
||||||
map.put("fight.selfhit.vl", (int)selfhitTotalVL);
|
map.put("fight.selfhit.vl", (int) selfhitTotalVL);
|
||||||
map.put("fight.noswing.vl", (int)noswingTotalVL);
|
map.put("fight.noswing.vl", (int) noswingTotalVL);
|
||||||
map.put("fight.direction.failed", directionFailed);
|
map.put("fight.direction.failed", directionFailed);
|
||||||
map.put("fight.selfhit.failed", selfhitFailed);
|
map.put("fight.selfhit.failed", selfhitFailed);
|
||||||
map.put("fight.noswing.failed", noswingFailed);
|
map.put("fight.noswing.failed", noswingFailed);
|
||||||
|
@ -8,8 +8,18 @@ import java.util.Map;
|
|||||||
public class MovingData extends Data {
|
public class MovingData extends Data {
|
||||||
|
|
||||||
public double runflyVL;
|
public double runflyVL;
|
||||||
public double runflyTotalVL;
|
|
||||||
public int runflyFailed;
|
public double runflyRunningTotalVL;
|
||||||
|
public int runflyRunningFailed;
|
||||||
|
|
||||||
|
public double runflyFlyingTotalVL;
|
||||||
|
public int runflyFlyingFailed;
|
||||||
|
|
||||||
|
public double runflySneakingTotalVL;
|
||||||
|
public int runflySneakingFailed;
|
||||||
|
|
||||||
|
public double runflySwimmingTotalVL;
|
||||||
|
public int runflySwimmingFailed;
|
||||||
|
|
||||||
public double nofallVL;
|
public double nofallVL;
|
||||||
public double nofallTotalVL;
|
public double nofallTotalVL;
|
||||||
@ -71,10 +81,17 @@ public class MovingData extends Data {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void collectData(Map<String, Object> map) {
|
public void collectData(Map<String, Object> map) {
|
||||||
map.put("moving.runfly.vl", (int) runflyTotalVL);
|
map.put("moving.running.vl", (int) runflyRunningTotalVL);
|
||||||
|
map.put("moving.flying.vl", (int) runflyFlyingTotalVL);
|
||||||
|
map.put("moving.sneaking.vl", (int) runflySneakingTotalVL);
|
||||||
|
map.put("moving.swimming.vl", (int) runflySwimmingTotalVL);
|
||||||
map.put("moving.nofall.vl", (int) nofallTotalVL);
|
map.put("moving.nofall.vl", (int) nofallTotalVL);
|
||||||
map.put("moving.morepackets.vl", (int) morePacketsTotalVL);
|
map.put("moving.morepackets.vl", (int) morePacketsTotalVL);
|
||||||
map.put("moving.runfly.failed", runflyFailed);
|
|
||||||
|
map.put("moving.running.failed", runflyRunningFailed);
|
||||||
|
map.put("moving.flying.failed", runflyFlyingFailed);
|
||||||
|
map.put("moving.sneaking.failed", runflySneakingFailed);
|
||||||
|
map.put("moving.swimming.failed", runflySwimmingFailed);
|
||||||
map.put("moving.nofall.failed", nofallFailed);
|
map.put("moving.nofall.failed", nofallFailed);
|
||||||
map.put("moving.morepackets.failed", morePacketsFailed);
|
map.put("moving.morepackets.failed", morePacketsFailed);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.Event.Priority;
|
import org.bukkit.event.Event.Priority;
|
||||||
import org.bukkit.event.Event.Type;
|
import org.bukkit.event.Event.Type;
|
||||||
@ -14,7 +15,6 @@ import org.bukkit.event.block.BlockListener;
|
|||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
|
||||||
import org.bukkit.event.entity.EntityListener;
|
import org.bukkit.event.entity.EntityListener;
|
||||||
import org.bukkit.event.player.PlayerAnimationEvent;
|
import org.bukkit.event.player.PlayerAnimationEvent;
|
||||||
import org.bukkit.event.player.PlayerChatEvent;
|
import org.bukkit.event.player.PlayerChatEvent;
|
||||||
@ -271,10 +271,11 @@ public abstract class EventManagerImpl implements EventManager {
|
|||||||
|
|
||||||
final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
|
final EntityDamageByEntityEvent event2 = (EntityDamageByEntityEvent) event;
|
||||||
|
|
||||||
// Only if player really attacked other player
|
// Only handle if attack done by a player directly or inderictly with a projectile
|
||||||
if(!(event2.getDamager() instanceof Player) || !event2.getCause().equals(DamageCause.ENTITY_ATTACK))
|
if(!(event2.getDamager() instanceof Player) && !((event2.getDamager() instanceof Projectile) && ((Projectile)event2.getDamager()).getShooter() instanceof Player)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/** Only now measure time and dispatch event */
|
/** Only now measure time and dispatch event */
|
||||||
if(measureTime != null && measureTime.isEnabled()) {
|
if(measureTime != null && measureTime.isEnabled()) {
|
||||||
final long startTime = System.nanoTime();
|
final long startTime = System.nanoTime();
|
||||||
|
@ -6,6 +6,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import org.bukkit.craftbukkit.entity.CraftEntity;
|
import org.bukkit.craftbukkit.entity.CraftEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Projectile;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.Event.Priority;
|
import org.bukkit.event.Event.Priority;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
@ -42,7 +43,23 @@ public class FightEventManager extends EventManagerImpl {
|
|||||||
@Override
|
@Override
|
||||||
protected void handleEntityDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
|
protected void handleEntityDamageByEntityEvent(final EntityDamageByEntityEvent event, final Priority priority) {
|
||||||
|
|
||||||
// Our event listener already checked if that cast is valid
|
// Two possibilities: The player attacked directly, or by projectile
|
||||||
|
// We already made sure in the calling method that it is one of those
|
||||||
|
// two
|
||||||
|
if(event.getDamager() instanceof Projectile) {
|
||||||
|
final Player damager = (Player) ((Projectile) event.getDamager()).getShooter();
|
||||||
|
final NoCheatPlayer player = plugin.getPlayer(damager);
|
||||||
|
|
||||||
|
final FightData data = player.getData().fight;
|
||||||
|
|
||||||
|
// Skip the next damage event, because it is with high probability
|
||||||
|
// the same as this one
|
||||||
|
data.skipNext = true;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Other possibility, the player is the damager directly
|
||||||
final Player damager = (Player) event.getDamager();
|
final Player damager = (Player) event.getDamager();
|
||||||
|
|
||||||
final NoCheatPlayer player = plugin.getPlayer(damager);
|
final NoCheatPlayer player = plugin.getPlayer(damager);
|
||||||
@ -54,6 +71,12 @@ public class FightEventManager extends EventManagerImpl {
|
|||||||
|
|
||||||
final FightData data = player.getData().fight;
|
final FightData data = player.getData().fight;
|
||||||
|
|
||||||
|
if(data.skipNext) {
|
||||||
|
data.skipNext = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are still interested in this event type
|
||||||
boolean cancelled = false;
|
boolean cancelled = false;
|
||||||
|
|
||||||
data.damagee = ((CraftEntity) event.getEntity()).getHandle();
|
data.damagee = ((CraftEntity) event.getEntity()).getHandle();
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.events;
|
package cc.co.evenprime.bukkit.nocheat.events;
|
||||||
|
|
||||||
|
import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.Event.Priority;
|
import org.bukkit.event.Event.Priority;
|
||||||
@ -69,6 +70,9 @@ public class WorkaroundsEventManager extends EventManagerImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleTeleportation(final Player player) {
|
private void handleTeleportation(final Player player) {
|
||||||
|
if(plugin.getPlayer(player).getConfiguration().inventory.closebeforeteleports && player instanceof CraftPlayer) {
|
||||||
|
((CraftPlayer) player).getHandle().closeInventory();
|
||||||
|
}
|
||||||
plugin.clearCriticalData(player.getName());
|
plugin.clearCriticalData(player.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user