Properly fix workaround for D3 server bug. (Thanks Evander)

This commit is contained in:
UnknownShadow200 2016-04-13 21:30:14 +10:00
parent ba3418908d
commit ce2efa5ba9
2 changed files with 6 additions and 1 deletions

View File

@ -60,6 +60,7 @@ namespace ClassicalSharp.Net {
int cpeServerExtensionsCount;
bool sendHeldBlock, useMessageTypes;
int envMapAppearanceVer = 2, blockDefinitionsExtVer = 2;
bool needD3Fix;
static string[] clientExtensions = {
"ClickDistance", "CustomBlocks", "HeldBlock", "EmoteFix", "TextHotKey", "ExtPlayerList",
"EnvColors", "SelectionCuboid", "BlockPermissions", "ChangeModel", "EnvMapAppearance",
@ -70,6 +71,8 @@ namespace ClassicalSharp.Net {
void HandleCpeExtInfo() {
string appName = reader.ReadAsciiString();
game.Chat.Add( "Server software: " + appName );
if( Utils.CaselessStarts( appName, "D3 server" ) )
needD3Fix = true;
// Workaround for MCGalaxy that send ExtEntry sync but ExtInfoAsync. This means
// ExtEntry may sometimes arrive before ExtInfo, and thus we have to use += instead of =

View File

@ -44,6 +44,7 @@ namespace ClassicalSharp.Net {
gzippedMap = new FixedBufferStream( reader.buffer );
envMapAppearanceVer = 2;
blockDefinitionsExtVer = 2;
needD3Fix = false;
Disconnected = false;
receivedFirstPosition = false;
@ -82,7 +83,8 @@ namespace ClassicalSharp.Net {
while( (reader.size - reader.index) > 0 ) {
byte opcode = reader.buffer[reader.index];
// Workaround for older D3 servers which wrote one byte too many for HackControl packets.
if( opcode == 0xFF && lastOpcode == PacketId.CpeHackControl ) {
if( needD3Fix && lastOpcode == PacketId.CpeHackControl && (opcode == 0x00 || opcode == 0xFF) ) {
Utils.LogDebug( "Skipping invalid HackControl byte from D3 server." );
reader.Skip( 1 );
player.physics.jumpVel = 0.42f; // assume default jump height
player.physics.serverJumpVel = player.physics.jumpVel;