fix: update normal attack.

This commit is contained in:
tung.do@monkey.edu.vn
2025-10-09 02:08:11 +07:00
parent ff1e2dd89e
commit dd77543cdb
9 changed files with 285 additions and 101 deletions
@@ -1,3 +1,5 @@
using System.Security.Cryptography;
using Unity.VisualScripting;
using WorkList = System.Collections.Generic.List<CECHPWork>;
public class CECHPWork : CECObjectWork
@@ -483,6 +485,117 @@ public class CECHPWorkMan
public bool StartWork_p1(CECHPWork pWork, bool bNoDelay = false) { return StartWork(Work_priority.PRIORITY_1, pWork, bNoDelay); }
public bool StartWork_p2(CECHPWork pWork, bool bNoDelay = false) { return StartWork(Work_priority.PRIORITY_2, pWork, bNoDelay); }
public CECHostPlayer GetHostPlayer() { return m_pHost; }
public CECHPWork CreateWork(int idWork)
{
CECHPWork pWork = null;
switch (idWork)
{
//case CECHPWork.Host_work_ID.WORK_STAND: pWork = new CECHPWorkStand(this); break;
case CECHPWork.Host_work_ID.WORK_MOVETOPOS: pWork = new CECHPWorkMove(this); break;
case CECHPWork.Host_work_ID.WORK_TRACEOBJECT: pWork = new CECHPWorkTrace(this); break;
case CECHPWork.Host_work_ID.WORK_HACKOBJECT: pWork = new CECHPWorkMelee(this); break;
case CECHPWork.Host_work_ID.WORK_SPELLOBJECT: pWork = new CECHPWorkSpell(this); break;
//case CECHPWork.Host_work_ID.WORK_USEITEM: pWork = new CECHPWorkUse(this); break;
//case CECHPWork.Host_work_ID.WORK_DEAD: pWork = new CECHPWorkDead(this); break;
//case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break;
//case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break;
//case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break;
//case CECHPWork.Host_work_ID.WORK_SIT: pWork = new CECHPWorkSit(this); break;
//case CECHPWork.Host_work_ID.WORK_PICKUP: pWork = new CECHPWorkPick(this); break;
//case CECHPWork.Host_work_ID.WORK_CONCENTRATE: pWork = new CECHPWorkConcentrate(this); break;
//case CECHPWork.Host_work_ID.WORK_REVIVE: pWork = new CECHPWorkRevive(this); break;
//case CECHPWork.Host_work_ID.WORK_FLASHMOVE: pWork = new CECHPWorkFMove(this); break;
//case CECHPWork.Host_work_ID.WORK_BEBOUND: pWork = new CECHPWorkBeBound(this); break;
//case CECHPWork.Host_work_ID.WORK_PASSIVEMOVE: pWork = new CECHPWorkPassiveMove(this); break;
//case CECHPWork.Host_work_ID.WORK_CONGREGATE: pWork = new CECHPWorkCongregate(this); break;
//case CECHPWork.Host_work_ID.WORK_SKILLSTATEACT: pWork = new CECHPWorkSkillStateAction(this); break;
//case CECHPWork.Host_work_ID.WORK_FORCENAVIGATEMOVE: pWork = new CECHPWorkNavigate(this); break;
default:
return null;
}
return pWork;
}
public bool CanStartWork(int iWorkID, int iPriority = CECHPWorkMan.Work_priority.PRIORITY_1)
{
if (!ValidatePriority(iPriority))
{
return false;
}
if (GetWork(iWorkID) != null)
{
return false;
}
if (!HasWorkOnPriority(iPriority))
{
return true;
}
WorkList workList = m_WorkStack[iPriority];
for (int i = 0; i < workList.Count; ++i)
{
if (!workList[i].CanTransferTo(CECHPWork.GetWorkMask(iWorkID)))
{
return false;
}
}
return true;
}
bool HasWorkOnPriority(int iPriority)
{
return ValidatePriority(iPriority) && m_WorkStack[iPriority].Count != 0;
}
public void SetPostTickCommand(CECHPWorkPostTickCommand command)
{
m_pPostTickCommand = command;
}
bool HasWorkRunningOnPriority(int iPriority){
return HasWorkOnPriority(iPriority);
}
bool IsAnyWorkRunning(){
return HasWorkRunningOnPriority(m_iCurPriority);
}
public void Tick(float dwDeltaTime)
{
if (!IsAnyWorkRunning())
{
return;
}
WorkList workList = m_WorkStack[m_iCurPriority];
for (int i = 0; i < workList.Count;)
{
CECHPWork pWork = workList[i];
SetPostTickCommand(null);
pWork.Tick(dwDeltaTime);
if (m_pPostTickCommand == null)
{
if (!pWork.IsFinished())
{
++i;
continue;
}
KillWork(m_iCurPriority, i);
}
else
{
m_pPostTickCommand.Run(this);
SetPostTickCommand(null);
break; // 不确定 m_pPostTickCommand 执行什么内容,此处跳出
}
}
if (workList.Count == 0)
{
StartAwaitingWorks();
}
}
}
public abstract class CECHPWorkPostTickCommand
@@ -1,4 +1,5 @@
using BrewMonster;
using BrewMonster.Network;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Managers;
using PerfectWorld.Scripts.Player;
@@ -54,7 +55,8 @@ class CECHPWorkMelee : CECHPWork
// If target turn to be un-attackable, cancel action
if (m_pHost.AttackableJudge(m_idTarget, true) == 0)
{
g_pGame.GetGameSession().c2s_CmdCancelAction();
//UnityGameSession.c2s_CmdCancelAction();
//g_pGame.GetGameSession().c2s_CmdCancelAction();
m_bFinished = true;
return true;
}
@@ -93,7 +95,7 @@ class CECHPWorkMelee : CECHPWork
idTraceTarget = m_idTarget;
}
if (idTraceTarget && !m_pHost.IsRooting())
if (idTraceTarget != 0 && !m_pHost.IsRooting())
{
CECHPWorkTrace pWork = (CECHPWorkTrace)m_pWorkMan.CreateWork(Host_work_ID.WORK_TRACEOBJECT);
pWork.SetTraceTarget(pWork.CreatTraceTarget(idTraceTarget, CECHPWorkTrace.Trace_reason.TRACE_ATTACK));
@@ -24,36 +24,36 @@ public static class TraceObjectType
public abstract class CECTracedObject
{
//friend CECHPWorkTrace;
protected int m_iTraceType;
protected int m_iTraceType;
protected int m_iObjectId;
protected int m_iReason;
protected bool m_bMoreClose;
protected CECHostPlayer m_pHost;
public CECTracedObject(int type, int id, CECHostPlayer pHost, int ireason)
public CECTracedObject(int type, int id, CECHostPlayer pHost, int ireason)
{
m_iTraceType = type;
m_iObjectId = id;
m_iReason = ireason;
m_iTraceType = type;
m_iObjectId = id;
m_iReason = ireason;
m_pHost = pHost;
m_bMoreClose = false;
}
public CECTracedObject(CECTracedObject rhs)
{
m_iTraceType = rhs.m_iTraceType;
m_iObjectId = rhs.m_iObjectId;
m_iReason = rhs.m_iReason;
m_bMoreClose = rhs.m_bMoreClose;
m_iTraceType = rhs.m_iTraceType;
m_iObjectId = rhs.m_iObjectId;
m_iReason = rhs.m_iReason;
m_bMoreClose = rhs.m_bMoreClose;
m_pHost = rhs.m_pHost;
}
public abstract bool OnTargetMissing();
public abstract A3DVECTOR3 GetTargetPos();
public abstract bool OnTouched();
public abstract CECTracedObject Clone();
public abstract bool OnTargetMissing();
public abstract A3DVECTOR3 GetTargetPos();
public abstract bool OnTouched();
public abstract CECTracedObject Clone();
public virtual bool IsTargetMissing()
{
{
if (m_iObjectId != 0)
{
CECObject pObj = EC_ManMessageMono.Instance.GetObject(m_iObjectId, 0);
@@ -136,7 +136,7 @@ public abstract class CECTracedObject
if (m_iReason == CECHPWorkTrace.Trace_reason.TRACE_TALK)
{
fTouchRadius = 0.0f;
}
}
else
{
EC_Player pPlayer = pObject.GetComponent<CECHostPlayer>();
@@ -159,7 +159,7 @@ public abstract class CECTracedObject
}
return false;
}
public int GetTraceType()
public int GetTraceType()
{
return m_iTraceType;
}
@@ -173,7 +173,7 @@ public class CECTracedNPC : CECTracedObject
{
protected bool m_bForceAttack;
public CECTracedNPC(int type, int id, CECHostPlayer pHost, int ireason, bool bForceAttack = false) : base (type, id, pHost, ireason)
public CECTracedNPC(int type, int id, CECHostPlayer pHost, int ireason, bool bForceAttack = false) : base(type, id, pHost, ireason)
{
m_bForceAttack = bForceAttack;
}
@@ -274,7 +274,7 @@ public class CECTracedNPC : CECTracedObject
public class CECTracedPlayer : CECTracedObject
{
protected bool m_bForceAttack;
protected bool m_bForceAttack;
public CECTracedPlayer(int type, int id, CECHostPlayer pHost, int ireason, bool bForceAttack = false) : base(type, id, pHost, ireason)
{
m_bForceAttack = bForceAttack;
@@ -319,7 +319,7 @@ public class CECTracedPlayer : CECTracedObject
public override bool OnTouched()
{
bool bActionDone =false;
bool bActionDone = false;
if (GPDataTypeHelper.ISPLAYERID(m_iObjectId))
{
if (m_iObjectId == 0 || m_iObjectId == m_pHost.GetCharacterID())
@@ -411,7 +411,7 @@ public class CECTracedMatter : CECTracedObject
{
}
public CECTracedMatter(CECTracedMatter rhs) : base(rhs)
public CECTracedMatter(CECTracedMatter rhs) : base(rhs)
{
}
@@ -503,19 +503,19 @@ public class CECTracedMatter : CECTracedObject
};
public class CECHPWorkTrace : CECHPWork
{
// Trace reason
public static class Trace_reason
// Trace reason
public static class Trace_reason
{
public const int TRACE_NONE = -1,
TRACE_ATTACK = 0, // Normal attack
TRACE_PICKUP = 1, // Pickup object
TRACE_TALK = 2, // Go to talk
TRACE_SPELL = 3, // Cast magic
TRACE_GATHER = 4; // Gather object
}
// Constructor and Destructor
public CECHPWorkTrace(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_TRACEOBJECT, pWorkMan)
{
public const int TRACE_NONE = -1,
TRACE_ATTACK = 0, // Normal attack
TRACE_PICKUP = 1, // Pickup object
TRACE_TALK = 2, // Go to talk
TRACE_SPELL = 3, // Cast magic
TRACE_GATHER = 4; // Gather object
}
// Constructor and Destructor
public CECHPWorkTrace(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_TRACEOBJECT, pWorkMan)
{
m_dwMask = Work_mask.MASK_TRACEOBJECT;
m_dwTransMask = Work_mask.MASK_STAND | Work_mask.MASK_MOVETOPOS | Work_mask.MASK_FLYOFF | Work_mask.MASK_FREEFALL |
Work_mask.MASK_FOLLOW | Work_mask.MASK_USEITEM;
@@ -523,11 +523,11 @@ public class CECHPWorkTrace : CECHPWork
Reset();
}
// Change trace target
//void ChangeTarget(int idTarget, int iReason, bool bUseAutoPF=false);
// 设定traceobject
public void SetTraceTarget(CECTracedObject pTraceObj, bool bUseAutoPF = false)
{
// Change trace target
//void ChangeTarget(int idTarget, int iReason, bool bUseAutoPF=false);
// 设定traceobject
public void SetTraceTarget(CECTracedObject pTraceObj, bool bUseAutoPF = false)
{
ResetUseAutoPF(bUseAutoPF);
if (!pTraceObj.GetTargetObject() || pTraceObj.GetObjectID() == m_pHost.GetCharacterID())
{
@@ -573,8 +573,8 @@ public class CECHPWorkTrace : CECHPWork
return null;
}
// Tick routine
public virtual bool Tick(float dwDeltaTime)
// Tick routine
public virtual bool Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
@@ -640,8 +640,8 @@ public virtual bool Tick(float dwDeltaTime)
return true;
}
// Reset work
public override void Reset()
// Reset work
public override void Reset()
{
base.Reset();
@@ -658,8 +658,8 @@ public override void Reset()
m_dwAutoPFNextCheckTime = 0;
m_pTraceObject = null;
}
// Work is cancel
public override void Cancel()
// Work is cancel
public override void Cancel()
{
//if (m_pHost.m_pPrepSkill && m_pTraceObject.GetTraceReason() == Trace_reason.TRACE_SPELL)
// m_pHost.m_pPrepSkill = null;
@@ -675,10 +675,10 @@ public override void Cancel()
//AP_ActionEvent(m_bActionDone ? AP_EVENT_TRACEOK : AP_EVENT_MOVEFINISHED, m_pTraceObject.GetTraceReason());
}
// This work is do player moving ?
public override bool IsMoving() { return true; }
// Copy work data
public override bool CopyData(CECHPWork pWork)
// This work is do player moving ?
public override bool IsMoving() { return true; }
// Copy work data
public override bool CopyData(CECHPWork pWork)
{
if (!base.CopyData(pWork))
return false;
@@ -705,22 +705,22 @@ public override bool CopyData(CECHPWork pWork)
return true;
}
// User press cancel button
public void PressCancel()
// User press cancel button
public void PressCancel()
{
m_bReadyCancel = true;
//if (m_pTraceObject.GetTraceReason() == TRACE_SPELL)
// m_pHost.m_pPrepSkill = NULL;
}
// Set move close flag
public void SetMoveCloseFlag(bool bMoveClose) { m_pTraceObject.SetMoveCloseFlag(bMoveClose); }
// Set move close flag
public void SetMoveCloseFlag(bool bMoveClose) { m_pTraceObject.SetMoveCloseFlag(bMoveClose); }
// Set / Get force attack flag
public void SetForceAttack(bool bTrue) { m_bForceAttack = bTrue; }
public bool GetForceAttack() { return m_bForceAttack; }
// Set / Get prepared skill
public void SetPrepSkill(CECSkill pSkill) { /*m_pPrepSkill = pSkill;*/ }
public CECSkill GetPrepSkill() { /*return m_pPrepSkill;*/ return null; }
public CECSkill GetPrepSkill() { /*return m_pPrepSkill;*/ return null; }
// Get target ID
public int GetTarget() { return m_pTraceObject.GetObjectID(); }
// Get trace reason
@@ -734,18 +734,18 @@ public CECSkill GetPrepSkill() { /*return m_pPrepSkill;*/ return null; }
// CECIntelligentRoute.Instance().ResetSearch();
//}
}
public bool GetUseAutoPF()
public bool GetUseAutoPF()
{
return m_bUseAutoPF;
}
public bool IsAutoPF()
public bool IsAutoPF()
{
return false;
}
public void SetActionDone(bool bActionDone) { m_bActionDone = bActionDone; }
public void SetActionDone(bool bActionDone) { m_bActionDone = bActionDone; }
public void OnTargetMissing()
public void OnTargetMissing()
{
StopMove(true);
if ((m_pTraceObject.GetTraceType() == TraceObjectType.TRACE_NPC) || (m_pTraceObject.GetTraceType() == TraceObjectType.TRACE_PLAYER))
@@ -758,12 +758,12 @@ public void OnTargetMissing()
//}
}
public void OnTouchTarget()
public void OnTouchTarget()
{
StopMove(true);
m_bActionDone = m_pTraceObject.OnTouched();
}
public bool CanTouch()
public bool CanTouch()
{
//CECSkill pPrepSkill = m_pHost.m_pPrepSkill;
CheckPrepSkill();
@@ -901,8 +901,8 @@ public bool CanTouch()
}
return true;
}
// Trace in air and water
public bool Trace_FlySwim(float fDeltaTime)
// Trace in air and water
public bool Trace_FlySwim(float fDeltaTime)
{
return true;
}
@@ -925,19 +925,70 @@ public bool Trace_FlySwim(float fDeltaTime)
m_bFinished = true;
}
}
// Handle the case that target died when host is tracing it
bool OnTargetDied(CECObject* pTarget);
// Is valid time to touch target ?
bool IsGoodTimeToTouch();
// Check prepare skill
void CheckPrepSkill();
bool GetTargetCurPos(A3DVECTOR3 &pos);
A3DVECTOR3 GetCurMovingDest();
void UpdateUseAutoPF();
// Handle the case that target died when host is tracing it
public bool OnTargetDied(CECObject pTarget)
{
return true;
}
// Is valid time to touch target ?
public bool IsGoodTimeToTouch()
{
if (m_pHost.IsJumping())
{
return false;
}
return true;
}
// Check prepare skill
public void CheckPrepSkill()
{
void ReplaceTarget(CECTracedObject ptraceobj);
}
public bool GetTargetCurPos(A3DVECTOR3 pos)
{
return true;
}
public A3DVECTOR3 GetCurMovingDest()
{
return new A3DVECTOR3();
}
public void UpdateUseAutoPF()
{
void ResetUseAutoPF(bool bUseAutoPF);
void UpdateResetUseAutoPF();
void ClearResetUseAutoPF();
}
public void ReplaceTarget(CECTracedObject ptraceobj)
{
//if (m_pTraceObject)
//{
// delete m_pTraceObject;
//}
m_pTraceObject = ptraceobj;
}
public void ResetUseAutoPF(bool bUseAutoPF)
{
m_bShouldResetUseAutoPF = true;
m_bUseAutoPFResetValue = bUseAutoPF;
}
public void UpdateResetUseAutoPF()
{
if (!m_bShouldResetUseAutoPF)
{
return;
}
//# ifdef SHOW_AUTOMOVE_FOOTPRINTS
// g_AutoPFFollowPoints.clear();
// g_AutoPFPathPoints.clear();
//#endif
//CECIntelligentRoute::Instance().SetUsage(CECIntelligentRoute::enumUsageWorkTrace);
//CECIntelligentRoute::Instance().ResetSearch();
SetUseAutoPF(m_bUseAutoPFResetValue);
ClearResetUseAutoPF();
}
public void ClearResetUseAutoPF()
{
m_bShouldResetUseAutoPF = false;
m_bUseAutoPFResetValue = false;
}
};
@@ -83,15 +83,15 @@ public class CECObject : MonoBehaviour
// Set absolute forward and up direction
public virtual void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp)
{
if (m_bUseGroundNormal)
{
A3DVECTOR3 vecRight = Normalize(CrossProduct(g_vAxisY, vDir));
A3DVECTOR3 vecNormal = m_vecGroundNormal - DotProduct(m_vecGroundNormal, vecRight) * vecRight;
A3DVECTOR3 vecNewDir = Normalize(CrossProduct(vecRight, vecNormal));
A3DCoordinate::SetDirAndUp(vecNewDir, vecNormal);
}
else
A3DCoordinate::SetDirAndUp(vDir, vUp);
//if (m_bUseGroundNormal)
//{
// A3DVECTOR3 vecRight = Normalize(CrossProduct(g_vAxisY, vDir));
// A3DVECTOR3 vecNormal = m_vecGroundNormal - DotProduct(m_vecGroundNormal, vecRight) * vecRight;
// A3DVECTOR3 vecNewDir = Normalize(CrossProduct(vecRight, vecNormal));
// A3DCoordinate::SetDirAndUp(vecNewDir, vecNormal);
//}
//else
// A3DCoordinate::SetDirAndUp(vDir, vUp);
// Stop orientation adjusting
m_bAdjustOrient = false;
@@ -103,24 +103,24 @@ public class CECObject : MonoBehaviour
m_dwOrientTime = dwTime;
m_dwOrientTimeCnt = 0;
// Calculate start orientation
A3DMATRIX4 mat = a3d_TransformMatrix(GetDir(), GetUp(), g_vOrigin);
m_quOrientStart.ConvertFromMatrix(mat);
//// Calculate start orientation
//A3DMATRIX4 mat = a3d_TransformMatrix(GetDir(), GetUp(), g_vOrigin);
//m_quOrientStart.ConvertFromMatrix(mat);
// Calculate end orientation
if (m_bUseGroundNormal)
{
A3DVECTOR3 vecRight = Normalize(CrossProduct(g_vAxisY, vDir));
A3DVECTOR3 vecNormal = m_vecGroundNormal - DotProduct(m_vecGroundNormal, vecRight) * vecRight;
A3DVECTOR3 vecNewDir = Normalize(CrossProduct(vecRight, vecNormal));
mat = a3d_TransformMatrix(vecNewDir, vecNormal, g_vOrigin);
}
else
{
mat = a3d_TransformMatrix(vDir, vUp, g_vOrigin);
}
//// Calculate end orientation
//if (m_bUseGroundNormal)
//{
// A3DVECTOR3 vecRight = Normalize(CrossProduct(g_vAxisY, vDir));
// A3DVECTOR3 vecNormal = m_vecGroundNormal - DotProduct(m_vecGroundNormal, vecRight) * vecRight;
// A3DVECTOR3 vecNewDir = Normalize(CrossProduct(vecRight, vecNormal));
// mat = a3d_TransformMatrix(vecNewDir, vecNormal, g_vOrigin);
//}
//else
//{
// mat = a3d_TransformMatrix(vDir, vUp, g_vOrigin);
//}
m_quOrientEnd.ConvertFromMatrix(mat);
//m_quOrientEnd.ConvertFromMatrix(mat);
}
// Calculate distance between this object and specified position
@@ -181,7 +181,17 @@ public class CECObject : MonoBehaviour
// Get object id
public static int GetObjectID(CECObject pObject)
{
if (!pObject)
return 0;
if (pObject.IsPlayer())
return ((EC_Player)pObject).GetCharacterID();
else if (pObject.IsNPC())
return ((CECNPC)pObject).GetNPCID();
//else if (pObject.IsMatter())
// return ((CECMatter*)pObject)->GetMatterID();
else
return 0;
}
protected int m_iCID; // Class ID
@@ -13,7 +13,7 @@ public class CECMonster : CECNPC
public override void SetUpCECNPC(CECNPCMan pNPCMan)
{
base.SetUpCECNPC(pNPCMan);
m_iCID = (int)ClassID.OCID_MONSTER;
m_iCID = (int)Class_ID.OCID_MONSTER;
m_pDBEssence = default;
}
public override bool Init(int tid, in info_npc info, ReadOnlySpan<byte> packet, int infoOffset)
@@ -899,6 +899,9 @@ public class CECNPC : CECObject
//}
return false;
}
// Get NPC ID
public int GetNPCID() { return m_NPCInfo.nid; }
}
public enum WorkType
{
+1
View File
@@ -42,6 +42,7 @@ public class CECHostPlayer : EC_Player
public bool m_bPrepareFight = false; // true, prepare to fight
int m_iJumpCount = 0;
bool m_bJumpInWater = false;
public A3DVECTOR3 m_vVelocity; // Velocity
float playerSpeed = 5.0f;
float jumpHeight = 1.5f;
+2
View File
@@ -331,6 +331,8 @@ public class CECHostMove
public int MoveBlocked() { return m_iBlockedCnt; }
public void SetSlideLock(bool bLock) { m_bSlideLock = bLock; }
// Is stoping ?
public bool IsStop() { return m_bStop; }
}
public struct CDR_INFO
{
+2
View File
@@ -379,6 +379,8 @@ public abstract class EC_Player : CECObject
// Get move environment
public int GetMoveEnv(){ return m_iMoveEnv; }
// Get character ID
public int GetCharacterID(){ return m_PlayerInfo.cid; }
}
public struct PlayActionEvent
{