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()); } }
/// <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); }
/// <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); } }
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(); } }
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); }
/// <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); } }
/// <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 }); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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(); } }
/// <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(); } }
/// <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); }
/// <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); }
/// <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); } }
/// <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); } }
/// <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(); } }
/// <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(); } }
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); }
/// <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); } }
/// <inheritdoc/> public void HandlePacket(Player player, byte[] packet) { var shortGuildId = NumberConversionExtensions.MakeWord(packet[5], packet[4]); this.requestAction.RequestGuildInfo(player, shortGuildId); }
/// <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 }); }