public static IEnumerable <Type> GetGCMessageBodyTypeCandidates(uint rawEMsg, uint gcAppid) { var gcMsg = MsgUtil.GetGCMsg(rawEMsg); if (MessageTypeOverrides.GCBodyMap.TryGetValue(gcAppid, out var gcBodyDict)) { if (gcBodyDict.TryGetValue(gcMsg, out var bodyType)) { return(Enumerable.Repeat(bodyType, 1)); } } var gcMsgName = EMsgExtensions.GetGCMessageName(rawEMsg, gcAppid); var typeMsgName = gcMsgName .Replace("k_", string.Empty) .Replace("ESOMsg", string.Empty) .TrimStart('_') .Replace("EMsg", string.Empty) .TrimStart("GC"); var possibleTypes = from type in typeof(CMClient).Assembly.GetTypes() from typePrefix in GetPossibleGCTypePrefixes(gcAppid) where type.GetInterfaces().Contains(typeof(IExtensible)) where type.FullName.StartsWith(typePrefix) && type.FullName.EndsWith(typeMsgName) select type; return(possibleTypes); }
private static IPacketGCMsg GetPacketGCMsg(uint eMsg, byte[] data) { // strip off the protobuf flag uint realEMsg = MsgUtil.GetGCMsg(eMsg); if (MsgUtil.IsProtoBuf(eMsg)) { return(new PacketClientGCMsgProtobuf(realEMsg, data)); } return(new PacketClientGCMsg(realEMsg, data)); }
public static string GetGCMessageName(uint eMsg, uint appId) { eMsg = MsgUtil.GetGCMsg(eMsg); var eMsgEnums = GetGCEMsgEnums(appId); foreach (var enumType in eMsgEnums) { if (Enum.IsDefined(enumType, ( int )eMsg)) { return(Enum.GetName(enumType, ( int )eMsg)); } } return(eMsg.ToString()); }
public static string GetGCMessageName(uint eMsg) { eMsg = MsgUtil.GetGCMsg(eMsg); // first lets try the enum'd emsgs Type[] eMsgEnums = { typeof(SteamKit2.GC.Dota.Internal.EDOTAGCMsg), typeof(SteamKit2.GC.CSGO.Internal.ECsgoGCMsg), typeof(SteamKit2.GC.Internal.EGCBaseMsg), typeof(SteamKit2.GC.Internal.ESOMsg), typeof(SteamKit2.GC.Internal.EGCSystemMsg), typeof(SteamKit2.GC.Internal.EGCItemMsg), typeof(SteamKit2.GC.Internal.EGCBaseClientMsg), }; foreach (var enumType in eMsgEnums) { if (Enum.IsDefined(enumType, ( int )eMsg)) { return(Enum.GetName(enumType, ( int )eMsg)); } } // no dice on those, back to the classes List <FieldInfo> fields = new List <FieldInfo>(); fields.AddRange(typeof(SteamKit2.GC.TF2.EGCMsg).GetFields(BindingFlags.Public | BindingFlags.Static)); fields.AddRange(typeof(SteamKit2.GC.CSGO.EGCMsg).GetFields(BindingFlags.Public | BindingFlags.Static)); var field = fields.SingleOrDefault(f => { uint value = ( uint )f.GetValue(null); return(value == eMsg); }); if (field != null) { return(string.Format("{0} ({1})", field.Name, field.DeclaringType.FullName)); } return(eMsg.ToString()); }
string PacketItemNameEnhance(EMsg eMsg, string nameFromEMsg, string fileName) { if (eMsg == EMsg.ClientToGC || eMsg == EMsg.ClientFromGC) { var proto = GetProtoMsgFromFile <CMsgGCClient>(eMsg, fileName); var gcEMsg = proto.Body.msgtype; var gcName = BuildEMsg(MsgUtil.GetGCMsg(gcEMsg)); var headerToTrim = "k_EMsg"; if (gcName.StartsWith(headerToTrim)) { gcName = gcName.Substring(headerToTrim.Length); } return(string.Format("{0} ({1})", nameFromEMsg, gcName)); } else if (eMsg == EMsg.ServiceMethod) { var fileData = File.ReadAllBytes(fileName); var hdr = new MsgHdrProtoBuf(); using (var ms = new MemoryStream(fileData)) { hdr.Deserialize(ms); } return(string.Format("{0} ({1})", nameFromEMsg, hdr.Proto.target_job_name)); } else if (eMsg == EMsg.ClientServiceMethod) { var proto = GetProtoMsgFromFile <CMsgClientServiceMethod>(eMsg, fileName); return(string.Format("{0} ({1})", nameFromEMsg, proto.Body.method_name)); } else if (eMsg == EMsg.ClientServiceMethodResponse) { var proto = GetProtoMsgFromFile <CMsgClientServiceMethodResponse>(eMsg, fileName); return(string.Format("{0} ({1})", nameFromEMsg, proto.Body.method_name)); } return(nameFromEMsg); }
string BuildEMsg(uint eMsg) { eMsg = MsgUtil.GetGCMsg(eMsg); List <FieldInfo> fields = new List <FieldInfo>(); fields.AddRange(typeof(SteamKit2.GC.TF2.EGCMsg).GetFields(BindingFlags.Public | BindingFlags.Static)); fields.AddRange(typeof(SteamKit2.GC.Dota.EGCMsg).GetFields(BindingFlags.Public | BindingFlags.Static)); fields.AddRange(typeof(SteamKit2.GC.CSGO.EGCMsg).GetFields(BindingFlags.Public | BindingFlags.Static)); fields.AddRange(typeof(SteamKit2.GC.EGCMsgBase).GetFields(BindingFlags.Public | BindingFlags.Static)); var field = fields.SingleOrDefault(f => { uint value = ( uint )f.GetValue(null); return(value == eMsg); }); if (field != null) { return(string.Format("{0} ({1})", field.Name, field.DeclaringType.FullName)); } return(eMsg.ToString()); }