Skip to content

Commit

Permalink
DatReader - ActionMap (#4217)
Browse files Browse the repository at this point in the history
* Added ActionMap Dat reading 0x26000000

* Removed debug code from startup
  • Loading branch information
OptimShi authored Aug 20, 2024
1 parent 2af556e commit 9864887
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 4 deletions.
1 change: 0 additions & 1 deletion Source/ACE.DatLoader.Tests/DatTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,6 @@ public void UnpackPortalDatFiles_NoExceptions()
if (fileType == DatFileType.RenderMaterial) continue; // 0x16, 1 file
if (fileType == DatFileType.MaterialModifier) continue; // 0x17, 1 file
if (fileType == DatFileType.MaterialInstance) continue; // 0x18, 1 file
if (fileType == DatFileType.ActionMap) continue; // 0x26, 1 file

var type = types
.SelectMany(m => m.GetCustomAttributes(typeof(DatFileTypeAttribute), false), (m, a) => new { m, a })
Expand Down
23 changes: 23 additions & 0 deletions Source/ACE.DatLoader/Entity/ActionMapValue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.IO;

namespace ACE.DatLoader.Entity
{
public class ActionMapValue : IUnpackable
{
public byte UnknownByte { get; private set; }
public uint UnknownInt { get; private set; }
public uint UnknownInt2 { get; private set; }
public uint ToggleType { get; private set; }
public UserBindingValue UserBindingData { get; private set; }

public void Unpack(BinaryReader reader)
{
UnknownByte = reader.ReadByte();
UnknownInt = reader.ReadUInt32();
UnknownInt2 = reader.ReadUInt32();
ToggleType = reader.ReadUInt32();
UserBindingData = new UserBindingValue();
UserBindingData.Unpack(reader);
}
}
}
17 changes: 17 additions & 0 deletions Source/ACE.DatLoader/Entity/InputMapConflictsValue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.IO;

namespace ACE.DatLoader.Entity
{
public class InputMapConflictsValue : IUnpackable
{
public uint InputMap { get; private set; }
public List<uint> ConflictingInputMaps { get; private set; } = new List<uint>();

public void Unpack(BinaryReader reader)
{
InputMap = reader.ReadUInt32();
ConflictingInputMaps.Unpack(reader);
}
}
}
56 changes: 56 additions & 0 deletions Source/ACE.DatLoader/FileTypes/ActionMap.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using System.Collections.Generic;
using System.IO;

using ACE.DatLoader.Entity;
using ACE.Entity.Enum;
using static System.Net.Mime.MediaTypeNames;

namespace ACE.DatLoader.FileTypes
{
/// <summary>
/// This is the client_portal.dat file 0x26000000; It's related to keyboard configuration.
/// </summary>
[DatFileType(DatFileType.ActionMap)]
public class ActionMap : FileType
{
public Dictionary<uint, Dictionary<uint, ActionMapValue>> InputMaps { get; } = new Dictionary<uint, Dictionary<uint, ActionMapValue>>();
public uint StringTable { get; set; } // DID Value to lookup all the hashes in -- will be 0x23000005
public Dictionary<uint, InputMapConflictsValue> ConflictingMaps { get; } = new Dictionary<uint, InputMapConflictsValue>();

public override void Unpack(BinaryReader reader)
{
Id = reader.ReadUInt32();

reader.ReadByte(); // bucket/size
byte count = reader.ReadByte();
for (var i = 0; i < count; i++)
{
var key = reader.ReadUInt32();
reader.ReadByte(); // bucket/size
byte valuesCount = reader.ReadByte();
Dictionary<uint, ActionMapValue> values = new Dictionary<uint, ActionMapValue>();
for (var j = 0; j < valuesCount; j++)
{
uint valuesKey = reader.ReadUInt32();
ActionMapValue value = new ActionMapValue();
value.Unpack(reader);
values.Add(valuesKey, value);
}
InputMaps.Add(key, values);
}

StringTable = reader.ReadUInt32(); // Will be 0x23000005

reader.ReadByte(); // bucket/size
byte conflictCount = reader.ReadByte();
for (var i = 0; i < conflictCount; i++) {
var key = reader.ReadUInt32();
InputMapConflictsValue conflictValue = new InputMapConflictsValue();
conflictValue.Unpack(reader);
ConflictingMaps.Add(key, conflictValue);
}
}


}
}
22 changes: 22 additions & 0 deletions Source/ACE.DatLoader/FileTypes/UserBindingValue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.IO;

namespace ACE.DatLoader.Entity
{
public class UserBindingValue : IUnpackable
{
public uint ActionClass { get; private set; }

// String hash from the StringTable
public uint ActionName { get; private set; }

// String hash from the StringTable
public uint Description { get; private set; }

public void Unpack(BinaryReader reader)
{
ActionClass = reader.ReadUInt32();
ActionName = reader.ReadUInt32();
Description = reader.ReadUInt32();
}
}
}
6 changes: 3 additions & 3 deletions Source/ACE.Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ partial class Program
/// https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timebeginperiod
/// Important note: This function affects a global Windows setting. Windows uses the lowest value (that is, highest resolution) requested by any process.
/// </summary>
[DllImport("winmm.dll", EntryPoint="timeBeginPeriod")]
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
public static extern uint MM_BeginPeriod(uint uMilliseconds);

/// <summary>
Expand Down Expand Up @@ -86,7 +86,7 @@ public static void Main(string[] args)
File.Copy(log4netConfigExample, log4netConfig);
}
else
{
{
if (!File.Exists(log4netConfigContainer))
{
Console.WriteLine("log4net Configuration file is missing, ACEmulator is running in a container, cloning from docker file.");
Expand Down Expand Up @@ -127,7 +127,7 @@ public static void Main(string[] args)

if (IsRunningInContainer)
log.Info("ACEmulator is running in a container...");

var configFile = Path.Combine(exeLocation, "Config.js");
var configConfigContainer = Path.Combine(containerConfigDirectory, "Config.js");

Expand Down

0 comments on commit 9864887

Please sign in to comment.