diff --git a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs index a1607d9a21..9b716a501a 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECNPCMan.cs @@ -178,6 +178,10 @@ public class CECNPCMan : CECObject, IMsgHandler // Tạo NPC mới npc = CreateNPC(Info, bBornInSight, packet, infoOffset); + if(npc != null) + { + npc.SetUpCECNPC(this); + } if (object.ReferenceEquals(npc, null)) { BrewMonster.BMLogger.LogError($"Failed to create NPC ({Info.tid})"); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 12da223e03..b603c779c4 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Security.Cryptography; using Unity.VisualScripting; using WorkList = System.Collections.Generic.List; @@ -185,7 +186,7 @@ public class CECHPWorkMan } private CECHostPlayer m_pHost; - private WorkList[] m_WorkStack = new WorkList[Work_priority.NUM_PRIORITY]; + private WorkList[] m_WorkStack = new WorkList[Work_priority.NUM_PRIORITY] { new List(), new List(), new List() }; private int m_iCurPriority; private DELAYWORK m_Delayed; private CECHPWorkPostTickCommand m_pPostTickCommand; @@ -230,13 +231,16 @@ public class CECHPWorkMan for (int i = (Work_priority.NUM_PRIORITY - 1); i >= 0; --i) { WorkList workList = m_WorkStack[i]; - for (int j = 0; j < workList.Count; ++j) + if(workList != null) { - CECHPWork pWork = workList[j]; - if (matcher.Match(pWork, i, false)) + for (int j = 0; j < workList.Count; ++j) { - result = pWork; - break; + CECHPWork pWork = workList[j]; + if (matcher.Match(pWork, i, false)) + { + result = pWork; + break; + } } } } @@ -534,11 +538,14 @@ public class CECHPWorkMan return true; } WorkList workList = m_WorkStack[iPriority]; - for (int i = 0; i < workList.Count; ++i) + if(workList != null) { - if (!workList[i].CanTransferTo(CECHPWork.GetWorkMask(iWorkID))) + for (int i = 0; i < workList.Count; ++i) { - return false; + if (!workList[i].CanTransferTo(CECHPWork.GetWorkMask(iWorkID))) + { + return false; + } } } return true; @@ -546,7 +553,7 @@ public class CECHPWorkMan bool HasWorkOnPriority(int iPriority) { - return ValidatePriority(iPriority) && m_WorkStack[iPriority].Count != 0; + return ValidatePriority(iPriority) && m_WorkStack[iPriority] != null && m_WorkStack[iPriority].Count != 0; } public void SetPostTickCommand(CECHPWorkPostTickCommand command) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs index 713bd01136..126b9e1c93 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs @@ -98,10 +98,10 @@ class CECHPWorkMelee : CECHPWork 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)); + pWork.SetTraceTarget(pWork.CreatTraceTarget(idTraceTarget, CECHPWorkTrace.Trace_reason.TRACE_ATTACK)); m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickCommand1(pWork)); return true; - } + } return true; } // Reset work @@ -113,43 +113,43 @@ class CECHPWorkMelee : CECHPWork m_iIdleTime = 0; m_iIdleTimeCnt = 0; } -// Copy work data -public virtual bool CopyData(CECHPWork pWork) -{ - if (!base.CopyData(pWork)) - return false; + // Copy work data + public virtual bool CopyData(CECHPWork pWork) + { + if (!base.CopyData(pWork)) + return false; - CECHPWorkMelee pSrc = (CECHPWorkMelee)pWork; + CECHPWorkMelee pSrc = (CECHPWorkMelee)pWork; - m_idTarget = pSrc.m_idTarget; - m_iIdleTime = pSrc.m_iIdleTime; - m_iIdleTimeCnt = pSrc.m_iIdleTimeCnt; + m_idTarget = pSrc.m_idTarget; + m_iIdleTime = pSrc.m_iIdleTime; + m_iIdleTimeCnt = pSrc.m_iIdleTimeCnt; - return true; -} -public virtual void Cancel() -{ - // TO DO: fix later - //m_pHost.TurnFaceTo(0); -} + return true; + } + public virtual void Cancel() + { + // TO DO: fix later + //m_pHost.TurnFaceTo(0); + } -// Get attack target -public int GetTarget() { return m_idTarget; } -// Set idle time -public void SetIdleTime(int iTime) -{ - m_iIdleTime = iTime; - m_iIdleTimeCnt = 0; -} -// Get idle time -public int GetIdleTime() { return m_iIdleTime; } + // Get attack target + public int GetTarget() { return m_idTarget; } + // Set idle time + public void SetIdleTime(int iTime) + { + m_iIdleTime = iTime; + m_iIdleTimeCnt = 0; + } + // Get idle time + public int GetIdleTime() { return m_iIdleTime; } -// On first tick -protected virtual void OnFirstTick() -{ - m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; - m_pHost.PlayAction((int)EC_Player.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false); + // On first tick + protected virtual void OnFirstTick() + { + m_pHost.m_iMoveMode = (int)MoveMode.MOVE_STAND; + m_pHost.PlayAction((int)EC_Player.PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3), true, 200, false); - m_idTarget = m_pHost.m_idSelTarget; -} + m_idTarget = m_pHost.m_idSelTarget; + } }; diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs index c53e8054de..5b57c77e9c 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPC.cs @@ -581,7 +581,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]) @@ -803,7 +803,7 @@ public class CECNPC : CECObject public bool IsDead(){ return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; } public void PlayMoveAction(int iMoveMode) { - BrewMonster.BMLogger.LogError($"HoangDev: PlayMoveAction {iMoveMode}"); + //BrewMonster.BMLogger.LogError($"HoangDev: PlayMoveAction {iMoveMode}"); // Play run or walk aciton if (iMoveMode == (int)GPMoveMode.GP_MOVE_RUN || iMoveMode == (int)GPMoveMode.GP_MOVE_RETURN) { diff --git a/Assets/Prefabs/MonsterPrefab.prefab b/Assets/Prefabs/MonsterPrefab.prefab index f535588507..89362a78fe 100644 --- a/Assets/Prefabs/MonsterPrefab.prefab +++ b/Assets/Prefabs/MonsterPrefab.prefab @@ -12,6 +12,7 @@ GameObject: - component: {fileID: 2542060226037108388} - component: {fileID: -3520322077839857420} - component: {fileID: -2400324395862947468} + - component: {fileID: 8595541918946480801} m_Layer: 0 m_Name: MonsterPrefab m_TagString: Untagged @@ -86,3 +87,24 @@ CharacterController: m_SkinWidth: 0.08 m_MinMoveDistance: 0.001 m_Center: {x: 0, y: 0, z: 0} +--- !u!65 &8595541918946480801 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6975799234359536760} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 2, y: 2, z: 2} + m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 96adbccb93..36d8e4e249 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -12,6 +12,7 @@ using System.IO; using System.Runtime.InteropServices; using System.Text; using TMPro; +using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; @@ -70,6 +71,7 @@ public class CECHostPlayer : EC_Player // cache tùy chọn (không bắt buộc) float ccRadius, ccSkin; RaycastHit lastGroundHit; + Camera mainCam; private void Awake() { @@ -99,6 +101,11 @@ public class CECHostPlayer : EC_Player } private void Start() { + mainCam = Camera.main; + if (mainCam == null) + { + mainCam = FindFirstObjectByType(); + } _playerStateMachine.InitState(_idleState); // btnJump.onClick.AddListener(HandleJump); } @@ -111,6 +118,90 @@ public class CECHostPlayer : EC_Player // ccRadius = controller.radius; ccSkin = controller.skinWidth; _playerStateMachine.UpdateState(); + + if (Input.GetMouseButtonDown(1) && mainCam != null) + { + int idTraceTarget = 0, idSelTarget = 0; + bool bForceAttack = false; + int iTraceReason = CECHPWorkTrace.Trace_reason.TRACE_NONE; + bool bWikiMonster = false; + + Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + + if (Physics.Raycast(ray, out hit)) + { + CECObject clickedObject = hit.collider.gameObject.GetComponent(); + + if(clickedObject != null) + { + int idObject = CECObject.GetObjectID(clickedObject); + if (idObject != 0) + { + CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(idObject); + if(pNPC != null) + { + if (!pNPC.IsDead()) + { + idTraceTarget = idObject; + } + if (idTraceTarget != 0) + { + if (AttackableJudge(idObject, bForceAttack) == 1) + iTraceReason = CECHPWorkTrace.Trace_reason.TRACE_ATTACK; + else if (pNPC.IsServerNPC()) + { + if (!IsInBattle() || InSameBattleCamp(pNPC)) + iTraceReason = CECHPWorkTrace.Trace_reason.TRACE_TALK; + } + } + } + } + } + } + + if (idTraceTarget != 0) + { + //if (m_pWorkMan.IsSitting()) + //{ + // g_pGame.GetGameSession().c2s_CmdStandUp(); + // return; + //} + // Trace a object + if (iTraceReason == CECHPWorkTrace.Trace_reason.TRACE_ATTACK) + { + //if (!CanDo(CANDO_MELEE)) + // return; + Debug.LogError("Attack"); + NormalAttackObject(idTraceTarget, bForceAttack); + } + //else + //{ + // if (!CanDo(CANDO_MOVETO)) + // return; + + // if (iTraceReason == CECHPWorkTrace::TRACE_PICKUP) + // { + // PickupObject(idTraceTarget, false); + // } + // else if (iTraceReason == CECHPWorkTrace::TRACE_GATHER) + // { + // PickupObject(idTraceTarget, true); + // } + // else if (CECHPWork * pWork = m_pWorkMan.GetWork(CECHPWork::WORK_TRACEOBJECT)) + // { + // CECHPWorkTrace* pWorkTrace = dynamic_cast(pWork); + // pWorkTrace.SetTraceTarget(pWorkTrace.CreatTraceTarget(idTraceTarget, iTraceReason, bForceAttack)); + // } + // else if (m_pWorkMan.CanStartWork(CECHPWork::WORK_TRACEOBJECT) && !bWikiMonster) + // { + // CECHPWorkTrace* pWork = (CECHPWorkTrace*)m_pWorkMan.CreateWork(CECHPWork::WORK_TRACEOBJECT); + // pWork.SetTraceTarget(pWork.CreatTraceTarget(idTraceTarget, iTraceReason, bForceAttack)); + // m_pWorkMan.StartWork_p1(pWork); + // } + //} + } + } } public void StopMovement() { @@ -229,7 +320,7 @@ public class CECHostPlayer : EC_Player case int value when value == EC_MsgDef.MSG_HST_TASKDATA: { OnMsgHstTaskData(Msg); - Debug.LogError("[Dat]- OnMsgHstTaskData"); + //Debug.LogError("[Dat]- OnMsgHstTaskData"); break; } case int value when value == EC_MsgDef.MSG_HST_ITEMOPERATION: @@ -837,7 +928,7 @@ public class CECHostPlayer : EC_Player //{ // if (m_pPrepSkill) // { - // float fRange = m_pPrepSkill->GetCastRange(m_ExtProps.ak.AttackRange, GetPrayDistancePlus()); + // float fRange = m_pPrepSkill.GetCastRange(m_ExtProps.ak.AttackRange, GetPrayDistancePlus()); // if (fRange > 0.0f) // { // if (fDist - fTargetRad <= fRange) @@ -911,12 +1002,12 @@ public class CECHostPlayer : EC_Player // while (true) // { // if (!IsUnderWater()) break; - // //CECWorld* pWorld = g_pGame->GetGameRun()->GetWorld(); + // //CECWorld* pWorld = g_pGame.GetGameRun().GetWorld(); // //if (!pWorld) break; // const A3DVECTOR3 vPos = GetPos(); - // float fTerrainHeight = pWorld->GetTerrainHeight(vPos); - // float fWaterHeight = pWorld->GetWaterHeight(vPos); + // float fTerrainHeight = pWorld.GetTerrainHeight(vPos); + // float fWaterHeight = pWorld.GetWaterHeight(vPos); // if (fWaterHeight <= fTerrainHeight) break; // float fBorderLine = fWaterHeight - 2.0f;