DragonNest/Server/DNGameServer/DnPlayerActor.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

6774 lines
No EOL
215 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "DnPlayerActor.h"
#include "EtMatrixEx.h"
#include "DnWorld.h"
#include "MAMovementBase.h"
#include "DnWeapon.h"
#include "DnProjectile.h"
#include "DnGameTask.h"
#include "TaskManager.h"
#include "DnPartyTask.h"
#include "DnSkill.h"
#include "PerfCheck.h"
#include "DnDropItem.h"
#include "GameSendPacket.h"
#include "DnMonsterActor.h"
#include "DnStateBlow.h"
#include "MAAiScript.h"
#include "DnBlow.h"
#include "DnItemTask.h"
#include "DNLogConnection.h"
#include "DNGameDataManager.h"
#include "ScoreSystem.h"
#include "DNMissionSystem.h"
#include "DNDBConnectionManager.h"
#include "DnPlayerSpeedHackChecker.h"
#include "DnPlayerDoNotEnterChecker.h"
#include "DnPlayerPickupChecker.h"
#include "DnPlayerSkillChecker.h"
#include "DnPlayerActionChecker.h"
#include "DnPlayAniProcess.h"
#include "DNPvPPlayerAggroSystem.h"
#include "DNMonsterAggroSystem.h"
#include "DnChangeActionSetBlow.h"
#include "DnChangeActionStrProcessor.h"
#include "DNDBConnection.h"
#include "DnChangeStandActionBlow.h"
#include "DnActionSpecificInfo.h"
#include "MasterRewardSystem.h"
#if defined( PRE_ADD_SECONDARY_SKILL )
#include "SecondarySkillRepositoryServer.h"
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
#include "DnCannonMonsterActor.h"
#include "DNPvPGameRoom.h"
#include "DnApplySEWhenTargetNormalHitProcessor.h"
#include "DnBubbleSystem.h"
#include "DnObserverEventMessage.h"
#include "DnBlockBlow.h"
#include "DnParryBlow.h"
#include "DnCooltimeParryBlow.h"
#include "PvPZombieMode.h"
#include "DNGameServerScriptAPI.h"
#include "DnOrderMySummonedMonsterBlow.h"
#include "IDnSkillUsableChecker.h"
#include "DnTransformBlow.h"
#include "DnBasicBlow.h"
#include "DnCreateBlow.h"
#ifdef PRE_ADD_EXPORT_DPS_INFORMATION
#include "DnDPSReporter.h"
#endif
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
#include "DnSkillTask.h"
#endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
#include "TotalLevelSkillSystem.h"
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
float CDnPlayerActor::s_fRecoverySPTime = 5.f;
CDnPlayerActor::CDnPlayerActor( CMultiRoom *pRoom, int nClassID )
: CDnActor( pRoom, nClassID )
{
m_pSession = NULL;
CDnPlayerState::Initialize( m_nClassID );
CDnActionBase::Initialize( this );
MACP::Initialize( this );
m_cMovePushKeyFlag = 0;
m_bBattleMode = true;
m_nWorldLevel = 0;
m_nComboDelay = 0;
m_nComboCount = 0;
m_nTotalComboCount = 0;
m_fRecoverySPDelta = 0.f;
m_bCompleteCutScene = false;
m_bCheckCompleteCutScene = false;
m_bSkipCutScene = false;
m_bGhost = false;
m_uiStateBlowProcessAfterBit = 0;
m_afLastEquipItemSkillDelayTime = 0.0f;
m_afLastEquipItemSkillRemainTime = 0.0f;
m_dwSyncDatumTick = 0;
m_dwSyncDatumSendTick = 0;
m_nVoiceChannelID = 0;
m_pPlayerSpeedHackChecker = new CDnPlayerSpeedHackChecker( this );
m_pPlayerDoNotEnterChecker = new CDnPlayerDoNotEnterChecker( this );
m_pPlayerPickupChecker = new CDnPlayerPickupChecker( this );
m_pPlayerSkillChecker = new CDnPlayerSkillChecker( this );
m_pPlayerActionChecker = new CDnPlayerActionChecker( this );
memset( m_bCashSelfDeleteWeapon, 0, sizeof(m_bCashSelfDeleteWeapon) );
memset( m_bWeaponViewOrder, 0, sizeof(m_bWeaponViewOrder) );
m_iNowMaxProjectileCount = 0;
m_iReservedProjectileCount = 0;
m_LastEscapeTime = 0;
m_dwLastBasicShootActionTime = 0;
m_dwLastBasicShootCoolTime = 0;
m_dwLastChargeShootTime = 0;
m_bCheckProjectileSignalTerm = true;
m_bUpdatedProjectileInfoFromCmdAction = false;
m_fFrameSpeed = 1.0f;
m_bPlayerCannonMode = false;
m_nSwapSingleSkinActorID = -1;
m_nMonsterMutationTableID = -1;
m_hSwapOriginalHandle.Identity();
m_pSwapOriginalAction = NULL;
m_nDeathCount = 0;
m_pBubbleSystem = new BubbleSystem::CDnBubbleSystem;
this->RegisterObserver( m_pBubbleSystem );
m_bTempSkillAdded = false;
m_iTempChangedJob = 0;
m_nInvalidPlayerCheckCounter = 0;
m_bForceEnableRideByTrigger = true;
m_nVehicleEffectIndex = 0;
m_bVehicleMode = false;
m_vecEventEffectList.clear();
for( int i=0; i<Pet::Skill::Max; i++ )
m_bDeletedPetSkill[i] = false;
m_nAllowedSkill = 0;
m_bRefreshTransformMode = false;
m_bTransformMode = false;
m_bShootMode = false;
#ifdef _USE_VOICECHAT
// m_nVoiceUpdateCount = 0;
m_nVoiceRotate = 0;
#endif
m_MixedActionTimeStamp = 0;
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_pTotalLevelSkillSystem = NULL;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#ifdef PRE_ADD_COSTUME_SKILL
m_nCostumeSkillID = 0;
#endif
m_nLastUsedSkill = 0;
}
CDnPlayerActor::~CDnPlayerActor()
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( IsCannonMode() )
{
static_cast<CDnCannonMonsterActor*>( m_hCannonMonsterActor.GetPointer() )->OnMasterPlayerActorDie();
}
//<2F><><EFBFBD><EFBFBD> <20><>ųȿ<C5B3><C8BF> <20><><EFBFBD><EFBFBD>
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( pSox )
{
for( int itr = 0; itr < CDnGlyph::GlyphSlotEnum_Amount; ++itr )
{
if( m_hGlyph[itr] )
{
if( CDnGlyph::PassiveSkill == pSox->GetFieldFromLablePtr( m_hGlyph[itr]->GetClassID(), "_GlyphType" )->GetInteger() )
{
int nSkillID = pSox->GetFieldFromLablePtr( m_hGlyph[itr]->GetClassID(), "_SkillID" )->GetInteger();
DnSkillHandle hSkill = FindSkill( nSkillID );
if( hSkill )
hSkill->DelGlyphStateEffect( m_hGlyph[itr]->GetClassID() );
}
}
}
}
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>. <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų, <20><><EFBFBD>۽<EFBFBD>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD>ش<EFBFBD>.
if( IsEnabledToggleSkill() )
OnSkillToggle( m_hToggleSkill, false );
if( IsEnabledAuraSkill() )
OnSkillAura( m_hAuraSkill, false );
for( int i=0; i<2; i++ ) SAFE_RELEASE_SPTR( m_hCashWeapon[i] );
SAFE_RELEASE_SPTR( m_hSwapOriginalHandle );
SAFE_DELETE( m_pSwapOriginalAction );
SAFE_DELETE( m_pPlayerSkillChecker );
SAFE_DELETE( m_pPlayerActionChecker );
SAFE_DELETE( m_pPlayerDoNotEnterChecker ) ;
SAFE_DELETE( m_pPlayerPickupChecker );
SAFE_DELETE( m_pPlayerSpeedHackChecker );
SAFE_DELETE( m_pBubbleSystem );
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
SAFE_DELETE(m_pTotalLevelSkillSystem);
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
MAMovementBase* CDnPlayerActor::CreateMovement()
{
MAMovementBase* pMovement = new IBoostPoolMAWalkMovement();
return pMovement;
}
bool CDnPlayerActor::Initialize()
{
bool bResult = CDnActor::Initialize();
m_hObject->SetCollisionGroup( COLLISION_GROUP_DYNAMIC( 1 ) );
m_hObject->SetTargetCollisionGroup( COLLISION_GROUP_STATIC( 1 ) | COLLISION_GROUP_DYNAMIC( 2 ) | COLLISION_GROUP_DYNAMIC( 3 ) );
_ASSERT( m_pAggroSystem == NULL );
if( GetGameRoom()->bIsPvPRoom() )
{
m_pAggroSystem = new CDNPvPPlayerAggroSystem( GetActorHandle() );
_ASSERT( m_pAggroSystem != NULL );
}
m_mapTumbleHelper.insert( make_pair(GetElementIndex("Tumble_Front"), GetElementIndex("Move_Front")) );
m_mapTumbleHelper.insert( make_pair(GetElementIndex("Tumble_Back"), GetElementIndex("Move_Back")) );
m_mapTumbleHelper.insert( make_pair(GetElementIndex("Tumble_Left"), GetElementIndex("Move_Left")) );
m_mapTumbleHelper.insert( make_pair(GetElementIndex("Tumble_Right"), GetElementIndex("Move_Right")) );
// <20>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB>ϵ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20>׼ǽý<C7BD><C3BD>۸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> Ŭ<>󿡼<EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20>ý<EFBFBD><C3BD>۰<EFBFBD><DBB0><EFBFBD> <20><20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>̾<EFBFBD><CCBE>ְ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> 1.5<EFBFBD>ʷ<EFBFBD> <20>Ѵ<EFBFBD>.
// <20><>ǥ<EFBFBD><C7A5> Move_Front <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ص<EFBFBD> <20>ȴ<EFBFBD>. <20><> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD>ܷ<EFBFBD> Ȯ<>εDZ⸸ <20>ϸ<EFBFBD> <20>ȴ<EFBFBD>..
m_mapTumbleHelper.insert( make_pair(GetElementIndex("ChargeShoot_Stand"), GetElementIndex("Charge_Front")) );
m_pBubbleSystem->Initialize( GetActorHandle() );
m_mapIcyFractionHitted.clear();
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
m_FrameSkipCallSkillProcess.SetFramePerSec( 10.0f );
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
m_pTotalLevelSkillSystem = new CDnTotalLevelSkillSystem(GetMySmartPtr());
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
return bResult;
}
void CDnPlayerActor::Process( LOCAL_TIME LocalTime, float fDelta )
{
EtVector3 vPrevPos = m_Cross.m_vPosition;
CDnActor::Process( LocalTime, fDelta );
PROFILE_TIME_TEST_BLOCK_START( "CDnPlayerActor::Process" );
m_pBubbleSystem->Process( LocalTime, fDelta );
for( int i=0; i<2; i++ )
{
if( m_hCashWeapon[i] )
m_hCashWeapon[i]->Process( LocalTime, fDelta );
}
MAPartsBody::PreProcess( LocalTime, fDelta );
if( 0 < GetCantXZMoveSEReferenceCount() )
m_vAniDistance.x = m_vAniDistance.z = 0.0f;
#ifdef PRE_ADD_MONSTER_CATCH
if(!IsVehicleMode() && !m_hCatcherMonster )
#else
if(!IsVehicleMode())
#endif // #ifdef PRE_ADD_MONSTER_CATCH
m_pMovement->Process( LocalTime, fDelta );
MAPartsBody::Process( m_Cross, LocalTime, fDelta );
ProcessCombo( LocalTime, fDelta );
ProcessRecoverySP( LocalTime, fDelta );
m_pPlayerDoNotEnterChecker->Process( LocalTime, fDelta );
m_pPlayerSpeedHackChecker->Process( LocalTime, fDelta );
m_pPlayerPickupChecker->Process( LocalTime, fDelta );
m_pPlayerSkillChecker->Process( LocalTime, fDelta );
m_pPlayerActionChecker->Process( LocalTime, fDelta );
ProcessCompanion( LocalTime, fDelta );
ProcessNonLocalShootModeAction();
if(m_bRefreshTransformMode)
RefreshTransformMode();
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
if (m_pTotalLevelSkillSystem)
m_pTotalLevelSkillSystem->Process(LocalTime, fDelta);
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
PROFILE_TIME_TEST_BLOCK_END();
}
void CDnPlayerActor::CmdPickupItem( PickupItemStruct* pStruct, DnDropItemHandle hDropItem/*=CDnDropItem::Identity()*/ )
{
#if defined(_CH)
if (m_pSession->GetFCMState() != FCMSTATE_NONE){ // 3<>ð<EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD> 090624
// m_pSession->SendPickUp(ERROR_FCMSTATE, -1, NULL, 0);
return;
}
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PickUp <20><><EFBFBD><EFBFBD>
if( GetActorHandle() && GetActorHandle()->bIsObserver() )
return;
// <20><EFBFBD>ڳ<EFBFBD><DAB3>Ե<EFBFBD> PickUp <20><><EFBFBD><EFBFBD>
if( m_pSession && m_pSession->bIsGMTrace() )
return;
if( !CDnDropItem::IsActive(GetRoom()) )
return;
DnDropItemHandle hResult;
if( hDropItem )
hResult = hDropItem;
else
{
_DANGER_POINT();
return;
}
if( hResult ) {
if (hResult->IsReversionItem() && hResult->IsReversionLocked() == false)
{
DnActorHandle hBeneficiery;
if (hResult->GetOwnerUniqueID() != -1)
{
hBeneficiery = CDnActor::FindActorFromUniqueID( GetRoom(), hResult->GetOwnerUniqueID() );
if (hBeneficiery)
CDnItemTask::GetInstance(GetRoom()).PickUpItem( hBeneficiery, hResult, ITEMLOOTRULE_NONE );
return;
}
CDnItemTask::GetInstance(GetRoom()).PickUpItem( GetMySmartPtr(), hResult, ITEMLOOTRULE_NONE );
return;
}
if( hResult->GetOwnerUniqueID() != -1 ) {
DnActorHandle hOwner = CDnActor::FindActorFromUniqueID( GetRoom(), hResult->GetOwnerUniqueID() );
if( hOwner ) {
CDnItemTask::GetInstance(GetRoom()).PickUpItem( hOwner, hResult, ITEMLOOTRULE_NONE );
}
return;
}
else {
eItemRank Rank = CDnItem::GetItemRank( hResult->GetItemID() );
eItemTypeEnum Type = CDnItem::GetItemType( hResult->GetItemID() );
TPARTYITEMLOOTRULE LootType = ITEMLOOTRULE_NONE;
TITEMRANK LootRank = m_pRoom->GetPartyItemLootRank();
switch( Type )
{
case ITEMTYPE_INSTANT:
LootType = ITEMLOOTRULE_NONE;
break;
default:
if (LootRank == ITEMRANK_NONE )
LootType = m_pRoom->GetPartyItemLootRule();
else
LootType = ( Rank >= LootRank ) ? ITEMLOOTRULE_RANDOM : m_pRoom->GetPartyItemLootRule();
break;
}
// <20><><EFBFBD>ϰ<EFBFBD><CFB0><20>׳<EFBFBD> <20><EFBFBD><EBB8BB> ȹ<><C8B9><EFBFBD>մϴ<D5B4>.
if( hDropItem->GetItemID() == 0 )
LootType = ITEMLOOTRULE_NONE;
TItemData *pItemData = g_pDataManager->GetItemData(hDropItem->GetItemID());
if (pItemData)
{
if (pItemData->cReversion == ITEMREVERSION_BELONG)
LootType = ITEMLOOTRULE_NONE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LootType <20><><EFBFBD><EFBFBD>
if( GetRoom() && static_cast<CDNGameRoom*>(GetRoom())->bIsZombieMode() )
LootType = ITEMLOOTRULE_NONE;
switch( LootType )
{
case ITEMLOOTRULE_NONE:
case ITEMLOOTRULE_OWNER:
CDnItemTask::GetInstance(GetRoom()).PickUpItem( GetMySmartPtr(), hResult, LootType );
break;
case ITEMLOOTRULE_RANDOM:
{
int nLiveCount = CDnPartyTask::GetInstance(GetRoom()).GetPartyUserCount(CDNGameRoom::ePICKUPITEM);
if( nLiveCount == 0 ) return;
int nResultOffset = _rand(GetRoom())%nLiveCount;
int nOffset = 0;
DnActorHandle hResultActor;
int nPartyCount = CDnPartyTask::GetInstance(GetRoom()).GetUserCount();
for( int i=0; i<nPartyCount; i++ ) {
CDNUserSession *pSession = CDnPartyTask::GetInstance(GetRoom()).GetUserData(i);
if( !pSession ) continue;
if( pSession->bIsGMTrace() ) continue;
#if defined _CH
if (pSession->GetFCMState() != FCMSTATE_NONE) continue;
#endif
DnActorHandle hActor = pSession->GetActorHandle();
if( !hActor || hActor->IsDie() ) continue;
if( nOffset == nResultOffset ) {
hResultActor = hActor;
break;
}
nOffset++;
}
if( hResultActor )
CDnItemTask::GetInstance(GetRoom()).PickUpItem( hResultActor, hResult, LootType );
}
break;
case ITEMLOOTRULE_LEADER:
{
int nPartyCount = CDnPartyTask::GetInstance(GetRoom()).GetUserCount();
DnActorHandle hResultActor;
for( int i=0; i<nPartyCount; i++ ) {
CDNGameRoom::PartyStruct *pPartyStruct = CDnPartyTask::GetInstance(GetRoom()).GetPartyData(i);
if( !pPartyStruct ) continue;
if( pPartyStruct->bLeader ) {
hResultActor = ( pPartyStruct->pSession ) ? pPartyStruct->pSession->GetActorHandle() : CDnActor::Identity();
}
}
if( hResultActor )
CDnItemTask::GetInstance(GetRoom()).PickUpItem( hResultActor, hResult, LootType );
}
break;
case ITEMLOOTRULE_INORDER:
{
CDNUserSession *pSession = CDnPartyTask::GetInstance(GetRoom()).GetUserData(m_pRoom->GetCurrentItemLooterIdx());
if (pSession)
{
DnActorHandle hActor = pSession->GetActorHandle();
CDnItemTask::GetInstance(GetRoom()).PickUpItem( hActor, hResult, LootType );
}
}
break;
}
}
}
}
void CDnPlayerActor::OnSignal( SignalTypeEnum Type, void *pPtr, LOCAL_TIME LocalTime, LOCAL_TIME SignalStartTime, LOCAL_TIME SignalEndTime, int nSignalIndex )
{
switch( Type ) {
case STE_Hit:
{
}
break;
case STE_Jump:
{
JumpStruct *pStruct = (JumpStruct *)pPtr;
EtVector2 vVec( 0.f, 0.f );
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 );
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ [2010/11/09 semozz]
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD> Velocity<74><79><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴ°<CFB4><C2B0><EFBFBD>
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>.
if( pStruct->bResetPrevVelocity ) {
SetVelocityY( 0.f );
SetResistanceY( 0.f );
}
Jump( pStruct->fJumpVelocity, vVec );
SetResistanceY( pStruct->fJumpResistance );
}
return;
case STE_CustomAction:
{
CustomActionStruct *pStruct = (CustomActionStruct *)pPtr;
ResetCustomAction();
SetCustomAction( pStruct->szChangeAction, (float)pStruct->nChangeActionFrame );
}
return;
case STE_PickupItem:
{
}
return;
case STE_RebirthAnyPlayer:
{
// [2011/02/11 semozz]
// <20><><EFBFBD><EFBFBD><E5B7A1><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><>Ȱ <20><><EFBFBD><EFBFBD>..
CMultiRoom *pRoom = GetRoom();
if (!pRoom)
break;
eDragonNestType _dragonNestType = CDnWorld::GetInstance(pRoom).GetDragonNestType();
RebirthAnyPlayerStruct *pStruct = (RebirthAnyPlayerStruct*)pPtr;
CDNUserSession *pSession = NULL;
float fMinDist = FLT_MAX;
for( DWORD i=0; i<CDnPartyTask::GetInstance(GetRoom()).GetUserCount(); i++ ) {
CDNGameRoom::PartyStruct *pParty = CDnPartyTask::GetInstance(GetRoom()).GetPartyData(i);
if( !pParty || !pParty->pSession ) continue;
if( pParty->pSession == m_pSession ) continue;
if( pParty->pSession->GetState() != SESSION_STATE_GAME_PLAY)
continue;
DnActorHandle hActor = pParty->pSession->GetActorHandle();
if( !hActor ) continue;
CDnPlayerActor *pPlayer = (CDnPlayerActor *)hActor.GetPointer();
if( !pPlayer->IsDie() || !pPlayer->IsGhost() ) continue;
if( pParty->nUsableRebirthCoin == 0 ) continue;
EtVector3 vVec = *GetPosition() - *hActor->GetPosition();
float fDist = EtVec3LengthSq( &vVec );
if( fDist < fMinDist ) {
fMinDist = fDist;
pSession = pParty->pSession;
}
}
if( !pSession || fMinDist > (float)( pStruct->nRadius * pStruct->nRadius ) ) break;
if( m_pSession->GetStatusData()->wCashRebirthCoin <= 0 )
{
GetUserSession()->SendRebirthCoin(ERROR_ITEM_REBIRTH_CASHCOIN_SHORT_FAIL, m_pPartyData->nUsableRebirthCoin, _REBIRTH_SELF, GetUserSession()->GetSessionID());
break;
}
CDnItemTask::GetInstance(GetRoom()).RequestRebirthCoinUseAnyPlayer( m_pSession, pSession );
UpdateRebirthPlayer();
}
break;
case STE_CancelChangeStandActionSE:
{
CDnChangeStandActionBlow::ReleaseStandChangeSkill( GetActorHandle(), false );
}
break;
case STE_CancelChangeStandEndActionSE:
{
CancelChangeStandEndActionSEStruct* pStruct = (CancelChangeStandEndActionSEStruct*)pPtr;
CDnChangeStandActionBlow::ReleaseStandChangeSkill( GetActorHandle(), false, pStruct->szEndAction );
}
break;
case STE_TriggerEvent:
{
TriggerEventStruct *pStruct = (TriggerEventStruct *)pPtr;
CDnWorld::GetInstance(GetRoom()).InsertTriggerEventStore( "EventArea", -1 );
CDnWorld::GetInstance(GetRoom()).InsertTriggerEventStore( "ActorHandle", GetSessionID() );
CDnWorld::GetInstance(GetRoom()).InsertTriggerEventStore( "EventID", pStruct->nEventID );
CDnWorld::GetInstance(GetRoom()).OnTriggerEventCallback( "CDnActor::TriggerEvent", LocalTime, 0.f );
}
break;
case STE_ShootCannon:
{
ShootCannonStruct* pStruct = (ShootCannonStruct*)pPtr;
if( IsCannonMode() )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> CS_CANNONROTATESYNC <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TargetPosition <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_hCannonMonsterActor->UseSkill( pStruct->CannonMonsterSkillID );
}
}
break;
// #29925 <20><> <20>ñ׳ο<D7B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD>.
case STE_ChangeActionSECheck:
{
ChangeActionSECheckStruct* pStruct = (ChangeActionSECheckStruct*)pPtr;
if( false == IsAppliedThisStateBlow( (STATE_BLOW::emBLOW_INDEX)pStruct->nStateEffectID ) )
{
SetActionQueue( pStruct->szChangeAction );
}
}
break;
/*
// Note: <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20>ʰ<EFBFBD> ó<><C3B3><EFBFBD>Ǿ<EFBFBD> Ŭ<>󿡼<EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD> <20>׼<EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// Ŭ<><C5AC><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>..
case STE_CanUseSkill:
{
CanUseSkillStruct* pStruct = (CanUseSkillStruct*)pPtr;
m_bUseSignalSkillCheck = (pStruct->bUseSignalSkillCheck ? TRUE : FALSE);
SetSignalSkillCheck( pStruct->CheckType, m_bUseSignalSkillCheck );
}
break;
*/
case STE_OrderMySummonedMonster:
{
OrderMySummonedMonsterStruct* pStruct = (OrderMySummonedMonsterStruct*)pPtr;
OrderUseSkillToMySummonedMonster(pStruct);
}
break;
}
CDnActor::OnSignal( Type, pPtr, LocalTime, SignalStartTime, SignalEndTime, nSignalIndex );
}
void CDnPlayerActor::OnDrop( float fCurVelocity )
{
if( IsAir() ) {
if( !IsHit() ) {
//////////////////////////////////////////////////////////////////////////
// #32977 - ž <20><><EFBFBD>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> ž <20><><EFBFBD>Ǵ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> ó<><C3B3> <20>DZ<EFBFBD><C7B1><EFBFBD>
// OnDrop<6F><70> ȣ<><C8A3> <20>Ǹ<EFBFBD> ž <20><><EFBFBD>Ǵ׿<C7B4> <20>ִ<EFBFBD> STE_Jump<6D><70> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾƼ<CABE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>ȴ<EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> <20>ϴ<EFBFBD>..
// <20><><EFBFBD><EFBFBD> Frame<6D><65> 0<>̰<EFBFBD>, STE_Jump<6D>ñ׳<C3B1><D7B3><EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _Landing<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
//////////////////////////////////////////////////////////////////////////
float fCurrentFrame = CDnActionBase::GetCurFrame();
float fPrevFrame = CDnActionBase::m_fPrevFrame;
ActionElementStruct *pStruct = GetElement(GetCurrentAction());
if (pStruct)
{
bool hasJumpSignal = false;
CEtActionSignal *pSignal = NULL;
for (int i = 0; i < (int)pStruct->pVecSignalList.size(); ++i)
{
pSignal = pStruct->pVecSignalList[i];
if (pSignal && pSignal->GetSignalIndex() == STE_Jump)
{
hasJumpSignal = true;
break;
}
}
if (hasJumpSignal)
{
//STE_Jump<6D><70> <20>ְ<EFBFBD>, actionQueue<75><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŵ..(<28>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD>?..)
if (false == m_szActionQueue.empty())
{
return;
}
//<2F><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> STE_Jump<6D><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> STE_Jump ȣ<><C8A3><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD>..
else if (false == m_szAction.empty() && fPrevFrame == 0.0f)
{
return;
}
}
}
//////////////////////////////////////////////////////////////////////////
char szStr[64];
sprintf_s( szStr, "%s_Landing", GetCurrentAction() );
if( IsExistAction( szStr ) )
{
SetActionQueue( szStr, 0, 2.f, 0.f, true, false );
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> ü<>ξ׼<CEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( m_hProcessSkill )
{
m_hProcessSkill->AddUseActionName( szStr );
m_hProcessSkill->OnChainInput( szStr );
}
}
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 );
}
else {
std::string szAction;
float fBlendFrame = 2.f;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> 10<31>̻<EFBFBD><CCBB≯<EFBFBD> bigBounce<63><65> <20>ѹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( fCurVelocity < -6.f && m_HitParam.vVelocity.y != 0.f && abs(m_HitParam.vVelocity.y) > 0.1f ) {
if( m_HitParam.vVelocity.y > 0.f ) {
m_HitParam.vVelocity.y *= 0.6f;
SetVelocityY( m_HitParam.vVelocity.y );
}
else { // <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_HitParam.vVelocity.y *= -0.6f;
if( m_HitParam.vResistance.y > 0.f )
m_HitParam.vResistance.y *= -1.f;
SetVelocityY( m_HitParam.vVelocity.y );
if( m_HitParam.vVelocity.y > 0 && m_HitParam.vResistance.y <= 0 )
SetResistanceY( -15.0f );
else
SetResistanceY( m_HitParam.vResistance.y );
}
szAction = "Hit_AirBounce";
}
else {
szAction = "Down_SmallBounce";
fBlendFrame = 0.f;
}
SetActionQueue( szAction.c_str(), 0, fBlendFrame, 0.f, true, false );
}
}
}
void CDnPlayerActor::OnStop( EtVector3 &vPosition )
{
if( IsProcessSkill() ) return;
CmdStop( "Stand" );
}
void CDnPlayerActor::OnFall( float fCurVelocity )
{
// #31056 Move <20>̰<EFBFBD> Air <20≯<EFBFBD> <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20>̵<EFBFBD><CCB5>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC>̹Ƿ<CCB9> Fall ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ž<><C5BE><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>)
if( !(IsMove() && IsAir()) &&
(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 < -5.f && fAngle > 155.f ) {
ActionElementStruct *pStruct = GetElement( "Jump" );
if( pStruct ) {
SetActionQueue( "Jump", 0, 6.f, (float)pStruct->dwLength / 2.f );
}
}
}
}
void CDnPlayerActor::OnDamage( CDnDamageBase *pHitter, SHitParam &HitParam, HitStruct *pHitStruct )
{
#if defined( PRE_ADD_SECONDARY_SKILL )
if( GetUserSession() && GetUserSession()->GetSecondarySkillRepository() )
static_cast<CSecondarySkillRepositoryServer*>(GetUserSession()->GetSecondarySkillRepository())->CancelManufacture();
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
if( IsCannonMode() )
{
HitParam.szActionName.clear();
HitParam.vViewVec = *GetLookDir();
HitParam.vResistance = EtVector3( 0.0f, 0.0f, 0.0f );
HitParam.vVelocity = EtVector3( 0.0f, 0.0f, 0.0f );
}
int nSeed = CRandom::Seed(GetRoom());
_srand( GetRoom(), nSeed );
INT64 nTemp = GetHP();
CDnActor::OnDamage( pHitter, HitParam, pHitStruct );
INT64 nDamage = nTemp - GetHP();
INT64 biKillerCharDBID = 0;
if( GetGameRoom() )
{
DnActorHandle hHitter = pHitter ? pHitter->GetActorHandle() : CDnActor::Identity();
GetGameRoom()->OnDamage( GetActorHandle(), hHitter, nDamage );
if( GetGameRoom()->GetGameTask() )
GetGameRoom()->GetGameTask()->OnDamage( GetActorHandle(), hHitter, nDamage );
if (IsDie() && hHitter && hHitter->IsPlayerActor()){
CDnPlayerActor *pPlayer = (CDnPlayerActor *)hHitter.GetPointer();
biKillerCharDBID = pPlayer->GetUserSession()->GetCharacterDBID();
}
}
if( m_HitParam.bSuccessNormalDamage )
{
m_nComboDelay = 0;
m_nComboCount = 0;
}
UpdateAttackedCPPoint( pHitter, m_HitParam.HitType );
ResetCustomAction();
RequestDamage( pHitter, nSeed, nDamage );
switch( pHitter->GetDamageObjectType() )
{
case DamageObjectTypeEnum::Actor:
{
DnActorHandle hActor = pHitter->GetActorHandle();
if( m_pAggroSystem )
m_pAggroSystem->OnDamageAggro( hActor, HitParam, (int)nDamage );
}
break;
}
}
void CDnPlayerActor::CmdMove( EtVector3 &vPos, const char *szActionName, int nLoopCount, float fBlendFrame )
{
MovePos( vPos, false );
// #31940 <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><20>и<EFBFBD><D0B8>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD≯鼭 <20>ǰݵǾ<DDB5> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־ <20>̵<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD> CS_CMDMOVE <20><>Ŷ<EFBFBD><C5B6> <20>ͼ<EFBFBD> <20><><EFBFBD>⼭ Move_ <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>.
if( m_szAction == "Skill_Parrying" ||
m_szActionQueue == "Skill_Parrying" )
return;
SetActionQueue( szActionName, nLoopCount, fBlendFrame );
}
void CDnPlayerActor::CmdStop( const char *szActionName, int nLoopCount, float fBlendFrame, float fStartFrame )
{
MAMovementBase *pMovement = GetMovement();
if( !pMovement ) return;
pMovement->ResetMove();
// #31940 <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><20>и<EFBFBD><D0B8>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD><EFBFBD≯鼭 <20>ǰݵǾ<DDB5> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ٷ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>߸鼭 CS_CMDSTOP <20><>Ŷ<EFBFBD><C5B6> <20>ͼ<EFBFBD> <20><><EFBFBD>⼭ Stand <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>.
if( m_szAction == "Skill_Parrying" ||
m_szActionQueue == "Skill_Parrying" )
return;
SetActionQueue( szActionName, nLoopCount, fBlendFrame, fStartFrame );
}
void CDnPlayerActor::CmdPassiveSkillAction( int nSkillID, const char *szActionName, int nLoopCount /*= 0*/, float fBlendFrame /*= 3.f*/, float fStartFrame /*= 0.0f*/, bool bChargeKey /*= false*/, bool bCheckOverlapAction /*= true */, bool bOnlyCheck/* = false*/ )
{
// Note: <20>ൿ<EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
// SetAction() <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>Ƿ<EFBFBD> <20>ñ׳<C3B1> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if( GetCantActionSEReferenceCount() > 0 ) return;
if( false == bOnlyCheck )
{
DnSkillHandle hSkill = FindSkill( nSkillID );
if( !hSkill ) return;
// Note: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ߵ<EFBFBD> <20>߿<EFBFBD> <20><> <20>κп<CEBA> <20><> <20>ߵ<EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>־
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
if( m_hProcessSkill /*&& m_hProcessSkill != hSkill*/ )
{
if( false == (IsEnabledAuraSkill() && m_hProcessSkill->IsAuraOn()) )
{
m_hProcessSkill->OnEnd( CDnActionBase::m_LocalTime, 0.f );
}
m_hProcessSkill.Identity();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> Ű<><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
if( bChargeKey )
{
hSkill->SetPassiveSkillLength( -1.0f );
}
else
{
// <20>нú<D0BD> <20><>ų <20>׼ǿ<D7BC> next <20>׼DZ<D7BC><C7B1><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// next <20>׼<EFBFBD><D7BC><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
DWORD dwActionLength = 0;
ActionElementStruct* pElement = GetElement( szActionName );
if( pElement )
{
if( pElement->dwLength <= (DWORD)fStartFrame )
fStartFrame = pElement->dwLength*1.f;
dwActionLength = pElement->dwLength - (DWORD)fStartFrame;
}
else
{
fStartFrame = 0.0f;
}
// #25042 Stand <20>׼<EFBFBD><D7BC><EFBFBD> next <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ƴϹǷ<CFB9> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>Խ<EFBFBD>Ű<EFBFBD><C5B0> <20>ʴ´<CAB4>.
if( pElement->szNextActionName != "Stand" &&
0 == strstr( pElement->szNextActionName.c_str(), "_Landing") )
{
ActionElementStruct* pNextElement = GetElement( pElement->szNextActionName.c_str() );
if( pNextElement )
dwActionLength += pNextElement->dwLength;
}
hSkill->SetPassiveSkillLength( (float)dwActionLength / s_fDefaultFps );
// Active Type<70><65> <20><>ų(<28>̱۽<CCB1> <20><><EFBFBD><EFBFBD>Ʈ) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Passive Type<70><65><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><20>ִ<EFBFBD>.
// <20><><EFBFBD>Ŀ<EFBFBD> _CheckActionWithProcessPassiveActionSkill <20><><EFBFBD><EFBFBD> ActionLength<74><68> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ϰ<EFBFBD> <20>Ǹ<EFBFBD>
// Passive Type <20><> <20><><EFBFBD><EFBFBD> ChaningPassiveSkill<6C><6C> true<75><65> <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> Active Type<70>̶<EFBFBD><CCB6><EFBFBD> false <20>̴<EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD>⼭ ChaningPassiveKill<6C><6C> true<75><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
if( hSkill->GetSkillType() == CDnSkill::Active ) // Active <20>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴϴ<DDB4>.
hSkill->SetChaningPassiveSkill( true );
}
// <20><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3> InputHasPassiveSkill <20><> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UsableCheck <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
if( CDnSkill::Active == hSkill->GetSkillType() )
{
m_bUseSignalSkillCheck = true;
for( int i = 0; i < 3; ++i )
SetSignalSkillCheck( i, true );
}
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> 0.5<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <20><><EFBFBD>̵<EFBFBD><CCB5>Ҷ<EFBFBD><D2B6><EFBFBD> <20><>Ÿ 0.5<EFBFBD><EFBFBD> <20>̻<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD>Ӻ<EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<>ٸ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. (#19737)
hSkill->UpdateSkillCoolTimeExactly();
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
CDnSkill::UsingResult eResult = CanExecuteSkill( hSkill );
if( eResult == CDnSkill::UsingResult::Success )
{
//
m_nLastUsedSkill = hSkill->GetClassID();
//
ExecuteSkill( hSkill, CDnActionBase::m_LocalTime, 0.f );
hSkill->FromInputHasPassive();
SetActionQueue( szActionName, nLoopCount, fBlendFrame, fStartFrame, bCheckOverlapAction );
}
else {
((CDnPlayerSkillChecker*)m_pPlayerSkillChecker)->OnInvalidUseSkill( nSkillID, eResult );
}
// <20><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3> InputHasPassiveSkill <20><> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UsableCheck <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if( CDnSkill::Active == hSkill->GetSkillType() )
{
m_bUseSignalSkillCheck = false;
for( int i = 0; i < 3; ++i )
SetSignalSkillCheck( i, false );
}
// <20>÷<EFBFBD><C3B7>̾ <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>нú<D0BD>/<2F><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
hSkill->SetPassiveSkillActionName( szActionName );
}
else
SetActionQueue( szActionName, nLoopCount, fBlendFrame, fStartFrame, bCheckOverlapAction );
m_fDownDelta = 0.f;
}
// <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> PvP <20><><EFBFBD>Խ<EFBFBD> <20>ڵ嵵 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>) <20>˷<EFBFBD><CBB7>ּ<EFBFBD><D6BC><EFBFBD>.
int CDnPlayerActor::CmdAddStateEffect( const CDnSkill::SkillInfo* pParentSkill, STATE_BLOW::emBLOW_INDEX emBlowIndex, int nDurationTime, const char *szParam, bool bOnPlayerInit/* = false */, bool bCheckCanBegin/* = true*/ , bool bEternity /*= false*/ )
{
if( emBlowIndex < STATE_BLOW::BLOW_NONE || emBlowIndex >= STATE_BLOW::BLOW_MAX )
{
if( pParentSkill )
g_Log.Log(LogType::_ERROR, L"[CDnActor::CmdAddStateEffect] SkillID:%d, STATE_BLOW:%d\r\n", pParentSkill->iSkillID, emBlowIndex );
else
g_Log.Log(LogType::_ERROR, L"[CDnActor::CmdAddStateEffect] STATE_BLOW:%d\r\n", emBlowIndex);
return -1;
}
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) );
if( GetGameRoom() )
GetGameRoom()->OnCmdAddStateEffect( hAddedBlow->GetParentSkillInfo() );
CheckAndRegisterObserverStateBlow( hAddedBlow );
return iID;
}
void CDnPlayerActor::CmdRemoveStateEffect( STATE_BLOW::emBLOW_INDEX emBlowIndex, bool bRemoveFromServerToo /*= true */ )
{
if( m_pStateBlow->IsApplied( emBlowIndex ) )
{
if( bRemoveFromServerToo )
CDnActor::CmdRemoveStateEffect( emBlowIndex );
SendRemoveStateEffect( emBlowIndex );
}
}
void CDnPlayerActor::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 CDnPlayerActor::SendRemoveStateEffectGraphic( STATE_BLOW::emBLOW_INDEX emBlowIndex )
{
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &emBlowIndex, sizeof(int) );
Send( eActor::SC_BLOW_GRAPHIC_ERASE, &Stream );
}
void CDnPlayerActor::CmdToggleBattle( bool bBattleMode )
{
if( bBattleMode == true )
{
if( !m_hWeapon[0] ) {
m_bBattleMode = false;
return;
}
}
if( bBattleMode != m_bBattleMode )
{
SetBattleMode( bBattleMode );
bool bSkipAction = false;
#if defined(PRE_ADD_50907)
bool bSkipChangeAction = IsSkipChangeWeaponAction();
if (bSkipChangeAction == true)
return;
#endif // PRE_ADD_50907
if(m_bShootMode)
{
if( m_bBattleMode == true ) SetActionQueue( "MOD_PullOut_Weapon" );
else SetActionQueue( "MOD_PutIn_Weapon" );
// ShootMode<64><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<CFB1><E2B6A7><EFBFBD><EFBFBD> Normal<61><6C><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ൿ<EFBFBD><E0B5BF> GetchangeShootaction <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϱ<CFB1><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><20>ִ´<D6B4>.
bSkipAction = true;
}
if(!bSkipAction)
{
if( !IsDie() )
{
if( m_bBattleMode == true ) SetActionQueue( "PullOut_Weapon" );
else SetActionQueue( "PutIn_Weapon" );
}
}
}
}
void CDnPlayerActor::CmdAddExperience( TExpData &ExpData, int nLogCode, INT64 biFKey )
{
int nExp = ExpData.nExperience;
int nEventExp = ExpData.nEventExperience;
int nPCBangExp = ExpData.nPcBangExperience;
int nVIPExp = ExpData.nVIPExperience;
int nPromoExp = ExpData.nPromotionExperience;
TPlayerCommonLevelTableInfo* pPlayerCommonLevelTableInfo = g_pDataManager->GetPlayerCommonLevelTable(GetLevel());
if( pPlayerCommonLevelTableInfo )
{
//<2F><><EFBFBD>⼭ 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ִ°<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>....dyss)
nExp = (int)(nExp * pPlayerCommonLevelTableInfo->fAddGainExp);
nEventExp = (int)(nEventExp * pPlayerCommonLevelTableInfo->fAddGainExp);
nPCBangExp = (int)(nPCBangExp * pPlayerCommonLevelTableInfo->fAddGainExp);
nVIPExp = (int)(nVIPExp * pPlayerCommonLevelTableInfo->fAddGainExp);
nPromoExp = (int)(nPromoExp * pPlayerCommonLevelTableInfo->fAddGainExp);
}
#if defined( PRE_USA_FATIGUE )
int iPwrExp = 0;
if( nLogCode == DBDNWorldDef::CharacterExpChangeCode::DungeonMonster )
{
nLogCode = DBDNWorldDef::CharacterExpChangeCode::Dungeon;
if( m_pSession && m_pSession->bIsNoFatigueEnter() == true )
{
int iTemp = nExp+ExpData.nItemExperience;
nExp = (iTemp*g_pDataManager->GetNoFatigueExpRate())/100;
#if defined( _WORK )
char szBuf[MAX_PATH];
sprintf_s( szBuf, "<EFBFBD>Ϲ<EFBFBD><EFBFBD>Ƿε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Exp%d->%d", iTemp, nExp );
std::cout << szBuf << std::endl;
#endif // #if defined( _WORK )
}
else
{
iPwrExp = ((nExp+ExpData.nItemExperience)*(g_pDataManager->GetFatigueExpRate()-g_pDataManager->GetNoFatigueExpRate()))/100;
int iTemp = nExp+ExpData.nItemExperience;
nExp = (iTemp*g_pDataManager->GetFatigueExpRate())/100;
#if defined( _WORK )
char szBuf[MAX_PATH];
sprintf_s( szBuf, "<EFBFBD>Ϲ<EFBFBD><EFBFBD>Ƿε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Exp%d->%d", iTemp, nExp );
std::cout << szBuf << std::endl;
#endif // #if defined( _WORK )
}
}
#endif // #if defined( PRE_USA_FATIGUE )
#if defined(_CH)
if (m_pSession->GetFCMState() == FCMSTATE_HALF){
nExp = ExpData.nExperience / 2;
nEventExp = (ExpData.nEventExperience > 0) ? ExpData.nEventExperience / 2 : 0;
nPCBangExp = (ExpData.nPcBangExperience > 0) ? ExpData.nPcBangExperience / 2 : 0;
nVIPExp = (ExpData.nVIPExperience > 0) ? ExpData.nVIPExperience / 2 : 0;
nPromoExp = (ExpData.nPromotionExperience > 0) ? ExpData.nPromotionExperience / 2 : 0;
ExpData.nItemExperience = (ExpData.nItemExperience>0) ? ExpData.nItemExperience/2 : 0;
ExpData.nGuildExp = (ExpData.nGuildExp>0) ? ExpData.nGuildExp/2 : 0;
}
else if (m_pSession->GetFCMState() == FCMSTATE_ZERO){
nExp = 0;
nEventExp = 0;
nPCBangExp = 0;
nVIPExp = 0;
nPromoExp = 0;
ExpData.nItemExperience = 0;
ExpData.nGuildExp = 0;
}
#endif // _CH
nExp += ExpData.nItemExperience;
nExp += ExpData.nGuildExp;
#if defined(PRE_ADD_WEEKLYEVENT)
if (CDnWorld::GetInstance(GetRoom()).GetMapType() != EWorldEnum::MapSubTypeNest){
int nThreadID = GetGameRoom()->GetServerID();
float fEventValue = g_pDataManager->GetWeeklyEventValuef(WeeklyEvent::Player, GetClassID(), WeeklyEvent::Event_5, nThreadID);
if (fEventValue != 0)
nExp += (int)(nExp * fEventValue);
}
#endif // #if defined(PRE_ADD_WEEKLYEVENT)
int nPrevLevel = GetLevel();
int nTotalExp = nExp + nEventExp + nPCBangExp + nVIPExp + nPromoExp;
AddExperience( nTotalExp, nLogCode, biFKey ); //_KR<4B><52> <20>ƴϸ<C6B4> pcbangexp<78><70> <20>׻<EFBFBD> 0<>̴<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Դϴ<D4B4>.
if( GetLevel() == nPrevLevel ) {
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &m_nExperience, sizeof(int) );
Stream.Write( &nExp, sizeof(int) );
Stream.Write( &nEventExp, sizeof(int) );
Stream.Write( &nPCBangExp, sizeof(int) );
#if defined(PRE_ADD_VIP)
Stream.Write( &nVIPExp, sizeof(int) );
#endif // #if defined(PRE_ADD_VIP)
Stream.Write( &nPromoExp, sizeof(int) );
#if defined( PRE_USA_FATIGUE )
Stream.Write( &iPwrExp, sizeof(int) );
#endif // #if defined( PRE_USA_FATIGUE )
Send( eActor::SC_ADDEXP, GetMySmartPtr(), &Stream );
}
}
void CDnPlayerActor::CmdAddCoin( INT64 nCoin, int nLogCode, int nFKey, bool bSync )
{
INT64 nChangeCoin = nCoin;
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
if( nLogCode == DBDNWorldDef::CoinChangeCode::PickUp )
{
float fIncGoldRate = 0.0f;
if (IsAppliedThisStateBlow(STATE_BLOW::BLOW_266))
{
DNVector(DnBlowHandle) vlBlows;
GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_266, vlBlows);
{
int nCount = (int)vlBlows.size();
for (int i = 0; i < nCount; ++i)
{
DnBlowHandle hBlow = vlBlows[i];
if (hBlow && hBlow->IsEnd() == false)
{
fIncGoldRate += hBlow->GetFloatValue();
}
}
}
nChangeCoin += (INT64)(nChangeCoin * fIncGoldRate);
if( !m_pSession->CheckMaxCoin(nChangeCoin) )
return;
}
}
#endif
#if defined(_CH)
if (m_pSession->GetFCMState() == FCMSTATE_HALF){
nChangeCoin = nCoin / 2;
}
else if (m_pSession->GetFCMState() == FCMSTATE_ZERO){
nChangeCoin = 0;
}
#endif // _CH
#if defined( _GAMESERVER )
if( nLogCode != DBDNWorldDef::CoinChangeCode::PickUp )
g_Log.Log(LogType::_ERROR, m_pSession, L"CmdAddCoin PrevCoin=%I64d ChangeCoin=%I64d PickUpCoint=%I64d LogType=%d\r\n", m_pSession->GetCoin(), nChangeCoin, m_pSession->GetPickUpCoin(), nLogCode);
#endif
if( nLogCode == DBDNWorldDef::CoinChangeCode::PickUp )
{
m_pSession->AddPickUpCoin( nChangeCoin );
#if defined( _WORK )
std::cout << nCoin << " Coin ȹ<><C8B9> => <20><> " << m_pSession->GetPickUpCoin() << " Coin" << std::endl;
#endif // #if defined( _WORK )
nLogCode = 0; // DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!! bSync <20><> AddCoin <20><> bWarehouse <20><> Ʋ<><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C2B6> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>쾾 -> <20>ٲ<EFBFBD><D9B2><EFBFBD> Send<6E><64>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( m_pSession && m_pSession->GetItem() ){
if (nChangeCoin > 0)
m_pSession->AddCoin( nChangeCoin, nLogCode, nFKey, bSync );
else if (nChangeCoin < 0)
m_pSession->DelCoin( -nChangeCoin, nLogCode, nFKey, bSync );
}
}
void CDnPlayerActor::OnDispatchMessage( CDNUserSession *pSession, DWORD dwActorProtocol, BYTE *pPacket )
{
switch( dwActorProtocol ) {
case eActor::CS_CMDMOVE:
{
CPacketCompressStream Stream( pPacket, 128 );
int nActionIndex;
EtVector3 vPos, vXVec;
EtVector2 vZVec, vLook;
char cFlag;
DWORD dwGap;
int nMoveSpeed;
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) );
ActionElementStruct *pStruct = GetElement( nActionIndex );
if( pStruct == NULL ) break;
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
#ifdef PRE_ADD_CHECK_MOVESPEED_HACK
m_pPlayerSpeedHackChecker->OnSyncMoveSpeed( nMoveSpeed );
#endif
if( CheckSkillAction(pStruct->szName.c_str() ) == true )
{
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
break;
}
Look( vLook, false );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
SetPosition( vPos );
// SetMagnetPosition( vPos );
#ifdef _USE_VOICECHAT
m_nVoiceRotate = (int)EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vZVec ) ) );
if( vZVec.x > 0.0f )
m_nVoiceRotate = 360 - m_nVoiceRotate;
m_nVoiceRotate = (m_nVoiceRotate + 90) % 360;
m_pSession->SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, m_nVoiceRotate);
#endif
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 );
CmdMove( vPos, pStruct ? pStruct->szName.c_str() : "", -1, 8.f );
}
break;
case eActor::CS_CMDSTOP:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
DWORD dwGap;
bool bReset, bForce;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Stream.Read( &bReset, sizeof(bool) );
Stream.Read( &bForce, sizeof(bool) );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
/*
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";
}
CmdMove( vPos, szActionName.c_str(), -1, CDnActionBase::m_fQueueBlendFrame );
*/
if( IsProcessSkill() && bForce ) CancelUsingSkill();
SetPosition( vPos );
OnStop( vPos );
#ifdef _USE_VOICECHAT
m_pSession->SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, m_nVoiceRotate);
#endif
}
break;
case eActor::CS_CMDACTION:
{
CPacketCompressStream Stream( pPacket, 128 );
int nActionIndex, nLoopCount;
float fBlendFrame;
EtVector3 vXVec, vPos;
EtVector2 vLook, vZVec;
DWORD dwGap;
bool bFromStateBlow = false;
bool bSkillChain = 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) );
Stream.Read( &bSkillChain, sizeof(bool) );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
ResetMove();
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
Look( vLook );
SetMagnetPosition( vPos );
ActionElementStruct *pStruct = GetElement( nActionIndex );
if( pStruct == NULL ) break;
if( bSkillChain )
{
if( false == IsValidSkillChain( GetCurrentActionIndex(), nActionIndex ) )
return;
}
else
{
bool bCheckStandAction = CDnChangeStandActionBlow::CheckUsableAction( GetActorHandle(), true, pStruct->szName.c_str() );
if( IsProcessSkill() == true && CheckSkillAction( pStruct->szName.c_str() ) == true || bCheckStandAction == false )
{
ActionElementStruct *pCurrentActionElement = GetElement( GetCurrentActionIndex() );
if( pCurrentActionElement )
{
bool bCorrectInputAction = false;
for( DWORD iSignal = 0; iSignal < pCurrentActionElement->pVecSignalList.size(); ++iSignal )
{
CEtActionSignal* pSignal = pCurrentActionElement->pVecSignalList.at( iSignal );
if( STE_Input == pSignal->GetSignalIndex() )
{
InputStruct* pInputStruct = (InputStruct*)(pSignal->GetData());
if( strcmp( pInputStruct->szChangeAction, pStruct->szName.c_str() ) == NULL )
{
bCorrectInputAction = true;
break;
}
}
}
if( bCorrectInputAction == false )
{
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
return;
}
}
}
}
if( m_pBasicAttackInfo && strstr(pStruct->szName.c_str(), "Attack") )
{
DNVector(int) nVecCheckActionList;
nVecCheckActionList.push_back( GetCurrentActionIndex() );
if( IsCustomAction() )
nVecCheckActionList.push_back( GetCustomActionIndex() );
// next <20>׼<EFBFBD><D7BC><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>쿣 10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> next action <20><><EFBFBD><EFBFBD> stand <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD> <20>Է<EFBFBD> <20>ް<EFBFBD> <20>ص<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// next <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ֵǴ<D6B5> <20><><EFBFBD><20>ִ<EFBFBD>.
ActionElementStruct* pCurrentActionElement = GetElement( GetCurrentActionIndex() );
if( pCurrentActionElement )
{
if( 0 < pCurrentActionElement->szNextActionName.length() )
{
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><EFBFBD><EEB6BB> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<><C4BF> <20><> <20>־ <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><>.
//if( pCurrentActionElement->dwLength - (DWORD)CDnActionBase::m_fFrame < 10 )
{
int iNextActionIndex = GetElementIndex( pCurrentActionElement->szNextActionName.c_str() );
if( -1 < iNextActionIndex )
nVecCheckActionList.push_back( iNextActionIndex );
}
}
}
// cmdaction <20><><EFBFBD><EFBFBD> <20><>Ÿ <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>̵<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> cmdaction <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>Ʒ<EFBFBD> mixedaction <20><> <20><><EFBFBD>Ƿ<EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ش<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>.
bool bValid = false;
for( DWORD k=0; k<nVecCheckActionList.size(); k++ )
{
map<int, vector<CDnActionSpecificInfo::S_BASIC_ATTACK_INPUT_SIGNAL_INFO> >::const_iterator iter = m_pBasicAttackInfo->mapBasicAttackInfo.find( nVecCheckActionList[k] );
if( iter != m_pBasicAttackInfo->mapBasicAttackInfo.end() )
{
const vector<CDnActionSpecificInfo::S_BASIC_ATTACK_INPUT_SIGNAL_INFO>& vlInputSignals = iter->second;
for( int i = 0; i < (int)vlInputSignals.size(); ++i )
{
const CDnActionSpecificInfo::S_BASIC_ATTACK_INPUT_SIGNAL_INFO& InputSignalInfo = vlInputSignals.at( i );
if( strstr( pStruct->szName.c_str(), InputSignalInfo.strChangeActionName.c_str() ) )
{
bValid = true;
break;
}
}
}
}
if( !bValid )
{
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
return;
}
}
// <20>Ϲ<EFBFBD> <20><> <20>׼<EFBFBD><D7BC>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Dz <20>ñ׳<C3B1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> üũ.
if( m_pProjectileCountInfo ) {
map<int, DWORD>::const_iterator iterCooltime = m_pProjectileCountInfo->mapBasicShootActionCoolTime.find( nActionIndex );
if( m_pProjectileCountInfo->mapBasicShootActionCoolTime.end() != iterCooltime )
{
DWORD dwTerm = timeGetTime() - m_dwLastBasicShootActionTime;
DWORD dwCoolTime = DWORD((float)m_dwLastBasicShootCoolTime/m_fFrameSpeed);
if( dwTerm < dwCoolTime )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>Դϴ<D4B4>..
#ifndef _FINAL_BUILD
OutputDebug( "CDnPlayerActor-CS_CMDACTION: <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20>Ϲ<EFBFBD> <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.\n" );
#endif // #ifndef _FINAL_BUILD
return;
}
m_dwLastBasicShootActionTime = timeGetTime();
m_dwLastBasicShootCoolTime = iterCooltime->second;
}
}
if( IsCustomAction() ) ResetCustomAction();
// <20><>ų ä<><C3A4><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> cmdaction <20><>Ŷ<EFBFBD><C5B6> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>. #26467
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų ü<>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ñ׳<C3B1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E5B8A7> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƚ<EFBFBD><C8BD>ϰ<EFBFBD> Ȯ<><C8AE><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
if( false == bSkillChain )
_CheckProcessSkillActioncChange( pStruct->szName.c_str() );
CmdAction( pStruct->szName.c_str(), nLoopCount, fBlendFrame, false, false, bSkillChain );
// CS_CMDACTION <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD>.
_UpdateMaxProjectileCount( nActionIndex );
m_bUpdatedProjectileInfoFromCmdAction = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC> <20><> <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD>Ų <20>׼<EFBFBD>.
if( bFromStateBlow )
m_pStateBlow->OnCmdActionFromPacket( pStruct->szName.c_str() );
//
#ifdef _USE_VOICECHAT
m_nVoiceRotate = (int)EtToDegree( acos( EtVec2Dot( &EtVector2( 0.f, 1.f ), &vZVec ) ) );
if( vZVec.x > 0.0f )
m_nVoiceRotate = 360 - m_nVoiceRotate;
m_nVoiceRotate = (m_nVoiceRotate + 90) % 360;
m_pSession->SetVoicePos((int)vPos.x, (int)vPos.y, (int)vPos.z, m_nVoiceRotate);
#endif
}
break;
case eActor::CS_CMDMIXEDACTION:
{
// Note: <20><>Ƽ<EFBFBD><C6BC> <20>нú<D0BD> <20><>ų <20><><EFBFBD><EFBFBD> <20>߿<EFBFBD> <20>Ϲ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ϰ<EFBFBD> <20>ȴٸ<C8B4> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>.
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>.
if( IsProcessSkill() )
{
if( (m_hProcessSkill->GetSkillType() == CDnSkill::Passive || m_hProcessSkill->GetSkillType() == CDnSkill::AutoPassive) &&
m_hProcessSkill->GetDurationType() == CDnSkill::Instantly )
{
m_hProcessSkill->OnEnd( CDnActionBase::m_LocalTime, 0.f );
m_hProcessSkill.Identity();
}
}
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
int nActionIndex, nMaintenanceBone, nActionBone;
float fFrame, fBlendFrame;
EtVector3 vLook;
DWORD dwGap;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &nActionIndex, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &nActionBone, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &nMaintenanceBone, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &fFrame, sizeof(float), CPacketCompressStream::FLOAT_SHORT, 10.f );
Stream.Read( &fBlendFrame, sizeof(float), CPacketCompressStream::FLOAT_SHORT, 10.f );
Stream.Read( &m_cMovePushKeyFlag, sizeof(char) );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
ActionElementStruct *pStruct = GetElement( nActionIndex );
if( pStruct == NULL ) break;
// <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cmdaction <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> Skill_ <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD>̴<EFBFBD>. (<28><>ų ü<><C3BC> <20>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>)
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( CheckSkillAction(pStruct->szName.c_str()) == true )
{
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
break;
}
bool bCheckStandAction = CDnChangeStandActionBlow::CheckUsableAction( GetActorHandle(), true, pStruct->szName.c_str() );
if( bCheckStandAction == false )
{
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
return;
}
// <20>Ϲ<EFBFBD> <20><> <20>׼<EFBFBD><D7BC>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Dz <20>ñ׳<C3B1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> üũ.
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>(0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20>´<EFBFBD>.)<29><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><>Ÿ<EFBFBD>ӿ<EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD>, 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>
// <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ <20>ٰ<EFBFBD><D9B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>. <20><> <20>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><>ȿ<EFBFBD><C8BF> <20>ȴ<EFBFBD>..
// cmdaction <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϹǷ<CFB9> MIXEDACTION <20><> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
bool bActionCoolTimeChecked = false;
if( m_pProjectileCountInfo )
{
map<int, DWORD>::const_iterator iterCooltime = m_pProjectileCountInfo->mapBasicShootActionCoolTime.find( nActionIndex );
if( m_pProjectileCountInfo->mapBasicShootActionCoolTime.end() != iterCooltime )
{
if( 0.0f == fFrame )
{
DWORD dwTerm = timeGetTime() - m_dwLastBasicShootActionTime;
DWORD dwCoolTime = DWORD((float)m_dwLastBasicShootCoolTime/m_fFrameSpeed);
if( dwTerm < dwCoolTime )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>Դϴ<D4B4>..
#ifndef _FINAL_BUILD
OutputDebug( "CDnPlayerActor-CS_CMDMIXEDACTION: <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20>Ϲ<EFBFBD> <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.\n" );
#endif // #ifndef _FINAL_BUILD
return;
}
m_dwLastBasicShootActionTime = timeGetTime();
m_dwLastBasicShootCoolTime = iterCooltime->second;
bActionCoolTimeChecked = true;
}
}
}
if( false == bActionCoolTimeChecked )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ <20><> <20><> <20>ϰ<EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> hit <20>ñ׳<C3B1> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> hit <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>߰<EFBFBD> CmdStop <20>̳<EFBFBD> CmdMove <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ鼭 MixedAction <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20>Ѵ<EFBFBD>..
LOCAL_TIME MixedActionCoolTime = 500;
if( CDnActionBase::m_LocalTime - m_MixedActionTimeStamp < MixedActionCoolTime )
{
if( CDnActionBase::m_LocalTime - m_MixedActionTimeStamp < 0 )
m_MixedActionTimeStamp = CDnActionBase::m_LocalTime;
// <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
return;
}
m_MixedActionTimeStamp = CDnActionBase::m_LocalTime;
}
std::string szAction = pStruct->szName;
m_szActionBoneName = GetBoneName(nActionBone);
m_szMaintenanceBoneName = GetBoneName(nMaintenanceBone);
if( IsCustomAction() ) ResetCustomAction();
SetCustomAction( szAction.c_str(), fFrame );
// MixedAction <20><> OnChangeAction() <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ȵǹǷ<C7B9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>־<EFBFBD><D6BE><EFBFBD> <20><>.
//_UpdateMaxProjectileCount( nActionIndex, true );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0 <20><> <20>ƴϸ<C6B4> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><20>ٲ<EFBFBD><D9B2>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( 0.0f == fFrame )
{
_UpdateMaxProjectileCount( nActionIndex );
}
}
break;
case eActor::CS_PROJECTILE:
{
// next <20>׼<EFBFBD><D7BC><EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20>ٴٶ<D9B4><D9B6><EFBFBD> <20><><EFBFBD><20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> Ŭ<>󿡼<EFBFBD>
// <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ㼭 <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> loop <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
#ifdef PRE_ADD_LOOP_PROJECTILE
ActionElementStruct* pActionElement = GetElement( m_szAction.c_str() );
if( pActionElement && false == pActionElement->szNextActionName.empty() )
{
// TODO: <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IsCustomAction() <20><><EFBFBD><EFBFBD> mixed <20>ִϸ<D6B4><CFB8>̼<EFBFBD><CCBC><EFBFBD> üũ<C3BC>ؼ<EFBFBD>
// <20><>Ȯ<EFBFBD>ϰ<EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>. <20><><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7>Ը<EFBFBD> <20>صθ<D8B5> <20>ڷ<EFBFBD> <20><><EFBFBD>
// ȭ<><C8AD> <20><><EFBFBD><EFBFBD> Move_Back <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><> <20><>.
int iNextActionElementIndex = GetElementIndex( pActionElement->szNextActionName.c_str() );
if( GetCurrentActionIndex() == iNextActionElementIndex )
_UpdateMaxProjectileCount( iNextActionElementIndex );
}
#endif // #ifdef PRE_ADD_LOOP_PROJECTILE
CDnProjectile* pProjectile = CDnProjectile::CreatePlayerProjectileFromClientPacket( GetMySmartPtr(), pPacket );
}
break;
case eActor::CS_CMDLOOK:
{
CPacketCompressStream Stream( pPacket, 128 );
EtVector2 vLook, vZVec;
EtVector3 vXVec;
bool bForce;
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &bForce, sizeof(bool) );
Look( vLook, bForce );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
}
break;
case eActor::CS_USESKILL:
{
CPacketCompressStream Stream( pPacket, 128 );
int nSkillTableID = 0;
int nEnchantSkillID = 0; // #38294 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ex <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˷<EFBFBD><CBB7>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>뵵.
BYTE cLevel;
EtVector2 vLook, vZVec;
EtVector3 vXVec;
#ifdef PRE_ADD_POSITION_SYNC_BY_SKILL_USAGE
EtVector3 vPos;
#endif
bool bUseApplySkillItem = false;
bool bAutoUseFromServer = false; // <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
Stream.Read( &nSkillTableID, sizeof(int) );
Stream.Read( &cLevel, sizeof(char) );
Stream.Read( &bUseApplySkillItem, sizeof(bool) );
Stream.Read( m_abSignalSkillCheck, sizeof(m_abSignalSkillCheck) );
Stream.Read( &vZVec, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &vLook, sizeof(EtVector2), CPacketCompressStream::VECTOR2_SHORT );
Stream.Read( &bAutoUseFromServer, sizeof(bool) );
Stream.Read( &nEnchantSkillID, sizeof(int) );
#ifdef PRE_ADD_POSITION_SYNC_BY_SKILL_USAGE
Stream.Read(&vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
SetPosition( vPos );
#endif
Look( vLook, true );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̾ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> CanMove <20><> false <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20>ִµ<D6B4>
// <20>̷<EFBFBD> <20><><EFBFBD>쿣 Movable <20><> <20><>ų <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD>.
// <20>̹<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB0A1> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><>Ȳ<EFBFBD>̴<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) #14127
if( false == m_bMovable )
m_bMovable = true;
////////////////////////////////////////////////////////////////////////////////////////////////////
// Note: <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ApplySkill<6C><6C> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>..
// <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>. <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD><E9BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>Դϴ<D4B4>.
if( false == bUseApplySkillItem )
{
bool bSkipAirCondition = false;
if(CheckSkipAirCondition(nSkillTableID))
{
SetSignalSkillCheck(2,true);
bSkipAirCondition = true;
}
// <20><><EFBFBD>°<EFBFBD> Air<69>ΰ<EFBFBD><CEB0><20><><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD> GroundMovable <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Air üũ<C3BC><C5A9> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20><><EFBFBD>ҵǴ<D2B5> <20><><EFBFBD><20>ִ<EFBFBD>.
m_bUseSignalSkillCheck = (m_abSignalSkillCheck[ 0 ] || m_abSignalSkillCheck[ 1 ] || m_abSignalSkillCheck[ 2 ]);
if( m_hProcessSkill )
{
// #25154 <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> onend <20>ȴ<EFBFBD>.
if( false == m_hProcessSkill->IsAuraOn() )
{
m_hProcessSkill->OnEnd( CDnActionBase::m_LocalTime, 0.f );
}
else
{
// #26002 <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ŷ<EFBFBD><C5B6><EFBFBD> <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><ECB5B5> <20>Ѵ<EFBFBD>.
// <20>ȱ׷<C8B1><D7B7><EFBFBD> <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ȴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> ApplyStateEffect <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20>ǰݽ<C7B0> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǰ<C8B5> <20>ϴ<EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9>,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD>
// <20><EFBFBD><E7BFAC> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵǰ<C8B5> <20>ǹǷ<C7B9> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>̺κ<CCBA><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִٴ<D6B4> <20><><EFBFBD><EFBFBD> <20>Ͽ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
if( IsEnabledAuraSkill() )
ClearSelfStateSignalBlowQueue();
}
m_hProcessSkill.Identity();
}
if (GetActorHandle() && GetActorHandle()->IsAppliedThisStateBlow(STATE_BLOW::BLOW_345)) //rlkt_mechanicMODE
{
if (IsExistSkill(nSkillTableID, cLevel) == false)
AddSkill(nSkillTableID, cLevel);
}
if (IsExistSkill(nSkillTableID, cLevel) == false) {
((CDnPlayerSkillChecker*)m_pPlayerSkillChecker)->OnInvalidUseSkill(nSkillTableID, CDnSkill::UsingResult::NoExistSkill);
// Hack!!!
break;
}
#if defined( PRE_FIX_CHANGESTAND_HACK )
CDnChangeStandActionBlow::ReleaseStandChangeSkill( GetActorHandle(), true );
#endif
CDnSkill::UsingResult eResult = UseSkill( nSkillTableID );
if( eResult != CDnSkill::UsingResult::Success )
{
// <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>еǸ<D0B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<>󿡼<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ͽ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>뺸.
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>½<EFBFBD>Ų<EFBFBD><C5B2>.
((CDnPlayerSkillChecker*)m_pPlayerSkillChecker)->OnInvalidUseSkill( nSkillTableID, eResult );
switch( eResult )
{
case CDnSkill::FailedByCooltime:
break;
case CDnSkill::FailedByUsableChecker:
{
#ifdef PRE_FIX_69469
if( GetProcessSkill() ) CancelUsingSkill();
SetAction( "Stand", 0.f, 3.f );
#endif
const char* pCurrentAction = GetCurrentAction();
int iCurrentActionIndex = GetElementIndex( pCurrentAction );
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream LocalStream( pBuffer, 32 );
LocalStream.Write( &nSkillTableID, sizeof(int) );
LocalStream.Write( &eResult, sizeof(CDnSkill::UsingResult) );
LocalStream.Write( &iCurrentActionIndex, sizeof(int) );
Send( eActor::SC_SKILLUSING_FAILED, &LocalStream );
}
break;
}
}
if(bSkipAirCondition)
SetSignalSkillCheck(2,false); // <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>,
if( m_hProcessSkill && m_hProcessSkill->IsEquipItemSkill() )
{
m_afLastEquipItemSkillDelayTime = m_hProcessSkill->GetDelayTime();
m_afLastEquipItemSkillRemainTime = m_hProcessSkill->GetElapsedDelayTime();
}
m_bUseSignalSkillCheck = false;
ZeroMemory( m_abSignalSkillCheck, sizeof(m_abSignalSkillCheck) );
}
}
break;
case eActor::CS_VIEWSYNC:
{
if( GetGameRoom() && GetGameRoom()->GetGameTask() && !GetGameRoom()->GetGameTask()->IsSyncComplete() ) break;
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 );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
Look( vLook, false );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
SetPosition( vPos );
// SetMagnetPosition( vPos );
}
break;
case eActor::CS_CMDTOGGLEBATTLE:
{
CPacketCompressStream Stream( pPacket, 128 );
bool bBattle;
Stream.Read( &bBattle, sizeof(bool) );
CmdToggleBattle( bBattle );
}
break;
case eActor::CS_CMDPASSIVESKILLACTION:
{
CPacketCompressStream Stream( pPacket, 128 );
int nActionIndex, nLoopCount, nSkillID;
BYTE cLevel;
float fBlendFrame;
float fStartFrame;
EtVector3 vXVec, vPos;
EtVector2 vLook, vZVec;
bool bChargeKey = false;
Stream.Read( &nSkillID, sizeof(int));
Stream.Read( &cLevel, sizeof(char) );
Stream.Read( &nActionIndex, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
Stream.Read( &nLoopCount, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &fBlendFrame, sizeof(float), CPacketCompressStream::FLOAT_SHORT, 10.f );
Stream.Read( &fStartFrame, sizeof(float), CPacketCompressStream::FLOAT_SHORT, 10.0f );
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( &bChargeKey, sizeof(bool) );
bool bOnlyCheck = false;
Stream.Read( &bOnlyCheck, sizeof(bool) );
EtVec3Cross( &vXVec, &EtVector3( 0.f, 1.f, 0.f ), &EtVec2toVec3( vZVec ) );
ResetMove();
SetMoveVectorX( vXVec );
SetMoveVectorZ( EtVec2toVec3( vZVec ) );
Look( vLook );
//SetMagnetPosition( vPos );
SetPosition( vPos );
ActionElementStruct *pStruct = GetElement( nActionIndex );
if( pStruct == NULL )
{
// Hack!!
break;
}
// <20><>üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϹǷ<CFB9> <20><> <20><> <20>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
//if( IsCustomAction() ) ResetCustomAction();
// Tumble <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Move <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϱ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20><>üũ<C3BC><C5A9> <20>ɷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>.
// Tumble <20>׼<EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// CMDSTOP <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. Tumble <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> Move <20>׼ǿ<D7BC> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ȴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA>̹Ƿ<CCB9> Tumble <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
// <20>ٸ<EFBFBD> Ŭ<>󿡼<EFBFBD> <20><> skillid <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> Tumble <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>õ<EFBFBD> <20>нú<D0BD> <20><>ų id <20><> <20>ٲ㼭
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD>, <20><>ų<EFBFBD><C5B3> <20><>Ÿ<EFBFBD><C5B8><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>δ<EFBFBD> CmdInputHasPassiveSkill <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ȴ<EFBFBD>.
int iCurrentActionIndex = GetCurrentActionIndex();
vector<int> vlCheckActionIndices;
vlCheckActionIndices.push_back( iCurrentActionIndex );
// #23245 <20>и<EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20>׼<EFBFBD> ť<><C5A5><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾𿡼<CCBE> <20>̹<EFBFBD> <20>ٲ<EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> queue <20><> <20>׼DZ<D7BC><C7B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
int iQueuedActionIndex = -1;
if( false == m_szActionQueue.empty() )
{
iQueuedActionIndex = GetElementIndex( m_szActionQueue.c_str() );
vlCheckActionIndices.push_back( iQueuedActionIndex );
}
// mixed action <20><><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>ش<EFBFBD> <20>׼DZ<D7BC><C7B1><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( IsCustomAction() )
{
int iCustomActionIndex = GetCustomActionIndex();
vlCheckActionIndices.push_back( iCustomActionIndex );
ResetCustomAction();
}
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> cmdstop <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> stand <20><> <20><><EFBFBD><EFBFBD> tumblehelper <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
bool bNowStand = (0 != strstr( m_szAction.c_str(), "Stand" ));
// <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> Move <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> tunble helper <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ϴٰ<CFB4> <20><><EFBFBD>ٷ<EFBFBD> shift+<2B><> <20><><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>־ <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20><> <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> move <20>׼<EFBFBD> <20>ñ׳ο<D7B3> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ʾƼ<CABE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ֵǾ<D6B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
bool bNowMove = IsMove();
bool bValid = false;
for( int k = 0; k < (int)vlCheckActionIndices.size(); ++k )
{
int iCheckActionIndex = vlCheckActionIndices.at( k );
if( bNowStand || bNowMove )
{
map<int, int>::iterator iterTumble = m_mapTumbleHelper.find( nActionIndex );
if( m_mapTumbleHelper.end() != iterTumble )
{
// <20>ƹ<EFBFBD> <20>̵<EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> Tumble <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϹǷ<CFB9> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>̰ɷ<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD> Tumble <20><> <20><> üũ<C3BC><C5A9><EFBFBD><EFBFBD> valid <20>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
iCheckActionIndex = iterTumble->second;
}
}
if( !m_pPassiveSkillInfo || ( m_pPassiveSkillInfo && m_pPassiveSkillInfo->mapPassiveSkillInfo.empty() ) )
continue;
// <20><20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> inputhaspassive <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>.
map<int, vector<CDnActionSpecificInfo::S_PASSIVESKILL_SIGNAL_INFO> >::const_iterator iter = m_pPassiveSkillInfo->mapPassiveSkillInfo.find( iCheckActionIndex );
if( m_pPassiveSkillInfo->mapPassiveSkillInfo.end() != iter )
{
const vector<CDnActionSpecificInfo::S_PASSIVESKILL_SIGNAL_INFO>& vlPassiveSkillSignalInfos = iter->second;
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC≯<EFBFBD><CCB8><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><EFBFBD>̰<EFBFBD>, <20><><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD>ԵǴ<D4B5> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
for( int i = 0; i < (int)vlPassiveSkillSignalInfos.size(); ++i )
{
const CDnActionSpecificInfo::S_PASSIVESKILL_SIGNAL_INFO& PassiveSkillInfo = vlPassiveSkillSignalInfos.at( i );
if( PassiveSkillInfo.strChangeActionName == pStruct->szName ||
PassiveSkillInfo.strEXSkillChangeActionName == pStruct->szName )
{
// Ŭ<><C5AC><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><> <20><>û<EFBFBD><C3BB> <20>ִ<EFBFBD> <20>׼<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><> <20>ִ<EFBFBD> <20>нú<D0BD> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><> üũ<C3BC>Ѵ<EFBFBD>.
nSkillID = PassiveSkillInfo.iSkillID;
if( IsExistSkill( PassiveSkillInfo.iSkillID ) )
{
// <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><>ȭ<EFBFBD><C8AD> <20><> <20><><EFBFBD><EFBFBD>.
// <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>׼<EFBFBD><D7BC><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20>;<EFBFBD> <20><><EFBFBD><EFBFBD>.
DnSkillHandle hSkill = FindSkill( PassiveSkillInfo.iSkillID );
if( hSkill->IsEnchantedSkill() )
{
if( PassiveSkillInfo.strEXSkillChangeActionName == pStruct->szName )
bValid = true;
}
else
bValid = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><20>׼<EFBFBD><D7BC><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( strstr( pStruct->szName.c_str(), "ChargeShoot_" ) )
{
if( timeGetTime() - m_dwLastChargeShootTime < 1500 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>нú<D0BD> <20><>ų <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
bValid = false;
}
else
m_dwLastChargeShootTime = timeGetTime();
}
}
break;
}
}
// <20><>ġ<EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( false == bValid )
{
for( int i = 0; i < (int)vlPassiveSkillSignalInfos.size(); ++i )
{
const CDnActionSpecificInfo::S_PASSIVESKILL_SIGNAL_INFO& PassiveSkillInfo = vlPassiveSkillSignalInfos.at( i );
if( strstr( pStruct->szName.c_str(), PassiveSkillInfo.strChangeActionName.c_str() ) ) // <20>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> _Book, _Orb <20>̷<EFBFBD><CCB7><EFBFBD> <20>ٱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD><D4BF>η<EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
{
// Ŭ<><C5AC><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><> <20><>û<EFBFBD><C3BB> <20>ִ<EFBFBD> <20>׼<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><> <20>ִ<EFBFBD> <20>нú<D0BD> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><> üũ<C3BC>Ѵ<EFBFBD>.
nSkillID = PassiveSkillInfo.iSkillID;
if( IsExistSkill( PassiveSkillInfo.iSkillID ) )
{
// <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><>ȭ<EFBFBD><C8AD> <20><> <20><><EFBFBD><EFBFBD>.
// <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>׼<EFBFBD><D7BC><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20>;<EFBFBD> <20><><EFBFBD><EFBFBD>.
DnSkillHandle hSkill = FindSkill( PassiveSkillInfo.iSkillID );
if( hSkill->IsEnchantedSkill() )
{
if( PassiveSkillInfo.strEXSkillChangeActionName == pStruct->szName )
bValid = true;
}
else
bValid = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><20>׼<EFBFBD><D7BC><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if( strstr( pStruct->szName.c_str(), "ChargeShoot_" ) )
{
if( timeGetTime() - m_dwLastChargeShootTime < 1500 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>нú<D0BD> <20><>ų <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
bValid = false;
}
else
m_dwLastChargeShootTime = timeGetTime();
}
}
}
if( bValid )
break;
}
}
if( bValid )
break;
}
}
#if defined( PRE_FIX_CHANGESTAND_HACK )
CDnChangeStandActionBlow::ReleaseStandChangeSkill( GetActorHandle(), true );
#endif
if( false == bValid )
{
// Hack!! <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>,, <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>нú<D0BD> <20><>ų <20>ñ׳ε鿡 <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20><>.
// <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>ϰų<CFB0>..
// <20><><EFBFBD>̴<EFBFBD>.
#ifdef PRE_FIX_SKILL_FAILED_BY_ACTION
#ifdef PRE_FIX_69469
if( GetProcessSkill() ) CancelUsingSkill();
SetAction( "Stand", 0.f, 3.f );
#endif
const char* pCurrentAction = GetCurrentAction();
int iCurrentActionIndex = GetElementIndex( pCurrentAction );
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream LocalStream( pBuffer, 32 );
CDnSkill::UsingResult eResult = CDnSkill::FailedByInvailedAction;
LocalStream.Write( &nSkillID, sizeof(int) );
LocalStream.Write( &eResult, sizeof(CDnSkill::UsingResult) );
LocalStream.Write( &iCurrentActionIndex, sizeof(int) );
Send( eActor::SC_SKILLUSING_FAILED, &LocalStream );
#endif
return;
}
// <20><><EFBFBD><EFBFBD> <20><> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> nLoopCount <20><> fBlendFrame <20>̳<EFBFBD> fStartFrame <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ǵµ<C7B4>
// <20><> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ÿ<EFBFBD><C3BF><EFBFBD> <20>ñ׳ο<D7B3> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
CmdPassiveSkillAction( nSkillID, pStruct->szName.c_str(), nLoopCount, fBlendFrame, fStartFrame, bChargeKey, false, bOnlyCheck );
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
}
break;
case eActor::CS_POSREV:
{
if( GetGameRoom() && GetGameRoom()->GetGameTask() && !GetGameRoom()->GetGameTask()->IsSyncComplete() ) break;
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) );
_ASSERT( m_pPlayerSpeedHackChecker );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
SetPosition( 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( 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 );
}
}
}
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) );
_ASSERT( m_pPlayerSpeedHackChecker );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
SetPosition( vPos );
SetJumpMovement( EtVector2( 0.f, 0.f ) );
}
break;
case eActor::CS_CMDREMOVESTATEEFFECT:
{
CPacketCompressStream Stream( pPacket, 32 );
STATE_BLOW::emBLOW_INDEX emBlowIndex;
Stream.Read( &emBlowIndex, sizeof(STATE_BLOW::emBLOW_INDEX) );
// <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD>Ե<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<>󿡼<EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>˾ƾ<CBBE> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>ٽ<EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>. <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> Ŭ<>󿡼<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20><><EFBFBD><EFBFBD>.
CmdRemoveStateEffect( emBlowIndex );
break;
}
break;
#if defined(PRE_FIX_57706)
case eActor::CS_CMDREMOVESTATEEFFECTFROMID:
{
CPacketCompressStream Stream( pPacket, 32 );
int nServerBlowID = 0;
Stream.Read( &nServerBlowID, sizeof(int) );
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˰<EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>Ÿ<EFBFBD> <20>Ѵ<EFBFBD>.
CmdRemoveStateEffectFromID(nServerBlowID);
break;
}
break;
#endif // PRE_FIX_57706
case eActor::CS_CMDTOGGLEWEAPONORDER:
{
CPacketCompressStream Stream( pPacket, 32 );
int nEquipIndex;
bool bViewCash;
Stream.Read( &nEquipIndex, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &bViewCash, sizeof(bool) );
CmdToggleWeaponViewOrder( nEquipIndex, bViewCash );
}
break;
case eActor::CS_CMDTOGGLEPARTSORDER:
{
CPacketCompressStream Stream( pPacket, 32 );
int nEquipIndex;
bool bViewCash;
Stream.Read( &nEquipIndex, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &bViewCash, sizeof(bool) );
if( nEquipIndex == HIDEHELMET_BITINDEX ) CmdToggleHideHelmet( bViewCash );
else CmdTogglePartsViewOrder( nEquipIndex, bViewCash );
if (GetUserSession() && GetUserSession()->GetPartyID() > 0) {
if( nEquipIndex == CASHEQUIP_HELMET || nEquipIndex == CASHEQUIP_EARRING || nEquipIndex == HIDEHELMET_BITINDEX ) {
for (DWORD i = 0; i < m_pSession->GetGameRoom()->GetUserCount(); i++) {
CDNGameRoom::PartyStruct *pStruct = m_pSession->GetGameRoom()->GetPartyData(i);
if (pStruct == NULL) continue;
pStruct->pSession->SendPartyMemberPart(m_pSession);
}
}
}
}
break;
case eActor::CS_CMDPICKUPITEM:
{
if( IsDie() )
break;
if( IsInvalidPlayerChecker() ) break;
CPacketCompressStream Stream( pPacket, 128 );
DWORD dwUniqueID;
int nSignalIndex;
EtVector3 vPos;
int nRange = 100;
Stream.Read( &dwUniqueID, sizeof(DWORD) );
Stream.Read( &nSignalIndex, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
CEtActionSignal *pSignal = GetSignal( m_nActionIndex, nSignalIndex );
if( pSignal && pSignal->GetSignalIndex() == STE_PickupItem ) {
PickupItemStruct *pSignalStruct = (PickupItemStruct *)pSignal->GetData();
nRange = pSignalStruct->nRange;
}
m_pPlayerSpeedHackChecker->OnSyncPosition( vPos );
SetPosition( vPos );
if( GetGameRoom() )
{
DnDropItemHandle hDropItem = GetGameRoom()->FindDropItem( dwUniqueID );
if( hDropItem )
{
((CDnPlayerPickupChecker*)m_pPlayerPickupChecker)->OnPickupDist( vPos, hDropItem );
if( m_pSession && m_pSession->GetItem() && m_pSession->GetItem()->GetPetEquip() )//<2F>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ߴٸ<DFB4>
{
const TVehicle* pPet = m_pSession->GetItem()->GetPetEquip();
// <20>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD>(2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
float fDist = EtVec2Length( &(EtVector2(hDropItem->GetPosition()->x,hDropItem->GetPosition()->z)-EtVector2(vPos.x,vPos.z) ) );
if( fDist > pPet->nRange*2.f )
return;
}
else
{
// <20>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD>(2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
float fDist = EtVec2Length( &(EtVector2(hDropItem->GetPosition()->x,hDropItem->GetPosition()->z)-EtVector2(vPos.x,vPos.z) ) );
if( fDist > nRange*2.f )
return;
}
PickupItemStruct Struct;
Struct.nRange = nRange;
CmdPickupItem( &Struct, hDropItem );
}
}
break;
}
case eActor::CS_CMDESCAPE:
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_LastEscapeTime > 0 && CDnActionBase::m_LocalTime - m_LastEscapeTime < 1000 * 60 * 1 ) break;
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
SetPosition( vPos );
SetStaticPosition( vPos );
SetPrevPosition( vPos );
if( m_pPlayerSpeedHackChecker ) m_pPlayerSpeedHackChecker->ResetInvalid();
if( m_pPlayerDoNotEnterChecker ) m_pPlayerDoNotEnterChecker->ResetInvalid();
CmdEscape( vPos );
}
break;
case eActor::CS_CANNONPOSSESS_REQ:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰڴٴ<DAB4> Ŭ<><C5AC><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><>û.
// <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
CPacketCompressStream Stream( pPacket, 128 );
DWORD dwCannonMonsterActorID = 0;
MatrixEx Cross;
Stream.Read( &dwCannonMonsterActorID, sizeof(DWORD) );
Stream.Read( &Cross, sizeof(MatrixEx) );
bool bSuccess = false;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>Ҵ<EFBFBD>.
CDnActor *pActor = CDnActor::FindActorFromUniqueID( GetRoom(), dwCannonMonsterActorID );
if( pActor && pActor->GetActorType() == ActorTypeEnum::Cannon )
{
CDnCannonMonsterActor* pCannonActor = static_cast<CDnCannonMonsterActor*>( pActor );
// Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ó<EFBFBD><C3B3> <20><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
// Press Circle <20><><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20>ָ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20>ִ<EFBFBD>.. <20><20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>־ <20><> <20><>.
bool bValid = false;
float fDistanceSQ = EtVec3LengthSq( &EtVector3(*pCannonActor->GetPosition() - *GetPosition()) );
float fPressCircleDist = float(GetUnitSize() + pCannonActor->GetUnitSize());
float fPressCircleDistSQ = fPressCircleDist * fPressCircleDist;
if( fPressCircleDistSQ <= fDistanceSQ + 1000.0f || fPressCircleDistSQ - 1000.f <= fDistanceSQ)
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( false == pCannonActor->IsPossessed() )
{
m_bPlayerCannonMode = true;
pCannonActor->SetMasterPlayerActor( GetMySmartPtr() );
m_hCannonMonsterActor = pCannonActor->GetMySmartPtr();
m_Cross = Cross;
bSuccess = true;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
char acBuffer[ 64 ] = { 0 };
CPacketCompressStream Result( acBuffer, sizeof(acBuffer) );
Result.Write( &bSuccess, sizeof(bool) );
Result.Write( &dwCannonMonsterActorID, sizeof(DWORD) );
Result.Write( &m_Cross.m_vPosition, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Result.Write( &m_Cross.m_vXAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
Result.Write( &m_Cross.m_vYAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
Result.Write( &m_Cross.m_vZAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
Send( eActor::SC_CANNONPOSSESS_RES, &Result );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
SetWeight(0.f);
SetPressLevel(-1);
#ifdef PRE_ADD_MODIFY_PLAYER_CANNON
DNTableFileFormat* pTableCannon = GetDNTable( CDnTableDB::TCANNON );
if( pTableCannon->IsExistItem( pCannonActor->GetClassID() ) )
{
const char* pCannonActionName = pTableCannon->GetFieldFromLablePtr( pCannonActor->GetClassID(), "_StandName" )->GetString();
CmdAction(pCannonActionName);
}
else
{
CmdAction( "Stand_Cannon" );
}
#else
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
CmdAction( "Stand_Cannon" );
#endif
}
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( false == bSuccess )
{
char acBuffer[ 64 ] = { 0 };
CPacketCompressStream Result( acBuffer, sizeof(acBuffer) );
Result.Write( &bSuccess, sizeof(bool) );
Send( eActor::SC_CANNONPOSSESS_RES, &Result );
}
}
break;
case eActor::CS_CANNONRELEASE:
{
DWORD dwCannonMonsterID = 0;
MatrixEx Cross;
CPacketCompressStream Result( pPacket, 64 );
Result.Read( &dwCannonMonsterID, sizeof(DWORD) );
Result.Read( &Cross.m_vPosition, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Result.Read( &Cross.m_vXAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
Result.Read( &Cross.m_vYAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
Result.Read( &Cross.m_vZAxis, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
CDnActor* pActor = CDnActor::FindActorFromUniqueID( GetRoom(), dwCannonMonsterID );
if( pActor && pActor->GetActorType() == ActorTypeEnum::Cannon )
{
CDnCannonMonsterActor* pCannonMonster = static_cast<CDnCannonMonsterActor*>(pActor);
pCannonMonster->ClearMasterPlayerActor();
m_Cross = Cross;
EndCannonMode();
}
}
break;
case eActor::CS_CANNONROTATESYNC:
{
_ASSERT( IsCannonMode() );
if( false == IsCannonMode() )
break;
CPacketCompressStream Stream( pPacket, 64 );
DWORD dwCannonMonsterID = 0;
EtVector3 vDirection( 0.0f, 0.0f, 0.0f );
Stream.Read( &dwCannonMonsterID, sizeof(DWORD) );
Stream.Read( &vDirection, sizeof(EtVector3), CPacketCompressStream::VECTOR3_SHORT );
CDnActor* pActor = CDnActor::FindActorFromUniqueID( GetRoom(), dwCannonMonsterID );
if( pActor && pActor->GetActorType() == ActorTypeEnum::Cannon )
{
CDnCannonMonsterActor* pCannonMonster = static_cast<CDnCannonMonsterActor*>(pActor);
EtVec3Normalize( &vDirection, &vDirection ); // <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD>ȭ <20><> <20><> <20><><EFBFBD><EFBFBD>.
pCannonMonster->SetCannonLookDirection(&vDirection); // Rotha - <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
m_Cross.m_vZAxis = pCannonMonster->GetMatEx()->m_vZAxis;
m_Cross.MakeUpCartesianByZAxis();
// press circle <20><><EFBFBD><EFBFBD>ŭ <20>о<EFBFBD><D0BE>ָ<EFBFBD> <20>ȴ<EFBFBD>.
m_Cross.m_vPosition = pCannonMonster->GetMatEx()->m_vPosition - (pCannonMonster->GetMatEx()->m_vZAxis*20.0f);
EtVector2 vDir;
float vDist = 0.0f;
_ASSERT( GetPress() == CDnActorState::Press_Circle && pCannonMonster->GetPress() == CDnActorState::Press_Circle );
if( GetPress() == CDnActorState::Press_Circle && pCannonMonster->GetPress() == CDnActorState::Press_Circle )
{
if( CheckPressCircle2Clrcle2( pCannonMonster->GetMySmartPtr(), GetMySmartPtr() , vDir, vDist ) )
{
m_Cross.m_vPosition.x += vDir.x*vDist;
m_Cross.m_vPosition.z += vDir.y*vDist;
}
}
// <20><> Ÿ<>ֿ̹<CCB9> <20>ٸ<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> "Stand" <20>׼<EFBFBD><D7BC><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Stand_Cannon <20><> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ϴٰ<CFB4> Ǯ<><C7AE><EFBFBD>ų<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>.
const char* pCurrentAction = GetCurrentAction();
if( strcmp(pCurrentAction, "Stand") == 0 )
{
#ifdef PRE_ADD_MODIFY_PLAYER_CANNON
DNTableFileFormat* pTableCannon = GetDNTable( CDnTableDB::TCANNON );
if( pTableCannon->IsExistItem( pCannonMonster->GetClassID() ) )
{
const char* pCannonActionName = pTableCannon->GetFieldFromLablePtr( pCannonMonster->GetClassID(), "_StandName" )->GetString();
CmdAction(pCannonActionName);
}
else
{
CmdAction( "Stand_Cannon" );
}
#else
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
CmdAction( "Stand_Cannon" );
#endif
}
}
}
break;
case eActor::CS_CANNONTARGETING:
{
if( false == IsCannonMode() )
break;
DWORD dwCannonMonsterID = 0;
EtVector3 vCannonDir; // Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> ī<>޶<EFBFBD><DEB6><EFBFBD> <20>ٶ󺸰<D9B6> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
EtVector3 vShootDir;
EtVector3 vCannonGroundHitPos;
CPacketCompressStream Stream( pPacket, 64 );
Stream.Read( &dwCannonMonsterID, sizeof(DWORD) );
Stream.Read( &vCannonDir, sizeof(EtVector3) );
Stream.Read( &vShootDir, sizeof(EtVector3) );
Stream.Read( &vCannonGroundHitPos, sizeof(EtVector3) );
CDnActor* pActor = CDnActor::FindActorFromUniqueID( GetRoom(), dwCannonMonsterID );
if( pActor && pActor->GetActorType() == ActorTypeEnum::Cannon )
{
CDnCannonMonsterActor* pCannonMonster = static_cast<CDnCannonMonsterActor*>(pActor);
pCannonMonster->SetCannonProjectileInfo( vCannonDir, vShootDir, vCannonGroundHitPos );
}
}
break;
case eActor::CS_VEHICLE_RIDE_COMPLETE:
{
if(!IsVehicleMode() || !GetMyVehicleActor())
return;
CPacketCompressStream Stream( pPacket, 128 );
bool bComplete = false;
Stream.Read( &bComplete, sizeof(bool) );
if(bComplete)
{
DNVector( DnBlowHandle ) vlhFrameBlows;
DNVector( DnBlowHandle ) vlhMoveSpeedBlows;
m_pStateBlow->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_025, vlhFrameBlows );
m_pStateBlow->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_076, vlhMoveSpeedBlows );
if(vlhFrameBlows.size() > 0)
{
for(DWORD i=0 ; i<vlhFrameBlows.size() ; i++)
{
if(vlhFrameBlows[i])
GetMyVehicleActor()->CmdAddStateEffect( vlhFrameBlows[i]->GetParentSkillInfo() , vlhFrameBlows[i]->GetBlowIndex() , (int)(vlhFrameBlows[i]->GetDurationTime() * 1000) ,
vlhFrameBlows[i]->GetValue() );
}
}
if(vlhMoveSpeedBlows.size() > 0)
{
for(DWORD i=0 ; i<vlhMoveSpeedBlows.size() ; i++)
{
if(vlhMoveSpeedBlows[i])
GetMyVehicleActor()->CmdAddStateEffect( vlhMoveSpeedBlows[i]->GetParentSkillInfo() , vlhMoveSpeedBlows[i]->GetBlowIndex() , (int)(vlhMoveSpeedBlows[i]->GetDurationTime() * 1000) ,
vlhMoveSpeedBlows[i]->GetValue() );
}
}
}
}
break;
case eActor::CS_SYNCPRESSEDPOS:
{
if( GetGameRoom() && GetGameRoom()->GetGameTask() && !GetGameRoom()->GetGameTask()->IsSyncComplete() ) break;
CPacketCompressStream Stream( pPacket, 128 );
EtVector3 vPos;
DWORD dwGap;
Stream.Read( &dwGap, sizeof(DWORD) );
Stream.Read( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
m_pPlayerSpeedHackChecker->OnSyncDatumGap( dwGap );
SetPosition( vPos );
// SetMagnetPosition( vPos );
}
break;
case eActor::CS_UDP_PING:
{
CPacketCompressStream Stream( pPacket, 128 );
DWORD dwTick = 0;
Stream.Read( &dwTick, sizeof(dwTick) );
m_pSession->RecvUdpPing( dwTick );
break;
}
case eActor::CS_SUMMONOFF:
{
CPacketCompressStream Stream( pPacket, 64 );
DWORD dwSummonMonsterUniqueID = 0;
Stream.Read( &dwSummonMonsterUniqueID, sizeof(DWORD) );
CDnActor* pSummonMonster = CDnActor::FindActorFromUniqueID( GetRoom(), dwSummonMonsterUniqueID );
if (pSummonMonster)
pSummonMonster->CmdSuicide(false, false);
}
break;
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
// case eActor::CS_TOTAL_LEVEL:
// {
// int nTotalLevel = 0;
//
// CPacketCompressStream Stream( pPacket, 128 );
// Stream.Read( &nTotalLevel, sizeof(int) );
//
// UpdateTotalLevel(nTotalLevel);
// }
// break;
case eActor::CS_ADD_TOTAL_LEVEL_SKILL:
{
int nSlotIndex = -1;
int nSkillID = 0;
bool isInitialize = false;
CPacketCompressStream Stream( pPacket, 128 );
Stream.Read( &nSlotIndex, sizeof(int) );
Stream.Read( &nSkillID, sizeof(int) );
Stream.Read( &isInitialize, sizeof(bool) );
if( nSlotIndex >= TotalLevelSkill::Common::MAXSLOTCOUNT )
break;
if(!m_pSession->AddTotalLevelSkillData(nSlotIndex, nSkillID, isInitialize))
{
break;
}
else
AddTotalLevelSkill(nSlotIndex, nSkillID, isInitialize);
m_pSession->SendAddTotalLevelSkill(m_pSession->GetSessionID(), nSlotIndex, nSkillID, isInitialize);
}
break;
case eActor::CS_REMOVE_TOTAL_LEVEL_SKILL:
{
int nSlotIndex = -1;
CPacketCompressStream Stream( pPacket, 128 );
Stream.Read( &nSlotIndex, sizeof(int) );
if( nSlotIndex < 0 || nSlotIndex >= TotalLevelSkill::Common::MAXSLOTCOUNT )
break;
RemoveTotalLevelSkill(nSlotIndex);
m_pSession->AddTotalLevelSkillData(nSlotIndex, 0);
m_pSession->SendDelTotalLevelSkill(m_pSession->GetSessionID(), nSlotIndex);
}
break;
// case eActor::CS_TOTAL_LEVEL_SKILL_ACTIVE_LIST:
// {
// int nCount = 0;
// int nSlotIndex = -1;
// int nSkillID = 0;
//
// CPacketCompressStream Stream( pPacket, 128 );
// Stream.Read( &nCount, sizeof(int) );
//
// for (int i = 0; i < nCount; ++i)
// {
// Stream.Read( &nSlotIndex, sizeof(int) );
// Stream.Read( &nSkillID, sizeof(int) );
//
// ActivateTotalLevelSkillSlot(nSlotIndex, true);
// AddTotalLevelSkill(nSlotIndex, nSkillID);
// }
// }
// break;
// case eActor::CS_TOTAL_LEVEL_SKILL_CASHSLOT_ACTIVATE:
// {
// int nSlotIndex = -1;
// bool bActivate = false;
//
// CPacketCompressStream Stream( pPacket, 128 );
// Stream.Read(&nSlotIndex, sizeof(int));
// Stream.Read(&bActivate, sizeof(bool));
//
// ActivateTotalLevelSkillCashSlot(bActivate);
// }
// break;
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
#if defined(PRE_FIX_68898)
case eActor::CS_SKIP_END_ACTION:
{
bool isSkipEndAction = false;
CPacketCompressStream Stream( pPacket, 128 );
Stream.Read(&isSkipEndAction, sizeof(bool));
SetSkipEndAction(isSkipEndAction);
}
break;
#endif // PRE_FIX_68898
}
}
void CDnPlayerActor::SyncClassTime( LOCAL_TIME LocalTime )
{
MAActorRenderBase::m_LocalTime = LocalTime;
CDnActor::SyncClassTime( LocalTime );
}
void CDnPlayerActor::ProcessDie( LOCAL_TIME LocalTime, float fDelta )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>~
if( !IsDie() ) {
ToggleGhostMode( false );
return;
}
if( m_fDieDelta > 0.f ) {
m_fDieDelta -= fDelta;
if( m_fDieDelta < 0.f ) m_fDieDelta = 0.f;
}
if( !m_bGhost && m_fDieDelta < m_fMaxDieDelta - 4.f ) {
ToggleGhostMode( true );
}
if( m_fDieDelta <= 0.f ) {
OnFinishProcessDie();
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><>ų <20><><EFBFBD><20><> <20>ְ<EFBFBD>, <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><>ų<EFBFBD><C5B3> <20><><EFBFBD>. <20>ϴ<EFBFBD> <20>׳<EFBFBD> <20>Ǽ<EFBFBD><C7BC><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_afLastEquipItemSkillRemainTime != 0.0f )
{
m_afLastEquipItemSkillRemainTime -= fDelta;
if( m_afLastEquipItemSkillRemainTime < 0.0f )
m_afLastEquipItemSkillRemainTime = 0.0f;
}
}
void CDnPlayerActor::OnKillMonster(DnActorHandle hMonster)
{
if ( !m_pSession ) return;
if ( m_pSession->GetQuest() == NULL ) return;
if( hMonster && hMonster->IsMonsterActor() )
{
CDnMonsterActor* pMonster = static_cast<CDnMonsterActor*>(hMonster.GetPointer());
if ( pMonster )
{
m_pSession->GetQuest()->OnKillMonster(pMonster->GetMonsterClassID());
UpdateKillMonster();
if (pMonster->IsBossKillCheck())
UpdateKillBoss();
}
}
}
void CDnPlayerActor::OnStateBlowProcessAfter()
{
if( m_uiStateBlowProcessAfterBit&eStateBlowAfterProcessType::eRebirth )
{
m_uiStateBlowProcessAfterBit &= ~eStateBlowAfterProcessType::eRebirth;
if( !GetGameRoom() )
{
_DANGER_POINT();
return;
}
GetGameRoom()->OnRebirth( GetActorHandle() );
}
if( m_uiStateBlowProcessAfterBit & eStateBlowAfterProcessType::eDelZombie )
{
m_uiStateBlowProcessAfterBit &= ~eStateBlowAfterProcessType::eDelZombie;
if( GetGameRoom() && GetGameRoom()->bIsZombieMode() )
static_cast<CPvPZombieMode*>(static_cast<CDNPvPGameRoom*>(GetGameRoom())->GetPvPGameMode())->DelZombie( GetActorHandle(), true );
}
}
void CDnPlayerActor::OnAddStateBlowProcessAfterType( eStateBlowAfterProcessType Type )
{
m_uiStateBlowProcessAfterBit |= Type;
}
void CDnPlayerActor::OnDie( DnActorHandle hHitter )
{
#if defined( PRE_ADD_SECONDARY_SKILL )
if( GetUserSession() && GetUserSession()->GetSecondarySkillRepository() )
static_cast<CSecondarySkillRepositoryServer*>(GetUserSession()->GetSecondarySkillRepository())->CancelManufacture();
#endif // #if defined( PRE_ADD_SECONDARY_SKILL )
CDnActor::OnDie( hHitter );
// hitter <20><> <20><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD>ʿ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>. /////////////////////////////////////////////
if(hHitter && hHitter->IsPlayerActor())
{
CDnPlayerActor *pPlayer = static_cast<CDnPlayerActor*>(hHitter.GetPointer());
boost::shared_ptr<IDnObserverNotifyEvent> pEvent( IDnObserverNotifyEvent::Create( EVENT_PLAYER_KILL_TARGET ) );
pPlayer->Notify( pEvent );
}
//////////////////////////////////////////////////////////////////////////
UpdateDead();
AddStageDeathCount();
if(m_pRoom && !m_pRoom->bIsPvPRoom()) {
for( DWORD i=0; i<CDnPartyTask::GetInstance(GetRoom()).GetUserCount(); i++ ) {
CDNGameRoom::PartyStruct *pParty = CDnPartyTask::GetInstance(GetRoom()).GetPartyData(i);
if( !pParty || !pParty->pSession ) continue;
if( pParty->pSession == m_pSession ) continue;
DnActorHandle hActor = pParty->pSession->GetActorHandle();
if( !hActor ) continue;
CDnPlayerActor *pPlayer = (CDnPlayerActor *)hActor.GetPointer();
pPlayer->UpdatePartyMemberDead();
}
}
// <20><><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>,
// <20><>Ȱ<EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>ٽ<EFBFBD> <20>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD> <20><>..
if( m_hProcessSkill )
m_hProcessSkill->OnEnd( CDnActionBase::m_LocalTime, 0.0f );
// <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD>
EndAutoPassiveSkill( CDnActionBase::m_LocalTime, 0.0f );
// <20><><EFBFBD>ξ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>
EndPrefixSystemSkill(CDnActionBase::m_LocalTime, 0.0f);
// #14340 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. <20>׾<EFBFBD><D7BE><EFBFBD> <20><> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų, <20><><EFBFBD>۽<EFBFBD>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD>ش<EFBFBD>.
if( IsEnabledToggleSkill() )
OnSkillToggle( m_hToggleSkill, false );
if( IsEnabledAuraSkill() )
OnSkillAura( m_hAuraSkill, false );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
RemoveAllBlowExpectPassiveSkill();
// <20>κ<EFBFBD><CEBA><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD>ش<EFBFBD>.
if( m_pSession && m_pSession->GetItem() )
{
//m_pSession->GetItem()->ResetCoolTime();
}
SetSP(0);
bool bIgnoreDuration = false;
if (bIgnoreDuration == false)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD>ش<EFBFBD>.
bool bDecreaseDurability = true;
if( m_pRoom ) {
if( m_pRoom->bIsPvPRoom() ) bDecreaseDurability = false;
else if( m_pRoom->bIsDLRoom() ) bDecreaseDurability = false;
else if( m_pRoom->bIsFarmRoom() ) bDecreaseDurability = false;
}
if( bDecreaseDurability ) OnDecreaseEquipDurability( GetDeadDurabilityRatio(), true );
}
if( GetGameRoom() )
{
GetGameRoom()->OnDie( GetActorHandle(), hHitter );
if( GetGameRoom()->GetGameTask() )
GetGameRoom()->GetGameTask()->OnDie( GetActorHandle(), hHitter );
}
if( IsCannonMode() )
{
static_cast<CDnCannonMonsterActor*>(m_hCannonMonsterActor.GetPointer())->OnMasterPlayerActorDie();
EndCannonMode();
}
m_pBubbleSystem->Clear();
if( CDnWorld::IsActive(GetRoom()) )
{
CDnWorld::GetInstance(GetRoom()).InsertTriggerEventStore( "DieActionPlayer", GetUniqueID() );
CDnWorld::GetInstance(GetRoom()).OnTriggerEventCallback( "CDnPlayerActor::OnDie", CDnActionBase::m_LocalTime, 0.f );
}
}
void CDnPlayerActor::OnFinishProcessDie()
{
if( GetGameRoom() )
GetGameRoom()->OnFinishProcessDie( GetActorHandle() );
}
void CDnPlayerActor::ResetActor()
{
CDnActor::ResetActor();
m_cMovePushKeyFlag = 0;
m_LastEscapeTime = 0;
if( IsProcessSkill() ) CancelUsingSkill();
// #26902 <20>ӽ÷<D3BD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD>. Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( IsTempSkillAdded() )
{
RemoveAllTempSkill();
EndAddTempSkillAndSendRestoreTempJobChange();
}
if( m_pPlayerSpeedHackChecker ) m_pPlayerSpeedHackChecker->ResetInvalid();
map<int, DnSkillHandle>::iterator iter = m_mapEnchantSkillFromBubble.begin();
for( iter; iter != m_mapEnchantSkillFromBubble.end(); )
{
SAFE_RELEASE_SPTR( iter->second );
iter = m_mapEnchantSkillFromBubble.erase( iter );
}
m_MixedActionTimeStamp = 0;
}
void CDnPlayerActor::GetBoundingSphere( SSphere &Sphere, bool bActorSize/* = false*/ )
{
Sphere.Center = m_Cross.m_vPosition;
Sphere.Center.y += 50.f;
Sphere.fRadius = 50.f;
}
void CDnPlayerActor::SetBattleMode( bool bEnable )
{
m_bBattleMode = bEnable;
}
bool CDnPlayerActor::IsCanBattleMode()
{
if( IsSwapSingleSkin() ) return false;
if( m_bBattleMode && !m_hWeapon[0] ) return false;
if( IsSpectatorMode() ) return false;
return m_bBattleMode;
}
int CDnPlayerActor::GetLevelUpSkillPoint( int nPrevLevel, int nCurLevel )
{
if( nPrevLevel == nCurLevel ) return 0;
int nSkillPoint = 0;
for( int i=nPrevLevel+1; i<=nCurLevel; i++ ) {
int nItemID = ( ( GetClassID() - 1 ) * PLAYER_MAX_LEVEL ) + i;
nSkillPoint += CPlayerLevelTable::GetInstance().GetValue( GetJobClassID(), i, CPlayerLevelTable::SkillPoint );
}
return nSkillPoint;
}
void CDnPlayerActor::OnBattleToggle( bool bBattle )
{
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &bBattle, sizeof(bool) );
Send( eActor::SC_CMDTOGGLEBATTLE, &Stream );
}
void CDnPlayerActor::OnLevelUp( int nLevel, int nLevelUpAmount )
{
if( !IsDie() ) {
SetHP( GetMaxHP() );
SetSP( GetMaxSP() );
}
int nSkillPoint = GetLevelUpSkillPoint( nLevel - nLevelUpAmount, nLevel );
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_pSession->ChangeSkillPoint(nSkillPoint, 0, true, DBDNWorldDef::SkillPointCode::LevelUp, DualSkill::Type::Primary);
m_pSession->ChangeSkillPoint(nSkillPoint, 0, true, DBDNWorldDef::SkillPointCode::LevelUp, DualSkill::Type::Secondary);
m_pSession->SetLevel(m_nLevel, DBDNWorldDef::CharacterLevelChangeCode::Normal, true);
m_pSession->SetExp(m_nExperience, DBDNWorldDef::CharacterExpChangeCode::Dungeon, 0, true);
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &nLevel, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Write( &m_nExperience, sizeof(int) );
Send( eActor::SC_LEVELUP, &Stream );
#if !defined(PRE_DELETE_DUNGEONCLEAR)
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><20>ѹ<EFBFBD> <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20>ؼ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD>°͵<C2B0> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_pSession->RefreshDungeonEnterLevel();
#endif // #if !defined(PRE_DELETE_DUNGEONCLEAR)
// Refresh <20>غ<EFBFBD><D8BA><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( CDnPartyTask::IsActive(GetRoom()) ) CDnPartyTask::GetInstance(GetRoom()).UpdateGateInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20>Ҹ<EFBFBD> SP <20><> <20>ٸ<EFBFBD><D9B8><EFBFBD><E2B6AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
for( DWORD i=0; i<GetSkillCount(); i++ ) {
DnSkillHandle hSkill = GetSkillFromIndex(i);
if( hSkill ) hSkill->RefreshDecreaseMP();
}
m_pSession->NotifyGuildMemberLevelUp(nLevel);
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnLevelUp );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( m_pSession->GetMasterSystemData()->SimpleInfo.iMasterCount > 0 && nLevel >= static_cast<int>(CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MasterSystem_GraduateLevel )) )
{
if( m_pSession->CheckDBConnection() )
m_pSession->GetDBConnection()->QueryMasterSystemGraduate( m_pSession );
}
if( CDnWorld::GetInstance(GetRoom()).GetMapType() == EWorldEnum::MapTypeDungeon && m_pSession->GetPeriodExpItemRate() > 0 )
m_pSession->SetPeriodExpItemRate();
#if defined( PRE_ADD_BESTFRIEND )
m_pSession->BestFriendChangeLevel(nLevel, true);
#endif
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
UpdateTotalLevelByCharLevel();
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
}
void CDnPlayerActor::OnAddExperience( int nAddExperience, int nLogCode, INT64 biFKey )
{
m_pSession->ChangeExp(nAddExperience, nLogCode, biFKey); // db<64><62><EFBFBD><EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
}
void CDnPlayerActor::OnBeginStateBlow( DnBlowHandle hBlow )
{
// <20><><EFBFBD>߿<EFBFBD> <20><>ġ<EFBFBD><C4A1>..
DNVector(DnActorHandle) hVecList;
ScanActor( GetRoom(), m_Cross.m_vPosition, 2000.f, hVecList );
for( DWORD i=0; i<hVecList.size(); i++ )
{
DnActorHandle hActor = hVecList[i];
if( !hActor )
continue;
CDNAggroSystem* pAggroSystem = hActor->GetAggroSystem();
// <20>Ϲݴ<CFB9><DDB4><EFBFBD> <20>÷<EFBFBD><C3B7>̽ÿ<CCBD><C3BF><EFBFBD> PlayerActor <20><> AggroSystem <20><> <20><><EFBFBD><EFBFBD>.
if( !pAggroSystem )
continue;
if( !pAggroSystem->bOnCheckPlayerBeginStateBlow( this ) )
continue;
pAggroSystem->OnStateBlowAggro( hBlow );
}
}
void CDnPlayerActor::UnLockSkill( int nSkillID, INT64 nUnlockPrice/*=0*/ )
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǰ<C8B5>..
vector<int>::iterator iter = find( m_vlUnlockZeroLevelSkills.begin(), m_vlUnlockZeroLevelSkills.end(), nSkillID );
_ASSERT( m_vlUnlockZeroLevelSkills.end() == iter );
if( m_vlUnlockZeroLevelSkills.end() == iter )
{
m_vlUnlockZeroLevelSkills.push_back( nSkillID );
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = nSkillID;
SkillInfo.iSkillLevel = 0;
SkillInfo.bCurrentLock = false;
m_vlPossessedSkill.push_back( SkillInfo );
INT64 biCurrentCoin = 0;
INT64 biPickUpCoin = 0;
if( nUnlockPrice > 0 )
{
biCurrentCoin = m_pSession->GetCoin();
biPickUpCoin = m_pSession->GetPickUpCoin();
m_pSession->SelPickUpCoin(0);
}
m_pSession->GetDBConnection()->QueryAddSkill(m_pSession, nSkillID, SkillInfo.iSkillLevel, 0, DBDNWorldDef::SkillChangeCode::GainByBuy, nUnlockPrice, biCurrentCoin, biPickUpCoin);
}
}
int CDnPlayerActor::CanAcquireSkillIfUnlock( int nSkillID )
{
int nRetCode = ERROR_NONE;
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( GetPossessedSkillInfo() );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = GetLevel();
TryAcquire.iTryAcquireSkillID = nSkillID;
TryAcquire.iHasSkillPoint = GetAvailSkillPointByJob( nSkillID );
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
int iNeedJob = pSkillTable->GetFieldFromLablePtr( nSkillID, "_NeedJob" )->GetInteger();
if( IsPassJob( iNeedJob ) )
{
pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
// #36858 <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><>ų <20><><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool bAlreadyGlobalSkillAcquired = HasSameGlobalIDSkill( nSkillID );
bool bIgnoreParentSkillCondition = ( (CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_LOCKED_PARENTSKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL == Output.eResult) ) &&
true == bAlreadyGlobalSkillAcquired;
if( CDnSkillTreeSystem::R_SUCCESS != Output.eResult &&
false == bIgnoreParentSkillCondition )
{
switch( Output.eResult )
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E4B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_CHAR_LEVEL;
break;
// <20><><EFBFBD><EFBFBD>(<28>θ<EFBFBD>) <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_DONT_HAVE_PARENT_SKILL;
break;
// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_PARENT_SKILL_LEVEL;
break;
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_SKILLPOINT;
break;
}
}
}
return nRetCode;
}
int CDnPlayerActor::AcquireSkill( int nSkillID )
{
int nRetCode = ERROR_NONE;
vector<int>::iterator iter = find( m_vlUnlockZeroLevelSkills.begin(), m_vlUnlockZeroLevelSkills.end(), nSkillID );
_ASSERT( m_vlUnlockZeroLevelSkills.end() != iter );
if( m_vlUnlockZeroLevelSkills.end() != iter )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
TSkillData* pSkillData = g_pDataManager->GetSkillData( nSkillID );
if( IsExclusiveSkill( nSkillID, pSkillData->nExclusiveID ) )
{
// Ŭ<>󿡼<EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
return ERROR_SKILL_ACQUIRE_FAIL_EXCLUSIVE;
}
CDnSkillTreeSystem* pSkillTreeSystem = g_pDataManager->GetSkillTreeSystem();
CDnSkillTreeSystem::S_TRY_ACQUIRE TryAcquire( GetPossessedSkillInfo() );
CDnSkillTreeSystem::S_OUTPUT Output;
TryAcquire.iCurrentCharLevel = GetLevel();
TryAcquire.iTryAcquireSkillID = nSkillID;
TryAcquire.iHasSkillPoint = GetAvailSkillPointByJob( nSkillID );
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
int iNeedJob = pSkillTable->GetFieldFromLablePtr( nSkillID, "_NeedJob" )->GetInteger();
if( IsPassJob( iNeedJob ) )
{
//TryAcquire.iJobID = iNeedJob;
pSkillTreeSystem->TryAcquireSkill( TryAcquire, &Output );
#if defined(PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP)
std::vector<int> nNeedSPValues;
CDnSkillTask* pSkillTask = static_cast<CDnSkillTask*>(CTaskManager::GetInstance( m_pSession->GetGameRoom() ).GetTask( "SkillTask" ));
if (pSkillTask)
pSkillTask->GetNeedSPValuesByJob(nSkillID, nNeedSPValues);
std::vector<int> jobHistory;
GetJobHistory(jobHistory);
bool bAvailableSPByJob = false;
if (pSkillTask)
bAvailableSPByJob = pSkillTask->IsAvailableSPByJob(jobHistory, nNeedSPValues, this);
if (bAvailableSPByJob == false)
Output.eResult = CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE;
#endif // PRE_ADD_SKILL_LEVELUP_LIMIT_BY_SP
// #36858 <20>۷ι<DBB7> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><>ų <20><><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool bAlreadyGlobalSkillAcquired = HasSameGlobalIDSkill( nSkillID );
bool bIgnoreParentSkillCondition = ( (CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_LOCKED_PARENTSKILL == Output.eResult) ||
(CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL == Output.eResult) ) &&
true == bAlreadyGlobalSkillAcquired;
if( CDnSkillTreeSystem::R_SUCCESS == Output.eResult ||
true == bIgnoreParentSkillCondition )
{
// <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31> <20>ٲ<EFBFBD>.
//vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill.begin();
//for( iter; m_vlPossessedSkill.end() != iter; ++iter )
//{
// if( iter->iSkillID == nSkillID )
// {
// iter->iSkillLevel = 1;
// break;
// }
//}
bool bSuccess = AddSkill( nSkillID, 1 );
_ASSERT( bSuccess );
DnSkillHandle hAcquiredSkill = FindSkill( nSkillID );
m_pSession->ChangeSkillPoint( -hAcquiredSkill->GetNowLevelSkillPoint(), nSkillID, false, 0 );
m_pSession->GetDBConnection()->QueryModSkillLevel(m_pSession, nSkillID, 1, 0, -hAcquiredSkill->GetNowLevelSkillPoint(), DBDNWorldDef::SkillChangeCode::GainByBuy); // db<64><62><EFBFBD><EFBFBD>: <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
}
else
{
switch( Output.eResult )
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><EFBFBD><E4B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_CHAR_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_CHAR_LEVEL;
break;
// <20><><EFBFBD><EFBFBD>(<28>θ<EFBFBD>) <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_DONT_HAVE_PARENT_SKILL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_DONT_HAVE_PARENT_SKILL;
break;
// <20>θ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_PARENT_SKILL_LEVEL:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_PARENT_SKILL_LEVEL;
break;
// <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
case CDnSkillTreeSystem::R_NOT_ENOUGH_SKILLPOINT_TO_ACQUIRE:
nRetCode = ERROR_SKILL_ACQUIRE_FAIL_NOT_ENOUGH_SKILLPOINT;
break;
}
}
}
}
return nRetCode;
}
void CDnPlayerActor::CheckAndRegisterObserverStateBlow( DnBlowHandle hBlow )
{
switch( hBlow->GetBlowIndex() )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
case STATE_BLOW::BLOW_030:
{
CDnBlockBlow* pObservable = static_cast<CDnBlockBlow*>( hBlow.GetPointer() );
pObservable->RegisterObserver( m_pBubbleSystem );
}
break;
// <20>и<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
case STATE_BLOW::BLOW_031:
{
CDnParryBlow* pObservable = static_cast<CDnParryBlow*>( hBlow.GetPointer() );
pObservable->RegisterObserver( m_pBubbleSystem );
}
break;
// <20><>Ÿ<EFBFBD><C5B8> <20>и<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>.
case STATE_BLOW::BLOW_153:
{
CDnCooltimeParryBlow* pObservable = static_cast<CDnCooltimeParryBlow*>( hBlow.GetPointer() );
pObservable->RegisterObserver( m_pBubbleSystem );
}
break;
}
}
void CDnPlayerActor::OnApplyPassiveSkillBlow( int iBlowID )
{
DnBlowHandle hBlow = m_pStateBlow->GetStateBlowFromID( iBlowID );
if( hBlow )
CheckAndRegisterObserverStateBlow( hBlow );
}
bool CDnPlayerActor::CanAddSkill( int nSkillTableID, int nLevel /*= 1*/ )
{
TSkillData* pSkillData = g_pDataManager->GetSkillData( nSkillTableID );
if( pSkillData == NULL )
return false;
if( GetGameRoom() == NULL )
return false;
if( GetGameRoom()->bIsZombieMode() == true )
{
if( CDnSkill::Passive == pSkillData->cSkillType && CDnSkill::DurationTypeEnum::Buff == pSkillData->cDurationType )
return false;
}
return true;
}
bool CDnPlayerActor::AddSkill( int nSkillTableID, int nLevel /* = 1 */, int iSkillLevelApplyType/* = CDnSkill::PVE*/ )
{
bool bSuccess = false;
if( 0 < nLevel )
{
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> pve/pvp <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iSkillLevelDataType = CDnSkill::PVE;
if( GetGameRoom()->bIsPvPRoom() )
iSkillLevelDataType = CDnSkill::PVP;
bSuccess = MASkillUser::AddSkill( nSkillTableID, nLevel, iSkillLevelDataType );
vector<int>::iterator iter = find( m_vlUnlockZeroLevelSkills.begin(), m_vlUnlockZeroLevelSkills.end(), nSkillTableID );
if( m_vlUnlockZeroLevelSkills.end() != iter )
m_vlUnlockZeroLevelSkills.erase( iter );
}
else
{
// ó<><C3B3><EFBFBD><EFBFBD> DB <20>κ<EFBFBD><CEBA><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų.
m_vlUnlockZeroLevelSkills.push_back( nSkillTableID );
bSuccess = true;
}
//if( bSuccess )
//{
// bool bFinded = false;
// int iNumPossessed = (int)m_vlPossessedSkill.size();
// for( int i = 0; i < iNumPossessed; ++i )
// {
// CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO& PossessedSkill = m_vlPossessedSkill.at( i );
// if( PossessedSkill.iSkillID == nSkillTableID )
// {
// PossessedSkill.iSkillLevel = nLevel;
// bFinded = true;
// }
// }
// if( false == bFinded )
// {
// // unlock <20><> <20><> <20><><EFBFBD><EFBFBD> 0 ¥<><C2A5> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>־<EFBFBD><D6BE>ش<EFBFBD>.
// CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
// SkillInfo.iSkillID = nSkillTableID;
// SkillInfo.iSkillLevel = nLevel;
// SkillInfo.bCurrentLock = false;
// m_vlPossessedSkill.push_back( SkillInfo );
// }
//}
return bSuccess;
}
bool CDnPlayerActor::ExecuteSkill( DnSkillHandle hSkill, LOCAL_TIME LocalTime, float fDelta )
{
ResetCustomAction();
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۸<EFBFBD> <20><> <20><> m_hAuraSkill <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// CDnActor::OnSkillExecute( LocalTime, fDelta );
DnSkillHandle hNowSkill;
if( m_hAuraSkill )
hNowSkill = m_hAuraSkill;
bool bResult = CDnActor::ExecuteSkill( hSkill, LocalTime, fDelta );
if( m_hProcessSkill )
hNowSkill = m_hProcessSkill;
else
if( m_hAuraSkill )
hNowSkill = m_hAuraSkill;
if( bResult && hNowSkill )
{
UpdateUseSkill( hNowSkill );
// <20>ϴ<EFBFBD> <20>ν<EFBFBD><CEBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20>߻<EFBFBD><DFBB><EFBFBD>Ų<EFBFBD><C5B2>. <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD>ٸ<EFBFBD>
// <20><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20>ɷ<EFBFBD><C9B7>ش<EFBFBD>.
switch( hNowSkill->GetDurationType() ) {
case CDnSkill::Instantly:
break;
default:
{
if( m_pSession && m_pSession->GetMissionSystem() )
{
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnSkillUse, 2,
EventSystem::SkillID, hNowSkill->GetClassID(),
EventSystem::SkillLevel, hNowSkill->GetLevel() );
}
}
break;
}
}
#ifdef PRE_ADD_EXPORT_DPS_INFORMATION
if( bResult && CDnDPSReporter::IsActive() )
{
if(CDnDPSReporter::GetInstance().IsEnabledUser( GetCharacterDBID() ))
{
DNVector(DnActorHandle) hVecList;
ScanActor( GetRoom(), *GetPosition() , 500.f , hVecList );
CDnDPSReporter::GetInstance().ReportSkillInfo( hSkill , (int)hVecList.size());
}
}
#endif
return bResult;
}
void CDnPlayerActor::OnHitSuccess( LOCAL_TIME LocalTime, DnActorHandle hActor, HitStruct *pStruct )
{
// #33265 by kalliste
// #if defined( PRE_ADD_LOTUSGOLEM )
// if( hActor->GetHitParam()->bIgnoreShowDamage == true )
// {
// m_nComboDelay = -1;
// return;
// }
// #endif // #if defined( PRE_ADD_LOTUSGOLEM )
// #12170 <20>޺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30> hit <20><> <20>޺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3>.
if( m_bAllowCalcCombo &&
0 < pStruct->nComboDelay )
{
if( m_nComboDelay > 0 ) {
#if defined( PRE_ADD_LOTUSGOLEM )
if( hActor->GetHitParam()->bIgnoreShowDamage == false )
m_nComboCount++;
#else
m_nComboCount++;
#endif // #if defined( PRE_ADD_LOTUSGOLEM )
if( m_nComboCount > m_nTotalComboCount )
m_nTotalComboCount = m_nComboCount;
UpdateMaxCombo( m_nComboCount );
}
else {
m_nComboCount = 1;
}
m_nComboDelay = pStruct->nComboDelay;
if( m_nComboDelay == 0 ) {
m_nComboCount = 0;
}
}
switch( hActor->GetHitParam()->HitType ) {
case CDnWeapon::Critical: UpdateCriticalHit(); break;
case CDnWeapon::Stun: UpdateStunHit(); break;
}
CheckNormalHitSEProcessor( hActor, *hActor->GetHitParam() );
if( hActor && hActor->IsHit() && pStruct->szTargetHitAction != NULL )
{
if( IsAppliedThisStateBlow(STATE_BLOW::BLOW_246) )
{
DNVector(DnBlowHandle) vlBlows;
GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_246, vlBlows );
for( DWORD i=0; i<vlBlows.size(); i++ )
{
if( vlBlows[i] )
{
const CDnSkill::SkillInfo* pSkillInfo = vlBlows[i]->GetParentSkillInfo();
if( pSkillInfo )
{
DnActorHandle hHitter = pSkillInfo->hSkillUser;
if( hHitter == hActor )
{
vlBlows[i]->SetState(STATE_BLOW::STATE_END);
SendRemoveStateEffectFromID( vlBlows[i]->GetBlowID() );
}
}
}
}
}
}
}
// <20><> <20><><EFBFBD>Ͱ<EFBFBD> <20><> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD>ߵǾ<DFB5><C7BE><EFBFBD> <20><>.
void CDnPlayerActor::OnHitProjectile( LOCAL_TIME LocalTime, DnActorHandle hHittedTarget, const CDnDamageBase::SHitParam& HitParam )
{
CheckNormalHitSEProcessor( hHittedTarget, HitParam );
}
void CDnPlayerActor::CheckNormalHitSEProcessor( DnActorHandle hHittedTarget, const CDnDamageBase::SHitParam& HitParam )
{
// #23818 <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ξ<EFBFBD> <20><>ų<EFBFBD><C5B3> ó<><C3B3><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> "<22><>Ÿ" <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>.
// <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>ؼ<EFBFBD> ó<><C3B3>.
if( hHittedTarget )
{
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( ( false == IsProcessSkill() || false == HitParam.bFromProjectileSkill) )
{
int iNumApplySEProcessor = (int)m_vlpApplySEWhenNormalHitProcessor.size();
for( int i = 0; i < iNumApplySEProcessor; ++i )
{
CDnApplySEWhenTargetNormalHitProcessor* pProcessor = static_cast<CDnApplySEWhenTargetNormalHitProcessor*>( m_vlpApplySEWhenNormalHitProcessor.at( i ) );
pProcessor->OnNormalHitSuccess( hHittedTarget );
}
}
}
}
void CDnPlayerActor::OnHitFinish( LOCAL_TIME LocalTime, HitStruct *pStruct )
{
CDnActor::OnHitFinish( LocalTime, pStruct );
/*
if( m_nComboDelay > 0 && pStruct->bFinish ) {
for( DWORD i=0; i<m_hVecLastHitList.size(); i++ ) {
if( m_hVecLastHitList[i] && m_hVecLastHitList[i]->IsAir() ) {
m_nChainCount++;
UpdateChainCombo();
char pBuffer[2];
CPacketCompressStream Stream( pBuffer, sizeof(pBuffer) );
Stream.Write( &m_nChainCount, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
Send( eActor::SC_CHAIN, &Stream );
break;
}
}
}
*/
int nDieCount = 0;
for( DWORD i=0; i<m_hVecLastHitList.size(); i++ ) {
if( m_hVecLastHitList[i] && m_hVecLastHitList[i]->IsDie() ) nDieCount++;
}
UpdateMissionByMonsterKillCount(nDieCount);
}
void CDnPlayerActor::UpdateMissionByMonsterKillCount(int nCount)
{
if( nCount >= 3 ) UpdateGenocide();
if( nCount >= 2 && m_pSession )
{
m_pSession->GetEventSystem()->OnEvent( EventSystem::OnKillMonster, 1,
EventSystem::GenocideCount, nCount );
}
}
void CDnPlayerActor::SaveUserData(TUserData &UserData)
{
#ifndef PRE_FIX_SKILLLIST
memset( UserData.Skill.SkillList, 0, sizeof(UserData.Skill.SkillList) );
if( static_cast<CDNGameRoom*>(GetRoom())->bIsPvPRoom() == false )
{
int iIndex = 0;
for( UINT i=0 ; i<m_vlhSkillList.size() ; ++i )
{
DnSkillHandle hSkill = m_vlhSkillList[i];
if( !hSkill )
continue;
UserData.Skill.SkillList[iIndex].nSkillID = hSkill->GetClassID();
UserData.Skill.SkillList[iIndex].cSkillLevel = hSkill->GetLevel();
UserData.Skill.SkillList[iIndex].nCoolTime = static_cast<int>(hSkill->GetElapsedDelayTime()*1000);
++iIndex;
}
}
#else
memset( UserData.Skill[0].SkillList, 0, sizeof(UserData.Skill[0].SkillList) );
if( static_cast<CDNGameRoom*>(GetRoom())->bIsPvPRoom() == false )
{
int iIndex = 0;
DWORD dwNumSkill = GetSkillCount();
for( DWORD i = 0; i < dwNumSkill; ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
if( !hSkill )
continue;
UserData.Skill[0].SkillList[iIndex].nSkillID = hSkill->GetClassID();
UserData.Skill[0].SkillList[iIndex].cSkillLevel = hSkill->GetLevel();
UserData.Skill[0].SkillList[iIndex].nCoolTime = static_cast<int>(hSkill->GetElapsedDelayTime()*1000);
++iIndex;
}
}
#endif // #ifndef PRE_FIX_SKILLLIST
UserData.Status.nGlyphDelayTime = (int)(m_afLastEquipItemSkillDelayTime * 1000.f);
UserData.Status.nGlyphRemainTime = (int)(m_afLastEquipItemSkillRemainTime * 1000.f);
if( GetUserSession() && m_nInvalidPlayerCheckCounter > 0 )
{
g_Log.Log( LogType::_HACK, GetUserSession(), L"HackChecker(DB) : CharName=%s Counter=%d\n", GetUserSession()->GetCharacterName(), m_nInvalidPlayerCheckCounter );
m_pSession->GetDBConnection()->QueryAddAbuseMonitor( m_pSession, m_nInvalidPlayerCheckCounter, 0 );
m_nInvalidPlayerCheckCounter = 0;
}
}
void CDnPlayerActor::SetUserSession(CDNUserSession * pSession)
{
m_pSession = pSession;
m_pPartyData = pSession->GetGameRoom()->GetPartyData( m_pSession );
// EquipDelayTime, EquipRemainTime <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>׳<EFBFBD> <20><><EFBFBD>ش<EFBFBD>;;
m_afLastEquipItemSkillDelayTime = (float)m_pSession->GetGlyphDelayTime() / 1000.f;
m_afLastEquipItemSkillRemainTime = (float)m_pSession->GetGlyphRemainTime() / 1000.f;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Կ<EFBFBD> <20><>ġ<EFBFBD>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ִٸ<D6B4> <20><>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( m_ahEquipSkill )
m_ahEquipSkill->SetOnceCoolTime( m_afLastEquipItemSkillDelayTime, m_afLastEquipItemSkillRemainTime );
SetAccountLevel(m_pSession->GetAccountLevel());
}
void CDnPlayerActor::ProcessCombo( LOCAL_TIME LocalTime, float fDelta )
{
if( m_nComboDelay > 0 ) m_nComboDelay -= (int)( fDelta * 1000 );
if( m_nComboDelay < 0 ) {
OnComboFinish( m_nComboCount );
m_nComboCount = 0;
m_nComboDelay = 0;
}
}
void CDnPlayerActor::OnComboFinish( int nCombo )
{
if( nCombo > 1 ) {
UpdateCombo( nCombo );
}
}
bool CDnPlayerActor::IsGMTrace() const
{
if( m_pSession && m_pSession->bIsGMTrace() )
return true;
return false;
}
UINT CDnPlayerActor::GetSessionID()
{
return m_pSession ? m_pSession->GetSessionID() : 0;
}
int CDnPlayerActor::GetMoveSpeed()
{
int nMoveSpeed = CDnActor::GetMoveSpeed();
if( CDnWorld::IsActive(GetRoom()) && ( CDnWorld::GetInstance(GetRoom()).GetMapType() == EWorldEnum::MapTypeVillage || CDnWorld::GetInstance(GetRoom()).GetMapType() == EWorldEnum::MapTypeWorldMap ) )
nMoveSpeed += GetSafeZoneMoveSpeed();
if( IsTransformMode() )
{
nMoveSpeed = g_pDataManager->GetMonsterMutationMoveSpeed( m_nMonsterMutationTableID );
if( m_cMovePushKeyFlag & 0x08 )
nMoveSpeed /= 2;
return nMoveSpeed;
}
if( m_cMovePushKeyFlag & 0x08 ) nMoveSpeed /= 2;
// #62481 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>
if( !IsGhost() && !IsBattleMode() ) nMoveSpeed = (int)( nMoveSpeed * 1.4f );
if( IsDie() && IsGhost() ) nMoveSpeed = (int)( nMoveSpeed * 1.5f );
return nMoveSpeed;
}
void CDnPlayerActor::OnAddSkill( DnSkillHandle hSkill, bool isInitialize/* = false*/ )
{
CDnActor::OnAddSkill( hSkill, isInitialize );
if( hSkill )
{
bool bFinded = false;
int iNumPossessed = (int)m_vlPossessedSkill.size();
for( int i = 0; i < iNumPossessed; ++i )
{
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO& PossessedSkill = m_vlPossessedSkill.at( i );
if( PossessedSkill.iSkillID == hSkill->GetClassID() )
{
PossessedSkill.iSkillLevel = hSkill->GetLevel();
bFinded = true;
}
}
if( false == bFinded )
{
// unlock <20><> <20><> <20><><EFBFBD><EFBFBD> 0 ¥<><C2A5> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>־<EFBFBD><D6BE>ش<EFBFBD>.
CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO SkillInfo;
SkillInfo.iSkillID = hSkill->GetClassID();
SkillInfo.iSkillLevel = hSkill->GetLevel();
SkillInfo.bCurrentLock = false;
m_vlPossessedSkill.push_back( SkillInfo );
}
}
// <20>߰<EFBFBD><DFB0><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.(<28><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> ȹ<><C8B9> <20>߰ų<DFB0> <20>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
if( hSkill->GetSkillType() == CDnSkill::EnchantPassive )
{
int iBaseSkillID = hSkill->GetBaseSkillID();
DnSkillHandle hBaseSkill = FindSkill( iBaseSkillID );
if( hBaseSkill )
{
#if defined(PRE_FIX_64312)
//<2F><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, MAAiSkill<6C><6C><EFBFBD><EFBFBD> UseSkill<6C><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
bool isSummonMonsterSkill = false;
isSummonMonsterSkill = hBaseSkill->IsSummonMonsterSkill();
if (isSummonMonsterSkill == false)
hBaseSkill->ApplyEnchantSkill( hSkill );
else
hBaseSkill->AddSummonMonsterEnchantSkill(hSkill);
#else
hBaseSkill->ApplyEnchantSkill( hSkill );
#endif // PRE_FIX_64312
}
}
else
{
// <20>߰<EFBFBD><DFB0><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>. (<28>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
CheckAndApplyEnchantPassiveSkill( hSkill );
}
}
void CDnPlayerActor::OnRemoveSkill( DnSkillHandle hSkill )
{
CDnActor::OnRemoveSkill( hSkill );
if( hSkill )
{
vector<CDnSkillTreeSystem::S_POSSESSED_SKILL_INFO>::iterator iter = m_vlPossessedSkill.begin();
for( iter; iter != m_vlPossessedSkill.end(); ++iter )
{
if( iter->iSkillID == hSkill->GetClassID() )
{
m_vlPossessedSkill.erase( iter );
break;
}
}
}
// <20>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>нú<D0BD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( CDnSkill::EnchantPassive == hSkill->GetSkillType() &&
0 < hSkill->GetBaseSkillID() )
{
DnSkillHandle hBaseSkill = FindSkill( hSkill->GetBaseSkillID() );
if( hBaseSkill )
{
#if defined(PRE_FIX_64312)
//<2F><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, MAAiSkill<6C><6C><EFBFBD><EFBFBD> UseSkill<6C><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
bool isSummonMonsterSkill = false;
isSummonMonsterSkill = hBaseSkill->IsSummonMonsterSkill();
if (isSummonMonsterSkill == false)
hBaseSkill->ReleaseEnchantSkill();
else
hBaseSkill->RemoveSummonMonsterEnchantSkill();
#else
hBaseSkill->ReleaseEnchantSkill();
#endif // PRE_FIX_64312
}
}
// <20>ٸ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>нú<D0BD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><> <20><><EFBFBD><20><><EFBFBD>̽<EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ǹǷ<C7B9> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
}
void CDnPlayerActor::ProcessRecoverySP( LOCAL_TIME LocalTime, float fDelta )
{
if( IsDie() ) {
m_fRecoverySPDelta = 0.f;
return;
}
m_fRecoverySPDelta += fDelta;
int nValue = GetSP();
if( m_fRecoverySPDelta >= s_fRecoverySPTime ) {
m_fRecoverySPDelta -= s_fRecoverySPTime;
nValue += GetRecoverySP();
}
else return;
if( GetSP() >= GetMaxSP() ) return;
nValue = min( nValue, GetMaxSP() );
SetSP( nValue );
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &nValue, sizeof(int) );
Send( eActor::SC_RECOVERYSP, &Stream );
}
void CDnPlayerActor::CmdToggleWeaponViewOrder( int nEquipIndex, bool bShowCash )
{
SetWeaponViewOrder( nEquipIndex, bShowCash );
RefreshWeaponViewOrder( nEquipIndex );
if( m_pSession )
{
m_pSession->SetViewCashEquipBitmap(CASHEQUIP_WEAPON1 + nEquipIndex, bShowCash);
}
}
void CDnPlayerActor::CmdTogglePartsViewOrder( int nEquipIndex, bool bShowCash )
{
if ((nEquipIndex < 0) || (nEquipIndex >= _countof(m_bPartsViewOrder)))
return;
SetPartsViewOrder( nEquipIndex, bShowCash );
RefreshPartsViewOrder( nEquipIndex );
if( m_pSession )
m_pSession->SetViewCashEquipBitmap(nEquipIndex, bShowCash);
}
void CDnPlayerActor::CmdToggleHideHelmet( bool bHideHelmet )
{
if( m_pSession )
m_pSession->SetViewCashEquipBitmap(HIDEHELMET_BITINDEX, bHideHelmet);
}
void CDnPlayerActor::CmdChangeJob( int nJobID )
{
SetJobHistory( nJobID );
OnChangeJob( nJobID );
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &nJobID, sizeof(int) );
Send( eActor::SC_CHANGEJOB, m_pSession->GetSessionID(), &Stream );
}
void CDnPlayerActor::CmdEscape( EtVector3 &vPos )
{
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &vPos, sizeof(EtVector3), CPacketCompressStream::VECTOR3_BIT );
Send( eActor::SC_CMDESCAPE, &Stream );
}
void CDnPlayerActor::ToggleGhostMode( bool bGhost )
{
if( bGhost == m_bGhost ) return;
m_bGhost = bGhost;
if( bGhost == true && GetSP() > 0 )
SetSP(0);
#ifdef PRE_FIX_GAMESERVER_USE_GHOST_MODE
bool bGhostMode = true;
CDnGameTask* pGameTask = m_pSession->GetGameRoom()->GetGameTask();
if( pGameTask && pGameTask->GetGameTaskType() == GameTaskType::PvP )
{
bGhostMode = false;
CDNGameRoom* pGameRoom = GetGameRoom();
#if defined(PRE_ADD_PVP_TOURNAMENT)
if( pGameRoom && pGameRoom->GetPvPGameMode() && (pGameRoom->GetPvPGameMode()->bIsAllKillMode() || pGameRoom->GetPvPGameMode()->bIsTournamentMode()))
#else
if( pGameRoom && pGameRoom->GetPvPGameMode() && pGameRoom->GetPvPGameMode()->bIsAllKillMode() )
#endif //#if defined(PRE_ADD_PVP_TOURNAMENT)
bGhostMode= true;
}
if( !bGhostMode )
{
if( bGhost )
{
if( IsMovable() || IsStay() )
{
SetAction( "Die", 0.f, 0.f, false );
}
}
else
{
std::string szActionName = "Stand";
if(m_bShootMode)
szActionName = "MOD_Stand";
if(IsTransformMode())
{
if(IsExistAction( "Summon_On" ))
szActionName = "Summon_On";
}
SetAction( szActionName.c_str(), 0.f, 0.f );
}
}
else
{
if( bGhost )
{
SwapSingleSkin( 499 + m_nClassID );
SetAction( "Stand", 0.f, 0.f );
}
else
{
SwapSingleSkin( -1 );
SetAction( "Stand", 0.f, 0.f );
}
}
#endif
if( m_bGhost && GetGameRoom() && GetGameRoom()->GetGameTask() )
GetGameRoom()->GetGameTask()->OnGhost( GetActorHandle() );
}
void CDnPlayerActor::_CheckProcessSkillActioncChange( const char* pAction )
{
// #26467 <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>õǰ<C3B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20><><EFBFBD>ŵǹǷ<C7B9> <20><><EFBFBD>ٷ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؼ<EFBFBD> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD> <20>ƴϸ<C6B4> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if( m_hProcessSkill )
{
m_setUseActionName.clear();
m_setUseActionName.insert( pAction );
if( false == m_hProcessSkill->IsUseActionNames( m_setUseActionName ) )
{
if( false == (IsEnabledAuraSkill() && m_hProcessSkill->IsAuraOn()) )
{
m_hProcessSkill->OnEnd( CDnActionBase::m_LocalTime, 0.f );
}
m_hProcessSkill.Identity();
}
}
}
void CDnPlayerActor::_CheckActionWithProcessPassiveActionSkill( const char* szPrevAction )
{
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD≯<EFBFBD> <20>н<EFBFBD>
if( szPrevAction && m_nPrevActionIndex == m_nActionIndex )
return;
// if instantly passive skill, then cancel skill. ( ex) archer's spinkick)
// because state effect must deactivate when change to another attack action.
if( m_hProcessSkill )
{
m_setUseActionName.clear();
m_setUseActionName.insert( szPrevAction );
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> prev <20>׼<EFBFBD><D7BC><EFBFBD> next <20>׼<EFBFBD><D7BC>̶<EFBFBD><CCB6><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> next <20>׼<EFBFBD><D7BC><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>
// <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ѵ<EFBFBD>.
ActionElementStruct* pElement = GetElement( szPrevAction );
bool bIsNextAction = false;
if( pElement )
{
// #25154 <20><20><><EFBFBD>ĵ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> next <20>׼<EFBFBD><D7BC><EFBFBD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD><EFBFBD> <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> Stand <20><> <20>Ǿ<EFBFBD><C7BE>ִµ<D6B4> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_hProcessSkill <20><> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǴܵǾ NULL <20><> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>Ѵ<EFBFBD>.
// m_hProcessSkill <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> onend <20><> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bIsNextAction <20><> false <20><> <20>ǰ<EFBFBD> m_hProcessSkill->IsUseSkillActionNames() <20>Լ<EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>
// <20><>ų <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǴܵǾ<DCB5><C7BE><EFBFBD> <20>Ѵ<EFBFBD>.
bIsNextAction = ((pElement->szNextActionName != "Stand") && (pElement->szNextActionName == GetCurrentAction()));
}
if( false == bIsNextAction &&
m_hProcessSkill->IsUseActionNames( m_setUseActionName ) )
{
// <20><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3> <20>нú<D0BD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD>ϵǾ<CFB5> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> , GetPassiveSkillLengh() <20><> <20>˼<EFBFBD><CBBC>ִ<EFBFBD>.
if( ( (m_hProcessSkill->GetSkillType() == CDnSkill::Passive || m_hProcessSkill->GetPassiveSkillLength() != 0.f ) || m_hProcessSkill->GetSkillType() == CDnSkill::AutoPassive) &&
m_hProcessSkill->GetDurationType() == CDnSkill::Instantly )
{
// <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> ü<><C3BC> <20>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>. <20>ѹ<EFBFBD> üũ<C3BC>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> ü<><C3BC> <20>Է<EFBFBD> <20>÷<EFBFBD><C3B7>״<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ȴ<EFBFBD>.
// ü<><C3BC><EFBFBD>ԷµǴ<C2B5> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD≯<EFBFBD>ŭ <20>нú<D0BD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20>þ<C3BE><EEB3AD>.
// <20>̷<EFBFBD><CCB7><EFBFBD> <20>÷<EFBFBD><C3B7>׿<EFBFBD> <20>ð<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ü<><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( false == m_hProcessSkill->CheckChainingPassiveSkill() )
{
if( false == m_hProcessSkill->IsChainInputAction( GetCurrentAction() ) )
{
m_hProcessSkill->OnEnd( MAActorRenderBase::m_LocalTime, 0.0f );
m_hProcessSkill.Identity();
}
}
}
else if( IsEnabledAuraSkill() && m_hProcessSkill->IsAuraOn() )
{
// Note <20>ѱ<EFBFBD>: m_hProcessSkill <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD>ؾ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnPlayerActor::CmdStop() <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20>׼<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ó<><C3B3><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnActor::OnChangeAction <20>ʿ<EFBFBD><CABF><EFBFBD> ProcessAction <20><> Identity <20><>Ŵ.
m_hProcessSkill.Identity();
ClearSelfStateSignalBlowQueue(); // <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20>ڱ<EFBFBD> <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Ÿ<>̹<EFBFBD> <20>ñ׳ο<D7B3> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> ť <20>ʱ<EFBFBD>ȭ <20><>Ŵ. <20>ȱ׷<C8B1> <20>ٸ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
}
}
}
}
void CDnPlayerActor::OnChangeAction( const char* szPrevAction )
{
// 129<32><39> <20>׼<EFBFBD> <20≯<EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> Ȱ<><C8B0> <20><>Ȱ<EFBFBD><C8B0> ó<><C3B3>. /////////////////////////////////////////////////
if( m_pStateBlow->IsApplied( STATE_BLOW::BLOW_129 ) )
{
DNVector(DnBlowHandle) vlhChangeActionSetBlow;
m_pStateBlow->GetStateBlowFromBlowIndex( STATE_BLOW::BLOW_129, vlhChangeActionSetBlow );
// <20>׼<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
int iNumBlow = (int)vlhChangeActionSetBlow.size();
for( int i = 0; i < iNumBlow; ++i )
{
if( !vlhChangeActionSetBlow[i] )
continue;
CDnChangeActionSetBlow* pChangeActionSetBlow = static_cast<CDnChangeActionSetBlow*>( vlhChangeActionSetBlow.at(i).GetPointer() );
pChangeActionSetBlow->UpdateEnable( szPrevAction, GetCurrentAction() );
// <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// Ŭ<>󿡼<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>̹<EFBFBD> <20><>ȯ<EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
CDnChangeActionStrProcessor* pProcessor = pChangeActionSetBlow->GetChangeActionStrProcessor(); // <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> NULL <20><><EFBFBD>ϵ<EFBFBD>.
if( pProcessor && pProcessor->IsChangedActionName( GetCurrentAction() ) )
{
pChangeActionSetBlow->OnChangeAction();
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> ó<><C3B3><EFBFBD>Ǵ<EFBFBD> setaction <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pChangeActionSetBlow->OnNotChangeAction();
}
}
}
_CheckActionWithProcessPassiveActionSkill( szPrevAction );
//CDnActor::OnChangeAction( szPrevAction );
if( !( szPrevAction && m_nPrevActionIndex == m_nActionIndex ) ) {
if( CDnWorld::IsActive(GetRoom()) ) {
CDnWorld::GetInstance(GetRoom()).InsertTriggerEventStore( "ChangeActionPlayer", GetUniqueID() );
CDnWorld::GetInstance(GetRoom()).OnTriggerEventCallback( "CDnPlayerActor::OnChangeAction", CDnActionBase::m_LocalTime, 0.f );
}
}
m_bUseSignalSkillCheck = false;
ZeroMemory( m_abSignalSkillCheck, sizeof(m_abSignalSkillCheck) );
// mixed <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mixed <20>׼<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><><EFBFBD><EFBFBD>.
if( false == m_bUpdatedProjectileInfoFromCmdAction )
{
if( false == IsCustomAction() )
_UpdateMaxProjectileCount( m_nActionIndex );
}
else
m_bUpdatedProjectileInfoFromCmdAction = false; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnChangeAction() ȣ<><C8A3><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>־<EFBFBD><D6BE><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
// <20>׼<EFBFBD><D7BC><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><> üũ<C3BC>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_bCheckProjectileSignalTerm = true;
if( false == m_mapIcyFractionHitted.empty() )
m_mapIcyFractionHitted.clear();
// <20><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD>ʿ<EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD>. <20><>ī<EFBFBD><C4AB><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>찡..
boost::shared_ptr<IDnObserverNotifyEvent> pEvent( IDnObserverNotifyEvent::Create( EVENT_ONCHANGEACTION ) );
Notify( pEvent );
}
void CDnPlayerActor::OnBreakSkillSuperAmmor( int nIndex, int nOriginalSupperAmmor, int nDescreaseSupperAmmor )
{
if( nOriginalSupperAmmor >= 200 ) {
UpdateSuperAmmorBreak();
}
}
void CDnPlayerActor::OnAirCombo( int nComboCount )
{
if( nComboCount >= 2 ) {
UpdateAirCombo();
}
}
void CDnPlayerActor::PushSummonMonster( DnMonsterActorHandle hMonster, const SummonMonsterStruct* pSummonMonsterStruct, bool bReCreateFollowStageMonster/* = false*/ )
{
CDnActor::PushSummonMonster( hMonster, pSummonMonsterStruct, bReCreateFollowStageMonster );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><>ȯ<EFBFBD><C8AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (bReCreateFollowStageMonster)
// <20>ش<EFBFBD> <20>׷<EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>־<EFBFBD><D6BE>ش<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>ϸ鼭 CDnActor::bIsCanSummonMonster() <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
if( 0 < pSummonMonsterStruct->nGroupID )
{
m_mapSummonMonsterByGroup[ pSummonMonsterStruct->nGroupID ].push_back( hMonster );
hMonster->SetSummonGroupID( pSummonMonsterStruct->nGroupID );
}
if( bReCreateFollowStageMonster )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>󰡴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><>ü.
DWORD dwMonsterClassID = hMonster->GetMonsterClassID();
std::list<S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO>::iterator iter = m_listSummonedMonstersFollowStageInfos.begin();
for( iter; iter != m_listSummonedMonstersFollowStageInfos.end(); ++iter )
{
if( false == iter->bReCreatedFollowStageMonster &&
dwMonsterClassID == iter->dwMonsterClassID )
{
iter->hMonster = hMonster;
iter->hMonster->SetActionQueue( "Stand" ); // <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9> <20><><EFBFBD>ٷ<EFBFBD> stand <20>׼<EFBFBD>.
iter->hMonster->CmdWarp( *GetPosition(), EtVec3toVec2( *GetLookDir() ) );
iter->bReCreatedFollowStageMonster = true;
break;
}
}
}
else
{
// <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5>̳<EFBFBD> <20><> <20>̵<EFBFBD>(CmdWarp) <20><> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>󰡵<EFBFBD><F3B0A1B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯü<C8AF><C3BC>
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
if( pSummonMonsterStruct->bFollowSummonerStage )
{
S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO Info;
Info.hMonster = hMonster;
Info.dwMonsterClassID = hMonster->GetMonsterClassID();
#ifdef PRE_FIX_MEMOPT_SIGNALH
CopyShallow_SummonMonsterStruct(Info.SummonMonsterSignalData, pSummonMonsterStruct);
#else
Info.SummonMonsterSignalData = *pSummonMonsterStruct;
#endif
Info.iRemainDestroyTime = pSummonMonsterStruct->nLifeTime;
m_listSummonedMonstersFollowStageInfos.push_back( Info );
}
}
}
// <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><> <20>Ǿ<EFBFBD><C7BE>ų<EFBFBD> HP <20><> 0 <20><> <20>Ǿ<EFBFBD> <20>״<EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD>.
// <20><> <20>ΰ<EFBFBD><CEB0><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>󰡴<EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
void CDnPlayerActor::OnDieSummonedMonster( DnMonsterActorHandle hSummonedMonster )
{
std::list<S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO>::iterator iter = m_listSummonedMonstersFollowStageInfos.begin();
for( iter; iter != m_listSummonedMonstersFollowStageInfos.end(); ++iter )
{
if( hSummonedMonster == iter->hMonster )
{
m_listSummonedMonstersFollowStageInfos.erase( iter );
break;
}
}
int iGroupID = hSummonedMonster->GetSummonGroupID();
if( 0 < m_mapSummonMonsterByGroup.count( iGroupID ) )
{
list<DnMonsterActorHandle>& listSummonedMonsters = m_mapSummonMonsterByGroup[ iGroupID ];
list<DnMonsterActorHandle>::iterator iter = find( listSummonedMonsters.begin(), listSummonedMonsters.end(), hSummonedMonster );
if( listSummonedMonsters.end() != iter )
listSummonedMonsters.erase( iter );
// <20>ش<EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( listSummonedMonsters.empty() )
m_mapSummonMonsterByGroup.erase( iGroupID );
}
#if defined(PRE_ADD_65808)
if (hSummonedMonster)
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(hSummonedMonster.GetPointer());
if (pMonsterActor)
{
RemoveSummonMonsterGlyphStateEffects(pMonsterActor->GetMonsterClassID());
}
}
#endif // PRE_ADD_65808
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
// <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>̾Ƴ<CCBE><C6B3><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
void CDnPlayerActor::OnBeforeDestroyStageMonsters( void )
{
std::list<S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO>::iterator iter = m_listSummonedMonstersFollowStageInfos.begin();
for( iter; iter != m_listSummonedMonstersFollowStageInfos.end(); )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> invalid <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( iter->hMonster )
{
iter->iRemainDestroyTime = iter->hMonster->GetRemainDestroyTime();
iter->bReCreatedFollowStageMonster = false;
// TODO: <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƶ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾Ƶд<C6B5>.
++iter;
}
else
{
iter = m_listSummonedMonstersFollowStageInfos.erase( iter );
}
}
}
void CDnPlayerActor::OnInitializeNextStageFinished( void )
{
// <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20>͵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. STE_SummonMonster <20>ñ׳<C3B1> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
CDnGameTask *pTask = (CDnGameTask *)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
std::list<S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO>::iterator iter = m_listSummonedMonstersFollowStageInfos.begin();
for( iter; iter != m_listSummonedMonstersFollowStageInfos.end(); ++iter )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PushMonster() <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20>ٽ<EFBFBD> <20><>ȯ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
iter->SummonMonsterSignalData.nLifeTime = (int)iter->iRemainDestroyTime;
pTask->RequestSummonMonster( GetMySmartPtr(), &(iter->SummonMonsterSignalData), true );
}
#ifdef PRE_ADD_WEEKLYEVENT
RemoveEventStateBlow();
ApplyEventStateBlow();
#endif
#if defined( PRE_FIX_70618 )
if( IsAppliedThisStateBlow(STATE_BLOW::BLOW_078) )
CmdRemoveStateEffect(STATE_BLOW::BLOW_078);
#endif // #if defined( PRE_FIX_70618 )
}
bool CDnPlayerActor::_bIsMasterSystemDurabilityReward()
{
if( GetGameRoom() && GetGameRoom()->GetMasterRewardSystem() )
{
if( GetGameRoom()->GetMasterRewardSystem()->bIsDurabilityReward( m_pSession ) )
{
#if defined( _WORK )
WCHAR wszBuf[MAX_PATH];
wsprintf( wszBuf, L"[<5B><><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" );
m_pSession->SendDebugChat( wszBuf );
#endif // #if defined( _WORK )
return true;
}
}
return false;
}
void CDnPlayerActor::OnRepairEquipDurability( bool bDBSave, INT64 nPriceCoin )
{
bool bRefreshStatus = false;
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
for( int i=CDnParts::Helmet; i<=CDnParts::Ring2; i++ ) {
DnPartsHandle hParts = GetParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
if( hParts->IsInfinityDurability() ) continue;
if( hParts->GetDurability() == hParts->GetMaxDurability() ) continue;
int nTemp = hParts->GetMaxDurability();
hParts->SetDurability( nTemp );
bRefreshStatus = true;
m_pSession->GetItem()->SetEquipItemDurability( i, nTemp, true );
if (bDBSave && m_pSession->GetItem()->GetEquip(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(i)->wDur);
}
}
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = m_hWeapon[i];
if( !hWeapon ) continue;
if( hWeapon->IsInfinityDurability() ) continue;
if( hWeapon->GetDurability() == hWeapon->GetMaxDurability() ) continue;
int nTemp = hWeapon->GetMaxDurability();
hWeapon->SetDurability( nTemp );
bRefreshStatus = true;
m_pSession->GetItem()->SetEquipItemDurability( EQUIP_WEAPON1 + i, nTemp, true );
if (bDBSave && m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->wDur);
}
}
if( bRefreshStatus ) {
RefreshState( RefreshEquip, ST_All );
}
if (bDBSave)
{
INT64 biCurrentCoin = 0;
INT64 biPickUpCoin = 0;
if( nPriceCoin > 0 )
{
biCurrentCoin = m_pSession->GetCoin();
biPickUpCoin = m_pSession->GetPickUpCoin();
m_pSession->SelPickUpCoin(0);
}
m_pSession->GetDBConnection()->QueryModItemDurability(m_pSession, nPriceCoin, VecSerialList, VecDurList, biCurrentCoin, biPickUpCoin);
}
}
void CDnPlayerActor::OnDecreaseEquipDurability( int nValue, bool bDBSave )
{
if( _bIsMasterSystemDurabilityReward() )
return;
bool bRefreshStatus = false;
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
for( int i=CDnParts::Helmet; i<=CDnParts::Ring2; i++ ) {
DnPartsHandle hParts = GetParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
if( hParts->IsInfinityDurability() ) continue;
if( hParts->GetDurability() == 0 ) continue;
int nTemp = hParts->GetDurability() - nValue;
if( nTemp <= 0 ) {
nTemp = 0;
bRefreshStatus = true;
}
hParts->SetDurability( nTemp );
m_pSession->GetItem()->SetEquipItemDurability( i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetEquip(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(i)->wDur);
}
}
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = m_hWeapon[i];
if( !hWeapon ) continue;
if( hWeapon->IsInfinityDurability() ) continue;
if( hWeapon->GetDurability() == 0 ) continue;
int nTemp = hWeapon->GetDurability() - nValue;
if( nTemp <= 0 ) {
nTemp = 0;
bRefreshStatus = true;
}
hWeapon->SetDurability( nTemp );
m_pSession->GetItem()->SetEquipItemDurability( EQUIP_WEAPON1 + i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->wDur);
}
}
if( bRefreshStatus ) {
RefreshState( RefreshEquip, ST_All );
}
if (bDBSave)
m_pSession->GetDBConnection()->QueryModItemDurability(m_pSession, 0, VecSerialList, VecDurList);
}
void CDnPlayerActor::OnDecreaseEquipDurability( float fValue, bool bDBSave )
{
if( _bIsMasterSystemDurabilityReward() )
return;
bool bRefreshStatus = false;
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
float fTotalLevelValue = 0.0f;
if ( m_pRoom->bIsPvPRoom() == false && IsAppliedThisStateBlow(STATE_BLOW::BLOW_259))
{
DNVector(DnBlowHandle) vlBlows;
GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_259, vlBlows);
{
int nCount = (int)vlBlows.size();
for (int i = 0; i < nCount; ++i)
{
DnBlowHandle hBlow = vlBlows[i];
if (hBlow && hBlow->IsEnd() == false)
{
fTotalLevelValue += hBlow->GetFloatValue();
}
}
}
}
#endif
for( int i=CDnParts::Helmet; i<=CDnParts::Ring2; i++ ) {
DnPartsHandle hParts = GetParts( (CDnParts::PartsTypeEnum)i );
if( !hParts ) continue;
if( hParts->IsInfinityDurability() ) continue;
if( hParts->GetDurability() == 0 ) continue;
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
int nTemp = (int)( hParts->GetDurability() - (( hParts->GetMaxDurability() * fValue ) * (1 - fTotalLevelValue)) );
#else
int nTemp = (int)( hParts->GetDurability() - ( hParts->GetMaxDurability() * fValue ) );
#endif
if( nTemp <= 0 ) {
nTemp = 0;
bRefreshStatus = true;
}
hParts->SetDurability( nTemp );
m_pSession->GetItem()->SetEquipItemDurability( i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetEquip(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(i)->wDur);
}
}
for( int i=0; i<2; i++ ) {
DnWeaponHandle hWeapon = m_hWeapon[i];
if( !hWeapon ) continue;
if( hWeapon->IsInfinityDurability() ) continue;
if( hWeapon->GetDurability() == 0 ) continue;
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
int nTemp = (int)( hWeapon->GetDurability() - (( hWeapon->GetMaxDurability() * fValue ) * (1 - fTotalLevelValue)) );
#else
int nTemp = (int)( hWeapon->GetDurability() - ( hWeapon->GetMaxDurability() * fValue ) );
#endif
if( nTemp <= 0 ) {
nTemp = 0;
bRefreshStatus = true;
}
hWeapon->SetDurability( nTemp );
m_pSession->GetItem()->SetEquipItemDurability( EQUIP_WEAPON1 + i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)){
VecSerialList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetEquip(EQUIP_WEAPON1 + i)->wDur);
}
}
if( bRefreshStatus ) {
RefreshState( RefreshEquip, ST_All );
}
if (bDBSave)
m_pSession->GetDBConnection()->QueryModItemDurability(m_pSession, 0, VecSerialList, VecDurList);
}
void CDnPlayerActor::OnDecreaseInvenDurability( int nValue, bool bDBSave )
{
if( _bIsMasterSystemDurabilityReward() )
return;
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
for( int i=0; i<INVENTORYMAX; i++ ) {
const TItem *pItem = m_pSession->GetItem()->GetInventory(i);
if( !pItem ) continue;
switch( g_pDataManager->GetItemMainType( pItem->nItemID ) ) {
case ITEMTYPE_WEAPON:
{
CDnWeapon *pWeapon = static_cast<CDnWeapon*>(m_pPartyData->pInventory[i]);
if( !pWeapon ) continue;
if( pWeapon->IsInfinityDurability() ) continue;
if( pWeapon->GetDurability() == 0 ) continue;
int nTemp = pWeapon->GetDurability() - nValue;
if( nTemp <= 0 ) nTemp = 0;
pWeapon->SetDurability( nTemp );
m_pSession->GetItem()->SetInvenItemDurability( i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetInventory(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetInventory(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetInventory(i)->wDur);
}
}
break;
case ITEMTYPE_PARTS:
{
CDnParts *pParts = static_cast<CDnParts*>(m_pPartyData->pInventory[i]);
if( pParts->IsInfinityDurability() ) continue;
if( pParts->GetDurability() == 0 ) continue;
int nTemp = pParts->GetDurability() - nValue;
if( nTemp <= 0 ) nTemp = 0;
pParts->SetDurability( nTemp );
m_pSession->GetItem()->SetInvenItemDurability( i, nTemp );
if (bDBSave && m_pSession->GetItem()->GetInventory(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetInventory(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetInventory(i)->wDur);
}
}
break;
default:
continue;
}
}
if (bDBSave)
m_pSession->GetDBConnection()->QueryModItemDurability(m_pSession, 0, VecSerialList, VecDurList);
}
void CDnPlayerActor::OnDecreaseInvenDurability( float fValue, bool bDBSave )
{
if( _bIsMasterSystemDurabilityReward() )
return;
std::vector<INT64> VecSerialList;
std::vector<USHORT> VecDurList;
VecSerialList.clear();
VecDurList.clear();
for( int i=0; i<INVENTORYMAX; i++ ) {
const TItem *pItem = m_pSession->GetItem()->GetInventory(i);
if( !pItem ) continue;
switch( g_pDataManager->GetItemMainType( pItem->nItemID ) ) {
case ITEMTYPE_WEAPON:
{
CDnWeapon *pWeapon = static_cast<CDnWeapon*>(m_pPartyData->pInventory[i]);
if( !pWeapon ) continue;
if( pWeapon->IsInfinityDurability() ) continue;
if( pWeapon->GetDurability() == 0 ) continue;
int nTemp = (int)( pWeapon->GetDurability() - ( pWeapon->GetMaxDurability() * fValue ) );
if( nTemp <= 0 ) nTemp = 0;
pWeapon->SetDurability( nTemp );
m_pSession->GetItem()->SetInvenItemDurability( i, nTemp );
if (m_pSession->GetItem()->GetInventory(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetInventory(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetInventory(i)->wDur);
}
}
break;
case ITEMTYPE_PARTS:
{
CDnParts *pParts = static_cast<CDnParts*>(m_pPartyData->pInventory[i]);
if( !pParts ) continue;
if( pParts->IsInfinityDurability() ) continue;
if( pParts->GetDurability() == 0 ) continue;
int nTemp = (int)( pParts->GetDurability() - ( pParts->GetMaxDurability() * fValue ) );
if( nTemp <= 0 ) nTemp = 0;
pParts->SetDurability( nTemp );
m_pSession->GetItem()->SetInvenItemDurability( i, nTemp );
if (m_pSession->GetItem()->GetInventory(i)){
VecSerialList.push_back(m_pSession->GetItem()->GetInventory(i)->nSerial);
VecDurList.push_back(m_pSession->GetItem()->GetInventory(i)->wDur);
}
}
break;
default:
continue;
}
}
m_pSession->GetDBConnection()->QueryModItemDurability(m_pSession, 0, VecSerialList, VecDurList);
}
bool CDnPlayerActor::IsPenaltyStageGiveUp()
{
if (!m_pRoom) return false;
switch( m_pRoom->GetGameTaskType() ) {
case GameTaskType::PvP: return false;
case GameTaskType::DarkLair: return false;
case GameTaskType::Farm: return false;
default: break;
}
if (IsDie())
return false;
if (CDnWorld::IsActive(GetRoom()))
{
EWorldEnum::MapTypeEnum mapType = CDnWorld::GetInstance(GetRoom()).GetMapType();
if (mapType == EWorldEnum::MapTypeDungeon)
{
CDnGameTask *pTask = (CDnGameTask *)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
if (pTask->GetDungeonClearState() == CDnGameTask::DCS_WarpStandBy)
return false;
}
else
{
return false;
}
}
return true;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ұ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> return true; <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> return false;
bool CDnPlayerActor::OnStageGiveUp()
{
if (IsPenaltyStageGiveUp() == false)
return false;
DNTableFileFormat *pDungeonSox = GetDNTable( CDnTableDB::TDUNGEONENTER );
if( pDungeonSox->GetFieldFromLablePtr( GetGameRoom()->GetGameTask()->GetDungeonEnterTableID(), "_StageOutDurability" )->GetInteger() == 0)
return false;
OnDecreaseEquipDurability( CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::StageGiveupDurabilityPenalty ), true );
OnDecreaseInvenDurability( CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::StageGiveupDurabilityPenalty ), true );
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> Equip <20>̾<EFBFBD> <20>˾Ƽ<CBBE> <20><><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20>׷<EFBFBD><D7B7><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD> <20>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.
if( m_pSession ) {
float fRatio = CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::StageGiveupDurabilityPenalty );
m_pSession->SendDecreaseDurabilityInventory( 1, (void*)&fRatio );
}
return true;
}
void CDnPlayerActor::RecvPartyRefreshGateInfo( const EtVector3& Pos )
{
SetPosition( Pos );
SetStaticPosition( Pos );
}
bool CDnPlayerActor::AttachParts( DnPartsHandle hParts, CDnParts::PartsTypeEnum Index, bool bDelete )
{
if( !hParts )
return false;
bool bResult = MAPartsBody::AttachParts( hParts, Index, bDelete );
#if defined(_GAMESERVER)
int nSkillID = -1;
int nSkillLevel = 0;
if (hParts->HasPrefixSkill(nSkillID, nSkillLevel))
{
DnSkillHandle hSkill = CDnSkill::CreateSkill(GetMySmartPtr(), nSkillID, nSkillLevel);
if (!hSkill)
{
OutputDebug("%s ==> SkillID %d, SkillLevel %d... CreateSkill Failed!!!!\n", __FUNCTION__, nSkillID, nSkillLevel);
}
else
{
#if defined(PRE_ADD_PREFIXSKILL_PVP)
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> pve/pvp <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iSkillLevelDataType = CDnSkill::PVE;
if( GetGameRoom()->bIsPvPRoom() )
iSkillLevelDataType = CDnSkill::PVP;
hSkill->SelectLevelDataType( iSkillLevelDataType );
#endif // PRE_ADD_PREFIXSKILL_PVP
if (!MASkillUser::AddPreFixSystemDefenceSkill(Index, hSkill))
{
SAFE_RELEASE_SPTR(hSkill);
OutputDebug("MASkillUser::AddPreFixSystemDeffenceSkill ===> slotIndex %d, ItemID %d, SkillID %d, SkillLevel %d AddPreFixSystem Deffence skill Failed !!!\n",
Index, hParts->GetClassID(), nSkillID, nSkillLevel);
}
}
}
#endif // _GAMESERVER
int nLevelUpSkillID = -1;
int nLevelUpSkillLevelValue = 0;
int nLevelUpItemSkillUsingType = 0;
if (hParts->HasLevelUpInfo(nLevelUpSkillID, nLevelUpSkillLevelValue, nLevelUpItemSkillUsingType))
{
if (CDnItem::ItemSkillApplyType::SkillLevelUp == nLevelUpItemSkillUsingType)
AddSkillLevelUpInfo(Index, nLevelUpSkillID, nLevelUpSkillLevelValue);
}
return bResult;
}
bool CDnPlayerActor::DetachParts( CDnParts::PartsTypeEnum Index )
{
#if defined(_GAMESERVER)
MASkillUser::RemovePreFixSystemDefenceSkill(Index);
#endif // _GAMESERVER
RemoveSkillLevelUpInfo(Index);
// Note: <20><><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
bool bResult = MAPartsBody::DetachParts( Index );
return bResult;
}
bool CDnPlayerActor::AttachCashParts( DnPartsHandle hParts, CDnParts::PartsTypeEnum Index, bool bDelete )
{
if( !hParts ) return false;
bool bResult = MAPartsBody::AttachCashParts( hParts, Index, bDelete );
int nLevelUpSkillID = -1;
int nLevelUpSkillLevelValue = 0;
int nLevelUpItemSkillUsingType = 0;
if (hParts->HasLevelUpInfo(nLevelUpSkillID, nLevelUpSkillLevelValue, nLevelUpItemSkillUsingType))
{
if (CDnItem::ItemSkillApplyType::SkillLevelUp == nLevelUpItemSkillUsingType)
AddSkillLevelUpInfoByCashItem(Index, nLevelUpSkillID, nLevelUpSkillLevelValue);
}
return bResult;
}
bool CDnPlayerActor::DetachCashParts( CDnParts::PartsTypeEnum Index )
{
RemoveSkillLevelUpInfoByCashItem(Index);
// Note: <20><><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
bool bResult = MAPartsBody::DetachCashParts( Index );
return bResult;
}
void CDnPlayerActor::ReplacementGlyph( DnSkillHandle hNewSkill )
{
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.ext failed\r\n");
return;
}
int iSkillID = hNewSkill->GetClassID();
for( int itr = 0; itr < CDnGlyph::GlyphSlotEnum_Amount; ++itr )
{
if( m_hGlyph[itr] )
{
int eType = pSox->GetFieldFromLablePtr( m_hGlyph[itr]->GetClassID(), "_GlyphType" )->GetInteger();
int iGlyphSkillID = pSox->GetFieldFromLablePtr( m_hGlyph[itr]->GetClassID(), "_SkillID" )->GetInteger();
if( CDnGlyph::PassiveSkill == eType && iSkillID == iGlyphSkillID )
hNewSkill->AddGlyphStateEffect( m_hGlyph[itr]->GetClassID() );
}
}
}
bool CDnPlayerActor::AttachGlyph( DnGlyphHandle hGlyph, CDnGlyph::GlyphSlotEnum Index, bool bDelete /* = false */ )
{
if( !MAPlateUser::AttachGlyph( hGlyph, Index, bDelete ) )
return false;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.ext failed\r\n");
return false;
}
int eType = pSox->GetFieldFromLablePtr( hGlyph->GetClassID(), "_GlyphType" )->GetInteger();
// <20><><EFBFBD><20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ųȿ<C5B3><C8BF><EFBFBD>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˾<EFBFBD> <20><><EFBFBD><EFBFBD>.
if( CDnItem::TemperedSkill == eType )
{
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.ext failed\r\n");
return false;
}
int nSkillID = pSox->GetFieldFromLablePtr( hGlyph->GetClassID(), "_SkillID" )->GetInteger();
DnSkillHandle hSkill = FindSkill( nSkillID );
if( !hSkill ) return false;
//CDnSkill<6C><6C> SkillEffect<63><74> <20>߰<EFBFBD><DFB0>ؾ<EFBFBD><D8BE><EFBFBD>
hSkill->AddGlyphStateEffect( hGlyph->GetClassID() );
}
else if( CDnItem::AddSKill == eType && 0 != hGlyph->GetSkillID() && 0 != hGlyph->GetSkillLevel() )
{
AddSkill( hGlyph->GetSkillID(), hGlyph->GetSkillLevel() );
DnSkillHandle hSkill = FindSkill( hGlyph->GetSkillID() );
if( !hSkill ) return false;
hSkill->AsEquipItemSkill();
hSkill->SetEquipIndex( Index );
m_ahEquipSkill = hSkill;
if( 0.0f != m_afLastEquipItemSkillDelayTime )
{
hSkill->SetOnceCoolTime( m_afLastEquipItemSkillDelayTime, m_afLastEquipItemSkillRemainTime );
}
}
return true;
}
bool CDnPlayerActor::DetachGlyph( CDnGlyph::GlyphSlotEnum Index )
{
DnGlyphHandle hGlyph = m_hGlyph[Index];
if( !hGlyph ) return false;
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TGLYPHSKILL );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlyphSkillTable.ext failed\r\n");
return false;
}
int eType = pSox->GetFieldFromLablePtr( hGlyph->GetClassID(), "_GlyphType")->GetInteger();
if( CDnItem::TemperedSkill == eType )
{
int nSkillID = pSox->GetFieldFromLablePtr( hGlyph->GetClassID(), "_SkillID")->GetInteger();
DnSkillHandle hSkill = FindSkill( nSkillID );
if( !hSkill ) return false;
hSkill->DelGlyphStateEffect( hGlyph->GetClassID() );
}
else if( CDnItem::AddSKill == eType && 0 != hGlyph->GetSkillID() && 0 != hGlyph->GetSkillLevel() )
{
DnSkillHandle hSkill = FindSkill( hGlyph->GetSkillID() );
m_afLastEquipItemSkillDelayTime = hSkill->GetDelayTime();
m_afLastEquipItemSkillRemainTime = hSkill->GetElapsedDelayTime();
RemoveSkill( hGlyph->GetSkillID() );
}
return true;
}
void CDnPlayerActor::AttachWeapon( DnWeaponHandle hWeapon, int nEquipIndex /*= 0*/, bool bDelete/* = false */)
{
CDnActor::AttachWeapon( hWeapon, nEquipIndex, bDelete );
#if defined(PRE_ADD_50907)
if (IsSkipOnAttatchDetachWeapon() == true)
return;
#endif // PRE_ADD_50907
RefreshWeaponViewOrder( nEquipIndex );
if( m_hCashWeapon[nEquipIndex] ) {
m_hCashWeapon[nEquipIndex]->RecreateCashWeapon( GetMySmartPtr(), nEquipIndex );
LinkCashWeapon( nEquipIndex );
}
#if defined(_GAMESERVER)
int nSkillID = -1;
int nSkillLevel = 0;
if (hWeapon->HasPrefixSkill(nSkillID, nSkillLevel))
{
DnSkillHandle hSkill = CDnSkill::CreateSkill(GetMySmartPtr(), nSkillID, nSkillLevel);
if (!hSkill)
{
OutputDebug("%s ==> SkillID %d, SkillLevel %d... CreateSkill Failed!!!!\n", __FUNCTION__, nSkillID, nSkillLevel);
}
else
{
#if defined(PRE_ADD_PREFIXSKILL_PVP)
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> pve/pvp <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iSkillLevelDataType = CDnSkill::PVE;
if( GetGameRoom()->bIsPvPRoom() )
iSkillLevelDataType = CDnSkill::PVP;
hSkill->SelectLevelDataType( iSkillLevelDataType );
#endif // PRE_ADD_PREFIXSKILL_PVP
if (!MASkillUser::AddPreFixSystemOffenceSkill(nEquipIndex, hSkill))
{
SAFE_RELEASE_SPTR(hSkill);
OutputDebug("MASkillUser::AddPreFixSystemOffenceSkill ===> slotIndex %d, ItemID %d, SkillID %d, SkillLevel %d AddPreFixSystem Deffence skill Failed !!!\n",
nEquipIndex, hWeapon->GetClassID(), nSkillID, nSkillLevel);
}
}
}
#endif // _GAMESERVER
int nLevelUpSkillID = -1;
int nLevelUpSkillLevelValue = 0;
int nLevelUpItemSkillUsingType = 0;
if (hWeapon->HasLevelUpInfo(nLevelUpSkillID, nLevelUpSkillLevelValue, nLevelUpItemSkillUsingType))
{
if (CDnItem::ItemSkillApplyType::SkillLevelUp == nLevelUpItemSkillUsingType)
AddSkillLevelUpInfo(CDnParts::PartsTypeEnum::PartsTypeEnum_Amount+nEquipIndex, nLevelUpSkillID, nLevelUpSkillLevelValue);
}
}
void CDnPlayerActor::DetachWeapon( int nEquipIndex/* = 0*/ )
{
CDnActor::DetachWeapon( nEquipIndex );
#if defined(PRE_ADD_50907)
if (IsSkipOnAttatchDetachWeapon() == true)
return;
#endif // PRE_ADD_50907
RefreshWeaponViewOrder( nEquipIndex );
#if defined(_GAMESERVER)
MASkillUser::RemovePreFixSystemOffenceSkill(nEquipIndex);
#endif // _GAMESERVER
RemoveSkillLevelUpInfo(CDnParts::PartsTypeEnum::PartsTypeEnum_Amount+nEquipIndex);
}
void CDnPlayerActor::AttachCashWeapon( DnWeaponHandle hWeapon, int nEquipIndex, bool bDelete )
{
if( m_hCashWeapon[nEquipIndex] ) {
DetachCashWeapon( nEquipIndex );
}
m_hCashWeapon[nEquipIndex] = hWeapon;
m_bCashSelfDeleteWeapon[nEquipIndex] = bDelete;
if( !m_hCashWeapon[nEquipIndex] ) return;
m_hCashWeapon[nEquipIndex]->CreateObject();
RefreshWeaponViewOrder( nEquipIndex );
m_hCashWeapon[nEquipIndex]->RecreateCashWeapon( GetMySmartPtr(), nEquipIndex );
LinkCashWeapon( nEquipIndex );
int nLevelUpSkillID = -1;
int nLevelUpSkillLevelValue = 0;
int nLevelUpItemSkillUsingType = 0;
if (hWeapon->HasLevelUpInfo(nLevelUpSkillID, nLevelUpSkillLevelValue, nLevelUpItemSkillUsingType))
{
if (CDnItem::ItemSkillApplyType::SkillLevelUp == nLevelUpItemSkillUsingType)
AddSkillLevelUpInfoByCashItem(CASHEQUIP_WEAPON1+nEquipIndex, nLevelUpSkillID, nLevelUpSkillLevelValue);
}
}
void CDnPlayerActor::LinkCashWeapon( int nEquipIndex )
{
switch( m_hCashWeapon[nEquipIndex]->GetEquipType() ) {
case CDnWeapon::Sword:
case CDnWeapon::Axe:
case CDnWeapon::Hammer:
case CDnWeapon::SmallBow:
case CDnWeapon::BigBow:
case CDnWeapon::CrossBow:
case CDnWeapon::Staff:
case CDnWeapon::Book:
case CDnWeapon::Orb:
case CDnWeapon::Puppet:
case CDnWeapon::Mace:
case CDnWeapon::Flail:
case CDnWeapon::Wand:
case CDnWeapon::Shield:
case CDnWeapon::Gauntlet:
m_hCashWeapon[nEquipIndex]->LinkWeapon( GetMySmartPtr(), nEquipIndex );
break;
case CDnWeapon::Arrow:
m_hCashWeapon[nEquipIndex]->LinkWeapon( GetMySmartPtr(), m_hCashWeapon[0] );
break;
}
}
void CDnPlayerActor::DetachCashWeapon( int nEquipIndex )
{
if( !m_hCashWeapon[nEquipIndex] ) return;
m_hCashWeapon[nEquipIndex]->FreeObject();
m_hCashWeapon[nEquipIndex]->UnlinkWeapon();
if( m_bCashSelfDeleteWeapon[nEquipIndex] ) {
SAFE_RELEASE_SPTR( m_hCashWeapon[nEquipIndex] );
m_bCashSelfDeleteWeapon[nEquipIndex] = false;
}
m_hCashWeapon[nEquipIndex].Identity();
RefreshWeaponViewOrder( nEquipIndex );
RemoveSkillLevelUpInfoByCashItem(CASHEQUIP_WEAPON1+nEquipIndex);
}
void CDnPlayerActor::ShowCashWeapon( int nEquipIndex, bool bShow )
{
if( m_hCashWeapon[nEquipIndex] )
m_hCashWeapon[nEquipIndex]->ShowWeapon( bShow );
}
void CDnPlayerActor::SetWeaponViewOrder( int nEquipIndex, bool bShowCash )
{
if( nEquipIndex < 0 || nEquipIndex >= 2 ) return;
m_bWeaponViewOrder[nEquipIndex] = bShowCash;
}
void CDnPlayerActor::RefreshWeaponViewOrder( int nEquipIndex )
{
if( nEquipIndex < 0 || nEquipIndex >= 2 ) return;
if( m_hWeapon[nEquipIndex] && m_hCashWeapon[nEquipIndex] ) {
if( m_bWeaponViewOrder[nEquipIndex] ) {
if( !m_hCashWeapon[nEquipIndex]->IsCreateObject() ) {
m_hCashWeapon[nEquipIndex]->CreateObject();
m_hCashWeapon[nEquipIndex]->RecreateCashWeapon( GetMySmartPtr(), nEquipIndex );
LinkCashWeapon( nEquipIndex );
m_hCashWeapon[nEquipIndex]->ShowWeapon( true );
}
if( m_hWeapon[nEquipIndex]->IsCreateObject() ) {
m_hWeapon[nEquipIndex]->FreeObject();
m_hWeapon[nEquipIndex]->ShowWeapon( false );
}
}
else {
if( !m_hWeapon[nEquipIndex]->IsCreateObject() ) {
m_hWeapon[nEquipIndex]->CreateObject();
LinkWeapon( nEquipIndex );
m_hWeapon[nEquipIndex]->ShowWeapon( true );
}
if( m_hCashWeapon[nEquipIndex]->IsCreateObject() ) {
m_hCashWeapon[nEquipIndex]->FreeObject();
m_hCashWeapon[nEquipIndex]->ShowWeapon( false );
}
}
}
else if( m_hWeapon[nEquipIndex] && !m_hCashWeapon[nEquipIndex] ) {
if( !m_hWeapon[nEquipIndex]->IsCreateObject() ) {
m_hWeapon[nEquipIndex]->CreateObject();
LinkWeapon( nEquipIndex );
m_hWeapon[nEquipIndex]->ShowWeapon( true );
}
}
else {
if( nEquipIndex == 0 ) {
if( m_hCashWeapon[nEquipIndex] && m_hCashWeapon[nEquipIndex]->IsCreateObject() ) {
m_hCashWeapon[nEquipIndex]->FreeObject();
m_hCashWeapon[nEquipIndex]->ShowWeapon( false );
}
}
}
SetBattleMode( IsBattleMode() );
}
void CDnPlayerActor::OnEventCP( CPTypeEnum Type, int nResult )
{
#if defined( PRE_ADD_CP_RENEWAL )
MACP_Renewal::OnEventCP( Type, nResult );
#else // #if defined( PRE_ADD_CP_RENEWAL )
MACP::OnEventCP( Type, nResult );
#endif // #if defined( PRE_ADD_CP_RENEWAL )
switch( Type ) {
case MACP::MaxComboCount:
case MACP::KillBossCount:
case MACP::SuperAmmorBreakScore:
case MACP::GenocideScore:
case MACP::AirComboScore:
case MACP::RebirthPlayerScore:
case MACP::ComboScore:
case MACP::PartyComboScore:
case MACP::AssistMonsterScore:
{
BYTE pBuffer[32];
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &Type, sizeof(int), CPacketCompressStream::INTEGER_CHAR );
Stream.Write( &nResult, sizeof(int) );
Send( eActor::SC_CP, &Stream );
}
break;
}
}
void CDnPlayerActor::UpdateAttackedCPPoint( CDnDamageBase *pHitter , CDnWeapon::HitTypeEnum eHitType )
{
bool bIsSameTeam = false;
if( pHitter && pHitter->GetActorHandle() )
{
if( GetTeam() == pHitter->GetActorHandle()->GetTeam() )
{
bIsSameTeam = true;
}
}
if( bIsSameTeam == false )
{
switch( eHitType )
{
case CDnWeapon::Normal:
case CDnWeapon::CriticalRes:
{
UpdateAttackedHit();
}
break;
case CDnWeapon::Critical:
{
UpdateAttackedCriticalHit();
}
break;
case CDnWeapon::Stun:
{
UpdateAttackedStunHit();
}
break;
}
}
}
DnWeaponHandle CDnPlayerActor::GetActiveWeapon( int nEquipIndex )
{
if( m_bWeaponViewOrder[nEquipIndex] && m_hCashWeapon[nEquipIndex] ) return m_hCashWeapon[nEquipIndex];
return CDnActor::GetActiveWeapon( nEquipIndex );
}
float CDnPlayerActor::PreCalcDamage( CDnDamageBase *pHitter, SHitParam &HitParam, const float fDefenseRate, float fStateEffectAttackM )
{
float fResult = CDnActor::PreCalcDamage( pHitter, HitParam, fDefenseRate, fStateEffectAttackM );
return fResult;
}
bool CDnPlayerActor::IsDie()
{
bool bResult = CDnPlayerState::IsDie();
if( bResult ) return true;
// PvP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> return true <20><> <20>ʿ䰡 <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
if( IsGMTrace() && GetGameRoom() && !GetGameRoom()->bIsPvPRoom() )
return true;
return false;
}
bool CDnPlayerActor::SetActionQueue( const char *szActionName, int nLoopCount, float fBlendFrame , float fStartFrame , bool bCheck , bool bCheckStateEffect )
{
if(m_bShootMode && !m_bTransformMode && m_bBattleMode)
szActionName = GetChangeShootActionName(szActionName);
#if defined(PRE_FIX_63219)
//#63219
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¿<EFBFBD> <20>̵<EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MAWalkMovement<6E><74><EFBFBD><EFBFBD> OnStop<6F><70> ȣ<><C8A3> <20>ǰ<EFBFBD>
//<2F>̶<EFBFBD> CmdStop<6F><70><EFBFBD><EFBFBD> "Stand"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> block <20>ߵ<EFBFBD> <20>ǰ<EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű <20><><EFBFBD><EFBFBD> <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand<6E><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><>.
//<2F>ϴ<EFBFBD> Block<63><6B><EFBFBD>ۿ<EFBFBD> Stand<6E><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((strstr(m_szAction.c_str(), "Block") != NULL ||
strstr(m_szActionQueue.c_str(), "Block") != NULL)&&
strstr(szActionName, "Stand") != NULL)
{
//#68376 <20><><EFBFBD>Ľ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD>
//Skill_StandOfFaith_EX_Block <20>̷<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD> Stand<6E>δ<EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>Ѵ<EFBFBD>...
//<2F>ٸ<EFBFBD> Block<63><6B> <20><><EFBFBD><EFBFBD> <20><> <20>־ "StandOfFaith"<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>.
bool isSkillAction = (strstr(m_szAction.c_str(), "StandOfFaith") != NULL || strstr(m_szActionQueue.c_str(), "StandOfFaith"));
if (isSkillAction == false)
return false;
}
#endif // PRE_FIX_63219
return CDnActor::SetActionQueue( szActionName , nLoopCount, fBlendFrame, fStartFrame, bCheck, bCheckStateEffect );
}
void CDnPlayerActor::_UpdateMaxProjectileCount( int nActionIndex, bool bUpdateReservedCount/* = false*/ )
{
if( NULL == m_pProjectileCountInfo )
return;
// <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20>ִ<EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD>.
m_iNowMaxProjectileCount = 0;
map<int, int>::const_iterator iterProj = m_pProjectileCountInfo->mapMaxProjectileCountInAction.find( nActionIndex );
if( m_pProjectileCountInfo->mapMaxProjectileCountInAction.end() != iterProj )
m_iNowMaxProjectileCount = iterProj->second;
// <20>߻<EFBFBD>ü <20>ñ׳<C3B1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20>ñ׳ΰ<D7B3> <20><><EFBFBD><EFBFBD> SendAction <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴٸ<CAB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> <20>ʾƼ<CABE> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20>ǹǷ<C7B9>
// <20><><EFBFBD><20>ѹ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
m_setWeaponIDUsingProjectileSignal.clear();
map<int, multiset<int> >::const_iterator iterWeaponIDs = m_pProjectileCountInfo->mapUsingProjectileWeaponTableIDs.find( nActionIndex );
if( m_pProjectileCountInfo->mapUsingProjectileWeaponTableIDs.end() != iterWeaponIDs )
m_setWeaponIDUsingProjectileSignal = iterWeaponIDs->second;
// <20><><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20>ñ׳ΰ<D7B3> <20><><EFBFBD><EFBFBD> SendAction <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴٸ<CAB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> <20>ʾƼ<CABE> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20>ǹǷ<C7B9>
// <20><><EFBFBD><20>ѹ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
m_dqProjectileSignalOffset.clear();
map<int, deque<int> >::const_iterator iterProjOffset = m_pProjectileCountInfo->mapProjectileSignalFrameOffset.find( nActionIndex );
if( m_pProjectileCountInfo->mapProjectileSignalFrameOffset.end() != iterProjOffset )
m_dqProjectileSignalOffset = iterProjOffset->second;
sort( m_dqProjectileSignalOffset.begin(), m_dqProjectileSignalOffset.end() );
map<int, vector<CDnActionSpecificInfo::S_WEAPONACTION_INFO> >::const_iterator iterWeapon = m_pProjectileCountInfo->mapSendActionWeapon.find( nActionIndex );
if( m_pProjectileCountInfo->mapSendActionWeapon.end() != iterWeapon )
{
const vector<CDnActionSpecificInfo::S_WEAPONACTION_INFO>& vlWeaponInfo = iterWeapon->second;
for( int i = 0; i < (int)vlWeaponInfo.size(); ++i )
{
const CDnActionSpecificInfo::S_WEAPONACTION_INFO& Struct = vlWeaponInfo.at( i );
// <20>׳<EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> TDnPlayer~~::GetActiveWeapon() <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><>üũ<C3BC><C5A9> <20>ɷ<EFBFBD><C9B7><EFBFBD> CDnPlayerActor::GetActiveWeapon() <20><> ȣ<><C8A3> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>.
DnWeaponHandle hWeapon = CDnPlayerActor::GetActiveWeapon( Struct.iWeaponIndex );
if( hWeapon )
{
if( false == Struct.strActionName.empty() )
{
// <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼ǿ<D7BC><C7BF><EFBFBD> <20><> <20><> <20>ִ<EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if( hWeapon->IsExistAction( Struct.strActionName.c_str() ) )
{
hWeapon->SetActionQueue( Struct.strActionName.c_str() );
if( m_ActorType <= Reserved6 )
{
int nWeaponActionIndex = hWeapon->GetElementIndex( Struct.strActionName.c_str() );
int nAddCount = hWeapon->GetMaxProjectileCountInAction( nWeaponActionIndex );
if( false == bUpdateReservedCount )
m_iNowMaxProjectileCount += nAddCount;
else
m_iReservedProjectileCount += nAddCount;
// <20><><EFBFBD><EFBFBD><E2BFA1> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
hWeapon->AddUsingProjectileWeaponTableIDs( nWeaponActionIndex, m_setWeaponIDUsingProjectileSignal );
// <20><><EFBFBD><EFBFBD><E2BFA1> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2BFA1> shoot <20>׼<EFBFBD><D7BC><EFBFBD> <20>϶<EFBFBD><CFB6><EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><> <20><> üũ <20><>ƾ<EFBFBD><C6BE> <20>ɸ<EFBFBD> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD> <20>׷<EFBFBD> <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>н<EFBFBD>.
hWeapon->AddProjectileSignalOffset( nWeaponActionIndex, Struct.iFrame, m_dqProjectileSignalOffset );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ķ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>մϴ<D5B4>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִٰ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
sort( m_dqProjectileSignalOffset.begin(), m_dqProjectileSignalOffset.end() );
}
}
}
}
}
}
}
bool CDnPlayerActor::UseAndCheckAvailProjectileCount( void )
{
if( m_iNowMaxProjectileCount <= 0 )
{
// <20>߻<EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
if( m_iReservedProjectileCount <= 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
OutputDebug( "CS_PROJECTILE: <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20>߻<EFBFBD>ü <20><>û. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵܵ<C7B4>.\n" );
return false;
}
--m_iReservedProjectileCount;
}
if( 0 < m_iNowMaxProjectileCount )
--m_iNowMaxProjectileCount;
return true;
}
bool CDnPlayerActor::IsExclusiveSkill( int iSkillID, int iExclusiveID )
{
#ifndef PRE_FIX_SKILLLIST
// <20><><EFBFBD><EFBFBD> <20><>ų <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> id <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true.
int iNumSkill = (int)m_vlhSkillList.size();
for( int iSkill = 0; iSkill < iNumSkill; ++iSkill )
{
DnSkillHandle hSkill = m_vlhSkillList.at( iSkill );
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>.
if( hSkill->GetClassID() == iSkillID )
continue;
if( 0 == hSkill->GetExclusiveID() )
continue;
if( iExclusiveID == hSkill->GetExclusiveID() )
{
return true;
}
}
#else
// <20><><EFBFBD><EFBFBD> <20><>ų <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> id <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true.
DWORD dwNumSkill = GetSkillCount();
for( DWORD i = 0; i < dwNumSkill; ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>.
if( hSkill->GetClassID() == iSkillID )
continue;
if( 0 == hSkill->GetExclusiveID() )
continue;
if( iExclusiveID == hSkill->GetExclusiveID() )
{
return true;
}
}
#endif // #ifndef PRE_FIX_SKILLLIST
return false;
}
int CDnPlayerActor::GetAvailSkillPointByJob( int iSkillID )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int iJobDegree = g_pDataManager->GetJobNumber( GetJobClassID() );
int iWholeSP = GetLevelUpSkillPoint( 1, GetLevel() );
int iWholeAvailSPByJob = int(iWholeSP * m_pSession->GetAvailSkillPointRatioByJob( iSkillID ));
// <20><>ų<EFBFBD><C5B3> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iUsedSPByJob = 0;
const TSkillData* pSkillDataForNeedJobID = g_pDataManager->GetSkillData( iSkillID );
#ifndef PRE_FIX_SKILLLIST
for( int i = 0; i < (int)m_vlhSkillList.size(); ++i )
{
DnSkillHandle hSkill = m_vlhSkillList.at( i );
#else
DWORD dwNumSkill = GetSkillCount();
for( DWORD i = 0; i < dwNumSkill; ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
#endif // #ifndef PRE_FIX_SKILLLIST
if( hSkill->GetNeedJobClassID() == pSkillDataForNeedJobID->nNeedJobID )
{
int iLevel = hSkill->GetLevel();
for( int k = 0; k < iLevel; ++k )
{
const TSkillData* pSkillData = g_pDataManager->GetSkillData( hSkill->GetClassID() );
iUsedSPByJob += pSkillData->vLevelDataList.at( k ).nNeedSkillPoint;
}
}
}
// <20><>ü <20><><EFBFBD><EFBFBD><EBB0A1> SP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SP <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EBB0A1> SP <20><> <20><>¥<EFBFBD>̹Ƿ<CCB9> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>.
int iAvailPoint = iWholeAvailSPByJob - iUsedSPByJob;
if( m_pSession->GetSkillPoint() < iAvailPoint )
iAvailPoint = m_pSession->GetSkillPoint();
return iAvailPoint;
}
int CDnPlayerActor::GetUsedSkillPointInThisJob( const int nJobID )
{
int iUsedSPByJob = 0;
#ifndef PRE_FIX_SKILLLIST
for( int i = 0; i < (int)m_vlhSkillList.size(); ++i )
{
DnSkillHandle hSkill = m_vlhSkillList.at( i );
#else
DWORD dwNumSkill = GetSkillCount();
for( DWORD i = 0; i < dwNumSkill; ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
#endif // #ifndef PRE_FIX_SKILLLIST
if( hSkill->GetNeedJobClassID() == nJobID )
{
int iLevel = hSkill->GetLevel();
for( int k = 0; k < iLevel; ++k )
{
const TSkillData* pSkillData = g_pDataManager->GetSkillData( hSkill->GetClassID() );
iUsedSPByJob += pSkillData->vLevelDataList.at( k ).nNeedSkillPoint;
}
}
}
return iUsedSPByJob;
}
void CDnPlayerActor::OnChangePlaySpeed( DWORD dwFrame, float fSpeed )
{
// <20>°ų<C2B0> <20>ؼ<EFBFBD> <20><><EFBFBD>۾Ƹ<DBBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>þ <20><><EFBFBD><EFBFBD> <20>ñ׳<C3B1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD> <20>Ȱɸ<C8B0><C9B8><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>޾Ƴ<DEBE><C6B3><EFBFBD> üũ<C3BC><C5A9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//for( int i = 0; i < (int)m_dqProjectileSignalOffset.size(); ++i )
//{
// int& iSignalOffsetFrame = m_dqProjectileSignalOffset.at( i );
// iSignalOffsetFrame = (int)((float)iSignalOffsetFrame * fSpeed );
//}
// <20><><EFBFBD>۾Ƹӷ<C6B8> <20>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if( dwFrame <= 200 && fSpeed < 0.05f)
m_bCheckProjectileSignalTerm = false;
m_fFrameSpeed = fSpeed;
}
void CDnPlayerActor::ProcessCompanion( LOCAL_TIME LocalTime, float fDelta )
{
CheckPetSatietyPercent();
}
void CDnPlayerActor::CheckPetSatietyPercent()
{
if( !IsCanPetMode() )
return;
const TVehicle* pEquipPet = GetUserSession()->GetItem()->GetPetEquip();
if( pEquipPet && (pEquipPet->nType & Pet::Type::ePETTYPE_SATIETY) && pEquipPet->Vehicle[Pet::Slot::Body].nItemID > 0 )
{
if( GetUserSession()->GetItem()->GetPetSatietyPercent() < 50.f ) // <20><><EFBFBD>⿡ Limit üũ <20>ؾ<EFBFBD> <20>մϴ<D5B4>.
{
DnSkillHandle hFirstSkill = FindSkill(pEquipPet->nSkillID1);
if(hFirstSkill && hFirstSkill->GetSkillType() == CDnSkill::Passive )
{
CmdForceRemoveSkill(pEquipPet->nSkillID1);
m_bDeletedPetSkill[Pet::Skill::Primary] = true;
}
DnSkillHandle hSecondSkill = FindSkill(pEquipPet->nSkillID2);
if(hSecondSkill && hSecondSkill->GetSkillType() == CDnSkill::Passive )
{
CmdForceRemoveSkill(pEquipPet->nSkillID2);
m_bDeletedPetSkill[Pet::Skill::Secondary] = true;
}
}
else
{
if( m_bDeletedPetSkill[Pet::Skill::Primary] == true )
{
if( !IsExistSkill( pEquipPet->nSkillID1 ) )
CmdForceAddSkill( pEquipPet->nSkillID1 );
m_bDeletedPetSkill[Pet::Skill::Primary] = false;
}
if( m_bDeletedPetSkill[Pet::Skill::Secondary] == true )
{
if( !IsExistSkill( pEquipPet->nSkillID2 ) )
CmdForceAddSkill( pEquipPet->nSkillID2 );
m_bDeletedPetSkill[Pet::Skill::Secondary] = false;
}
}
}
}
CDnVehicleActor *CDnPlayerActor::GetMyVehicleActor()
{
if(m_hVehicleActor)
{
return static_cast<CDnVehicleActor*>(m_hVehicleActor.GetPointer());
}
return NULL;
}
bool CDnPlayerActor::IsCanVehicleMode()
{
if( IsDie() || IsGhost() || m_nTeam == PvPCommon::Team::Observer )
return false;
if( IsSpectatorMode() )
return false;
int nCurrentMapID = 0;
CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
if( pGameTask ) // <20><><EFBFBD><EFBFBD><EFBFBD>׽<EFBFBD>ũ<EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>
nCurrentMapID = pGameTask->GetMapTableID();
else
nCurrentMapID = m_pSession->GetMapIndex();
bool bIsCanVehicleMode = g_pDataManager->IsVehicleMode(nCurrentMapID);
#if defined( PRE_ADD_FORCE_RIDE_ENABLE_TRIGGER )
bIsCanVehicleMode = bIsCanVehicleMode && m_bForceEnableRideByTrigger;
#endif // #if defined( PRE_ADD_FORCE_RIDE_ENABLE_TRIGGER )
return bIsCanVehicleMode;
}
bool CDnPlayerActor::IsCanPetMode()
{
int nCurrentMapID = 0;
CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(GetRoom()).GetTask( "GameTask" );
if( pGameTask ) // <20><><EFBFBD><EFBFBD><EFBFBD>׽<EFBFBD>ũ<EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>
nCurrentMapID = pGameTask->GetMapTableID();
else
nCurrentMapID = m_pSession->GetMapIndex();
return g_pDataManager->IsPetMode( nCurrentMapID );
}
void CDnPlayerActor::RideVehicle(TVehicle *pInfo)
{
if( !IsPlayerActor() || IsVehicleMode() || !pInfo )
return;
if( !IsCanVehicleMode())
return;
if(IsBattleMode())
SetBattleMode(false);
int nVehicleActorTableID = g_pDataManager->GetVehicleActorID(pInfo->Vehicle[Vehicle::Slot::Body].nItemID);
DnActorHandle hVehicle;
hVehicle = CreateActor( GetRoom(), nVehicleActorTableID );
if( !hVehicle || !hVehicle->GetObjectHandle())
return;
CDnVehicleActor* pVehicle = (CDnVehicleActor *)hVehicle.GetPointer();
if(!pVehicle)
return;
pVehicle->SetMyPlayerActor(GetActorHandle());
pVehicle->Show( false );
float fLandHeight = INSTANCE(CDnWorld).GetHeight( GetMatEx()->m_vPosition );
pVehicle->SetPosition(GetMatEx()->m_vPosition);
pVehicle->SetPrevPosition(GetMatEx()->m_vPosition);
pVehicle->SetAddHeight( GetMatEx()->m_vPosition.y - fLandHeight );
pVehicle->GetMatEx()->CopyRotationFromThis(GetMatEx());
pVehicle->SetItemID(pInfo->Vehicle[Vehicle::Slot::Body].nItemID); // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.
#ifdef PRE_ADD_VEHICLE_ACTION_STRING
DNTableFileFormat* pVehicleTable = GetDNTable( CDnTableDB::TVEHICLE );
std::string strVehicleAction = pVehicleTable->GetFieldFromLablePtr( pInfo->Vehicle[Vehicle::Slot::Body].nItemID , "_RiderString" )->GetString();
if(!strVehicleAction.empty() || strstr(strVehicleAction.c_str() , "Vehicle_") != NULL )
pVehicle->SetVehicleActionString(strVehicleAction.c_str());
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.
for (int i= Vehicle::Slot::Saddle; i<Vehicle::Slot::Max; i++)
{
if(pInfo->Vehicle[i].nItemID != 0 && pInfo->Vehicle[i].nSerial != 0)
{
pVehicle->EquipItem(pInfo->Vehicle[i]);
}
}
////////////////
if(pInfo->dwPartsColor1 != 0 && pInfo->dwPartsColor1 != -1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ°<D6B4><C2B0><EFBFBD><ECBFA1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݴϴ<DDB4>.
{
pVehicle->ChangeHairColor(pInfo->dwPartsColor1); // <20><20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
SetMyVehicleActor(pVehicle->GetActorHandle());
pVehicle->InitializeRoom((CDNGameRoom*)GetRoom());
pVehicle->Initialize();
pVehicle->SetUniqueID( m_pSession->GetVehicleObjectID() );
pVehicle->SetVehicleClassID(pInfo->Vehicle[Vehicle::Slot::Body].nItemID);
pVehicle->RefreshState();
pVehicle->Show(true);
pVehicle->SetAttachToPlayer(true);
pVehicle->SetProcess(true);
SetVehicleMode(true);
pVehicle->SetActionQueue( "Stand" );
pVehicle->SetTeam(GetTeam());
}
void CDnPlayerActor::UnRideVehicle(bool bForce)
{
if(!IsVehicleMode())
return;
if(GetMyVehicleActor() && !GetMyVehicleActor()->IsDestroy())
{
float fLandHeight = INSTANCE(CDnWorld).GetHeight( GetMyVehicleActor()->GetMatEx()->m_vPosition );
SetPosition(GetMyVehicleActor()->GetMatEx()->m_vPosition);
SetPrevPosition(GetMyVehicleActor()->GetMatEx()->m_vPosition);
SetAddHeight( GetMyVehicleActor()->GetMatEx()->m_vPosition.y - fLandHeight );
GetMyVehicleActor()->SetAttachToPlayer(false);
GetMyVehicleActor()->Show(false);
GetMyVehicleActor()->SetUniqueID(GetMyVehicleActor()->GetUniqueID() +1 );
// SetDestroy<6F><79> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>̿<EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<>ԵǸ<D4B5> <20><><EFBFBD><EFBFBD>ũ <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ȴ<EFBFBD>
// < <20>ű<EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4><C2B0><20><><EFBFBD><EFBFBD> > <20>׷<EFBFBD><D7B7>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
GetMyVehicleActor()->SetDestroy();
}
SetVehicleMode(false);
Show(true);
SetActionQueue("Stand");
return;
}
void CDnPlayerActor::ForceUnRideVehicle()
{
if(!IsVehicleMode())
return;
CDNGameRoom* pRoom = GetGameRoom();
if (!pRoom)
return;
api_trigger_UnRideVehicle( pRoom, GetSessionID() );
}
void CDnPlayerActor::RemoveVehicleStateEffectImmediately(int nBlowIndex )
{
if(IsVehicleMode() && GetMyVehicleActor())
{
GetMyVehicleActor()->CmdRemoveStateEffectImmediately( (STATE_BLOW::emBLOW_INDEX)nBlowIndex );
GetMyVehicleActor()->SendRemoveStateEffect( (STATE_BLOW::emBLOW_INDEX)nBlowIndex );
}
}
void CDnPlayerActor::SetForceEnableRide( const bool bForceEnableRide )
{
if( false == bForceEnableRide )
ForceUnRideVehicle();
m_bForceEnableRideByTrigger = bForceEnableRide;
m_pSession->SendTriggerForceEnableRide( GetSessionID(), bForceEnableRide );
}
void CDnPlayerActor::OnCannonMonsterDie( void )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EndCannonMode();
SetActionQueue( "Stand" );
}
void CDnPlayerActor::EndCannonMode()
{
m_bPlayerCannonMode = false;
m_hCannonMonsterActor.Identity();
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TACTOR );
if( pSox && pSox->IsExistItem(GetClassID()))
{
float fWeight = pSox->GetFieldFromLablePtr( GetClassID(), "_Weight" )->GetFloat();
int fPressLevel = pSox->GetFieldFromLablePtr( GetClassID(), "_PressLevel" )->GetInteger();
SetWeight(fWeight);
SetPressLevel(fPressLevel);
}
}
void CDnPlayerActor::ProcessNonLocalShootModeAction()
{
if(!IsLocalActor())
return;
if( strcmp( GetCurrentAction(), "MOD_Stand" ) == NULL ) {
if( strstr( m_szCustomAction.c_str(), "MOD_Shoot" ) ) {
float fFrame = ( ( CDnActionBase::m_LocalTime - m_CustomActionTime ) / 1000.f ) * CDnActionBase::m_fFPS;
CmdStop( "MOD_Shoot_Stand", 0, 8.f, fFrame );
ResetCustomAction();
}
}
}
const char *CDnPlayerActor::GetChangeShootActionName(const char *szActionName) // <20>۾<EFBFBD><DBBE><EFBFBD>.
{
if(strcmp(szActionName,"Stand") == NULL)
{
szActionName = "MOD_Stand";
}
if(strcmp(szActionName,"Move_Front") == NULL)
{
szActionName = "MOD_Move_Front";
}
if(strcmp(szActionName,"Move_Back") == NULL)
{
szActionName = "MOD_Move_Back";
}
if(strcmp(szActionName,"Move_Left") == NULL)
{
szActionName = "MOD_Move_Left";
}
if(strcmp(szActionName,"Move_Right") == NULL)
{
szActionName = "MOD_Move_Right";
}
if(strcmp(szActionName,"Jump") == NULL)
{
szActionName = "MOD_Jump";
}
if(strstr(szActionName,"Attack1"))
{
szActionName = "MOD_Shoot_Stand";
}
return szActionName;
}
bool CDnPlayerActor::IsTransformSkill( int nSkillID )
{
for( DWORD i=0; i<m_vecTransformSkillList.size(); i++ )
{
if( m_vecTransformSkillList[i] == nSkillID )
return true;
}
return false;
}
void CDnPlayerActor::RefreshTransformMode()
{
m_bRefreshTransformMode = false;
DNTableFileFormat* pMonsterSox = GetDNTable( CDnTableDB::TMONSTER_TRANS );
DNTableFileFormat* pMonsterSkillSox = GetDNTable( CDnTableDB::TMONSTERSKILL_TRANS );
if(!pMonsterSox || !pMonsterSkillSox) return;
if( IsDestroy() ) return;
if( IsProcessSkill() == true )
{
bool bCancelSkill = true;
if(GetStateBlow()->IsApplied(STATE_BLOW::BLOW_232))
{
DNVector(DnBlowHandle) vlBlows;
GatherAppliedStateBlowByBlowIndex(STATE_BLOW::BLOW_232, vlBlows);
for (DWORD i = 0; i < vlBlows.size(); i++)
{
if( vlBlows[i] )
{
CDnTransformBlow *pTransformBlow = static_cast<CDnTransformBlow*>( vlBlows[i].GetPointer() );
if( pTransformBlow && pTransformBlow->GetParentSkillInfo()->iSkillID == m_hProcessSkill->GetClassID() )
{
bCancelSkill = false;
break;
}
}
}
}
if( bCancelSkill == true )
{
CancelUsingSkill();
SetAction("Stand",0.f,0.f);
}
}
else
{
SetAction("Stand",0.f,0.f);
}
if(IsTransformMode() == true)
{
int nActorIndex = pMonsterSox->IsExistItem(m_nMonsterMutationTableID) ? pMonsterSox->GetFieldFromLablePtr( m_nMonsterMutationTableID , "_ActorTableID" )->GetInteger() : 0;
int nSkillTableIndex = pMonsterSox->IsExistItem(m_nMonsterMutationTableID) ? pMonsterSox->GetFieldFromLablePtr( m_nMonsterMutationTableID , "_SkillTable" )->GetInteger() : 0;
if(GetStateBlow()->IsApplied(STATE_BLOW::BLOW_176))
{
CmdRemoveStateEffect(STATE_BLOW::BLOW_176);
GetStateBlow()->Process( 0, 0.f );
}
DNTableFileFormat* pActorSox = GetDNTable( CDnTableDB::TACTOR );
if(!pActorSox || !pActorSox->IsExistItem(nActorIndex))
return;
if(nActorIndex > 0)
{
SwapSingleSkin( nActorIndex );
ResetCustomAction();
SetAction( "Stand", 0.f, 0.f );
}
else
return;
if( pMonsterSkillSox && pMonsterSkillSox->IsExistItem(nSkillTableIndex))
{
if(!m_vecTransformSkillList.empty()) // <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. < <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> <20>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD>ϴ°<CFB4><C2B0><EFBFBD> >
{
for (int i=0; i<(int)m_vecTransformSkillList.size(); i++)
{
if(m_vecTransformSkillList[i] != -1 )
RemoveSkill(m_vecTransformSkillList[i]);
}
m_vecTransformSkillList.clear();
}
for (int i=0; i<PvPCommon::Common::MonsterMutationSkillColCount; i++)
{
char szStr[256];
int nSkillIndex = -1;
int nSkillLevel = -1;
sprintf_s( szStr, "_SkillIndex%d", i+1 );
nSkillIndex = pMonsterSkillSox->GetFieldFromLablePtr( nSkillTableIndex, szStr )->GetInteger();
sprintf_s( szStr, "_SkillLevel%d", i+1 );
nSkillLevel = pMonsterSkillSox->GetFieldFromLablePtr( nSkillTableIndex, szStr )->GetInteger();
if(nSkillIndex != -1 && nSkillLevel != -1)
{
m_vecTransformSkillList.push_back(nSkillIndex);
AddSkill(nSkillIndex,nSkillLevel);
}
else
break;
}
std::string strSkillVec = "";
for(DWORD i=0; i<m_vecTransformSkillList.size();i++)
{
char szSkillIndex[256];
sprintf(szSkillIndex, "%d;", m_vecTransformSkillList[i]);
strSkillVec += szSkillIndex;
}
m_nAllowedSkill = CmdAddStateEffect( NULL, STATE_BLOW::BLOW_176, -1, strSkillVec.c_str(), true ); // <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>Ȱ<EFBFBD><C8B0>ȭ <20>Ѵ<EFBFBD>.
}
}
else if(IsTransformMode() == false)
{
SwapSingleSkin( -1 );
SetActionQueue( IsDie() ? "Die" : m_strTransformEndAction.c_str() );
for(UINT i=0; i<m_vecTransformSkillList.size(); i++)
{
if(m_vecTransformSkillList[i] != -1)
RemoveSkill(m_vecTransformSkillList[i]);
}
if(m_nAllowedSkill > 0)
{
CmdRemoveStateEffectFromID(m_nAllowedSkill);
m_nAllowedSkill = 0;
}
m_vecTransformSkillList.clear();
}
SetBattleMode(true);
RefreshState();
}
void CDnPlayerActor::ToggleTransformMode( bool bTrue,int nMonsterMutatorTableID , bool bForce, const char* strEndAction )
{
if( m_bTransformMode == bTrue && !bForce )
return;
m_bTransformMode = bTrue;
m_nMonsterMutationTableID = nMonsterMutatorTableID;
m_bRefreshTransformMode = true;
m_strTransformEndAction = strEndAction;
}
void CDnPlayerActor::CmdShootMode(bool bTrue)
{
m_bShootMode = bTrue;
if(m_bShootMode)
CmdStop("MOD_Shoot_Stand");
else
CmdStop("Stand");
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
DWORD dwUniqueID = GetUniqueID();
Stream.Write( &dwUniqueID, sizeof(dwUniqueID) );
Stream.Write( &m_bShootMode, sizeof(bool) );
Send( eActor::SC_CMDSHOOTMODE, &Stream );
}
void CDnPlayerActor::CmdWarp( EtVector3 &vPos, EtVector2 &vLook, CDNUserSession* pGameSession, bool bCheckPlayerFollowSummonedMonster/*=false*/ )
{
if(IsVehicleMode() && GetMyVehicleActor() )
GetMyVehicleActor()->CmdWarp(vPos, vLook, pGameSession);
CDnActor::CmdWarp( vPos, vLook, pGameSession, bCheckPlayerFollowSummonedMonster );
if( m_pPlayerSpeedHackChecker ) m_pPlayerSpeedHackChecker->ResetInvalid();
// #32426 <20><>ȯü <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> Ȥ<><C8A4> <20><> <20>̵<EFBFBD>(CmdWarp)<29><> <20><> <20><> <20><><EFBFBD>󰡾<EFBFBD> <20>Ǵ<EFBFBD>
// <20><> <20>÷<EFBFBD><C3B7>̾ <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> üũ<C3BC>ؼ<EFBFBD> ó<><C3B3>.
if( bCheckPlayerFollowSummonedMonster )
{
list<S_FOLLOWSTAGE_SUMMONED_MONSTER_INFO>::iterator iter = m_listSummonedMonstersFollowStageInfos.begin();
for( iter; iter != m_listSummonedMonstersFollowStageInfos.end(); )
{
DnMonsterActorHandle hMonsterActor = iter->hMonster;
if( hMonsterActor && false == hMonsterActor->IsDie() )
{
hMonsterActor->CmdWarp( vPos, vLook, pGameSession, false );
hMonsterActor->ResetAggro();
hMonsterActor->CmdAction( "Stand" );
++iter;
}
else
{
iter = m_listSummonedMonstersFollowStageInfos.erase( iter );
}
}
}
}
void CDnPlayerActor::RequestCooltimeParrySuccess( int iSkillID )
{
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &iSkillID, sizeof(int) );
Send( eActor::CS_COOLTIMEPARRY_SUCCESS, &Stream );
}
bool CDnPlayerActor::IsInvalidPlayerChecker()
{
if( !m_pSession ) return false;
if( m_pSession->GetHackPlayRestraintValue() <= 0 ) return false;
if( m_pSession->GetHackAbuseDBValue() + m_nInvalidPlayerCheckCounter >= m_pSession->GetHackPlayRestraintValue() ) return true;
return false;
}
void CDnPlayerActor::SwapSingleSkin( int nChangeActorTableID )
{
if( m_nSwapSingleSkinActorID == nChangeActorTableID ) return;
m_nSwapSingleSkinActorID = nChangeActorTableID;
// FreeAction();
#ifdef PRE_FIX_MEMOPT_EXT
if (g_pDataManager == NULL)
{
_ASSERT(0);
return;
}
#endif
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TACTOR );
if( m_nSwapSingleSkinActorID == -1 ) {
#ifdef PRE_FIX_MEMOPT_EXT
std::string szSkinName, szAniName, szActName;
g_pDataManager->GetFileNameFromFileEXT(szSkinName, pSox, m_nClassID, "_SkinName");
g_pDataManager->GetFileNameFromFileEXT(szAniName, pSox, m_nClassID, "_AniName");
g_pDataManager->GetFileNameFromFileEXT(szActName, pSox, m_nClassID, "_ActName");
#else
std::string szSkinName = pSox->GetFieldFromLablePtr( m_nClassID, "_SkinName" )->GetString();
std::string szAniName = pSox->GetFieldFromLablePtr( m_nClassID, "_AniName" )->GetString();
std::string szActName = pSox->GetFieldFromLablePtr( m_nClassID, "_ActName" )->GetString();
#endif
SAFE_RELEASE_SPTR( GetObjectHandle() );
FreeAction();
LoadSkin( CEtResourceMng::GetInstance().GetFullName( szSkinName ).c_str(), CEtResourceMng::GetInstance().GetFullName( szAniName ).c_str() );
LoadAction( CEtResourceMng::GetInstance().GetFullName( szActName ).c_str() );
SetAction( "Stand", 0.f, 0.f );
for( int i=0; i<CDnWeapon::EquipSlot_Amount; i++ )
{
DnWeaponHandle hWeapon = GetWeapon(i);
if( hWeapon )
{
LinkWeapon( i );
}
hWeapon = GetCashWeapon(i);
if( hWeapon )
{
LinkCashWeapon( i );
}
}
SAFE_RELEASE_SPTR( m_hSwapOriginalHandle );
SAFE_DELETE( m_pSwapOriginalAction );
}
else
{
#ifdef PRE_FIX_MEMOPT_EXT
std::string szSkinName, szAniName, szActName;
g_pDataManager->GetFileNameFromFileEXT(szSkinName, pSox, m_nSwapSingleSkinActorID, "_SkinName");
g_pDataManager->GetFileNameFromFileEXT(szAniName, pSox, m_nSwapSingleSkinActorID, "_AniName");
g_pDataManager->GetFileNameFromFileEXT(szActName, pSox, m_nSwapSingleSkinActorID, "_ActName");
#else
std::string szSkinName = pSox->GetFieldFromLablePtr( m_nSwapSingleSkinActorID, "_SkinName" )->GetString();
std::string szAniName = pSox->GetFieldFromLablePtr( m_nSwapSingleSkinActorID, "_AniName" )->GetString();
std::string szActName = pSox->GetFieldFromLablePtr( m_nSwapSingleSkinActorID, "_ActName" )->GetString();
#endif
if( !m_hSwapOriginalHandle && m_hObject )
{
m_hSwapOriginalHandle = EternityEngine::CreateAniObject( GetRoom(), CEtResourceMng::GetInstance().GetFullName( m_hObject->GetSkinFileName() ).c_str(), CEtResourceMng::GetInstance().GetFullName( m_hObject->GetAniHandle()->GetFileName() ).c_str() );
}
SAFE_RELEASE_SPTR( GetObjectHandle() );
if( !m_pSwapOriginalAction )
{
m_pSwapOriginalAction = new CDnActionBase;
m_pSwapOriginalAction->LoadAction( CEtResourceMng::GetInstance().GetFullName( CDnActionBase::m_szFileName ).c_str() );
}
SAFE_RELEASE_SPTR( GetObjectHandle() );
FreeAction();
LoadSkin( CEtResourceMng::GetInstance().GetFullName( szSkinName ).c_str(), CEtResourceMng::GetInstance().GetFullName( szAniName ).c_str() );
LoadAction( CEtResourceMng::GetInstance().GetFullName( szActName ).c_str() );
SetAction( "Stand", 0.f, 0.f );
}
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 ) );
}
if(m_pBubbleSystem)
m_pBubbleSystem->Clear();
}
void CDnPlayerActor::InitializeEnchantPassiveSkills( void )
{
// <20><>ȭ <20>нú<D0BD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> ã<>Ƽ<EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
#ifndef PRE_FIX_SKILLLIST
for( DWORD i = 0; i < m_vlhSkillList.size(); i++ )
{
DnSkillHandle hSkill = m_vlhSkillList[ i ];
#else
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
#endif // #ifndef PRE_FIX_SKILLLIST
if( CDnSkill::EnchantPassive == hSkill->GetSkillType() &&
0 < hSkill->GetBaseSkillID() )
{
DnSkillHandle hEnchantPassiveSkill = hSkill;
int iBaseSkillID = hEnchantPassiveSkill->GetBaseSkillID();
DnSkillHandle hBaseSkill = FindSkill( iBaseSkillID );
// <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ö󰡸<C3B6> <20><><EFBFBD>־<EFBFBD> <20><>.
if( hBaseSkill )
hBaseSkill->ApplyEnchantSkill( hEnchantPassiveSkill );
}
}
}
void CDnPlayerActor::OnReplacementSkill( DnSkillHandle hLegacySkill, DnSkillHandle hNewSkill )
{
MASkillUser::OnReplacementSkill( hLegacySkill, hNewSkill );
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>нú<D0BD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> <20><>ü <20><>ƾ<EFBFBD><C6BE> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
if( CDnSkill::EnchantPassive == hLegacySkill->GetSkillType() &&
0 < hLegacySkill->GetBaseSkillID() )
{
DnSkillHandle hBaseSkill = FindSkill( hLegacySkill->GetBaseSkillID() );
if( hBaseSkill )
{
_ASSERT( hLegacySkill->GetBaseSkillID() == hNewSkill->GetBaseSkillID() );
hBaseSkill->ReleaseEnchantSkill();
hBaseSkill->ApplyEnchantSkill( hNewSkill );
}
}
else
{
// <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>нú<D0BD> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><>ü <20><>ƾ<EFBFBD><C6BE> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><> <20><><EFBFBD><20><><EFBFBD>̽<EFBFBD> <20><>ų <20><>ü<EFBFBD><C3BC> SkillTask <20><><EFBFBD><EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD><EFBFBD> <20><> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD>ΰ<EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ָ<EFBFBD> <20>ȴ<EFBFBD>.
CheckAndApplyEnchantPassiveSkill( hNewSkill );
}
}
void CDnPlayerActor::CheckAndApplyEnchantPassiveSkill( DnSkillHandle hBaseSkill )
{
if( hBaseSkill )
{
DnSkillHandle hEnchantPassiveSkill;
#ifndef PRE_FIX_SKILLLIST
for( DWORD i = 0; i < m_vlhSkillList.size(); i++ )
{
DnSkillHandle hSkill = m_vlhSkillList[ i ];
#else
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
#endif // #ifndef PRE_FIX_SKILLLIST
if( hSkill->GetBaseSkillID() == hBaseSkill->GetClassID() )
{
hEnchantPassiveSkill = hSkill;
break;
}
}
if( hEnchantPassiveSkill )
hBaseSkill->ApplyEnchantSkill( hEnchantPassiveSkill );
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20>ɰ<EFBFBD> <20>ִµ<D6B4>
// <20><> <20>߿<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> hit <20>DZ<EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>. #28747
void CDnPlayerActor::OnHitSignalStateEffectFilterException( DWORD dwTargetActorUniqueID, int iBlowIndex )
{
if( STATE_BLOW::BLOW_041 == (STATE_BLOW::emBLOW_INDEX)iBlowIndex ||
STATE_BLOW::BLOW_144 == (STATE_BLOW::emBLOW_INDEX)iBlowIndex )
{
m_mapIcyFractionHitted[ dwTargetActorUniqueID ] = true;
}
}
bool CDnPlayerActor::CheckHitSignalStateEffectFilterException( DWORD dwTargetActorUniqueID, int iBlowIndex )
{
bool bResult = true;
if( STATE_BLOW::BLOW_041 == (STATE_BLOW::emBLOW_INDEX)iBlowIndex ||
STATE_BLOW::BLOW_144 == (STATE_BLOW::emBLOW_INDEX)iBlowIndex )
{
if( m_mapIcyFractionHitted.end() != m_mapIcyFractionHitted.find( dwTargetActorUniqueID ) )
{
bResult = false;
}
}
return bResult;
}
bool CDnPlayerActor::IsMyRelicMonster( DnActorHandle hActor )
{
bool bResult = false;
if( hActor && hActor->IsMonsterActor() )
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(hActor.GetPointer());
if( pMonsterActor->IsClericRelicMonster() )
{
if( GetMySmartPtr() == pMonsterActor->GetSummonerPlayerActor() )
bResult = true;
}
}
return bResult;
}
INT64 CDnPlayerActor::GetCharacterDBID()
{
return m_pSession ? m_pSession->GetCharacterDBID() : 0;
}
// #26902
// <20>ӽ÷<D3BD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0>ϴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD>½<EFBFBD>Ų<EFBFBD><C5B2>.
bool CDnPlayerActor::CanChangeJob( int iJobID )
{
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
DNTableFileFormat* pJobTable = GetDNTable( CDnTableDB::TJOB );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int iNowJob = m_pSession->GetUserJob();
int iNowJobDeep = 0;
int iNowRootJob = 0;
for( int i = 0; i < pJobTable->GetItemCount(); ++i )
{
int iItemID = pJobTable->GetItemID( i );
if( iItemID == iNowJob )
{
iNowJobDeep = pJobTable->GetFieldFromLablePtr( iItemID, "_JobNumber" )->GetInteger();
iNowRootJob = pJobTable->GetFieldFromLablePtr( iItemID, "_BaseClass" )->GetInteger();
break;
}
}
int iJobIDToChange = iJobID;
// <20>ٲٱ<D9B2> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谡 <20><><EFBFBD>ų<EFBFBD> ū<><C5AB> Ȯ<><C8AE>.
bool bResult = false;
map<int, int> mapRootJob;
for( int i = 0; i < pJobTable->GetItemCount(); ++i )
{
int iItemID = pJobTable->GetItemID( i );
if( iItemID == iJobIDToChange )
{
int iJobRootToChange = pJobTable->GetFieldFromLablePtr( iItemID, "_BaseClass" )->GetInteger();
if( iNowRootJob == iJobRootToChange )
{
int iJobDeepToChange = pJobTable->GetFieldFromLablePtr( iItemID, "_JobNumber" )->GetInteger();
if( iNowJobDeep < iJobDeepToChange )
{
// <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¾ƾ<C2BE> <20><>.
int iParentJobID = pJobTable->GetFieldFromLablePtr( iItemID, "_ParentJob" )->GetInteger();
if( iParentJobID == iNowJob )
{
bResult = true;
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
}
}
else
{
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
wstring wszString = FormatW(L"<EFBFBD>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
}
}
}
if( false == bResult )
{
wstring wszString = FormatW(L"<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> Job ID <20>Դϴ<D4B4>..\r\n");
m_pSession->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
}
return bResult;
}
void CDnPlayerActor::SendTempJobChange( int iJobID )
{
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &iJobID, sizeof(int) );
Send( eActor::SC_DO_TEMP_JOBCHANGE, &Stream );
m_iTempChangedJob = iJobID;
}
// <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
void CDnPlayerActor::EndAddTempSkillAndSendRestoreTempJobChange( void )
{
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &m_iTempChangedJob, sizeof(int) );
Send( eActor::SC_RESTORE_TEMP_JOBCHANGE, &Stream );
m_iTempChangedJob = 0;
}
void CDnPlayerActor::AddTempSkill( int iSkillID )
{
// <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ȭ <20>нú<D0BD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>̽<EFBFBD><CCBD><EFBFBD> <20>Ǵ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>̽<EFBFBD> <20><>ų<EFBFBD><C5B3> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
int iNeedBaseSkillID = 0;
if( pSkillTable->IsExistItem( iSkillID ) )
iNeedBaseSkillID = pSkillTable->GetFieldFromLablePtr( iSkillID, "_BaseSkillID" )->GetInteger();
DNVector(int) vlSkillsToAdd;
if( 0 < iNeedBaseSkillID )
{
// <20><>ȭ <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20>̰͵<CCB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.
if( false == IsExistSkill( iNeedBaseSkillID ) )
vlSkillsToAdd.push_back( iNeedBaseSkillID );
}
vlSkillsToAdd.push_back( iSkillID );
for( int i = 0; i < (int)vlSkillsToAdd.size(); ++i )
{
int iSkillIDToAdd = vlSkillsToAdd.at( i );
bool bSuccess = AddSkill( iSkillIDToAdd, 1, CDnSkill::PVE );
if( bSuccess )
{
DnSkillHandle hSkill = FindSkill( iSkillIDToAdd );
if( hSkill )
{
hSkill->AsTempSkill();
// 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>,
// <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>°<EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
if( GetLevel() < hSkill->GetLevelLimit() )
hSkill->SetLevelLimit( GetLevel() );
if( false == IsPassJob( hSkill->GetNeedJobClassID() ) )
hSkill->SetNeedJobClassID( GetJobClassID() );
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><>ų <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>.
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &iSkillID, sizeof(int) );
Send( eActor::SC_ADD_TEMP_SKILL, &Stream );
m_bTempSkillAdded = true;
}
}
}
}
void CDnPlayerActor::RemoveAllTempSkill( void )
{
#ifndef PRE_FIX_SKILLLIST
DNVector(DnSkillHandle)::iterator iter = m_vlhSkillList.begin();
for( iter; iter != m_vlhSkillList.end(); )
{
DnSkillHandle hSkill = *iter;
if( hSkill->IsTempSkill() )
{
// 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> MASkillUser <20><> <20>ƴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>
// <20><>ų <20><>ü <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>. <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD> <20>߰<EFBFBD> <20><>û<EFBFBD><C3BB> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
// MASkillUser::RemoveSkill() <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
int iSkillID = hSkill->GetClassID();
OnRemoveSkill( hSkill );
iter = m_vlhSkillList.erase( iter );
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &iSkillID, sizeof(int) );
Send( eActor::SC_REMOVE_TEMP_SKILL, &Stream );
}
else
++iter;
}
#else
vector<int> vlTempSkills;
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
DnSkillHandle hSkill = GetSkillFromIndex( i );
if( hSkill->IsTempSkill() )
{
vlTempSkills.push_back( hSkill->GetClassID() );
}
}
for( int i = 0; i < (int)vlTempSkills.size(); ++i )
{
int iSkillID = vlTempSkills.at( i );
RemoveSkill( iSkillID );
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
BYTE pBuffer[ 32 ] = { 0 };
CPacketCompressStream Stream( pBuffer, 32 );
Stream.Write( &iSkillID, sizeof(int) );
Send( eActor::SC_REMOVE_TEMP_SKILL, &Stream );
}
#endif // #ifndef PRE_FIX_SKILLLIST
m_bTempSkillAdded = false;
}
#ifdef PRE_ADD_48714
#include "DNMailSender.h"
#endif //#ifdef PRE_ADD_48714
void CDnPlayerActor::OnInvalidPlayerChecker( int nValue )
{
m_nInvalidPlayerCheckCounter += nValue;
OutputDebug( "OnInvalidPlayerChecker : %d, (%d)\n", m_nInvalidPlayerCheckCounter, nValue );
if( m_pSession && m_pSession->GetHackPlayRestraintValue() > 0 )
{
#if defined (PRE_ADD_ABUSE_ACCOUNT_RESTRAINT)
//<2F><><EFBFBD><20><><EFBFBD><EFBFBD><EEB0A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵܿ<C7B4> *2 <20><><EFBFBD><EFBFBD>
if( m_nInvalidPlayerCheckCounter >= m_pSession->GetHackPlayRestraintValue() )
{
//<2F>ϴ<EFBFBD><CFB4><EFBFBD> <20>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>
if (m_pSession->GetHackCharacterCntWithoutMe() > 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ϳ<EFBFBD> <20>ִµ<D6B4> <20>ϳ<EFBFBD> <20><> <20>ɷȴ<C9B7> 36080<38>̽<EFBFBD><CCBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>Ѵ<EFBFBD>.
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100070, m_pSession->m_eSelectedLanguage);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100071, m_pSession->m_eSelectedLanguage);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100070);
std::wstring wszRestraintReasonForDolis = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 100071);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
m_pSession->GetDBConnection()->QueryAddRestraint(m_pSession, DBDNWorldDef::RestraintTargetCode::Account, DBDNWorldDef::RestraintTypeCode::ConnectRestraint, wszRestraintReason.c_str(), wszRestraintReasonForDolis.c_str(), 9999, DBDNWorldDef::RestraintDolisReasonCode::AbuseRestraintCode);
}
m_pSession->DetachConnection( L"InvalidPlayerCheckCounter" );
}
#else
#ifdef PRE_ADD_48714
if(m_nInvalidPlayerCheckCounter >= m_pSession->GetHackPlayRestraintValue())
{
if (m_pSession->GetDBConnection())
{
#if defined (_TW)
WCHAR wszBuf[100];
wsprintf( wszBuf, L"Invalidcount Reached limit Value");
m_pSession->GetDBConnection()->QueryAddAbuseLog(m_pSession, ABUSE_TWN_EXTENDLOG, wszBuf);
#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 109049, m_pSession->m_eSelectedLanguage);
#else //#if defined(PRE_ADD_MULTILANGUAGE)
std::wstring wszRestraintReason = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, 109049);
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
m_pSession->GetDBConnection()->QueryAddRestraint(m_pSession, DBDNWorldDef::RestraintTargetCode::Character, DBDNWorldDef::RestraintTypeCode::TradeRestraint, wszRestraintReason.c_str(), wszRestraintReason.c_str(), 9999, DBDNWorldDef::RestraintDolisReasonCode::AbuseTradeRestraintCode);
#endif //#if defined (_TW)
CDNMailSender::Process(m_pSession, AbuseLog::Common::AbuseLog_Reached_MailID);
}
}
#endif //#ifdef PRE_ADD_48714
if( m_nInvalidPlayerCheckCounter >= m_pSession->GetHackPlayRestraintValue()*2 )
{
m_pSession->DetachConnection( L"InvalidPlayerCheckCounter" );
}
#endif //#if defined (PRE_ADD_ABUSE_ACCOUNT_RESTRAINT)
}
}
void CDnPlayerActor::OrderUseSkillToMySummonedMonster( OrderMySummonedMonsterStruct* pStruct )
{
if( IsAppliedThisStateBlow( STATE_BLOW::BLOW_215 ) )
{
DNVector( DnBlowHandle ) vlhBlows;
GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_215, vlhBlows );
_ASSERT( 1 == (int)vlhBlows.size() );
if( false == vlhBlows.empty() )
{
// <20><><EFBFBD>ǵ<EFBFBD> <20>ݰ<EFBFBD> <20>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>.
float fRangeSQ = pStruct->fOrderRange * pStruct->fOrderRange;
DNVector( DnMonsterActorHandle ) vlhMonsters;
for( list<DnMonsterActorHandle>::const_iterator iter = m_listSummonMonster.begin();
iter != m_listSummonMonster.end(); ++iter )
{
DnMonsterActorHandle hMonster = *iter;
if( hMonster && false == hMonster->IsDie() )
{
float fDistanceWithThisMonsterSQ = EtVec3LengthSq( &EtVector3(*GetPosition() - *hMonster->GetPosition()) );
if( fDistanceWithThisMonsterSQ < fRangeSQ )
{
vlhMonsters.push_back( hMonster );
}
}
}
map<int, list<DnMonsterActorHandle> >::iterator iterMap = m_mapSummonMonsterByGroup.begin();
for( iterMap; iterMap != m_mapSummonMonsterByGroup.end(); ++iterMap )
{
const list<DnMonsterActorHandle>& listSummonMonster = iterMap->second;
for( list<DnMonsterActorHandle>::const_iterator iterList = listSummonMonster.begin();
iterList != listSummonMonster.end(); ++iterList )
{
DnMonsterActorHandle hMonster = *iterList;
if( hMonster && false == hMonster->IsDie() )
{
float fDistanceWithThisMonsterSQ = EtVec3LengthSq( &EtVector3(*GetPosition() - *hMonster->GetPosition()) );
if( fDistanceWithThisMonsterSQ < fRangeSQ )
{
vlhMonsters.push_back( hMonster );
}
}
}
}
if( false == vlhMonsters.empty() )
{
CDnOrderMySummonedMonsterBlow* pBlow = static_cast<CDnOrderMySummonedMonsterBlow*>( vlhBlows.front().GetPointer() );
int iSkillID = pBlow->GetSkillID();
for( int i = 0; i < (int)vlhMonsters.size(); ++i )
{
DnMonsterActorHandle hMonster = vlhMonsters.at( i );
if( hMonster->GetMonsterClassID() == pStruct->nMonsterID )
{
// TODO: AI <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ص־<D8B5> <20><>.
if( hMonster->IsExistSkill( iSkillID ) )
{
MAAiScript* pScript = static_cast<MAAiScript*>(hMonster->GetAIBase());
if( hMonster->GetAggroTarget() )
pScript->GetMonsterSkillAI()->AddWaitOrderCount( hMonster, iSkillID );
}
}
}
}
}
}
}
bool CDnPlayerActor::CheckSkipAirCondition(int iSkill)
{
if(IsAir())
{
bool bHaveGroundCheck = false;
DnSkillHandle hSkill = FindSkill(iSkill);
if(hSkill)
{
if(hSkill->IsExistUsableChecker(IDnSkillUsableChecker::GROUNDMOVABLE_CHECKER))
bHaveGroundCheck = true;
}
if(bHaveGroundCheck)
{
return true;
}
}
return false;
}
bool CDnPlayerActor::HasSameGlobalIDSkill( int iSkillID )
{
bool bResult = false;
DNTableFileFormat* pSkillTable = GetDNTable( CDnTableDB::TSKILL );
int iGlobalSkillGroupID = pSkillTable->GetFieldFromLablePtr( iSkillID, "_GlobalSkillGroup" )->GetInteger();
if( 0 < iGlobalSkillGroupID )
{
for( DWORD i = 0; i < GetSkillCount(); ++i )
{
DnSkillHandle hExistSkill = GetSkillFromIndex( i );
if( hExistSkill &&
hExistSkill->GetGlobalSkillGroupID() == iGlobalSkillGroupID )
{
bResult = true;
break;
}
}
}
return bResult;
}
#ifdef PRE_FIX_GAMESERVER_PERFOMANCE
bool CDnPlayerActor::IsAllowCallSkillProcess( float fDelta )
{
return m_FrameSkipCallSkillProcess.Update( fDelta );
}
#endif // #ifdef PRE_FIX_GAMESERVER_PERFOMANCE
void CDnPlayerActor::RemoveAllBubbles( bool bRemoveEvent )
{
if( m_pBubbleSystem )
m_pBubbleSystem->RemoveAllBubbles( bRemoveEvent );
}
void CDnPlayerActor::ApplyEnchantSkillOnceFromBubble( int iTargetSkillID, int iEnchantSkillID )
{
DnSkillHandle hEnchantSkill;
map<int, DnSkillHandle>::iterator iter = m_mapEnchantSkillFromBubble.find( iEnchantSkillID );
if( m_mapEnchantSkillFromBubble.end() != iter )
{
hEnchantSkill = iter->second;
}
else
{
// pvp/pve <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
hEnchantSkill = CDnSkill::CreateSkill( GetMySmartPtr(), iEnchantSkillID, 1 );
m_mapEnchantSkillFromBubble.insert( make_pair(iEnchantSkillID, hEnchantSkill) );
}
DnSkillHandle hTargetSkill = FindSkill( iTargetSkillID );
_ASSERT( hTargetSkill );
_ASSERT( hEnchantSkill );
if( hTargetSkill && hEnchantSkill )
{
// <20>̹<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
bool bIsEnchantedAlready = hTargetSkill->IsEnchantedSkill();
_ASSERT( false == bIsEnchantedAlready );
if( false == bIsEnchantedAlready )
{
hTargetSkill->ApplyEnchantSkillOnceFromBubble( hEnchantSkill );
}
}
}
bool CDnPlayerActor::OnApplySpectator(bool bEnable)
{
CDNGameRoom* pGameRoom = GetGameRoom();
if( pGameRoom == NULL || pGameRoom->bIsPvPRoom() == false || pGameRoom->GetPvPGameMode()->bIsAllKillMode() == false )
return false;
if( bEnable )
{
if( IsProcessSkill() )
CancelUsingSkill();
if(IsBattleMode())
SetBattleMode(false);
}
return true;
}
bool CDnPlayerActor::IsSpectatorMode()
{
return IsAppliedThisStateBlow(STATE_BLOW::BLOW_230);
}
void CDnPlayerActor::ChangeSkillLevelUp(int nSkillID, int nOrigLevel)
{
if( IsProcessSkill() )
return;
DnSkillHandle hSkill = FindSkill(nSkillID);
if( hSkill )
{
if (hSkill->GetElapsedDelayTime() > 0.0f || hSkill->IsToggleOn())
return;
}
__super::ChangeSkillLevelUp(nSkillID, nOrigLevel);
DnSkillHandle hChangedSkill = FindSkill( nSkillID );
if( hChangedSkill )
{
ReplacementGlyph( hChangedSkill );
}
}
#if defined(PRE_ADD_TOTAL_LEVEL_SKILL)
void CDnPlayerActor::UpdateTotalLevel(int nLevel)
{
if (m_pTotalLevelSkillSystem)
{
m_pTotalLevelSkillSystem->SetTotalLevel(nLevel);
}
}
void CDnPlayerActor::UpdateTotalLevelByCharLevel()
{
if (m_pTotalLevelSkillSystem)
m_pTotalLevelSkillSystem->UpdateTotalLevel();
}
void CDnPlayerActor::AddTotalLevelSkill(int nSlotIndex, int nSkillID, bool isInitialize/* = false*/)
{
if (m_pTotalLevelSkillSystem)
{
DnSkillHandle hSkill = m_pTotalLevelSkillSystem->FindTotalLevelSkill(nSkillID);
if (!hSkill)
{
RemoveTotalLevelSkill(nSlotIndex);
return;
}
//<2F><><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>..
bool isActivateSlot = m_pTotalLevelSkillSystem->IsActivateSlot(nSlotIndex);
if (isActivateSlot == false)
return;
//PVE/PVP<56><50><EFBFBD><EFBFBD>..
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> pve/pvp <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
int iSkillLevelDataType = CDnSkill::PVE;
if( GetGameRoom()->bIsPvPRoom() )
iSkillLevelDataType = CDnSkill::PVP;
hSkill->SelectLevelDataType( iSkillLevelDataType );
m_pTotalLevelSkillSystem->AddTotalLevelSkill(nSlotIndex, hSkill, isInitialize);
}
}
void CDnPlayerActor::RemoveTotalLevelSkill(int nSlotIndex)
{
if (m_pTotalLevelSkillSystem)
{
m_pTotalLevelSkillSystem->RemoveTotallevelSkill(nSlotIndex);
}
}
void CDnPlayerActor::ActivateTotalLevelSkillSlot(int nSlotIndex, bool bActivate)
{
if (m_pTotalLevelSkillSystem)
m_pTotalLevelSkillSystem->ActivateTotalLevelSkillSlot(nSlotIndex, bActivate);
}
void CDnPlayerActor::ActivateTotalLevelSkillCashSlot(int nSlotIndex, bool bActivate, __time64_t tExpireDate)
{
if (m_pTotalLevelSkillSystem)
m_pTotalLevelSkillSystem->ActivateTotalLevelSkillCashSlot(nSlotIndex, bActivate, tExpireDate);
}
void CDnPlayerActor::OnLevelChange()
{
UpdateTotalLevelByCharLevel();
}
#endif // PRE_ADD_TOTAL_LEVEL_SKILL
void CDnPlayerActor::ApplyEventStateBlow()
{
int nAddStateEffectIndex = -1;
DnBlowHandle hBlow;
#ifdef PRE_ADD_WEEKLYEVENT
if (CDnWorld::GetInstance(GetRoom()).GetMapSubType() != EWorldEnum::MapSubTypeNest && !GetGameRoom()->bIsPvPRoom() )
{
bool bRfreshHP = false;
float fCurrentHpRatio = (float)GetHP() / (float)GetMaxHP();
int nThreadID = GetGameRoom()->GetServerID();
float fEventHp = g_pDataManager->GetWeeklyEventValuef(WeeklyEvent::Player, GetClassID(), WeeklyEvent::Event_1, nThreadID);
if (fEventHp != 0.f)
{
std::string strValue;
strValue.append(boost::lexical_cast<std::string>(fEventHp));
nAddStateEffectIndex = CmdAddStateEffect(NULL, STATE_BLOW::BLOW_058, -1, strValue.c_str(), false, true , true );
m_vecEventEffectList.push_back( nAddStateEffectIndex );
bRfreshHP = true;
}
float fEventAttack = g_pDataManager->GetWeeklyEventValuef(WeeklyEvent::Player, GetClassID(), WeeklyEvent::Event_2, nThreadID);
if (fEventAttack != 0.f)
{
std::string strValue;
strValue.append(boost::lexical_cast<std::string>(fEventAttack));
nAddStateEffectIndex = CmdAddStateEffect(NULL, STATE_BLOW::BLOW_002, -1, strValue.c_str(), false, true , true );
m_vecEventEffectList.push_back( nAddStateEffectIndex );
nAddStateEffectIndex = CmdAddStateEffect(NULL, STATE_BLOW::BLOW_029, -1, strValue.c_str(), false, true , true );
m_vecEventEffectList.push_back( nAddStateEffectIndex );
}
float fEventDefense = g_pDataManager->GetWeeklyEventValuef(WeeklyEvent::Player, GetClassID(), WeeklyEvent::Event_3, nThreadID);
if (fEventDefense != 0.f)
{
std::string strValue;
strValue.append(boost::lexical_cast<std::string>(fEventDefense));
nAddStateEffectIndex = CmdAddStateEffect(NULL, STATE_BLOW::BLOW_004, -1, strValue.c_str(), false, true , true );
m_vecEventEffectList.push_back( nAddStateEffectIndex );
nAddStateEffectIndex = CmdAddStateEffect(NULL, STATE_BLOW::BLOW_094, -1, strValue.c_str(), false, true , true );
m_vecEventEffectList.push_back( nAddStateEffectIndex );
}
if( bRfreshHP )
{
GetStateBlow()->Process( 0 , 0 );
CmdRefreshHPSP( (INT64)(GetMaxHP() * fCurrentHpRatio) , GetSP() );
}
}
#endif
}
void CDnPlayerActor::RemoveEventStateBlow()
{
for( DWORD index = 0; index < m_vecEventEffectList.size() ; ++index )
{
CmdRemoveStateEffectFromID( m_vecEventEffectList[index] );
}
m_vecEventEffectList.clear();
}
bool CDnPlayerActor::CheckSkillAction( const char *szActionName )
{
if( strstr( szActionName, "Skill_" )
|| strstr( szActionName, "ChargeShoot_" )
|| strstr( szActionName, "GuildSkill_" )
|| strstr( szActionName, "Throw_" )
|| strstr( szActionName, "Tumble_" )
|| strstr( szActionName, "AerialEvasion" ) )
{
return true;
}
return false;
}
void CDnPlayerActor::MakeEquipAndPassiveState( CDnState &State )
{
State.ResetState();
State = MakeEquipState();
CDnState BUFF_STATE;
BUFF_STATE.ResetState();
if( m_pStateBlow )
{
int nSize = m_pStateBlow->GetNumStateBlow();
for ( int i = 0 ; i < nSize ; i++ )
{
DnBlowHandle hBlow = m_pStateBlow->GetStateBlow(i);
if( hBlow &&
CDnCreateBlow::IsBasicBlow( hBlow->GetBlowIndex() ) == true &&
hBlow->GetParentSkillInfo() &&
hBlow->GetParentSkillInfo()->eSkillType == CDnSkill::SkillTypeEnum::Passive &&
hBlow->GetParentSkillInfo()->eDurationType == CDnSkill::DurationTypeEnum::Buff )
{
CDnBasicBlow *pBlow = static_cast<CDnBasicBlow*>(hBlow.GetPointer());
if( pBlow )
{
CDnState *pState = const_cast<CDnState*>(pBlow->GetState());
BUFF_STATE.MergeState( *pState, pState->GetValueType() );
}
}
}
}
State.MergeState( BUFF_STATE, ValueTypeAbsolute );
State.CalculateRatioValue( BUFF_STATE );
}
#ifdef PRE_ADD_COSTUME_SKILL
void CDnPlayerActor::RefreshCostumeSkill( int nSkillIndex, int nSkillLevel )
{
if( m_nCostumeSkillID == nSkillIndex )
return;
if( m_nCostumeSkillID > 0 )
RemoveSkill( m_nCostumeSkillID );
if( nSkillIndex > 0 )
{
AddSkill( nSkillIndex, nSkillLevel );
DnSkillHandle hSkill = FindSkill( nSkillIndex );
if( hSkill )
{
if( hSkill->GetSkillType() != CDnSkill::SkillTypeEnum::Active )
{
RemoveSkill( nSkillIndex );
return;
}
hSkill->OnBeginCoolTime();
}
}
m_nCostumeSkillID = nSkillIndex;
}
#endif // PRE_ADD_COSTUME_SKILL
#ifdef PRE_ADD_VEHICLE_SPECIAL_ACTION
void CDnPlayerActor::ReportInvalidAction()
{
if( m_pPlayerActionChecker )
((CDnPlayerActionChecker*)m_pPlayerActionChecker)->OnInvalidAction();
}
#endif