using vnxbqy.UI; using UnityEngine; public class GA_PlayerClient : GActorPlayerBase { private PlayerInfo m_PlayerInfo; private float m_LastUseSkillTime; private int nextConAtkIndex; public void Init(uint serverInstID, uint clientInstID, PlayerInfo info, E_ActorGroup group) { m_PlayerInfo = info; Init(serverInstID, clientInstID, group, null); } protected sealed override void OnInit(GameNetPackBasic package) { base.OnInit(package); if (m_PlayerInfo == null) { return; } // 初始化坐标 AdjustPos((ushort)(m_PlayerInfo.pos.x * 2), (ushort)(m_PlayerInfo.pos.z * 2)); ActorInfo.moveSpeed = 3; ActorInfo.atkSpeed = 1; JobSetup = JobSetupConfig.Get(m_PlayerInfo.job); CEquipInfo _itemInfo; if (m_PlayerInfo.itemDatas != null) { // 因为衣服是所有装备的父节点, 需要预先处理衣服 for (int i = 0; i < m_PlayerInfo.itemDatas.Length; ++i) { _itemInfo = m_PlayerInfo.itemDatas[i]; if (_itemInfo.place == (int)RoleEquipType.Clothes) { //m_SuitLevel = 0; //if (_itemInfo.isSuit == 1) //{ // m_SuitLevel = (byte)_itemInfo.suitLevel; //} SwitchClothes((uint)_itemInfo.id); //ChangeEquip(_itemInfo.place, (uint)_itemInfo.id, m_SuitLevel); break; } } } // 如果没有任何衣服, 则穿上默认装备 if (ClothesItemID == 0 || ClothesItemID == uint.MaxValue) { SwitchClothes(0); } if (m_PlayerInfo.itemDatas != null) { for (int i = 0; i < m_PlayerInfo.itemDatas.Length; ++i) { _itemInfo = m_PlayerInfo.itemDatas[i]; if (_itemInfo.place == (int)RoleEquipType.Weapon) { SwitchWeapon((uint)_itemInfo.id); } else if (_itemInfo.place == (int)RoleEquipType.Weapon2) { SwitchSecondary((uint)_itemInfo.id); } else if (_itemInfo.place == (int)RoleEquipType.Wing) { SwitchWing((uint)_itemInfo.id); } else if (_itemInfo.place == (int)RoleEquipType.Guard) { SwitchGuard((uint)_itemInfo.id); } else if (_itemInfo.place == (int)RoleEquipType.Mount) { ActorInfo.horseItemID = (uint)_itemInfo.id; } //m_SuitLevel = 0; //if (_itemInfo.isSuit == 1) //{ // m_SuitLevel = (byte)_itemInfo.suitLevel; //} //ChangeEquip(_itemInfo.place, (uint)_itemInfo.id, m_SuitLevel); } } if (WeaponItemID == 0 || WeaponItemID == uint.MaxValue) { SwitchWeapon(0); } ActorInfo.LV = m_PlayerInfo.level; ActorInfo.Job = m_PlayerInfo.job; ActorInfo.face = m_PlayerInfo.face; ActorInfo.facePic = m_PlayerInfo.facePic; ActorInfo.PlayerName = m_PlayerInfo.name; ActorInfo.Hp = m_PlayerInfo.hp; ActorInfo.MaxHp = m_PlayerInfo.maxHp; RequestName(); } public sealed override void Destroy() { } protected sealed override void OnUpdate() { base.OnUpdate(); UpdateAI(); } public sealed override void OnHorse(byte upOrDown) { } public sealed override void RefreshLifeBar(ulong value) { } public sealed override void RequestName() { ReleaseName(); if (MovingState == E_MovingState.Ride) { m_HeadUpName = HeadUpName.RequireHeadUpName(HeadUpName.Pattern.Player, MP_Name1, 0, CameraController.Instance.CameraObject); } else { m_HeadUpName = HeadUpName.RequireHeadUpName(HeadUpName.Pattern.Player, MP_Name, 0, CameraController.Instance.CameraObject); } m_HeadUpName.SetPlayerInfo(new HeadUpName.PlayerInfo() { realm = ActorInfo.realm, title = ActorInfo.titleID, name = ActorInfo.PlayerName, alliance = ActorInfo.familyName, }); RefreshShediaoEffect(ActorInfo.titleID); } protected sealed override void OnPutonClothes(uint clothesItemID, GameObject clothed) { clothed.layer = LayerUtility.Player; SkinnedMeshRenderer _renderer = clothed.GetComponentInChildren(); _renderer.gameObject.SetLayer(LayerUtility.Player, false); } protected sealed override void OnPutonSecondary(uint secondaryItemID, GameObject secondary) { Renderer _renderer = secondary.GetComponentInChildren(); if (_renderer) { _renderer.gameObject.SetLayer(LayerUtility.Player, false); } } protected sealed override void OnPutonWeapon(uint weaponItemID, GameObject weapon) { Renderer _renderer = weapon.GetComponentInChildren(); _renderer.gameObject.SetLayer(LayerUtility.Player, false); } protected sealed override void OnPutonWing(uint wingItemID, GameObject wing) { SkinnedMeshRenderer _renderer = wing.GetComponentInChildren(); _renderer.gameObject.SetLayer(LayerUtility.Player, false); } protected sealed override void OnSwitchHorse(uint horseID, GameObject horse) { } public sealed override bool CanAtked() { return false; } private void UpdateAI() { if (SelectTarget == null || SelectTarget.ActorInfo.serverDie) { SelectTarget = GAMgr.Instance.GetGroupCloestTarget(Pos, E_ActorGroup.Enemy); } if (SelectTarget == null || SelectTarget.ActorInfo.serverDie) { return; } // 攻击间隔中 if (Time.time - m_LastUseSkillTime < (1f / ActorInfo.atkSpeed) * .8f) { return; } Skill _skill = SkillMgr.CurCastSkill; // 判断主角当前是否有技能尚未释放完毕 if (_skill != null) { if (!_skill.SkillCompelete) { return; } if (SkillMgr.DoingPrepareSkill) { return; } } int _index = nextComAtkIndex; if (_index < 0 || _index > JobSetup.ComAtkIdList.Length - 1) { _index = 0; } int _comSkillID = GetCommonSkillID(_index); _skill = SkillMgr.Get(_comSkillID); if (_skill == null) { return; } // 判断技能范围, 不在可释放范围需要移动至目标 float _compareDist = _skill.skillInfo.config.AtkDist * .5f; float _compareDistSqrt = _compareDist * _compareDist; // 计算当前和目标的距离 float _currentDistSqrt = MathUtility.DistanceSqrtXZ(Pos, SelectTarget.Pos); // 比较距离 if (_currentDistSqrt >= _compareDistSqrt) { // 移动至目标 MoveToTarget(SelectTarget, _compareDist); return; } Vector3 _forward = MathUtility.ForwardXZ(SelectTarget.Pos, Pos); destForward = Forward = _forward; // 释放技能... // 目前只有单个目标 switch (_index) { case 0: Play(GAStaticDefine.State_Attack1Hash); break; case 1: Play(GAStaticDefine.State_Attack2Hash); break; case 2: Play(GAStaticDefine.State_Attack3Hash); break; case 3: Play(GAStaticDefine.State_Attack4Hash); break; } SkillMgr.CastSkill(ServerInstID, _skill.id); ulong hurtValue = 0; byte attackType = 0; AttackHandler.CalculateDamage(this, SelectTarget as GActorFight, _skill, 0, ref hurtValue, ref attackType); AttackHandler.HurtObjs _hurtObject = new AttackHandler.HurtObjs { AttackType = attackType, clientInstID = SelectTarget.ClientInstID, CurHP = SelectTarget.ActorInfo.Hp, HurtHP = hurtValue, RealHurtHP = hurtValue, ObjID = SelectTarget.ServerInstID, ObjType = (byte)SelectTarget.ActorType }; _skill.hurtClientList.Add(_hurtObject); m_LastUseSkillTime = Time.time; } public override void SyncSuitEffect(bool onOrOff = true) { } }