#include #include "safe_execution.hpp" #pragma warning(push) #pragma warning(disable: 4611) namespace scripting::safe_execution { bool execute_with_seh(const script_function function, const game::scr_entref_t& entref) { __try { function(entref); return true; } __except (EXCEPTION_EXECUTE_HANDLER) { return false; } } bool call(const script_function function, const game::scr_entref_t& entref) { *game::g_script_error_level += 1; if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) { *game::g_script_error_level -= 1; return false; } const auto result = execute_with_seh(function, entref); *game::g_script_error_level -= 1; return result; } bool set_entity_field(const game::scr_entref_t& entref, const int offset) { *game::g_script_error_level += 1; if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) { *game::g_script_error_level -= 1; return false; } game::Scr_SetObjectField(entref.classnum, entref.entnum, offset); *game::g_script_error_level -= 1; return true; } bool get_entity_field(const game::scr_entref_t& entref, const int offset, game::VariableValue* value) { *game::g_script_error_level += 1; if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) { value->type = game::SCRIPT_NONE; value->u.intValue = 0; *game::g_script_error_level -= 1; return false; } *value = game::GetEntityFieldValue(game::SCRIPTINSTANCE_SERVER, entref.classnum, entref.entnum, 0, offset); *game::g_script_error_level -= 1; return true; } }