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

📄 menuserver2.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "..\stdafx.h"
#include "..\LowerLayers\servertable.h"
#include "..\LowerLayers\recvmsg.h"
#include "..\LowerLayers\mylog.h"
#include "DefaultHeader.h"
#include "MenuDefine.h"
#include "ItemList.h"
#include "CItem.h"
#include "Scrp_exe.h"
#include "SealStone.h"
#include "SealStonegameserver.h"
#include "op_magic.h"
#include "map.h"
#include "teambattle.h"
#include "LTSSupport.h"
#include "dungeon.h"
#include "eventmgr.h" 
#include "LogManager.h"
#include "ArenaManager.h"
#include "UserManager.h"

void SendSaveEventItem( CHARLIST *ch, int item_no, int count )
{
	t_packet packet;
	packet.h.header.type = CMD_ADD_EVENT_ITEM;
	packet.u.kein.save_event_item.item_no = item_no;
	packet.u.kein.save_event_item.count = count;
	strcpy( packet.u.kein.save_event_item.name, ch->Name );
	packet.h.header.size = sizeof( k_save_event_item ) - 20 + strlen( ch->Name )+1 ;
	QueuePacket( connections, DB_DEMON, &packet, 1 );
}

void RecvOXSelect( t_packet *p, short int cn )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	SetOXSelect( ch,p->u.kein.default_char ); 
	return;
}

void SetOXSelect( CHARLIST *ch, int type )
{
	ch->ox_select = type;
}

void RecvOXAnser( t_packet *p, short int cn )
{	//< CSD-CN-031213
	const int type = p->u.kein.default_char;

	CUserManager::HASH_USER mpUser = g_pUserManager->GetUserSet();

	for (CUserManager::ITOR_USER i = mpUser.begin(); i != mpUser.end(); ++i)
	{
		const int idUser = i->second;

		if (idUser == cn)
		{
			continue;
		}

		CHARLIST* pUser = CheckServerId(idUser);
		
		if (pUser == NULL)
		{
			continue;
		}

		if (pUser->IsCounselor() || pUser->IsReporter())
		{
			continue;
		}

		if (pUser->ox_select == type) 
		{
			continue;
		}

		MapMove(idUser, "G_BATTLE", 140, 100);	// 030929 kyo
	}
}	//> CSD-CN-031213

// 捞 甘俊 乐绰 葛电 蜡历甫 瘤沥茄 镑栏肺 甘捞悼 矫挪促.
// type == 1 捞搁 扁磊唱, 款康磊绰 巢变促.
int UserAllMapMove( int type, char *map_name, int x, int y )
{	//< CSD-CN-031213
	if (strcmp(map_name, MapName) == 0)
	{
		return 0;
	}

	if (GetMapMoveType(map_name) == MMT_FAIL)
	{	// 绝绰 甘捞促.
		return 0;
	}

	CUserManager::HASH_USER mpUser = g_pUserManager->GetUserSet();

	for (CUserManager::ITOR_USER i = mpUser.begin(); i != mpUser.end(); ++i)
	{
		const int idUser = i->second;
		CHARLIST* pUser = CheckServerId(idUser);
		
		if (pUser != NULL)
		{
			if (type == 1)
			{
				if (pUser->IsCounselor() || pUser->IsReporter()) 
				{
					continue;
				}
			}

			MapMove(idUser, map_name, x, y);
		}
	}

	return 1;
}	//> CSD-CN-031213

void RecvCheckSkill( short int cn )
{
	CHARLIST *ch= CheckServerId( cn );
	if( !ch ) return;

	// 堪祸 扁贱阑 硅奎栏搁 捣阑 霖促.
	if( ch->Skill[46] )
	{
		ch->IncBankMoney(50000, BMCT_SKILL_RESET); // CSD-030723
		ch->Skill[46] = 0;
		SendPutMenuString( KM_BBS, 121, cn ); // 堪祸窍扁 胶懦阑 昏力沁嚼聪促.
	}	
}


void DeleteMenuData()
{

	// 辆丰矫 橇府矫虐绰 镑..

}

void RecvPutGuildItem( t_packet *p, short int cn )
{	//< CSD-030324
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	POS pos = p->u.kein.default_pos;
	ItemAttr *pItem = GetItemByPOS( ch, pos );
	if( !pItem ) return;
	if( !pItem->item_no ) return;
	if( !ch->GetGuildCode() ) return;		// 辨靛啊 绝促.
	//if( ch->name_status.guild_master ) return;		// 辨靛郴 殿鞭 力距阑 窍妨搁 咯扁辑

	t_packet packet;
	packet.h.header.type = CMD_PUT_GUILD_ITEM;
		packet.u.kein.put_guild_item.item = *pItem;
		packet.u.kein.put_guild_item.guild_code = ch->GetGuildCode();
		strcpy( packet.u.kein.put_guild_item.name, ch->Name );
	packet.h.header.size = sizeof( k_put_guild_item );
	QueuePacket( connections, DB_DEMON, &packet, 1 );	// DB俊 历厘茄促.

	//021030 YGI
	SendItemEventLog( pItem, cn, SN_NOT_USER, SILT_PUT_GUILD_BOX, 1 ); // 021018 YGI

	// 酒捞袍阑 瘤快绊
	memset( pItem, 0, sizeof( ItemAttr ) );
	// 历厘茄 荤角阑 努扼捞攫飘俊 焊郴霖促.
	SendPutMenuString( KM_OK, 132, cn );		// 焊包登菌嚼聪促.
}	//> CSD-030324

void RecvGetGuildItemClient( t_packet *p, short int cn )
{	//< CSD-030324
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

//	if( !ch->GetGuildCode() ) return;
//	int degree = ch->name_status.guild_master;
//	if( !degree || degree > 2 ) return;		// 1苞 2父 荤侩 啊瓷
	if( !CheckGuildPower( GDP_GUILD_BOX, ch ) ) return;

	DWORD index = p->u.kein.default_dword;
	t_packet packet;
	packet.h.header.type = CMD_GET_GUILD_ITEM_MAP;

		packet.u.kein.get_guild_item_map.server_id = cn;
		packet.u.kein.get_guild_item_map.guild_code = ch->GetGuildCode();
		packet.u.kein.get_guild_item_map.index = index;

	packet.h.header.size = sizeof( k_get_guild_item_map );
	QueuePacket( connections, DB_DEMON, &packet, 1 );	// DB俊辑 秦搬
}	//> CSD-030324

// 叼厚 单阁俊辑 酒捞袍阑 波郴 吭促.
void RecvGetGuildItemMap( t_packet *p )
{
	int server_id = p->u.kein.get_guild_item_db.server_id;
	ItemAttr *pItem = &p->u.kein.get_guild_item_db.item;

	CHARLIST *ch = CheckServerId( server_id );
	if( !ch ) return;

	//021030 YGI
	SendItemEventLog( pItem, server_id, SN_NOT_USER, SILT_GET_GUILD_BOX, 3 ); // 021018 YGI
	MoveEmptyInv( pItem, ch );
}

void RecvChangeGuildMaster(short int cn)
{	//< CSD-030326
	CHARLIST* ch = CheckServerId(cn);
	if (!ch)  return;

	int guild_code = ch->GetGuildCode();
	const int guild_master = ch->name_status.guild_master;
	
	if (guild_code <= 0 || guild_master != 1) 
	{
		return;		// 辨靛 付胶磐啊 酒聪促.
	}

	SendPacketDefault(CMD_CHANGE_GUILD_MASTER, &guild_code, sizeof(short int), DB_DEMON);
	ch->name_status.guild_master = 0;		// 辨靛 付胶磐
	SendChangeGuildDegree(cn, guild_code, 0, cn);
	SendPutMenuString(KM_OK, 178, cn);
}	//> CSD-030326

// 辨靛盔 沥焊甫 函版
void SendChangeGuildDegree( int server_id, int guild_code, int guild_degree, short int cn )
{
	t_packet packet;

	packet.h.header.type = CMD_CHANGE_GUILD_MASTER;
		packet.u.kein.change_guild_degree.server_id = server_id;
		packet.u.kein.change_guild_degree.guild_code = guild_code;
		packet.u.kein.change_guild_degree.degree = guild_degree;
	packet.h.header.size = sizeof( k_change_guild_degree );
	QueuePacket( connections, cn, &packet, 1 );
	CastMe2Other( cn, &packet );
}

// 辨付啊 官布促.
void RecvChangeGuildMasterAllMap( t_packet *p )
{	//< CSD-030324
	char *name = p->u.kein.default_name;
	int cn = ExistHe( name );
	if( cn <= 0 ) return;

	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	ch->name_status.guild_master = 1;
	SendChangeGuildDegree( cn, ch->GetGuildCode(), ch->name_status.guild_master, cn );
}	//> CSD-030324

int GetDegree2Param( int degree )		// degree 蔼阑 颇扼皋磐肺 函版茄促.
{
	static degree2param[] = { 4, 0, 1, 2, 3 };
	return degree2param[degree];
}

// 020620 YGI
bool CheckGuildPower( int type, CHARLIST *ch )
{	//< CSD-030324
	if( !ch ) return 0;
	if( !ch->GetGuildCode() ) return 0;
	if( type < 0 || type > GDP_MAX ) return 0;
	
	static power_table[][5] = 
	{
		{ 1, 1, 0, 0, 0 },		// 辨靛 啊涝				// GDP_JOINING
		{ 1, 1, 0, 0, 0 },		// 辨靛 傈眉 皋矫瘤			// GDP_BBS
		{ 1, 0, 0, 0, 0 },		// 辨靛盔 流氓函版			// GDP_CHANGE_DEGREE  // 020620 YGI
		{ 1, 1, 0, 0, 0 },		// 辨靛 芒绊 捞侩			// GDP_GUILD_BOX
		{ 1, 1, 0, 0, 0 },		// 碍力 辨靛 呕硼 矫虐扁	// GDP_EXIT_GUILD_HIM
		{ 1, 0, 0, 0, 0 },		// 辨靛 付农 函版			// GDP_CHANGE_MARK
		{ 1, 0, 0, 0, 0 },		// 辨靛 流氓 疙 函版		// GDP_CHANGE_DEGREE_INFO
		{ 1, 0, 0, 0, 0 },		// 辨靛 付胶磐 函版			// GDP_GUILD_CHANGE_MASTER
		{ 1, 0, 0, 0, 0 },		// 辨靛 力芭				// GDP_GUILD_BREAK
		{ 1, 0, 0, 0, 0 },		// 何辨付 殿废				// GDP_REGIST_SUB_MASTER
		{ 0, 1, 1, 1, 1 },		// 胶胶肺 辨靛 呕硼			// GDP_EXIT_GUILD_SELF
		{ 1, 0, 0, 0, 0 },		// 骏器府酒 备涝			// GDP_BUY_GUILD_HOUSE
	};

	int para = GetDegree2Param( ch->name_status.guild_master );
	return ((power_table[type][para])?true:false);
}	//> CSD-030324

void RecvGetNationItem( short int cn )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	t_packet packet;
	packet.h.header.type = CMD_GET_NATION_ITEM;
		packet.u.kein.nation_item.item_no = g_nation_item.item_no;
		if( g_nation_item.money > 0 )
		{
			packet.u.kein.nation_item.give_type = 0;		// money_type
			packet.u.kein.nation_item.give_much = g_nation_item.money;
		}
		else
		{
			packet.u.kein.nation_item.give_type = 1;		// money_type
			packet.u.kein.nation_item.give_much = g_nation_item.fame;
		}
	packet.h.header.size = sizeof( k_nation_item );
	QueuePacket( connections, cn, &packet, 1 );
}

extern void SaveChangeNationItem(CHARLIST* pTarget, int type, ItemAttr* item); // CSD-040224

void RecvBuyNationItem( short int cn )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	int ret = 0;
	if( g_nation_item.money > 0 )
	{
		if( ch->Money< g_nation_item.money )
		{
			// 捣捞 何练窍促. 
			ret = 2;
		}
		else
		{
			// 021209 YGI
			if( SubtractMoney( g_nation_item.money, ch ) == 1 )
			{
				ItemAttr item = GenerateItem( g_nation_item.item_no);
				SendItemEventLog( &item, cn, SN_NOT_USER, SILT_BUY_NATION_ITEM_MONEY, 100 );
				SaveChangeNationItem(ch, 0, &item);	// CSD-040224
				MoveEmptyInv( &item, ch );
				SendNationMoney( NM_ADD, ch->name_status.nation, g_nation_item.money); // 惫绊甫 函拳矫挪促.
				ret = 1;
			}
			else
			{
				ret = 2;
			}
		}
	}
	else
	{
		if( ch->fame - g_nation_item.fame < 1000 )
		{
			// 疙己摹啊 何练窍促.
			ret = 3;
		}
		else
		{
			// 021209 YGI
			ret = 1;
			SaveChangeFame(ch,ch->fame,ch->fame-g_nation_item.fame,LF_ITEMBUY);
			ch->fame -= g_nation_item.fame;
			ItemAttr item = GenerateItem( g_nation_item.item_no);
			SendItemEventLog( &item, cn, SN_NOT_USER, SILT_BUY_NATION_ITEM_FAME, 100 );
			SaveChangeNationItem(ch, 1, &item);	// CSD-040224
			MoveEmptyInv( &item, ch );
		}
	}

	t_packet packet;
	packet.h.header.type = CMD_BUY_NATION_ITEM_OK;
		packet.u.kein.default_char = ret;
	packet.h.header.size = sizeof( char );
	QueuePacket( connections, cn, &packet, 1 );	
}

void RecvCheckColossusMap(t_packet *p, short int cn)
{	//< CSD-TW-030701
	CHARLIST* pTarget = CheckServerId(cn);
		
	if (pTarget == NULL)
	{
		return;
	}

	CArenaInfo* pArenaInfo = g_pArenaManager->GetArenaInfo(g_MapPort);

	if (pArenaInfo == NULL)
	{
		return;
	}

	CArenaManager::HASH_GAME mpArena = g_pArenaManager->GetGameSet();

	for (CArenaManager::ITOR_GAME i = mpArena.begin(); i != mpArena.end(); ++i)
	{
		CBaseArena* pGame = i->second;
		pGame->SendGameInfo(pTarget, g_MapPort);
	}
}	//> CSD-TW-030701

// 021107 YGI
void SendPacket2Map( t_packet *p, int port )
{
	if( port != ST_SEND_MAP_ALL	)
	{
		if( port == GetOwnPort() )	// 鞍篮 甘栏肺 焊尘 版快
		{
			HandleCommand( CN_FROM_OTHER_MAPSERVER_MSG, p );
		}
		else
		{
			g_pServerTable->SendRajaPacketToOtherMapServer( port, (char *)p, p->h.header.size+sizeof(t_header) );
		}
	}
	else // all
		g_pServerTable->BroadCastToEveryServer((char *)p, p->h.header.size+sizeof(t_header),SERVER_TYPE_MAP);		
}

void RecvInviteColossus( t_packet *p, short int cn )
{	//< CSD-030509
	CHARLIST* ch = CheckServerId(cn);
	
	if (ch == NULL)
	{
		return;
	}

	CBaseArena* pGame = ch->GetJoinArenaGame();

	if (pGame == NULL)
	{
		return;
	}
	// 规厘父 荤侩且 荐 乐绰 疙飞绢
	if (pGame->GetLeader() != ch) 
	{
		return;		
	}
	
	t_packet packet;
	packet.h.header.type = CMD_INVITE_COLOSSUS_REPLY;
	packet.h.header.size = sizeof(k_invite_colossus_map) - 20 + strlen(ch->Name) + 1;
	packet.u.kein.invite_colossus_map.port = g_MapPort;
	strcpy(packet.u.kein.invite_colossus_map.name, ch->Name);
	SendPacket2Map(&packet, ST_SEND_MAP_ALL);
	RecvInviteColossusReply(&packet);
}	//> CSD-030509

void RecvInviteColossusReply( t_packet *p )
{	//< CSD-CN-031213
	g_pUserManager->SendPacket(p);
}	//> CSD-CN-031213

void RecvJoinColossusMap( t_packet *p, short int cn )
{	//< CSD-030519
	CHARLIST* ch = CheckServerId(cn);
	
	if (ch == NULL)
	{
		return;
	}

	const int nPort = p->u.kein.default_short_int;

	if (nPort == g_MapPort)
	{
		return;
	}

	CArenaInfo* pArena = g_pArenaManager->GetArenaInfo(nPort);

	if (pArena == NULL)
	{
		return;
	}
	
	t_MapInfo* pMapInfo = GetMapInfoByMapPort(nPort);

	if (pMapInfo == NULL)
	{
		return;
	}

	int nX = 0, nY = 0;
	pArena->GetWaitPosition(nX, nY);
	MapMove(cn, pMapInfo->mapfile, nX, nY);
}	//> CSD-030519

void RecvAttackColossusItem( t_packet *p, short int cn )
{	//< CSD-030509
	CHARLIST* ch = CheckServerId(cn);

⌨️ 快捷键说明

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