fix: update attack normal.

This commit is contained in:
Tungdv
2025-10-07 18:13:30 +07:00
parent 9c2b5b87f3
commit ee618bc38e
13 changed files with 276 additions and 99 deletions
Binary file not shown.
+40 -40
View File
@@ -1,42 +1,42 @@
using UnityEngine;
//using UnityEngine;
public class CECObject : MonoBehaviour
{
protected uint m_dwBornStamp;
protected bool m_bBornInSight;
protected bool m_bSelectable;
protected int m_iCID;
//public class CECObject : MonoBehaviour
//{
// protected uint m_dwBornStamp;
// protected bool m_bBornInSight;
// protected bool m_bSelectable;
// protected int m_iCID;
public virtual void SetUpCECObject()
{
m_dwBornStamp = 0;
m_bBornInSight = false;
m_bSelectable = false;
m_iCID = (int)ClassID.OCID_OBJECT;
}
public void SetBornStamp(uint dwStamp) { m_dwBornStamp = dwStamp; }
public void SetBornInSight(bool bFlag) { m_bBornInSight = bFlag; }
public void SetSelectable(bool bSelectable) { m_bSelectable = bSelectable; }
public enum ClassID
{
OCID_OBJECT = 0,
OCID_PLAYER,
OCID_HOSTPLAYER,
OCID_ELSEPLAYER,
OCID_LOGINPLAYER,
OCID_NPC,
OCID_MONSTER,
OCID_SERVER,
OCID_MATTER,
OCID_PET,
OCID_CLONED_PLAYER, // 复制角色模型
OCID_HOST_NAVIGATER, // 纯客户端player类,用于强制移动
OCID_NPCCLONED_MASTER, // NPC 复制的角色模型
};
public enum EnviromentMoveType
{
MOVEENV_GROUND = 0, // Move on ground
MOVEENV_WATER,
MOVEENV_AIR,
}
}
// public virtual void SetUpCECObject()
// {
// m_dwBornStamp = 0;
// m_bBornInSight = false;
// m_bSelectable = false;
// m_iCID = (int)ClassID.OCID_OBJECT;
// }
// public void SetBornStamp(uint dwStamp) { m_dwBornStamp = dwStamp; }
// public void SetBornInSight(bool bFlag) { m_bBornInSight = bFlag; }
// public void SetSelectable(bool bSelectable) { m_bSelectable = bSelectable; }
// public enum ClassID
// {
// OCID_OBJECT = 0,
// OCID_PLAYER,
// OCID_HOSTPLAYER,
// OCID_ELSEPLAYER,
// OCID_LOGINPLAYER,
// OCID_NPC,
// OCID_MONSTER,
// OCID_SERVER,
// OCID_MATTER,
// OCID_PET,
// OCID_CLONED_PLAYER, // 复制角色模型
// OCID_HOST_NAVIGATER, // 纯客户端player类,用于强制移动
// OCID_NPCCLONED_MASTER, // NPC 复制的角色模型
// };
// public enum EnviromentMoveType
// {
// MOVEENV_GROUND = 0, // Move on ground
// MOVEENV_WATER,
// MOVEENV_AIR,
// }
//}
@@ -7,9 +7,6 @@ using System.Buffers.Binary;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.LightTransport;
using static CECNPC;
using static CECObject;
public class CECNPCMan : CECObject, IMsgHandler
{
@@ -21,7 +18,7 @@ public class CECNPCMan : CECObject, IMsgHandler
public CECNPCMan()
{
m_vServerPos = Vector3.zero;
m_iCID = (int)ClassID.OCID_MONSTER;
m_iCID = (int)Class_ID.OCID_MONSTER;
}
public bool ProcessMessage(ECMSG Msg)
{
@@ -1,6 +1,3 @@
using DG.Tweening;
using System.Collections.Generic;
using UnityEngine;
using WorkList = System.Collections.Generic.List<CECHPWork>;
public class CECHPWork : CECObjectWork
@@ -423,36 +420,71 @@ public class CECHPWorkMan
}
}
void CancelWork(CECHPWork pWork)
public void CancelWork(CECHPWork pWork)
{
}
void CancelWorkAtPriority(int iPriority)
public void CancelWorkAtPriority(int iPriority)
{
}
bool DelayWork(int iPriority, CECHPWork pWork)
public bool DelayWork(int iPriority, CECHPWork pWork)
{
return false;
}
void StartDelayedWork()
public void StartDelayedWork()
{
}
void ClearDelayedWork()
public void ClearDelayedWork()
{
}
CECHPWork GetDelayedWork()
public CECHPWork GetDelayedWork()
{
return m_Delayed.pWork;
}
bool ValidatePriority(int iPriority)
public bool ValidatePriority(int iPriority)
{
return iPriority >= 0 && iPriority < Work_priority.NUM_PRIORITY;
}
public bool StartWork(int iPriority, CECHPWork pWork, bool bNoDelay = false)
{
//if (!pWork)
//{
// ASSERT(false);
// return false;
//}
//if (!ValidatePriority(iPriority))
//{
// ASSERT(false);
// delete pWork;
// return false;
//}
//if (pWork->GetWorkID() == CECHPWork::WORK_TRACEOBJECT)
//{
// if (g_pGame->GetGameRun()->GetHostInputFilter()->IsMoveUsagePressed())
// {
// CECHPWorkTrace* pWorkTrace = dynamic_cast<CECHPWorkTrace*>(pWork);
// if (!pWorkTrace->CanTouch())
// { // 2014-8-16 当还在通过键盘操纵移动时、有条件忽略 CECHPWorkTrace,
// delete pWorkTrace; // 否则会因 CECHPWorkTrace 中临时转向目标位置、而后又被键盘操纵调整移动方向导致方向瞬间抖动
// return false; // 当 CECHPWorkTrace 中目标可立即接触时,不忽略 CECHPWorkTrace,以实现键盘控制移动中、对某怪应用技能时,立刻转向怪施放技能
// }
// }
//}
//if (!bNoDelay && DelayWork(iPriority, pWork))
//{
// return true;
//}
//return InternallyStartWork(iPriority, pWork);
}
public bool StartWork_p0(CECHPWork pWork, bool bNoDelay = false) { return StartWork(Work_priority.PRIORITY_0, pWork, bNoDelay); }
public bool StartWork_p1(CECHPWork pWork, bool bNoDelay = false) { return StartWork(Work_priority.PRIORITY_1, pWork, bNoDelay); }
public bool StartWork_p2(CECHPWork pWork, bool bNoDelay = false) { return StartWork(Work_priority.PRIORITY_2, pWork, bNoDelay); }
}
public abstract class CECHPWorkPostTickCommand
@@ -485,4 +517,47 @@ public class CECHPWorkGeneralMatcher : CECHPWorkMatcher
m_priority = priority;
m_matchDelayedWork = bIncludeDelayedWork;
}
}
}
public class CECHPWorkPostTickRunWorkCommand : CECHPWorkPostTickCommand
{
CECHPWork m_pWork;
int m_iPriority;
bool m_bNoDelay;
bool m_bShouldTick;
uint m_dwTickTime;
// Constructor
public CECHPWorkPostTickRunWorkCommand(
CECHPWork pWork,
bool bNoDelay = false,
int iPriority = CECHPWorkMan.Work_priority.PRIORITY_1,
bool bShouldTick = false,
uint dwTickTime = 0)
{
m_pWork = pWork;
m_bNoDelay = bNoDelay;
m_iPriority = iPriority;
m_bShouldTick = bShouldTick;
m_dwTickTime = dwTickTime;
}
public override bool Run(CECHPWorkMan pWorkMan)
{
if (m_pWork == null || pWorkMan == null)
{
return false;
}
if (!pWorkMan.StartWork(m_iPriority, m_pWork, m_bNoDelay))
{
m_pWork = null;
return false;
}
if (m_bShouldTick)
{
m_pWork.Tick(m_dwTickTime);
}
m_pWork = null;
return true;
}
};
@@ -1,5 +1,6 @@
using BrewMonster;
using CSNetwork.GPDataType;
using PerfectWorld.Scripts.Managers;
using PerfectWorld.Scripts.Player;
using UnityEngine;
@@ -68,7 +69,7 @@ class CECHPWorkMelee : CECHPWork
}
else if (GPDataTypeHelper.ISNPCID(m_idTarget))
{
CECNPC pNPC = g_pGame.GetGameRun().GetWorld().GetNPCMan().GetNPC(m_idTarget);
CECNPC pNPC = EC_ManMessageMono.Instance._CECNPCMan.GetNPC(m_idTarget);
if (!pNPC || pNPC.IsDead()) // Taget has missed ?
return true;
@@ -8,7 +8,7 @@ using UnityEngine;
//
///////////////////////////////////////////////////////////////////////////
class CECObject : MonoBehaviour
public class CECObject : MonoBehaviour
{
// Class ID
public static class Class_ID
@@ -60,8 +60,18 @@ class CECObject : MonoBehaviour
m_bSelectable = true;
}
// Tick routine
public bool Tick(float dwDeltaTime)
public virtual void SetUpCECObject()
{
m_dwBornStamp = 0;
m_bBornInSight = false;
m_bSelectable = false;
m_iCID = (int)Class_ID.OCID_OBJECT;
}
public void SetSelectable(bool bSelectable) { m_bSelectable = bSelectable; }
// Tick routine
public bool Tick(float dwDeltaTime)
{
if (m_bAdjustOrient)
AdjustOrientation(dwDeltaTime);
@@ -129,7 +139,7 @@ class CECObject : MonoBehaviour
return v / mag;
}
private A3DVECTOR3 GetPos()
public A3DVECTOR3 GetPos()
{
return new A3DVECTOR3(transform.position.x, transform.position.y, transform.position.z);
}
@@ -202,7 +212,6 @@ class CECObject : MonoBehaviour
{
}
public void SetSelectable(bool bSelectable) { m_bSelectable = bSelectable; }
protected void AdjustOrientation(float dwDeltaTime)
{
@@ -0,0 +1,6 @@
using UnityEngine;
public class EC_RoleTypes
{
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 2a00af48d21485d46bf5bae22e8b09f9
+11 -8
View File
@@ -1,7 +1,6 @@
using CSNetwork.GPDataType;
using System.Text;
using System;
using UnityEditor.Rendering;
using UnityEngine;
using BrewMonster;
using CSNetwork;
@@ -22,7 +21,7 @@ public class CECNPC : CECObject
protected float m_fDistToHost;
protected float m_fDistToHostH;
protected OtherPlayer_Move_Info m_cdr;
protected float m_fTouchRad;
protected float m_fTouchRad = 1f;
protected ROLEBASICPROP m_BasicProps;
protected Vector3 m_vMoveDir;
protected int m_iPassiveMove;
@@ -48,7 +47,7 @@ public class CECNPC : CECObject
{
base.SetUpCECObject();
m_vServerPos = new Vector3();
m_iCID = (int)ClassID.OCID_NPC;
m_iCID = (int)Class_ID.OCID_NPC;
}
public virtual bool Init(int tid, in info_npc info, ReadOnlySpan<byte> packet, int infoOffset)
{
@@ -73,9 +72,9 @@ public class CECNPC : CECObject
_characterController = GetComponent<CharacterController>();
m_iMoveEnv = (int)((info.state & PlayerNPCState.GP_STATE_NPC_FLY) != 0 ? EnviromentMoveType.MOVEENV_AIR
: (info.state & PlayerNPCState.GP_STATE_NPC_SWIM) != 0 ? EnviromentMoveType.MOVEENV_WATER
: EnviromentMoveType.MOVEENV_GROUND);
m_iMoveEnv = (int)((info.state & PlayerNPCState.GP_STATE_NPC_FLY) != 0 ? Move_environment.MOVEENV_AIR
: (info.state & PlayerNPCState.GP_STATE_NPC_SWIM) != 0 ? Move_environment.MOVEENV_WATER
: Move_environment.MOVEENV_GROUND);
var npcVisual = GetComponent<NPCVisual>();
m_pNPCModelPolicy.SetNpcVisual(npcVisual);
@@ -797,8 +796,10 @@ public class CECNPC : CECObject
}
}
bool IsMonsterOrPet() { return IsMonsterNPC() || IsPetNPC(); }
bool IsMonsterNPC() { return (int)ClassID.OCID_MONSTER == m_iCID; }
bool IsPetNPC() { return (int)ClassID.OCID_PET == m_iCID; }
bool IsMonsterNPC() { return (int)Class_ID.OCID_MONSTER == m_iCID; }
bool IsPetNPC() { return (int)Class_ID.OCID_PET == m_iCID; }
public bool IsDead(){ return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; }
public void PlayMoveAction(int iMoveMode)
{
BrewMonster.BMLogger.LogError($"HoangDev: PlayMoveAction {iMoveMode}");
@@ -850,6 +851,8 @@ public class CECNPC : CECObject
}
bool IsDisappearing() { return m_DisappearCnt == 0 ? true : false; }
public float GetTouchRadius() { return m_fTouchRad; }
bool IsLag(float fDist)
{
return m_iPassiveMove == 0 && fDist > MAX_LAGDIST;
@@ -445,7 +445,7 @@ namespace PerfectWorld.Scripts.Player
m_aabbServer.CompleteMinsMaxs();
}
private A3DVECTOR3 GetPos()
public A3DVECTOR3 GetPos()
{
A3DVECTOR3 result = new A3DVECTOR3();
result.x = transform.position.x;
@@ -518,6 +518,11 @@ namespace PerfectWorld.Scripts.Player
return iAction;
}
//public A3DVECTOR3 GetPos()
//{
// return new A3DVECTOR3(transform.position.x, transform.position.y, transform.position.z);
//}
}
// Player appear flag
+96 -25
View File
@@ -233,34 +233,34 @@ public class CECHostPlayer : EC_Player
switch (cmd)
{
case CommandID.EQUIP_ITEM:
{
{
byte index_inv = data[0];
byte index_equip = data[1];
// Update client-side data: move item between PACK_INVENTORY and PACK_EQUIPMENT
var invItem = EC_Inventory.GetItem(EC_Inventory.PACK_INVENTORY, index_inv, true);
var equipItem = EC_Inventory.GetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, true);
if (invItem != null)
{
invItem.Package = EC_Inventory.PACK_EQUIPMENT;
invItem.Slot = index_equip;
EC_Inventory.SetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, invItem);
}
if (equipItem != null)
{
equipItem.Package = EC_Inventory.PACK_INVENTORY;
equipItem.Slot = index_inv;
EC_Inventory.SetItem(EC_Inventory.PACK_INVENTORY, index_inv, equipItem);
}
// Update client-side data: move item between PACK_INVENTORY and PACK_EQUIPMENT
var invItem = EC_Inventory.GetItem(EC_Inventory.PACK_INVENTORY, index_inv, true);
var equipItem = EC_Inventory.GetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, true);
if (invItem != null)
{
invItem.Package = EC_Inventory.PACK_EQUIPMENT;
invItem.Slot = index_equip;
EC_Inventory.SetItem(EC_Inventory.PACK_EQUIPMENT, index_equip, invItem);
}
if (equipItem != null)
{
equipItem.Package = EC_Inventory.PACK_INVENTORY;
equipItem.Slot = index_inv;
EC_Inventory.SetItem(EC_Inventory.PACK_INVENTORY, index_inv, equipItem);
}
// Trigger UI refresh if an EC_InventoryUI is present in scene
var ui = GameObject.FindObjectOfType<EC_InventoryUI>();
if (ui != null)
{
ui.RefreshAll();
}
// Trigger UI refresh if an EC_InventoryUI is present in scene
var ui = GameObject.FindObjectOfType<EC_InventoryUI>();
if (ui != null)
{
ui.RefreshAll();
}
break;
}
break;
}
}
}
public void OnMsgHstOwnItemInfo(ECMSG Msg)
@@ -487,7 +487,7 @@ public class CECHostPlayer : EC_Player
bool bUseAutoPF = false;
//CECPlayerWrapper* pWrapper = CECAutoPolicy::GetInstance().GetPlayerWrapper();
//if (CECAutoPolicy::GetInstance().IsAutoPolicyEnabled() && pWrapper.GetAttackError() >= 2)
bUseAutoPF = true;
bUseAutoPF = true;
CECHPWorkTrace pWorkTrace = null;
CECHPWork pWork = null;
@@ -686,7 +686,78 @@ public class CECHostPlayer : EC_Player
return iRet;
}
private float A3d_Magnitude(A3DVECTOR3 v)
{
return Mathf.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
}
public bool CannotAttack() { return (m_dwLIES & (uint)Logic_Influence_Extned_states.LIES_DISABLEFIGHT) != 0; }
public bool CanTouchTarget(A3DVECTOR3 vHostPos, A3DVECTOR3 vTargetPos, float fTargetRad, int iReason, float fMaxCut = 1.0f)
{
float fDist = A3d_Magnitude(vTargetPos - vHostPos);
switch (iReason)
{
case 1: // melee
{
float fRange;
if (fMaxCut >= 0.0f)
{
float fCutDist = m_ExtProps.ak.AttackRange * 0.3f;
if (fCutDist > fMaxCut)
fCutDist = fMaxCut;
fRange = m_ExtProps.ak.AttackRange - fCutDist;
}
else
fRange = m_ExtProps.ak.AttackRange * 0.7f;
if (fDist - fTargetRad <= fRange)
return true;
break;
}
//case 2: // cast magic
//{
// if (m_pPrepSkill)
// {
// float fRange = m_pPrepSkill->GetCastRange(m_ExtProps.ak.AttackRange, GetPrayDistancePlus());
// if (fRange > 0.0f)
// {
// if (fDist - fTargetRad <= fRange)
// return true;
// }
// else
// return true;
// }
// break;
//}
case 3: // talk
{
if (fDist - fTargetRad <= 5.0f)
return true;
break;
}
default: // no special reason
{
if (fDist < (fTargetRad + m_fTouchRad) * 3.0f)
return true;
break;
}
}
return false;
}
public bool CanTouchTarget(A3DVECTOR3 vTargetPos, float fTargetRad, int iReason, float fMaxCut = 1.0f)
{
A3DVECTOR3 vector = new A3DVECTOR3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);
return CanTouchTarget(vector, vTargetPos, fTargetRad, iReason, fMaxCut);
}
}
public enum StateAnim
+9 -1
View File
@@ -1,4 +1,5 @@
using BrewMonster;
using CSNetwork.GPDataType;
using ModelRenderer.Scripts.GameData;
using System;
using System.Collections.Generic;
@@ -14,6 +15,9 @@ public abstract class EC_Player : MonoBehaviour
protected float rotationSpeed = 5;
internal int m_iMoveMode; // Player's move mode
internal int m_idSelTarget; // Ñ¡ÖÐÄ¿±êµÄID
uint m_dwStates; // Player's basic states
protected ROLEEXTPROP m_ExtProps; // Extend properties
protected float m_fTouchRad = 0.3f; // Touch radius
protected void Awake()
{
@@ -32,7 +36,10 @@ public abstract class EC_Player : MonoBehaviour
{
BuildActionList();
}
public bool IsValidAction(int iIndex) { return (iIndex >= 0 && iIndex < (int)PLAYER_ACTION_TYPE.ACT_MAX) ? true : false; }
public bool IsDead(){ return (m_dwStates & PlayerNPCState.GP_STATE_CORPSE) != 0; }
public bool IsValidAction(int iIndex) { return (iIndex >= 0 && iIndex < (int)PLAYER_ACTION_TYPE.ACT_MAX) ? true : false; }
private static void BuildActionList()
{
if (_default_actions == null)
@@ -272,6 +279,7 @@ public abstract class EC_Player : MonoBehaviour
ACT_CASTSKILL // Chỉ là placeholder cho skill actions
}
public float GetTouchRadius(){ return m_fTouchRad; }
}
public struct PlayActionEvent
{
+3 -3
View File
@@ -17,7 +17,7 @@
"hash": "a7c6b49a0141a5bff9b1983e38137522ef61977d"
},
"com.unity.ai.navigation": {
"version": "2.0.9",
"version": "2.0.8",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -46,7 +46,7 @@
"url": "https://packages.unity.com"
},
"com.unity.collab-proxy": {
"version": "2.9.3",
"version": "2.9.1",
"depth": 0,
"source": "registry",
"dependencies": {},
@@ -71,7 +71,7 @@
"dependencies": {}
},
"com.unity.ide.rider": {
"version": "3.0.37",
"version": "3.0.36",
"depth": 0,
"source": "registry",
"dependencies": {