Revert "Updates Packets & Randomizer (#43)" (#61)

This reverts commit 179cb50557.
This commit is contained in:
Kamron Batman 2019-11-11 08:46:11 -08:00 • committed by GitHub
parent 179cb50557
commit c2ecc76457
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
588 changed files with 16260 additions and 10926 deletions

View file

@ -19,13 +19,8 @@
***************************************************************************/
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
@ -34,45 +29,135 @@ namespace Server.Gumps
{
private static uint m_NextSerial = 1;
private static byte[] m_BeginLayout = StringToBuffer("{ ");
private static byte[] m_EndLayout = StringToBuffer(" }");
private static byte[] m_NoMove = StringToBuffer("{ nomove }");
private static byte[] m_NoClose = StringToBuffer("{ noclose }");
private static byte[] m_NoDispose = StringToBuffer("{ nodispose }");
private static byte[] m_NoResize = StringToBuffer("{ noresize }");
private bool m_Closable = true;
private bool m_Disposable = true;
private bool m_Draggable = true;
private bool m_Resizable = true;
private uint m_Serial;
private List<string> m_Strings;
internal int m_TextEntries, m_Switches;
private int m_X, m_Y;
public Gump(int x, int y)
{
do
{
Serial = m_NextSerial++;
} while (Serial == 0); // standard client apparently doesn't send a gump response packet if serial == 0
m_Serial = m_NextSerial++;
} while (m_Serial == 0); // standard client apparently doesn't send a gump response packet if serial == 0
X = x;
Y = y;
m_X = x;
m_Y = y;
TypeID = GetTypeID(GetType());
Entries = new List<GumpEntry>();
m_Strings = new List<string>();
}
public int TypeID{ get; }
public List<GumpEntry> Entries{ get; }
public uint Serial { get; set; }
public uint Serial
{
get => m_Serial;
set
{
if (m_Serial != value)
{
m_Serial = value;
Invalidate();
}
}
}
public int X { get; set; }
public int X
{
get => m_X;
set
{
if (m_X != value)
{
m_X = value;
Invalidate();
}
}
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set
{
if (m_Y != value)
{
m_Y = value;
Invalidate();
}
}
}
public bool Disposable { get; set; } = true;
public bool Disposable
{
get => m_Disposable;
set
{
if (m_Disposable != value)
{
m_Disposable = value;
Invalidate();
}
}
}
public bool Resizable { get; set; } = true;
public bool Resizable
{
get => m_Resizable;
set
{
if (m_Resizable != value)
{
m_Resizable = value;
Invalidate();
}
}
}
public bool Draggable { get; set; } = true;
public bool Draggable
{
get => m_Draggable;
set
{
if (m_Draggable != value)
{
m_Draggable = value;
Invalidate();
}
}
}
public bool Closable { get; set; } = true;
public bool Closable
{
get => m_Closable;
set
{
if (m_Closable != value)
{
m_Closable = value;
Invalidate();
}
}
}
public static int GetTypeID(Type type) => type?.FullName?.GetHashCode() ?? -1;
@ -177,12 +262,7 @@ namespace Server.Gumps
Add(new GumpRadio(x, y, inactiveID, activeID, initialState, switchID));
}
public void AddTextEntry( int x, int y, int width, int height, int hue, int entryID, string initialText )
{
Add( new GumpTextEntry( x, y, width, height, hue, entryID, initialText ) );
}
public void AddTextEntry(int x, int y, int width, int height, int hue, int entryID, string initialText, int size)
public void AddTextEntry(int x, int y, int width, int height, int hue, int entryID, string initialText, int size = 0)
{
Add(new GumpTextEntryLimited(x, y, width, height, hue, entryID, initialText, size));
}
@ -195,8 +275,14 @@ namespace Server.Gumps
public void Add(GumpEntry g)
{
if (g.Parent != this)
{
g.Parent = this;
else if (!Entries.Contains(g)) Entries.Add(g);
}
else if (!Entries.Contains(g))
{
Invalidate();
Entries.Add(g);
}
}
public void Remove(GumpEntry g)
@ -204,120 +290,70 @@ namespace Server.Gumps
if (g == null || !Entries.Contains(g))
return;
Invalidate();
Entries.Remove(g);
g.Parent = null;
}
public static byte[] StringToBuffer(string str) => Encoding.ASCII.GetBytes(str);
public int Intern(string value)
{
int indexOf = m_Strings.IndexOf(value);
if (indexOf >= 0) return indexOf;
Invalidate();
m_Strings.Add(value);
return m_Strings.Count - 1;
}
public void SendTo(NetState state)
{
state.AddGump(this);
ArrayBufferWriter<byte> bufferWriter = new ArrayBufferWriter<byte>(0x10000);
m_TextEntries = 0;
m_Switches = 0;
if (state.Unpack)
CompilePacked(bufferWriter);
else
CompileFast(bufferWriter);
state.Send(bufferWriter.WrittenSpan);
}
private void WriteLayout(ArrayBufferWriter<byte> layoutBuffer, ArraySet<string> strings)
{
if (!Draggable)
layoutBuffer.Write(m_NoMove);
if (!Closable)
layoutBuffer.Write(m_NoClose);
if (!Disposable)
layoutBuffer.Write(m_NoDispose);
if (!Resizable)
layoutBuffer.Write(m_NoResize);
for (int i = 0; i < Entries.Count; ++i)
Entries[i].AppendTo(layoutBuffer, strings, ref m_TextEntries, ref m_Switches);
}
private static void WriteStrings(IBufferWriter<byte> stringsBuffer, IList<string> strings)
{
int stringLength = 2 * strings.Count + strings.Sum(t => t.Length * 2);
SpanWriter rawStringsWriter = new SpanWriter(stringsBuffer.GetSpan(stringLength));
for (int i = 0; i < strings.Count; ++i)
{
string v = strings[i] ?? "";
rawStringsWriter.Write((ushort)v.Length);
rawStringsWriter.WriteBigUni(v);
}
stringsBuffer.Advance(stringLength);
state.Send(Compile(state));
}
public static byte[] StringToBuffer(string str) => Encoding.ASCII.GetBytes(str);
private void CompileFast(IBufferWriter<byte> bufferWriter)
private Packet Compile(NetState ns = null)
{
SpanWriter writer = new SpanWriter(bufferWriter.GetSpan(21));
writer.Write((byte)0xB0); // Packed ID
writer.Position += 2; // Dynamic Length
IGumpWriter disp;
writer.Write(Serial);
writer.Write(TypeID);
writer.Write(X);
writer.Write(Y);
if (ns?.Unpack == true)
disp = new DisplayGumpPacked(this);
else
disp = new DisplayGumpFast(this);
ArraySet<string> strings = new ArraySet<string>();
ArrayBufferWriter<byte> layoutBuffer = new ArrayBufferWriter<byte>();
WriteLayout(layoutBuffer, strings);
if (!m_Draggable)
disp.AppendLayout(m_NoMove);
writer.Write((ushort)layoutBuffer.WrittenCount);
if (!m_Closable)
disp.AppendLayout(m_NoClose);
ArrayBufferWriter<byte> stringsBuffer = new ArrayBufferWriter<byte>();
Span<byte> span = stringsBuffer.GetSpan(2);
span[0] = (byte)(strings.Count >> 8);
span[1] = (byte)strings.Count;
bufferWriter.Advance(2);
WriteStrings(stringsBuffer, strings);
if (!m_Disposable)
disp.AppendLayout(m_NoDispose);
writer.Position = 1;
writer.Write((ushort)(23 + layoutBuffer.WrittenCount + stringsBuffer.WrittenCount));
if (!m_Resizable)
disp.AppendLayout(m_NoResize);
// Write the header
bufferWriter.Advance(21);
int count = Entries.Count;
// Write the layout
bufferWriter.Write(layoutBuffer.WrittenSpan);
// Write strings
bufferWriter.Write(stringsBuffer.WrittenSpan);
}
private static int GetMaxPackedSize(int sourceLength) => 8 + (int)Compression.MaxPackSize((ulong)sourceLength);
private static int WritePacked(ReadOnlySpan<byte> source, Span<byte> dest)
{
int length = source.Length;
if (length == 0)
for (int i = 0; i < count; ++i)
{
dest.Clear();
return 4;
GumpEntry e = Entries[i];
disp.AppendLayout(m_BeginLayout);
e.AppendTo(ns, disp);
disp.AppendLayout(m_EndLayout);
}
ulong packLength = (ulong)dest.Length - 8;
disp.WriteStrings(m_Strings);
ZLibError ce = Compression.Pack(dest.Slice(8), ref packLength, source, ZLibQuality.Default);
if (ce != ZLibError.Okay) Console.WriteLine("ZLib error: {0} (#{1})", ce, (int)ce);
SpanWriter writer = new SpanWriter(dest);
int packLengthInt = (int)packLength;
writer.Write(4 + packLengthInt);
writer.Write(length);
disp.Flush();
return 8 + packLengthInt;
m_TextEntries = disp.TextEntries;
m_Switches = disp.Switches;
return (Packet)disp;
}
public virtual void OnResponse(NetState sender, RelayInfo info)

View file

@ -18,46 +18,57 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpAlphaRegion : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("checkertrans");
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpAlphaRegion(int x, int y, int width, int height)
{
X = x;
Y = y;
Width = width;
Height = height;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public override string Compile(NetState ns) => $"{{ checkertrans {m_X} {m_Y} {m_Width} {m_Height} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(60));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
}
}
}
}

View file

@ -18,53 +18,66 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpBackground : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("resizepic");
private int m_GumpID;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpBackground(int x, int y, int width, int height, int gumpID)
{
X = x;
Y = y;
Width = width;
Height = height;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_GumpID = gumpID;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public override string Compile(ArraySet<string> strings) => $"{{ resizepic {X} {Y} {m_GumpID} {Width} {Height} }}";
public int GumpID
{
get => m_GumpID;
set => Delta(ref m_GumpID, value);
}
public override string Compile(NetState ns) => $"{{ resizepic {m_X} {m_Y} {m_GumpID} {m_Width} {m_Height} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(68));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(m_GumpID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_GumpID);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
}
}
}
}

View file

@ -18,9 +18,7 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
@ -32,56 +30,89 @@ namespace Server.Gumps
public class GumpButton : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("button");
private int m_ButtonID;
private int m_ID1, m_ID2;
private int m_Param;
private GumpButtonType m_Type;
private int m_X, m_Y;
public GumpButton(int x, int y, int normalID, int pressedID, int buttonID,
GumpButtonType type = GumpButtonType.Reply, int param = 0)
{
X = x;
Y = y;
NormalID = normalID;
PressedID = pressedID;
ButtonID = buttonID;
Type = type;
Param = param;
m_X = x;
m_Y = y;
m_ID1 = normalID;
m_ID2 = pressedID;
m_ButtonID = buttonID;
m_Type = type;
m_Param = param;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int NormalID { get; set; }
public int NormalID
{
get => m_ID1;
set => Delta(ref m_ID1, value);
}
public int PressedID { get; set; }
public int PressedID
{
get => m_ID2;
set => Delta(ref m_ID2, value);
}
public int ButtonID { get; set; }
public int ButtonID
{
get => m_ButtonID;
set => Delta(ref m_ButtonID, value);
}
public GumpButtonType Type { get; set; }
public GumpButtonType Type
{
get => m_Type;
set
{
if (m_Type != value)
{
m_Type = value;
public int Param { get; set; }
Gump parent = Parent;
public override string Compile(ArraySet<string> strings) => $"{{ button {X} {Y} {NormalID} {PressedID} {(int)Type} {Param} {ButtonID} }}";
parent?.Invalidate();
}
}
}
public int Param
{
get => m_Param;
set => Delta(ref m_Param, value);
}
public override string Compile(NetState ns) => $"{{ button {m_X} {m_Y} {m_ID1} {m_ID2} {(int)m_Type} {m_Param} {m_ButtonID} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(68));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(NormalID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(PressedID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(((int)Type).ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Param.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ButtonID.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_ID1);
disp.AppendLayout(m_ID2);
disp.AppendLayout((int)m_Type);
disp.AppendLayout(m_Param);
disp.AppendLayout(m_ButtonID);
}
}
}

View file

@ -18,58 +18,77 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpCheck : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("checkbox");
private int m_ID1, m_ID2;
private bool m_InitialState;
private int m_SwitchID;
private int m_X, m_Y;
public GumpCheck(int x, int y, int inactiveID, int activeID, bool initialState, int switchID)
{
X = x;
Y = y;
InactiveID = inactiveID;
ActiveID = activeID;
InitialState = initialState;
SwitchID = switchID;
m_X = x;
m_Y = y;
m_ID1 = inactiveID;
m_ID2 = activeID;
m_InitialState = initialState;
m_SwitchID = switchID;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int InactiveID { get; set; }
public int InactiveID
{
get => m_ID1;
set => Delta(ref m_ID1, value);
}
public int ActiveID { get; set; }
public int ActiveID
{
get => m_ID2;
set => Delta(ref m_ID2, value);
}
public bool InitialState { get; set; }
public bool InitialState
{
get => m_InitialState;
set => Delta(ref m_InitialState, value);
}
public int SwitchID { get; set; }
public int SwitchID
{
get => m_SwitchID;
set => Delta(ref m_SwitchID, value);
}
public override string Compile(NetState ns) => $"{{ checkbox {m_X} {m_Y} {m_ID1} {m_ID2} {(m_InitialState ? 1 : 0)} {m_SwitchID} }}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer("{ checkbox ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(69));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(InactiveID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ActiveID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(InitialState ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(SwitchID.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_ID1);
disp.AppendLayout(m_ID2);
disp.AppendLayout(m_InitialState);
disp.AppendLayout(m_SwitchID);
disp.Switches++;
}
}
}
}

View file

@ -18,8 +18,7 @@
*
***************************************************************************/
using System.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
@ -43,7 +42,37 @@ namespace Server.Gumps
}
}
public abstract string Compile(ArraySet<string> strings);
public abstract void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches);
protected void Delta(ref uint var, uint val)
{
if (var != val)
var = val;
}
protected void Delta(ref int var, int val)
{
if (var != val)
var = val;
}
protected void Delta(ref bool var, bool val)
{
if (var != val)
var = val;
}
protected void Delta(ref string var, string val)
{
if (var != val)
var = val;
}
protected void Delta(ref object[] var, object[] val)
{
if (var != val)
var = val;
}
public abstract string Compile(NetState ns);
public abstract void AppendTo(NetState ns, IGumpWriter disp);
}
}

View file

@ -18,30 +18,29 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpGroup : GumpEntry
{
public GumpGroup(int group) => Group = group;
private static byte[] m_LayoutName = Gump.StringToBuffer("group");
private int m_Group;
public GumpGroup(int group) => m_Group = group;
public override string Compile(ArraySet<string> strings) => $"{{ group {Group} }}";
public int Group
{
get => m_Group;
set => Delta(ref m_Group, value);
}
public override string Compile(NetState ns) => $"{{ group {m_Group} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(20));
writer.Write(m_LayoutName);
writer.WriteAscii(Group.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_Group);
}
}
}
}

View file

@ -18,61 +18,83 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpHtml : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("htmlgump");
private bool m_Background, m_Scrollbar;
private string m_Text;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpHtml(int x, int y, int width, int height, string text, bool background, bool scrollbar)
{
X = x;
Y = y;
Width = width;
Height = height;
Text = text;
Background = background;
Scrollbar = scrollbar;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Text = text;
m_Background = background;
m_Scrollbar = scrollbar;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public string Text { get; set; }
public string Text
{
get => m_Text;
set => Delta(ref m_Text, value);
}
public bool Background { get; set; }
public bool Background
{
get => m_Background;
set => Delta(ref m_Background, value);
}
public bool Scrollbar { get; set; }
public bool Scrollbar
{
get => m_Scrollbar;
set => Delta(ref m_Scrollbar, value);
}
public override string Compile(NetState ns) => $"{{ htmlgump {m_X} {m_Y} {m_Width} {m_Height} {Parent.Intern(m_Text)} {(m_Background ? 1 : 0)} {(m_Scrollbar ? 1 : 0)} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(71));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(strings.Add(Text).ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Background ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Scrollbar ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(Parent.Intern(m_Text));
disp.AppendLayout(m_Background);
disp.AppendLayout(m_Scrollbar);
}
}
}
}

View file

@ -18,9 +18,7 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
@ -33,33 +31,45 @@ namespace Server.Gumps
public class GumpHtmlLocalized : GumpEntry
{
private static byte[] m_LayoutNamePlain = Gump.StringToBuffer("xmfhtmlgump");
private static byte[] m_LayoutNameColor = Gump.StringToBuffer("xmfhtmlgumpcolor");
private static byte[] m_LayoutNameArgs = Gump.StringToBuffer("xmfhtmltok");
private string m_Args;
private bool m_Background, m_Scrollbar;
private int m_Color;
private int m_Number;
private GumpHtmlLocalizedType m_Type;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpHtmlLocalized(int x, int y, int width, int height, int number,
bool background = false, bool scrollbar = false)
{
X = x;
Y = y;
Width = width;
Height = height;
Number = number;
Background = background;
Scrollbar = scrollbar;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Number = number;
m_Background = background;
m_Scrollbar = scrollbar;
Type = GumpHtmlLocalizedType.Plain;
m_Type = GumpHtmlLocalizedType.Plain;
}
public GumpHtmlLocalized(int x, int y, int width, int height, int number, int color,
bool background = false, bool scrollbar = false)
{
X = x;
Y = y;
Width = width;
Height = height;
Number = number;
Color = color;
Background = background;
Scrollbar = scrollbar;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Number = number;
m_Color = color;
m_Background = background;
m_Scrollbar = scrollbar;
Type = GumpHtmlLocalizedType.Color;
m_Type = GumpHtmlLocalizedType.Color;
}
public GumpHtmlLocalized(int x, int y, int width, int height, int number, string args, int color,
@ -67,38 +77,81 @@ namespace Server.Gumps
{
// Are multiple arguments unsupported? And what about non ASCII arguments?
X = x;
Y = y;
Width = width;
Height = height;
Number = number;
Args = args;
Color = color;
Background = background;
Scrollbar = scrollbar;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Number = number;
m_Args = args;
m_Color = color;
m_Background = background;
m_Scrollbar = scrollbar;
Type = GumpHtmlLocalizedType.Args;
m_Type = GumpHtmlLocalizedType.Args;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int Number { get; set; }
public int Number
{
get => m_Number;
set => Delta(ref m_Number, value);
}
public string Args { get; set; }
public string Args
{
get => m_Args;
set => Delta(ref m_Args, value);
}
public int Color { get; set; }
public int Color
{
get => m_Color;
set => Delta(ref m_Color, value);
}
public bool Background { get; set; }
public bool Background
{
get => m_Background;
set => Delta(ref m_Background, value);
}
public bool Scrollbar { get; set; }
public bool Scrollbar
{
get => m_Scrollbar;
set => Delta(ref m_Scrollbar, value);
}
public GumpHtmlLocalizedType Type { get; set; }
public GumpHtmlLocalizedType Type
{
get => m_Type;
set
{
if (m_Type != value)
{
m_Type = value;
Parent?.Invalidate();
}
@ -120,81 +173,56 @@ namespace Server.Gumps
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(90 + Args?.Length ?? 0));
switch (Type)
switch (m_Type)
{
case GumpHtmlLocalizedType.Plain:
{
writer.Write(m_LayoutNamePlain);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Number.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Background ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Scrollbar ? "1" : "0");
disp.AppendLayout(m_LayoutNamePlain);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Number);
disp.AppendLayout(m_Background);
disp.AppendLayout(m_Scrollbar);
break;
}
case GumpHtmlLocalizedType.Color:
{
writer.Write(m_LayoutNameColor);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Number.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Background ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Scrollbar ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Color.ToString());
disp.AppendLayout(m_LayoutNameColor);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Number);
disp.AppendLayout(m_Background);
disp.AppendLayout(m_Scrollbar);
disp.AppendLayout(m_Color);
break;
}
case GumpHtmlLocalizedType.Args:
{
writer.Write(m_LayoutNameArgs);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Background ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Scrollbar ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Color.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Number.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x40); // '@'
writer.WriteAscii(Args ?? "");
writer.Write((byte)0x40); // '@'
disp.AppendLayout(m_LayoutNameArgs);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Background);
disp.AppendLayout(m_Scrollbar);
disp.AppendLayout(m_Color);
disp.AppendLayout(m_Number);
disp.AppendLayout(m_Args);
break;
}
}
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
}
}
}

View file

@ -18,68 +18,66 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpImage : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("gumppic");
private static byte[] m_HueEquals = Gump.StringToBuffer(" hue=");
private int m_GumpID;
private int m_Hue;
private int m_X, m_Y;
public GumpImage(int x, int y, int gumpID, int hue = 0)
{
X = x;
Y = y;
GumpID = gumpID;
Hue = hue;
m_X = x;
m_Y = y;
m_GumpID = gumpID;
m_Hue = hue;
}
public GumpImage(int x, int y, int gumpID, int hue = 0, string cls = null)
public int X
{
X = x;
Y = y;
GumpID = gumpID;
Hue = hue;
Class = cls;
get => m_X;
set => Delta(ref m_X, value);
}
public int X { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Y { get; set; }
public int GumpID
{
get => m_GumpID;
set => Delta(ref m_GumpID, value);
}
public int GumpID { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public override string Compile(NetState ns) =>
m_Hue == 0 ? $"{{ gumppic {m_X} {m_Y} {m_GumpID} }}" :
$"{{ gumppic {m_X} {m_Y} {m_GumpID} hue={m_Hue} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(66 + Class?.Length ?? 0));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(GumpID.ToString());
writer.Write((byte)0x20); // ' '
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_GumpID);
if (Hue != 0)
if (m_Hue != 0)
{
writer.Write(m_HueEquals);
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
disp.AppendLayout(m_HueEquals);
disp.AppendLayoutNS(m_Hue);
}
if (!string.IsNullOrWhiteSpace(Class))
{
writer.Write(m_ClassEquals);
writer.WriteAscii(Class);
writer.Write((byte)0x20); // ' '
}
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
}
}
}

View file

@ -18,101 +18,155 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpImageTileButton : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("buttontileart");
private static byte[] m_LayoutTooltip = Gump.StringToBuffer(" }{ tooltip");
private int m_ButtonID;
private int m_Height;
private int m_Hue;
private int m_ID1, m_ID2;
private int m_ItemID;
private int m_Param;
private GumpButtonType m_Type;
private int m_Width;
//Note, on OSI, The tooltip supports ONLY clilocs as far as I can figure out, and the tooltip ONLY works after the buttonTileArt (as far as I can tell from testing)
private int m_X, m_Y;
public GumpImageTileButton(int x, int y, int normalID, int pressedID, int buttonID, GumpButtonType type, int param,
int itemID, int hue, int width, int height, int localizedTooltip = -1)
{
X = x;
Y = y;
NormalID = normalID;
PressedID = pressedID;
ButtonID = buttonID;
Type = type;
Param = param;
m_X = x;
m_Y = y;
m_ID1 = normalID;
m_ID2 = pressedID;
m_ButtonID = buttonID;
m_Type = type;
m_Param = param;
ItemID = itemID;
Hue = hue;
Width = width;
Height = height;
m_ItemID = itemID;
m_Hue = hue;
m_Width = width;
m_Height = height;
LocalizedTooltip = localizedTooltip;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int NormalID { get; set; }
public int NormalID
{
get => m_ID1;
set => Delta(ref m_ID1, value);
}
public int PressedID { get; set; }
public int PressedID
{
get => m_ID2;
set => Delta(ref m_ID2, value);
}
public int ButtonID { get; set; }
public int ButtonID
{
get => m_ButtonID;
set => Delta(ref m_ButtonID, value);
}
public GumpButtonType Type { get; set; }
public GumpButtonType Type
{
get => m_Type;
set
{
if (m_Type != value)
{
m_Type = value;
public int Param { get; set; }
Gump parent = Parent;
public int ItemID { get; set; }
parent?.Invalidate();
}
}
}
public int Hue { get; set; }
public int Param
{
get => m_Param;
set => Delta(ref m_Param, value);
}
public int Width { get; set; }
public int ItemID
{
get => m_ItemID;
set => Delta(ref m_ItemID, value);
}
public int Height { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int LocalizedTooltip{ get; set; }
public override string Compile(ArraySet<string> strings) =>
$"{{ buttontileart {X} {Y} {NormalID} {PressedID} {(int)Type} {Param} {ButtonID} {ItemID} {Hue} {Width} {Height} }}{(LocalizedTooltip > 0 ? $"{{ tooltip {LocalizedTooltip} }}" : "")}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer("{ buttontileart ");
private static readonly byte[] m_LayoutTooltip = Gump.StringToBuffer(" }{ tooltip ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override string Compile(NetState ns)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(160));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(NormalID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(PressedID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(((int)Type).ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Param.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ButtonID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ItemID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
if (LocalizedTooltip > 0)
return
$"{{ buttontileart {m_X} {m_Y} {m_ID1} {m_ID2} {(int)m_Type} {m_Param} {m_ButtonID} {m_ItemID} {m_Hue} {m_Width} {m_Height} }}{{ tooltip {LocalizedTooltip} }}";
return
$"{{ buttontileart {m_X} {m_Y} {m_ID1} {m_ID2} {(int)m_Type} {m_Param} {m_ButtonID} {m_ItemID} {m_Hue} {m_Width} {m_Height} }}";
}
public override void AppendTo(NetState ns, IGumpWriter disp)
{
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_ID1);
disp.AppendLayout(m_ID2);
disp.AppendLayout((int)m_Type);
disp.AppendLayout(m_Param);
disp.AppendLayout(m_ButtonID);
disp.AppendLayout(m_ItemID);
disp.AppendLayout(m_Hue);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
if (LocalizedTooltip > 0)
{
writer.Write(m_LayoutTooltip);
writer.WriteAscii(LocalizedTooltip.ToString());
writer.Write((byte)0x20); // ' '
disp.AppendLayout(m_LayoutTooltip);
disp.AppendLayout(LocalizedTooltip);
}
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
}
}
}

View file

@ -18,51 +18,66 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpImageTiled : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("gumppictiled");
private int m_GumpID;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpImageTiled(int x, int y, int width, int height, int gumpID)
{
X = x;
Y = y;
Width = width;
Height = height;
GumpID = gumpID;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_GumpID = gumpID;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int GumpID { get; set; }
public int GumpID
{
get => m_GumpID;
set => Delta(ref m_GumpID, value);
}
public override string Compile(NetState ns) => $"{{ gumppictiled {m_X} {m_Y} {m_Width} {m_Height} {m_GumpID} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(71));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(GumpID.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_GumpID);
}
}
}
}

View file

@ -18,58 +18,63 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpItem : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("tilepic");
private static byte[] m_LayoutNameHue = Gump.StringToBuffer("tilepichue");
private int m_Hue;
private int m_ItemID;
private int m_X, m_Y;
public GumpItem(int x, int y, int itemID, int hue = 0)
{
X = x;
Y = y;
ItemID = itemID;
Hue = hue;
m_X = x;
m_Y = y;
m_ItemID = itemID;
m_Hue = hue;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int ItemID { get; set; }
public int ItemID
{
get => m_ItemID;
set => Delta(ref m_ItemID, value);
}
public int Hue { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public override string Compile(NetState ns) =>
m_Hue == 0 ? $"{{ tilepic {m_X} {m_Y} {m_ItemID} }}" :
$"{{ tilepichue {m_X} {m_Y} {m_ItemID} {m_Hue} }}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer("{ tilepic ");
private static readonly byte[] m_LayoutNameHue = Gump.StringToBuffer("{ tilepichue ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(57));
writer.Write(Hue == 0 ? m_LayoutName : m_LayoutNameHue);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ItemID.ToString());
writer.Write((byte)0x20); // ' '
disp.AppendLayout(m_Hue == 0 ? m_LayoutName : m_LayoutNameHue);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_ItemID);
if (Hue != 0)
{
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
}
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
if (m_Hue != 0)
disp.AppendLayout(m_Hue);
}
}
}

View file

@ -18,31 +18,29 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpItemProperty : GumpEntry
{
public GumpItemProperty(uint serial) => Serial = serial;
private static byte[] m_LayoutName = Gump.StringToBuffer("itemproperty");
private uint m_Serial;
public GumpItemProperty(uint serial) => m_Serial = serial;
public override string Compile(ArraySet<string> strings) => $"{{ itemproperty {Serial} }}";
public uint Serial
{
get => m_Serial;
set => Delta(ref m_Serial, value);
}
public override string Compile(NetState ns) => $"{{ itemproperty {m_Serial} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(27));
writer.Write(m_LayoutName);
writer.WriteAscii(Serial.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_Serial);
}
}
}
}

View file

@ -18,47 +18,58 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpLabel : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("text");
private int m_Hue;
private string m_Text;
private int m_X, m_Y;
public GumpLabel(int x, int y, int hue, string text)
{
X = x;
Y = y;
Hue = hue;
Text = text;
m_X = x;
m_Y = y;
m_Hue = hue;
m_Text = text;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Hue { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public string Text { get; set; }
public string Text
{
get => m_Text;
set => Delta(ref m_Text, value);
}
public override string Compile(NetState ns) => $"{{ text {m_X} {m_Y} {m_Hue} {Parent.Intern(m_Text)} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(52));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(strings.Add(Text).ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Hue);
disp.AppendLayout(Parent.Intern(m_Text));
}
}
}
}

View file

@ -18,59 +18,75 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpLabelCropped : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("croppedtext");
private int m_Hue;
private string m_Text;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpLabelCropped(int x, int y, int width, int height, int hue, string text)
{
X = x;
Y = y;
Width = width;
Height = height;
Hue = hue;
Text = text;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Hue = hue;
m_Text = text;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int Hue { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public string Text { get; set; }
public string Text
{
get => m_Text;
set => Delta(ref m_Text, value);
}
public override string Compile(NetState ns) => $"{{ croppedtext {m_X} {m_Y} {m_Width} {m_Height} {m_Hue} {Parent.Intern(m_Text)} }}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer("{ croppedtext ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(81));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(strings.Add(Text).ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Hue);
disp.AppendLayout(Parent.Intern(m_Text));
}
}
}
}

View file

@ -18,31 +18,29 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpPage : GumpEntry
{
public GumpPage(int page) => Page = page;
private static byte[] m_LayoutName = Gump.StringToBuffer("page");
private int m_Page;
public GumpPage(int page) => m_Page = page;
public override string Compile(ArraySet<string> strings) => $"{{ page {Page} }}";
public int Page
{
get => m_Page;
set => Delta(ref m_Page, value);
}
public override string Compile(NetState ns) => $"{{ page {m_Page} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(19));
writer.Write(m_LayoutName);
writer.WriteAscii(Page.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_Page);
}
}
}
}

View file

@ -18,61 +18,77 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpRadio : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("radio");
private int m_ID1, m_ID2;
private bool m_InitialState;
private int m_SwitchID;
private int m_X, m_Y;
public GumpRadio(int x, int y, int inactiveID, int activeID, bool initialState, int switchID)
{
X = x;
Y = y;
InactiveID = inactiveID;
ActiveID = activeID;
InitialState = initialState;
SwitchID = switchID;
m_X = x;
m_Y = y;
m_ID1 = inactiveID;
m_ID2 = activeID;
m_InitialState = initialState;
m_SwitchID = switchID;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int InactiveID { get; set; }
public int InactiveID
{
get => m_ID1;
set => Delta(ref m_ID1, value);
}
public int ActiveID { get; set; }
public int ActiveID
{
get => m_ID2;
set => Delta(ref m_ID2, value);
}
public bool InitialState { get; set; }
public bool InitialState
{
get => m_InitialState;
set => Delta(ref m_InitialState, value);
}
public int SwitchID { get; set; }
public int SwitchID
{
get => m_SwitchID;
set => Delta(ref m_SwitchID, value);
}
public override string Compile(NetState ns) => $"{{ radio {m_X} {m_Y} {m_ID1} {m_ID2} {(m_InitialState ? 1 : 0)} {m_SwitchID} }}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer("{ radio ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(66));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(InactiveID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(ActiveID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(InitialState ? "1" : "0");
writer.Write((byte)0x20); // ' '
writer.WriteAscii(SwitchID.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_ID1);
disp.AppendLayout(m_ID2);
disp.AppendLayout(m_InitialState);
disp.AppendLayout(m_SwitchID);
buffer.Advance(writer.WrittenCount);
switches++;
disp.Switches++;
}
}
}
}

View file

@ -18,66 +18,86 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpTextEntry : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("textentry");
private int m_EntryID;
private int m_Hue;
private string m_InitialText;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpTextEntry(int x, int y, int width, int height, int hue, int entryID, string initialText)
{
X = x;
Y = y;
Width = width;
Height = height;
Hue = hue;
EntryID = entryID;
InitialText = initialText;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Hue = hue;
m_EntryID = entryID;
m_InitialText = initialText;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int Hue { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public int EntryID { get; set; }
public int EntryID
{
get => m_EntryID;
set => Delta(ref m_EntryID, value);
}
public string InitialText { get; set; }
public string InitialText
{
get => m_InitialText;
set => Delta(ref m_InitialText, value);
}
public override string Compile(NetState ns) => $"{{ textentry {m_X} {m_Y} {m_Width} {m_Height} {m_Hue} {m_EntryID} {Parent.Intern(m_InitialText)} }}";
private static readonly byte[] m_LayoutName = Gump.StringToBuffer(" { textentry ");
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(90));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(EntryID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(strings.Add(InitialText).ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Hue);
disp.AppendLayout(m_EntryID);
disp.AppendLayout(Parent.Intern(m_InitialText));
buffer.Advance(writer.WrittenCount);
entries++;
disp.TextEntries++;
}
}
}
}

View file

@ -18,69 +18,95 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpTextEntryLimited : GumpEntry
{
private static byte[] m_LayoutName = Gump.StringToBuffer("textentrylimited");
private int m_EntryID;
private int m_Hue;
private string m_InitialText;
private int m_Size;
private int m_Width, m_Height;
private int m_X, m_Y;
public GumpTextEntryLimited(int x, int y, int width, int height, int hue, int entryID, string initialText, int size = 0)
{
X = x;
Y = y;
Width = width;
Height = height;
Hue = hue;
EntryID = entryID;
InitialText = initialText;
Size = size;
m_X = x;
m_Y = y;
m_Width = width;
m_Height = height;
m_Hue = hue;
m_EntryID = entryID;
m_InitialText = initialText;
m_Size = size;
}
public int X { get; set; }
public int X
{
get => m_X;
set => Delta(ref m_X, value);
}
public int Y { get; set; }
public int Y
{
get => m_Y;
set => Delta(ref m_Y, value);
}
public int Width { get; set; }
public int Width
{
get => m_Width;
set => Delta(ref m_Width, value);
}
public int Height { get; set; }
public int Height
{
get => m_Height;
set => Delta(ref m_Height, value);
}
public int Hue { get; set; }
public int Hue
{
get => m_Hue;
set => Delta(ref m_Hue, value);
}
public int EntryID { get; set; }
public int EntryID
{
get => m_EntryID;
set => Delta(ref m_EntryID, value);
}
public string InitialText { get; set; }
public string InitialText
{
get => m_InitialText;
set => Delta(ref m_InitialText, value);
}
public int Size { get; set; }
public int Size
{
get => m_Size;
set => Delta(ref m_Size, value);
}
public override string Compile(NetState ns) => $"{{ textentrylimited {m_X} {m_Y} {m_Width} {m_Height} {m_Hue} {m_EntryID} {Parent.Intern(m_InitialText)} {m_Size} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(107));
writer.Write(m_LayoutName);
writer.WriteAscii(X.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Y.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Width.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Height.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Hue.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(EntryID.ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(strings.Add(InitialText).ToString());
writer.Write((byte)0x20); // ' '
writer.WriteAscii(Size.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_X);
disp.AppendLayout(m_Y);
disp.AppendLayout(m_Width);
disp.AppendLayout(m_Height);
disp.AppendLayout(m_Hue);
disp.AppendLayout(m_EntryID);
disp.AppendLayout(Parent.Intern(m_InitialText));
disp.AppendLayout(m_Size);
buffer.Advance(writer.WrittenCount);
entries++;
disp.TextEntries++;
}
}
}

View file

@ -18,31 +18,29 @@
*
***************************************************************************/
using System.Buffers;
using Server.Buffers;
using Server.Collections;
using Server.Network;
namespace Server.Gumps
{
public class GumpTooltip : GumpEntry
{
public GumpTooltip(int number) => Number = number;
private static byte[] m_LayoutName = Gump.StringToBuffer("tooltip");
private int m_Number;
public GumpTooltip(int number) => m_Number = number;
public override string Compile(ArraySet<string> strings) => $"{{ tooltip {Number} }}";
public int Number
{
get => m_Number;
set => Delta(ref m_Number, value);
}
public override string Compile(NetState ns) => $"{{ tooltip {m_Number} }}";
public override void AppendTo(ArrayBufferWriter<byte> buffer, ArraySet<string> strings, ref int entries, ref int switches)
public override void AppendTo(NetState ns, IGumpWriter disp)
{
SpanWriter writer = new SpanWriter(buffer.GetSpan(22));
writer.Write(m_LayoutName);
writer.WriteAscii(Number.ToString());
writer.Write((byte)0x20); // ' '
writer.Write((byte)0x7D); // '}'
buffer.Advance(writer.WrittenCount);
disp.AppendLayout(m_LayoutName);
disp.AppendLayout(m_Number);
}
}
}
}