void UpdateSpread() { float delta = Time.deltaTime; Vector3 scale = transform.root.localScale; if (scale.x >= maxSize || tile.durability <= 0) { timeSinceSpreadAttempt += delta; if (timeSinceSpreadAttempt >= spreadInterval) { int rand = Random.Range(0, spreadChance); if (rand % spreadChance == 0) { List <TDTile> houses = map.Map.FindAdjacentFlammableTiles(tile); if (houses.Count > 0) { rand = Random.Range(0, houses.Count); TDTile tileToIgnite = houses[rand]; if (!tileToIgnite.OnFire && tile.durability > 0) { GameObject flame = (GameObject)Instantiate(spreadPrefab); Vector3 flamePos = map.GetPositionForTile(tileToIgnite.GetX(), tileToIgnite.GetY()); flamePos.x += 0.5f; flamePos.z -= 0.5f; flame.transform.position = flamePos; EGFlame egFlame = flame.GetComponent <EGFlame>(); egFlame.SetTile(tileToIgnite); egFlame.SetMap(map); egFlame.SetSpreadPrefab(spreadPrefab); PopUpUIManager.Instance.ShowFireSpreadNPCMessage(); tileToIgnite.OnFire = true; } } timeSinceSpreadAttempt = 0; } } } }
// Update is called once per frame void Update() { if (truck.IsActive() && !truck.IsWaitingForTraffic() && !truck.IsPuttingOutFire()) { if (waterStream != null) { Destroy(waterStream); waterStream = null; truck.SetPuttingOutFire(false); truck.TargetFlame = null; } } else if (!truck.IsActive() || truck.IsWaitingForTraffic()) { if (foundFlames.Count > 0) { truck.SetPuttingOutFire(true); if (waterStream == null) { waterStream = (GameObject)Instantiate(waterStreamPrefab); waterStream.transform.position = transform.position; } for (int i = foundFlames.Count - 1; i >= 0; i--) { if (foundFlames[i] == null) { foundFlames.RemoveAt(i); } } GameObject closestFlame = null; float shortestDist = 100; for (int i = 0; i < foundFlames.Count; i++) { GameObject flame = foundFlames[i]; if (closestFlame == null) { closestFlame = flame; shortestDist = Vector3.Distance(transform.position, closestFlame.transform.position); } else { float dist = Vector3.Distance(transform.position, flame.transform.position); if (dist < shortestDist) { closestFlame = flame; shortestDist = dist; } } } if (closestFlame != null) { truck.TargetFlame = closestFlame; float dist = Vector3.Distance(transform.position, closestFlame.transform.position); Vector3 streamScale = waterStream.transform.localScale; streamScale.x = dist; waterStream.transform.localScale = streamScale; float angle = Mathf.Atan2(closestFlame.transform.position.z - transform.position.z, closestFlame.transform.position.x - transform.position.x); angle = angle * Mathf.Rad2Deg; //Convert to local coordinate system angle = 90 - angle; float localizedCurrentAngle = waterStream.transform.eulerAngles.y; angle = angle - localizedCurrentAngle; angle = (angle + 360) % 360; if (angle > 180) { angle = angle - 360; } angle = angle - 90; waterStream.transform.Rotate(0, angle, 0); Vector3 flameScale = closestFlame.transform.localScale; flameScale.x -= waterRate * Time.deltaTime; flameScale.y -= waterRate * Time.deltaTime; flameScale.z -= waterRate * Time.deltaTime; closestFlame.transform.localScale = flameScale; if (flameScale.x <= waterRate) { EGFlame egFlame = closestFlame.transform.gameObject.GetComponent <EGFlame> (); if (egFlame != null) { egFlame.PutOut(); } Destroy(closestFlame.transform.gameObject); foundFlames.Remove(closestFlame); truck.SetPuttingOutFire(false); truck.TargetFlame = null; } } } else { if (waterStream != null) { Destroy(waterStream); waterStream = null; } truck.SetPuttingOutFire(false); truck.TargetFlame = null; } } else { truck.SetPuttingOutFire(false); truck.TargetFlame = null; } }