Ejemplo n.º 1
0
void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim)
{
	if (pkChr->IsDead() || pkVictim->IsDead())
		return;

	CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID());

	CPVP * pkPVP;

	if ((pkPVP = Find(kPVP.m_dwCRC)))
	{
		// 복수할 수 있으면 바로 싸움!
		if (pkPVP->Agree(pkChr->GetPlayerID()))
		{
			pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkChr->GetName());
			pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkVictim->GetName());
		}
		return;
	}

	pkPVP = M2_NEW CPVP(kPVP);

	pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID());
	pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID());

	m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP));

	m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP);
	m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP);

	pkPVP->Packet();

	char msg[CHAT_MAX_LEN + 1];
	snprintf(msg, sizeof(msg), LC_TEXT("%s님이 대결신청을 했습니다. 승낙하려면 대결동의를 하세요."), pkChr->GetName());

	pkVictim->ChatPacket(CHAT_TYPE_INFO, msg);
	pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에게 대결신청을 했습니다."), pkVictim->GetName());

	// NOTIFY_PVP_MESSAGE
	LPDESC pkVictimDesc = pkVictim->GetDesc();
	if (pkVictimDesc)
	{
		TPacketGCWhisper pack;

		int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1);

		pack.bHeader = HEADER_GC_WHISPER;
		pack.wSize = sizeof(TPacketGCWhisper) + len;
		pack.bType = WHISPER_TYPE_SYSTEM;
		strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom));

		TEMP_BUFFER buf;

		buf.write(&pack, sizeof(TPacketGCWhisper));
		buf.write(msg, len);

		pkVictimDesc->Packet(buf.read_peek(), buf.size());
	}	
	// END_OF_NOTIFY_PVP_MESSAGE
}
Ejemplo n.º 2
0
void CWarMap::SendScorePacket(BYTE bIdx, LPDESC d)
{
	TPacketGCGuild p;

	p.header = HEADER_GC_GUILD;
	p.subheader = GUILD_SUBHEADER_GC_WAR_SCORE;
	p.size = sizeof(p) + sizeof(DWORD) + sizeof(DWORD) + sizeof(long);

	TEMP_BUFFER buf;
	buf.write(&p, sizeof(p));
	buf.write(&m_TeamData[bIdx].dwID, sizeof(DWORD));
	buf.write(&m_TeamData[bIdx ? 0 : 1].dwID, sizeof(DWORD));
	buf.write(&m_TeamData[bIdx].iScore, sizeof(long));

	if (d)
		d->Packet(buf.read_peek(), buf.size());
	else
		Packet(buf.read_peek(), buf.size());
}
Ejemplo n.º 3
0
void CManager::SendLandList(LPDESC d, long lMapIndex)
{
	TLandPacketElement e;

	TEMP_BUFFER buf;

	WORD wCount = 0;

	itertype(m_map_pkLand) it = m_map_pkLand.begin();

	while (it != m_map_pkLand.end())
	{
		CLand * pkLand = (it++)->second;
		const TLand & r = pkLand->GetData();

		if (r.lMapIndex != lMapIndex)
			continue;

		//
		LPCHARACTER ch  = d->GetCharacter();
		if (ch)
		{
			CGuild *guild = CGuildManager::instance().FindGuild(r.dwGuildID);
			ch->SendGuildName(guild);
		}
		//

		e.dwID = r.dwID;
		e.x = r.x;
		e.y = r.y;
		e.width = r.width;
		e.height = r.height;
		e.dwGuildID = r.dwGuildID;

		buf.write(&e, sizeof(TLandPacketElement));
		++wCount;
	}

	sys_log(0, "SendLandList map %d count %u elem_size: %d", lMapIndex, wCount, buf.size());

	if (wCount != 0)
	{
		TPacketGCLandList p;

		p.header = HEADER_GC_LAND_LIST;
		p.size = sizeof(TPacketGCLandList) + buf.size();

		d->BufferedPacket(&p, sizeof(TPacketGCLandList));
		d->Packet(buf.read_peek(), buf.size());
	}
}
Ejemplo n.º 4
0
	void PC::SendQuestInfoPakcet()
	{
		assert(m_iSendToClient);
		assert(m_RunningQuestState);

		packet_quest_info qi;

		qi.header = HEADER_GC_QUEST_INFO;
		qi.size = sizeof(struct packet_quest_info);
		qi.index = m_RunningQuestState->iIndex;
		qi.flag = m_iSendToClient;

		TEMP_BUFFER buf;
		buf.write(&qi, sizeof(qi));

		if (m_iSendToClient & QUEST_SEND_ISBEGIN)
		{
			BYTE temp = m_RunningQuestState->bStart?1:0;
			buf.write(&temp,1);		
			qi.size+=1;

			sys_log(1, "QUEST BeginFlag %d", (int)temp);
		}
		if (m_iSendToClient & QUEST_SEND_TITLE)
		{
			m_RunningQuestState->_title.reserve(30+1);
			buf.write(m_RunningQuestState->_title.c_str(), 30+1);
			qi.size+=30+1;

			sys_log(1, "QUEST Title %s", m_RunningQuestState->_title.c_str());
		}
		if (m_iSendToClient & QUEST_SEND_CLOCK_NAME)
		{
			m_RunningQuestState->_clock_name.reserve(16+1);
			buf.write(m_RunningQuestState->_clock_name.c_str(), 16+1);
			qi.size+=16+1;

			sys_log(1, "QUEST Clock Name %s", m_RunningQuestState->_clock_name.c_str());
		}
		if (m_iSendToClient & QUEST_SEND_CLOCK_VALUE)
		{
			buf.write(&m_RunningQuestState->_clock_value, sizeof(int));
			qi.size+=4;

			sys_log(1, "QUEST Clock Value %d", m_RunningQuestState->_clock_value);
		}
		if (m_iSendToClient & QUEST_SEND_COUNTER_NAME)
		{
			m_RunningQuestState->_counter_name.reserve(16+1);
			buf.write(m_RunningQuestState->_counter_name.c_str(), 16+1);
			qi.size+=16+1;

			sys_log(1, "QUEST Counter Name %s", m_RunningQuestState->_counter_name.c_str());
		}
		if (m_iSendToClient & QUEST_SEND_COUNTER_VALUE)
		{
			buf.write(&m_RunningQuestState->_counter_value, sizeof(int));
			qi.size+=4;

			sys_log(1, "QUEST Counter Value %d", m_RunningQuestState->_counter_value);
		}
		if (m_iSendToClient & QUEST_SEND_ICON_FILE)
		{
			m_RunningQuestState->_icon_file.reserve(24+1);
			buf.write(m_RunningQuestState->_icon_file.c_str(), 24+1);
			qi.size+=24+1;

			sys_log(1, "QUEST Icon File %s", m_RunningQuestState->_icon_file.c_str());
		}

		CQuestManager::instance().GetCurrentCharacterPtr()->GetDesc()->Packet(buf.read_peek(),buf.size());

		m_iSendToClient = 0;

	}
Ejemplo n.º 5
0
void CLIENT_DESC::SetPhase(int iPhase)
{
    switch (iPhase)
    {
    case PHASE_CLIENT_CONNECTING:
        sys_log(1, "PHASE_CLIENT_DESC::CONNECTING");
        m_pInputProcessor = NULL;
        break;

    case PHASE_DBCLIENT:
    {
        sys_log(1, "PHASE_DBCLIENT");

        if (!g_bAuthServer)
        {
            static bool bSentBoot = false;

            if (!bSentBoot)
            {
                bSentBoot = true;
                TPacketGDBoot p;
                p.dwItemIDRange[0] = 0;
                p.dwItemIDRange[1] = 0;
                memcpy(p.szIP, g_szPublicIP, 16);
                DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p));
            }
        }

        TEMP_BUFFER buf;

        TPacketGDSetup p;

        memset(&p, 0, sizeof(p));
        strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP));

        if (!g_bAuthServer)
        {
            p.bChannel	= g_bChannel;
            p.wListenPort = mother_port;
            p.wP2PPort	= p2p_port;
            p.bAuthServer = false;
            map_allow_copy(p.alMaps, 32);

            const DESC_MANAGER::DESC_SET & c_set = DESC_MANAGER::instance().GetClientSet();
            DESC_MANAGER::DESC_SET::const_iterator it;

            for (it = c_set.begin(); it != c_set.end(); ++it)
            {
                LPDESC d = *it;

                if (d->GetAccountTable().id != 0)
                    ++p.dwLoginCount;
            }

            buf.write(&p, sizeof(p));

            if (p.dwLoginCount)
            {
                TPacketLoginOnSetup pck;

                for (it = c_set.begin(); it != c_set.end(); ++it)
                {
                    LPDESC d = *it;

                    TAccountTable & r = d->GetAccountTable();

                    if (r.id != 0)
                    {
                        pck.dwID = r.id;
                        strlcpy(pck.szLogin, r.login, sizeof(pck.szLogin));
                        strlcpy(pck.szSocialID, r.social_id, sizeof(pck.szSocialID));
                        strlcpy(pck.szHost, d->GetHostName(), sizeof(pck.szHost));
                        pck.dwLoginKey = d->GetLoginKey();
#ifndef _IMPROVED_PACKET_ENCRYPTION_
                        thecore_memcpy(pck.adwClientKey, d->GetDecryptionKey(), 16);
#endif

                        buf.write(&pck, sizeof(TPacketLoginOnSetup));
                    }
                }
            }

            sys_log(0, "DB_SETUP current user %d size %d", p.dwLoginCount, buf.size());

            // 파티를 처리할 수 있게 됨.
            CPartyManager::instance().EnablePCParty();
            //CPartyManager::instance().SendPartyToDB();
        }
        else
        {
            p.bAuthServer = true;
            buf.write(&p, sizeof(p));
        }

        DBPacket(HEADER_GD_SETUP, 0, buf.read_peek(), buf.size());
        m_pInputProcessor = &m_inputDB;
    }
    break;

    case PHASE_P2P:
        sys_log(1, "PHASE_P2P");

        if (m_lpInputBuffer)
            buffer_reset(m_lpInputBuffer);

        if (m_lpOutputBuffer)
            buffer_reset(m_lpOutputBuffer);

        m_pInputProcessor = &m_inputP2P;
        break;

    case PHASE_CLOSE:
        m_pInputProcessor = NULL;
        break;

    case PHASE_TEEN:
        m_inputTeen.SetStep(0);
        m_pInputProcessor = &m_inputTeen;
        break;

    }

    m_iPhase = iPhase;
}