cgthrowbombhandler.cpp
来自「dk1游戏的原代码文件,完整.编译系统redhat7.3,mysql 3.23 」· C++ 代码 · 共 379 行
CPP
379 行
//////////////////////////////////////////////////////////////////////////////// Filename : CGThrowBombHandler.cc// Written By : elca@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "CGThrowBomb.h"#ifdef __GAME_SERVER__ #include "GamePlayer.h" #include "Slayer.h" #include "ZoneUtil.h" #include "SkillUtil.h" #include "ItemUtil.h" #include <list> #include "item/Bomb.h" #include "skill/Sniping.h" #include "Gpackets/GCThrowBombOK1.h" #include "Gpackets/GCThrowBombOK2.h" #include "Gpackets/GCThrowBombOK3.h" #include "Gpackets/GCSkillFailed1.h" #include "Gpackets/GCSkillFailed2.h" #include "Gpackets/GCStatusCurrentHP.h"#endif // __GAME_SERVER__#ifdef __GAME_SERVER__// 鸥涝// 规氢// 付胶农int BombMask[5][9][9] ={ // 0锅 鸥涝 气藕 { { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // 1锅 鸥涝 气藕 { { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // 2锅 鸥涝 气藕 { { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 100, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // 3锅 鸥涝 气藕 { { 0, 50, 0, 0, 100, 0, 0, 50, 0 }, { 50, 0, 0, 0, 100, 0, 0, 0, 50 }, { 0, 0, 0, 50, 100, 50, 0, 0, 0 }, { 0, 0, 50, 0, 100, 0, 50, 0, 0 }, { 0, 50, 0, 0, 100, 0, 0, 50, 0 }, { 50, 0, 0, 0, 100, 0, 0, 0, 50 }, { 0, 0, 0, 50, 100, 50, 0, 0, 0 }, { 0, 0, 50, 0, 100, 0, 50, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // 4锅 鸥涝 气藕 { { 0, 50, 0, 50, 100, 50, 0, 50, 0 }, { 50, 0, 50, 0, 100, 0, 50, 0, 50 }, { 0, 50, 0, 50, 100, 50, 0, 50, 0 }, { 50, 0, 50, 0, 100, 0, 50, 0, 50 }, { 0, 50, 0, 50, 100, 50, 0, 50, 0 }, { 50, 0, 50, 0, 100, 0, 50, 0, 50 }, { 0, 50, 0, 50, 100, 50, 0, 50, 0 }, { 50, 0, 50, 0, 100, 0, 50, 0, 50 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }};#endif////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CGThrowBombHandler::execute(CGThrowBomb* pPacket , Player* pPlayer) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG_EX#ifdef __GAME_SERVER__ Assert(pPacket != NULL); Assert(pPlayer != NULL); // 霸烙 敲饭捞绢狼 惑怕啊 沥惑捞 酒聪扼搁 傲 府畔茄促. GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); // 敲饭捞绢啊 浇饭捞绢啊 酒聪扼搁 傲 府畔茄促. if (!pCreature->isSlayer()) return; Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); int ZoneX = pPacket->getZoneX(); int ZoneY = pPacket->getZoneY(); int BombX = pPacket->getBombX(); int BombY = pPacket->getBombY(); Inventory* pInventory = pSlayer->getInventory(); Assert(pInventory != NULL); // 肯傈 救傈瘤措扼搁 扁贱 荤侩 阂啊. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pSlayer->getX(), pSlayer->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (BombX >= pInventory->getWidth() || BombY >= pInventory->getHeight())) { GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(SKILL_THROW_BOMB); pPlayer->sendPacket(&_GCSkillFailed1); return; } ObjectID_t slayerObjectID = pCreature->getObjectID(); bool bAttackSlayer = (pPacket->getAttackSlayerFlag() != 0) ? true : false; try { if (pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) { g_Sniping.checkRevealRatio(pCreature, 20, 10); } Item* pItem = pInventory->getItem(BombX, BombY); // 酒捞袍捞 澄捞芭唱 气藕捞 酒聪扼搁... if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BOMB) { GCSkillFailed1 _GCSkillFailed1; //_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB); pPlayer->sendPacket(&_GCSkillFailed1); return; } /* // 6篮 烙狼狼 荤沥 芭府促... // 荤沥 芭府焊促 钢府 带瘤妨绊 窍搁, 绢痘霸 窍绰 巴捞 亮阑鳖? if (!verifyDistance(pSlayer, ZoneX, ZoneY, 6)) { GCSkillFailed1 _GCSkillFailed1; //_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB); pPlayer->sendPacket(&_GCSkillFailed1); return; } */ // 气藕狼 阿辆 沥焊甫 掘绢柯促. Bomb* pBomb = dynamic_cast<Bomb*>(pItem); ItemType_t BombType = pBomb->getItemType(); Damage_t MinDamage = pBomb->getMinDamage(); Damage_t MaxDamage = pBomb->getMaxDamage(); SkillSlot * pSkillSlot = pSlayer->hasSkill(SKILL_THROW_BOMB); SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_THROW_BOMB); Level_t SkillLevel = pSkillSlot->getExpLevel(); Damage_t RealDamage = MinDamage + ( max ( 0, ( (int)MaxDamage * (int)SkillLevel / 100 ) - MinDamage ) ); // 荤侩磊狼 困摹客 带龙 镑狼 困摹肺 规氢阑 拌魂茄促. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, ZoneX, ZoneY); int count = 0; bool bHit = false; bool bRaceCheck = true;; list<Creature*> cList; GCThrowBombOK1 _GCThrowBombOK1; GCThrowBombOK2 _GCThrowBombOK2; GCThrowBombOK3 _GCThrowBombOK3; int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, ZoneX, ZoneY, 6); // 嘎电 嘎瘤 臼疽电 气藕狼 箭磊绰 临咯林绢具 茄促. decreaseItemNum(pBomb, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, BombX, BombY); if( bManaCheck && bTimeCheck && bRangeCheck ) { } else { GCSkillFailed1 _GCSkillFailed1; //_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB); pPlayer->sendPacket(&_GCSkillFailed1); return; } decreaseMana(pSlayer, RequiredMP, _GCThrowBombOK1); // 阿阿狼 鸥老阑 倒搁辑 洒飘 眉农甫 茄促. for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++) { for (int tileX = ZoneX-1; tileX <= ZoneX+1; tileX++, count++) { // 棵官弗 粮 谅钎啊 酒聪扼搁, continue if (!isValidZoneCoord(pZone, tileX, tileY)) continue; // mask啊 0捞扼搁, 溜 洒飘费阑 且 鞘夸啊 绝促搁 continue int Mask = BombMask[BombType][dir][count]; if (Mask == 0) continue; Tile& tile = pZone->getTile(tileX, tileY); checkMine( pZone, tileX, tileY ); list<Creature*> targetList; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); // NoSuch力芭. by sigi. 2002.5.2 if (pCreature!=NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) targetList.push_back(pCreature); } if (tile.hasCreature(Creature::MOVE_MODE_BURROWING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING); // NoSuch力芭. by sigi. 2002.5.2 if (pCreature!=NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) targetList.push_back(pCreature); } list<Creature*>::iterator itr = targetList.begin(); for(; itr != targetList.end(); itr++) { Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); bool bHitRoll = true; if (pTargetCreature->isSlayer() && !bAttackSlayer) bHitRoll = false; else if (pTargetCreature->isNPC()) bHitRoll = false; if (!bHitRoll) continue; bool bPK = verifyPK(pSlayer, pTargetCreature); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature); // 荤侩磊啊 鸥百捞扼搁 版氰摹甫 救棵副妨备 畴仿 茄促. // 个户捞 积败朝 荐 乐扁 锭巩捞促. if( tileX == ZoneX && tileY == ZoneY ) { if( pTargetCreature->isSlayer() ) { bRaceCheck = false; } } if (HitRoll::isSuccess(pSlayer, pTargetCreature, 50) && bPK && bZoneLevelCheck ) { Damage_t Damage = getPercentValue(RealDamage, Mask); setDamage(pTargetCreature, Damage, pSlayer, 0, NULL, &_GCThrowBombOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCThrowBombOK1); increaseAlignment(pSlayer, pTargetCreature, _GCThrowBombOK1); bHit = true; cList.push_back(pTargetCreature); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); _GCThrowBombOK1.addCListElement(targetObjectID); _GCThrowBombOK2.addCListElement(targetObjectID); _GCThrowBombOK3.addCListElement(targetObjectID); } } } } // for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++) // 葛电 鸥老 眉农啊 场车栏聪, 版氰摹甫 距埃 棵府绊, 酒捞袍 箭磊甫 临咯霖促. if (bHit && bRaceCheck ) { shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCThrowBombOK1); increaseDomainExp(pSlayer, SKILL_DOMAIN_GUN, pSkillInfo->getPoint(), _GCThrowBombOK1); // 胶懦阑 荤侩且 荐 乐阑 锭父 胶懦 版氰摹甫 棵妨霖促. // 2003. 1. 12 by bezz if ( pSkillSlot->canUse() ) increaseSkillExp(pSlayer, SKILL_DOMAIN_GUN, pSkillSlot, pSkillInfo, _GCThrowBombOK1);// increaseAlignment(pSlayer, SKILL_DOMAIN_GUN, _GCThrowBombOK1); //shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCSkillToTileOK1); // 捞 何盒俊辑 菩哦阑 焊郴拎具 窍绰单.. } _GCThrowBombOK1.setXYDir(ZoneX, ZoneY, dir); _GCThrowBombOK1.setItemType(BombType); _GCThrowBombOK2.setXYDir(ZoneX, ZoneY, dir); _GCThrowBombOK2.setObjectID(slayerObjectID); _GCThrowBombOK2.setItemType(BombType); _GCThrowBombOK3.setXYDir(ZoneX, ZoneY, dir); _GCThrowBombOK3.setObjectID(slayerObjectID); _GCThrowBombOK3.setItemType(BombType); for(list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; _GCThrowBombOK2.clearList(); HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast<Slayer*>(pTargetCreature))->getHP(); } else if (pTargetCreature->isVampire()) { targetHP = (dynamic_cast<Vampire*>(pTargetCreature))->getHP(); } else if (pTargetCreature->isOusters()) { targetHP = (dynamic_cast<Ousters*>(pTargetCreature))->getHP(); } _GCThrowBombOK2.addShortData(MODIFY_CURRENT_HP, targetHP); // 酒捞袍狼 郴备仿阑 冻绢哆赴促. decreaseDurability(NULL, pTargetCreature, 10, NULL, &_GCThrowBombOK2); if (pTargetCreature->isPC()) { pTargetCreature->getPlayer()->sendPacket(&_GCThrowBombOK2); } } pPlayer->sendPacket(&_GCThrowBombOK1); cList.push_back(pSlayer); pZone->broadcastPacket(ZoneX, ZoneY, &_GCThrowBombOK3, cList); } catch (Throwable& t) { GCSkillFailed1 _GCSkillFailed1; GCSkillFailed2 failpkt2; failpkt2.setObjectID(slayerObjectID); failpkt2.setSkillType(SKILL_THROW_BOMB); pZone->broadcastPacket(ZoneX, ZoneY, &failpkt2, pSlayer); pPlayer->sendPacket(&_GCSkillFailed1); }#endif // __GAME_SERVER__ __END_DEBUG_EX __END_CATCH}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?