Files
JJBB/Assets/Project/Script/Obj/MainPlayer/Obj_MainPlayer_Combat.cs
2024-08-23 15:49:34 +08:00

1216 lines
53 KiB
C#
Raw Permalink 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.

/********************************************************************
文件名: \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
}
}