Autor: Karpio\\ Licencja: Róbta co chceta, tylko podajcie autora\\ //Testowane na silniku The Forgotten Server 0.4_DEV.r4086//\\ \\ Wielu ma ten problem. Co zrobić, gdy jesteśmy z dala od kompa, a The Forgotten Server zerwie połączenie z bazą danych? Teraz jest na to rozwiązanie! W tym celu musimy trochę zedytować silnik. Otwieramy plik globalevent.cpp i szukamy: GlobalEventMap GlobalEvents::getEventMap(GlobalEvent_t type) następnie w tej funkcji szukamy: case GLOBALEVENT_GLOBALSAVE: i pod tym doklejamy: case GLOBALEVENT_LOSTCONNECTION: Następnie szukamy: else if(tmpStrValue == "record" || tmpStrValue == "playersrecord") m_eventType = GLOBALEVENT_RECORD; i pod tym dodajemy: else if(tmpStrValue == "lostconnection") m_eventType = GLOBALEVENT_LOSTCONNECTION; Potem szukamy: case GLOBALEVENT_TIMER: return "onTime"; i pod tym dodajemy: case GLOBALEVENT_LOSTCONNECTION: return "onLostConnection"; Zapisujemy plik i otwieramy globalevent.h\\ Szukamy: GLOBALEVENT_RECORD i po tym dopisujemy przecinek oraz GLOBALEVENT_LOSTCONNECTION Zapisujemy. Udajemy się do databasemysql.cpp\\ Szukamy: #include "configmanager.h" i pod tym doklejamy: #include "globalevent.h" extern GlobalEvents* g_globalEvents; Szukamy: bool DatabaseMySQL::connect(bool _reconnect) { if(_reconnect) { std::clog << "WARNING: MYSQL Lost connection, attempting to reconnect..." << std::endl; if(++m_attempts > MAX_RECONNECT_ATTEMPTS) { i pod tym doklejamy: GlobalEventMap recordEvents = g_globalEvents->getEventMap(GLOBALEVENT_LOSTCONNECTION); for(GlobalEventMap::iterator it = recordEvents.begin(); it != recordEvents.end(); ++it) it->second->executeEvent(); Tak aby cała ta funkcja wyglądała mniej więcej tak: bool DatabaseMySQL::connect(bool _reconnect) { if(_reconnect) { std::clog << "WARNING: MYSQL Lost connection, attempting to reconnect..." << std::endl; if(++m_attempts > MAX_RECONNECT_ATTEMPTS) { GlobalEventMap recordEvents = g_globalEvents->getEventMap(GLOBALEVENT_LOSTCONNECTION); for(GlobalEventMap::iterator it = recordEvents.begin(); it != recordEvents.end(); ++it) it->second->executeEvent(); std::clog << "Failed connection to database - maximum reconnect attempts passed." << std::endl; return false; } } if(mysql_real_connect(&m_handle, g_config.getString(ConfigManager::SQL_HOST).c_str(), g_config.getString( ConfigManager::SQL_USER).c_str(), g_config.getString(ConfigManager::SQL_PASS).c_str(), g_config.getString( ConfigManager::SQL_DB).c_str(), g_config.getNumber(ConfigManager::SQL_PORT), NULL, 0)) { m_attempts = 0; return true; } std::clog << "Failed connecting to database - MYSQL ERROR: " << mysql_error(&m_handle) << " (" << mysql_errno(&m_handle) << ")" << std::endl; return false; } Kompilujemy.\\ \\ Silnik mamy gotowy.\\ Teraz czas na LUA.\\ Wchodzimy w data/globalevents/globalevents.xml i doklejamy: Następnie wchodzimy w data/globalevents/scripts i tworzymy plik database.lua i wklejamy do niego: -- System by Karpio local log = true function onLostConnection() if(log) then local file = io.open(getDataDir().."logs/server/connections.log", "a+") file:write("["..os.date("%c").."] Server (ID: "..getConfigValue("worldId")..") lost connection with database\n") file:close() end os.exit() return true end To wszystko. Od teraz Wasz OTS automatycznie się wyłączy przy zerwaniu połączenia z bazą (dopiero po wykorzystaniu limitu prób ponownego nawiązania połączenia).