mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2024-11-02 00:29:59 +01:00
Fixed NoFall damaging players switching from Creative to Survival mode.
This commit is contained in:
parent
0f0e22a993
commit
90f16a2799
@ -35,72 +35,67 @@ public enum CheckType {
|
||||
ALL,
|
||||
|
||||
BLOCKBREAK(BlockBreakConfig.factory, BlockBreakData.factory),
|
||||
BLOCKBREAK_DIRECTION(BLOCKBREAK, "direction", Permissions.BLOCKBREAK_DIRECTION),
|
||||
BLOCKBREAK_FASTBREAK(BLOCKBREAK, "fastBreak", Permissions.BLOCKBREAK_FASTBREAK),
|
||||
BLOCKBREAK_NOSWING(BLOCKBREAK, "noSwing", Permissions.BLOCKBREAK_NOSWING),
|
||||
BLOCKBREAK_REACH(BLOCKBREAK, "reach", Permissions.BLOCKBREAK_REACH),
|
||||
BLOCKBREAK_DIRECTION(BLOCKBREAK, Permissions.BLOCKBREAK_DIRECTION),
|
||||
BLOCKBREAK_FASTBREAK(BLOCKBREAK, Permissions.BLOCKBREAK_FASTBREAK),
|
||||
BLOCKBREAK_NOSWING(BLOCKBREAK, Permissions.BLOCKBREAK_NOSWING),
|
||||
BLOCKBREAK_REACH(BLOCKBREAK, Permissions.BLOCKBREAK_REACH),
|
||||
|
||||
BLOCKINTERACT(BlockInteractConfig.factory, BlockInteractData.factory),
|
||||
BLOCKINTERACT_DIRECTION(BLOCKINTERACT, "direction", Permissions.BLOCKINTERACT_DIRECTION),
|
||||
BLOCKINTERACT_REACH(BLOCKINTERACT, "reach", Permissions.BLOCKINTERACT_REACH),
|
||||
BLOCKINTERACT_DIRECTION(BLOCKINTERACT, Permissions.BLOCKINTERACT_DIRECTION),
|
||||
BLOCKINTERACT_REACH(BLOCKINTERACT, Permissions.BLOCKINTERACT_REACH),
|
||||
|
||||
BLOCKPLACE(BlockPlaceConfig.factory, BlockPlaceData.factory),
|
||||
BLOCKPLACE_DIRECTION(BLOCKPLACE, "direction", Permissions.BLOCKPLACE_DIRECTION),
|
||||
BLOCKPLACE_FASTPLACE(BLOCKPLACE, "fastPlace", Permissions.BLOCKPLACE_FASTPLACE),
|
||||
BLOCKPLACE_NOSWING(BLOCKPLACE, "noSwing", Permissions.BLOCKPLACE_NOSWING),
|
||||
BLOCKPLACE_REACH(BLOCKPLACE, "reach", Permissions.BLOCKBREAK_REACH),
|
||||
BLOCKPLACE_SPEED(BLOCKPLACE, "speed", Permissions.BLOCKPLACE_SPEED),
|
||||
BLOCKPLACE_DIRECTION(BLOCKPLACE, Permissions.BLOCKPLACE_DIRECTION),
|
||||
BLOCKPLACE_FASTPLACE(BLOCKPLACE, Permissions.BLOCKPLACE_FASTPLACE),
|
||||
BLOCKPLACE_NOSWING(BLOCKPLACE, Permissions.BLOCKPLACE_NOSWING),
|
||||
BLOCKPLACE_REACH(BLOCKPLACE, Permissions.BLOCKBREAK_REACH),
|
||||
BLOCKPLACE_SPEED(BLOCKPLACE, Permissions.BLOCKPLACE_SPEED),
|
||||
|
||||
CHAT(ChatConfig.factory, ChatData.factory),
|
||||
CHAT_COLOR(CHAT, "color", Permissions.CHAT_COLOR),
|
||||
CHAT_NOPWNAGE(CHAT, "noPwnage", Permissions.CHAT_NOPWNAGE),
|
||||
CHAT_COLOR(CHAT, Permissions.CHAT_COLOR),
|
||||
CHAT_NOPWNAGE(CHAT, Permissions.CHAT_NOPWNAGE),
|
||||
|
||||
FIGHT(FightConfig.factory, FightData.factory),
|
||||
FIGHT_ANGLE(FIGHT, "angle", Permissions.FIGHT_ANGLE),
|
||||
FIGHT_CRITICAL(FIGHT, "critical", Permissions.FIGHT_CRITICAL),
|
||||
FIGHT_DIRECTION(FIGHT, "direction", Permissions.FIGHT_DIRECTION),
|
||||
FIGHT_GODMODE(FIGHT, "godMode", Permissions.FIGHT_GODMODE),
|
||||
FIGHT_INSTANTHEAL(FIGHT, "instantHeal", Permissions.FIGHT_INSTANTHEAL),
|
||||
FIGHT_KNOCKBACK(FIGHT, "knockback", Permissions.FIGHT_KNOCKBACK),
|
||||
FIGHT_NOSWING(FIGHT, "noSwing", Permissions.FIGHT_NOSWING),
|
||||
FIGHT_REACH(FIGHT, "reach", Permissions.FIGHT_REACH),
|
||||
FIGHT_SPEED(FIGHT, "speed", Permissions.FIGHT_SPEED),
|
||||
FIGHT_ANGLE(FIGHT, Permissions.FIGHT_ANGLE),
|
||||
FIGHT_CRITICAL(FIGHT, Permissions.FIGHT_CRITICAL),
|
||||
FIGHT_DIRECTION(FIGHT, Permissions.FIGHT_DIRECTION),
|
||||
FIGHT_GODMODE(FIGHT, Permissions.FIGHT_GODMODE),
|
||||
FIGHT_INSTANTHEAL(FIGHT, Permissions.FIGHT_INSTANTHEAL),
|
||||
FIGHT_KNOCKBACK(FIGHT, Permissions.FIGHT_KNOCKBACK),
|
||||
FIGHT_NOSWING(FIGHT, Permissions.FIGHT_NOSWING),
|
||||
FIGHT_REACH(FIGHT, Permissions.FIGHT_REACH),
|
||||
FIGHT_SPEED(FIGHT, Permissions.FIGHT_SPEED),
|
||||
|
||||
INVENTORY(InventoryConfig.factory, InventoryData.factory),
|
||||
INVENTORY_DROP(INVENTORY, "drop", Permissions.INVENTORY_DROP),
|
||||
INVENTORY_INSTANTBOW(INVENTORY, "instantBow", Permissions.INVENTORY_INSTANTBOW),
|
||||
INVENTORY_INSTANTEAT(INVENTORY, "instantEat", Permissions.INVENTORY_INSTANTEAT),
|
||||
INVENTORY_DROP(INVENTORY, Permissions.INVENTORY_DROP),
|
||||
INVENTORY_INSTANTBOW(INVENTORY, Permissions.INVENTORY_INSTANTBOW),
|
||||
INVENTORY_INSTANTEAT(INVENTORY, Permissions.INVENTORY_INSTANTEAT),
|
||||
|
||||
MOVING(MovingConfig.factory, MovingData.factory),
|
||||
MOVING_CREATIVEFLY(MOVING, "creativeFly", Permissions.MOVING_CREATIVEFLY),
|
||||
MOVING_MOREPACKETS(MOVING, "morePackets", Permissions.MOVING_MOREPACKETS),
|
||||
MOVING_MOREPACKETSVEHICLE(MOVING, "morePacketsVehicle", Permissions.MOVING_MOREPACKETSVEHICLE),
|
||||
MOVING_NOFALL(MOVING, "noFall", Permissions.MOVING_NOFALL),
|
||||
MOVING_SURVIVALFLY(MOVING, "survivalFly", Permissions.MOVING_SURVIVALFLY),
|
||||
MOVING_CREATIVEFLY(MOVING, Permissions.MOVING_CREATIVEFLY),
|
||||
MOVING_MOREPACKETS(MOVING, Permissions.MOVING_MOREPACKETS),
|
||||
MOVING_MOREPACKETSVEHICLE(MOVING, Permissions.MOVING_MOREPACKETSVEHICLE),
|
||||
MOVING_NOFALL(MOVING, Permissions.MOVING_NOFALL),
|
||||
MOVING_SURVIVALFLY(MOVING, Permissions.MOVING_SURVIVALFLY),
|
||||
|
||||
UNKNOWN;
|
||||
|
||||
/** The group. */
|
||||
public final CheckType group;
|
||||
private CheckType parent = null;
|
||||
|
||||
/** The configFactory. */
|
||||
public final CheckConfigFactory configFactory;
|
||||
private CheckConfigFactory configFactory = null;
|
||||
|
||||
/** The dataFactory. */
|
||||
public final CheckDataFactory dataFactory;
|
||||
|
||||
/** The name. */
|
||||
public final String name;
|
||||
private CheckDataFactory dataFactory = null;
|
||||
|
||||
/** The permission. */
|
||||
public final String permission;
|
||||
private String permission = null;
|
||||
|
||||
/**
|
||||
* Instantiates a new check type.
|
||||
*/
|
||||
private CheckType() {
|
||||
this(null, null, null, null, null);
|
||||
}
|
||||
private CheckType() {}
|
||||
|
||||
/**
|
||||
* Instantiates a new check type.
|
||||
@ -111,59 +106,38 @@ public enum CheckType {
|
||||
* the dataFactory
|
||||
*/
|
||||
private CheckType(final CheckConfigFactory configFactory, final CheckDataFactory dataFactory) {
|
||||
this(null, configFactory, dataFactory, null, null);
|
||||
this.configFactory = configFactory;
|
||||
this.dataFactory = dataFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new check type.
|
||||
*
|
||||
* @param group
|
||||
* the group
|
||||
* @param configFactory
|
||||
* the configFactory class
|
||||
* @param dataFactory
|
||||
* the dataFactory class
|
||||
* @param name
|
||||
* the name
|
||||
* @param parent
|
||||
* the parent
|
||||
* @param permission
|
||||
* the permission
|
||||
*/
|
||||
private CheckType(final CheckType group, final CheckConfigFactory configFactory,
|
||||
final CheckDataFactory dataFactory, final String name, final String permission) {
|
||||
this.group = group;
|
||||
this.configFactory = configFactory;
|
||||
this.dataFactory = dataFactory;
|
||||
this.name = name;
|
||||
private CheckType(final CheckType parent, final String permission) {
|
||||
this.parent = parent;
|
||||
configFactory = parent.getConfigFactory();
|
||||
dataFactory = parent.getDataFactory();
|
||||
this.permission = permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new check type.
|
||||
* Gets the configFactory.
|
||||
*
|
||||
* @param group
|
||||
* the group
|
||||
* @param name
|
||||
* the name
|
||||
* @param permission
|
||||
* the permission
|
||||
*/
|
||||
private CheckType(final CheckType group, final String name, final String permission) {
|
||||
this(group, group.getConfigFactory(), group.getDataFactory(), name, permission);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the configFactory class.
|
||||
*
|
||||
* @return the configFactory class
|
||||
* @return the configFactory
|
||||
*/
|
||||
public CheckConfigFactory getConfigFactory() {
|
||||
return configFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the dataFactory class.
|
||||
* Gets the dataFactory.
|
||||
*
|
||||
* @return the dataFactory class
|
||||
* @return the dataFactory
|
||||
*/
|
||||
public CheckDataFactory getDataFactory() {
|
||||
return dataFactory;
|
||||
@ -175,7 +149,16 @@ public enum CheckType {
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
return toString().toLowerCase().replace("_", ".");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the parent.
|
||||
*
|
||||
* @return the parent
|
||||
*/
|
||||
public CheckType getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -13,11 +13,10 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.event.player.PlayerBedEnterEvent;
|
||||
import org.bukkit.event.player.PlayerBedLeaveEvent;
|
||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||
import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
@ -135,31 +134,6 @@ public class MovingListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We listen to EntityDamage events the reset the fall distance when a damage is dealt.
|
||||
*
|
||||
* @param event
|
||||
* the event
|
||||
*/
|
||||
@EventHandler(
|
||||
priority = EventPriority.MONITOR, ignoreCancelled = false)
|
||||
public void onEntityDamage(final EntityDamageEvent event) {
|
||||
/*
|
||||
* _____ _ _ _ ____
|
||||
* | ____|_ __ | |_(_) |_ _ _ | _ \ __ _ _ __ ___ __ _ __ _ ___
|
||||
* | _| | '_ \| __| | __| | | | | | | |/ _` | '_ ` _ \ / _` |/ _` |/ _ \
|
||||
* | |___| | | | |_| | |_| |_| | | |_| | (_| | | | | | | (_| | (_| | __/
|
||||
* |_____|_| |_|\__|_|\__|\__, | |____/ \__,_|_| |_| |_|\__,_|\__, |\___|
|
||||
* |___/ |___/
|
||||
*/
|
||||
// Workaround fix attempt for NoFall multiple damage.
|
||||
if (event.getCause() == DamageCause.FALL && event.getEntity() instanceof Player) {
|
||||
final MovingData data = MovingData.getData((Player) event.getEntity());
|
||||
// Simple model: once damage dealt the fall distance is reset.
|
||||
data.noFallFallDistance = data.noFallNewFallDistance = 0D;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We listen to this event to prevent player from flying by sending bed leaving packets.
|
||||
*
|
||||
@ -226,6 +200,36 @@ public class MovingListener implements Listener {
|
||||
data.teleported = null;
|
||||
data.clearFlyData();
|
||||
data.clearMorePacketsData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
/**
|
||||
* When a player changes his gamemode, all information related to the moving checks becomes invalid.
|
||||
*
|
||||
* @param event
|
||||
* the event
|
||||
*/
|
||||
@EventHandler(
|
||||
ignoreCancelled = true, priority = EventPriority.MONITOR)
|
||||
public void onPlayerGameModeChange(final PlayerGameModeChangeEvent event) {
|
||||
/*
|
||||
* ____ _ ____ __ __ _
|
||||
* | _ \| | __ _ _ _ ___ _ __ / ___| __ _ _ __ ___ ___| \/ | ___ __| | ___
|
||||
* | |_) | |/ _` | | | |/ _ \ '__| | | _ / _` | '_ ` _ \ / _ \ |\/| |/ _ \ / _` |/ _ \
|
||||
* | __/| | (_| | |_| | __/ | | |_| | (_| | | | | | | __/ | | | (_) | (_| | __/
|
||||
* |_| |_|\__,_|\__, |\___|_| \____|\__,_|_| |_| |_|\___|_| |_|\___/ \__,_|\___|
|
||||
* |___/
|
||||
* ____ _
|
||||
* / ___| |__ __ _ _ __ __ _ ___
|
||||
* | | | '_ \ / _` | '_ \ / _` |/ _ \
|
||||
* | |___| | | | (_| | | | | (_| | __/
|
||||
* \____|_| |_|\__,_|_| |_|\__, |\___|
|
||||
* |___/
|
||||
*/
|
||||
final MovingData data = MovingData.getData(event.getPlayer());
|
||||
data.clearFlyData();
|
||||
data.clearMorePacketsData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -350,9 +354,11 @@ public class MovingListener implements Listener {
|
||||
// If don't have a new location and if he is handled by the no fall check, execute it.
|
||||
if (newTo == null && noFall.isEnabled(player))
|
||||
noFall.check(player, from, to);
|
||||
} else
|
||||
} else {
|
||||
// He isn't handled by any fly check, clear his data.
|
||||
data.clearFlyData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
if (newTo == null && morePackets.isEnabled(player))
|
||||
// If he hasn't been stopped by any other check and is handled by the more packets check, execute it.
|
||||
@ -390,6 +396,7 @@ public class MovingListener implements Listener {
|
||||
final MovingData data = MovingData.getData(event.getPlayer());
|
||||
data.clearFlyData();
|
||||
data.clearMorePacketsData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -412,6 +419,7 @@ public class MovingListener implements Listener {
|
||||
final MovingData data = MovingData.getData(event.getPlayer());
|
||||
data.clearFlyData();
|
||||
data.clearMorePacketsData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -449,6 +457,7 @@ public class MovingListener implements Listener {
|
||||
// Always drop data from fly checks, as it always loses its validity after teleports. Always!
|
||||
data.teleported = null;
|
||||
data.clearFlyData();
|
||||
data.resetNoFallDistances();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -75,8 +75,7 @@ public class NoFall extends Check {
|
||||
else if (!data.noFallWasOnGroundServer && data.noFallOnGroundServer) {
|
||||
// If the difference between the fall distance recorded by Bukkit and NoCheatPlus is too big and the fall
|
||||
// distance bigger than 2.
|
||||
if (data.noFallFallDistance - player.getFallDistance() > Math.pow(1D, -3D)
|
||||
&& (int) data.noFallFallDistance > 2) {
|
||||
if (data.noFallFallDistance - player.getFallDistance() > 0.1D && (int) data.noFallFallDistance > 2) {
|
||||
// Add the difference to the violation level.
|
||||
data.noFallVL += data.noFallFallDistance - player.getFallDistance();
|
||||
|
||||
|
@ -132,12 +132,12 @@ public final class NCPHookManager {
|
||||
*/
|
||||
private static boolean addToMappingsRecursively(final CheckType checkType, final CheckType refType,
|
||||
final NCPHook hook) {
|
||||
if (refType.group == null)
|
||||
if (refType.getParent() == null)
|
||||
return false;
|
||||
else if (refType.group == checkType) {
|
||||
else if (refType.getParent() == checkType) {
|
||||
addToMapping(refType, hook);
|
||||
return true;
|
||||
} else if (addToMappingsRecursively(checkType, refType.group, hook)) {
|
||||
} else if (addToMappingsRecursively(checkType, refType.getParent(), hook)) {
|
||||
addToMapping(refType, hook);
|
||||
return true;
|
||||
} else
|
||||
@ -271,8 +271,8 @@ public final class NCPHookManager {
|
||||
final StringBuilder builder = new StringBuilder(1024);
|
||||
builder.append("[NoCheatPlus] Hook " + getHookDescription(hook) + " encountered an unexpected exception:\n");
|
||||
builder.append("Processing: ");
|
||||
if (checkType.group != null)
|
||||
builder.append("Group " + checkType.group + " ");
|
||||
if (checkType.getParent() != null)
|
||||
builder.append("Prent " + checkType.getParent() + " ");
|
||||
builder.append("Check " + checkType);
|
||||
builder.append(" Player " + player.getName());
|
||||
builder.append("\n");
|
||||
|
Loading…
Reference in New Issue
Block a user