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 + -
显示快捷键?