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

📄 menuserver2.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	else		// 酒捞袍阑 父甸瘤 富绊 角菩茄 捞具扁甫 甸妨林磊
	{
		if( pEvent->m_lpszMessage2 && pEvent->m_nMessageSize2 )		// npc狼 措拳甫 焊郴霖促.
			SendDial( pData->server_id, pData->npc_index, pEvent->m_lpszMessage2, pEvent->m_nMessageSize2 );

	}
}

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

	int event_no = p->u.kein.default_int;
	CEventMoveMap *pEvent = g_EventMgr.GetEventMoveMapPoint( event_no );
	if( !pEvent ) return;

	// 捞亥飘 曼咯 炼扒 犬牢 --------------------
	if( !pEvent->m_bAll )
	{
		static int sex2sex[] = { 2, 1 };
		static int class2class[] = { 1, 3, 2, 5, 4 };
		static int nation2nation[] = { 0, 0, 0, 1, 2, 0, 3 };

		if( pEvent->m_nSex )
		{
			if( pEvent->m_nSex != sex2sex[ch->SprNo] ) return;
		}
		if( pEvent->m_nClass )
		{
			if( pEvent->m_nClass != class2class[ch->Class] ) return;
		}
		if( pEvent->m_nNation )
		{
			if( pEvent->m_nNation != nation2nation[ch->name_status.nation] ) return;
		}
	}
	//----------------------------

	t_packet packet;
	packet.h.header.type = CMD_EVENT_MOVE_MAP_CHECK_MAP;
		packet.u.kein.event_move_map_check_map.server_id = cn;
		packet.u.kein.event_move_map_check_map.server_port = GetOwnPort();
		packet.u.kein.event_move_map_check_map.event_no = event_no;
	packet.h.header.size =  sizeof( k_event_move_map_check_map );

	int port = GetMapPortByName( pEvent->m_szMap );
	if( port == GetOwnPort() ) return;
	if( !port )	return;
	SendPacket2Map( &packet, port );
}

void RecvEventMoveMapCheckMap( t_packet *p, short int cn )		// 促弗 甘俊辑 棵版快
{
	k_event_move_map_check_map *pData = (k_event_move_map_check_map *)p->u.data;
	CEventMoveMap *pEvent = g_EventMgr.GetEventMoveMapPoint( pData->event_no );
	if( !pEvent ) return;
	if( _stricmp( pEvent->m_szMap, MapName ) != 0 ) return;		// 捞亥飘 锅龋啊 部看促. 

	int user_count = g_pServerTable->GetNumOfUsers();
	if( user_count >= pEvent->m_nMax )
	{
		// 歹捞惑 曼啊且 荐 绝促.
		k_put_menu_string msg;
		msg.type = KM_FAIL;
		msg.str_num = 212;

		SendDirectClientOtherMap( CMD_PUT_MENU_STRING, pData->server_id, pData->server_port, &msg, sizeof( k_put_menu_string ) );
	}
	else
	{
		t_packet packet;
		packet.h.header.type = CMD_EVENT_MOVE_MAP_OK;
			strcpy( packet.u.kein.event_move_map_ok.map_name, MapName );
			packet.u.kein.event_move_map_ok.server_id = pData->server_id;
			packet.u.kein.event_move_map_ok.map_x = pEvent->m_nMapX;
			packet.u.kein.event_move_map_ok.map_y = pEvent->m_nMapY;

		packet.h.header.size = sizeof( k_event_move_map_ok );

		SendPacket2Map( &packet, pData->server_port );

		// 辑滚俊 历厘茄促.
		k_save_event_move_map save_data;
		save_data.event_no = pData->event_no;
		save_data.max = pEvent->m_nMax;	// 021128 YGI
		save_data.now = user_count;
		SendPacketDefault( CMD_SAVE_EVENT_MAPMOVE_NOW, &save_data, sizeof( k_save_event_move_map ), DB_DEMON );
	}
}

void RecvEventMoveMapOk( t_packet *p, short int cn )
{
	k_event_move_map_ok *pData = (k_event_move_map_ok *)p->u.data;
	MapMove( pData->server_id, pData->map_name, pData->map_x, pData->map_y );
}

void CheckDoubleName( CHARLIST *ch, short int cn )
{
	char name[20]={0,};
	::strcpy( name, ch->Name );
	int target_id = ExistHe( ch->Name );
	if( target_id > 0 )		// 穿焙啊 鞍篮 捞抚阑 啊瘤绊 乐促.
	{
		MyLog(1,"CheckDoubleName() name = %s", ch->Name );
		closeconnection( connections, target_id, -101 );		// 老窜 促弗 仇阑 谗绊 --> 历厘
		ch->updatable = 0; // CSD-TW-030620
		closeconnection( connections, cn, -102 );				// 悼矫 立加 茄 仇篮 历厘窍瘤 富搁辑 谗磊...
	}
	else
	{
		target_id = ExistConnectingHe( ch->Name );
		if( target_id > 0 )
		{
			connections[target_id].chrlst.updatable = 1; // CSD-TW-030620
			closeconnection( connections, target_id, -103 );		// 老窜 促弗 仇阑 谗绊 --> 历厘
			ch->updatable = 0; // CSD-TW-030620
			closeconnection( connections, cn, -104 );				// 悼矫 立加 茄 仇篮 历厘窍瘤 富搁辑 谗磊...
		}
	}

	// 促弗 镑俊 乐绰 仇档 谗磊..
	t_packet packet;
	packet.h.header.type = CMD_CHECK_DOUBLE_NAME;
		strcpy( packet.u.kein.invite_colossus_map.name, name );
		packet.u.kein.invite_colossus_map.port = GetOwnPort();
	packet.h.header.size = sizeof( k_invite_colossus_map );
	SendPacket2Map( &packet, ST_SEND_MAP_ALL );
}

// 秦寸 捞抚捞 乐绰瘤 犬牢茄促.
void RecvCheckDoubleName( t_packet *p, short int cn )
{
	char *name = p->u.kein.invite_colossus_map.name;
	int port = p->u.kein.invite_colossus_map.port;

	int target_id = ExistHe( name );
	if( target_id > 0 )
	{
		closeconnection( connections, target_id, -105 );		// 老窜 促弗 仇阑 谗绊 --> 历厘
		// 弊 荤角阑 舅妨霖促.
		t_packet packet;
		packet.h.header.type = CMD_CHECK_DOUBLE_NAME_OK;
			strcpy( packet.u.kein.default_name, name );
		packet.h.header.size = strlen(name);
		SendPacket2Map( &packet, port );
	}
	else
	{
		target_id = ExistConnectingHe( name );
		if( target_id > 0 )
		{
			connections[target_id].chrlst.updatable = 1; // CSD-TW-030620
			closeconnection( connections, target_id, -106 );		// 老窜 促弗 仇阑 谗绊 --> 历厘

			// 弊 荤角阑 舅妨霖促.
			t_packet packet;
			packet.h.header.type = CMD_CHECK_DOUBLE_NAME_OK;
				strcpy( packet.u.kein.default_name, name );
			packet.h.header.size = strlen(name);
			SendPacket2Map( &packet, port );
		}
	}
}

void RecvCheckDoubleNameOk( t_packet *p, short int cn )
{
	char *name = p->u.kein.default_name;
	int target_id = ExistHe(name );
	if( target_id > 0 )
	{	// 促弗 甘俊 鞍篮 仇捞 乐促绰 家侥捞 吭扁 锭巩俊 历厘窍瘤 富绊 昏力窍磊
		connections[target_id].chrlst.updatable = 0; // CSD-TW-030620
		closeconnection( connections, target_id, -102 );
	}
	else
	{
		target_id = ExistConnectingHe( name );

		if( target_id > 0 )
		{
			connections[target_id].chrlst.updatable = 0; // CSD-TW-030620
			closeconnection( connections, target_id, -102 );		// 老窜 促弗 仇阑 谗绊 --> 历厘
		}
	}
}

void RecvCheckDoubleNameDB2Map( t_packet *p, short int cn )
{
	return;
	int target_id;
	int bClose;
	char *pName;  
	for( int i=0; i<4; i++ )
	{
		pName = p->u.kein.login_check_double_name.name[i];
		if( pName[0] )
		{
			EatRearWhiteChar( pName );
			bClose = 0;
			target_id = ExistHe( pName );
			if( target_id > 0 )
			{
				bClose = 1;
			}
			else
			{
				target_id = ExistConnectingHe( pName );
				if( target_id > 0 )
				{
					bClose = 1;
				}
			}

			if( bClose )
			{
				connections[target_id].chrlst.updatable = 1; // CSD-TW-030620
				closeconnection( connections, target_id, -101 );
			}
		}
	}
}

void RecvCheckDoubleNameWhenFirst( t_packet *p, short int cn )
{
	char *pName = p->u.kein.check_double_when_first.name;
	int server_id = p->u.kein.check_double_when_first.server_id;
	int port = p->u.kein.check_double_when_first.port;

	int bClose = 0;
	int target_id = ExistHe( pName );
	if( target_id > 0 )
	{
		bClose = 1;
	}
	else
	{
		target_id = ExistConnectingHe( pName );
		if( target_id > 0 )
		{
			bClose = 1;
		}
	}

	if( bClose )
	{
		connections[target_id].chrlst.updatable = 1; // CSD-TW-030620
		closeconnection( connections, target_id, -101 );

		t_packet packet;
		packet.h.header.type = CMD_CHECK_DOUBLE_NAME_WHERE_OK;
			packet.u.kein.default_short_int = server_id;
		packet.h.header.size = sizeof( short int );
		SendPacket2Map( &packet, port );
	}
}

void RecvCheckDoubleNameWhenFirstOk( t_packet *p, short int cn )
{
	int server_id = p->u.kein.default_short_int;
	if( CheckServerIndex( server_id ) )
	{
		connections[server_id].chrlst.updatable = 0; // CSD-TW-030620
		closeconnection( connections, server_id, -102 );
	}
}

void CheckDoubleNameWhenFirst( char *pName, short int server_id )
{
	int bClose = 0;
	int target_id = ExistHe( pName );
	if( target_id > 0 )
	{
		bClose = 1;
	}
	else
	{
		target_id = ExistConnectingHe( pName );
		if( target_id > 0 )
		{
			bClose = 1;
		}
	}
	if( bClose )
	{
		connections[target_id].chrlst.updatable = 1; // CSD-TW-030620
		closeconnection( connections, target_id, -101 );

		connections[server_id].chrlst.updatable = 0; // CSD-TW-030620	
		closeconnection( connections, server_id, -102 );
	}

	t_packet packet;
	packet.h.header.type = CMD_CHECK_DOUBLE_NAME_WHERE_FIRST;
		strcpy( packet.u.kein.check_double_when_first.name, connections[server_id].name );
		packet.u.kein.check_double_when_first.server_id = server_id;
		packet.u.kein.check_double_when_first.port = GetOwnPort();
	packet.h.header.size = sizeof( k_check_double_when_first );
	SendPacket2Map( &packet, ST_SEND_MAP_ALL );
}

// 030923 HK YGI
void SaveLoginLogoutLogByKein(CHARLIST* pTarget, int type, int call_function_id )
{
	if (!g_EventFlagMgr.IsSaveLogWhenSaveUserData())
	{
		return;
	}

	char type2str[2][20] = {"LOGOUT", "LOGIN"};
	
	string strPath;

	if (g_pLogManager->GetLogPath(LT_CHANGE, strPath))
	{
		char temp[FILENAME_MAX] = {0,};
		char log[FILENAME_MAX] = {0,};
		::sprintf(temp, "%s/savelog_%s.txt", strPath.c_str(), pTarget->Name);
		::sprintf(log, "%s(%d): [%s][%s] lv=%d, exp=(%d)%d, class=%d",
			      type2str[type], call_function_id, MapName,
				  pTarget->Name, pTarget->GetLevel(), pTarget->GetExperienceStep(), pTarget->Exp, pTarget->Class);
		SaveLogDefault2(temp, log);
	}
}

// 031009 CI YGI
int InitItemLimitCountFromDB( )
{
	char query[512];
	WORD port = GetOwnPort();
	if( !port )
	{
		return 0;
	}
	DWORD limit_number;
	int ret = GetItemLimitCount_SQL( port, &limit_number );
	if( ret < 1 )
	{
		limit_number = 1;
		sprintf( query, "INSERT INTO ItemLimitMgrTable ( port, limit_number ) VALUES ( %d, %d )", port, limit_number );
		Querry_SQL( query );
	}

	ItemMgr.SetLimitCount( limit_number );

	ret = ItemMgr.LoadHaveLimitItem();
	if( !ret )		// 角菩
	{
		JustMsg( "Error!!! check please ItemList_HaveLimit table" );
		return 0;
	}
	return 1;
}
// 040105 YGI 焊拱 ----------------
int GetTreasureMining( int lv )
{
	switch( lv )
	{
		case 1: return 30;
		case 2: return 50;
		case 3: return 70;
		case 4: return 99;
	}
	return 101;
}
void RecvCheckTreasureXY( t_packet *p, short int cn )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;
	int event_index = -1;

	k_check_treasure_xy *pData = (k_check_treasure_xy *)p->u.data;
	int tile_x = pData->x/TILE_SIZE;
	int tile_y = pData->y/TILE_SIZE;
	int lv = 0;
	bool mining = false;		// 扁贱捞 何练窍促

	for( int a=0; a<3; a++ )
	{
		for( int b=0; b<3; b++ )
		{
			for( int c=0; c<8; c++ )
			{
				ItemAttr *pItem = &ch->inv[a][b][c];
				lv = IsTreasureMapItem( pItem->item_no );
				if( !lv ) continue;		// 焊拱 瘤档啊 酒聪促.
				CTreasureMapItem *pAttr = (CTreasureMapItem *)&pItem->attr[IATTR_TREASURE_MAP];
				if( !pAttr->isChecked || pAttr->mapnumber != MapNumber ) continue;
				if( ch->skillexp[MINING].skillexp/10000 < GetTreasureMining( lv ) )
				{
					mining = false;
					continue;
				}
				if( pAttr->x != tile_x || pAttr->y != tile_y ) continue;
				event_index = g_EventFindTreasure.CheckXY( tile_x, tile_y );
				if( event_index == -1 ) continue;
				// 付捞呈 饭骇
				mining = true;
				
				// 荤侩茄巴篮 促矫 荤侩窍瘤 给窍霸 昏力 茄促.
				//pAttr->use = 1;
				POS pos;
				SetItemPos( INV, a, b, c, &pos );
				SendDeleteItem( pItem, &pos, ch );
				//SendServerEachItem( &pos, pItem, cn );
				goto find_stop;
			}
		}
	}

find_stop : 
	if( event_index == -1 ) return;
	if( lv == 0 ) return;
	if( !mining ) 
	{
		SendPutMenuString( KM_FAIL, 215, cn );
		return;
	}

	if( g_TreasureGuardMgr.IsEvent( event_index ) ) return;	// 捞固 殿厘沁菌绰瘤 犬牢
	int treasure_class = lv-1;		// 脾绢 唱客具 且 各苞 唱吝俊 焊拱 惑磊狼 殿鞭
	int ret = g_TreasureGuardMgr.CreateGuard( event_index, treasure_class, tile_x, tile_y, cn );
	if( ret )
	{
		MyLog( 0, "Treasure Guard Event Start <event_index:%d>, <treasure_class:%d>, (%d,%d) <%s>",
			event_index, treasure_class, tile_x, tile_y, ch->Name );
	}
} //////////////////////////

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

	POS *pPos = &p->u.kein.default_pos;
	ItemAttr *item = GetItemByPOS( ch, *pPos );
	if( !item ) return;

	int lv = IsTreasureMapItem( item->item_no );
	if( !lv ) return;		// 焊拱 瘤档啊 酒聪促.

	CTreasureMapItem *pAttr = (CTreasureMapItem *)&item->attr[IATTR_TREASURE_MAP];
	if( pAttr->isChecked) return;

	t_packet packet;
	packet.h.header.type = CMD_GET_TREASURE_MAP_DETAIL_DB;
		packet.u.kein.get_treasure_map_detail_to_db.cn = cn;
		packet.u.kein.get_treasure_map_detail_to_db.pos = *pPos;
	packet.h.header.size = sizeof( k_get_treasure_map_detail_to_db );
	QueuePacket( connections, DB_DEMON, &packet, 1 );
}

void RecvGetTreasureMapDetailDB( t_packet *p, short int cn )
{
	k_get_treasure_map_detail_to_map *pData = &p->u.kein.get_treasure_map_detail_to_map;
	CHARLIST *ch = CheckServerId( pData->cn );
	if( !ch ) return;

	ItemAttr *item = GetItemByPOS( ch, pData->pos );
	if( !item ) return;
	int lv = IsTreasureMapItem( item->item_no );
	if( !lv ) return;		// 焊拱 瘤档啊 酒聪促.
	CTreasureMapItem *pAttr = (CTreasureMapItem *)&item->attr[IATTR_TREASURE_MAP];
	if( pAttr->isChecked ) return;

	pAttr->isChecked = 1;
	pAttr->mapnumber = pData->map_number;
	//pAttr->use = 0;
	// lv俊 蝶扼 罚待窍霸...
	pAttr->x = pData->x;
	pAttr->y = pData->y;
	switch( lv )
	{
		case 1 : pAttr->offset2 = 0; pAttr->offset = 0; break;
		case 2 : pAttr->offset2 = rand()%4; pAttr->offset = rand()%2; break;
		case 3 : pAttr->offset2 = rand()%4; pAttr->offset = rand()%3; break;
		case 4 : pAttr->offset2 = rand()%4; pAttr->offset = rand()%4; break;
	}

	SendServerEachItem( &pData->pos, item, pData->cn );
}

⌨️ 快捷键说明

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