cgadditemtoitemhandler.cpp

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

CPP
1,320
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGAddItemToItemHandler.cc// Written By  : elca@ewestsoft.com// Description :///////////////////////////////////////////////////////////////////////////////*// 茄 酒捞袍阑 甸绢辑 促弗 酒捞袍俊 持绰促. [Client]                                               [Server]           -- CGAddItemToItem              (mouseItem_ObjectID, invenX, invenY) 			  =(付快胶俊 甸绊乐绰 喊, upgrade且 item XY) -->            <-- GCAddItemToItemVerify(搬苞内靛, 包访蔼) ---   //-------------+---------------------------------------------// 荤侩 packet | client 贸府//-------------+---------------------------------------------// 阂啊 packet | 阂啊 message 免仿// 角菩 packet | 角菩 message 免仿, 喊 昏力, [酒捞袍 力芭]// 己傍 packet | 喊 昏力, option函版//-------------+---------------------------------------------*/#include "CGAddItemToItem.h"#ifdef __GAME_SERVER__	#include <stdio.h>	#include "GamePlayer.h"	#include "PlayerCreature.h"	#include "Inventory.h"	#include "Item.h"	#include "ItemInfoManager.h"	#include "OptionInfo.h"	#include "ItemUtil.h"	#include "EventStar.h"	#include "PetItem.h"	#include "PetEnchantItem.h"	#include "PetInfo.h"	#include "PetAttrInfo.h"	#include "PetTypeInfo.h"	#include "CreatureUtil.h"	#include "MixingItem.h"	#include "PacketUtil.h"	#include "Gpackets/GCAddItemToItemVerify.h"	#include "Gpackets/GCDeleteInventoryItem.h"	#include "Gpackets/GCCreateItem.h"	#include "SystemAvailabilitiesManager.h"	void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, CoordInven_t invenX, CoordInven_t invenY) throw(Error);	void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, CoordInven_t invenX, CoordInven_t invenY) throw(Error);	void executeAddOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, OptionType_t addOptionType) throw(Error);	void executeTransKit(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem) throw(Error);	extern bool isPossibleOptionItemClass(Item::ItemClass IClass);	OptionInfo* getOptionInfo(OptionType_t optionType);	void    	processUpgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo* pOptionInfo) throw (Error);	void		crashItem(Item* pItem, Inventory* pInventory, CoordInven_t invenX, CoordInven_t invenY) throw (Error);	void    	downgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo* pOptionInfo) throw (Error);	void		sendEnchantImpossible(GamePlayer* pGamePlayer) throw (Error);	void		sendEnchantOK(GamePlayer* pGamePlayer, DWORD optionChange) throw (Error);#endif	// __GAME_SERVER__////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGAddItemToItemHandler::execute (CGAddItemToItem* pPacket , Player* pPlayer)	 throw (Error){	__BEGIN_TRY __BEGIN_DEBUG_EX		#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	//cout << pPacket->toString().c_str() << endl;	GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);	Assert(pGamePlayer != NULL);	// by sigi	if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) 	{		SYSTEM_ASSERT( SYSTEM_ENCHANT );		Creature*  		pCreature   = pGamePlayer->getCreature();		PlayerCreature* pPC         = dynamic_cast<PlayerCreature*>(pCreature);		ObjectID_t      objectID    = pPacket->getObjectID();		Inventory* 		pInventory  = pPC->getInventory();		CoordInven_t 	invenX      = pPacket->getX();		CoordInven_t 	invenY      = pPacket->getY();		// 牢亥配府俊 酒捞袍捞 绝阑锭(谅钎眉农档 窍霸 等促.)		if (!pInventory->hasItem(invenX, invenY))		{			GCAddItemToItemVerify gcAddItemToItemVerify;			gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );			pGamePlayer->sendPacket( &gcAddItemToItemVerify );			return;		}		// 付快胶 酒捞袍		Item*           pMouseItem  = pPC->getExtraInventorySlotItem();		// 牢亥配府俊 乐绰 酒捞袍		Item*      		pItem       = pInventory->getItem(invenX, invenY);		// 酒捞袍捞 绝芭唱		// objectID啊 肋给等 版快		if (pMouseItem==NULL			|| pItem==NULL			|| pMouseItem->getObjectID()!=objectID			|| pMouseItem->getNum() != 1 )		{			//cout << "Wrong Item" << endl;			GCAddItemToItemVerify gcAddItemToItemVerify;			gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );			pGamePlayer->sendPacket( &gcAddItemToItemVerify );			return;		}		switch (pMouseItem->getItemClass())		{			//---------------------------------------------------------			//			// 				ITEM_CLASS_EVENT_STAR			//			//---------------------------------------------------------			// 酒捞袍狼 可记阑 upgrade 矫挪促.			//---------------------------------------------------------			case Item::ITEM_CLASS_EVENT_STAR : 			{				ItemInfo* pItemInfo = g_pEventStarInfoManager->getItemInfo( pMouseItem->getItemType() );				Assert(pItemInfo!=NULL);				EventStarInfo* pEventStarInfo = dynamic_cast<EventStarInfo*>(pItemInfo);				Assert(pEventStarInfo!=NULL);				int optionSize = pItem->getOptionTypeSize();				if (pEventStarInfo->isFunctionTransKit())				{					executeTransKit(pGamePlayer, pMouseItem, pItem);				}				// Enchant Option				else if (optionSize>1)	// by sigi. 2002.10.21				{					if (pEventStarInfo->isFunctionEnchantRareOption())					{						executeEnchantRareOption(pGamePlayer, pMouseItem, pItem, invenX, invenY);					}					else					{						GCAddItemToItemVerify gcAddItemToItemVerify;						gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE );						pGamePlayer->sendPacket( &gcAddItemToItemVerify );						return;					}				}				else if (pEventStarInfo->isFunctionEnchantOption())				{					executeEnchantOption(pGamePlayer, pMouseItem, pItem, invenX, invenY);				}				// Add Option				else if (pEventStarInfo->isFunctionAddOption())				{					int addOptionType = pEventStarInfo->getFunctionValue();					executeAddOption(pGamePlayer, pMouseItem, pItem, addOptionType);				}			}			break;			case Item::ITEM_CLASS_PET_ENCHANT_ITEM :			{				//cout << "Trying Pet Enchant... " << endl;				if ( pItem->getItemClass() != Item::ITEM_CLASS_PET_ITEM )				{					//cout << "脐 酒捞袍俊促啊 茄霸 酒丛促." << endl;					GCAddItemToItemVerify gcAddItemToItemVerify;					gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );					pGamePlayer->sendPacket( &gcAddItemToItemVerify );					return;				}				PetEnchantItemInfo* pItemInfo = dynamic_cast<PetEnchantItemInfo*>(g_pPetEnchantItemInfoManager->getItemInfo( pMouseItem->getItemType() ));				Assert( pItemInfo != NULL );				PetItem* pPetItem = dynamic_cast<PetItem*>(pItem);				PetInfo* pPetInfo = NULL;				if ( pPetItem == NULL || ( pPetInfo = pPetItem->getPetInfo() ) == NULL )				{					//cout << "脐 酒捞袍捞 酒聪芭唱 脐 酒捞袍俊 脐 惑怕啊 绝嚼聪促." << endl;					GCAddItemToItemVerify gcAddItemToItemVerify;					gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );					pGamePlayer->sendPacket( &gcAddItemToItemVerify );					return;				}				/*					ENCHANT_FUNCTION = 0,					SPEC_OPTION_FUNCTION = 1,					REVIVAL_FUNCTION = 13,					RARE_FUNCTION = 14				*/				switch ( pItemInfo->getFunction() )				{					case PetEnchantItemInfo::ENCHANT_FUNCTION :					{						if ( pPetInfo->getPetAttr() != 0xff )						{							//cout << "捞固 牢忙飘等 酒捞袍涝聪促." << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}						//cout << "钎霖 牢忙飘 矫档吝涝聪促." << endl;						pPC->deleteItemFromExtraInventorySlot();						pMouseItem->destroy();						SAFE_DELETE( pMouseItem );						if ( PetAttrInfoManager::Instance().enchantRandomAttr( pPetInfo, pItemInfo->getFunctionGrade() ) )						{							//cout << "牢忙飘 己傍." << endl;							pPetItem->savePetInfo();							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK );							gcAddItemToItemVerify.setParameter( ((uint)pPetInfo->getPetAttr())<<16 | (uint)pPetInfo->getPetAttrLevel() );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							if ( pPC->getPetInfo() == pPetInfo )							{								//cout << "捞固 阂矾廉乐绢辑 菩哦 焊郴绰 吝涝聪促." << endl;								sendPetInfo( pGamePlayer, true );								pPC->initAllStatAndSend();							}							return;						}						else						{							//cout << "牢忙飘 角菩" << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}					}					break;					case PetEnchantItemInfo::SPEC_OPTION_FUNCTION :					{						if ( pPetInfo->getPetAttr() != 0xff )						{							//cout << "捞固 牢忙飘等 酒捞袍涝聪促." << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}						pPC->deleteItemFromExtraInventorySlot();						pMouseItem->destroy();						SAFE_DELETE( pMouseItem );						if ( PetAttrInfoManager::Instance().enchantSpecAttr( pPetInfo, (PetAttr_t)pItemInfo->getFunctionGrade() ) )						{							pPetItem->savePetInfo();							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK );							gcAddItemToItemVerify.setParameter( ((uint)pPetInfo->getPetAttr())<<16 | (uint)pPetInfo->getPetAttrLevel() );//							gcAddItemToItemVerify.setParameter( pPetInfo->getPetAttr() );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							if ( pPC->getPetInfo() == pPetInfo )							{								sendPetInfo( pGamePlayer, true );								pPC->initAllStatAndSend();							}							return;						}						else						{							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}					}					break;					case PetEnchantItemInfo::RARE_FUNCTION:					{						//cout << "脐 饭绢 牢忙飘 吝涝聪促." << endl;						if ( pPetInfo->getPetLevel() != 49 )						{							//cout << "饭骇档 救等 逞 牢忙飘窍瘤 付祭" << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}						pPC->deleteItemFromExtraInventorySlot();						pMouseItem->destroy();						SAFE_DELETE( pMouseItem );						/*						OptionType_t targetOption = rand()%87;						targetOption++;						*/						OptionType_t targetOption = 0;						int ratio = rand() % 100000;						const list<PetEnchantOption*>& petEnchantOptions = g_pOptionInfoManager->getPetEnchantOptionList();						list<PetEnchantOption*>::const_iterator itr = petEnchantOptions.begin();						list<PetEnchantOption*>::const_iterator endItr = petEnchantOptions.end();						for ( ; itr != endItr ; itr++ )						{							PetEnchantOption* pPetEnchantOption = *itr;							if ( pPetEnchantOption->getRatio() > ratio )							{								targetOption = pPetEnchantOption->getOptionType();								break;							}						}						pPetInfo->setPetOption( targetOption );						sendPetInfo( pGamePlayer );						GCAddItemToItemVerify gcAddItemToItemVerify;						gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK );						gcAddItemToItemVerify.setParameter( targetOption );						pGamePlayer->sendPacket( &gcAddItemToItemVerify );						char query[100];						sprintf(query, "PetOption=%u", (uint)targetOption);						pItem->tinysave(query);					}					break;					case PetEnchantItemInfo::REVIVAL_FUNCTION:					{						//cout << "何劝 矫档吝 涝聪促."  << endl;						if ( pPetInfo->getPetHP() != 0 )						{							//cout << "救 磷篮 局 何劝矫虐瘤 付祭" << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}						pPC->deleteItemFromExtraInventorySlot();						pMouseItem->destroy();						SAFE_DELETE( pMouseItem );						VSDateTime current = VSDateTime::currentDateTime();						int Days = pPetInfo->getLastFeedTime().daysTo(current);						if ( Days < 0 ) Days = 0;						if ( pItemInfo->getItemType() != 14 )						{							int value = rand()%100;							if ( Days >= 8 || value >= (10-Days/2)*10 )							{								GCAddItemToItemVerify gcAddItemToItemVerify;								gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL );								pGamePlayer->sendPacket( &gcAddItemToItemVerify );								return;							}						}						pPetInfo->setPetHP( pItemInfo->getFunctionGrade() );						pPetInfo->setFeedTime( VSDateTime::currentDateTime() );						pPetInfo->getPetItem()->savePetInfo();						GCAddItemToItemVerify gcAddItemToItemVerify;						gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_REVIVAL_OK );						gcAddItemToItemVerify.setParameter( pPetInfo->getPetHP() );						pGamePlayer->sendPacket( &gcAddItemToItemVerify );					}					break;					case PetEnchantItemInfo::MUTANT_FUNCTION:					{						if ( pPetInfo->getPetType() != 1 )						{							cout << "匡橇刀捞 酒聪而聪促." << endl;							GCAddItemToItemVerify gcAddItemToItemVerify;							gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ERROR );							pGamePlayer->sendPacket( &gcAddItemToItemVerify );							return;						}						bool summonPet = pPC->getPetInfo() == pPetInfo;						pPC->deleteItemFromExtraInventorySlot();						pMouseItem->destroy();						SAFE_DELETE( pMouseItem );						PetTypeInfo* pPetTypeInfo = PetTypeInfoManager::getInstance()->getPetTypeInfo(2);						Assert( pPetTypeInfo != NULL );						pPetInfo->setPetType(2);						pPetInfo->setPetCreatureType( pPetTypeInfo->getPetCreatureType( pPetInfo->getPetLevel() ) );						pPetItem->setItemType(2);						pPetItem->tinysave( "ItemType=2" );//						if ( pPC->getPetInfo() == pPetInfo ) sendPetInfo( pGamePlayer );						if ( summonPet )						{							pPC->setPetInfo( NULL );							sendPetInfo( pGamePlayer );						}						GCAddItemToItemVerify gcAddItemToItemVerify;						gcAddItemToItemVerify.setCode( ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK );						gcAddItemToItemVerify.setParameter( 0 );						pGamePlayer->sendPacket( &gcAddItemToItemVerify );						GCDeleteInventoryItem gcDI;						gcDI.setObjectID( pPetItem->getObjectID() );						pGamePlayer->sendPacket( &gcDI );						CoordInven_t X = -1, Y;						pPC->getInventory()->findItemOID( pPetItem->getObjectID(), X, Y );						Assert( X != -1 );						GCCreateItem gcCI;						makeGCCreateItem( &gcCI, pPetItem, X, Y );

⌨️ 快捷键说明

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