Ejemplo n.º 1
0
            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();
            }
Ejemplo n.º 2
0
            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);
                }
            }
Ejemplo n.º 3
0
            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();
            }
Ejemplo n.º 4
0
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 );
	}
}