示例#1
0
        private void ReadBuyRequest(Player player, Span <byte> buffer)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.DebugFormat("BuyRequest, Player=[{0}], Packet=[{1}]", player.SelectedCharacter.Name, buffer.AsString());
            }

            ushort reqPid          = NumberConversionExtensions.MakeWord(buffer[5], buffer[4]);
            var    requestedPlayer = player.CurrentMap.GetObject(reqPid) as Player;

            if (requestedPlayer == null)
            {
                Logger.DebugFormat("Player not found: {0}", reqPid);
                player.PlayerView.ShowMessage("Open Store: Player not found.", MessageType.BlueNormal);
                return;
            }

            string pname = buffer.ExtractString(5, 10, Encoding.UTF8);

            if (pname != requestedPlayer.SelectedCharacter.Name)
            {
                Logger.DebugFormat("Player Names dont match: {0} != {1}", pname, requestedPlayer.SelectedCharacter.Name);
                player.PlayerView.ShowMessage("Player Names don't match. " + pname + "<>" + requestedPlayer.SelectedCharacter.Name, MessageType.BlueNormal);
                return;
            }

            byte slot = buffer[16];

            this.buyAction.BuyItem(player, requestedPlayer, slot);
        }
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < 11)
            {
                return;
            }

            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                return;
            }

            SkillEntry skillEntry = player.SkillList.GetSkill(skillId);
            ushort     targetId   = NumberConversionExtensions.MakeWord(packet[10], packet[9]);

            if (player.GetObject(targetId) is IAttackable target)
            {
                if (target is IObservable observable && observable.Observers.Contains(player))
                {
                    this.skillHitAction.AttackTarget(player, target, skillEntry);
                }
                else
                {
                    // Client may be out of sync (or it's an hacker attempt),
                    // so we tell him the object is out of scope - this should prevent further attempts to attack it.
                    player.ViewPlugIns.GetPlugIn <IObjectsOutOfScopePlugIn>()?.ObjectsOutOfScope(target.GetAsEnumerable());
                }
            }
示例#3
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            // 0xc3, 5, 0x22, id1, id2
            ushort dropid = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            this.pickupAction.PickupItem(player, dropid);
        }
示例#4
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            if (packet.Length < 7)
            {
                return;
            }

            ushort id = NumberConversionExtensions.MakeWord(packet[4], packet[3]);
            var    attackAnimation  = packet[5];
            var    lookingDirection = packet[6];
            var    currentMap       = player.CurrentMap;

            if (currentMap == null)
            {
                Log.Warn($"Current player map not set. Possible hacker action. Character name: {player.Name}");
                return;
            }

            var target = currentMap.GetObject(id) as IAttackable;

            if (target == null)
            {
                Log.Warn($"Object {id} of current player map not found. Possible hacker action. Character name: {player.Name}");
            }
            else
            {
                this.hitAction.Hit(player, target, attackAnimation, lookingDirection);
            }
        }
示例#5
0
        private void Authenticate(Span <byte> packet)
        {
            var roomId        = NumberConversionExtensions.MakeWord(packet[4], packet[5]);
            var requestedRoom = this.manager.GetChatRoom(roomId);

            if (requestedRoom is null)
            {
                this.logger.LogError($"Requested room {roomId} has not been registered before.");
                this.LogOff();
                return;
            }

            TokenDecryptor.Decrypt(packet);
            var tokenAsString = packet.ExtractString(TokenOffset, 10, Encoding.UTF8);

            if (!uint.TryParse(tokenAsString, out uint _))
            {
                this.logger.LogError($"Token '{tokenAsString}' is not a parseable integer.");
                this.LogOff();
                return;
            }

            this.AuthenticationToken = tokenAsString;
            if (requestedRoom.TryJoin(this))
            {
                this.room = requestedRoom;
            }
            else
            {
                this.LogOff();
            }
        }
示例#6
0
        private void AddMasterSkillPoint(Player player, Span <byte> packet)
        {
            // LO HI
            // C1 08 F3 52 A6 01 00 00
            var skillId = NumberConversionExtensions.MakeWord(packet[4], packet[5]);

            this.addMasterPointAction.AddMasterPoint(player, skillId);
        }
示例#7
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            ushort id = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (player.CurrentMap.GetObject(id) is NonPlayerCharacter npc)
            {
                this.talkNpcAction.TalkToNpc(player, npc);
            }
        }
示例#8
0
        /// <inheritdoc/>
        public void ShowAreaSkillAnimation(Player playerWhichPerformsSkill, Skill skill, byte x, byte y, byte rotation)
        {
            var skillId = NumberConversionExtensions.ToUnsigned(skill.SkillID);

            // Example: C3 0A 1E 00 09 23 47 3D 62 3A
            this.connection.Send(new byte[]
            {
                0xC3, 0x0A, 0x1E, skillId.GetHighByte(), skillId.GetLowByte(),
                playerWhichPerformsSkill.Id.GetHighByte(), playerWhichPerformsSkill.Id.GetLowByte(), x, y, rotation
            });
        }
示例#9
0
        /// <inheritdoc/>
        public void ShowSkillAnimation(Player attackingPlayer, IAttackable target, Skill skill)
        {
            var skillId = NumberConversionExtensions.ToUnsigned(skill.SkillID);

            this.connection.Send(new byte[]
            {
                0xC3, 9, 0x19,
                skillId.GetHighByte(), skillId.GetLowByte(),
                attackingPlayer.Id.GetHighByte(), attackingPlayer.Id.GetLowByte(),
                target.Id.GetHighByte(), target.Id.GetLowByte()
            });
        }
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            ushort toRequestId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);
            var    toRequest   = player.GetObservingPlayerWithId(toRequestId);

            if (toRequest == null)
            {
                return;
            }

            this.action.HandlePartyRequest(player, toRequest);
        }
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < 6)
            {
                Log.WarnFormat("Player {0}, Unknown Letter Read Request (too short, min size is 6 bytes): {1}", player.SelectedCharacter.Name, packet.AsString());
                return;
            }

            var letterIndex = NumberConversionExtensions.MakeWord(packet[4], packet[5]);

            this.readAction.ReadRequest(player, letterIndex);
        }
示例#12
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, byte[] packet)
        {
            if (packet[3] != 0)
            {
                Log.WarnFormat("Player {0} Unknown Letter Read Request: {1}", player.SelectedCharacter.Name, packet.AsString());
                return;
            }

            var letterIndex = NumberConversionExtensions.MakeWord(packet[4], packet[5]);

            this.readAction.ReadRequest(player, letterIndex);
        }
示例#13
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            if (packet[3] != 2) ////is always 2 i guess?
            {
                return;
            }

            ushort   warpInfoId = NumberConversionExtensions.MakeWord(packet[8], packet[9]);
            WarpInfo warpInfo   = this.GetWarpInfo(warpInfoId);

            this.warpAction.WarpTo(player, warpInfo);
        }
示例#14
0
        /// <summary>
        /// Reads the invitation to an existing chat room and registers the invited client.
        /// </summary>
        /// <param name="packet">The packet.</param>
        /// <remarks>
        /// Example: C1 15 A1 00 00 00 61 62 63 64 65 66 67 68 69 6F 20 01 00 01 57
        /// Index 4 and 5 is the room id, the next 10 bytes is the client name, after that the player id, game server id and a "type".
        /// The chat server answers this with the same packets as above(ticket 96862210):
        /// C1 2C A0 01 00 00 61 62 63 64 65 66 67 68 69 6F CC CC CC CC CC CC CC CC CC CC 53 54 55 56 CC CC 02 00 C6 05 CC CC CC CC 57 CC CC CC
        /// </remarks>
        private void ReadChatRoomInvitation(byte[] packet)
        {
            var roomId         = NumberConversionExtensions.MakeWord(packet[4], packet[5]);
            var clientName     = packet.ExtractString(6, 10, Encoding.UTF8);
            var clientPlayerId = packet.TryMakeWordBigEndian(16);
            var clientServerId = packet.TryMakeWordBigEndian(18);
            var type           = packet.Length > 20 ? packet[20] : (byte)0x57;

            Log.Debug($"Received request to invite {clientName} to chat room {roomId}, Client-ID: {clientPlayerId}, Server-ID: {clientServerId}");
            var authentication = this.chatServer.RegisterClient(roomId, clientName);

            this.SendAuthentication(authentication, null, clientPlayerId, clientServerId, type);
        }
示例#15
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            ////0xC3, 0x05, 0x36, idtotrade[0], idtotrade[1]
            ushort pid = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            Player partner = player.GetObservingPlayerWithId(pid);

            if (partner == null)
            {
                player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage("Trade partner not found.", MessageType.BlueNormal);
                return;
            }

            this.requestAction.RequestTrade(player, partner);
        }
        /// <inheritdoc/>
        public void HandlePacket(Player player, Span <byte> packet)
        {
            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                return;
            }

            ushort targetId = NumberConversionExtensions.MakeWord(packet[10], packet[9]);
            byte   tX       = packet[5];
            byte   tY       = packet[6];
            byte   rotation = packet[7];

            this.attackAction.Attack(player, targetId, skillId, new Point(tX, tY), rotation);
        }
示例#17
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, byte[] packet)
        {
            if (packet[3] != 0)
            {
                Log.WarnFormat("Player {0} Unknown Letter Delete Request: {1}", player.SelectedCharacter.Name, packet.AsString());
                return;
            }

            var letterIndex = NumberConversionExtensions.MakeWord(packet[4], packet[5]);

            if (letterIndex < player.SelectedCharacter.Letters.Count)
            {
                var letter = player.SelectedCharacter.Letters[letterIndex];
                this.deleteAction.DeleteLetter(player, letter);
            }
        }
示例#18
0
        /// <inheritdoc/>
        public void MapChange()
        {
            var mapNumber = NumberConversionExtensions.ToUnsigned(this.player.SelectedCharacter.CurrentMap.Number);

            using (var writer = this.connection.StartSafeWrite(0xC3, 0x09))
            {
                var packet = writer.Span;
                packet[2] = 0x1C;
                packet[3] = 0x0F;
                packet[4] = 1;
                packet[5] = mapNumber.GetHighByte();
                packet[6] = mapNumber.GetLowByte();
                packet[7] = this.player.SelectedCharacter.PositionX;
                packet[8] = this.player.SelectedCharacter.PositionY;
                writer.Commit();
            }
        }
示例#19
0
        /// <inheritdoc/>
        public void MapChange()
        {
            var mapNumber = NumberConversionExtensions.ToUnsigned(this.player.SelectedCharacter.CurrentMap.Number);

            using (var writer = this.connection.StartSafeWrite(0xC3, 0x0F))
            {
                var packet = writer.Span;
                packet[2] = 0x1C;
                packet[3] = 0x0F;
                packet[4] = 1;
                packet.Slice(5).SetShortSmallEndian(mapNumber);
                var position = this.player.IsWalking ? this.player.WalkTarget : this.player.Position;
                packet[7] = position.X;
                packet[8] = position.Y;
                packet[9] = this.player.Rotation.ToPacketByte();
                writer.Commit();
            }
        }
示例#20
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            if (packet.Length < 8)
            {
                return;
            }

            ushort    gateNr = NumberConversionExtensions.MakeWord(packet[4], packet[3]);
            EnterGate gate   = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => NumberConversionExtensions.ToUnsigned(g.Number) == gateNr);

            if (gate == null)
            {
                Logger.WarnFormat("Gate {0} not found in current map {1}", gateNr, player.SelectedCharacter.CurrentMap);
                return;
            }

            this.warpAction.EnterGate(player, gate);
        }
示例#21
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            ////          skill targt
            ////C3 len 19 XX XX TT TT
            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                return;
            }

            ushort targetId = NumberConversionExtensions.MakeWord(packet[6], packet[5]);

            if (player.CurrentMap.GetObject(targetId) is IAttackable target)
            {
                this.attackAction.PerformSkill(player, target, skillId);
            }
        }
        /// <inheritdoc/>
        public override void HandlePacket(Player player, byte[] packet)
        {
            Logger.WarnFormat("AreaSkill packet handle");
            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                Logger.WarnFormat("Player doesnt have this AreaSkill");
                return;
            }

            ushort targetId = NumberConversionExtensions.MakeWord(packet[10], packet[9]);
            byte   tX       = packet[5];
            byte   tY       = packet[6];
            byte   rotation = packet[7];

            this.attackAction.Attack(player, targetId, skillId, tX, tY, rotation);
        }
示例#23
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, Span <byte> packet)
        {
            ////          skill targt
            ////C3 len 19 XX XX TT TT
            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                return;
            }

            // The target can be the own player too, for example when using buff skills.
            ushort targetId = NumberConversionExtensions.MakeWord(packet[6], packet[5]);

            if (player.GetObject(targetId) is IAttackable target)
            {
                this.attackAction.PerformSkill(player, target, skillId);
            }
        }
示例#24
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet[3] != 2) ////is always 2 i guess?
            {
                return;
            }

            ushort warpInfoIndex = NumberConversionExtensions.MakeWord(packet[8], packet[9]);
            var    warpInfo      = this.GameContext.Configuration.WarpList?.FirstOrDefault(info => info.Index == warpInfoIndex);

            if (warpInfo != null)
            {
                this.warpAction.WarpTo(player, warpInfo);
            }
            else
            {
                player.PlayerView.ShowMessage($"Unknown warp index {warpInfoIndex}", MessageType.BlueNormal);
            }
        }
示例#25
0
        /// <inheritdoc/>
        public void ShowSkillAnimation(Player attackingPlayer, IAttackable target, Skill skill)
        {
            var playerId = attackingPlayer.GetId(this.player);
            var targetId = target.GetId(this.player);
            var skillId  = NumberConversionExtensions.ToUnsigned(skill.SkillID);

            using (var writer = this.connection.StartSafeWrite(0xC3, 0x09))
            {
                var packet = writer.Span;
                packet[2] = 0x19;
                packet[3] = skillId.GetHighByte();
                packet[4] = skillId.GetLowByte();
                packet[5] = playerId.GetHighByte();
                packet[6] = playerId.GetLowByte();
                packet[7] = targetId.GetHighByte();
                packet[8] = targetId.GetLowByte();
                writer.Commit();
            }
        }
示例#26
0
        /// <inheritdoc/>
        public void ShowAreaSkillAnimation(Player playerWhichPerformsSkill, Skill skill, byte x, byte y, byte rotation)
        {
            var skillId  = NumberConversionExtensions.ToUnsigned(skill.SkillID);
            var playerId = playerWhichPerformsSkill.GetId(this.player);

            using (var writer = this.connection.StartSafeWrite(0xC3, 0x0A))
            {
                // Example: C3 0A 1E 00 09 23 47 3D 62 3A
                var packet = writer.Span;
                packet[2] = 0x1E;
                packet[3] = skillId.GetHighByte();
                packet[4] = skillId.GetLowByte();
                packet[5] = playerId.GetHighByte();
                packet[6] = playerId.GetLowByte();
                packet[7] = x;
                packet[8] = y;
                packet[9] = rotation;
                writer.Commit();
            }
        }
示例#27
0
        private void ReadShopItemListRequest(Player player, Span <byte> buffer)
        {
            ushort reqPid          = NumberConversionExtensions.MakeWord(buffer[5], buffer[4]);
            var    requestedPlayer = player.CurrentMap.GetObject(reqPid) as Player;

            if (requestedPlayer == null)
            {
                player.PlayerView.ShowMessage("Open Store: Player not found.", MessageType.BlueNormal);
                return;
            }

            string pname = buffer.ExtractString(6, 10, Encoding.UTF8);

            if (pname != requestedPlayer.SelectedCharacter.Name)
            {
                player.PlayerView.ShowMessage("Player Names don't match." + pname + "<>" + requestedPlayer.SelectedCharacter.Name, MessageType.BlueNormal);
                return;
            }

            this.requestListAction.RequestStoreItemList(player, requestedPlayer);
        }
示例#28
0
        /// <inheritdoc/>
        public override void HandlePacket(Player player, Span <byte> packet)
        {
            if (packet.Length < 11)
            {
                return;
            }

            ushort skillId = NumberConversionExtensions.MakeWord(packet[4], packet[3]);

            if (!player.SkillList.ContainsSkill(skillId))
            {
                return;
            }

            SkillEntry skillEntry = player.SkillList.GetSkill(skillId);
            ushort     targetId   = NumberConversionExtensions.MakeWord(packet[10], packet[9]);

            if (player.GetObject(targetId) is IAttackable target)
            {
                this.skillHitAction.AttackTarget(player, target, skillEntry);
            }
        }
示例#29
0
        /// <inheritdoc/>
        public void HandlePacket(Player player, byte[] packet)
        {
            var shortGuildId = NumberConversionExtensions.MakeWord(packet[5], packet[4]);

            this.requestAction.RequestGuildInfo(player, shortGuildId);
        }
示例#30
0
        /// <inheritdoc/>
        public void MapChange()
        {
            var map = this.player.SelectedCharacter.CurrentMap.Number;

            this.connection.Send(new byte[] { 0xC3, 0x09, 0x1C, 0x0F, 1, NumberConversionExtensions.ToUnsigned(map).GetHighByte(), NumberConversionExtensions.ToUnsigned(map).GetLowByte(), this.player.SelectedCharacter.PositionX, this.player.SelectedCharacter.PositionY });
        }