You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
7.8 KiB
247 lines
7.8 KiB
4 years ago
|
using AX.InputSystem;
|
||
|
using AX.NetworkSystem;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class OilTanksBoilOver : MonoBehaviour
|
||
|
{
|
||
|
// 正常罐模型
|
||
|
public GameObject NomalModel;
|
||
|
// 喷溅特效
|
||
|
public GameObject SplashModel;
|
||
|
// 沸溢罐模型
|
||
|
public GameObject BoilOverModel;
|
||
|
// 罐体信息
|
||
|
public OilTankMessage OilData;
|
||
|
//// 罐体是否受热,冷却强度是否足够
|
||
|
//public bool IsHeating = false;
|
||
|
// 当前受热时长
|
||
|
private float currentHeatingTime = 0;
|
||
|
// 当前沸溢时长
|
||
|
private float currentSplashingTime = 0;
|
||
|
// 当前状态
|
||
|
public OilTanksState State = OilTanksState.Normal;
|
||
|
// 冷却组件
|
||
|
public List<OilTanksCooling> oilTanksCoolings;
|
||
|
private void Awake()
|
||
|
{
|
||
|
OilTanksBoilOverManager.AddOilTanksBoilOver(gameObject.name, this);
|
||
|
}
|
||
|
private void OnDestroy()
|
||
|
{
|
||
|
OilTanksBoilOverManager.RemoveOilTanksBoilOver(gameObject.name);
|
||
|
}
|
||
|
void Update()
|
||
|
{
|
||
|
if (GameSettings.othersSettings.mode != Mode.DisasterManagement
|
||
|
&& CurrentUserInfo.role == Role.导调组
|
||
|
&& State != OilTanksState.BoilOverEnd
|
||
|
&& GameSettings.othersSettings.isStartDrill
|
||
|
)
|
||
|
{
|
||
|
CheckIsHeatingAndCooling();
|
||
|
switch (State)
|
||
|
{
|
||
|
case OilTanksState.Normal:
|
||
|
SearchNearUnits();
|
||
|
break;
|
||
|
case OilTanksState.Heating:
|
||
|
SearchNearUnits();
|
||
|
currentHeatingTime += Time.deltaTime;
|
||
|
if (currentHeatingTime >= OilData.BoilOverTime * 60)
|
||
|
{
|
||
|
int x = Random.Range(1, 101);
|
||
|
int temp = OilData.BoilOverProbability;
|
||
|
if (x <= temp)
|
||
|
{
|
||
|
State = OilTanksState.BoilOver;
|
||
|
NetworkManager.Default.SendAsync("OLITANKS_BOILOVER_SYNC", gameObject.name);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
State = OilTanksState.BoilOverEnd;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case OilTanksState.Explode:
|
||
|
break;
|
||
|
case OilTanksState.BoilOver:
|
||
|
currentSplashingTime += Time.deltaTime;
|
||
|
if (currentSplashingTime >= OilData.SplashTime * 60)
|
||
|
{
|
||
|
int x1 = Random.Range(1, 101);
|
||
|
int temp1 = OilData.SplashProbability;
|
||
|
if (x1 <= temp1)
|
||
|
{
|
||
|
NetworkManager.Default.SendAsync("OLITANKS_SPLASH_SYNC", gameObject.name);
|
||
|
}
|
||
|
State = OilTanksState.BoilOverEnd;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// 查询罐体是否受热
|
||
|
public void SearchNearUnits()
|
||
|
{
|
||
|
Collider[] colliders = Physics.OverlapSphere(transform.position, 29f, 1 << LayerMask.NameToLayer("Thermal"));
|
||
|
if (colliders.Length > 0)
|
||
|
{
|
||
|
foreach (var item in oilTanksCoolings)
|
||
|
{
|
||
|
item.IsHeating = true;
|
||
|
item.SetCoolingObject();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
foreach (var item in oilTanksCoolings)
|
||
|
{
|
||
|
item.IsHeating = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// 检查是否受热并冷却
|
||
|
private void CheckIsHeatingAndCooling()
|
||
|
{
|
||
|
State = OilTanksState.Normal;
|
||
|
foreach (var item in oilTanksCoolings)
|
||
|
{
|
||
|
if (item.IsHeating && item.IsCooling == false)
|
||
|
{
|
||
|
State = OilTanksState.Heating;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// 沸溢开始
|
||
|
public void BoilOverStart()
|
||
|
{
|
||
|
NomalModel.SetActive(false);
|
||
|
BoilOverModel.SetActive(true);
|
||
|
// 如果是导调组,创建
|
||
|
if (CurrentUserInfo.role == Role.导调组)
|
||
|
{
|
||
|
// 如果没有生成全页面火
|
||
|
//if (CheckHaveLiquidLevel())
|
||
|
//{
|
||
|
// //CloneLiquidLevelFire(NomalModel.transform.position + new Vector3(0, 10, 0));
|
||
|
|
||
|
//}
|
||
|
CheckHaveLiquidLevel();
|
||
|
BoilOverModel.SetActive(true);
|
||
|
HurtOnMan();
|
||
|
}
|
||
|
}
|
||
|
private void HurtOnMan()
|
||
|
{
|
||
|
// 获取所有重伤员
|
||
|
BaseHaemalController[] wounded = GameObject.Find("P_AllParent/P_Disasters/P_Wounded").GetComponentsInChildren<BaseHaemalController>();
|
||
|
// 获取所有轻伤员
|
||
|
BaseHaemalController[] trappedPerson = GameObject.Find("P_AllParent/P_Disasters/P_TrappedPerson").GetComponentsInChildren<BaseHaemalController>();
|
||
|
// 获取所有伤员
|
||
|
List<BaseHaemalController> allPerson = new List<BaseHaemalController>();
|
||
|
allPerson.AddRange(wounded);
|
||
|
allPerson.AddRange(trappedPerson);
|
||
|
// 检测伤员与爆炸的距离
|
||
|
foreach (var item in allPerson)
|
||
|
{
|
||
|
float distance = Vector3.Distance(transform.position, item.transform.position);
|
||
|
if (distance <= OilData.BoilOverDeadRange)
|
||
|
{
|
||
|
item.Haemal = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// 喷溅开始
|
||
|
public void SplashStart()
|
||
|
{
|
||
|
SplashModel.SetActive(true);
|
||
|
StartCoroutine(SplashEnd());
|
||
|
}
|
||
|
|
||
|
private IEnumerator SplashEnd()
|
||
|
{
|
||
|
yield return new WaitForSeconds(10f);
|
||
|
SplashModel.SetActive(false);
|
||
|
}
|
||
|
|
||
|
// 检测是否存在全液面火
|
||
|
public bool CheckHaveLiquidLevel()
|
||
|
{
|
||
|
Vector3 position = transform.position + new Vector3(0, 10, 0);
|
||
|
Collider[] colliders = Physics.OverlapSphere(position, 5f, 1 << LayerMask.NameToLayer("Thermal"));
|
||
|
if (colliders.Length > 0)
|
||
|
{
|
||
|
// 远近由索引限定
|
||
|
for (int i = 0; i < colliders.Length; i++)
|
||
|
{
|
||
|
if (colliders[i].GetComponent<CloneGameObjInfo>().gameObjType == CloneObjType.LiquidLevel)
|
||
|
{
|
||
|
colliders[i].gameObject.SetActive(false);
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public void CloneLiquidLevelFire(Vector3 pos)
|
||
|
{
|
||
|
var arg = new CloneCmdArgs();
|
||
|
if (NomalModel.transform.GetComponent<BaseGameObjInfo>())
|
||
|
{
|
||
|
arg.gameObjID = NomalModel.transform.GetComponent<BaseGameObjInfo>().GameObjID;
|
||
|
}
|
||
|
arg.cloneObjType = CloneObjType.LiquidLevel;
|
||
|
arg.hitPos = pos;
|
||
|
CloneCommand.Instance.Execute(EntitiesManager.Instance.CreateObjID(CurrentUserInfo.mySelf.Id), arg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public enum OilTanksState
|
||
|
{
|
||
|
Normal,
|
||
|
Heating,
|
||
|
Explode,
|
||
|
BoilOver,
|
||
|
BoilOverEnd
|
||
|
}
|
||
|
|
||
|
public class OilTanksBoilOverManager
|
||
|
{
|
||
|
static Dictionary<string, OilTanksBoilOver> OilTanksOilTanksBoilOvers = new Dictionary<string, OilTanksBoilOver>();
|
||
|
|
||
|
public static void AddOilTanksBoilOver(string name, OilTanksBoilOver oilTanksExplode)
|
||
|
{
|
||
|
if (!OilTanksOilTanksBoilOvers.ContainsKey(name))
|
||
|
{
|
||
|
OilTanksOilTanksBoilOvers.Add(name, oilTanksExplode);
|
||
|
}
|
||
|
}
|
||
|
public static void RemoveOilTanksBoilOver(string name)
|
||
|
{
|
||
|
if (OilTanksOilTanksBoilOvers.ContainsKey(name))
|
||
|
{
|
||
|
OilTanksOilTanksBoilOvers.Remove(name);
|
||
|
}
|
||
|
}
|
||
|
public static void OilTanksBoilOverByName(string name)
|
||
|
{
|
||
|
if (OilTanksOilTanksBoilOvers.ContainsKey(name))
|
||
|
{
|
||
|
OilTanksOilTanksBoilOvers[name].BoilOverStart();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void OilTanksSplashByName(string name)
|
||
|
{
|
||
|
if (OilTanksOilTanksBoilOvers.ContainsKey(name))
|
||
|
{
|
||
|
OilTanksOilTanksBoilOvers[name].SplashStart();
|
||
|
}
|
||
|
}
|
||
|
}
|