_cgthrowbombhandler.cpp
来自「dk1游戏的原代码文件,完整.编译系统redhat7.3,mysql 3.23 」· C++ 代码 · 共 386 行
CPP
386 行
//////////////////////////////////////////////////////////////////////////////// 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; Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); int ZoneX = pPacket->getZoneX(); int ZoneY = pPacket->getZoneY(); int BombX = pPacket->getBombX(); int BombY = pPacket->getBombY(); bool bAttackSlayer = (pPacket->getAttackSlayerFlag() != 0) ? true : false; try { if (pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) { g_Sniping.checkRevealRatio(pCreature, 20, 10); } Slayer* pSlayer = dynamic_cast<Slayer*>(pCreature); Inventory* pInventory = pSlayer->getInventory(); 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(); Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)) + pSlayer->getDEX(ATTR_CURRENT)/10; // 荤侩磊狼 困摹客 带龙 镑狼 困摹肺 规氢阑 拌魂茄促. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, ZoneX, ZoneY); int count = 0; bool bHit = false; list<Creature*> cList; GCThrowBombOK1 _GCThrowBombOK1; GCThrowBombOK2 _GCThrowBombOK2; GCThrowBombOK3 _GCThrowBombOK3; // 嘎电 嘎瘤 臼疽电 气藕狼 箭磊绰 临咯林绢具 茄促. decreaseItemNum(pBomb, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, BombX, BombY); // 阿阿狼 鸥老阑 倒搁辑 洒飘 眉农甫 茄促. 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); list<Creature*> targetList; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); targetList.push_back(pCreature); } if (tile.hasCreature(Creature::MOVE_MODE_BURROWING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING); 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; if (HitRoll::isSuccess(pSlayer, pTargetCreature, 0)) { Damage_t Damage = getPercentValue(RealDamage, Mask); //setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1); //setDamage(pTargetCreature, Damage, pSlayer, 0, NULL, &_GCSkillToTileOK1); //computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); //increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); bHit = true; cList.push_back(pTargetCreature); } } } } // for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++) // 葛电 鸥老 眉农啊 场车栏聪, 版氰摹甫 距埃 棵府绊, 酒捞袍 箭磊甫 临咯霖促. if (bHit) { //shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCSkillToTileOK1); } // 捞 何盒俊辑 菩哦阑 焊郴拎具 窍绰单.. } catch (Throwable& t) { } /* try { ObjectID_t slayerObjectID = pSlayer->getObjectID(); ZoneCoord_t slayerX = pSlayer->getX(), slayerY = pSlayer->getY(); // 疙吝 登菌促搁, 单固瘤甫 霖促.. if (ToHit > Random(0, 100)) { int explosionType = 0; switch(itemType) { case 0://ACER explosionType = 0; break; case 1://Bulls explosionType = 0; break; case 2://Cyclone explosionType = 1; break; case 3://Pylone explosionType = 2; break; case 4://Crossbow explosionType = 1; break; case 5://Twister explosionType = 3; break; } Dir_t Dir = calcDirection(slayerX, slayerY, X, Y); int tileX, tileY; const int* xOffsetEType = NULL, *yOffsetEType = NULL; int tiles = 0; getExplosionTypeXYOffset(explosionType, Dir, xOffsetEType, yOffsetEType, tiles); for(int tileI = 0; tileI < tiles; tileI++) { tileX = X + xOffsetEType[ tileI]; tileY = Y + yOffsetEType[ tileI]; if (isValidZoneCoord(pZone, tileX, tileY) && pZone->getZoneLevel(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); const slist<Object*>& oList = tile.getObjectList(); // tile困狼 葛电 坷宏璃飘俊 措秦辑 炼荤甫 茄促. for(slist<Object*>::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { // 炼扒阑 犬牢 Object* pObject = *itr; if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { // Damage甫 涝绰 巴甸父 cList俊 眠啊矫挪促. Creature* pTargetCreature = dynamic_cast<Creature*>(pObject); if (pTargetCreature->isSlayer()) { //Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTargetCreature); } else if (pTargetCreature->isVampire()) { //Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); cList.push_back(pTargetCreature); } else if (pTargetCreature->isMonster()) { //Monster* pTargetMonster = dynamic_cast<Monster*>(pTargetCreature); cList.push_back(pTargetCreature); } else continue; ObjectID_t targetObjectID = pTargetCreature->getObjectID(); _GCThrowBombOK1.addCListElement(targetObjectID); _GCThrowBombOK2.addCListElement(targetObjectID); _GCThrowBombOK3.addCListElement(targetObjectID); } } } } _GCThrowBombOK1.setXYDir(X, Y, Dir); _GCThrowBombOK1.setItemType(itemType); _GCThrowBombOK2.setXYDir(X, Y, Dir); _GCThrowBombOK2.setObjectID(slayerObjectID); _GCThrowBombOK2.setItemType(itemType); _GCThrowBombOK3.setXYDir(X, Y, Dir); _GCThrowBombOK3.setObjectID(slayerObjectID); _GCThrowBombOK3.setItemType(itemType); for(list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; _GCThrowBombOK2.clearList(); setDamage(pTargetCreature, Damage, NULL, 0, &_GCThrowBombOK2); if (pTargetCreature->isPC()) { pTargetCreature->getPlayer()->sendPacket(&_GCThrowBombOK2); } } pPlayer->sendPacket(&_GCThrowBombOK1); cList.push_back(pSlayer); pZone->broadcastPacket(slayerX, slayerY, &_GCThrowBombOK3, cList); } else // 带瘤扁俊 角菩沁阑 版快... { GCSkillFailed1 _GCSkillFailed1; GCSkillFailed2 failpkt2; failpkt2.setObjectID(slayerObjectID); failpkt2.setSkillType(SKILL_INVISIBILITY+19); pZone->broadcastPacket(slayerX, slayerY, &failpkt2, pSlayer); pPlayer->sendPacket(&_GCSkillFailed1); } pInventory->deleteItem(bombObjectID); pBomb->destroy(); SAFE_DELETE(pBomb); } catch (Throwable & t) { //cout << t.toString() << endl; } */#endif // __GAME_SERVER__ __END_DEBUG_EX __END_CATCH}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?