3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-12-25 15:50:10 +01:00

Fix suffocation damage for 1.14+ players in hitbox patch

Dieser Commit ist enthalten in:
KennyTV 2019-05-19 23:28:05 +02:00
Ursprung a2d9489ad5
Commit ca1ba4f422
2 geänderte Dateien mit 37 neuen und 12 gelöschten Zeilen

Datei anzeigen

@ -1,7 +1,9 @@
package us.myles.ViaVersion.bukkit.listeners.multiversion; package us.myles.ViaVersion.bukkit.listeners.multiversion;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.event.player.PlayerToggleSneakEvent;
import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.ViaVersionPlugin;
@ -9,13 +11,11 @@ import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion; import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener; import us.myles.ViaVersion.bukkit.listeners.ViaBukkitListener;
import us.myles.ViaVersion.bukkit.platform.BukkitViaLoader;
import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.*;
import java.util.Map;
public class PlayerSneakListener extends ViaBukkitListener { public class PlayerSneakListener extends ViaBukkitListener {
private static final float STANDING_HEIGHT = 1.8F; private static final float STANDING_HEIGHT = 1.8F;
@ -24,13 +24,14 @@ public class PlayerSneakListener extends ViaBukkitListener {
private static final float DEFAULT_WIDTH = 0.6F; private static final float DEFAULT_WIDTH = 0.6F;
private Map<Player, Boolean> sneaking; // true = 1.14+, else false private Map<Player, Boolean> sneaking; // true = 1.14+, else false
private Set<UUID> sneakingUuids;
private Method getHandle; private Method getHandle;
private Method setSize; private Method setSize;
private boolean is1_9Fix; private boolean is1_9Fix;
private boolean is1_14Fix; private boolean is1_14Fix;
private boolean useCache; private boolean useCache;
public PlayerSneakListener(ViaVersionPlugin plugin, BukkitViaLoader viaLoader, boolean is1_9Fix, boolean is1_14Fix) { public PlayerSneakListener(ViaVersionPlugin plugin, boolean is1_9Fix, boolean is1_14Fix) {
super(plugin, null); super(plugin, null);
this.is1_9Fix = is1_9Fix; this.is1_9Fix = is1_9Fix;
this.is1_14Fix = is1_14Fix; this.is1_14Fix = is1_14Fix;
@ -41,16 +42,11 @@ public class PlayerSneakListener extends ViaBukkitListener {
} catch (ClassNotFoundException | NoSuchMethodException e) { } catch (ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
// From 1.9 upwards the server hitbox is set in every entity tick, so we have to reset it everytime // From 1.9 upwards the server hitbox is set in every entity tick, so we have to reset it everytime
if (ProtocolRegistry.SERVER_PROTOCOL >= ProtocolVersion.v1_9.getId()) { if (ProtocolRegistry.SERVER_PROTOCOL >= ProtocolVersion.v1_9.getId()) {
sneaking = new HashMap<>(); sneaking = new HashMap<>();
useCache = true; useCache = true;
viaLoader.storeListener(new ViaBukkitListener(plugin, null) {
@EventHandler
public void playerQuit(PlayerQuitEvent event) {
sneaking.remove(event.getPlayer());
}
}).register();
plugin.getServer().getScheduler().runTaskTimer(plugin, new Runnable() { plugin.getServer().getScheduler().runTaskTimer(plugin, new Runnable() {
@Override @Override
public void run() { public void run() {
@ -60,6 +56,11 @@ public class PlayerSneakListener extends ViaBukkitListener {
} }
}, 1, 1); }, 1, 1);
} }
// Suffocation removal only required for 1.14+ clients.
if (is1_14Fix) {
sneakingUuids = new HashSet<>();
}
} }
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
@ -73,6 +74,11 @@ public class PlayerSneakListener extends ViaBukkitListener {
int protocolVersion = info.getProtocolVersion(); int protocolVersion = info.getProtocolVersion();
if (is1_14Fix && protocolVersion >= ProtocolVersion.v1_14.getId()) { if (is1_14Fix && protocolVersion >= ProtocolVersion.v1_14.getId()) {
setHeight(player, event.isSneaking() ? HEIGHT_1_14 : STANDING_HEIGHT); setHeight(player, event.isSneaking() ? HEIGHT_1_14 : STANDING_HEIGHT);
if (event.isSneaking())
sneakingUuids.add(player.getUniqueId());
else
sneakingUuids.remove(player.getUniqueId());
if (!useCache) return; if (!useCache) return;
if (event.isSneaking()) if (event.isSneaking())
sneaking.put(player, true); sneaking.put(player, true);
@ -88,6 +94,25 @@ public class PlayerSneakListener extends ViaBukkitListener {
} }
} }
@EventHandler(ignoreCancelled = true)
public void playerDamage(EntityDamageEvent event) {
if (!is1_14Fix) return;
if (event.getCause() != EntityDamageEvent.DamageCause.SUFFOCATION) return;
if (event.getEntityType() != EntityType.PLAYER) return;
Player player = (Player) event.getEntity();
if (!sneakingUuids.contains(player.getUniqueId())) return;
event.setCancelled(true);
}
@EventHandler
public void playerQuit(PlayerQuitEvent event) {
if (sneaking != null)
sneaking.remove(event.getPlayer());
if (sneakingUuids != null)
sneakingUuids.remove(event.getPlayer().getUniqueId());
}
private void setHeight(Player player, float height) { private void setHeight(Player player, float height) {
try { try {
setSize.invoke(getHandle.invoke(player), DEFAULT_WIDTH, height); setSize.invoke(getHandle.invoke(player), DEFAULT_WIDTH, height);

Datei anzeigen

@ -82,7 +82,7 @@ public class BukkitViaLoader implements ViaPlatformLoader {
if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_14.getId()) { if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_14.getId()) {
boolean use1_9Fix = plugin.getConf().is1_9HitboxFix() && ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId(); boolean use1_9Fix = plugin.getConf().is1_9HitboxFix() && ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId();
if (use1_9Fix || plugin.getConf().is1_14HitboxFix()) { if (use1_9Fix || plugin.getConf().is1_14HitboxFix()) {
storeListener(new PlayerSneakListener(plugin, this, use1_9Fix, plugin.getConf().is1_14HitboxFix())).register(); storeListener(new PlayerSneakListener(plugin, use1_9Fix, plugin.getConf().is1_14HitboxFix())).register();
} }
} }