@@ -39,7 +39,7 @@ if __name__ == "__main__": | |||
args = parser.parse_args() | |||
print("Building Assembly references") | |||
asmXml = buildReferencesXml("../ref/TechbloxPreview_Data/Managed") | |||
asmXml = buildReferencesXml("../ref_preview/TechbloxPreview_Data/Managed") | |||
# print(asmXml) | |||
with open("../TechbloxModdingAPI/TechbloxModdingAPI.csproj", "r") as xmlFile: | |||
@@ -1,23 +1,27 @@ | |||
namespace TechbloxModdingAPI.App | |||
using System; | |||
namespace TechbloxModdingAPI.App | |||
{ | |||
public enum CurrentGameMode | |||
{ | |||
None, | |||
/// <summary> | |||
/// Building a game | |||
/// Building a world | |||
/// </summary> | |||
Build, | |||
/// <summary> | |||
/// Playing a game | |||
/// Playing on a map | |||
/// </summary> | |||
Play, | |||
/// <summary> | |||
/// Viewing a prefab | |||
/// Viewing a prefab (doesn't exist anymore) | |||
/// </summary> | |||
[Obsolete] | |||
View, | |||
/// <summary> | |||
/// Viewing a tutorial | |||
/// Viewing a tutorial (doesn't exist anymore) | |||
/// </summary> | |||
[Obsolete] | |||
Tutorial | |||
} | |||
} |
@@ -2,12 +2,10 @@ | |||
using System.Collections.Generic; | |||
using System.Runtime.CompilerServices; | |||
using RobocraftX.Common; | |||
using RobocraftX.GUI.MyGamesScreen; | |||
using RobocraftX.StateSync; | |||
using Svelto.ECS; | |||
using Techblox.GameSelection; | |||
using TechbloxModdingAPI; | |||
using TechbloxModdingAPI.Blocks; | |||
using TechbloxModdingAPI.Tasks; | |||
using TechbloxModdingAPI.Utility; | |||
@@ -318,7 +316,7 @@ namespace TechbloxModdingAPI.App | |||
get | |||
{ | |||
if (menuMode || !VerifyMode()) return CurrentGameMode.None; | |||
return (CurrentGameMode) GameMode.CurrentMode; | |||
return gameEngine.GetGameData().gameMode == GameMode.CreateWorld ? CurrentGameMode.Build : CurrentGameMode.Play; | |||
} | |||
} | |||
@@ -54,7 +54,7 @@ namespace TechbloxModdingAPI.App | |||
{ | |||
if (async) | |||
{ | |||
ExitCurrentGameAsync().RunOn(Lean.EveryFrameStepRunner_TimeRunningAndStopped); | |||
ExitCurrentGameAsync().RunOn(ClientLean.EveryFrameStepRunner_TimeRunningAndStopped); | |||
} | |||
else | |||
{ | |||
@@ -3,16 +3,14 @@ using System.Reflection; | |||
using HarmonyLib; | |||
using RobocraftX; | |||
using RobocraftX.Common; | |||
using RobocraftX.FrontEnd; | |||
using RobocraftX.GUI; | |||
using RobocraftX.GUI.MyGamesScreen; | |||
using Svelto.ECS; | |||
using Svelto.ECS.Experimental; | |||
using Techblox.GameSelection; | |||
using TechbloxModdingAPI.Engines; | |||
using TechbloxModdingAPI.Utility; | |||
using GameMode = RobocraftX.Common.GameMode; | |||
namespace TechbloxModdingAPI.App | |||
{ | |||
@@ -107,11 +105,10 @@ namespace TechbloxModdingAPI.App | |||
public bool EnterGame(string gameName, string fileId, bool autoEnterSim = false) | |||
{ | |||
GameMode.CurrentMode = autoEnterSim ? RCXMode.Play : RCXMode.Build; | |||
var data = new GameSelectionData | |||
{ | |||
gameMode = Techblox.GameSelection.GameMode.PlayGame, | |||
gameType = GameType.MachineEditor, | |||
isOnline = false, | |||
saveName = gameName, | |||
saveType = SaveType.ExistingSave, | |||
gameID = "GAMEID_Road_Track", //TODO: Expose to the API | |||
@@ -8,9 +8,10 @@ using Svelto.ECS.EntityStructs; | |||
using RobocraftX.Common; | |||
using RobocraftX.Blocks; | |||
using Unity.Mathematics; | |||
using Gamecraft.Blocks.GUI; | |||
using HarmonyLib; | |||
using RobocraftX.PilotSeat; | |||
using RobocraftX.Rendering; | |||
using Techblox.BlockLabels; | |||
using TechbloxModdingAPI.Blocks; | |||
using TechbloxModdingAPI.Blocks.Engines; | |||
@@ -342,11 +343,9 @@ namespace TechbloxModdingAPI | |||
[TestValue(null)] | |||
public string Label | |||
{ | |||
get => BlockEngine.GetBlockInfoViewComponent<TextLabelEntityViewStruct>(this).textLabelComponent?.text; | |||
get => BlockEngine.GetBlockInfo<LabelResourceIDComponent>(this).ToString(); //TODO: Block labels | |||
set | |||
{ | |||
var comp = BlockEngine.GetBlockInfoViewComponent<TextLabelEntityViewStruct>(this).textLabelComponent; | |||
if (comp != null) comp.text = value; | |||
{ //TODO | |||
} | |||
} | |||
@@ -60,7 +60,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
copyToBlock.Invoke(Patch.copyEngine, new object[] {pickedBlock.ID, pickedBlock}); | |||
ExclusiveGroupStruct group = WiresExclusiveGroups.WIRES_COPY_GROUP + playerID; | |||
ExclusiveGroupStruct group = BuildModeWiresGroups.WIRES_COPY_GROUP + playerID; | |||
copyWireToBlock.Invoke(Patch.createWireEngine, new object[] {group, pickedBlock.ID}); | |||
pickedBlock.placedBlockTweaksMustCopy = false; | |||
@@ -1,5 +1,4 @@ | |||
using RobocraftX.Common; | |||
using RobocraftX.UECS; | |||
using Svelto.ECS; | |||
using Svelto.ECS.EntityStructs; | |||
using Unity.Mathematics; | |||
@@ -54,7 +54,8 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
//RobocraftX.CR.MachineEditing.PlaceSingleBlockEngine | |||
DBEntityStruct dbEntity = new DBEntityStruct {DBID = block}; | |||
EntityInitializer structInitializer = _blockEntityFactory.Build(CommonExclusiveGroups.nextBlockEntityID, block); //The ghost block index is only used for triggers | |||
//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 | |||
: throw new BlockException("Prefab asset ID not found!"); //Set by the game | |||
@@ -43,7 +43,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public WireEntityStruct CreateNewWire(EGID startBlock, byte startPort, EGID endBlock, byte endPort) | |||
{ | |||
EGID wireEGID = new EGID(WiresExclusiveGroups.NewWireEntityId, NamedExclusiveGroup<WiresGroup>.Group); | |||
EGID wireEGID = new EGID(BuildModeWiresGroups.NewWireEntityId, BuildModeWiresGroups.WiresGroup.Group); | |||
EntityInitializer wireInitializer = Factory.BuildEntity<WireEntityDescriptor>(wireEGID); | |||
wireInitializer.Init(new WireEntityStruct | |||
{ | |||
@@ -77,8 +77,8 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public ref PortEntityStruct GetPortByOffset(BlockPortsStruct bps, byte portNumber, bool input) | |||
{ | |||
ExclusiveGroup group = input | |||
? NamedExclusiveGroup<InputPortsGroup>.Group | |||
: NamedExclusiveGroup<OutputPortsGroup>.Group; | |||
? NamedExclusiveGroup<BuildModeWiresGroups.InputPortsGroup>.Group | |||
: NamedExclusiveGroup<BuildModeWiresGroups.OutputPortsGroup>.Group; | |||
uint id = (input ? bps.firstInputID : bps.firstOutputID) + portNumber; | |||
EGID egid = new EGID(id, group); | |||
if (!entitiesDB.Exists<PortEntityStruct>(egid)) | |||
@@ -193,7 +193,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
EGID[] inputs = new EGID[ports.inputCount]; | |||
for (uint i = 0; i < ports.inputCount; i++) | |||
{ | |||
inputs[i] = new EGID(i + ports.firstInputID, NamedExclusiveGroup<InputPortsGroup>.Group); | |||
inputs[i] = new EGID(i + ports.firstInputID, NamedExclusiveGroup<BuildModeWiresGroups.InputPortsGroup>.Group); | |||
} | |||
return inputs; | |||
} | |||
@@ -204,7 +204,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
EGID[] outputs = new EGID[ports.outputCount]; | |||
for (uint i = 0; i < ports.outputCount; i++) | |||
{ | |||
outputs[i] = new EGID(i + ports.firstOutputID, NamedExclusiveGroup<OutputPortsGroup>.Group); | |||
outputs[i] = new EGID(i + ports.firstOutputID, NamedExclusiveGroup<BuildModeWiresGroups.OutputPortsGroup>.Group); | |||
} | |||
return outputs; | |||
} | |||
@@ -219,8 +219,8 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
if (!entitiesDB.Exists<BlockPortsStruct>(block)) | |||
return default; | |||
var group = output | |||
? NamedExclusiveGroup<OutputPortsGroup>.Group | |||
: NamedExclusiveGroup<InputPortsGroup>.Group; | |||
? NamedExclusiveGroup<BuildModeWiresGroups.OutputPortsGroup>.Group | |||
: NamedExclusiveGroup<BuildModeWiresGroups.InputPortsGroup>.Group; | |||
BlockPortsStruct ports = entitiesDB.QueryEntity<BlockPortsStruct>(block); | |||
if (!entitiesDB.TryQueryMappedEntities<PortEntityStruct>(group, out var mapper)) | |||
return default; | |||
@@ -237,7 +237,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public ref WireEntityStruct MatchPortToWire(PortEntityStruct port, EGID blockID, out bool exists) | |||
{ | |||
var wires = entitiesDB.QueryEntities<WireEntityStruct>(NamedExclusiveGroup<WiresGroup>.Group); | |||
var wires = entitiesDB.QueryEntities<WireEntityStruct>(NamedExclusiveGroup<BuildModeWiresGroups.WiresGroup>.Group); | |||
var wiresB = wires.ToBuffer().buffer; | |||
for (uint i = 0; i < wires.count; i++) | |||
{ | |||
@@ -264,7 +264,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
else | |||
{ | |||
BlockPortsStruct ports = entitiesDB.QueryEntity<BlockPortsStruct>(startBlock); | |||
startPorts = new EGID[] {new EGID(ports.firstOutputID + startPort, NamedExclusiveGroup<OutputPortsGroup>.Group) }; | |||
startPorts = new EGID[] {new EGID(ports.firstOutputID + startPort, NamedExclusiveGroup<BuildModeWiresGroups.OutputPortsGroup>.Group) }; | |||
} | |||
EGID[] endPorts; | |||
@@ -276,10 +276,10 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
else | |||
{ | |||
BlockPortsStruct ports = entitiesDB.QueryEntity<BlockPortsStruct>(endBlock); | |||
endPorts = new EGID[] {new EGID(ports.firstInputID + endPort, NamedExclusiveGroup<InputPortsGroup>.Group) }; | |||
endPorts = new EGID[] {new EGID(ports.firstInputID + endPort, NamedExclusiveGroup<BuildModeWiresGroups.InputPortsGroup>.Group) }; | |||
} | |||
EntityCollection<WireEntityStruct> wires = entitiesDB.QueryEntities<WireEntityStruct>(NamedExclusiveGroup<WiresGroup>.Group); | |||
EntityCollection<WireEntityStruct> wires = entitiesDB.QueryEntities<WireEntityStruct>(NamedExclusiveGroup<BuildModeWiresGroups.WiresGroup>.Group); | |||
var wiresB = wires.ToBuffer().buffer; | |||
for (int endIndex = 0; endIndex < endPorts.Length; endIndex++) | |||
{ | |||
@@ -304,7 +304,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public OptionalRef<ChannelDataStruct> GetChannelDataStruct(EGID portID) | |||
{ | |||
var port = GetPort(portID); | |||
var channels = entitiesDB.QueryEntities<ChannelDataStruct>(NamedExclusiveGroup<ChannelDataGroup>.Group); | |||
var channels = entitiesDB.QueryEntities<ChannelDataStruct>(NamedExclusiveGroup<BuildModeWiresGroups.ChannelDataGroup>.Group); | |||
var channelsB = channels.ToBuffer(); | |||
return port.firstChannelIndexCachedInSim < channels.count | |||
? new OptionalRef<ChannelDataStruct>(channelsB.buffer, port.firstChannelIndexCachedInSim) | |||
@@ -329,7 +329,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public EGID[] WiredToInput(EGID block, byte port) | |||
{ | |||
WireEntityStruct[] wireEntityStructs = Search(NamedExclusiveGroup<WiresGroup>.Group, | |||
WireEntityStruct[] wireEntityStructs = Search(NamedExclusiveGroup<BuildModeWiresGroups.WiresGroup>.Group, | |||
(WireEntityStruct wes) => wes.destinationPortUsage == port && wes.destinationBlockEGID == block); | |||
EGID[] result = new EGID[wireEntityStructs.Length]; | |||
for (uint i = 0; i < wireEntityStructs.Length; i++) | |||
@@ -342,7 +342,7 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
public EGID[] WiredToOutput(EGID block, byte port) | |||
{ | |||
WireEntityStruct[] wireEntityStructs = Search(NamedExclusiveGroup<WiresGroup>.Group, | |||
WireEntityStruct[] wireEntityStructs = Search(NamedExclusiveGroup<BuildModeWiresGroups.WiresGroup>.Group, | |||
(WireEntityStruct wes) => wes.sourcePortUsage == port && wes.sourceBlockEGID == block); | |||
EGID[] result = new EGID[wireEntityStructs.Length]; | |||
for (uint i = 0; i < wireEntityStructs.Length; i++) | |||
@@ -371,13 +371,13 @@ namespace TechbloxModdingAPI.Blocks.Engines | |||
private EntityCollection<ChannelDataStruct> GetSignalStruct(uint signalID, out uint index, bool input = true) | |||
{ | |||
ExclusiveGroup group = input | |||
? NamedExclusiveGroup<InputPortsGroup>.Group | |||
: NamedExclusiveGroup<OutputPortsGroup>.Group; | |||
? NamedExclusiveGroup<BuildModeWiresGroups.InputPortsGroup>.Group | |||
: NamedExclusiveGroup<BuildModeWiresGroups.OutputPortsGroup>.Group; | |||
if (entitiesDB.Exists<PortEntityStruct>(signalID, group)) | |||
{ | |||
index = entitiesDB.QueryEntity<PortEntityStruct>(signalID, group).anyChannelIndex; | |||
var channelData = | |||
entitiesDB.QueryEntities<ChannelDataStruct>(NamedExclusiveGroup<ChannelDataGroup>.Group); | |||
entitiesDB.QueryEntities<ChannelDataStruct>(NamedExclusiveGroup<BuildModeWiresGroups.ChannelDataGroup>.Group); | |||
return channelData; | |||
} | |||
@@ -111,7 +111,7 @@ namespace TechbloxModdingAPI.Input | |||
ref LocalPlayerInputEntityStruct currentInput = ref inputEngine.GetPlayerInputRef(playerID); | |||
//Utility.Logging.CommandLog($"Current sim frame {currentInput.frame}"); | |||
// set inputs | |||
if (toggleMode) currentInput.actionMask |= RobocraftX.Common.Input.ActionInput.ToggleTimeRunningMode; | |||
if (toggleMode) currentInput.actionMask |= RobocraftX.Common.Input.ActionInput.ToggleTimeRunningModeTest; //TODO: Test, play | |||
if (forward) currentInput.actionMask |= RobocraftX.Common.Input.ActionInput.Forward; | |||
if (backward) currentInput.actionMask |= RobocraftX.Common.Input.ActionInput.Backward; | |||
if (up) currentInput.actionMask |= RobocraftX.Common.Input.ActionInput.Up; | |||
@@ -25,7 +25,7 @@ namespace TechbloxModdingAPI.Persistence | |||
Logging.MetaDebugLog("Skipping component serialization: no serializers registered!"); | |||
return; | |||
} | |||
serializationData.data.ExpandBy((uint)frameStart.Length); | |||
serializationData.data.IncreaseCapacityBy((uint)frameStart.Length); | |||
BinaryBufferWriter bbw = new BinaryBufferWriter(serializationData.data.ToArrayFast(out int buffLen), serializationData.dataPos); | |||
uint originalPos = serializationData.dataPos; | |||
Logging.MetaDebugLog($"dataPos: {originalPos}"); | |||
@@ -35,14 +35,14 @@ namespace TechbloxModdingAPI.Persistence | |||
bbw.Write(frameStart[i]); | |||
} | |||
Logging.MetaDebugLog($"dataPos (after frame start): {bbw.Position}"); | |||
serializationData.data.ExpandBy(4u); | |||
serializationData.data.IncreaseCapacityBy(4u); | |||
bbw.Write((uint)SerializerManager.GetSerializersCount()); | |||
string[] serializerKeys = SerializerManager.GetSerializerNames(); | |||
for (uint c = 0; c < serializerKeys.Length; c++) | |||
{ | |||
Logging.MetaDebugLog($"dataPos (loop start): {bbw.Position}"); | |||
// write component info | |||
serializationData.data.ExpandBy(4u + (uint)serializerKeys[c].Length); | |||
serializationData.data.IncreaseCapacityBy(4u + (uint)serializerKeys[c].Length); | |||
bbw.Write((uint)serializerKeys[c].Length); | |||
Logging.MetaDebugLog($"dataPos (now): {bbw.Position}"); | |||
byte[] nameBytes = Encoding.UTF8.GetBytes(serializerKeys[c]); | |||
@@ -51,7 +51,7 @@ namespace TechbloxModdingAPI.Persistence | |||
bbw.Write(nameBytes[i]); | |||
} | |||
Logging.MetaDebugLog($"dataPos (now): {bbw.Position}"); | |||
serializationData.data.ExpandBy(4u); | |||
serializationData.data.IncreaseCapacityBy(4u); | |||
serializationData.dataPos = bbw.Position + 4u; | |||
Logging.MetaDebugLog($"dataPos (now): {bbw.Position}"); | |||
Logging.MetaDebugLog($"dataPos (appears to be): {serializationData.dataPos}"); | |||
@@ -73,8 +73,8 @@ namespace TechbloxModdingAPI.Persistence | |||
} | |||
public static MethodBase TargetMethod() | |||
{ | |||
return typeof(SaveGameEngine).GetMethod("SerializeGameToBuffer"); | |||
{ | |||
return AccessTools.TypeByName("RobocraftX.SaveAndLoad.SaveGameEngine").GetMethod("SerializeGameToBuffer"); | |||
} | |||
} | |||
} |
@@ -46,7 +46,7 @@ namespace TechbloxModdingAPI.Persistence | |||
public bool Serialize(ref ISerializationData serializationData, EntitiesDB entitiesDB, IEntitySerialization entitySerializer) | |||
{ | |||
serializationData.data.ExpandBy(4u); | |||
serializationData.data.IncreaseCapacityBy(4u); | |||
BinaryBufferWriter bbw = new BinaryBufferWriter(serializationData.data.ToArrayFast(out int count), serializationData.dataPos); | |||
EGID[] toSerialize = getEntitiesToSerialize(entitiesDB); | |||
bbw.Write((uint)toSerialize.Length); | |||
@@ -481,7 +481,7 @@ namespace TechbloxModdingAPI | |||
{ | |||
var egid = playerEngine.GetThingLookedAt(Id, maxDistance); | |||
return egid != default && egid.groupID == WiresGUIExclusiveGroups.WireGroup | |||
? EcsObjectBase.GetInstance(new EGID(egid.entityID, NamedExclusiveGroup<WiresGroup>.Group), | |||
? EcsObjectBase.GetInstance(new EGID(egid.entityID, BuildModeWiresGroups.WiresGroup.Group), | |||
e => new Wire(e)) | |||
: null; | |||
} | |||
@@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Tasks | |||
{ | |||
get | |||
{ | |||
return RobocraftX.Schedulers.Lean.UIScheduler; | |||
return RobocraftX.Schedulers.ClientLean.UIScheduler; | |||
} | |||
} | |||
@@ -28,7 +28,7 @@ namespace TechbloxModdingAPI.Tasks | |||
{ | |||
get | |||
{ | |||
return RobocraftX.Schedulers.ExtraLean.UIScheduler; | |||
return RobocraftX.Schedulers.ClientExtraLean.UIScheduler; | |||
} | |||
} | |||
@@ -64,7 +64,7 @@ namespace TechbloxModdingAPI.Tests | |||
_testsCountPassed = 0; | |||
_testsCountFailed = 0; | |||
// flow control | |||
Game.Enter += (sender, args) => { GameTests().RunOn(RobocraftX.Schedulers.Lean.EveryFrameStepRunner_TimeRunningAndStopped); }; | |||
Game.Enter += (sender, args) => { GameTests().RunOn(RobocraftX.Schedulers.ClientLean.EveryFrameStepRunner_TimeRunningAndStopped); }; | |||
Game.Exit += (s, a) => state = "ReturningFromGame"; | |||
Client.EnterMenu += (sender, args) => | |||
{ | |||
@@ -104,14 +104,6 @@ namespace TechbloxModdingAPI.Utility | |||
} | |||
} | |||
public static PhysicsUtility _physicsUtility | |||
{ | |||
get | |||
{ | |||
return (PhysicsUtility)fgcr?.Field("_physicsUtility").GetValue(); | |||
} | |||
} | |||
/*public static UnityEntitySubmissionScheduler _frontEndSubmissionScheduler | |||
{ | |||
get | |||