mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-04-29 17:19:20 +02:00
214 lines
8.7 KiB
C++
214 lines
8.7 KiB
C++
/**
|
|
* Tibia GIMUD Server - a free and open-source MMORPG server emulator
|
|
* Copyright (C) 2019 Sabrehaven and Mark Samman <mark.samman@gmail.com>
|
|
*
|
|
* 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.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include "otpch.h"
|
|
|
|
#include "configmanager.h"
|
|
#include "game.h"
|
|
|
|
#if LUA_VERSION_NUM >= 502
|
|
#undef lua_strlen
|
|
#define lua_strlen lua_rawlen
|
|
#endif
|
|
|
|
extern Game g_game;
|
|
|
|
bool ConfigManager::load()
|
|
{
|
|
lua_State* L = luaL_newstate();
|
|
if (!L) {
|
|
throw std::runtime_error("Failed to allocate memory");
|
|
}
|
|
|
|
luaL_openlibs(L);
|
|
|
|
if (luaL_dofile(L, "config.lua")) {
|
|
std::cout << "[Error - ConfigManager::load] " << lua_tostring(L, -1) << std::endl;
|
|
lua_close(L);
|
|
return false;
|
|
}
|
|
|
|
//parse config
|
|
if (!loaded) { //info that must be loaded one time (unless we reset the modules involved)
|
|
boolean[BIND_ONLY_GLOBAL_ADDRESS] = getGlobalBoolean(L, "bindOnlyGlobalAddress", false);
|
|
boolean[OPTIMIZE_DATABASE] = getGlobalBoolean(L, "startupDatabaseOptimization", true);
|
|
|
|
string[IP] = getGlobalString(L, "ip", "127.0.0.1");
|
|
string[MAP_NAME] = getGlobalString(L, "mapName", "forgotten");
|
|
string[MAP_AUTHOR] = getGlobalString(L, "mapAuthor", "Unknown");
|
|
string[HOUSE_RENT_PERIOD] = getGlobalString(L, "houseRentPeriod", "never");
|
|
string[MYSQL_HOST] = getGlobalString(L, "mysqlHost", "127.0.0.1");
|
|
string[MYSQL_USER] = getGlobalString(L, "mysqlUser", "forgottenserver");
|
|
string[MYSQL_PASS] = getGlobalString(L, "mysqlPass", "");
|
|
string[MYSQL_DB] = getGlobalString(L, "mysqlDatabase", "forgottenserver");
|
|
string[MYSQL_SOCK] = getGlobalString(L, "mysqlSock", "");
|
|
|
|
integer[SQL_PORT] = getGlobalNumber(L, "mysqlPort", 3306);
|
|
integer[GAME_PORT] = getGlobalNumber(L, "gameProtocolPort", 7172);
|
|
integer[LOGIN_PORT] = getGlobalNumber(L, "loginProtocolPort", 7171);
|
|
integer[STATUS_PORT] = getGlobalNumber(L, "statusProtocolPort", 7171);
|
|
}
|
|
|
|
boolean[SHOW_MONSTER_LOOT] = getGlobalBoolean(L, "showMonsterLoot", true);
|
|
boolean[ALLOW_CHANGEOUTFIT] = getGlobalBoolean(L, "allowChangeOutfit", true);
|
|
boolean[ONE_PLAYER_ON_ACCOUNT] = getGlobalBoolean(L, "onePlayerOnlinePerAccount", true);
|
|
boolean[AIMBOT_HOTKEY_ENABLED] = getGlobalBoolean(L, "hotkeyAimbotEnabled", true);
|
|
boolean[REMOVE_RUNE_CHARGES] = getGlobalBoolean(L, "removeChargesFromRunes", true);
|
|
boolean[EXPERIENCE_FROM_PLAYERS] = getGlobalBoolean(L, "experienceByKillingPlayers", false);
|
|
boolean[FREE_PREMIUM] = getGlobalBoolean(L, "freePremium", false);
|
|
boolean[REPLACE_KICK_ON_LOGIN] = getGlobalBoolean(L, "replaceKickOnLogin", true);
|
|
boolean[ALLOW_CLONES] = getGlobalBoolean(L, "allowClones", false);
|
|
boolean[STAMINA_SYSTEM] = getGlobalBoolean(L, "staminaSystem", true);
|
|
boolean[WARN_UNSAFE_SCRIPTS] = getGlobalBoolean(L, "warnUnsafeScripts", true);
|
|
boolean[CONVERT_UNSAFE_SCRIPTS] = getGlobalBoolean(L, "convertUnsafeScripts", true);
|
|
boolean[TELEPORT_NEWBIES] = getGlobalBoolean(L, "teleportNewbies", true);
|
|
boolean[STACK_CUMULATIVES] = getGlobalBoolean(L, "autoStackCumulatives", false);
|
|
boolean[BLOCK_HEIGHT] = getGlobalBoolean(L, "blockHeight", false);
|
|
boolean[DROP_ITEMS] = getGlobalBoolean(L, "dropItems", false);
|
|
boolean[DISTANCE_WEAPONS_DROP_ON_GROUND] = getGlobalBoolean(L, "distanceWeaponsDropOnGround", true);
|
|
|
|
string[DEFAULT_PRIORITY] = getGlobalString(L, "defaultPriority", "high");
|
|
string[SERVER_NAME] = getGlobalString(L, "serverName", "");
|
|
string[OWNER_NAME] = getGlobalString(L, "ownerName", "");
|
|
string[OWNER_EMAIL] = getGlobalString(L, "ownerEmail", "");
|
|
string[URL] = getGlobalString(L, "url", "");
|
|
string[LOCATION] = getGlobalString(L, "location", "");
|
|
string[MOTD] = getGlobalString(L, "motd", "");
|
|
string[WORLD_TYPE] = getGlobalString(L, "worldType", "pvp");
|
|
|
|
integer[MAX_PLAYERS] = getGlobalNumber(L, "maxPlayers");
|
|
integer[PZ_LOCKED] = getGlobalNumber(L, "pzLocked", 60000);
|
|
integer[DEFAULT_DESPAWNRANGE] = getGlobalNumber(L, "deSpawnRange", 2);
|
|
integer[DEFAULT_DESPAWNRADIUS] = getGlobalNumber(L, "deSpawnRadius", 50);
|
|
integer[RATE_EXPERIENCE] = getGlobalNumber(L, "rateExp", 5);
|
|
integer[RATE_SKILL] = getGlobalNumber(L, "rateSkill", 3);
|
|
integer[RATE_LOOT] = getGlobalNumber(L, "rateLoot", 2);
|
|
integer[RATE_MAGIC] = getGlobalNumber(L, "rateMagic", 3);
|
|
integer[RATE_SPAWN] = getGlobalNumber(L, "rateSpawn", 1);
|
|
integer[BAN_LENGTH] = getGlobalNumber(L, "banLength", 30 * 24 * 60 * 60);
|
|
integer[ACTIONS_DELAY_INTERVAL] = getGlobalNumber(L, "timeBetweenActions", 200);
|
|
integer[EX_ACTIONS_DELAY_INTERVAL] = getGlobalNumber(L, "timeBetweenExActions", 1000);
|
|
integer[MAX_MESSAGEBUFFER] = getGlobalNumber(L, "maxMessageBuffer", 4);
|
|
integer[KICK_AFTER_MINUTES] = getGlobalNumber(L, "kickIdlePlayerAfterMinutes", 15);
|
|
integer[PROTECTION_LEVEL] = getGlobalNumber(L, "protectionLevel", 1);
|
|
integer[DEATH_LOSE_PERCENT] = getGlobalNumber(L, "deathLosePercent", -1);
|
|
integer[KNIGHT_CLOSE_ATTACK_DAMAGE_INCREASE_PERCENT] = getGlobalNumber(L, "knightCloseAttackDamageIncreasePercent", -1);
|
|
integer[PALADIN_RANGE_ATTACK_DAMAGE_INCREASE_PERCENT] = getGlobalNumber(L, "paladinRangeAttackDamageIncreasePercent", -1);
|
|
integer[STATUSQUERY_TIMEOUT] = getGlobalNumber(L, "statusTimeout", 5000);
|
|
integer[WHITE_SKULL_TIME] = getGlobalNumber(L, "whiteSkullTime", 15 * 60);
|
|
integer[RED_SKULL_TIME] = getGlobalNumber(L, "redSkullTime", 30 * 24 * 60 * 60);
|
|
integer[KILLS_DAY_RED_SKULL] = getGlobalNumber(L, "killsDayRedSkull", 3);
|
|
integer[KILLS_WEEK_RED_SKULL] = getGlobalNumber(L, "killsWeekRedSkull", 5);
|
|
integer[KILLS_MONTH_RED_SKULL] = getGlobalNumber(L, "killsMonthRedSkull", 10);
|
|
integer[KILLS_DAY_BANISHMENT] = getGlobalNumber(L, "killsDayBanishment", 5);
|
|
integer[KILLS_WEEK_BANISHMENT] = getGlobalNumber(L, "killsWeekBanishment", 8);
|
|
integer[KILLS_MONTH_BANISHMENT] = getGlobalNumber(L, "killsMonthBanishment", 10);
|
|
integer[STAIRHOP_DELAY] = getGlobalNumber(L, "stairJumpExhaustion", 2000);
|
|
integer[EXP_FROM_PLAYERS_LEVEL_RANGE] = getGlobalNumber(L, "expFromPlayersLevelRange", 75);
|
|
integer[MAX_PACKETS_PER_SECOND] = getGlobalNumber(L, "maxPacketsPerSecond", 25);
|
|
integer[NEWBIE_TOWN] = getGlobalNumber(L, "newbieTownId", 1);
|
|
integer[NEWBIE_LEVEL_THRESHOLD] = getGlobalNumber(L, "newbieLevelThreshold", 5);
|
|
integer[MONEY_RATE] = getGlobalNumber(L, "moneyRate", 1);
|
|
integer[CLIENT_VERSION] = getGlobalNumber(L, "clientVersion");
|
|
|
|
loaded = true;
|
|
lua_close(L);
|
|
return true;
|
|
}
|
|
|
|
bool ConfigManager::reload()
|
|
{
|
|
bool result = load();
|
|
if (transformToSHA1(getString(ConfigManager::MOTD)) != g_game.getMotdHash()) {
|
|
g_game.incrementMotdNum();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
const std::string& ConfigManager::getString(string_config_t what) const
|
|
{
|
|
if (what >= LAST_STRING_CONFIG) {
|
|
std::cout << "[Warning - ConfigManager::getString] Accessing invalid index: " << what << std::endl;
|
|
return string[DUMMY_STR];
|
|
}
|
|
return string[what];
|
|
}
|
|
|
|
int32_t ConfigManager::getNumber(integer_config_t what) const
|
|
{
|
|
if (what >= LAST_INTEGER_CONFIG) {
|
|
std::cout << "[Warning - ConfigManager::getNumber] Accessing invalid index: " << what << std::endl;
|
|
return 0;
|
|
}
|
|
return integer[what];
|
|
}
|
|
|
|
bool ConfigManager::getBoolean(boolean_config_t what) const
|
|
{
|
|
if (what >= LAST_BOOLEAN_CONFIG) {
|
|
std::cout << "[Warning - ConfigManager::getBoolean] Accessing invalid index: " << what << std::endl;
|
|
return false;
|
|
}
|
|
return boolean[what];
|
|
}
|
|
|
|
std::string ConfigManager::getGlobalString(lua_State* L, const char* identifier, const char* defaultValue)
|
|
{
|
|
lua_getglobal(L, identifier);
|
|
if (!lua_isstring(L, -1)) {
|
|
return defaultValue;
|
|
}
|
|
|
|
size_t len = lua_strlen(L, -1);
|
|
std::string ret(lua_tostring(L, -1), len);
|
|
lua_pop(L, 1);
|
|
return ret;
|
|
}
|
|
|
|
int32_t ConfigManager::getGlobalNumber(lua_State* L, const char* identifier, const int32_t defaultValue)
|
|
{
|
|
lua_getglobal(L, identifier);
|
|
if (!lua_isnumber(L, -1)) {
|
|
return defaultValue;
|
|
}
|
|
|
|
int32_t val = lua_tonumber(L, -1);
|
|
lua_pop(L, 1);
|
|
return val;
|
|
}
|
|
|
|
bool ConfigManager::getGlobalBoolean(lua_State* L, const char* identifier, const bool defaultValue)
|
|
{
|
|
lua_getglobal(L, identifier);
|
|
if (!lua_isboolean(L, -1)) {
|
|
if (!lua_isstring(L, -1)) {
|
|
return defaultValue;
|
|
}
|
|
|
|
size_t len = lua_strlen(L, -1);
|
|
std::string ret(lua_tostring(L, -1), len);
|
|
lua_pop(L, 1);
|
|
return booleanString(ret);
|
|
}
|
|
|
|
int val = lua_toboolean(L, -1);
|
|
lua_pop(L, 1);
|
|
return val != 0;
|
|
}
|