Merge branch 'feature/HP_jump' into feature/else-jump-animation

This commit is contained in:
NguyenVanDat
2025-12-04 09:38:56 +07:00
8 changed files with 365 additions and 37 deletions
@@ -553,7 +553,7 @@ namespace BrewMonster.Scripts
//case CECHPWork.Host_work_ID.WORK_DEAD: pWork = new CECHPWorkDead(this); break;
//case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break;
//case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break;
//case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break;
case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break;
//case CECHPWork.Host_work_ID.WORK_SIT: pWork = new CECHPWorkSit(this); break;
//case CECHPWork.Host_work_ID.WORK_PICKUP: pWork = new CECHPWorkPick(this); break;
//case CECHPWork.Host_work_ID.WORK_CONCENTRATE: pWork = new CECHPWorkConcentrate(this); break;
@@ -0,0 +1,317 @@
using CSNetwork.GPDataType;
using System;
using System.Runtime.ConstrainedExecution;
using UnityEngine;
using static CECPlayer;
namespace BrewMonster.Scripts
{
public class CECHPWorkFall : CECHPWork
{
protected A3DVECTOR3 m_vDirH;
protected float m_fSpeedH;
protected bool m_bEnterWater;
protected int m_iFallMode;
protected int m_nCurStage;
protected int m_iFallType;
protected bool m_fForceDown;
Vector3 g_vOrigin = Vector3.zero;
public static class FlyFallStage
{
public const int enumStageNone = 0,
enumStageUpperAir = 1,
enumStageLowerAir = 2,
enumStageShallowWater = 3,
enumStageDeepWater = 4,
enumStageLandOn = 5;
};
// Fall type
public static class Fall_type
{
public const int TYPE_FREEFALL = 0,
TYPE_FLYFALL = 1;
};
// This work is do player moving ?
public override bool IsMoving() { return true; }
// Copy work data
// Set fall type
public void SetFallType(int iType) { m_iFallType = iType; }
public int GetFallType() { return m_iFallType; }
public CECHPWorkFall(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_FREEFALL, pWorkMan)
{
m_dwMask = Work_mask.MASK_FREEFALL;
m_dwTransMask = Work_mask.MASK_STAND;
Reset();
}
// Reset work
public override void Reset()
{
base.Reset();
m_bEnterWater = false;
m_nCurStage = FlyFallStage.enumStageNone;
m_iFallType = Fall_type.TYPE_FREEFALL;
m_fForceDown = false;
}
// Copy work data
public override bool CopyData(CECHPWork pWork)
{
if (!base.CopyData(pWork))
return false;
CECHPWorkFall pSrc = (CECHPWorkFall)pWork;
m_bEnterWater = pSrc.m_bEnterWater;
m_nCurStage = pSrc.m_nCurStage;
m_iFallType = pSrc.m_iFallType;
m_fForceDown = pSrc.m_fForceDown;
return true;
}
// On first tick
protected override void OnFirstTick()
{
m_pHost.m_iMoveEnv = (int)MoveEnvironment.MOVEENV_GROUND;
m_pHost.m_iMoveMode = (int)MoveMode.MOVE_FREEFALL;
m_vDirH = m_pHost.m_vVelocity;
m_vDirH.y = 0.0f;
m_fSpeedH = m_vDirH.Normalize();
if (m_fSpeedH > m_pHost.GetGroundSpeed())
m_fSpeedH = m_pHost.GetGroundSpeed();
// Clear N
m_pHost.m_CDRInfo.vTPNormal = Vector3.zero;
}
// Work is cancel
public override void Cancel()
{
m_pHost.m_CDRInfo.vAbsVelocity = Vector3.zero;
if (m_pHost.m_CDRInfo.vTPNormal == Vector3.zero)
m_pHost.m_CDRInfo.fYVel = 0.0f;
base.Cancel();
}
// Tick routine
public override bool Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
var m_pEquipPack = m_pHost.GetInventory(InventoryConst.IVTRTYPE_EQUIPPACK);
if (m_pEquipPack.GetItem(InventoryConst.EQUIPIVTR_FLYSWORD, false) == null)
m_iFallMode = (int)GPMoveMode.GP_MOVE_FALL;
else
m_iFallMode = (int)GPMoveMode.GP_MOVE_FLYFALL;
if (m_pHost.IsDead())
m_iFallMode |= (int)GPMoveMode.GP_MOVE_DEAD;
if (!m_pHost.IsRooting())
{
float fDeltaTime = dwDeltaTime * 0.001f;
if (m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_GROUND ||
m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_AIR)
{
if (m_iFallType == Fall_type.TYPE_FLYFALL)
Fall_Air(fDeltaTime);
else
FreeFall_Air(fDeltaTime);
}
//else // m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER
//{
// if (m_iFallType == Fall_type.TYPE_FLYFALL)
// Fall_Water(fDeltaTime);
// else
// FreeFall_Water(fDeltaTime);
//}
}
return true;
}
// Free fall in air
public bool Fall_Air(float fDeltaTime)
{
A3DVECTOR3 vCurPos = m_pHost.GetPos();
// A3DVECTOR3 vCurVel = m_pHost.m_vVelocity;
CDR_INFO cdr = m_pHost.m_CDRInfo;
bool bWorkEnd = false;
if (m_pHost.m_GndInfo.bOnGround)
{
bWorkEnd = true;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
}
else
{
vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vDirH, m_fSpeedH, fDeltaTime);
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
{
bWorkEnd = true;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
}
else
{
float fHei = vCurPos.y - m_pHost.m_GndInfo.fGndHei;
if (fHei > 25f)
{
if (m_nCurStage == FlyFallStage.enumStageNone)
{
m_nCurStage = FlyFallStage.enumStageUpperAir;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_HIGH, false);
}
}
else if (fHei > 20f)
{
if (m_nCurStage == FlyFallStage.enumStageNone)
{
m_nCurStage = FlyFallStage.enumStageLowerAir;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_WING_LOW, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_LOW, false);
}
}
else if (fHei > 3.0f)
{
if (m_nCurStage == FlyFallStage.enumStageNone
|| m_nCurStage == FlyFallStage.enumStageUpperAir)
{
m_nCurStage = FlyFallStage.enumStageLowerAir;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_WING_LOW, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_LOW, false);
}
}
else
{
if (m_nCurStage != FlyFallStage.enumStageLandOn)
{
m_nCurStage = FlyFallStage.enumStageLandOn;
//if (m_pHost.UsingWing())
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
else
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
}
}
}
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
}
if (bWorkEnd)
{
Finish();
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
float fSpeed = cdr.vAbsVelocity.magnitude;
if (Math.Abs(fSpeed - 0) < float.Epsilon)
fSpeed = m_pHost.GetFlySpeed();
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, m_iFallMode);
m_pHost.m_vVelocity.Clear();
return true;
}
else
{
m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), m_iFallMode);
}
return true;
}
// Free fall in air
public bool FreeFall_Air(float fDeltaTime)
{
A3DVECTOR3 vCurPos = m_pHost.GetPos();
// A3DVECTOR3 vCurVel = m_pHost.m_vVelocity;
CDR_INFO cdr = m_pHost.m_CDRInfo;
if (m_pHost.m_GndInfo.bOnGround)
{
Finish();
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
float fSpeed = cdr.vAbsVelocity.magnitude;
if (Math.Abs(fSpeed - 0) < float.Epsilon)
fSpeed = m_pHost.GetFlySpeed();
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, m_iFallMode);
m_pHost.m_vVelocity.Clear();
}
else
{
vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vDirH, m_fSpeedH, fDeltaTime);
// If player is blocked, add disturb speed at random direction
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
{
cdr.fYVel = 0.0f;
Finish();
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), 5.0f, m_iFallMode);
}
/* {
m_fSpeedH = 3.0f;
m_vDirH = glb_RandomVectorH();
}
else
{
m_fSpeedH = 0.0f;
m_vDirH.Clear();
} */
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), m_iFallMode);
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false);
}
return true;
}
// Finish
public void Finish()
{
m_bFinished = true;
m_pHost.m_CDRInfo.vAbsVelocity = Vector3.zero;
// m_pHost.m_CDRInfo.fYVel = 0.0f;
//if (m_iFallType == Fall_type.TYPE_FLYFALL)
// m_pHost.ShowWing(false);
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a85280d3ca5f703449ffa56b24ca7e47
@@ -615,6 +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);
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
@@ -139,11 +139,12 @@ namespace BrewMonster.Scripts
}
else if (iMoveReason == 2)
{
// var pWork = (CECHPWorkFall)m_pWorkMan.CreateWork(Host_work_ID.WORK_FREEFALL);
// if (pWork != null) {
// pWork.SetFallType(CECHPWorkFall.TYPE_FREEFALL);
// m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork));
// }
var pWork = (CECHPWorkFall)m_pWorkMan.CreateWork(Host_work_ID.WORK_FREEFALL);
if (pWork != null)
{
pWork.SetFallType(CECHPWorkFall.Fall_type.TYPE_FREEFALL);
m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork));
}
}
else
{
@@ -64,7 +64,7 @@ public abstract partial class CECPlayer : CECObject
private QueueActionEvent queueActionEvent;
protected static PLAYER_LEVELEXP_CONFIG _player_levelup_exp;
private CECPlayerActionController m_pActionController;
private enumWingType m_wingType;
private enumWingType m_wingType = enumWingType.WINGTYPE_FLYSWORD;
protected int m_idCurSkillTarget;
protected CECSkill m_pCurSkill;
@@ -1561,6 +1561,8 @@ public abstract partial class CECPlayer : CECObject
{
return m_strName;
}
public enumWingType GetWingType() { return m_wingType; }
}
public struct PlayActionEvent
+28 -28
View File
@@ -212,7 +212,7 @@ namespace BrewMonster.Scripts
{
vDelta = vVelocity * fTime;
float fDeltaDist = vDelta.magnitude;
//if (fDeltaDist < DIST_EPSILON) break;
if (fDeltaDist < DIST_EPSILON) break;
// TO DO: fix later beacuse logic in CollideWithEnv_BoxCast is wrong
//bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask,
@@ -227,7 +227,7 @@ namespace BrewMonster.Scripts
CDRInfo.fMoveDist += fDeltaDist;
break;
}
//if (bStartSolid)
//if (trcInfo.bStartSolid)
//{
// CDRInfo.fMoveDist = 0f;
// if (CDRInfo.vTPNormal.y < CDRInfo.fSlopeThresh) CDRInfo.vTPNormal = Vector3.up;
@@ -273,35 +273,35 @@ namespace BrewMonster.Scripts
bTryPull = true;
}
//if (!bPull)
//{
// if (vVelocity.sqrMagnitude > 1e-12f)
// {
// vVelDir = vVelocity.normalized;
// fVelSpeed = vVelocity.magnitude * (1f - nTry * 0.1f);
if (!bPull)
{
if (vVelocity.sqrMagnitude > 1e-12f)
{
vVelDir = vVelocity.normalized;
fVelSpeed = vVelocity.magnitude * (1f - nTry * 0.1f);
// dtp = Vector3.Dot(vNormal, vVelDir);
// float fRelSpeed = Mathf.Min(fVelSpeed, 5.0f);
dtp = Vector3.Dot(vNormal, vVelDir);
float fRelSpeed = Mathf.Min(fVelSpeed, 5.0f);
// if (dtp >= 0f && dtp < 1e-4f)
// {
// vVelocity += vNormal * VEL_REFLECT * fRelSpeed;
// }
// else
// {
// vVelocity = (vVelDir - vNormal * dtp) * fVelSpeed - vNormal * dtp * VEL_REFLECT * fRelSpeed;
// }
// }
if (dtp >= 0f && dtp < 1e-4f)
{
vVelocity += vNormal * VEL_REFLECT * fRelSpeed;
}
else
{
vVelocity = (vVelDir - vNormal * dtp) * fVelSpeed - vNormal * dtp * VEL_REFLECT * fRelSpeed;
}
}
// if (fYVel > VEL_EPSILON)
// {
// if (vNormal.y >= CDRInfo.fSlopeThresh || vNormal.y < -NORMAL_EPSILON) fYVel = 0f;
// }
// else if (fYVel < -VEL_EPSILON)
// {
// if (vNormal.y >= CDRInfo.fSlopeThresh) fYVel = 0f;
// }
//}
if (fYVel > VEL_EPSILON)
{
if (vNormal.y >= CDRInfo.fSlopeThresh || vNormal.y < -NORMAL_EPSILON) fYVel = 0f;
}
else if (fYVel < -VEL_EPSILON)
{
if (vNormal.y >= CDRInfo.fSlopeThresh) fYVel = 0f;
}
}
}
// “vertical ground trace” thay RetrieveSupportPlane
+7 -2
View File
@@ -85,6 +85,7 @@ namespace BrewMonster
private float m_fPrayDistancePlus;
private A3DVECTOR3 g_vOrigin = new A3DVECTOR3(0f);
private Transform playerTransform;
private float EC_SLOPE_Y = 0.5f;
// ====== Ground cast config ======
[Header("Ground Cast")]
@@ -1245,9 +1246,13 @@ namespace BrewMonster
m_aabbServer = m_aabb;
CalcPlayerAABB();
SetPos(pos);
m_CDRInfo.fStepHeight = 0.8f;
//m_CDRInfo.vTPNormal = GroundCheck(out RaycastHit hit) ? hit.normal : Vector3.zero;
m_CDRInfo.vExtent = EC_Utility.ToVector3(m_aabbServer.Extents);
m_CDRInfo.vTPNormal = EC_Utility.ToVector3(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));
@@ -1276,7 +1281,7 @@ namespace BrewMonster
pWork.SetBeSittingFlag(true);
m_pWorkMan.StartWork_p1(pWork);
}*/
m_GndInfo.bOnGround = GroundCheck(out lastGroundHit);
LoadResources();
if (m_pWorkMan == null)
{