/******************************************************************** 文件名: \Main\Project\Client\Assets\MLDJ\Script\Obj\Obj_Character_Combat.cs 创建时间: 2014/05/27 13:16 全路径: \Main\Project\Client\Assets\MLDJ\Script\Obj 创建人: luoy 功能说明: 主角战斗相关 修改记录: *********************************************************************/ using Games.ImpactModle; using Games.SkillModle; using GCGame.Table; using Module.Log; namespace Games.LogicObj { // 战斗逻辑类型 public partial class Obj_MainPlayer { //PK 模式 重载 Obj_OtherPlayer 的属性 public override int PkModle { get { return GameManager.gameManager.PlayerDataPool.PkModle; } set { GameManager.gameManager.PlayerDataPool.PkModle = value; } } //隐身级别 重载 Obj 的属性 public override int StealthLev { get { return GameManager.gameManager.PlayerDataPool.StealthLev; } set { GameManager.gameManager.PlayerDataPool.StealthLev = value; } } //是否可以进行合法反击 public bool IsCanPKLegal { get { return GameManager.gameManager.PlayerDataPool.IsCanPKLegal; } set { GameManager.gameManager.PlayerDataPool.IsCanPKLegal = value; } } //主角身上的技能信息 public OwnSkillData[] OwnSkillInfo { get { return GameManager.gameManager.PlayerDataPool.OwnSkillInfo; } } public bool IsHaveSkill(int nSkillId) { if (nSkillId == -1) return false; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].SkillId == nSkillId) return true; return false; } public bool IsHaveSkill(int nSkillId, ref int nSkillIndex) { nSkillIndex = -1; if (nSkillId == -1) return false; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].SkillId == nSkillId) { nSkillIndex = i; return true; } return false; } public bool IsStudySkill(int nSkillBaseId) { for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].IsValid()) { var _SkillEx = OwnSkillInfo[i].SkillExTable; if (_SkillEx != null && _SkillEx.BaseId == nSkillBaseId) return true; } return false; } public bool IsStudySkill(int nSkillBaseId, ref int nSkillInex) { nSkillInex = -1; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].IsValid()) { var _SkillEx = OwnSkillInfo[i].SkillExTable; if (_SkillEx != null && _SkillEx.BaseId == nSkillBaseId) { nSkillInex = i; return true; } } return false; } public int HaveSkillNum() { var num = 0; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].IsValid()) num++; return num; } public int NeedSkillBarNum() //需要开放的技能栏数 { var num = 0; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].SkillId != -1) { var _skillBase = OwnSkillInfo[i].SkillBaseTable; //不是普攻 不是XP 不是被动技能 if (_skillBase != null) if ((_skillBase.SkillClass & (int)SKILLCLASS.AUTOREPEAT) == 0 && (_skillBase.SkillClass & (int)SKILLCLASS.XP) == 0 && (_skillBase.SkillClass & (int)SKILLCLASS.PASSIVITY) == 0) num++; } return num; } //更新技能CD //private void UpdateSkillCDTime() //{ // //更新冷却时间 // if (SkillPublicTime > 0) //技能公共CD // { // SkillPublicTime -= (int) (Time.deltaTime * 1000); // if (SkillPublicTime < 0) // SkillPublicTime = 0; // } // for (var i = 0; i < OwnSkillInfo.Length; i++) // if (OwnSkillInfo[i].CDTime > 0) // { // OwnSkillInfo[i].CDTime -= (int) (Time.deltaTime * 1000); // if (OwnSkillInfo[i].CDTime < 0) // OwnSkillInfo[i].CDTime = 0; // } //} public void StudySkillOpt(int nSkillId, int nSkillIndex) { if (nSkillId == -1) return; if (nSkillIndex >= 0 && nSkillIndex < OwnSkillInfo.Length) { var SkillExinfo = TableManager.GetSkillExByID(nSkillId, 0); if (SkillExinfo == null) { LogModule.DebugLog("SkillExinfo is Null: " + nSkillId); return; } var SkillBase = TableManager.GetSkillBaseByID(SkillExinfo.BaseId, 0); if (SkillBase == null) { LogModule.DebugLog("SkillBase is Null: " + nSkillId); return; } var oldSkillId = OwnSkillInfo[nSkillIndex].SkillId; //设置图标 OwnSkillInfo[nSkillIndex].SetSkillId(nSkillId, 0); //设置冷却时间 OwnSkillInfo[nSkillIndex].SetCooldown(0f); //不是普攻和XP技 被动技 设置技能栏位置 if ((SkillBase.SkillClass & (int)SKILLCLASS.AUTOREPEAT) == 0 && (SkillBase.SkillClass & (int)SKILLCLASS.XP) == 0 && (SkillBase.SkillClass & (int)SKILLCLASS.PASSIVITY) == 0) { var index = -1; if (oldSkillId == -1) { UserConfigData.LoadAllSkillPage(GUID.ToString()); if (UserConfigData._CurSkillPage != null) { for (var i = 0; i < UserConfigData._CurSkillPage.SkillIdxs.Length; i++) if (UserConfigData._CurSkillPage.SkillIdxs[i] == -1) { UserConfigData._CurSkillPage.SkillIdxs[i] = nSkillIndex; index = i; break; } UserConfigData.SaveSkillPages(); } } if (SkillBarLogic.Instance() != null) { if (index != -1) SkillBarLogic.Instance().SkillButtons[index].SetSkillBarInfo(nSkillIndex); else for (var _skillBarIndex = 0; _skillBarIndex < SkillBarLogic.Instance().SkillButtons.Length; _skillBarIndex++) { if (_skillBarIndex == 4 || _skillBarIndex == 5) continue; //找到空位了 if (SkillBarLogic.Instance().SkillButtons[_skillBarIndex].SkillIndex < 0) { SkillBarLogic.Instance().SkillButtons[_skillBarIndex] .SetSkillBarInfo(nSkillIndex); index = _skillBarIndex; GlobalEffectMgr.PlayerNormalEffect("TX_jinengkaiqi", SkillBarLogic.Instance().SkillButtons[_skillBarIndex].transform.position); break; } } if (index == 3) GameManager.gameManager.PlayerDataPool.ForthSkillFlag = true; } } } } private Obj_Character ValidClientTarget(int priorityTarget) { Obj_Character result = null; if (targetFriend) { result = friendlyTarget; if (result != null && !ValidTargetTypeBySkillBase(result, priorityTarget)) result = null; } // 若FriendlyTarget检测失败,回落到enemey if (result == null) { result = enemyTarget; if (result != null && !ValidTargetTypeBySkillBase(result, priorityTarget)) result = null; } if (result != null && result.isInvisible) result = null; return result; } public Obj_Character InitAttackTarget(Tab_SkillEx skillEx, int overrideTargetType = -1) { Obj_Character result = null; if (!IsDisableState(DISABLESTATE.Disable_Select)) { var skillBase = TableManager.GetSkillBaseByID(skillEx.BaseId, 0); if (skillBase != null) { result = ValidClientTarget(skillBase.PriorityTarget); if (result == null) //|| !ValidSkillRangeOnTarget(skillEx, skillBase, result, true)) { var targetType = overrideTargetType < 0 ? skillBase.PriorityTarget : overrideTargetType; // 优先选择自己 if (ValidTargetTypeBySkillBase(this, targetType)) result = this; else { var targets = Singleton.GetInstance().ObjPools; var distanceSqr = 0f; var lastThreat = 0; foreach (var keyValue in targets) { var obj = keyValue.Value as Obj_Character; if (obj != null && !obj.isInvisible && obj.ObjType != GlobeDefine.GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER && ValidTargetTypeBySkillBase(obj, targetType) && ValidSkillRangeOnTarget(skillEx, skillBase, obj, true)) { var valid = false; var threat = Controller.ThreadInfo.GetThreatValue(obj); if (result == null) valid = true; else { if (threat > lastThreat) valid = true; else if (threat == lastThreat) { if (result.ObjType < obj.ObjType || (Position - obj.Position).RemoveY().sqrMagnitude < distanceSqr) valid = true; } } if (valid) { result = obj; lastThreat = threat; distanceSqr = (Position - obj.Position).RemoveY().sqrMagnitude; } } } } } } } return result; } protected SkillCastableCheckResult CheckForUseSkillNeed(SKILLDELANDGAINTYPE nType, int nNeedValue) { var result = SkillCastableCheckResult.Success; switch (nType) { case SKILLDELANDGAINTYPE.HPTYPE_VALUE: //HP的数值 if (BaseAttr.HP - nNeedValue <= 0) result = SkillCastableCheckResult.FailCostHp; break; case SKILLDELANDGAINTYPE.HPTYPE_RATE: //HP的百分比 if (BaseAttr.HP - BaseAttr.MaxHP * nNeedValue / 100.0f <= 0) result = SkillCastableCheckResult.FailCostHpRate; break; case SKILLDELANDGAINTYPE.MPTYPE_VALUE: //MP数值 if (BaseAttr.MP - nNeedValue < 0) result = SkillCastableCheckResult.FailCostMp; break; case SKILLDELANDGAINTYPE.MPTYPE_RATE: //MP百分比 if (BaseAttr.MP - BaseAttr.MaxMP * nNeedValue / 100.0f < 0) result = SkillCastableCheckResult.FailCostMpRate; break; case SKILLDELANDGAINTYPE.XPTYPE_VALUE: //XP数值 if (BaseAttr.XP - nNeedValue < 0) result = SkillCastableCheckResult.FailCostXp; break; case SKILLDELANDGAINTYPE.XPTYPE_RATE: //XP百分比 if (BaseAttr.XP - BaseAttr.MaxXP * nNeedValue / 100.0f < 0) result = SkillCastableCheckResult.FailCostXpRate; break; } return result; } public int GetTotalStudySkillCombatValue() //获取所有已学会技能的战斗力总值 { var nTotalValue = 0; for (var i = 0; i < OwnSkillInfo.Length; i++) if (OwnSkillInfo[i].IsValid()) { var _skillEx = OwnSkillInfo[i].SkillExTable; if (_skillEx != null) nTotalValue += _skillEx.CombatValue; } return nTotalValue; } private UnityEngine.Events.UnityAction OkCallBack = null; public void AskLeaveCopy(UnityEngine.Events.UnityAction callBack = null) { string strDic = StrDictionary.GetClientDictionaryString("#{2345}"); Tab_Fuben fuben = TableManager.GetFubenByID(GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterCopySceneID, 0); if (fuben != null) { if(fuben.PositiveLeave > 1) { Tab_StrDictionary pDictionary = TableManager.GetStrDictionaryByID(fuben.PositiveLeave, 0); if (pDictionary != null) { strDic = pDictionary.StrDictionary; } } OkCallBack = callBack; MessageBoxLogic.OpenOKCancelBox(strDic, "", LeaveOK); return; } if (callBack != null) callBack.Invoke(); } private bool LeaveToScene(int sceneID) { Tab_SceneClass tabSceneClass = TableManager.GetSceneClassByID(sceneID, 0); if (null == tabSceneClass) { return false; } // 传送时,停止主角移动并停止自动寻路 StopMove(); GameManager.gameManager.AutoSearch.Stop(); SceneData.RequestChangeScene((int)CG_REQ_CHANGE_SCENE.CHANGETYPE.WORLDMAP, 0, sceneID, -1, (int)tabSceneClass.SafeX, (int)tabSceneClass.SafeZ); return true; } private void LeaveOK() { Tab_Fuben fuben = TableManager.GetFubenByID(GameManager.gameManager.PlayerDataPool.EnterSceneCache.EnterCopySceneID, 0); if (fuben == null) { return; } LeveAutoCombat(); if (fuben.ExitSceneType != -1 && LeaveToScene(fuben.ExitSceneType)) return; CG_LEAVE_COPYSCENE send = (CG_LEAVE_COPYSCENE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_LEAVE_COPYSCENE); send.NoParam = 1; send.SendPacket(); if(OkCallBack!=null) { OkCallBack.Invoke(); } OkCallBack = null; } #region Switch Target 以及其他功能重复的代码 //public bool InCombat { get; set; } //客户端 要用到BUFF信息 //private List m_ClientImpactInfo = new List(); // public List ClientImpactInfo // { // get { return GameManager.gameManager.PlayerDataPool.ClientImpactInfo; } // set { GameManager.gameManager.PlayerDataPool.ClientImpactInfo = value; } // } //public static bool m_IsChangePosition = true; //public static float m_ChangeListDistacne = 4.0f; //移动距离超过4.0f 那么就要重置已经保存的List //public bool ActiveSkill(int nSkillId, int targetId) //{ // if (SkillCore == null) // return false; // var SkillExinfo = TableManager.GetSkillExByID(nSkillId, 0); // if (SkillExinfo == null) // { // LogModule.DebugLog("SkillExinfo is Null: " + nSkillId); // return false; // } // var BaseSkillId = SkillExinfo.BaseId; // var SkillBaseinfo = TableManager.GetSkillBaseByID(BaseSkillId, 0); // if (SkillBaseinfo == null) // { // LogModule.DebugLog("SkillBaseInfo is Null" + BaseSkillId); // return false; // } // if (m_oneDragonControl != null) // m_oneDragonControl.NeedCheckOneDragonEnterCopy = false; // if (UseSkillCheck(ref targetId, SkillExinfo, SkillBaseinfo)) // { // //发送技能使用包 // var usekill = (CG_SKILL_USE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_SKILL_USE); // usekill.SetSkillId(nSkillId); // float dirRadian; // if (GameManager.gameManager.ActiveScene.SkillAttackPoint == Vector2.zero) // { // usekill.SetDesposx(0); // usekill.SetDespoxz(0); // var target = Singleton.Instance.FindObjCharacterInScene(targetId); // if (target != null) // { // var attackDir = target.Position - Position; // dirRadian = Mathf.Atan2(attackDir.z, attackDir.x); // } // else // dirRadian = Mathf.Atan2(ObjTransform.forward.z, ObjTransform.forward.x); // } // else // { // usekill.SetDesposx((int)(GameManager.gameManager.ActiveScene.SkillAttackPoint.x * 100)); // usekill.SetDespoxz((int)(GameManager.gameManager.ActiveScene.SkillAttackPoint.y * 100)); // var x = GameManager.gameManager.ActiveScene.SkillAttackPoint.x - Position.x; // var z = GameManager.gameManager.ActiveScene.SkillAttackPoint.y - Position.z; // dirRadian = Mathf.Atan2(z, x); // targetId = -1; // } // if (dirRadian < 0) // dirRadian += 2 * Mathf.PI; // usekill.SetFacedir(Mathf.FloorToInt(dirRadian * 100f)); // if (targetId <= 0) // targetId = 0; // usekill.SetTargetId(targetId); // usekill.SetRoleposx((int)(Position.x * 100)); // usekill.SetRolepoxz((int)(Position.z * 100)); // usekill.SendPacket(); // return true; // } // return false; //} //private void SelectAttackTarget(int attackTargetID) //{ // var attackObj = Singleton.Instance.FindObjCharacterInScene(attackTargetID); // if (attackObj != null && attackObj.IsDie() == false) // SetSelectTarget(attackObj.gameObject, false, 1); //} //// 整个函数就是把-pi到 pi转到 0到 2pi,直接小于0就加pi就完了…… ////private float NormaliseDir(float cross) ////{ //// cross += Mathf.PI * 2; //// if (cross >= Mathf.PI * 2) //// { //// cross -= (int) (cross / (2 * Mathf.PI)) * 2 * Mathf.PI; //// cross = Mathf.Max(cross, 0); //// cross = Mathf.Min(cross, Mathf.PI * 2); //// return cross; //// } //// if (cross < 0) //// { //// cross += ((int) (-1 * cross / (2 * Mathf.PI)) + 1) * 2 * Mathf.PI; //// cross = Mathf.Max(cross, 0); //// cross = Mathf.Min(cross, Mathf.PI * 2); //// return cross; //// } //// return cross; ////} //public bool IsHaveStealthBuff() //是否拥有隐身BUFF //{ // for (var i = 0; i < ClientImpactInfos.Count; i++) // if (ClientImpactInfos[i].ImpactLogicId == 17) // return true; // return false; //} //private bool CheckSkillAllow(Tab_SkillBase skillBase) //{ // return skillBase.SkillClass.ContainFlag((int)SKILLCLASS.SIMPLEATTACK) // ? SkillAllowSimpleAttack // : SkillAllowSkill; //} ////CD检测 消耗检测(血 蓝) ////目标是否可以攻击(距离判断) //// //public bool UseSkillCheck(ref int targetId, Tab_SkillEx SkillExinfo, Tab_SkillBase SkillBaseinfo) //{ // var Target = Singleton.GetInstance().FindObjCharacterInScene(targetId); // if (IsDie()) // return false; // //轻功状态无法使用技能 // if (IsLightState) // { // SendNoticMsg(true, "#{4583}"); // return false; // } // //正在使用技能 且技能无法被打断 则无法使用 // if (!CheckSkillAllow(SkillBaseinfo)) // return false; // //CD 时间 // //检测目标合法性 群攻可以无目标释放 // if (SkillBaseinfo.SelLogic == (int)SKILLSELLOGIC.SELLOGIC_SINGLE || // (SkillBaseinfo.SkillClass & (int)SKILLCLASS.AUTOREPEAT) != 0) // { // if (Target == null) // targetId = -1; // else if (Target.IsDie()) // if ((SkillBaseinfo.TargetType & (int)CharacterDefine.TARGETTYPE.DIE) == 0) // targetId = -1; // } // //CD 时间检测 增加公共CD判断 // var nSkillIndex = GetSkillIndexById(SkillExinfo.SkillExID); // if (nSkillIndex >= 0 && nSkillIndex < OwnSkillInfo.Length) // if (OwnSkillInfo[nSkillIndex].CDTime > 0 || SkillPublicTime > 0) // return false; // //检测消耗类型 // var nNeedType_1 = (SKILLDELANDGAINTYPE)SkillExinfo.GetDelTypebyIndex(0); // var nNeedValue1 = SkillExinfo.GetDelNumbyIndex(0); // if (CheckForUseSkillNeed(nNeedType_1, nNeedValue1) == false) // return false; // var nNeedType_2 = (SKILLDELANDGAINTYPE)SkillExinfo.GetDelTypebyIndex(1); // var nNeedValue2 = SkillExinfo.GetDelNumbyIndex(1); // if (CheckForUseSkillNeed(nNeedType_2, nNeedValue2) == false) // return false; // return true; //} ////初始化主角身上的技能信息 //public void InitSkillInfo() //{ // UpdateSkillInfo(); //} //private bool CheckBeforUseSkill(int nSkillId) //{ // if (SkillCore == null) // return false; // if (IsDie()) // return false; // //轻功中不能使用技能 // if (CurObjAnimState == GameDefine_Globe.OBJ_ANIMSTATE.STATE_JUMP) // return false; // if (IsInModelStory) // return false; // if (IsDisableState(DISABLESTATE.Disable_UseSkill)) // { // SendNoticMsg(false, "#{1249}"); // return false; // } // var nSkillIndex = GetSkillIndexById(nSkillId); // if (nSkillIndex >= 0 && nSkillIndex < OwnSkillInfo.Length) // if (OwnSkillInfo[nSkillIndex].CDTime > 0 || SkillPublicTime > 0) // { // //技能正在冷却中 请稍后使用 // SendNoticMsg(false, "#{1245}"); // return false; // } // var _skillEx = TableManager.GetSkillExByID(nSkillId, 0); // if (_skillEx == null) // return false; // var _skillBase = TableManager.GetSkillBaseByID(_skillEx.BaseId, 0); // if (_skillBase == null) // return false; // //正在使用技能 且技能无法被打断 则无法使用 // if (!CheckSkillAllow(_skillBase)) // return false; // //检测消耗类型 // var nNeedType_1 = (SKILLDELANDGAINTYPE)_skillEx.GetDelTypebyIndex(0); // var nNeedValue1 = _skillEx.GetDelNumbyIndex(0); // if (CheckForUseSkillNeed(nNeedType_1, nNeedValue1) == false) // return false; // var nNeedType_2 = (SKILLDELANDGAINTYPE)_skillEx.GetDelTypebyIndex(1); // var nNeedValue2 = _skillEx.GetDelNumbyIndex(1); // if (CheckForUseSkillNeed(nNeedType_2, nNeedValue2) == false) // return false; // return true; //} //public bool IsSkillNeedSelectTar(Tab_SkillBase _skillBase, Tab_SkillEx _skillEx) //{ // if (_skillBase == null || _skillEx == null) // return false; // //目标类型为自己 则不选择目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.SELF) != 0) // return false; // if ((_skillBase.SkillClass & (int)SKILLCLASS.SIMPLEATTACK) != 0) // return true; // //表里配置不选择目标的非单攻技能 则不选择目标 // if (_skillBase.SelLogic != (int)SKILLSELLOGIC.SELLOGIC_SINGLE && // _skillBase.IsAutoSelectTar != 1) // return false; // return true; //} //public bool BeforeUseCheck(int skillID) //{ // if (CheckBeforUseSkill(skillID) == false) // return false; // var _skillEx = TableManager.GetSkillExByID(skillID, 0); // if (_skillEx == null) // return false; // var _skillBase = TableManager.GetSkillBaseByID(_skillEx.BaseId, 0); // if (_skillBase == null) // return false; // if (_skillBase.SelLogic == (int)SKILLSELLOGIC.SELLOGIC_SINGLE) // if (IsDisableState(DISABLESTATE.Disable_Select)) // { // SendNoticMsg(false, "#{1250}"); // return false; // } // return true; //} ////释放技能接口 //public bool UseSkillOpt(int nSkillId, Obj_Character attackTarget, bool isAutoCombat = false /* 是否是自动挂机使用的技能*/) //{ // if (CheckBeforUseSkill(nSkillId) == false) // return false; // Obj_Character TargetObjChar = null; // if (SelectTarget != null && SelectTarget.ServerID != ServerID && SelectTarget.IsDie() == false) // TargetObjChar = SelectTarget; // if (attackTarget != null && attackTarget.ServerID != ServerID && attackTarget.IsDie() == false) // TargetObjChar = attackTarget; // if (TargetObjChar != null && !TargetObjChar.gameObject.activeSelf) // TargetObjChar = null; // var _skillEx = TableManager.GetSkillExByID(nSkillId, 0); // if (_skillEx == null) // return false; // var _skillBase = TableManager.GetSkillBaseByID(_skillEx.BaseId, 0); // if (_skillBase == null) // return false; // //需要重新选择目标 // if (TargetObjChar == null || TargetObjChar.IsDie()) // if (IsSkillNeedSelectTar(_skillBase, _skillEx)) // TargetObjChar = SelectSkillTarget(nSkillId); // CurUseSkillId = nSkillId; // // 注:OnEnterCombat实际是对目标使用技能 // var result = OnEnterCombat(TargetObjChar); // if (IsOpenAutoCombat && result && isAutoCombat == false) // BreakAutoCombatState(); // return result; //} //public int SeleSkill(int lastUserSkill = -1, float skillRadiu = 0) //{ // if (simpleAttackSkills.Count == 0) // return -1; // var canSeleSkill = new OwnSkillData[(int)SKILLDEFINE.MAX_SKILLNUM]; // //默认使用普攻 // var UseSkillId = simpleAttackSkills[0].SkillExID; // var nLastSkillIndex = -1; // for (var i = 0; i < OwnSkillInfo.Length; i++) // if (OwnSkillInfo[i].SkillId == lastUserSkill) // { // nLastSkillIndex = i; // break; // } // var validSelIndex = 0; // //筛选出可以用的技能 // for (var skillIndex = 0; skillIndex < OwnSkillInfo.Length; skillIndex++) // { // var skillId = OwnSkillInfo[skillIndex].SkillId; // if (skillId != lastUserSkill && skillId != -1) // { // //XP 检验 能量 // var _skillEx = TableManager.GetSkillExByID(skillId, 0); // if (_skillEx != null) // { // if (_skillEx.Radius < skillRadiu) // continue; // var _skillBase = TableManager.GetSkillBaseByID(_skillEx.BaseId, 0); // if (_skillBase != null) // { // if ((_skillBase.SkillClass & (int)SKILLCLASS.SIMPLEATTACK) != 0) // continue; // if (OwnSkillInfo[skillIndex].CDTime <= 0 && // OwnSkillInfo[skillIndex].PriorityAutoCombat > 0 && // IsAutoSelSkillID(skillIndex) == 1) // { // canSeleSkill[validSelIndex] = new OwnSkillData(); // canSeleSkill[validSelIndex].CDTime = OwnSkillInfo[skillIndex].CDTime; // canSeleSkill[validSelIndex].SkillId = OwnSkillInfo[skillIndex].SkillId; // canSeleSkill[validSelIndex].ExSkillLevel = OwnSkillInfo[skillIndex].ExSkillLevel; // canSeleSkill[validSelIndex].PriorityAutoCombat = // OwnSkillInfo[skillIndex].PriorityAutoCombat; // validSelIndex++; // } // } // } // } // //从可选技能中挑出优先级最高的那个 // var nMaxPriority = -1; // for (var nIndex = 0; nIndex < canSeleSkill.Length; nIndex++) // if (canSeleSkill[nIndex] != null && canSeleSkill[nIndex].IsValid()) // if (canSeleSkill[nIndex].PriorityAutoCombat > nMaxPriority) // { // nMaxPriority = canSeleSkill[nIndex].PriorityAutoCombat; // UseSkillId = canSeleSkill[nIndex].SkillId; // } // } // var _skillEx1 = TableManager.GetSkillExByID(UseSkillId, 0); // if (_skillEx1 == null) // UseSkillId = -1; // else if (_skillEx1.Radius < skillRadiu) // UseSkillId = -1; // return UseSkillId; //} ////对List中存储的OBJ进行距离的排序 //public int HitPoint { get; set; } //public int m_BossTargetIndex; //要返回的BOSS的下标 //public int m_CharacterTargetIndex; //要返回的敌对玩家的下标 //public List m_BossTargetList = new List(); //bossList //public List m_CharacterTargetList = new List(); //敌对玩家List //public List m_MonsterTargetList = new List(); //怪物List //private float m_fLastHitPointTime; //上次连击点 更新时间 ////切换当前怪物 //public int m_MonsterTargetObjIndex; //每次返回的怪物下标 //public void UpdateSkillInfo() //{ // for (var nIndex = 0; nIndex < OwnSkillInfo.Length; nIndex++) // //挂机时技能使用优先级 // if (OwnSkillInfo[nIndex].SkillId != -1) // { // var SkillBase = OwnSkillInfo[nIndex].SkillBaseTable; // if (SkillBase != null) // OwnSkillInfo[nIndex].PriorityAutoCombat = SkillBase.PriorityAutoFight; // } // SetSimpleAttackId(); //} //private Obj_Character SwitchMonsterTarget() //{ // //策划要求改为半径为8M的距离内 // var CircleRadius = 8.0f; // //记录当前选择目标的ServerID // var curSelecTargetServerID = GlobeVar.INVALID_ID; // if (null != SelectTarget) // curSelecTargetServerID = SelectTarget.ServerID; // var targets = Singleton.GetInstance().ObjPools; // var m_TargetsList = new List(); //在范围内的敌人 // foreach (var targetObj in targets.Values) // { // if (null == targetObj) // continue; // if (targetObj.ObjType != GameDefine_Globe.OBJ_TYPE.OBJ_NPC) // continue; // //自己排除在外 // if (targetObj.ServerID == ServerID) // continue; // //已经选择的目标是不会被切换的 // if (curSelecTargetServerID != GlobeVar.INVALID_ID && targetObj.ServerID == curSelecTargetServerID) // continue; // var targeObjChar = targetObj.gameObject.GetComponent(); // if (targeObjChar == null || targeObjChar.IsDie()) // continue; // var nType = Reputation.GetObjReputionType(targeObjChar); // if (nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE && // nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_NEUTRAL) // continue; // ////分别取得前方和后方的最近Obj // var distance = Vector3.Distance(Position, targeObjChar.Position); // //前后距离范围内的目标全部添加进去 // if (distance <= CircleRadius) // m_TargetsList.Add(targeObjChar); // } // //对存起来的所有OBJ进行分类并按照距离远近排序(附加条件为移动了一定距离才会Sort) // if (m_IsChangePosition) // { // SortList(m_TargetsList); // m_IsChangePosition = !m_IsChangePosition; // } // if (m_BossTargetList.Count != 0 && m_BossTargetIndex < m_BossTargetList.Count) // return m_BossTargetList[m_BossTargetIndex++]; // if (m_MonsterTargetList.Count != 0 && m_MonsterTargetObjIndex < m_MonsterTargetList.Count) // return m_MonsterTargetList[m_MonsterTargetObjIndex++]; // m_MonsterTargetObjIndex = 0; // m_BossTargetIndex = 0; // if (m_BossTargetList.Count != 0 && m_BossTargetIndex < m_BossTargetList.Count) // return m_BossTargetList[m_BossTargetIndex++]; // if (m_MonsterTargetList.Count != 0) // return m_MonsterTargetList[m_MonsterTargetObjIndex++]; // return null; //} ////切换当前玩家目标 //private Obj_Character SwitchPlayerTarget() //{ // //切换距离根据策划要求改为8M内 // var frontMinDistance = 8.0f; // var backMinDistance = 8.0f; //距离都为8.0f 前后无意义 // //记录当前选择目标的ServerID // var curSelecTargetServerID = GlobeVar.INVALID_ID; // if (null != SelectTarget) // curSelecTargetServerID = SelectTarget.ServerID; // var targets = Singleton.GetInstance().ObjPools; // var m_TargetsList = new List(); //在范围内的敌人 // foreach (var targetObj in targets.Values) // { // if (null == targetObj) // continue; // if (targetObj.ObjType != GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER) // continue; // //自己排除在外 // if (targetObj.ServerID == ServerID) // continue; // //已经选择的目标是不会被切换的 // if (curSelecTargetServerID != GlobeVar.INVALID_ID && targetObj.ServerID == curSelecTargetServerID) // continue; // var targetOtherPlayer = targetObj as Obj_OtherPlayer; // if (targetOtherPlayer == null || targetOtherPlayer.IsDie()) // continue; // var nType = Reputation.GetObjReputionType(targetOtherPlayer); // if (nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE) // continue; // var distance = Vector3.Distance(Position, targetOtherPlayer.Position); // if (distance < frontMinDistance || distance < backMinDistance) // m_TargetsList.Add(targetOtherPlayer); // } // //如果任务距离波动超过一定范围 重置保存敌对玩家怪物的List // if (m_IsChangePosition) // { // SortList(m_TargetsList); // m_IsChangePosition = !m_IsChangePosition; // } // if (m_CharacterTargetList != null && m_CharacterTargetIndex < m_CharacterTargetList.Count) // return m_CharacterTargetList[m_CharacterTargetIndex++]; // if (m_BossTargetList != null && m_BossTargetIndex < m_BossTargetList.Count) // return m_BossTargetList[m_BossTargetIndex++]; // if (m_MonsterTargetList != null && m_MonsterTargetObjIndex < m_MonsterTargetList.Count) // return m_MonsterTargetList[m_MonsterTargetObjIndex++]; // m_CharacterTargetIndex = 0; // m_MonsterTargetObjIndex = 0; // m_BossTargetIndex = 0; // if (m_CharacterTargetList.Count != 0) // return m_CharacterTargetList[m_CharacterTargetIndex++]; // if (m_BossTargetList.Count != 0) // return m_BossTargetList[m_BossTargetIndex++]; // if (m_MonsterTargetList.Count != 0) // return m_MonsterTargetList[m_MonsterTargetObjIndex++]; // return null; //} //public void SwitchTarget() //{ // //判断是否切换到宠物目标 // var m_SwitchTime = 0; // Obj_Character obj = null; // //PK模式下,先选择敌对列表中的敌人,然后选择敌对玩家,最后是怪物 // //处于反击状态时,选择目标规则与进入杀戮模式相同 // if (PkModle == (int)CharacterDefine.PKMODLE.KILL || // IsCanPKLegal || // BaseAttr.Force == (int)GameDefine_Globe.FORCETYPE.PVP1 || //PVP 势力 // BaseAttr.Force == (int)GameDefine_Globe.FORCETYPE.PVP2 //PVP 势力 // ) // { // obj = SwitchPlayerTarget(); // //第二次切换(第一次攻击目标为玩家 但是再次点击切换 那么切换攻击目标为玩家的宠物) // if (m_SwitchTime >= 2 && obj != null && PlayerPreferenceData.SystemSwitchTargetToPet) // { // m_SwitchTime = 0; // //切换攻击目标至目标宠物 // obj = obj.GetComponent().GetCurFellow(); // //如果目标没有召唤宠物 那就切换攻击目标为别的玩家 // if (obj == null) // obj = SwitchPlayerTarget(); // } // if (null == obj) // { // //没有宠物的时候 由玩家直接切换向怪物 这个时候对宠物的判断要重置 // obj = SwitchMonsterTarget(); // } // } // else // { // //非PK模式下,先选择敌对列表中的敌人 // obj = SwitchMonsterTarget(); // } // //未选中则选择怪物 // if (null != obj) // { // SelectTarget = null; // SetSelectTarget(obj); // } //} //public void ClearMyTargetList() //{ // m_CharacterTargetList.Clear(); // m_BossTargetList.Clear(); // m_MonsterTargetList.Clear(); //} //private void SortList(List m_TargetList) //{ // //再次进入的时候需要清空List // ClearMyTargetList(); // Tab_RoleBaseAttr m_Attar = null; // foreach (var target in m_TargetList) // { // var npc = target as Obj_NPC; // if (npc == null) // continue; // m_Attar = TableManager.GetRoleBaseAttrByID(npc.RoleBaseID, 0); // if (m_Attar != null && (m_Attar.NpcType == (int)GameDefine_Globe.NPC_TYPE.ELITE || // m_Attar.NpcType == (int)GameDefine_Globe.NPC_TYPE.BOSS)) // m_BossTargetList.Add(target); //boss分类 // else if (m_Attar != null && m_Attar.NpcType == (int)GameDefine_Globe.NPC_TYPE.NORMAL) // m_MonsterTargetList.Add(target); //普通怪物分类 // else // m_CharacterTargetList.Add(target); //玩家分类 // } // //对对应的List进行排序,并使之有序 // m_CharacterTargetList.Sort(m_SortDistance); // m_MonsterTargetList.Sort(m_SortDistance); // m_BossTargetList.Sort(m_SortDistance); //} ////距离按照从小到大的顺序排序 //public int m_SortDistance(Obj_Character a, Obj_Character b) //{ // return (Position - a.Position).sqrMagnitude.CompareTo((Position - b.Position).sqrMagnitude); //} //public Obj_Character SelectSkillTarget(int nSkillId) //{ // if (IsDisableState(DISABLESTATE.Disable_Select)) // return null; // var _skillEx = TableManager.GetSkillExByID(nSkillId, 0); // if (_skillEx == null) // return null; // var _skillBase = TableManager.GetSkillBaseByID(_skillEx.BaseId, 0); // if (_skillBase == null) // return null; // if (IsSkillNeedSelectTar(_skillBase, _skillEx) == false) // return null; // //会在一次遍历中分别记录前后最近目标,前方有目标则优先选择前方,否则选择后方最近目标 // Obj_Character TargetObjChar = null; // var targets = Singleton.GetInstance().ObjPools; // foreach (var targetObj in targets.Values) // if (targetObj != null) // { // if (!targetObj.gameObject.activeSelf) // continue; // var targeObjChar = targetObj.gameObject.GetComponent(); // if (targeObjChar == null) // continue; // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.DIE) == 0) // if (targeObjChar.IsDie()) // continue; // //自己排除在外 // if (targeObjChar.ServerID == ServerID) // continue; // //伙伴为不可选中目标 // if (targeObjChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW) // continue; // //不符合技能选择类型的排除 // var nType = Reputation.GetObjReputionType(targeObjChar); // //技能针对敌对目标 过滤掉非敌对的目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.ENEMY) != 0 && // nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_NEUTRAL && // nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE // ) // continue; // //技能 针对为友好目标 过滤掉非友好目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.FRIEND) != 0) // { // if (nType != (int)CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND) // continue; // //可以对话的NPC 不是技能目标 // if (targeObjChar.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC) // { // var _roleBase = TableManager.GetRoleBaseAttrByID(targeObjChar.BaseAttr.RoleBaseID, 0); // if (_roleBase == null || _roleBase.DialogID != -1) // continue; // } // } // //分别取得前方和后方的最近Obj // var distance = Vector3.Distance(Position, targeObjChar.Position); // if (distance > _skillEx.Radius) // continue; // if (TargetObjChar == null) // { // TargetObjChar = targeObjChar; // continue; // } // var crossOld = Vector3.Dot(transform.forward, TargetObjChar.Position - Position); // var crossNew = Vector3.Dot(transform.forward, targeObjChar.Position - Position); // if (Mathf.Abs(crossNew) < Mathf.Abs(crossOld)) // TargetObjChar = targeObjChar; // if (Mathf.Abs(crossNew) == Mathf.Abs(crossOld)) // { // var DisOld = Vector3.Distance(TargetObjChar.Position, Position); // var DisNew = Vector3.Distance(targeObjChar.Position, Position); // if (DisNew < DisOld) // TargetObjChar = targeObjChar; // } // } // return TargetObjChar; //} //private bool IsTargetCanAtt(Obj_Character target, int SkillID) //{ // var _skillExinfo = TableManager.GetSkillExByID(SkillID, 0); // if (_skillExinfo == null) // return false; // var _skillBase = TableManager.GetSkillBaseByID(_skillExinfo.BaseId, 0); // if (_skillBase == null) // return false; // if (target == null || target.IsDie()) // return false; // //技能 针对为友好目标 过滤掉非友好目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.SELF) != 0) // if (target.ServerID == ServerID) // return true; // else // return false; // //自己排除在外 // if (target.ServerID == ServerID) // return false; // if (Vector3.Distance(Position, target.Position) > _skillExinfo.Radius) // return false; // //不符合技能选择类型的排除 // var nType = Reputation.GetObjReputionType(target); // //技能针对敌对目标 过滤掉非敌对的目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.ENEMY) != 0 && // nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_NEUTRAL && // nType != CharacterDefine.REPUTATION_TYPE.REPUTATION_HOSTILE // ) // return false; // //技能 针对为友好目标 过滤掉非友好目标 // if ((_skillBase.TargetType & (int)CharacterDefine.TARGETTYPE.FRIEND) != 0) // if (nType != (int)CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND) // return false; // if (target.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC) // { // var _roleBase = TableManager.GetRoleBaseAttrByID(target.BaseAttr.RoleBaseID, 0); // if (_roleBase == null || _roleBase.DialogID != -1) // return false; // } // return true; //} //public void ChangeHit(int nIncHitCount, bool isCritical) //{ // HitPoint = HitPoint + nIncHitCount; // if (m_fLastHitPointTime > 0 && Time.time - m_fLastHitPointTime > 5.0f) //5s清零 // HitPoint = 0; // m_fLastHitPointTime = Time.time; //} // 注:EnterCombat的逻辑,应该是将Target推送到SelectTarget // 然后进入战斗,主动攻击SelectTarget //public override bool OnEnterCombat(Obj_Character Target) //{ // //无技能 默认使用普攻 // if (CurUseSkillId == -1) // { // CurUseSkillId = OwnSkillInfo[0].SkillId; // if (CheckBeforUseSkill(CurUseSkillId) == false) // return false; // } // var skillExInfo = TableManager.GetSkillExByID(CurUseSkillId, 0); // if (skillExInfo == null) // return false; // var skillBaseInfo = TableManager.GetSkillBaseByID(skillExInfo.BaseId, 0); // if (skillBaseInfo == null) // return false; // //如果开打的时候 当前选择的目标是友好的目标则重新选择一个可以攻击的目标 // if (Target && Reputation.GetObjReputionType(Target) == CharacterDefine.REPUTATION_TYPE.REPUTATION_FRIEND) // if ((Target.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_NPC || // Target.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_MAIN_PLAYER) // && (skillBaseInfo.TargetType & (int)CharacterDefine.TARGETTYPE.SELF) == 0 // && (skillBaseInfo.TargetType & (int)CharacterDefine.TARGETTYPE.FRIEND) == 0 // ) // Target = SelectSkillTarget(CurUseSkillId); // var nTargetID = -1; // if (Target != null) // { // var skillRadius = skillExInfo.Radius; // var dis = Vector3.Distance(Position, Target.Position); // var diffDistance = dis - skillRadius; // if (diffDistance > 0) // if (IsSkillNeedSelectTar(skillBaseInfo, skillExInfo)) // Target = SelectSkillTarget(CurUseSkillId); // } // if (Target != null && Target.IsDie() == false) // { // nTargetID = Target.ServerID; // if (Target.IsVisibleChar() == false) // nTargetID = -1; // } // //挂机的话,必须要有目标才让放技能 // if (IsOpenAutoCombat) // if (Target == null) // return false; // else // nTargetID = Target.ServerID; // var result = ActiveSkill(CurUseSkillId, nTargetID); // if (Target != null) // SelectAttackTarget(Target.ServerID); // CurUseSkillId = -1; // base.OnEnterCombat(Target); // return result; //} #endregion } }