Initial commit: Complete open-source Decal rebuild

All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
erik 2026-02-08 18:27:56 +01:00
commit d1442e3747
1382 changed files with 170725 additions and 0 deletions

View file

@ -0,0 +1,263 @@
using System.Collections.Generic;
using Decal.Interop.Filters;
namespace Decal.Adapter.Wrappers;
public class WorldObject : GenericDisposableWrapper<Decal.Interop.Filters.WorldObject>
{
public int ActiveSpellCount => Values(LongValueKey.ActiveSpellCount);
public int SpellCount => Values(LongValueKey.SpellCount);
public int Behavior => base.Wrapped.Behavior;
public int Category => base.Wrapped.Category;
public int Container => base.Wrapped.Container;
public int GameDataFlags1 => base.Wrapped.GameDataFlags1;
public int Id => base.Wrapped.GUID;
public bool HasIdData => base.Wrapped.HasIdData;
public int Icon => base.Wrapped.Icon;
public int LastIdTime => base.Wrapped.LastIdTime;
public string Name => base.Wrapped.Name;
public ObjectClass ObjectClass => (ObjectClass)base.Wrapped.ObjectClass;
public int PhysicsDataFlags => base.Wrapped.PhysicsDataFlags;
public int Type => base.Wrapped.Type;
public List<int> BoolKeys
{
get
{
List<int> list = new List<int>();
int num = 0;
for (int num2 = base.Wrapped.EnumBoolKey(0); num2 != -1; num2 = base.Wrapped.EnumBoolKey(num))
{
list.Add(num2);
num++;
}
if (base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)(-1)))
{
list.Add(-1);
}
return list;
}
}
public List<int> LongKeys
{
get
{
List<int> list = new List<int>();
int num = 0;
for (int num2 = base.Wrapped.EnumLongKey(0); num2 != -1; num2 = base.Wrapped.EnumLongKey(num))
{
list.Add(num2);
num++;
}
if (base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)(-1), -1) != -1)
{
list.Add(-1);
}
return list;
}
}
public List<int> DoubleKeys
{
get
{
List<int> list = new List<int>();
int num = 0;
for (int num2 = base.Wrapped.EnumDoubleKey(0); num2 != -1; num2 = base.Wrapped.EnumDoubleKey(num))
{
list.Add(num2);
num++;
}
if (base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)(-1), -1.0) != -1.0)
{
list.Add(-1);
}
return list;
}
}
public List<int> StringKeys
{
get
{
List<int> list = new List<int>();
int num = 0;
for (int num2 = base.Wrapped.EnumStringKey(0); num2 != -1; num2 = base.Wrapped.EnumStringKey(num))
{
list.Add(num2);
num++;
}
if (!base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)(-1), "-1").Equals("-1"))
{
list.Add(-1);
}
return list;
}
}
public WorldObject(Decal.Interop.Filters.WorldObject obj)
: base(obj)
{
}
public int ActiveSpell(int index)
{
return base.Wrapped.ActiveSpell(index);
}
public bool Exists(BoolValueKey index)
{
bool pValue;
return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue);
}
public bool Exists(DoubleValueKey index)
{
double pValue;
return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue);
}
public bool Exists(LongValueKey index)
{
int pValue;
return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue);
}
public bool Exists(StringValueKey index)
{
string pValue;
return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue);
}
public bool Exists(BoolValueKey index, out bool pValue)
{
return base.Wrapped.BoolExists((Decal.Interop.Filters.BoolValueKey)index, out pValue);
}
public bool Exists(DoubleValueKey index, out double pValue)
{
return base.Wrapped.DoubleExists((Decal.Interop.Filters.DoubleValueKey)index, out pValue);
}
public bool Exists(LongValueKey index, out int pValue)
{
return base.Wrapped.LongExists((Decal.Interop.Filters.LongValueKey)index, out pValue);
}
public bool Exists(StringValueKey index, out string pValue)
{
return base.Wrapped.StringExists((Decal.Interop.Filters.StringValueKey)index, out pValue);
}
public bool Values(BoolValueKey index)
{
return Values(index, defaultValue: false);
}
public double Values(DoubleValueKey index)
{
return Values(index, 0.0);
}
public int Values(LongValueKey index)
{
return index switch
{
LongValueKey.Slot => Values(index, -1),
LongValueKey.SlotLegacy => Values(index, 0),
_ => Values(index, 0),
};
}
public string Values(StringValueKey index)
{
return Values(index, string.Empty);
}
public bool Values(BoolValueKey index, bool defaultValue)
{
return base.Wrapped.Bools((Decal.Interop.Filters.BoolValueKey)index, defaultValue);
}
public double Values(DoubleValueKey index, double defaultValue)
{
return base.Wrapped.Doubles((Decal.Interop.Filters.DoubleValueKey)index, defaultValue);
}
public int Values(LongValueKey index, int defaultValue)
{
return base.Wrapped.Longs((Decal.Interop.Filters.LongValueKey)index, defaultValue);
}
public string Values(StringValueKey index, string defaultValue)
{
return base.Wrapped.Strings((Decal.Interop.Filters.StringValueKey)index, defaultValue);
}
public CoordsObject Coordinates()
{
double NorthSouth = 0.0;
double EastWest = 0.0;
if (base.Wrapped.Coordinates(ref NorthSouth, ref EastWest))
{
return new CoordsObject(NorthSouth, EastWest);
}
return null;
}
public Vector3Object Offset()
{
double x = 0.0;
double y = 0.0;
double z = 0.0;
if (base.Wrapped.Offset(out x, out y, out z))
{
return new Vector3Object(x, y, z);
}
return null;
}
public Vector4Object Orientation()
{
double w = 0.0;
double x = 0.0;
double y = 0.0;
double z = 0.0;
if (base.Wrapped.Orientation(out w, out x, out y, out z))
{
return new Vector4Object(w, x, y, z);
}
return null;
}
public Vector3Object RawCoordinates()
{
double pX = 0.0;
double pY = 0.0;
double pZ = 0.0;
if (base.Wrapped.RawCoordinates(ref pX, ref pY, ref pZ))
{
return new Vector3Object(pX, pY, pZ);
}
return null;
}
public int Spell(int index)
{
return base.Wrapped.Spell(index);
}
}