cguseitemfrominventoryhandler.cpp

来自「dk1游戏的原代码文件,完整.编译系统redhat7.3,mysql 3.23 」· C++ 代码 · 共 2,063 行 · 第 1/5 页

CPP
2,063
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGUseItemFromInventoryHandler.cpp// Written By  : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "CGUseItemFromInventory.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Zone.h"	#include "PlayerCreature.h"	#include "Slayer.h"	#include "Vampire.h"	#include "Inventory.h"	#include "Item.h"	#include "ItemInfo.h"	#include "ItemInfoManager.h"	#include "ItemFactoryManager.h"	#include "ItemUtil.h"	#include "ItemMineInfo.h"	#include "skill/Skill.h"	#include "SkillInfo.h"	#include "skill/SkillUtil.h"	#include "CreatureUtil.h"    #include "EffectHPRecovery.h"    #include "EffectMPRecovery.h"	#include "Effect.h"	#include "EffectReloadTimer.h"	#include "EffectManager.h"	#include "EffectAftermath.h"	#include "EffectTranslation.h"	#include "SimpleCreatureEffect.h"	#include "EffectHasPet.h"	#include "skill/EffectSummonSylph.h"	#include "ZoneUtil.h"	#include <math.h>	#include <stdio.h>	#include "ctf/FlagManager.h"	#include "ParkingCenter.h"	#include "VariableManager.h"	#include "DB.h"	#include "item/Potion.h"	#include "item/DyePotion.h"	#include "item/Serum.h"	#include "item/SlayerPortalItem.h"	#include "item/Key.h"	#include "item/ResurrectItem.h"	#include "item/OustersSummonItem.h"	#include "item/EffectItem.h"	#include "item/PetItem.h"	#include "item/PetFood.h"	#include "item/SlayerPortalItem.h"	#include "item/VampirePortalItem.h"	#include "item/OustersSummonItem.h"	#include "Gpackets/GCCannotUse.h"	#include "Gpackets/GCUseOK.h"	#include "Gpackets/GCHPRecoveryStartToSelf.h"	#include "Gpackets/GCHPRecoveryStartToOthers.h"	#include "Gpackets/GCMPRecoveryStart.h"	#include "Gpackets/GCAddHelicopter.h"	#include "Gpackets/GCAddEffectToTile.h"	#include "Gpackets/GCAddEffect.h"	#include "Gpackets/GCDeleteObject.h"	#include "Gpackets/GCAddSlayer.h"	#include "Gpackets/GCAddVampire.h"	#include "Gpackets/GCAddOusters.h"	#include "Gpackets/GCCreateItem.h"	#include "Gpackets/GCRemoveEffect.h"	#include "Gpackets/GCStatusCurrentHP.h"	#include "Gpackets/GCModifyInformation.h"	#include "PacketUtil.h"	#include "PetTypeInfo.h"	bool changeHairColorEx( PlayerCreature* pPC, Color_t color );	bool changeBatColorEx( PlayerCreature* pPC, Color_t color );	bool changeSkinColorEx( PlayerCreature* pPC, Color_t color );	inline bool sendCannotUse( CGUseItemFromInventory* pPacket, Player* pPlayer );#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__//	cout << "CGUseItemFromInventoryHandler " << 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())	{		GCCannotUse _GCCannotUse;		_GCCannotUse.setObjectID(pPacket->getObjectID());		pGamePlayer->sendPacket(&_GCCannotUse);		return;	}	// 牢亥配府俊 弊 酒捞袍捞 绝促搁 俊矾促.	Item* pItem = pInventory->getItem(InvenX, InvenY);	if (pItem == NULL)	{		GCCannotUse _GCCannotUse;		_GCCannotUse.setObjectID(pPacket->getObjectID());		pGamePlayer->sendPacket(&_GCCannotUse);		return;	}	// 牢亥配府俊 乐绰 酒捞袍狼 Object甫 罐绰促.	ObjectID_t ItemObjectID = pItem->getObjectID();	// OID啊 老摹窍瘤 臼芭唱, 荤侩且 荐 绝绰 酒捞袍捞扼搁 俊矾促.	if (ItemObjectID != pPacket->getObjectID() || !isUsableItem(pItem, pCreature))	{		//cout << "酒袍 荤侩 阂啊. 可璃飘 酒叼啊 救 嘎带啊..." << endl;		GCCannotUse _GCCannotUse;		_GCCannotUse.setObjectID(pPacket->getObjectID());		pGamePlayer->sendPacket(&_GCCannotUse);		return;	}	// 酒捞袍狼 辆幅俊 蝶扼, 贸府 窃荐甫 盒扁矫难 霖促.	////cout << pItem->getItemClass() << endl;	switch (pItem->getItemClass())	{		case Item::ITEM_CLASS_POTION:			Assert(false);			break;		case Item::ITEM_CLASS_MAGAZINE:			Assert(false);			break;		case Item::ITEM_CLASS_ETC:			Assert(pItem->getItemType() != 0);			executeTranslator(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_SERUM:			Assert(false);			break;		case Item::ITEM_CLASS_VAMPIRE_ETC:			Assert(pItem->getItemType() > 1);			executeTranslator(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_SLAYER_PORTAL_ITEM:			executeSlayerPortalItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_OUSTERS_SUMMON_ITEM:			executeOustersSummonItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_KEY:			executeKeyItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_EVENT_ETC:			executeFirecraker(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_DYE_POTION:			executeDyePotion(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_RESURRECT_ITEM:			executeResurrectItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_EFFECT_ITEM:			executeEffectItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_PET_ITEM:			executePetItem(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_PET_FOOD:			executePetFood(pPacket, pPlayer);			break;		case Item::ITEM_CLASS_EVENT_GIFT_BOX:			cout << "EVENT_GIFT_BOX" << endl;			executeEventGiftBox(pPacket, pPlayer);			break;		default:			Assert(false);			break;	}#endif    __END_DEBUG_EX __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacket, Player* pPlayer)	throw (ProtocolException, Error){	__BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__	Assert(pPacket != NULL);	Assert(pPlayer != NULL);	// 惑困 窃荐俊辑 俊矾 眉农甫 腹捞 沁扁 锭巩俊,	// 俊矾 眉农甫 措气 绵家茄促.	GamePlayer*     pGamePlayer  = dynamic_cast<GamePlayer*>(pPlayer);	Creature*       pCreature    = pGamePlayer->getCreature();	PlayerCreature* pPC          = dynamic_cast<PlayerCreature*>(pCreature);	Inventory*      pInventory   = pPC->getInventory();	Zone*           pZone        = pPC->getZone();	CoordInven_t    InvenX       = pPacket->getX();	CoordInven_t    InvenY       = pPacket->getY();	Item*           pItem        = pInventory->getItem(InvenX, InvenY);	//ObjectID_t      ItemObjectID = pItem->getObjectID();	Assert(pCreature->isSlayer());	Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);	// 内付 惑怕扼搁 荤侩且 荐 绝促.	if (pSlayer->isFlag(Effect::EFFECT_CLASS_COMA)		// 价祈牢 版快绰 蜡丰 荤侩磊啊 酒聪搁 荤侩且 荐 绝促.		|| pItem->getItemType()==11 && !pGamePlayer->isPayPlaying() && !pGamePlayer->isPremiumPlay())	{		GCCannotUse _GCCannotUse;		_GCCannotUse.setObjectID(pPacket->getObjectID());		pGamePlayer->sendPacket(&_GCCannotUse);		return;	}	HP_t	MaxHP     = pSlayer->getHP(ATTR_MAX);	HP_t	CurrentHP = pSlayer->getHP(ATTR_CURRENT);	MP_t	MaxMP     = pSlayer->getMP(ATTR_MAX);	MP_t	CurrentMP = pSlayer->getMP(ATTR_CURRENT);	Potion* pPotion   = dynamic_cast<Potion*>(pItem);	int HPQuantity = pPotion->getHPQuantity();	int MPQuantity = pPotion->getMPQuantity();	int HPDelayProvider = pPotion->getHPDelay();	int MPDelayProvider = pPotion->getMPDelay();	// Activation Effect啊 吧妨乐促搁 雀汗加档啊 2硅啊 等促.	if (pSlayer->isFlag(Effect::EFFECT_CLASS_ACTIVATION))	{		if ( pPotion->getItemType() >= 14 && pPotion->getItemType() <= 17 )		{			// 镜 荐绰 乐促.		}		else		{			HPDelayProvider = (HPDelayProvider>>1);			MPDelayProvider = (MPDelayProvider>>1);			HPDelayProvider = max(HPDelayProvider, 1);			MPDelayProvider = max(MPDelayProvider, 1);		}	}	Attr_t INT = pSlayer->getINT();	int PotionHPAmount=0, PotionMPAmount=0;	// 父距 促弗 辆利狼 Relic阑 家蜡沁促搁, 趋没/器记狼 瓤苞啊 50%肺 冻绢柳促.	PotionHPAmount = pPotion->getHPAmount();	PotionMPAmount = pPotion->getMPAmount();		int HPAmount = min(MaxHP - CurrentHP , PotionHPAmount);	int MPAmount = min(MaxMP - CurrentMP , (int)(PotionMPAmount* (double)(1 + (double)((double)INT / 300.0))));	bool notRecoverHP = false;	bool notRecoverMP = false;	// HP 雀汗剧捞 粮犁茄促搁...	if (HPAmount != 0 && HPQuantity != 0)	{		if (CurrentHP < MaxHP) 		{			EffectManager* pEffectManager = pSlayer->getEffectManager();			double temp     = (double)((double)HPAmount/(double)HPQuantity);			int    Period   = (uint)ceil(temp);			Turn_t Deadline = Period* HPDelayProvider;			if (pSlayer->isFlag(Effect::EFFECT_CLASS_HP_RECOVERY)) 			{				Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY);				EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast<EffectHPRecovery*>(pEffect);				// 扁粮狼 窜困剧苞 冉荐肺 盲快绰 HP剧阑 拌魂茄促.				// 弊巴阑 泅犁 雀汗剧俊 歹茄促.				int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity()* pEffectHPRecoveryEffect->getPeriod();				HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP);				// 笛 吝俊 奴 窜困雀汗剧苞 累篮 掉饭捞甫 掘绢辰促.				HPQuantity      = max(HPQuantity,      (int)(pEffectHPRecoveryEffect->getHPQuantity()));				HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay()));				// 泅犁 雀汗剧阑 啊瘤绊, 倔付究 割锅俊 雀汗且 巴牢啊甫 搬沥茄促.				temp     = (double)((double)HPAmount/(double)HPQuantity);				Period   = (uint)ceil(temp);				Deadline = Period* HPDelayProvider;				// HP Recovery effect甫 盎脚茄促.				pEffectHPRecoveryEffect->setDeadline(Deadline);				pEffectHPRecoveryEffect->setDelay(HPDelayProvider);				pEffectHPRecoveryEffect->setHPQuantity(HPQuantity);				pEffectHPRecoveryEffect->setPeriod(Period);				// 雀汗 矫累窍扼绰 菩哦阑 磊脚俊霸 焊辰促.				GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf;				gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod());				gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay());				gcHPRecoveryStartToSelf.setQuantity(pEffectHPRecoveryEffect->getHPQuantity());				pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf);				// 雀汗 矫累窍扼绰 菩哦阑 促弗捞甸俊霸 焊辰促.				// 雀汗 盎脚 菩哦, 矫累苞 度 鞍篮 菩哦阑 焊辰促.				GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers;				gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID());				gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod());				gcHPRecoveryStartToOthers.setDelay(pEffectHPRecoveryEffect->getDelay());				gcHPRecoveryStartToOthers.setQuantity(pEffectHPRecoveryEffect->getHPQuantity());				pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcHPRecoveryStartToOthers, pSlayer);				GCUseOK _GCUseOK;				pGamePlayer->sendPacket(&_GCUseOK);			} 			else 			{				EffectHPRecovery* pEffectHPRecovery = new EffectHPRecovery();				pEffectHPRecovery->setTarget(pSlayer);				pEffectHPRecovery->setDeadline(Deadline);				pEffectHPRecovery->setDelay(HPDelayProvider);				pEffectHPRecovery->setNextTime(0);				pEffectHPRecovery->setHPQuantity(HPQuantity);				pEffectHPRecovery->setPeriod(Period);				pEffectManager->addEffect(pEffectHPRecovery);				// 雀汗 矫累窍扼绰 菩哦阑 磊脚俊霸 焊辰促.				GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf;				gcHPRecoveryStartToSelf.setPeriod(Period);				gcHPRecoveryStartToSelf.setDelay(HPDelayProvider);				gcHPRecoveryStartToSelf.setQuantity(HPQuantity);				pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf);				// 雀汗 矫累窍扼绰 菩哦阑 焊绰捞甸俊霸 焊辰促.				GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers;				gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID());				gcHPRecoveryStartToOthers.setPeriod(Period);				gcHPRecoveryStartToOthers.setDelay(HPDelayProvider);				gcHPRecoveryStartToOthers.setQuantity(HPQuantity);				pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcHPRecoveryStartToOthers, pSlayer);				GCUseOK _GCUseOK;				pGamePlayer->sendPacket(&_GCUseOK);			}			decreaseItemNum(pItem, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);		} 		else 		{			GCCannotUse _GCCannotUse;			_GCCannotUse.setObjectID(pPacket->getObjectID());			pGamePlayer->sendPacket(&_GCCannotUse);			return;		}	} 	else 	{		notRecoverHP = true;	}	// MP 雀汗剧捞 粮犁茄促搁...	if (MPAmount != 0 && MPQuantity != 0)	{		if (CurrentMP < MaxMP) 		{			EffectManager* pEffectManager = pSlayer->getEffectManager();			double temp     = (double)((double)MPAmount/(double)MPQuantity);			uint   Period   = (uint)ceil(temp);			Turn_t Deadline = Period* MPDelayProvider;

⌨️ 快捷键说明

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