aboutsummaryrefslogtreecommitdiff
path: root/NorthstarDLL/plugins/plugin_abi.h
diff options
context:
space:
mode:
authorEmma Miler <emma.pi@protonmail.com>2023-04-11 20:49:16 +0200
committerGitHub <noreply@github.com>2023-04-11 20:49:16 +0200
commit450d0b1ed437cf37b4309af952af8904f3f07768 (patch)
tree3f0fd39b5663b5c3f4b9e76c70cc4987f22d66c7 /NorthstarDLL/plugins/plugin_abi.h
parent72da1da5b4c04ccc1154853a308cab6459c60b79 (diff)
downloadNorthstarLauncher-450d0b1ed437cf37b4309af952af8904f3f07768.tar.gz
NorthstarLauncher-450d0b1ed437cf37b4309af952af8904f3f07768.zip
Plugin system v2 (#343)
* Some work * Rewrite gamestate presence * Add plugin system logger * Format changes * Format chjange * Fix gamestate stuff * some callback stuff * move around invite stuff * move invite to funcs * fix presence server data * Actually call InformSQVMCreated * bruh * Fix TODO's * Formatting * Fix filters * Add InformDLLLoads * Fix plugin handle always being 0 * Formatting * Fix merge issues * Formatting * Mods can add files compiled at SQVM init * Some Small Fixes * Add changes from review * Fix load failure * Add new squirrel functions * actually call InformSQVMDestroyed * add CreateObject function * answers to complaints * remove snake cases from GameStatePresence --------- Co-authored-by: cat_or_not <41955154+catornot@users.noreply.github.com>
Diffstat (limited to 'NorthstarDLL/plugins/plugin_abi.h')
-rw-r--r--NorthstarDLL/plugins/plugin_abi.h192
1 files changed, 144 insertions, 48 deletions
diff --git a/NorthstarDLL/plugins/plugin_abi.h b/NorthstarDLL/plugins/plugin_abi.h
index 4b176a32..c9fa9d25 100644
--- a/NorthstarDLL/plugins/plugin_abi.h
+++ b/NorthstarDLL/plugins/plugin_abi.h
@@ -1,68 +1,164 @@
#pragma once
#include <string>
+#include "squirrel/squirrelclasstypes.h"
-#define ABI_VERSION 1
-/// <summary>
-/// This enum is used for referencing the different types of objects we can pass to a plugin
-/// Anything exposed to a plugin must not a be C++ type, as they could break when compiling with a different compiler.
-/// Any ABI incompatible change must increment the version number.
-/// Nothing must be removed from this enum, only appended. When it absolutely necessary to deprecate an object, it should return UNSUPPORTED
-/// when retrieved
-/// </summary>
-enum PluginObject
+#define ABI_VERSION 2
+
+enum GameState
{
- UNSUPPORTED = 0,
- GAMESTATE = 1,
- SERVERINFO = 2,
- PLAYERINFO = 3,
- DUMMY = 0xFFFF
+ LOADING = 0,
+ MAINMENU = 1,
+ LOBBY = 2,
+ INGAME = 3
};
-enum GameStateInfoType
+enum PluginLoadDLL
{
- ourScore = 0,
- secondHighestScore = 1,
- highestScore = 2,
- connected = 3,
- loading = 4,
- map = 5,
- mapDisplayName = 6,
- playlist = 7,
- playlistDisplayName = 8,
- players = 9
+ ENGINE = 0,
+ CLIENT,
+ SERVER
};
-struct GameState
+
+enum ObjectType
{
- int (*getGameStateChar)(char* out_buf, size_t out_buf_len, GameStateInfoType var);
- int (*getGameStateInt)(int* out_ptr, GameStateInfoType var);
- int (*getGameStateBool)(bool* out_ptr, GameStateInfoType var);
+ CONCOMMANDS = 0,
+ CONVAR = 1,
};
-enum ServerInfoType
+struct SquirrelFunctions
{
- id = 0,
- name = 1,
- description = 2,
- password = 3,
- maxPlayers = 4,
- roundBased = 5,
- scoreLimit = 6,
- endTime = 7
+ RegisterSquirrelFuncType RegisterSquirrelFunc;
+ sq_defconstType __sq_defconst;
+
+ sq_compilebufferType __sq_compilebuffer;
+ sq_callType __sq_call;
+ sq_raiseerrorType __sq_raiseerror;
+
+ sq_newarrayType __sq_newarray;
+ sq_arrayappendType __sq_arrayappend;
+
+ sq_newtableType __sq_newtable;
+ sq_newslotType __sq_newslot;
+
+ sq_pushroottableType __sq_pushroottable;
+ sq_pushstringType __sq_pushstring;
+ sq_pushintegerType __sq_pushinteger;
+ sq_pushfloatType __sq_pushfloat;
+ sq_pushboolType __sq_pushbool;
+ sq_pushassetType __sq_pushasset;
+ sq_pushvectorType __sq_pushvector;
+ sq_pushobjectType __sq_pushobject;
+ sq_getthisentityType __sq_getthisentity;
+ sq_getobjectType __sq_getobject;
+
+ sq_stackinfosType __sq_stackinfos;
+
+ sq_getstringType __sq_getstring;
+ sq_getintegerType __sq_getinteger;
+ sq_getfloatType __sq_getfloat;
+ sq_getboolType __sq_getbool;
+ sq_getType __sq_get;
+ sq_getassetType __sq_getasset;
+ sq_getuserdataType __sq_getuserdata;
+ sq_getvectorType __sq_getvector;
+
+ sq_createuserdataType __sq_createuserdata;
+ sq_setuserdatatypeidType __sq_setuserdatatypeid;
+ sq_getfunctionType __sq_getfunction;
+
+ sq_schedule_call_externalType __sq_schedule_call_external;
+ sq_getentityfrominstanceType __sq_getentityfrominstance;
+ sq_GetEntityConstantType __sq_GetEntityConstant_CBaseEntity;
+};
+
+struct MessageSource
+{
+ const char* file;
+ const char* func;
+ int line;
};
-struct ServerInfo
+
+// This is a modified version of spdlog::details::log_msg
+// This is so that we can make it cross DLL boundaries
+struct LogMsg
{
- int (*getServerInfoChar)(char* out_buf, size_t out_buf_len, ServerInfoType var);
- int (*getServerInfoInt)(int* out_ptr, ServerInfoType var);
- int (*getServerInfoBool)(bool* out_ptr, ServerInfoType var);
+ int level;
+ uint64_t timestamp;
+ const char* msg;
+ MessageSource source;
+ int pluginHandle;
};
-enum PlayerInfoType
+typedef void (*loggerfunc_t)(LogMsg* msg);
+typedef void (*PLUGIN_RELAY_INVITE_TYPE)(const char* invite);
+typedef void* (*CreateObjectFunc)(ObjectType type);
+
+struct PluginNorthstarData
{
- uid = 0
+ const char* version;
+ HMODULE northstarModule;
+ int pluginHandle;
};
-struct PlayerInfo
+
+struct PluginInitFuncs
{
- int (*getPlayerInfoChar)(char* out_buf, size_t out_buf_len, PlayerInfoType var);
- int (*getPlayerInfoInt)(int* out_ptr, PlayerInfoType var);
- int (*getPlayerInfoBool)(bool* out_ptr, PlayerInfoType var);
+ loggerfunc_t logger;
+ PLUGIN_RELAY_INVITE_TYPE relayInviteFunc;
+ CreateObjectFunc createObject;
};
+
+struct PluginEngineData
+{
+ void* ConCommandConstructor;
+ void* conVarMalloc;
+ void* conVarRegister;
+ void* ConVar_Vtable;
+ void* IConVar_Vtable;
+};
+
+struct PluginGameStatePresence
+{
+ const char* id;
+ const char* name;
+ const char* description;
+ const char* password;
+
+ bool isServer;
+ bool isLocal;
+ GameState state;
+
+ const char* map;
+ const char* mapDisplayname;
+ const char* playlist;
+ const char* playlistDisplayname;
+
+ int currentPlayers;
+ int maxPlayers;
+
+ int ownScore;
+ int otherHighestScore; // NOTE: The highest score OR the second highest score if we have the highest
+ int maxScore;
+
+ int timestampEnd;
+};
+
+/// <summary> Async communication within the plugin system
+/// Due to the asynchronous nature of plugins, combined with the limitations of multi-compiler support
+/// and the custom memory allocator used by r2, is it difficult to safely get data across DLL boundaries
+/// from Northstar to plugin unless Northstar can own that memory.
+/// This means that plugins should manage their own memory and can only receive data from northstar using one of the functions below.
+/// These should be exports of the plugin DLL. If they are not exported, they will not be called.
+/// Note that it is not required to have these exports if you do not use them.
+/// </summary>
+
+// Northstar -> Plugin
+typedef void (*PLUGIN_INIT_TYPE)(PluginInitFuncs* funcs, PluginNorthstarData* data);
+typedef void (*PLUGIN_INIT_SQVM_TYPE)(SquirrelFunctions* funcs);
+typedef void (*PLUGIN_INFORM_SQVM_CREATED_TYPE)(ScriptContext context, CSquirrelVM* sqvm);
+typedef void (*PLUGIN_INFORM_SQVM_DESTROYED_TYPE)(ScriptContext context);
+
+// Async Communication types
+
+// Northstar -> Plugin
+typedef void (*PLUGIN_PUSH_PRESENCE_TYPE)(PluginGameStatePresence* data);
+typedef void (*PLUGIN_INFORM_DLL_LOAD_TYPE)(PluginLoadDLL dll, void* data);