1216 lines
53 KiB
C#
1216 lines
53 KiB
C#
/********************************************************************
|
||
文件名: \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
|
||
}
|
||
} |