📄 vmapmanager.cpp.svn-base
字号:
/*
* Copyright (C) 2005,2006,2007 MaNGOS <http://www.mangosproject.org/>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "VMapManager.h"
#include "VMapDefinitions.h"
namespace VMAP
{
//=========================================================
VMapManager::VMapManager()
{
iCommandLogger.setFileName("vmapcmd.log");
iCommandLogger.setResetFile();
}
//=========================================================
VMapManager::~VMapManager(void)
{
Array<unsigned int > keyArray = iInstanceMapTrees.getKeys();
for(int i=0;i<keyArray.size(); ++i)
{
delete iInstanceMapTrees.get(keyArray[i]);
iInstanceMapTrees.remove(keyArray[i]);
}
}
//=========================================================
Vector3 VMapManager::convertPositionToInternalRep(float x, float y, float z) const
{
float pos[3];
pos[0] = y;
pos[1] = z;
pos[2] = x;
double full = 64.0*533.33333333;
double mid = full/2.0;
pos[0] = full- (pos[0] + mid);
pos[2] = full- (pos[2] + mid);
return(Vector3(pos));
}
//=========================================================
Vector3 VMapManager::convertPositionToMangosRep(float x, float y, float z) const
{
float pos[3];
pos[0] = z;
pos[1] = x;
pos[2] = y;
double full = 64.0*533.33333333;
double mid = full/2.0;
pos[0] = -((mid+pos[0])-full);
pos[1] = -((mid+pos[1])-full);
return(Vector3(pos));
}
//=========================================================
std::string VMapManager::getDirFileName(unsigned int pMapId, int x, int y) const
{
char name[FILENAMEBUFFER_SIZE];
sprintf(name, "%03u_%d_%d%s",pMapId, x, y, DIR_FILENAME_EXTENSION);
return(std::string(name));
}
//=========================================================
std::string VMapManager::getDirFileName(unsigned int pMapId) const
{
char name[FILENAMEBUFFER_SIZE];
sprintf(name, "%03d%s",pMapId, DIR_FILENAME_EXTENSION);
return(std::string(name));
}
//=========================================================
// remote last return or LF
void chomp(std::string& str)
{
while(str.length() >0)
{
char lc = str[str.length()-1];
if(lc == '\r' || lc == '\n')
{
str = str.substr(0,str.length()-1);
}
else
{
break;
}
}
}
//=========================================================
void chompAndTrim(std::string& str)
{
while(str.length() >0)
{
char lc = str[str.length()-1];
if(lc == '\r' || lc == '\n' || lc == ' ' || lc == '"' || lc == '\'')
{
str = str.substr(0,str.length()-1);
}
else
{
break;
}
}
while(str.length() >0)
{
char lc = str[0];
if(lc == ' ' || lc == '"' || lc == '\'')
{
str = str.substr(1,str.length()-1);
}
else
{
break;
}
}
}
//=========================================================
// result false, if no more id are found
bool getNextMapId(const std::string& pString, unsigned int& pStartPos, unsigned int& pId)
{
bool result = false;
unsigned int i;
for(i=pStartPos;i<pString.size(); ++i)
{
if(pString[i] == ',')
{
break;
}
}
if(i>pStartPos)
{
std::string idString = pString.substr(pStartPos, i-pStartPos);
pStartPos = i+1;
chompAndTrim(idString);
pId = atoi(idString.c_str());
result = true;
}
return(result);
}
//=========================================================
/**
Block maps from being used.
parameter: String of map ids. Delimiter = ","
e.g.: "0,1,590"
*/
void VMapManager::preventMapsFromBeingUsed(const char* pMapIdString)
{
if(pMapIdString != NULL)
{
unsigned int pos =0;
unsigned int id;
std::string confString(pMapIdString);
chompAndTrim(confString);
while(getNextMapId(confString, pos, id))
{
iIgnoreMapIds.set(id, true);
}
}
}
//=========================================================
int VMapManager::loadMap(const char* pBasePath, unsigned int pMapId, int x, int y)
{
int result = VMAP_LOAD_RESULT_IGNORED;
if(isMapLoadingEnabled() && !iIgnoreMapIds.containsKey(pMapId))
{
bool loaded = _loadMap(pBasePath, pMapId, x, y, false);
if(!loaded)
{
// if we can't load the map it might be splitted into tiles. Try that one and store the result
loaded = _loadMap(pBasePath, pMapId, x, y, true);
if(loaded)
{
iMapsSplitIntoTiles.set(pMapId, true);
}
}
if(loaded)
{
result = VMAP_LOAD_RESULT_OK;
// just for debugging
Command c = Command();
c.fillLoadTileCmd(x, y, pMapId);
iCommandLogger.appendCmd(c);
}
else
{
result = VMAP_LOAD_RESULT_ERROR;
}
}
return result;
}
//=========================================================
// load one tile (internal use only)
bool VMapManager::_loadMap(const char* pBasePath, unsigned int pMapId, int x, int y, bool pForceTileLoad)
{
bool result = false;
std::string dirFileName;
if(pForceTileLoad || iMapsSplitIntoTiles.containsKey(pMapId))
{
dirFileName = getDirFileName(pMapId,x,y);
}
else
{
dirFileName = getDirFileName(pMapId);
}
MapTree* instanceTree;
if(!iInstanceMapTrees.containsKey(pMapId))
{
instanceTree = new MapTree(pBasePath);
iInstanceMapTrees.set(pMapId, instanceTree);
}
else
instanceTree = iInstanceMapTrees.get(pMapId);
unsigned int mapTileIdent = MAP_TILE_IDENT(x,y);
result = instanceTree->loadMap(dirFileName, mapTileIdent);
if(!result) // remove on fail
{
if(instanceTree->size() == 0)
{
iInstanceMapTrees.remove(pMapId);
delete instanceTree;
}
}
return(result);
}
//=========================================================
bool VMapManager::_existsMap(const std::string& pBasePath, unsigned int pMapId, int x, int y, bool pForceTileLoad)
{
bool result = false;
std::string dirFileName;
if(pForceTileLoad || iMapsSplitIntoTiles.containsKey(pMapId))
{
dirFileName = getDirFileName(pMapId,x,y);
}
else
{
dirFileName = getDirFileName(pMapId);
}
size_t len = pBasePath.length() + dirFileName.length();
char *filenameBuffer = new char[len+1];
sprintf(filenameBuffer, "%s%s", pBasePath.c_str(), dirFileName.c_str());
FILE* df = fopen(filenameBuffer, "rb");
if(df)
{
fclose(df);
result = true;
}
delete[] filenameBuffer;
return result;
}
//=========================================================
bool VMapManager::existsMap(const char* pBasePath, unsigned int pMapId, int x, int y)
{
std::string basePath = std::string(pBasePath);
if(basePath.length() > 0 && (basePath[basePath.length()-1] != '/' || basePath[basePath.length()-1] != '\\'))
{
basePath.append("/");
}
bool found = _existsMap(basePath, pMapId, x, y, false);
if(!found)
{
// if we can't load the map it might be splitted into tiles. Try that one and store the result
found = _existsMap(basePath, pMapId, x, y, true);
if(found)
{
iMapsSplitIntoTiles.set(pMapId, true);
}
}
return found;
}
//=========================================================
void VMapManager::unloadMap(unsigned int pMapId, int x, int y)
{
_unloadMap(pMapId, x, y);
Command c = Command();
c.fillUnloadTileCmd(pMapId, x,y);
iCommandLogger.appendCmd(c);
}
//=========================================================
void VMapManager::_unloadMap(unsigned int pMapId, int x, int y)
{
if(iInstanceMapTrees.containsKey(pMapId))
{
MapTree* instanceTree = iInstanceMapTrees.get(pMapId);
std::string dirFileName;
if(iMapsSplitIntoTiles.containsKey(pMapId))
{
dirFileName = getDirFileName(pMapId,x,y);
}
else
{
dirFileName = getDirFileName(pMapId);
}
unsigned int mapTileIdent = MAP_TILE_IDENT(x,y);
instanceTree->unloadMap(dirFileName, mapTileIdent);
if(instanceTree->size() == 0)
{
iInstanceMapTrees.remove(pMapId);
delete instanceTree;
}
}
}
//=========================================================
void VMapManager::unloadMap(unsigned int pMapId)
{
if(iInstanceMapTrees.containsKey(pMapId))
{
MapTree* instanceTree = iInstanceMapTrees.get(pMapId);
std::string dirFileName = getDirFileName(pMapId);
instanceTree->unloadMap(dirFileName, 0, true);
if(instanceTree->size() == 0)
{
iInstanceMapTrees.remove(pMapId);
delete instanceTree;
}
Command c = Command();
c.fillUnloadTileCmd(pMapId);
iCommandLogger.appendCmd(c);
}
}
//==========================================================
bool VMapManager::isInLineOfSight(unsigned int pMapId, float x1, float y1, float z1, float x2, float y2, float z2)
{
bool result = true;
if(isLineOfSightCalcEnabled() && iInstanceMapTrees.containsKey(pMapId))
{
Vector3 pos1 = convertPositionToInternalRep(x1,y1,z1);
Vector3 pos2 = convertPositionToInternalRep(x2,y2,z2);
if(pos1 != pos2)
{
MapTree* mapTree = iInstanceMapTrees.get(pMapId);
result = mapTree->isInLineOfSight(pos1, pos2);
Command c = Command();
// save the orig vectors
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -