📄 itemmanager_composite.cpp
字号:
#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 + -