public static void Load(this MessageDispatherComponent self) { self.Handlers.Clear(); Type[] types = DllHelper.GetMonoTypes(); foreach (Type type in types) { object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false); if (attrs.Length == 0) { continue; } IMHandler iMHandler = Activator.CreateInstance(type) as IMHandler; if (iMHandler == null) { Log.Error($"message handle {type.Name} 需要继承 IMHandler"); continue; } Type messageType = iMHandler.GetMessageType(); ushort opcode = Game.Scene.GetComponent <OpcodeTypeComponent>().GetOpcode(messageType); if (opcode == 0) { Log.Error($"消息opcode为0: {messageType.Name}"); continue; } self.RegisterHandler(opcode, iMHandler); } }
//注册处理函数 public static void RegisterHandler(this MessageDispatherComponent self, ushort opcode, IMHandler handler) { if (!self.Handlers.ContainsKey(opcode)) { self.Handlers.Add(opcode, new List <IMHandler>()); } self.Handlers[opcode].Add(handler); }
/// <summary> /// 普通消息分发 /// </summary> /// <param name="self"></param> /// <param name="session"></param> /// <param name="messageInfo"></param> public static void Handle(this MessageDispatherComponent self, Session session, MessageInfo messageInfo) { List <IMHandler> actions; if (!self.Handlers.TryGetValue(messageInfo.Opcode, out actions)) { Log.Error($"消息没有处理: {messageInfo.Opcode} {JsonHelper.ToJson(messageInfo.Message)}"); return; } foreach (IMHandler ev in actions) { try { ev.Handle(session, messageInfo.Message); //处理 } catch (Exception e) { Log.Error(e); } } }
public static void Load(this MessageDispatherComponent self) { self.Handlers.Clear(); AppType appType = StartConfigComponent.Instance.StartConfig.AppType; List <Type> types = Game.EventSystem.GetTypes(typeof(MessageHandlerAttribute)); foreach (Type type in types) { object[] attrs = type.GetCustomAttributes(typeof(MessageHandlerAttribute), false); if (attrs.Length == 0) { continue; } MessageHandlerAttribute messageHandlerAttribute = attrs[0] as MessageHandlerAttribute; if (!messageHandlerAttribute.Type.Is(appType)) //只收集当前服务器的处理函数 { continue; } IMHandler iMHandler = Activator.CreateInstance(type) as IMHandler; if (iMHandler == null) { Log.Error($"message handle {type.Name} 需要继承 IMHandler"); continue; } Type messageType = iMHandler.GetMessageType(); ushort opcode = Game.Scene.GetComponent <OpcodeTypeComponent>().GetOpcode(messageType); if (opcode == 0) { Log.Error($"消息opcode为0: {messageType.Name}"); continue; } self.RegisterHandler(opcode, iMHandler); } }