// // InPacketSerializer.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Linq; using NosCore.Packets.ServerPackets.Visibility; using NosCore.Shared.Enumerations; using Remora.Results; namespace NosSmooth.Core.Packets.Converters; /// /// Deserializes InPacket correctly. /// public class InPacketSerializer : SpecificPacketSerializer { private readonly PacketSerializerProvider _packetSerializerProvider; /// /// Initializes a new instance of the class. /// /// The provider of packet serializer. public InPacketSerializer(PacketSerializerProvider packetSerializerProvider) { _packetSerializerProvider = packetSerializerProvider; } /// public override bool Serializer => false; /// public override bool Deserializer => true; /// public override Result Serialize(InPacket packet) { throw new System.NotImplementedException(); } /// public override Result Deserialize(string packetString) { try { var deserializer = _packetSerializerProvider.ServerSerializer.Deserializer; var splitted = packetString.Split(new char[] { ' ' }, 9).Skip(1).ToArray(); if (!Enum.TryParse(splitted[0], out VisualType type)) { return new ArgumentInvalidError(nameof(packetString), "The visual type is incorrect."); } var startAddress = type == VisualType.Player ? 3 : 2; var inPacket = new InPacket { VisualType = type, VNum = type != VisualType.Player ? long.Parse(splitted[1]) : null, Name = type == VisualType.Player ? splitted[1] : null, VisualId = long.Parse(splitted[startAddress]), PositionX = short.Parse(splitted[startAddress + 1]), PositionY = short.Parse(splitted[startAddress + 2]), Direction = byte.Parse(splitted[startAddress + 3]) }; switch (inPacket.VisualType) { case VisualType.Player: inPacket.InCharacterSubPacket = (InCharacterSubPacket?)deserializer .DeserializeHeaderlessIPacket(typeof(InCharacterSubPacket), splitted[7]); break; case VisualType.Object: inPacket.InItemSubPacket = (InItemSubPacket?)deserializer .DeserializeHeaderlessIPacket(typeof(InItemSubPacket), splitted[6] + " " + splitted[7]); break; default: inPacket.InNonPlayerSubPacket = (InNonPlayerSubPacket?)deserializer .DeserializeHeaderlessIPacket(typeof(InNonPlayerSubPacket), splitted[6] + " " + splitted[7]); break; } return inPacket; } catch (Exception e) { return e; } } }