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

📄 menuserver.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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 "gamblerate.h"
#include "LTSSupport.h"
#include "Skill_lsw.h"
#include "GmMgr.h"
#include "eventmgr.h" //021030 YGI
#include "LogManager.h"
#include "UserManager.h"
#include "DualManager.h"
#include "GuildManager.h"
#include "ArenaManager.h"

const int SIZE_GR_BS = 50; // CSD-030326
const int SIZE_GR_RS = 100; // CSD-030326

CGambleRateData g_game_rate_data;
CAliveMapZoneAll g_AliveMap;		// 登混酒 朝荐 乐绰 脚傈抛捞喉

extern struct CItem_List Item_Ref ;
extern bool exist(int item_no, int char_id, POS &source);
extern void getItemIndex(int item_no, int &type, int &index);
extern int GetItemValueSell( ItemAttr *item );
extern void CleanUpConnection(short idServer);

void SendStoreItemList( int cn, int storelistindex, int menud);
void SendCallSmallMenu( int cn, int storelistindex, int menu );
void SendCallDualMagicLearnMenu( int cn);//soto-030421
int LoadGuildItem( char *filename, int num );

char g_szPassWordName[20];
int		 storelist_attr[ MAX_STORE_LIST][ MAX_STORE_ITEM_LIST];		// 荤绰 拱扒 颇绰 拱扒 加己
ItemAttr storelist[ MAX_STORE_LIST][ MAX_STORE_ITEM_LIST];
int storelistmax[ MAX_STORE_LIST];
//  惑沥狼 Item 加己篮 概老 官诧促. 
//  捞窃荐绰 澜.. 1老俊 茄锅沥档 龋免登绢具 茄促. 
static inline void swap( int  *a, int *b )
{
	int t = *a;
	*a = *b;
	*b = t;	
}			

void MakeStoreList( void )
{
	char temp[ FILENAME_MAX];
	wsprintf( temp, "%s/data/BLACKSMITH.txt", GameServerDataPath );	storelistmax[ BLACKSMITH ] = LoadGuildItem( temp,	BLACKSMITH	);	//措厘埃		
	MyLog( LOG_NORMAL, " Store 'BLACKSMITH' itemlist number   : %d", storelistmax[ BLACKSMITH ] );
	wsprintf( temp, "%s/data/FARM.txt", GameServerDataPath );		storelistmax[ FARM		 ] = LoadGuildItem( temp,	FARM		);	//丑厘		
	MyLog( LOG_NORMAL, " Store 'FARM'       itemlist number   : %d", storelistmax[ FARM] );
	wsprintf( temp, "%s/data/RESTAURANT.txt", GameServerDataPath );	storelistmax[ RESTAURANT ] = LoadGuildItem( temp,	RESTAURANT	);	//夸府痢		
	MyLog( LOG_NORMAL, " Store 'RESTAURANT' itemlist number   : %d", storelistmax[ RESTAURANT] );
	wsprintf( temp, "%s/data/HERBSHOP.txt", GameServerDataPath );	storelistmax[ HERBSHOP	 ] = LoadGuildItem( temp,	HERBSHOP	);	//距檬痢		
	MyLog( LOG_NORMAL, " Store 'HERBSHOP'   itemlist number   : %d", storelistmax[ HERBSHOP	 ] );
	wsprintf( temp, "%s/data/SHAMBLES.txt", GameServerDataPath );	storelistmax[ SHAMBLES	 ] = LoadGuildItem( temp,	SHAMBLES	);	//仟赁埃		
	MyLog( LOG_NORMAL, " Store 'SHAMBLES'   itemlist number   : %d", storelistmax[ SHAMBLES	 ] );
	wsprintf( temp, "%s/data/CANDLE.txt", GameServerDataPath );		storelistmax[ CANDLE	 ] = LoadGuildItem( temp,	CANDLE		);	//剧檬痢		
	MyLog( LOG_NORMAL, " Store 'CANDLE'     itemlist number   : %d", storelistmax[ CANDLE	 ] );
	wsprintf( temp, "%s/data/SLOPSHOP.txt", GameServerDataPath );	storelistmax[ SLOPSHOP	 ] = LoadGuildItem( temp,	SLOPSHOP	);	//狼惑角		
	MyLog( LOG_NORMAL, " Store 'SLOPSHOP'   itemlist number   : %d", storelistmax[ SLOPSHOP  ] );
	wsprintf( temp, "%s/data/ALCHEMY.txt", GameServerDataPath );	storelistmax[ ALCHEMY	 ] = LoadGuildItem( temp,	ALCHEMY		);	//楷陛家		
	MyLog( LOG_NORMAL, " Store 'ALCHEMY'    itemlist number   : %d", storelistmax[ ALCHEMY	 ] );
	wsprintf( temp, "%s/data/WOODWORKING.txt", GameServerDataPath );storelistmax[ WOODWORKING] = LoadGuildItem( temp,	WOODWORKING	);	//格傍家		
	MyLog( LOG_NORMAL, " Store 'WOODWORKING'itemlist number   : %d", storelistmax[WOODWORKING] );
	wsprintf( temp, "%s/data/BOWCRAFT.txt", GameServerDataPath);	storelistmax[ BOWCRAFT	 ] = LoadGuildItem( temp,	BOWCRAFT	);		//劝苞拳混	
	MyLog( LOG_NORMAL, " Store 'BOWCRAFT'   itemlist number   : %d", storelistmax[ BOWCRAFT	 ] );
	wsprintf( temp, "%s/data/SHIPYARD.txt", GameServerDataPath );	storelistmax[ SHIPYARD	 ] = LoadGuildItem( temp,	SHIPYARD	);	//炼急家		
	MyLog( LOG_NORMAL, " Store 'SHIPYARD'   itemlist number   : %d", storelistmax[ SHIPYARD	 ] );
	wsprintf( temp, "%s/data/PUB.txt", GameServerDataPath );		storelistmax[ PUB		 ] = LoadGuildItem( temp,	PUB			);	//林痢		
	MyLog( LOG_NORMAL, " Store 'PUB'        itemlist number   : %d", storelistmax[ PUB		 ] );
	wsprintf( temp, "%s/data/STORE.txt", GameServerDataPath );		storelistmax[ STORE		 ] = LoadGuildItem( temp,	STORE		);	//棱拳惑		
	MyLog( LOG_NORMAL, " Store 'STORE'      itemlist number   : %d", storelistmax[ STORE	 ] );
	wsprintf( temp, "%s/data/MAGIC_GUILD.txt", GameServerDataPath );storelistmax[MAGIC_GUILD ] = LoadGuildItem( temp,	MAGIC_GUILD );	//付过荤		
	MyLog( LOG_NORMAL, " Store 'MAGIC_GUILD'itemlist number   : %d", storelistmax[ MAGIC_GUILD ] );
}

void CallSmallMenu(int cn, int storelistindex, int menu)
{	//< CSD-030509
	switch (menu)
	{
	case MN_SKILLGUILD_REPAIR:
	case MN_SHOP_SELL:
	case MN_SHOP_BUY:
		{
			SendStoreItemList(cn, storelistindex, menu);
			break;
		}
	case MN_SKILLGUILD_BUY:	
	case MN_SKILLGUILD_SELL:	
		{
			SendStoreItemList(cn, storelistindex, menu); 
			SendCallSmallMenu(cn, storelistindex, menu);
			break;
		}
	case MN_ARENA_LOBBY:
		{
			CBaseArena* pGame = g_pArenaManager->GetGameInfo(storelistindex);

			if (pGame != NULL)
			{	//< CSD-TW-030627
				if (!pGame->IsPlayGame())
				{
					SendCallSmallMenu(cn, storelistindex, menu);
					return;
				}
				
				CHARLIST* pTarget = CheckServerId(cn);

				if (pTarget != NULL)
				{
					pGame->SendRemainTime(pTarget, g_curr_time);
				}
			}	//> CSD-TW-030627

			break;
		}
	default:
		{
			SendCallSmallMenu(cn, storelistindex, menu);
			break;
		}
	}
}	//> CSD-030509

// 010815 YGI
void RecvItemBuy( int cn, t_client_item_buy *p )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;
//	ch->Money = GetMoneyByItem( ch );

	int store_id = p->store_id;
	int itemno = p->item_no;
	int a,b,c;
	int itempos;
	
	if( store_id >= MAX_STORE_LIST ) return; // Error....
	if( !itemno ) return;

	for( itempos=0; itempos<storelistmax[store_id]; itempos++)
	{
		if( storelist_attr[store_id][itempos] == SIT_EVENT_ITEM ||
			storelist_attr[store_id][itempos] == SIT_NULL ||
			storelist_attr[store_id][itempos] == SIT_ONLY_BUY ) continue;

		if( itemno == storelist[ store_id][itempos].item_no )
		{
			break;
		}
	}
	if( itempos == storelistmax[store_id] ) return;		// 捞 惑痢俊 绝绰 酒捞袍捞促.

	ItemAttr *item = &storelist[ store_id][itempos];	
	CItem *t = ItemUnit( *item );
	if( !t ) return;

	const DWORD price = t->GetValue();
	if( ch->Money < price ) return;			// 老窜 捣 绝栏搁 救等促.

	//Quick 阑 八祸窍咯 IK_POTION_BOX 牢啊.. 秦辑
	const int iItemNo = item->item_no;
	bool bHavePotionBox = false;
	for(int i=0; i < ITEM_QUICK_MAX; i++)
	{
		if( !ch->quick[i].item_no ){continue;}//酒捞袍捞 绝栏搁 牧萍春
		CItem *tt = ItemMgr.ConvertItemNoToCItem( ch->quick[i].item_no );
		if( !tt ) continue;
		if(IK_POTION_BOX == tt->GetItemKind())
		{
			bHavePotionBox = true;
			break;
		}
	}
	
	if(bHavePotionBox)
	{
		CPotionBox potion_box( ch );
		if( potion_box.PutItem( item ) ) // 器记 惑磊俊 甸绢艾促.
		{
			if( SubtractMoney( price, ch ) == -1 )		// 家瘤陛俊辑 啊拜阑 哗焊绊
			{
				// 角菩窍搁 器记 促矫 化绰促.
				potion_box.DeleteItem();
			}
			*item = GenerateItem( iItemNo);		// 迫绊 抄 饶 货肺款 酒捞抛 积己 ( 捞霸 惑痢老 版快父栏肺 官操带瘤 秦具窃.. )
			return;	
		}
	}

	int ret = 0;
	if( t->GetRbutton() == DIVIDE_ITEM )	
	{
		ret = SearchItemPosByNumber( item, a, b, c, ch );
	}
	if( !ret )
	{
		if( !SearchInv( ch->inv, a, b, c ) ) return;		// 后磊府啊 绝促搁
	}

	// 捞力 角力肺 捣阑 哗夯促. 角菩窍搁 给 魂促.
	if( SubtractMoney( price, ch ) == -1 ) return;	
	if( ch->inv[a][b][c].item_no )
	{
		ch->inv[a][b][c].attr[IATTR_MUCH] += item->attr[IATTR_MUCH];
	}
	else
	{
		ch->inv[a][b][c] = *item;		// 咯扁辑 generater 窃荐甫 龋免窍瘤 臼绰 捞蜡绰 唱吝俊 漂喊茄 酒捞袍阑 迫版匡 措厚秦辑..
	}

	POS pos;
	SetItemPos( INV, a, b, c, &pos );
	SendServerEachItem( &pos , &ch->inv[a][b][c], cn );		// 积己等 酒捞袍阑 怖 麦绢 焊郴霖促.
	SendItemEventLog( &ch->inv[a][b][c], cn, SN_NOT_USER, SILT_GET_STORE, 3 ); //YGI acer

	*item = GenerateItem( iItemNo);		// 迫绊 抄 饶 货肺款 酒捞抛 积己 ( 捞霸 惑痢老 版快父栏肺 官操带瘤 秦具窃.. )
	return;
}

void RecvItemSell( int cn, t_client_item_sell *p )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return;

	int store_id = p->store_id;
	int pos = p->item_position;

	int a = ( pos & 0x0060 ) >> 5;
	int b = ( pos & 0x0018 ) >> 3;
	int c = ( pos & 0x0007 );

	if( a<0 || a>=3 || b<0 || b>=3 || c<0 || c>=8 ) return;
	ItemAttr *item = &ch->inv[a][b][c];

	if( !item->item_no ) return;
	if( store_id > MAX_STORE_LIST) return;
	if( store_id < 0) return;

	int itempos=0;
	for( itempos=0; itempos	<	storelistmax[store_id]; itempos++)
	{
		// 救登绰 版快匙
		if( storelist_attr[store_id][itempos] == SIT_EVENT_ITEM ||
			storelist_attr[store_id][itempos] == SIT_NULL ||
			storelist_attr[store_id][itempos] == SIT_ONLY_SELL ) 
		{
			continue;
		}
		
		if( item->item_no == storelist[ store_id][itempos].item_no )
		{
			break;
		}
	}
	if( itempos == storelistmax[store_id] ) return;		//芭贰 阂啊 魄沥

	if(::GiveMoney(ch,GetItemValueSell( item )))//021126 lsw// 捣阑 棵妨 霖促.
	{//捣 罐阑 荐 绝绰 惑炔捞搁 魄概啊 救等促
		if(item->attr[IATTR_RARE_MAIN])
		{
			const unsigned int uiRare = item->attr[IATTR_RARE_MAIN];
			Send_RareItemMakeLog(cn,item->item_no,-2,
			((LPRareMain)(&uiRare))->grade,
			((LPRareMain)(&uiRare))->soksung1,
			((LPRareMain)(&uiRare))->soksung2,
			((LPRareMain)(&uiRare))->soksung3,
			0,0,0,0,item->attr[IATTR_LIMIT],item->attr[IATTR_MUCH],0,-2);
		}
		::SendItemEventLog( item, cn, SN_NOT_USER, SILT_PUT_STORE, 3 );	 //YGI acer
		::DeleteItem( item );
	}
}


#define MAX_RUMOR_TO_READ_		5 // 佬歹甸老 风赣狼 弥措荐. 
char RumorText[ MAX_RUMOR_TO_READ_][ TEXT_LENGTH];
void InitRumorText( char *filename )
{
	FILE *fp;
	char  text[ TEXT_LENGTH];
	int   c,cc,i;
	
	fp = fopen( filename, "rt" );
	if( fp == NULL ) return;
	
	c = 0;	
	while( fgets( text, TEXT_LENGTH, fp ))	c++;	
	
	fseek( fp, 0, SEEK_SET );
	for( cc=0, i=0 ; i < c ; i ++ )
	{
		fgets( text, TEXT_LENGTH, fp );
		if( i >= c-5 )
		{
			strcpy( RumorText[cc], text );
			cc++;
		}
	}
	fclose(fp);
}
	
void SendRumor( t_connection c[],  int cn )
{	
	static int count;
	t_packet p;

	p.h.header.type = CMD_MENU_MESSAGE;
	{
		p.u.server_menu_message.type = MM_RUMOR_;	
		strcpy( p.u.server_menu_message.text, RumorText[count] );
	}
	
	p.h.header.size = sizeof( t_server_menu_message ) - TEXT_LENGTH + strlen( RumorText[count] );
	QueuePacket( c, cn, &p, 1 );

	count++;
	count %= MAX_RUMOR_TO_READ_;
}	
	
	
	

//------------------------------------------------------------
/*/曼炼...
	case MN_BLACKSMITH:			
	case MN_FARM	:	
	case MN_RESTAURANT:
	case MN_HERBSHOP:	
	case MN_SHAMBLES	:
	case MN_CANDLE	:
	case MN_SLOPSHOP	:
	case MN_ALCHEMY	:
	case MN_WOODWORKING:
	case MN_BOWCRAFT	:
	case MN_SHIPYARD	:
	

/********************************************************8
辨靛 Menu 
#define CMD_GUILD_INFO					7000
typedef struct server_guild_info
{

}t_server_guild_info;

void SendGuildInfo( t_connection c[], int cn, int guildindex, int storeindex, int repairindex )

  int guildindex, :    
  int storeindex, : 
  int repairindex : 

  . 胶农赋飘俊辑 角青登绢柳促. 

*********************************************************/
void SendGuildInfo( t_connection c[], int cn  )
{
	t_packet p;

	p.h.header.type = CMD_GUILD_INFO;
	{
	}
	p.h.header.size = sizeof( t_server_guild_info );

	QueuePacket( c, cn, &p, 1 );
}


//////////////////////////////////////////////////////////////////////////////////////
//
//	辑滚 瘤盔侩 皋家靛
//
//////////////////////////////////////////////////////////////////////////////////////
#define MAX_STR_WRITER		30
#define BBS_STRING_MAX		8192
typedef struct tag_public_notice
{
	int		no;
	int		date;
	char	writer[MAX_STR_WRITER];
	char	title[TEXT_LENGTH];
	char	*text;
}PublicNotice, *lpPublicNotice;


void FreePublicNotice( lpPublicNotice p )
{
	p->no = 0;
	p->date = 0;
	strcpy(p->writer,"");
//	if( p->title )	free(p->title);
//	delete p->text;
}


PublicNotice public_notice[50];
void LoadPublicNotice( void )
{
	for( int i=0; i<50; i++ )		// 盎脚阑 困茄 橇府
	{
		if( public_notice[i].no )
		{
			FreePublicNotice( &public_notice[i] );
		}
	}

	char buf[BBS_STRING_MAX];
	
	FILE	*fp;
	char	filename[50];

	sprintf(filename, ".\\data\\傍瘤荤亲.txt");

	if( fp= fopen(filename, "rt") )
	{
		int i=0; 
		while( !feof(fp) )
		{
			int len;
			fgets(buf, BBS_STRING_MAX, fp);
			if( *buf == ';' ) continue;

			char *token;
			token = strtok(buf, "\t\n\r");
			if( token == NULL ) break;
			public_notice[i].no = atoi( token );

			token = strtok(NULL, "\t\n\r");
			if( token == NULL ) break;
			public_notice[i].date = atoi( token );

			token = strtok(NULL, "\t\n\r");
			if( token == NULL ) break;
			strcpy( public_notice[i].writer, token );

			token = strtok(NULL, "\t\n\r");
			len = strlen( token );
			if( token == NULL ) break;
//			public_notice[i].title = new char[len];
			strcpy( public_notice[i].title, token );
			
//			token = strtok(NULL, "\t\n\r");
//			len = strlen( token );
//			public_notice[i].text = new char[len];
//			strcpy( public_notice[i].text, token );

			i++;
		}
	}
	else 
	{
		MessageBox(NULL, "拳老 俊矾垒酒", "俊矾", MB_OK );
		return;
	}

	fclose(fp);
}


void SendMessageTitle( int type, int count, t_connection c[], int cn )
{
//	char date[10][ FILENAME_MAX];
	char name[10][ FILENAME_MAX];
	char title[10][ FILENAME_MAX];
	int	 ct[10];
	TIMESTAMP_STRUCT date[10];
	
	t_packet p;
	p.h.header.type = type ;
	{
		switch( type )
		{

⌨️ 快捷键说明

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