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) { //check for the correct authority if (!IsAuthenticated || (byte)methodReference.Authority <= (byte)Account.Authority) { object deserializedPacket = PacketFactory.Deserialize(packet, methodReference.PacketDefinitionParameterType, IsAuthenticated); if (deserializedPacket != null || methodReference.PassNonParseablePacket) { methodReference.HandlerMethod(methodReference.ParentHandler, deserializedPacket); } else { Logger.Log.WarnFormat(Language.Instance.GetMessageFromKey("CORRUPT_PACKET"), packetHeader, packet); } } } else { methodReference.HandlerMethod(methodReference.ParentHandler, packet); } } } catch (DivideByZeroException 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); } }
private void TriggerHandler(string packetHeader, string packet, bool force) { HandlerMethodReference methodReference = HandlerMethods.ContainsKey(packetHeader) ? HandlerMethods[packetHeader] : null; if (methodReference != null) { if (methodReference.PacketHeaderAttribute != null && !force && methodReference.PacketHeaderAttribute.Amount > 1 && !_waitForPacketsAmount.HasValue) { // we need to wait for more _waitForPacketsAmount = methodReference.PacketHeaderAttribute.Amount; _waitForPacketList.Add(packet != string.Empty ? packet : $"1 {packetHeader} "); return; } try { if (!HasSelectedCharacter && !(methodReference.ParentHandler is ICharacterScreenPacketHandler) && !(methodReference.ParentHandler is ILoginPacketHandler)) { return; } // call actual handler method if (methodReference.PacketDefinitionParameterType != null) { //check for the correct authority if (IsAuthenticated && (byte)methodReference.Authority > (byte)Account.Authority) { return; } object deserializedPacket = PacketFactory.Deserialize(packet, methodReference.PacketDefinitionParameterType, IsAuthenticated); if (deserializedPacket != null) { methodReference.HandlerMethod(methodReference.ParentHandler, deserializedPacket); } else { Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("CORRUPT_PACKET"), packetHeader, packet)); } } else { methodReference.HandlerMethod(methodReference.ParentHandler, packet); } } catch (DivideByZeroException ex) { // disconnect if something unexpected happens Logger.Log.Error(string.Format(Language.Instance.GetMessageFromKey("HANDLER_ERROR"), ex)); Disconnect(); } } else { Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("HANDLER_NOT_FOUND"), packetHeader)); } }
private void GenerateHandlerReferences(IEnumerable <IPacketHandler> packetDictionary) { // iterate thru each type in the given assembly foreach (IPacketHandler handlerType in packetDictionary) { IPacketHandler handler = (IPacketHandler)Activator.CreateInstance(handlerType.GetType(), this); // include PacketDefinition foreach (MethodInfo methodInfo in handlerType.GetType().GetMethods().Where(x => x.GetParameters().FirstOrDefault()?.ParameterType.BaseType == typeof(PacketDefinition))) { HandlerMethodReference methodReference = new HandlerMethodReference(DelegateBuilder.BuildDelegate <Action <object, object> >(methodInfo), handler, methodInfo.GetParameters().FirstOrDefault()?.ParameterType); HandlerMethods.Add(methodReference.Identification, methodReference); } } }
private void GenerateHandlerReferences(Type type, bool isWorldServer) { IEnumerable <Type> handlerTypes = !isWorldServer?type.Assembly.GetTypes().Where(t => t.Name.Equals("LoginPacketHandler")) // shitty but it works : type.Assembly.GetTypes().Where(p => { Type interfaceType = type.GetInterfaces().FirstOrDefault(); return(interfaceType != null && !p.IsInterface && interfaceType.IsAssignableFrom(p)); }); // iterate thru each type in the given assembly foreach (Type handlerType in handlerTypes) { IPacketHandler handler = (IPacketHandler)Activator.CreateInstance(handlerType, this); // include PacketDefinition foreach (MethodInfo methodInfo in handlerType.GetMethods().Where(x => x.GetCustomAttributes(false).OfType <PacketAttribute>().Any() || x.GetParameters().FirstOrDefault()?.ParameterType.BaseType == typeof(PacketDefinition))) { List <PacketAttribute> packetAttributes = methodInfo.GetCustomAttributes(false).OfType <PacketAttribute>().ToList(); // assume PacketDefinition based handler method if (!packetAttributes.Any()) { HandlerMethodReference methodReference = new HandlerMethodReference(DelegateBuilder.BuildDelegate <Action <object, object> >(methodInfo), handler, methodInfo.GetParameters().FirstOrDefault()?.ParameterType); HandlerMethods.Add(methodReference.Identification, methodReference); } else { // assume string based handler method foreach (PacketAttribute packetAttribute in packetAttributes) { HandlerMethodReference methodReference = new HandlerMethodReference(DelegateBuilder.BuildDelegate <Action <object, object> >(methodInfo), handler, packetAttribute); HandlerMethods.Add(methodReference.Identification, methodReference); } } } } }