public static async void HandleConnectResponse(ClientPacket packet, Session session) { ulong check = packet.Payload.ReadUInt64(); // 13626398284849559039 - sent in previous packet var result = await DatabaseManager.Character.GetByAccount(session.Id); CharacterListSelectCallback(result, session); // looks like account settings/info, expansion information ect? (this is needed for world entry) var packet75e5 = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var packet75e5Fragment = new ServerPacketFragment(5, GameMessageOpcode.Unknown75E5); packet75e5Fragment.Payload.Write(1ul); packet75e5Fragment.Payload.Write(1ul); packet75e5Fragment.Payload.Write(1ul); packet75e5Fragment.Payload.Write(2ul); packet75e5Fragment.Payload.Write(0ul); packet75e5Fragment.Payload.Write(1ul); packet75e5.Fragments.Add(packet75e5Fragment); NetworkManager.SendPacket(ConnectionType.Login, packet75e5, session); var patchStatus = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); patchStatus.Fragments.Add(new ServerPacketFragment(5, GameMessageOpcode.PatchStatus)); NetworkManager.SendPacket(ConnectionType.Login, patchStatus, session); session.State = SessionState.AuthConnected; }
public static async void CharacterDelete(ClientPacketFragment fragment, Session session) { string account = fragment.Payload.ReadString16L(); uint characterSlot = fragment.Payload.ReadUInt32(); if (account != session.Account) { session.SendCharacterError(CharacterError.Delete); return; } var cachedCharacter = session.CachedCharacters.SingleOrDefault(c => c.SlotId == characterSlot); if (cachedCharacter == null) { session.SendCharacterError(CharacterError.Delete); return; } // TODO: check if character is already pending removal var characterDelete = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var characterDeleteFragment = new ServerPacketFragment(9, GameMessageOpcode.CharacterDelete); characterDelete.Fragments.Add(characterDeleteFragment); NetworkManager.SendPacket(ConnectionType.Login, characterDelete, session); DatabaseManager.Character.DeleteOrRestore(Time.GetUnixTime() + 3600ul, cachedCharacter.Guid.Low); var result = await DatabaseManager.Character.GetByAccount(session.Id); AuthenticationHandler.CharacterListSelectCallback(result, session); }
public GameEventFraglessPacket(Session target) { Debug.Assert(target.Player != null); session = target; fragment = new ServerPacketFragment(0x0A, FragmentOpcode.None); }
public static void CharacterRestore(ClientPacketFragment fragment, Session session) { ObjectGuid guid = fragment.Payload.ReadGuid(); var cachedCharacter = session.CachedCharacters.SingleOrDefault(c => c.Guid.Full == guid.Full); if (cachedCharacter == null) { return; } bool isAvailable = DatabaseManager.Character.IsNameAvailable(cachedCharacter.Name); if (!isAvailable) { SendCharacterCreateResponse(session, CharacterGenerationVerificationResponse.NameInUse); /* Name already in use. */ return; } DatabaseManager.Character.DeleteOrRestore(0, guid.Low); var characterRestore = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var characterRestoreFragment = new ServerPacketFragment(9, GameMessageOpcode.CharacterRestoreResponse); characterRestoreFragment.Payload.Write(1u /* Verification OK flag */); characterRestoreFragment.Payload.WriteGuid(guid); characterRestoreFragment.Payload.WriteString16L(cachedCharacter.Name); characterRestoreFragment.Payload.Write(0u /* secondsGreyedOut */); characterRestore.Fragments.Add(characterRestoreFragment); NetworkManager.SendPacket(ConnectionType.Login, characterRestore, session); }
public GameEventPacket(Session target) { Debug.Assert(target.Character != null); session = target; fragment = new ServerPacketFragment(9, FragmentOpcode.GameEvent); }
public static void SendTurbineChatMessage(Session session, GameMessage message) { ServerPacketFragment fragment = new ServerPacketFragment(4, message); var packet = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); packet.Fragments.Add(fragment); NetworkManager.SendPacket(ConnectionType.World, packet, session); }
public override void Handle() { session.Character.InWorld = true; var setState = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var setStateFragment = new ServerPacketFragment(0x0A, FragmentOpcode.SetState); setStateFragment.Payload.Write(session.Character.Guid.Full); setStateFragment.Payload.Write((uint)(PhysicsState.ReportCollision | PhysicsState.Gravity | PhysicsState.EdgeSlide)); setStateFragment.Payload.Write((ushort)session.Character.LoginIndex); setStateFragment.Payload.Write((ushort)++session.Character.PortalIndex); setState.Fragments.Add(setStateFragment); // TODO: should be broadcast NetworkManager.SendPacket(ConnectionType.World, setState, session); }
private void SendSelf() { NetworkManager.SendPacket(ConnectionType.World, BuildObjectCreate(), Session); var playerCreate = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var playerCreateFragment = new ServerPacketFragment(0x0A, FragmentOpcode.PlayerCreate); playerCreateFragment.Payload.WriteGuid(Guid); playerCreate.Fragments.Add(playerCreateFragment); NetworkManager.SendPacket(ConnectionType.World, playerCreate, Session); // TODO: gear and equip new GameEventPlayerDescription(Session).Send(); new GameEventCharacterTitle(Session).Send(); }
public static void SendWorldMessages(Session session, IEnumerable <GameMessage> messages) { #if MultiFragment var packet = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); foreach (var message in messages) { ServerPacketFragment fragment = new ServerPacketFragment(9, message); packet.Fragments.Add(fragment); } NetworkManager.SendPacket(ConnectionType.World, packet, session); #else foreach (var message in messages) { SendWorldMessage(session, message); } #endif }
private static void SendCharacterCreateResponse(Session session, CharacterGenerationVerificationResponse response, ObjectGuid guid = null, string charName = "") { var charCreateResponse = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var charCreateFragment = new ServerPacketFragment(9, GameMessageOpcode.CharacterCreateResponse); charCreateFragment.Payload.Write((uint)response); if (response == CharacterGenerationVerificationResponse.Ok) { charCreateFragment.Payload.WriteGuid(guid); charCreateFragment.Payload.WriteString16L(charName); charCreateFragment.Payload.Write(0u); } charCreateResponse.Fragments.Add(charCreateFragment); NetworkManager.SendPacket(ConnectionType.Login, charCreateResponse, session); }
public void SetPhysicsState(PhysicsState state, bool packet = true) { PhysicsState = state; if (packet) { var setState = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var setStateFragment = new ServerPacketFragment(0x0A, FragmentOpcode.SetState); setStateFragment.Payload.WriteGuid(Guid); setStateFragment.Payload.Write((uint)state); setStateFragment.Payload.Write((ushort)character.TotalLogins); setStateFragment.Payload.Write((ushort)++PortalIndex); setState.Fragments.Add(setStateFragment); // TODO: this should be broadcast NetworkManager.SendPacket(ConnectionType.World, setState, Session); } }
public static void SendSystemMessage(Session session, string message) { var textboxString = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var textboxStringFragment = new ServerPacketFragment(0x09, FragmentOpcode.TextboxString); textboxStringFragment.Payload.WriteString16L(message); textboxStringFragment.Payload.Write(0x00); textboxString.Fragments.Add(textboxStringFragment); if (session == null) { // TODO: broadcast } else { NetworkManager.SendPacket(ConnectionType.World, textboxString, session); } }
private void SendSelf() { NetworkManager.SendPacket(ConnectionType.World, BuildObjectCreate(), Session); var playerCreate = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var playerCreateFragment = new ServerPacketFragment(0x0A, GameMessageOpcode.PlayerCreate); playerCreateFragment.Payload.WriteGuid(Guid); playerCreate.Fragments.Add(playerCreateFragment); NetworkManager.SendPacket(ConnectionType.World, playerCreate, Session); // TODO: gear and equip var player = new GameEventPlayerDescription(Session); var title = new GameEventCharacterTitle(Session); var friends = new GameEventFriendsListUpdate(Session); NetworkManager.SendWorldMessages(Session, new GameMessage[] { player, title, friends }); }
public void Teleport(Position newPosition) { if (!InWorld) { return; } InWorld = false; SetPhysicsState(PhysicsState.IgnoreCollision | PhysicsState.Gravity | PhysicsState.Hidden | PhysicsState.EdgeSlide); var playerTeleport = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var playerTeleportFragment = new ServerPacketFragment(0x0A, FragmentOpcode.PlayerTeleport); playerTeleportFragment.Payload.Write(++TeleportIndex); playerTeleportFragment.Payload.Write(0u); playerTeleportFragment.Payload.Write(0u); playerTeleportFragment.Payload.Write((ushort)0); playerTeleport.Fragments.Add(playerTeleportFragment); NetworkManager.SendPacket(ConnectionType.World, playerTeleport, Session); // must be sent after the teleport packet UpdatePosition(newPosition); }
public static void CharacterListSelectCallback(List <CachedCharacter> characters, Session session) { var characterList = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var characterFragment = new ServerPacketFragment(9, GameMessageOpcode.CharacterList); characterFragment.Payload.Write(0u); characterFragment.Payload.Write(characters.Count); session.CachedCharacters.Clear(); foreach (var character in characters) { characterFragment.Payload.WriteGuid(character.Guid); characterFragment.Payload.WriteString16L(character.Name); characterFragment.Payload.Write(character.DeleteTime != 0ul ? (uint)(Time.GetUnixTime() - character.DeleteTime) : 0u); session.CachedCharacters.Add(character); } characterFragment.Payload.Write(0u); characterFragment.Payload.Write(11u /*slotCount*/); characterFragment.Payload.WriteString16L(session.Account); characterFragment.Payload.Write(1u /*useTurbineChat*/); characterFragment.Payload.Write(0u /*hasThroneOfDestiny*/); characterList.Fragments.Add(characterFragment); NetworkManager.SendPacket(ConnectionType.Login, characterList, session); var serverName = new ServerPacket(0x0B, PacketHeaderFlags.EncryptedChecksum); var serverNameFragment = new ServerPacketFragment(9, GameMessageOpcode.ServerName); serverNameFragment.Payload.Write(0u); serverNameFragment.Payload.Write(0u); serverNameFragment.Payload.WriteString16L(ConfigManager.Config.Server.WorldName); serverName.Fragments.Add(serverNameFragment); NetworkManager.SendPacket(ConnectionType.Login, serverName, session); }
public ServerPacket BuildObjectCreate() { var player = Guid.IsPlayer() ? this as Player : null; var objectCreate = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var objectCreateFragment = new ServerPacketFragment(0x0A, FragmentOpcode.ObjectCreate); objectCreateFragment.Payload.Write(Guid.Full); // TODO: model information objectCreateFragment.Payload.Write((byte)0x11); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Align(); PhysicsDescriptionFlag flags = PhysicsDescriptionFlag.CSetup | PhysicsDescriptionFlag.MTable | PhysicsDescriptionFlag.Stable | PhysicsDescriptionFlag.Petable | PhysicsDescriptionFlag.Position; objectCreateFragment.Payload.Write((uint)flags); objectCreateFragment.Payload.Write((uint)(PhysicsState.IgnoreCollision | PhysicsState.Gravity | PhysicsState.Hidden | PhysicsState.EdgeSlide)); /*if ((flags & PhysicsDescriptionFlag.Movement) != 0) * { * }*/ /*if ((flags & PhysicsDescriptionFlag.AnimationFrame) != 0) * { * }*/ if ((flags & PhysicsDescriptionFlag.Position) != 0) { Position.Write(objectCreateFragment.Payload); } // TODO: if ((flags & PhysicsDescriptionFlag.MTable) != 0) { objectCreateFragment.Payload.Write(0x09000001u); } if ((flags & PhysicsDescriptionFlag.Stable) != 0) { objectCreateFragment.Payload.Write(0x20000001u); } if ((flags & PhysicsDescriptionFlag.Petable) != 0) { objectCreateFragment.Payload.Write(0x34000004u); } if ((flags & PhysicsDescriptionFlag.CSetup) != 0) { objectCreateFragment.Payload.Write(0x02000001u); } /*if ((flags & PhysicsDescriptionFlag.Parent) != 0) * { * }*/ /*if ((flags & PhysicsDescriptionFlag.Children) != 0) * { * }*/ if ((flags & PhysicsDescriptionFlag.ObjScale) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Friction) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Elastcity) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Translucency) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Velocity) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Acceleration) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Omega) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.DefaultScript) != 0) { objectCreateFragment.Payload.Write(0u); } if ((flags & PhysicsDescriptionFlag.DefaultScriptIntensity) != 0) { objectCreateFragment.Payload.Write(0.0f); } objectCreateFragment.Payload.Write((ushort)MovementIndex); objectCreateFragment.Payload.Write((ushort)1); objectCreateFragment.Payload.Write((ushort)(player != null ? player.PortalIndex : 0)); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)TeleportIndex); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)(player != null ? player.LoginIndex : 0)); objectCreateFragment.Payload.Align(); var weenieHeaderFlags = WeenieHeaderFlag.ItemCapacity | WeenieHeaderFlag.ContainerCapacity | WeenieHeaderFlag.Useability | WeenieHeaderFlag.BlipColour | WeenieHeaderFlag.Radar; objectCreateFragment.Payload.Write((uint)weenieHeaderFlags); objectCreateFragment.Payload.WriteString16L(Name); objectCreateFragment.Payload.Write((ushort)1); objectCreateFragment.Payload.Write((ushort)0x1036); objectCreateFragment.Payload.Write((uint)Type); objectCreateFragment.Payload.Write((uint)DescriptionFlags); if ((DescriptionFlags & ObjectDescriptionFlag.AdditionFlags) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.PuralName) != 0) { objectCreateFragment.Payload.WriteString16L(""); } if ((weenieHeaderFlags & WeenieHeaderFlag.ItemCapacity) != 0) { objectCreateFragment.Payload.Write((byte)102); } if ((weenieHeaderFlags & WeenieHeaderFlag.ContainerCapacity) != 0) { objectCreateFragment.Payload.Write((byte)7); } if ((weenieHeaderFlags & WeenieHeaderFlag.AmmoType) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Value) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Useability) != 0) { objectCreateFragment.Payload.Write(1u); } if ((weenieHeaderFlags & WeenieHeaderFlag.UseRadius) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((weenieHeaderFlags & WeenieHeaderFlag.TargetType) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.UiEffects) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.CombatUse) != 0) { objectCreateFragment.Payload.Write((byte)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Struture) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.MaxStructure) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.StackSize) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.MaxStackSize) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Container) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Wielder) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.ValidLocations) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Location) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Priority) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.BlipColour) != 0) { objectCreateFragment.Payload.Write((byte)9); } if ((weenieHeaderFlags & WeenieHeaderFlag.Radar) != 0) { objectCreateFragment.Payload.Write((byte)4); } if ((weenieHeaderFlags & WeenieHeaderFlag.Script) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Workmanship) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((weenieHeaderFlags & WeenieHeaderFlag.Burden) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Spell) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.HouseOwner) != 0) { objectCreateFragment.Payload.Write(0u); } /*if ((weenieHeaderFlags & WeenieHeaderFlag.HouseRestrictions) != 0) * { * }*/ if ((weenieHeaderFlags & WeenieHeaderFlag.HookItemTypes) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Monarch) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.HookType) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.IconOverlay) != 0) { objectCreateFragment.Payload.Write((ushort)0); } /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.IconUnderlay) != 0) * objectCreateFragment.Payload.Write((ushort)0);*/ if ((weenieHeaderFlags & WeenieHeaderFlag.Material) != 0) { objectCreateFragment.Payload.Write(0u); } /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.Cooldown) != 0) * objectCreateFragment.Payload.Write(0u);*/ /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.CooldownDuration) != 0) * objectCreateFragment.Payload.Write(0.0d);*/ /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.PetOwner) != 0) * objectCreateFragment.Payload.Write(0u);*/ objectCreateFragment.Payload.Align(); objectCreate.Fragments.Add(objectCreateFragment); return(objectCreate); }
public void UpdatePosition(Position newPosition) { // TODO: sanity checks Position = newPosition; var updatePositionFlags = UpdatePositionFlag.Contact; /*if (newPosition.Facing.W == 0.0f || newPosition.Facing.W == Position.Facing.W) * updatePositionFlags |= UpdatePositionFlag.NoQuaternionW; * if (newPosition.Facing.X == 0.0f || newPosition.Facing.X == Position.Facing.X) * updatePositionFlags |= UpdatePositionFlag.NoQuaternionX; * if (newPosition.Facing.Y == 0.0f || newPosition.Facing.Y == Position.Facing.Y) * updatePositionFlags |= UpdatePositionFlag.NoQuaternionY; * if (newPosition.Facing.Z == 0.0f || newPosition.Facing.Z == Position.Facing.Z) * updatePositionFlags |= UpdatePositionFlag.NoQuaternionZ;*/ var updatePosition = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var updatePositionFragment = new ServerPacketFragment(0x0A, FragmentOpcode.UpdatePosition); updatePositionFragment.Payload.Write(Guid.Full); updatePositionFragment.Payload.Write((uint)updatePositionFlags); newPosition.Write(updatePositionFragment.Payload, false); if ((updatePositionFlags & UpdatePositionFlag.NoQuaternionW) == 0) { updatePositionFragment.Payload.Write(newPosition.Facing.W); } if ((updatePositionFlags & UpdatePositionFlag.NoQuaternionW) == 0) { updatePositionFragment.Payload.Write(newPosition.Facing.X); } if ((updatePositionFlags & UpdatePositionFlag.NoQuaternionW) == 0) { updatePositionFragment.Payload.Write(newPosition.Facing.Y); } if ((updatePositionFlags & UpdatePositionFlag.NoQuaternionW) == 0) { updatePositionFragment.Payload.Write(newPosition.Facing.Z); } /*if ((updatePositionFlags & UpdatePositionFlag.Velocity) != 0) * { * }*/ /*if ((updatePositionFlags & UpdatePositionFlag.Placement) != 0) * { * }*/ var player = Guid.IsPlayer() ? this as Player : null; updatePositionFragment.Payload.Write((ushort)(player != null ? player.LoginIndex : 0)); updatePositionFragment.Payload.Write((ushort)++MovementIndex); updatePositionFragment.Payload.Write((ushort)TeleportIndex); updatePositionFragment.Payload.Write((ushort)0); updatePosition.Fragments.Add(updatePositionFragment); // TODO: this packet needs to be broadcast to the grid system, just send to self for now if (Guid.IsPlayer()) { NetworkManager.SendPacket(ConnectionType.World, updatePosition, (this as Player).Session); } }
// TODO: packet pipe really needs a rework... private static bool ConstructPacket(out byte[] buffer, ConnectionType type, ServerPacket packet, Session session, bool useHeaders = false) { var connectionData = (type == ConnectionType.Login ? session.LoginConnection : session.WorldConnection); using (var packetStream = new MemoryStream()) { using (var packetWriter = new BinaryWriter(packetStream)) { packetWriter.Seek((int)PacketHeader.HeaderSize, SeekOrigin.Begin); packetWriter.Write(packet.Data.ToArray()); if (packet.Fragments.Count > 0) { packet.Header.Flags |= PacketHeaderFlags.BlobFragments; for (int i = 0; i < packet.Fragments.Count; i++) { var fragment = (ServerPacketFragment)packet.Fragments[i]; uint fragmentsRequired = ((uint)fragment.Data.Length / PacketFragment.MaxFragmentDataSize); if ((fragment.Data.Length % PacketFragment.MaxFragmentDataSize) != 0) { fragmentsRequired++; } if (fragmentsRequired > 1u) { fragment.Data.Seek(0L, SeekOrigin.Begin); uint dataToSend = (uint)fragment.Data.Length; uint fragmentSeq = connectionData.FragmentSequence++; for (uint j = 0u; j < fragmentsRequired; j++) { uint fragmentSize = dataToSend > PacketFragment.MaxFragmentDataSize ? PacketFragment.MaxFragmentDataSize : dataToSend; byte[] data = new byte[fragmentSize]; fragment.Data.Read(data, 0, (int)fragmentSize); var newPacket = new ServerPacket(packet.Header.Id, PacketHeaderFlags.EncryptedChecksum | PacketHeaderFlags.BlobFragments); var newFragment = new ServerPacketFragment(fragment.Header.Group); newFragment.Header.Sequence = fragmentSeq; newFragment.Header.Id = 0x80000000; newFragment.Header.Count = (ushort)fragmentsRequired; newFragment.Header.Index = (ushort)j; newFragment.Data.Write(data, 0, (int)fragmentSize); newPacket.Fragments.Add(newFragment); SendPacket(type, newPacket, session, true); dataToSend -= fragmentSize; } buffer = null; return(false); } fragment.Header.Size = (ushort)(PacketFragmentHeader.HeaderSize + fragment.Payload.BaseStream.Length); if (!useHeaders) { fragment.Header.Sequence = connectionData.FragmentSequence++; fragment.Header.Id = 0x80000000; // this seems to be a global incremental value fragment.Header.Count = 1; fragment.Header.Index = (ushort)i; } packetWriter.Write(fragment.Header.GetRaw()); packetWriter.Write(fragment.Data.ToArray()); } } if (packet.Header.HasFlag(PacketHeaderFlags.EncryptedChecksum) && connectionData.PacketSequence < 2) { connectionData.PacketSequence = 2; } packet.Header.Sequence = connectionData.PacketSequence++; packet.Header.Size = (ushort)(packetWriter.BaseStream.Length - PacketHeader.HeaderSize); packet.Header.Table = 0x14; packet.Header.Time = (ushort)connectionData.ServerTime; uint issacXor; packet.Header.Checksum = packet.CalculateChecksum(session, type, 0u, out issacXor); packetWriter.Seek(0, SeekOrigin.Begin); packetWriter.Write(packet.Header.GetRaw()); if (type == ConnectionType.World && packet.Header.Sequence >= 2u) { session.CachedPackets.TryAdd(packet.Header.Sequence, new CachedPacket(issacXor, packet)); } buffer = packetStream.ToArray(); return(true); } } }