From 5930e5d16066ae3f56aee7fc19cd2e9e61bd4843 Mon Sep 17 00:00:00 2001 From: Marvin <52848568+mleem97@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:57:51 +0200 Subject: [PATCH] feat(examples): add hook subscription to example mods - JavaScript example now subscribes to greg.PLAYER.CoinChanged hook - Python example simplified and updated to use hook system - Go example restructured with proper hook callback implementation - Rust example extended with on_hook API usage and cleanup functions - All examples now demonstrate bidirectional communication with the core system --- examples/Go/example_mod/main.go | 41 +++++++++++++++++++-------- examples/Js/example_mod/main.js | 17 +++++++++++ examples/Python/example_mod/main.py | 27 +++++++++++------- examples/Rust/greg_example/src/lib.rs | 28 ++++++++++++++---- 4 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 examples/Js/example_mod/main.js diff --git a/examples/Go/example_mod/main.go b/examples/Go/example_mod/main.go index f9ef2fc6..228624e9 100644 --- a/examples/Go/example_mod/main.go +++ b/examples/Go/example_mod/main.go @@ -1,3 +1,4 @@ +// example_mod/main.go package main /* @@ -23,9 +24,10 @@ typedef struct { } GregModInfo; */ import "C" -import "unsafe" - -var api *C.GregCoreAPI +import ( + "fmt" + "unsafe" +) //export greg_mod_info func greg_mod_info() C.GregModInfo { @@ -39,19 +41,34 @@ func greg_mod_info() C.GregModInfo { } } +//export onHookCallback +func onHookCallback(hookName, trigger, jsonData *C.char) { + hookNameStr := C.GoString(hookName) + triggerStr := C.GoString(trigger) + jsonDataStr := C.GoString(jsonData) + + fmt.Printf("Go Hook received: %s (Trigger: %s) - Data: %s\n", hookNameStr, triggerStr, jsonDataStr) +} + //export greg_mod_init -func greg_mod_init(api_ptr *C.GregCoreAPI) bool { - api = api_ptr - msg := C.CString("Go Mod Initialized!") - defer C.free(unsafe.Pointer(msg)) - C.bridge_log_info(api.log_info, msg) +func greg_mod_init(api *GregCoreAPI) bool { + // Subscribe to a hook + hookName := C.CString("greg.PLAYER.CoinChanged") + defer C.free(unsafe.Pointer(hookName)) + + api.OnHook(hookName, (unsafe.Pointer)(C.onHookCallback)) + return true } -// Helper to call C function pointers -//go:uintptrescapes -func callLog(fn unsafe.Pointer, msg *C.char) { - // This requires cgo bridge helpers usually +//export greg_mod_update +func greg_mod_update(dt float32) { + // Update logic +} + +//export greg_mod_shutdown +func greg_mod_shutdown() { + fmt.Println("Go Example Mod shutdown.") } func main() {} diff --git a/examples/Js/example_mod/main.js b/examples/Js/example_mod/main.js new file mode 100644 index 00000000..d8f0d07f --- /dev/null +++ b/examples/Js/example_mod/main.js @@ -0,0 +1,17 @@ +// Plugins/Js/ExampleMod.js +greg.logInfo("JS Example Mod initializing..."); + +// Subscribe to the player's coin changed hook +greg.on("greg.PLAYER.CoinChanged", (payload) => { + const amount = payload.Data.Amount; + const total = payload.Data.Total; + greg.logInfo(`JS received money update: ${amount} (Total: ${total})`); + + // Fire a custom hook back + greg.fire("greg.CUSTOM.JsResponse", { + msg: "JS heard that!", + received_total: total + }); +}); + +greg.logInfo("JS Example Mod initialized!"); diff --git a/examples/Python/example_mod/main.py b/examples/Python/example_mod/main.py index 471d7509..30f38ec5 100644 --- a/examples/Python/example_mod/main.py +++ b/examples/Python/example_mod/main.py @@ -1,17 +1,24 @@ +# example_mod/main.py def on_init(): greg.log_info("Python Example Mod initialized!") - greg.show_notification("Python Mod Active") + + # Subscribe to coin changed hook + def on_coin_changed(payload): + amount = payload["data"]["Amount"] + total = payload["data"]["Total"] + greg.log_info(f"Python received money update: {amount} (Total: {total})") + + # Fire a custom hook back + greg.fire("greg.CUSTOM.PythonResponse", { + "msg": "Python heard that!", + "received_total": total + }) + + greg.on("greg.PLAYER.CoinChanged", on_coin_changed) def on_update(dt): - # dt is deltaTime + # Update logic pass -def on_event(event_id, data): - if event_id == 100: # MoneyChanged - greg.log_info("Money changed! Current: " + str(greg.get_player_money())) - -def on_scene_loaded(name): - greg.log_info("Entered scene: " + name) - def on_shutdown(): - greg.log_info("Python Mod shutting down.") + greg.log_info("Python Example Mod shutdown.") diff --git a/examples/Rust/greg_example/src/lib.rs b/examples/Rust/greg_example/src/lib.rs index 1f1c14c8..c464e621 100644 --- a/examples/Rust/greg_example/src/lib.rs +++ b/examples/Rust/greg_example/src/lib.rs @@ -20,6 +20,7 @@ pub struct GregCoreAPI { pub log_warning: extern "C" fn(*const c_char), pub log_error: extern "C" fn(*const c_char), pub get_player_money: extern "C" fn() -> f64, + pub on_hook: extern "C" fn(*const c_char, *const c_void), // ... restliche Felder } @@ -37,17 +38,32 @@ pub extern "C" fn greg_mod_info() -> GregModInfo { } } +// Example of a Rust hook subscription +extern "C" fn on_hook_callback(hook_name: *const i8, trigger: *const i8, json_data: *const i8) { + let hook_name = unsafe { CStr::from_ptr(hook_name).to_string_lossy() }; + let trigger = unsafe { CStr::from_ptr(trigger).to_string_lossy() }; + let json_data = unsafe { CStr::from_ptr(json_data).to_string_lossy() }; + + println!("Rust Hook received: {} (Trigger: {}) - Data: {}", hook_name, trigger, json_data); +} + #[no_mangle] pub extern "C" fn greg_mod_init(api: *const GregCoreAPI) -> bool { - unsafe { - API = Some(&*api); - let msg = CString::new("Rust Mod Initialisiert!").unwrap(); - ((*api).log_info)(msg.as_ptr()); - } + let api = unsafe { &*api }; + + // Subscribe to a hook + let hook_name = CString::new("greg.PLAYER.CoinChanged").unwrap(); + (api.on_hook)(hook_name.as_ptr(), on_hook_callback as *const ()); + true } #[no_mangle] pub extern "C" fn greg_mod_update(dt: f32) { - // Logik pro Frame + // Update logic +} + +#[no_mangle] +pub extern "C" fn greg_mod_shutdown() { + println!("Rust Example Mod shutdown."); }