Fix login

This commit is contained in:
Hondacrx
2024-11-16 23:05:45 -05:00
parent 76b0d747d3
commit 406aa5e445
26 changed files with 151 additions and 76 deletions
+47
View File
@@ -82,6 +82,11 @@ namespace Game.Networking
public ConnectionType GetConnection() { return connectionType; }
public bool IsValidOpcode()
{
return _worldPacket.IsValidOpcode();
}
byte[] buffer;
ConnectionType connectionType;
protected WorldPacket _worldPacket;
@@ -209,6 +214,48 @@ namespace Game.Networking
public DateTime GetReceivedTime() { return m_receivedTime; }
public void SetReceiveTime(DateTime receivedTime) { m_receivedTime = receivedTime; }
public bool IsValidOpcode()
{
int opcodeArrayIndex = GetOpcodeArrayIndex(opcode);
return opcodeArrayIndex >= 0 && opcodeArrayIndex < 1699;
}
int GetOpcodeArrayIndex(uint opcode)
{
int idInGroup = (int)(opcode & 0xFFFF);
switch (opcode >> 16)
{
case 0x2A: return idInGroup < 26 ? idInGroup + 0 : -1;
case 0x2C: return idInGroup < 47 ? idInGroup + 26 : -1;
case 0x2D: return idInGroup < 3 ? idInGroup + 73 : -1;
case 0x2E: return idInGroup < 33 ? idInGroup + 76 : -1;
case 0x30: return idInGroup < 739 ? idInGroup + 109 : -1;
case 0x31: return idInGroup < 298 ? idInGroup + 848 : -1;
case 0x32: return idInGroup < 12 ? idInGroup + 1146 : -1;
case 0x33: return idInGroup < 130 ? idInGroup + 1158 : -1;
case 0x35: return idInGroup < 396 ? idInGroup + 1288 : -1;
case 0x36: return idInGroup < 15 ? idInGroup + 1684 : -1;
case 0x37: return idInGroup < 831 ? idInGroup + 0 : -1;
case 0x38: return idInGroup < 10 ? idInGroup + 831 : -1;
case 0x3B: return idInGroup < 18 ? idInGroup + 841 : -1;
case 0x3C: return idInGroup < 33 ? idInGroup + 859 : -1;
case 0x3D: return idInGroup < 49 ? idInGroup + 892 : -1;
case 0x3E: return idInGroup < 11 ? idInGroup + 941 : -1;
case 0x3F: return idInGroup < 12 ? idInGroup + 952 : -1;
case 0x41: return idInGroup < 82 ? idInGroup + 964 : -1;
case 0x43: return idInGroup < 67 ? idInGroup + 1046 : -1;
case 0x45: return idInGroup < 32 ? idInGroup + 1113 : -1;
case 0x47: return idInGroup < 1 ? idInGroup + 1145 : -1;
case 0x48: return idInGroup < 118 ? idInGroup + 1146 : -1;
case 0x4A: return idInGroup < 46 ? idInGroup + 1264 : -1;
case 0x4B: return idInGroup < 41 ? idInGroup + 1310 : -1;
case 0x4D: return idInGroup < 85 ? idInGroup + 1351 : -1;
case 0x4E: return idInGroup < 8 ? idInGroup + 1436 : -1;
case 0x50: return idInGroup < 1 ? idInGroup + 1444 : -1;
default: return -1;
}
}
uint opcode;
DateTime m_receivedTime; // only set for a specific set of opcodes, for performance reasons.
}
@@ -55,7 +55,7 @@ namespace Game.Networking.Packets
foreach (WarbandGroup warbandGroup in WarbandGroups)
warbandGroup.Write(_worldPacket);
foreach (CharacterInfoBasic charInfo in Characters)
foreach (CharacterInfo charInfo in Characters)
charInfo.Write(_worldPacket);
foreach (RegionwideCharacterListEntry charInfo in RegionwideCharacters)
@@ -77,7 +77,7 @@ namespace Game.Networking.Packets
public int MaxCharacterLevel = 1;
public uint? DisabledClassesMask = new();
public List<CharacterInfoBasic> Characters = new(); // all characters on the list
public List<CharacterInfo> Characters = new(); // all characters on the list
public List<RegionwideCharacterListEntry> RegionwideCharacters = new();
public List<RaceUnlock> RaceUnlockData = new();
public List<UnlockedConditionalAppearance> UnlockedConditionalAppearances = new();
@@ -260,7 +260,7 @@ namespace Game.Networking.Packets
public uint PetCreatureFamilyId;
public uint[] ProfessionIds = new uint[2]; // @todo
public VisualItemInfo[] VisualItems = new VisualItemInfo[19];
public CustomTabardInfo PersonalTabard;
public CustomTabardInfo PersonalTabard = new();
public struct VisualItemInfo
{
@@ -332,7 +332,7 @@ namespace Game.Networking.Packets
public struct CharacterInfo
{
public CharacterInfoBasic Basic;
public CharacterRestrictionAndMailData RestrictionsAndMails;
public CharacterRestrictionAndMailData RestrictionsAndMails = new();
public CharacterInfo(SQLFields fields)
{
@@ -11,9 +11,6 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt16(MapID);
_worldPacket.WriteUInt32(NumObjUpdates);
_worldPacket.WriteBit(true); // unk
_worldPacket.WriteBytes(Data);
}
+2 -2
View File
@@ -245,7 +245,7 @@ namespace Game.Networking
WorldPacket packet = new(_packetBuffer.GetData());
_packetBuffer.Reset();
if (packet.GetOpcode() >= (int)ClientOpcodes.Max)
if (!packet.IsValidOpcode())
{
Log.outError(LogFilter.Network, $"WorldSocket.ReadData(): client {GetRemoteIpAddress()} sent wrong opcode (opcode: {packet.GetOpcode()})");
Log.outError(LogFilter.Network, $"Header: {_headerBuffer.GetData().ToHexString()} Data: {_packetBuffer.GetData().ToHexString()}");
@@ -361,7 +361,7 @@ namespace Game.Networking
int packetSize = data.Length;
if (packetSize > 0x400 && _worldCrypt.IsInitialized)
{
buffer.WriteInt32(packetSize + 2);
buffer.WriteInt32(packetSize + 4);
buffer.WriteUInt32(ZLib.adler32(ZLib.adler32(0x9827D8F1, BitConverter.GetBytes((uint)opcode), 4), data, (uint)packetSize));
byte[] compressedData;