private static void DefineMessageHandlers() { fragmentHandlers = new Dictionary <GameMessageOpcode, MessageHandlerInfo>(); foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) { foreach (var methodInfo in type.GetMethods()) { foreach (var fragmentHandlerAttribute in methodInfo.GetCustomAttributes <GameMessageAttribute>()) { var fragmentHandler = new MessageHandlerInfo() { Handler = (FragmentHandler)Delegate.CreateDelegate(typeof(FragmentHandler), methodInfo), Attribute = fragmentHandlerAttribute }; fragmentHandlers[fragmentHandlerAttribute.Opcode] = fragmentHandler; } } } }
private void HandlePacket(ClientStsPacket packet) { IReadable message = MessageManager.Instance.GetMessage(packet.Uri); if (message == null) { log.Info($"Received unknown packet {packet.Uri}"); return; } MessageHandlerInfo handlerInfo = MessageManager.Instance.GetMessageHandler(packet.Uri); if (handlerInfo == null) { log.Info($"Received unhandled packet {packet.Uri}"); return; } /*if (State != handlerInfo.State) * { * log.Info($"Received packet with invalid session state {packet.Uri}"); * return; * }*/ if (packet.Headers.TryGetValue("s", out string sequenceString)) { uint.TryParse(sequenceString, out sequence); } log.Trace($"Received packet {packet.Uri}."); if (packet.Body != "") { var doc = new XmlDocument(); doc.LoadXml(packet.Body); message.Read(doc); } handlerInfo.Delegate.Invoke(this, message); }