Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 4
0
        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());
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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());
        }