diff --git a/Automation/Automation.cs b/Automation/Automation.cs
new file mode 100644
index 0000000..92787f6
--- /dev/null
+++ b/Automation/Automation.cs
@@ -0,0 +1,66 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace Automation
+{
+ class Automation
+ {
+ private static readonly string Name = "automation";
+
+ private static readonly string XmlPrefix = "\n \n";
+ private static readonly string XmlSuffix = " \n";
+
+ private static readonly string GamecraftModdingAPI_csproj = @"\GamecraftModdingAPI.csproj";
+ static void Main(string[] args)
+ {
+ if (args.Length != 2 || args[0] == "-h" || args[0] == "--help")
+ {
+ Console.WriteLine($"Usage : {Name}.exe ");
+ Console.WriteLine("Other arguments:");
+ Console.WriteLine(" --help : display this message");
+ Console.WriteLine($" --version : display {Name}'s version");
+ return;
+ }
+ Console.WriteLine("Building Assembly references");
+ string asmXml = BuildAssemblyReferencesXML(args[0]);
+ //Console.WriteLine(asmXml);
+ string csprojPath = args[1].EndsWith(GamecraftModdingAPI_csproj)? args[1] : args[1]+GamecraftModdingAPI_csproj;
+ Console.WriteLine($"Parsing {csprojPath}");
+ string csprojContents = File.ReadAllText(csprojPath);
+ Match dependenciesStart = (new Regex(@"<\s*!--\s*Start\s+Dependencies\s*--\s*>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline)).Match(csprojContents);
+ Match dependenciesEnd = (new Regex(@"<\s*!--\s*End\s+Dependencies\s*--\s*>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline)).Match(csprojContents);
+ if (!dependenciesEnd.Success || !dependenciesStart.Success)
+ {
+ Console.WriteLine("Unable to find dependency XML comments, aborting!");
+ return;
+ }
+ csprojContents = csprojContents.Substring(0, dependenciesStart.Index) + asmXml + csprojContents.Substring(dependenciesEnd.Index+dependenciesEnd.Length);
+ //Console.WriteLine(csprojContents);
+ Console.WriteLine($"Writing Assembly references into {csprojPath}");
+ File.WriteAllText(csprojPath, csprojContents);
+ Console.WriteLine("Successfully generated Gamecraft assembly DLL references");
+ }
+
+ static string BuildAssemblyReferencesXML(string path)
+ {
+ StringBuilder result = new StringBuilder();
+ result.Append(XmlPrefix);
+ string[] files = Directory.GetFiles(path, "*.dll");
+ for(int i = 0; i\n {files[i]}\n \n");
+ }
+ }
+ result.Append(XmlSuffix);
+ return result.ToString();
+ }
+ }
+}
diff --git a/Automation/Automation.csproj b/Automation/Automation.csproj
new file mode 100644
index 0000000..c73e0d1
--- /dev/null
+++ b/Automation/Automation.csproj
@@ -0,0 +1,8 @@
+
+
+
+ Exe
+ netcoreapp3.1
+
+
+
diff --git a/Automation/bump_version.py b/Automation/bump_version.py
deleted file mode 100755
index a6d07b2..0000000
--- a/Automation/bump_version.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/python3
-
-import argparse
-import re
-# this assumes a mostly semver-complient version number
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(description="Increment TechbloxModdingAPI version")
- parser.add_argument('version', metavar="VN", type=str, help="The version number to increment, or the index of the number (zero-indexed).")
- args = parser.parse_args()
-
- version_index = -1
- try:
- version_index = int(args.version)
- except Exception:
- if args.version.lower() == "major":
- version_index = 0
- elif args.version.lower() == "minor":
- version_index = 1
- elif args.version.lower() == "patch":
- version_index = 2
-
- if version_index < 0:
- print("Could not parse version argument.")
- exit(version_index)
-
- print(version_index)
- old_version = ""
- new_version = ""
-
- with open("../TechbloxModdingAPI/TechbloxModdingAPI.csproj", "r") as xmlFile:
- print("Parsing TechbloxModdingAPI.csproj")
- fileStr = xmlFile.read()
- versionMatch = re.search(r"(.+)", fileStr)
- if versionMatch is None:
- print("Unable to find version number in TechbloxModdingAPI.csproj")
- exit(1)
- old_version = versionMatch.group(1)
- versionList = old_version.split(".")
- if len(versionList) <= version_index:
- print("Invalid version string")
- exit(1)
- versionList[version_index] = str(int(versionList[version_index]) + 1)
- for i in range(version_index + 1, len(versionList)):
- try:
- int(versionList[i])
- versionList[i] = "0"
- except Exception:
- tmp = versionList[i].split("-")
- tmp[0] = "0"
- versionList[i] = "-".join(tmp)
- new_version = ".".join(versionList)
- print(new_version)
- newFileContents = fileStr.replace(""+old_version+"", ""+new_version+"")
-
- with open("../TechbloxModdingAPI/TechbloxModdingAPI.csproj", "w") as xmlFile:
- print("Writing new version to project file")
- xmlFile.write(newFileContents)
-
- with open("../doxygen.conf", "r") as doxFile:
- print("Parsing doxygen.conf")
- doxStr = doxFile.read()
- newFileContents = doxStr.replace("= \"v" + old_version + "\"", "= \"v" + new_version + "\"")
-
- with open("../doxygen.conf", "w") as doxFile:
- print("Writing new version to doxygen config")
- doxFile.write(newFileContents)
diff --git a/Automation/gen_csproj.py b/Automation/gen_csproj.py
deleted file mode 100755
index 0c88372..0000000
--- a/Automation/gen_csproj.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/python3
-
-import argparse
-from pathlib import Path, PurePath
-import re
-import os
-
-DLL_EXCLUSIONS_REGEX = r"(System|Microsoft|Mono|IronPython|DiscordRPC|IllusionInjector|IllusionPlugin|netstandard)\."
-
-def getAssemblyReferences(path):
- asmDir = Path(path)
- result = list()
- addedPath = ""
- if not asmDir.exists():
- addedPath = "../"
- asmDir = Path(addedPath + path)
- for child in asmDir.iterdir():
- if child.is_file() and re.search(DLL_EXCLUSIONS_REGEX, str(child)) is None and str(child).lower().endswith(".dll"):
- childstr = str(child)
- childstr = os.path.relpath(childstr, addedPath).replace("\\", "/")
- result.append(childstr)
- result.sort(key=str.lower)
- result = [path + "/IllusionInjector.dll", path + "/IllusionPlugin.dll"] + result # Always put it on top
- return result
-
-def buildReferencesXml(path):
- assemblyPathes = getAssemblyReferences(path)
- result = list()
- for asm in assemblyPathes:
- asmPath = str(asm)
- xml = " \n" \
- + " " + asmPath.replace("/", "\\") + "\n" \
- + " ..\\" + asmPath.replace("/", "\\") + "\n" \
- + " \n"
- result.append(xml)
- return "\n \n" + "".join(result) + " \n"
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser(description="Generate TechbloxModdingAPI.csproj")
- # TODO (maybe?): add params for custom csproj read and write locations
- args = parser.parse_args()
-
- print("Building Assembly references")
- asmXml = buildReferencesXml("../ref_TB/Techblox_Data/Managed")
- # print(asmXml)
-
- with open("../TechbloxModdingAPI/TechbloxModdingAPI.csproj", "r") as xmlFile:
- print("Parsing TechbloxModdingAPI.csproj")
- fileStr = xmlFile.read()
- # print(fileStr)
- depsStart = re.search(r"\
-
-
- ..\ref_TB\Techblox_Data\Managed\IllusionInjector.dll
- ..\..\ref_TB\Techblox_Data\Managed\IllusionInjector.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\IllusionPlugin.dll
- ..\..\ref_TB\Techblox_Data\Managed\IllusionPlugin.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Accessibility.dll
- ..\..\ref_TB\Techblox_Data\Managed\Accessibility.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Analytics.dll
- ..\..\ref_TB\Techblox_Data\Managed\Analytics.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Assembly-CSharp-firstpass.dll
- ..\..\ref_TB\Techblox_Data\Managed\Assembly-CSharp-firstpass.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Assembly-CSharp.dll
- ..\..\ref_TB\Techblox_Data\Managed\Assembly-CSharp.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\AWSSDK.Core.dll
- ..\..\ref_TB\Techblox_Data\Managed\AWSSDK.Core.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\AWSSDK.GameLift.dll
- ..\..\ref_TB\Techblox_Data\Managed\AWSSDK.GameLift.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\BevelEffect.dll
- ..\..\ref_TB\Techblox_Data\Managed\BevelEffect.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Boxophobic.TheVehetationEngine.Runtime.dll
- ..\..\ref_TB\Techblox_Data\Managed\Boxophobic.TheVehetationEngine.Runtime.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Boxophobic.Utils.Scripts.dll
- ..\..\ref_TB\Techblox_Data\Managed\Boxophobic.Utils.Scripts.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\DataLoader.dll
- ..\..\ref_TB\Techblox_Data\Managed\DataLoader.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\DDNA.dll
- ..\..\ref_TB\Techblox_Data\Managed\DDNA.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\EasyButtons.dll
- ..\..\ref_TB\Techblox_Data\Managed\EasyButtons.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\EOSSDK.dll
- ..\..\ref_TB\Techblox_Data\Managed\EOSSDK.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\FMODUnity.dll
- ..\..\ref_TB\Techblox_Data\Managed\FMODUnity.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\FMODUnityResonance.dll
- ..\..\ref_TB\Techblox_Data\Managed\FMODUnityResonance.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\FMODUnityWrapperClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\FMODUnityWrapperClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\FullGame.dll
- ..\..\ref_TB\Techblox_Data\Managed\FullGame.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.BlockEntityFactory.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.BlockEntityFactory.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.BlockGroups.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.BlockGroups.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Blocks.LogicBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Blocks.LogicBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.BlocksEntityDescriptors.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.BlocksEntityDescriptors.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.ColourPalette.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.ColourPalette.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Damage.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Damage.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Effects.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Effects.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.ExplosionFragments.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.ExplosionFragments.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GraphicsSettings.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GraphicsSettings.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.BlueprintInventory.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.BlueprintInventory.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Blueprints.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Blueprints.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.BlueprintSets.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.BlueprintSets.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.GameOptionsScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.GameOptionsScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.GraphicsScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.GraphicsScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.Blocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.Blocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.BlueprintsHotbar.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.BlueprintsHotbar.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.Colours.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Hotbar.Colours.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.ModeBar.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.ModeBar.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.OptionsScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.OptionsScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Blocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Blocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Blueprints.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Blueprints.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Colours.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Colours.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.TabsBar.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Tweaks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Tweaks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Wires.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.Wires.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.WorldSpaceGuis.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.GUI.WorldSpaceGuis.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.JointBlocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.JointBlocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Music.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Music.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.NetStrings.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.NetStrings.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.PickupsCommon.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.PickupsCommon.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.PopupMessage.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.PopupMessage.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Serialization.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Serialization.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Tweaks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Tweaks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.VisualEffects.Decals.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.VisualEffects.Decals.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Gamecraft.Wires.dll
- ..\..\ref_TB\Techblox_Data\Managed\Gamecraft.Wires.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\GameLiftServerSDKNet45.dll
- ..\..\ref_TB\Techblox_Data\Managed\GameLiftServerSDKNet45.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\GameState.dll
- ..\..\ref_TB\Techblox_Data\Managed\GameState.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\GhostShark.Outline.dll
- ..\..\ref_TB\Techblox_Data\Managed\GhostShark.Outline.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Google.Protobuf.dll
- ..\..\ref_TB\Techblox_Data\Managed\Google.Protobuf.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\GPUInstancer.CrowdAnimations.dll
- ..\..\ref_TB\Techblox_Data\Managed\GPUInstancer.CrowdAnimations.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\GPUInstancer.dll
- ..\..\ref_TB\Techblox_Data\Managed\GPUInstancer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Havok.Physics.dll
- ..\..\ref_TB\Techblox_Data\Managed\Havok.Physics.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Havok.Physics.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Havok.Physics.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\LiteNetLib.dll
- ..\..\ref_TB\Techblox_Data\Managed\LiteNetLib.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\log4net.dll
- ..\..\ref_TB\Techblox_Data\Managed\log4net.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\LZ4.dll
- ..\..\ref_TB\Techblox_Data\Managed\LZ4.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Monobehaviours.dll
- ..\..\ref_TB\Techblox_Data\Managed\Monobehaviours.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\mscorlib.dll
- ..\..\ref_TB\Techblox_Data\Managed\mscorlib.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\MultiplayerNetworking.dll
- ..\..\ref_TB\Techblox_Data\Managed\MultiplayerNetworking.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Newtonsoft.Json.dll
- ..\..\ref_TB\Techblox_Data\Managed\Newtonsoft.Json.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Novell.Directory.Ldap.dll
- ..\..\ref_TB\Techblox_Data\Managed\Novell.Directory.Ldap.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Prometheus.NetStandard.dll
- ..\..\ref_TB\Techblox_Data\Managed\Prometheus.NetStandard.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RCX.ScreenshotTaker.dll
- ..\..\ref_TB\Techblox_Data\Managed\RCX.ScreenshotTaker.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Rewired_Core.dll
- ..\..\ref_TB\Techblox_Data\Managed\Rewired_Core.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Rewired_Windows.dll
- ..\..\ref_TB\Techblox_Data\Managed\Rewired_Windows.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RichFX.dll
- ..\..\ref_TB\Techblox_Data\Managed\RichFX.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftECS.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftECS.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.AccountPreferences.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.AccountPreferences.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.Ghost.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.Ghost.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.Triggers.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Blocks.Triggers.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Building.BoxSelect.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Building.BoxSelect.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Building.Jobs.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Building.Jobs.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Character.Audio.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Character.Audio.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Character.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Character.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.ControlsScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.ControlsScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Crosshair.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Crosshair.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.FrontEnd.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.FrontEnd.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.DebugDisplay.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.DebugDisplay.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Hotbar.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Hotbar.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.BlocksInventory.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.BlocksInventory.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.ColourInventory.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.ColourInventory.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.Inventory.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.QuitConfirmation.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.QuitConfirmation.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.ScaleGhost.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.ScaleGhost.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.TabsBar.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.GUI.TabsBar.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Input.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Input.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.MachineEditor.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.MachineEditor.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.MainGame.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.MainGame.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.MainSimulation.Audio.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.MainSimulation.Audio.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.MainSimulation.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.MainSimulation.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.NetworkEntityStream.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.NetworkEntityStream.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.Serializers.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Multiplayer.Serializers.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.MultiplayerInput.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.MultiplayerInput.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.ObjectIdBlocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.ObjectIdBlocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Physics.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Physics.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.PilotSeat.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.PilotSeat.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Player.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Player.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.SaveAndLoad.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.SaveAndLoad.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.SaveGameDialog.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.SaveGameDialog.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.Services.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.Services.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.SignalHandling.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.SignalHandling.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\RobocraftX.StateSync.dll
- ..\..\ref_TB\Techblox_Data\Managed\RobocraftX.StateSync.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Serilog.dll
- ..\..\ref_TB\Techblox_Data\Managed\Serilog.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Serilog.Sinks.Grafana.Loki.dll
- ..\..\ref_TB\Techblox_Data\Managed\Serilog.Sinks.Grafana.Loki.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\ShaderVariantsGenerationTool.dll
- ..\..\ref_TB\Techblox_Data\Managed\ShaderVariantsGenerationTool.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\SpecializedDescriptors.dll
- ..\..\ref_TB\Techblox_Data\Managed\SpecializedDescriptors.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\StringFormatter.dll
- ..\..\ref_TB\Techblox_Data\Managed\StringFormatter.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Svelto.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Svelto.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Svelto.ECS.dll
- ..\..\ref_TB\Techblox_Data\Managed\Svelto.ECS.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Svelto.ECS.GUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Svelto.ECS.GUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Svelto.Services.dll
- ..\..\ref_TB\Techblox_Data\Managed\Svelto.Services.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Svelto.Tasks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Svelto.Tasks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AdditionalParts.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AdditionalParts.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AntiAFKServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AntiAFKServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Anticheat.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Anticheat.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Anticheat.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Anticheat.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AtmosphereBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AtmosphereBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AudioBlocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AudioBlocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AudioBlocksClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AudioBlocksClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.AutoForward.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.AutoForward.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Backend.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Backend.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.BitBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.BitBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.BlockColours.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.BlockColours.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.BlockLabels.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.BlockLabels.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.BlockLabelsServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.BlockLabelsServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Blocks.Connections.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Blocks.Connections.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Blocks.LightBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Blocks.LightBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Building.Rules.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Building.Rules.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Building.Shift.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Building.Shift.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.BuildingDrone.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.BuildingDrone.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Camera.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Camera.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CentreHUDBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CentreHUDBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CentreHUDGUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CentreHUDGUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CharacterDamage.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CharacterDamage.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CharacterDamage.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CharacterDamage.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CharacterRespawnScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CharacterRespawnScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CheckpointBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CheckpointBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CheckpointBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CheckpointBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Common.Audio.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Common.Audio.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ConstantBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ConstantBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ConstantBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ConstantBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ContextSensitiveTextHint.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ContextSensitiveTextHint.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CounterBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CounterBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.CounterBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.CounterBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.DamageRbScoreBlockServerServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.DamageRbScoreBlockServerServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.DirectionalDamageVingette.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.DirectionalDamageVingette.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.DistanceSensorBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.DistanceSensorBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ECSResourceManagers.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ECSResourceManagers.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.EngineBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.EngineBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.BuildingEnvironment.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.BuildingEnvironment.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.SimulationWorldEnvironment.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.EnvironmentBlocks.SimulationWorldEnvironment.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.GameState.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.GameState.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.GameState.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.GameState.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.PlayerGameplayDetails.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.PlayerGameplayDetails.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Score.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Score.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Spawning.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Spawning.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Teams.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.Teams.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.WorldResetting.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.WorldResetting.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.WorldResetting.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Gameplay.WorldResetting.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GameSelection.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GameSelection.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Building.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Building.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.BuildRules.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.BuildRules.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.CharacterHealthFeedback.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.CharacterHealthFeedback.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Collection.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Collection.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Controls.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Controls.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.GamePortal.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.GamePortal.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.GeneralSettingsScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.GeneralSettingsScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Hotbar.Landscapes.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Hotbar.Landscapes.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Hotbar.Materials.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Hotbar.Materials.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Landscapes.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Landscapes.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Materials.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Inventory.Materials.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.LoadingBar.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.LoadingBar.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Login.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Login.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MachineReconstructTimer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MachineReconstructTimer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MainGame.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MainGame.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MainGame.StateMachine.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MainGame.StateMachine.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MyGamesScreen.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.MyGamesScreen.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.PauseMenu.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.PauseMenu.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Progression.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.Progression.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.TabsBar.Landscapes.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.TabsBar.Landscapes.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.TabsBar.Materials.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.TabsBar.Materials.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.GUI.UsernameDisplay.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.GUI.UsernameDisplay.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.InputCapture.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.InputCapture.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.JetBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.JetBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.JetBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.JetBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.KillScoreBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.KillScoreBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.MachineProcessingService.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.MachineProcessingService.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.MachineSimulationPreprocessing.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.MachineSimulationPreprocessing.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.MachineSpawning.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.MachineSpawning.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.MachineVelocityCameraEffects.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.MachineVelocityCameraEffects.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Matchmaking.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Matchmaking.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Monitoring.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Monitoring.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Multiplayer.UsernameMessages.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Multiplayer.UsernameMessages.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ObjectIDBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ObjectIDBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ObjectIDBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ObjectIDBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Particles.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Particles.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.PlayUX.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.PlayUX.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Pointer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Pointer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ProceduralReflectionProbes.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ProceduralReflectionProbes.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.DOTS.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.DOTS.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.GPUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.GPUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.Unity.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Rendering.Unity.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SaveGamesConversion.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SaveGamesConversion.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ScoreHUDBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ScoreHUDBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ScoreHUDGUI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ScoreHUDGUI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ScorePickupBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ScorePickupBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ScorePickupBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ScorePickupBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Anticheat.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Anticheat.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Eos.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Eos.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Eos.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Eos.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.GameDetails.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.GameDetails.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.LocalPreferences.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.LocalPreferences.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Matchmaking.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Matchmaking.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Metrics.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Metrics.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Progression.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Progression.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Progression.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Progression.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Storage.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Storage.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Users.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Users.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Services.Users.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Services.Users.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ServoBlocksClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ServoBlocksClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ServoBlocksServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ServoBlocksServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.ServosServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.ServosServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SignalHandling.Audio.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SignalHandling.Audio.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SignalHandling.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SignalHandling.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Simulation.Clusters.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Simulation.Clusters.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SpawnBlock.Client.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SpawnBlock.Client.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SpawnBlock.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SpawnBlock.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.StabilizerBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.StabilizerBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.StabilizerBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.StabilizerBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.SwitchAnimation.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.SwitchAnimation.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TeamScoreBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TeamScoreBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TeamScoreBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TeamScoreBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterGUI.TechPointPoolHUD.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterGUI.TechPointPoolHUD.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterGUI.TechpointRewardPanel.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TechpointConverterGUI.TechpointRewardPanel.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TextBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TextBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TimerBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TimerBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.TriggerBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.TriggerBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Tweaks.Validation.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Tweaks.Validation.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.VFXBlockClient.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.VFXBlockClient.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.VFXBlockServer.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.VFXBlockServer.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.VisualEffects.VFXGraph.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.VisualEffects.VFXGraph.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Aiming.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Aiming.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.DisablerBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.DisablerBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Projectiles.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Projectiles.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Projectiles.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Projectiles.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Server.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Weapons.Server.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.WheelFX.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.WheelFX.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.WheelRigBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.WheelRigBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.Wheels.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.Wheels.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.WorldEditor.Spawning.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.WorldEditor.Spawning.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.WorldEditor.TestPlayers.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.WorldEditor.TestPlayers.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Techblox.WorldResetterBlock.dll
- ..\..\ref_TB\Techblox_Data\Managed\Techblox.WorldResetterBlock.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UniTask.Addressables.dll
- ..\..\ref_TB\Techblox_Data\Managed\UniTask.Addressables.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UniTask.dll
- ..\..\ref_TB\Techblox_Data\Managed\UniTask.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UniTask.DOTween.dll
- ..\..\ref_TB\Techblox_Data\Managed\UniTask.DOTween.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UniTask.Linq.dll
- ..\..\ref_TB\Techblox_Data\Managed\UniTask.Linq.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UniTask.TextMeshPro.dll
- ..\..\ref_TB\Techblox_Data\Managed\UniTask.TextMeshPro.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Addressables.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Addressables.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Burst.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Burst.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Burst.Unsafe.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Burst.Unsafe.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Collections.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Collections.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Deformations.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Deformations.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Entities.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Entities.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Entities.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Entities.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.InternalAPIEngineBridge.012.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.InternalAPIEngineBridge.012.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Jobs.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Jobs.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.Extensions.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.Extensions.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.Extensions.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Mathematics.Extensions.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.MemoryProfiler.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.MemoryProfiler.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Physics.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Physics.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Physics.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Physics.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Platforms.Common.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Platforms.Common.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Profiling.Core.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Profiling.Core.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Properties.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Properties.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Properties.Reflection.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Properties.Reflection.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Properties.UI.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Properties.UI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Recorder.Base.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Recorder.Base.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Recorder.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Recorder.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Rendering.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Rendering.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.ResourceManager.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.ResourceManager.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Scenes.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Scenes.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.ScriptableBuildPipeline.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.ScriptableBuildPipeline.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Serialization.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Serialization.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.TextMeshPro.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.TextMeshPro.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Timeline.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Timeline.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Transforms.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Transforms.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.Transforms.Hybrid.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.Transforms.Hybrid.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\Unity.VisualEffectGraph.Runtime.dll
- ..\..\ref_TB\Techblox_Data\Managed\Unity.VisualEffectGraph.Runtime.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AccessibilityModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AccessibilityModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AIModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AIModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AndroidJNIModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AndroidJNIModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AnimationModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AnimationModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ARModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ARModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AssetBundleModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AssetBundleModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.AudioModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.AudioModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ClothModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ClothModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ClusterInputModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ClusterInputModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ClusterRendererModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ClusterRendererModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.CoreModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.CoreModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.CrashReportingModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.CrashReportingModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.DirectorModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.DirectorModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.DSPGraphModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.DSPGraphModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.GameCenterModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.GameCenterModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.GIModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.GIModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.GridModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.GridModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.HotReloadModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.HotReloadModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ImageConversionModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ImageConversionModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.IMGUIModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.IMGUIModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.InputLegacyModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.InputLegacyModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.InputModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.InputModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.JSONSerializeModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.JSONSerializeModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.LocalizationModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.LocalizationModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.NVIDIAModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.NVIDIAModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ParticleSystemModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ParticleSystemModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.PerformanceReportingModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.PerformanceReportingModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.Physics2DModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.Physics2DModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.PhysicsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.PhysicsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ProfilerModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ProfilerModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.ScreenCaptureModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.ScreenCaptureModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.SharedInternalsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.SharedInternalsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.SpriteMaskModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.SpriteMaskModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.SpriteShapeModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.SpriteShapeModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.StreamingModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.StreamingModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.SubstanceModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.SubstanceModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.SubsystemsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.SubsystemsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TerrainModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TerrainModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TerrainPhysicsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TextRenderingModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TextRenderingModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TilemapModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TilemapModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.TLSModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.TLSModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UI.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UI.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UIElementsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UIElementsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UIElementsNativeModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UIElementsNativeModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UIModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UIModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UmbraModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UmbraModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UNETModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UNETModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityAnalyticsModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityConnectModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityConnectModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityCurlModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityCurlModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityTestProtocolModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.VehiclesModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.VehiclesModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.VFXModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.VFXModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.VideoModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.VideoModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.VirtualTexturingModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.VirtualTexturingModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.VRModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.VRModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.WindModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.WindModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\UnityEngine.XRModule.dll
- ..\..\ref_TB\Techblox_Data\Managed\UnityEngine.XRModule.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\VisualProfiler.dll
- ..\..\ref_TB\Techblox_Data\Managed\VisualProfiler.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\websocket-sharp.dll
- ..\..\ref_TB\Techblox_Data\Managed\websocket-sharp.dll
-
-
- ..\ref_TB\Techblox_Data\Managed\ZFBrowser.dll
- ..\..\ref_TB\Techblox_Data\Managed\ZFBrowser.dll
-
-
-
-
\ No newline at end of file
diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs
deleted file mode 100644
index 8d870e3..0000000
--- a/CodeGenerator/Program.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-using System.Collections.Generic;
-using HarmonyLib;
-using RobocraftX.Blocks;
-using RobocraftX.Common;
-using RobocraftX.GroupTags;
-using RobocraftX.PilotSeat;
-using Svelto.ECS;
-using Techblox.EngineBlock;
-using Techblox.ServoBlocksServer;
-using Techblox.WheelRigBlock;
-
-namespace CodeGenerator
-{
- internal class Program
- {
- public static void Main(string[] args)
- {
- GenerateBlockClasses();
- }
-
- private static void GenerateBlockClasses()
- {
- var bcg = new BlockClassGenerator();
- bcg.Generate("Engine", null, new Dictionary
- {
- { "engineOn", "On" }
- }, AccessTools.TypeByName("Techblox.EngineBlock.EngineBlockComponent"), // Simulation time properties
- typeof(EngineBlockTweakableComponent), typeof(EngineBlockReadonlyComponent));
- bcg.Generate("DampedSpring", "DAMPEDSPRING_BLOCK_GROUP", new Dictionary
- {
- {"maxExtent", "MaxExtension"}
- },
- typeof(TweakableJointDampingComponent), typeof(DampedSpringReadOnlyStruct));
- bcg.Generate("LogicGate", "LOGIC_BLOCK_GROUP");
- bcg.Generate("Servo", types: typeof(ServoReadOnlyTweakableComponent), renames: new Dictionary
- {
- {"minDeviation", "MinimumAngle"},
- {"maxDeviation", "MaximumAngle"},
- {"servoVelocity", "MaximumForce"}
- });
- bcg.Generate("WheelRig", "WHEELRIG_BLOCK_BUILD_GROUP", null,
- typeof(WheelRigTweakableStruct), typeof(WheelRigReadOnlyStruct),
- typeof(WheelRigSteerableTweakableStruct), typeof(WheelRigSteerableReadOnlyStruct));
- bcg.Generate("Seat", "RobocraftX.PilotSeat.SeatGroups.PILOTSEAT_BLOCK_BUILD_GROUP", null, typeof(SeatFollowCamComponent), typeof(SeatReadOnlySettingsComponent));
- bcg.Generate("Piston", null, new Dictionary
- {
- {"pistonVelocity", "MaximumForce"}
- }, typeof(PistonReadOnlyStruct));
- bcg.Generate("Motor", null, null, typeof(MotorReadOnlyStruct));
- //bcg.Generate("ObjectID", "ObjectIDBlockExclusiveGroups.OBJECT_ID_BLOCK_GROUP", null, typeof(ObjectIDTweakableComponent));
- }
- }
-}
\ No newline at end of file
diff --git a/CodeGenerator/packages.config b/CodeGenerator/packages.config
deleted file mode 100644
index aeba8bb..0000000
--- a/CodeGenerator/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/GamecraftModdingAPI.sln b/GamecraftModdingAPI.sln
new file mode 100644
index 0000000..fe00440
--- /dev/null
+++ b/GamecraftModdingAPI.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29411.108
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GamecraftModdingAPI", "GamecraftModdingAPI\GamecraftModdingAPI.csproj", "{7FD5A7D8-4F3E-426A-B07D-7DC70442A4DF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Automation", "Automation\Automation.csproj", "{1DF6E538-4DA4-4708-A567-781AF788921A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7FD5A7D8-4F3E-426A-B07D-7DC70442A4DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7FD5A7D8-4F3E-426A-B07D-7DC70442A4DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7FD5A7D8-4F3E-426A-B07D-7DC70442A4DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7FD5A7D8-4F3E-426A-B07D-7DC70442A4DF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1DF6E538-4DA4-4708-A567-781AF788921A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1DF6E538-4DA4-4708-A567-781AF788921A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1DF6E538-4DA4-4708-A567-781AF788921A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1DF6E538-4DA4-4708-A567-781AF788921A}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {72FB94D0-6C50-475B-81E0-C94C7D7A2A17}
+ EndGlobalSection
+EndGlobal
diff --git a/GamecraftModdingAPI/Blocks/BlockColors.cs b/GamecraftModdingAPI/Blocks/BlockColors.cs
new file mode 100644
index 0000000..146bcbf
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/BlockColors.cs
@@ -0,0 +1,20 @@
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Preset block colours
+ ///
+ public enum BlockColors
+ {
+ Default = byte.MaxValue,
+ White = 0,
+ Pink,
+ Purple,
+ Blue,
+ Aqua,
+ Green,
+ Lime,
+ Yellow,
+ Orange,
+ Red
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/BlockIDs.cs b/GamecraftModdingAPI/Blocks/BlockIDs.cs
new file mode 100644
index 0000000..1a7a77a
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/BlockIDs.cs
@@ -0,0 +1,230 @@
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Possible block types
+ ///
+ public enum BlockIDs
+ {
+ AluminiumCube,
+ AxleS,
+ HingeS = 3,
+ MotorS,
+ HingeM,
+ MotorM,
+ TyreM,
+ AxleM,
+ IronCube,
+ RubberCube,
+ OiledCube,
+ AluminiumConeSegment, //12
+ AluminiumCorner,
+ AluminiumRoundedCorner,
+ AluminiumSlicedCube,
+ AluminiumRoundedSlicedCube,
+ AluminiumCylinder,
+ AluminiumPyramidSegment,
+ AluminiumSlope,
+ AluminiumRoundedSlope,
+ AluminiumSphere,
+ RubberConeSegment, //22
+ RubberCorner,
+ RubberRoundedCorner,
+ RubberSlicedCube,
+ RubberRoundedSlicedCube,
+ RubberCylinder,
+ RubberPyramidSegment,
+ RubberSlope,
+ RubberRoundedSlope,
+ RubberSphere,
+ OiledConeSegment, //32
+ OiledCorner,
+ OiledRoundedCorner,
+ OiledSlicedCube,
+ OiledRoundedSlicedCube,
+ OiledCylinder,
+ OiledPyramidSegment,
+ OiledSlope,
+ OiledRoundedSlope,
+ OiledSphere,
+ IronConeSegment, //42
+ IronCorner,
+ IronRoundedCorner,
+ IronSlicedCube,
+ IronRoundedSlicedCube,
+ IronCylinder,
+ IronPyramidSegment,
+ IronSlope,
+ IronRoundedSlope,
+ IronSphere,
+ GlassCube, //52
+ GlassSlicedCube,
+ GlassSlope,
+ GlassCorner,
+ GlassPyramidSegment,
+ GlassRoundedSlicedCube,
+ GlassRoundedSlope,
+ GlassRoundedCorner,
+ GlassConeSegment,
+ GlassCylinder,
+ GlassSphere,
+ Lever, //63 - two IDs skipped
+ PlayerSpawn = 66, //Crashes without special handling
+ SmallSpawn,
+ MediumSpawn,
+ LargeSpawn,
+ BallJoint,
+ UniversalJoint,
+ ServoAxle,
+ ServoHinge,
+ StepperAxle,
+ StepperHinge,
+ TelescopicJoint,
+ DampedSpring,
+ ServoPiston,
+ StepperPiston,
+ PneumaticPiston,
+ PneumaticHinge,
+ PneumaticAxle, //82
+ PilotSeat = 90, //Might crash
+ PassengerSeat,
+ PilotControls,
+ GrassCube,
+ DirtCube,
+ GrassConeSegment,
+ GrassCorner,
+ GrassRoundedCorner,
+ GrassSlicedCube,
+ GrassRoundedSlicedCube,
+ GrassPyramidSegment,
+ GrassSlope,
+ GrassRoundedSlope,
+ DirtConeSegment,
+ DirtCorner,
+ DirtRoundedCorner,
+ DirtSlicedCube,
+ DirtRoundedSlicedCube,
+ DirtPyramidSegment,
+ DirtSlope,
+ DirtRoundedSlope,
+ RubberHemisphere,
+ AluminiumHemisphere,
+ GrassInnerCornerBulged,
+ DirtInnerCornerBulged,
+ IronHemisphere,
+ OiledHemisphere,
+ GlassHemisphere,
+ TyreS,
+ ThreeWaySwitch,
+ Dial, //120
+ CharacterOnEnterTrigger, //Probably crashes
+ CharacterOnLeaveTrigger,
+ CharacterOnStayTrigger,
+ ObjectOnEnterTrigger,
+ ObjectOnLeaveTrigger,
+ ObjectOnStayTrigger,
+ Button,
+ Switch,
+ TextBlock, //Brings up a screen
+ ConsoleBlock, //Brings up a screen
+ Door,
+ GlassDoor,
+ PoweredDoor,
+ PoweredGlassDoor,
+ AluminiumTubeCorner,
+ IronTubeCorner,
+ WoodCube,
+ WoodSlicedCube,
+ WoodSlope,
+ WoodCorner,
+ WoodPyramidSegment,
+ WoodConeSegment,
+ WoodRoundedSlicedCube,
+ WoodRoundedSlope,
+ WoodRoundedCorner,
+ WoodCylinder,
+ WoodHemisphere,
+ WoodSphere,
+ BrickCube, //149
+ BrickSlicedCube = 151,
+ BrickSlope,
+ BrickCorner,
+ ConcreteCube,
+ ConcreteSlicedCube,
+ ConcreteSlope,
+ ConcreteCorner,
+ RoadCarTyre,
+ OffRoadCarTyre,
+ RacingCarTyre,
+ BicycleTyre,
+ FrontBikeTyre,
+ RearBikeTyre,
+ ChopperBikeTyre,
+ TractorTyre,
+ MonsterTruckTyre,
+ MotocrossBikeTyre,
+ CartTyre, //168
+ ObjectIdentifier,
+ ANDLogicBlock,
+ NANDLogicBlock,
+ NORLogicBlock,
+ NOTLogicBlock,
+ ORLogicBlock,
+ XNORLogicBlock,
+ XORLogicBlock,
+ AbsoluteMathsBlock,
+ AdderMathsBlock,
+ DividerMathsBlock,
+ SignMathsBlock, //180
+ MaxMathsBlock,
+ MinMathsBlock,
+ MultiplierMathsBlock,
+ SubtractorMathsBlock,
+ SimpleConnector,
+ MeanMathsBlock,
+ Bit,
+ Counter,
+ Timer,
+ ObjectFilter,
+ PlayerFilter,
+ TeamFilter,
+ Number2Text, //193
+ BeachTree1 = 200,
+ BeachTree2,
+ BeachTree3,
+ Rock1,
+ Rock2,
+ Rock3,
+ Rock4,
+ BirchTree1,
+ BirchTree2,
+ BirchTree3,
+ PineTree1,
+ PineTree2,
+ PineTree3,
+ Flower1,
+ Flower2,
+ Flower3,
+ Shrub1,
+ Shrub2,
+ Shrub3,
+ CliffCube,
+ CliffSlicedCorner,
+ CliffCornerA,
+ CliffCornerB,
+ CliffSlopeA,
+ CliffSlopeB,
+ GrassEdge,
+ GrassEdgeInnerCorner,
+ GrassEdgeCorner,
+ GrassEdgeSlope,
+ CentreHUD,
+ ObjectiveHUD,
+ GameStatsHUD, //231
+ Mover = 250,
+ Rotator,
+ MovementDampener,
+ RotationDampener,
+ AdvancedMover,
+ AdvancedRotator
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/BlockIdentifiers.cs b/GamecraftModdingAPI/Blocks/BlockIdentifiers.cs
new file mode 100644
index 0000000..13bafce
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/BlockIdentifiers.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Reflection;
+
+using Svelto.ECS;
+using RobocraftX.Common;
+
+using Harmony;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// ExclusiveGroups and IDs used with blocks
+ ///
+ public static class BlockIdentifiers
+ {
+ ///
+ /// Blocks placed by the player
+ ///
+ public static ExclusiveGroup OWNED_BLOCKS { get { return CommonExclusiveGroups.OWNED_BLOCKS_GROUP; } }
+
+ ///
+ /// Extra parts used in functional blocks
+ ///
+ public static ExclusiveGroup FUNCTIONAL_BLOCK_PARTS { get { return CommonExclusiveGroups.FUNCTIONAL_BLOCK_PART_GROUP; } }
+
+ ///
+ /// Blocks which are disabled in Simulation mode
+ ///
+ public static ExclusiveGroup SIM_BLOCKS_DISABLED { get { return CommonExclusiveGroups.BLOCKS_DISABLED_IN_SIM_GROUP; } }
+
+ public static ExclusiveGroup SPAWN_POINTS { get { return CommonExclusiveGroups.SPAWN_POINTS_GROUP; } }
+
+ public static ExclusiveGroup SPAWN_POINTS_DISABLED { get { return CommonExclusiveGroups.SPAWN_POINTS_DISABLED_GROUP; } }
+
+ ///
+ /// The ID of the most recently placed block
+ ///
+ public static uint LatestBlockID {
+ get
+ {
+ return ((uint) AccessTools.Field(typeof(CommonExclusiveGroups), "_nextBlockEntityID").GetValue(null)) - 1;
+ }
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/BlockUtility.cs b/GamecraftModdingAPI/Blocks/BlockUtility.cs
new file mode 100644
index 0000000..342ee73
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/BlockUtility.cs
@@ -0,0 +1,31 @@
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Character.Camera;
+using RobocraftX.Character.Factories;
+using Svelto.ECS;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ public class BlockUtility
+ {
+ ///
+ /// Returns the block the player is currently looking at.
+ ///
+ /// The player's ID
+ /// The entities DB
+ /// The maximum distance from the player (default is the player's building reach)
+ /// The block's EGID or null if not found
+ public static EGID? GetBlockLookedAt(uint playerId, EntitiesDB entitiesDB, float maxDistance = -1f)
+ {
+ if (!entitiesDB.TryQueryMappedEntities(
+ CameraExclusiveGroups.CameraGroup, out var mapper))
+ return null;
+ mapper.TryGetEntity(playerId, out CharacterCameraRayCastEntityStruct rayCast);
+ float distance = maxDistance < 0
+ ? GhostBlockUtils.GetBuildInteractionDistance(entitiesDB, rayCast)
+ : maxDistance;
+ if (rayCast.hit && rayCast.distance <= distance)
+ return rayCast.hitEgid;
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/Movement.cs b/GamecraftModdingAPI/Blocks/Movement.cs
new file mode 100644
index 0000000..28575a9
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Movement.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Unity.Mathematics;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Common block movement operations.
+ /// The functionality of this class only works in build mode.
+ ///
+ public static class Movement
+ {
+ private static MovementEngine movementEngine = new MovementEngine();
+
+ ///
+ /// Move a single block by a specific (x,y,z) amount (offset).
+ /// The moved block will remain connected to the blocks it was touching before it was moved.
+ /// The block's placement grid and collision box are also moved.
+ ///
+ /// The block's id
+ /// The movement amount (x,y,z)
+ /// Whether the operation was successful
+ public static bool MoveBlock(uint id, float3 vector)
+ {
+ if (movementEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsBuildMode())
+ {
+ movementEngine.MoveBlock(id, vector);
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// Move all connected blocks by a specific (x,y,z) amount (offset).
+ /// The moved blocks will remain connected to the block they're touching.
+ /// All of the block's placement grids and collision boxes are also moved.
+ /// This is equivalent to calling MoveBlock() for every connected block.
+ ///
+ /// The starting block's id
+ /// The movement amount (x,y,z)
+ /// Whether the operation was successful
+ public static bool MoveConnectedBlocks(uint id, float3 vector)
+ {
+ if (movementEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsBuildMode())
+ {
+ movementEngine.MoveConnectedBlocks(id, vector);
+ return true;
+ }
+ return false;
+ }
+
+ public static void Init()
+ {
+ GamecraftModdingAPI.Utility.GameEngineManager.AddGameEngine(movementEngine);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/MovementEngine.cs b/GamecraftModdingAPI/Blocks/MovementEngine.cs
new file mode 100644
index 0000000..ab4eaa4
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/MovementEngine.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using RobocraftX;
+using RobocraftX.Blocks;
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Common;
+using RobocraftX.Multiplayer;
+using RobocraftX.SimulationModeState;
+using RobocraftX.UECS;
+using Unity.Entities;
+using Svelto.Context;
+using Svelto.ECS;
+using Svelto.ECS.EntityStructs;
+using Unity.Transforms;
+using Unity.Mathematics;
+using UnityEngine;
+
+using GamecraftModdingAPI.Utility;
+using Svelto.DataStructures;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Engine which executes block movement actions
+ ///
+ public class MovementEngine : IApiEngine
+ {
+ public string Name { get; } = "GamecraftModdingAPIMovementGameEngine";
+
+ public EntitiesDB entitiesDB { set; private get; }
+
+ public bool IsInGame = false;
+
+ public void Dispose()
+ {
+ IsInGame = false;
+ }
+
+ public void Ready()
+ {
+ IsInGame = true;
+ }
+
+ // implementations for Movement static class
+
+ public float3 MoveBlock(uint blockID, float3 vector)
+ {
+ ref PositionEntityStruct posStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ // main (persistent) position
+ posStruct.position += vector;
+ // placement grid position
+ gridStruct.position += vector;
+ // rendered position
+ transStruct.position += vector;
+ // collision position
+ FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
+ {
+ Value = posStruct.position
+ });
+ return posStruct.position;
+ }
+
+ public float3 MoveConnectedBlocks(uint blockID, float3 vector)
+ {
+ Stack cubeStack = new Stack();
+ FasterList cubesToMove = new FasterList();
+ ConnectedCubesUtility.TreeTraversal.GetConnectedCubes(entitiesDB, blockID, cubeStack, cubesToMove, (in GridConnectionsEntityStruct g) => { return false; });
+ for (int i = 0; i < cubesToMove.count; i++)
+ {
+ MoveBlock(cubesToMove[i], vector);
+ entitiesDB.QueryEntity(cubesToMove[i], CommonExclusiveGroups.OWNED_BLOCKS_GROUP).isProcessed = false;
+ }
+ return this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP).position;
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/Placement.cs b/GamecraftModdingAPI/Blocks/Placement.cs
new file mode 100644
index 0000000..c029ebb
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Placement.cs
@@ -0,0 +1,55 @@
+using System;
+
+using Unity.Mathematics;
+using Svelto.ECS;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Common block placement operations.
+ /// The functionality in this class is for build mode.
+ ///
+ public static class Placement
+ {
+ private static PlacementEngine placementEngine = new PlacementEngine();
+
+ ///
+ /// Place a new block at the given position. If scaled, position means the center of the block. The default block size is 0.2 in terms of position.
+ /// Place blocks next to each other to connect them.
+ /// The placed block will be a complete block with a placement grid and collision which will be saved along with the game.
+ ///
+ /// The block's type
+ /// The block's color
+ /// The block color's darkness (0-9) - 0 is default color
+ /// The block's position in the grid - default block size is 0.2
+ /// The block's rotation in degrees
+ /// The block's uniform scale - default scale is 1 (with 0.2 width)
+ /// The block's non-uniform scale - 0 means is used
+ /// The player who placed the block
+ /// The placed block's ID or null if failed
+ public static EGID? PlaceBlock(BlockIDs block, float3 position,
+ float3 rotation = default, BlockColors color = BlockColors.Default, byte darkness = 0,
+ int uscale = 1, float3 scale = default, uint playerId = 0)
+ {
+ if (placementEngine.IsInGame && GameState.IsBuildMode())
+ {
+ try
+ {
+ return placementEngine.PlaceBlock(block, color, darkness, position, uscale, scale, playerId, rotation);
+ }
+ catch (Exception e)
+ {
+ Logging.MetaDebugLog(e);
+ }
+ }
+ return null;
+ }
+
+ public static void Init()
+ {
+ GameEngineManager.AddGameEngine(placementEngine);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/PlacementEngine.cs b/GamecraftModdingAPI/Blocks/PlacementEngine.cs
new file mode 100644
index 0000000..0b9293c
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/PlacementEngine.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Reflection;
+
+using DataLoader;
+using Harmony;
+using RobocraftX.Blocks;
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Blocks.Scaling;
+using RobocraftX.Character;
+using RobocraftX.CommandLine.Custom;
+using RobocraftX.Common;
+using RobocraftX.Common.Input;
+using RobocraftX.Common.Utilities;
+using RobocraftX.CR.MachineEditing;
+using RobocraftX.StateSync;
+using Svelto.ECS;
+using Svelto.ECS.EntityStructs;
+using Unity.Jobs;
+using Unity.Mathematics;
+using UnityEngine;
+using uREPL;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Engine which executes block placement actions
+ ///
+ public class PlacementEngine : IApiEngine
+ {
+ public bool IsInGame = false;
+
+ public void Dispose()
+ {
+ IsInGame = false;
+ }
+
+ public void Ready()
+ {
+ IsInGame = true;
+ }
+
+ public EntitiesDB entitiesDB { get; set; }
+ private static BlockEntityFactory _blockEntityFactory; //Injected from PlaceBlockEngine
+
+ public EGID PlaceBlock(BlockIDs block, BlockColors color, byte darkness, float3 position, int uscale,
+ float3 scale, uint playerId, float3 rotation)
+ { //It appears that only the non-uniform scale has any visible effect, but if that's not given here it will be set to the uniform one
+ if (darkness > 9)
+ throw new Exception("That is too dark. Make sure to use 0-9 as darkness. (0 is default.)");
+ return BuildBlock((ushort) block, (byte) (color + darkness * 10), position, uscale, scale, rotation, playerId);
+ }
+
+ private EGID BuildBlock(ushort block, byte color, float3 position, int uscale, float3 scale, float3 rot, uint playerId)
+ {
+ if (_blockEntityFactory == null)
+ throw new Exception("The factory is null.");
+ if (uscale < 1)
+ throw new Exception("Scale needs to be at least 1");
+ if (scale.x < 4e-5) scale.x = uscale;
+ if (scale.y < 4e-5) scale.y = uscale;
+ if (scale.z < 4e-5) scale.z = uscale;
+ uint dbid = block;
+ if (!PrefabsID.DBIDMAP.ContainsKey(dbid))
+ throw new Exception("Block with ID " + dbid + " not found!");
+ //RobocraftX.CR.MachineEditing.PlaceBlockEngine
+ ScalingEntityStruct scaling = new ScalingEntityStruct {scale = scale};
+ Quaternion rotQ = Quaternion.Euler(rot);
+ RotationEntityStruct rotation = new RotationEntityStruct {rotation = rotQ};
+ GridRotationStruct gridRotation = new GridRotationStruct
+ {position = position, rotation = rotQ};
+ CubeCategoryStruct category = new CubeCategoryStruct
+ {category = CubeCategory.General, type = CubeType.Block};
+ DBEntityStruct dbEntity = new DBEntityStruct {DBID = dbid};
+ BlockPlacementScaleEntityStruct placementScale = new BlockPlacementScaleEntityStruct
+ {
+ blockPlacementHeight = uscale, blockPlacementWidth = uscale, desiredScaleFactor = uscale,
+ snapGridScale = uscale,
+ unitSnapOffset = 0, isUsingUnitSize = true
+ };
+ EquippedColourStruct colour = new EquippedColourStruct {indexInPalette = color};
+ EGID newBlockID;
+ switch (category.category)
+ {
+ case CubeCategory.SpawnPoint:
+ case CubeCategory.BuildingSpawnPoint:
+ newBlockID = MachineEditingGroups.NewSpawnPointBlockID;
+ break;
+ default:
+ newBlockID = MachineEditingGroups.NewBlockID;
+ break;
+ }
+
+ EntityStructInitializer
+ structInitializer =
+ _blockEntityFactory.Build(newBlockID, dbid); //The ghost block index is only used for triggers
+ if (colour.indexInPalette != byte.MaxValue)
+ structInitializer.Init(new ColourParameterEntityStruct
+ {
+ indexInPalette = colour.indexInPalette,
+ needsUpdate = true
+ });
+ uint prefabId = PrefabsID.GetPrefabId(dbid, 0);
+ structInitializer.Init(new GFXPrefabEntityStructGPUI(prefabId));
+ structInitializer.Init(new PhysicsPrefabEntityStruct(prefabId));
+ structInitializer.Init(dbEntity);
+ structInitializer.Init(new PositionEntityStruct {position = position});
+ structInitializer.Init(rotation);
+ structInitializer.Init(scaling);
+ structInitializer.Init(gridRotation);
+ structInitializer.Init(new UniformBlockScaleEntityStruct
+ {
+ scaleFactor = placementScale.desiredScaleFactor
+ });
+ structInitializer.Init(new BlockPlacementInfoStruct()
+ {
+ loadedFromDisk = false,
+ placedBy = playerId
+ });
+ PrimaryRotationUtility.InitialisePrimaryDirection(rotation.rotation, ref structInitializer);
+ EGID playerEGID = new EGID(playerId, CharacterExclusiveGroups.OnFootGroup);
+ ref PickedBlockExtraDataStruct pickedBlock = ref entitiesDB.QueryEntity(playerEGID);
+ pickedBlock.placedBlockEntityID = playerEGID;
+ pickedBlock.placedBlockWasAPickedBlock = false;
+ return newBlockID;
+ }
+
+ public string Name { get; } = "GamecraftModdingAPIPlacementGameEngine";
+
+ [HarmonyPatch]
+ public class FactoryObtainerPatch
+ {
+ static void Postfix(BlockEntityFactory blockEntityFactory)
+ {
+ _blockEntityFactory = blockEntityFactory;
+ Logging.MetaDebugLog("Block entity factory injected.");
+ }
+
+ static MethodBase TargetMethod(HarmonyInstance instance)
+ {
+ return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.PlaceBlockEngine").GetConstructors()[0];
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/Removal.cs b/GamecraftModdingAPI/Blocks/Removal.cs
new file mode 100644
index 0000000..0bb54fb
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Removal.cs
@@ -0,0 +1,28 @@
+using Svelto.ECS;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ public class Removal
+ {
+ private static RemovalEngine _removalEngine = new RemovalEngine();
+
+ ///
+ /// Removes the block with the given ID. Returns false if the block doesn't exist or the game isn't in build mode.
+ ///
+ /// The block to remove
+ /// Whether the block was successfully removed
+ public static bool RemoveBlock(EGID targetBlock)
+ {
+ if (GameState.IsBuildMode())
+ return _removalEngine.RemoveBlock(targetBlock);
+ return false;
+ }
+
+ public static void Init()
+ {
+ GameEngineManager.AddGameEngine(_removalEngine);
+ }
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/RemovalEngine.cs b/GamecraftModdingAPI/Blocks/RemovalEngine.cs
new file mode 100644
index 0000000..41e3c03
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/RemovalEngine.cs
@@ -0,0 +1,74 @@
+using System.Reflection;
+
+using Harmony;
+using RobocraftX.Blocks;
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Character.Camera;
+using RobocraftX.Character.Factories;
+using RobocraftX.Common;
+using RobocraftX.Players;
+using Svelto.ECS;
+using uREPL;
+
+using GamecraftModdingAPI.Commands;
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ public class RemovalEngine : IApiEngine
+ {
+ private static IEntityFunctions _entityFunctions;
+ private static MachineGraphConnectionEntityFactory _connectionFactory;
+
+ public bool RemoveBlock(EGID target)
+ {
+ if (!entitiesDB.Exists(target))
+ return false;
+ var connections = entitiesDB.QueryEntity(target);
+ for (int i = connections.connections.Length - 1; i >= 0; i--)
+ _connectionFactory.RemoveConnection(connections, i, entitiesDB);
+ _entityFunctions.RemoveEntity(target);
+ return true;
+ }
+
+ public void Ready()
+ {
+ /*CommandManager.AddCommand(new SimpleCustomCommandEngine(() =>
+ {
+ var block = BlockUtility.GetBlockLookedAt(LocalPlayerIDUtility.GetLocalPlayerID(entitiesDB), entitiesDB);
+ if (block.HasValue)
+ {
+ RemoveBlock(block.Value);
+ Log.Output("Removed block.");
+ }
+ else
+ Log.Output("No block found where you're looking at.");
+ }, "removeCube", "Removes the cube you're looking at."));*/
+ }
+
+ public EntitiesDB entitiesDB { get; set; }
+
+ public void Dispose()
+ {
+ }
+
+ public string Name { get; } = "GamecraftModdingAPIRemovalGameEngine";
+
+ [HarmonyPatch]
+ public class FactoryObtainerPatch
+ {
+ static void Postfix(IEntityFunctions entityFunctions,
+ MachineGraphConnectionEntityFactory machineGraphConnectionEntityFactory)
+ {
+ _entityFunctions = entityFunctions;
+ _connectionFactory = machineGraphConnectionEntityFactory;
+ Logging.MetaDebugLog("Requirements injected.");
+ }
+
+ static MethodBase TargetMethod(HarmonyInstance instance)
+ {
+ return AccessTools.TypeByName("RobocraftX.CR.MachineEditing.RemoveBlockEngine").GetConstructors()[0];
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/GamecraftModdingAPI/Blocks/Rotation.cs b/GamecraftModdingAPI/Blocks/Rotation.cs
new file mode 100644
index 0000000..b881cdb
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Rotation.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Unity.Mathematics;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Common block rotation operations.
+ /// The functionality in this class is not completely implemented and will only work in build mode.
+ ///
+ public static class Rotation
+ {
+ private static RotationEngine rotationEngine = new RotationEngine();
+
+ ///
+ /// Rotate a single block by a specific amount in degrees.
+ /// This not destroy inter-block connections, so neighbouring blocks will remain attached despite appearances.
+ /// The cube placement grid and collision are also rotated.
+ ///
+ /// The block's id
+ /// The rotation amount around the x,y,z-axis
+ /// Whether the operation was successful
+ public static bool RotateBlock(uint id, float3 vector)
+ {
+ if (rotationEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsBuildMode())
+ {
+ rotationEngine.RotateBlock(id, vector);
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// Rotate all connected blocks by a specific amount in degrees.
+ /// This does not do anything because it has not been implemented.
+ ///
+ /// The starting block's id
+ /// The rotation around the x,y,z-axis
+ /// Whether the operation was successful
+ public static bool RotateConnectedBlocks(uint id, float3 vector)
+ {
+ if (rotationEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsBuildMode())
+ {
+ rotationEngine.RotateConnectedBlocks(id, vector);
+ return true;
+ }
+ return false;
+ }
+
+ public static void Init()
+ {
+ GamecraftModdingAPI.Utility.GameEngineManager.AddGameEngine(rotationEngine);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/RotationEngine.cs b/GamecraftModdingAPI/Blocks/RotationEngine.cs
new file mode 100644
index 0000000..8038739
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/RotationEngine.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using RobocraftX;
+using RobocraftX.Blocks;
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Common;
+using RobocraftX.Multiplayer;
+using RobocraftX.SimulationModeState;
+using RobocraftX.UECS;
+using Unity.Entities;
+using Svelto.Context;
+using Svelto.ECS;
+using Svelto.ECS.EntityStructs;
+using Unity.Transforms;
+using Unity.Mathematics;
+using UnityEngine;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Engine which executes block movement actions
+ ///
+ public class RotationEngine : IApiEngine
+ {
+ public string Name { get; } = "GamecraftModdingAPIRotationGameEngine";
+
+ public EntitiesDB entitiesDB { set; private get; }
+
+ public bool IsInGame = false;
+
+ public void Dispose()
+ {
+ IsInGame = false;
+ }
+
+ public void Ready()
+ {
+ IsInGame = true;
+ }
+
+ // implementations for Rotation static class
+
+ public float3 RotateBlock(uint blockID, Vector3 vector)
+ {
+ ref RotationEntityStruct rotStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref GridRotationStruct gridStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref LocalTransformEntityStruct transStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ ref UECSPhysicsEntityStruct phyStruct = ref this.entitiesDB.QueryEntity(blockID, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
+ // main (persistent) position
+ Quaternion newRotation = (Quaternion)rotStruct.rotation;
+ newRotation.eulerAngles += vector;
+ rotStruct.rotation = (quaternion)newRotation;
+ // placement grid rotation
+ Quaternion newGridRotation = (Quaternion)gridStruct.rotation;
+ newGridRotation.eulerAngles += vector;
+ gridStruct.rotation = (quaternion)newGridRotation;
+ // rendered position
+ Quaternion newTransRotation = (Quaternion)rotStruct.rotation;
+ newTransRotation.eulerAngles += vector;
+ transStruct.rotation = newTransRotation;
+ // collision position
+ FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Unity.Transforms.Rotation
+ {
+ Value = rotStruct.rotation
+ });
+ return ((Quaternion)rotStruct.rotation).eulerAngles;
+
+ }
+
+ public float3 RotateConnectedBlocks(uint blockID, Vector3 vector)
+ {
+ // TODO: Implement and figure out the math
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/SignalEngine.cs b/GamecraftModdingAPI/Blocks/SignalEngine.cs
new file mode 100644
index 0000000..3b732ba
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/SignalEngine.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using RobocraftX;
+using RobocraftX.Blocks;
+using RobocraftX.Blocks.Ghost;
+using RobocraftX.Common;
+using RobocraftX.Multiplayer;
+using RobocraftX.SimulationModeState;
+using RobocraftX.UECS;
+using Unity.Entities;
+using Svelto.Context;
+using Svelto.DataStructures;
+using Svelto.ECS;
+using Svelto.ECS.EntityStructs;
+using Unity.Transforms;
+using Unity.Mathematics;
+using UnityEngine;
+using Gamecraft.Wires;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Engine which executes signal actions
+ ///
+ public class SignalEngine : IApiEngine
+ {
+ public string Name { get; } = "GamecraftModdingAPISignalGameEngine";
+
+ public EntitiesDB entitiesDB { set; private get; }
+
+ public bool IsInGame = false;
+
+ public void Dispose()
+ {
+ IsInGame = false;
+ }
+
+ public void Ready()
+ {
+ IsInGame = true;
+ }
+
+ // implementations for Signal static class
+
+ public bool SetSignal(EGID blockID, float signal, out uint signalID, bool input = true)
+ {
+ signalID = GetSignalIDs(blockID, input)[0];
+ return SetSignal(signalID, signal);
+ }
+
+ public bool SetSignal(uint signalID, float signal, bool input = true)
+ {
+ ExclusiveGroup group = input ? NamedExclusiveGroup.Group : NamedExclusiveGroup.Group;
+ if (entitiesDB.Exists(signalID, group))
+ {
+ entitiesDB.QueryEntity(signalID, group).anyChannel.valueAsFloat = signal;
+ return true;
+ }
+ return false;
+ }
+
+ public float AddSignal(EGID blockID, float signal, out uint signalID, bool clamp = true, bool input = true)
+ {
+ signalID = GetSignalIDs(blockID, input)[0];
+ return AddSignal(signalID, signal, clamp, input);
+ }
+
+ public float AddSignal(uint signalID, float signal, bool clamp = true, bool input = true)
+ {
+ ExclusiveGroup group = input ? NamedExclusiveGroup.Group : NamedExclusiveGroup.Group;
+ if (entitiesDB.Exists(signalID, group))
+ {
+ ref PortEntityStruct pes = ref entitiesDB.QueryEntity(signalID, group);
+ pes.anyChannel.valueAsFloat += signal;
+ if (clamp)
+ {
+ if (pes.anyChannel.valueAsFloat > Signals.POSITIVE_HIGH)
+ {
+ pes.anyChannel.valueAsFloat = Signals.POSITIVE_HIGH;
+ }
+ else if (pes.anyChannel.valueAsFloat < Signals.NEGATIVE_HIGH)
+ {
+ pes.anyChannel.valueAsFloat = Signals.NEGATIVE_HIGH;
+ }
+ return pes.anyChannel.valueAsFloat;
+ }
+ }
+ return signal;
+ }
+
+ public float GetSignal(EGID blockID, out uint signalID, bool input = true)
+ {
+ signalID = GetSignalIDs(blockID, input)[0];
+ return GetSignal(signalID, input);
+ }
+
+ public float GetSignal(uint signalID, bool input = true)
+ {
+ ExclusiveGroup group = input ? NamedExclusiveGroup.Group : NamedExclusiveGroup.Group;
+ if (entitiesDB.Exists(signalID, group))
+ {
+ return entitiesDB.QueryEntity(signalID, group).anyChannel.valueAsFloat;
+ }
+ return 0f;
+ }
+
+ public uint[] GetSignalIDs(EGID blockID, bool input = true)
+ {
+ ref BlockPortsStruct bps = ref entitiesDB.QueryEntity(blockID);
+ uint[] signals;
+ if (input) {
+ signals = new uint[bps.inputCount];
+ for (uint i = 0u; i < bps.inputCount; i++)
+ {
+ signals[i] = bps.firstInputID + i;
+ }
+ } else {
+ signals = new uint[bps.outputCount];
+ for (uint i = 0u; i < bps.outputCount; i++)
+ {
+ signals[i] = bps.firstOutputID + i;
+ }
+ }
+ return signals;
+ }
+
+ public EGID[] GetElectricBlocks()
+ {
+ uint count = entitiesDB.Count(BlockIdentifiers.OWNED_BLOCKS) + entitiesDB.Count(BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS);
+ uint i = 0;
+ EGID[] res = new EGID[count];
+ foreach (ref BlockPortsStruct s in entitiesDB.QueryEntities(BlockIdentifiers.OWNED_BLOCKS))
+ {
+ res[i] = s.ID;
+ i++;
+ }
+ foreach (ref BlockPortsStruct s in entitiesDB.QueryEntities(BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS))
+ {
+ res[i] = s.ID;
+ i++;
+ }
+ return res;
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/Signals.cs b/GamecraftModdingAPI/Blocks/Signals.cs
new file mode 100644
index 0000000..c844d3a
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Signals.cs
@@ -0,0 +1,183 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Svelto.ECS;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// [EXPERIMENTAL] Common block signal operations
+ /// The functionality in this class only works when in a game.
+ ///
+ public static class Signals
+ {
+ // Signal constants
+ public static readonly float HIGH = 1.0f;
+ public static readonly float POSITIVE_HIGH = HIGH;
+ public static readonly float NEGATIVE_HIGH = -1.0f;
+ public static readonly float LOW = 0.0f;
+
+ private static SignalEngine signalEngine = new SignalEngine();
+
+ ///
+ /// Set the electric block's (first) signal value.
+ ///
+ /// The block's id.
+ /// The signal value (-1 to 1; not enforced).
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// Whether the block is in the owned group (true) or functional group (false)
+ public static void SetSignalByBlock(uint blockID, float signal, bool input = true, bool owned = true)
+ {
+ EGID egid = new EGID(blockID, owned ? BlockIdentifiers.OWNED_BLOCKS : BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS);
+ if (signalEngine.IsInGame && GameState.IsSimulationMode())
+ {
+ signalEngine.SetSignal(egid, signal, out uint _, input);
+ }
+ }
+
+ public static void SetSignalByBlock(EGID blockID, float signal, bool input = true)
+ {
+ if (signalEngine.IsInGame && GameState.IsSimulationMode())
+ {
+ signalEngine.SetSignal(blockID, signal, out uint _, input);
+ }
+ }
+
+ ///
+ /// Set the signal's value.
+ ///
+ /// The channel cluster's id.
+ /// The signal value (-1 to 1; not enforced).
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ public static void SetSignalByID(uint signalID, float signal, bool input = true)
+ {
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ signalEngine.SetSignal(signalID, signal, input);
+ }
+ }
+
+ ///
+ /// Add a value to an electric block's signal.
+ ///
+ /// The block's id.
+ /// The signal value to add.
+ /// Whether to clamp the resulting signal value between -1 and 1.
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// Whether the block is in the owned group (true) or functional group (false)
+ /// The signal's new value.
+ public static float AddSignalByBlock(uint blockID, float signal, bool clamp = true, bool input = true, bool owned = true)
+ {
+ EGID egid = new EGID(blockID, owned ? BlockIdentifiers.OWNED_BLOCKS : BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS);
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.AddSignal(egid, signal, out uint _, clamp, input);
+ }
+ return 0f;
+ }
+
+ public static float AddSignalByBlock(EGID blockID, float signal, bool clamp = true, bool input = true)
+ {
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.AddSignal(blockID, signal, out uint _, clamp, input);
+ }
+ return 0f;
+ }
+
+ ///
+ /// Add a value to a conductive cluster channel.
+ ///
+ /// The channel cluster's id.
+ /// The signal value to add.
+ /// Whether to clamp the resulting signal value between -1 and 1.
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// The signal's new value.
+ public static float AddSignalByID(uint signalID, float signal, bool clamp = true, bool input = true)
+ {
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.AddSignal(signalID, signal, clamp, input);
+ }
+ return 0f;
+ }
+
+ ///
+ /// Get a electric block's signal's (first) value.
+ ///
+ /// The block's id.
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// Whether the block is in the owned group (true) or functional group (false)
+ /// The signal's value.
+ public static float GetSignalByBlock(uint blockID, bool input = true, bool owned = true)
+ {
+ EGID egid = new EGID(blockID, owned? BlockIdentifiers.OWNED_BLOCKS : BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS);
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.GetSignal(egid, out uint _, input);
+ }
+ return 0f;
+ }
+
+ public static float GetSignalByBlock(EGID blockID, bool input = true)
+ {
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.GetSignal(blockID, out uint _, input);
+ }
+ return 0f;
+ }
+
+ ///
+ /// Get a signal's value.
+ ///
+ /// The signal's id.
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// The signal's value.
+ public static float GetSignalByID(uint signalID, bool input = true)
+ {
+ if (signalEngine.IsInGame && GamecraftModdingAPI.Utility.GameState.IsSimulationMode())
+ {
+ return signalEngine.GetSignal(signalID, input);
+ }
+ return 0f;
+ }
+
+ ///
+ /// Get the ID of every electric block in the game world.
+ ///
+ /// The block IDs.
+ public static EGID[] GetElectricBlocks()
+ {
+ return signalEngine.GetElectricBlocks();
+ }
+
+ ///
+ /// Get the unique identifiers for the input wires connected to an electric block.
+ ///
+ /// The block's id.
+ /// Whether to retrieve input IDs (true) or output IDs (false).
+ /// Whether the block is in the owned group (true) or functional group (false)
+ /// The unique IDs.
+ public static uint[] GetSignalIDs(uint blockID, bool input = true, bool owned = true)
+ {
+ EGID egid = new EGID(blockID, owned ? BlockIdentifiers.OWNED_BLOCKS : BlockIdentifiers.FUNCTIONAL_BLOCK_PARTS);
+ return signalEngine.GetSignalIDs(egid, input);
+ }
+
+ public static uint[] GetSignalIDs(EGID blockID, bool input = true, bool owned = true)
+ {
+ return signalEngine.GetSignalIDs(blockID, input);
+ }
+
+ public static void Init()
+ {
+ GameEngineManager.AddGameEngine(signalEngine);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/Tweakable.cs b/GamecraftModdingAPI/Blocks/Tweakable.cs
new file mode 100644
index 0000000..920bbb6
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/Tweakable.cs
@@ -0,0 +1,102 @@
+using System;
+
+using Svelto.ECS;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ ///
+ /// Common tweakable stats operations.
+ /// The functionality of this class works best in build mode.
+ ///
+ public static class Tweakable
+ {
+ private static TweakableEngine tweakableEngine = new TweakableEngine();
+
+ ///
+ /// Get the tweakable stat's value using a dynamic variable type.
+ /// This is similar to GetStat but without strong type enforcement.
+ /// This should be used in dynamically-typed languages like Python.
+ ///
+ /// The stat's value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ public static dynamic GetStatD(uint blockID, TweakableStat stat)
+ {
+ return tweakableEngine.GetStatDynamic(blockID, stat);
+ }
+
+ ///
+ /// Get the tweakable stat's value.
+ /// If T is not the same type as the stat, an InvalidCastException will be thrown.
+ ///
+ /// The stat's value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ /// The stat's type.
+ public static T GetStat(uint blockID, TweakableStat stat)
+ {
+ return tweakableEngine.GetStatAny(blockID, stat);
+ }
+
+ ///
+ /// Set the tweakable stat's value using dynamically-typed variables.
+ /// This is similar to SetStat but without strong type enforcement.
+ /// This should be used in dynamically-typed languages like Python.
+ ///
+ /// The stat's new value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ /// The stat's new value.
+ public static dynamic SetStatD(uint blockID, TweakableStat stat, dynamic value)
+ {
+ return tweakableEngine.SetStatDynamic(blockID, stat, value);
+ }
+
+ ///
+ /// Set the tweakable stat's value.
+ /// If T is not the stat's actual type, an InvalidCastException will be thrown.
+ ///
+ /// The stat's new value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ /// The stat's new value.
+ /// The stat's type.
+ public static T SetStat(uint blockID, TweakableStat stat, T value)
+ {
+ return tweakableEngine.SetStatAny(blockID, stat, value);
+ }
+
+ ///
+ /// Add another value to the tweakable stat's value using dynamically-typed variables.
+ /// This is similar to AddStat but without strong type enforcement.
+ /// This should be used in dynamically-typed languages like Python.
+ ///
+ /// The stat's new value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ /// The value to be added to the stat.
+ public static dynamic AddStatD(uint blockID, TweakableStat stat, dynamic value)
+ {
+ return tweakableEngine.AddStatDynamic(blockID, stat, value);
+ }
+
+ ///
+ /// Add another value to the tweakable stat's value.
+ /// If T is not the stat's actual type, an InvalidCastException will be thrown.
+ ///
+ /// The stat's new value.
+ /// The block's id.
+ /// The stat's enumerated id.
+ /// The value to be added to the stat.
+ /// The stat's type.
+ public static T AddStat(uint blockID, TweakableStat stat, T value)
+ {
+ return tweakableEngine.AddStatAny(blockID, stat, value);
+ }
+
+ public static void Init()
+ {
+ GamecraftModdingAPI.Utility.GameEngineManager.AddGameEngine(tweakableEngine);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/TweakableEngine.cs b/GamecraftModdingAPI/Blocks/TweakableEngine.cs
new file mode 100644
index 0000000..1d029ee
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/TweakableEngine.cs
@@ -0,0 +1,452 @@
+using System;
+using System.Reflection;
+
+using RobocraftX.Blocks;
+using Gamecraft.Wires;
+
+using GamecraftModdingAPI.Utility;
+using Svelto.ECS;
+
+namespace GamecraftModdingAPI.Blocks
+{
+ public class TweakableEngine : IApiEngine
+ {
+ public string Name { get; } = "GamecraftModdingAPITweakableGameEngine";
+
+ public EntitiesDB entitiesDB { set; private get; }
+
+ public bool IsInGame = false;
+
+ public void Dispose()
+ {
+ IsInGame = false;
+ }
+
+ public void Ready()
+ {
+ IsInGame = true;
+ }
+
+ // Implementations for Tweakable static class
+
+ public T GetStatAny(EGID blockID, TweakableStat stat)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ return (T)(object)entitiesDB.QueryEntity(blockID).startValue;
+ }
+ break;
+ }
+ return default(T);
+ }
+
+ public T GetStatAny(uint blockID, TweakableStat stat)
+ {
+ return GetStatAny(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat);
+ }
+
+ public dynamic GetStatDynamic(EGID blockID, TweakableStat stat)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ return entitiesDB.QueryEntity(blockID).startValue;
+ }
+ break;
+ }
+ return null;
+ }
+
+ public dynamic GetStatDynamic(uint blockID, TweakableStat stat)
+ {
+ return GetStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat);
+ }
+
+ public T SetStatAny(EGID blockID, TweakableStat stat, T value)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxVelocity = (float)(object)value;
+ return (T)(object)refStruct.maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxForce = (float)(object)value;
+ return (T)(object)refStruct.maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation = (float)(object)value;
+ return (T)(object)refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.minDeviation = (float)(object)value;
+ return (T)(object)refStruct.minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation = (float)(object)value;
+ return (T)(object)refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = (bool)(object)value;
+ return (T)(object)refStruct.reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = (bool)(object)value;
+ return (T)(object)refStruct.reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.startValue = (float)(object)value;
+ return (T)(object)refStruct.startValue;
+ }
+ break;
+ }
+ return default(T);
+ }
+
+ public T SetStatAny(uint blockID, TweakableStat stat, T value)
+ {
+ return SetStatAny(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
+ }
+
+ public dynamic SetStatDynamic(EGID blockID, TweakableStat stat, dynamic value)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxVelocity = value;
+ return refStruct.maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxForce = value;
+ return refStruct.maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation = value;
+ return refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.minDeviation = value;
+ return refStruct.minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation = value;
+ return refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = value;
+ return refStruct.reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = value;
+ return refStruct.reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.startValue = value;
+ return refStruct.startValue;
+ }
+ break;
+ }
+ return null;
+ }
+
+ public dynamic SetStatDynamic(uint blockID, TweakableStat stat, dynamic value)
+ {
+ return SetStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
+ }
+
+ public T AddStatAny(EGID blockID, TweakableStat stat, T value)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxVelocity += (float)(object)value;
+ return (T)(object)refStruct.maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxForce += (float)(object)value;
+ return (T)(object)refStruct.maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation += (float)(object)value;
+ return (T)(object)refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.minDeviation += (float)(object)value;
+ return (T)(object)refStruct.minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation += (float)(object)value;
+ return (T)(object)refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ // '+' is associated with logical OR in some fields, so it technically isn't invalid to "add" booleans
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = refStruct.reverse || (bool)(object)value;
+ return (T)(object)refStruct.reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = refStruct.reverse || (bool)(object)value;
+ return (T)(object)refStruct.reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.startValue += (float)(object)value;
+ return (T)(object)refStruct.startValue;
+ }
+ break;
+ }
+ return default(T);
+ }
+
+ public T AddStatAny(uint blockID, TweakableStat stat, T value)
+ {
+ return AddStatAny(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
+ }
+
+ public dynamic AddStatDynamic(EGID blockID, TweakableStat stat, dynamic value)
+ {
+ switch (stat)
+ {
+ case TweakableStat.TopSpeed:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxVelocity += value;
+ return refStruct.maxVelocity;
+ }
+ break;
+ case TweakableStat.Torque:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxForce += value;
+ return refStruct.maxForce;
+ }
+ break;
+ case TweakableStat.MaxExtension:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref PistonReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation += value;
+ return refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.MinAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.minDeviation += value;
+ return refStruct.minDeviation;
+ }
+ break;
+ case TweakableStat.MaxAngle:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.maxDeviation += value;
+ return refStruct.maxDeviation;
+ }
+ break;
+ case TweakableStat.Reverse:
+ // '+' is associated with logical OR in some fields, so it technically isn't invalid to "add" booleans
+ if (entitiesDB.Exists(blockID))
+ {
+ ref MotorReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = refStruct.reverse || value;
+ return refStruct.reverse;
+ }
+ else if (entitiesDB.Exists(blockID))
+ {
+ ref ServoReadOnlyStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.reverse = refStruct.reverse || value;
+ return refStruct.reverse;
+ }
+ break;
+ case TweakableStat.StartValue:
+ if (entitiesDB.Exists(blockID))
+ {
+ ref SignalGeneratorEntityStruct refStruct = ref entitiesDB.QueryEntity(blockID);
+ refStruct.startValue += value;
+ return refStruct.startValue;
+ }
+ break;
+ }
+ return null;
+ }
+
+ public dynamic AddStatDynamic(uint blockID, TweakableStat stat, dynamic value)
+ {
+ return AddStatDynamic(new EGID(blockID, BlockIdentifiers.OWNED_BLOCKS), stat, value);
+ }
+ }
+}
diff --git a/GamecraftModdingAPI/Blocks/TweakableStat.cs b/GamecraftModdingAPI/Blocks/TweakableStat.cs
new file mode 100644
index 0000000..18f5bad
--- /dev/null
+++ b/GamecraftModdingAPI/Blocks/TweakableStat.cs
@@ -0,0 +1,14 @@
+using System;
+namespace GamecraftModdingAPI.Blocks
+{
+ public enum TweakableStat
+ {
+ TopSpeed, // MotorReadOnlyStruct
+ Torque, // MotorReadOnlyStruct
+ MaxExtension, // PistonReadOnlyStruct
+ MinAngle, // ServoReadOnlyStruct
+ MaxAngle, // ServoReadOnlyStruct
+ Reverse, // MotorReadOnlyStruct or ServoReadOnlyStruct
+ StartValue, // SignalGeneratorEntityStruct
+ }
+}
diff --git a/TechbloxModdingAPI/Commands/CommandEngineFactory.cs b/GamecraftModdingAPI/Commands/CommandEngineFactory.cs
similarity index 88%
rename from TechbloxModdingAPI/Commands/CommandEngineFactory.cs
rename to GamecraftModdingAPI/Commands/CommandEngineFactory.cs
index 07e9a67..ddcdcb8 100644
--- a/TechbloxModdingAPI/Commands/CommandEngineFactory.cs
+++ b/GamecraftModdingAPI/Commands/CommandEngineFactory.cs
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace TechbloxModdingAPI.Commands
+namespace GamecraftModdingAPI.Commands
{
///
/// UNIMPLEMENTED!
diff --git a/TechbloxModdingAPI/Commands/CommandManager.cs b/GamecraftModdingAPI/Commands/CommandManager.cs
similarity index 90%
rename from TechbloxModdingAPI/Commands/CommandManager.cs
rename to GamecraftModdingAPI/Commands/CommandManager.cs
index e275ace..f2f79b4 100644
--- a/TechbloxModdingAPI/Commands/CommandManager.cs
+++ b/GamecraftModdingAPI/Commands/CommandManager.cs
@@ -5,9 +5,10 @@ using System.Text;
using System.Threading.Tasks;
using Svelto.ECS;
-using TechbloxModdingAPI.Utility;
-namespace TechbloxModdingAPI.Commands
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Commands
{
///
/// Keeps track of custom commands
@@ -21,10 +22,6 @@ namespace TechbloxModdingAPI.Commands
public static void AddCommand(ICustomCommandEngine engine)
{
- if (ExistsCommand(engine))
- {
- throw new CommandAlreadyExistsException($"Command {engine.Name} already exists");
- }
_customCommands[engine.Name] = engine;
if (_lastEngineRoot != null)
{
diff --git a/GamecraftModdingAPI/Commands/CommandPatch.cs b/GamecraftModdingAPI/Commands/CommandPatch.cs
new file mode 100644
index 0000000..a0392ed
--- /dev/null
+++ b/GamecraftModdingAPI/Commands/CommandPatch.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Reflection;
+
+using Harmony;
+using Svelto.Context;
+using Svelto.ECS;
+using RobocraftX;
+using RobocraftX.Multiplayer;
+using RobocraftX.StateSync;
+using Unity.Entities;
+
+using GamecraftModdingAPI.Utility;
+
+namespace GamecraftModdingAPI.Commands
+{
+ ///
+ /// Patch of RobocraftX.GUI.CommandLine.CommandLineCompositionRoot.Compose()
+ ///
+ // TODO: fix
+ [HarmonyPatch]
+ //[HarmonyPatch(typeof(RobocraftX.GUI.CommandLine.CommandLineCompositionRoot))]
+ //[HarmonyPatch("Compose")]
+ //[HarmonyPatch("Compose", new Type[] { typeof(UnityContext), 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, ref StateSyncRegistrationHelper stateSyncReg)
+ {
+ // 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 func.Method;
+ }
+ }
+}
diff --git a/TechbloxModdingAPI/Commands/CommandRegistrationHelper.cs b/GamecraftModdingAPI/Commands/CommandRegistrationHelper.cs
similarity index 61%
rename from TechbloxModdingAPI/Commands/CommandRegistrationHelper.cs
rename to GamecraftModdingAPI/Commands/CommandRegistrationHelper.cs
index e33b232..5cb9069 100644
--- a/TechbloxModdingAPI/Commands/CommandRegistrationHelper.cs
+++ b/GamecraftModdingAPI/Commands/CommandRegistrationHelper.cs
@@ -4,17 +4,22 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace TechbloxModdingAPI.Commands
+using uREPL;
+using RobocraftX.CommandLine.Custom;
+
+namespace GamecraftModdingAPI.Commands
{
///
- /// Convenient methods for registering commands to Techblox.
+ /// Convenient methods for registering commands to Gamecraft.
/// All methods register to the command line and console block by default.
///
public static class CommandRegistrationHelper
{
public static void Register(string name, Action action, string desc, bool noConsole = false)
{
- CustomCommands.Register(name, action, desc);
+ RuntimeCommands.Register(name, action, desc);
+ if (noConsole) { return; }
+ ConsoleCommands.Register(name, action, desc);
}
public static void Register(string name, Action