internal void RefreshCreatures(List <KPrefabID> creatures = null) { // обновляем число жеготных в комнате // список может передаваться из патча для RanchStation.Instance if (creatures == null) { int cell = this.GetSMI <RanchStation.Instance>()?.GetTargetRanchCell() ?? Grid.InvalidCell; creatures = Game.Instance.roomProber.GetCavityForCell(cell)?.creatures ?? new List <KPrefabID>(); } int old = storedCreatureCount; storedCreatureCount = 0; foreach (KPrefabID creature in creatures) { if (!creature.HasTag(GameTags.Creatures.Bagged) && !creature.HasTag(GameTags.Trapped) && !creature.HasTag(GameTags.Creatures.Die) && !creature.HasTag(GameTags.Dead)) { storedCreatureCount++; } } if (old != storedCreatureCount) { dirty = true; } if (dirty) { // для оптимизации упорядочиваем список жеготных. // вначале идут не выбранные в фильтре, затем по возрасту. Creatures.Clear(); var Age = Db.Get().Amounts.Age; Creatures.AddRange(creatures .Where(creature => creature != null && creature.gameObject != null) .OrderByDescending(delegate(KPrefabID creature) { if (!treeFilterable?.ContainsTag(creature.PrefabTag) ?? false) { return(1f); } var age = Age.Lookup(creature); if (age == null) { return(0); } return(age.value / age.GetMax()); })); dirty = false; } }
private static bool CanCapturableBeCapturedAtCapturePoint(FixedCapturableMonitor.Instance capturable, Instance capture_point, CavityInfo capture_cavity_info, int capture_cell) { if (!capturable.IsRunning()) { return(false); } if (capturable.HasTag(GameTags.Creatures.Bagged)) { return(false); } if (capturable.targetCapturePoint != capture_point && !capturable.targetCapturePoint.IsNullOrStopped()) { return(false); } if (capture_point.def.isCreatureEligibleToBeCapturedCb != null && !capture_point.def.isCreatureEligibleToBeCapturedCb(capturable.gameObject, capture_point)) { return(false); } if (!capturable.GetComponent <ChoreConsumer>().IsChoreEqualOrAboveCurrentChorePriority <FixedCaptureStates>()) { return(false); } int cell = Grid.PosToCell(capturable.transform.GetPosition()); CavityInfo cavityForCell = Game.Instance.roomProber.GetCavityForCell(cell); if (cavityForCell == null || cavityForCell != capture_cavity_info) { return(false); } int navigationCost = capturable.GetComponent <Navigator>().GetNavigationCost(capture_cell); if (navigationCost == -1) { return(false); } TreeFilterable component = capture_point.GetComponent <TreeFilterable>(); IUserControlledCapacity component2 = capture_point.GetComponent <IUserControlledCapacity>(); if (component.ContainsTag(capturable.GetComponent <KPrefabID>().PrefabTag) && component2.AmountStored <= component2.UserMaxCapacity) { return(false); } return(true); }
public bool IsCreatureEligibleToBeButched(GameObject creature_go) { if (!creature_go.HasTag(creatureEligibleTag)) { return(false); } bool flag = treeFilterable != null && treeFilterable.ContainsTag(creature_go.GetComponent <KPrefabID>().PrefabTag); if (autoButchSurplus && (!flag || storedCreatureCount > creatureLimit)) { return(true); } AmountInstance age = Db.Get().Amounts.Age.Lookup(creature_go); if (age != null) { return(flag && ageButchThresold < age.value / age.GetMax()); } return(false); }