Skip to content

Instantly share code, notes, and snippets.

@Jadd
Created June 3, 2017 11:51
Show Gist options
  • Save Jadd/3f019ae9998928f3ccf23da1f54aab38 to your computer and use it in GitHub Desktop.
Save Jadd/3f019ae9998928f3ccf23da1f54aab38 to your computer and use it in GitHub Desktop.

Revisions

  1. Jadd created this gist Jun 3, 2017.
    59 changes: 59 additions & 0 deletions WoWRealm.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,59 @@
    [DataContract]
    public sealed class WoWRealm {
    #region Properties
    [IgnoreDataMember]
    public IntPtr Pointer { get; }

    [DataMember]
    public uint VirtualAddress { get; private set; }

    [DataMember]
    public string Name { get; private set; }
    #endregion

    internal WoWRealm(IntPtr pointer) {
    var entry = pointer.Read<WoWRealmEntry>();

    Pointer = pointer;
    VirtualAddress = entry.VirtualAddress;
    Name = Encoding.UTF8.GetString(entry.Name).Terminate();
    }

    public void Connect() {
    RealmList.ConnectToRealm(this);
    }

    #region Equality operators
    public override bool Equals(object obj) {
    if (ReferenceEquals(null, obj)) return false;
    if (ReferenceEquals(this, obj)) return true;
    return GetHashCode() == obj.GetHashCode();
    }

    public override int GetHashCode() {
    return VirtualAddress.GetHashCode();
    }

    public static bool operator ==(WoWRealm left, WoWRealm right) {
    return !ReferenceEquals(left, null) && left.Equals(right);
    }

    public static bool operator !=(WoWRealm left, WoWRealm right) {
    return !(left == right);
    }
    #endregion

    #region ToString implementation
    public override string ToString() {
    return $"Realm: {Name}";
    }
    #endregion
    }

    [StructLayout(LayoutKind.Explicit)]
    internal struct WoWRealmEntry {
    [FieldOffset(0x00)] public readonly uint VirtualAddress;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    [FieldOffset(0x08)] public readonly byte[] Name;
    }