cgmixitemhandler.cpp

来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 586 行 · 第 1/2 页

CPP
586
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGMixItemHandler.cpp// Written By  : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "CGMixItem.h"#ifdef __GAME_SERVER__#include <cstdio>#include "GamePlayer.h"#include "Inventory.h"#include "PlayerCreature.h"#include "Item.h"#include "MixingItem.h"#include "ItemUtil.h"#include "ItemInfoManager.h"#include "OptionInfo.h"#include "Gpackets/GCCannotUse.h"#include "Gpackets/GCUseOK.h"#include "Gpackets/GCAddItemToItemVerify.h"void sendCannotUse(CGMixItem* pPacket, Player* pPlayer);#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGMixItemHandler::execute(CGMixItem* pPacket, Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	////cout << "CGMixItemHandler " << endl;	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);	Assert(pGamePlayer != NULL);	Creature* pCreature = pGamePlayer->getCreature();	Assert(pCreature != NULL);	Assert(pCreature->isPC());	PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature);	Assert(pPC != NULL);	Inventory* pInventory = pPC->getInventory();	Zone*      pZone      = pPC->getZone();	Assert(pInventory != NULL);	Assert(pZone != NULL);	CoordInven_t InvenX = pPacket->getX();	CoordInven_t InvenY = pPacket->getY();	//cout << "菩哦朝扼咳 : " << pPacket->toString() << endl;	// 牢亥配府 谅钎甫 逞绢啊绰 康开捞扼搁 救 等促.	if (InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight())	{		sendCannotUse( pPacket, pPlayer );		return;	}	Item* pItem = pPC->findItemOID( pPacket->getObjectID() );//	// 牢亥配府俊 弊 酒捞袍捞 绝促搁 俊矾促.//	Item* pItem = pInventory->getItem(InvenX, InvenY);	if (pItem == NULL)	{		sendCannotUse( pPacket, pPlayer );		return;	}	// 牢亥配府俊 乐绰 酒捞袍狼 Object甫 罐绰促.//	ObjectID_t ItemObjectID = pItem->getObjectID();	// OID啊 老摹窍瘤 臼芭唱, 荤侩且 荐 绝绰 酒捞袍捞扼搁 俊矾促.//	if (ItemObjectID != pPacket->getObjectID())//	{//		//cout << "酒袍 荤侩 阂啊. 可璃飘 酒叼啊 救 嘎带啊..." << endl;//		sendCannotUse( pPacket, pPlayer );//		return;//	}	// 雇教 器瘤啊 酒聪搁 救等促 -_-	if ( pItem->getItemClass() != Item::ITEM_CLASS_MIXING_ITEM )	{		sendCannotUse( pPacket, pPlayer );		return;	}	MixingItemInfo* pInfo = dynamic_cast<MixingItemInfo*>(g_pItemInfoManager->getItemInfo( pItem->getItemClass(), pItem->getItemType() ));	Assert( pInfo != NULL );	switch ( pInfo->getType() )	{		case MixingItemInfo::TYPE_MIX:		{			Item* pTempItem = pInventory->getItem(InvenX, InvenY);			if ( pTempItem == NULL || pTempItem->getObjectID() != pItem->getObjectID() )			{				sendCannotUse( pPacket, pPlayer );				return;			}			executeMix( pPacket, pPlayer, pItem );		}			break;		case MixingItemInfo::TYPE_DETACH:			executeDetach( pPacket, pPlayer, pItem );			break;		default:			sendCannotUse( pPacket, pPlayer );			break;	}#endif    __END_DEBUG_EX __END_CATCH}#ifdef __GAME_SERVER__void CGMixItemHandler::executeMix(CGMixItem* pPacket, Player* pPlayer, Item* pItem) throw(Error){	__BEGIN_TRY	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);	Assert(pGamePlayer != NULL);	Creature* pCreature = pGamePlayer->getCreature();	Assert(pCreature != NULL);	Assert(pCreature->isPC());	PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature);	Assert(pPC != NULL);	Inventory* pInventory = pPC->getInventory();	Zone*      pZone      = pPC->getZone();	CoordInven_t InvenX = pPacket->getX();	CoordInven_t InvenY = pPacket->getY();	Assert(pInventory != NULL);	Assert(pZone != NULL);	Item *pTargetItem1 = NULL;	Item *pTargetItem2 = NULL;	CoordInven_t dummy;	pTargetItem1 = pInventory->findItemOID( pPacket->getTargetObjectID(0), dummy, dummy );	pTargetItem2 = pInventory->findItemOID( pPacket->getTargetObjectID(1), dummy, dummy );	if ( pTargetItem1 == NULL || pTargetItem2 == NULL )	{		sendCannotUse( pPacket, pPlayer );		return;	}	ItemInfo* pInfo1 = g_pItemInfoManager->getItemInfo( pTargetItem1->getItemClass(), pTargetItem1->getItemType() );	int GradeDiff = pTargetItem1->getGrade() - pTargetItem2->getGrade();	Grade_t TargetGrade = ( pTargetItem1->getGrade() > pTargetItem2->getGrade() )?pTargetItem1->getGrade():pTargetItem2->getGrade();	if ( pTargetItem1->getItemClass() != pTargetItem2->getItemClass() ||		 pTargetItem1->getItemType() != pTargetItem2->getItemType() ||		 pTargetItem1->getOptionTypeSize() != 1 ||		 pTargetItem2->getOptionTypeSize() != 1 ||		 pTargetItem1->isTimeLimitItem() ||		 pTargetItem2->isTimeLimitItem() ||		 pInfo1->isUnique() ||		 GradeDiff < -2 || GradeDiff > 2	   )	{		sendCannotUse( pPacket, pPlayer );		return;	}	MixingItemInfo* pInfo = dynamic_cast<MixingItemInfo*>(g_pItemInfoManager->getItemInfo( pItem->getItemClass(), pItem->getItemType() ));	Assert( pInfo != NULL );	MixingItemInfo::Target target = pInfo->getTarget();	switch ( target )	{		case MixingItemInfo::MIXING_WEAPON:			{				if ( isSlayerWeapon( pTargetItem1->getItemClass() ) ) 				{					if ( pTargetItem1->getItemType() > pInfo->getSlayerLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isVampireWeapon( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemType() > pInfo->getVampireLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isOustersWeapon( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemType() > pInfo->getOustersLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else				{					sendCannotUse( pPacket, pPlayer );					return;				}			}			break;		case MixingItemInfo::MIXING_ARMOR:			{				if ( isSlayerArmor( pTargetItem1->getItemClass() ) ) 				{					if ( pTargetItem1->getItemType() > pInfo->getSlayerLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isVampireArmor( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemType() > pInfo->getVampireLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isOustersArmor( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemType() > pInfo->getOustersLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else				{					sendCannotUse( pPacket, pPlayer );					return;				}			}			break;		case MixingItemInfo::MIXING_ACCESSORY:			{				if ( isSlayerAccessory( pTargetItem1->getItemClass() ) ) 				{					if ( pTargetItem1->getItemType() > pInfo->getSlayerLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isVampireAccessory( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemType() > pInfo->getVampireLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else if ( isOustersAccessory( pTargetItem1->getItemClass() ) )				{					if ( pTargetItem1->getItemClass() != Item::ITEM_CLASS_OUSTERS_STONE && pTargetItem1->getItemType() > pInfo->getOustersLevel() )					{						sendCannotUse( pPacket, pPlayer );						return;					}				}				else				{					sendCannotUse( pPacket, pPlayer );					return;				}			}			break;		default:			{

⌨️ 快捷键说明

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