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
This commit is contained in:
Norbi Peti 2022-01-30 04:32:10 +01:00
parent 09d3c5e81c
commit d27bcee8d5
19 changed files with 252 additions and 33 deletions

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"}

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;

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});

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);
}

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});
}
}

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

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;
}

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
{
}
}

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");
}
}
}

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;

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>

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;

View file

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

View file

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

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.");
}

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>

View file

@ -200,7 +200,8 @@ namespace TechbloxModdingAPI.Tests
cont = false;
}
yield return Yield.It;
if (cont)
yield return enumerator.Current;
} while (cont);
}

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();
}
}

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]