//
// 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;
}
}
}