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

📄 itemmanager_composite.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "stdafx.h"
#include <ResultCode.h>
#include "SCItemSlotContainer.h"
#include ".\itemmanager.h"
#include "RatioManager.h"
#include <ItemCompositeParser.h>
#include <SocketOptionParser.h>
#include "Player.h"
#include "SlotManager.h"
#include "GameServer.h"
#include <EnchantParser.h>
#include <RankOptionParser.h>
#include <SCRankInfo.h>

RC::eITEM_RESULT ItemManager::EnchantEx( POSTYPE TargetPos, BYTE SuccessRateIndex )
{
	if( !IsPossibleFunction( eFUNCTIONALTYPE_ENCHANT ) )
		return RC::RC_ITEM_UNUSABLE_FUNCTION;

	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !ValidPos(  SI_INVENTORY, TargetPos ) )
		return RC::RC_ITEM_INVALIDPOS;


	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	SCItemSlot & rTargetSlot = (SCItemSlot &)pInventory->GetSlot(TargetPos);
	if( !rTargetSlot.GetItemInfo()->IsWeapon() &&
		!rTargetSlot.GetItemInfo()->IsArmor() )
	{
		return RC::RC_ITEM_ITEMCODENOTEQUAL;
	}

	sENCHANT_MATERIALS * pNeedMaterial = NULL;
	if( rTargetSlot.GetItemInfo()->IsWeapon() )
	{
		pNeedMaterial = EnchantParser::Instance()->FindEnchantWeaponMatInfo( rTargetSlot.GetItemInfo()->m_LV );
	}
	else if( rTargetSlot.GetItemInfo()->IsArmor() )
	{
		pNeedMaterial = EnchantParser::Instance()->FindEnchantArmorMatInfo( rTargetSlot.GetItemInfo()->m_LV );
	}
	if( !pNeedMaterial )
	{
		return RC::RC_ITEM_ENCHANT_INVALID_ITEMLEVEL;
	}

	INT SuccessRate = 100;
	FLOAT NeedMaterialProduct = 0.0f;
	const BYTE Enchant = rTargetSlot.GetEnchant();
	BOOL bLowEnchant = FALSE;
	switch( Enchant )
	{
	case 0: case 1: case 2: case 3: case 4: case 5:
		{
			bLowEnchant = TRUE;
			if( SuccessRateIndex != 3 )
			{
				return RC::RC_ITEM_ENCHANT_INVALID_RATE_INDEX;
			}
		}break;
	}
	
	// 己傍犬伏苞 犁丰 俺荐 炼扒
	switch( SuccessRateIndex )
	{
	case 0: SuccessRate = 25;	NeedMaterialProduct = 0.5f; break;
	case 1: SuccessRate = 50;	NeedMaterialProduct = 1.0f; break;
	case 2: SuccessRate = 75;	NeedMaterialProduct = 1.5f; break;
	case 3: 	
		{
			SuccessRate = 100;
			if( bLowEnchant )
				NeedMaterialProduct = 1.0f; 
			else
				NeedMaterialProduct = 2.0f; 
		}break;
	default:
		{
			return RC::RC_ITEM_ENCHANT_INVALID_RATE_INDEX;
		}break;
	}

	//肺弊颇老阑 巢扁扁 困茄 牢镁飘 沥焊 vector
	vector<COMPOSITEMATERIAL> vecMatInfo;

	// 家葛且 犁丰啊 乐绰瘤 眉农
	sMATERIALS * pMaterials = pNeedMaterial->m_EnchantMaterial[(Enchant+1)].m_Material;
	for( INT i = 0 ; i < MAX_ENCHANT_MATERIAL_NUM ; ++i )
	{
		if( 0 == pMaterials[i].m_MaterialItemCode || 0 == pMaterials[i].m_MaterialItemNum )
			continue;
		EmptyItemCheck EmptyCheck( pMaterials[i].m_MaterialItemCode, (POSTYPE)(pMaterials[i].m_MaterialItemNum*NeedMaterialProduct+0.5f) );
		if( !ForeachSlot( SI_INVENTORY, EmptyCheck ) )
			return RC::RC_ITEM_ENCHANT_HAVENOTMETERIALS;

		COMPOSITEMATERIAL info;
		info.nMaterialCode = pMaterials[i].m_MaterialItemCode;
		info.wCntMaterial = (POSTYPE)(pMaterials[i].m_MaterialItemNum*NeedMaterialProduct+0.5f);//< taiyo : 俺荐 滚弊 荐沥
		vecMatInfo.push_back( info );
	}

	// 牢镁飘 矫档 肺弊 巢扁扁(咯扁俊 巢扁绰 捞蜡绰 牢镁飘 矫虐绰 焊籍 沥焊甫 咯扁辑 备窍扁 锭巩捞促.)
	GAMELOG->WriteEnchantStart( m_pPlayer, g_pGameServer->GetServerGUID(), vecMatInfo );

	// 犁丰 绝局扁
	for( POSTYPE i = 0 ; i < MAX_ENCHANT_MATERIAL_NUM ; ++i )
	{
		if( 0 == pMaterials[i].m_MaterialItemCode || 0 == pMaterials[i].m_MaterialItemNum )
			continue;

		DeleteItem DeleteOperator( pMaterials[i].m_MaterialItemCode, (POSTYPE)(pMaterials[i].m_MaterialItemNum*NeedMaterialProduct+0.5f) );
		BOOL rt = ForeachSlot( SI_INVENTORY, DeleteOperator );
		ASSERT(rt);
	}

	// 牢镁飘 犬伏 贸府
	INT seed = random(1, 100);
	if( seed < SuccessRate )
	{
		// 牢镁飘 己傍
		rTargetSlot.SetEnchant( Enchant + 1 );

		//////////////////////////////////////////////////////////////////////////
		// 牢镁飘 己傍 肺弊颇老 
		GAMELOG->WriteEnchantResult( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rTargetSlot, vecMatInfo );

		return RC::RC_ITEM_ENCHANT_SUCCESS;
	}

	//////////////////////////////////////////////////////////////////////////
	// 牢镁飘 角菩 肺弊颇老 
	GAMELOG->WriteEnchantResult( m_pPlayer, g_pGameServer->GetServerGUID(), 	FALSE, &rTargetSlot, vecMatInfo );

	return RC::RC_ITEM_ENCHANT_FAILED;
}

RC::eITEM_RESULT ItemManager::Enchant( POSTYPE TargetPos, BYTE & OUT ResultEnchant )
{
	if( !IsPossibleFunction( eFUNCTIONALTYPE_ENCHANT ) )
		return RC::RC_ITEM_UNUSABLE_FUNCTION;
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !ValidPos(  SI_INVENTORY, TargetPos ) )
		return RC::RC_ITEM_INVALIDPOS;

	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	SCItemSlot & rTargetSlot = (SCItemSlot &)pInventory->GetSlot(TargetPos);
	if( !rTargetSlot.GetItemInfo()->IsWeapon() &&
		!rTargetSlot.GetItemInfo()->IsArmor() )
	{
		return RC::RC_ITEM_ITEMCODENOTEQUAL;
	}

	BYTE Enchant = rTargetSlot.GetEnchant();
	eITEMCOMPOSITECODE eCode;
	switch( Enchant )
	{
	case 0: case 1: case 2: case 3: case 4: case 5: { eCode = eITEMCOMPOSITE_LOW_ENCHANT; } break;
	case 6: case 7: case 8:							{ eCode = eITEMCOMPOSITE_MEDIUM_ENCHANT; } break;
	case 9: case 10: case 11:						{ eCode = eITEMCOMPOSITE_HIGH_ENCHANT; } break;
	default:										{  ASSERT( NULL );	return RC::RC_ITEM_INVALIDSTATE; }
	}


	// 牢亥牢啊 NPC牢啊俊 蝶扼 芭府 惑怕 眉农

	// 犁丰啊 乐绰瘤俊 措茄 眉农
	// 俺荐 眉农
	sITEMCOMPOSITE * pCInfo = ItemCompositeParser::Instance()->GetCompositeInfo(eCode);
	ASSERT( pCInfo );

	if( m_pPlayer->GetMoney() < pCInfo->m_Money )
		return RC::RC_ITEM_HAVENOTMONEY;

	sITEMCOMPOSITEMATERIAL *  pMaterials = pCInfo->m_sCompositeMaterials;

	//肺弊颇老阑 巢扁扁 困茄 牢镁飘 沥焊
	vector<COMPOSITEMATERIAL> vecMatInfo;

	for( POSTYPE i = 0 ; i < pCInfo->m_byMatCount ; ++i )
	{
		if( pMaterials[i].m_dwCompositeMaterialCode == 0 ) continue;

		EmptyItemCheck EmptyCheck( pMaterials[i].m_dwCompositeMaterialCode, pMaterials[i].m_bySpendMaterialNum );
		if( !ForeachSlot( SI_INVENTORY, EmptyCheck ) )
			return RC::RC_ITEM_ENCHANT_HAVENOTMETERIALS;

		COMPOSITEMATERIAL info;
		info.nMaterialCode = pMaterials[i].m_dwCompositeMaterialCode;
		info.wCntMaterial = pMaterials[i].m_bySpendMaterialNum;
		vecMatInfo.push_back( info );
	}

	// 牢镁飘 矫档 肺弊 巢扁扁(咯扁俊 巢扁绰 捞蜡绰 牢镁飘 矫虐绰 焊籍 沥焊甫 咯扁辑 备窍扁 锭巩捞促.)
	GAMELOG->WriteEnchantStart( m_pPlayer, g_pGameServer->GetServerGUID(), vecMatInfo );

	// 犁丰 绝局扁
	for( POSTYPE i = 0 ; i < pCInfo->m_byMatCount ; ++i )
	{
		if( pMaterials[i].m_dwCompositeMaterialCode == 0 ) continue;

		DeleteItem DeleteOperator( pMaterials[i].m_dwCompositeMaterialCode, pMaterials[i].m_bySpendMaterialNum );
		BOOL rt = ForeachSlot( SI_INVENTORY, DeleteOperator );
		ASSERT(rt);
	}
	// 捣瞒皑
	BOOL ret = m_pPlayer->MinusMoney( pCInfo->m_Money );
	ASSERT(ret);

	BYTE RatioIndex = Enchant;
	if( RatioIndex >= 6 )
	{
		// 牢镁飘 犬伏 利侩
		RatioIndex -= 6;
		ASSERT( RatioIndex < RatioManager::MAX_ENCHANT_SELECTER_NUM );
		DWORD key = g_Ratio.m_EnchantRatioSelecter[RatioIndex].RandomizedKey();
		if( key == 1 )
		{
			// 角菩
			if( Enchant == 6 || Enchant == 7 || Enchant == 8 )
			{
				rTargetSlot.SetEnchant( Enchant - 1 );
				ResultEnchant = Enchant - 1;

				//////////////////////////////////////////////////////////////////////////
				// 牢镁飘 角菩 肺弊颇老 
				GAMELOG->WriteEnchantResult( m_pPlayer, g_pGameServer->GetServerGUID(), FALSE, &rTargetSlot, vecMatInfo );

				return RC::RC_ITEM_ENCHANT_DOWN_FAILED;
			}
			else
			{
				// 厘厚 家戈
				pInventory->DeleteSlot( TargetPos, NULL );
				return RC::RC_ITEM_ENCHANT_CRACK_FAILED;
			}
			
		}
	}

	rTargetSlot.SetEnchant( Enchant + 1 );
	ResultEnchant = Enchant + 1;

	//////////////////////////////////////////////////////////////////////////
	// 牢镁飘 己傍 肺弊颇老 
	GAMELOG->WriteEnchantResult( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rTargetSlot, vecMatInfo );

	
	return RC::RC_ITEM_ENCHANT_SUCCESS;
}

// 珐农 酒捞袍 家南 积己
BOOL ItemManager::CreateRankItemSocketHole( SCItemSlot* pItemSlot, BYTE byCurRank )
{
	BOOL bCreatedSocket = FALSE;
	switch( pItemSlot->GetItemInfo()->m_wType )
	{
		// 公扁
	case eITEMTYPE_TWOHANDAXE:	
	case eITEMTYPE_TWOHANDSWORD:	
	case eITEMTYPE_ONEHANDSWORD:
	case eITEMTYPE_SPEAR:
	case eITEMTYPE_WHIP:		
	case eITEMTYPE_ETHERCLAW:	
	case eITEMTYPE_ONEHANDCROSSBOW:
	case eITEMTYPE_ETHERWEAPON:
	case eITEMTYPE_STAFF:
	case eITEMTYPE_ORB:
		// 规绢备
	case eITEMTYPE_ARMOR:
	case eITEMTYPE_PANTS:
	case eITEMTYPE_BOOTS:
	case eITEMTYPE_GLOVE:
		{	
			BYTE SocketNum	= pItemSlot->GetSocketNum();
			if( (byCurRank+1) <= RANK_B && SocketNum < 3 )
			{
				ASSERT( pItemSlot->GetRank() == (byCurRank+1) );
				BYTE SelectRank	= pItemSlot->GetRank() - RANK_D;
				BYTE seed = random( 1, 100 );
				if( seed <= g_Ratio.m_SocketRatio[SelectRank].Ratio[SocketNum] )
				{
					// 己傍
					pItemSlot->SetSocketNum(pItemSlot->GetSocketNum()+1);
					bCreatedSocket = TRUE;
				}
			}
		}break;
	}

	return bCreatedSocket;
}

// 茄窜拌 珐农诀阑 茄促.
BOOL ItemManager::ItemRankUp( SCItemSlot * pItemSlot )
{
	ASSERT( pItemSlot->GetRank() != RANK_PS );

	eRANK_OPTION_ITEM_TYPE ItemType = SCRankInfo::GetRankOptionItemType( pItemSlot->GetItemInfo()->m_wType );
	if( ItemType == eRANK_OPTION_ITEM_TYPE_MAX )
		return FALSE;

	BYTE curRank = pItemSlot->GetRank();
	sRANK_OPTION_SELECTOR * pSelector = RankOptionParser::Instance()->GetRankOptionSelector( ItemType, (eRANK)(curRank + 1) );
	if( !pSelector ) return FALSE;

	BYTE seed = random( 0, pSelector->m_OptionCount-1 );
	DWORD OptionType = pSelector->m_OptionIndex[seed];
	sRANK_OPTION * pRankOption = RankOptionParser::Instance()->GetRankOption( ItemType, OptionType );
	if( !pRankOption ) return FALSE;

	ASSERT( pRankOption->m_iOptionIndex != 0 );
	ASSERT( pRankOption->m_OptionNCode != 0 );
	ASSERT( pRankOption->m_Value[curRank+1] != 0 );
	// 珐农 可记 汲沥
	pItemSlot->SetRank((eRANK)(curRank+1));
	pItemSlot->SetRankAttr((eRANK)(curRank+1), pRankOption );

	return TRUE;
}

RC::eITEM_RESULT ItemManager::RankUpEx( POSTYPE TargetPos1, POSTYPE TargetPos2, 
									   POSTYPE & OUT RankUpItemPos, POSTYPE & OUT DeletedItemPos, 
									   MONEY & OUT RankUpFare, BOOL & OUT bCreatedSocket )

{
	if( !IsPossibleFunction( eFUNCTIONALTYPE_RANKUP ) )
		return RC::RC_ITEM_UNUSABLE_FUNCTION;

	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !ValidPos( SI_INVENTORY, TargetPos1 ) )
		return RC::RC_ITEM_INVALIDPOS;
	if( !ValidPos(  SI_INVENTORY, TargetPos2 ) )
		return RC::RC_ITEM_INVALIDPOS;

	if( TargetPos1 == TargetPos2 )
		return RC::RC_ITEM_INVALIDPOS;

	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	SCItemSlot & rTargetSlot1 = (SCItemSlot &)pInventory->GetSlot(TargetPos1);
	SCItemSlot & rTargetSlot2 = (SCItemSlot &)pInventory->GetSlot(TargetPos2);

	if( rTargetSlot1.GetCode() != rTargetSlot2.GetCode() ||
		rTargetSlot1.GetRank() != rTargetSlot2.GetRank() )
	{
		return RC::RC_ITEM_INVALID_CONDITION;
	}

	// +S 珐农捞惑 珐农 阂啊瓷
	if( rTargetSlot1.GetRank() == RANK_PS )
	{
		return RC::RC_ITEM_NO_MORE_RANK;
	}

	RankUpFare = (rTargetSlot1.GetPriceForBuy()/2);

	// 珐农诀 夸陛篮 乐绰瘤 眉农
	if( m_pPlayer->GetMoney() < RankUpFare )
	{
		return RC::RC_ITEM_INSUFFICIENT_MONEY;
	}

	if( rTargetSlot1.GetItemInfo()->IsWeapon() || 
		rTargetSlot1.GetItemInfo()->IsArmor() )
	{
		// 悼鞭 牢镁飘 牢瘤 眉农
		if( rTargetSlot1.GetEnchantLV() != rTargetSlot2.GetEnchantLV() )
		{
			return RC::RC_ITEM_INVALID_CONDITION;
		}

		switch( rTargetSlot1.GetRank() )
		{
		case RANK_B: case RANK_MA: case RANK_A:
			{
				// 吝鞭捞惑狼 牢镁飘咯具 窃
				if( rTargetSlot1.GetEnchantLV() < ENCHANT_MIDDLE )
				{
					return RC::RC_ITEM_INVALID_CONDITION;
				}
			}break;
		case RANK_PA: case RANK_MS: case RANK_S:
			{
				// 惑鞭捞惑狼 牢镁飘咯具 窃
				if( rTargetSlot1.GetEnchantLV() < ENCHANT_HIGH )
				{
					return RC::RC_ITEM_INVALID_CONDITION;
				}
			}break;
		}
	}

	//eRANK_OPTION_ITEM_TYPE ItemType = GetRankOptionItemType( rTargetSlot1.GetItemInfo()->m_wType );
	//if( ItemType == eRANK_OPTION_ITEM_TYPE_MAX )
	//	return RC::RC_ITEM_CANNT_RANKUP_ITEM;


	// 快急 霉锅掳 酒捞袍阑 珐农诀 酒捞袍栏肺 急琶
	SCItemSlot * pSelectedItemSlot = &rTargetSlot1;
	RankUpItemPos	= rTargetSlot1.GetPos();
	DeletedItemPos	= rTargetSlot2.GetPos();
	int seed = random(0, 99);
	if( seed < 30 )
	{
		// 2锅掳 酒捞袍 急琶
		pSelectedItemSlot	= &rTargetSlot2;
		RankUpItemPos		= rTargetSlot2.GetPos();
		DeletedItemPos		= rTargetSlot1.GetPos();
	}

	BYTE curRank = pSelectedItemSlot->GetRank();

	if( !ItemRankUp( pSelectedItemSlot ) )
		return RC::RC_ITEM_CANNT_RANKUP_ITEM;

	// 牢镁飘绰 臭篮 率 傈铰
	if( rTargetSlot1.GetEnchant() >= rTargetSlot2.GetEnchant() )
		pSelectedItemSlot->SetEnchant( rTargetSlot1.GetEnchant() );
	else
		pSelectedItemSlot->SetEnchant( rTargetSlot2.GetEnchant() );

/*
	BYTE curRank = pSelectedItemSlot->GetRank();
	sRANK_OPTION_SELECTOR * pSelector = RankOptionParser::Instance()->GetRankOptionSelector( ItemType, (eRANK)(curRank + 1) );
	if( !pSelector ) return RC::RC_ITEM_CANNT_RANKUP_ITEM;

	seed = random( 0, pSelector->m_OptionCount-1 );
	DWORD OptionType = pSelector->m_OptionIndex[seed];
	sRANK_OPTION * pRankOption = RankOptionParser::Instance()->GetRankOption( ItemType, OptionType );
	if( !pRankOption ) return RC::RC_ITEM_CANNT_RANKUP_ITEM;
	
	ASSERT( pRankOption->m_iOptionIndex != 0 );
	ASSERT( pRankOption->m_OptionNCode != 0 );
	ASSERT( pRankOption->m_Value[curRank+1] != 0 );
	// 珐农 可记 汲沥
	pSelectedItemSlot->SetRank((eRANK)(curRank+1));
	//pSelectedItemSlot->SetRankAttr((eRANK)(curRank+1), (eATTR_TYPE)OptionType, pRankOption->m_Value[curRank+1] );
	pSelectedItemSlot->SetRankAttr((eRANK)(curRank+1), pRankOption );

*/
	// 家南 俺荐 积己
	bCreatedSocket = CreateRankItemSocketHole( pSelectedItemSlot, curRank );

⌨️ 快捷键说明

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