Files
Main/Assets/Code/Logic/_Required/Entity/Character/Player/Player.cs

1122 lines
38 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using Thousandto.Core.Asset;
using Thousandto.Core.Framework;
using Thousandto.Code.Global;
using Thousandto.Core.Base;
using Thousandto.Code.Center;
using Thousandto.Cfg.Data;
using Thousandto.Plugins.Common;
using Thousandto.Core.Support;
namespace Thousandto.Code.Logic
{
//玩家基类
public class Player : Character
{
#region//变量信息
private FSkinModel _roleSkin = null;
//玩家属性模块
protected PlayerPropetry _propMoudlePlayer = null;
//是否变身
protected bool _isChangeModel = false;
//变身模型id
protected int _changeModeID = 0;
//变身配置ID
protected int _changeCfgID = 0;
//变身配置
protected DeclareChangeModel _changeModelCfg = null;
//受击闪烁器
private HitBlinker _blinker = null;
//外观信息
protected IPlayerVisualInfo _visualInfo = null;
//伴侣名字
protected string _spouseName = string.Empty;
//切换武器挂节点倒计时
private float _brightStateTimer = 0f;
//切换武器挂节点总时间
private float _brightMaxTime = 38f * Skill.OneFrameTime;
//武器状态
protected PlayerBrightWeaponState _brightState = PlayerBrightWeaponState.Receive;
//收武器的缩放
protected Vector3 _receiveWeaponScale = Vector3.one;
//亮武器的缩放
protected Vector3 _brightWeaponScale = Vector3.one;
//当前选择的目标Id
protected UInt64 _curSelectedTargetId = 0;
//当前选择是自动还是手动选择的
private bool _curSelectTargetIsAuto = true;
//上次播放灵力特效时间
private float _frontPlayLingLiTime = 0f;
//是否正在传道
private bool _isChuanDaoing = false;
//仙娃唯一ID
private ulong _marryChildUID = 0;
//总战斗力
protected long _fightPower = 0;
//图片头像id
protected string _texHeadPicID = string.Empty;
//上一次的Y轴朝向
private float _frontYForward = 0f;
#endregion
#region//属性信息
//属性
public new PlayerPropetry PropMoudle
{
get
{
if (_propMoudlePlayer == null)
{
_propMoudlePlayer = base.PropMoudle as PlayerPropetry;
}
return _propMoudlePlayer;
}
}
//是否在坐骑上
public bool IsOnMount
{
get
{
return Skin.GetSkinPart(FSkinPartCode.Mount).IsValid;
}
}
//是否跟随场景高度旋转
public bool RotBySceneHeight
{
get;
protected set;
}
//是否变身
public bool IsChangeModel
{
get
{
return _isChangeModel;
}
}
//变身配置ID
public int ChangeCfgID
{
get
{
return _changeCfgID;
}
}
//变身配置
public DeclareChangeModel ChangeModelCfg
{
get
{
return _changeModelCfg;
}
}
//是否可以被选择
public override bool CanBeSelect
{
get
{
return true;
}
}
//职业
public int Occ
{
get
{
return PropMoudle.Occ;
}
}
//职业
public int IntOcc
{
get
{
return PropMoudle.Occ;
}
}
//Skin
public new FSkinModel Skin
{
get
{
if (_roleSkin == null)
{
_roleSkin = base.Skin as FSkinModel;
}
return _roleSkin;
}
set
{
base.Skin = value;
_roleSkin = value;
}
}
//帮会ID
public virtual ulong GuildID
{
get
{
return PropMoudle.GuildId;
}
}
//帮会职位ID
public virtual int GuildRank
{
get
{
return PropMoudle.GuildRank;
}
}
//帮会名字
public virtual string GuildName
{
get
{
return PropMoudle.GuildName;
}
}
//当前境界等级
public int CurStateLevel
{
get
{
return PropMoudle.StateLevel;
}
set
{
if (PropMoudle.StateLevel != value)
{
PropMoudle.StateLevel = value;
_visualInfo.StateLevel = value;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATE_HEADINFO, this);
}
}
}
//当前识海ID
public int CurShiHaiID
{
get
{
return PropMoudle.ShiHaiID;
}
set
{
if (PropMoudle.ShiHaiID != value)
{
PropMoudle.ShiHaiID = value;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATE_HEADINFO, this);
}
}
}
//当前称号
public virtual DeclareTitle CurPictureTitle
{
get
{
return PropMoudle.PictureCfg;
}
}
//外观信息
public IPlayerVisualInfo VisualInfo
{
get
{
if (_visualInfo == null)
{
_visualInfo = GameCenter.LuaSystem.Adaptor.CreatePlayerVisualInfo(0);
}
return _visualInfo;
}
}
//灵体等级
public int LingTiDegree
{
get
{
return _visualInfo.LingTiDegree;
}
set
{
if (_visualInfo.LingTiDegree != value)
{
_visualInfo.LingTiDegree = value;
EquipWithType(FSkinPartCode.Body, _visualInfo.GetLingTiBodyModelID(IntOcc));
}
}
}
//时装衣服
public int FashionBodyID
{
get
{
return _visualInfo.FashionBodyID;
}
set
{
if (_visualInfo.FashionBodyID != value)
{
_visualInfo.FashionBodyID = value;
EquipWithType(FSkinPartCode.Body, _visualInfo.GetFashionBodyModelID(IntOcc));
}
}
}
//时装武器
public int FashionWeaponID
{
get
{
return _visualInfo.FashionWeaponID;
}
set
{
if (_visualInfo.FashionWeaponID != value)
{
_visualInfo.FashionWeaponID = value;
EquipWithType(FSkinPartCode.GodWeaponHead, _visualInfo.GetFashionWeaponModelID(IntOcc));
}
}
}
//时装光环
public int FashionHaloID
{
get
{
return _visualInfo.FashionHaloID;
}
set
{
if (_visualInfo.FashionHaloID != value)
{
_visualInfo.FashionHaloID = value;
EquipWithType(FSkinPartCode.XianjiaHuan, _visualInfo.GetFashionHaloModelID());
}
}
}
//时装法阵
public int FashionMatrixID
{
get
{
return _visualInfo.FashionMatrixID;
}
set
{
if (_visualInfo.FashionMatrixID != value)
{
_visualInfo.FashionMatrixID = value;
EquipWithType(FSkinPartCode.XianjiaZhen, _visualInfo.GetFashionMatrixModelID());
}
}
}
//时装头像
public int FashionHeadId { get; set; }
//时装头像框
public int FashionFrameId { get; set; }
//翅膀
public int WingID
{
get
{
return _visualInfo.WingId;
}
set
{
if (_visualInfo.WingId != value)
{
_visualInfo.WingId = value;
//EquipWithType(FSkinPartCode.Wing, _visualInfo.WingId);
}
}
}
//伴侣名字
public string SpouseName
{
get
{
return _spouseName;
}
}
//战斗状态
public bool AnimFightState
{
get
{
return _brightState != PlayerBrightWeaponState.Receive;
}
}
//是否有目标
public bool HasTarget
{
get
{
if (_curSelectedTargetId != 0)
{
var e = GetCurSelectedTarget();
if (e != null)
{
return true;
}
}
_curSelectedTargetId = 0;
return false;
}
}
//当前选择的目标ID
public UInt64 CurSelectedTargetId
{
get
{
return _curSelectedTargetId;
}
}
//当前选择是自动还是手动选择的
public bool CurSelectTargetIsAuto
{
get
{
return _curSelectTargetIsAuto;
}
}
//灵气百分比
public float LingLiPercent
{
get
{
if (PropMoudle.LingLi <= 0)
return 0f;
return (float)PropMoudle.CurLinLi / (float)PropMoudle.LingLi;
}
}
//是否正在传道
public bool IsChuanDaoing
{
get
{
return _isChuanDaoing;
}
set
{
if (_isChuanDaoing != value)
{
_isChuanDaoing = value;
if (_isChuanDaoing)
{
if (!IsXState(EntityStateID.ChuanDaoSitDown))
{
Action_ChuanDaoSitDown();
}
}
else
{
if (IsXState(EntityStateID.ChuanDaoSitDown))
{
Stop_Action();
}
}
}
}
}
//飞剑跟随的trans
public Transform FlySwordHeightTrans { get; protected set; }
//转职等级
public int ChangeJobLevel
{
get
{
return PropMoudle.ChangeJobLevel;
}
set
{
PropMoudle.ChangeJobLevel = value;
}
}
//获取战斗力
public virtual long FightPower
{
get { return _fightPower; }
set
{
if (_fightPower != value)
{
_fightPower = value;
}
}
}
//图片头像id
public string TexHeadPicID
{
get
{
return _texHeadPicID;
}
set
{
_texHeadPicID = value;
}
}
//是否显示图片头像
public bool IsShowHeadPic
{
get;
set;
}
//坐骑动作播放速度
public float MountAnimSpeed
{
get;
set;
}
#endregion
#region//装备处理
/// <summary>
/// 检查转换装备ID
/// </summary>
/// <param name="type"></param>
/// <param name="equipId"></param>
/// <returns></returns>
protected int CheckEquipID(int type, int equipId)
{
switch (type)
{
case FSkinPartCode.Body:
if (Scene != null && Scene.Cfg.SpecialBody.Length > 0)
{
equipId = DeclareDataUtils.GetValueWithPrefix((int)Occ, Scene.Cfg.SpecialBody, equipId);
}
if (IsChangeModel)
{
equipId = _changeModeID;
}
else if (FashionBodyID <= 0)
{
equipId = _visualInfo.GetLingTiBodyModelID(IntOcc);
}
break;
case FSkinPartCode.GodWeaponHead:
if (Scene != null && Scene.Cfg.SpecialWeaponHead.Length > 0)
{
equipId = DeclareDataUtils.GetValueWithPrefix((int)Occ, Scene.Cfg.SpecialWeaponHead, equipId);
}
break;
case FSkinPartCode.GodWeaponBody:
case FSkinPartCode.GodWeaponVfx:
equipId = 0;
break;
case FSkinPartCode.Wing:
if (Scene != null && Scene.Cfg.SpecialWing.Length > 0)
{
equipId = DeclareDataUtils.GetValueWithPrefix((int)Occ, Scene.Cfg.SpecialWing, equipId);
}
else if (!GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnableShowWing) && !IsLocalPlayer())
{
Skin.HideSkinPart(FSkinPartCode.Wing);
}
break;
case FSkinPartCode.XianjiaHuan:
break;
case FSkinPartCode.XianjiaZhen:
break;
}
return equipId;
}
//切换装备
public virtual void EquipWithType(int type, int equipId, bool bClearVfx = true)
{
equipId = CheckEquipID(type, equipId);
Skin.SetSkinPartFromCfgID(type, equipId, null, true, null, bClearVfx);
}
#endregion
#region//初始化处理
protected override bool OnSetupFSMBefore()
{
ResetDirection();
return base.OnSetupFSMBefore();
}
//初始化FSM状态
protected override bool OnSetupFSM()
{
Fsm = new EntityFSM(this);
Fsm.AddState(new PlayerFSM.Idle());
Fsm.AddState(new PlayerFSM.PathMove());
Fsm.AddState(new PlayerFSM.DirMove());
Fsm.AddState(new Dead());
Fsm.AddState(new Collect());
Fsm.AddState(new Jump());
Fsm.AddState(new BeHitBack());
Fsm.AddState(new BeHitFly());
Fsm.AddState(new BeHitGrab());
Fsm.AddState(new FlyUp());
Fsm.AddState(new FlyDown());
Fsm.AddState(new FlyTeleport());
Fsm.AddState(new RollDodge());
Fsm.AddState(new CrossMapTran());
Fsm.AddState(new PlayerFSM.SameRide());
Fsm.AddState(new TaskBarAround());
Fsm.AddState(new SkillMove());
Fsm.AddState(new PlayerFSM.SitDown());
Fsm.AddState(new PlayerFSM.EnterMap());
Fsm.AddState(new PlayerFSM.ChuanDaoSitDown());
Fsm.SetDefaultStateId(EntityStateID.Idle);
Fsm.Init(this);
return true;
}
protected override bool OnInitializeAfter(EntityInitInfo baseInfo)
{
MountAnimSpeed = 1f;
var initInfo = baseInfo as PlayerInitInfo;
_visualInfo = initInfo.VisualInfo;
_blinker = new HitBlinker();
return base.OnInitializeAfter(baseInfo);
}
protected override void OnUninitializeBefore()
{
//释放飞剑
UnLoadFlySword();
//释放仙娃
UnLoadMarryChild();
base.OnUninitializeBefore();
}
#endregion
#region//心跳处理 Update
protected override void OnUpdate(float elapsedTime)
{
_blinker.Update(elapsedTime);
UpdateBrightState(elapsedTime);
UpdateTarget();
if (Skin != null && (Skin.GetSkinPartCfgID(FSkinPartCode.XianjiaZhen) > 0 || Skin.GetSkinPartCfgID(FSkinPartCode.XianjiaHuan) > 0))
{
if (Skin.GetSkinPartCfgID(FSkinPartCode.Mount) > 0)
{
Skin.HideSkinPart(FSkinPartCode.XianjiaZhen);
Skin.HideSkinPart(FSkinPartCode.XianjiaHuan);
}
else
{
Skin.ShowSkinPart(FSkinPartCode.XianjiaZhen);
Skin.ShowSkinPart(FSkinPartCode.XianjiaHuan);
}
}
base.OnUpdate(elapsedTime);
}
#endregion
#region //重写Entity的方法
//更新实体的旋转角
protected override void OnUpdateRotation(float elapsedTime)
{
if (Skin == null || Skin.RootGameObject == null)
return;
Vector3 now = Skin.GetForward();
Vector3 prev = now;
prev.y = _frontYForward;
prev = prev.normalized;
if (IsOnMount && RotBySceneHeight)
{
float checkRadious = 2f;
var mountPart = Skin.GetSkinPart(FSkinPartCode.Mount);
if (mountPart != null)
{
var radious = mountPart.GetRadious();
if (radious > 0f)
{
checkRadious = radious;
}
}
Vector3 pos1 = Position + now * checkRadious;
pos1 = GetTerrainPosition(pos1.x, pos1.z);
Vector3 pos2 = Position - now * checkRadious;
pos2 = GetTerrainPosition(pos2.x, pos2.z);
if (!IsBlocked(pos1) && !IsBlocked(pos2))
{
now = (pos1 - pos2).normalized;
SetPosition(Vector3.Lerp(pos1, pos2, 0.5f));
Skin.SetForward(Vector3.Slerp(prev, now, 0.5f / checkRadious));
}
else if (now != prev || Skin.GetForward().y != 0)
{
Skin.SetForward(Vector3.Slerp(prev, now, 0.5f / checkRadious));
}
}
else
{
if (now != prev || now.y != 0)
{
now.y = 0f;
Skin.SetForward(now);
}
}
_frontYForward = Skin.GetForward().y;
}
public override void OnBeAttackedResponse(Character attacker, HitEffectInfo hitInfo, SkillHitType hitType, MSG_Fight.HitEffectInfo msgInfo)
{
if (!GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.TPSkillBlink))
{
var setValue = GameCenter.GameSetting.GetSetting(GameSettingKeyCode.HitBlink);
if (setValue == 2 || (setValue == 1 && attacker.IsLocalPlayer()))
{
//开始闪烁
_blinker.Start(hitInfo.BlinkTime, hitInfo.BlinkPower, hitInfo.BlinkColor, hitInfo.BlinkCurve, Skin);
}
}
if (attacker is Player && PropMoudle.CurLinLi > 0 && (Time.realtimeSinceStartup - _frontPlayLingLiTime) > 0.2f)
{
_frontPlayLingLiTime = Time.realtimeSinceStartup;
var dir = Scene.SceneCamera.transform.position - Position;
dir.y = 0;
var vfx = PlayVFX(ModelTypeCode.BodyVFX, 101, SlotUtils.GetSlotName(Slot.Origin), FSkinPartCode.Body, true, 1f, true, false, null, true);
if (vfx != null)
{
vfx.SetForward(dir);
}
}
base.OnBeAttackedResponse(attacker, hitInfo, hitType, msgInfo);
}
//播放闪烁效果
public void PlayBlinkEffect(float time, float power, Color color, AnimationCurve curve)
{
if (curve == null)
{
curve = new AnimationCurve();
curve.AddKey(0, 0);
curve.AddKey(1, 1);
}
_blinker.Start(time, power, color, curve, Skin);
}
#endregion
#region
public void ChangeBrightState(PlayerBrightWeaponState state)
{
if (_brightState == state)
{
return;
}
_brightState = state;
switch (_brightState)
{
case PlayerBrightWeaponState.Receive:
{
//直接切换挂接点
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null)
{
body.BrightWeapon = false;
if (IsShowModel)
{
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeapon, _receiveWeaponScale);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeapon, _receiveWeaponScale);
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeaponReceive, _receiveWeaponScale);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeaponReceive, _receiveWeaponScale);
}
}
}
break;
case PlayerBrightWeaponState.Receiveing:
{
//播放收剑剑动作
if (IsXState(EntityStateID.Idle))
{
//没有移动,播放普通收剑动作
PlayAnim(AnimClipNameDefine.SwordInIdle, AnimationPartType.AllBody, WrapMode.Once);
}
else
{
//正在移动,播放上半身动作
PlayAnim(AnimClipNameDefine.SwordInRun, AnimationPartType.UpBody, WrapMode.Once);
}
_brightStateTimer = _brightMaxTime;
//直接切换挂接点
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null)
{
if (IsShowModel)
{
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeapon, _brightWeaponScale);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeapon, _brightWeaponScale);
}
}
}
break;
case PlayerBrightWeaponState.Bright:
{
_brightStateTimer = _brightMaxTime;
//直接切换挂接点
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null)
{
body.BrightWeapon = true;
}
if (!this.skillManager.IsSkillUseing() && (IsXState(EntityStateID.Idle) || IsXState(EntityStateID.DirMove) || IsXState(EntityStateID.PathMove)))
{
//播放亮剑动作
if (IsXState(EntityStateID.Idle))
{
//没有移动,播放普通亮剑动作
PlayAnim(AnimClipNameDefine.SwordOutIdle, AnimationPartType.AllBody, WrapMode.Once);
}
else
{
//正在移动,播放上半身动作
PlayAnim(AnimClipNameDefine.SwordOutRun, AnimationPartType.UpBody, WrapMode.Once);
}
}
else
{
if (body != null && IsShowModel)
{
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeapon, _brightWeaponScale);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeapon, _brightWeaponScale);
}
}
}
break;
}
}
public void UpdateBrightState(float dt)
{
if (Skin == null || _skillManager == null)
{
return;
}
switch (_brightState)
{
case PlayerBrightWeaponState.Receive:
{
//容错处理
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null && body.BrightWeapon)
{
body.BrightWeapon = false;
}
if (FightState || _skillManager.IsSkillUseing())
{
//进入到战斗状态,直接切换到亮剑
ChangeBrightState(PlayerBrightWeaponState.Bright);
}
}
break;
case PlayerBrightWeaponState.Receiveing:
{
if (!(FightState || _skillManager.IsSkillUseing()))
{
if (!skillManager.IsSkillUseing())
{
_brightStateTimer -= dt;
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null)
{
if (IsShowModel)
{
var sacle = Vector3.Lerp(_receiveWeaponScale, _brightWeaponScale, _brightStateTimer / _brightMaxTime);
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeapon, sacle);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeapon, sacle);
}
}
if (_brightStateTimer <= 0f || !(IsXState(EntityStateID.Idle) || IsXState(EntityStateID.PathMove) || IsXState(EntityStateID.DirMove)))
{
//切换到收剑状态
ChangeBrightState(PlayerBrightWeaponState.Receive);
}
}
else
{
ChangeBrightState(PlayerBrightWeaponState.Bright);
}
}
else
{
//收剑过程中进入战斗状态,直接切换到亮剑状态
StopAnim();
ChangeBrightState(PlayerBrightWeaponState.Bright);
}
}
break;
case PlayerBrightWeaponState.Bright:
{
if (!(FightState || _skillManager.IsSkillUseing()))
{
if (IsXState(EntityStateID.Idle) || IsXState(EntityStateID.DirMove) || IsXState(EntityStateID.PathMove))
{
if (!skillManager.IsSkillUseing())
{
//没有使用技能,切换到收剑过程状态
ChangeBrightState(PlayerBrightWeaponState.Receiveing);
}
else
{
//正在使用技能,等待技能释放完成
}
}
else
{
//状态不允许播放动作,直接切换到收剑
ChangeBrightState(PlayerBrightWeaponState.Receive);
}
}
else
{
if (!_skillManager.IsSkillUseing() && _brightStateTimer > 0f)
{
_brightStateTimer -= dt;
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null && IsShowModel)
{
var sacle = Vector3.Lerp(_brightWeaponScale, _receiveWeaponScale, _brightStateTimer / _brightMaxTime);
//SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.LeftWeapon, sacle);
SlotUtils.SetSlotLocalScale(body.RealTransform, SlotNameDefine.RightWeapon, sacle);
}
}
else
{
//容错处理
var body = Skin.GetSkinPart(FSkinPartCode.Body) as FGameObjectBody;
if (body != null && !body.BrightWeapon)
{
body.BrightWeapon = true;
}
}
}
}
break;
}
}
public override void OnFightStateChangated(bool state)
{
base.OnFightStateChangated(state);
}
#endregion
#region//名字颜色
public void UpdateNameColor()
{
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATEHUDNAMECOLOR, ID);
var petList = GameCenter.GameSceneSystem.FindEntityAll<Pet>();
for (int i = 0; i < petList.Count; ++i)
{
if (petList[i].PropMoudle.MasterID == ID)
{
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATEHUDNAMECOLOR, petList[i].ID);
}
}
}
#endregion
#region//变身效果处理
//开始变身
public void StartChangeModel(DeclareChangeModel cfg)
{
if (_isChangeModel)
return;
if (cfg == null)
return;
_changeModelCfg = cfg;
_changeModeID = cfg.ModelId;
_changeCfgID = cfg.Id;
_isChangeModel = true;
Skin.ShowSkinPart(FSkinPartCode.Body, false);
EquipWithType(FSkinPartCode.Body, _changeModeID, false);
Skin.HideSkinPart(FSkinPartCode.Mount);
Skin.HideSkinPart(FSkinPartCode.GodWeaponHead);
Skin.HideSkinPart(FSkinPartCode.GodWeaponBody);
Skin.HideSkinPart(FSkinPartCode.GodWeaponVfx);
Skin.HideSkinPart(FSkinPartCode.Wing);
Skin.HideSkinPart(FSkinPartCode.XianjiaHuan);
Skin.HideSkinPart(FSkinPartCode.XianjiaZhen);
//变身时取消飞剑
UnLoadFlySword();
//变身时去掉仙娃
UnLoadMarryChild();
}
//结束 变身
public void StopChangeModel()
{
if (!_isChangeModel)
return;
_isChangeModel = false;
_changeModeID = 0;
_changeCfgID = 0;
_changeModelCfg = null;
Skin.ShowSkinPart(FSkinPartCode.Mount);
Skin.ShowSkinPart(FSkinPartCode.Body);
Skin.ShowSkinPart(FSkinPartCode.GodWeaponHead);
Skin.ShowSkinPart(FSkinPartCode.GodWeaponBody);
Skin.ShowSkinPart(FSkinPartCode.GodWeaponVfx);
Skin.ShowSkinPart(FSkinPartCode.Wing);
Skin.ShowSkinPart(FSkinPartCode.XianjiaHuan);
Skin.ShowSkinPart(FSkinPartCode.XianjiaZhen);
EquipWithType(FSkinPartCode.Body, VisualInfo.GetBodyModelID(IntOcc), false);
//重新载入飞剑
LoadFlySword();
//重新召唤仙娃
LoadMarryChild();
}
#endregion
#region//选择目标处理
//选择目标
protected virtual void OnSelectTarget(Entity target)
{
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_PLAYER_TARGET_CHANGED, target);
if (target != null)
target.Select();
}
//取消选择目标
protected virtual void OnDeselectTarget(Entity target)
{
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_PLAYER_TARGET_CHANGED, null);
if (target != null)
target.Deselect();
}
//获取当前目标
public Character GetCurSelectedTarget()
{
if (_curSelectedTargetId == 0 || Scene == null)
{
return null;
}
Character target = Scene.Find<Character>(_curSelectedTargetId);
return target;
}
//设置当前目标,
//当id==0是表示取消选择目标id!=0但是没有找到目标的情况下不做任何操作
public bool SetCurSelectedTargetId(UInt64 id, bool isAuto = true)
{
_curSelectTargetIsAuto = isAuto;
if (id == 0)
{
if (_curSelectedTargetId != 0 && Scene != null)
{
Character e = Scene.Find<Character>(_curSelectedTargetId);
_curSelectedTargetId = 0;
OnDeselectTarget(e);
}
_curSelectedTargetId = 0;
return true;
}
else
{
Character newTarget = Scene.Find<Character>(id);
//重复选择
if (id == _curSelectedTargetId || Scene == null)
{
return true;
}
if (newTarget != null && !newTarget.IsDead() && newTarget.CanBeSelect)
{
if (_curSelectedTargetId != 0)
{
Character oldTarget = Scene.Find<Character>(_curSelectedTargetId);
_curSelectedTargetId = 0;
OnDeselectTarget(oldTarget);
}
_curSelectedTargetId = id;
OnSelectTarget(newTarget);
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_PLAYER_TARGET_SELECT, newTarget);
return true;
}
}
return false;
}
public void UpdateTarget()
{
//如果当前有选择的目标ID但是查找不到目标对象丢失目标
if (_curSelectedTargetId > 0)
{
Character target = GetCurSelectedTarget();
if (target == null || target.IsDead() || !target.CanBeSelect)
{
SetCurSelectedTargetId(0);
}
}
}
#endregion
#region//飞剑处理
public void LoadFlySword(bool playShow = false)
{
if (!IsChangeModel && PropMoudle.FlySwordCfgID > 0 && PropMoudle.FlySwordUID != ID)
{
GameCenter.GameSceneSystem.RefreshFlySword(new FlySwordInitInfo(PropMoudle.FlySwordCfgID, PropMoudle.FlySwordUID, this, PropMoudle.FlySwordSkillId, playShow));
}
}
//释放法宝
public void UnLoadFlySword()
{
if (PropMoudle.FlySwordUID > 0 && PropMoudle.FlySwordUID != ID)
{
GameCenter.GameSceneSystem.RemoveRemoteEntity(PropMoudle.FlySwordUID);
}
}
#endregion
#region//仙娃处理
//载入仙娃
public void LoadMarryChild()
{
UnLoadMarryChild();
var cfg = DeclareMarryChild.Get(PropMoudle.MarryChildID);
if (cfg != null)
{
var initInfo = new MarryChildInitInfo(cfg, this, PropMoudle.MarryChildName);
_marryChildUID = initInfo.ID;
GameCenter.GameSceneSystem.RefreshMarryChild(initInfo);
}
}
//释放仙娃
public void UnLoadMarryChild()
{
if (_marryChildUID > 0)
{
GameCenter.GameSceneSystem.RemoveRemoteEntity(_marryChildUID);
_marryChildUID = 0;
}
}
#endregion
#region//婚姻处理
public void SetSpouseName(string name)
{
_spouseName = name;
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATE_HEADINFO, this);
}
#endregion
}
}