Browse Source

Update to Techblox 2022.01.25.15.52

- Fixed compilation errors
- Fixed patching errors and added missing anti-cheat patch
- Added check to verify that the init data has been removed from blocks once they are placed in game
- Removed block place event deduplication as it seems to be not needed anymore
- Fixed async tests not properly running
- Added Player.State
- Attempted to fix seat entering/leaving (we can only send inputs in client code)
- Fixed the weak dictionary ContainsKey returning true even if the item is no longer there
tags/v2.2.0
NorbiPeti 2 years ago
parent
commit
d27bcee8d5
19 changed files with 252 additions and 33 deletions
  1. +3
    -3
      CodeGenerator/Program.cs
  2. +2
    -0
      TechbloxModdingAPI/App/AntiAntiCheatPatch.cs
  3. +2
    -2
      TechbloxModdingAPI/Blocks/Engines/BlockCloneEngine.cs
  4. +9
    -4
      TechbloxModdingAPI/Blocks/Engines/BlockEngine.cs
  5. +0
    -5
      TechbloxModdingAPI/Blocks/Engines/BlockEventsEngine.cs
  6. +0
    -1
      TechbloxModdingAPI/Blocks/Engines/PlacementEngine.cs
  7. +7
    -0
      TechbloxModdingAPI/EcsObjectBase.cs
  8. +1
    -1
      TechbloxModdingAPI/Engines/IReactionaryEngine.cs
  9. +1
    -1
      TechbloxModdingAPI/Input/FakeInputPatch.cs
  10. +1
    -1
      TechbloxModdingAPI/Persistence/SaveAndLoadCompositionRootPatch.cs
  11. +10
    -1
      TechbloxModdingAPI/Player.cs
  12. +9
    -6
      TechbloxModdingAPI/Players/PlayerEngine.cs
  13. +1
    -0
      TechbloxModdingAPI/Players/PlayerEventsEngine.cs
  14. +9
    -0
      TechbloxModdingAPI/Players/PlayerState.cs
  15. +13
    -3
      TechbloxModdingAPI/Players/PlayerTests.cs
  16. +176
    -0
      TechbloxModdingAPI/TechbloxModdingAPI.csproj
  17. +2
    -1
      TechbloxModdingAPI/Tests/TestRoot.cs
  18. +2
    -2
      TechbloxModdingAPI/Utility/FullGameFields.cs
  19. +4
    -2
      TechbloxModdingAPI/Utility/WeakDictionary.cs

+ 3
- 3
CodeGenerator/Program.cs View File

@@ -11,11 +11,11 @@ namespace CodeGenerator
public static void Main(string[] args)
{
var bcg = new BlockClassGenerator();
bcg.Generate("Engine", null, new Dictionary<string, string>
/*bcg.Generate("Engine", null, new Dictionary<string, string>
{
{ "engineOn", "On" }
{ "engineOn", "On" } - TODO: Internal struct
}, typeof(EngineBlockComponent), // Simulation time properties
typeof(EngineBlockTweakableComponent), typeof(EngineBlockReadonlyComponent));
typeof(EngineBlockTweakableComponent), typeof(EngineBlockReadonlyComponent));*/
bcg.Generate("DampedSpring", "DAMPEDSPRING_BLOCK_GROUP", new Dictionary<string, string>
{
{"maxExtent", "MaxExtension"}


+ 2
- 0
TechbloxModdingAPI/App/AntiAntiCheatPatch.cs View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using HarmonyLib;
using Svelto.Tasks;
using Techblox.Anticheat.Client;

namespace TechbloxModdingAPI.App
{
@@ -22,6 +23,7 @@ namespace TechbloxModdingAPI.App
harmony.Patch(AccessTools.Method(type, "StopProtectedSession"), new HarmonyMethod(((AntiAnticheatDelegateBool) AntiAntiCheat).Method));
harmony.Patch(AccessTools.Method("Techblox.Services.Eos.Anticheat.Client.EosGetPendingMessagesToSendServiceRequest:Execute"), new HarmonyMethod(((AntiAnticheatDelegateTask)AntiAntiCheatTask).Method));
harmony.Patch(AccessTools.Method("Techblox.Anticheat.Client.Engines.ShowFeedbackDialogEngine:PollAnticheatStatus"), new HarmonyMethod(((AntiAnticheatDelegateTask)AntiAntiCheatTask).Method));
harmony.Patch(AccessTools.Method(typeof(AnticheatClientCompositionRoot), "ClientComposeTimeRunning"), new HarmonyMethod(((Func<bool>)AntiAntiCheat).Method));
}

private static bool AntiAntiCheat() => false;


+ 2
- 2
TechbloxModdingAPI/Blocks/Engines/BlockCloneEngine.cs View File

@@ -48,8 +48,8 @@ namespace TechbloxModdingAPI.Blocks.Engines
pickedBlock.pickedBlockEntityID = sourceID;
pickedBlock.placedBlockEntityID = targetID;
pickedBlock.placedBlockTweaksMustCopy = true;
if (entitiesDB.Exists<DBEntityStruct>(pickedBlock.pickedBlockEntityID)
&& entitiesDB.Exists<DBEntityStruct>(pickedBlock.placedBlockEntityID))
if (entitiesDB.Exists<BlockTagEntityStruct>(pickedBlock.pickedBlockEntityID)
&& entitiesDB.Exists<BlockTagEntityStruct>(pickedBlock.placedBlockEntityID))
{
copyFromBlock.Invoke(Patch.copyEngine, new object[] {pickedBlock.ID, pickedBlock});



+ 9
- 4
TechbloxModdingAPI/Blocks/Engines/BlockEngine.cs View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -79,6 +80,10 @@ namespace TechbloxModdingAPI.Blocks.Engines

public ref T GetBlockInfo<T>(Block block) where T : unmanaged, IEntityComponent
{
#if DEBUG
if (!typeof(BlockTagEntityStruct).IsAssignableFrom(typeof(T)) && block.Exists && block.InitData.Valid)
throw new ArgumentException("The block exists but the init data has not been removed!");
#endif
return ref entitiesDB.QueryEntityOrDefault<T>(block);
}

@@ -111,7 +116,7 @@ namespace TechbloxModdingAPI.Blocks.Engines
: uint.MaxValue;
if (prefabAssetID == uint.MaxValue)
{
if (entitiesDB.QueryEntityOptional<DBEntityStruct>(block)) //The block exists
if (entitiesDB.QueryEntityOptional<BlockTagEntityStruct>(block)) //The block exists
throw new BlockException("Prefab asset ID not found for block " + block); //Set by the game
return;
}
@@ -136,7 +141,7 @@ namespace TechbloxModdingAPI.Blocks.Engines

public bool BlockExists(EGID blockID)
{
return entitiesDB.Exists<DBEntityStruct>(blockID);
return entitiesDB.Exists<BlockTagEntityStruct>(blockID);
}

public SimBody[] GetSimBodiesFromID(byte id)
@@ -202,10 +207,10 @@ namespace TechbloxModdingAPI.Blocks.Engines

public EGID? FindBlockEGID(uint id)
{
var groups = entitiesDB.FindGroups<DBEntityStruct>();
var groups = entitiesDB.FindGroups<BlockTagEntityStruct>();
foreach (ExclusiveGroupStruct group in groups)
{
if (entitiesDB.Exists<DBEntityStruct>(id, group))
if (entitiesDB.Exists<BlockTagEntityStruct>(id, group))
return new EGID(id, group);
}



+ 0
- 5
TechbloxModdingAPI/Blocks/Engines/BlockEventsEngine.cs View File

@@ -26,18 +26,13 @@ namespace TechbloxModdingAPI.Blocks.Engines
public string Name { get; } = "TechbloxModdingAPIBlockEventsEngine";
public bool isRemovable { get; } = false;

private bool shouldAddRemove;
public void Add(ref BlockTagEntityStruct entityComponent, EGID egid)
{
if (!(shouldAddRemove = !shouldAddRemove))
return;
Placed.Invoke(this, new BlockPlacedRemovedEventArgs {ID = egid});
}

public void Remove(ref BlockTagEntityStruct entityComponent, EGID egid)
{
if (!(shouldAddRemove = !shouldAddRemove))
return;
Removed.Invoke(this, new BlockPlacedRemovedEventArgs {ID = egid});
}
}


+ 0
- 1
TechbloxModdingAPI/Blocks/Engines/PlacementEngine.cs View File

@@ -54,7 +54,6 @@ namespace TechbloxModdingAPI.Blocks.Engines
//RobocraftX.CR.MachineEditing.PlaceSingleBlockEngine
DBEntityStruct dbEntity = new DBEntityStruct {DBID = block};

//TODO: Test
EntityInitializer structInitializer = _blockEntityFactory.Build(CommonExclusiveGroups.blockIDGeneratorClient.Next(), block); //The ghost block index is only used for triggers
uint prefabAssetID = structInitializer.Has<PrefabAssetIDComponent>()
? structInitializer.Get<PrefabAssetIDComponent>().prefabAssetID


+ 7
- 0
TechbloxModdingAPI/EcsObjectBase.cs View File

@@ -62,6 +62,13 @@ namespace TechbloxModdingAPI
var id = initializer(this);
if (!dict.ContainsKey(id)) // Multiple instances may be created
dict.Add(id, this);
else
{
Logging.MetaDebugLog($"An object of this type and ID is already stored: {GetType()} - {id}");
Logging.MetaDebugLog(this);
Logging.MetaDebugLog(dict[id]);
}

Id = id;
}



+ 1
- 1
TechbloxModdingAPI/Engines/IReactionaryEngine.cs View File

@@ -14,7 +14,7 @@ namespace TechbloxModdingAPI.Engines
/// <summary>
/// Engine interface to handle ModEventEntityStruct events emitted by IEventEmitterEngines.
/// </summary>
public interface IReactionaryEngine<T> : IApiEngine, IReactOnAddAndRemove<T>, IReactOnAddAndRemove where T : unmanaged, IEntityComponent
public interface IReactionaryEngine<T> : IApiEngine, IReactOnAddAndRemove<T> where T : unmanaged, IEntityComponent
{
}
}

+ 1
- 1
TechbloxModdingAPI/Input/FakeInputPatch.cs View File

@@ -13,7 +13,7 @@ namespace TechbloxModdingAPI.Input

public static MethodBase TargetMethod()
{
return AccessTools.Method("RobocraftX.Multiplayer.Input.NetworkInputRecorderEngine:RecordDeterministicInput");
return AccessTools.Method("RobocraftX.Multiplayer.Input.DeterministicInputRecorderEngine:RecordDeterministicInput");
}
}
}

+ 1
- 1
TechbloxModdingAPI/Persistence/SaveAndLoadCompositionRootPatch.cs View File

@@ -7,7 +7,7 @@ using HarmonyLib;

namespace TechbloxModdingAPI.Persistence
{
[HarmonyPatch(typeof(SaveAndLoadCompositionRoot), "Compose")]
[HarmonyPatch(typeof(SaveAndLoadCompositionRoot), "ServerCompose")]
class SaveAndLoadCompositionRootPatch
{
public static EnginesRoot currentEnginesRoot;


+ 10
- 1
TechbloxModdingAPI/Player.cs View File

@@ -71,7 +71,7 @@ namespace TechbloxModdingAPI
get
{
if (localPlayer == null || localPlayer.Id != playerEngine.GetLocalPlayer())
localPlayer = new Player(PlayerType.Local);
localPlayer = GetInstance(playerEngine.GetLocalPlayer());
return localPlayer;
}
}
@@ -363,6 +363,15 @@ namespace TechbloxModdingAPI
public PlayerBuildingMode BuildingMode => (PlayerBuildingMode)Math.Log((double)playerEngine
.GetCharacterStruct<TimeStoppedModeComponent>(Id).Get().timeStoppedContext, 2); // It's a bit field in game now

public PlayerState State =>
playerEngine.GetCharacterStruct<CharacterTagEntityStruct>(Id).Get().ID.groupID switch
{
var group when group == CharacterExclusiveGroups.MachineSpawningGroup => PlayerState.HoldingMachine,
var group when group == CharacterExclusiveGroups.OnFootGroup => PlayerState.OnFoot,
var group when group == CharacterExclusiveGroups.InPilotSeatGroup => PlayerState.InSeat,
_ => throw new ArgumentOutOfRangeException("", "Unknown player state")
};

/// <summary>
/// Whether the player is sprinting.
/// </summary>


+ 9
- 6
TechbloxModdingAPI/Players/PlayerEngine.cs View File

@@ -9,16 +9,14 @@ using RobocraftX.CR.MachineEditing.BoxSelect;
using RobocraftX.Physics;
using RobocraftX.Blocks.Ghost;
using Gamecraft.GUI.HUDFeedbackBlocks;
using RobocraftX.Blocks;
using RobocraftX.Multiplayer;
using RobocraftX.PilotSeat;
using RobocraftX.SimulationModeState;
using Svelto.ECS;
using Techblox.Camera;
using Unity.Mathematics;
using Svelto.ECS.DataStructures;
using Svelto.ECS.EntityStructs;
using Techblox.BuildingDrone;
using Techblox.Character;

using TechbloxModdingAPI.Engines;
using TechbloxModdingAPI.Input;
@@ -209,9 +207,9 @@ namespace TechbloxModdingAPI.Players
{
if (!TimeRunningModeUtil.IsTimeRunningMode(entitiesDB))
return;
PilotSeatGroupUtils.SwapTagTo<OCCUPIED_TAG>(Functions, seatId);
/*PilotSeatGroupUtils.SwapTagTo<OCCUPIED_TAG>(Functions, seatId);
var opt = GetCharacterStruct<CharacterPilotSeatEntityStruct>(playerId, out var group);
if (!opt) return;
if (!opt) return; - TODO: This is server code and mods run in client code atm. We can only send inputs even in singleplayer as it is.
ref CharacterPilotSeatEntityStruct charSeat = ref opt.Get();
var charId = new EGID(playerId, group);
charSeat.pilotSeatEntity = entitiesDB.GetEntityReference(seatId);
@@ -221,7 +219,7 @@ namespace TechbloxModdingAPI.Players
ref var seat = ref entitiesDB.QueryEntity<PilotSeatEntityStruct>(seatId);
seat.occupyingCharacter = entitiesDB.GetEntityReference(charId);
charSeat.followCam = entitiesDB.QueryEntity<SeatFollowCamComponent>(seatId).followCam;
Functions.SwapEntityGroup<CharacterEntityDescriptor>(charId, CharacterExclusiveGroups.InPilotSeatGroup);
Functions.SwapEntityGroup<CharacterEntityDescriptor>(charId, CharacterExclusiveGroups.InPilotSeatGroup);*/
}

public void ExitSeat(uint playerId)
@@ -242,6 +240,11 @@ namespace TechbloxModdingAPI.Players
EGID egid = new EGID(playerId, CharacterExclusiveGroups.MachineSpawningGroup);
if (!entitiesDB.Exists<CharacterTagEntityStruct>(egid))
return false;
if (entitiesDB.QueryEntity<CharacterMachineSpawningValidityComponent>(egid).isMachinePlacementInvalid)
{
Logging.MetaDebugLog("Machine placement invalid");
return false;
}
//Functions.SwapEntityGroup<CharacterEntityDescriptor>(egid, CharacterExclusiveGroups.OnFootGroup);
FakeInput.ActionInput(playerId, primary: true);
return true;


+ 1
- 0
TechbloxModdingAPI/Players/PlayerEventsEngine.cs View File

@@ -1,3 +1,4 @@
using System;
using RobocraftX.Character;
using RobocraftX.Character.Movement;
using RobocraftX.Common.Input;


+ 9
- 0
TechbloxModdingAPI/Players/PlayerState.cs View File

@@ -0,0 +1,9 @@
namespace TechbloxModdingAPI.Players
{
public enum PlayerState
{
HoldingMachine,
OnFoot,
InSeat
}
}

+ 13
- 3
TechbloxModdingAPI/Players/PlayerTests.cs View File

@@ -29,7 +29,7 @@ namespace TechbloxModdingAPI.Players
[APITestCase(TestType.EditMode)]
public static void PositionTest()
{
Player p = new Player(PlayerType.Local);
Player p = Player.LocalPlayer;
if (!Assert.Errorless(() => { p.Teleport(0, 0, 0, relative: false); }, "Player.Teleport(origin) errored: ", "Player teleported to origin successfully.")) return;
if (!Assert.CloseTo(p.Position, float3.zero, "Player is not close to origin despite being teleported there.", "Player.Position is at origin.")) return;
if (!Assert.Errorless(() => { p.Position = float3.zero + 1; }, "Player.Position = origin+1 errored: ", "Player moved to origin+1.")) return;
@@ -41,7 +41,7 @@ namespace TechbloxModdingAPI.Players
{
Player.LocalPlayer.SeatEntered += Assert.CallsBack<PlayerSeatEventArgs>("SeatEntered");
Player.LocalPlayer.SeatExited += Assert.CallsBack<PlayerSeatEventArgs>("SeatExited");
Block.PlaceNew(BlockIDs.DriverSeat, -1f);
Block.PlaceNew(BlockIDs.DriverSeat, Player.LocalPlayer.Position);
}

[APITestCase(TestType.SimulationMode)]
@@ -68,11 +68,21 @@ namespace TechbloxModdingAPI.Players
}

if (seats[0] is Seat seat)
{ //TODO: Actually, the problem is likely that the player ID is different in build and sim
Assert.Errorless(() => Player.LocalPlayer.EnterSeat(seat), "Failed to enter seat.",
"Entered seat successfully.");
while (Player.LocalPlayer.State != PlayerState.InSeat)
{
bool cont = false;
Client.Instance.PromptUser(new SingleChoicePrompt("Testing", $"Enter the seat at {seat.Position} pls", "OK", () => cont = true));
while (!cont)
yield return Yield.It;
yield return new WaitForSecondsEnumerator(5f).Continue();
}
}
else
Assert.Fail("Found a seat that is not a seat!");
yield return new WaitForSecondsEnumerator(1).Continue();
yield return new WaitForSecondsEnumerator(5).Continue();
Assert.Errorless(() => Player.LocalPlayer.ExitSeat(), "Failed to exit seat.",
"Exited seat successfully.");
}


+ 176
- 0
TechbloxModdingAPI/TechbloxModdingAPI.csproj View File

@@ -48,6 +48,14 @@
<HintPath>..\ref\Techblox_Data\Managed\Assembly-CSharp.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="AWSSDK.Core">
<HintPath>..\ref\Techblox_Data\Managed\AWSSDK.Core.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\AWSSDK.Core.dll</HintPath>
</Reference>
<Reference Include="AWSSDK.GameLift">
<HintPath>..\ref\Techblox_Data\Managed\AWSSDK.GameLift.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\AWSSDK.GameLift.dll</HintPath>
</Reference>
<Reference Include="BevelEffect">
<HintPath>..\ref\Techblox_Data\Managed\BevelEffect.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\BevelEffect.dll</HintPath>
@@ -88,6 +96,10 @@
<HintPath>..\ref\Techblox_Data\Managed\FMODUnityResonance.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\FMODUnityResonance.dll</HintPath>
</Reference>
<Reference Include="FMODUnityWrapperClient">
<HintPath>..\ref\Techblox_Data\Managed\FMODUnityWrapperClient.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\FMODUnityWrapperClient.dll</HintPath>
</Reference>
<Reference Include="FullGame">
<HintPath>..\ref\Techblox_Data\Managed\FullGame.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\FullGame.dll</HintPath>
@@ -312,6 +324,10 @@
<HintPath>..\ref\Techblox_Data\Managed\Gamecraft.Wires.Mockup.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Gamecraft.Wires.Mockup.dll</HintPath>
</Reference>
<Reference Include="GameLiftServerSDKNet45">
<HintPath>..\ref\Techblox_Data\Managed\GameLiftServerSDKNet45.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\GameLiftServerSDKNet45.dll</HintPath>
</Reference>
<Reference Include="GameState">
<HintPath>..\ref\Techblox_Data\Managed\GameState.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\GameState.dll</HintPath>
@@ -320,6 +336,10 @@
<HintPath>..\ref\Techblox_Data\Managed\GhostShark.Outline.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\GhostShark.Outline.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf">
<HintPath>..\ref\Techblox_Data\Managed\Google.Protobuf.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="GPUInstancer.CrowdAnimations">
<HintPath>..\ref\Techblox_Data\Managed\GPUInstancer.CrowdAnimations.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\GPUInstancer.CrowdAnimations.dll</HintPath>
@@ -340,10 +360,22 @@
<HintPath>..\ref\Techblox_Data\Managed\JWT.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\JWT.dll</HintPath>
</Reference>
<Reference Include="LiteNetLib">
<HintPath>..\ref\Techblox_Data\Managed\LiteNetLib.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\LiteNetLib.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\ref\Techblox_Data\Managed\log4net.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\log4net.dll</HintPath>
</Reference>
<Reference Include="LZ4">
<HintPath>..\ref\Techblox_Data\Managed\LZ4.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\LZ4.dll</HintPath>
</Reference>
<Reference Include="Monobehaviours">
<HintPath>..\ref\Techblox_Data\Managed\Monobehaviours.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Monobehaviours.dll</HintPath>
</Reference>
<Reference Include="mscorlib">
<HintPath>..\ref\Techblox_Data\Managed\mscorlib.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\mscorlib.dll</HintPath>
@@ -376,6 +408,10 @@
<HintPath>..\ref\Techblox_Data\Managed\Rewired_Windows.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Rewired_Windows.dll</HintPath>
</Reference>
<Reference Include="RichFX">
<HintPath>..\ref\Techblox_Data\Managed\RichFX.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RichFX.dll</HintPath>
</Reference>
<Reference Include="RobocraftECS">
<HintPath>..\ref\Techblox_Data\Managed\RobocraftECS.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftECS.dll</HintPath>
@@ -404,6 +440,10 @@
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.Building.Jobs.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.Building.Jobs.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.Character.Audio">
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.Character.Audio.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.Character.Audio.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.Character">
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.Character.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.Character.dll</HintPath>
@@ -480,6 +520,10 @@
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.MainGameMock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.MainGameMock.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.MainSimulation.Audio">
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.MainSimulation.Audio.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.MainSimulation.Audio.dll</HintPath>
</Reference>
<Reference Include="RobocraftX.MainSimulation">
<HintPath>..\ref\Techblox_Data\Managed\RobocraftX.MainSimulation.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocraftX.MainSimulation.dll</HintPath>
@@ -564,6 +608,10 @@
<HintPath>..\ref\Techblox_Data\Managed\RobocratX.SimulationMockCompositionRoot.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\RobocratX.SimulationMockCompositionRoot.dll</HintPath>
</Reference>
<Reference Include="ShaderVariantsGenerationTool">
<HintPath>..\ref\Techblox_Data\Managed\ShaderVariantsGenerationTool.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\ShaderVariantsGenerationTool.dll</HintPath>
</Reference>
<Reference Include="SpecializedDescriptors">
<HintPath>..\ref\Techblox_Data\Managed\SpecializedDescriptors.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\SpecializedDescriptors.dll</HintPath>
@@ -592,6 +640,22 @@
<HintPath>..\ref\Techblox_Data\Managed\Svelto.Tasks.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Svelto.Tasks.dll</HintPath>
</Reference>
<Reference Include="Techblox.AdditionalParts">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.AdditionalParts.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.AdditionalParts.dll</HintPath>
</Reference>
<Reference Include="Techblox.Anticheat.Client">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Anticheat.Client.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Anticheat.Client.dll</HintPath>
</Reference>
<Reference Include="Techblox.Anticheat.Common">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Anticheat.Common.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Anticheat.Common.dll</HintPath>
</Reference>
<Reference Include="Techblox.Anticheat.Server">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Anticheat.Server.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Anticheat.Server.dll</HintPath>
</Reference>
<Reference Include="Techblox.AtmosphereBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.AtmosphereBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.AtmosphereBlock.dll</HintPath>
@@ -604,6 +668,18 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Backend.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Backend.dll</HintPath>
</Reference>
<Reference Include="Techblox.BitBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.BitBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.BitBlock.dll</HintPath>
</Reference>
<Reference Include="Techblox.BlockColours">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.BlockColours.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.BlockColours.dll</HintPath>
</Reference>
<Reference Include="Techblox.BlockLabels">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.BlockLabels.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.BlockLabels.dll</HintPath>
</Reference>
<Reference Include="Techblox.Blocks.LightBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Blocks.LightBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Blocks.LightBlock.dll</HintPath>
@@ -620,10 +696,18 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Camera.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Camera.dll</HintPath>
</Reference>
<Reference Include="Techblox.Common.Audio">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Common.Audio.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Common.Audio.dll</HintPath>
</Reference>
<Reference Include="Techblox.ContextSensitiveTextHint">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.ContextSensitiveTextHint.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.ContextSensitiveTextHint.dll</HintPath>
</Reference>
<Reference Include="Techblox.ECSResourceManagers">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.ECSResourceManagers.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.ECSResourceManagers.dll</HintPath>
</Reference>
<Reference Include="Techblox.EngineBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.EngineBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.EngineBlock.dll</HintPath>
@@ -660,6 +744,14 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.BuildRules.MockUps.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.BuildRules.MockUps.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.Commands">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.Commands.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.Commands.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.Controls">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.Controls.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.Controls.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.dll</HintPath>
@@ -692,6 +784,10 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.Inventory.Materials.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.Inventory.Materials.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.LoadingBar">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.LoadingBar.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.LoadingBar.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.Login">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.Login.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.Login.dll</HintPath>
@@ -712,6 +808,10 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.Notifications.MockUps.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.Notifications.MockUps.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.ScreenCanvas">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.ScreenCanvas.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.ScreenCanvas.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.TabsBar.Landscapes">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.TabsBar.Landscapes.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.TabsBar.Landscapes.dll</HintPath>
@@ -720,10 +820,38 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.TabsBar.Materials.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.TabsBar.Materials.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.UsernameDisplay">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.UsernameDisplay.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.UsernameDisplay.dll</HintPath>
</Reference>
<Reference Include="Techblox.GUI.WorldCanvas">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.GUI.WorldCanvas.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.GUI.WorldCanvas.dll</HintPath>
</Reference>
<Reference Include="Techblox.InputCapture">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.InputCapture.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.InputCapture.dll</HintPath>
</Reference>
<Reference Include="Techblox.MachineSimulationPreprocessing">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.MachineSimulationPreprocessing.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.MachineSimulationPreprocessing.dll</HintPath>
</Reference>
<Reference Include="Techblox.MachineSpawning">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.MachineSpawning.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.MachineSpawning.dll</HintPath>
</Reference>
<Reference Include="Techblox.Matchmaking">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Matchmaking.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Matchmaking.dll</HintPath>
</Reference>
<Reference Include="Techblox.Multiplayer.UsernameMessages">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Multiplayer.UsernameMessages.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Multiplayer.UsernameMessages.dll</HintPath>
</Reference>
<Reference Include="Techblox.PlayUX">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.PlayUX.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.PlayUX.dll</HintPath>
</Reference>
<Reference Include="Techblox.Pointer">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Pointer.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Pointer.dll</HintPath>
@@ -756,22 +884,66 @@
<HintPath>..\ref\Techblox_Data\Managed\Techblox.SaveGamesConversion.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.SaveGamesConversion.dll</HintPath>
</Reference>
<Reference Include="Techblox.Server">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Server.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Server.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Anticheat.Client">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Anticheat.Client.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Anticheat.Client.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Anticheat.Server">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Anticheat.Server.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Anticheat.Server.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Eos.Common">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Eos.Common.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Eos.Common.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Eos">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Eos.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Eos.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Eos.Server">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Eos.Server.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Eos.Server.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.GameDetails">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.GameDetails.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.GameDetails.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.LocalPreferences">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.LocalPreferences.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.LocalPreferences.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Matchmaking">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Matchmaking.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Matchmaking.dll</HintPath>
</Reference>
<Reference Include="Techblox.Services.Storage">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.Services.Storage.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.Services.Storage.dll</HintPath>
</Reference>
<Reference Include="Techblox.SignalHandling.Audio">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.SignalHandling.Audio.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.SignalHandling.Audio.dll</HintPath>
</Reference>
<Reference Include="Techblox.SignalHandling.Common">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.SignalHandling.Common.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.SignalHandling.Common.dll</HintPath>
</Reference>
<Reference Include="Techblox.SwitchAnimation">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.SwitchAnimation.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.SwitchAnimation.dll</HintPath>
</Reference>
<Reference Include="Techblox.TextBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.TextBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.TextBlock.dll</HintPath>
</Reference>
<Reference Include="Techblox.TimerBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.TimerBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.TimerBlock.dll</HintPath>
</Reference>
<Reference Include="Techblox.WheelRigBlock">
<HintPath>..\ref\Techblox_Data\Managed\Techblox.WheelRigBlock.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Techblox.WheelRigBlock.dll</HintPath>
@@ -1228,6 +1400,10 @@
<HintPath>..\ref\Techblox_Data\Managed\VisualProfiler.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\VisualProfiler.dll</HintPath>
</Reference>
<Reference Include="websocket-sharp">
<HintPath>..\ref\Techblox_Data\Managed\websocket-sharp.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\websocket-sharp.dll</HintPath>
</Reference>
<Reference Include="Whinarn.UnityMeshSimplifier.Runtime">
<HintPath>..\ref\Techblox_Data\Managed\Whinarn.UnityMeshSimplifier.Runtime.dll</HintPath>
<HintPath>..\..\ref\Techblox_Data\Managed\Whinarn.UnityMeshSimplifier.Runtime.dll</HintPath>


+ 2
- 1
TechbloxModdingAPI/Tests/TestRoot.cs View File

@@ -200,7 +200,8 @@ namespace TechbloxModdingAPI.Tests
cont = false;
}

yield return Yield.It;
if (cont)
yield return enumerator.Current;
} while (cont);
}



+ 2
- 2
TechbloxModdingAPI/Utility/FullGameFields.cs View File

@@ -122,11 +122,11 @@ namespace TechbloxModdingAPI.Utility
}
}

public static ECSResourceManagers _managers
public static ECSMainGameResourceManagers _managers
{
get
{
return (ECSResourceManagers)fgcr?.Field("_managers").GetValue();
return (ECSMainGameResourceManagers)fgcr?.Field("_gameManagers").GetValue();
}
}



+ 4
- 2
TechbloxModdingAPI/Utility/WeakDictionary.cs View File

@@ -54,7 +54,7 @@ namespace TechbloxModdingAPI.Utility

public bool ContainsKey(TKey key)
{
return _dictionary.ContainsKey(key);
return TryGetValue(key, out _);
}

public void Add(TKey key, TValue value)
@@ -70,7 +70,9 @@ namespace TechbloxModdingAPI.Utility
public bool TryGetValue(TKey key, out TValue value)
{
value = null;
return _dictionary.TryGetValue(key, out var reference) && reference.TryGetTarget(out value);
bool ret = _dictionary.TryGetValue(key, out var reference) && reference.TryGetTarget(out value);
if (!ret) _dictionary.Remove(key);
return ret;
}

public TValue this[TKey key]


Loading…
Cancel
Save