cgshoprequestsellhandler.cpp

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

CPP
593
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGShopRequestSellHandler.cpp// Written By  : 辫己刮// Description : //////////////////////////////////////////////////////////////////////////////#include "CGShopRequestSell.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "NPC.h"	#include "Slayer.h"	#include "Vampire.h"	#include "ItemInfo.h"	#include "ItemInfoManager.h"	#include "PriceManager.h"	#include "ParkingCenter.h"	#include "ZoneUtil.h"	#include "RelicUtil.h"	#include "ItemUtil.h"	#include "VariableManager.h"	#include "item/Key.h"	#include "item/Potion.h"	#include "item/Magazine.h"	#include "item/Belt.h"	#include "Gpackets/GCShopSellOK.h"	#include "Gpackets/GCShopSellFail.h"	#include "Gpackets/GCShopBought.h"	#include "Gpackets/GCDeleteObject.h"#endif//////////////////////////////////////////////////////////////////////////////// 敲饭捞绢啊 迫妨绊 窍绰 酒捞袍阑 啊瘤绊 乐绰瘤 犬牢茄 促澜俊,// 老馆 酒捞袍苞 葛磐 荤捞努 贸府 何盒栏肺 盒扁茄促.//////////////////////////////////////////////////////////////////////////////void CGShopRequestSellHandler::execute (CGShopRequestSell* pPacket , Player* pPlayer)	 throw (ProtocolException , Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);		ObjectID_t      ITEMOID     = pPacket->getItemObjectID();	BYTE            OPCODE      = pPacket->getOpCode();	GamePlayer*     pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);	Creature*       pCreature   = pGamePlayer->getCreature();	PlayerCreature* pPC         = dynamic_cast<PlayerCreature*>(pCreature);	if (OPCODE == SHOP_REQUEST_SELL_NORMAL)	{		// 敲饭捞绢啊 迫妨绊 窍绰 酒捞袍阑 啊瘤绊 乐绰瘤 八荤		Inventory* pInventory = pPC->getInventory();		if (pInventory->hasItem(ITEMOID) == false) 			throw ProtocolException("CGShopRequestSellHandler::execute() : No such item to sell!");		Item* pItem = pInventory->getItemWithObjectID(ITEMOID);		if (pItem == NULL) return sendFailPacket(pPacket, pPlayer);		//ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo( pItem->getItemClass(), pItem->getItemType() );		//Assert(pItemInfo!=NULL);		// 蜡聪农 酒捞袍篮 给魄促.		// 漂沥 酒捞袍 努贰胶绰 迫 荐 绝促. by sigi. 2002.8.29		// 急拱 惑磊绰 迫 荐 乐促. by bezz. 2002.12.13		// 目敲傅篮 迫 荐 绝促. by Sequoia. 2003. 3. 3		// ItemUtil 救俊 canSell 肺 Extract 2003. 3. 3		if ( !canSell( pItem ) )		{			return sendFailPacket(pPacket, pPlayer);		}		else if (pItem->getItemClass() == Item::ITEM_CLASS_KEY && pItem->getItemType() == 2) 		{			executeMotorcycle(pPacket, pPlayer);		}		else 		{			executeNormal(pPacket, pPlayer);		}	}	else if (OPCODE == SHOP_REQUEST_SELL_ALL_SKULL)	{		executeOpAllSkull(pPacket, pPlayer);	}	else	{		throw ProtocolException("CGShopRequestSellHandler::execute() : unknown op code");	}	#endif	__END_DEBUG_EX __END_CATCH}//////////////////////////////////////////////////////////////////////////////// // 老馆 酒捞袍阑 贸府茄促.////////////////////////////////////////////////////////////////////////////////void CGShopRequestSellHandler::executeNormal (CGShopRequestSell* pPacket , Player* pPlayer)	 throw (ProtocolException , Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	ObjectID_t      NPCID        = pPacket->getObjectID();	ObjectID_t      ITEMOID      = pPacket->getItemObjectID();	GamePlayer*     pGamePlayer  = dynamic_cast<GamePlayer*>(pPlayer);	Creature*       pCreature    = pGamePlayer->getCreature();	PlayerCreature* pPC          = dynamic_cast<PlayerCreature*>(pCreature);	BYTE            index        = 0;	bool            bSpecialItem = false;	Zone* pZone = pPC->getZone();	if (pZone == NULL) return sendFailPacket(pPacket, pPlayer);	Creature* pNPCBase = NULL;	/*	try 	{ 		pNPCBase = pZone->getCreature(NPCID); 	}	catch (NoSuchElementException & nsee) 	{ 		pNPCBase = NULL; 	}	*/	// NoSuch力芭. by sigi. 2002.5.2	pNPCBase = pZone->getCreature(NPCID); 	if (pNPCBase == NULL || !pNPCBase->isNPC()) return sendFailPacket(pPacket, pPlayer);	NPC* pNPC = dynamic_cast<NPC*>(pNPCBase);		// 敲饭捞绢啊 迫妨绊 窍绰 酒捞袍阑 啊瘤绊 乐绰瘤 八荤	Inventory* pInventory  = pPC->getInventory();	//Gold_t     playerMoney = pPC->getGold(); 	Item*      pItem       = pInventory->getItemWithObjectID(ITEMOID);	ItemNum_t  itemNumber  = pItem->getNum();	Price_t    itemPrice   = g_pPriceManager->getPrice(pItem, pNPC->getMarketCondBuy(), SHOP_RACK_NORMAL, pPC) * itemNumber;	// 敲饭捞绢狼 牢亥配府俊 酒捞袍阑 力芭茄促.	pInventory->deleteItem(ITEMOID);	pItem->whenPCLost(pPC);	if (!pItem->destroy())	{		filelog("shopDBBug.txt", "NoSuchItemInDB-destroy: %s", pItem->toString().c_str());		throw DisconnectException("酒捞袍 瘤匡妨绰单 DB俊 绝促.");	}	// 父距 骇飘扼搁 救俊 乐绰 器记阑 昏力秦霖促.	// DB俊辑 瘤快绰 巴篮 Belt::destroy()甫 何福绰 巴父栏肺 器记鳖瘤 昏力等促.	if (pItem->getItemClass() == Item::ITEM_CLASS_BELT)	{		Inventory* pBeltInventory = dynamic_cast<Belt*>(pItem)->getInventory();		for (int y=0; y<pBeltInventory->getHeight(); y++)		{			for (int x=0; x<pBeltInventory->getWidth(); x++)			{				Item* pBeltItem = pBeltInventory->getItem(x, y);				if (pBeltItem != NULL)				{					pBeltInventory->deleteItem(x, y);					SAFE_DELETE(pBeltItem);				}			}		}	}	// Skull 老 版快 Variable Manager 俊辑 赣府蔼 硅荐 蔼栏肺 啊拜阑 货肺 拌魂茄促	if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL)	{		itemPrice = itemPrice * (g_pVariableManager->getHeadPriceBonus() / 100);	}	// ItemTrace Log 甫 巢败具 茄促搁 巢变促	if ( pItem != NULL && pItem->isTraceItem() )	{		remainTraceLog( pItem, pCreature->getName() , pNPC->getName(), ITEM_LOG_DELETE, DETAIL_SHOPSELL);	}	// 敲饭捞绢俊霸 拱扒蔼阑 瘤阂茄促.	// pPC->setGoldEx(playerMoney+itemPrice);	// by sigi. 2002.9.4	pPC->increaseGoldEx(itemPrice);	// 敲饭捞绢啊 拱扒 迫 锭 贸府且 巴甸阑 贸府茄促.	pPC->sellItem( pItem );	// NPC俊霸 磊府啊 面盒窍促搁 敲饭捞绢啊 魄 酒捞袍阑 焊包茄促.	// 款康磊 疙飞绢肺 父电 酒捞袍篮 官肺 绝矩促.	// 窜 胶其既 酒捞袍父阑 焊包茄促. 畴富 酒捞袍篮 弊成 滚覆.	// 涅胶飘 酒捞袍篮 焊包窍瘤 臼绊 滚赴促.	if (pNPC->getShopType()==SHOPTYPE_NORMAL		&& pItem->getCreateType()!=Item::CREATE_TYPE_CREATE		&& !pItem->getOptionTypeList().empty()		&& !pItem->isTimeLimitItem()	)	{		bSpecialItem = true;		index        = pNPC->getFirstEmptySlot(SHOP_RACK_SPECIAL);		if (index < SHOP_RACK_INDEX_MAX)		{			// 酒捞袍阑 眠啊茄促.			pNPC->insertShopItem(SHOP_RACK_SPECIAL, index, pItem);			// 胶其既 酒捞袍阑 NPC啊 柳凯厘俊 眠啊沁栏骨肺, 惑痢 滚傈捞 棵扼埃促.			pNPC->increaseShopVersion(SHOP_RACK_SPECIAL);			////////////////////////////////////////////////////////////////////////////			// 辟贸狼 敲饭捞绢甸俊霸绰 GCShopBought甫...			////////////////////////////////////////////////////////////////////////////			int         CenterX       = pNPC->getX();			int         CenterY       = pNPC->getY();			Creature*   pNearCreature = NULL;			Player*     pNearPlayer   = NULL;			GCShopBought boughtpkt;			boughtpkt.setObjectID(NPCID);			if (!pItem->getOptionTypeList().empty())			{				boughtpkt.setShopVersion(pNPC->getShopVersion(SHOP_RACK_SPECIAL));				boughtpkt.setShopType(SHOP_RACK_SPECIAL);			}			else			{				boughtpkt.setShopVersion(pNPC->getShopVersion(SHOP_RACK_NORMAL));				boughtpkt.setShopType(SHOP_RACK_NORMAL);			}			boughtpkt.setShopIndex(index);			boughtpkt.setItemObjectID(ITEMOID);			boughtpkt.setItemClass(pItem->getItemClass());			boughtpkt.setItemType(pItem->getItemType());			boughtpkt.setOptionType(pItem->getOptionTypeList());			boughtpkt.setDurability(pItem->getDurability());			boughtpkt.setSilver(pItem->getSilver());			boughtpkt.setGrade(pItem->getGrade());			boughtpkt.setEnchantLevel(pItem->getEnchantLevel());			//pZone->broadcastPacket(pNPC->getX(), pNPC->getY(), &boughtpkt, pPC);			try			{				for (int zx=CenterX-5; zx<=CenterX+5; zx++)				{					for (int zy=CenterY-5; zy<=CenterY+5; zy++)					{						// 官款靛甫 逞绢啊瘤 臼绰啊甫 眉农						if (!isValidZoneCoord(pZone, zx, zy)) continue;						Tile & tile = pZone->getTile(zx, zy);						// 吧绢促聪绰 农府媚甫 八祸							if (tile.hasCreature(Creature::MOVE_MODE_WALKING))						{							pNearCreature = tile.getCreature(Creature::MOVE_MODE_WALKING);							if (pNearCreature == NULL) continue;							// 规陛 拱扒阑 魄 敲饭捞绢扼搁 积帆							if (pNearCreature->getObjectID() == pPC->getObjectID()) continue;														// 父距 敲饭捞绢扼搁 菩哦阑 焊郴霖促.							if (pNearCreature->isPC())							{								pNearPlayer = pNearCreature->getPlayer();								if (pNearPlayer == NULL) continue;								pNearPlayer->sendPacket(&boughtpkt);							}						}						// 朝酒促聪绰 农府媚甫 八祸						if (tile.hasCreature(Creature::MOVE_MODE_FLYING))						{							pNearCreature = tile.getCreature(Creature::MOVE_MODE_FLYING);							if (pNearCreature == NULL) continue;														// 规陛 拱扒阑 魄 敲饭捞绢扼搁 积帆							if (pNearCreature->getObjectID() == pPC->getObjectID()) continue;							// 父距 敲饭捞绢扼搁 菩哦阑 焊郴霖促.							if (pNearCreature->isPC())							{								pNearPlayer = pNearCreature->getPlayer();

⌨️ 快捷键说明

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