Allow to run console input in freeze modes as well

This commit is contained in:
Lwmte 2025-03-22 10:28:12 +01:00
parent f0f733519f
commit e27ec86e85
4 changed files with 32 additions and 13 deletions

View file

@ -62,6 +62,7 @@ public:
virtual void OnUseItem(GAME_OBJECT_ID objectNumber) = 0; virtual void OnUseItem(GAME_OBJECT_ID objectNumber) = 0;
virtual void OnFreeze() = 0; virtual void OnFreeze() = 0;
virtual void AddConsoleInput(const std::string& input) = 0;
virtual void ShortenTENCalls() = 0; virtual void ShortenTENCalls() = 0;
virtual void FreeLevelScripts() = 0; virtual void FreeLevelScripts() = 0;
virtual void ResetScripts(bool clearGameVars) = 0; virtual void ResetScripts(bool clearGameVars) = 0;

View file

@ -620,6 +620,28 @@ int Handle(TypeFrom& var, MapType& varsMap, size_t& numVars, std::vector<SavedVa
return first->second; return first->second;
} }
void LogicHandler::AddConsoleInput(const std::string& input)
{
_consoleInput = input;
}
void LogicHandler::PerformConsoleInput()
{
if (!_consoleInput.empty())
{
try
{
ExecuteString(_consoleInput);
}
catch (const std::exception& ex)
{
TENLog("Error executing " + _consoleInput + ": " + ex.what(), LogLevel::Error);
}
_consoleInput.clear();
}
}
std::string LogicHandler::GetRequestedPath() const std::string LogicHandler::GetRequestedPath() const
{ {
auto path = std::string(); auto path = std::string();
@ -1027,6 +1049,8 @@ void LogicHandler::OnLoop(float deltaTime, bool postLoop)
for (const auto& name : _callbacksPreLoop) for (const auto& name : _callbacksPreLoop)
CallLevelFuncByName(name, deltaTime); CallLevelFuncByName(name, deltaTime);
PerformConsoleInput();
lua_gc(_handler.GetState()->lua_state(), LUA_GCCOLLECT, 0); lua_gc(_handler.GetState()->lua_state(), LUA_GCCOLLECT, 0);
if (_onLoop.valid()) if (_onLoop.valid())
CallLevelFunc(_onLoop, deltaTime); CallLevelFunc(_onLoop, deltaTime);
@ -1099,6 +1123,8 @@ void LogicHandler::OnFreeze()
for (const auto& name : _callbacksPreFreeze) for (const auto& name : _callbacksPreFreeze)
CallLevelFuncByName(name); CallLevelFuncByName(name);
PerformConsoleInput();
if (_onFreeze.valid()) if (_onFreeze.valid())
CallLevelFunc(_onFreeze); CallLevelFunc(_onFreeze);

View file

@ -75,11 +75,13 @@ private:
sol::protected_function _onFreeze = {}; sol::protected_function _onFreeze = {};
std::unordered_map<CallbackPoint, std::unordered_set<std::string>*> _callbacks; std::unordered_map<CallbackPoint, std::unordered_set<std::string>*> _callbacks;
std::vector<std::variant<std::string, unsigned int>> _savedVarPath; std::vector<std::variant<std::string, unsigned int>> _savedVarPath;
bool _shortenedCalls = false; bool _shortenedCalls = false;
std::string _consoleInput = "";
void PerformConsoleInput();
std::string GetRequestedPath() const; std::string GetRequestedPath() const;
void ResetLevelTables(); void ResetLevelTables();
@ -132,6 +134,7 @@ public:
void HandleEvent(const std::string& name, EventType type, sol::optional<Moveable&> activator); void HandleEvent(const std::string& name, EventType type, sol::optional<Moveable&> activator);
void EnableEvent(const std::string& name, EventType type); void EnableEvent(const std::string& name, EventType type);
void DisableEvent(const std::string& name, EventType type); void DisableEvent(const std::string& name, EventType type);
void AddConsoleInput(const std::string& input);
void ResetScripts(bool clearGameVars) override; void ResetScripts(bool clearGameVars) override;
void ShortenTENCalls() override; void ShortenTENCalls() override;

View file

@ -24,10 +24,6 @@ using namespace TEN::Renderer;
using namespace TEN::Input; using namespace TEN::Input;
using namespace TEN::Utils; using namespace TEN::Utils;
using std::exception;
using std::string;
using std::cout;
using std::endl;
WINAPP App; WINAPP App;
unsigned int ThreadID, ConsoleThreadID; unsigned int ThreadID, ConsoleThreadID;
@ -261,14 +257,7 @@ unsigned CALLBACK ConsoleInput(void*)
} }
else else
{ {
try g_GameScript->AddConsoleInput(input);
{
g_GameScript->ExecuteString(input);
}
catch (const exception& ex)
{
TENLog("Error executing " + input + ": " + ex.what(), LogLevel::Error);
}
} }
} }