using System.Collections;
using Games.AnimationModule;
using Games.GlobeDefine;
using GCGame.Table;
using Module.Log;
using UnityEngine;
using Games.Events;
using System;
namespace Games.MountModule
{
public struct MountParam
{
//public const int Max_MountCollect_Count = 40;
//当前骑乘ID
public int AdvanceMountId { get; set; }
//双人
public int _MountState;
public ulong _LinkID;
private int m_AutoFlagMountID;
public int AutoFlagMountID
{
get { return m_AutoFlagMountID; }
set
{
m_AutoFlagMountID = value;
if (AdvanceMountPanelCtr.Instance) AdvanceMountPanelCtr.Instance.fashionPanel.RefreshAdvanceItemState();
}
}
public void CleanUp()
{
AdvanceMountId = -1;
AutoFlagMountID = -1;
}
public void SyncMoutCollectedFlag(GC_MOUNTCOLLECTED_FLAG data)
{
Module.Log.LogModule.DebugLog("SyncMoutCollectedFlag");
m_AutoFlagMountID = data.AutoMountFlag;
}
public bool GetMountCollectFlag(int nMountID)
{
return false;
}
}
}
namespace Games.LogicObj
{
//////////////////////////////////////////////////////////////////////////
// 坐骑相关
//////////////////////////////////////////////////////////////////////////
public partial class Obj_OtherPlayer : Obj_Character
{
public GameEvent UnMountEventCallBack { get; set; }
public const int FashionTabId = 100000;
private const int _mountEffectId = 2003;
private int m_AdvanceMountID = -1;
public float mount_DeltaHeigh { get; private set; }
private AnimationLogic MountAnimaLogic;
public virtual int AdcaneMountId
{
get { return m_AdvanceMountID; }
set { m_AdvanceMountID = value; }
}
public ObjModelRecord mountModel = new ObjModelRecord();
public Tab_CharMount mountData { get; private set; }
private Transform _mountEffectPoint;
public Obj_OtherPlayer _MountClientObj;
public override Transform effectPoint
{
//
get { return _mountEffectPoint == null ? base.effectPoint : _mountEffectPoint; }
}
public override float DeltaHeight
{
get { return m_DeltaHeight + mount_DeltaHeigh; }
}
public float GetMountNameBoardHeight()
{
if (m_AdvanceMountID == -1) return 0;
var mountId = -1;
if (m_AdvanceMountID >= FashionTabId)
{
var advanceFashion = TableManager.GetAdvanceFashionByID(m_AdvanceMountID, 0);
if (advanceFashion == null) return 0;
mountId = advanceFashion.ModelId;
}
else
{
var advanceBase = TableManager.GetAdvanceBaseByID(m_AdvanceMountID, 0);
if (advanceBase == null) return 0;
mountId = advanceBase.ModelId;
}
var mountBase = TableManager.GetMountBaseByID(mountId, 0);
if (null == mountBase) return 0;
var mountTable = TableManager.GetCharMountByID(mountBase.ModelID, 0);
if (mountTable == null) return 0;
//司机乘客职业名称高度修正
float fFixHeight = 0;
if (DoubleRidingState == 2)
{
if (Profession >= 0 && Profession < mountTable.getHeadInfotCount())
fFixHeight = mountTable.GetHeadInfotbyIndex(Profession);
return fFixHeight;
}
else
{
if (Profession >= 0 && Profession < mountTable.getHeadInfoAddHeightCount())
fFixHeight = mountTable.GetHeadInfoAddHeightbyIndex(Profession);
return fFixHeight;
}
}
protected override void Awake()
{
base.Awake();
mountModel.onModelCreate += OnMountCreate;
mountModel.onModelDestroy += OnMountDestroy;
magicItem.onModelCreate += OnMagicCreate;
magicItem.onModelDestroy += OnMagicDestroy;
}
protected override void OnHideMaskUpdate(int previousMask)
{
base.OnHideMaskUpdate(previousMask);
var mount = GetHideMaskUpdateForPart(ModelPart.mount, previousMask);
if (mount > 0)
{
if (AdcaneMountId > GlobeVar.INVALID_ID)
RideMount(AdcaneMountId);
}
else if (mount < 0)
RemoveMount();
}
protected virtual void OnMountCreate(ObjPartRoot mountObj, object dataTable)
{
// 注:坐骑会绑定其他物体,必须立刻初始化
InitAttachmentMatInfo(ModelPart.mount, mountObj);
mountData = dataTable as Tab_CharMount;
var modelTransform = mountObj.transform;
modelTransform.SetParent(m_ObjTransform);
modelTransform.localPosition = Vector3.zero;
modelTransform.localRotation = Quaternion.identity;
modelTransform.localScale = Vector3.one;
if (ObjEffectLogic != null)
{
if (mountData != null)
{
var mountPoint = mountObj.transform.Find(mountData.BindPoint[0]);
//司机乘客绑定点
if (DoubleRidingState == 2)
{
mountPoint = mountObj.transform.Find(mountData.BindPoint[1]);
}
else
{
mountPoint = mountObj.transform.Find(mountData.BindPoint[0]);
}
if (mountPoint != null)
{
const string effectPointName = "MountEffectPoint";
var effectTrans = mountPoint.Find(effectPointName);
if (effectTrans == null)
{
// 额外增加一个特效挂点
var effectObj = new GameObject(effectPointName);
effectTrans = effectObj.transform;
effectTrans.SetParent(mountPoint);
// 不能继续自动校正方向 - 有些动画会导致重用时的坐骑挂点不处于初始位置
effectTrans.localPosition = Vector3.down * 0.99f;
effectTrans.localRotation = Quaternion.identity;
effectTrans.localScale = Vector3.one;
}
_mountEffectPoint = effectTrans;
}
}
ObjEffectLogic.ResetNormalEffectPoint();
//播放骑乘特效
ObjEffectLogic.PlayEffect(_mountEffectId);
}
mountObj.gameObject.name = "Model";
var layer = gameObject.layer;
mountObj.gameObject.SetLayerRecursively(layer);
// 注:原始mount已经被标记为摧毁,但是实际没有摧毁
// 因此playerModel还可以正常移动到新的坐骑节点
var playerModel = ModelNode.model;
if (playerModel != null)
SetModelBoundPoint(playerModel);
// var mountAnimTrans = transform.Find(_mountAnimObjName);
// if (mountAnimTrans == null)
// {
// var mountAnimObj = new GameObject(_mountAnimObjName);
// mountAnimTrans = mountAnimObj.transform;
// mountAnimTrans.SetParent(m_ObjTransform, false);
// }
MountAnimaLogic = CreateAnimLogic(mountObj);
if (CurObjAnimState == GameDefine_Globe.OBJ_ANIMSTATE.STATE_INVAILD)
CurObjAnimState = GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR;
else
OnSwithObjAnimState(CurObjAnimState);
mount_DeltaHeigh = GetMountNameBoardHeight();
}
protected virtual void OnMountDestroy(ObjPartRoot mountObj)
{
// 注:需要维持先移除_mountEffectPoint引用,然后重置特效位置,最后摧毁_mountEffectPoint这个流程。
var mountPoint = _mountEffectPoint;
_mountEffectPoint = null;
if (ObjEffectLogic != null)
ObjEffectLogic.ResetNormalEffectPoint();
if (mountPoint != null)
{
Destroy(mountPoint.gameObject);
}
if (MountAnimaLogic != null)
{
DisableAnimLogic(MountAnimaLogic);
MountAnimaLogic = null;
}
// if (MountAnimaLogic != null)
// {
// MountAnimaLogic.enabled = false;
// MountAnimaLogic.Clear();
// MountAnimaLogic = null;
// }
DestroyAttachmentMatInfo(ModelPart.mount);
}
//骑乘相关-------------------------------------------------------------
public int DoubleRidingState = 0;
public UInt64 _LinkID = 0;
public virtual void GetMountData(GC_MOUNT_DATA data)
{
DoubleRidingState = data.State;
_LinkID = data.LinkId;
RideOrUnMount(data.MountID);
}
//是否双人坐骑乘客
public bool IsMountClient()
{
return Games.GlobeDefine.GlobeVar.IsGUIDValid(_LinkID) && DoubleRidingState == 2;
}
// 上马下马 统一接口
public virtual void RideOrUnMount(int nMountID)
{
Tab_MountBase mountBase = TableManager.GetMountBaseByID(nMountID, 0);
//#if UNITY_ANDROID
//当前其他玩家处于不可见状态时,记录 MountID
if (!m_bVisible && m_ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER)
{
m_AdvanceMountID = nMountID;
return;
}
StopAllCoroutines();
//双人坐骑,乘客
if (IsMountClient())
{
StartCoroutine(SetModelBoundPoint2(ModelNode.model, _LinkID));
return;
}
if (nMountID > 0)
RideMount(nMountID);
else
UnMount();
if (OrnamentFootPrintID != -1)
ReloadOrnamentFootPrint(nMountID > 0 ? true : false);
}
///
/// 骑马
///
/// 模型ID
protected virtual void RideMount(int nMountID)
{
m_AdvanceMountID = nMountID;
if (m_ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER)
GameManager.gameManager.PlayerDataPool.m_objMountParam.AdvanceMountId = nMountID;
// 注:这里保存当前坐骑id,但是变身状态下不加载模型
if (ForceUseModel == null)
{
//显示坐骑模型
if (IsShowModel(ModelPart.mount))
{
int mountId;
//当前坐骑是活动坐骑
if (m_AdvanceMountID >= FashionTabId)
{
var advanceFashion = TableManager.GetAdvanceFashionByID(m_AdvanceMountID, 0);
if (advanceFashion == null) return;
mountId = advanceFashion.ModelId;//活动坐骑模型
}
else
{
var advanceBase = TableManager.GetAdvanceBaseByID(m_AdvanceMountID, 0);
if (advanceBase == null) return;
mountId = advanceBase.ModelId;//基础坐骑模型
}
//骑乘基础
var mountBase = TableManager.GetMountBaseByID(mountId, 0);
if (null == mountBase)
{
LogModule.DebugLog("MountBase.txt has not Line ID=" + mountId);
return;
}
//骑乘表
var mountTable = TableManager.GetCharMountByID(mountBase.ModelID, 0);
if (mountTable == null)
{
LogModule.DebugLog("CharMount.txt has not Line ID=" + mountBase.ModelID);
return;
}
//哈希表参数
var hashParam = new Hashtable { { modelDataHashName, mountTable } };
//加载模型 (模型资源包,坐骑模型名字,哈希表参数)
mountModel.LoadModel(LoadAssetBundle.BUNDLE_PATH_MODEL, mountTable.MountModel, hashParam, null);
}
}
else
RemoveMount();//退出骑乘
}
///
/// 设定模型绑定点
///
/// 模型对象
protected override void SetModelBoundPoint(ObjPartRoot modelObj)
{
Transform modelParent = null;
if (mountModel.model != null && mountData != null)
{
//司机乘客绑定点
if (DoubleRidingState == 0 || DoubleRidingState == 1)
{
modelParent = mountModel.model.transform.Find(mountData.BindPoint[0]);
}
if (DoubleRidingState == 2)
{
modelParent = mountModel.model.transform.Find(mountData.BindPoint[1]);
}
#if UNITY_EDITOR
if (modelParent == null)
{
if (DoubleRidingState == 2)
{
LogModule.ErrorLog(string.Format("无法获得坐骑{0}绑定位置{1}", mountData.Id, mountData.BindPoint[1]));
}
else
{
LogModule.ErrorLog(string.Format("无法获得坐骑{0}绑定位置{1}", mountData.Id, mountData.BindPoint[0]));
}
}
#endif
}
if (modelParent == null)
base.SetModelBoundPoint(modelObj);
//如果父节点本身匹配
else if (modelParent != modelObj.transform.parent)
{
var charModel = TableManager.GetCharModelByID(ModelID, 0);
var scale = charModel == null ? 1f : charModel.Scale;
scale *= ModelScale;
//玩家位置信息更新
var modelTransfrom = modelObj.transform;
modelTransfrom.SetParent(null);
modelTransfrom.localScale = m_ObjTransform.localScale * scale;
modelTransfrom.SetParent(modelParent);
modelTransfrom.localPosition = Vector3.zero;
modelTransfrom.localRotation = Quaternion.identity;
}
PlayMountPlayerAnima();
}
///
/// 设定模型绑定点--乘客
///
/// 模型对象
private float _StartTime;
private float _WaitMaxTime = 30;
protected IEnumerator SetModelBoundPoint2(ObjPartRoot modelObj, ulong linkID)
{
_StartTime = Time.time;
Obj_OtherPlayer driverPlayer = null;
Transform modelParent = null;
while (true)
{
driverPlayer = Singleton.Instance.FindOtherPlayerByGuid(linkID);
//等待司机模型
if (driverPlayer != null && driverPlayer.mountModel != null && driverPlayer.mountModel.model != null)
{
break;
}
else
{
//等30s,实在没有则退出
if (Time.time - _StartTime > _WaitMaxTime)
{
yield break;
}
yield return null;
}
}
mountData = driverPlayer.mountData;
modelParent = driverPlayer.mountModel.model.transform.Find(driverPlayer.mountData.BindPoint[1]);
#if UNITY_EDITOR
if (modelParent == null)
{
if (DoubleRidingState == 2)
{
LogModule.ErrorLog(string.Format("无法获得坐骑{0}绑定位置{1}", mountData.Id, mountData.BindPoint[1]));
}
else
{
LogModule.ErrorLog(string.Format("无法获得坐骑{0}绑定位置{1}", mountData.Id, mountData.BindPoint[0]));
}
}
#endif
if (modelParent == null)
base.SetModelBoundPoint(modelObj);
//如果父节点本身匹配
else if (modelParent != modelObj.transform.parent)
{
var charModel = TableManager.GetCharModelByID(ModelID, 0);
var scale = charModel == null ? 1f : charModel.Scale;
scale *= ModelScale;
//玩家位置信息更新
var modelTransfrom = modelObj.transform;
modelTransfrom.SetParent(null);
modelTransfrom.localScale = m_ObjTransform.localScale * scale;
modelTransfrom.SetParent(modelParent);
modelTransfrom.localPosition = Vector3.zero;
modelTransfrom.localRotation = Quaternion.identity;
m_headUIObj.SetVirtualModelTarget(modelTransfrom);
driverPlayer._MountClientObj = this;
}
PlayMountPlayerAnima();
}
///
/// 下马
///
protected virtual void UnMount()
{
m_AdvanceMountID = GlobeVar.INVALID_ID;
if (m_ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER)
GameManager.gameManager.PlayerDataPool.m_objMountParam.AdvanceMountId = m_AdvanceMountID;
RemoveMount();
}
///
/// 删除坐骑
///
protected virtual void RemoveMount()
{
mountData = null;
mount_DeltaHeigh = 0;
if (ModelNode.model != null)
base.SetModelBoundPoint(ModelNode.model);
if (IsMountClient())
{
m_headUIObj.SetVirtualModelTarget(null);
}
if (_MountClientObj != null)
{
_MountClientObj.m_headUIObj.SetVirtualModelTarget(null);
}
mountModel.RemoveModel();
if (!IsUsingSkill)
OnSwithObjAnimState(CurObjAnimState);
}
///
/// 行走动画
///
protected override void ProcessWalkAnimState()
{
if (MountAnimaLogic == null && !IsMountClient())
base.ProcessWalkAnimState();
else
PlayMountPlayerAnima();
}
///
/// 空闲状态
///
protected override void ProcessIdleAnimState()
{
if (MountAnimaLogic == null && !IsMountClient())
base.ProcessIdleAnimState();
else
PlayMountPlayerAnima();
}
///
/// 播放骑乘玩家动画
///
public void PlayMountPlayerAnima()
{
if (mountData != null)
{
switch (CurObjAnimState)
{
case GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR:
if (AnimLogic != null)
{
if (IsMountClient())
{
//播放乘客骑乘待机动画
AnimLogic.Play(mountData.IdlePlayerAnimationId[1]);
}
else
{
//播放司机骑乘待机动画
AnimLogic.Play(mountData.IdlePlayerAnimationId[0]);
}
}
if (MountAnimaLogic != null)
//站立
MountAnimaLogic.Play((int)CharacterDefine.CharacterAnimId.Stand);
break;
case GameDefine_Globe.OBJ_ANIMSTATE.STATE_WALK:
if (AnimLogic != null)
{
if (IsMountClient())
{
//播放乘客骑乘行走动画
AnimLogic.Play(mountData.RunPlayerAnimationId[1]);
}
else
{
//播放司机骑乘行走动画
AnimLogic.Play(mountData.RunPlayerAnimationId[0]);
}
}
if (MountAnimaLogic != null)
//步行
MountAnimaLogic.Play((int)CharacterDefine.CharacterAnimId.Walk);
break;
}
}
// 有MountData就不瞎折腾了
//int mountId;
//if (m_AdvanceMountID >= FashionTabId)
//{
// var advanceFashion = TableManager.GetAdvanceFashionByID(m_AdvanceMountID, 0);
// if (advanceFashion == null) return;
// mountId = advanceFashion.ModelId;
//}
//else
//{
// var advanceBase = TableManager.GetAdvanceBaseByID(m_AdvanceMountID, 0);
// if (advanceBase == null) return;
// mountId = advanceBase.ModelId;
//}
//var mountBase = TableManager.GetMountBaseByID(mountId, 0);
//if (mountBase == null)
// return;
//var mountTable = TableManager.GetCharMountByID(mountBase.ModelID, 0);
//if (mountTable == null)
// return;
}
///
/// 删除模型
///
public override void RemoveModels()
{
AdcaneMountId = GlobeVar.INVALID_ID;
mountModel.RemoveModel();
MagicID = GlobeVar.INVALID_ID;
magicItem.RemoveModel();
base.RemoveModels();
}
///
/// 释放所有模型
///
/// 是否释放
public override void ReleaseAllModel(bool isDestroy)
{
base.ReleaseAllModel(isDestroy);
mountModel.Release();
magicItem.Release();
if (isDestroy)
DestroyAttachmentMatInfo(ModelPart.mount);
}
///
/// 删除目标
///
protected override void OnObjDestroy()
{
mountModel.ReduceCount();
// 注:特殊处理法宝 - 不确定法宝是否会同时被删除;
// 如果是切换场景的流程,法宝将无法被回收,因此统一处理为手动摧毁流程;
if (magicItem.model != null)
{
magicItem.ReduceCount();
Destroy(magicItem.model);
}
base.OnObjDestroy();
}
}
}