void JustDied(Unit* killer) { me->AI()->Talk(SAY_DEATH); SetPlatform(GOBJECT_DOODAD_EXIT_FROM_DURUMU, true); SetPlatform(GOBJECT_DOODAD_ENTER_TO_DURUMU, true); if (instance) { instance->SetBossState(DATA_DURUMU_THE_FORGOTTEN, DONE); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); // Remove. instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RED_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RED_BEAM_DMG); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLUE_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLUE_BEAM_DMG); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_YELLOW_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_YELLOW_BEAM_DMG); } _JustDied(); }
void EnterCombat(Unit* attacker) { SetPlatform(GOBJECT_DOODAD_ENTER_TO_DURUMU, false); me->AI()->Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_HARD_STARE, 5000); events.ScheduleEvent(EVENT_GAZE, 2000); events.ScheduleEvent(EVENT_BERSERK, 600000); events.ScheduleEvent(EVENT_LIGHT_SPECTRUM_SAY_SUMMON, 40000); SummonEyes(); if (instance) { instance->SetBossState(DATA_DURUMU_THE_FORGOTTEN, IN_PROGRESS); instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); } }
void Reset() { if (instance) { instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RED_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_RED_BEAM_DMG); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLUE_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLUE_BEAM_DMG); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_YELLOW_BEAM); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_YELLOW_BEAM_DMG); } SetPlatform(GOBJECT_DOODAD_ENTER_TO_DURUMU, true); events.Reset(); _Reset(); }
void XClientConnection::RecvLogin( XPacket& p ) { MAIN->m_fpsFromClient.Process(); ID idAccount; int verCGPK; char c0; TCHAR szSessionKey[256]; p >> verCGPK; // 클라의 프로토콜 버전(클라<->게임서버간) p >> idAccount; p.ReadString( szSessionKey ); p >> c0; auto platform = (XGAME::xtPlatform)c0; p >> c0; p >> c0; p >> c0; // 프로퍼티 시리얼라이즈 #ifdef _XPROP_SERIALIZE if( XE::IsEmpty(szSessionKey) ) { XPacket ar( (ID)xCL2GS_PROP_SERIALIZE ); XGame::sGet()->ArchivingProp( ar ); Send( ar ); } #endif // _XPROP_SERIALIZE // 로긴서버로부터 받은 계정중에 내 아이디가 있는지 찾는다. auto pGame = GetGame(); auto pAccLogin = pGame->FindLoginAccount( idAccount ); if( !pAccLogin ) { pGame->AddLoginAccount( idAccount, nullptr ); pAccLogin = pGame->FindLoginAccount( idAccount ); } if( XBREAK( pAccLogin == nullptr ) ) return; if( pAccLogin->m_spAcc ) { // 아직 계정데이타가 도착 안함. auto spAccount = pAccLogin->m_spAcc; spAccount->SetverCGPK( verCGPK ); // 유저객체 만들고 로그인 성공시킴 auto spGameUser = CreateUserObj( idAccount, spAccount, FALSE ); GetGame()->DelLoginAccount( idAccount ); // XPacket ar( (ID)xCL2GS_ACCOUNT_SUCCESS_LOGIN, true, 0x10000 ); XTRACE("%s", __TFUNC__); // reserved XBREAK( XGC->m_apPerOnce > 255 ); ar << (BYTE)XGC->m_apPerOnce; ar << (BYTE)m_CryptObj.GetkeyPrivate(); ar << (WORD)0; for( int i = 0; i < 16; ++i ) ar << (DWORD)0; XArchive arAcc(0x10000); spAccount->Serialize( arAcc ); ar << arAcc; // 암호를 해제할수 있는 랜덤키를 먼저 보냄 m_CryptObj.SerializeKeyTable( ar ); // 퍼블릭키를 암호화해서 보냄. // BYTE cBuff[ 4096 ]; // int sizeBuff; // sizeBuff = XMain::sGet()->GetPublicKeyWithEncrypted( cBuff ); // ar.WriteBuffer( cBuff, sizeBuff ); // ar << XMain::sGet()->GetstrPublicKey(); Send( ar ); ///< 클라에 계정정보를 보낸후 처리할일들을 한다. spGameUser->SetPlatform( platform ); spGameUser->SuccessLoginAfterSend(); MAIN->m_fpsToClientOk.Process(); } else { ++pAccLogin->m_cntTry; XBREAK( pAccLogin->m_cntTry > 5 ); // 서버에서 직접끊는게 아니라 이런경우가 있을수도 있을듯. // 로긴서버로부터 아직 계정정보가 도착안했다 XTRACE( "idAcc:%d 의 계정정보가 로긴서버로부터 아직 도착하지 않음", idAccount ); const bool bToLogin = (pAccLogin->m_cntTry >= 3); OnAccountInfoNotYetFromLoginSvr( idAccount, bToLogin ); // 3번시도했는데도 없으면 로긴서버부터 다시 접속하게 하고 삭제시킴 if( bToLogin ) pGame->DelLoginAccount( idAccount ); } }