Here is some code where i handle context properly in c#
using System;
using System.Collections.Generic;
using System.Linq;
using ScriptSDK.API;
using ScriptSDK.Data;
using ScriptSDK.Engines;
namespace ScriptSDK.ContextMenus
{
public class ContextMenu
{
public ContextMenu(UOEntity owner)
{
Entries = new List<ContextMenuEntry>();
Owner = owner;
}
protected UOEntity Owner { get; set; }
public List<ContextMenuEntry> Entries { get; private set; }
public event EventHandler<ContextMenuEventArgs> OnClick;
public bool Click(string Text, bool strict = true)
{
var e = Entries;
if (Text.Trim().Equals(string.Empty))
return false;
if (!strict)
Text = Text.ToLower();
if (e == null)
return false;
if (e.Count < 1)
return false;
foreach (var a in e)
{
var t = a.Text;
if (!strict)
t = t.ToLower();
if (t.Equals(Text))
return Click(a);
}
return false;
}
public bool Click(ContextMenuEntry entry)
{
if (Owner == null)
return false;
var LastUser = ContextOptions.AssignedObject.Value;
if (!LastUser.Equals(Owner.Serial.Value))
return OnUse(new ContextMenuEventArgs {Entry = entry, State = false});
foreach (var e in Entries.Where(e => e.ClilocID.Equals(entry.ClilocID)))
{
return OnUse(new ContextMenuEventArgs {Entry = e, State = true});
}
return OnUse(new ContextMenuEventArgs {Entry = entry, State = false});
}
public bool Click(uint ClilocID)
{
foreach (var e in Entries.Where(e => e.ClilocID.Equals(ClilocID)))
{
return Click(e);
}
return OnUse(new ContextMenuEventArgs {Entry = new ContextMenuEntry(string.Empty, this), State = false});
}
public bool Parse()
{
if (ContextOptions.AssignedObject.Equals(Owner.Serial))
return false;
Entries.Clear();
if (Owner == null)
return false;
var LastUser = ContextOptions.AssignedObject;
if (!LastUser.Value.Equals(0) && !LastUser.Equals(Owner.Serial))
return false;
Stealth.Client.ClearContextMenu();
Entries = new List<ContextMenuEntry>();
if (Owner == null)
return false;
Stealth.Client.RequestContextMenu(Owner.Serial.Value);
if (ContextOptions.ParserDelay > 0)
Stealth.Client.Wait(ContextOptions.ParserDelay);
var list = Stealth.Client.GetContextMenu();
if (!list.Contains("\r\n"))
{
const string Code =
"ContextMenu Parsing Error!\nFollowing choices could solve the issue:\n* Increase Parser Delay\n* visit https://bitbucket.org/Stealthadmin/stealth-beta-client/issue/11/70411-update";
ScriptLogger.WriteLine(Code);
return false;
}
list = list.Replace("\r\n", ContextOptions.ParserSymbol.ToString());
var s = list.Split(ContextOptions.ParserSymbol);
Entries.Clear();
foreach (var e in s)
Entries.Add(new ContextMenuEntry(e, this));
ContextOptions.AssignedObject = Owner.Serial;
return true;
}
public UOEntity GetOwner()
{
return new UOEntity(Owner.Serial.Value);
}
protected virtual bool OnUse(ContextMenuEventArgs e)
{
if (e.State)
{
var lu = ContextOptions.AssignedObject;
if (Owner == null || !Owner.Serial.Value.Equals(lu.Value))
e.State = false;
if ((!e.Entry.Flags.Equals(CMEFlags.Disabled)) && (e.State))
{
Stealth.Client.ClearContextMenu();
Stealth.Client.SetContextMenuHook(lu.Value, (byte) e.Entry.Tag);
Stealth.Client.RequestContextMenu(lu.Value);
if (ContextOptions.ParserDelay > 0)
Stealth.Client.Wait(ContextOptions.ParserDelay);
Stealth.Client.ClearContextMenu();
Stealth.Client.RequestContextMenu(0);
Stealth.Client.SetContextMenuHook(0, 0);
}
else
e.State = false;
}
var handler = OnClick;
if (handler != null)
{
handler(this, e);
}
return e.State;
}
}
public interface ICMEntry
{
CMEFlags Flags { get; }
uint ClilocID { get; }
ushort Tag { get; }
ushort Color { get; }
string Text { get; }
}
public class ContextMenuEntry : ICMEntry
{
public ContextMenuEntry(string properties, ContextMenu owner)
{
var list = properties.Split('|');
var parseable = list.Length.Equals(5);
Text = parseable ? list[2] : "INVALID ENTRY";
Flags = parseable ? (CMEFlags) Convert.ToUInt16(list[2]) : CMEFlags.Disabled;
Color = parseable ? Convert.ToUInt16(list[4]) : (ushort) 0;
Tag = parseable ? Convert.ToUInt16(list[3]) : (ushort) 0;
ClilocID = parseable ? Convert.ToUInt32(list[1]) : 0;
_owner = owner;
}
protected ContextMenu _owner { get; set; }
public CMEFlags Flags { get; private set; }
public uint ClilocID { get; private set; }
public ushort Tag { get; private set; }
public ushort Color { get; private set; }
public string Text { get; private set; }
}
}