diff --git a/apps/openmw-mp/Networking.cpp b/apps/openmw-mp/Networking.cpp index cb68bfa04..7bfb81d2f 100644 --- a/apps/openmw-mp/Networking.cpp +++ b/apps/openmw-mp/Networking.cpp @@ -585,8 +585,8 @@ void Networking::InitQuery(std::string queryAddr, unsigned short queryPort) void Networking::postInit() { + Script::Call(); Script::Call(); - Script::Call(); } PacketPreInit::PluginContainer &Networking::getSamples() diff --git a/apps/openmw-mp/Script/Functions/Timer.cpp b/apps/openmw-mp/Script/Functions/Timer.cpp index 2ec0e131a..fb8cae5a0 100644 --- a/apps/openmw-mp/Script/Functions/Timer.cpp +++ b/apps/openmw-mp/Script/Functions/Timer.cpp @@ -21,7 +21,7 @@ int ScriptFunctions::CreateTimerEx(ScriptFunc callback, int msec, const char *ty try { vector params; - GetArguments(params, args, types); + Utils::getArguments(params, args, types); return mwmp::TimerAPI::CreateTimer(callback, msec, types, params); } diff --git a/apps/openmw-mp/Script/Script.hpp b/apps/openmw-mp/Script/Script.hpp index 87a547360..47303bc59 100644 --- a/apps/openmw-mp/Script/Script.hpp +++ b/apps/openmw-mp/Script/Script.hpp @@ -105,6 +105,7 @@ public: catch (std::exception &e) { LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what()); + Script::Call(e.what()); if (!mwmp::Networking::getPtr()->getScriptErrorIgnoringState()) throw; diff --git a/apps/openmw-mp/Script/ScriptFunctions.cpp b/apps/openmw-mp/Script/ScriptFunctions.cpp index 776b72353..67fd7cca0 100644 --- a/apps/openmw-mp/Script/ScriptFunctions.cpp +++ b/apps/openmw-mp/Script/ScriptFunctions.cpp @@ -13,62 +13,6 @@ constexpr ScriptCallbackData ScriptFunctions::callbacks[]; using namespace std; -void ScriptFunctions::GetArguments(std::vector ¶ms, va_list args, const std::string &def) -{ - params.reserve(def.length()); - - try - { - for (char c : def) - { - switch (c) - { - case 'i': - params.emplace_back(va_arg(args, unsigned int)); - break; - - case 'q': - params.emplace_back(va_arg(args, signed int)); - break; - - case 'l': - params.emplace_back(va_arg(args, unsigned long long)); - break; - - case 'w': - params.emplace_back(va_arg(args, signed long long)); - break; - - case 'f': - params.emplace_back(va_arg(args, double)); - break; - - case 'p': - params.emplace_back(va_arg(args, void*)); - break; - - case 's': - params.emplace_back(va_arg(args, const char*)); - break; - - case 'b': - params.emplace_back(va_arg(args, int)); - break; - - default: - throw runtime_error("C++ call: Unknown argument identifier " + c); - } - } - } - - catch (...) - { - va_end(args); - throw; - } - va_end(args); -} - void ScriptFunctions::MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept { Public::MakePublic(_public, name, ret_type, def); @@ -81,7 +25,7 @@ boost::any ScriptFunctions::CallPublic(const char *name, va_list args) noexcept try { string def = Public::GetDefinition(name); - GetArguments(params, args, def); + Utils::getArguments(params, args, def); return Public::Call(name, params); } diff --git a/apps/openmw-mp/Script/ScriptFunctions.hpp b/apps/openmw-mp/Script/ScriptFunctions.hpp index 6cd590a8f..6380b5f9a 100644 --- a/apps/openmw-mp/Script/ScriptFunctions.hpp +++ b/apps/openmw-mp/Script/ScriptFunctions.hpp @@ -47,7 +47,6 @@ class ScriptFunctions { public: - static void GetArguments(std::vector ¶ms, va_list args, const std::string &def); static void MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept; static boost::any CallPublic(const char *name, va_list args) noexcept; @@ -157,6 +156,7 @@ public: {"OnServerInit", Callback<>()}, {"OnServerPostInit", Callback<>()}, {"OnServerExit", Callback()}, + {"OnServerScriptCrash", Callback()}, {"OnPlayerConnect", Callback()}, {"OnPlayerDisconnect", Callback()}, {"OnPlayerDeath", Callback()}, @@ -209,7 +209,7 @@ public: {"OnWorldMap", Callback()}, {"OnWorldWeather", Callback() }, {"OnMpNumIncrement", Callback()}, - {"OnRequestPluginList", Callback<>()} + {"OnRequestDataFileList", Callback<>()} }; }; diff --git a/apps/openmw-mp/Utils.cpp b/apps/openmw-mp/Utils.cpp index d5d621e49..3019a2d20 100644 --- a/apps/openmw-mp/Utils.cpp +++ b/apps/openmw-mp/Utils.cpp @@ -1,9 +1,7 @@ -// -// Created by koncord on 04.03.17. -// - #include "Utils.hpp" +#include + using namespace std; const vector Utils::split(const string &str, int delimiter) @@ -52,3 +50,59 @@ ESM::Cell Utils::getCellFromDescription(std::string cellDescription) return cell; } + +void Utils::getArguments(std::vector ¶ms, va_list args, const std::string &def) +{ + params.reserve(def.length()); + + try + { + for (char c : def) + { + switch (c) + { + case 'i': + params.emplace_back(va_arg(args, unsigned int)); + break; + + case 'q': + params.emplace_back(va_arg(args, signed int)); + break; + + case 'l': + params.emplace_back(va_arg(args, unsigned long long)); + break; + + case 'w': + params.emplace_back(va_arg(args, signed long long)); + break; + + case 'f': + params.emplace_back(va_arg(args, double)); + break; + + case 'p': + params.emplace_back(va_arg(args, void*)); + break; + + case 's': + params.emplace_back(va_arg(args, const char*)); + break; + + case 'b': + params.emplace_back(va_arg(args, int)); + break; + + default: + throw runtime_error("C++ call: Unknown argument identifier " + c); + } + } + } + + catch (...) + { + va_end(args); + throw; + } + va_end(args); +} diff --git a/apps/openmw-mp/Utils.hpp b/apps/openmw-mp/Utils.hpp index b511a5b10..1454239bd 100644 --- a/apps/openmw-mp/Utils.hpp +++ b/apps/openmw-mp/Utils.hpp @@ -1,7 +1,3 @@ -// -// Created by koncord on 04.03.17. -// - #ifndef OPENMW_UTILS_HPP #define OPENMW_UTILS_HPP @@ -9,6 +5,8 @@ #include #include +#include + #include #include @@ -27,6 +25,8 @@ namespace Utils ESM::Cell getCellFromDescription(std::string cellDescription); + void getArguments(std::vector ¶ms, va_list args, const std::string &def); + template constexpr unsigned int hash(const char(&str)[N], size_t I = N) { diff --git a/apps/openmw-mp/main.cpp b/apps/openmw-mp/main.cpp index 485398cec..e7dab08e7 100644 --- a/apps/openmw-mp/main.cpp +++ b/apps/openmw-mp/main.cpp @@ -307,6 +307,7 @@ int main(int argc, char *argv[]) catch (std::exception &e) { LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what()); + Script::Call(e.what()); throw; //fall through }