Files
JJBB/Assets/Project/Script/Obj/MainPlayer/Obj_MainPlayer_Combat.cs

1216 lines
53 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************
: \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<ObjManager>.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<ClientImpactInfo> m_ClientImpactInfo = new List<ClientImpactInfo>();
// public List<ClientImpactInfo> 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<ObjManager>.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<ObjManager>.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<ObjManager>.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<Obj_Character> m_BossTargetList = new List<Obj_Character>(); //bossList
//public List<Obj_Character> m_CharacterTargetList = new List<Obj_Character>(); //敌对玩家List
//public List<Obj_Character> m_MonsterTargetList = new List<Obj_Character>(); //怪物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<ObjManager>.GetInstance().ObjPools;
// var m_TargetsList = new List<Obj_Character>(); //在范围内的敌人
// 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<Obj_NPC>();
// 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<ObjManager>.GetInstance().ObjPools;
// var m_TargetsList = new List<Obj_Character>(); //在范围内的敌人
// 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<Obj_MainPlayer>().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<Obj_Character> 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<ObjManager>.GetInstance().ObjPools;
// foreach (var targetObj in targets.Values)
// if (targetObj != null)
// {
// if (!targetObj.gameObject.activeSelf)
// continue;
// var targeObjChar = targetObj.gameObject.GetComponent<Obj_Character>();
// 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
}
}