diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs new file mode 100644 index 0000000000..fcc9d97884 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs @@ -0,0 +1,714 @@ +using CSNetwork.GPDataType; +using PerfectWorld.Scripts.Player; +using System; + +namespace BrewMonster.Scripts +{ + using WorkList = System.Collections.Generic.List; + + 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; + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs.meta new file mode 100644 index 0000000000..27becec87a --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_EPWork.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9352b9911dad2d541b975297dcefa8d2 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs index 0648b0ed31..b2d1402019 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_ManPlayer.cs @@ -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((byte[])msg.dwParam1); + cid = pCmdAtk.attacker_id; + break; // 鈿狅笍 C谩c case kh谩c c农ng t瓢啤ng t峄, ch峄 vi峄嘽 l岷 ra 膽煤ng tr瓢峄漬g id / caster / user ... // Do qu谩 d脿i n锚n b岷 c贸 th峄 copy d岷 t峄玭g 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; } diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index e2db7b89b2..2f60537088 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -1,5 +1,4 @@ using Animancer; -using Animancer.Editor; using BrewMonster; using BrewMonster.Managers; using BrewMonster.Scripts.Managers; diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index f2ac064021..255b59ce30 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -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(pDataBuf); - BMLogger.LogError($"OBJECT_ATTACK_RESULT: npc ? " + ISNPCID(id)); + //int id = GPDataTypeHelper.FromBytes(pDataBuf); + cmd_object_atk_result pCmdAtk = GPDataTypeHelper.FromBytes(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: diff --git a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs index bc6299bed4..ed6c7af21d 100644 --- a/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/EC_ElsePlayer.cs @@ -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((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) + // { + // // 驴麓驴麓脢脟虏禄脢脟脭露鲁脤脦盲脝梅 + // 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);