mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-11-28 13:15:31 +01:00
d61b93a1e7
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing BungeeCord Changes: 75af27ac Fix missing static on ChatColor.values d0fd673b Minecraft 1.16 support + RGB ChatColor preview
256 lines
12 KiB
Diff
256 lines
12 KiB
Diff
From a1bed894651e0c892edf0e590bd9ba70f09ce8dd Mon Sep 17 00:00:00 2001
|
|
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
|
|
index e0baca9c..f3bced0a 100644
|
|
--- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
@@ -252,4 +252,9 @@ public interface ProxyConfig
|
|
* @return should we disable the tab completion limit for 1.13+ clients
|
|
*/
|
|
boolean isDisableModernTabLimiter();
|
|
+
|
|
+ /**
|
|
+ * @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
|
|
index 4ff8da6d..e860214f 100644
|
|
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
@@ -42,6 +42,8 @@ public class WaterfallConfiguration extends Configuration {
|
|
private int tabThrottle = 1000;
|
|
private boolean disableModernTabLimiter = true;
|
|
|
|
+ private boolean disableEntityMetadataRewrite = false;
|
|
+
|
|
@Override
|
|
public void load() {
|
|
super.load();
|
|
@@ -53,6 +55,7 @@ public class WaterfallConfiguration extends Configuration {
|
|
// Throttling options
|
|
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
|
|
disableModernTabLimiter = config.getBoolean("disable_modern_tab_limiter", disableModernTabLimiter);
|
|
+ disableEntityMetadataRewrite = config.getBoolean("disable_entity_metadata_rewrite", disableEntityMetadataRewrite);
|
|
}
|
|
|
|
@Override
|
|
@@ -79,4 +82,9 @@ public class WaterfallConfiguration extends Configuration {
|
|
public boolean isDisableModernTabLimiter() {
|
|
return disableModernTabLimiter;
|
|
}
|
|
+
|
|
+ @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
|
|
index f5e7ef7b..bb4e7ec2 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
@@ -228,7 +228,7 @@ public class ServerConnector extends PacketHandler
|
|
ch.write( message );
|
|
}
|
|
|
|
- if ( user.getSettings() != null )
|
|
+ if (!user.isDisableEntityMetadataRewrite() && user.getSettings() != null )
|
|
{
|
|
ch.write( user.getSettings() );
|
|
}
|
|
@@ -262,6 +262,7 @@ public class ServerConnector extends PacketHandler
|
|
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 ) );
|
|
@@ -274,6 +275,7 @@ public class ServerConnector extends PacketHandler
|
|
{
|
|
user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.Team( team.getName() ) );
|
|
}
|
|
+ } // Waterfall
|
|
serverScoreboard.clear();
|
|
|
|
for ( UUID bossbar : user.getSentBossBars() )
|
|
@@ -292,7 +294,7 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
|
|
user.setDimensionChange( true );
|
|
- if ( login.getDimension().equals( user.getDimension() ) )
|
|
+ if ( !user.isDisableEntityMetadataRewrite() && login.getDimension().equals( user.getDimension() ) ) // Waterfall - defer
|
|
{
|
|
Object newDim;
|
|
String worldName = login.getWorldName();
|
|
@@ -308,6 +310,44 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
|
|
user.setServerEntityId( login.getEntityId() );
|
|
+
|
|
+ // Waterfall start
|
|
+ if ( user.isDisableEntityMetadataRewrite() ) {
|
|
+ // Ensure that we maintain consistency
|
|
+ user.setClientEntityId( login.getEntityId() );
|
|
+
|
|
+ // Only send if we are not in the same dimension
|
|
+ if (!login.getDimension().equals( user.getDimension() ) ) // Waterfall - defer
|
|
+ {
|
|
+ Object newDim;
|
|
+ String worldName = login.getWorldName();
|
|
+ if (login.getDimension() instanceof Number) {
|
|
+ newDim = (((Number) login.getDimension()).intValue() >= 0 ? -1 : 0);
|
|
+ } else {
|
|
+ newDim = worldName = ("minecraft:overworld".equals(login.getDimension())) ? "minecraft:the_nether" : "minecraft:overworld";
|
|
+ }
|
|
+ user.unsafe().sendPacket( new Respawn( newDim, worldName, login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
+ }
|
|
+
|
|
+
|
|
+ Login modLogin = new Login( login.getEntityId(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
|
+ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat() );
|
|
+ user.unsafe().sendPacket(modLogin);
|
|
+
|
|
+ // Only send if we're in the same dimension
|
|
+ if (login.getDimension().equals( user.getDimension() ) ) // Waterfall - defer
|
|
+ {
|
|
+ Object newDim;
|
|
+ String worldName = login.getWorldName();
|
|
+ if (login.getDimension() instanceof Number) {
|
|
+ newDim = (((Number) login.getDimension()).intValue() >= 0 ? -1 : 0);
|
|
+ } else {
|
|
+ newDim = worldName = ("minecraft:overworld".equals(login.getDimension())) ? "minecraft:the_nether" : "minecraft:overworld";
|
|
+ }
|
|
+ user.unsafe().sendPacket( new Respawn( newDim, worldName, login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
+ }
|
|
+ }
|
|
+ // Waterfall end
|
|
user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
if ( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_14 )
|
|
{
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
index a254d998..4826f0d5 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
@@ -745,4 +745,10 @@ public final class UserConnection implements ProxiedPlayer
|
|
{
|
|
return serverSentScoreboard;
|
|
}
|
|
+
|
|
+ // Waterfall start
|
|
+ public boolean isDisableEntityMetadataRewrite() {
|
|
+ return entityRewrite == net.md_5.bungee.entitymap.EntityMap_Dummy.INSTANCE;
|
|
+ }
|
|
+ // 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
|
|
index cfd25859..f845da09 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
@@ -601,6 +601,7 @@ public class DownstreamBridge extends PacketHandler
|
|
@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()) {
|
|
@@ -612,6 +613,7 @@ public class DownstreamBridge extends PacketHandler
|
|
@Override
|
|
public void handle(EntityRemoveEffect removeEffect) throws Exception
|
|
{
|
|
+ if (con.isDisableEntityMetadataRewrite()) return; // Waterfall
|
|
con.getPotions().remove(rewriteEntityId(removeEffect.getEntityId()), removeEffect.getEffectId());
|
|
}
|
|
|
|
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
|
|
index 8a16fa93..ef2a66fa 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java
|
|
@@ -6,6 +6,7 @@ import io.netty.buffer.ByteBufInputStream;
|
|
import java.io.DataInputStream;
|
|
import lombok.AccessLevel;
|
|
import lombok.NoArgsConstructor;
|
|
+
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
|
import se.llbit.nbt.NamedTag;
|
|
@@ -27,6 +28,11 @@ public abstract class EntityMap
|
|
// Returns the correct entity map for the protocol version
|
|
public static EntityMap getEntityMap(int version)
|
|
{
|
|
+ // Waterfall start
|
|
+ if (net.md_5.bungee.api.ProxyServer.getInstance().getConfig().isDisableEntityMetadataRewrite()) {
|
|
+ return EntityMap_Dummy.INSTANCE;
|
|
+ }
|
|
+ // Waterfall end
|
|
switch ( version )
|
|
{
|
|
case ProtocolConstants.MINECRAFT_1_8:
|
|
@@ -279,7 +285,13 @@ public abstract class EntityMap
|
|
DefinedPacket.readVarInt( packet );
|
|
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
|
|
}
|
|
}
|
|
|
|
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
|
|
--
|
|
2.27.0
|
|
|