// 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 . #include "move_manager.h" #include "nel/misc/config_file.h" #include "nel/net/service.h" #include "sheets.h" #include "nel/misc/file.h" #include "nel/misc/path.h" #include "game_share/ryzom_entity_id.h" // //#include "nel/3d/u_instance_group.h" #include "sheets.h" // ugly #include "game_share/ig_list.h" #include "game_share/used_continent.h" using namespace std; using namespace NLMISC; using namespace NLPACS; using namespace NLNET; namespace AGS_TEST { // the actor grid CMoveManager::TObstacleGrid CMoveManager::Grid; // the continents CContinentContainer CMoveManager::Continents; // CMoveManager::TObstacleMap CMoveManager::ObstacleMap; // CMoveManager::TPrimZoneMap CMoveManager::PrimZoneMap; // init void CMoveManager::init() { // init continents Continents.init(30, 30, 8.0, 2, IService::getInstance()->WriteFilesDirectory); // load continents CUsedContinent::TUsedContinentCont usedCont = CUsedContinent::instance().getContinents(); for (uint i=0; isetAsStatic(0); } /* CConfigFile::CVar& cvUsedContinents = IService::getInstance()->ConfigFile.getVar("UsedContinents"); uint i; for (i=0; (sint)isetAsStatic(0); } */ /* // load trees ig for (i=sizeof(IGFiles)/sizeof(IGFiles[0]);i--;) { try { NL3D::UInstanceGroup *ig = NL3D::UInstanceGroup::createInstanceGroup(IGFiles[i]); if (ig == NULL) continue; uint k; for(k = 0; k < ig->getNumInstance(); ++k) { const string &name = ig->getShapeName(k); sint sz = name.size(); if (sz >= 6 && strlwr(name.substr(sz-6, 6)) == ".shape") { const CSheets::CSheet *sheet = CSheets::lookup(CSheetId(ig->getInstanceName(k))); CObstacle obstacle; obstacle.Id = CEntityId(RYZOMID::flora, 0xDEADF00D, IService::getInstance()->getServiceId(), IService::getInstance()->getServiceId()); obstacle.Position = ig->getInstancePos(k); obstacle.Radius = (sheet != NULL) ? sheet->Radius : 0.5f; Grid.insert(obstacle, obstacle.Position); } } delete ig; } catch (std::exception &e) { nlinfo(e.what()); } } */ } // update void CMoveManager::update() { uint i; for (i=0; (sint)ievalCollision(1, 0); Continents.getMoveContainer(i)->evalCollision(1, 1); } } // process ai vision void CMoveManager::processAIVision(CMessage &msg) { TObstacleMap::iterator it; for (it=ObstacleMap.begin(); it!=ObstacleMap.end(); ++it) (*((*it).second)).Updated = false; uint64 AgentId; // should be fakeid... msg.serial( AgentId ); while (msg.getPos() < (sint32)(msg.length())) { CEntityId id; TTime time; CVectorD pos; CVector heading; float speed; string sheetId; // get all from message msg.serial(id, time, pos, heading, speed, sheetId); it = ObstacleMap.find(id); if (it == ObstacleMap.end()) { // if not exists yet, creates an obstacle CObstacle obstacle; obstacle.Id = id; obstacle.Position = CVector(pos); obstacle.Radius = 0.5f; obstacle.External = true; // get sheet from this sheetId const CSheets::CSheet *sheet = CSheets::lookup(CSheetId(sheetId)); if (sheet != NULL) obstacle.Radius = sheet->Radius; // nlinfo("New Object %s in IA vision at (%.1f,%.1f,%.1f), radius %.1f", id.toString().c_str(), pos.x, pos.y, pos.z, obstacle.Radius); // insert in grid TObstacleGrid::CIterator ito = Grid.insert(obstacle, obstacle.Position); // insert in map pair res = ObstacleMap.insert(make_pair(id, ito)); /* it = ObstacleMap.find(id); nlassert(it != ObstacleMap.end()); */ it = res.first; } else { (*((*it).second)).Position = pos; Grid.move((*it).second, pos); } (*((*it).second)).Updated = true; } // erase not updated obstacles for (it=ObstacleMap.begin(); it!=ObstacleMap.end(); ) { if (!(*((*it).second)).Updated && (*((*it).second)).External) { nlinfo("Remove old object %s in IA vision", (*it).first.toString().c_str()); TObstacleMap::iterator itr = it++; Grid.remove((*itr).second); ObstacleMap.erase(itr); } else { ++it; } } } // release void CMoveManager::release() { // remove all continents uint i; for (i=0; (sint)i