Skip to content

Commit 12db3fc

Browse files
committed
Correctly remove prefabs when overwritten
1 parent 8f2e56f commit 12db3fc

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

FancadeLoaderLib.Tests/PrefabListTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,35 @@ public async Task AddSegmentToPrefab_WithObstruction_OverwriteTrue_DoesNotThrow(
363363
}
364364
}
365365

366+
[Test]
367+
public async Task AddSegmentToPrefab_OverwritesPrefabsCorrectly()
368+
{
369+
var prefabList = new PrefabList()
370+
{
371+
IdOffset = 1,
372+
};
373+
374+
var prefab1 = CreateDummyPrefab(1, 1);
375+
var prefab2 = CreateDummyPrefab(2, 2);
376+
377+
var blocks = prefab1.Blocks;
378+
blocks.SetPrefab(new int3(0, 0, 0), prefab1);
379+
blocks.SetPrefab(new int3(1, 0, 0), prefab2);
380+
381+
prefabList.AddPrefab(prefab1);
382+
prefabList.AddPrefab(prefab2);
383+
384+
var newSegment = new PrefabSegment(1, new byte3(1, 0, 0));
385+
prefabList.AddSegmentToPrefab(1, newSegment, true);
386+
387+
using (Assert.Multiple())
388+
{
389+
await Assert.That(blocks.GetBlock(new int3(0, 0, 0))).IsEqualTo((ushort)1);
390+
await Assert.That(blocks.GetBlock(new int3(1, 0, 0))).IsEqualTo((ushort)2);
391+
await Assert.That(blocks.GetBlock(new int3(2, 0, 0))).IsEqualTo((ushort)0);
392+
}
393+
}
394+
366395
[Test]
367396
public async Task TryAddSegmentToPrefab_WithObstruction_ReturnsFalse()
368397
{

FancadeLoaderLib/PrefabList.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,19 @@ private void AddIdToPrefab(ushort prefabId, int3 offset, ushort id)
586586

587587
if (array[i] == prefabId)
588588
{
589-
prefab.Blocks.SetBlock(pos + offset, id);
589+
int iNew = prefab.Blocks.Index(pos + offset);
590+
ushort idOld = array[iNew];
591+
if (TryGetPrefab(idOld, out var oldPrefab))
592+
{
593+
int3 prefabPos = (pos + offset) - GetSegment(idOld).PosInPrefab;
594+
595+
foreach (var segPos in oldPrefab.Keys)
596+
{
597+
prefab.Blocks.SetBlockUnchecked(prefabPos + segPos, 0);
598+
}
599+
}
600+
601+
array[iNew] = id;
590602
}
591603
}
592604
}

0 commit comments

Comments
 (0)