⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comunicationserver.cpp.svn-base

📁 絲路server源碼 Silk Road server source
💻 SVN-BASE
字号:


#include "StdAfx.h"
#pragma pack(push, 1)
typedef struct
{
	uint16 opcode;
	uint32 size;
}packet;
#pragma pack(pop)

VENICE_INLINE static void swap32(uint32* p) { *p = ((*p >> 24 & 0xff)) | ((*p >> 8) & 0xff00) | ((*p << 8) & 0xff0000) | (*p << 24); }


void CommServerSocket::HandleMappingReply(WorldPacket & recvData)
{
	/* this packet is gzipped, whee! :D */
	uint32 real_size;
	recvData >> real_size;
	uLongf rsize = real_size;

	ByteBuffer buf(real_size);
	buf.resize(real_size);

	if(uncompress((uint8*)buf.contents(), &rsize, recvData.contents() + 4, (u_long)recvData.size() - 4) != Z_OK)
	{
		printf("Uncompress of mapping failed.\n");
		return;
	}

	uint32 account_id;
	uint8 number_of_characters;
	uint32 count;
	uint32 realm_id;
	buf >> realm_id;
	Realm * realm = sInfoCore.GetRealm(realm_id);
	if(!realm)
		return;

	sInfoCore.getRealmLock().Acquire();

	HM_NAMESPACE::hash_map<uint32, uint8>::iterator itr;
	buf >> count;
	printf("Got mapping packet for realm %u, total of %u entries.\n", (unsigned int)realm_id, (unsigned int)count);
	for(uint32 i = 0; i < count; ++i)
	{
		buf >> account_id >> number_of_characters;
		itr = realm->CharacterMap.find(account_id);
		if(itr != realm->CharacterMap.end())
			itr->second = number_of_characters;
		else
			realm->CharacterMap.insert( make_pair( account_id, number_of_characters ) );
	}

	sInfoCore.getRealmLock().Release();
}

void CommServerSocket::HandleUpdateMapping(WorldPacket & recvData)
{
	uint32 realm_id;
	uint32 account_id;
	uint8 chars_to_add;
	recvData >> realm_id;

	Realm * realm = sInfoCore.GetRealm(realm_id);
	if(!realm)
		return;
	
	sInfoCore.getRealmLock().Acquire();
	recvData >> account_id >> chars_to_add;

	HM_NAMESPACE::hash_map<uint32, uint8>::iterator itr = realm->CharacterMap.find(account_id);
	if(itr != realm->CharacterMap.end())
		itr->second += chars_to_add;
	else
		realm->CharacterMap.insert( make_pair( account_id, chars_to_add ) );

	sInfoCore.getRealmLock().Release();
}

void CommServerSocket::HandleTestConsoleLogin(WorldPacket & recvData)
{
	WorldPacket data(RSMSG_CONSOLE_LOGIN_RESULT, 8);
	uint32 request;
	string accountname;
	uint8 key[20];

	recvData >> request;
	recvData >> accountname;
	recvData.read(key, 20);

	data << request;

	Account * pAccount = sAccountMgr.GetAccount(accountname);
	if(pAccount == NULL)
	{
		data << uint32(0);
		SendPacket(&data);
		return;
	}

	if(pAccount->GMFlags == NULL || strchr(pAccount->GMFlags, 'z') == NULL)
	{
		data << uint32(0);
		SendPacket(&data);
		return;
	}

	if(memcmp(pAccount->SrpHash, key, 20) != 0)
	{
		data << uint32(0);
		SendPacket(&data);
		return;
	}

	data << uint32(1);
	SendPacket(&data);
}

void CommServerSocket::HandleDatabaseModify(WorldPacket& recvData)
{
	uint32 method;
	recvData >> method;

	switch(method)
	{
	case 1:			// set account ban
		{
			string account;
			uint32 duration;
			recvData >> account >> duration;

			// remember we expect this in uppercase
			VENICE_TOUPPER(account);

			Account * pAccount = sAccountMgr.GetAccount(account);
			if( pAccount == NULL )
				return;

			pAccount->Banned = duration;

			// update it in the sql (duh)
			sSQL->Execute("UPDATE accounts SET banned = %u WHERE login = \"%s\"", duration, sSQL->EscapeString(account).c_str());

		}break;

	case 2:		// set gm
		{
			string account;
			string gm;
			recvData >> account >> gm;

			// remember we expect this in uppercase
			VENICE_TOUPPER(account);

			Account * pAccount = sAccountMgr.GetAccount(account);
			if( pAccount == NULL )
				return;

			pAccount->SetGMFlags( account.c_str() );

			// update it in the sql (duh)
			sSQL->Execute("UPDATE accounts SET gm = \"%s\" WHERE login = \"%s\"", sSQL->EscapeString(gm).c_str(), sSQL->EscapeString(account).c_str());

		}break;

	case 3:		// set mute
		{
			string account;
			uint32 duration;
			recvData >> account >> duration;

			// remember we expect this in uppercase
			VENICE_TOUPPER(account);

			Account * pAccount = sAccountMgr.GetAccount(account);
			if( pAccount == NULL )
				return;

			pAccount->Muted = duration;

			// update it in the sql (duh)
			sSQL->Execute("UPDATE accounts SET muted = %u WHERE login = \"%s\"", duration, sSQL->EscapeString(account).c_str());
		}break;

	case 4:		// ip ban add
		{
			string ip;
			uint32 duration;

			recvData >> ip >> duration;

			if( sIPBanner.Add( ip.c_str(), duration ) )
				sSQL->Execute("INSERT INTO ipbans VALUES(\"%s\", %u)", sSQL->EscapeString(ip).c_str(), duration);
			
		}break;

	case 5:		// ip ban reomve
		{
			string ip;
			recvData >> ip;

			if( sIPBanner.Remove( ip.c_str() ) )
				sSQL->Execute("DELETE FROM ipbans WHERE ip = \"%s\"", sSQL->EscapeString(ip).c_str());

		}break;

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -