Update to Techblox 2021.09.03.10.36

Removed old dependencies, including uREPL
Added new block IDs
Implemented basic command handling to support existing mod commands
This commit is contained in:
Norbi Peti 2021-09-07 23:15:03 +02:00
parent 033ebdb86d
commit 63295f82c9
17 changed files with 157 additions and 60 deletions

View file

@ -232,7 +232,9 @@ namespace TechbloxModdingAPI.App
else
{
// this likely breaks things
GameMode.SaveGameDetails = new SaveGameDetails(GameMode.SaveGameDetails.Name, value, GameMode.SaveGameDetails.WorkshopId);
GameMode.SaveGameDetails = new SaveGameDetails(GameMode.SaveGameDetails.Id,
GameMode.SaveGameDetails.SaveMode, GameMode.SaveGameDetails.Name, value,
GameMode.SaveGameDetails.WorkshopId);
}
}
}
@ -262,7 +264,9 @@ namespace TechbloxModdingAPI.App
else
{
// this likely breaks things
GameMode.SaveGameDetails = new SaveGameDetails(GameMode.SaveGameDetails.Name, GameMode.SaveGameDetails.Folder, value);
GameMode.SaveGameDetails = new SaveGameDetails(GameMode.SaveGameDetails.Id,
GameMode.SaveGameDetails.SaveMode, GameMode.SaveGameDetails.Name,
GameMode.SaveGameDetails.Folder, value);
}
}
}

View file

@ -7,7 +7,7 @@ using RobocraftX.GUI;
using RobocraftX.GUI.MyGamesScreen;
using Svelto.ECS;
using Svelto.ECS.Experimental;
using Svelto.DataStructures;
using Techblox.Services.Machines;
using TechbloxModdingAPI.Engines;
using TechbloxModdingAPI.Utility;
@ -82,9 +82,10 @@ namespace TechbloxModdingAPI.App
public bool EnterGame(string gameName, string path, ulong workshopId = 0uL, bool autoEnterSim = false)
{
GameMode.CurrentMode = autoEnterSim ? RCXMode.Play : RCXMode.Build;
GameMode.SaveGameDetails = new SaveGameDetails(gameName, path, workshopId);
GameMode.SaveGameDetails = new SaveGameDetails(MachineStorageId.CreateNew().ToString(),
SaveGameMode.NewSave, gameName, path, workshopId);
// the private FullGameCompositionRoot.SwitchToGame() method gets passed to menu items for this reason
AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame").Invoke(FullGameFields.Instance, new object[0]);
AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame").Invoke(FullGameFields.Instance, Array.Empty<object>());
return true;
}

View file

@ -417,7 +417,7 @@ namespace TechbloxModdingAPI
if (e.ID != Id) return;
Placed -= OnPlacedInit; //And we can reference it
InitData = default; //Remove initializer as it's no longer valid - if the block gets removed it shouldn't be used again
if (copiedFrom != EGID.Empty)
if (copiedFrom != default)
BlockCloneEngine.CopyBlockStats(copiedFrom, Id);
}

View file

@ -150,6 +150,19 @@ namespace TechbloxModdingAPI.Blocks
HatchbackWheel,
HatchbackWheelArch,
HatchbackArchSmallFlare,
HatchbackArchFlare
HatchbackArchFlare,
TruckWheel = 246,
HatchbackWheelWideProfile,
TruckWheelRigWithSteering = 249,
TruckWheelRigNoSteering,
HatchbackDriverSeat,
HatchbackPassengerSeat,
FormulaEngine,
TruckWheelDouble = 261,
TruckWheelArch,
TruckArchSingleFlare,
FormulaWheel = 270,
FormulaWheelRear,
FormulaSeat = 277
}
}

View file

@ -48,7 +48,7 @@ namespace TechbloxModdingAPI.Blocks.Engines
// rendered position
transStruct.position = vector;
// collision position
if (phyStruct.ID != EGID.Empty)
if (phyStruct.ID != default)
{ //It exists
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity, new Translation
{

View file

@ -3,6 +3,7 @@ using System.Reflection;
using HarmonyLib;
using RobocraftX.Blocks;
using RobocraftX.Common;
using Svelto.Common;
using Svelto.ECS;
using Svelto.ECS.Native;
@ -22,8 +23,8 @@ namespace TechbloxModdingAPI.Blocks.Engines
return false;
var connections = entitiesDB.QueryEntity<MachineGraphConnectionsEntityStruct>(target);
var groups = entitiesDB.FindGroups<MachineGraphConnectionsEntityStruct>();
var connStructMapper =
entitiesDB.QueryNativeMappedEntities<MachineGraphConnectionsEntityStruct>(groups);
using var connStructMapper =
entitiesDB.QueryNativeMappedEntities<MachineGraphConnectionsEntityStruct>(groups, Allocator.Temp);
for (int i = connections.connections.Count<MachineConnectionStruct>() - 1; i >= 0; i--)
_connectionFactory.RemoveConnection(connections, i, connStructMapper);
_entityFunctions.RemoveEntity<BlockEntityDescriptor>(target);

View file

@ -50,7 +50,7 @@ namespace TechbloxModdingAPI.Blocks.Engines
// rendered rotation
transStruct.rotation = newRotation;
// collision rotation
if (phyStruct.ID != EGID.Empty)
if (phyStruct.ID != default)
{ //It exists
FullGameFields._physicsWorld.EntityManager.SetComponentData(phyStruct.uecsEntity,
new Unity.Transforms.Rotation

View file

@ -298,7 +298,7 @@ namespace TechbloxModdingAPI.Blocks.Engines
}
}
return EGID.Empty;
return default;
}
public OptionalRef<ChannelDataStruct> GetChannelDataStruct(EGID portID)

View file

@ -83,7 +83,7 @@ namespace TechbloxModdingAPI.Blocks
bool flipped = false;
// find block ports
EGID wire = signalEngine.MatchBlocksToWire(start.Id, end.Id, startPort, endPort);
if (wire == EGID.Empty)
if (wire == default)
{
// flip I/O around and try again
wire = signalEngine.MatchBlocksToWire(end.Id, start.Id, endPort, startPort);
@ -92,7 +92,7 @@ namespace TechbloxModdingAPI.Blocks
// This makes wire traversal easier, but makes logic in this class a bit more complex
}
if (wire != EGID.Empty)
if (wire != default)
{
Construct(start.Id, end.Id, startPort, endPort, wire, flipped);
}
@ -127,10 +127,10 @@ namespace TechbloxModdingAPI.Blocks
this.endBlockEGID = endBlock;
this.inputToOutput = inputToOutput;
this.wireEGID = wire;
endPortEGID = signalEngine.MatchBlockIOToPort(startBlock, startPort, inputToOutput).Nullable()?.ID ?? EGID.Empty;
if (endPortEGID == EGID.Empty) throw new WireInvalidException("Wire end port not found");
startPortEGID = signalEngine.MatchBlockIOToPort(endBlock, endPort, !inputToOutput).Nullable()?.ID ?? EGID.Empty;
if (startPortEGID == EGID.Empty) throw new WireInvalidException("Wire start port not found");
endPortEGID = signalEngine.MatchBlockIOToPort(startBlock, startPort, inputToOutput).Nullable()?.ID ?? default;
if (endPortEGID == default) throw new WireInvalidException("Wire end port not found");
startPortEGID = signalEngine.MatchBlockIOToPort(endBlock, endPort, !inputToOutput).Nullable()?.ID ?? default;
if (startPortEGID == default) throw new WireInvalidException("Wire start port not found");
this.startPort = startPort;
this.endPort = endPort;
}

View file

@ -4,8 +4,6 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using uREPL;
namespace TechbloxModdingAPI.Commands
{
/// <summary>
@ -16,7 +14,7 @@ namespace TechbloxModdingAPI.Commands
{
public static void Register(string name, Action action, string desc, bool noConsole = false)
{
RuntimeCommands.Register(name, action, desc);
CustomCommands.Register(name, action, desc);
}
public static void Register(string name, Action<object> action, string desc, bool noConsole = false)
@ -36,42 +34,42 @@ namespace TechbloxModdingAPI.Commands
public static void Register<Param0>(string name, Action<Param0> action, string desc, bool noConsole = false)
{
RuntimeCommands.Register<Param0>(name, action, desc);
CustomCommands.Register(name, action, desc);
}
public static void Register<Param0, Param1>(string name, Action<Param0, Param1> action, string desc, bool noConsole = false)
{
RuntimeCommands.Register<Param0, Param1>(name, action, desc);
CustomCommands.Register(name, action, desc);
}
public static void Register<Param0, Param1, Param2>(string name, Action<Param0, Param1, Param2> action, string desc, bool noConsole = false)
{
RuntimeCommands.Register<Param0, Param1, Param2>(name, action, desc);
CustomCommands.Register(name, action, desc);
}
public static void Unregister(string name, bool noConsole = false)
{
RuntimeCommands.Unregister(name);
CustomCommands.Unregister(name);
}
public static void Call(string name)
{
RuntimeCommands.Call(name);
CustomCommands.Call(name);
}
public static void Call<Param0>(string name, Param0 param0)
{
RuntimeCommands.Call<Param0>(name, param0);
CustomCommands.Call(name, param0);
}
public static void Call<Param0, Param1>(string name, Param0 param0, Param1 param1)
{
RuntimeCommands.Call<Param0, Param1>(name, param0, param1);
CustomCommands.Call(name, param0, param1);
}
public static void Call<Param0, Param1, Param2>(string name, Param0 param0, Param1 param1, Param2 param2)
{
RuntimeCommands.Call<Param0, Param1, Param2>(name, param0, param1, param2);
CustomCommands.Call(name, param0, param1, param2);
}
}
}

View file

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
namespace TechbloxModdingAPI.Commands
{
internal static class CustomCommands
{
public struct CommandData
{
public string Name;
public string Description;
public Delegate Action;
}
private static Dictionary<string, CommandData> _commands = new Dictionary<string, CommandData>();
public static void Register(string name, Delegate action, string desc)
{
_commands.Add(name, new CommandData
{
Name = name,
Description = desc,
Action = action
});
}
public static void Call(string name, params object[] args)
{
if (_commands.TryGetValue(name, out var command))
{
var paramz = command.Action.Method.GetParameters();
if (paramz.Length > args.Length)
throw new CommandParameterMissingException(
$"This command requires {paramz.Length} arguments, {args.Length} given");
for (var index = 0; index < paramz.Length; index++)
{
args[index] = Convert.ChangeType(args[index], paramz[index].ParameterType);
}
command.Action.DynamicInvoke(args);
}
else
throw new CommandNotFoundException($"Command {name} does not exist!");
}
public static void Unregister(string name)
{
_commands.Remove(name);
}
public static bool Exists(string name) => _commands.ContainsKey(name);
public static ReadOnlyDictionary<string, CommandData> GetAllCommandData() =>
new ReadOnlyDictionary<string, CommandData>(_commands);
}
}

View file

@ -1,39 +1,37 @@
using System.Linq;
using uREPL;
namespace TechbloxModdingAPI.Commands
{
public static class ExistingCommands
{
public static void Call(string commandName)
{
RuntimeCommands.Call(commandName);
CustomCommands.Call(commandName);
}
public static void Call<Arg0>(string commandName, Arg0 arg0)
{
RuntimeCommands.Call<Arg0>(commandName, arg0);
CustomCommands.Call(commandName, arg0);
}
public static void Call<Arg0, Arg1>(string commandName, Arg0 arg0, Arg1 arg1)
{
RuntimeCommands.Call<Arg0, Arg1>(commandName, arg0, arg1);
CustomCommands.Call(commandName, arg0, arg1);
}
public static void Call<Arg0, Arg1, Arg2>(string commandName, Arg0 arg0, Arg1 arg1, Arg2 arg2)
{
RuntimeCommands.Call<Arg0, Arg1, Arg2>(commandName, arg0, arg1, arg2);
CustomCommands.Call(commandName, arg0, arg1, arg2);
}
public static bool Exists(string commandName)
{
return RuntimeCommands.HasRegistered(commandName);
return CustomCommands.Exists(commandName);
}
public static (string Name, string Description)[] GetCommandNamesAndDescriptions()
{
return RuntimeCommands.table.Values.Select(command => (command.name, command.description)).ToArray();
return CustomCommands.GetAllCommandData().Values.Select(command => (command.Name, command.Description)).ToArray();
}
}
}

View file

@ -433,7 +433,7 @@ namespace TechbloxModdingAPI
public Block GetBlockLookedAt(float maxDistance = -1f)
{
var egid = playerEngine.GetThingLookedAt(Id, maxDistance);
return egid != EGID.Empty && egid.groupID != CommonExclusiveGroups.SIMULATION_BODIES_GROUP
return egid != default && egid.groupID != CommonExclusiveGroups.SIMULATION_BODIES_GROUP
&& egid.groupID != WiresGUIExclusiveGroups.WireGroup
? Block.New(egid)
: null;
@ -447,7 +447,7 @@ namespace TechbloxModdingAPI
public SimBody GetSimBodyLookedAt(float maxDistance = -1f)
{
var egid = playerEngine.GetThingLookedAt(Id, maxDistance);
return egid != EGID.Empty && egid.groupID == CommonExclusiveGroups.SIMULATION_BODIES_GROUP
return egid != default && egid.groupID == CommonExclusiveGroups.SIMULATION_BODIES_GROUP
? new SimBody(egid)
: null;
}
@ -460,7 +460,7 @@ namespace TechbloxModdingAPI
public Wire GetWireLookedAt(float maxDistance = -1f)
{
var egid = playerEngine.GetThingLookedAt(Id, maxDistance);
return egid != EGID.Empty && egid.groupID == WiresGUIExclusiveGroups.WireGroup
return egid != default && egid.groupID == WiresGUIExclusiveGroups.WireGroup
? new Wire(new EGID(egid.entityID, NamedExclusiveGroup<WiresGroup>.Group))
: null;
}

View file

@ -167,16 +167,16 @@ namespace TechbloxModdingAPI.Players
public EGID GetThingLookedAt(uint playerId, float maxDistance = -1f)
{
var opt = GetCameraStruct<PhysicCameraRayCastEntityStruct>(playerId);
if (!opt) return EGID.Empty;
if (!opt) return default;
PhysicCameraRayCastEntityStruct rayCast = opt;
float distance = maxDistance < 0
? GhostBlockUtils.GetBuildInteractionDistance(entitiesDB, rayCast,
GhostBlockUtils.GhostCastMethod.GhostCastProportionalToBlockSize)
: maxDistance;
if (rayCast.hit && rayCast.distance <= distance)
return rayCast.hitEgid; //May be EGID.Empty
return rayCast.hitEgid; //May be EGID.Empty (default)
return EGID.Empty;
return default;
}
public unsafe Block[] GetSelectedBlocks(uint playerid)

View file

@ -72,6 +72,10 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\DDNA.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\DDNA.dll</HintPath>
</Reference>
<Reference Include="EasyButtons">
<HintPath>..\ref\TechbloxPreview_Data\Managed\EasyButtons.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\EasyButtons.dll</HintPath>
</Reference>
<Reference Include="EOSSDK">
<HintPath>..\ref\TechbloxPreview_Data\Managed\EOSSDK.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\EOSSDK.dll</HintPath>
@ -524,10 +528,6 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\RobocraftX.Player.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\RobocraftX.Player.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.Rendering">
<HintPath>..\ref\TechbloxPreview_Data\Managed\RobocraftX.Rendering.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\RobocraftX.Rendering.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.Rendering.Mock">
<HintPath>..\ref\TechbloxPreview_Data\Managed\RobocraftX.Rendering.Mock.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\RobocraftX.Rendering.Mock.dll</HintPath>
@ -660,10 +660,6 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.MyGamesScreen.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.MyGamesScreen.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.Notifications">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.Notifications.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.Notifications.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.Notifications.MockUps">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.Notifications.MockUps.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.GUI.Notifications.MockUps.dll</HintPath>
@ -680,6 +676,26 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Pointer.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Pointer.dll</HintPath>
</Reference>
<Reference Include="Techblox.Rendering.Common">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.Common.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.Common.dll</HintPath>
</Reference>
<Reference Include="Techblox.Rendering">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.dll</HintPath>
</Reference>
<Reference Include="Techblox.Rendering.DOTS">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.DOTS.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.DOTS.dll</HintPath>
</Reference>
<Reference Include="Techblox.Rendering.GPUI">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.GPUI.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.GPUI.dll</HintPath>
</Reference>
<Reference Include="Techblox.Rendering.Unity">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.Unity.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Rendering.Unity.dll</HintPath>
</Reference>
<Reference Include="Techblox.SaveGamesConversion">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.SaveGamesConversion.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.SaveGamesConversion.dll</HintPath>
@ -688,6 +704,10 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Services.Eos.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Services.Eos.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Storage">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.Services.Storage.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.Services.Storage.dll</HintPath>
</Reference>
<Reference Include="Techblox.SwitchAnimation">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Techblox.SwitchAnimation.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Techblox.SwitchAnimation.dll</HintPath>
@ -820,6 +840,10 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\Unity.Recorder.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Unity.Recorder.dll</HintPath>
</Reference>
<Reference Include="Unity.Rendering.Hybrid">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Unity.Rendering.Hybrid.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Unity.Rendering.Hybrid.dll</HintPath>
</Reference>
<Reference Include="Unity.RenderPipelines.Core.Runtime">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll</HintPath>
@ -1140,14 +1164,14 @@
<HintPath>..\ref\TechbloxPreview_Data\Managed\UnityEngine.XRModule.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\UnityEngine.XRModule.dll</HintPath>
</Reference>
<Reference Include="uREPL">
<HintPath>..\ref\TechbloxPreview_Data\Managed\uREPL.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\uREPL.dll</HintPath>
</Reference>
<Reference Include="VisualProfiler">
<HintPath>..\ref\TechbloxPreview_Data\Managed\VisualProfiler.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\VisualProfiler.dll</HintPath>
</Reference>
<Reference Include="Whinarn.UnityMeshSimplifier.Runtime">
<HintPath>..\ref\TechbloxPreview_Data\Managed\Whinarn.UnityMeshSimplifier.Runtime.dll</HintPath>
<HintPath>..\..\ref\TechbloxPreview_Data\Managed\Whinarn.UnityMeshSimplifier.Runtime.dll</HintPath>
</Reference>
</ItemGroup>
<!--End Dependencies-->

View file

@ -354,14 +354,15 @@ namespace TechbloxModdingAPI.Tests
[HarmonyPatch]
public class MinimumSpecsPatch
{
public static bool Prefix()
public static bool Prefix(ref bool __result)
{
__result = true;
return false;
}
public static MethodInfo TargetMethod()
{
return ((Action) MinimumSpecsCheck.CheckRequirementsMet).Method;
return ((Func<bool>) MinimumSpecsCheck.CheckRequirementsMet).Method;
}
}
}

View file

@ -163,7 +163,7 @@ namespace TechbloxModdingAPI.Utility
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLog(string msg)
{
uREPL.Log.Output(msg);
Log(msg);
}
/// <summary>
@ -179,7 +179,7 @@ namespace TechbloxModdingAPI.Utility
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogError(string msg)
{
uREPL.Log.Error(msg);
LogError(msg);
}
/// <summary>
@ -195,7 +195,7 @@ namespace TechbloxModdingAPI.Utility
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogWarning(string msg)
{
uREPL.Log.Warn(msg);
LogWarning(msg);
}
}