网上演练贵港万达广场(人员密集)
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.
 
 
 

337 lines
16 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using AX.MessageSystem;
using UnityEngine;
using AX.InputSystem;
using AX.NetworkSystem;
public class CloneWaterCurtainHose : CloneBase
{
[SerializeField]
[Tooltip("距离地面距离")]
protected float Height = 0;
private GameObject WaterCurtainHoseParent; //水幕水带父对象
private MoveWaterCannonTool movetool;
private Vector3 startPoint = Vector3.zero;
private Vector3 endPoint = Vector3.zero;
private long currentWCHoseParentId = -1;//当前次克隆水幕水带父对象的gameObjId
public override void OnEnable()
{
base.OnEnable();
MessageDispatcher.AddListener("INIT_WATERCURTAINHOSE_STARTPOINT", ResetStartPoint);
}
public override void OnDisable()
{
base.OnDisable();
MessageDispatcher.RemoveListener("INIT_WATERCURTAINHOSE_STARTPOINT", ResetStartPoint);
}
public override void OnDestroy()
{
base.OnDestroy();
MessageDispatcher.RemoveListener("INIT_WATERCURTAINHOSE_STARTPOINT", ResetStartPoint);
}
private void ResetStartPoint(IMessage obj)
{
startPoint = Vector3.zero;
//取消水幕水带克隆按钮选中重置初始点时,若没有克隆出水幕水带子对象,则删除水幕水带父对象
var currentWCHoseParent = EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId);
if (currentWCHoseParent)
{
if (currentWCHoseParent.transform.childCount == 0)
{
EntitiesManager.Instance.DeleteObj(currentWCHoseParent);
}
else
{//已克隆有子对象时,结束当前次水幕水带克隆操作时,算出水幕水带上出水位置
MessageDispatcher.SendMessage("GET_SPRAYWATER_POSITIONS", currentWCHoseParentId);
}
//防止已克隆一次完整水幕水带后(currentWCHoseParentId有值),再次选中水幕水带克隆按钮,但不克隆就取消造成判断内代码块再次执行
currentWCHoseParentId = -1;
}
}
private void Start()
{
if (WaterCurtainHoseParent == null)
WaterCurtainHoseParent = Resources.Load("ClonePrefabs/Tool/WaterCurtainHoseParent") as GameObject;
}
public override void Execute(IMessage obj)
{
var gameObjID = (long)obj.Sender;
var data = ((CloneCmdArgs)obj.Data);
if (data.cloneObjType == cloneObjType)
{
if (SkillTollPanel.Instance)
{
if (SkillTollPanel.Instance.GetComponent<MoveWaterCannonTool>())
{
movetool = SkillTollPanel.Instance.GetComponent<MoveWaterCannonTool>();
}
}
if (movetool && int.Parse(movetool.waterCurtainHoseText.text) <= 0)
{
LoadPromptWin.Instance.LoadTextPromptWindow("水幕水带数量不足", 1f);
return;
}
var hitPoint = data.hitPos;
if (startPoint == Vector3.zero)
{//第一次点击点时
var hitObj = EntitiesManager.Instance.GetEntityByID(data.gameObjID);
if (hitObj.GetComponent<WaterSource>())
{//如果点击的点在水源车,消火栓,泡沫栓上,需把点高度移动到贴地
if (!checkWaterSourceOutPoint(hitObj))
return;
//startPoint = new Vector3(hitPoint.x, hitObj.transform.position.y, hitPoint.z);
startPoint = hitObj.transform.position;//吸附到水源位置
}
else
{//否则直接赋值
startPoint = hitPoint;
}
//点击第一个点时,先克隆父对象
var clonedObj = EntitiesManager.Instance.CreateObj(WaterCurtainHoseParent, startPoint, transform, gameObjID);
clonedObj.name = CloneObjNameTool.Instance().GetCloneObjectName(cloneObjType);
SelectedObjs.gameObjs.Add(clonedObj);
//设置克隆物体所在楼层等基本属性,属性从点击的对象上获取
CloneGameObjInfo hitObjInfo = hitObj.GetComponent<CloneGameObjInfo>();
CloneGameObjInfo cloneObjInfo = clonedObj.GetComponent<CloneGameObjInfo>();
cloneObjInfo.gameObjType = cloneObjType;
cloneObjInfo.UserID = CurrentUserInfo.mySelf.Id;
cloneObjInfo.buildNum = hitObjInfo.buildNum;
cloneObjInfo.floorNum = hitObjInfo.floorNum;
cloneObjInfo.interlayerNum = hitObjInfo.interlayerNum;
//记录当前次克隆水幕水带的父对象Id
currentWCHoseParentId = gameObjID;
//加入第一个点到水幕水带路径点数组
clonedObj.GetComponent<WaterCurtainHoseSkillCtrl>().pathPoints.Add(startPoint);
if (hitObj.GetComponent<WaterSource>())
{//给水幕水带绑定水源(可能是水源车,可能是消火栓,泡沫栓等)
clonedObj.GetComponent<WaterCurtainHoseSkillCtrl>().waterSourceGameObjId =
hitObj.GetComponent<BaseGameObjInfo>().gameObjID;
LoadPromptWin.Instance.LoadTextPromptWindow("连接水源成功", 1f);
clonedObj.GetComponent<WaterCurtainHoseSkillCtrl>().startPointIsWaterSource = true;
//本客户端水幕水带所连接的水源为车时,在车上绑定所连接的水幕水带
WaterCarBindCurtainHose waterCarBindCurtainHose = new WaterCarBindCurtainHose();
waterCarBindCurtainHose.WaterSourceObjId = hitObj.GetComponent<BaseGameObjInfo>().gameObjID;
waterCarBindCurtainHose.WaterCurtainHose = clonedObj;
waterCarBindCurtainHose.isConnect = true;
MessageDispatcher.SendMessage("WATERCAR_BIND_CURTAINHOSE", waterCarBindCurtainHose);
}
return;
}
if (startPoint != Vector3.zero)
{//后续点击点时
endPoint = hitPoint;
var hitObj = EntitiesManager.Instance.GetEntityByID(data.gameObjID);
var currentWCHoseParent = EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId);
if (hitObj.GetComponent<WaterSource>())
{//后续点击的点点击到水源上,
if (currentWCHoseParent.GetComponent<WaterCurtainHoseSkillCtrl>().waterSourceGameObjId != -1)
{//当前水幕水带起始点已绑定了水源的情况下
LoadPromptWin.Instance.LoadTextPromptWindow("起始端已连接水源,无需再连接到水源", 1f);
return;
}
else
{
if (!checkWaterSourceOutPoint(hitObj))
return;
//endPoint = new Vector3(hitPoint.x, hitObj.transform.position.y, hitPoint.z);//点贴地
endPoint = hitObj.transform.position;//吸附到水源位置
}
}
}
float distance = Vector3.Distance(startPoint, endPoint);//计算两点的距离
if (distance < 2)
{
LoadPromptWin.Instance.LoadTextPromptWindow("两点重合", 1f);
return;
}
if (movetool && int.Parse(movetool.waterCurtainHoseText.text) * 25 < distance)
{
LoadPromptWin.Instance.LoadTextPromptWindow("剩余水幕水带长度不足", 1f);
return;
}
Vector3 clonedObjPos = (startPoint + endPoint) / 2;
clonedObjPos = new Vector3(clonedObjPos.x, clonedObjPos.y + Height, clonedObjPos.z);
//水幕水带子对象不加入到实体管理器,其父对象加入到了实体管理器及能选中的数组里
//水幕水带子对象gameObjID赋值跟其父对象一样,且加上BoxCollider,这样 子对象BoxCollider响应选中点击
GameObject WaterCurtainHoseChild = null;
if (EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId))
{
WaterCurtainHoseChild = Instantiate(
clonePrefab,
clonedObjPos,
Quaternion.identity,
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).transform) as GameObject;
WaterCurtainHoseChild.GetComponent<BaseGameObjInfo>().SetGameObjID(currentWCHoseParentId);
SelectedObjs.gameObjs.Add(WaterCurtainHoseChild);
}
WaterCurtainHoseChild.transform.forward = (-(endPoint - startPoint)).normalized;//改变线条的朝向
WaterCurtainHoseChild.transform.localScale = new Vector3(30f, 30f, distance * 108);//延长线条,连接两点。
WaterCurtainHoseChild.AddComponent<BoxCollider>();
if (!WaterCurtainHoseChild.GetComponent<UIdSystem>())
{
WaterCurtainHoseChild.AddComponent<UIdSystem>().ReassignId((ulong)CurrentUserInfo.mySelf.Id, true);
}
//设置克隆物体所在楼层等基本属性,属性从点击的对象上获取
CloneGameObjInfo childCloneObjInfo = WaterCurtainHoseChild.GetComponent<CloneGameObjInfo>();
childCloneObjInfo.gameObjType = cloneObjType;
childCloneObjInfo.UserID = CurrentUserInfo.mySelf.Id;
if (EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId))
{
childCloneObjInfo.buildNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().buildNum;
childCloneObjInfo.floorNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().floorNum;
childCloneObjInfo.interlayerNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().interlayerNum;
}
//加入后续点到水幕水带路径点数组
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<WaterCurtainHoseSkillCtrl>().pathPoints.Add(endPoint);
//克隆一个水幕水带子对象,调用一次,计算水幕水带消耗及改变其克隆按钮上的剩余盘数(默认25米1盘)
if (data.cloneObjType == CloneObjType.WaterCurtainHose)
{
MessageDispatcher.SendMessage("UseWaterCurtainHose", distance);
}
var hitGameObj = EntitiesManager.Instance.GetEntityByID(data.gameObjID);
var currentWaterCHoseParent = EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId);
if (hitGameObj.GetComponent<WaterSource>() &&
currentWaterCHoseParent.GetComponent<WaterCurtainHoseSkillCtrl>().waterSourceGameObjId == -1)
{//后续点击的点点击到水源上,且当前水幕水带还没绑定水源的情况下,绑定水源且结束当前次克隆水幕水带
currentWaterCHoseParent.GetComponent<WaterCurtainHoseSkillCtrl>().waterSourceGameObjId =
hitGameObj.GetComponent<BaseGameObjInfo>().gameObjID;
LoadPromptWin.Instance.LoadTextPromptWindow("连接水源成功", 1f);
currentWaterCHoseParent.GetComponent<WaterCurtainHoseSkillCtrl>().startPointIsWaterSource = false;
//本客户端水幕水带所连接的水源为车时,在车上绑定所连接的水幕水带
WaterCarBindCurtainHose waterCarBindCurtainHose = new WaterCarBindCurtainHose();
waterCarBindCurtainHose.WaterSourceObjId = hitGameObj.GetComponent<BaseGameObjInfo>().gameObjID;
waterCarBindCurtainHose.WaterCurtainHose = currentWaterCHoseParent;
waterCarBindCurtainHose.isConnect = true;
MessageDispatcher.SendMessage("WATERCAR_BIND_CURTAINHOSE", waterCarBindCurtainHose);
CloneWaterCurtainHoseSync();//结束端绑定水源结束当前次克隆水幕水带时,需先同步再结束,否则currentWCHoseParentId为-1
startPoint = endPoint;
//结束当前次克隆水幕水带
MessageDispatcher.SendMessage("CANCEL_CLONEBTN_SELECTED_COMMAND", new CloneCmdArgs() { selected = false });
return;
}
CloneWaterCurtainHoseSync();
startPoint = endPoint;
}
}
/// <summary>
/// 克隆水幕水带同步
/// </summary>
public void CloneWaterCurtainHoseSync()
{
//克隆水幕水带同步
var syncData = new WaterCurtainHoseSyncData();
//水幕水带父对象需要同步的信息
syncData.WaterCHoseParentSyncData.gameObjID = currentWCHoseParentId;
syncData.WaterCHoseParentSyncData.gameObjType = cloneObjType;
syncData.WaterCHoseParentSyncData.UserID = CurrentUserInfo.mySelf.Id;
syncData.WaterCHoseParentSyncData.buildNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().buildNum;
syncData.WaterCHoseParentSyncData.floorNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().floorNum;
syncData.WaterCHoseParentSyncData.interlayerNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().interlayerNum;
syncData.WaterCHoseParentSyncData.SendUserID = CurrentUserInfo.mySelf.Id;
syncData.WaterCHoseParentSyncData.ClonePosition =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).transform.position;
syncData.WaterCHoseParentSyncData.Name =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).name;
//水幕水带子对象需要同步的信息
syncData.WaterCHoseChildSyncData.gameObjID = currentWCHoseParentId;
syncData.WaterCHoseChildSyncData.gameObjType = cloneObjType;
syncData.WaterCHoseChildSyncData.UserID = CurrentUserInfo.mySelf.Id;
syncData.WaterCHoseChildSyncData.buildNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().buildNum;
syncData.WaterCHoseChildSyncData.floorNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().floorNum;
syncData.WaterCHoseChildSyncData.interlayerNum =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<CloneGameObjInfo>().interlayerNum;
syncData.WaterCHoseChildSyncData.SendUserID = CurrentUserInfo.mySelf.Id;
syncData.WaterCHoseChildSyncData.StartPoint = startPoint;
syncData.WaterCHoseChildSyncData.EndPoint = endPoint;
syncData.WaterCHoseChildSyncData.Height = Height;
syncData.waterSourceObjId =
EntitiesManager.Instance.GetEntityByID(currentWCHoseParentId).GetComponent<WaterCurtainHoseSkillCtrl>().waterSourceGameObjId;
NetworkManager.Default.SendAsync("CLONE_WATERCURTAINHOSE_SYNC", syncData);
}
bool checkWaterSourceOutPoint(GameObject hitobj)
{
bool can = true;
if (hitobj.GetComponent<TruckMessage>())
{//水源车,两个出水口
TruckBindWaterSource tbs = hitobj.GetComponent<TruckBindWaterSource>();
if (tbs.DirectConnectObj1.Key != null && tbs.DirectConnectObj2.Key != null)
{
LoadPromptWin.Instance.LoadTextPromptWindow("该水源没有更多出水口", 1f);
can = false;
}
}
else
{
if (hitobj.GetComponent<WaterSource>().ConnectGameObj != null)
{
LoadPromptWin.Instance.LoadTextPromptWindow("该水源没有更多出水口", 1f);
can = false;
}
}
return can;
}
}