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

📄 kein_item.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}


int IsEqualPosByPos( POS first, POS second )
{
	if( first.type	!= second.type	|| 
		first.p1	!= second.p1	||
		first.p2	!= second.p2	||
		first.p3	!= second.p3 )		return 0;

	return 1;
}

void CheckItem( short int cn ) // 肋给等 酒捞袍阑 啊瘤绊 乐绰瘤
{	//021126 lsw
	CHARLIST *ch = CheckServerId(cn);
	if( !ch ) {return;}

	POS pos = {0,};

	int a=0, b=0, c=0;
	for( a=0; a<3; a++ )
	for( b=0; b<3; b++ )
	for( c=0; c<8; c++ )
	{
		ItemAttr *pItem = &ch->inv[a][b][c];
		if(pItem->item_no)
		{
			if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框 
			{	
				::SetItemPos( INV, a, b, c, &pos );
				::SendServerEachItem( &pos, pItem, cn );
				::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
			}
		}
	}
	
	for( a=0; a<ITEM_EQUIP_MAX; a++ )
	{
		ItemAttr *pItem = &ch->equip[a];
		if(pItem->item_no)
		{
			if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框 
			{
				::SetItemPos( EQUIP, a, &pos );
				::SendServerEachItem( &pos, pItem, cn );
				::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
			}
		}
	}
	
	for( a=0; a<ITEM_QUICK_MAX ; a++ )
	{
		ItemAttr *pItem = &ch->quick[a];
		if(pItem->item_no)
		{
			//soto-030513 狞 5锅篮 缴杭 酒捞袍捞促.
			if( a >= 5)
			{
				::SetItemPos( QUICK, a, &pos );
				::SendServerEachItem( &pos, pItem, cn );
				::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
			}
			else
			if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框 
			{
				::SetItemPos( QUICK, a, &pos );
				::SendServerEachItem( &pos, pItem, cn );
				::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
			}
		}
	}

	for( a=0; a<5; a++ )
	for( b=0; b<3; b++ )
	for( c=0; c<6; c++ )
	{
		ItemAttr *pItem = &ch->bank[a][b][c];
		if(pItem->item_no)
		{
			if(!ItemMgr.CheckFaultItem(*pItem,true))//020116 LSW// 10 殿鞭 捞惑狼 饭绢 棺 捞惑茄 酒捞袍 瘤框 
			{
				::SetItemPos( BANK, a, b, c, &pos );
				::SendServerEachItem( &pos, pItem, cn );
				::SendItemEventLog( pItem, cn, 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
			}
		}
	}

	return;
}

// 020428 YGI acer
int BreakItemByDuration( ItemAttr *pItem, CHARLIST *ch, POS pos )		// 郴备档啊 力肺 老锭 酒捞袍阑 何脚促.
{
	SendItemEventLog( pItem, ch->GetServerID(), SN_NOT_USER, SILT_DELETE_BY_DURATION, 2 ); //YGI acer
	SendDeleteItem( pItem, &pos, ch, true );
	CheckAndSendChangeEquip( ch );

	return 1;
}

int CheckAutoDivideMoney( ItemAttr *item, const short int cn )		// 100000阑 逞篮 酒捞袍 贸府
{//021126 lsw
	CItem *t = ItemUnit( *item );
	if( !t ) {return 0 ;}

	if( t->GetItemKind() != IK_MONEY 
	&&	t->GetItemKind() != IK_NEW_MONEY ) {return 0;}		// 捣老 版快父
	CHARLIST *ch = ::CheckServerId( cn );
	if( !ch ) {return 0;}

	if( item->attr[IATTR_DURATION] > MAX_MONEY ) //100父盔 逞绢啊匙
	{//啊甫 酒捞袍捞 100父盔阑 逞绰促
		int a=0, b=0, c=0;
		if( !::SearchMoneyItem( ch->inv, a, b, c ) )//后傍埃捞唱 捣捞 绝匙
		{//后傍埃捞唱 捣捞 绝匙
			ItemAttr temp_item = *item;//捣酒捞袍阑 temp俊 措涝 
			item->attr[IATTR_MUCH]		= MAX_MONEY;//100父盔栏肺 父甸绢 林绊
			temp_item.attr[IATTR_MUCH] -= MAX_MONEY;//100父盔 焊促 农聪鳖 100父盔阑 哗歹扼档 -蔼篮 救等促
			::SendItemEventLog( &temp_item , cn, cn, SILT_PUT_GROUND_MAX_INVEN, 1 );
			::DropItem( ch->X, ch->Y, &temp_item );//规陛傈 巴俊辑 100父盔 猾 捣阑 官蹿俊 汝赴促
		}//if( !::SearchMoneyItem( ch->inv, a, b, c ) )//后傍埃捞唱 捣捞 绝匙
		else
		{//后傍埃捞唱 捣捞 乐匙
			ItemAttr *new_item = &ch->inv[a][b][c];
			if( new_item->item_no )
			{//弊霸 捣捞扼搁 SearchMoneyItem俊 狼秦 捣锅龋父 府畔 等促
				new_item->attr[IATTR_MUCH] += (item->attr[IATTR_MUCH] - MAX_MONEY);//100父盔 逞扁 锭巩俊 100父盔阑 逞篮 咯盒狼 捣阑 歹茄促
			}
			else
			{//后沫 捞扼搁
				*new_item = *item;
				new_item->attr[IATTR_MUCH] = (item->attr[IATTR_MUCH] - MAX_MONEY);//100父盔 咯盒阑 牢亥俊 持绰促
			}

			item->attr[IATTR_MUCH] = MAX_MONEY;
			::SendServerEachItem( item, ch );//搬苞拱狼 函拳甫 努扼捞攫飘肺 朝妨霖促
			if( new_item->attr[IATTR_MUCH] > MAX_MONEY ) 
			{//林绊抄 酒捞袍捞 100父 逞栏搁 唱床龙锭 鳖瘤 拌加 唱传促
				::CheckAutoDivideMoney( new_item, cn );
			}
			POS pos = {0,};
			::SetItemPos( INV, a, b, c, &pos );
			::SendServerEachItem( &pos, new_item, cn );
			return 1;
		}
	}//if( item->attr[IATTR_DURATION] > MAX_MONEY ) //100父盔 逞绢啊匙
	else//100父盔 救逞匙.. 唱喘 鞘夸啊 绝促
	{
		return 2;
	}
	return 0;
}

////////////////////// 弊 酒捞袍 弊 困摹俊 沥富肺 粮犁窍绰 啊? ////////////////////
bool ExistItem( short int cn, ItemAttr item, POS pos )		// 沥富 粮犁窍绰 啊?
{
	CHARLIST *ch = &connections[cn].chrlst;
	if( !ch ) return false;

	ItemAttr *target = GetItemByPOS( cn, pos );
	if( !target ) return false;
	
	int ret = memcmp( &item, target, sizeof( ItemAttr )  );
	if( ret == 0 ) return true;
	return false;
}

////////////////////////// 酒捞袍 公霸俊 狼茄 movp //////////////////////
int CalcMovpByItem( CHARLIST *ch, int movp )
{
	return movp;
	int result = 0;
	int max = ch->Str * 100;
	if( ch->itemweight <= max ) return movp;

	if( max )
	{
		float rate = ( ch->itemweight - max ) / ((float)max) * 100.0f;
		int move_down = (int) ((rate*2)/100.0f*movp );
		result = movp - move_down;
	}
	if( result < 0 ) result = 0;
	return result;
}

void CheckEquipItem( CHARLIST *ch )		// 酒捞袍阑 捞悼沁阑锭
{
	for( int c=0; c<8; c++ )
	{
		ItemAttr *item = &ch->equip[c];
		if( item->item_no )
		{
			CItem *t = ItemUnit(item->item_no);
			if( !t ) 
			{
				SendItemEventLog( item, ch->GetServerID(), 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
				memset( item, 0, sizeof( ItemAttr ) );
				continue;
			}
			if( !t->GetItemImage() || !t->GetObjectNumber() ) 
			{
				SendItemEventLog( item, ch->GetServerID(), 0, SILT_DELETE_BY_ATTR, 1 ); //YGI acer
				memset( item, 0, sizeof( ItemAttr ) );
				continue;
			}
			t_chr_status_info cstatus;
			POS source = {0, };
			POS dest;
			SetItemPos( EQUIP, c, &dest );
			if( t->is_equipable( ch->GetServerID(), &cstatus, source, dest ) == NOT )
			{
				MoveEmptyInv( item, ch );
				SendServerEachItem( &dest, item, ch->GetServerID()); // 绝绢柳 荤角阑 努扼捞攫飘俊 舅赴促.
				t->ReleaseItem( ch );
				continue;
			}
		}
	}
}

//////////////////////////////////////////////////////////////////////
//		酒捞袍 厘馒俊 狼茄 hp, mana 焊沥
void ChangePlusHp( CHARLIST *ch, int hp_max_plus, int mp_max_plus )
{
	ch->HpMax	+=	hp_max_plus;
	ch->ManaMax	+=	mp_max_plus;
}

int CItem_Weapon::PlusHp(CHARLIST *ch )
{
	if( ch->Spell )	ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
	else			ChangePlusHp( ch, Change_Life_max, Change_mana_max);
	return 1;
}

int CItem_Armor::PlusHp(CHARLIST *ch)
{
	if( ch->Spell )	ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
	else			ChangePlusHp( ch, Change_Life_max, Change_mana_max);
	return 1;
}

int CItem_Accessory::PlusHp(CHARLIST *ch)
{
	if( ch->Spell )	ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
	else			ChangePlusHp( ch, Change_Life_max, Change_mana_max);
	return 1;
}

int CItem_Etc::PlusHp(CHARLIST *ch)
{
	if( ch->Spell )	ChangePlusHp( ch, Change_Life_max, Change_Divine_Max );
	else			ChangePlusHp( ch, Change_Life_max, Change_mana_max);
	return 1;
}
////////////////////////////////////////////////////////////////////////

// 漂沥 酒捞袍苞 郴啊 啊柳 酒捞袍狼 肮荐狼 瞒甫 府畔
int CheckInventory( CHARLIST *ch, int item, int count )
{
	int ct = 0;
	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 == item ) 
				{
					ct++;
				}
			}
		}	
	}

	return ct - count;
}

// 漂沥 酒捞袍阑 盔窍绰 肮荐父怒 瘤款促.
int SendDeleteMuchItemQuantity( CHARLIST *ch, int item, int count )
{
	if( !count ) return 1;
	int ct = 0;

	
	for( int a=0; a<3; a++ )
		for( int b=0; b<3; b++ )
			for( int c=0; c<8; c++ )
			{
				ItemAttr *lpItem = &ch->inv[a][b][c];
				if( lpItem->item_no == item ) 
				{
					if( lpItem->attr[IATTR_MUCH] > count ) 
					{
						lpItem->attr[IATTR_MUCH] -= count;
						POS pos;
						SetItemPos( INV, a, b, c, &pos );
						// 蔼捞 皑家 灯澜阑 焊郴霖促.
						SendChangeDurationByKein( &pos, lpItem->attr[IATTR_MUCH], ch->GetServerID());
						return 1;
					}
					else if( lpItem->attr[IATTR_MUCH] == count )
					{
						POS pos;
						SetItemPos( INV, a, b, c, &pos );
						// 020428 YGI acer
						SendDeleteItem( lpItem, &pos, ch );
						return 1;
					}
					else
					{
						count -= lpItem->attr[IATTR_MUCH];
						POS pos;
						SetItemPos( INV, a, b, c, &pos );
						// 020428 YGI acer
						SendDeleteItem( lpItem, &pos, ch );
						continue;
					}
				}
			}

	return 0;
}

// 漂沥 酒捞袍阑 盔窍绰 肮荐父怒 瘤款促.
int SendDeleteItemQuantity( CHARLIST *ch, int item, int count )
{
	if( !count ) return 1;
	int ct = 0;
	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 == item )
				{
					POS pos;
					SetItemPos( INV, a, b, c, &pos );
					// 020428 YGI acer
					SendItemEventLog( &ch->inv[a][b][c], ch->GetServerID(), -2, SILT_NEED_ITEM, 6 ); //YGI acer
					SendDeleteItem( &ch->inv[a][b][c], &pos, ch );
					ct++;
					if( ct >= count ) return 1;
				}
			}

	return 0;
}

int EquipItem( CHARLIST *ch )//020303 lsw 
{
	for( int i=0; i<8; i++ )
	{
		if( ch->equip[i].item_no )
		{
			CItem *t = ItemUnit( ch->equip[i] );
			if( !t ) continue;
			switch (t->GetWearAble())
			{
				case	WEAR_ANYTHING	:
				case	WEAR_RIGHT_HAND	:
				case	WEAR_LEFT_HAND	:
				case	WEAR_HEAD		:
				case	WEAR_BODY		:
				case	WEAR_NECK		:
				case	WEAR_SHOES		:
				case	WEAR_UNIQUE		:
				case	WEAR_TWO_HAND	:
				{
					t->EquipItem( ch );
				}
				break;

				case	WEAR_BELT		:
				case	WEAR_ONLY_INVEN	:
				default:
				{
				}
				break;
			}

		}
	}
	ResetAbility(ch);
	return 1;
}

int ReleaseItem( CHARLIST *ch )
{
	for( int i=0; i<8; i++ )
	{
		if( ch->equip[i].item_no )
		{
			CItem *t = ItemUnit( ch->equip[i] );
			if( !t ) continue;
			t->ReleaseItem( ch );
		}
	}
//	ch->ResetAbility();
	ResetAbility(ch);//020215 lsw
	return 1;
}

int	DeleteINVItem(CHARLIST*	pChar,int nItemNumber,int nDelCount)
{
	int nDeletedCount = 0;
	for(int i = 0;i < 3;++i)
		for(int j = 0;j < 3;++j)
			for(int k = 0;k < 8;++k)
			{
				if(pChar->inv[i][j][k].item_no == nItemNumber)
				{
					POS pos;
					if(nDelCount == 0)
					{
						SetItemPos( INV, i, j, k, &pos );
						SendItemEventLog( &pChar->inv[i][j][k], pChar->GetServerID(), -2, SILT_NEED_ITEM, 6 );
						SendDeleteItem( &pChar->inv[i][j][k], &pos, pChar );
						++nDeletedCount;
					}
					else
					{
						if(nDelCount > nDeletedCount)
						{
							SetItemPos( INV, i, j, k, &pos );
							SendItemEventLog( &pChar->inv[i][j][k], pChar->GetServerID(), -2, SILT_NEED_ITEM, 6 );
							SendDeleteItem( &pChar->inv[i][j][k], &pos, pChar );
							++nDeletedCount;
						}
						else
						{
							continue;
						}
					}
				}
			}

	return nDeletedCount;
}

⌨️ 快捷键说明

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