Files
Main/Assets/Code/Logic/_Required/Entity/Character/Player/Player.cs
2025-01-25 04:38:09 +08:00

1122 lines
38 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}