cgusepotionfrominventoryhandler.cpp

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

CPP
784
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGUsePotionFromInventoryHandler.cc// Written By  : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "CGUsePotionFromInventory.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Zone.h"	#include "Slayer.h"	#include "Vampire.h"	#include "Ousters.h"	#include "Inventory.h"	#include "Item.h"	#include "ItemInfo.h"	#include "ItemInfoManager.h"	#include "ItemUtil.h"	#include <math.h>	#include "EffectHPRecovery.h"	#include "EffectMPRecovery.h"	#include "item/Potion.h"	#include "item/Serum.h"	#include "item/Pupa.h"	#include "item/ComposMei.h"	#include "Gpackets/GCCannotUse.h"	#include "Gpackets/GCUseOK.h"	#include "Gpackets/GCHPRecoveryStartToSelf.h"	#include "Gpackets/GCHPRecoveryStartToOthers.h"	#include "Gpackets/GCMPRecoveryStart.h"#endif#define	 DELAY_PROVIDER	 2#define	 RECOVERY_QUANTITY 1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGUsePotionFromInventoryHandler::execute (CGUsePotionFromInventory* 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);	if (pGamePlayer == NULL) return;	Creature* pCreature = pGamePlayer->getCreature();	if (pCreature == NULL) return;	// 内付 惑怕扼搁 荤侩且 荐 绝促.	if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA))	{		GCCannotUse _GCCannotUse;		_GCCannotUse.setObjectID(pPacket->getObjectID());		pGamePlayer->sendPacket(&_GCCannotUse);		return;	}	if (pCreature->isSlayer())	{		Slayer*    pSlayer    = dynamic_cast<Slayer*>(pCreature);		Inventory* pInventory = pSlayer->getInventory();		Zone*      pZone      = pSlayer->getZone();		if (pZone == NULL || pInventory == NULL) return;		CoordInven_t InvenX = pPacket->getX();		CoordInven_t InvenY = pPacket->getY();		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();		if (ItemObjectID != pPacket->getObjectID() || pItem->getItemClass() != Item::ITEM_CLASS_POTION)		{			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();		Attr_t INT = pSlayer->getINT();		HP_t    PotionHPAmount = 0, PotionMPAmount = 0;		PotionHPAmount = pPotion->getHPAmount();		PotionMPAmount = pPotion->getMPAmount();				int     HPAmount = min(MaxHP - CurrentHP , (int)PotionHPAmount);		int     MPAmount = min(MaxMP - CurrentMP , (int)(PotionMPAmount* (double)(1 + (double)((double)INT / 300.0))));		bool	notRecoverHP = false;		bool	notRecoverMP = false;		// 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);			}		}		// 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);				}			} 			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;				if (pSlayer->isFlag(Effect::EFFECT_CLASS_MP_RECOVERY)) 				{					Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY);					EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast<EffectMPRecovery*>(pEffect);					// 扁粮狼 窜困剧苞 冉荐肺 盲快绰 MP剧阑 拌魂茄促.					// 弊巴阑 泅犁 雀汗剧俊 歹茄促.					int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity()* pEffectMPRecoveryEffect->getPeriod();					MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP);					// 笛 吝俊 奴 窜困雀汗剧苞 累篮 掉饭捞甫 掘绢辰促.					MPQuantity      = max(MPQuantity,      (int)(pEffectMPRecoveryEffect->getMPQuantity()));					MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay()));					// 泅犁 雀汗剧阑 啊瘤绊, 倔付究 割锅俊 雀汗且 巴牢啊甫 搬沥茄促.					temp     = (double)((double)MPAmount/(double)MPQuantity);					Period   = (uint)ceil(temp);					Deadline = Period * MPDelayProvider;					// MP Recovery effect甫 盎脚茄促.					pEffectMPRecoveryEffect->setDeadline(Deadline);					pEffectMPRecoveryEffect->setDelay(MPDelayProvider);					pEffectMPRecoveryEffect->setMPQuantity(MPQuantity);					pEffectMPRecoveryEffect->setPeriod(Period);					// 雀汗 矫累窍扼绰 菩哦阑 磊脚俊霸 焊辰促.					GCMPRecoveryStart gcMPRecoveryStart;					gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod());					gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay());					gcMPRecoveryStart.setQuantity(pEffectMPRecoveryEffect->getMPQuantity());					pGamePlayer->sendPacket(&gcMPRecoveryStart);					GCUseOK _GCUseOK;					pGamePlayer->sendPacket(&_GCUseOK);				} 				else 				{					EffectMPRecovery* pEffectMPRecovery = new EffectMPRecovery();					pEffectMPRecovery->setTarget(pSlayer);					pEffectMPRecovery->setDeadline(Deadline);					pEffectMPRecovery->setDelay(MPDelayProvider);					pEffectMPRecovery->setNextTime(0);					pEffectMPRecovery->setMPQuantity(MPQuantity);					pEffectMPRecovery->setPeriod(Period);					pEffectManager->addEffect(pEffectMPRecovery);					// 雀汗 矫累窍扼绰 菩哦阑 磊脚俊霸 焊辰促.					GCMPRecoveryStart gcMPRecoveryStart;					gcMPRecoveryStart.setPeriod(Period);					gcMPRecoveryStart.setDelay(MPDelayProvider);					gcMPRecoveryStart.setQuantity(MPQuantity);					pGamePlayer->sendPacket(&gcMPRecoveryStart);					GCUseOK _GCUseOK;					pGamePlayer->sendPacket(&_GCUseOK);				}			} 			else 			{				GCCannotUse _GCCannotUse;				_GCCannotUse.setObjectID(pPacket->getObjectID());				pGamePlayer->sendPacket(&_GCCannotUse);				return;			}		} 		else 		{			notRecoverMP = true;		}		if (notRecoverHP && notRecoverMP)		{			GCCannotUse _GCCannotUse;			_GCCannotUse.setObjectID(pPacket->getObjectID());			pGamePlayer->sendPacket(&_GCCannotUse);			return;		}		else		{			decreaseItemNum(pItem, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY);		}	}	else if (pCreature->isVampire())	{		Vampire*   pVampire   = dynamic_cast<Vampire*>(pCreature);		Inventory* pInventory = pVampire->getInventory();		Zone*      pZone      = pVampire->getZone();		if (pZone == NULL || pInventory == NULL) return;		CoordInven_t InvenX = pPacket->getX();		CoordInven_t InvenY = pPacket->getY();		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();		if (ItemObjectID != pPacket->getObjectID() 			|| pItem->getItemClass() != Item::ITEM_CLASS_SERUM			// Mephisto 捞棋飘啊 吧妨乐栏搁 趋没 给 冈绰促.			|| pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO)			)		{			GCCannotUse _GCCannotUse;			_GCCannotUse.setObjectID(pPacket->getObjectID());			pGamePlayer->sendPacket(&_GCCannotUse);			return;		}		HP_t   MaxHP       = pVampire->getHP(ATTR_MAX);		HP_t   CurrentHP   = pVampire->getHP(ATTR_CURRENT);

⌨️ 快捷键说明

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