Beispiel #1
0
        public UchuServer(Guid id)
        {
            Id = id;

            HandlerMap = new HandlerMap();

            CommandHandleMap = new CommandHandleMap();
        }
Beispiel #2
0
        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
                        };
                    }
                }
            }
        }