Waterfall/BungeeCord-Patches/0038-Store-last-known-dimension-and-don-t-send-useless-re.patch

131 lines
5.8 KiB
Diff

From 0619f444be30213382fa501bcc12bc5dc68f58bc Mon Sep 17 00:00:00 2001
From: PunKeel <punkeel@me.com>
Date: Wed, 8 Apr 2015 22:36:33 +0200
Subject: [PATCH] Store last known dimension and don't send useless respawn
packets
In order to improve server switching without lossing the advantages of the Respawn package (reset entities, for instance)
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 e327325..f1ccd72 100644
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
@@ -257,7 +257,10 @@ public class ServerConnector extends PacketHandler
}
user.getSentBossBars().clear();
- user.sendDimensionSwitch();
+ if( user.getDimension() == login.getDimension() ){
+ // Only change dimension to reset entities
+ user.unsafe().sendPacket( new Respawn( ( login.getDimension() == 0 ) ? 1 : 0, login.getDifficulty(), login.getGameMode(), login.getLevelType() ) );
+ }
user.setServerEntityId( login.getEntityId() );
user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getDifficulty(), login.getGameMode(), login.getLevelType() ) );
@@ -280,7 +283,7 @@ public class ServerConnector extends PacketHandler
target.addPlayer( user );
user.getPendingConnects().remove( target );
user.setServerJoinQueue( null );
- user.setDimensionChange( false );
+ user.setDimension( login.getDimension() );
user.setServer( server );
ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new DownstreamBridge( bungee, user, server ) );
@@ -316,14 +319,7 @@ public class ServerConnector extends PacketHandler
throw CancelSendSignal.INSTANCE;
}
- String message = bungee.getTranslation( "connect_kick", target.getName(), event.getKickReason() );
- if ( user.isDimensionChange() )
- {
- user.disconnect( message );
- } else
- {
- user.sendMessage( message );
- }
+ user.sendMessage( bungee.getTranslation( "connect_kick", target.getName(), event.getKickReason() ) );
throw CancelSendSignal.INSTANCE;
}
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 9a13f5c..ff103bf 100644
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
@@ -89,7 +89,7 @@ public final class UserConnection implements ProxiedPlayer
private ServerConnection server;
@Getter
@Setter
- private boolean dimensionChange = true;
+ private int dimension = 0;
@Getter
private final Collection<ServerInfo> pendingConnects = new HashSet<>();
/*========================================================================*/
@@ -187,7 +187,7 @@ public final class UserConnection implements ProxiedPlayer
// No-config FML handshake marker.
// Set whether the connection has a 1.8 FML marker in the handshake.
- if (this.getPendingConnection().getExtraDataInHandshake().contains( ForgeConstants.FML_HANDSHAKE_TOKEN ))
+ if (this.getPendingConnection().getExtraDataInHandshake().contains( ForgeConstants.FML_HANDSHAKE_TOKEN ))
{
forgeClientHandler.setFmlTokenInHandshake( true );
}
@@ -223,16 +223,8 @@ public final class UserConnection implements ProxiedPlayer
connect( target, callback, false );
}
- void sendDimensionSwitch()
- {
- dimensionChange = true;
- unsafe().sendPacket( PacketConstants.DIM1_SWITCH );
- unsafe().sendPacket( PacketConstants.DIM2_SWITCH );
- }
-
public void connectNow(ServerInfo target)
{
- sendDimensionSwitch();
connect( target );
}
@@ -328,12 +320,9 @@ public final class UserConnection implements ProxiedPlayer
{
sendMessage( bungee.getTranslation( "fallback_lobby" ) );
connect( def, null, false );
- } else if ( dimensionChange )
- {
- disconnect( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
} else
{
- sendMessage( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
+ disconnect( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
}
}
}
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 fa57f28..017c2b2 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
@@ -37,6 +37,7 @@ import net.md_5.bungee.protocol.packet.ScoreboardScore;
import net.md_5.bungee.protocol.packet.ScoreboardDisplay;
import net.md_5.bungee.protocol.packet.PluginMessage;
import net.md_5.bungee.protocol.packet.Kick;
+import net.md_5.bungee.protocol.packet.Respawn;
import net.md_5.bungee.protocol.packet.SetCompression;
import net.md_5.bungee.protocol.packet.TabCompleteResponse;
import net.md_5.bungee.tab.TabList;
@@ -501,6 +502,12 @@ public class DownstreamBridge extends PacketHandler
}
@Override
+ public void handle(Respawn respawn) throws Exception
+ {
+ con.setDimension( respawn.getDimension() );
+ }
+
+ @Override
public String toString()
{
return "[" + con.getAddress() + "|" + con.getName() + "] <-> DownstreamBridge <-> [" + server.getInfo().getName() + "]";
--
2.7.4 (Apple Git-66)