@@ -341,3 +341,8 @@ healthchecksdb | |||
# references | |||
ref | |||
# doxygen docs | |||
doxygen/** | |||
**.bak | |||
dox.log |
@@ -18,9 +18,16 @@ namespace GamecraftModdingAPI.Commands | |||
{ | |||
private static Dictionary<string, ICustomCommandEngine> _customCommands = new Dictionary<string, ICustomCommandEngine>(); | |||
private static EnginesRoot _lastEngineRoot; | |||
public static void AddCommand(ICustomCommandEngine engine) | |||
{ | |||
_customCommands[engine.Name] = engine; | |||
if (_lastEngineRoot != null) | |||
{ | |||
Logging.MetaDebugLog($"Registering ICustomCommandEngine {engine.Name}"); | |||
_lastEngineRoot.AddEngine(engine); | |||
} | |||
} | |||
public static bool ExistsCommand(string name) | |||
@@ -50,6 +57,7 @@ namespace GamecraftModdingAPI.Commands | |||
public static void RegisterEngines(EnginesRoot enginesRoot) | |||
{ | |||
_lastEngineRoot = enginesRoot; | |||
foreach (var key in _customCommands.Keys) | |||
{ | |||
Logging.MetaDebugLog($"Registering ICustomCommandEngine {_customCommands[key].Name}"); | |||
@@ -21,22 +21,21 @@ namespace GamecraftModdingAPI.Commands | |||
/// Patch of RobocraftX.GUI.CommandLine.CommandLineCompositionRoot.Compose<T>() | |||
/// </summary> | |||
// TODO: fix | |||
//[HarmonyPatch] | |||
[HarmonyPatch] | |||
//[HarmonyPatch(typeof(RobocraftX.GUI.CommandLine.CommandLineCompositionRoot))] | |||
//[HarmonyPatch("Compose")] | |||
//[HarmonyPatch("Compose", new Type[] { typeof(UnityContext<FullGameCompositionRoot>), typeof(EnginesRoot), typeof(World), typeof(Action), typeof(MultiplayerInitParameters), typeof(StateSyncRegistrationHelper)})] | |||
static class CommandPatch | |||
{ | |||
public static void Postfix(object contextHolder, EnginesRoot enginesRoot, World physicsWorld, Action reloadGame, MultiplayerInitParameters multiplayerParameters, StateSyncRegistrationHelper stateSyncReg) | |||
public static void Postfix(object contextHolder, EnginesRoot enginesRoot, World physicsWorld, Action reloadGame, MultiplayerInitParameters multiplayerParameters, ref StateSyncRegistrationHelper stateSyncReg) | |||
{ | |||
Logging.MetaDebugLog("Command Line was loaded"); | |||
// When a game is loaded, register the command engines | |||
CommandManager.RegisterEngines(enginesRoot); | |||
} | |||
public static MethodBase TargetMethod(HarmonyInstance instance) | |||
{ | |||
return typeof(RobocraftX.GUI.CommandLine.CommandLineCompositionRoot).GetMethod("Compose").MakeGenericMethod(typeof(object)); | |||
return typeof(RobocraftX.GUI.CommandLine.CommandLineCompositionRoot).GetMethod("Compose").MakeGenericMethod(typeof(object)); | |||
//return func.Method; | |||
} | |||
} | |||
@@ -20,11 +20,18 @@ namespace GamecraftModdingAPI.Events | |||
private static Dictionary<string, IEventHandlerEngine> _eventHandlers = new Dictionary<string, IEventHandlerEngine>(); | |||
private static EnginesRoot _lastEngineRoot; | |||
// event handler management | |||
public static void AddEventHandler(IEventHandlerEngine engine) | |||
{ | |||
_eventHandlers[engine.Name] = engine; | |||
if (_lastEngineRoot != null) | |||
{ | |||
Logging.MetaDebugLog($"Registering IEventHandlerEngine {engine.Name}"); | |||
_lastEngineRoot.AddEngine(engine); | |||
} | |||
} | |||
public static bool ExistsEventHandler(string name) | |||
@@ -57,6 +64,11 @@ namespace GamecraftModdingAPI.Events | |||
public static void AddEventEmitter(IEventEmitterEngine engine) | |||
{ | |||
_eventEmitters[engine.Name] = engine; | |||
if (_lastEngineRoot != null) | |||
{ | |||
Logging.MetaDebugLog($"Registering IEventEmitterEngine {engine.Name}"); | |||
_lastEngineRoot.AddEngine(engine); | |||
} | |||
} | |||
public static bool ExistsEventEmitter(string name) | |||
@@ -89,6 +101,7 @@ namespace GamecraftModdingAPI.Events | |||
public static void RegisterEngines(EnginesRoot enginesRoot) | |||
{ | |||
_lastEngineRoot = enginesRoot; | |||
// Register handlers before emitters so no events are missed | |||
var entityFactory = enginesRoot.GenerateEntityFactory(); | |||
foreach (var key in _eventHandlers.Keys) | |||
@@ -22,8 +22,6 @@ namespace GamecraftModdingAPI.Events | |||
{ | |||
// register custom game engines | |||
GameEngineManager.RegisterEngines(____mainGameEnginesRoot); | |||
// register custom command engines | |||
GamecraftModdingAPI.Commands.CommandManager.RegisterEngines(____mainGameEnginesRoot); | |||
// A new EnginesRoot is always created when ActivateGame is called | |||
// so all event emitters and handlers must be re-registered. | |||
EventManager.RegisterEngines(____mainGameEnginesRoot); | |||
@@ -33,6 +33,16 @@ namespace GamecraftModdingAPI.Events | |||
} | |||
} | |||
/// <summary> | |||
/// Manually activate the EventHandler. | |||
/// Once activated, the next remove event will not be ignored. | |||
/// </summary> | |||
/// <param name="handle">Whether to invoke the activated action</param> | |||
public void Activate(bool handle = false) | |||
{ | |||
isActivated = true; | |||
} | |||
public void Ready() { } | |||
public void Remove(ref ModEventEntityStruct entityView, EGID egid) | |||
@@ -42,11 +42,13 @@ namespace GamecraftModdingAPI.Tests | |||
public void OnApplicationStart() | |||
{ | |||
GamecraftModdingAPI.Main.Init(); | |||
// in case Steam is not installed/running | |||
// this will crash the game slightly later during startup | |||
//SteamInitPatch.ForcePassSteamCheck = true; | |||
// in case running in a VM | |||
//MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true; | |||
// in case Steam is not installed/running | |||
// this will crash the game slightly later during startup | |||
//SteamInitPatch.ForcePassSteamCheck = true; | |||
// in case running in a VM | |||
//MinimumSpecsCheckPatch.ForcePassMinimumSpecCheck = true; | |||
// disable some Gamecraft analytics | |||
//AnalyticsDisablerPatch.DisableAnalytics = true; | |||
// disable background music | |||
AudioTools.SetVolume(0.0f, "Music"); | |||
@@ -90,6 +92,10 @@ namespace GamecraftModdingAPI.Tests | |||
CommandManager.AddCommand(new SimpleCustomCommandEngine<float, float, float>( | |||
(x,y,z) => { Blocks.Placement.PlaceBlock(Blocks.BlockIDs.AluminiumCube, new Unity.Mathematics.float3(x, y, z)); }, | |||
"PlaceAluminium", "Place a block of aluminium at the given coordinates")); | |||
Analytics.DeltaDNAHelper.PlayerLifetimeParameters plp = new Analytics.DeltaDNAHelper.PlayerLifetimeParameters(); | |||
CommandManager.AddCommand(new SimpleCustomCommandEngine<string>( | |||
(s) => { Analytics.DeltaDNAHelper.SendActionCompletedEvent(in plp, s.Replace(", ", " ")); }, | |||
"SendAnalyticsAction", "Send an analytics action")); | |||
} | |||
public void OnFixedUpdate() { } | |||
@@ -0,0 +1,38 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
using System.Reflection; | |||
using Analytics; | |||
using Harmony; | |||
using RobocraftX.Common; | |||
using Svelto.ECS; | |||
namespace GamecraftModdingAPI.Utility | |||
{ | |||
/// <summary> | |||
/// Patch of Analytics.AnalyticsCompositionRoot.Compose<T>(...) | |||
/// This stops some analytics collection built into Gamecraft. | |||
/// DO NOT USE! (This will likely crash your game on shutdown) | |||
/// </summary> | |||
[HarmonyPatch] | |||
class AnalyticsDisablerPatch | |||
{ | |||
/// <summary> | |||
/// Don't activate gameplay analytics? | |||
/// </summary> | |||
public static bool DisableAnalytics = false; | |||
public static bool Prefix(object contextHolder, EnginesRoot enginesRoot, RCXMode rcxMode) | |||
{ | |||
return !DisableAnalytics; | |||
} | |||
public static MethodBase TargetMethod(HarmonyInstance instance) | |||
{ | |||
return typeof(Analytics.AnalyticsCompositionRoot).GetMethod("Compose").MakeGenericMethod(typeof(object)); | |||
} | |||
} | |||
} |
@@ -15,9 +15,16 @@ namespace GamecraftModdingAPI.Utility | |||
{ | |||
private static Dictionary<string, IApiEngine> _gameEngines = new Dictionary<string, IApiEngine>(); | |||
private static EnginesRoot _lastEngineRoot; | |||
public static void AddGameEngine(IApiEngine engine) | |||
{ | |||
_gameEngines[engine.Name] = engine; | |||
if (_lastEngineRoot != null) | |||
{ | |||
Logging.MetaDebugLog($"Registering Game IApiEngine {engine.Name}"); | |||
_lastEngineRoot.AddEngine(engine); | |||
} | |||
} | |||
public static bool ExistsGameEngine(string name) | |||
@@ -47,6 +54,7 @@ namespace GamecraftModdingAPI.Utility | |||
public static void RegisterEngines(EnginesRoot enginesRoot) | |||
{ | |||
_lastEngineRoot = enginesRoot; | |||
foreach (var key in _gameEngines.Keys) | |||
{ | |||
Logging.MetaDebugLog($"Registering Game IApiEngine {_gameEngines[key].Name}"); | |||
@@ -15,10 +15,17 @@ namespace GamecraftModdingAPI.Utility | |||
{ | |||
private static Dictionary<string, IApiEngine> _menuEngines = new Dictionary<string, IApiEngine>(); | |||
private static EnginesRoot _lastEngineRoot; | |||
// menu engine management | |||
public static void AddMenuEngine(IApiEngine engine) | |||
{ | |||
_menuEngines[engine.Name] = engine; | |||
if (_lastEngineRoot != null) | |||
{ | |||
Logging.MetaDebugLog($"Registering Menu IApiEngine {engine.Name}"); | |||
_lastEngineRoot.AddEngine(engine); | |||
} | |||
} | |||
public static bool ExistsMenuEngine(string name) | |||
@@ -48,6 +55,7 @@ namespace GamecraftModdingAPI.Utility | |||
public static void RegisterEngines(EnginesRoot enginesRoot) | |||
{ | |||
_lastEngineRoot = enginesRoot; | |||
foreach (var key in _menuEngines.Keys) | |||
{ | |||
Logging.MetaDebugLog($"Registering Menu IApiEngine {_menuEngines[key].Name}"); | |||
@@ -0,0 +1,21 @@ | |||
<!-- HTML footer for doxygen 1.8.17--> | |||
<!-- start footer part --> | |||
<!--BEGIN GENERATE_TREEVIEW--> | |||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> | |||
<ul> | |||
$navpath | |||
<li class="footer" style="display:none;">$generatedby | |||
<a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li> | |||
</ul> | |||
</div> | |||
<!--END GENERATE_TREEVIEW--> | |||
<!--BEGIN !GENERATE_TREEVIEW--> | |||
<hr class="footer"/><address class="footer"><small> | |||
$generatedby  <a href="http://www.doxygen.org/index.html"> | |||
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/> | |||
</a> $doxygenversion | |||
</small></address> | |||
<!--END !GENERATE_TREEVIEW--> | |||
</body> | |||
</html> |
@@ -0,0 +1,58 @@ | |||
<!-- HTML header for doxygen 1.8.17--> | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html xmlns="http://www.w3.org/1999/xhtml"> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | |||
<meta http-equiv="X-UA-Compatible" content="IE=9"/> | |||
<meta name="generator" content="Doxygen $doxygenversion"/> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"/> | |||
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> | |||
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> | |||
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> | |||
<link href="https://exmods.org/static/favicon.png" rel="icon" type="image/x-icon" /> | |||
<link href="https://exmods.org/static/favicon.png" rel="shortcut icon" type="image/x-icon" /> | |||
<script type="text/javascript" src="$relpath^jquery.js"></script> | |||
<script type="text/javascript" src="$relpath^dynsections.js"></script> | |||
$treeview | |||
$search | |||
$mathjax | |||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> | |||
$extrastylesheet | |||
</head> | |||
<body> | |||
<div id="top"><!-- do not remove this div, it is closed by doxygen! --> | |||
<!--BEGIN TITLEAREA--> | |||
<div id="titlearea"> | |||
<table cellspacing="0" cellpadding="0"> | |||
<tbody> | |||
<tr style="height: 56px;"> | |||
<!--BEGIN PROJECT_LOGO--> | |||
<td id="projectlogo"><a href="/index.html"><img alt="Logo" src="$relpath^$projectlogo"/></a></td> | |||
<!--END PROJECT_LOGO--> | |||
<!--BEGIN PROJECT_NAME--> | |||
<td id="projectalign" style="padding-left: 0.5em;"> | |||
<div id="projectname">$projectname | |||
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber"><a href="https://git.exmods.org/modtainers/GamecraftModdingAPI/releases">$projectnumber</a></span><!--END PROJECT_NUMBER--> | |||
</div> | |||
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief"><b>$projectbrief</b></div><!--END PROJECT_BRIEF--> | |||
</td> | |||
<!--END PROJECT_NAME--> | |||
<!--BEGIN !PROJECT_NAME--> | |||
<!--BEGIN PROJECT_BRIEF--> | |||
<td style="padding-left: 0.5em;"> | |||
<div id="projectbrief">$projectbrief</div> | |||
</td> | |||
<!--END PROJECT_BRIEF--> | |||
<!--END !PROJECT_NAME--> | |||
<!--BEGIN DISABLE_INDEX--> | |||
<!--BEGIN SEARCHENGINE--> | |||
<td>$searchbox</td> | |||
<!--END SEARCHENGINE--> | |||
<!--END DISABLE_INDEX--> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
<!--END TITLEAREA--> | |||
<!-- end header part --> |
@@ -0,0 +1,226 @@ | |||
<doxygenlayout version="1.0"> | |||
<!-- Generated by doxygen 1.8.17 --> | |||
<!-- Navigation index tabs for HTML output --> | |||
<navindex> | |||
<tab type="mainpage" visible="yes" title=""/> | |||
<tab type="pages" visible="yes" title="" intro=""/> | |||
<tab type="modules" visible="yes" title="" intro=""/> | |||
<tab type="namespaces" visible="yes" title=""> | |||
<tab type="namespacelist" visible="yes" title="" intro=""/> | |||
<tab type="namespacemembers" visible="yes" title="" intro=""/> | |||
</tab> | |||
<tab type="interfaces" visible="yes" title=""> | |||
<tab type="interfacelist" visible="yes" title="" intro=""/> | |||
<tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/> | |||
<tab type="interfacehierarchy" visible="yes" title="" intro=""/> | |||
</tab> | |||
<tab type="classes" visible="yes" title=""> | |||
<tab type="classlist" visible="yes" title="" intro=""/> | |||
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> | |||
<tab type="hierarchy" visible="yes" title="" intro=""/> | |||
<tab type="classmembers" visible="yes" title="" intro=""/> | |||
</tab> | |||
<tab type="structs" visible="yes" title=""> | |||
<tab type="structlist" visible="yes" title="" intro=""/> | |||
<tab type="structindex" visible="$ALPHABETICAL_INDEX" title=""/> | |||
</tab> | |||
<tab type="exceptions" visible="yes" title=""> | |||
<tab type="exceptionlist" visible="yes" title="" intro=""/> | |||
<tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/> | |||
<tab type="exceptionhierarchy" visible="yes" title="" intro=""/> | |||
</tab> | |||
<tab type="files" visible="yes" title=""> | |||
<tab type="filelist" visible="yes" title="" intro=""/> | |||
<tab type="globals" visible="yes" title="" intro=""/> | |||
</tab> | |||
<tab type="examples" visible="yes" title="" intro=""/> | |||
</navindex> | |||
<!-- Layout definition for a class page --> | |||
<class> | |||
<briefdescription visible="yes"/> | |||
<includes visible="$SHOW_INCLUDE_FILES"/> | |||
<inheritancegraph visible="$CLASS_GRAPH"/> | |||
<collaborationgraph visible="$COLLABORATION_GRAPH"/> | |||
<memberdecl> | |||
<nestedclasses visible="yes" title=""/> | |||
<publictypes title=""/> | |||
<services title=""/> | |||
<interfaces title=""/> | |||
<publicslots title=""/> | |||
<signals title=""/> | |||
<publicmethods title=""/> | |||
<publicstaticmethods title=""/> | |||
<publicattributes title=""/> | |||
<publicstaticattributes title=""/> | |||
<protectedtypes title=""/> | |||
<protectedslots title=""/> | |||
<protectedmethods title=""/> | |||
<protectedstaticmethods title=""/> | |||
<protectedattributes title=""/> | |||
<protectedstaticattributes title=""/> | |||
<packagetypes title=""/> | |||
<packagemethods title=""/> | |||
<packagestaticmethods title=""/> | |||
<packageattributes title=""/> | |||
<packagestaticattributes title=""/> | |||
<properties title=""/> | |||
<events title=""/> | |||
<privatetypes title=""/> | |||
<privateslots title=""/> | |||
<privatemethods title=""/> | |||
<privatestaticmethods title=""/> | |||
<privateattributes title=""/> | |||
<privatestaticattributes title=""/> | |||
<friends title=""/> | |||
<related title="" subtitle=""/> | |||
<membergroups visible="yes"/> | |||
</memberdecl> | |||
<detaileddescription title=""/> | |||
<memberdef> | |||
<inlineclasses title=""/> | |||
<typedefs title=""/> | |||
<enums title=""/> | |||
<services title=""/> | |||
<interfaces title=""/> | |||
<constructors title=""/> | |||
<functions title=""/> | |||
<related title=""/> | |||
<variables title=""/> | |||
<properties title=""/> | |||
<events title=""/> | |||
</memberdef> | |||
<allmemberslink visible="yes"/> | |||
<usedfiles visible="$SHOW_USED_FILES"/> | |||
<authorsection visible="yes"/> | |||
</class> | |||
<!-- Layout definition for a namespace page --> | |||
<namespace> | |||
<briefdescription visible="yes"/> | |||
<memberdecl> | |||
<nestednamespaces visible="yes" title=""/> | |||
<constantgroups visible="yes" title=""/> | |||
<interfaces visible="yes" title=""/> | |||
<classes visible="yes" title=""/> | |||
<structs visible="yes" title=""/> | |||
<exceptions visible="yes" title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
<membergroups visible="yes"/> | |||
</memberdecl> | |||
<detaileddescription title=""/> | |||
<memberdef> | |||
<inlineclasses title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
</memberdef> | |||
<authorsection visible="yes"/> | |||
</namespace> | |||
<!-- Layout definition for a file page --> | |||
<file> | |||
<briefdescription visible="yes"/> | |||
<includes visible="$SHOW_INCLUDE_FILES"/> | |||
<includegraph visible="$INCLUDE_GRAPH"/> | |||
<includedbygraph visible="$INCLUDED_BY_GRAPH"/> | |||
<sourcelink visible="yes"/> | |||
<memberdecl> | |||
<interfaces visible="yes" title=""/> | |||
<classes visible="yes" title=""/> | |||
<structs visible="yes" title=""/> | |||
<exceptions visible="yes" title=""/> | |||
<namespaces visible="yes" title=""/> | |||
<constantgroups visible="yes" title=""/> | |||
<defines title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
<membergroups visible="yes"/> | |||
</memberdecl> | |||
<detaileddescription title=""/> | |||
<memberdef> | |||
<inlineclasses title=""/> | |||
<defines title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
</memberdef> | |||
<authorsection/> | |||
</file> | |||
<!-- Layout definition for a group page --> | |||
<group> | |||
<briefdescription visible="yes"/> | |||
<groupgraph visible="$GROUP_GRAPHS"/> | |||
<memberdecl> | |||
<nestedgroups visible="yes" title=""/> | |||
<dirs visible="yes" title=""/> | |||
<files visible="yes" title=""/> | |||
<namespaces visible="yes" title=""/> | |||
<classes visible="yes" title=""/> | |||
<defines title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<enumvalues title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
<signals title=""/> | |||
<publicslots title=""/> | |||
<protectedslots title=""/> | |||
<privateslots title=""/> | |||
<events title=""/> | |||
<properties title=""/> | |||
<friends title=""/> | |||
<membergroups visible="yes"/> | |||
</memberdecl> | |||
<detaileddescription title=""/> | |||
<memberdef> | |||
<pagedocs/> | |||
<inlineclasses title=""/> | |||
<defines title=""/> | |||
<typedefs title=""/> | |||
<sequences title=""/> | |||
<dictionaries title=""/> | |||
<enums title=""/> | |||
<enumvalues title=""/> | |||
<functions title=""/> | |||
<variables title=""/> | |||
<signals title=""/> | |||
<publicslots title=""/> | |||
<protectedslots title=""/> | |||
<privateslots title=""/> | |||
<events title=""/> | |||
<properties title=""/> | |||
<friends title=""/> | |||
</memberdef> | |||
<authorsection visible="yes"/> | |||
</group> | |||
<!-- Layout definition for a directory page --> | |||
<directory> | |||
<briefdescription visible="yes"/> | |||
<directorygraph visible="yes"/> | |||
<memberdecl> | |||
<dirs visible="yes"/> | |||
<files visible="yes"/> | |||
</memberdecl> | |||
<detaileddescription title=""/> | |||
</directory> | |||
</doxygenlayout> |