monstermanager.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 2,206 行 · 第 1/5 页
CPP
2,206 行
&& currentTime >= info.regenTime) { //cout << i << " "; MonsterType_t monsterType = info.monsterType; // 粮狼 后 谅钎甫 茫酒辰促. ZoneCoord_t x, y; if (!findPosition(monsterType, x, y)) { Assert(false); return; } // 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促. Monster* pMonster = new Monster(monsterType); Assert(pMonster != NULL); pMonster->setEventMonsterIndex( i ); try { m_pZone->addCreature(pMonster , x , y , Directions(rand()%8)); } catch (EmptyTileNotExistException&) { //cerr << "MonsterManager::processCreatures() : 磊府啊 绝匙?" << endl; SAFE_DELETE(pMonster); } } /* else { if (!info.bExist) cout << "f "; else cout << "t "; } */ } //cout << endl; } __END_DEBUG __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////bool MonsterManager::findPosition(MonsterType_t monsterType, ZoneCoord_t& RX, ZoneCoord_t& RY) const throw(){ __BEGIN_TRY const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(monsterType); int count = 0; // 公茄 风橇牢单... 趣矫扼档 巩力啊 乐阑鳖? while (true) { const BPOINT& pt = m_pZone->getRandomMonsterRegenPosition(); Tile& rTile = m_pZone->getTile(pt.x,pt.y); // 1. 鸥老捞 喉废登绢 乐瘤 臼绊 // 2. 鸥老俊 器呕捞 粮犁窍瘤 臼栏哥, // 3. 救傈瘤措啊 酒聪扼搁 if (!rTile.isBlocked(pMonsterInfo->getMoveMode()) && !rTile.hasPortal() && !(m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE)) { RX = pt.x; RY = pt.y; return true; } if (++count >= 300) { cerr << "MonsterManager::findPosition() : Max Count Exceeded" << endl; throw ("MonsterManager::findPosition() : Max Count Exceeded"); } } // 困俊辑 公茄 风橇聪鳖, 咯扁鳖瘤 给 坷摆瘤? return false; __END_CATCH}////////////////////////////////////////////////////////////////////////////////// 磷篮 农府贸甫 贸府茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::killCreature (Creature* pDeadCreature) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG Assert(pDeadCreature->isDead()); Zone* pZone = pDeadCreature->getZone(); Assert(m_pZone == pZone); Monster* pDeadMonster = dynamic_cast<Monster*>(pDeadCreature); ZoneCoord_t cx = pDeadMonster->getX(); ZoneCoord_t cy = pDeadMonster->getY(); // 磷菌栏聪鳖 快急鼻阑 拌魂秦霖促. PrecedenceTable* pTable = pDeadMonster->getPrecedenceTable(); pTable->compute(); if ( pTable->getHostName() == "" ) { // 酒公档 锭赴 逞捞 绝促搁 酒捞袍阑 救 持绰促. pDeadMonster->setTreasure( false ); } else { pDeadMonster->setHostName(pTable->getHostName()); pDeadMonster->setHostPartyID(pTable->getHostPartyID()); } // 刚历 官蹿俊 静矾哆府扼绊, 捞棋飘甫 谎赴促. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pDeadCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_COMA); gcAddEffect.setDuration(0); pZone->broadcastPacket(cx, cy, &gcAddEffect); // 阁胶磐 力芭 Tile & tile = m_pZone->getTile(cx , cy); tile.deleteCreature(pDeadMonster->getObjectID()); // 弊扼款靛 郡府膏呕篮 矫眉档 绝瘤氛 if ( pDeadMonster->getMonsterType() == GROUND_ELEMENTAL_TYPE ) { GCDeleteObject* pGCDO = new GCDeleteObject; pGCDO->setObjectID( pDeadMonster->getObjectID() ); EffectPacketSend* pEffectPacketSend = new EffectPacketSend( pDeadMonster->getZone(), pDeadMonster->getX(), pDeadMonster->getY() ); pEffectPacketSend->setPacket( pGCDO ); // 1檬 第俊 菩哦 焊郴具零~ pEffectPacketSend->setDeadline(10); pDeadMonster->getZone()->registerObject( pEffectPacketSend ); pDeadMonster->getZone()->addEffect( pEffectPacketSend ); SAFE_DELETE( pDeadMonster ); return; } // 矫眉 按眉甫 积己窍绊, OID 甫 且寸罐绰促. MonsterCorpse* pMonsterCorpse = new MonsterCorpse(pDeadMonster); pMonsterCorpse->setHostName(pDeadMonster->getHostName()); pMonsterCorpse->setHostPartyID(pDeadMonster->getHostPartyID()); pMonsterCorpse->setQuestHostName( pTable->getQuestHostName() ); pMonsterCorpse->setLevel( (int)(pDeadMonster->getLevel()) ); pMonsterCorpse->setExp( (Exp_t)computeCreatureExp(pDeadMonster, BLOODDRAIN_EXP) ); pMonsterCorpse->setLastKiller( pDeadMonster->getLastKiller() ); // 磷篮 阁胶磐 辆幅俊 蝶扼辑 矫眉俊 酒捞袍阑 眠啊秦敌促. addItem(pDeadMonster, pMonsterCorpse); // by sigi. 2002.12.12 addCorpseToZone( pMonsterCorpse, m_pZone, cx, cy ); // 农府贸啊 磷菌促绊 林函俊 舅妨霖促. GCCreatureDied gcCreatureDied; gcCreatureDied.setObjectID(pDeadMonster->getObjectID()); m_pZone->broadcastPacket(cx , cy , &gcCreatureDied); // 付胶磐牢 版快俊 磷栏搁辑 茄 付叼 窍绰芭.. by sigi. 2002.9.13 if (pDeadMonster->isMaster()) { //MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( pDeadMonster->getMonsterType() ); MasterLairInfo* pMasterLairInfo = g_pMasterLairInfoManager->getMasterLairInfo( pZone->getZoneID() ); if (pMasterLairInfo!=NULL && pMasterLairInfo->getMasterMonsterType()==pDeadMonster->getMonsterType()) { GCSay gcSay; gcSay.setObjectID( pDeadMonster->getObjectID() ); gcSay.setColor( MASTER_SAY_COLOR ); if (pDeadMonster->getLastHitCreatureClass() == Creature::CREATURE_CLASS_SLAYER) { gcSay.setMessage( pMasterLairInfo->getRandomMasterDeadSlayerSay() ); } else { gcSay.setMessage( pMasterLairInfo->getRandomMasterDeadVampireSay() ); } if (!gcSay.getMessage().empty()) pZone->broadcastPacket(cx, cy, &gcSay); } } // 农府媚甫 昏力茄促. SAFE_DELETE(pDeadMonster); __END_DEBUG __END_CATCH}////////////////////////////////////////////////////////////////////////////////// addCreature//// (x, y) 辟贸俊 // monsterType狼 Monster甫 num付府 眠啊茄促.////////////////////////////////////////////////////////////////////////////////voidMonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t monsterType, int num, const SUMMON_INFO& summonInfo, list<Monster*>* pSummonedMonsters){ TPOINT pt; ClanType_t clanType = CLAN_VAMPIRE_MONSTER; // default // group 傈眉啊 鞍篮 clan if (summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_RANDOM_GROUP || summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_GROUP) { clanType = summonInfo.clanID;//rand()%90+2; } // 粮狼 后 谅钎甫 茫酒辰促. for (int i=0; i<num; i++) { pt = findSuitablePosition(m_pZone, x, y, Creature::MOVE_MODE_WALKING); // 困摹甫 茫瘤 给沁芭唱, 救傈瘤措扼搁 眠啊且 荐 绝促. if (pt.x == -1 || (m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE)) { return; } Monster* pMonster = NULL; // 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促. try { pMonster = new Monster(monsterType); //cout << "阁胶磐 眠啊" << endl; // 家券等 阁胶磐啊 酒捞袍阑 啊瘤绰啊? pMonster->setTreasure( summonInfo.hasItem ); //////////////////////////////////////////////////////////////////////////////// // 阁胶磐甫 眠啊窍绰 矫痢俊辑 捞亥飘 阁胶磐牢瘤 八荤甫 茄促. // 7岿 1老 捞亥飘 场栏肺 绵备傍 唱坷瘤 臼澜 /* if(rand()%g_pVariableManager->getEventRatio()==0 && g_pVariableManager->getEventActivate() == 1 ) { pMonster->setEventMonsterFlag(true); string MonsterName = g_pMonsterNameManager->getRandomName(pMonster, true); pMonster->setName(MonsterName); //cout << "捞亥飘 阁胶磐 捞抚: " << MonsterName; } */ /////////////////////////////////////////////////////////////////////////// Assert(pMonster != NULL); if (summonInfo.regenType==REGENTYPE_PORTAL) { // 趣矫 捞固 汲沥蹬乐阑瘤档 葛福绰 巴甸阑 力芭秦霖促. pMonster->removeFlag( Effect::EFFECT_CLASS_HIDE ); pMonster->removeFlag( Effect::EFFECT_CLASS_INVISIBILITY ); pMonster->removeFlag( Effect::EFFECT_CLASS_TRANSFORM_TO_BAT ); pMonster->setFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL); pMonster->setMoveMode( Creature::MOVE_MODE_WALKING ); } if (summonInfo.initHPPercent!=0) { int currentHP = pMonster->getHP(ATTR_CURRENT); int MaxHP = currentHP * 100 / summonInfo.initHPPercent; pMonster->setHP(MaxHP, ATTR_MAX); } } catch (OutOfBoundException& t) { filelog("MonsterManagerBug.log", "addMonsters : %s", t.toString().c_str()); SAFE_DELETE(pMonster); return; } catch (NoSuchElementException& t) { filelog("MonsterManagerBug.log", "addMonsters : %s", t.toString().c_str()); SAFE_DELETE(pMonster); return; } try { m_pZone->addCreature(pMonster , pt.x , pt.y , Directions(rand()%8)); // SUMMON_INFO if (summonInfo.clanType==SUMMON_INFO::CLAN_TYPE_RANDOM_EACH) { pMonster->setClanType( rand()%90+2 ); } else { pMonster->setClanType( clanType ); } //cout << "clanType=" << (int)pMonster->getClanType() << endl; // if (summonInfo.canScanEnemy) { pMonster->setScanEnemy(); m_pZone->monsterScan(pMonster, pt.x, pt.y, pMonster->getDir()); } else if (summonInfo.scanEnemy) { m_pZone->monsterScan(pMonster, pt.x, pt.y, pMonster->getDir()); } if (pSummonedMonsters!=NULL) { pSummonedMonsters->push_back( pMonster ); } } catch (EmptyTileNotExistException&) { //cerr << "MonsterManager::processCreatures() : 磊府啊 绝匙?" << endl; SAFE_DELETE(pMonster); } }}////////////////////////////////////////////////////////////////////////////////// 磷篮 阁胶磐俊霸辑 酒捞袍阑 积己茄促.////////////////////////////////////////////////////////////////////////////////void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorpse) throw (Error){ __BEGIN_TRY // 涅胶飘 酒捞袍 眠啊 if ( pDeadMonster->getQuestItem() != NULL ) { pMonsterCorpse->addTreasure( pDeadMonster->getQuestItem() ); pDeadMonster->setQuestItem( NULL ); } if ( g_pVariableManager->getVariable( PREMIUM_TRIAL_EVENT ) != 0 && pDeadMonster->getMonsterType() == 705 ) { if ( rand()%100 < 30 ) { int Num = 5 + (rand()%5); // 5~9 for ( int i=0; i<Num; ++i ) { Item* pItem = g_pItemFactoryManager->createItem( Item::ITEM_CLASS_LUCKY_BAG, 3, list<OptionType_t>() ); pMonsterCorpse->addTreasure( pItem ); } } } // 酒捞袍捞 救 唱坷绰 阁胶磐 眉农(==付胶磐 家券 阁胶磐) // by sigi. 2002.9.2 if (!pDeadMonster->hasTreasure()) return; MonsterType_t MonsterType = pDeadMonster->getMonsterType(); const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(MonsterType); TreasureList* pTreasureList = NULL; //---------------------------------------------------------------------- // 2002斥 眠籍 捞亥飘 酒捞袍 // 价祈捞 老沥 犬伏肺 唱柯 第俊绰 促弗 酒捞袍篮 唱坷瘤 臼酒具 茄促. //---------------------------------------------------------------------- bool isHarvestFestivalItemAppeared = false; int PartialSumOfCakeRatio = 0; int itemBonusPercent = 0; if (g_pVariableManager->getHarvestFestivalItemRatio() > 0 && rand() % g_pVariableManager->getHarvestFestivalItemRatio() == 0) { // 酒捞袍篮 5啊瘤 吝俊辑 唱棵 荐 乐促. ITEM_TEMPLATE ricecake_template; ricecake_template.NextOptionRatio = 0; bool bOK = false; int EventSelector = rand() % m_SumOfCakeRatio; for (int i=0; i<5; i++) { PartialSumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i]; // 父距 Dice 规侥栏肺 利侩等促搁 if ( EventSelector < PartialSumOfCakeRatio) { if ( i == 0 ) { if (pDeadMonster->getLastHitCreatureClass() == Creature::CREATURE_CLASS_SLAYER) { ricecake_template.ItemClass = Item::ITEM_CLASS_POTION; ricecake_template.ItemType = 11; } else { ricecake_template.ItemClass = Item::ITEM_CLASS_SERUM; ricecake_template.ItemType = 5; } } else { // 喊 ricecake_template.ItemClass = Item::ITEM_CLASS_EVENT_STAR; ricecake_template.ItemType = i + 7; } bOK = true; break; } } //cout << "捞亥飘 酒捞袍 积己" << "[" << i >> "," << EventSelector << "]" << m_SumOfCakeRatio << endl //<< "(" << ricecake_template.ItemClass << " " << ricecake_template.ItemType << ")" << endl; if (bOK) { Item* pItem = g_pItemFactoryManager->createItem(ricecake_template.ItemClass,ricecake_template.ItemType, ricecake_template.OptionType); Assert(pItem != NULL); pMonsterCorpse->addTreasure(pItem); isHarvestFestivalItemAppeared = true; } } //---------------------------------------------------------------------- // 农府胶付胶 气磷 眠啊
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?