public UchuServer(Guid id) { Id = id; HandlerMap = new HandlerMap(); CommandHandleMap = new CommandHandleMap(); }
public virtual void RegisterAssembly(Assembly assembly) { var groups = assembly.GetTypes().Where(c => c.IsSubclassOf(typeof(HandlerGroup))); foreach (var group in groups) { var instance = (HandlerGroup)Activator.CreateInstance(group); instance.SetServer(this); foreach (var method in group.GetMethods().Where(m => !m.IsStatic && !m.IsAbstract)) { var attr = method.GetCustomAttribute <PacketHandlerAttribute>(); if (attr != null) { var parameters = method.GetParameters(); if (parameters.Length == 0 || !typeof(IPacket).IsAssignableFrom(parameters[0].ParameterType)) { continue; } var packet = (IPacket)Activator.CreateInstance(parameters[0].ParameterType); var remoteConnectionType = attr.RemoteConnectionType ?? packet.RemoteConnectionType; var packetId = attr.PacketId ?? packet.PacketId; if (!HandlerMap.ContainsKey(remoteConnectionType)) { HandlerMap[remoteConnectionType] = new Dictionary <uint, Handler>(); } var handlers = HandlerMap[remoteConnectionType]; Logger.Debug(!handlers.ContainsKey(packetId) ? $"Registered handler for packet {packet}" : $"Handler for packet {packet} overwritten" ); handlers[packetId] = new Handler { Group = instance, Info = method, Packet = packet }; } else { var cmdAttr = method.GetCustomAttribute <CommandHandlerAttribute>(); if (cmdAttr == null) { continue; } if (!CommandHandleMap.ContainsKey(cmdAttr.Prefix)) { CommandHandleMap[cmdAttr.Prefix] = new Dictionary <string, CommandHandler>(); } CommandHandleMap[cmdAttr.Prefix][cmdAttr.Signature] = new CommandHandler { Group = instance, Info = method, GameMasterLevel = cmdAttr.GameMasterLevel, Help = cmdAttr.Help, Signature = cmdAttr.Signature, ConsoleCommand = method.GetParameters().Length != 2 }; } } } }