#include "macros.hpp" #include "plugins.hpp" #include #include PKEPluginInterface pkePlugin{}; void *loadedPlugin = nullptr; void Pke_UpdatePlugin(const PKEPluginInterface &plugin) { pkePlugin.OnInit = plugin.OnInit; pkePlugin.OnTick = plugin.OnTick; pkePlugin.OnTeardown = plugin.OnTeardown; pkePlugin.OnImGuiRender = plugin.OnImGuiRender; } void Pke_LoadPlugin(const char *path) { if (loadedPlugin != nullptr || loadedPlugin != CAFE_BABE(void)) { return; } void *extension = dlopen(path, RTLD_NOW); char *err = dlerror(); if (!extension) { fprintf(stderr, "Given plugin library (%s) failed to load: %s\n", path, err); return; } PKEPluginInterface *interface = reinterpret_cast(dlsym(extension, "pkePluginInterface")); err = dlerror(); if (err != NULL) { fprintf(stderr, "Given plugin library (%s) did not contain 'pkePluginInterface': %s\n", path, err); dlclose(extension); return; } Pke_UpdatePlugin(*interface); loadedPlugin = interface; } void Pke_UnloadPlugin() { pkePlugin = { .OnInit = nullptr, .OnTick= nullptr, .OnTeardown= nullptr, .OnImGuiRender= nullptr, }; if (loadedPlugin != nullptr && loadedPlugin != CAFE_BABE(void)) { dlclose(loadedPlugin); loadedPlugin = CAFE_BABE(void); } }