monstermanager.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 2,206 行 · 第 1/5 页
CPP
2,206 行
////////////////////////////////////////////////////////////////////////////////// Filename : MonsterManager.h // Written By : Reiot// Revised by : 辫己刮// Description : ////////////////////////////////////////////////////////////////////////////////#include "MonsterManager.h"#include <stdlib.h> // atoi()#include "Assert.h"#include "LogClient.h"#include "MonsterInfo.h"#include "ItemInfoManager.h"#include "Creature.h"#include "GamePlayer.h"#include "MonsterCorpse.h"#include "Tile.h"#include "Zone.h"#include "Player.h"#include "Monster.h"#include "OptionInfo.h"#include "Skull.h"#include "DB.h"#include "Treasure.h"#include "Thread.h"#include "ItemFactoryManager.h"#include "ZoneUtil.h"#include "CreatureUtil.h"#include "VariableManager.h"#include "MonsterNameManager.h"#include "MasterLairInfoManager.h"#include "LuckInfo.h"#include "ItemUtil.h"#include "EventItemUtil.h"#include "WarSystem.h"#include "Properties.h"#include "CastleInfoManager.h"#include "SweeperBonusManager.h"#include "skill/SummonGroundElemental.h"#include "EffectPacketSend.h"#include "ItemGradeManager.h"#include <fstream.h>#include "Gpackets/GCCreatureDied.h"#include "Gpackets/GCAddEffect.h"#include "Gpackets/GCAddEffectToTile.h"#include "Gpackets/GCDeleteObject.h"#include "Gpackets/GCSay.h"#include "Profile.h"#define __MONSTER_FIGHTING__extern bool isPotentialEnemy(Monster* pMonster, Creature* pCreature);//#define __PROFILE_MONSTER__#ifdef __PROFILE_MONSTER__ #define __BEGIN_PROFILE_MONSTER(name) beginProfileEx(name); #define __END_PROFILE_MONSTER(name) endProfileEx(name);#else #define __BEGIN_PROFILE_MONSTER(name) ((void)0); #define __END_PROFILE_MONSTER(name) ((void)0);#endif////////////////////////////////////////////////////////////////////////////////// 蜡丰拳粮 酒捞袍 风泼犬伏 焊呈胶 欺季飘//////////////////////////////////////////////////////////////////////////////////const uint g_pVariableManager->getPremiumItemProbePercent() = 220;bool isLottoWinning();//////////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////////MonsterManager::MonsterManager (Zone* pZone) throw (Error){ __BEGIN_TRY Assert(pZone != NULL); m_pZone = pZone; Assert(g_pCastleInfoManager!=NULL); m_CastleZoneID = 0; g_pCastleInfoManager->getCastleZoneID( m_pZone->getZoneID(), m_CastleZoneID ); m_nEventMonster = 0; m_pEventMonsterInfo = NULL; getCurrentTime(m_RegenTime); __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////////MonsterManager::~MonsterManager () throw (){ __BEGIN_TRY SAFE_DELETE(m_pEventMonsterInfo); __END_CATCH}////////////////////////////////////////////////////////////////////////////////// load from database////////////////////////////////////////////////////////////////////////////////void MonsterManager::load () throw (Error){ __BEGIN_TRY Statement* pStmt = NULL; Result* pResult = NULL; string text, eventText; m_RICE_CAKE_PROB_RATIO[0] = 100; m_RICE_CAKE_PROB_RATIO[1] = 33; m_RICE_CAKE_PROB_RATIO[2] = 33; m_RICE_CAKE_PROB_RATIO[3] = 33; m_RICE_CAKE_PROB_RATIO[4] = 1; m_SumOfCakeRatio = 0; for (int i=0; i<5; i++) m_SumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i]; // 捞固 乐促搁 扁粮狼 MonsterCounter甸阑 葛滴 瘤款促. bool bReload = false; hash_map< SpriteType_t, MonsterCounter* >::iterator iMC = m_Monsters.begin(); while (iMC!=m_Monsters.end()) { MonsterCounter* pMC = iMC->second; SAFE_DELETE(pMC); iMC ++; // m_Monsters啊 捞固 乐菌促搁 reload茄 巴捞促..扼绊 夯促. by sigi. 2002.9.19 bReload = true; } BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery( "SELECT MonsterList, EventMonsterList from ZoneInfo WHERE ZoneID=%d", m_pZone->getZoneID()); if (pResult->getRowCount() <= 0) { SAFE_DELETE(pStmt);// throw Error("MonsterManager::load() : 粮捞 粮犁窍瘤 臼嚼聪促."); return; } pResult->next(); text = pResult->getString(1); eventText = pResult->getString(2); SAFE_DELETE(pStmt); } END_DB(pStmt) parseMonsterList( text, bReload ); parseEventMonsterList( eventText, bReload ); __END_CATCH}void MonsterManager::parseMonsterList(const string& text, bool bReload) throw (Error){ if (text.size() <= 0) return; //-------------------------------------------------------------------------------- // // text 颇扼固磐绰 ZoneInfo 抛捞喉狼 Monsters (TEXT) 拿烦蔼阑 唱鸥辰促. // 器杆篮 促澜苞 鞍促. // // (MonsterType1,#Monster1) (MonsterType2,#Monter2)(..,..) // i j k i j k // //-------------------------------------------------------------------------------- uint i = 0 , j = 0 , k = 0; do { // parse string i = text.find_first_of('(',k); j = text.find_first_of(',',i+1); k = text.find_first_of(')',j+1); if (i==string::npos || j==string::npos || k==string::npos || i > j || j > k) break; // 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. uint monsterType = atoi(text.substr(i+1,j-i-1).c_str()); uint maxMonsters = atoi(text.substr(j+1,k-j-1).c_str()); Assert(maxMonsters > 0); // 阁胶磐 牢器肺 何磐 Monster Sprite Type阑 罐酒柯促. const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(monsterType); SpriteType_t spriteType = pMonsterInfo->getSpriteType(); // 捞固 粮犁窍绰瘤狼 咯何甫 眉农茄促. hash_map< SpriteType_t , MonsterCounter* >::iterator itr = m_Monsters.find(spriteType); if (itr != m_Monsters.end()) { WORD CurrentMaxCount = itr->second->getMaxMonsters(); WORD NewMaxCount = CurrentMaxCount + maxMonsters; itr->second->setMaxMonsters(NewMaxCount); } else { // 阁胶磐墨款磐 按眉甫 积己, hash_map 俊 殿废茄促. MonsterCounter* pMonsterCounter = new MonsterCounter(monsterType , maxMonsters, 0); // 粮犁窍瘤 臼绰 版快, 眠啊茄促. m_Monsters[spriteType] = pMonsterCounter; } //-------------------------------------------------------------------------------- // 秦寸窍绰 鸥涝狼 阁胶磐甫 粮俊 眠啊茄促. //-------------------------------------------------------------------------------- if (!bReload) // reload啊 酒聪搁.. { for (uint m = 0 ; m < maxMonsters ; m ++) { // 粮狼 后 谅钎甫 茫酒辰促. ZoneCoord_t x, y; if (!findPosition(monsterType, x, y)) { Assert(false); return; } // 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促. Monster* pMonster = new Monster(monsterType); //////////////////////////////////////////////////////////////////////////////// // 岿靛呐 捞亥飘 包访(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 << "捞亥飘 阁胶磐 捞抚: " << pMonster->getName(); } */ /////////////////////////////////////////////////////////////////////////// Assert(pMonster != NULL); try { m_pZone->addCreature(pMonster , x , y , Directions(rand() & 0x07)); } catch (EmptyTileNotExistException&) { //cerr << "MonsterManager::load() : 磊府啊 绝匙?" << endl; SAFE_DELETE(pMonster); } } } } while (k < text.size() - 1);}void MonsterManager::parseEventMonsterList(const string& text, bool bReload) throw (Error){ if (text.size() <= 0) return; //-------------------------------------------------------------------------------- // // text 颇扼固磐绰 ZoneInfo 抛捞喉狼 Monsters (TEXT) 拿烦蔼阑 唱鸥辰促. // 器杆篮 促澜苞 鞍促. // // (MonsterType1,#Monster1,RegenDelay) (MonsterType2,#Monter2,RegenDelay)(..,..) // i j k l i j k l // //-------------------------------------------------------------------------------- uint i = 0 , j = 0 , k = 0, l = 0; do { // parse string i = text.find_first_of('(',l); j = text.find_first_of(',',i+1); k = text.find_first_of(',',j+1); l = text.find_first_of(')',k+1); if (i==string::npos || j==string::npos || k==string::npos || l==string::npos || i > j || j > k || k > l) break; // 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. 阁胶磐 鸥涝苞 弥措 俺荐甫 备茄促. uint monsterType = atoi(text.substr(i+1,j-i-1).c_str()); uint maxMonsters = atoi(text.substr(j+1,k-j-1).c_str()); uint regenDelay = atoi(text.substr(k+1,l-k-1).c_str()); Assert(maxMonsters > 0); //-------------------------------------------------------------------------------- // 秦寸窍绰 鸥涝狼 阁胶磐甫 粮俊 眠啊茄促. //-------------------------------------------------------------------------------- if (!bReload) // reload啊 酒聪搁.. { //cout << "[MM] load EventMonsterList: [" << m_pZone->getZoneID() << "] mtype=" << monsterType // << ", maxMonsters=" << maxMonsters // << ", regenDelay=" << regenDelay << endl; if (m_pEventMonsterInfo==NULL) { m_pEventMonsterInfo = new vector<EventMonsterInfo>; //m_pEventMonsterInfo->resize( maxMonsters ); } /* if (m_pEventMonsterInfo->size() + maxMonsters < m_pEventMonsterInfo->capacity()) { m_pEventMonsterInfo->resize( m_pEventMonsterInfo->size() + maxMonsters ); } */ for (uint m = 0 ; m < maxMonsters ; m ++) { if (g_pVariableManager->isActiveChiefMonster()) { // 粮狼 后 谅钎甫 茫酒辰促. ZoneCoord_t x, y; if (!findPosition(monsterType, x, y)) { Assert(false); return; } // 阁胶磐 按眉甫 积己窍绊 瓷仿摹 殿阑 檬扁拳茄促. Monster* pMonster = new Monster(monsterType); Assert(pMonster != NULL); pMonster->setEventMonsterIndex( m_nEventMonster++ ); EventMonsterInfo info; info.monsterType = monsterType; info.regenDelay = regenDelay; info.bExist = true; m_pEventMonsterInfo->push_back( info ); try { m_pZone->addCreature(pMonster , x , y , Directions(rand() & 0x07)); } catch (EmptyTileNotExistException&) { //cerr << "MonsterManager::load() : 磊府啊 绝匙?" << endl; SAFE_DELETE(pMonster); } } else { m_nEventMonster++; EventMonsterInfo info; info.monsterType = monsterType; info.regenDelay = regenDelay; getCurrentTime( info.regenTime ); info.bExist = false; m_pEventMonsterInfo->push_back( info ); } } } } while (l < text.size() - 1);}////////////////////////////////////////////////////////////////////////////////void MonsterManager::addCreature (Creature* pCreature) throw (DuplicatedException , Error){ __BEGIN_TRY Monster* pMonster = dynamic_cast<Monster*>(pCreature); // 农府贸 秦浆甘俊 眠啊茄促. CreatureManager::addCreature(pMonster); // event monster绰 MonsterCounter俊 甸绢啊瘤 臼霸 茄促. by sigi. 2002.10.14 if (m_pEventMonsterInfo!=NULL && pMonster->isEventMonster()) { uint index = pMonster->getEventMonsterIndex(); if (index < m_pEventMonsterInfo->size()) { EventMonsterInfo& info = (*m_pEventMonsterInfo)[index]; getCurrentTime( info.regenTime ); info.regenTime.tv_sec += info.regenDelay; info.bExist = true; } //cout << "[MM] add EventMonster: [" << pMonster->getEventMonsterIndex() // << "] = " << info.monsterType << ", delay = " << info.regenDelay << endl; return; } // 弊繁 阁胶磐 鸥涝捞 粮俊 粮犁且 荐 乐绰瘤 眉农茄促. hash_map< SpriteType_t , MonsterCounter* >::iterator itr = m_Monsters.find(pMonster->getSpriteType()); if (itr == m_Monsters.end()) { StringStream msg; msg << "泅犁 粮俊 粮犁且 荐 绝绰 鸥涝狼 阁胶磐啊 眠啊登菌嚼聪促.\n" << "泅犁 粮篮 [" << m_pZone->getZoneID() << "]涝聪促.\n" << "眠啊窍妨绊 茄 阁胶磐狼 鸥涝篮 [" << pMonster->getMonsterType() << "]涝聪促.\n"; //throw Error(msg.toString()); } else { // 阁胶磐 墨款磐甫 刘啊矫挪促. itr->second->addMonster(); } __END_CATCH}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?