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

📄 itemlist.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
#include "..\stdafx.h"
#include "DefaultHeader.h"
#include "CItem.h"


#include "../LowerLayers/MyLog.h"




extern HDBC hDBC;
extern void rollDice(int, int &) ;



ITEMLIST ItemList[MAX_ITEM_LIST];
ItemsInBox Itemsinbox[ MAX_TABLE_ITEMS_IN_BOX];
int		   ItemsinboxMax;

typedef struct t_StoreItemList
{	int no;
	ItemAttr item[ 100];
	ItemAttr unique[10];
}STOREITEMLIST, *LPSTOREITEMLIST;

#define MAX_STORE 10
STOREITEMLIST  StoreItemList[ MAX_STORE];



//--------------------------------------------------------
void InitItemList(void)
{
	int i;

	  for(i = 0; i < MAX_ITEM_LIST; i ++)
			ItemList[i].bAlive = REMOVE_;
};

//--------------------------------------------------------
int  GetAliveItemList(void)
{
	int i;

	  for(i = 0; i < MAX_ITEM_LIST; i ++)
		{
			if(ItemList[i].bAlive == FALSE)
				return(i);
		}

		return(-1);
};











//--------------------------------------------------------
int  AddItemList(int item_no, unsigned int attr[6], int dumno, int x, int y, int offx, int offy,  int dsx, int dsy, int ddx, int ddy )
{	
	int Num;
	
	if( item_no == 0 ) return -1;
	
	Num = GetAliveItemList();
	if(Num < 0)	return(-1);
	
	if( ( item_no == IN_COINS ||  item_no == IN_COIN ) && attr[ IATTR_MUCH] ==0 ) return -1; 
	if( ( item_no == IN_NEW_COINS ||  item_no == IN_NEW_COIN ) && attr[ IATTR_MUCH] ==0 ) return -1;		// 010210 YGI
	
	ITEMLIST *i = &ItemList[Num];
		
	i->item_no		= item_no;
	i->attr[0]		= attr[0];
	i->attr[1]		= attr[1];
	i->attr[2]		= attr[2];
	i->attr[3]		= attr[3];
	i->attr[4]		= attr[4];
	i->attr[5]		= attr[5];
	i->x			= x;							
	i->y			= y;						
	i->offx			= offx;						
	i->offy			= offy;								
	i->bAlive		= ALIVE_;								
	i->dumno		= dumno;							
	
	i->dsx			= dsx;								
	i->dsy			= dsy;						
	i->ddx			= ddx;											
	i->ddy			= ddy;						

	i->birthday		= g_curr_time;
	i->bObject		= 0;	//021030 YGI
	
	// Box老版快 冠胶甫 何角锭, 积己瞪 Item苞 捣阑 持绢敌促.
	if( i->attr[ IATTR_ATTR] & IA2_BOX )									
	{
		int n = i->dumno;
											
		int dum		= Itemsinbox[n].item[rand()%40];
		int m		= Itemsinbox[n].money[rand()%10];
		int q		= Itemsinbox[n].quantity;
		int	attrbroadcast = 0;
		
		i->dum[0] = 0;
		i->dum[1] = 0;
		for( int j = 0 ; j < q ; j ++)	i->dum[j] = dum;							
		 i->money = m;								
	}
	
	SetArea( ADD_ITEM_AREA, Num);

	return(Num);
};		
		
//--------------------------------------------------------
void RemoveItemList(int Num)
{		
		if( Num < 0 ) return;
		if( Num >= MAX_ITEM_LIST ) return;
	
		ItemList[Num].bAlive = FALSE;
		SetArea(REMOVE_ITEM_AREA, Num);
};

//--------------------------------------------------------


int LoadItemsInBoxTableSQL( void )
{
	HSTMT hStmt= NULL ;
	RETCODE ret ;
	SWORD nCols ;
	SDWORD cbValue ;
	int c= 1, i ;
	int n;

	SQLAllocStmt(hDBC, &hStmt);
	ret= SQLExecDirect(hStmt, (UCHAR *)"select * from ItemsBox_new order by NO", SQL_NTS) ;

	if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 
	{
		MyLog( LOG_NORMAL, "'ItemsBox_new': ExecDirect Error " );
		return -1 ;
	}

	SQLNumResultCols(hStmt, &nCols) ;
	
	ret= SQLFetch(hStmt) ;
	if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 
	{
		MyLog( LOG_NORMAL, "'ItemsBox_new': Fetch Error ") ;
		return -1 ;
	}
		
	int temp;
	int j;
	for( n = 0, i = 0 ; i < MAX_TABLE_ITEMS_IN_BOX ; i ++)
	{
		// Accquire the DATA
		c = 1;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 	goto ERROR_;

		for( j = 0 ; j < 40 ; j ++)
		{
			ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
			if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 	goto ERROR_;
			if( temp >= 100 ) temp /= 100;
			Itemsinbox[n].item[j] = temp;
		}

		for( j = 0 ; j < 10 ; j ++) // money;
		{
			ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
			if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 	goto ERROR_;
			Itemsinbox[n].money[j] = temp;
		}

		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 	goto ERROR_;
		Itemsinbox[n].quantity = temp;

		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret != SQL_SUCCESS_WITH_INFO && ret != SQL_SUCCESS) 	goto ERROR_;
		Itemsinbox[n].lev = temp;

		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Village = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Out_village1 = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Out_village2 = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Out_village3 = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Castle_out   = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Castle_in	   = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Fire_Dungeon = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Ice_Dungeon  = temp;
		ret= SQLGetData(hStmt, c++, SQL_C_SLONG, &temp, sizeof(int), &cbValue) ;
		if(ret == SQL_SUCCESS_WITH_INFO || ret == SQL_SUCCESS) 	Itemsinbox[n].Human_Dungeon= temp;
		ret= SQLFetch(hStmt) ;			


		switch( MapNumber )
		{
			//MA-IN
			case 0 :		if( Itemsinbox[n].Village )			n++; break;
			//K_SUNG2
			case 1 :		if( Itemsinbox[n].Castle_out )		n++; break;
			//FIREDUN1
			case 2 :		if( Itemsinbox[n].Fire_Dungeon )	n++; break;
			//ICE-W01	
			case 3 :		if( Itemsinbox[n].Ice_Dungeon )		n++; break;
			//SOURCE		
			case 4 :		if( Itemsinbox[n].Out_village1 )	n++; break;
			//MANDUN
			case 5 :		if( Itemsinbox[n].Human_Dungeon )	n++; break;
			//SUNG_TILE_00		
			case 6 :		if( Itemsinbox[n].Castle_in )		n++; break;
		}
	}

	SQLFreeStmt(hStmt, SQL_DROP) ;
	ItemsinboxMax = n;
	return n ;

ERROR_:

	MyLog( LOG_NORMAL, "'ItemsBox_new': Error( ItemsInBox ) : %d  \n", c );

	return 0;
}




// 泅犁 荤侩 救窃.
void SendItemExplotion( int cn, int id ) 
{	
	t_packet p;
	int eff;
	int tx = ItemList[id].x;
	int ty = ItemList[id].y;
	
	if( ItemList[id].item_no % 2 ) eff = 208;
	else  eff = 257;
		
	p.h.header.type = CMD_INSERT_MAGIC;
	{	
		p.u.server_insert_magic.item_id		= id;
		p.u.server_insert_magic.effectno	= eff;
		p.u.server_insert_magic.tx			= tx;
		p.u.server_insert_magic.ty			= ty;
	}	
	p.h.header.size = sizeof( t_server_insert_magic );
	
	QueuePacket( connections, cn, &p, 1 );
}	
	
	

	
// Box阑 何荐绊 抄第 Item阑 惯积矫虐芭唱 气颇矫虐绰 贸府甫 茄促. 
/*void ProcessItemsInBox( int boxitemid )
{		
	if( boxitemid < 0  || boxitemid >= MAX_ITEM_LIST ) return;
		
	ITEMLIST *i = &ItemList[ boxitemid];
	if( i->bAlive != ALIVE_ ) return;
	int n = i->dum;
	if( n < 0 || n >= MAX_TABLE_ITEMS_IN_BOX ) return;
		
	if( !(i->attr[IATTR_ATTR] & IA2_BOX ) ) return; // Box啊 酒聪搁....
		
	ItemAttr	item;
	int itemno	= Itemsinbox[n].item[rand()%40];
	int m		= Itemsinbox[n].money[rand()%10];
	int q		= Itemsinbox[n].quantity;
	int	attrbroadcast = 0;
		
	//	酒捞袍阑 惯积矫挪促. 
	if( itemno != -1 )
	{	
		for( int j  = 0 ; j < q ; j ++)
		{
			item = GenerateItem( itemno/ 1000, itemno%1000, 0, 100 );
			//int  AddItemList(int item_no, unsigned int attr[6], int dum, int x, int y, int offx, int offy )
			AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->x + 30 + (rand()%32), 0,0 );
		
			i->attr[ IATTR_ATTR] |= IA2_OPENED;
			attrbroadcast = 1;
		}
	}	
	else
	{	
		SetArea(	ITEM_EXPLOTION_AREA,	boxitemid );
		SetArea(	REMOVE_ITEM_AREA,		boxitemid );
		// 气颇...
		return;
	}	
		
	//	捣阑 惯积矫挪促. 
	if( m > 0 ) 
	{	
		item = GenerateItem( itemno/ 1000, itemno%1000, m, 0, 100 );
		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->x + 30 + (rand()%32), 0,0 );
		i->attr[ IATTR_ATTR] |= IA2_OPENED;
		attrbroadcast = 1;
	}	
		
	if( attrbroadcast)
	{	
		SetArea( CHANGE_IA2_ATTR_ITEM_AREA,	boxitemid );
	}	
}		*/


// 拳混肺 BoxItem阑 筋绰 何盒锭巩俊 唱柯 Packet... 0209 KHS
void RecvCMD_JUST_ATTACK_ANIMATION( int cn, t_client_just_attack_animation *p )
{
	t_packet packet;
	int boxitemid = p->item_id;
	
	if( boxitemid < 0 || boxitemid >= MAX_ITEM_LIST ) return;
	if( ItemList[boxitemid].attr[ IATTR_ATTR] & IA2_OPENED ) return; // 凯妨 乐栏搁 府畔.


	packet.h.header.type = CMD_ITEM_BOX_BREAK;
	{
		packet.u.server_item_box_break.server_id = cn;
		packet.u.server_item_box_break.item_id = boxitemid;
		packet.u.server_item_box_break.type = 0;
	}
	packet.h.header.size = sizeof( t_server_item_box_break );

	QueuePacket( connections, cn, &packet, 1 );
	CastMe2Other( cn, &packet );
}





void RecvCMD_ITEM_BOX_BREAK( int cn, t_client_item_box_break *p )
{
	t_packet packet;
	int type;
	int boxitemid = p->item_id;

	
	if( boxitemid < 0 || boxitemid >= MAX_ITEM_LIST ) return;
	if( ItemList[boxitemid].attr[ IATTR_ATTR] & IA2_OPENED ) return; // 凯妨 乐栏搁 府畔.

	if( ItemList[boxitemid].dum[0] == -1 || 
		ItemList[boxitemid].dum[1] == -1 ||
		ItemList[boxitemid].money  == -1  ) type = 0;
	else type = 1;



	ItemList[boxitemid].attr[ IATTR_ATTR] |= IA2_OPENED;
	ItemList[boxitemid].attr[ IATTR_LIMIT] = g_curr_time + ITEM_BOX_REFRESH_TIME + ( rand() % ITEM_BOX_REFRESH_TIME ); //ran( 100 );

	packet.h.header.type = CMD_ITEM_BOX_BREAK;
	{
		packet.u.server_item_box_break.server_id = cn;
		packet.u.server_item_box_break.item_id = boxitemid;
		packet.u.server_item_box_break.type = type;
	}
	packet.h.header.size = sizeof( t_server_item_box_break );

	QueuePacket( connections, cn, &packet, 1 );
	CastMe2Other( cn, &packet );
}


void RecvCMD_ITEM_BOX_BREAK_RESULT( int cn, t_client_item_box_break_result *p )
{
	int boxitemid = p->item_id;
	ITEMLIST *i;

	if( boxitemid < 0 || boxitemid >= MAX_ITEM_LIST ) return;
	
	i = &ItemList[boxitemid];

	if( !(i->attr[ IATTR_ATTR] & IA2_OPENED) ) return; // 凯妨 乐栏搁 府畔.
		
	int attrbroadcast = 0;
	ItemAttr item;
	if( i->dum[0] > 0 )
	{	
		item = GenerateItem( i->dum[0] );//020509 lsw
		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
	if( i->dum[1] > 0 )
	{	
		item = GenerateItem( i->dum[1] );//020509 lsw
		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
		
	//	捣阑 惯积矫挪促. 
	if( i->money > 0 ) 
	{	
		if(LocalMgr.IsChangeMoney())//030102 lsw
		{
			if( i->money <= 5 ) 
				item = GenerateItem( IN_NEW_COIN, IATTR_MUCH, i->money);//020509 lsw
			else 
				item = GenerateItem( IN_NEW_COINS, IATTR_MUCH,	i->money);//020509 lsw
		}
		else
		{
			if( i->money <= 5 ) 
				item = GenerateItem( IN_COIN, IATTR_MUCH, i->money);//020509 lsw
			else 
				item = GenerateItem( IN_COINS, IATTR_MUCH, i->money);//020509 lsw
		}

		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
		
	SetArea( CHANGE_IA2_ATTR_ITEM_AREA,	boxitemid );
}

void RecvCMD_ITEM_BOX_MAGIC_BREAK( int cn, t_client_item_box_magic_break	*p )
{
	t_packet packet;
	int type;
	int boxitemid = p->item_id;
	ITEMLIST *i;
	
	if( boxitemid < 0 || boxitemid >= MAX_ITEM_LIST ) return;
	if( ItemList[boxitemid].attr[ IATTR_ATTR] & IA2_OPENED ) return; // 凯妨 乐栏搁 府畔.
	i = &ItemList[boxitemid];

	if( i->dum[0] == -1 || i->dum[1] == -1 ||i->money  == -1  ) type = 0;	// 气颇矫挪促. 
	else type = 1;	// 捣捞唱 酒捞袍阑 霖促. 

	ItemList[boxitemid].attr[ IATTR_ATTR] |= IA2_OPENED;
	ItemList[boxitemid].attr[ IATTR_LIMIT] = g_curr_time + 300 + (rand()%100);

	if( type == 0 )
	{
		packet.h.header.type = CMD_ITEM_BOX_MAGIC_BREAK_RESULT;
		{
			packet.u.server_item_box_magic_break_result.item_id = boxitemid;
			packet.u.server_item_box_magic_break_result.type	= type;
		}
		packet.h.header.size = sizeof( t_server_item_box_magic_break_result );
		QueuePacket( connections, cn, &packet, 1 );
		CastMe2Other( cn, &packet );
	}
		
	int attrbroadcast = 0;

	ItemAttr item;
	if( i->dum[0] > 0 )
	{	
		item = GenerateItem( i->dum[0]);//020509 lsw
		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
	if( i->dum[1] > 0 )
	{	
		item = GenerateItem( i->dum[1]);//020509 lsw
		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
		
	//	捣阑 惯积矫挪促. 
	if( i->money > 0 ) 
	{	
		if(LocalMgr.IsChangeMoney())//030102 lsw
		{
			if( i->money > 5 )	item = GenerateItem( IN_NEW_COINS, IATTR_MUCH, i->money);//020509 lsw
			else				item = GenerateItem( IN_NEW_COIN, IATTR_MUCH, i->money);//020509 lsw
		}
		else 
		{
			if( i->money > 5 )	item = GenerateItem( IN_COINS, IATTR_MUCH, i->money);//020509 lsw
			else				item = GenerateItem( IN_COIN, IATTR_MUCH, i->money);//020509 lsw
		}

		AddItemList( item.item_no, item.attr, 0, i->x + 30 + (rand()%32),  i->y + 30 + (rand()%32), 0,0 );
	}	
		
	SetArea( CHANGE_IA2_ATTR_ITEM_AREA,	boxitemid );
}

⌨️ 快捷键说明

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