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

📄 menuserver.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			case CMD_PUBLIC_NOTICE_TITLE_REQ:	{
													//PublicNotice title[10];
													int max = GetTitleBBS( count, ct, date, name, title );

													for( int i=0; i<max; i++ )
													{
//														if( !public_notice[i].no ) return;

														p.u.server_menu_message_title.no = ct[i];
														p.u.server_menu_message_title.date = date[i].year*10000 + date[i].month*100+date[i].day;
														strncpy( (char *)p.u.server_menu_message_title.name, name[i], NM_LENGTH-2 );
														strncpy( (char *)p.u.server_menu_message_title.title, title[i], NM_LENGTH-2 );
														p.h.header.size = sizeof( t_server_menu_message_title );
														QueuePacket( c, cn, &p, 1 );
													}
													break;
												}
			case CMD_RANK_TITLE_REQ			:
			case CMD_FORUM_TITLE_REQ		:		
			case CMD_EVENT_TITLE_REQ		:			
			case CMD_MYDIARY_TITLE_REQ		:
			case CMD_BBS_TITLE_REQ			:	
			case CMD_ETC_TITLE_REQ			:		;
		}
	}
}



void SendCharInfomation( int type, t_connection c[], int cn )
{
	t_packet p;
	memset( &p, 0, sizeof( t_server_user_db_data ) );
	p.h.header.type = type ;
	{
		PutPacketCharDB( c, cn, &p );
	}
	p.h.header.size = sizeof(t_server_user_db_data);

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

void SendOtherInv( int type, int other_id, t_connection c[], int cn )		// pk 贸府绰? 
{
	const int GET_ITEM_MAX = 1;

	t_packet p;

	CHARLIST *ch;

	if( other_id < 10000 ) ch = CheckServerId( other_id );
	else ch = CheckNpcId( other_id-10000 );
	if( !ch ) return; 

//soto-tai	for( int i=0; i<15; i++ )	p.u.kein.server_other_ch_inv.item[i] = 0;
	for( int i=0; i<15; i++ )
	{
		memset(&p.u.kein.server_other_ch_inv.item[i],0,sizeof(ItemAttr));
	}

//soto-tai	int item[100];
	ItemAttr	item[100];memset(item,0,sizeof(ItemAttr)*100);


	int ct = 0;
	p.h.header.type = type ;
	{
		for( int a=0; a<3; a++ )
			for( int b=0; b<3; b++ )
				for( int c=0; c<8; c++ )
				{
					if( ch->inv[a][b][c].item_no )
					{
						CItem *t = ItemUnit( ch->inv[a][b][c] );
						if( !t ) continue;
						if( t->GetLevel() >= 100 ) continue;		// 饭骇捞 臭篮 酒捞袍篮 啊廉哎荐 绝霸..

//soto-tai				item[ct++] = ch->inv[a][b][c].item_no;
						item[ct++] = ch->inv[a][b][c];

						if( ct==100 ) goto ok__ ;
					}
				}
	}

	ok__ :

	int count = 0;	// 角龙利栏肺 甸绢哎 拱扒甸 墨款飘
	if( ct < GET_ITEM_MAX) 
	{
		for( int i=0; i<ct; i++ )
		{
			p.u.kein.server_other_ch_inv.item[i] = item[i];
			count++;
		}		
	}
	else
	{
		int item_count[GET_ITEM_MAX] = {0,};
		while( count < GET_ITEM_MAX )
		{
			int para = rand() % ct;
			int ret = 0;
			for( int i=0; i<count; i++ )
			{
				if( item_count[i] == para )
				{
					ret = 1;
					break;
				}
			}
			if( !ret ) item_count[count++] = para;
		}
		for( int i=0; i<count; i++ )
		{
			p.u.kein.server_other_ch_inv.item[i] = item[item_count[i]];
		}
	}
		p.u.kein.server_other_ch_inv.target_id = other_id;
		p.u.kein.server_other_ch_inv.item_count = count;
//soto-tai	p.h.header.size = sizeof(kein_server_other_ch_inv) - sizeof( short int )*(15-count);
	p.h.header.size = sizeof(kein_server_other_ch_inv) - sizeof( ItemAttr )*(15-count);

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


int RecvDivideItem( kein_item_attr_pos *item, t_connection c[], int cn )
{
	CHARLIST *ch = &c[cn].chrlst;
	if( !ch ) return 0;

	POS &pos_s = item->item_pos;
	int &much = item->much;

	if( !much ) return OK;		// 蔼捞 绝阑 版快绰 弊成 府畔~

	ItemAttr *source = GetItemByPOS( cn, pos_s );
	if( !source ) return NOT;
	ItemAttr temp = *source;			// 瘤况瘤绰  酒捞袍 锅龋客 加己父 啊瘤绊 乐绰促.

	if( source->item_no != item->item_attr.item_no ) return NOT;
	
	if( source->attr[IATTR_MUCH] > MAX_MONEY ) source->attr[IATTR_MUCH] = MAX_MONEY;		// 唱喘荐 乐绰 酒捞袍篮 100000阑 逞瘤 给茄促.
	
	if( source->attr[IATTR_MUCH] > (DWORD) much )
	{
		source->attr[IATTR_MUCH] -= much;
	}
	else
	{
		much = source->attr[IATTR_MUCH];
		DeleteItem( source );
//		SendDeleteItem( pos_s, c, cn );		// 酒捞袍 昏力 傈价 窃荐 
	}

	int x, y, z;
	if( !SearchInv( ch->inv, x, y, z ) ) 
	{
		ItemAttr target = temp;
		target.attr[IATTR_MUCH] = much;
		if( target.item_no == IN_COINS && much <= 5 ) target.item_no = IN_COIN;
		else if( target.item_no == IN_COIN && much > 5 ) target.item_no = IN_COINS;

		if( target.item_no == IN_NEW_COINS && much <= 5 ) target.item_no = IN_NEW_COIN;
		else if( target.item_no == IN_NEW_COIN && much > 5 ) target.item_no = IN_NEW_COINS;

		SendItemEventLog( &target, ch->GetServerID(), ch->GetServerID(), SILT_PUT_GROUND_MAX_INVEN, 1 ); //YGI acer
		DropItem( ch->X, ch->Y, &target );			// 顶官蹿栏肺 冻绢哆赴促.
	}
	else
	{
		ItemAttr &target = ch->inv[x][y][z];
		target = temp;								// 酒捞袍 锅龋客 老馆 加己 逞败 林扁 困秦
		target.attr[IATTR_MUCH] = much;
		if( target.item_no == IN_COINS && much <= 5 ) target.item_no = IN_COIN;
		else if( target.item_no == IN_COIN && much > 5 ) target.item_no = IN_COINS;

		if( target.item_no == IN_NEW_COINS && much <= 5 ) target.item_no = IN_NEW_COIN;
		else if( target.item_no == IN_NEW_COIN && much > 5 ) target.item_no = IN_NEW_COINS;


		POS pos;
		SetItemPos( INV, x, y, z, &pos );
		SendServerEachItem( &pos, &target, cn );
	}

	//020303 lsw
/*	if( pos_s.type == BOX )
	{
		SendLoginPutBoxItem( ch->box_id, pos_s.p3, source );
	}
*/


	return 1;
}

void RecvBankInfoDeposit( DWORD dwMoney, t_connection c[], int cn )
{
	CHARLIST *ch = ::CheckServerId( cn );
	if( !ch ) 
	{
		return;
	}

	const DWORD dwBankMoney = ch->GetBankMoney();

	if(MAX_BANK_MONEY <= dwBankMoney)
	{//抗陛咀篮 40撅捞 弥措 涝聪促.
		OutMessage(ch,2,930);
	}
	
	if(1==::SubtractMoney( dwMoney, ch )) //傈价罐篮 涝仿 抗陛阑 歹茄促.
	{
		::SendSubtractMoney( dwMoney, cn );			// 盎脚等 沥焊甫 焊郴霖促.
		ch->IncBankMoney(dwMoney, BMCT_BANK_DEPOSIT); // CSD-030723
	}
}

void RecvBankInfoDefrayal( DWORD dwMoney, t_connection c[], int cn )
{
	CHARLIST	*ch = CheckServerId( cn );
	if( !ch ) return;

	if( ch->GetBankMoney() >= dwMoney )//篮青俊 捣篮 乐绰啊
	{
		if(::GiveMoneyAble(ch,dwMoney))//捣阑 罐阑 荐 乐绰 惑炔牢啊
		{
			ch->DecBankMoney(dwMoney, BMCT_BANK_DEFRAYAL); // CSD-030723
			GiveMoney(ch,dwMoney);
		}
	}
}


void SendBankRepayment( t_connection c[], int cn )
{
	CHARLIST	*ch = CheckServerId( cn );
	if( !ch ) return;
	t_packet p;

	p.h.header.type = REP_YOUR_DEPOSIT_INFO;
	{
		p.u.kein.client_bank_repayment.loan_money;
		p.u.kein.client_bank_repayment.last_loan;
		p.u.kein.client_bank_repayment.last_loan_time;
	}
	p.h.header.size = sizeof( k_client_bank_deposit );

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

void RecvCharInfoBasic( t_char_info_basic *p, t_connection c[], int cn )
{
	if( p->kind < 0 ) return;
	if( p->password != 111 ) return; 

	CHARLIST *ch = &c[cn].chrlst;
	if( !ch ) return;

	if( strcmp( g_szPassWordName, ch->Name ) ) return;
	DWORD d = p->data;

	switch (p->kind)
	{	//< CSD-030723
	case STR:
		{
			ch->Str	= short(d);
			break;
		}
    case DEX:
		{
			ch->Dex	= short(d);
			break;
		}
	case CON:
		{
			ch->Con	= short(d);
			break;
		}
	case WIS:
		{
			ch->Wis	= short(d);
			break;
		}
	case INT_:
		{
			ch->Int	= short(d);
			break;
		}
	case MOVP:
		{
			ch->MoveP = short(d);
			break;
		}
	case CHA:
		{
			ch->Char = short(d);
			break;
		}
	case ENDU:
		{
			ch->Endu = short(d);
			break;
		}
	case MOR:
		{
			ch->Moral = short(d);
			break;
		}
	case LUCK:
		{
			ch->Luck = short(d);
			break;
		}
	case WSPS:
		{
			ch->wsps = short(d);
			break;
		}
	case LVPOINT:
		{
			ch->SetReservedPoint(d);
			break;
		}
	case MONEY:
		{
			ch->Money = d;
			break;
		}
	case HP:
		{
			ch->Hp = d;
			break;
		}
	case MAX_HP:
		{
			ch->HpMax = d;
			break;
		}
	case MP:
		{
			ch->Mana = d;
			break;
		}
	case MAX_MP:
		{
			ch->ManaMax	= d;
			break;
		}
	case SP:
        {
			ch->Hungry = d;
			break;	
		}
	case MAX_SP:
		{
			ch->HungryMax = d;
			break;
		}
	case BANKMONEY: 
		{
			ch->SetBankMoney(d, BMCT_RECV_CHAR_INFO_BASIC);
			break;
		}
	case TAC_E1:
	case TAC_E2:
	case TAC_E3:
	case TAC_E4:
	case TAC_E5:
	case TAC_E6:
	case TAC_E7:
	case TAC_E8:
	case TAC_E9:
	case TAC_E10:
	case TAC_E11:
	case TAC_E12:
	case TAC_E13:	  
		{
			ch->ConvertTacticsLevel(p->kind- TAC_E1);
			break;
		}
	}	//> CSD-030723
}

void SendStoreItemList( int cn, int storelistindex, int menu )
{
	t_packet p;
	int count = 0;
	p.h.header.type = CMD_STORE_ITEMLIST;
	{
		p.u.server_store_itemlist.no				= storelistmax[ storelistindex];
		p.u.server_store_itemlist.smallmenu			= menu;
		p.u.server_store_itemlist.storelistindex	= storelistindex;
	
		for( int i = 0 ; i < storelistmax[ storelistindex] ; i ++)
		{
			if( storelist_attr[ storelistindex][ i] == SIT_EVENT_ITEM || 				
				storelist_attr[ storelistindex][ i] == SIT_NULL	) continue;

			switch( menu )
			{
				case MN_SKILLGUILD_REPAIR	:	break;
				case MN_SKILLGUILD_SELL		:	
				case MN_SHOP_SELL			:	if( storelist_attr[ storelistindex][ i] == SIT_ONLY_SELL ) continue;
													break;
				case MN_SKILLGUILD_BUY		:	
				case MN_SHOP_BUY			:	if( storelist_attr[ storelistindex][ i] == SIT_ONLY_BUY ) continue; 
												break;
				default : break;
			}
			p.u.server_store_itemlist.store_item[count++].item	= storelist[ storelistindex][ i].item_no;
		}
	}
	p.h.header.size = sizeof( t_server_store_itemlist ) - sizeof( k_store_list_item )*(MAX_STORE_ITEM_LIST-count) ;
	QueuePacket(connections, cn, &p, 1);
}

void SendCallSmallMenu( int cn, int storelistindex, int menu )
{
	t_packet p;
	p.h.header.type = CMD_CALL_SMALLMENU;
	{
		p.u.server_call_smallmenu.menu = menu;
		p.u.server_call_smallmenu.storelistindex = storelistindex;
	}
	p.h.header.size = sizeof( t_server_call_smallmenu );
	QueuePacket(connections, cn, &p, 1);
}
//<soto-030421
void SendCallDualMagicLearnMenu( int cn)
{
	t_packet p;
	p.h.header.type = CMD_DUAL_MAGIC_LEARN_BOOK;
	p.h.header.size = 0;
	
	QueuePacket(connections, cn, &p, 1);		
}
//>soto-030421

//<soto-030429
void RecvCallLuckyMenuOpen(int cn)
{
	SendCallLuckyMenuOpen(cn);
}
void	SendCallLuckyMenuOpen(int cn)
{
	t_packet p;
	p.h.header.type = CMD_OPEN_LUCKY_MENU;
	p.h.header.size = 0;
	
	QueuePacket(connections, cn, &p, 1);
}



int LoadGuildItem( char *filename, int num )
{
	FILE *fp;
	fp = fopen( filename, "rt" );
	if( fp == NULL ) return 0;
	
	char buf[MAX_STRING];
	int i=0; 

	while( !feof(fp) )
	{
		fgets(buf, BBS_STRING_MAX, fp);
		if( *buf == ';' ) continue;

		char *token;

//		token = strtok(buf, "\t\n\r");		// number skip
//		if( token == NULL ) break;

		token = strtok(buf, "\t\n\r");
//		token = strtok(NULL, "\t\n\r");		// 酒捞袍 锅龋
		if( token == NULL ) break;
		storelist[num][i].item_no = atoi( token )/100;
		storelist[num][i] = GenerateItem( storelist[num][i].item_no );		// 惑痢篮 叼弃飘 酒捞袍捞 父甸绢 柳促.

		token = strtok(NULL, "\t\n\r");		// 酒捞袍 捞抚		skip

⌨️ 快捷键说明

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