Reduce potentially unnecessary calls to Sync() by always forcing Sync() for new blocks
This commit is contained in:
parent
e8f59e8641
commit
4e08acf44c
10 changed files with 34 additions and 12 deletions
|
@ -71,13 +71,35 @@ namespace GamecraftModdingAPI
|
||||||
public Block(EGID id)
|
public Block(EGID id)
|
||||||
{
|
{
|
||||||
Id = id;
|
Id = id;
|
||||||
|
if (!BlockEngine.BlockExists(Id))
|
||||||
|
{
|
||||||
|
Sync();
|
||||||
|
if (!BlockEngine.BlockExists(Id))
|
||||||
|
{
|
||||||
|
throw new BlockDoesNotExistException($"Block {Id.entityID} must be placed using PlaceNew(...) since it does not exist yet");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Block(uint id)
|
public Block(uint id)
|
||||||
{
|
{
|
||||||
Id = new EGID(id, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
|
Id = new EGID(id, CommonExclusiveGroups.OWNED_BLOCKS_GROUP);
|
||||||
|
if (!BlockEngine.BlockExists(Id))
|
||||||
|
{
|
||||||
|
Sync();
|
||||||
|
if (!BlockEngine.BlockExists(Id))
|
||||||
|
{
|
||||||
|
throw new BlockDoesNotExistException($"Block {Id.entityID} must be placed using PlaceNew(...) since it does not exist yet");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Synchronize newly created entity components with entities DB.
|
||||||
|
/// This forces a partial game tick, so it may be slow.
|
||||||
|
/// This also has the potential to make Gamecraft unstable.
|
||||||
|
/// Use this sparingly.
|
||||||
|
/// </summary>
|
||||||
protected static void Sync()
|
protected static void Sync()
|
||||||
{
|
{
|
||||||
DeterministicStepCompositionRootPatch.SubmitEntitiesNow();
|
DeterministicStepCompositionRootPatch.SubmitEntitiesNow();
|
||||||
|
@ -219,10 +241,8 @@ namespace GamecraftModdingAPI
|
||||||
/// Convert the block to a specialised block class.
|
/// Convert the block to a specialised block class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The block.</returns>
|
/// <returns>The block.</returns>
|
||||||
/// <param name="sameTick">Force an entity sync when <c>true</c>.
|
|
||||||
/// Only set this to <c>false</c> when the block was not placed the same tick this was called.</param>
|
|
||||||
/// <typeparam name="T">The specialised block type.</typeparam>
|
/// <typeparam name="T">The specialised block type.</typeparam>
|
||||||
public T Specialise<T>(bool sameTick = true) where T : Block
|
public T Specialise<T>() where T : Block
|
||||||
{
|
{
|
||||||
// What have I gotten myself into?
|
// What have I gotten myself into?
|
||||||
// C# can't cast to a child of Block unless the object was originally that child type
|
// C# can't cast to a child of Block unless the object was originally that child type
|
||||||
|
@ -233,7 +253,6 @@ namespace GamecraftModdingAPI
|
||||||
{
|
{
|
||||||
throw new BlockSpecializationException("Specialized block constructor does not accept an EGID");
|
throw new BlockSpecializationException("Specialized block constructor does not accept an EGID");
|
||||||
}
|
}
|
||||||
if (sameTick) Sync();
|
|
||||||
return (T)ctor.Invoke(new object[] { Id });
|
return (T)ctor.Invoke(new object[] { Id });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,4 +40,15 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class BlockDoesNotExistException : BlockException
|
||||||
|
{
|
||||||
|
public BlockDoesNotExistException()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockDoesNotExistException(string message) : base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(BlockIDs.ConsoleBlock, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(BlockIDs.ConsoleBlock, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new ConsoleBlock(id);
|
return new ConsoleBlock(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -29,7 +29,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new Motor(id);
|
return new Motor(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -29,7 +29,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new Piston(id);
|
return new Piston(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -29,7 +29,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new Servo(id);
|
return new Servo(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -29,7 +29,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new SignalingBlock(id);
|
return new SignalingBlock(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -31,7 +31,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(block, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new SpawnPoint(id);
|
return new SpawnPoint(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -22,7 +22,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(BlockIDs.TextBlock, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(BlockIDs.TextBlock, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new TextBlock(id);
|
return new TextBlock(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
@ -26,7 +26,6 @@ namespace GamecraftModdingAPI.Blocks
|
||||||
{
|
{
|
||||||
EGID id = PlacementEngine.PlaceBlock(BlockIDs.Timer, color, darkness,
|
EGID id = PlacementEngine.PlaceBlock(BlockIDs.Timer, color, darkness,
|
||||||
position, uscale, scale, player, rotation);
|
position, uscale, scale, player, rotation);
|
||||||
Sync();
|
|
||||||
return new Timer(id);
|
return new Timer(id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
Loading…
Reference in a new issue