Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        public GameEventFraglessPacket(Session target)
        {
            Debug.Assert(target.Player != null);

            session  = target;
            fragment = new ServerPacketFragment(0x0A, FragmentOpcode.None);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        public GameEventPacket(Session target)
        {
            Debug.Assert(target.Character != null);

            session  = target;
            fragment = new ServerPacketFragment(9, FragmentOpcode.GameEvent);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
        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
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
            }
        }
Esempio n. 12
0
        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);
            }
        }
Esempio n. 13
0
File: Player.cs Progetto: sr314/ACE
        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 });
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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);
            }
        }
Esempio n. 18
0
        // 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);
                }
            }
        }