DragonNest/Server/DNGameServer/DnVehicleActor.cpp

614 lines
19 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include <mmsystem.h>
#include "TaskManager.h"
#include "DNGameDataManager.h"
#include "DnWorld.h"
#include "navigationmesh.h"
#include "DnVehicleActor.h"
#include "DnActorClassDefine.h"
#include "DnMovableChecker.h"
#include "DnJumpableChecker.h"
#include "DnGroundMovableChecker.h"
#include "DnStateBlow.h"
#include "MAWalkMovement.h"
#include "DnGameTask.h"
#include "DNUserSession.h"
CDnVehicleActor::CDnVehicleActor( CMultiRoom *pRoom, int nClassID )
: CDnActor( pRoom, nClassID )
{
CDnActionBase::Initialize( this );
CDnVehicleState::Initialize(nClassID);
m_bAttachToPlayer = false;
m_hMyActor.Identity();
for(int i=0;i<2;i++)
m_hSimpleParts[i].Identity();
m_cMovePushKeyFlag = 0;
m_dwHairColor = 0;
// <20><><EFBFBD>ٰ<EFBFBD><D9B0><EFBFBD>
m_dwSyncDatumTick = 0;
m_vLastValidPos = EtVector3( 0.f, 0.f, 0.f );
#ifdef PRE_ADD_VEHICLE_ACTION_STRING
m_strVehicleActionString = "Vehicle_"; // As Default
#endif
SetHP(10); // Ż<><C5BB><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʰ<EFBFBD><CAB0>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20>°ԵǸ<D4B5> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ե˴ϴ<CBB4>.
SetMaxHP(10);
}
CDnVehicleActor::~CDnVehicleActor()
{
for(int i=0;i<2;i++)
SAFE_RELEASE_SPTR( m_hSimpleParts[i] );
}
void CDnVehicleActor::ProcessDie( LOCAL_TIME LocalTime, float fDelta )
{
if( !IsDie() ) return;
if(GetMyPlayerActor())
{
CDnPlayerActor *pPlayerActor = static_cast<CDnPlayerActor*>(GetMyPlayerActor().GetPointer());
if(pPlayerActor->IsVehicleMode())
pPlayerActor->ForceUnRideVehicle();
// Ż<><C5BB><EFBFBD><EFBFBD> <20><>ü<EFBFBD>Ҹ<EFBFBD><D2B8>̾ƴ<CCBE> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD><C2B0><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
// <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UnrideVehicle<6C><65> ȣ<><C8A3><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD> , SetDestroy<6F><79> <20>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
}
// m_fDieDelta -= fDelta; // <20>ϴ<EFBFBD> <20><><EFBFBD>̵<EFBFBD>Ÿ <20><><EFBFBD>°<EFBFBD><C2B0><20><><EFBFBD><EFBFBD><E2B6A7><EFBFBD><EFBFBD> <20><>ŵ<EFBFBD><C5B5><EFBFBD>ݴϴ<DDB4>.
// if( m_fDieDelta <= 0.f ) {
// SetDestroy();
// return;
// }
}
MAMovementBase* CDnVehicleActor::CreateMovement()
{
MAMovementBase* pMovement = new IBoostPoolMAWalkMovement();
return pMovement;
}
bool CDnVehicleActor::Initialize()
{
CDnActor::Initialize();
if( m_hObject ) {
m_hObject->SetCollisionGroup( COLLISION_GROUP_DYNAMIC( 1 ) );
m_hObject->SetTargetCollisionGroup( COLLISION_GROUP_STATIC( 1 ) | COLLISION_GROUP_DYNAMIC( 2 ) | COLLISION_GROUP_DYNAMIC( 3 ) ); // <20><20>׷<EFBFBD><D7B7><EFBFBD> <20>ϴ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.*/
}
// SetPartsColor(m_hSimpleParts[Hair]->GetObjectHandle(),"g_CustomColor",EtInterface::textcolor::SILVER); // <20><><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>. - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -
// SetPartsColor(m_hObject,"g_MaterialAmbient",EtInterface::textcolor::SILVER);
// g_MaterialAmbient
// g_MaterialDiffuse Ż<><C5BB> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><> !
return true;
}
void CDnVehicleActor::EquipItem(TItem tInfo)
{
TVehiclePartsData *pVehicleParts = g_pDataManager->GetVehiclePartsData(tInfo.nItemID);
if (!pVehicleParts) return;
if((pVehicleParts->nVehiclePartsType != Vehicle::Slot::Saddle) && (pVehicleParts->nVehiclePartsType != Vehicle::Slot::Hair))
return;
if(m_hSimpleParts[pVehicleParts->nVehiclePartsType-1])
{
SAFE_RELEASE_SPTR( m_hSimpleParts[pVehicleParts->nVehiclePartsType-1] );
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1] = CDnSimpleParts::CreateParts( GetRoom(), tInfo.nItemID, pVehicleParts->strSkinName.c_str(), m_szAniFileName.c_str() );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->InitializeItem(tInfo.nItemID,0,tInfo.cOption,0,tInfo.cPotential,tInfo.cSealCount,tInfo.bSoulbound);
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->SetSerialID(tInfo.nSerial);
//////////////////////
if(pVehicleParts->nVehiclePartsType-1 == Vehicle::Parts::Hair)
ChangeHairColor(m_dwHairColor);
}
else if(m_hSimpleParts[pVehicleParts->nVehiclePartsType-1] == NULL)
{
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1] = CDnSimpleParts::CreateParts( GetRoom(), tInfo.nItemID, pVehicleParts->strSkinName.c_str(), m_szAniFileName.c_str() );
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->InitializeItem(tInfo.nItemID,0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->InitializeItem(tInfo.nItemID,0,tInfo.cOption,0,tInfo.cPotential,tInfo.cSealCount,tInfo.bSoulbound);
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->SetSerialID(tInfo.nSerial);
//////////////////////
if(pVehicleParts->nVehiclePartsType-1 == Vehicle::Parts::Hair)
ChangeHairColor(m_dwHairColor);
}
}
void CDnVehicleActor::UnEquipItem(int nSlot)
{
TVehiclePartsData *pVehicleParts = g_pDataManager->GetVehiclePartsData(nSlot);
if (!pVehicleParts) return;
if((pVehicleParts->nVehiclePartsType != Vehicle::Slot::Saddle) && (pVehicleParts->nVehiclePartsType != Vehicle::Slot::Hair))
return;
if(m_hSimpleParts[pVehicleParts->nVehiclePartsType-1])
{
m_hSimpleParts[pVehicleParts->nVehiclePartsType-1]->FreeObject();
}
else
{
OutputDebug("Ż<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>");
}
}
void CDnVehicleActor::SetDefaultParts()
{
TVehicleData *pVehicle = g_pDataManager->GetVehicleData(m_nItemID);
if (!Vehicle) return;
// <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. //
TItem tItem;
memset(&tItem, 0, sizeof(tItem));
tItem.nItemID = pVehicle->nDefaultParts1;
EquipItem(tItem);
tItem.nItemID = pVehicle->nDefaultParts2;
EquipItem(tItem);
}
void CDnVehicleActor::ChangeHairColor(DWORD dwColor)
{
if(!m_hSimpleParts[Vehicle::Parts::Hair])
return;
if(dwColor !=0 )
m_dwHairColor = dwColor;
}
void CDnVehicleActor::SetDefaultHairColor()
{
int nVehicleDefaultColor = g_pDataManager->GetItemTypeParam1(m_nItemID);
ChangeHairColor(nVehicleDefaultColor);
if(m_dwHairColor == 0)
m_dwHairColor = nVehicleDefaultColor;
}
void CDnVehicleActor::Process(LOCAL_TIME LocalTime, float fDelta )
{
CDnActor::Process( LocalTime, fDelta );//
PreProcess( LocalTime, fDelta);//
if( 0 < GetCantXZMoveSEReferenceCount() )
m_vAniDistance.x = m_vAniDistance.z = 0.0f;
m_pMovement->Process( LocalTime, fDelta );
MASingleBody::Process( m_Cross, LocalTime, fDelta );//
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> SetParents ȿ<><C8BF>
if(m_hMyActor && !m_hMyActor->IsDestroy())
m_hMyActor->SetPosition(*GetPosition());
}
void CDnVehicleActor::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex )
{
switch( Type ) {
case STE_Projectile:
return;
case STE_Jump:
{
JumpStruct *pStruct = (JumpStruct *)pPtr;
EtVector2 vVec( 0.f, 0.f );
// <20>ִϸ<D6B4><CFB8>̼<EFBFBD> Ű <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>Ұ<EFBFBD><D2B0>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>Ű <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
if( 0 == GetCantXZMoveSEReferenceCount() )
{
if( !pStruct->bIgnoreJumpDir) {
if( m_cMovePushKeyFlag & 0x01 ) vVec.x -= 1.f;
if( m_cMovePushKeyFlag & 0x02 ) vVec.x += 1.f;
if( m_cMovePushKeyFlag & 0x04 ) vVec.y += 1.f;
if( m_cMovePushKeyFlag & 0x08 ) vVec.y -= 1.f;
EtVec2Normalize( &vVec, &vVec );
}
}
if( pStruct->bResetPrevVelocity ) {
SetVelocityY( 0.f );
SetResistanceY( 0.f );
}
Jump( pStruct->fJumpVelocity , vVec );
SetResistanceY( pStruct->fJumpResistance );
}
return;
}
CDnActor::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex );
}
void CDnVehicleActor::CmdMove( EtVector3 &vPos, const char *szActionName, int nLoopCount, float fBlendFrame )
{
MovePos( vPos, false );
SetActionQueue( szActionName, nLoopCount, fBlendFrame );
}
void CDnVehicleActor::CmdStop( const char *szActionName, int nLoopCount, float fBlendFrame, float fStartFrame, bool bResetStop )
{
MAMovementBase *pMovement = GetMovement();
if( !pMovement ) return;
pMovement->ResetMove();
SetActionQueue( szActionName, nLoopCount, fBlendFrame, fStartFrame );
}
void CDnVehicleActor::CmdAction( const char *szActionName, int nLoopCount, float fBlendFrame, bool bCheckOverlapAction,
bool bFromStateBlow/* = false*/, bool bSkillChain/* = false*/ )
{
CDnActor::CmdAction( szActionName, nLoopCount, fBlendFrame, bCheckOverlapAction, bFromStateBlow, bSkillChain );
}
void CDnVehicleActor::OnDrop( float fCurVelocity )
{
if( IsAir() ) {
if( !IsHit() ) {
char szStr[64];
sprintf_s( szStr, "%s_Landing", GetCurrentAction() );
if( IsExistAction( szStr ) )
{
SetActionQueue( szStr, 0, 0.f, 0.f, true, false );
}
else {// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20>ϴÿ<CFB4><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1>־ <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><20>־<EFBFBD><D6BE>ִ°<D6B4><C2B0><EFBFBD>
if( GetVelocity()->y != 0.f )
SetActionQueue( "Stand", 0, 0.f, 0.f, true, false );
}
SetMovable( false );
}
}
}
void CDnVehicleActor::OnFall( float fCurVelocity )
{
if( ( IsStay() || IsMove() ) && !IsFloorCollision() ) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴°<CCB4> <20><><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA>ƿ<EFBFBD>.
EtVector3 vDir = *GetPosition() - *GetPrevPosition();
EtVec3Normalize( &vDir, &vDir );
float fDot = EtVec3Dot( &EtVector3( 0.f, 1.f, 0.f ), &vDir );
float fAngle = EtToDegree( EtAcos( fDot ) );
if( fCurVelocity < -4.f && fAngle > 155.f ) {
ActionElementStruct *pStruct = GetElement( "Jump" );
if( pStruct ) {
SetActionQueue( "Jump", 0, 10.f, (float)pStruct->dwLength / 3.5f );
SetMovable( false );
}
}
}
}
int CDnVehicleActor::GetMoveSpeed()
{
int nMoveSpeed = CDnActor::GetMoveSpeed();
if( CDnWorld::IsActive(GetRoom()) && ( CDnWorld::GetInstance(GetRoom()).GetMapType() == EWorldEnum::MapTypeVillage || CDnWorld::GetInstance(GetRoom()).GetMapType() == EWorldEnum::MapTypeWorldMap ) )
nMoveSpeed += GetSafeZoneMoveSpeed();
if( m_cMovePushKeyFlag & 0x08 ) nMoveSpeed = 200;
return nMoveSpeed;
}
bool CDnVehicleActor::SetActionQueue( const char *szActionName, int nLoopCount, float fBlendFrame, float fStartFrame, bool bCheck, bool bCheckStateEffect )
{
std::string VehicleAction;
std::string szCurAction = szActionName;
#ifdef PRE_ADD_VEHICLE_ACTION_STRING
VehicleAction = GetVehicleActionString() + szCurAction;
#else
VehicleAction = "Vehicle_" + szCurAction;
#endif
if(m_hMyActor && !m_hMyActor->IsDestroy() )
m_hMyActor->SetActionQueue(VehicleAction.c_str(),nLoopCount,fBlendFrame,fStartFrame,bCheck,bCheckStateEffect); // <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߾<EFBFBD> <20>ݴϴ<DDB4>.
return CDnActor::SetActionQueue( szActionName , nLoopCount, fBlendFrame, fStartFrame, bCheck, bCheckStateEffect );
}
void CDnVehicleActor::OnDispatchMessage( CDNUserSession *pSession, DWORD dwActorProtocol, BYTE *pPacket )
{
switch( dwActorProtocol ) {
case eActor::CS_CMDMOVE:
{
CPacketCompressStream Stream( pPacket, 128 );
int nActionIndex;
int nMoveSpeed;
EtVector3 vPos, vXVec;
EtVector2 vZVec, vLook;
char cFlag;
DWORD dwGap;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &nActionIndex, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &cFlag, sizeof(char) );
Stream.Read( &nMoveSpeed, sizeof(int) );
Look( vZVec, false );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
SetMagnetPosition( vPos );
m_cMovePushKeyFlag = cFlag;
float fXSpeed = 0.f, fZSpeed = 0.f;
if( cFlag & 0x01 ) fXSpeed = -100000.f;
if( cFlag & 0x02 ) fXSpeed = 100000.f;
if( cFlag & 0x04 ) fZSpeed = 100000.f;
if( cFlag & 0x08 ) fZSpeed = -100000.f;
vPos += ( vXVec * fXSpeed );
vPos += ( EtVec2toVec3( vZVec ) * fZSpeed );
ActionElementStruct *pStruct = m_hMyActor->GetElement( nActionIndex ); // !<21>߿<EFBFBD>! <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>մϴ<D5B4>
if( pStruct == NULL ) break;
CmdMove( vPos, pStruct->szName.c_str(), -1, 8.f );
}
break;
case eActor::CS_CMDSTOP:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
bool bResetStop;
DWORD dwGap;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &bResetStop, sizeof(bool) );
std::string szActionName = GetCurrentAction();
if( EtVec2Length( &( EtVector2( vPos.x, vPos.z ) - EtVector2( GetPosition()->x, GetPosition()->z ) ) ) > 100.f ) {
if( GetState() != ActorStateEnum::Move ) szActionName = "Move_Front";
}
if(strstr(GetCurrentAction(),"Stand") == NULL)
{
CmdStop("Stand",-1,6.f);
}
}
break;
case eActor::CS_CMDACTION:
{
CPacketCompressStream Stream( pPacket, 128 );
int nActionIndex, nLoopCount;
float fBlendFrame;
EtVector3 vPos, vXVec;
EtVector2 vLook, vZVec;
DWORD dwGap;
bool bFromStateBlow = false;
Stream.Read( &nActionIndex, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &nLoopCount, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &fBlendFrame, sizeof(float), CPacketCompressStream::FLOAT_SHORT, 10.f );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &m_cMovePushKeyFlag, sizeof(char) );
Stream.Read( &bFromStateBlow, sizeof(bool) );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
m_pMovement->ResetMove();
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
Look( vLook, true );
SetMagnetPosition( vPos );
ActionElementStruct *pStruct = GetElement( nActionIndex );
if( pStruct == NULL ) break;
#ifdef PRE_ADD_VEHICLE_SPECIAL_ACTION
if( CheckSpecialAction( pStruct->szName.c_str() ) == false )
{
if( m_hMyActor )
{
CDnPlayerActor *pPlayerActor = static_cast<CDnPlayerActor*>(m_hMyActor.GetPointer());
pPlayerActor->ReportInvalidAction();
}
break;
}
#endif
CmdAction( pStruct->szName.c_str(), nLoopCount, fBlendFrame, false );
}
break;
case eActor::CS_CMDLOOK:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector2 vLook, vZVec;
EtVector3 vXVec;
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
CmdLook( vLook );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
}
break;
case eActor::CS_POSREV:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
bool bMove;
DWORD dwGap;
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &bMove, sizeof(bool) );
SetMagnetPosition( vPos );
if( bMove ) {
EtVector3 vXVec;
EtVector2 vZVec;
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
if( EtVec3LengthSq( m_pMovement->GetMovePos() ) > 0.f ) {
float fXSpeed = 0.f, fZSpeed = 0.f;
if( m_cMovePushKeyFlag & 0x01 ) fXSpeed = -100000.f;
if( m_cMovePushKeyFlag & 0x02 ) fXSpeed = 100000.f;
if( m_cMovePushKeyFlag & 0x04 ) fZSpeed = 100000.f;
if( m_cMovePushKeyFlag & 0x08 ) fZSpeed = -100000.f;
vPos += ( vXVec * fXSpeed );
vPos += ( EtVec2toVec3( vZVec ) * fZSpeed );
MovePos( vPos, false );
}
}
OutputDebug( "PosRev\n" );
}
break;
case eActor::CS_VIEWSYNC:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos, vXVec;
EtVector2 vZVec, vLook;
DWORD dwGap;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Look( vLook, true );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
SetMagnetPosition( vPos );
OutputDebug( "ViewSync\n" );
}
break;
case eActor::CS_ONDROP:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
DWORD dwGap;
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &dwGap, sizeof(DWORD) );
SetMagnetPosition( vPos );
SetJumpMovement( EtVector2( 0.f, 0.f ) );
}
break;
case eActor::CS_CMDESCAPE:
{
CPacketCompressStream Stream( pPacket, 32 );
EtVector3 vPos;
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
SetPosition( vPos );
SetPrevPosition( vPos );
SetActionQueue( "Stand" );
CmdWarp( vPos, EtVec3toVec2( *GetMoveVectorZ() ) );
}
break;
}
}
int CDnVehicleActor::CmdAddStateEffect( const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX emBlowIndex, int nDurationTime, const char *szParam, bool bOnPlayerInit/* = false */, bool bCheckCanBegin/* = true*/ , bool bEternity )
{
int iID = CDnActor::CmdAddStateEffect( pParentSkill, emBlowIndex, nDurationTime, szParam, bOnPlayerInit, bCheckCanBegin , bEternity );
if( -1 == iID )
return -1;
DnBlowHandle hAddedBlow = m_pStateBlow->GetStateBlowFromID( iID );
const CPacketCompressStream* pPacket = hAddedBlow->GetPacketStream( szParam, bOnPlayerInit );
Send( eActor::SC_CMDADDSTATEEFFECT, const_cast<CPacketCompressStream*>(pPacket) );
return iID;
}
void CDnVehicleActor::SendRemoveStateEffect( STATE_BLOW::emBLOW_INDEX emBlowIndex )
{
BYTE pBuffer[32];
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &emBlowIndex, sizeof(STATE_BLOW::emBLOW_INDEX) );
Send( eActor::SC_CMDREMOVESTATEEFFECT, &Stream );
}
void CDnVehicleActor::SetMagnetPosition( EtVector3 &vPos )
{
EtVector2 vMagnet;
float fHeightDiff = vPos.y - GetMatEx()->m_vPosition.y;
vMagnet.x = vPos.x - GetMatEx()->m_vPosition.x;
vMagnet.y = vPos.z - GetMatEx()->m_vPosition.z;
float fAberraionLength = EtVec2Length( &vMagnet );
if( ( fAberraionLength > 1.f && fAberraionLength < 300.f ) && fHeightDiff < 300.f ) {
SetMagnetLength( fAberraionLength );
EtVec2Normalize( &vMagnet, &vMagnet );
SetMagnetDir( vMagnet );
}
else {
SetPosition( vPos );
}
}
#ifdef PRE_ADD_VEHICLE_SPECIAL_ACTION
bool CDnVehicleActor::CheckSpecialAction( const char *szAction )
{
if( !m_hMyActor )
return false;
CDnPlayerActor *pPlayerActor = static_cast<CDnPlayerActor*>(m_hMyActor.GetPointer());
int nCurrentMapID = 0;
CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
if( pGameTask )
nCurrentMapID = pGameTask->GetMapTableID();
else
nCurrentMapID = pPlayerActor->GetUserSession()->GetMapIndex();
bool bEnableSpecialAction = false; // g_pDataManager->IsVehicleSpecialActionMode(nCurrentMapID);
if( bEnableSpecialAction == false )
{
if( strstr( szAction, "Special_" ) )
return false;
}
return true;
}
#endif