Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }