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); } } }
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; }
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); } }
//感染者をパンデミック状態へ移行 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()); } } }
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); } } }
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; } }