cgaddzonetoinventoryhandler.cpp

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

CPP
715
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGAddZoneToInventoryHandler.cc// Written By  : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "CGAddZoneToInventory.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Zone.h"	#include "PlayerCreature.h"	#include "Inventory.h"	#include "Item.h"	#include "Relic.h"	#include "RelicUtil.h"	#include "Timeval.h"	#include "EffectManager.h"	#include "EffectPrecedence.h"	#include "ItemUtil.h"	#include "ItemFactoryManager.h"	#include "CreatureUtil.h"	#include "ZoneUtil.h"	#include "LogClient.h"	#include "CombatInfoManager.h"	#include "ZoneGroupManager.h"	#include "PacketUtil.h"	#include "BloodBible.h"	#include "StringPool.h"	#include "ShrineInfoManager.h"	#include "Belt.h"	#include "Sweeper.h"	#include "OustersArmsband.h"	#include "VariableManager.h"	#include "Gpackets/GCDeleteandPickUpOK.h"	#include "Gpackets/GCDeleteObject.h"	#include "Gpackets/GCCannotAdd.h"	#include "Gpackets/GCSystemMessage.h"	#include "Gpackets/GCAddEffect.h"	#include "Gpackets/GCCreateItem.h"	#include "Gpackets/GCNoticeEvent.h"	#include "Gpackets/GCDeleteInventoryItem.h"	#include "EffectHasSlayerRelic.h"	#include "EffectHasVampireRelic.h"	#include "EffectRelicPosition.h"	#include "EffectHasSweeper.h"	#include <stdio.h>#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGAddZoneToInventoryHandler::execute (CGAddZoneToInventory* pPacket , Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX	__BEGIN_DEBUG	#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	try 	{		GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);		Creature*   pCreature   = pGamePlayer->getCreature();		if (pCreature == NULL) return;		PlayerCreature* pPC         = dynamic_cast<PlayerCreature*>(pCreature);		bool            Merge       = false; // 酒捞袍捞 般媚辑 甸绢哎 版快 眉农 函荐		bool            Success     = false; // 酒捞袍阑 Adding 且荐 乐绰瘤 绝绰瘤 咯何		Zone*           pZone       = pPC->getZone();		Coord_t         ZoneX       = pPacket->getZoneX();		Coord_t         ZoneY       = pPacket->getZoneY();		// 官款靛甫 逞绢啊瘤绰 臼绰瘤 眉农茄促.		if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) goto ERROR;		Tile& _Tile = pZone->getTile(ZoneX , ZoneY);		// 鸥老俊 酒捞袍捞 粮犁窍绰瘤甫 眉农茄促.		if (!_Tile.hasItem()) goto ERROR;		// 酒捞袍 器牢磐啊 澄捞芭唱, 葛磐荤捞努捞扼搁 林阑 荐 绝促.		Item* pItem = _Tile.getItem();		if (pItem == NULL || !isPortableItem(pItem)) goto ERROR;		// 酒捞袍阑 林阑 荐 绝绰 惑怕扼搁 林阑 荐 绝促. -_-;		if (!isAbleToPickupItem(pPC, pItem)) goto ERROR;		// OID啊 老摹窍绰瘤甫 八荤秦具 茄促.		ObjectID_t ItemObjectID = pItem->getObjectID();		if (ItemObjectID != pPacket->getObjectID()) goto ERROR;		// Inventory甫 罐酒柯促.		Inventory*   pInventory = pPC->getInventory();		CoordInven_t InvenX     = pPacket->getInvenX();		CoordInven_t InvenY     = pPacket->getInvenY();		// 牢亥配府 谅钎 檬苞扼搁 俊矾促.		if (InvenX >= 10 || InvenY >= 6) goto ERROR;		// 弊 谅钎俊 酒捞袍阑 歹且 荐 绝绢档 俊矾促.		if (!pInventory->canAdding(InvenX, InvenY, pItem)) goto ERROR;		// 乔狼 己辑老 版快 林匡 荐 乐绰瘤 犬牢茄促. --> 捞 内靛绰 isAbleToPickup 郴何肺 颗板促..		// 快急鼻捞 嘿绢乐绰 酒捞袍老 版快俊绰 林牢 肚绰 林牢颇萍啊 酒聪扼搁 林阑 荐 绝促.		// 芳腐老 版快俊绰 快急鉴困 捞棋飘甫 昏力秦霖促.		if ( isRelicItem( pItem )			&& pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE))		{			EffectManager& effectManager = pItem->getEffectManager();			effectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE);			pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE);		}		if (pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE))		{			Timeval currentTime;			getCurrentTime(currentTime);			EffectManager& rEffectManager = pItem->getEffectManager();			EffectPrecedence* pEffectPrecedence = dynamic_cast<EffectPrecedence*>(rEffectManager.findEffect(Effect::EFFECT_CLASS_PRECEDENCE));			Assert(pEffectPrecedence != NULL);			if (pEffectPrecedence->getDeadline() < currentTime)			{				// 矫埃捞 瘤车促搁 酒公唱 林阑 荐 乐促. 歹阂绢 咯扁辑 捞棋飘甫 昏力秦霖促.				rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE);				pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE);			}			else			{				// 矫埃捞 酒流 瘤唱瘤 臼疽促搁, 林牢 肚绰 林牢 颇萍父捞 林阑 荐 乐促.				if ((pEffectPrecedence->getHostName() == pPC->getName()) ||					(pPC->getPartyID() != 0 && pPC->getPartyID() == pEffectPrecedence->getHostPartyID()))				{					// 林阑 荐 乐促. 捞棋飘甫 昏力秦 霖促.					rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE);					pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE);				}				else				{					// 林阑 荐 绝促.					goto ERROR;				}			}		}/*#ifdef __XMAS_EVENT_CODE__		// 林栏妨绰 酒捞袍捞 踌祸 急拱 惑磊扼搁,		// 牢亥配府俊 踌祸 急拱 惑磊甫 啊瘤绊 乐促搁 林阑 荐 绝促.		if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX &&			pItem->getItemType() == 0 &&			pInventory->hasGreenGiftBox()) goto ERROR;#endif*/		// 傈里矫胶袍		// 父距 鞍篮 辆练狼 己拱阑 林奎促搁, 磊悼栏肺 焊包窃栏肺 捞悼茄促.		// 焊包窃栏肺狼 捞悼篮 弊成 item阑 昏力窍绊, 货肺款 阁胶磐甫 Regen窍绰		// 巴栏肺 汲沥茄促.		// 捞固 鞍篮 辆幅狼 己拱阑 啊瘤绊 乐促搁 货 己拱阑 甸瘤 给窍档废 茄促.		// 捞固 浇饭捞绢 己拱阑 啊瘤绊 乐促搁 货肺款 浇饭捞绢 己拱阑 甸瘤 给茄促.		Item::ItemClass itemclass = pItem->getItemClass();		//ItemType_t itemtype = pItem->getItemType();				TPOINT pt;		pt.x = 99;		pt.y = 99;		// 酒捞袍阑 歹且 磊府俊 促弗 酒捞袍捞 乐瘤 臼篮瘤 八荤茄促.		Item* pPrevItem = pInventory->searchItem(InvenX, InvenY, pItem, pt);		if (pPrevItem != NULL)		{			if (canStack(pItem, pPrevItem))			{				int MaxStack = ItemMaxStack[pItem->getItemClass()];				if( pt.x == InvenX && pt.y == InvenY ) {					if (pItem->getNum() + pPrevItem->getNum() > MaxStack) 					{						ItemNum_t CurrentNum = pPrevItem->getNum();						ItemNum_t AddNum = pItem->getNum();						// 哗冈篮芭 鞍篮淡. by sigi. 2002.5.3						// 辟单.. 捞霸 巩力啊 酒聪绊..						// 粮俊辑 林匡锭, 促 给 林栏搁 给 凛绰芭 酒囱啊..						// 唱赣瘤绰 促矫 滚妨具 窍绰扒啊?						// 捞犯霸 鞍篮 谅钎肺 朝酒坷绰 版快啊 乐绰啊? 眉农啊 鞘夸窍摆瘤.						// 泅犁绰 绝绰芭 鞍篮单..栏褥.. --;						//pInventory->increaseNum(pItem->getNum());						//pInventory->increaseWeight(pItem->getWeight()* pItem->getNum());						pPrevItem->setNum(MaxStack);						pItem->setNum(AddNum + CurrentNum - MaxStack);						//pPrevItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);						// item历厘 弥利拳. by sigi. 2002.5.13						char pField[80];						sprintf(pField, "OwnerID='%s', Num=%d, Storage=%d, X=%d, Y=%d", pPC->getName().c_str(), MaxStack, STORAGE_INVENTORY, InvenX, InvenY);						pPrevItem->tinysave(pField);						//pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0);						// item历厘 弥利拳. by sigi. 2002.5.13						sprintf(pField, "OwnerID='%s', Num=%d, Storage=%d", pPC->getName().c_str(), pItem->getNum(), STORAGE_EXTRASLOT);						pItem->tinysave(pField);					} 					else 					{						pPrevItem->setNum(pPrevItem->getNum() + pItem->getNum());						pInventory->increaseNum(pItem->getNum());						pInventory->increaseWeight(pItem->getWeight()* pItem->getNum());						//pPrevItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);						// item历厘 弥利拳. by sigi. 2002.5.13						char pField[80];						sprintf(pField, "OwnerID='%s', Num=%d, Storage=%d, X=%d, Y=%d", pPC->getName().c_str(), pPrevItem->getNum(), STORAGE_INVENTORY, InvenX, InvenY);						pPrevItem->tinysave(pField);						pItem->destroy();						Merge = true;						Success = true;					}					if ( g_pVariableManager->getVariable(NETMARBLE_CARD_EVENT) != 0 && pPrevItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pPrevItem->getItemType() == 2 && pPrevItem->getNum() == 99 )					{						GCNoticeEvent gcNE;						gcNE.setCode( NOTICE_EVENT_NETMARBLE_CARD_FULL );						pGamePlayer->sendPacket( &gcNE );						cout << "gcNE sent" << endl;					}					if ( pPrevItem->getItemClass() == Item::ITEM_CLASS_LUCKY_BAG							&& pPrevItem->getItemType() == 3							&& pPrevItem->getNum() == 50 )					{						GCDeleteInventoryItem gcDI;						gcDI.setObjectID( pPrevItem->getObjectID() );						pGamePlayer->sendPacket( &gcDI );						pInventory->deleteItem( pPrevItem->getObjectID() );						pPrevItem->destroy();						SAFE_DELETE( pPrevItem );												Item* pNewItem = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_EVENT_ITEM, 28, list<OptionType_t>() );						pZone->registerObject( pNewItem );						if ( !pInventory->addItem(pt.x, pt.y, pNewItem) )						{							cout << "-_-;" << endl;							return;						}						pNewItem->create( pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y );						if ( pNewItem != NULL )						{							GCCreateItem gcCI;							makeGCCreateItem( &gcCI, pNewItem, pt.x, pt.y );							pGamePlayer->sendPacket( &gcCI );						}					}				} 			}		} 		else 		{			pInventory->addItem(InvenX, InvenY, pItem);			//pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);			// item历厘 弥利拳. by sigi. 2002.5.13			char pField[80];			sprintf(pField, "OwnerID='%s', Storage=%d, X=%d, Y=%d", pPC->getName().c_str(), STORAGE_INVENTORY, InvenX, InvenY);			pItem->tinysave(pField);			// 骇飘 救狼 酒捞袍甸档 葛滴 家蜡鼻捞 逞绢啊具 茄促. 2003.3.22 by Sequoia			if ( pItem->getItemClass() == Item::ITEM_CLASS_BELT )			{				sprintf( pField, "OwnerID='%s'", pPC->getName().c_str() );                Belt* pBelt = dynamic_cast<Belt*>( pItem );                Assert( pBelt != NULL );                Inventory* pBeltInventory = pBelt->getInventory();                PocketNum_t num = pBelt->getPocketCount();                for ( SlotID_t count = 0 ; count < num ; ++count )                {                    Item* pBeltItem = pBeltInventory->getItem( count, 0 );                    if ( pBeltItem != NULL )                    {                        pBeltItem->tinysave( pField );                    }                }			}			// 鞠胶龟靛 救狼 酒捞袍甸档 葛滴 家蜡鼻捞 逞绢啊具 茄促. 2003.3.22 by Sequoia			if ( pItem->getItemClass() == Item::ITEM_CLASS_OUSTERS_ARMSBAND )			{				sprintf( pField, "OwnerID='%s'", pPC->getName().c_str() );                OustersArmsband* pOustersArmsband = dynamic_cast<OustersArmsband*>( pItem );                Assert( pOustersArmsband != NULL );                Inventory* pOustersArmsbandInventory = pOustersArmsband->getInventory();                PocketNum_t num = pOustersArmsband->getPocketCount();                for ( SlotID_t count = 0 ; count < num ; ++count )                {                    Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem( count, 0 );                    if ( pOustersArmsbandItem != NULL )                    {                        pOustersArmsbandItem->tinysave( pField );                    }                }			}			Success = true;		}		if (Success)		{			// 关俊 乐带芭 颗辫. - -; 2002.12.23			pZone->deleteItem(pItem, ZoneX, ZoneY);			GCDeleteandPickUpOK _GCDeleteandPickUpOK;			GCDeleteObject _GCDeleteObject;			_GCDeleteandPickUpOK.setObjectID(pItem->getObjectID());			pPlayer->sendPacket(&_GCDeleteandPickUpOK);			// 辟贸俊 乐绰 促弗 荤恩甸俊罢 酒捞袍俊 荤扼脸促绰 巴阑 焊郴霖促.			_GCDeleteObject.setObjectID(pItem->getObjectID());//			pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject , pPC);//			pZone->broadcastPacket(ZoneX , ZoneY, &_GCDeleteObject , pPC);			pZone->broadcastPacket(ZoneX , ZoneY, &_GCDeleteObject);			log(LOG_PICKUP_ITEM, pPC->getName(), "", pItem->toString());			pItem->whenPCTake( pPC );			// Relic 家蜡磊 眉农窍扁			if (isRelicItem( itemclass ))			{				addRelicEffect( pPC, pItem );				deleteEffectRelicPosition( pItem );			}

⌨️ 快捷键说明

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