2022-12-07 17:30:18 +01:00
|
|
|
From 8be8d4cde11d6f17fc38ab464cdd01fc247080fa Mon Sep 17 00:00:00 2001
|
2019-01-15 04:29:51 +01:00
|
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
|
|
Date: Mon, 14 Jan 2019 03:35:21 +0000
|
|
|
|
Subject: [PATCH] Provide an option to disable entity metadata rewriting
|
|
|
|
|
|
|
|
The work here is derived from the research and guidance of
|
|
|
|
various members of the minecraft community
|
|
|
|
|
|
|
|
This patch provides the ability to disable entity remapping,
|
|
|
|
which creates various incompatability issues with mods, however,
|
|
|
|
may also create various issues with mods which do not support this,
|
|
|
|
hence why the configuration option is provided
|
|
|
|
|
|
|
|
diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
2020-02-01 16:39:53 +01:00
|
|
|
index e0baca9c..f3bced0a 100644
|
2019-01-15 04:29:51 +01:00
|
|
|
--- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
2020-02-01 16:39:53 +01:00
|
|
|
@@ -252,4 +252,9 @@ public interface ProxyConfig
|
2019-09-24 06:46:15 +02:00
|
|
|
* @return should we disable the tab completion limit for 1.13+ clients
|
2019-03-30 17:09:06 +01:00
|
|
|
*/
|
2019-09-24 06:46:15 +02:00
|
|
|
boolean isDisableModernTabLimiter();
|
2019-01-15 04:29:51 +01:00
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @return Should we disable entity metadata rewriting?
|
|
|
|
+ */
|
|
|
|
+ boolean isDisableEntityMetadataRewrite();
|
|
|
|
}
|
|
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
2019-09-24 06:46:15 +02:00
|
|
|
index 4ff8da6d..e860214f 100644
|
2019-01-15 04:29:51 +01:00
|
|
|
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
2019-09-24 06:46:15 +02:00
|
|
|
@@ -42,6 +42,8 @@ public class WaterfallConfiguration extends Configuration {
|
|
|
|
private int tabThrottle = 1000;
|
|
|
|
private boolean disableModernTabLimiter = true;
|
2019-01-15 04:29:51 +01:00
|
|
|
|
|
|
|
+ private boolean disableEntityMetadataRewrite = false;
|
|
|
|
+
|
|
|
|
@Override
|
|
|
|
public void load() {
|
|
|
|
super.load();
|
2019-09-24 06:46:15 +02:00
|
|
|
@@ -53,6 +55,7 @@ public class WaterfallConfiguration extends Configuration {
|
|
|
|
// Throttling options
|
2019-01-15 04:29:51 +01:00
|
|
|
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
|
|
|
|
disableModernTabLimiter = config.getBoolean("disable_modern_tab_limiter", disableModernTabLimiter);
|
|
|
|
+ disableEntityMetadataRewrite = config.getBoolean("disable_entity_metadata_rewrite", disableEntityMetadataRewrite);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-09-24 06:46:15 +02:00
|
|
|
@@ -79,4 +82,9 @@ public class WaterfallConfiguration extends Configuration {
|
|
|
|
public boolean isDisableModernTabLimiter() {
|
|
|
|
return disableModernTabLimiter;
|
2019-01-15 04:29:51 +01:00
|
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean isDisableEntityMetadataRewrite() {
|
|
|
|
+ return disableEntityMetadataRewrite;
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
2022-07-27 20:35:10 +02:00
|
|
|
index 9bd063f5..8181d76b 100644
|
2019-01-15 04:29:51 +01:00
|
|
|
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
2021-11-12 20:47:23 +01:00
|
|
|
@@ -240,7 +240,7 @@ public class ServerConnector extends PacketHandler
|
|
|
|
ch.write( new PluginMessage( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:register" : "REGISTER", Joiner.on( "\0" ).join( registeredChannels ).getBytes( StandardCharsets.UTF_8 ), false ) );
|
2019-01-15 04:29:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
- if ( user.getSettings() != null )
|
|
|
|
+ if (!user.isDisableEntityMetadataRewrite() && user.getSettings() != null )
|
|
|
|
{
|
|
|
|
ch.write( user.getSettings() );
|
|
|
|
}
|
2021-11-12 20:47:23 +01:00
|
|
|
@@ -293,6 +293,7 @@ public class ServerConnector extends PacketHandler
|
2019-01-15 04:29:51 +01:00
|
|
|
user.getTabListHandler().onServerChange();
|
|
|
|
|
|
|
|
Scoreboard serverScoreboard = user.getServerSentScoreboard();
|
|
|
|
+ if ( !user.isDisableEntityMetadataRewrite() ) { // Waterfall
|
|
|
|
for ( Objective objective : serverScoreboard.getObjectives() )
|
|
|
|
{
|
|
|
|
user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), ScoreboardObjective.HealthDisplay.fromString( objective.getType() ), (byte) 1 ) );
|
2021-11-12 20:47:23 +01:00
|
|
|
@@ -305,6 +306,7 @@ public class ServerConnector extends PacketHandler
|
2019-01-15 04:29:51 +01:00
|
|
|
{
|
|
|
|
user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.Team( team.getName() ) );
|
|
|
|
}
|
|
|
|
+ } // Waterfall
|
|
|
|
serverScoreboard.clear();
|
|
|
|
|
|
|
|
for ( UUID bossbar : user.getSentBossBars() )
|
2022-06-07 19:12:20 +02:00
|
|
|
@@ -323,13 +325,37 @@ public class ServerConnector extends PacketHandler
|
2020-03-07 23:50:46 +01:00
|
|
|
}
|
2019-01-15 04:29:51 +01:00
|
|
|
|
|
|
|
user.setDimensionChange( true );
|
2020-06-28 05:39:33 +02:00
|
|
|
- if ( login.getDimension() == user.getDimension() )
|
|
|
|
+ if ( !user.isDisableEntityMetadataRewrite() && login.getDimension() == user.getDimension() ) // Waterfall - defer
|
2019-01-15 04:29:51 +01:00
|
|
|
{
|
2022-06-07 19:12:20 +02:00
|
|
|
user.unsafe().sendPacket( new Respawn( (Integer) login.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false, login.getDeathLocation() ) );
|
2019-01-15 04:29:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
user.setServerEntityId( login.getEntityId() );
|
2019-12-10 23:53:39 +01:00
|
|
|
+
|
2019-01-15 04:29:51 +01:00
|
|
|
+ // Waterfall start
|
|
|
|
+ if ( user.isDisableEntityMetadataRewrite() ) {
|
|
|
|
+ // Ensure that we maintain consistency
|
|
|
|
+ user.setClientEntityId( login.getEntityId() );
|
|
|
|
+
|
2019-06-27 15:42:56 +02:00
|
|
|
+ // Only send if we are not in the same dimension
|
2020-06-28 05:39:33 +02:00
|
|
|
+ if ( login.getDimension() != user.getDimension() ) // Waterfall - defer
|
2020-06-23 23:13:11 +02:00
|
|
|
+ {
|
2022-06-07 19:12:20 +02:00
|
|
|
+ user.unsafe().sendPacket( new Respawn( (Integer) user.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false, login.getDeathLocation() ) );
|
2019-06-27 15:42:56 +02:00
|
|
|
+ }
|
|
|
|
+
|
2020-08-12 15:44:07 +02:00
|
|
|
+ Login modLogin = new Login( login.getEntityId(), login.isHardcore(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
2022-06-07 19:12:20 +02:00
|
|
|
+ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.getSimulationDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat(), login.getDeathLocation() );
|
2019-01-15 04:29:51 +01:00
|
|
|
+ user.unsafe().sendPacket(modLogin);
|
|
|
|
+
|
|
|
|
+ // Only send if we're in the same dimension
|
2020-06-28 05:39:33 +02:00
|
|
|
+ if ( login.getDimension() == user.getDimension() ) // Waterfall - defer
|
2020-06-23 23:13:11 +02:00
|
|
|
+ {
|
2022-06-07 19:12:20 +02:00
|
|
|
+ user.unsafe().sendPacket( new Respawn( (Integer) login.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false, login.getDeathLocation() ) );
|
2019-01-15 04:29:51 +01:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Waterfall end
|
2022-06-07 19:12:20 +02:00
|
|
|
user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false, login.getDeathLocation() ) );
|
|
|
|
+
|
2019-04-30 05:19:02 +02:00
|
|
|
if ( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_14 )
|
|
|
|
{
|
2022-06-07 19:12:20 +02:00
|
|
|
user.unsafe().sendPacket( new ViewDistance( login.getViewDistance() ) );
|
2019-01-15 04:29:51 +01:00
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
2022-06-08 16:02:06 +02:00
|
|
|
index 7fe08ecd..5961392a 100644
|
2019-01-15 04:29:51 +01:00
|
|
|
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
2022-06-08 16:02:06 +02:00
|
|
|
@@ -775,4 +775,10 @@ public final class UserConnection implements ProxiedPlayer
|
2019-01-15 04:29:51 +01:00
|
|
|
{
|
|
|
|
return serverSentScoreboard;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ // Waterfall start
|
|
|
|
+ public boolean isDisableEntityMetadataRewrite() {
|
2019-12-02 04:30:55 +01:00
|
|
|
+ return entityRewrite == net.md_5.bungee.entitymap.EntityMap_Dummy.INSTANCE;
|
2019-01-15 04:29:51 +01:00
|
|
|
+ }
|
|
|
|
+ // Waterfall end
|
|
|
|
}
|
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
2022-12-07 17:30:18 +01:00
|
|
|
index 85628a7a..5105df8b 100644
|
2019-01-15 04:29:51 +01:00
|
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
2022-12-07 17:30:18 +01:00
|
|
|
@@ -688,6 +688,7 @@ public class DownstreamBridge extends PacketHandler
|
2019-01-15 04:29:51 +01:00
|
|
|
@Override
|
|
|
|
public void handle(EntityEffect entityEffect) throws Exception
|
|
|
|
{
|
|
|
|
+ if (con.isDisableEntityMetadataRewrite()) return; // Waterfall
|
|
|
|
// Don't send any potions when switching between servers (which involves a handshake), which can trigger a race
|
|
|
|
// condition on the client.
|
|
|
|
if (this.con.getForgeClientHandler().isForgeUser() && !this.con.getForgeClientHandler().isHandshakeComplete()) {
|
2022-12-07 17:30:18 +01:00
|
|
|
@@ -699,6 +700,7 @@ public class DownstreamBridge extends PacketHandler
|
2019-01-15 04:29:51 +01:00
|
|
|
@Override
|
|
|
|
public void handle(EntityRemoveEffect removeEffect) throws Exception
|
|
|
|
{
|
|
|
|
+ if (con.isDisableEntityMetadataRewrite()) return; // Waterfall
|
|
|
|
con.getPotions().remove(rewriteEntityId(removeEffect.getEntityId()), removeEffect.getEffectId());
|
|
|
|
}
|
|
|
|
|
2019-04-09 05:35:23 +02:00
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java
|
2022-12-07 17:30:18 +01:00
|
|
|
index 61ad307a..ad951df0 100644
|
2019-04-09 05:35:23 +02:00
|
|
|
--- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java
|
|
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java
|
2022-06-07 19:12:20 +02:00
|
|
|
@@ -27,6 +27,11 @@ public abstract class EntityMap
|
2019-12-02 04:24:35 +01:00
|
|
|
// Returns the correct entity map for the protocol version
|
|
|
|
public static EntityMap getEntityMap(int version)
|
|
|
|
{
|
|
|
|
+ // Waterfall start
|
2019-12-02 04:30:55 +01:00
|
|
|
+ if (net.md_5.bungee.api.ProxyServer.getInstance().getConfig().isDisableEntityMetadataRewrite()) {
|
2019-12-02 04:24:35 +01:00
|
|
|
+ return EntityMap_Dummy.INSTANCE;
|
|
|
|
+ }
|
|
|
|
+ // Waterfall end
|
|
|
|
switch ( version )
|
|
|
|
{
|
|
|
|
case ProtocolConstants.MINECRAFT_1_8:
|
2022-12-07 17:30:18 +01:00
|
|
|
@@ -295,7 +300,13 @@ public abstract class EntityMap
|
2019-04-23 10:09:26 +02:00
|
|
|
DefinedPacket.readVarInt( packet );
|
2019-04-22 21:56:28 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
- throw new IllegalArgumentException( "Unknown meta type " + type );
|
|
|
|
+ // Waterfall start - Don't lie
|
|
|
|
+ if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
|
|
|
+ {
|
|
|
|
+ type++;
|
|
|
|
+ }
|
|
|
|
+ throw new IllegalArgumentException( "Unknown meta type " + type + ": Using mods? refer to disable_entity_metadata_rewrite in waterfall.yml" );
|
|
|
|
+ // Waterfall end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-15 04:29:51 +01:00
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_Dummy.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_Dummy.java
|
|
|
|
new file mode 100644
|
|
|
|
index 00000000..cb81d1dd
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_Dummy.java
|
|
|
|
@@ -0,0 +1,30 @@
|
|
|
|
+
|
|
|
|
+package net.md_5.bungee.entitymap;
|
|
|
|
+
|
|
|
|
+import io.netty.buffer.ByteBuf;
|
|
|
|
+// Waterfall start
|
|
|
|
+
|
|
|
|
+public class EntityMap_Dummy extends EntityMap {
|
|
|
|
+
|
|
|
|
+ public static final EntityMap_Dummy INSTANCE = new EntityMap_Dummy();
|
|
|
|
+
|
|
|
|
+ EntityMap_Dummy() {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void rewriteServerbound(ByteBuf packet, int oldId, int newId) {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void rewriteServerbound(ByteBuf packet, int oldId, int newId, int protocolVersion) {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void rewriteClientbound(ByteBuf packet, int oldId, int newId) {
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void rewriteClientbound(ByteBuf packet, int oldId, int newId, int protocolVersion) {
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+// Waterfall end
|
|
|
|
\ No newline at end of file
|
|
|
|
--
|
2022-12-07 17:30:18 +01:00
|
|
|
2.38.1
|
2019-01-15 04:29:51 +01:00
|
|
|
|