Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-26 00:00:28 +01:00
Fix suffocation damage for 1.14+ players in hitbox patch
Dieser Commit ist enthalten in:
Ursprung
a2d9489ad5
Commit
ca1ba4f422
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren