Skip to content

Commit

Permalink
Make read safer instead of fixing write
Browse files Browse the repository at this point in the history
  • Loading branch information
BigBang1112 committed May 30, 2024
1 parent d887955 commit e3fdbd5
Showing 1 changed file with 12 additions and 19 deletions.
31 changes: 12 additions & 19 deletions Src/GBX.NET/Engines/Game/CGameCtnChallenge.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1484,7 +1484,10 @@ public override void Read(CGameCtnChallenge n, GbxReader r)

foreach (var (id, flags) in idFlagsPair)
{
dict[id].Flags = flags;
if (dict.TryGetValue(id, out var instance))
{
instance.Flags = flags;
}
}

n.MacroblockInstances = dict.Values.ToList();
Expand All @@ -1494,22 +1497,20 @@ public override void Write(CGameCtnChallenge n, GbxWriter w)
{
w.Write(Version);

var instanceDict = new Dictionary<MacroblockInstance, int>();
var hasObjectsHashSet = new HashSet<MacroblockInstance>();
var dict = new Dictionary<MacroblockInstance, int>();

if (n.MacroblockInstances is not null)
{
for (var i = 0; i < n.MacroblockInstances.Count; i++)
{
instanceDict[n.MacroblockInstances[i]] = i;
dict[n.MacroblockInstances[i]] = i;
}
}

foreach (var block in n.GetBlocks())
{
if (block.MacroblockReference is not null && instanceDict.TryGetValue(block.MacroblockReference, out int index))
if (block.MacroblockReference is not null && dict.TryGetValue(block.MacroblockReference, out int index))
{
hasObjectsHashSet.Add(block.MacroblockReference);
w.Write(index);
}
else
Expand All @@ -1520,9 +1521,8 @@ public override void Write(CGameCtnChallenge n, GbxWriter w)

foreach (var item in n.GetAnchoredObjects())
{
if (item.MacroblockReference is not null && instanceDict.TryGetValue(item.MacroblockReference, out int index))
if (item.MacroblockReference is not null && dict.TryGetValue(item.MacroblockReference, out int index))
{
hasObjectsHashSet.Add(item.MacroblockReference);
w.Write(index);
}
else
Expand All @@ -1537,18 +1537,11 @@ public override void Write(CGameCtnChallenge n, GbxWriter w)
return;
}

var instances = n.MacroblockInstances
.Where(hasObjectsHashSet.Contains)
.ToList();

w.Write(instances.Count);

var ind = 0;
foreach (var instance in instances)
w.Write(n.MacroblockInstances.Count);
for (var i = 0; i < n.MacroblockInstances.Count; i++)
{
w.Write(ind);
w.Write(instance.Flags);
ind++;
w.Write(i);
w.Write(n.MacroblockInstances[i].Flags);
}
}
}
Expand Down

0 comments on commit e3fdbd5

Please sign in to comment.