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