2024-12-21 10:04:04 +08:00
# include "StdAfx.h"
# include "DnWorldHitMoveDamageBrokenProp.h"
# include "TaskManager.h"
# include "DnGameTask.h"
# include "DNUserSession.h"
# include "DnWorldSector.h"
# include "NavigationMesh.h"
CDnWorldHitMoveDamageBrokenProp : : CDnWorldHitMoveDamageBrokenProp ( CMultiRoom * pRoom ) : CDnWorldBrokenDamageProp ( pRoom ) ,
m_bHitMove ( false ) ,
m_fMoveDistance ( 0.0f ) ,
m_fWholeMoveTime ( 0.0f ) ,
m_fMovedTime ( 0.0f ) ,
m_fVelocity ( 0.0f ) ,
m_fResist ( 0.0f ) ,
m_pCurCell ( NULL ) ,
m_iMovingAxis ( MOVE_AXIS_NONE ) ,
m_fAxisMovingSpeed ( 0.0f ) ,
m_fAxisMaxMoveDistance ( 0.0f ) ,
m_bArrived ( false ) ,
m_fDelta ( 0.0f ) ,
m_iActivateElementIndex ( - 1 ) ,
m_bActivate ( false )
{
}
CDnWorldHitMoveDamageBrokenProp : : ~ CDnWorldHitMoveDamageBrokenProp ( void )
{
ReleasePostCustomParam ( ) ;
}
bool CDnWorldHitMoveDamageBrokenProp : : InitializeTable ( int nTableID )
{
if ( CDnWorldActProp : : InitializeTable ( nTableID ) = = false ) return false ;
if ( GetData ( ) ) {
HitMoveDamageBrokenStruct * pStruct = ( HitMoveDamageBrokenStruct * ) GetData ( ) ;
bool bResult = false ;
//#61146 TrapŸ<70> <C5B8> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ݷ<EFBFBD> <DDB7> <EFBFBD> <20> <> <EFBFBD> ̵<EFBFBD> <CCB5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ٸ<EFBFBD> <D9B8> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> ִ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
# ifdef PER_ADD_PROP_TRAP_DIFFICULT_SET
bResult = InitializeMonsterActorProp ( pStruct - > nMonsterTableID , pStruct - > MonsterWeight ) ;
# else
bResult = InitializeMonsterActorProp ( pStruct - > nMonsterTableID ) ;
# endif
if ( bResult )
{
// m_hMonster->SetUniqueID( STATIC_INSTANCE(CDnActor::s_dwUniqueCount)++ );
m_nDurability = pStruct - > nDurability ;
if ( - 1 ! = m_nDurability )
{
if ( 0 = = m_nDurability ) m_nDurability = 1 ;
m_nItemDropGroupTableID = pStruct - > nItemDropGroupTableID ;
if ( m_nItemDropGroupTableID > 0 )
{
CDnDropItem : : CalcDropItemList ( GetRoom ( ) , Dungeon : : Difficulty : : Max , m_nItemDropGroupTableID , m_VecDropItemList ) ;
if ( m_VecDropItemList . empty ( ) )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> α <EFBFBD>
// g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, 0, nTableID); // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> α <EFBFBD> 090226
}
else
{
for ( DWORD i = 0 ; i < m_VecDropItemList . size ( ) ; i + + )
{
# if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
if ( CDnDropItem : : PreInitializeItem ( GetRoom ( ) , m_VecDropItemList [ i ] . nItemID , m_VecDropItemList [ i ] . nEnchantID ) = = false )
# else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
if ( CDnDropItem : : PreInitializeItem ( GetRoom ( ) , m_VecDropItemList [ i ] . nItemID ) = = false )
# endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
{
m_VecDropItemList . erase ( m_VecDropItemList . begin ( ) + i ) ;
i - - ;
continue ;
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> α <EFBFBD>
// g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, m_VecDropItemList[i].nItemID, nTableID); // <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> α <EFBFBD> 090226
}
}
}
m_iMovingAxis = pStruct - > MovingAxis ;
m_fAxisMovingSpeed = pStruct - > fDefaultAxisMovingSpeed ;
m_fAxisMaxMoveDistance = pStruct - > fMaxAxisMoveDistance ;
}
m_HitComponent . Initialize ( m_hMonster , & m_Cross , GetMySmartPtr ( ) , this ) ;
}
else
return false ;
}
return true ;
}
bool CDnWorldHitMoveDamageBrokenProp : : Initialize ( CEtWorldSector * pParentSector , const char * szPropName , EtVector3 & vPos , EtVector3 & vRotate , EtVector3 & vScale )
{
bool bResult = CDnWorldBrokenDamageProp : : Initialize ( pParentSector , szPropName , vPos , vRotate , vScale ) ;
EtVector3 vDir = m_Cross . m_vZAxis ;
EtVec3Normalize ( & vDir , & vDir ) ;
m_vInitialPos = m_Cross . m_vPosition ;
m_vDestPosition = m_Cross . m_vPosition + ( vDir * m_fAxisMaxMoveDistance ) ;
if ( m_Handle )
m_Handle - > SetTargetCollisionGroup ( COLLISION_GROUP_STATIC ( 1 ) | COLLISION_GROUP_DYNAMIC ( 2 ) ) ;
return bResult ;
}
bool CDnWorldHitMoveDamageBrokenProp : : CreateObject ( void )
{
bool bResult = CDnWorldBrokenDamageProp : : CreateObject ( ) ;
if ( bResult )
{
m_iActivateElementIndex = GetElementIndex ( " Activate " ) ;
}
return bResult ;
}
void CDnWorldHitMoveDamageBrokenProp : : _GetPosProperly ( EtVector3 & vPrevPos )
{
NavigationMesh * pNavMesh = INSTANCE ( CDnWorld ) . GetNavMesh ( m_Cross . m_vPosition ) ;
if ( ! pNavMesh )
{
//EtVector3 vPrevPos = m_Cross.m_vPosition;
if ( CDnWorld : : GetInstance ( GetRoom ( ) ) . GetAttribute ( m_Cross . m_vPosition ) ! = 0 )
{
m_Cross . m_vPosition = vPrevPos ;
}
m_Cross . m_vPosition . y = CDnWorld : : GetInstance ( GetRoom ( ) ) . GetHeight ( m_Cross . m_vPosition ) ;
}
else
{
if ( m_pCurCell = = NULL )
{
m_pCurCell = pNavMesh - > FindClosestCell ( m_Cross . m_vPosition ) ;
if ( ( m_pCurCell = = NULL ) | | ( ! m_pCurCell - > IsPointInCellCollumn ( m_Cross . m_vPosition ) ) )
{
m_pCurCell = NULL ;
//EtVector3 vPrevPos = m_Cross.m_vPosition;
if ( CDnWorld : : GetInstance ( GetRoom ( ) ) . GetAttribute ( m_Cross . m_vPosition ) ! = 0 )
{
m_Cross . m_vPosition = vPrevPos ;
}
m_Cross . m_vPosition . y = CDnWorld : : GetInstance ( GetRoom ( ) ) . GetHeight ( m_Cross . m_vPosition ) ;
}
}
if ( m_pCurCell )
{
//EtVector3 vPrevPos = m_Cross.m_vPosition;
//m_Cross.MoveFrontBack( fValue );
int nSide = - 1 ;
NavigationCell * pLastCell = NULL ;
m_pCurCell - > FindLastCollision ( vPrevPos , m_Cross . m_vPosition , & pLastCell , nSide ) ;
if ( nSide ! = - 1 )
{
if ( pLastCell - > Link ( nSide ) = = NULL )
{
EtVector2 vMoveDir2D ( m_Cross . m_vPosition . x - vPrevPos . x , m_Cross . m_vPosition . z - vPrevPos . z ) ;
float fMoveLength = EtVec2Length ( & vMoveDir2D ) ;
vMoveDir2D / = fMoveLength ;
EtVector2 vWallDir2D = pLastCell - > Side ( nSide ) - > EndPointB ( ) - pLastCell - > Side ( nSide ) - > EndPointA ( ) ;
EtVec2Normalize ( & vWallDir2D , & vWallDir2D ) ;
fMoveLength * = EtVec2Dot ( & vWallDir2D , & vMoveDir2D ) ;
m_Cross . m_vPosition . x = vPrevPos . x + fMoveLength * vWallDir2D . x ;
m_Cross . m_vPosition . z = vPrevPos . z + fMoveLength * vWallDir2D . y ;
int nNewSide = - 1 ;
m_pCurCell - > FindLastCollision ( vPrevPos , m_Cross . m_vPosition , & pLastCell , nNewSide ) ;
if ( nNewSide ! = - 1 )
{
if ( pLastCell - > Link ( nNewSide ) )
{
NavigationCell * pNewCell ;
pNewCell = pLastCell - > Link ( nNewSide ) ;
if ( pNewCell - > IsPointInCellCollumn ( m_Cross . m_vPosition ) )
{
m_pCurCell = pNewCell ;
}
else
{
m_Cross . m_vPosition . x = vPrevPos . x ;
m_Cross . m_vPosition . z = vPrevPos . z ;
}
}
else if ( ! m_pCurCell - > IsPointInCellCollumn ( m_Cross . m_vPosition ) )
{
m_Cross . m_vPosition . x = vPrevPos . x ;
m_Cross . m_vPosition . z = vPrevPos . z ;
}
}
}
else
{
m_pCurCell = pLastCell - > Link ( nSide ) ;
}
}
if ( m_pCurCell - > GetType ( ) = = NavigationCell : : CT_PROP )
m_Cross . m_vPosition . y = m_pCurCell - > GetPlane ( ) - > SolveForY ( m_Cross . m_vPosition . x , m_Cross . m_vPosition . z ) ;
else
m_Cross . m_vPosition . y = CDnWorld : : GetInstance ( GetRoom ( ) ) . GetHeight ( m_Cross . m_vPosition ) ;
}
}
}
void CDnWorldHitMoveDamageBrokenProp : : _UpdatePropPos ( )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
EtVector3 vOffset = * m_pParentSector - > GetOffset ( ) ;
vOffset . x - = ( m_pParentSector - > GetTileWidthCount ( ) * m_pParentSector - > GetTileSize ( ) ) / 2.f ;
vOffset . z - = ( m_pParentSector - > GetTileHeightCount ( ) * m_pParentSector - > GetTileSize ( ) ) / 2.f ;
vOffset . y = 0.f ;
m_vPosition = m_Cross . m_vPosition - vOffset ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ִ<EFBFBD> <20> <> <EFBFBD> 찡 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
// m_vCross ũ<> ν <EFBFBD> <20> <> <EFBFBD> Ϳ <EFBFBD> <CDBF> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϸ<EFBFBD> <20> ̵<EFBFBD> <CCB5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> Ƿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ü<EFBFBD> <C3BC> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ʈ <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ѵ <EFBFBD> .
// hit signal ó<> <C3B3> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> prop <20> <> ü<EFBFBD> <C3BC> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϰ<EFBFBD> <20> ȴ<EFBFBD> . MatrixEx <20> <> <20> ̵<EFBFBD> <CCB5> <EFBFBD> ȸ<> <C8B8> <EFBFBD> <EFBFBD> .
EtMatrix matScale ;
m_matWorld = m_Cross ;
EtMatrixScaling ( & matScale , m_vScale . x , m_vScale . y , m_vScale . z ) ;
EtMatrixMultiply ( & m_matWorld , & matScale , & m_matWorld ) ;
m_Handle - > Update ( & m_matWorld ) ;
// <20> ̵<EFBFBD> <CCB5> Ǹ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> Ʈ<EFBFBD> <C6AE> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ʈ <20> <> <EFBFBD> Ϲ Ƿ<CFB9> <20> <> <20> ༮<EFBFBD> <E0BCAE> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ʈ <20> <> <EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <20> Ѵ <EFBFBD> .
SSphere Sphere ;
GetBoundingSphere ( Sphere ) ;
m_pCurOctreeNode = static_cast < CDnWorldSector * > ( m_pParentSector ) - > GetOctree ( ) - > Update ( GetMySmartPtr ( ) , Sphere , m_pCurOctreeNode ) ;
}
void CDnWorldHitMoveDamageBrokenProp : : Process ( EtMatrix * pmatWorld , LOCAL_TIME LocalTime , float fDelta )
{
// <20> <> <EFBFBD> <EFBFBD> Ÿ<> <C5B8> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ؾ<EFBFBD> <20> <> .
// delta <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ʿ<EFBFBD> 3<> <33> <EFBFBD> <EFBFBD> <20> ѹ<EFBFBD> <D1B9> <EFBFBD> process <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> Ȯ<EFBFBD> <C8AE> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <20> ƴ<EFBFBD> .
if ( 0 = = m_PrevLocalTime )
m_fDelta = fDelta ;
else
m_fDelta = float ( LocalTime - m_PrevLocalTime ) * 0.001f ;
m_PrevLocalTime = LocalTime ;
if ( 0.0f = = m_fDelta )
return ;
CDnWorldBrokenProp : : Process ( pmatWorld , LocalTime , m_fDelta ) ;
m_bActivate = ( GetElementIndex ( GetCurrentAction ( ) ) = = m_iActivateElementIndex ) ;
// <20> ϴ<EFBFBD> <20> <> <20> ̷<EFBFBD> <CCB7> <EFBFBD> <20> ϰ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ŭ<> <C5AC> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> <C4A1> Ʋ<> <C6B2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ٸ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> غ<EFBFBD> <D8BA> <EFBFBD> .
if ( m_bHitMove )
{
m_fMovedTime + = m_fDelta ;
EtVector3 vPrevPos = m_Cross . m_vPosition ;
EtVector3 vTargetPos ;
if ( m_fMovedTime < m_fWholeMoveTime )
{
vTargetPos = m_vHitPosition + m_vVelocity * m_fMovedTime + 0.5f * m_vResist * m_fMovedTime * m_fMovedTime ;
}
else
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ׳ <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
vTargetPos = m_vHitPosition + m_vVelocity * m_fWholeMoveTime + 0.5f * m_vResist * m_fWholeMoveTime * m_fWholeMoveTime ;
m_bHitMove = false ;
m_fMovedTime = 0.0f ;
}
MatrixEx m_matTarget = m_Cross ;
m_matTarget . m_vPosition = vTargetPos ;
DNVector ( SCollisionResponse ) vecResult ;
m_Handle - > FindCollision ( m_matTarget , vecResult ) ;
bool bCollision = false ;
if ( vecResult . size ( ) > 1 )
{
for ( int i = 0 ; i < vecResult . size ( ) ; i + + )
{
if ( vecResult [ i ] . pCollisionPrimitive - > Type ! = CT_CAPSULE )
{
bCollision = true ;
}
else
{
SCollisionCapsule * pCollisionCapsule = dynamic_cast < SCollisionCapsule * > ( vecResult [ i ] . pCollisionPrimitive ) ;
if ( pCollisionCapsule & & pCollisionCapsule - > fRadius ! = 18.0f ) // hit<69> <74> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ȵDZ<C8B5> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> radius 18.0f <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <>
{
bCollision = true ;
m_bHitMove = false ;
m_fMovedTime = 0.0f ;
}
}
}
}
if ( ! bCollision )
m_Cross . m_vPosition = vTargetPos ;
_GetPosProperly ( vPrevPos ) ;
_UpdatePropPos ( ) ;
}
else if ( m_bActivate & & false = = m_bArrived & & MOVE_AXIS_NONE ! = m_iMovingAxis & & 0.0f ! = m_fAxisMovingSpeed )
{
EtVector3 vPrevPos = m_Cross . m_vPosition ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ⺻ <20> ̵<EFBFBD> <20> <> <EFBFBD> °<EFBFBD> <20> <> <EFBFBD> ǵǾ<C7B5> <C7BE> ִٸ<D6B4> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ش<EFBFBD> .
m_Cross . MoveLocalZAxis ( m_fAxisMovingSpeed * m_fDelta ) ;
// <20> <> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> <C4A1> <20> ʰ<EFBFBD> <CAB0> ߴ ٸ<DFB4> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ó<> <C3B3> <EFBFBD> Ѵ <EFBFBD> .
EtVector3 vMovableLength = m_vInitialPos - m_vDestPosition ;
float fMovableLengthSQ = EtVec3LengthSq ( & vMovableLength ) ;
EtVector3 vMovedLength = m_vInitialPos - m_Cross . m_vPosition ;
float fCurrentMovedLength = EtVec3LengthSq ( & vMovedLength ) ;
if ( fMovableLengthSQ < fCurrentMovedLength )
{
m_Cross . m_vPosition = m_vDestPosition ;
m_bArrived = true ;
}
_GetPosProperly ( vPrevPos ) ;
_UpdatePropPos ( ) ;
}
}
void CDnWorldHitMoveDamageBrokenProp : : OnDamage ( CDnDamageBase * pHitter , CDnDamageBase : : SHitParam & HitParam )
{
// #29483 <20> ʹ <EFBFBD> ū <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ҹ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> Ŭ<> <C5AC> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ش<EFBFBD> .
float fOrignalDurability = 0.0f ;
if ( 5.0f < HitParam . fDurability )
{
fOrignalDurability = HitParam . fDurability ;
HitParam . fDurability = 5.0f ;
}
//////////////////////////////////////////////////////////////////////////
// <20> <> <20> ̵<EFBFBD> <CCB5> Ǵ<EFBFBD> Ÿ<> <C5B8> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> ǰ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ġ<EFBFBD> <C4A1> <EFBFBD> <EFBFBD> <20> и<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ƴ϶<C6B4> <CFB6> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϰ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> Ǿ<EFBFBD> <C7BE> <EFBFBD> <20> <> break <20> <EFBFBD> <D7BC> <EFBFBD> <20> <> <EFBFBD> ; <EFBFBD> <20> Ϲ Ƿ<CFB9> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ٽ<EFBFBD> ȸ<> <C8B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> .
if ( MOVE_AXIS_NONE ! = m_iMovingAxis & &
0.0f ! = m_fAxisMovingSpeed )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ư<EFBFBD> <20> ð<EFBFBD> <C3B0> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
float fVelocity = EtVec3Length ( & HitParam . vVelocity ) ;
float fResist = EtVec3Length ( & HitParam . vResistance ) ;
float fWholeMoveTime = 0.0f ;
if ( 0.0f = = fVelocity & & 0.0f = = fResist )
fWholeMoveTime = 0.0f ;
else
fWholeMoveTime = fVelocity / fResist ;
if ( fWholeMoveTime > 0.2f )
fWholeMoveTime = 0.2f ;
EtVector3 vDir ;
switch ( m_iMovingAxis )
{
case MOVE_PROPLOCAL_AXIS_X :
vDir = - m_Cross . m_vXAxis ;
break ;
case MOVE_PROPLOCAL_AXIS_Y :
vDir = - m_Cross . m_vYAxis ;
break ;
case MOVE_PROPLOCAL_AXIS_Z :
vDir = - m_Cross . m_vZAxis ;
break ;
}
EtVec3Normalize ( & vDir , & vDir ) ;
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> Ѵ <EFBFBD> .
EtVector3 vVelocity = vDir * 400.0f * HitParam . fDurability ; // <20> ʱ<EFBFBD> <20> ӵ<EFBFBD>
EtVector3 vResist = - vDir * 80.0f ; // <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
EtVector3 vHitPosition = m_Cross . m_vPosition ;
EtVector3 vFinalPos = vHitPosition + vVelocity * fWholeMoveTime + 0.5f * vResist * fWholeMoveTime * fWholeMoveTime ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> и<EFBFBD> <D0B8> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϰ<EFBFBD> <20> Ÿ<EFBFBD> <C5B8> <EFBFBD> <20> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> .
// <20> ʱ<EFBFBD> <CAB1> <EFBFBD> ġ<EFBFBD> <C4A1> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> ٸ<EFBFBD> <20> ʱ<EFBFBD> <CAB1> <EFBFBD> ġ<EFBFBD> <C4A1> <EFBFBD> <EFBFBD> <20> <> <20> ڷ<EFBFBD> <20> зȴٴ<C8B4> <20> ̾߱Ⱑ <20> ȴ<EFBFBD> .
EtVector3 vMovableLength = m_vDestPosition - m_vInitialPos ;
float fMovableLengthSQ = EtVec3LengthSq ( & vMovableLength ) ;
EtVector3 vFinalPosLength = vFinalPos - m_vDestPosition ;
float fFinalPosLengthSQ = EtVec3LengthSq ( & vFinalPosLength ) ;
if ( fFinalPosLengthSQ < fMovableLengthSQ )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> и<EFBFBD> <D0B8> <EFBFBD> <20> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> CDnWorldBrokenProp::OnDamage() <20> <> <EFBFBD> <EFBFBD>
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0<> <30> <20> Ǿ<EFBFBD> break ó<> <C3B3> <20> <> <EFBFBD> <EFBFBD> <20> ʵ<EFBFBD> <CAB5> <EFBFBD> <20> Ѵ <EFBFBD> .
m_nDurability = ( int ) ( HitParam . fDurability * 100.f ) + 1 ;
}
}
CDnWorldBrokenProp : : OnDamage ( pHitter , HitParam ) ;
if ( false = = m_bBroken )
{
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
EtVector3 vOffset = * m_pParentSector - > GetOffset ( ) ;
vOffset . x - = ( m_pParentSector - > GetTileWidthCount ( ) * m_pParentSector - > GetTileSize ( ) ) / 2.f ;
vOffset . z - = ( m_pParentSector - > GetTileHeightCount ( ) * m_pParentSector - > GetTileSize ( ) ) / 2.f ;
vOffset . y = 0.f ;
m_vPosition = m_Cross . m_vPosition - vOffset ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ư<EFBFBD> <20> ð<EFBFBD> <C3B0> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
m_fVelocity = EtVec3Length ( & HitParam . vVelocity ) ;
m_fResist = EtVec3Length ( & HitParam . vResistance ) ;
if ( 0.0f = = m_fVelocity & & 0.0f = = m_fResist )
m_fWholeMoveTime = 0.0f ;
else
m_fWholeMoveTime = m_fVelocity / m_fResist ;
if ( m_fWholeMoveTime > 0.2f )
m_fWholeMoveTime = 0.2f ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̴<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <C7BE> ִٸ<D6B4> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ó<> <C3B3> .
if ( MOVE_AXIS_NONE ! = m_iMovingAxis & &
0.0f ! = m_fAxisMovingSpeed )
{
switch ( m_iMovingAxis )
{
case MOVE_PROPLOCAL_AXIS_X :
m_vDir = - m_Cross . m_vXAxis ;
break ;
case MOVE_PROPLOCAL_AXIS_Y :
m_vDir = - m_Cross . m_vYAxis ;
break ;
case MOVE_PROPLOCAL_AXIS_Z :
m_vDir = - m_Cross . m_vZAxis ;
break ;
}
EtVec3Normalize ( & m_vDir , & m_vDir ) ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ¾<EFBFBD> <C2BE> <EFBFBD> <EFBFBD> <EFBFBD> <20> ٽ<EFBFBD> <20> <> <20> ̵<EFBFBD> <20> ǵ<EFBFBD> <C7B5> <EFBFBD> <20> ÷<EFBFBD> <C3B7> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
m_bArrived = false ;
}
else
{
m_vDir . y = 0.0f ;
EtVec3Normalize ( & m_vDir , & HitParam . vViewVec ) ;
m_vDir = - m_vDir ;
}
// <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> Ѵ <EFBFBD> .
m_vVelocity = m_vDir * 200.0f * HitParam . fDurability ; // <20> ʱ<EFBFBD> <20> ӵ<EFBFBD>
m_vResist = - m_vDir * 80.0f ; // <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
m_vHitPosition = m_Cross . m_vPosition ;
m_bHitMove = true ;
}
else
{
// <20> <> <20> ̵<EFBFBD> <CCB5> ϴ<EFBFBD> <20> ༮<EFBFBD> ε<EFBFBD> broken <20> <> <20> <> <EFBFBD> 쿣 <20> <> <EFBFBD> <EFBFBD> <20> <> ġ<EFBFBD> <C4A1> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> .
if ( false = = m_bArrived & &
MOVE_AXIS_NONE ! = m_iMovingAxis & &
0.0f ! = m_fAxisMovingSpeed )
{
m_Cross . m_vPosition = m_vInitialPos ;
m_bArrived = true ;
_UpdatePropPos ( ) ;
}
}
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ߴ <EFBFBD> <DFB4> <EFBFBD> <20> ٽ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> .
if ( 0.0f < fOrignalDurability )
HitParam . fDurability = fOrignalDurability ;
}
void CDnWorldHitMoveDamageBrokenProp : : OnDamageWriteAdditionalPacket ( CDnDamageBase : : SHitParam & HitParam , CPacketCompressStream * pStream )
{
pStream - > Write ( & m_Cross . m_vPosition , sizeof ( EtVector3 ) , CPacketCompressStream : : VECTOR3_BIT ) ;
// pStream->Write( &HitParam.vViewVec, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
pStream - > Write ( & HitParam . vVelocity , sizeof ( EtVector3 ) , CPacketCompressStream : : VECTOR3_BIT ) ;
pStream - > Write ( & HitParam . vResistance , sizeof ( EtVector3 ) , CPacketCompressStream : : VECTOR3_BIT ) ;
pStream - > Write ( & HitParam . fDurability , sizeof ( float ) ) ;
}