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);
 | 
					        std::ifstream fin(fileName);
 | 
				
			||||||
        if(!fin) {
 | 
					        if(!fin) {
 | 
				
			||||||
            out.clear(std::ios::failbit);
 | 
					            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 {
 | 
					        } else {
 | 
				
			||||||
            out << fin.rdbuf();
 | 
					            out << fin.rdbuf();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@
 | 
				
			||||||
#include "string.h"
 | 
					#include "string.h"
 | 
				
			||||||
#include "format.h"
 | 
					#include "format.h"
 | 
				
			||||||
#include <boost/algorithm/string.hpp>
 | 
					#include <boost/algorithm/string.hpp>
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace stdext {
 | 
					namespace stdext {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,6 +114,31 @@ void trim(std::string& str)
 | 
				
			||||||
    boost::trim(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)
 | 
					bool ends_with(const std::string& str, const std::string& test)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return boost::ends_with(str, test);
 | 
					    return boost::ends_with(str, test);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,8 @@ std::string utf8_to_latin1(uchar *utf8);
 | 
				
			||||||
void tolower(std::string& str);
 | 
					void tolower(std::string& str);
 | 
				
			||||||
void toupper(std::string& str);
 | 
					void toupper(std::string& str);
 | 
				
			||||||
void trim(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 ends_with(const std::string& str, const std::string& test);
 | 
				
			||||||
bool starts_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);
 | 
					void replace_all(std::string& str, const std::string& search, const std::string& replacement);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -970,14 +970,6 @@ public:
 | 
				
			||||||
        return ret;
 | 
					        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
 | 
					    /** Template form of the attribute query which will try to read the
 | 
				
			||||||
        attribute into the specified type. Very easy, very powerful, but
 | 
					        attribute into the specified type. Very easy, very powerful, but
 | 
				
			||||||
        be careful to make sure to call this with the correct type.
 | 
					        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)
 | 
					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))
 | 
					    if(!boost::filesystem::exists(npcPath))
 | 
				
			||||||
        stdext::throw_exception(stdext::format("NPCs folder '%s' was not found.", folder));
 | 
					        stdext::throw_exception(stdext::format("NPCs folder '%s' was not found.", folder));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(boost::filesystem::directory_iterator it(npcPath), end; it != end; ++it) {
 | 
					    for(boost::filesystem::directory_iterator it(npcPath), end; it != end; ++it) {
 | 
				
			||||||
        std::string f = it->path().string();
 | 
					        std::string f = it->path().filename().string();
 | 
				
			||||||
        if(boost::filesystem::is_directory(it->status()) || ((f.size() > 4 ? f.substr(f.size() - 4) : "") != ".xml"))
 | 
					        if(boost::filesystem::is_directory(it->status()))
 | 
				
			||||||
            continue;
 | 
					            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", "loadOtcm", &Map::loadOtcm, &g_map);
 | 
				
			||||||
    g_lua.bindSingletonFunction("g_map", "saveOtcm", &Map::saveOtcm, &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", "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", "loadSingleCreature", &Map::loadSingleCreature, &g_map);
 | 
				
			||||||
    g_lua.bindSingletonFunction("g_map", "getTown", &Map::getTown, &g_map);
 | 
					    g_lua.bindSingletonFunction("g_map", "getTown", &Map::getTown, &g_map);
 | 
				
			||||||
    g_lua.bindSingletonFunction("g_map", "getHouse", &Map::getHouse, &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.");
 | 
					    g_logger.debug("OTBM read successfully.");
 | 
				
			||||||
    fin->close();
 | 
					    fin->close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
    loadSpawns(getSpawnFile());
 | 
					    loadSpawns(getSpawnFile());
 | 
				
			||||||
    m_houses.load(getHouseFile());
 | 
					//  m_houses.load(getHouseFile());
 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Map::saveOtbm(const std::string &fileName)
 | 
					void Map::saveOtbm(const std::string &fileName)
 | 
				
			||||||
| 
						 | 
					@ -381,9 +379,15 @@ void Map::loadSpawns(const std::string &fileName)
 | 
				
			||||||
            cType->setSpawnTime(cNode->readType<int>("spawntime"));
 | 
					            cType->setSpawnTime(cNode->readType<int>("spawntime"));
 | 
				
			||||||
            CreaturePtr creature(new Creature);
 | 
					            CreaturePtr creature(new Creature);
 | 
				
			||||||
            creature->setOutfit(cType->getOutfit());
 | 
					            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