public static void AttachAnimalToNetwork(AnimalSpawnZone zone, GameObject gameObject) { AnimalDespawner animalDespawner = gameObject.GetComponent <AnimalDespawner>(); if (!animalDespawner) { animalDespawner = gameObject.AddComponent <AnimalDespawner>(); } animalDespawner.SpawnedFromZone = zone; animalDespawner.DespawnRadius = 70f; animalDespawner.UpdateRate = 1f; if (BoltNetwork.isServer) { BoltEntity boltEntity = gameObject.AddComponent <BoltEntity>(); BoltEntity component = gameObject.GetComponent <CoopAnimalServer>().NetworkContainerPrefab.GetComponent <BoltEntity>(); using (BoltEntitySettingsModifier boltEntitySettingsModifier = component.ModifySettings()) { using (BoltEntitySettingsModifier boltEntitySettingsModifier2 = boltEntity.ModifySettings()) { boltEntitySettingsModifier2.clientPredicted = boltEntitySettingsModifier.clientPredicted; boltEntitySettingsModifier2.persistThroughSceneLoads = boltEntitySettingsModifier.persistThroughSceneLoads; boltEntitySettingsModifier2.allowInstantiateOnClient = boltEntitySettingsModifier.allowInstantiateOnClient; boltEntitySettingsModifier2.prefabId = boltEntitySettingsModifier.prefabId; boltEntitySettingsModifier2.updateRate = boltEntitySettingsModifier.updateRate; boltEntitySettingsModifier2.serializerId = boltEntitySettingsModifier.serializerId; } } BoltNetwork.Attach(gameObject); } }
private void SpawnOneAnimalForZoneOfType(AnimalSpawnZone zone, AnimalSpawnConfig spawn, Transform basePos) { if (spawn.nocturnal && !Clock.Dark) { return; } float sendDir; if (spawn.largeAnimalType) { sendDir = -1f; } else { sendDir = 1f; } Vector3 pos; if (AnimalSpawnController.TryFindSpawnPosition(basePos, sendDir, out pos)) { Transform transform = PoolManager.Pools["creatures"].Spawn(spawn.Prefab.transform, pos, zone.transform.rotation); if (transform) { this.SetupAnimal(transform, zone); } } }
private void Update() { if (BoltNetwork.isClient) { return; } if (AnimalSpawnController.lastUpdate + 2f < Time.time) { List <Transform> list = new List <Transform>(); foreach (GameObject current in this.sceneTracker.allPlayers) { if (current) { list.Add(current.transform); } } List <Transform> list2 = new List <Transform>(); foreach (Transform current2 in list) { bool flag = false; foreach (Transform current3 in list2) { if ((current2.position - current3.position).magnitude < Mathf.Lerp(30f, 60f, 0.6f)) { flag = true; break; } } if (!flag) { list2.Add(current2); } } AnimalSpawnZone[] zones = this.Zones; for (int i = 0; i < zones.Length; i++) { AnimalSpawnZone animalSpawnZone = zones[i]; if (animalSpawnZone.DelayUntil <= Time.realtimeSinceStartup) { if (list2.Count == 0) { break; } this.UpdateZone(animalSpawnZone, list2); } } AnimalSpawnController.lastUpdate = Time.time; } }
private void SetupAnimal(Transform animal, AnimalSpawnZone zone) { if (animal) { animal.GetChild(0).eulerAngles = new Vector3(0f, (float)UnityEngine.Random.Range(0, 360), 0f); } if (animal) { animal.SendMessage("startUpdateSpawn"); } if (animal) { animal.SendMessage("setSnowType", zone.snowType, SendMessageOptions.DontRequireReceiver); } zone.SpawnedAnimals.Add(animal.gameObject); AnimalSpawnController.AttachAnimalToNetwork(zone, animal.gameObject); }
private void UpdateZone(AnimalSpawnZone zone, List <Transform> positions) { try { for (int i = 0; i < positions.Count; i++) { if ((positions[i].position - zone.transform.position).sqrMagnitude < zone.ZoneRadius * zone.ZoneRadius) { this.SpawnOneAnimalForZone(zone, positions[i]); positions.RemoveAt(i); i--; } } } catch (Exception var_1_6B) { } }
private void SpawnOneAnimalForZoneOfType(AnimalSpawnZone zone, AnimalSpawnConfig spawn, Transform basePos) { if (spawn.nocturnal && !Clock.Dark) { return; } float sendDir; if (spawn.largeAnimalType) { sendDir = -1f; } else { sendDir = 1f; } Vector3 pos; if (AnimalSpawnController.TryFindSpawnPosition(basePos, sendDir, out pos)) { Transform transform = PoolManager.Pools["creatures"].Spawn(spawn.Prefab.transform, pos, zone.transform.rotation); if (!transform) { return; } if (transform) { transform.GetChild(0).eulerAngles = new Vector3(0f, (float)UnityEngine.Random.Range(0, 360), 0f); } if (transform) { transform.SendMessage("startUpdateSpawn"); } if (transform) { transform.SendMessage("setSnowType", zone.snowType, SendMessageOptions.DontRequireReceiver); } zone.SpawnedAnimals.Add(transform.gameObject); AnimalSpawnController.AttachAnimalToNetwork(zone, spawn, transform.gameObject); } }
private void OnEnable() { if (BoltNetwork.isClient) { return; } this.sceneTracker = Scene.SceneTracker; AnimalSpawnController.lastUpdate = Time.time; this.Zones = base.GetComponentsInChildren <AnimalSpawnZone>(); AnimalSpawnZone[] zones = this.Zones; for (int i = 0; i < zones.Length; i++) { AnimalSpawnZone animalSpawnZone = zones[i]; animalSpawnZone.SpawnedAnimals = new List <GameObject>(); for (int j = 0; j < animalSpawnZone.Spawns.Length; j++) { animalSpawnZone.TotalWeight += animalSpawnZone.Spawns[j].Weight; animalSpawnZone.Spawns[j].WeightRunningTotal = animalSpawnZone.TotalWeight; } } }
private void SpawnOneAnimalForZone(AnimalSpawnZone zone, Transform pos) { if (zone.SpawnedAnimals.Count >= zone.MaxAnimalsTotal) { return; } float num = Mathf.Clamp01((float)zone.SpawnedAnimals.Count / (float)zone.MaxAnimalsTotal) - 0.25f; if (num < UnityEngine.Random.value) { float num2 = UnityEngine.Random.Range(0f, zone.TotalWeight); for (int i = 0; i < zone.Spawns.Length; i++) { if (num2 <= zone.Spawns[i].WeightRunningTotal) { this.SpawnOneAnimalForZoneOfType(zone, zone.Spawns[i], pos); return; } } } }
private void OnSpawnAnimalFromZone(GameObject spawned) { AnimalSpawnZone animalSpawnZone = null; for (int i = 0; i < this.queuedAnimalZones.Count; i++) { for (int j = 0; j < this.queuedAnimalZones[i].Spawns.Length; j++) { if (this.queuedAnimalZones[i].Spawns[j].bundleKey.asset == spawned.GetComponent <BundledPrefabSpawn>().id) { animalSpawnZone = this.queuedAnimalZones[i]; break; } } } if (animalSpawnZone != null) { Debug.Log("successfully spawned animal from spawn zone"); this.queuedAnimalZones.Remove(animalSpawnZone); this.OnSpawnedAnimalInZone(spawned, animalSpawnZone); } }
public void UpdateSpawnState() { for (int i = 0; i < this.sceneTracker.allPlayers.Count; i++) { GameObject gameObject = this.sceneTracker.allPlayers[i]; if (gameObject && (gameObject.transform.position - base.transform.position).sqrMagnitude < this.DespawnRadius * this.DespawnRadius) { return; } } Vector3 vector = LocalPlayer.Transform.InverseTransformPoint(base.transform.position); float num = Mathf.Atan2(vector.x, vector.z) * 57.29578f; if (num < 90f && num > -90f) { return; } if (this.SpawnedFromZone) { this.SpawnedFromZone.SpawnedAnimals.Remove(base.gameObject); this.SpawnedFromZone = null; } if (BoltNetwork.isRunning) { BoltNetwork.Detach(base.gameObject); UnityEngine.Object.Destroy(base.gameObject.GetComponent <BoltEntity>()); UnityEngine.Object.Destroy(this); } if (base.GetComponent <CoopAnimalServer>().NonPooled || !PoolManager.Pools["creatures"].IsSpawned(base.transform)) { UnityEngine.Object.Destroy(base.gameObject); } else { PoolManager.Pools["creatures"].Despawn(base.transform); UnityEngine.Object.Destroy(this); } }
public void SpawnAnimalFromZone(BundleKey bundleKey, Vector3 pos, Quaternion rot, AnimalSpawnZone spawnZone) { Debug.Log("Starting to spawn animal from spawn zone"); this.queuedAnimalZones.Add(spawnZone); this.SpawnObject(bundleKey, pos, rot, null, new Action <GameObject>(this.OnSpawnAnimalFromZone)); }
private void OnSpawnedFromAssetBundle(GameObject animal, AnimalSpawnZone zone) { this.SetupAnimal(animal.transform, zone); }
private void SpawnFromAssetBundle(AnimalSpawnZone zone, BundleKey bundleKey, Vector3 pos, Quaternion rot) { BundledPrefabSpawnPoolManager.instance.SpawnAnimalFromZone(bundleKey, pos, rot, zone); }