• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

1 Error compiling Otclient

armyman

Member
Joined
Feb 15, 2014
Messages
318
Reaction score
13
Code:
1>------ Build started: Project: otclient, Configuration: Release Win32 ------
1>  animatedtext.cpp
1>  animator.cpp
1>  client.cpp
1>  container.cpp
1>  creature.cpp
1>  creatures.cpp
1>  effect.cpp
1>  game.cpp
1>  houses.cpp
1>  item.cpp
1>  itemtype.cpp
1>  lightview.cpp
1>  localplayer.cpp
1>  luafunctions.cpp
1>  luavaluecasts.cpp
1>  map.cpp
1>  mapio.cpp
1>  mapview.cpp
1>  minimap.cpp
1>  missile.cpp
1>  outfit.cpp
1>  player.cpp
1>  protocolcodes.cpp
1>  protocolgame.cpp
1>  protocolgameparse.cpp
1>  protocolgamesend.cpp
1>  shadermanager.cpp
1>  spritemanager.cpp
1>  statictext.cpp
1>  thing.cpp
1>  thingtype.cpp
1>  thingtypemanager.cpp
1>  tile.cpp
1>  towns.cpp
1>  uicreature.cpp
1>  uiitem.cpp
1>  uimap.cpp
1>  uimapanchorlayout.cpp
1>  uiminimap.cpp
1>  uiprogressrect.cpp
1>  uisprite.cpp
1>  adaptativeframecounter.cpp
1>  application.cpp
1>  asyncdispatcher.cpp
1>  binarytree.cpp
1>  clock.cpp
1>  config.cpp
1>  configmanager.cpp
1>..\src\framework\core\config.cpp(67): error C2660: 'OTMLDocument::save': function does not take 1 arguments
1>  eventdispatcher.cpp
1>  filestream.cpp
1>  graphicalapplication.cpp
1>  logger.cpp
1>  module.cpp
1>  modulemanager.cpp
1>  resourcemanager.cpp
1>  scheduledevent.cpp
1>  timer.cpp
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

\src\framework\core\config.cpp
C++:
/*
 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "config.h"
#include "resourcemanager.h"
#include "configmanager.h"

#include <framework/otml/otml.h>

Config::Config()
{
    m_confsDoc = OTMLDocument::create();
    m_fileName = "";
}

bool Config::load(const std::string& file)
{
    m_fileName = file;

    if(!g_resources.fileExists(file))
        return false;

    try {
        OTMLDocumentPtr confsDoc = OTMLDocument::parse(file);
        if(confsDoc)
            m_confsDoc = confsDoc;
        return true;
    } catch(stdext::exception& e) {
        g_logger.error(stdext::format("Unable to parse configuration file '%s': ", e.what()));
        return false;
    }
}

bool Config::unload()
{
    if(isLoaded()) {
        m_confsDoc = nullptr;
        m_fileName = "";
        return true;
    }
    return false;
}

bool Config::save()
{
    if(m_fileName.length() == 0)
        return false;
    return m_confsDoc->save(m_fileName);
}

void Config::clear()
{
    m_confsDoc->clear();
}

void Config::setValue(const std::string& key, const std::string& value)
{
    if(key == "") {
        remove(key);
        return;
    }

    OTMLNodePtr child = OTMLNode::create(key, value);
    m_confsDoc->addChild(child);
}

void Config::setList(const std::string& key, const std::vector<std::string>& list)
{
    remove(key);

    if(list.size() == 0)
        return;

    OTMLNodePtr child = OTMLNode::create(key, true);
    for(const std::string& value : list)
        child->writeIn(value);
    m_confsDoc->addChild(child);
}

bool Config::exists(const std::string& key)
{
    return m_confsDoc->hasChildAt(key);
}

std::string Config::getValue(const std::string& key)
{
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child)
        return child->value();
    else
        return "";
}

std::vector<std::string> Config::getList(const std::string& key)
{
    std::vector<std::string> list;
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child) {
        for(const OTMLNodePtr& subchild : child->children())
            list.push_back(subchild->value());
    }
    return list;
}

void Config::remove(const std::string& key)
{
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child)
        m_confsDoc->removeChild(child);
}

void Config::setNode(const std::string& key, const OTMLNodePtr& node)
{
    remove(key);
    mergeNode(key, node);
}

void Config::mergeNode(const std::string& key, const OTMLNodePtr& node)
{
    OTMLNodePtr clone = node->clone();
    node->setTag(key);
    node->setUnique(true);
    m_confsDoc->addChild(node);
}

OTMLNodePtr Config::getNode(const std::string& key)
{
    return m_confsDoc->get(key);
}

bool Config::isLoaded()
{
    return !m_fileName.empty() && m_confsDoc;
}

std::string Config::getFileName()
{
    return m_fileName;
}
 
Show us your configmanager.cpp, there is probably a call of the function save with an argument, which doesn't exist.
 
C++:
/*
 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "configmanager.h"

ConfigManager g_configs;

void ConfigManager::init()
{
    m_settings = ConfigPtr(new Config());
}

void ConfigManager::terminate()
{
    if(m_settings) {
        // ensure settings are saved
        m_settings->save();

        m_settings->unload();
        m_settings = nullptr;
    }

    for(ConfigPtr config : m_configs) {
        config->unload();
        config = nullptr;
    }

    m_configs.clear();
}

ConfigPtr ConfigManager::getSettings()
{
    return m_settings;
}

ConfigPtr ConfigManager::get(const std::string& file)
{
    for(const ConfigPtr config : m_configs) {
        if(config->getFileName() == file) {
            return config;
        }
    }
    return nullptr;
}

ConfigPtr ConfigManager::loadSettings(const std::string file)
{
    if(file.empty()) {
        g_logger.error("Must provide a configuration file to load.");
    }
    else {
        if(m_settings->load(file)) {
            return m_settings;
        }
    }
    return nullptr;
}

ConfigPtr ConfigManager::create(const std::string& file)
{
    ConfigPtr config = load(file);
    if(!config) {
        config = ConfigPtr(new Config());

        config->load(file);
        config->save();

        m_configs.push_back(config);
    }
    return config;
}

ConfigPtr ConfigManager::load(const std::string& file)
{
    if(file.empty()) {
        g_logger.error("Must provide a configuration file to load.");
        return nullptr;
    }
    else {
        ConfigPtr config = get(file);
        if(!config) {
            config = ConfigPtr(new Config());

            if(config->load(file)) {
                m_configs.push_back(config);
            }
            else {
                // cannot load config
                config = nullptr;
            }
        }
        return config;
    }
}

bool ConfigManager::unload(const std::string& file)
{
    ConfigPtr config = get(file);
    if(config) {
        config->unload();
        remove(config);
        config = nullptr;
        return true;
    }
    return false;
}

void ConfigManager::remove(const ConfigPtr config)
{
    m_configs.remove(config);
}
 
Code:
/*
 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "otmldocument.h"
#include "otmlparser.h"
#include "otmlemitter.h"

#include <framework/core/resourcemanager.h>

OTMLDocumentPtr OTMLDocument::create()
{
    OTMLDocumentPtr doc(new OTMLDocument);
    doc->setTag("doc");
    return doc;
}

OTMLDocumentPtr OTMLDocument::parse(const std::string& fileName)
{
    std::stringstream fin;
    std::string source = g_resources.resolvePath(fileName);
    g_resources.readFileStream(source, fin, true);
    return parse(fin, source);
}

OTMLDocumentPtr OTMLDocument::parse(std::istream& in, const std::string& source)
{
    OTMLDocumentPtr doc(new OTMLDocument);
    doc->setSource(source);
    OTMLParser parser(doc, in);
    parser.parse();
    return doc;
}

std::string OTMLDocument::emit()
{
    return OTMLEmitter::emitNode(asOTMLNode()) + "\n";
}

bool OTMLDocument::save(const std::string& fileName, bool encrypt)
{
    m_source = fileName;
    return g_resources.writeFileContents(fileName, emit(), encrypt);
}
 
In file config.cpp you use this call:

Code:
m_confsDoc->save(m_fileName);

However, there is no such thing. Your save() function demands a second argument, as seen here in the prototype:
Code:
bool OTMLDocument::save(const std::string& fileName, bool encrypt)

If you want to save an encrypted file, use save(m_fileName, true). If not, save(m_fileName, false).
 
i'll use (m_fileName, true)
but where can i put this? example?
bool OTMLDocument::save(const std::string& fileName, bool encrypt)
 
return m_confsDoc->save(m_fileName, true);
on line 68 of config.cpp
 
This? i got the same error
Code:
/*
 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "config.h"
#include "resourcemanager.h"
#include "configmanager.h"

#include <framework/otml/otml.h>

Config::Config()
{
    m_confsDoc->save(m_confsDoc->save(m_fileName);
    m_fileName = "";
}

bool Config::load(const std::string& file)
{
    m_fileName = file;

    if(!g_resources.fileExists(file))
        return false;

    try {
        OTMLDocumentPtr confsDoc = OTMLDocument::parse(file);
        if(confsDoc)
            m_confsDoc = confsDoc;
        return true;
    } catch(stdext::exception& e) {
        g_logger.error(stdext::format("Unable to parse configuration file '%s': ", e.what()));
        return false;
    }
}

bool Config::unload()
{
    if(isLoaded()) {
        m_confsDoc = nullptr;
        m_fileName = "";
        return true;
    }
    return false;
}

bool Config::save()
{
    if(m_fileName.length() == 0)
        return false;
        return m_confsDoc->save(m_fileName, true);
}

void Config::clear()
{
    m_confsDoc->clear();
}

void Config::setValue(const std::string& key, const std::string& value)
{
    if(key == "") {
        remove(key);
        return;
    }

    OTMLNodePtr child = OTMLNode::create(key, value);
    m_confsDoc->addChild(child);
}

void Config::setList(const std::string& key, const std::vector<std::string>& list)
{
    remove(key);

    if(list.size() == 0)
        return;

    OTMLNodePtr child = OTMLNode::create(key, true);
    for(const std::string& value : list)
        child->writeIn(value);
    m_confsDoc->addChild(child);
}

bool Config::exists(const std::string& key)
{
    return m_confsDoc->hasChildAt(key);
}

std::string Config::getValue(const std::string& key)
{
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child)
        return child->value();
    else
        return "";
}

std::vector<std::string> Config::getList(const std::string& key)
{
    std::vector<std::string> list;
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child) {
        for(const OTMLNodePtr& subchild : child->children())
            list.push_back(subchild->value());
    }
    return list;
}

void Config::remove(const std::string& key)
{
    OTMLNodePtr child = m_confsDoc->get(key);
    if(child)
        m_confsDoc->removeChild(child);
}

void Config::setNode(const std::string& key, const OTMLNodePtr& node)
{
    remove(key);
    mergeNode(key, node);
}

void Config::mergeNode(const std::string& key, const OTMLNodePtr& node)
{
    OTMLNodePtr clone = node->clone();
    node->setTag(key);
    node->setUnique(true);
    m_confsDoc->addChild(node);
}

OTMLNodePtr Config::getNode(const std::string& key)
{
    return m_confsDoc->get(key);
}

bool Config::isLoaded()
{
    return !m_fileName.empty() && m_confsDoc;
}

std::string Config::getFileName()
{
    return m_fileName;
}
 
Back
Top