Наследование: MonoBehaviour
Пример #1
0
        private void CategorizePrefab(CitizenInfo human)
        {
            CitizenAI ai       = human.m_citizenAI;
            int       prefabID = human.m_prefabDataIndex;

            /*
             * Create a blank entry. This way, even if this prefab does not belong here
             * for some bizarre reason, we will have a record of it. This eliminates
             * the chance of a prefab getting evaluated more than once, ever.
             */
            _mapping.AddEntry(prefabID);

            if (ai is HumanAI)
            {
                _mapping.AddMapping(prefabID, _data._Humans);

                if (ai is ResidentAI)
                {
                    _mapping.AddMapping(prefabID, _data._Residents);
                }
                else if (ai is ServicePersonAI)
                {
                    _mapping.AddMapping(prefabID, _data._ServicePersons);
                }
                else if (ai is TouristAI)
                {
                    _mapping.AddMapping(prefabID, _data._Tourists);
                }
                else
                {
                    _mapping.AddMapping(prefabID, _data._HumanOther);
                }
            }
        }
Пример #2
0
        private void ProcessHumansUpdated()
        {
            //Nothing to do if we have no target
            //if (m_tb == null) return;

            uint[] entries = SkylinesOverwatch.Data.Instance.HumansUpdated;

            if (entries.Length == 0)
            {
                return;
            }

            CitizenManager instance = Singleton <CitizenManager> .instance;

            foreach (uint i in entries)
            {
                Citizen resident = instance.m_citizens.m_buffer[(int)i];

                if (resident.Dead)
                {
                    continue;
                }

                if ((resident.m_flags & Citizen.Flags.Created) == Citizen.Flags.None)
                {
                    continue;
                }

                CitizenInfo info = resident.GetCitizenInfo(i);

                if (info == null)
                {
                    continue;
                }

                if (!(info.m_citizenAI is ResidentAI))
                {
                    continue;
                }

                if (info.m_gender == Citizen.Gender.Female)
                {
                    info.m_gender = Citizen.Gender.Male;
                    ChirpLog.Info("Updated resident: " + resident.ToString() + " " + i);
                    ChirpLog.Flush();
                }

                // Do something with resident
                CitizenAI ai = (CitizenAI)info.GetAI();
                // TODO: How to get the CitizenInstance ?
                //ai.SetTarget(resident.m_instance, 0, m_tb);
            }
        }
        private void ResetStuckEntities()
        {
            Log._Debug($"UtilityManager.RemoveStuckEntities() called.");

            Log._Debug($"UtilityManager.RemoveStuckEntities(): Pausing simulation.");
            Singleton <SimulationManager> .instance.ForcedSimulationPaused = true;

            Log._Debug($"UtilityManager.RemoveStuckEntities(): Waiting for all paths.");
            Singleton <PathManager> .instance.WaitForAllPaths();

            Log._Debug($"UtilityManager.RemoveStuckEntities(): Resetting citizen instances that are waiting for a path.");
            for (uint citizenInstanceId = 1; citizenInstanceId < CitizenManager.MAX_INSTANCE_COUNT; ++citizenInstanceId)
            {
                //Log._Debug($"UtilityManager.RemoveStuckEntities(): Processing instance {citizenInstanceId}.");
                CitizenInstance citizenData = Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId];
                if ((citizenData.m_flags & CitizenInstance.Flags.WaitingPath) != CitizenInstance.Flags.None)
                {
                    CitizenAI ai = Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].Info.m_citizenAI;

                    if (citizenData.m_path != 0u)
                    {
                        Singleton <PathManager> .instance.ReleasePath(citizenData.m_path);

                        Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_path = 0u;
                    }
                    Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_flags &= ~(CitizenInstance.Flags.WaitingTransport | CitizenInstance.Flags.EnteringVehicle | CitizenInstance.Flags.BoredOfWaiting | CitizenInstance.Flags.WaitingTaxi | CitizenInstance.Flags.WaitingPath);
                }
            }

            Log._Debug($"UtilityManager.RemoveStuckEntities(): Resetting vehicles that are waiting for a path.");
            for (uint vehicleId = 1; vehicleId < VehicleManager.MAX_VEHICLE_COUNT; ++vehicleId)
            {
                //Log._Debug($"UtilityManager.RemoveStuckEntities(): Processing vehicle {vehicleId}.");
                Vehicle vehicleData = Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId];
                if ((vehicleData.m_flags & Vehicle.Flags.WaitingPath) != 0)
                {
                    if (vehicleData.m_path != 0u)
                    {
                        Singleton <PathManager> .instance.ReleasePath(vehicleData.m_path);

                        Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_path = 0u;
                    }
                    Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags &= ~Vehicle.Flags.WaitingPath;
                }
            }

            Log._Debug($"UtilityManager.RemoveStuckEntities(): Unpausing simulation.");
            Singleton <SimulationManager> .instance.ForcedSimulationPaused = false;
        }
Пример #4
0
 static void SimulationStep(CitizenAI _this, uint citizenID, ref Citizen data)
 {
     try
     {
         _this.SimulationStep(citizenID, ref data);
     }
     catch (Exception e)
     {
         string info = $"An exception occured during CitizenAI simulation step.\nAsset: {_this.m_info.name}" +
                       $"\nCitizenID: {citizenID}\nType: {_this.GetType().Name}\nSeverity: High";
         HealkitException e2 = new HealkitException(info, e);
         e2.m_uniqueData   = _this.m_info.name;
         e2.m_supperessMsg = "Suppress similar exceptions caused by this asset";
         UIView.ForwardException(e2);
     }
 }
Пример #5
0
    //感染者をパンデミック状態へ移行
    public void StartPandemic()
    {
        int num = WorldViewer.CountObjects("Actor");

        m_actors = new GameObject[num];
        //残っている市民
        WorldViewer.GetAllObjects("Actor").CopyTo(m_actors, 0);

        num         = WorldViewer.CountObjects("InfectedActor");
        m_infecters = new GameObject[num];

        //今感染している市民
        WorldViewer.GetAllObjects("InfectedActor").CopyTo(m_infecters);

        //感染者のステートを変更
        foreach (var infecter in m_infecters)
        {
            CitizenAI ai = infecter.GetComponent <CitizenAI>();
            if (ai)
            {
                ai.ChangeState(new PandemicState());
            }
        }
    }
Пример #6
0
        private void CategorizePrefab(CitizenInfo animal)
        {
            CitizenAI ai       = animal.m_citizenAI;
            int       prefabID = animal.m_prefabDataIndex;

            /*
             * Create a blank entry. This way, even if this prefab does not belong here
             * for some bizarre reason, we will have a record of it. This eliminates
             * the chance of a prefab getting evaluated more than once, ever.
             */
            _mapping.AddEntry(prefabID);

            if (ai is AnimalAI)
            {
                _mapping.AddMapping(prefabID, _data._Animals);

                if (ai is BirdAI)
                {
                    _mapping.AddMapping(prefabID, _data._Birds);

                    if (_prefabs.ContainsKey("Seagull") && _prefabs["Seagull"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Seagulls);
                    }
                }
                else if (ai is LivestockAI)
                {
                    _mapping.AddMapping(prefabID, _data._Livestock);

                    if (_prefabs.ContainsKey("Cow") && _prefabs["Cow"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Cows);
                    }

                    if (_prefabs.ContainsKey("Pig") && _prefabs["Pig"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Pigs);
                    }
                }
                else if (ai is PetAI)
                {
                    _mapping.AddMapping(prefabID, _data._Pets);

                    if (_prefabs.ContainsKey("Dog") && _prefabs["Dog"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Dogs);
                    }
                }
                else if (ai is WildlifeAI)
                {
                    _mapping.AddMapping(prefabID, _data._Wildlife);

                    if (_prefabs.ContainsKey("Wolf") && _prefabs["Wolf"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Wolves);
                    }

                    if (_prefabs.ContainsKey("Bear") && _prefabs["Bear"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Bears);
                    }

                    if (_prefabs.ContainsKey("Moose") && _prefabs["Moose"] == prefabID)
                    {
                        _mapping.AddMapping(prefabID, _data._Moose);
                    }
                }
                else
                {
                    _mapping.AddMapping(prefabID, _data._AnimalOther);
                }
            }
        }
Пример #7
0
        public void ResetStuckEntities()
        {
            Log.Info($"UtilityManager.RemoveStuckEntities() called.");

            bool wasPaused = Singleton <SimulationManager> .instance.ForcedSimulationPaused;

            if (!wasPaused)
            {
                Log.Info($"UtilityManager.RemoveStuckEntities(): Pausing simulation.");
                Singleton <SimulationManager> .instance.ForcedSimulationPaused = true;
            }

            Log.Info($"UtilityManager.RemoveStuckEntities(): Waiting for all paths.");
            Singleton <PathManager> .instance.WaitForAllPaths();

            Log.Info($"UtilityManager.RemoveStuckEntities(): Resetting citizen instances that are waiting for a path.");
            for (uint citizenInstanceId = 1; citizenInstanceId < CitizenManager.MAX_INSTANCE_COUNT; ++citizenInstanceId)
            {
                //Log._Debug($"UtilityManager.RemoveStuckEntities(): Processing instance {citizenInstanceId}.");
                if ((Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_flags & CitizenInstance.Flags.WaitingPath) != CitizenInstance.Flags.None)
                {
                    CitizenAI ai = Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].Info.m_citizenAI;

                    if (Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_path != 0u)
                    {
                        Log.Info($"Resetting stuck citizen instance {citizenInstanceId} (waiting for path)");

                        Singleton <PathManager> .instance.ReleasePath(Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_path);

                        Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_path = 0u;
                    }
                    Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_flags &= ~(CitizenInstance.Flags.WaitingTransport | CitizenInstance.Flags.EnteringVehicle | CitizenInstance.Flags.BoredOfWaiting | CitizenInstance.Flags.WaitingTaxi | CitizenInstance.Flags.WaitingPath);
                }
                else
                {
#if DEBUG
                    if (Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_path == 0 &&
                        (Singleton <CitizenManager> .instance.m_instances.m_buffer[citizenInstanceId].m_flags & CitizenInstance.Flags.Character) != CitizenInstance.Flags.None)
                    {
                        Log._Debug($"Found potential floating citizen instance: {citizenInstanceId} Source building: {Singleton<CitizenManager>.instance.m_instances.m_buffer[citizenInstanceId].m_sourceBuilding} Target building: {Singleton<CitizenManager>.instance.m_instances.m_buffer[citizenInstanceId].m_targetBuilding} Distance to target position: {(Singleton<CitizenManager>.instance.m_instances.m_buffer[citizenInstanceId].GetLastFramePosition() - (Vector3)Singleton<CitizenManager>.instance.m_instances.m_buffer[citizenInstanceId].m_targetPos).magnitude}");
                    }
#endif
                }
            }

            Log.Info($"UtilityManager.RemoveStuckEntities(): Resetting vehicles that are waiting for a path.");
            for (uint vehicleId = 1; vehicleId < VehicleManager.MAX_VEHICLE_COUNT; ++vehicleId)
            {
                //Log._Debug($"UtilityManager.RemoveStuckEntities(): Processing vehicle {vehicleId}.");
                if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.WaitingPath) != 0)
                {
                    if (Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_path != 0u)
                    {
                        Log.Info($"Resetting stuck vehicle {vehicleId} (waiting for path)");

                        Singleton <PathManager> .instance.ReleasePath(Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_path);

                        Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_path = 0u;
                    }
                    Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags &= ~Vehicle.Flags.WaitingPath;
                }
            }

            Log.Info($"UtilityManager.RemoveStuckEntities(): Resetting vehicles that are parking and where no parked vehicle is assigned to the driver.");
            for (uint vehicleId = 1; vehicleId < VehicleManager.MAX_VEHICLE_COUNT; ++vehicleId)
            {
                //Log._Debug($"UtilityManager.RemoveStuckEntities(): Processing vehicle {vehicleId}.");
                if ((Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags & Vehicle.Flags.Parking) != 0)
                {
                    ushort driverInstanceId = CustomPassengerCarAI.GetDriverInstanceId((ushort)vehicleId, ref Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId]);
                    uint   citizenId        = Singleton <CitizenManager> .instance.m_instances.m_buffer[(int)driverInstanceId].m_citizen;
                    if (citizenId != 0u && Singleton <CitizenManager> .instance.m_citizens.m_buffer[citizenId].m_parkedVehicle == 0)
                    {
                        Log.Info($"Resetting vehicle {vehicleId} (parking without parked vehicle)");
                        Singleton <VehicleManager> .instance.m_vehicles.m_buffer[vehicleId].m_flags &= ~Vehicle.Flags.Parking;
                    }
                }
            }

            if (!wasPaused)
            {
                Log.Info($"UtilityManager.RemoveStuckEntities(): Unpausing simulation.");
                Singleton <SimulationManager> .instance.ForcedSimulationPaused = false;
            }
        }