コード例 #1
0
        public static void Setter(StatPart_ApparelStatOffset __instance, ref float __state, StatRequest req, ref float val)
        {
            if (Finder.enabled)
            {
                var key = req.thingInt.thingIDNumber;

                var sub  = Tools.GetKey(req);
                var stat = __instance.apparelStat ?? __instance.parentStat;

                unchecked
                {
                    sub = HashUtility.HashOne(__state.GetHashCode(), sub);
                    sub = HashUtility.HashOne(stat.index, sub);
                }

                if (cache.TryGetValue(key, out var store))
                {
                    store[sub] = val;
                }
                else
                {
                    cache[key]      = new Dictionary <int, float>();
                    cache[key][sub] = val;
                }
            }
        }
コード例 #2
0
        public static bool Skipper(StatPart_ApparelStatOffset __instance, ref float __state, StatRequest req, ref float val)
        {
            if (Finder.enabled)
            {
                if (!req.HasThing || req.thingInt == null || !(req.thingInt is Pawn))
                {
                    return(false);
                }

                if (cache.TryGetValue(req.thingInt.thingIDNumber, out var store, expiry: 2500))
                {
                    var sub  = Tools.GetKey(req);
                    var stat = __instance.apparelStat ?? __instance.parentStat;

                    unchecked
                    {
                        sub = HashUtility.HashOne(val.GetHashCode(), sub);
                        sub = HashUtility.HashOne(stat.index, sub);
                    }

                    if (store.TryGetValue(sub, out var value))
                    {
                        val = value;
                        return(false);
                    }
                }
                __state = val;
            }
            return(true);
        }
コード例 #3
0
ファイル: WetClothes.cs プロジェクト: Cozarkian/WaterIsCold
 public static bool IgnoreInsulationWhenWet(StatPart_ApparelStatOffset __instance, StatRequest req, ref string __result, StatDef ___apparelStat, bool ___subtract)
 {
     if (___apparelStat != StatDefOf.Insulation_Cold || !___subtract)
     {
         return(true);
     }
     if (req.HasThing && req.Thing != null)
     {
         Pawn pawn = req.Thing as Pawn;
         if (pawn != null && PawnWearingRelevantGear(req, pawn, ___apparelStat))
         {
             Hediff firstHediffOfDef = pawn.health.hediffSet.GetFirstHediffOfDef(DefOf_WaterIsCold.WetCold, false);
             if (firstHediffOfDef == null)
             {
                 return(true);
             }
             StringBuilder stringBuilder = new StringBuilder();
             stringBuilder.AppendLine("StatsReport_RelevantGear".Translate());
             if (pawn.apparel != null)
             {
                 for (int i = 0; i < pawn.apparel.WornApparel.Count; i++)
                 {
                     Apparel gear = pawn.apparel.WornApparel[i];
                     stringBuilder.AppendLine(InfoTextLineFrom(__instance, gear, firstHediffOfDef.Severity, ___apparelStat));
                 }
             }
             __result = stringBuilder.ToString();
             return(false);
         }
     }
     __result = null;
     return(false);
 }
コード例 #4
0
ファイル: WetClothes.cs プロジェクト: Cozarkian/WaterIsCold
        private static string InfoTextLineFrom(StatPart_ApparelStatOffset instance, Thing gear, float heddifSeverity, StatDef apparelStat)
        {
            float num = gear.GetStatValue(apparelStat, true);

            num += StatWorker.StatOffsetFromGear(gear, apparelStat);
            num  = -num;
            if (!gear.def.HasModExtension <WaterGear>())
            {
                num = num * Mathf.Clamp(1f - heddifSeverity, ModSettings_WaterIsCold.wetInsFactor, 1f);
                return("    " + gear.LabelCap + ": " + num.ToStringByStyle(instance.parentStat.toStringStyle, ToStringNumberSense.Offset) + " (wet)");
            }
            return("    " + gear.LabelCap + ": " + num.ToStringByStyle(instance.parentStat.toStringStyle, ToStringNumberSense.Offset));
        }
コード例 #5
0
            public static void TransformValue_Postfix(StatPart_ApparelStatOffset __instance, StatRequest req, ref float val, Pair <float, bool> __state)
            {
                if (!__state.second || !Finder.enabled)
                {
                    return;
                }

                if (!req.HasThing || req.Thing == null || !(req.thingInt is Pawn))
                {
                    return;
                }

                var key    = Tools.GetKey(req);
                var tick   = GenTicks.TicksGame;
                var stat   = __instance.apparelStat ?? __instance.parentStat;
                var subKey = 0;

                unchecked
                {
                    subKey = HashUtility.HashOne(__state.first.GetHashCode());
                    subKey = HashUtility.HashOne(stat.index, subKey);
                }

                if (cache.TryGetValue(key, out var store) && tick - store.second < 2500)
                {
                    store.first[(ushort)subKey] = val;
                }
                else
                {
                    Dictionary <ushort, float> dict;

                    if (store == null || store.first == null)
                    {
                        dict = new Dictionary <ushort, float>();
                    }
                    else
                    {
                        store.first.Clear();
                        dict = store.first;
                    }

                    dict[(ushort)subKey] = val;
                    cache[key]           = new Pair <Dictionary <ushort, float>, int>(dict, tick);
                }
            }
コード例 #6
0
            public static bool TransformValue_Prefix(StatPart_ApparelStatOffset __instance, StatRequest req, ref float val, out Pair <float, bool> __state)
            {
                if (Finder.enabled)
                {
                    if (!req.HasThing || req.Thing == null || !(req.thingInt is Pawn))
                    {
                        __state = new Pair <float, bool>(val, true);
                        return(false);
                    }

                    var key    = Tools.GetKey(req);
                    var tick   = GenTicks.TicksGame;
                    var stat   = __instance.apparelStat ?? __instance.parentStat;
                    var subKey = 0;

                    unchecked
                    {
                        subKey = HashUtility.HashOne(val.GetHashCode());
                        subKey = HashUtility.HashOne(stat.index, subKey);
                    }

                    if (cache.TryGetValue(key, out var store) && tick - store.second < 2500)
                    {
                        if (store.first.TryGetValue((ushort)subKey, out float value))
                        {
                            __state = new Pair <float, bool>(val = value, false);
                            return(false);
                        }
                    }

                    __state = new Pair <float, bool>(val, true);
                    return(true);
                }
                else
                {
                    __state = new Pair <float, bool>(val, false);
                    return(true);
                }
            }