fix after merge

This commit is contained in:
VDH
2025-12-05 10:16:08 +07:00
parent 3b5386840d
commit 2d3f98bb2c
5 changed files with 480 additions and 289 deletions
@@ -386,7 +386,7 @@ namespace BrewMonster
{
string name = sgcFile.Replace(".sgc", "");
GFX = Resources.Load<GameObject>("GFX/"+name);
BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + name);
//BMLogger.LogError("HoangDev: Load A3DSkillGfxComposer GFX name: " + name);
if (GFX == null)
{
GFX = Resources.Load<GameObject>("GFX/" + "PlaceHolder");
@@ -609,6 +609,10 @@ public class CECNPC : CECObject
Vector3 dir = m_vMoveDir.normalized;
Vector3 moveDelta = dir * m_fMoveSpeed * deltaTime;
if(_characterController == null)
{
BMLogger.LogError(" CECNPC.MovingTo _characterController == null " + gameObject.name);
}
_characterController.Move(moveDelta);
// Thêm xoay theo trục Y
FaceDirectionSmooth(dir, 10f, deltaTime);
+29 -1
View File
@@ -12,6 +12,7 @@ GameObject:
- component: {fileID: 1882963580244400679}
- component: {fileID: -5899287755522118344}
- component: {fileID: 1637622316711963511}
- component: {fileID: -1360397627327243963}
m_Layer: 0
m_Name: NPCServer
m_TagString: Untagged
@@ -66,7 +67,7 @@ MonoBehaviour:
m_idAttackTarget: 0
m_npcUI: {fileID: 0}
m_fMoveSpeed: 0
_characterController: {fileID: 0}
_characterController: {fileID: -1360397627327243963}
--- !u!136 &1637622316711963511
CapsuleCollider:
m_ObjectHideFlags: 0
@@ -90,6 +91,31 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
--- !u!143 &-1360397627327243963
CharacterController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2426933851766496167}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Height: 2
m_Radius: 0.5
m_SlopeLimit: 45
m_StepOffset: 0.3
m_SkinWidth: 0.08
m_MinMoveDistance: 0.001
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &3297168817873124018
GameObject:
m_ObjectHideFlags: 0
@@ -253,6 +279,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
_nameText: {fileID: 606418994916995261}
_healthText: {fileID: 0}
_healthImage: {fileID: 0}
--- !u!1 &6510845919681767284
GameObject:
m_ObjectHideFlags: 0
+251 -277
View File
@@ -10,21 +10,17 @@ using CSNetwork;
using CSNetwork.GPDataType;
using CSNetwork.Protocols.RPCData;
using ModelRenderer.Scripts.GameData;
using PerfectWorld.Scripts.Managers;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using Unity.VisualScripting;
using UnityEditor.Experimental.GraphView;
using BrewMonster.PerfectWorld.Scripts.Vfx;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using static BrewMonster.CECCastSkillWhenMove;
using static System.Net.Mime.MediaTypeNames;
using static Unity.Cinemachine.CinemachineFreeLookModifier;
using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID;
using Trace_reason = BrewMonster.CECHPWorkTrace.Trace_reason;
using Host_work_ID = BrewMonster.Scripts.CECHPWork.Host_work_ID;
using PerfectWorld.Scripts.Managers;
namespace BrewMonster
{
@@ -275,7 +271,7 @@ namespace BrewMonster
m_MoveCtrl.Tick((ulong)(Time.deltaTime * 1000));
// Nếu có thay đổi runtime, có thể lấy lại mỗi vài giây/Start nếu bạn thích:
// ccRadius = controller.radius; ccSkin = controller.skinWidth;
OnKeyDown();
m_pWorkMan?.Tick(Time.deltaTime);
@@ -1604,24 +1600,24 @@ namespace BrewMonster
private void OnMsgHstStartAttack(in ECMSG Msg)
{
cmd_host_start_attack pCmd = GPDataTypeHelper.FromBytes<cmd_host_start_attack>((byte[])Msg.dwParam1);
// ASSERT(pCmd);
// test code...
// g_pGame.GetRTDebug().OutputNotifyMessage(RTDCOL_WARNING, _AL("start attack !"));
// g_pGame.GetRTDebug().OutputNotifyMessage(RTDCOL_WARNING, _AL("start attack !"));
// Check whether target is the one that we have selected
if (m_idSelTarget != pCmd.idTarget)
// g_pGame.RuntimeDebugInfo(RTDCOL_WARNING, _AL("Target has changed !"));
// If target turn to be un-attackable, cancel action
if (AttackableJudge(pCmd.idTarget, true)==0)
{
UnityGameSession.c2s_CmdCancelAction();
// g_pGame.RuntimeDebugInfo(RTDCOL_WARNING, _AL("Cannel attacking !"));
return;
}
// If target turn to be un-attackable, cancel action
if (AttackableJudge(pCmd.idTarget, true) == 0)
{
UnityGameSession.c2s_CmdCancelAction();
// g_pGame.RuntimeDebugInfo(RTDCOL_WARNING, _AL("Cannel attacking !"));
return;
}
// Synchronize ammo amount
// CECIvtrItem* pItem = m_pEquipPack.GetItem(EQUIPIVTR_PROJECTILE);
// if (pItem)
@@ -1631,10 +1627,10 @@ namespace BrewMonster
// else
// pItem.SetAmount(pCmd.ammo_remain);
// }
CECHPWorkMelee pWork = (CECHPWorkMelee)m_pWorkMan.CreateWork(Host_work_ID.WORK_HACKOBJECT);
m_pWorkMan.StartWork_p1(pWork);
m_bMelee = true;
// AP_ActionEvent(AP_EVENT_STARTMELEE);
}
@@ -1801,10 +1797,6 @@ namespace BrewMonster
//m_CDRInfo.vTPNormal = GroundCheck(out RaycastHit hit) ? hit.normal : Vector3.zero;
m_CDRInfo.vExtent = m_aabbServer.Extents;
m_CDRInfo.vTPNormal = g_vOrigin;
m_CDRInfo.fYVel = 0.0f;
m_CDRInfo.fSlopeThresh = EC_SLOPE_Y;
m_CDRInfo.fStepHeight = 0.8f;
// Create work manager
m_pWorkMan = new CECHPWorkMan(this);
m_pWorkMan.StartWork_p0(m_pWorkMan.CreateWork(Host_work_ID.WORK_STAND));
@@ -2319,7 +2311,7 @@ namespace BrewMonster
public bool IsPlayingAction(int iAction)
{
if (iAction == (int)PLAYER_ACTION_TYPE.ACT_WALK )//&& _playerStateMachine.State is PlayerMoveState
if (iAction == (int)PLAYER_ACTION_TYPE.ACT_WALK)//&& _playerStateMachine.State is PlayerMoveState
{
return true;
}
@@ -2349,7 +2341,7 @@ namespace BrewMonster
return m_ExtProps.mv.swim_speed;
}
public bool ApplySkillShortcut(int idSkill, bool bCombo = false /* false */,
int idSelTarget = 0/* 0 */, int iForceAtk = -1/* -1 */)
int idSelTarget = 0/* 0 */, int iForceAtk = -1/* -1 */)
{
//StackChecker::ACTrace(4);
@@ -2617,6 +2609,11 @@ namespace BrewMonster
}
return true;
}
public CECSkill GetPrepSkill() { return m_pPrepSkill; }
bool IsSpellingMagic()
{
return m_pWorkMan.IsSpellingMagic();
}
public void PrepareNPCService(int idSev)
{
if (!GPDataTypeHelper.ISNPCID(m_idSevNPC))
@@ -3019,7 +3016,24 @@ namespace BrewMonster
return true;
}
bool IsTooNear(A3DVECTOR3 vTarget,ref float fNearDist)
public A3DVECTOR3 GetDir()
{
// Return forward direction from transform
return EC_Utility.ToA3DVECTOR3(transform.forward);
}
public A3DVECTOR3 A3d_RotatePosAroundY(A3DVECTOR3 vDir, float fAngle)
{
float cos = Mathf.Cos(fAngle);
float sin = Mathf.Sin(fAngle);
A3DVECTOR3 result = new A3DVECTOR3();
result.x = vDir.x * cos + vDir.z * sin;
result.y = vDir.y;
result.z = -vDir.x * sin + vDir.z * cos;
return result;
}
bool IsTooNear(A3DVECTOR3 vTarget, ref float fNearDist)
{
// ¸ù¾Ý¿Õ¼äÇé¿ö£¬¼ÆËãÏà½ü 3D ¿Õ¼äÉÏÓ¦±£³ÖµÄ½ÏС¾àÀ룬±ÜÃâÒÆ¶¯ºÜ½üÉõÖÁÖØºÏµÄÇé¿ö
// ·µ»Ø true ±íÃ÷µ±Ç°¾àÀëСÓÚ¼ÆËã³öµÄ×îС¾àÀë
@@ -3574,6 +3588,213 @@ namespace BrewMonster
return bRet;
}
public bool GetPushDir(ref Vector3 vPushDir, uint dwMask, float deltaTime)
{
Vector3 vRight = Vector3.zero;
vRight.x = joystick.Horizontal;
vRight.z = joystick.Vertical;
vRight.y = 0f;
vRight.Normalize();
if (vRight == Vector3.zero)
{
return false;
}
vPushDir = vRight;
/* // reset
vPushDir = Vector3.zero;
Vector3 vRight = Vector3.zero;
bool bMove = false;
// Không bấm gì → không có hướng
if (m_dwMoveRelDir == 0)
return false;
// ===== LEFT =====
if ((m_dwMoveRelDir & MD_LEFT) != 0)
{
// Nếu trên không → xoay camera thay vì di chuyển
if (m_iMoveEnv == MOVEENV_AIR)
{
// giữ nguyên logic PW
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)(_yaw_vel_air * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO: bạn map hàm này sang Unity
}
else if (m_iMoveEnv == MOVEENV_WATER)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)(_yaw_vel * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else
{
// Mặt đất → di chuyển sang trái theo camera
// C++: vRight = -m_CameraCoord.GetRight();
Vector3 camRight = m_CameraCoord.GetRight(); // TODO: map sang Unity Camera?
vRight = -camRight;
vRight.y = 0;
vRight.Normalize();
vPushDir = vRight;
bMove = true;
}
}
// ===== RIGHT =====
else if ((m_dwMoveRelDir & MD_RIGHT) != 0)
{
if (m_iMoveEnv == MOVEENV_AIR)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)((-_yaw_vel_air) * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else if (m_iMoveEnv == MOVEENV_WATER)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)((-_yaw_vel) * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else
{
// Mặt đất → di chuyển sang phải theo camera
Vector3 camRight = m_CameraCoord.GetRight(); // TODO
vRight = camRight;
vRight.y = 0;
vRight.Normalize();
vPushDir = vRight;
bMove = true;
}
}
// ===== FORWARD =====
if ((m_dwMoveRelDir & MD_FORWARD) != 0)
{
Vector3 forward = m_CameraCoord.GetDir(); // TODO
forward.y = 0;
forward.Normalize();
vPushDir = forward;
if (bMove)
{
vPushDir += vRight;
vPushDir.Normalize();
}
}
// ===== BACK =====
else if ((m_dwMoveRelDir & MD_BACK) != 0)
{
Vector3 back = -m_CameraCoord.GetDir(); // TODO
back.y = 0;
back.Normalize();
vPushDir = back;
if (bMove)
{
vPushDir += vRight;
vPushDir.Normalize();
}
}
// ===== ABS UP (nếu mask cho phép) =====
else if (((m_dwMoveRelDir & MD_ABSUP) != 0) && ((dwMask & MD_ABSUP) != 0))
{
vPushDir = Vector3.up;
}*/
return true;
}
bool IsJumpInWater() { return m_bJumpInWater; }
// Is under water
bool IsUnderWater() { return m_iMoveEnv == Move_environment.MOVEENV_WATER ? true : false; }
bool CanTakeOffWater()
{
return true;
//A3DVECTOR3 vPos = GetPos();
//if (vPos.y < EC_Game.GetGameRun().GetWorld().GetWaterHeight(vPos) - m_MoveConst.fShoreDepth)
// return false;
//else
// return true;
}
bool IsSitting() { return (m_dwStates & PlayerNPCState.GP_STATE_SITDOWN) != 0 ? true : false; }
// Is host player open trash box ?
bool IsUsingTrashBox() { return m_bUsingTrashBox; }
// Is host player talking with NPC ?
bool IsTalkingWithNPC() { return m_bTalkWithNPC; }
// Is reviving
bool IsReviving()
{
return m_pWorkMan.IsReviving();
}
// Is spelling magic
// Is picking up something
bool IsPicking()
{
return false;
// TODO: fix later
//CECHPWork pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_PICKUP);
//if (pWork != null)
//{
// return !(pWork as CECHPWorkPick).IsGather();
//}
//else
// return false;
}
// Is gathering resources
bool IsGathering()
{
return false;
// TODO: fix later
//CECHPWork pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_PICKUP);
//if (pWork != null)
// return (pWork as CECHPWorkPick).IsGather();
//else
// return false;
}
// Is using item ?
bool IsUsingItem()
{
return m_pWorkMan.IsUsingItem();
}
bool IsPassiveMove()
{
return m_pWorkMan.IsPassiveMoving();
}
public void SetGroundInfoClient()
{
isGrounded = GroundCheck(out lastGroundHit);
m_GndInfo.bOnGround = isGrounded;
}
public void SetRotationHP(Vector3 dir)
{
transform.rotation = Quaternion.LookRotation(dir);
}
void SetJumpInWater(bool b) { m_bJumpInWater = b; }
// Is host in sliding state (in the state, host is sliding on slope) ?
public int GetProfession()
{
return m_iProfession;
@@ -3840,144 +4061,6 @@ namespace BrewMonster
m_bIsInKingService = false;
//m_pOffShopCtrl.SetNPCSevFlag(COfflineShopCtrl::NPCSEV_NULL);
}
public bool GetPushDir(ref Vector3 vPushDir, uint dwMask, float deltaTime)
{
Vector3 vRight = Vector3.zero;
vRight.x = joystick.Horizontal;
vRight.z = joystick.Vertical;
vRight.y = 0f;
vRight.Normalize();
if(vRight == Vector3.zero)
{
return false;
}
vPushDir = vRight;
/* // reset
vPushDir = Vector3.zero;
Vector3 vRight = Vector3.zero;
bool bMove = false;
// Không bấm gì → không có hướng
if (m_dwMoveRelDir == 0)
return false;
// ===== LEFT =====
if ((m_dwMoveRelDir & MD_LEFT) != 0)
{
// Nếu trên không → xoay camera thay vì di chuyển
if (m_iMoveEnv == MOVEENV_AIR)
{
// giữ nguyên logic PW
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)(_yaw_vel_air * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO: bạn map hàm này sang Unity
}
else if (m_iMoveEnv == MOVEENV_WATER)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)(_yaw_vel * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else
{
// Mặt đất → di chuyển sang trái theo camera
// C++: vRight = -m_CameraCoord.GetRight();
Vector3 camRight = m_CameraCoord.GetRight(); // TODO: map sang Unity Camera?
vRight = -camRight;
vRight.y = 0;
vRight.Normalize();
vPushDir = vRight;
bMove = true;
}
}
// ===== RIGHT =====
else if ((m_dwMoveRelDir & MD_RIGHT) != 0)
{
if (m_iMoveEnv == MOVEENV_AIR)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)((-_yaw_vel_air) * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else if (m_iMoveEnv == MOVEENV_WATER)
{
ECMSG msg = new ECMSG();
msg.dwParam2 = 0;
msg.dwParam1 = (uint)((-_yaw_vel) * deltaTime);
if ((m_dwMoveRelDir & MD_BACK) != 0)
msg.dwParam1 = (uint)(-(int)msg.dwParam1);
OnMsgHstYaw(msg); // TODO
}
else
{
// Mặt đất → di chuyển sang phải theo camera
Vector3 camRight = m_CameraCoord.GetRight(); // TODO
vRight = camRight;
vRight.y = 0;
vRight.Normalize();
vPushDir = vRight;
bMove = true;
}
}
// ===== FORWARD =====
if ((m_dwMoveRelDir & MD_FORWARD) != 0)
{
Vector3 forward = m_CameraCoord.GetDir(); // TODO
forward.y = 0;
forward.Normalize();
vPushDir = forward;
if (bMove)
{
vPushDir += vRight;
vPushDir.Normalize();
}
}
// ===== BACK =====
else if ((m_dwMoveRelDir & MD_BACK) != 0)
{
Vector3 back = -m_CameraCoord.GetDir(); // TODO
back.y = 0;
back.Normalize();
vPushDir = back;
if (bMove)
{
vPushDir += vRight;
vPushDir.Normalize();
}
}
// ===== ABS UP (nếu mask cho phép) =====
else if (((m_dwMoveRelDir & MD_ABSUP) != 0) && ((dwMask & MD_ABSUP) != 0))
{
vPushDir = Vector3.up;
}*/
return true;
}
void UpdateGFXs(float dwDeltaTime)
{
@@ -4242,115 +4325,6 @@ namespace BrewMonster
return NormalAttackObject(idTarget, bForceAttack, bMoreClose);
}
bool IsJumpInWater() { return m_bJumpInWater; }
// Is under water
bool IsUnderWater() { return m_iMoveEnv == Move_environment.MOVEENV_WATER ? true : false; }
// Can jump or take off in water ?
bool CanTakeOffWater()
{
return true;
//A3DVECTOR3 vPos = GetPos();
//if (vPos.y < EC_Game.GetGameRun().GetWorld().GetWaterHeight(vPos) - m_MoveConst.fShoreDepth)
// return false;
//else
// return true;
}
bool IsSitting() { return (m_dwStates & PlayerNPCState.GP_STATE_SITDOWN) != 0 ? true : false; }
// Is host player open trash box ?
bool IsUsingTrashBox() { return m_bUsingTrashBox; }
// Is host player talking with NPC ?
bool IsTalkingWithNPC() { return m_bTalkWithNPC; }
// Is reviving
bool IsReviving()
{
return m_pWorkMan.IsReviving();
}
// Is spelling magic
bool IsSpellingMagic()
{
return m_pWorkMan.IsSpellingMagic();
}
// Is picking up something
bool IsPicking()
{
return false;
// TODO: fix later
//CECHPWork pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_PICKUP);
//if (pWork != null)
//{
// return !(pWork as CECHPWorkPick).IsGather();
//}
//else
// return false;
}
// Is gathering resources
bool IsGathering()
{
return false;
// TODO: fix later
//CECHPWork pWork = m_pWorkMan.GetRunningWork(Host_work_ID.WORK_PICKUP);
//if (pWork != null)
// return (pWork as CECHPWorkPick).IsGather();
//else
// return false;
}
// Is using item ?
bool IsUsingItem()
{
return m_pWorkMan.IsUsingItem();
}
bool IsPassiveMove()
{
return m_pWorkMan.IsPassiveMoving();
}
void SetJumpInWater(bool b) { m_bJumpInWater = b; }
// Is host in sliding state (in the state, host is sliding on slope) ?
public void SetGroundInfoClient()
{
isGrounded = GroundCheck(out lastGroundHit);
m_GndInfo.bOnGround = isGrounded;
}
public void SetRotationHP(Vector3 dir)
{
transform.rotation = Quaternion.LookRotation(dir);
}
// Get prepared skill - 获取准备施放的技能 / Get prepared skill
public CECSkill GetPrepSkill()
{
return m_pPrepSkill;
}
// Get player direction vector
public A3DVECTOR3 GetDir()
{
// Return forward direction from transform
return EC_Utility.ToA3DVECTOR3(transform.forward);
}
// Get pray distance plus (distance bonus)
// TODO: Implement proper calculation based on player buffs/items
// Rotate a position vector around Y axis
// vDir: direction vector to rotate
// fAngle: angle in radians
public A3DVECTOR3 A3d_RotatePosAroundY(A3DVECTOR3 vDir, float fAngle)
{
float cos = Mathf.Cos(fAngle);
float sin = Mathf.Sin(fAngle);
A3DVECTOR3 result = new A3DVECTOR3();
result.x = vDir.x * cos + vDir.z * sin;
result.y = vDir.y;
result.z = -vDir.x * sin + vDir.z * cos;
return result;
}
}
public enum StateAnim
File diff suppressed because one or more lines are too long