fix: update logic jump stand for HP.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
using BrewMonster.Network;
|
||||
using BrewMonster.Scripts.Player;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BrewMonster.Scripts
|
||||
{
|
||||
@@ -431,11 +431,25 @@ namespace BrewMonster.Scripts
|
||||
|
||||
public void CancelWork(CECHPWork pWork)
|
||||
{
|
||||
|
||||
if (pWork == null)
|
||||
{
|
||||
//ASSERT(false);
|
||||
return;
|
||||
}
|
||||
pWork.Cancel();
|
||||
}
|
||||
public void CancelWorkAtPriority(int iPriority)
|
||||
{
|
||||
|
||||
if (!ValidatePriority(iPriority))
|
||||
{
|
||||
return;
|
||||
}
|
||||
WorkList workList = m_WorkStack[iPriority];
|
||||
for (int i = 0; i < workList.Count; ++i)
|
||||
{
|
||||
CancelWork(workList[i]);
|
||||
//LOG_DEBUG_INFO(AString().Format("CECHPWork::%s priority=%d cancelled", workList[i]->GetWorkName(), iPriority));
|
||||
}
|
||||
}
|
||||
|
||||
public bool DelayWork(int iPriority, CECHPWork pWork)
|
||||
@@ -479,11 +493,24 @@ namespace BrewMonster.Scripts
|
||||
}
|
||||
public void StartDelayedWork()
|
||||
{
|
||||
|
||||
if (!HasDelayedWork())
|
||||
{
|
||||
return;
|
||||
}
|
||||
CECHPWork pWork = m_Delayed.pWork;
|
||||
m_Delayed.pWork = null;
|
||||
//LOG_DEBUG_INFO(AString().Format("CECHPWork:: start delayed work %s, priority=%d", pWork->GetWorkName(), m_Delayed.iPriority));
|
||||
InternallyStartWork(m_Delayed.iPriority, pWork);
|
||||
}
|
||||
public void ClearDelayedWork()
|
||||
{
|
||||
|
||||
if (!HasDelayedWork())
|
||||
{
|
||||
return;
|
||||
}
|
||||
//LOG_DEBUG_INFO(AString().Format("delayed CECHPWork::%s priority=%d cleared", m_Delayed.pWork->GetWorkName(), m_Delayed.iPriority));
|
||||
//delete m_Delayed.pWork;
|
||||
m_Delayed.pWork = null;
|
||||
}
|
||||
public CECHPWork GetDelayedWork()
|
||||
{
|
||||
@@ -742,6 +769,11 @@ namespace BrewMonster.Scripts
|
||||
{
|
||||
return IsWorkRunning(CECHPWork.Host_work_ID.WORK_PICKUP);
|
||||
}
|
||||
|
||||
bool HasDelayedWork()
|
||||
{
|
||||
return GetDelayedWork() != null;
|
||||
}
|
||||
}
|
||||
public abstract class CECHPWorkPostTickCommand
|
||||
{
|
||||
@@ -781,7 +813,7 @@ namespace BrewMonster.Scripts
|
||||
int m_iPriority;
|
||||
bool m_bNoDelay;
|
||||
bool m_bShouldTick;
|
||||
uint m_dwTickTime;
|
||||
float m_dwTickTime;
|
||||
|
||||
// Constructor
|
||||
public CECHPWorkPostTickRunWorkCommand(
|
||||
@@ -789,7 +821,7 @@ namespace BrewMonster.Scripts
|
||||
bool bNoDelay = false,
|
||||
int iPriority = CECHPWorkMan.Work_priority.PRIORITY_1,
|
||||
bool bShouldTick = false,
|
||||
uint dwTickTime = 0)
|
||||
float dwTickTime = 0)
|
||||
{
|
||||
m_pWork = pWork;
|
||||
m_bNoDelay = bNoDelay;
|
||||
|
||||
@@ -507,6 +507,7 @@ namespace BrewMonster.Scripts
|
||||
if ((GetMoveRelDirMask() & (uint)((MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT | MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK))) != 0)
|
||||
m_iDestType = DestTypes.DEST_PUSH;
|
||||
|
||||
Debug.LogError("m_iDestType = " + m_iDestType);
|
||||
if (m_iDestType == DestTypes.DEST_2D)
|
||||
{
|
||||
float fDist;
|
||||
@@ -614,8 +615,7 @@ namespace BrewMonster.Scripts
|
||||
}
|
||||
else
|
||||
{
|
||||
vCurPos = m_pHost.m_MoveCtrl.GroundMove(GPDataTypeHelper.g_vOrigin, 0.0f, fDeltaTime, m_pHost.m_fVertSpeed);
|
||||
Debug.LogError("vCurPos = " + vCurPos + " m_pHost.m_fVertSpeed = " + m_pHost.m_fVertSpeed);
|
||||
vCurPos = m_pHost.m_MoveCtrl.GroundMove(GPDataTypeHelper.g_vOrigin, 0.0f, fDeltaTime, m_pHost.m_fVertSpeed);
|
||||
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
||||
|
||||
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
|
||||
|
||||
@@ -134,7 +134,7 @@ namespace BrewMonster.Scripts
|
||||
{
|
||||
pWork.SetDestination(CECHPWorkMove.DestTypes.DEST_STANDJUMP, GPDataTypeHelper.g_vOrigin);
|
||||
m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(
|
||||
pWork, false, CECHPWorkMan.Work_priority.PRIORITY_1, true, (uint)dwDeltaTime));
|
||||
pWork, false, CECHPWorkMan.Work_priority.PRIORITY_1, true, dwDeltaTime));
|
||||
}
|
||||
}
|
||||
else if (iMoveReason == 2)
|
||||
@@ -150,10 +150,8 @@ namespace BrewMonster.Scripts
|
||||
{
|
||||
// ASSERT(0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Play appropriate actions
|
||||
if (m_iPoseAction == (int)CECPlayer.PLAYER_ACTION_TYPE.ACT_STAND)
|
||||
{
|
||||
@@ -174,7 +172,7 @@ namespace BrewMonster.Scripts
|
||||
if (m_iPoseAction == (int)CECPlayer.PLAYER_ACTION_TYPE.ACT_STAND)
|
||||
{
|
||||
// Chariot war special case omitted for now
|
||||
m_pHost.PlayAction(m_iCurAction, false, 0);
|
||||
m_pHost.PlayAction(m_iCurAction, false, 300);
|
||||
//m_oldAction = m_iCurAction;
|
||||
}
|
||||
|
||||
|
||||
@@ -305,7 +305,7 @@ namespace BrewMonster {
|
||||
cdr.fYVel += fSpeedV;
|
||||
|
||||
EC_CDR.OnGroundMove(ref cdr);
|
||||
|
||||
m_pHost.m_CDRInfo = cdr;
|
||||
//if (g_pGame.GetGameRun().GetWorld().GetAssureMove())
|
||||
// g_pGame.GetGameRun().GetWorld().GetAssureMove().AssureMove(m_pHost.m_aabbServer.Center, cdr.vCenter);
|
||||
|
||||
@@ -319,10 +319,14 @@ namespace BrewMonster {
|
||||
m_iBlockedCnt = 0;
|
||||
m_fBlockMove += (vNewPos - m_pHost.GetPos()).Magnitude();
|
||||
m_vBlockMove += vNewPos - m_pHost.GetPos();
|
||||
if ((m_fBlockTime += fTime) >= 1.0f)
|
||||
m_fBlockTime += fTime;
|
||||
//TO DO: in c++ set 1.0f. Convert to c#, this logic is wrong. If set time is 2.0, game run correct
|
||||
if ((m_fBlockTime) >= 2.0f)
|
||||
{
|
||||
Debug.LogError("m_fBlockMove = " + m_fBlockMove);
|
||||
if (m_fBlockMove < GPDataTypeHelper.MIN_MOVELEN_ON_GROUND || m_vBlockMove.Magnitude() < GPDataTypeHelper.MIN_MOVELEN_FOR_DETECT_VIBRATION)
|
||||
{
|
||||
Debug.LogError("m_iBlockedCnt = 5");
|
||||
m_iBlockedCnt = 5;
|
||||
}
|
||||
|
||||
@@ -340,6 +344,8 @@ namespace BrewMonster {
|
||||
public void SetSlideLock(bool bLock) { m_bSlideLock = bLock; }
|
||||
// Is stoping ?
|
||||
public bool IsStop() { return m_bStop; }
|
||||
// Get host's last position sent to server
|
||||
public Vector3 GetLastSevPos() { return m_vLastSevPos; }
|
||||
}
|
||||
public struct CDR_INFO
|
||||
{
|
||||
|
||||
@@ -29,6 +29,7 @@ public partial class CECGameRun
|
||||
|
||||
public void Init()
|
||||
{
|
||||
Application.targetFrameRate = 60;
|
||||
instance = this;
|
||||
// _gameRunConfig = Resources.Load<GameRunConfig>("GameRunConfig");
|
||||
// _playerPrefab = _gameRunConfig.PlayerPrefab;
|
||||
|
||||
+241
-118
@@ -7,6 +7,7 @@ using BrewMonster.Scripts;
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster.Scripts.Player;
|
||||
using BrewMonster.Scripts.Skills;
|
||||
using BrewMonster.Scripts.World;
|
||||
using CSNetwork;
|
||||
using CSNetwork.GPDataType;
|
||||
using CSNetwork.Protocols.RPCData;
|
||||
@@ -260,21 +261,26 @@ namespace BrewMonster
|
||||
}
|
||||
#endif
|
||||
|
||||
// Update cursor based on what's under mouse
|
||||
EstimateCursor();
|
||||
//Debug.Log($"(ulong)Time.deltaTime * 1000 {(ulong)(Time.deltaTime * 1000)}");
|
||||
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;
|
||||
|
||||
EstimateMoveEnv(GetPos());
|
||||
|
||||
_playerStateMachine.UpdateState();
|
||||
OnKeyDown();
|
||||
|
||||
m_pWorkMan?.Tick(Time.deltaTime);
|
||||
|
||||
// Update cursor based on what's under mouse
|
||||
EstimateCursor();
|
||||
|
||||
// Update GFXs
|
||||
UpdateGFXs(Time.deltaTime);
|
||||
|
||||
//m_dwMoveRelDir = 0;
|
||||
m_fVertSpeed = 0.0f;
|
||||
}
|
||||
|
||||
public void StopMovement()
|
||||
@@ -1270,15 +1276,15 @@ namespace BrewMonster
|
||||
m_pWorkMan.StartWork_p0(m_pWorkMan.CreateWork(Host_work_ID.WORK_STAND));
|
||||
if (IsDead())
|
||||
{
|
||||
//CECHPWorkDead pWork = (CECHPWorkDead*)m_pWorkMan->CreateWork(CECHPWork.Host_work_ID.WORK_DEAD);
|
||||
//pWork->SetBeDeadFlag(true);
|
||||
//m_pWorkMan->StartWork_p0(pWork);
|
||||
EventBus.PublishChannel(GetCharacterID(), new CECPlayer.ClearComActFlagAllRankNodesEvent(true));
|
||||
PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE);
|
||||
if (PopupManager.Instance != null)
|
||||
{
|
||||
PopupManager.Instance.OnPlayerDied();
|
||||
}
|
||||
//CECHPWorkDead pWork = (CECHPWorkDead*)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_DEAD);
|
||||
//pWork.SetBeDeadFlag(true);
|
||||
//m_pWorkMan.StartWork_p0(pWork);
|
||||
EventBus.PublishChannel(GetCharacterID(), new CECPlayer.ClearComActFlagAllRankNodesEvent(true));
|
||||
PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE);
|
||||
if (PopupManager.Instance != null)
|
||||
{
|
||||
PopupManager.Instance.OnPlayerDied();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2882,134 +2888,134 @@ namespace BrewMonster
|
||||
vRight.z = joystick.Vertical;
|
||||
vRight.y = 0f;
|
||||
vRight.Normalize();
|
||||
if(vRight == Vector3.zero)
|
||||
if (vRight == Vector3.zero)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
vPushDir = vRight;
|
||||
/* // reset
|
||||
vPushDir = Vector3.zero;
|
||||
Vector3 vRight = Vector3.zero;
|
||||
bool bMove = false;
|
||||
/* // 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;
|
||||
// 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);
|
||||
// ===== 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);
|
||||
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);
|
||||
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);
|
||||
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();
|
||||
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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
// ===== 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);
|
||||
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);
|
||||
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);
|
||||
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();
|
||||
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;
|
||||
}
|
||||
}
|
||||
vPushDir = vRight;
|
||||
bMove = true;
|
||||
}
|
||||
}
|
||||
|
||||
// ===== FORWARD =====
|
||||
if ((m_dwMoveRelDir & MD_FORWARD) != 0)
|
||||
{
|
||||
Vector3 forward = m_CameraCoord.GetDir(); // TODO
|
||||
forward.y = 0;
|
||||
forward.Normalize();
|
||||
// ===== FORWARD =====
|
||||
if ((m_dwMoveRelDir & MD_FORWARD) != 0)
|
||||
{
|
||||
Vector3 forward = m_CameraCoord.GetDir(); // TODO
|
||||
forward.y = 0;
|
||||
forward.Normalize();
|
||||
|
||||
vPushDir = forward;
|
||||
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();
|
||||
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;
|
||||
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;
|
||||
}*/
|
||||
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;
|
||||
}
|
||||
@@ -3366,9 +3372,126 @@ namespace BrewMonster
|
||||
}
|
||||
|
||||
public void SetRotationHP(Vector3 dir)
|
||||
{
|
||||
{
|
||||
transform.rotation = Quaternion.LookRotation(dir);
|
||||
}
|
||||
|
||||
// Estimate move environment
|
||||
void EstimateMoveEnv(A3DVECTOR3 vPos)
|
||||
{
|
||||
if (IsFlying())
|
||||
{
|
||||
m_iMoveEnv = Move_environment.MOVEENV_AIR;
|
||||
return;
|
||||
}
|
||||
|
||||
CECWorld pWorld = EC_Game.GetGameRun().GetWorld();
|
||||
// m_GndInfo.fGndHei = pWorld.GetTerrainHeight(vPos, &m_GndInfo.vGndNormal);
|
||||
|
||||
// Test whether last pos is in air
|
||||
A3DVECTOR3 vGndPos0, vTestPos0 = m_MoveCtrl.GetLastSevPos() + g_vAxisY * m_aabbServer.Extents.y;
|
||||
VertRayTrace(vTestPos0, vGndPos0, m_GndInfo.vGndNormal);
|
||||
|
||||
m_GndInfo.fGndHei = vGndPos0.y;
|
||||
|
||||
A3DVECTOR3 vAABBGnd;
|
||||
VertAABBTrace(vTestPos0, m_aabbServer.Extents, vAABBGnd, m_GndInfo.vGndNormal);
|
||||
vAABBGnd.y -= m_aabbServer.Extents.y;
|
||||
|
||||
bool bIsInAir = false;
|
||||
if (m_MoveCtrl.GetLastSevPos().y - vAABBGnd.y > 0.2f)
|
||||
bIsInAir = true;
|
||||
|
||||
A3DVECTOR3 vGndPos, vTestPos = vPos + g_vAxisY * m_aabbServer.Extents.y;
|
||||
VertRayTrace(vTestPos, vGndPos, m_GndInfo.vGndNormal);
|
||||
m_GndInfo.fGndHei = vGndPos.y;
|
||||
m_GndInfo.fWaterHei = pWorld.GetWaterHeight(vTestPos);
|
||||
|
||||
//@note : use the aabb trace. By Kuiwu[12/10/2005]
|
||||
VertAABBTrace(vTestPos, m_aabbServer.Extents, vAABBGnd, m_GndInfo.vGndNormal);
|
||||
vAABBGnd.y -= m_aabbServer.Extents.y;
|
||||
|
||||
//@note : By Kuiwu[12/10/2005]
|
||||
int iNewEnv = MOVEENV_GROUND;
|
||||
if (CheckWaterMoveEnv(vPos, m_GndInfo.fWaterHei, vAABBGnd.y))
|
||||
iNewEnv = MOVEENV_WATER;
|
||||
|
||||
// ·ÉÌì¹ÒÎÊÌâ
|
||||
|
||||
if (iNewEnv == MOVEENV_GROUND && GetPos().y - vAABBGnd.y < 0.2f && bIsInAir && GetPos() != m_MoveCtrl.GetLastSevPos())
|
||||
{
|
||||
m_MoveCtrl.SendMoveCmd(GetPos(), 2, g_vAxisY, m_CDRInfo.vAbsVelocity, m_iMoveMode, true);
|
||||
// BubbleText(BUBBLE_LEVELUP, 0);
|
||||
}
|
||||
|
||||
if (iNewEnv == MOVEENV_GROUND)
|
||||
{
|
||||
m_GndInfo.bOnGround = true;
|
||||
|
||||
// if (vPos.y > m_GndInfo.fGndHei + 0.2f)
|
||||
if (m_CDRInfo.vTPNormal.IsZero())
|
||||
{
|
||||
if (m_iMoveMode != MOVE_FREEFALL)
|
||||
m_iMoveMode = MOVE_FREEFALL;
|
||||
|
||||
m_GndInfo.bOnGround = false;
|
||||
if (IsJumping() && m_CDRInfo.vAbsVelocity.y < 0.0f && vPos.y - vAABBGnd.y < 0.6f)
|
||||
{
|
||||
PlayAction(ACT_JUMP_LAND, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IsJumping() && m_CDRInfo.vAbsVelocity.y < 0.0f && vPos.y - vAABBGnd.y < 0.6f)
|
||||
{
|
||||
PlayAction(ACT_JUMP_LAND, false);
|
||||
ResetJump();
|
||||
}
|
||||
|
||||
// if (m_GndInfo.vGndNormal.y < EC_SLOPE_Y)
|
||||
if (m_CDRInfo.vTPNormal.y < EC_SLOPE_Y)
|
||||
{
|
||||
if (!m_MoveCtrl.GetSlideLock())
|
||||
{
|
||||
if (m_iMoveMode != MOVE_SLIDE)
|
||||
{
|
||||
m_iOldWalkMode = m_iMoveMode;
|
||||
m_iMoveMode = MOVE_SLIDE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_MoveCtrl.SetSlideLock(false);
|
||||
m_iMoveMode = MOVE_STAND;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_MoveCtrl.SetSlideLock(false);
|
||||
if (m_iMoveMode == MOVE_FREEFALL)
|
||||
{
|
||||
m_iMoveMode = MOVE_STAND;
|
||||
}
|
||||
else if (m_iMoveMode == MOVE_SLIDE)
|
||||
m_iMoveMode = m_iOldWalkMode;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (iNewEnv == MOVEENV_WATER)
|
||||
{
|
||||
m_CDRInfo.fYVel = 0.0f;
|
||||
|
||||
if (m_iMoveMode == MOVE_SLIDE)
|
||||
{
|
||||
if (m_pWorkMan.IsMoving())
|
||||
m_iMoveMode = MOVE_MOVE;
|
||||
else
|
||||
m_iMoveMode = MOVE_STAND;
|
||||
}
|
||||
}
|
||||
|
||||
m_iMoveEnv = iNewEnv;
|
||||
}
|
||||
}
|
||||
|
||||
public enum StateAnim
|
||||
|
||||
Reference in New Issue
Block a user