feat: add logic else player action normal attack.

This commit is contained in:
Tungdv
2025-10-21 19:12:23 +07:00
parent 3a05b94366
commit 776ac0fa5d
6 changed files with 885 additions and 14 deletions
@@ -0,0 +1,714 @@
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Player;
using System;
namespace BrewMonster.Scripts
{
using WorkList = System.Collections.Generic.List<CECEPWork>;
public abstract class CECEPWorkMatcher
{
public abstract bool Match(CECEPWork work, int workType);
}
// class CECEPWorkMelee
public class CECEPWorkMelee : CECEPWork
{
int m_iAttackTarget;
public CECEPWorkMelee(CECEPWorkMan pWorkMan, int attackTarget) : base(EP_work_ID.WORK_HACKOBJECT, pWorkMan)
{
m_iAttackTarget = attackTarget;
}
public override void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + UnityEngine.Random.Range(0, 3));
GetPlayer().EnterFightState();
}
public override void Tick(float dwDeltaTime)
{
GetPlayer().TurnFaceTo(m_iAttackTarget);
// Slide to server position
A3DVECTOR3 vDir = GetPlayer().m_vServerPos - GetPlayer().GetPos();
float fDist = vDir.Normalize();
if (fDist > 0.0001f)
{
float fMoveDist = 10.0f * dwDeltaTime * 0.001f;
if (fMoveDist > fDist)
fMoveDist = fDist;
GetPlayer().SetPos(GetPlayer().GetPos() + vDir * fMoveDist);
}
if (GetPlayer().m_FightCnt.IncCounter(dwDeltaTime))
{
Finish();
}
}
public override void Cancel()
{
GetPlayer().TurnFaceTo(0);
}
};
public class CECEPWorkIDMatcher : CECEPWorkMatcher
{
int m_workID;
public CECEPWorkIDMatcher(int workID)
{
m_workID = workID;
}
public override bool Match(CECEPWork work, int workType)
{
return work != null && work.GetWorkID() == m_workID;
}
}
// class CECEPWorkCongregate
public class CECEPWorkCongregate : CECEPWork
{
int m_iType;
public CECEPWorkCongregate(CECEPWorkMan pWorkMan, int iType) : base(EP_work_ID.WORK_CONGREGATE, pWorkMan)
{
m_iType = iType;
}
public override void Start()
{
}
public int GetType()
{
return m_iType;
}
}
public class CECEPCongregateWorkMatcher : CECEPWorkMatcher
{
int m_iType;
public CECEPCongregateWorkMatcher(int iType)
{
m_iType = iType;
}
public override bool Match(CECEPWork work, int workType)
{
if (work != null && work.GetWorkID() == CECEPWork.EP_work_ID.WORK_CONGREGATE)
{
CECEPWorkCongregate pCongregateWork = work as CECEPWorkCongregate;
return pCongregateWork.GetType() == m_iType;
}
return false;
}
}
// class CECEPWorkIdle
public class CECEPWorkIdle : CECEPWork
{
int m_iType;
bool m_bOTCheck;
CECCounter m_OTCnt;
uint m_dwParam;
public CECEPWorkIdle(CECEPWorkMan pWorkMan, int iType, int iOTTime, uint dwParam) : base(EP_work_ID.WORK_IDLE, pWorkMan)
{
m_dwParam = dwParam;
m_iType = iType;
m_bOTCheck = iOTTime > 0 ? true : false;
if (m_bOTCheck)
{
m_OTCnt.SetPeriod(iOTTime);
m_OTCnt.Reset();
}
switch (iType)
{
case Idle_work_type.IDLE_SITDOWN:
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
if (m_dwParam != 0)
GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP);
else
{
GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_SITDOWN);
GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP, true, 200, true);
}
break;
case Idle_work_type.IDLE_REVIVE:
GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_REVIVE);
break;
case Idle_work_type.IDLE_BOOTH:
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
break;
}
}
public override void Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
}
public int GetType()
{
return m_iType;
}
}
public class CECEPIdleWorkMatcher : CECEPWorkMatcher
{
int m_iType;
public CECEPIdleWorkMatcher(int iType)
{
m_iType = iType;
}
public override bool Match(CECEPWork work, int workType)
{
if (work != null && work.GetWorkID() == CECEPWork.EP_work_ID.WORK_IDLE)
{
CECEPWorkIdle pIdleWork = work as CECEPWorkIdle;
return pIdleWork.GetType() == m_iType;
}
return false;
}
}
public class CECEPWork
{
public static class EP_work_ID
{
public const int WORK_INVALID = -1,
WORK_STAND = 0, // Stand and do nothing
WORK_MOVE = 1, // Move
WORK_HACKOBJECT = 2, // Hack specified object (NPC, player etc.)
WORK_SPELL = 3, // Spell magic
WORK_PICKUP = 4, // Pickup matter
WORK_DEAD = 5, // Dead
WORK_USEITEM = 6, // Use item
WORK_IDLE = 7, // Idle works
WORK_FLASHMOVE = 8, // Flash move
WORK_PASSIVEMOVE = 9, // Move controlled by server
WORK_CONGREGATE = 10, // Congregate reply
WORK_SKILLSTATEACT = 11, // skill buff action
NUM_WORK = 12;
}
// Idle work type
public static class Idle_work_type
{
public const int IDLE_SITDOWN = 0,
IDLE_REVIVE = 1,
IDLE_BOOTH = 2;
}
static string[] l_WorkName = new string[EP_work_ID.NUM_WORK]
{
"WORK_STAND",
"WORK_MOVE",
"WORK_HACKOBJECT",
"WORK_SPELL",
"WORK_PICKUP",
"WORK_DEAD",
"WORK_USEITEM",
"WORK_IDLE",
"WORK_FLASHMOVE",
"WORK_PASSIVEMOVE",
"WORK_CONGREGATE",
"WORK_SKILLSTATEACT",
};
protected int m_iWorkID;
protected CECEPWorkMan m_pWorkMan;
protected bool m_bFinished;
protected EC_ElsePlayer GetPlayer()
{
return m_pWorkMan.GetPlayer();
}
public CECEPWork(int iWorkID, CECEPWorkMan pWorkMan)
{
m_iWorkID = iWorkID;
m_pWorkMan = pWorkMan;
m_bFinished = false;
}
public static string GetWorkName(int iWork)
{
if (iWork >= EP_work_ID.WORK_STAND && iWork < l_WorkName.Length)
{
return l_WorkName[iWork];
}
else
{
return "Invalid Work";
}
}
public string GetWorkName()
{
return GetWorkName(GetWorkID());
}
public int GetWorkID()
{
return m_iWorkID;
}
public bool IsFinished()
{
return m_bFinished;
}
public virtual void Start() { }
public virtual void Tick(float dwDeltaTime) { }
public virtual void Cancel() { }
public virtual void Finish()
{
m_bFinished = true;
}
static bool Validate(int iWork)
{
return iWork >= EP_work_ID.WORK_STAND && iWork < EP_work_ID.NUM_WORK;
}
}
// class CECEPWorkSpell
public class CECEPWorkSpell : CECEPWork
{
CECCounter m_SkillCnt;
CECSkill m_pCurSkill;
int m_idCurSkillTarget;
public CECEPWorkSpell(CECEPWorkMan pWorkMan, uint dwPeriod, CECSkill pSkill, int target) : base(CECEPWork.EP_work_ID.WORK_SPELL, pWorkMan)
{
m_pCurSkill = pSkill;
m_idCurSkillTarget = target;
m_SkillCnt.SetPeriod(dwPeriod);
m_SkillCnt.Reset();
}
public override void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
}
public override void Tick(float dwDeltaTime)
{
//TO DO: fix later
//GetPlayer().m_FightCnt.IncCounter(dwDeltaTime);
//int iRealTime = g_pGame.GetRealTickTime();
//if (m_SkillCnt.IncCounter(iRealTime))
//{
// Finish();
//}
//else
//{
// if (m_idCurSkillTarget != 0)
// {
// GetPlayer().TurnFaceTo(m_idCurSkillTarget);
// }
// if (GetPlayer().IsPlayingMoveAction() && !GetPlayer().IsWorkMoveRunning())
// { // 从移动施法到停止移动、会一直在持续播放移动动作,此处暂停
// GetPlayer().PlayAction(CECPlayer::ACT_FIGHTSTAND);
// }
// if (!GetPlayer().IsPlayingAction())
// {
// GetPlayer().PlayAction((int)CECPlayer.PLAYER_ACTION_TYPE.ACT_FIGHTSTAND); // 技能动作播放完成后、播放战斗站立动作
// }
//}
}
public override void Cancel()
{
//TO DO: fix later
//if (m_pCurSkill != null)
//{
// m_pCurSkill = null;
//}
//m_idCurSkillTarget = 0;
//GetPlayer().StopSkillAttackAction();
//GetPlayer().TurnFaceTo(0);
}
public CECSkill GetSkill()
{
return m_pCurSkill;
}
}
public class CECEPWorkMan
{
public static class Work_type
{
public const int WT_NOTHING = 0, // Do thing
WT_NORMAL = 1, // Normal type work
WT_INTERRUPT = 2, // Interrupt type work
NUM_WORKTYPE = 3;
}
private EC_ElsePlayer m_pElsePlayer;
private WorkList[] m_WorkStack = new WorkList[Work_type.NUM_WORKTYPE];
private int m_iCurWorkType;
public CECEPWorkMan(EC_ElsePlayer pElsePlayer)
{
m_pElsePlayer = pElsePlayer;
m_iCurWorkType = -1;
}
public EC_ElsePlayer GetPlayer()
{
return m_pElsePlayer;
}
public bool ValidateWorkType(int iWorkType)
{
return iWorkType >= 0 && iWorkType < Work_type.NUM_WORKTYPE;
}
public bool FindWork(int iWorkType, int iWorkID)
{
if (!ValidateWorkType(iWorkType))
{
return false;
}
WorkList workList = m_WorkStack[iWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count; ++i)
{
if (iWorkID == workList[i].GetWorkID())
{
return true;
}
}
}
return false;
}
public void StartNormalWork(CECEPWork pWork)
{
StartWork(Work_type.WT_NORMAL, ref pWork);
}
private bool CanRunSimultaneously(CECEPWork pWork1, CECEPWork pWork2)
{
if (pWork1.GetWorkID() == CECEPWork.EP_work_ID.WORK_MOVE &&
pWork2.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pWork2 as CECEPWorkSpell);
}
if (pWork2.GetWorkID() == CECEPWork.EP_work_ID.WORK_MOVE &&
pWork1.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pWork1 as CECEPWorkSpell);
}
return false;
}
private bool CanReplace(CECEPWork pNewWork, CECEPWork pExistWork)
{
if (pNewWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL &&
pExistWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pNewWork as CECEPWorkSpell)
&& CanSpellWhileMoving(pExistWork as CECEPWorkSpell);
}
return false;
}
private bool CanSpellWhileMoving(CECEPWorkSpell pWorkSpell)
{
return false;
// TO DO: fix later
// return pWorkSpell.GetSkill()
// && CECCastSkillWhenMove.Instance().IsSkillSupported(pWorkSpell.GetSkill().GetSkillID(), GetPlayer());
}
private bool CanMergeWithCurrentWork(int iWorkType, CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType) || iWorkType != m_iCurWorkType)
{
return false;
}
WorkList workList = m_WorkStack[iWorkType];
if (workList == null || workList.Count == 0)
{
return false;
}
for (int i = 0; i < workList.Count; ++i)
{
if (!CanRunSimultaneously(pWork, workList[i]) && // 要么同时共存
!CanReplace(pWork, workList[i]))
{ // 要么可以替换
return false;
}
}
return true;
}
private void KillWork(int iWorkType, int index)
{
if (!ValidateWorkType(iWorkType))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
if (index < 0 || index >= (int)workList.Count)
{
//ASSERT(false);
return;
}
CECEPWork pWork = workList[index];
pWork.Cancel();
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::%s(%s) killed", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
//delete pWork;
pWork = null;
workList.RemoveAt(index);
}
private void MergeWork(int iWorkType, CECEPWork pWork)
{
if (!CanMergeWithCurrentWork(iWorkType, pWork))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
for (int i = 0; i < workList.Count; ++i)
{
if (CanReplace(pWork, workList[i]))
{
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::MergeWork %s replacing %s at %s", pWork.GetWorkName(), workList[i].GetWorkName(), GetWorkTypeName(iWorkType)));
KillWork(iWorkType, i);
workList.Insert(i, pWork);
return;
}
}
workList.Add(pWork);
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::MergeWork %s appended to %s", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
}
private void FinishWorkAtWorkType(int iWorkType)
{
if (!ValidateWorkType(iWorkType))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
while (workList != null && workList.Count != 0)
{
KillWork(iWorkType, 0);
}
if (m_iCurWorkType == iWorkType)
{
m_iCurWorkType = -1;
}
}
private void AppendWork(int iWorkType, CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType) || pWork == null)
{
//ASSERT(false);
return;
}
m_WorkStack[iWorkType].Add(pWork);
}
private void CancelWorkAtWorkType(int iWorkType)
{
if (!ValidateWorkType(iWorkType))
{
return;
}
WorkList workList = m_WorkStack[iWorkType];
for (int i = 0; i < workList.Count; ++i)
{
CancelWork(workList[i]);
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::%s(%s) cancelled", workList[i].GetWorkName(), GetWorkTypeName(iWorkType)));
}
}
private void CancelWork(CECEPWork pWork)
{
if (pWork == null)
{
//ASSERT(false);
return;
}
pWork.Cancel();
}
public void StartWork(int iWorkType, ref CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType))
{
pWork = null;
return;
}
if (CanMergeWithCurrentWork(iWorkType, pWork))
{
MergeWork(iWorkType, pWork);
}
else
{
if (pWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_DEAD)
{
for (int i = iWorkType; i < Work_type.NUM_WORKTYPE; i++)
{
FinishWorkAtWorkType(i);
}
AppendWork(iWorkType, pWork);
m_iCurWorkType = iWorkType;
}
else
{
bool shouldStart = (iWorkType >= m_iCurWorkType);
FinishWorkAtWorkType(iWorkType);
AppendWork(iWorkType, pWork);
if (!shouldStart)
{
//LOG_DEBUG_INFO(AString().Format("CECEPWork::StartWork %s flushed %s", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
return;
}
if (iWorkType > m_iCurWorkType)
{
CancelWorkAtWorkType(m_iCurWorkType);
}
m_iCurWorkType = iWorkType;
}
}
pWork.Start();
}
private bool IsAnyWorkRunning()
{
return ValidateWorkType(m_iCurWorkType) && m_WorkStack != null && m_WorkStack[m_iCurWorkType] != null;
}
private void StartAwaitingWorks()
{
if (ValidateWorkType(m_iCurWorkType))
{
for (--m_iCurWorkType; m_iCurWorkType >= 0; --m_iCurWorkType)
{
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList == null || workList.Count == 0)
{
continue;
}
for (int j = 0; j < workList.Count; ++j)
{
workList[j].Start();
//LOG_DEBUG_INFO(AString().Format("CECElsePlayer::StartAwaitingWorks %s(%s) started by decrease priority", workList[j].GetWorkName(), GetWorkTypeName(m_iCurWorkType)));
}
break;
}
}
}
public void Tick(float dwDeltaTime)
{
if (!IsAnyWorkRunning())
{
return;
}
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count;)
{
CECEPWork pWork = workList[i];
pWork.Tick(dwDeltaTime);
if (!pWork.IsFinished())
{
++i;
continue;
}
KillWork(m_iCurWorkType, i);
}
if (workList == null || workList.Count == 0)
{
StartAwaitingWorks();
}
}
}
public void FinishWork(CECEPWorkMatcher matcher)
{
bool bCurrentWorkFinished = false;
for (int i = Work_type.NUM_WORKTYPE - 1; i >= 0; --i)
{
WorkList workList = m_WorkStack[i];
if (workList == null || workList.Count == 0)
{
continue;
}
for (int j = 0; j < workList.Count;)
{
if (!matcher.Match(workList[j], i))
{
++j;
continue;
}
KillWork(i, j);
if (i == m_iCurWorkType && (workList == null || workList.Count == 0))
{
bCurrentWorkFinished = true;
}
}
}
if (bCurrentWorkFinished)
{
StartAwaitingWorks();
}
}
public void FinishWork(int idWork)
{
FinishWork(new CECEPWorkIDMatcher(idWork));
}
public bool IsWorkRunning(int iWork)
{
return FindWork(m_iCurWorkType, iWork);
}
public void FinishRunningWork(int idWork)
{
if (!IsWorkRunning(idWork))
{
return;
}
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count;)
{
if (workList[i].GetWorkID() != idWork)
{
++i;
continue;
}
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::FinishRunningWork %s(%s)", workList[i].GetWorkName(), GetWorkTypeName(m_iCurWorkType)));
KillWork(m_iCurWorkType, i);
}
if (workList == null)
{
StartAwaitingWorks();
}
}
}
public bool FinishIdleWork(int iType)
{
FinishWork(new CECEPIdleWorkMatcher(iType));
return true;
}
public bool FinishCongregateWork(int iType)
{
FinishWork(new CECEPCongregateWorkMatcher(iType));
return true;
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9352b9911dad2d541b975297dcefa8d2
@@ -52,6 +52,7 @@ namespace PerfectWorld.Scripts.Managers
break;
}
case int value when value == EC_MsgDef.MSG_PM_FACTION_PVP_MASK_MODIFY:
case int value1 when value1 == EC_MsgDef.MSG_PM_PLAYERATKRESULT:
Debug.Log("EC_MsgDef.MSG_PM_FACTION_PVP_MASK_MODIFY");
TransmitMessage(Msg);
break;
@@ -437,7 +438,10 @@ namespace PerfectWorld.Scripts.Managers
else
cid = ((cmd_object_landing)msg.dwParam1).object_id;
break;*/
case long value when value == EC_MsgDef.MSG_PM_PLAYERATKRESULT:
cmd_object_atk_result pCmdAtk = GPDataTypeHelper.FromBytes<cmd_object_atk_result>((byte[])msg.dwParam1);
cid = pCmdAtk.attacker_id;
break;
// ⚠️ Các case khác cũng tương tự, chỉ việc lấy ra đúng trường id / caster / user ...
// Do quá dài nên bạn có thể copy dần từng case từ C++ sang.
@@ -446,7 +450,7 @@ namespace PerfectWorld.Scripts.Managers
return false;
}
/* if (cid == 0)
if (cid == 0)
{
System.Diagnostics.Debug.Assert(false, "cid = 0");
return false;
@@ -461,7 +465,7 @@ namespace PerfectWorld.Scripts.Managers
var elsePlayer = SeekOutElsePlayer(cid);
if (elsePlayer != null)
elsePlayer.ProcessMessage(msg);
}*/
}
return true;
}
@@ -1,5 +1,4 @@
using Animancer;
using Animancer.Editor;
using BrewMonster;
using BrewMonster.Managers;
using BrewMonster.Scripts.Managers;
@@ -417,12 +417,13 @@ namespace CSNetwork
EC_ManMessage.PostMessage(EC_MsgDef.MSG_HST_HURTRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.OBJECT_ATTACK_RESULT:
int id = GPDataTypeHelper.FromBytes<int>(pDataBuf);
BMLogger.LogError($"OBJECT_ATTACK_RESULT: npc ? " + ISNPCID(id));
//int id = GPDataTypeHelper.FromBytes<int>(pDataBuf);
cmd_object_atk_result pCmdAtk = GPDataTypeHelper.FromBytes<cmd_object_atk_result>(pDataBuf);
//BMLogger.LogError($"OBJECT_ATTACK_RESULT: npc ? " + ISNPCID(id));
if (ISPLAYERID(id))
if (ISPLAYERID(pCmdAtk.attacker_id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_PM_PLAYERATKRESULT, MANAGER_INDEX.MAN_PLAYER, -1, pDataBuf, pCmdHeader);
else if (ISNPCID(id))
else if (ISNPCID(pCmdAtk.attacker_id))
EC_ManMessage.PostMessage(EC_MsgDef.MSG_NM_NPCATKRESULT, MANAGER_INDEX.MAN_PLAYER, 0, pDataBuf, pCmdHeader);
break;
case CommandID.HOST_ATTACKRESULT:
@@ -1,5 +1,6 @@
using BrewMonster;
using BrewMonster.Managers;
using BrewMonster.Scripts;
using CSNetwork;
using CSNetwork.GPDataType;
using CSNetwork.Protocols.RPCData;
@@ -11,7 +12,7 @@ namespace PerfectWorld.Scripts.Player
public class EC_ElsePlayer : CECPlayer
{
A3DVECTOR3 m_vMoveDir; // Player's velocity
A3DVECTOR3 m_vServerPos; // Player's real position on server
public A3DVECTOR3 m_vServerPos; // Player's real position on server
A3DVECTOR3 m_vStopDir; // The direction when player stop moving
// 是否是依附者 = Is it a dependent/attacher?
bool m_bHangerOn;
@@ -25,10 +26,13 @@ namespace PerfectWorld.Scripts.Player
OtherPlayer_Move_Info m_cdr = new OtherPlayer_Move_Info();
float m_fDistToHost = 0f; // Distance to host player
float m_fDistToHostH = 0f; // Horizontal distance to host player
CECCounter m_FightCnt;
public CECCounter m_FightCnt;
CECEPWorkMan m_pEPWorkMan;
CECHostPlayer pHost => EC_ManMessageMono.Instance?.GetECManPlayer?.GetHostPlayer();
public void Init(RoleInfo roleInfo, info_player_1 Info)
{
m_pEPWorkMan = new CECEPWorkMan(this);
m_iProfession = roleInfo.occupation;
m_iGender = roleInfo.gender;
@@ -70,7 +74,7 @@ namespace PerfectWorld.Scripts.Player
{
BrewMonster.BMLogger.Log("HoangDev : fDist >= MAX_LAGDIST");
SetPos(Cmd.dest);
//m_pEPWorkMan->FinishWork(CECEPWork::WORK_MOVE);
//m_pEPWorkMan.FinishWork(CECEPWork::WORK_MOVE);
return;
}
@@ -349,15 +353,16 @@ namespace PerfectWorld.Scripts.Player
private void Update()
{
MovingTo(Time.deltaTime);
CECHostPlayer pHost = EC_ManMessageMono.Instance.GetECManPlayer.GetHostPlayer();
if (pHost != null /*&& pHost->IsSkeletonReady()*/)
if (pHost != null /*&& pHost.IsSkeletonReady()*/)
{
m_fDistToHost = CalcDist(pHost.GetPos(), true);
m_fDistToHostH = CalcDist(pHost.GetPos(), false);
}
m_pEPWorkMan?.Tick(Time.deltaTime);
}
private void SetPos(A3DVECTOR3 vPos)
public void SetPos(A3DVECTOR3 vPos)
{
Vector3 vector = new Vector3();
vector.x = vPos.x;
@@ -383,6 +388,152 @@ namespace PerfectWorld.Scripts.Player
// Get player's real position on server
public A3DVECTOR3 GetServerPos() { return m_vServerPos; }
public bool ProcessMessage(ECMSG Msg)
{
switch (Msg.dwMsg)
{
case long value when value == EC_MsgDef.MSG_PM_PLAYERATKRESULT:
OnMsgPlayerAtkResult(Msg);
break;
}
return true;
}
void OnMsgPlayerAtkResult(ECMSG Msg)
{
cmd_object_atk_result pCmd = GPDataTypeHelper.FromBytes<cmd_object_atk_result>((byte[])Msg.dwParam1);
//ASSERT(pCmd && pCmd.attacker_id == m_PlayerInfo.cid);
// Face to target
TurnFaceTo(pCmd.target_id);
// TO DO: fix later
//PlayAttackEffect(pCmd.target_id, 0, 0, -1, pCmd.attack_flag, pCmd.speed* 50);
if (!m_pEPWorkMan.FindWork(CECEPWorkMan.Work_type.WT_NORMAL, CECEPWork.EP_work_ID.WORK_HACKOBJECT)){
m_pEPWorkMan.StartNormalWork(new CECEPWorkMelee(m_pEPWorkMan, pCmd.target_id));
}
// Enter fight state
EnterFightState();
}
// Play an attack effect
//void PlayAttackEffect(int idTarget, int idSkill, int skillLevel, int nDamage,
// uint dwModifier, int nAttackSpeed, int[] piAttackTime/* NULL */, int nSection)
//{
// if (!IsAllResReady())
// return;
// if (idSkill == 0)
// {
// int idWeapon = IsShapeChanged() ? 0 : GetWeaponID();
// int nTimeFly = 10;
// if (idWeapon != 0)
// {
// // ¿´¿´ÊDz»ÊÇÔ¶³ÌÎäÆ÷
// DATA_TYPE dt;
// WEAPON_ESSENCE pWeapon = (WEAPON_ESSENCE)g_pGame.GetElementDataMan().get_data_ptr(idWeapon, ID_SPACE_ESSENCE, dt);
// //ASSERT(dt == DT_WEAPON_ESSENCE);
// if (dt == DT_WEAPON_ESSENCE && pWeapon && pWeapon.require_projectile)
// {
// nTimeFly = 700;
// if (m_aEquips[EQUIPIVTR_PROJECTILE])
// idWeapon = m_aEquips[EQUIPIVTR_PROJECTILE]; // set weapon to the projectile
// }
// }
// if (g_pGame.GetGameRun().GetWorld().GetAttacksMan().FindAttackByAttacker(GetPlayerInfo().cid))
// {
// // signal early attack event
// ClearComActFlagAllRankNodes(true);
// }
// // melee attack
// CECAttackEvent pAttack = g_pGame.GetGameRun().GetWorld().GetAttacksMan().AddMeleeAttack(
// GetPlayerInfo().cid, idTarget, idWeapon, dwModifier, nDamage, nTimeFly);
// if (pAttack != null)
// {
// if (!IsDead() && (dwModifier & CECAttackEvent::MOD_RETORT) == 0
// && (dwModifier & CECAttackEvent::MOD_ATTACK_AURA) == 0
// && PlayAttackAction(nAttackSpeed, piAttackTime, &pAttack.m_bSignaled)
// && (dwModifier & CECAttackEvent::MOD_BEAT_BACK) == 0)
// {
// }
// else
// {
// pAttack.m_bSignaled = true;
// }
// }
// }
// else
// {
// if (skillLevel == 0)
// {
// if (m_pCurSkill)
// skillLevel = m_pCurSkill.GetSkillLevel();
// else
// skillLevel = 1;
// }
// CECAttackEvent pAttack = null;
// // first try to find if there is already a skill attack event in attackman
// CECAttackerEvents attackerEvents = g_pGame.GetGameRun().GetWorld().GetAttacksMan().FindAttackByAttacker(GetPlayerInfo().cid);
// if (attackerEvents)
// {
// CECAttackEvent pAttack = attackerEvents.Find(idSkill, nSection);
// if (() != null)
// {
// // Ãæ¹¥»÷µÄ·ÇµÚÒ»´ÎÉ˺¦ÏûÏ¢
// pAttack.AddTarget(idTarget, dwModifier, nDamage);
// goto EXIT;
// }
// else
// {
// attackerEvents.Signal();
// }
// }
// if (GNET::ElementSkill::IsGoblinSkill(idSkill) &&
// GNET::ElementSkill::GetType(idSkill) == 2)
// {
// pAttack = g_pGame.GetGameRun().GetWorld().GetAttacksMan().AddSkillAttack(
// GetPlayerInfo().cid, GetPlayerInfo().cid, idTarget, GetWeaponID(), idSkill, skillLevel, dwModifier, nDamage);
// }
// else
// {
// // begin a skill attack
// pAttack = g_pGame.GetGameRun().GetWorld().GetAttacksMan().AddSkillAttack(
// GetPlayerInfo().cid, m_idCurSkillTarget, idTarget, GetWeaponID(), idSkill, skillLevel, dwModifier, nDamage);
// }
// if (pAttack)
// {
// pAttack.SetSkillSection(nSection);
// if (!IsDead() && (dwModifier & CECAttackEvent::MOD_RETORT) == 0
// && (dwModifier & CECAttackEvent::MOD_ATTACK_AURA) == 0
// && PlaySkillAttackAction(idSkill, nAttackSpeed, NULL, nSection, &pAttack.m_bSignaled)
// && (dwModifier & CECAttackEvent::MOD_BEAT_BACK) == 0)
// {
// }
// else
// {
// pAttack.m_bSignaled = true;
// }
// }
// EXIT:
// // For skill attacking, time is always set to 0
// if (piAttackTime)
// *piAttackTime = 0;
// }
//}
//public A3DVECTOR3 GetPos()
//{
// return new A3DVECTOR3(transform.position.x, transform.position.y, transform.position.z);