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; } } }
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); }
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); }
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)); }
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); } }
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); } }