public void AddXteaKey(OutputMessage message) { message.AddU32(m_XteaKey[0]); message.AddU32(m_XteaKey[1]); message.AddU32(m_XteaKey[2]); message.AddU32(m_XteaKey[3]); }
public void SendFollow(uint creatureID) { if (creatureID != 0) { m_Player.StopAutowalk(false); } OutputMessage message = new OutputMessage(); message.AddU8(ClientServerOpCodes.Follow); message.AddU32(creatureID); message.AddU32(creatureID); // Sequence WriteToOutput(message); }
public void SendLookAtCreature(uint creatureID) { OutputMessage message = new OutputMessage(); message.AddU8(ClientServerOpCodes.Look); message.AddU32(creatureID); WriteToOutput(message); }
void AddSequenceNumber(OutputMessage message) { int pos = message.Tell(); message.Seek(0); message.AddU32(m_SequenceNumber++); message.IncreaseHeaderLength(sizeof(uint)); message.Seek(pos + sizeof(uint)); }
void AddChecksum(OutputMessage message) { if (ChecksumEnabled) { uint checksum = Adler32(message.GetBuffer().ToArray(), (uint)message.GetBufferLength()); int pos = message.Tell(); message.Seek(0); message.AddU32(checksum); message.IncreaseHeaderLength(sizeof(uint)); message.Seek(pos + sizeof(uint)); } }
public void SendUseOnCreature(UnityEngine.Vector3Int position, uint typeID, int positionOrData, uint creatureID) { if (position.x != 65535) { m_Player.StopAutowalk(false); } OutputMessage message = new OutputMessage(); message.AddU8(ClientServerOpCodes.UseObject); message.AddPosition(position); message.AddU16((ushort)typeID); message.AddU8((byte)positionOrData); message.AddU32(creatureID); WriteToOutput(message); }
protected void SendLogin() { OutputMessage message = new OutputMessage(); message.AddU8(ClientLoginOpCodes.EnterAccount); message.AddU16(Utility.OperatingSystem.GetCurrentOs()); var gameManager = OpenTibiaUnity.GameManager; message.AddU16((ushort)gameManager.ProtocolVersion); if (gameManager.GetFeature(GameFeatures.GameClientVersion)) { message.AddU32((uint)gameManager.ClientVersion); } if (gameManager.GetFeature(GameFeatures.GameContentRevision)) { message.AddU16(Constants.ContentRevision); message.AddU16(0); } else { message.AddU32(Constants.DatSignature); } message.AddU32(Constants.SprSignature); message.AddU32(Constants.PicSignature); if (gameManager.GetFeature(GameFeatures.GamePreviewState)) { message.AddU8(0x00); } int offset = message.Tell(); var random = new System.Random(); if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { message.AddU8(0); // first byte must be zero GenerateXteaKey(random); AddXteaKey(message); } if (gameManager.GetFeature(GameFeatures.GameAccountNames)) { message.AddString(AccountName); } else { message.AddU32(uint.Parse(AccountName)); } message.AddString(Password); int paddingBytes = Crypto.RSA.GetRsaSize() - (message.Tell() - offset); for (int i = 0; i < paddingBytes; i++) { message.AddU8((byte)random.Next(0xFF)); } if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { Crypto.RSA.EncryptMessage(message); } if (gameManager.GetFeature(GameFeatures.GameOGLInformation)) { message.AddU8(1); message.AddU8(1); if (gameManager.ClientVersion >= 1072) { message.AddString(string.Format("{0} {1}", OpenTibiaUnity.GraphicsVendor, OpenTibiaUnity.GraphicsDevice)); } else { message.AddString(OpenTibiaUnity.GraphicsDevice); } message.AddString(OpenTibiaUnity.GraphicsVersion); } if (gameManager.GetFeature(GameFeatures.GameAuthenticator)) { offset = message.Tell(); message.AddU8(0); message.AddString(string.Empty); // no auth-token message.AddU8(0); // stay logged-in for a while paddingBytes = Crypto.RSA.GetRsaSize() - (message.Tell() - offset); for (int i = 0; i < paddingBytes; i++) { message.AddU8((byte)random.Next(0xFF)); } Crypto.RSA.EncryptMessage(message); } if (gameManager.GetFeature(GameFeatures.GameProtocolChecksum)) { ChecksumEnabled = true; } WriteToOutput(message); if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { XteaEnabled = true; } }
// TODO: use a pool instead // and confirm the encryption of the packet ONLY on a successful sent // This is working, but using a pool is more of a robust public void SendLoginPacket(uint challengeTimestamp, byte challengeRandom) { OutputMessage message = new OutputMessage(); message.AddU8(ClientServerOpCodes.PendingGame); message.AddU16(Utility.OperatingSystem.GetCurrentOs()); var gameManager = OpenTibiaUnity.GameManager; message.AddU16((ushort)gameManager.ProtocolVersion); if (gameManager.GetFeature(GameFeatures.GameClientVersion)) { message.AddU32((uint)gameManager.ClientVersion); } if (gameManager.GetFeature(GameFeatures.GameContentRevision)) { message.AddU16(Constants.ContentRevision); } if (gameManager.GetFeature(GameFeatures.GamePreviewState)) { message.AddU8(0); } int offset = message.Tell(); message.AddU8(0); // first byte must be zero; var random = new System.Random(); if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { GenerateXteaKey(random); AddXteaKey(message); message.AddU8(0x00); // gm } if (gameManager.GetFeature(GameFeatures.GameSessionKey)) { message.AddString(SessionKey); message.AddString(CharacterName); } else { if (gameManager.GetFeature(GameFeatures.GameAccountNames)) { message.AddString(AccountName); } else { message.AddU32(uint.Parse(AccountName)); } message.AddString(CharacterName); message.AddString(Password); if (gameManager.GetFeature(GameFeatures.GameAuthenticator)) { message.AddString(AuthenticatorToken); } } if (gameManager.GetFeature(GameFeatures.GameChallengeOnLogin)) { message.AddU32(challengeTimestamp); message.AddU8(challengeRandom); } int paddingBytes = Crypto.RSA.GetRsaSize() - (message.Tell() - offset); for (int i = 0; i < paddingBytes; i++) { message.AddU8((byte)random.Next(0xFF)); } if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { Crypto.RSA.EncryptMessage(message); } if (gameManager.GetFeature(GameFeatures.GameProtocolChecksum)) { ChecksumEnabled = true; } WriteToOutput(message); if (gameManager.GetFeature(GameFeatures.GameLoginPacketEncryption)) { XteaEnabled = true; } }