public static float SpringChance2(Building_Trap __instance, Pawn p) { float num = 1f; if (__instance.KnowsOfTrap(p)) { if (p.Faction != null) { Building building = __instance; num = ((p.Faction != building.Faction) ? 0f : 0.005f); } else if (p.RaceProps.Animal) { num = 0.2f; num *= __instance.def.building.trapPeacefulWildAnimalsSpringChanceFactor; } else { num = 0.3f; } } num *= __instance.GetStatValue(StatDefOf.TrapSpringChance) * p.GetStatValue(StatDefOf.PawnTrapSpringChance); return(Mathf.Clamp01(num)); }
private static bool HaulablePlaceValidator(Thing haulable, Pawn worker, IntVec3 c) { bool result; if (!worker.CanReserveAndReach(c, PathEndMode.OnCell, worker.NormalMaxDanger(), 1, -1, null, false)) { result = false; } else if (GenPlace.HaulPlaceBlockerIn(haulable, c, worker.Map, true) != null) { result = false; } else if (!c.Standable(worker.Map)) { result = false; } else if (c == haulable.Position && haulable.Spawned) { result = false; } else if (c.ContainsStaticFire(worker.Map)) { result = false; } else { if (haulable != null && haulable.def.BlockPlanting) { Zone zone = worker.Map.zoneManager.ZoneAt(c); if (zone is Zone_Growing) { return(false); } } if (haulable.def.passability != Traversability.Standable) { for (int i = 0; i < 8; i++) { IntVec3 c2 = c + GenAdj.AdjacentCells[i]; if (worker.Map.designationManager.DesignationAt(c2, DesignationDefOf.Mine) != null) { return(false); } } } Building edifice = c.GetEdifice(worker.Map); if (edifice != null) { Building_Trap building_Trap = edifice as Building_Trap; if (building_Trap != null) { return(false); } } result = true; } return(result); }
private static bool ShouldDestroy(bool original, Building_Trap instance) { if (!original) { var extBuldingProps = instance.def.GetModExtension <ExtendedBuildingProperties>() ?? ExtendedBuildingProperties.defaultValues; if (Rand.Chance(extBuldingProps.trapDestroyOnSpringChance)) { return(true); } } return(original); }
public static void CheckSpring2(Building_Trap __instance, Pawn p) { if (Rand.Chance(SpringChance2(__instance, p))) { Building building = __instance; Map map = building.Map; __instance.Spring(p); if (p.Faction == Faction.OfPlayer || p.HostFaction == Faction.OfPlayer) { Find.LetterStack.ReceiveLetter( "LetterFriendlyTrapSprungLabel".Translate(p.LabelShort, p).CapitalizeFirst(), "LetterFriendlyTrapSprung".Translate(p.LabelShort, p).CapitalizeFirst(), LetterDefOf.NegativeEvent, new TargetInfo(building.Position, map)); } } }
public static bool Tick(Building_Trap __instance) { Building building = __instance; if (building.Spawned) { List <Thing> thingList = building.Position.GetThingList(building.Map); for (int i = 0; i < thingList.Count; i++) { Pawn pawn; try { pawn = thingList[i] as Pawn; } catch (ArgumentOutOfRangeException) { break; } if (pawn != null && !touchingPawns(__instance).Contains(pawn)) { touchingPawns(__instance).Add(pawn); CheckSpring2(__instance, pawn); } } for (int j = 0; j < touchingPawns(__instance).Count; j++) { Pawn pawn2; try { pawn2 = touchingPawns(__instance)[j]; } catch (ArgumentOutOfRangeException) { break; } if (!pawn2.Spawned || pawn2.Position != building.Position) { touchingPawns(__instance).Remove(pawn2); } } } building.Tick(); return(false); }