diff --git a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll index 11e4b9b7ae..954036144e 100644 Binary files a/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll and b/Assets/NetworkLib/Debug/netstandard2.1/CSNetwork.dll differ diff --git a/Assets/PerfectWorld/Scripts/Common/CECObject.cs b/Assets/PerfectWorld/Scripts/Common/CECObject.cs index 8a05d8a83f..d67bce471d 100644 --- a/Assets/PerfectWorld/Scripts/Common/CECObject.cs +++ b/Assets/PerfectWorld/Scripts/Common/CECObject.cs @@ -1,3 +1,4 @@ +using CSNetwork.GPDataType; using UnityEngine; public class CECObject : MonoBehaviour @@ -39,4 +40,10 @@ public class CECObject : MonoBehaviour MOVEENV_WATER, MOVEENV_AIR, } + protected void TurnFaceTo(int idTarget, float dwTime) + { + // Face to target + A3DVECTOR3 vTarget; + + } } \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs index 21717cb448..33def69a3f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs @@ -32,11 +32,34 @@ public class CECNPCMan : CECObject, IMsgHandler case long value when value == EC_MsgDef.MSG_NM_NPCINFO: OnMsgNPCInfo(Msg); break; case long value when value == EC_MsgDef.MSG_NM_NPCMOVE: OnMsgNPCMove(Msg); break; case long value when value == EC_MsgDef.MSG_NM_NPCSTOPMOVE: OnMsgNPCStopMove(Msg); break; + case long value when value == EC_MsgDef. MSG_NM_NPCATKRESULT : TransmitMessage(Msg); break; } } return true; } + private bool TransmitMessage(ECMSG msg) + { + int nid = 0; + switch (msg.dwMsg) + { + case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT: + + nid = ((cmd_object_atk_result )msg.dwParam1).attacker_id; + break; + default: + return false; + } + CECNPC pNPC = SeekOutNPC(nid); + if (pNPC) + pNPC.ProcessMessage(msg); + else + { + + } + return true; + } + private bool OnMsgNPCStopMove(ECMSG msg) { cmd_object_stop_move pCmd = EC_Utility.ByteArrayToStructure((byte[])msg.dwParam1); diff --git a/Assets/PerfectWorld/Scripts/NPC/CECMonster.cs b/Assets/PerfectWorld/Scripts/NPC/CECMonster.cs index 10e90b4b99..a1f7ed3433 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECMonster.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECMonster.cs @@ -48,4 +48,5 @@ public class CECMonster : CECNPC StartWork((int)WorkType.WT_NOTHING, (int)WorkID.WORK_STAND); return true; } + public MONSTER_ESSENCE GetDBEssence() { return m_pDBEssence; } } diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index fcc0a6ecf7..3db4c9a8cc 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -1,12 +1,13 @@ -using CSNetwork.GPDataType; -using System.Text; +using BrewMonster; +using CSNetwork; +using CSNetwork.GPDataType; +using ModelRenderer.Scripts.Common; using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; using UnityEditor.Rendering; using UnityEngine; -using BrewMonster; -using CSNetwork; -using ModelRenderer.Scripts.Common; -using System.IO; public class CECNPC : CECObject { @@ -32,7 +33,9 @@ public class CECNPC : CECObject protected int m_iAction; protected int m_idSelTarget; protected int m_iCurWorkType; + protected int m_nFightTimeLeft; protected int m_iCurWork; + protected int m_idAttackTarget; protected int m_DisappearCnt; protected bool m_bAboutToDie; protected Vector3 m_vStopDir; @@ -145,6 +148,54 @@ public class CECNPC : CECObject return true; } + public bool ProcessMessage(ECMSG Msg) + { + switch (Msg.dwMsg) + { + case long value when value == EC_MsgDef.MSG_NM_NPCATKRESULT: OnMsgNPCAtkResult(Msg); break; + } + return true; + } + + private void OnMsgNPCAtkResult(ECMSG msg) + { + cmd_object_atk_result pCmd = MemoryMarshal.Read( + ((byte[])msg.dwParam1).AsSpan()); + + if (true) + { + // Face to target + NPCTurnFaceTo(pCmd.target_id, Time.deltaTime); + m_idAttackTarget = pCmd.target_id; + + // now start a fight work + if (IsMonsterNPC()) + { + CECMonster pMonster = (CECMonster)this; + MONSTER_ESSENCE pMonsterEssence = pMonster.GetDBEssence(); + StartWork((int)WorkType.WT_NORMAL, (int)WorkID.WORK_FIGHT, (uint)(pMonsterEssence.attack_speed * 1000)); + } + } + //TODO: Hiệu ứng đánh + //PlayAttackEffect(pCmd->target_id, 0, 0, iDamage, pCmd->attack_flag, pCmd->speed * 50); + } + void NPCTurnFaceTo(int idTarget, float dwTime) + { + if (IsDirFixed()) + { + return; + } + + // tower in war can not turn face to. + if (IsMonsterNPC()) + { + int role_in_war = (int)((CECMonster)this).GetDBEssence().role_in_war; + if (role_in_war == 2 || role_in_war == 5) + return; + } + + TurnFaceTo(idTarget, dwTime); + } private void Update() { switch (m_iCurWork) @@ -268,7 +319,7 @@ public class CECNPC : CECObject { // Note: below judge can prevent many problems when we attempt to // finish a work but don't assure we are doing this work - BrewMonster.BMLogger.Log("HoangDev : WorkFinished :"+ iWorkID); + BrewMonster.BMLogger.Log("HoangDev : WorkFinished :" + iWorkID); if (m_iCurWork != iWorkID) return; @@ -581,7 +632,7 @@ public class CECNPC : CECObject public bool IsDirFixed() { return (m_dwStates & PlayerNPCState.GP_STATE_NPC_FIXDIR) != 0 ? true : false; } public void ReleaseWork(int iWorkType) { - BrewMonster.BMLogger.LogError("HoangDev : ReleaseWorkl :"+ iWorkType); + BrewMonster.BMLogger.LogError("HoangDev : ReleaseWorkl :" + iWorkType); Debug.Assert(iWorkType >= 0 && iWorkType < (int)WorkType.NUM_WORKTYPE); switch (m_aWorks[iWorkType]) @@ -724,9 +775,14 @@ public class CECNPC : CECObject public void StartWork_Fight(uint dwParam) { + m_nFightTimeLeft = (int)dwParam; + + BMLogger.LogError("HoangDev: StartWork_Fight"); // dwParam được dùng như “thời gian chiến đấu còn lại” //m_nFightTimeLeft = (int)dwParam; // Không play animation ở đây vì animation được điều khiển bởi message tấn công + + } public void StartWork_Spell(uint dwParam) diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index fb34944012..8712fd74e0 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -91,6 +91,7 @@ namespace BrewMonster.Network public void c2s_CmdPlayerMove(in Vector3 vCurPos, in Vector3 vDest, int iTime, float fSpeed, int iMoveMode, ushort wStamp) { + BMLogger.LogError($"SendMoveCmd:"); Instance._gameSession.c2s_CmdPlayerMove(EC_Utility.ToNumerics(vCurPos), EC_Utility.ToNumerics(vDest), iTime, fSpeed, iMoveMode, wStamp); } protected override void Initialize() diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs index 69e41729c5..f7dd7cf7f0 100644 --- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs +++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs @@ -49,7 +49,7 @@ namespace BrewMonster.UI #if UNITY_EDITOR if (Input.GetKeyUp(KeyCode.LeftAlt)) { - _usernameInputField.text = "test004"; + _usernameInputField.text = "test002"; _passwordInputField.text = "123456"; } #endif diff --git a/Assets/Scripts/Move/CECHostMove.cs b/Assets/Scripts/Move/CECHostMove.cs index 68b8bf4c77..706c6293ea 100644 --- a/Assets/Scripts/Move/CECHostMove.cs +++ b/Assets/Scripts/Move/CECHostMove.cs @@ -8,6 +8,7 @@ using System.Text; using UnityEngine; using CSNetwork.Protocols; using CSNetwork; +using BrewMonster; public class CECHostMove {