Merge remote-tracking branch 'origin/develop' into feature/movement

# Conflicts:
#	Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMelee.cs
#	Assets/PerfectWorld/Scripts/NPC/CECNPC.cs
This commit is contained in:
VDH
2025-10-09 17:00:48 +07:00
6 changed files with 176 additions and 52 deletions
@@ -299,6 +299,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})");
@@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.Security.Cryptography;
using Unity.VisualScripting;
using WorkList = System.Collections.Generic.List<CECHPWork>;
@@ -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<CECHPWork>(), new List<CECHPWork>(), new List<CECHPWork>() };
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)
@@ -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)CECPlayer.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;
}
};
+2 -2
View File
@@ -693,7 +693,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])
@@ -917,7 +917,7 @@ public class CECNPC : CECObject
public bool IsPetNPC() { return (int)Class_ID.OCID_PET == m_iCID; }
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)
{
+22
View File
@@ -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}
+96 -5
View File
@@ -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 : CECPlayer
// 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 : CECPlayer
}
private void Start()
{
mainCam = Camera.main;
if (mainCam == null)
{
mainCam = FindFirstObjectByType<Camera>();
}
_playerStateMachine.InitState(_idleState);
// btnJump.onClick.AddListener(HandleJump);
}
@@ -111,6 +118,90 @@ public class CECHostPlayer : CECPlayer
// 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<CECObject>();
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<CECHPWorkTrace*>(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 : CECPlayer
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:
@@ -866,7 +957,7 @@ public class CECHostPlayer : CECPlayer
//{
// 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)
@@ -940,12 +1031,12 @@ public class CECHostPlayer : CECPlayer
// 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;