Made the Game.Enter event only fire once loading finishes and fixed player building mode
Also attempted to fix material changing and updating the rendered block
This commit is contained in:
parent
f53d0b63e7
commit
e3a7961be4
6 changed files with 76 additions and 21 deletions
|
@ -7,17 +7,17 @@ using Svelto.ECS;
|
||||||
using Svelto.Tasks;
|
using Svelto.Tasks;
|
||||||
using Svelto.Tasks.Lean;
|
using Svelto.Tasks.Lean;
|
||||||
using RobocraftX.Blocks;
|
using RobocraftX.Blocks;
|
||||||
|
using RobocraftX.Common.Loading;
|
||||||
using RobocraftX.ScreenshotTaker;
|
using RobocraftX.ScreenshotTaker;
|
||||||
using Techblox.Environment.Transition;
|
using Techblox.Environment.Transition;
|
||||||
using Techblox.GameSelection;
|
using Techblox.GameSelection;
|
||||||
using TechbloxModdingAPI.Blocks;
|
using TechbloxModdingAPI.Blocks;
|
||||||
using TechbloxModdingAPI.Engines;
|
using TechbloxModdingAPI.Engines;
|
||||||
using TechbloxModdingAPI.Tasks;
|
|
||||||
using TechbloxModdingAPI.Utility;
|
using TechbloxModdingAPI.Utility;
|
||||||
|
|
||||||
namespace TechbloxModdingAPI.App
|
namespace TechbloxModdingAPI.App
|
||||||
{
|
{
|
||||||
public class GameGameEngine : IApiEngine
|
public class GameGameEngine : IApiEngine, IReactOnAddAndRemove<LoadingActionEntityStruct>
|
||||||
{
|
{
|
||||||
public WrappedHandler<GameEventArgs> EnterGame;
|
public WrappedHandler<GameEventArgs> EnterGame;
|
||||||
|
|
||||||
|
@ -29,6 +29,8 @@ namespace TechbloxModdingAPI.App
|
||||||
|
|
||||||
public EntitiesDB entitiesDB { set; private get; }
|
public EntitiesDB entitiesDB { set; private get; }
|
||||||
|
|
||||||
|
private bool enteredGame;
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
ExitGame.Invoke(this, new GameEventArgs { GameName = GetGameData().saveName, GamePath = GetGameData().gameID });
|
ExitGame.Invoke(this, new GameEventArgs { GameName = GetGameData().saveName, GamePath = GetGameData().gameID });
|
||||||
|
@ -37,14 +39,7 @@ namespace TechbloxModdingAPI.App
|
||||||
|
|
||||||
public void Ready()
|
public void Ready()
|
||||||
{
|
{
|
||||||
EnteringGame().RunOn(Scheduler.leanRunner);
|
enteredGame = true;
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerator<TaskContract> EnteringGame()
|
|
||||||
{
|
|
||||||
yield return new WaitForSubmissionEnumerator(GameLoadedEnginePatch.Scheduler).Continue();
|
|
||||||
EnterGame.Invoke(this, new GameEventArgs { GameName = GetGameData().saveName, GamePath = GetGameData().gameID });
|
|
||||||
IsInGame = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// game functionality
|
// game functionality
|
||||||
|
@ -139,5 +134,17 @@ namespace TechbloxModdingAPI.App
|
||||||
{
|
{
|
||||||
return entitiesDB.QueryEntity<GameSelectionComponent>(GameSelectionConstants.GameSelectionEGID);
|
return entitiesDB.QueryEntity<GameSelectionComponent>(GameSelectionConstants.GameSelectionEGID);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public void Add(ref LoadingActionEntityStruct entityComponent, EGID egid)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Remove(ref LoadingActionEntityStruct entityComponent, EGID egid)
|
||||||
|
{ // Finished loading
|
||||||
|
if (!enteredGame) return;
|
||||||
|
EnterGame.Invoke(this, new GameEventArgs { GameName = GetGameData().saveName, GamePath = GetGameData().gameID });
|
||||||
|
IsInGame = true;
|
||||||
|
enteredGame = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -327,7 +327,10 @@ namespace TechbloxModdingAPI
|
||||||
: throw new BlockTypeException("Unknown block type! Could not set default material.");
|
: throw new BlockTypeException("Unknown block type! Could not set default material.");
|
||||||
if (!FullGameFields._dataDb.ContainsKey<MaterialPropertiesData>(val))
|
if (!FullGameFields._dataDb.ContainsKey<MaterialPropertiesData>(val))
|
||||||
throw new BlockException($"Block material {value} does not exist!");
|
throw new BlockException($"Block material {value} does not exist!");
|
||||||
BlockEngine.GetBlockInfo<CubeMaterialStruct>(this).materialId = val;
|
ref var comp = ref BlockEngine.GetBlockInfo<CubeMaterialStruct>(this);
|
||||||
|
if (comp.materialId == val)
|
||||||
|
return;
|
||||||
|
comp.materialId = val;
|
||||||
BlockEngine.UpdatePrefab(this, val, Flipped); //The default causes the screen to go black
|
BlockEngine.UpdatePrefab(this, val, Flipped); //The default causes the screen to go black
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,9 @@ using System.Reflection;
|
||||||
|
|
||||||
using DataLoader;
|
using DataLoader;
|
||||||
using Svelto.Tasks;
|
using Svelto.Tasks;
|
||||||
|
using Svelto.Tasks.Enumerators;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
using TechbloxModdingAPI.App;
|
using TechbloxModdingAPI.App;
|
||||||
using TechbloxModdingAPI.Tests;
|
using TechbloxModdingAPI.Tests;
|
||||||
|
@ -86,6 +88,12 @@ namespace TechbloxModdingAPI.Blocks
|
||||||
foreach (var property in block.GetType().GetProperties())
|
foreach (var property in block.GetType().GetProperties())
|
||||||
{
|
{
|
||||||
if (property.Name == "Material" || property.Name == "Flipped") continue; // TODO: Crashes in game
|
if (property.Name == "Material" || property.Name == "Flipped") continue; // TODO: Crashes in game
|
||||||
|
if (property.Name == "Material" || property.Name == "Flipped")
|
||||||
|
{
|
||||||
|
Console.WriteLine("Block type: "+block.Type);
|
||||||
|
Console.WriteLine("Will set " + property.Name);
|
||||||
|
yield return new WaitForSecondsEnumerator(1).Continue();
|
||||||
|
}
|
||||||
//Includes specialised block properties
|
//Includes specialised block properties
|
||||||
if (property.SetMethod == null) continue;
|
if (property.SetMethod == null) continue;
|
||||||
var testValues = new (Type, object, Predicate<object>)[]
|
var testValues = new (Type, object, Predicate<object>)[]
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using HarmonyLib;
|
||||||
|
|
||||||
using Gamecraft.ColourPalette;
|
using Gamecraft.ColourPalette;
|
||||||
using Gamecraft.TimeRunning;
|
using Gamecraft.TimeRunning;
|
||||||
|
@ -11,8 +13,8 @@ using RobocraftX.Rendering;
|
||||||
using RobocraftX.Rendering.GPUI;
|
using RobocraftX.Rendering.GPUI;
|
||||||
using Svelto.DataStructures;
|
using Svelto.DataStructures;
|
||||||
using Svelto.ECS;
|
using Svelto.ECS;
|
||||||
using Svelto.ECS.EntityStructs;
|
|
||||||
using Svelto.ECS.Hybrid;
|
using Svelto.ECS.Hybrid;
|
||||||
|
using Techblox.BuildingDrone;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
|
|
||||||
using TechbloxModdingAPI.Engines;
|
using TechbloxModdingAPI.Engines;
|
||||||
|
@ -92,10 +94,7 @@ namespace TechbloxModdingAPI.Blocks.Engines
|
||||||
public void UpdateDisplayedBlock(EGID id)
|
public void UpdateDisplayedBlock(EGID id)
|
||||||
{
|
{
|
||||||
if (!BlockExists(id)) return;
|
if (!BlockExists(id)) return;
|
||||||
var pos = entitiesDB.QueryEntity<PositionEntityStruct>(id);
|
RenderingPatch.UpdateBlocks();
|
||||||
var rot = entitiesDB.QueryEntity<RotationEntityStruct>(id);
|
|
||||||
var scale = entitiesDB.QueryEntity<ScalingEntityStruct>(id);
|
|
||||||
entitiesDB.QueryEntity<RenderingDataStruct>(id).matrix = float4x4.TRS(pos.position, rot.rotation, scale.scale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void UpdatePrefab(Block block, byte material, bool flipped)
|
internal void UpdatePrefab(Block block, byte material, bool flipped)
|
||||||
|
@ -115,7 +114,17 @@ namespace TechbloxModdingAPI.Blocks.Engines
|
||||||
PrefabsID.GetOrCreatePrefabID((ushort) prefabAssetID, material, 1, flipped);
|
PrefabsID.GetOrCreatePrefabID((ushort) prefabAssetID, material, 1, flipped);
|
||||||
entitiesDB.QueryEntityOrDefault<GFXPrefabEntityStructGPUI>(block).prefabID = prefabId;
|
entitiesDB.QueryEntityOrDefault<GFXPrefabEntityStructGPUI>(block).prefabID = prefabId;
|
||||||
if (block.Exists)
|
if (block.Exists)
|
||||||
|
{
|
||||||
|
entitiesDB.PublishEntityChange<CubeMaterialStruct>(block.Id);
|
||||||
entitiesDB.PublishEntityChange<GFXPrefabEntityStructGPUI>(block.Id);
|
entitiesDB.PublishEntityChange<GFXPrefabEntityStructGPUI>(block.Id);
|
||||||
|
|
||||||
|
ref BuildingActionComponent local =
|
||||||
|
ref entitiesDB.QueryEntity<BuildingActionComponent>(BuildingDroneUtility
|
||||||
|
.GetLocalBuildingDrone(entitiesDB).ToEGID(entitiesDB));
|
||||||
|
local.buildAction = BuildAction.ChangeMaterial;
|
||||||
|
local.targetPosition = block.Position;
|
||||||
|
this.entitiesDB.PublishEntityChange<BuildingActionComponent>(local.ID);
|
||||||
|
}
|
||||||
//Phyiscs prefab: prefabAssetID, set on block creation from the CubeListData
|
//Phyiscs prefab: prefabAssetID, set on block creation from the CubeListData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,5 +248,27 @@ namespace TechbloxModdingAPI.Blocks.Engines
|
||||||
return entitiesDB;
|
return entitiesDB;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
[HarmonyPatch]
|
||||||
|
public static class RenderingPatch
|
||||||
|
{
|
||||||
|
private static ComputeRenderingEntitiesMatricesEngine Engine;
|
||||||
|
|
||||||
|
public static void Postfix(ComputeRenderingEntitiesMatricesEngine __instance)
|
||||||
|
{
|
||||||
|
Engine = __instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MethodBase TargetMethod()
|
||||||
|
{
|
||||||
|
return typeof(ComputeRenderingEntitiesMatricesEngine).GetConstructors()[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateBlocks()
|
||||||
|
{
|
||||||
|
var data = new RenderingDataStruct();
|
||||||
|
Engine.Add(ref data, new EGID(0, CommonExclusiveGroups.BUTTON_BLOCK_GROUP));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -360,8 +360,8 @@ namespace TechbloxModdingAPI
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The player's mode in time stopped mode, determining what they place.
|
/// The player's mode in time stopped mode, determining what they place.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public PlayerBuildingMode BuildingMode => (PlayerBuildingMode) playerEngine
|
public PlayerBuildingMode BuildingMode => (PlayerBuildingMode)Math.Log((double)playerEngine
|
||||||
.GetCharacterStruct<TimeStoppedModeComponent>(Id).Get().timeStoppedContext;
|
.GetCharacterStruct<TimeStoppedModeComponent>(Id).Get().timeStoppedContext, 2); // It's a bit field in game now
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether the player is sprinting.
|
/// Whether the player is sprinting.
|
||||||
|
@ -522,6 +522,11 @@ namespace TechbloxModdingAPI
|
||||||
return (int) Id;
|
return (int) Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{nameof(Type)}: {Type}, {nameof(Id)}: {Id}, {nameof(Position)}: {Position}, {nameof(Rotation)}: {Rotation}, {nameof(Mass)}: {Mass}";
|
||||||
|
}
|
||||||
|
|
||||||
// internal methods
|
// internal methods
|
||||||
|
|
||||||
internal static void Init()
|
internal static void Init()
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
ColourMode,
|
ColourMode,
|
||||||
ConfigMode,
|
ConfigMode,
|
||||||
BlueprintMode,
|
BlueprintMode,
|
||||||
MaterialMode
|
MaterialMode,
|
||||||
|
LandscapeMode
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue