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