Fix NPC/Monster rendering for OTBM
This commit is contained in:
parent
a2db210012
commit
6feaeff8cc
|
@ -167,7 +167,7 @@ void ResourceManager::loadFile(const std::string& fileName, std::iostream& out)
|
|||
std::ifstream fin(fileName);
|
||||
if(!fin) {
|
||||
out.clear(std::ios::failbit);
|
||||
stdext::throw_exception(stdext::format("unable to file '%s': %s", fileName.c_str(), PHYSFS_getLastError()));
|
||||
stdext::throw_exception(stdext::format("unable to load file '%s': %s", fileName.c_str(), PHYSFS_getLastError()));
|
||||
} else {
|
||||
out << fin.rdbuf();
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "string.h"
|
||||
#include "format.h"
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <ctype.h>
|
||||
|
||||
namespace stdext {
|
||||
|
||||
|
@ -113,6 +114,31 @@ void trim(std::string& str)
|
|||
boost::trim(str);
|
||||
}
|
||||
|
||||
char upchar(char c)
|
||||
{
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3
|
||||
return ::toupper(c); // use the one from global scope "ctype.h"
|
||||
#else
|
||||
if((c >= 97 && c <= 122) || (c <= -1 && c >= -32))
|
||||
c -= 32;
|
||||
|
||||
return c;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ucwords(std::string& str)
|
||||
{
|
||||
uint32 strLen = str.length();
|
||||
if(strLen == 0)
|
||||
return;
|
||||
|
||||
str[0] = upchar(str[0]);
|
||||
for(uint32 i = 1; i < strLen; ++i) {
|
||||
if(str[i - 1] == ' ')
|
||||
str[i] = upchar(str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
bool ends_with(const std::string& str, const std::string& test)
|
||||
{
|
||||
return boost::ends_with(str, test);
|
||||
|
|
|
@ -46,6 +46,8 @@ std::string utf8_to_latin1(uchar *utf8);
|
|||
void tolower(std::string& str);
|
||||
void toupper(std::string& str);
|
||||
void trim(std::string& str);
|
||||
void ucwords(std::string& str);
|
||||
char upchar(char c);
|
||||
bool ends_with(const std::string& str, const std::string& test);
|
||||
bool starts_with(const std::string& str, const std::string& test);
|
||||
void replace_all(std::string& str, const std::string& search, const std::string& replacement);
|
||||
|
|
|
@ -970,14 +970,6 @@ public:
|
|||
return ret;
|
||||
}
|
||||
|
||||
Point readPoint() const
|
||||
{
|
||||
Point ret;
|
||||
ret.x = readType<int>("x");
|
||||
ret.y = readType<int>("y");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** Template form of the attribute query which will try to read the
|
||||
attribute into the specified type. Very easy, very powerful, but
|
||||
be careful to make sure to call this with the correct type.
|
||||
|
|
|
@ -56,16 +56,19 @@ void Creatures::loadSingleCreature(const std::string& file)
|
|||
|
||||
void Creatures::loadNpcs(const std::string& folder)
|
||||
{
|
||||
boost::filesystem::path npcPath(folder);
|
||||
boost::filesystem::path npcPath(boost::filesystem::current_path().generic_string() + folder);
|
||||
if(!boost::filesystem::exists(npcPath))
|
||||
stdext::throw_exception(stdext::format("NPCs folder '%s' was not found.", folder));
|
||||
|
||||
for(boost::filesystem::directory_iterator it(npcPath), end; it != end; ++it) {
|
||||
std::string f = it->path().string();
|
||||
if(boost::filesystem::is_directory(it->status()) || ((f.size() > 4 ? f.substr(f.size() - 4) : "") != ".xml"))
|
||||
std::string f = it->path().filename().string();
|
||||
if(boost::filesystem::is_directory(it->status()))
|
||||
continue;
|
||||
|
||||
loadCreatureBuffer(g_resources.loadFile(f));
|
||||
std::string tmp = folder;
|
||||
if(!stdext::ends_with(tmp, "/"))
|
||||
tmp += "/";
|
||||
loadCreatureBuffer(g_resources.loadFile(tmp + f));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -103,6 +103,7 @@ void OTClient::registerLuaFunctions()
|
|||
g_lua.bindSingletonFunction("g_map", "loadOtcm", &Map::loadOtcm, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "saveOtcm", &Map::saveOtcm, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "loadMonsters", &Map::loadMonsters, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "loadNpcs", &Map::loadNpcs, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "loadSingleCreature", &Map::loadSingleCreature, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "getTown", &Map::getTown, &g_map);
|
||||
g_lua.bindSingletonFunction("g_map", "getHouse", &Map::getHouse, &g_map);
|
||||
|
|
|
@ -209,10 +209,8 @@ void Map::loadOtbm(const std::string& fileName)
|
|||
g_logger.debug("OTBM read successfully.");
|
||||
fin->close();
|
||||
|
||||
/*
|
||||
loadSpawns(getSpawnFile());
|
||||
m_houses.load(getHouseFile());
|
||||
*/
|
||||
// m_houses.load(getHouseFile());
|
||||
}
|
||||
|
||||
void Map::saveOtbm(const std::string &fileName)
|
||||
|
@ -381,9 +379,15 @@ void Map::loadSpawns(const std::string &fileName)
|
|||
cType->setSpawnTime(cNode->readType<int>("spawntime"));
|
||||
CreaturePtr creature(new Creature);
|
||||
creature->setOutfit(cType->getOutfit());
|
||||
creature->setName(cType->getName());
|
||||
|
||||
addThing(creature, centerPos + cNode->readPoint());
|
||||
stdext::ucwords(cName);
|
||||
creature->setName(cName);
|
||||
|
||||
centerPos.x += cNode->readType<int>("x");
|
||||
centerPos.y += cNode->readType<int>("y");
|
||||
centerPos.z = cNode->readType<int>("z");
|
||||
|
||||
addThing(creature, centerPos, 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue