private void TriggerHandler(string packetHeader, string packet, bool force)
{
if (!IsDisposing)
{
HandlerMethodReference methodReference = HandlerMethods.ContainsKey(packetHeader) ? HandlerMethods[packetHeader] : null;
if (methodReference != null)
{
if (methodReference.HandlerMethodAttribute != null && !force && methodReference.HandlerMethodAttribute.Amount > 1 && !_waitForPacketsAmount.HasValue)
{
// we need to wait for more
_waitForPacketsAmount = methodReference.HandlerMethodAttribute.Amount;
_waitForPacketList.Add(packet != String.Empty ? packet : $"1 {packetHeader} ");
return;
}
try
{
if (HasSelectedCharacter || methodReference.ParentHandler.GetType().Name == "CharacterScreenPacketHandler" || methodReference.ParentHandler.GetType().Name == "LoginPacketHandler")
{
// call actual handler method
if (methodReference.PacketDefinitionParameterType != null)
{
object serializedPacket = PacketFactory.Deserialize(packet, methodReference.PacketDefinitionParameterType, true);
if (serializedPacket != null || methodReference.PassNonParseablePacket)
{
methodReference.HandlerMethod(methodReference.ParentHandler, serializedPacket);
}
else
{
Logger.Log.WarnFormat(Language.Instance.GetMessageFromKey("CORRUPT_PACKET"), packetHeader, packet);
}
}
else
{
methodReference.HandlerMethod(methodReference.ParentHandler, packet);
}
}
}
catch (DivideByZeroException ex)
{
throw ex;
// disconnect if something unexpected happens
Logger.Log.Error("Handler Error SessionId: " + SessionId, ex);
Disconnect();
}
}
else
{
Logger.Log.WarnFormat(Language.Instance.GetMessageFromKey("HANDLER_NOT_FOUND"), packetHeader);
}
}
else
{
Logger.Log.WarnFormat(Language.Instance.GetMessageFromKey("CLIENTSESSION_DISPOSING"), packetHeader);
}
}