From aece83e914b3c34a116f04f9e89b5ff8dce149a6 Mon Sep 17 00:00:00 2001 From: AURUMVORXX Date: Sat, 2 Nov 2024 02:47:38 +0300 Subject: [PATCH] feat: Added event calling into Python + Added onInit, onTick, onExit, onTime events --- src/main.cpp | 22 ++++++++++++++++ src/sqevents.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ src/sqevents.h | 8 ++++++ src/sqmain.cpp | 20 -------------- 4 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 src/main.cpp create mode 100644 src/sqevents.cpp create mode 100644 src/sqevents.h delete mode 100644 src/sqmain.cpp diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..db89945 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include "sqevents.h" + +namespace py = pybind11; +py::scoped_interpreter guard{}; + +py::module_ g2o = py::module_::import("g2o"); +py::module_ scripts = py::module_::import("scripts"); + +extern "C" SQRESULT SQRAT_API sqmodule_load(HSQUIRRELVM vm, HSQAPI api) +{ + + SqModule::Initialize(vm, api); + Sqrat::DefaultVM::Set(vm); + + registerSquirrelEvents(); + + return SQ_OK; +} \ No newline at end of file diff --git a/src/sqevents.cpp b/src/sqevents.cpp new file mode 100644 index 0000000..0b5cf31 --- /dev/null +++ b/src/sqevents.cpp @@ -0,0 +1,68 @@ +#include +#include +#include + +namespace py = pybind11; +using namespace pybind11::literals; + +extern py::module_ g2o; + +void addEventHandler(const char* eventName, SQFUNCTION closure, unsigned int priority = 9999) +{ + using namespace SqModule; + + Sqrat::Function sq_addEventHandler = Sqrat::RootTable().GetFunction("addEventHandler"); + + if (sq_addEventHandler.IsNull()) + return; + + HSQOBJECT closureHandle; + + sq_newclosure(vm, closure, 0); + sq_getstackobj(vm, -1, &closureHandle); + + Sqrat::Function func(vm, Sqrat::RootTable().GetObject(), closureHandle); + sq_addEventHandler(eventName, func, priority); + + sq_pop(vm, 1); +} + +SQInteger sq_onInit(HSQUIRRELVM vm) +{ + py::object result = g2o.attr("callEvent")("onInit"); + return 0; +} + +SQInteger sq_onExit(HSQUIRRELVM vm) +{ + py::object result = g2o.attr("callEvent")("onExit"); + return 0; +} + +SQInteger sq_onTick(HSQUIRRELVM vm) +{ + py::object result = g2o.attr("callEvent")("onTick"); + return 0; +} + +SQInteger sq_onTime(HSQUIRRELVM vm) +{ + SQInteger day, hour, min; + + sq_getinteger(vm, 4, &day); + sq_getinteger(vm, 3, &hour); + sq_getinteger(vm, 2, &min); + + py::dict kwargs = py::dict("day"_a=day, "hour"_a=hour, "min"_a=min); + g2o.attr("callEvent")("onTime", **kwargs); + + return 0; +} + +void registerSquirrelEvents() +{ + addEventHandler("onInit", sq_onInit, 0); + addEventHandler("onExit", sq_onExit, 0); + addEventHandler("onTick", sq_onTick, 0); + addEventHandler("onTime", sq_onTime, 0); +} \ No newline at end of file diff --git a/src/sqevents.h b/src/sqevents.h new file mode 100644 index 0000000..f43f53d --- /dev/null +++ b/src/sqevents.h @@ -0,0 +1,8 @@ +#pragma once + +SQInteger sq_onInit(HSQUIRRELVM); +SQInteger sq_onExit(HSQUIRRELVM); +SQInteger sq_onTick(HSQUIRRELVM); +SQInteger sq_onTime(HSQUIRRELVM); + +void registerSquirrelEvents(); \ No newline at end of file diff --git a/src/sqmain.cpp b/src/sqmain.cpp deleted file mode 100644 index e831f49..0000000 --- a/src/sqmain.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -/* squirreldoc (func) -* -* This is an entry point for the module. -* -* @version 0.1 -* @side shared -* @name sqmodule_load -* @param (HSQUIRRELVM) vm the squirrel vm. -* @param (HSQAPI) api the api ptr containing all of the squirrel functions. -* @return (int) returns a function status. -* -*/ -extern "C" SQRESULT SQRAT_API sqmodule_load(HSQUIRRELVM vm, HSQAPI api) -{ - SqModule::Initialize(vm, api); - - return SQ_OK; -}