cgusepotionfromquickslothandler.cpp

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

CPP
684
字号
//////////////////////////////////////////////////////////////////////////////// Filename    : CGUsePotionFromQuickSlotHandler.cc// Written By  : elca@ewestsoft.com// Description : //////////////////////////////////////////////////////////////////////////////#include "CGUsePotionFromQuickSlot.h"#ifdef __GAME_SERVER__	#include "GamePlayer.h"	#include "Zone.h"	#include "Slayer.h"	#include "Ousters.h"	#include "Inventory.h"	#include "Item.h"	#include "ItemInfo.h"	#include "ItemUtil.h"	#include <math.h>	#include "EffectHPRecovery.h"	#include "EffectMPRecovery.h"	#include "item/Belt.h"	#include "item/OustersArmsband.h"	#include "item/Potion.h"	#include "item/Pupa.h"	#include "item/ComposMei.h"	#include "Gpackets/GCHPRecoveryStartToSelf.h"	#include "Gpackets/GCHPRecoveryStartToOthers.h"	#include "Gpackets/GCMPRecoveryStart.h"	#include "Gpackets/GCUseOK.h"	#include "Gpackets/GCCannotUse.h"#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGUsePotionFromQuickSlotHandler::execute (CGUsePotionFromQuickSlot* 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();	try 	{		if ( pCreature->isSlayer() )		{			GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer);			Creature*   pCreature   = pGamePlayer->getCreature();			if (!pCreature->isSlayer()) return;			// 内付 惑怕扼搁 荤侩且 荐 绝促.			if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA))			{				GCCannotUse _GCCannotUse;				_GCCannotUse.setObjectID(pPacket->getObjectID());				pGamePlayer->sendPacket(&_GCCannotUse);				return;			}			Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature);			Zone*   pZone   = pSlayer->getZone();			Item*   pBelt   = pSlayer->getWearItem(Slayer::WEAR_BELT);						if (pBelt == NULL)			{				GCCannotUse _GCCannotUse;				_GCCannotUse.setObjectID(pPacket->getObjectID());				pGamePlayer->sendPacket(&_GCCannotUse);				return;			}			// 骇飘狼 牢亥配府甫 罐酒柯促.			Inventory* pBeltInventory = ((Belt*)pBelt)->getInventory();						// SlotID甫 罐绰促.			SlotID_t SlotID = pPacket->getSlotID();			// 浇儿狼 裹困甫 檬苞窍搁 荤侩且 荐 绝促.			if (SlotID >= pBeltInventory->getWidth())			{				GCCannotUse _GCCannotUse;				_GCCannotUse.setObjectID(pPacket->getObjectID());				pGamePlayer->sendPacket(&_GCCannotUse);				return;			}						// 骇飘狼 瘤沥 浇儿狼 酒捞袍阑 罐酒柯促.			Item* pBeltItem = pBeltInventory->getItem(SlotID, 0);						// 酒捞袍捞 绝栏搁 寸楷洒 荤侩且 荐 绝促.			if (pBeltItem == NULL)			{				GCCannotUse _GCCannotUse;				_GCCannotUse.setObjectID(pPacket->getObjectID());				pGamePlayer->sendPacket(&_GCCannotUse);				return;			}						// 浇儿俊 乐绰 酒捞袍狼 Object甫 罐绰促.			ObjectID_t ItemObjectID = pBeltItem->getObjectID();			// 单捞磐啊 老摹窍瘤 臼芭唱, 器记捞 酒聪扼搁 荤侩且 荐 绝促.			if (ItemObjectID != pPacket->getObjectID() || pBeltItem->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*>(pBeltItem);			// 茄畔俊 雀汗登绰 剧			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)(pPotion->getMPAmount()* (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);					uint   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;				}

⌨️ 快捷键说明

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