using AX.MessageSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using AX.NetworkSystem;
public enum AroundState
{
Normal,
SmokeNear,
FireNear
}
///
/// 被困人员/伤员血量控制脚本基类,不适用于消防员
///
public class BaseHaemalController : MonoBehaviour
{
///
/// 最近操作的消防员Id或者消防员本身Id,用于事件记录,以便事件触发时可以查到操作用户
///
public long LastFireManId;
///
/// 对该角色实施过的技能
///
public List> skillList = new List>();
///
/// 是否被实施过急救
///
public bool beFristAid = false;
///
/// 当前血量
///
private float haemal;
public float Haemal
{
get
{
return haemal;
}
set
{
haemal = value;
if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
{//灾情库模式下不同步
if (CurrentUserInfo.mySelf.Id==CurrentUserInfo.room.Owner.UserInfo.Id)
{
if (GameSettings.othersSettings.isStartDrill)
{
HaemalSyncData arg = new HaemalSyncData();
arg.gameObjID = GetComponent().gameObjID;
arg.SendUserID = CurrentUserInfo.mySelf.Id;
if (GetComponent())
{
if (GetComponent().movestate != MoveState.FALLDOWN)
{
if (Haemal <= 50)
{
arg.FallDown = true;
AdjustRotationWhileEndPathfindData ajarg = new AdjustRotationWhileEndPathfindData
{
SenderId = CurrentUserInfo.mySelf.Id,
GameObjId = arg.gameObjID,
Hitpoint = transform.position,
EndRotation = new Vector3(transform.rotation.eulerAngles.x,
transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z)
};
NetworkManager.Default.SendAsync("ABJUST_ROTATION_SYNC", ajarg);
}
}
}
arg.Haemal = Haemal;
NetworkManager.Default.SendAsync("HAEMAL_BLOOD_SYNC", arg);
}
}
}
}
}
///
/// 最大血量
///
public float MaxHaemal;
///
/// 演练是否开始
///
public bool DrillBegin;
public AroundState aroundState;
///
/// 附近危险集合
///
public List DangerousList = new List();
public Transform P_Disasters;
public SceneType scenetype;
///
/// 是否佩戴面具
///
public bool HasMashk = false;
///
/// 遇到危险最大距离
///
public float MetDangerousDistance;
//public bool IsInDangerousThisSecond;
//用来判断扣血
private float timer = 1f;
///
/// 判断该角色是否还活着
///
public bool IsStillAlive = true;
//是否被移动状态
public bool IsMoving = false;
public bool BeFristAid
{
get
{
return beFristAid;
}
set
{
beFristAid = value;
WounderFristAidSyncData arg = new WounderFristAidSyncData();
arg.SendUserID = CurrentUserInfo.mySelf.Id;
arg.gameObjID = GetComponent().gameObjID;
arg.IsBeFristAid = value;
NetworkManager.Default.SendAsync("WOUNDER_FRISEAID_SYNC", arg);
}
}
//public virtual void OnDestroy()
//{
// MessageDispatcher.AddListener("FRISTAID_MAN_COMMAND", FristAid);
// //接收消防员技能,用来事件触发记录的
//}
//public virtual void OnEnable()
//{
// MessageDispatcher.AddListener("FRISTAID_MAN_COMMAND", FristAid);
// //接收消防员技能
//}
//public virtual void OnDisable()
//{
// MessageDispatcher.AddListener("FRISTAID_MAN_COMMAND", FristAid);
// //接收消防员技能
//}
//private void FristAid(IMessage obj)
//{
// BeFristAid = true;
// // CancelInvoke("BucklebloodMeetDangerous");
//}
public virtual void Start()
{
DrillBegin = GameSettings.othersSettings.isStartDrill;
P_Disasters = GameObject.Find("P_AllParent").transform.Find("P_Disasters");
}
///
/// 扣血方法,子类实现扣血方法
///
///
public virtual void BucklebloodMeetDangerous()
{
}
public void Update()
{
DrillBegin = GameSettings.othersSettings.isStartDrill;
if (DrillBegin)
{
if (CurrentUserInfo.room!=null&&CurrentUserInfo.mySelf.Id==CurrentUserInfo.room.Owner.UserInfo.Id)
{
if (IsStillAlive)
{
if (IsMoving)
{
return;
}
timer -= Time.deltaTime;
if (timer < 0)
{
GetDangerousList();
AroundStateSet();
BucklebloodMeetDangerous();
timer = 1f;
}
}
}
}
}
///
/// 死亡处理
///
public virtual void DeadDispose()
{
//加入事件触发列表
//EventReportController.Instance.EventReportList.Add();
}
///
/// 获取周围的危险列表,现只考虑火
///
public void GetDangerousList()
{
DangerousList.Clear();
CloneGameObjInfo[] allDisaster = P_Disasters.GetComponentsInChildren();
for (int i = 0; i < allDisaster.Length; i++)
{
if (/*allDisaster[i].gameObjType == CloneObjType.dangerousGoods ||*/
allDisaster[i].gameObjType == CloneObjType.fireNormal ||
allDisaster[i].gameObjType == CloneObjType.fireBreakThrough ||
allDisaster[i].gameObjType == CloneObjType.LiquidLevel||
allDisaster[i].gameObjType == CloneObjType.SpreadedFire/* ||
allDisaster[i].gameObjType == CloneObjType.smokeNormal ||
allDisaster[i].gameObjType == CloneObjType.smokeIndoor1 ||
allDisaster[i].gameObjType == CloneObjType.smokeIndoor2*/
)
{
if (allDisaster[i].gameObjType == CloneObjType.fireNormal ||
allDisaster[i].gameObjType == CloneObjType.fireBreakThrough ||
allDisaster[i].gameObjType == CloneObjType.LiquidLevel||
allDisaster[i].gameObjType == CloneObjType.SpreadedFire)
{
MetDangerousDistance = 15;
}
//if (allDisaster[i].gameObjType == CloneObjType.smokeNormal ||
//allDisaster[i].gameObjType == CloneObjType.smokeIndoor1 ||
//allDisaster[i].gameObjType == CloneObjType.smokeIndoor2)
//{
// MetDangerousDistance = 0;
//}
if (scenetype != SceneType.化工建筑)
{
//现检测高度范围为低于1.2(地面下0.2),高于2米(头上1米)
if (transform.position.y - allDisaster[i].transform.position.y < 1.2
|| allDisaster[i].transform.position.y - transform.position.y < 2)
{
//检测范围以内的
if (Vector3.Distance(transform.position, allDisaster[i].transform.position) <= MetDangerousDistance)
{
DangerousList.Add(allDisaster[i].gameObject);
}
}
}
else
{
//化工暂时不限高
if (transform.position.y - allDisaster[i].transform.position.y < 1.2)
{
//检测范围以内的
if (Vector3.Distance(transform.position, allDisaster[i].transform.position) <= MetDangerousDistance)
{
DangerousList.Add(allDisaster[i].gameObject);
}
}
}
}
}
}
public bool InDangerous()
{
if (DangerousList.Count > 0)
{
return true;
}
else { return false; }
}
public void AroundStateSet()
{
if (DangerousList.Count <= 0)
{
aroundState = AroundState.Normal;
return;
}
for (int i = 0; i < DangerousList.Count; i++)
{
if (DangerousList[i].GetComponent().gameObjType == CloneObjType.fireNormal ||
DangerousList[i].GetComponent().gameObjType == CloneObjType.fireBreakThrough ||
DangerousList[i].GetComponent().gameObjType == CloneObjType.LiquidLevel)
{
aroundState = AroundState.FireNear;
}
else
{
//ToDo:
//以后加上烟的粒子碰撞回调判断是否在烟里
//aroundState = AroundState.Normal;
}
}
}
}