public void SendAttack(uint creatureID) { if (creatureID != 0) { m_Player.StopAutowalk(false); } OutputMessage message = new OutputMessage(); message.AddU8(ClientServerOpCodes.Attack); message.AddU32(creatureID); message.AddU32(creatureID); // Sequence 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; } }
public void SendGo(List <int> pathSteps) { if (pathSteps == null) { return; } m_CreatureStorage.ClearTargets(); OutputMessage message = new OutputMessage(); if (pathSteps.Count == 1) { switch ((PathDirection)(pathSteps[0] & 65535)) { case PathDirection.East: message.AddU8(ClientServerOpCodes.GoEast); break; case PathDirection.NorthEast: message.AddU8(ClientServerOpCodes.GoNorthEast); break; case PathDirection.North: message.AddU8(ClientServerOpCodes.GoNorth); break; case PathDirection.NorthWest: message.AddU8(ClientServerOpCodes.GoNorthWest); break; case PathDirection.West: message.AddU8(ClientServerOpCodes.GoWest); break; case PathDirection.SouthWest: message.AddU8(ClientServerOpCodes.GoSouthWest); break; case PathDirection.South: message.AddU8(ClientServerOpCodes.GoSouth); break; case PathDirection.SouthEast: message.AddU8(ClientServerOpCodes.GoSouthEast); break; default: return; } } else { int pathMaxSteps = (byte)System.Math.Min(byte.MaxValue, pathSteps.Count); message.AddU8(ClientServerOpCodes.GoPath); message.AddU8((byte)pathMaxSteps); int i = 0; while (i < pathMaxSteps) { message.AddU8((byte)(pathSteps[i] & 65535)); i++; } } WriteToOutput(message); }