Add ability to change properties of existing blocks
And not storing custom block data for now
This commit is contained in:
parent
fdc47832f4
commit
d954060a5a
3 changed files with 43 additions and 17 deletions
|
@ -30,7 +30,9 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
/// Key: Prefab path
|
/// Key: Prefab path
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly Dictionary<string, Type> CustomBlocks = new Dictionary<string, Type>();
|
private static readonly Dictionary<string, Type> CustomBlocks = new Dictionary<string, Type>();
|
||||||
private static readonly CustomBlockEngine Engine = new CustomBlockEngine();
|
//private static readonly CustomBlockEngine Engine = new CustomBlockEngine();
|
||||||
|
private static readonly List<(ushort id, Action<CubeListData> action)> BlockChangeActions =
|
||||||
|
new List<(ushort, Action<CubeListData>)>();
|
||||||
|
|
||||||
private static bool _canRegister = true;
|
private static bool _canRegister = true;
|
||||||
|
|
||||||
|
@ -58,6 +60,16 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
Logging.MetaDebugLog("Registered custom block type " + typeName);
|
Logging.MetaDebugLog("Registered custom block type " + typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A low-level method for changing any property of an existing block. Use with caution.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">The block ID</param>
|
||||||
|
/// <param name="modifier">An action that modifies a property of the block</param>
|
||||||
|
public static void ChangeExistingBlock(ushort id, Action<CubeListData> modifier)
|
||||||
|
{
|
||||||
|
BlockChangeActions.Add((id, modifier));
|
||||||
|
}
|
||||||
|
|
||||||
public CustomBlock(EGID id) : base(id)
|
public CustomBlock(EGID id) : base(id)
|
||||||
{
|
{
|
||||||
/*if (id.groupID != Group)
|
/*if (id.groupID != Group)
|
||||||
|
@ -129,9 +141,12 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
};
|
};
|
||||||
dataDB.GetValues<CubeListData>().Add(cld.ID.ToString(), cld); //The registration needs to happen after the ID has been set
|
dataDB.GetValues<CubeListData>().Add(cld.ID.ToString(), cld); //The registration needs to happen after the ID has been set
|
||||||
dataDB.GetFasterValues<CubeListData>().Add(cld.ID, cld); //So can't use the builtin method to create a CubeListData
|
dataDB.GetFasterValues<CubeListData>().Add(cld.ID, cld); //So can't use the builtin method to create a CubeListData
|
||||||
Engine.RegisterBlock((ushort) cld.ID, key);
|
//Engine.RegisterBlock((ushort) cld.ID, key); - TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var (id, action) in BlockChangeActions)
|
||||||
|
action(dataDB.GetValue<CubeListData>(id));
|
||||||
|
|
||||||
_canRegister = false;
|
_canRegister = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +188,7 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
internal new static void Init()
|
internal new static void Init()
|
||||||
{
|
{
|
||||||
Prepare().RunOn(ExtraLean.UIScheduler);
|
Prepare().RunOn(ExtraLean.UIScheduler);
|
||||||
GameEngineManager.AddGameEngine(Engine);
|
//GameEngineManager.AddGameEngine(Engine); - TODO: Fix serialization and implement block ID update
|
||||||
}
|
}
|
||||||
|
|
||||||
/*internal static void OnBlockFactoryObtained(BlockEntityFactory factory)
|
/*internal static void OnBlockFactoryObtained(BlockEntityFactory factory)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using GamecraftModdingAPI.Engines;
|
using GamecraftModdingAPI.Engines;
|
||||||
using GamecraftModdingAPI.Persistence;
|
using GamecraftModdingAPI.Persistence;
|
||||||
using GamecraftModdingAPI.Utility;
|
using GamecraftModdingAPI.Utility;
|
||||||
|
@ -9,10 +10,9 @@ using Svelto.ECS.Serialization;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Blocks
|
namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
public class CustomBlockEngine : IFactoryEngine
|
/*public class CustomBlockEngine : IFactoryEngine
|
||||||
{
|
{
|
||||||
public class CustomBlockEntityDescriptor : SerializableEntityDescriptor<
|
public class CustomBlockEntityDescriptor : SerializableEntityDescriptor<CustomBlockEntityDescriptor._CustomBlockDescriptor>
|
||||||
CustomBlockEntityDescriptor._CustomBlockDescriptor>
|
|
||||||
{
|
{
|
||||||
[HashName("GamecraftModdingAPICustomBlockV0")]
|
[HashName("GamecraftModdingAPICustomBlockV0")]
|
||||||
public class _CustomBlockDescriptor : IEntityDescriptor
|
public class _CustomBlockDescriptor : IEntityDescriptor
|
||||||
|
@ -28,30 +28,37 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
|
|
||||||
public void Ready()
|
public void Ready()
|
||||||
{
|
{
|
||||||
SerializerManager.AddSerializer<CustomBlockEntityDescriptor>(new SimpleEntitySerializer<CustomBlockEntityDescriptor>(db =>
|
SerializerManager.AddSerializer<CustomBlockEntityDescriptor>(
|
||||||
{
|
new SimpleEntitySerializer<CustomBlockEntityDescriptor>(db =>
|
||||||
var (coll, c) = db.QueryEntities<CustomBlock.DataStruct>(ApiExclusiveGroups.customBlockGroup);
|
{
|
||||||
var egids = new EGID[c];
|
var (coll, c) = db.QueryEntities<CustomBlock.DataStruct>(ApiExclusiveGroups.customBlockGroup);
|
||||||
for (int i = 0; i < c; i++)
|
var egids = new EGID[c];
|
||||||
egids[i] = new EGID(coll[i].ID, ApiExclusiveGroups.customBlockGroup);
|
for (int i = 0; i < c; i++)
|
||||||
|
egids[i] = new EGID(coll[i].ID, ApiExclusiveGroups.customBlockGroup);
|
||||||
|
|
||||||
return egids;
|
return egids;
|
||||||
}));
|
}));
|
||||||
|
foreach (var (id, name) in _registeredBlocks)
|
||||||
|
{
|
||||||
|
Factory.BuildEntity<CustomBlockEntityDescriptor>(id, ApiExclusiveGroups.customBlockGroup)
|
||||||
|
.Init(new CustomBlock.DataStruct {Name = new ECSString(name), ID = id});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntitiesDB entitiesDB { get; set; }
|
public EntitiesDB entitiesDB { get; set; }
|
||||||
|
private List<(ushort id, string name)> _registeredBlocks = new List<(ushort, string)>();
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegisterBlock(ushort id, string name)
|
public void RegisterBlock(ushort id, string name)
|
||||||
{
|
{
|
||||||
Factory.BuildEntity<CustomBlockEntityDescriptor>(id, ApiExclusiveGroups.customBlockGroup)
|
_registeredBlocks.Add((id, name));
|
||||||
.Init(new CustomBlock.DataStruct {Name = new ECSString(name), ID = id});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name { get; } = "GamecraftModdingAPICustomBlockEngine";
|
public string Name { get; } = "GamecraftModdingAPICustomBlockEngine";
|
||||||
public bool isRemovable { get; } = false;
|
public bool isRemovable { get; } = false;
|
||||||
public IEntityFactory Factory { get; set; }
|
public IEntityFactory Factory { get; set; }
|
||||||
}
|
}*/
|
||||||
}
|
}
|
|
@ -36,6 +36,7 @@ using UnityEngine.ResourceManagement.ResourceProviders;
|
||||||
using Debug = FMOD.Debug;
|
using Debug = FMOD.Debug;
|
||||||
using EventType = GamecraftModdingAPI.Events.EventType;
|
using EventType = GamecraftModdingAPI.Events.EventType;
|
||||||
using Label = GamecraftModdingAPI.Interface.IMGUI.Label;
|
using Label = GamecraftModdingAPI.Interface.IMGUI.Label;
|
||||||
|
using ScalingPermission = DataLoader.ScalingPermission;
|
||||||
|
|
||||||
namespace GamecraftModdingAPI.Tests
|
namespace GamecraftModdingAPI.Tests
|
||||||
{
|
{
|
||||||
|
@ -412,6 +413,9 @@ namespace GamecraftModdingAPI.Tests
|
||||||
{
|
{
|
||||||
Logging.MetaDebugLog("Test custom block catalog not found");
|
Logging.MetaDebugLog("Test custom block catalog not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CustomBlock.ChangeExistingBlock((ushort) BlockIDs.TyreS,
|
||||||
|
cld => cld.scalingPermission = ScalingPermission.NonUniform);
|
||||||
#if TEST
|
#if TEST
|
||||||
TestRoot.RunTests();
|
TestRoot.RunTests();
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue