// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef RYAI_COMMANDS_H #define RYAI_COMMANDS_H #include ////////////////////////////////////////////////////////////////////////////// // CStringFilter // ////////////////////////////////////////////////////////////////////////////// /// Match name according '*' and '?' DOS properties. class CStringFilter { public: CStringFilter(std::string const& filter) : _Filter(filter) { } virtual ~CStringFilter() { } bool operator !=(std::string const& other) const { return !operator ==(other); } bool operator ==(std::string const& other) const { return NLMISC::testWildCard(other, _Filter); } private: std::string _Filter; }; ////////////////////////////////////////////////////////////////////////////// // Entity filters // ////////////////////////////////////////////////////////////////////////////// /* AIS hierarchy: CAIS +- CAIInstance +- COutpostSquadFamily | \- CGroupDesc | \- CBotDesc +- CContinent | +- CRegion | | +- CCellZone | | | \- CCell | | | +- CFaunaZone | | | \- CRoad | | | \- CRoadTrigger | | +- CGroupFamily | | | \- CGroupDesc | | | \- CBotDesc | | \- CFamilyBehavior | | +- CMgrNpc : CManager | | | \- CGroup | | | \- CBot | | \- CMgrFauna : CManager | | \- CGroup | | \- CBot | \- COutpost | +- COutpostSpawnZone | \- COutpostManager : CManager | \- CGroup | \- CBot \- CManager \- CGroup \- CBot */ //- Fetchers ----------------------------------------------------------------- template void buildInstanceList(TContainer& container) { FOREACH(itAIInstance, CCont, CAIS::instance().AIList()) { CAIInstance* aiinstance = *itAIInstance; container.push_back(aiinstance); } } template void buildContinentList(TContainer& container) { std::deque aiinstances; buildInstanceList(aiinstances); FOREACH(itAIInstance, std::deque, aiinstances) { CAIInstance* aiinstance = *itAIInstance; if (aiinstance == NULL) continue; FOREACH(itContinent, CCont, aiinstance->continents()) { CContinent* continent = *itContinent; container.push_back(continent); } } } template void buildRegionList(TContainer& container) { std::deque continents; buildContinentList(continents); FOREACH(itContinent, std::deque, continents) { CContinent* continent = *itContinent; if (continent == NULL) continue; FOREACH(itRegion, CCont, continent->regions()) { CRegion* region = *itRegion; container.push_back(region); } } } template void buildCellZoneList(TContainer& container) { std::deque regions; buildRegionList(regions); FOREACH(itRegion, std::deque, regions) { CRegion* region = *itRegion; if (region == NULL) continue; FOREACH(itCellZone, CCont, region->cellZones()) { CCellZone* cellZone = *itCellZone; container.push_back(cellZone); } } } template void buildFamilyBehaviorList(TContainer& container) { std::deque cellZones; buildCellZoneList(cellZones); FOREACH(itCellZone, std::deque, cellZones) { CCellZone* cellZone = *itCellZone; if (cellZone == NULL) continue; FOREACH(itFamilyBehavior, CCont, cellZone->familyBehaviors()) { CFamilyBehavior* familyBehavior = *itFamilyBehavior; container.push_back(familyBehavior); } } } template void buildOutpostList(TContainer& container) { std::deque continents; buildContinentList(continents); FOREACH(itContinent, std::deque, continents) { CContinent* continent = *itContinent; if (continent == NULL) continue; FOREACH(itOutpost, CCont, continent->outposts()) { COutpost* outpost = *itOutpost; container.push_back(outpost); } } } template void buildManagerList(TContainer& container) { std::deque familyBehaviors; buildFamilyBehaviorList(familyBehaviors); FOREACH(itFamilyBehavior, std::deque, familyBehaviors) { CFamilyBehavior* familyBehavior = *itFamilyBehavior; if (familyBehavior == NULL) continue; container.push_back(static_cast(familyBehavior->mgrNpc())); container.push_back(static_cast(familyBehavior->mgrFauna())); } std::deque aiinstances; buildInstanceList(aiinstances); FOREACH(itAIInstance, std::deque, aiinstances) { CAIInstance* aiinstance = *itAIInstance; if (aiinstance == NULL) continue; FOREACH(itManager, CCont, aiinstance->managers()) { CManager* manager = *itManager; container.push_back(manager); } } std::deque outposts; buildOutpostList(outposts); FOREACH(itOutpost, std::deque, outposts) { COutpost* outpost = *itOutpost; if (outpost == NULL) continue; FOREACH(itManager, CCont, outpost->managers()) { CManager* manager = static_cast(*itManager); container.push_back(manager); } } } template void buildGroupList(TContainer& container) { std::deque managers; buildManagerList(managers); FOREACH(itManager, std::deque, managers) { CManager* manager = *itManager; if (manager == NULL) continue; FOREACH(itGroup, CCont, manager->groups()) { CGroup* group = *itGroup; container.push_back(group); } } } template bool buildFilteredGroupList(TContainer& container, std::string filterString) { typedef typename TContainer::value_type TValue; std::deque _container; buildGroupList(_container); FOREACHC(it, typename std::deque, _container) { typename TContainer::value_type value = *it; if (value == NULL) continue; CStringFilter filter(filterString); if (!isIdentifiedAs(*value, filter)) continue; container.push_back(value); } return true; } template void buildBotList(TContainer& container) { std::deque groups; buildGroupList(groups); FOREACH(itGroup, std::deque, groups) { CGroup* group = *itGroup; if (group == NULL) continue; FOREACH(itBot, CCont, group->bots()) { CBot* bot = *itBot; container.push_back(bot); } } } template bool buildFilteredBotList(TContainer& container, std::string filterString) { typedef typename TContainer::value_type TValue; std::deque _container; buildBotList(_container); FOREACHC(it, typename std::deque, _container) { typename TContainer::value_type value = *it; if (value == NULL) continue; CStringFilter filter(filterString); if (!isIdentifiedAs(*value, filter)) continue; container.push_back(value); } return true; } template void buildPlayerList(TContainer& container) { std::deque aiinstances; buildInstanceList(aiinstances); FOREACH(itAIInstance, std::deque, aiinstances) { CAIInstance* aiinstance = *itAIInstance; if (!aiinstance) continue; CManagerPlayer* manager = aiinstance->getPlayerMgr(); if (!manager) continue; FOREACH(itPlayer, CManagerPlayer::TPlayerMap, manager->playerList()) { CBotPlayer* player = itPlayer->second; container.push_back(player); } } } template void buildFaunaPlaceList(TContainer& container) { std::deque groups; buildGroupList(groups); FOREACH(itGroup, std::deque, groups) { CGrpFauna *grpFauna = dynamic_cast(*itGroup); if (!grpFauna) continue; FOREACH(itPlaces, CAliasCont, grpFauna->places()) { container.push_back(*itPlaces); } } } //- Selector ----------------------------------------------------------------- template bool isIdentifiedAs(TValue const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; return false; } template <> inline bool isIdentifiedAs(CBot const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getEntityIdString()) return true; if (filter==value.getAliasString()) return true; if (filter==value.getName()) return true; if (filter==value.getFullName()) return true; return false; } template <> inline bool isIdentifiedAs(CGroup const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getAliasString()) return true; if (filter==value.getName()) return true; if (filter==value.getFullName()) return true; return false; } template <> inline bool isIdentifiedAs(CManager const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getAliasString()) return true; if (filter==value.getName()) return true; if (filter==value.getFullName()) return true; return false; } template <> inline bool isIdentifiedAs(CBotPlayer const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getEntityIdString()) return true; return false; } template <> inline bool isIdentifiedAs(CAIInstance const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getContinentName()) return true; return false; } template <> inline bool isIdentifiedAs(CContinent const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getName()) return true; return false; } template <> inline bool isIdentifiedAs(CRegion const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getName()) return true; return false; } template <> inline bool isIdentifiedAs(CCellZone const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.getName()) return true; return false; } template <> inline bool isIdentifiedAs(CFamilyBehavior const& value, CStringFilter const& filter) { if (filter==value.getIndexString()) return true; if (filter==value.grpFamily()->getName()) return true; return false; } //- Functors ----------------------------------------------------------------- template void display(TValue& value, NLMISC::CLog& log) { log.displayNL("%s %s", value.getIndexString().c_str(), value.getOneLineInfoString().c_str()); } template void displayEx(TValue& value, NLMISC::CLog& log) { std::vector strings = value.getMultiLineInfoString(); FOREACHC(itString, std::vector, strings) log.displayNL("%s", itString->c_str()); } template void spawn(TValue& value) { value.spawn(); } template void despawn(TValue& value) { value.despawn(); } //- Specialized functors ----------------------------------------------------- template <> inline void despawn(CGroup& value) { value.despawnGrp(); } template <> inline void despawn(CManager& value) { value.despawnMgr(); } // CFaunaGenericPlace specialization inline void spawn(CAIPlace &value) { CFaunaGenericPlace *fgp = dynamic_cast(&value); if (fgp) { if (!fgp->getTimeDriven()) { fgp->setActive(true); } else { nlwarning("Places %s is not time driven, cannot activate it", value.getIndexString().c_str()); } } } inline void despawn(CAIPlace &value) { CFaunaGenericPlace *fgp = dynamic_cast(&value); if (fgp) { if (!fgp->getTimeDriven()) { fgp->setActive(false); } else { nlwarning("Places %s is not time driven, cannot deactivate it", value.getIndexString().c_str()); } } } //- Top-level functions ------------------------------------------------------ template void displayList(NLMISC::CLog& log, TContainer const& container, std::string filterString = std::string("*")) { FOREACHC(it, typename TContainer, container) { typename TContainer::value_type value = *it; if (value == NULL) continue; CStringFilter filter(filterString); if (!isIdentifiedAs(*value, filter)) continue; display(*value, log); } } template void displayListEx(NLMISC::CLog& log, TContainer const& container, std::string filter = std::string("*")) { CLogStringWriter stringWriter(&log); FOREACHC(it, typename TContainer, container) { typename TContainer::value_type value = *it; if (value == NULL) continue; if (!isIdentifiedAs(*value, filter)) continue; displayEx(*value, log); } } template void spawnList(NLMISC::CLog& log, TContainer const& container, std::string filterString = std::string("*")) { FOREACHC(it, typename TContainer, container) { typename TContainer::value_type value = *it; if (value == NULL) continue; CStringFilter filter(filterString); if (!isIdentifiedAs(*value, filter)) continue; spawn(*value); } } template void despawnList(NLMISC::CLog& log, TContainer const& container, std::string filterString = std::string("*")) { FOREACHC(it, typename TContainer, container) { typename TContainer::value_type value = *it; if (value == NULL) continue; CStringFilter filter(filterString); if (!isIdentifiedAs(*value, filter)) continue; despawn(*value); } } //- NeL commands ------------------------------------------------------------- #define RYAI_TEMPLATED_COMMAND(__name,__help,__args,__type,__fetchmethod,__functor) \ NLMISC_COMMAND(__name,__help,__args) \ { \ std::deque<__type*> container; \ __fetchmethod(container); \ if (args.size()>0) \ __functor(log, container, args[0]); \ else \ __functor(log, container); \ return true; \ } #endif