From 87ffb1f60ba797671206bd8c1ae8fa909b76439e Mon Sep 17 00:00:00 2001 From: Hazno21688 <62346467+Hazno-dev@users.noreply.github.com> Date: Thu, 24 Sep 2026 08:39:41 +0100 Subject: [PATCH 1/3] added support for offset shifting --- TACTLib/Container/StaticContainerHandler.cs | 25 ++++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/TACTLib/Container/StaticContainerHandler.cs b/TACTLib/Container/StaticContainerHandler.cs index dfb3fe4..82bbf0d 100644 --- a/TACTLib/Container/StaticContainerHandler.cs +++ b/TACTLib/Container/StaticContainerHandler.cs @@ -2,6 +2,7 @@ using System.Buffers.Binary; using System.IO; using System.Linq; +using System.Numerics; using CommunityToolkit.HighPerformance.Helpers; using TACTLib.Client; using TACTLib.Helpers; @@ -18,8 +19,10 @@ private struct KeyLayout { public byte m_chunkBits; public byte m_archiveBits; public byte m_offsetBits; + public bool m_offsetShiftMode; + public byte m_offsetShift; } - + public StaticContainerHandler(ClientHandler client) { m_client = client; if (client.BasePath == null) throw new Exception("no 'BasePath' specified"); @@ -27,16 +30,22 @@ public StaticContainerHandler(ClientHandler client) { m_keyLayoutIndexBits = byte.Parse(client.ConfigHandler.BuildConfig.Values["key-layout-index-bits"][0]); m_keyLayouts = new KeyLayout[Math.Max((int)Math.Pow(2, m_keyLayoutIndexBits), 1)]; - + foreach (var keyLayoutPair in client.ConfigHandler.BuildConfig.Values .Where(static x => x.Key.StartsWith("key-layout-") && x.Key != "key-layout-index-bits")) { var layoutIndex = byte.Parse(keyLayoutPair.Key.AsSpan("key-layout-".Length)); + var shift = keyLayoutPair.Value.Count > 3 ? byte.Parse(keyLayoutPair.Value[3]) : (byte)1; + var pow2Shift = BitOperations.IsPow2(shift); m_keyLayouts[layoutIndex] = new KeyLayout { m_chunkBits = byte.Parse(keyLayoutPair.Value[0]), m_archiveBits = byte.Parse(keyLayoutPair.Value[1]), - m_offsetBits = byte.Parse(keyLayoutPair.Value[2]) + m_offsetBits = byte.Parse(keyLayoutPair.Value[2]), + m_offsetShiftMode = pow2Shift, + m_offsetShift = pow2Shift + ? (byte)BitOperations.TrailingZeroCount(shift) + : shift }; } } @@ -55,7 +64,7 @@ private void ExtractStorageLocation(FullEKey ekey, out ulong chunk, out ulong ar var keyLayoutIndexBitOffset = 56-keyLayoutBitCount; var keyLayoutIndex = BitHelper.ExtractRange(ekeyHiUl, (byte)keyLayoutIndexBitOffset, keyLayoutBitCount); var keyLayout = m_keyLayouts[keyLayoutIndex]; - + var chunkBitCount = keyLayout.m_chunkBits; var chunkBitOffset = keyLayoutIndexBitOffset-chunkBitCount; chunk = BitHelper.ExtractRange(ekeyHiUl, (byte)chunkBitOffset, chunkBitCount); @@ -66,7 +75,11 @@ private void ExtractStorageLocation(FullEKey ekey, out ulong chunk, out ulong ar var offsetBitCount = keyLayout.m_offsetBits; var offsetBitOffset = archiveBitOffset-offsetBitCount; - offset = BitHelper.ExtractRange(ekeyHiUl, (byte)offsetBitOffset, offsetBitCount); + var offsetBase = BitHelper.ExtractRange(ekeyHiUl, (byte) offsetBitOffset, offsetBitCount); + offset = keyLayout.m_offsetShiftMode + ? offsetBase << keyLayout.m_offsetShift + : offsetBase * keyLayout.m_offsetShift; + } private static string GetFileName(ulong chunk, ulong archive) { @@ -79,7 +92,7 @@ private string GetFilePath(ulong chunk, ulong archive) { public ArraySegment? OpenEKey(FullEKey ekey, int eSize) { ExtractStorageLocation(ekey, out var chunk, out var archive, out var offset); - + using var stream = File.OpenRead(GetFilePath(chunk, archive)); stream.Position = (long)offset; var data = GC.AllocateUninitializedArray(eSize); From 179a915f04ef3a265fc76cbb77f939a9f8d2e642 Mon Sep 17 00:00:00 2001 From: Hazno21688 <62346467+Hazno-dev@users.noreply.github.com> Date: Thu, 24 Sep 2026 15:48:17 +0100 Subject: [PATCH 2/3] removed shift --- TACTLib/Container/StaticContainerHandler.cs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/TACTLib/Container/StaticContainerHandler.cs b/TACTLib/Container/StaticContainerHandler.cs index 82bbf0d..2f7f6c5 100644 --- a/TACTLib/Container/StaticContainerHandler.cs +++ b/TACTLib/Container/StaticContainerHandler.cs @@ -19,7 +19,6 @@ private struct KeyLayout { public byte m_chunkBits; public byte m_archiveBits; public byte m_offsetBits; - public bool m_offsetShiftMode; public byte m_offsetShift; } @@ -35,17 +34,12 @@ public StaticContainerHandler(ClientHandler client) { .Where(static x => x.Key.StartsWith("key-layout-") && x.Key != "key-layout-index-bits")) { var layoutIndex = byte.Parse(keyLayoutPair.Key.AsSpan("key-layout-".Length)); - var shift = keyLayoutPair.Value.Count > 3 ? byte.Parse(keyLayoutPair.Value[3]) : (byte)1; - var pow2Shift = BitOperations.IsPow2(shift); m_keyLayouts[layoutIndex] = new KeyLayout { m_chunkBits = byte.Parse(keyLayoutPair.Value[0]), m_archiveBits = byte.Parse(keyLayoutPair.Value[1]), m_offsetBits = byte.Parse(keyLayoutPair.Value[2]), - m_offsetShiftMode = pow2Shift, - m_offsetShift = pow2Shift - ? (byte)BitOperations.TrailingZeroCount(shift) - : shift + m_offsetShift = keyLayoutPair.Value.Count > 3 ? byte.Parse(keyLayoutPair.Value[3]) : (byte)1 }; } } @@ -75,11 +69,7 @@ private void ExtractStorageLocation(FullEKey ekey, out ulong chunk, out ulong ar var offsetBitCount = keyLayout.m_offsetBits; var offsetBitOffset = archiveBitOffset-offsetBitCount; - var offsetBase = BitHelper.ExtractRange(ekeyHiUl, (byte) offsetBitOffset, offsetBitCount); - offset = keyLayout.m_offsetShiftMode - ? offsetBase << keyLayout.m_offsetShift - : offsetBase * keyLayout.m_offsetShift; - + offset = BitHelper.ExtractRange(ekeyHiUl, (byte) offsetBitOffset, offsetBitCount) * keyLayout.m_offsetShift; } private static string GetFileName(ulong chunk, ulong archive) { From cf80230d4d0edac1730d6540560f784548ae01ad Mon Sep 17 00:00:00 2001 From: Hazno21688 <62346467+Hazno-dev@users.noreply.github.com> Date: Thu, 24 Sep 2026 18:15:48 +0100 Subject: [PATCH 3/3] extremely critical fix for var name --- TACTLib/Container/StaticContainerHandler.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TACTLib/Container/StaticContainerHandler.cs b/TACTLib/Container/StaticContainerHandler.cs index 2f7f6c5..74724b7 100644 --- a/TACTLib/Container/StaticContainerHandler.cs +++ b/TACTLib/Container/StaticContainerHandler.cs @@ -19,7 +19,7 @@ private struct KeyLayout { public byte m_chunkBits; public byte m_archiveBits; public byte m_offsetBits; - public byte m_offsetShift; + public byte m_offsetMultiplier; } public StaticContainerHandler(ClientHandler client) { @@ -39,7 +39,7 @@ public StaticContainerHandler(ClientHandler client) { m_chunkBits = byte.Parse(keyLayoutPair.Value[0]), m_archiveBits = byte.Parse(keyLayoutPair.Value[1]), m_offsetBits = byte.Parse(keyLayoutPair.Value[2]), - m_offsetShift = keyLayoutPair.Value.Count > 3 ? byte.Parse(keyLayoutPair.Value[3]) : (byte)1 + m_offsetMultiplier = keyLayoutPair.Value.Count > 3 ? byte.Parse(keyLayoutPair.Value[3]) : (byte)1 }; } } @@ -69,7 +69,7 @@ private void ExtractStorageLocation(FullEKey ekey, out ulong chunk, out ulong ar var offsetBitCount = keyLayout.m_offsetBits; var offsetBitOffset = archiveBitOffset-offsetBitCount; - offset = BitHelper.ExtractRange(ekeyHiUl, (byte) offsetBitOffset, offsetBitCount) * keyLayout.m_offsetShift; + offset = BitHelper.ExtractRange(ekeyHiUl, (byte) offsetBitOffset, offsetBitCount) * keyLayout.m_offsetMultiplier; } private static string GetFileName(ulong chunk, ulong archive) {