500 lines
16 KiB
C++
500 lines
16 KiB
C++
|
|
#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) );
|
|||
|
|
}
|