feat(examples): add hook subscription to example mods
Sponsor Tier Sync / sync (push) Failing after 33s
gregCore CI / build (push) Has been cancelled

- 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
This commit is contained in:
Marvin
2026-04-20 14:57:51 +02:00
parent 9819687e9f
commit 5930e5d160
4 changed files with 85 additions and 28 deletions
+29 -12
View File
@@ -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() {}
+17
View File
@@ -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!");
+17 -10
View File
@@ -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.")
+22 -6
View File
@@ -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.");
}