📄 zoneutil.cpp
字号:
{ Player* pPlayer = pViewer->getPlayer(); Assert(pPlayer); pPlayer->sendPacket(&gcDO); if ( pViewer->isFlag(Effect::EFFECT_CLASS_REVEALER) ) { pPlayer->sendPacket(&gcAddMine); } }//if }//for }//for }//for __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 漂沥 农府媚啊 瘤汾甫 光瘤 臼疽绰瘤 眉农茄促.//// Zone* pZone : 粮俊 措茄 器牢磐// Creature* pCreature : 八荤且 农府媚// ZoneCoord_t X : 八荤且 谅钎 x// ZoneCoord_t Y : 八荤且 谅钎 y//////////////////////////////////////////////////////////////////////////////bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) throw(){ __BEGIN_TRY Assert(pCreature != NULL); // 浇饭捞绢啊 光阑 鉴 绝促. if ( pCreature->isSlayer() ) return false; Assert(pZone != NULL); // 困俊 乐带吧 咯扁肺 郴覆 by sigi. 2002.11.7 // 父老 救傈瘤措扼搁 气颇矫虐瘤 臼绰促. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); // 鸥老俊 酒捞袍捞 绝绢档 气颇矫虐瘤 臼绰促. if (!rTile.hasItem()) return false; //cout << "Check Mine Start" << endl; Item* pItem = rTile.getItem(); // 官蹿俊 乐绰 酒捞袍捞 牢胶喷等 瘤汾啊 酒聪芭唱, // 农府媚啊 吧绢促聪绰 农府媚啊 酒聪扼搁 瘤汾甫 气颇矫虐瘤 臼绰促. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) return false; if (pCreature->isWalking() == false) return false; GCMineExplosionOK1 _GCMineExplosionOK1; GCMineExplosionOK2 _GCMineExplosionOK2; list<Creature*> cList; Mine* pMine = dynamic_cast<Mine*>(pItem); Assert(pMine != NULL); Dir_t Dir = pMine->getDir(); Damage_t Damage = pMine->getDamage(); ItemType_t Type = pMine->getItemType(); string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); BYTE explodeType = Type; // 气惯 屈怕 // 瘤汾啊 气惯沁栏聪, 老窜 公炼扒 昏力秦 霖促. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; gcDO.setObjectID(pMine->getObjectID()); pZone->broadcastPacket(X, Y, &gcDO); SAFE_DELETE(pMine); /* switch(Type) { case 0: // Viper explodeType = 0; break; case 1: // Diamond Back explodeType = 2; break; case 2: // Sidewinder explodeType = 5; break; case 3: // cobra explodeType = 3; break; default: Assert(false); }; */ int tileX, tileY; const int* xOffsetByEType = NULL; const int* yOffsetByEType = NULL; int tiles = 0; // 瘤汾 鸥涝俊 蝶弗 气惯 offset 付胶农甫 啊廉柯促. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1); for (int tileI = 0; tileI < tiles; tileI++) { tileX = X + xOffsetByEType[ tileI]; tileY = Y + yOffsetByEType[ tileI]; //cout << "Check1 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; // 泅犁 谅钎啊 粮 郴何捞绊, 救傈 瘤措啊 酒聪扼搁... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const slist<Object*>& oList = tile.getObjectList(); // 鸥老 困狼 葛电 坷宏璃飘俊 措秦辑 炼荤甫 茄促. 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); cList.push_back(pTargetCreature); } else if (pTargetCreature->isVampire()) { //Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); cList.push_back(pTargetCreature); } else if (pTargetCreature->isOusters()) { 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(); _GCMineExplosionOK1.addCListElement(targetObjectID); _GCMineExplosionOK2.addCListElement(targetObjectID); } } } } _GCMineExplosionOK1.setXYDir(X, Y, Dir); _GCMineExplosionOK1.setItemType(Type); _GCMineExplosionOK2.setXYDir(X, Y, Dir); _GCMineExplosionOK2.setItemType(Type); for (list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; _GCMineExplosionOK1.clearList(); //cout << "Set Damage : " << (int)Damage << endl; if( pTargetCreature->isSlayer() ) Damage = max( 1, Damage / 2 ); setDamage(pTargetCreature, Damage, NULL, 0, &_GCMineExplosionOK1); if (pTargetCreature->isPC()) { pTargetCreature->getPlayer()->sendPacket(&_GCMineExplosionOK1); } else if( pTargetCreature->isMonster() ) { Monster * pMonster = dynamic_cast<Monster*>(pTargetCreature); // 瘤汾 汲摹磊狼 单固瘤甫 眠啊秦 霖促. // 嘎绰 仇捞 阁胶磐捞绊, 傍拜磊啊 荤恩捞扼搁, // 单固瘤俊 蝶扼辑 函窍绰 快急鼻 抛捞喉阑 盎脚秦 林绢具 茄促. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } } pZone->broadcastPacket(X, Y, &_GCMineExplosionOK2, cList); //cout << "Check Mine End" << endl; return true; __END_CATCH}//////////////////////////////////////////////////////////////////////////////// 瘤汾啊 楷尖肺 磐瘤绰瘤 酒囱瘤 眉农 茄促.//// Zone* pZone : 粮俊 措茄 器牢磐// Creature* pCreature : 八荤且 农府媚// ZoneCoord_t X : 八荤且 谅钎 x// ZoneCoord_t Y : 八荤且 谅钎 y//////////////////////////////////////////////////////////////////////////////bool checkMine( Zone * pZone, ZoneCoord_t X, ZoneCoord_t Y ) throw(){ __BEGIN_TRY Assert(pZone != NULL); // 父老 救傈瘤措扼搁 气颇矫虐瘤 臼绰促. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); // 鸥老俊 酒捞袍捞 绝绢档 气颇矫虐瘤 臼绰促. if (rTile.hasItem() == false) return false; //cout << "Check Mine2 Start" << endl; Item* pItem = rTile.getItem(); // 官蹿俊 乐绰 酒捞袍捞 牢胶喷等 瘤汾啊 酒聪芭唱, // 农府媚啊 吧绢促聪绰 农府媚啊 酒聪扼搁 瘤汾甫 气颇矫虐瘤 臼绰促. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) return false; GCMineExplosionOK1 _GCMineExplosionOK1; GCMineExplosionOK2 _GCMineExplosionOK2; list<Creature*> cList; Mine* pMine = dynamic_cast<Mine*>(pItem); Assert(pMine != NULL); Dir_t Dir = pMine->getDir(); Damage_t Damage = pMine->getDamage(); ItemType_t Type = pMine->getItemType(); string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); BYTE explodeType = Type; // 气惯 屈怕 /* switch(Type) { case 0: // Viper explodeType = 0; break; case 1: // Diamond Back explodeType = 2; break; case 2: // Sidewinder explodeType = 5; break; case 3: // cobra explodeType = 3; break; default: Assert(false); }; */ // 瘤汾啊 气惯沁栏聪, 老窜 昏力秦 霖促. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; gcDO.setObjectID(pMine->getObjectID()); pZone->broadcastPacket(X, Y, &gcDO); SAFE_DELETE(pMine); int tileX, tileY; const int* xOffsetByEType = NULL; const int* yOffsetByEType = NULL; int tiles = 0; // 瘤汾 鸥涝俊 蝶弗 气惯 offset 付胶农甫 啊廉柯促. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth()-1, pZone->getHeight()-1); for (int tileI = 0; tileI < tiles; tileI++) { tileX = X + xOffsetByEType[ tileI]; tileY = Y + yOffsetByEType[ tileI]; //cout << "Check2 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; // 泅犁 谅钎啊 粮 郴何捞绊, 救傈 瘤措啊 酒聪扼搁... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const slist<Object*>& oList = tile.getObjectList(); // 鸥老 困狼 葛电 坷宏璃飘俊 措秦辑 炼荤甫 茄促. 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); cList.push_back(pTargetCreature); } else if (pTargetCreature->isVampire()) { //Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTargetCreature); cList.push_back(pTargetCreature); } else if (pTargetCreature->isOusters()) { 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(); _GCMineExplosionOK1.addCListElement(targetObjectID); _GCMineExplosionOK2.addCListElement(targetObjectID); } } } } _GCMineExplosionOK1.setXYDir(X, Y, Dir); _GCMineExplosionOK1.setItemType(Type); _GCMineExplosionOK2.setXYDir(X, Y, Dir); _GCMineExplosionOK2.setItemType(Type); for (list<Creature*>::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; _GCMineExplosionOK1.clearList(); //cout << "Set Damage : " << (int)Damage << endl; if( pTargetCreature->isSlayer() ) Damage = max( 1, Damage / 2 ); setDamage(pTargetCreature, Damage, NULL, 0, &_GCMineExplosionOK1); if (pTargetCreature->isPC()) { pTargetCreature->getPlayer()->sendPacket(&_GCMineExplosionOK1); } else if( pTargetCreature->isMonster() ) { Monster * pMonster = dynamic_cast<Monster*>(pTargetCreature); // 瘤汾 汲摹磊狼 单固瘤甫 眠啊秦 霖促. // 嘎绰 仇捞 阁胶磐捞绊, 傍拜磊啊 荤恩捞扼搁, // 单固瘤俊 蝶扼辑 函窍绰 快急鼻 抛捞喉阑 盎脚秦 林绢具 茄促. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } } pZone->broadcastPacket(X, Y, &_GCMineExplosionOK2, cList); //cout << "Check Mine2 End" << endl; return true; __END_CATCH}bool checkTrap( Zone* pZone, Creature* pCreature ){ if ( !isValidZoneCoord( pZone, pCreature->getX(), pCreature->getY() ) ) return false; Tile& rTile = pZone->getTile( pCreature->getX(), pCreature->getY() ); Effect* pEffect = rTile.getEffect( Effect::EFFECT_CLASS_TRAP_INSTALLED ); if ( pEffect == NULL ) return false; int ratio = 0; if ( pCreature->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pCreature); ratio = 100 - (pMonster->getLevel()/10); } else if ( pCreature->isVampire() ) { Vampire* pVampire = dynamic_cast<Vampire*>(pCreature); ratio = 100 - (pVampire->getINT()/8); } else if ( pCreature->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pCreature); ratio = 100 - (pOusters->getINT()/8); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -