Initial attempt

This commit is contained in:
Malcolm Roberts 2023-12-08 15:20:12 -06:00
parent 13c06ce76b
commit 9b2a830bc2
93 changed files with 17012 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
bin/
obj/
/packages/
riderModule.iml
/_ReSharper.Caches/

13
.idea/.idea.MRBot/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/contentModel.xml
/.idea.MRBot.iml
/modules.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

1
.idea/.idea.MRBot/.idea/.name generated Normal file
View File

@ -0,0 +1 @@
MRBot

4
.idea/.idea.MRBot/.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

8
.idea/.idea.MRBot/.idea/indexLayout.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

6
.idea/.idea.MRBot/.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

13
.idea/.idea.UiTest/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/contentModel.xml
/projectSettingsUpdater.xml
/modules.xml
/.idea.UiTest.iml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

4
.idea/.idea.UiTest/.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

6
.idea/.idea.UiTest/.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

BIN
.vs/MRBot/v17/.suo Normal file

Binary file not shown.

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"dotnet.preferCSharpExtension": true
}

25
MRBot.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34309.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MRBot", "MRBot\MRBot.csproj", "{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x64 = Release|x64
Debug|x64 = Debug|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}.Release|x64.ActiveCfg = Release|x64
{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}.Release|x64.Build.0 = Release|x64
{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}.Debug|x64.ActiveCfg = Debug|x64
{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}.Debug|x64.Build.0 = Debug|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3F4E0D7F-32A0-4A5D-B963-1932F19EF854}
EndGlobalSection
EndGlobal

2
MRBot.sln.DotSettings Normal file
View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=mrbot/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -0,0 +1,6 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer&gt;&#xD;
&lt;Assembly Path="E:\code\personal\isx\UiTest\packages\TinyLogger.1.9.0\lib\netstandard2.0\TinyLogger.dll" /&gt;&#xD;
&lt;Assembly Path="C:\Users\marob\.nuget\packages\system.runtime.compilerservices.unsafe\6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll" /&gt;&#xD;
&lt;Assembly Path="C:\Users\marob\.nuget\packages\system.memory\4.5.5\lib\net461\System.Memory.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String></wpf:ResourceDictionary>

File diff suppressed because one or more lines are too long

27
MRBot/Api/BotApi.cs Normal file
View File

@ -0,0 +1,27 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MRBot.PassiveTasks;
namespace MRBot.Api;
internal sealed class BotApi
{
private readonly IPassiveTaskList _passiveTaskList;
private readonly ILogger<BotApi> _logger;
private readonly IServiceProvider _serviceProvider;
public BotApi(IPassiveTaskList passiveTaskList, ILogger<BotApi> logger, IServiceProvider serviceProvider)
{
_passiveTaskList = passiveTaskList;
_logger = logger;
_serviceProvider = serviceProvider;
}
public void FollowPlayer(string playerName)
{
_logger.LogInformation($"Following player {playerName}");
var task = ActivatorUtilities.CreateInstance<FollowTask>(_serviceProvider, playerName);
_passiveTaskList.AddTask(task);
}
}

22
MRBot/App.config Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?><configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,56 @@
using System.Collections.Generic;
using System.IO;
using System.Threading;
using InnerSpaceAPI;
using LavishVMAPI;
using MRBot.IsxEq2;
using Newtonsoft.Json;
namespace MRBot.Bot.AbilityExporter
{
internal class AbilityExporter
{
public void ExportAbilities()
{
var abilities = new AbilityList();
for (var idx = 1; idx <= Extension.Me.NumAbilities; idx++)
{
InnerSpace.Echo($"Exporting Ability {idx} of {Extension.Me.NumAbilities}");
var count = 0;
ExportableAbility exportableExportableAbility;
using (new FrameLock(true))
{
var ability = Extension.Me.Ability(idx);
while (!ability.IsAbilityInfoAvailable && count < 10)
{
Frame.Wait(false);
count++;
}
if (count >= 10)
{
InnerSpace.Echo($"Ability {idx} info never became available");
continue;
}
exportableExportableAbility = new ExportableAbility(ability);
}
abilities.AddAbility(exportableExportableAbility);
}
var path = Path.Combine(
InnerSpace.Path,
"scripts",
"mr",
"bot",
"ability_exports",
$"{Extension.Me.Name}_{Extension.Me.SubClass}.json");
using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write))
using (var writer = new StreamWriter(fileStream))
{
writer.Write(JsonConvert.SerializeObject(abilities));
}
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
using MRBot.Extensions;
namespace MRBot.Bot.AbilityExporter
{
internal class AbilityList : Dictionary<string, List<ExportableAbility>>
{
public void AddAbility(ExportableAbility exportableAbility)
{
var abilityLineName = exportableAbility.Name.RemoveRomanNumeralsFromEnd();
if (!this.ContainsKey(abilityLineName))
{
this.Add(abilityLineName, new List<ExportableAbility>());
}
this[abilityLineName].Add(exportableAbility);
}
}
}

View File

@ -0,0 +1,83 @@
using System.Collections.Generic;
using System.Linq;
using MRBot.IsxEq2;
using MRBot.IsxEq2.AbilityEffect;
namespace MRBot.Bot.AbilityExporter
{
internal class ExportableAbility
{
public ExportableAbility(Ability ability)
{
// copy properties from ability to this
Id = ability.Id;
Name = ability.AbilityInfo.Name;
Description = ability.AbilityInfo.Description;
Level = ability.AbilityInfo.Class(Extension.Me.SubClass).Level;
Tier = ability.AbilityInfo.Tier;
HealthCost = ability.AbilityInfo.HealthCost;
PowerCost = ability.AbilityInfo.PowerCost;
DissonanceCost = ability.AbilityInfo.DissonanceCost;
SavageryCost = ability.AbilityInfo.SavageryCost;
ConcentrationCost = ability.AbilityInfo.ConcentrationCost;
MainIconId = ability.AbilityInfo.MainIconID;
HoIconId = ability.AbilityInfo.HOIconID;
CastingTime = ability.AbilityInfo.CastingTime;
RecoveryTime = ability.AbilityInfo.RecoveryTime;
RecastTime = ability.AbilityInfo.RecastTime;
MaxDuration = ability.AbilityInfo.MaxDuration;
Effects = Enumerable
.Range(1, ability.AbilityInfo.NumEffects)
.Select(idx => new ExportableAbilityEffect(ability.AbilityInfo.Effect(idx)))
.ToList();
BackDropIconId = ability.AbilityInfo.BackDropIconID;
HealthCostPerTick = ability.AbilityInfo.HealthCostPerTick;
PowerCostPerTick = ability.AbilityInfo.PowerCostPerTick;
DissonanceCostPerTick = ability.AbilityInfo.DissonanceCostPerTick;
SavageryCostPerTick = ability.AbilityInfo.SavageryCostPerTick;
MaxAoeTargets = ability.AbilityInfo.MaxAOETargets;
DoesNotExpire = ability.AbilityInfo.DoesNotExpire;
GroupRestricted = ability.AbilityInfo.GroupRestricted;
AllowRaid = ability.AbilityInfo.AllowRaid;
IsBeneficial = ability.AbilityInfo.IsBeneficial;
EffectRadius = ability.AbilityInfo.EffectRadius;
TargetType = ability.AbilityInfo.TargetType;
SpellBookType = ability.AbilityInfo.SpellBookType;
MinRange = ability.AbilityInfo.MinRange;
MaxRange = ability.AbilityInfo.MaxRange;
}
public uint Id { get; set; }
public string Name { get; set; }
public int Level { get; set; }
public string Description { get; set; }
public string Tier { get; set; }
public int HealthCost { get; set; }
public int PowerCost { get; set; }
public int DissonanceCost { get; set; }
public int SavageryCost { get; set; }
public int ConcentrationCost { get; set; }
public int MainIconId { get; set; }
public int HoIconId { get; set; }
public float CastingTime { get; set; }
public float RecoveryTime { get; set; }
public float RecastTime { get; set; }
public float MaxDuration { get; set; }
public List<ExportableAbilityEffect> Effects { get; set; }
public int BackDropIconId { get; set; }
public int HealthCostPerTick { get; set; }
public int PowerCostPerTick { get; set; }
public int DissonanceCostPerTick { get; set; }
public int SavageryCostPerTick { get; set; }
public int MaxAoeTargets { get; set; }
public bool DoesNotExpire { get; set; }
public bool GroupRestricted { get; set; }
public bool AllowRaid { get; set; }
public bool IsBeneficial { get; set; }
public float EffectRadius { get; set; }
public int TargetType { get; set; }
public int SpellBookType { get; set; }
public float MinRange { get; set; }
public float MaxRange { get; set; }
}
}

View File

@ -0,0 +1,18 @@
using MRBot.IsxEq2.AbilityEffect;
namespace MRBot.Bot.AbilityExporter
{
internal class ExportableAbilityEffect
{
public ExportableAbilityEffect(AbilityEffect effect)
{
PercentSuccess = effect.PercentSuccess;
Indentation = effect.Indentation;
Description = effect.Description;
}
public int PercentSuccess { get; set; }
public int Indentation { get; set; }
public string Description { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System.Text.RegularExpressions;
namespace MRBot.Extensions
{
public static class StringExtensionMethods
{
private static readonly Regex TrailingRomanNumeralRegex = new Regex(@"\s+[IVX]+$", RegexOptions.Compiled);
public static string RemoveRomanNumeralsFromEnd(this string lhs)
{
return TrailingRomanNumeralRegex.Replace(lhs, "");
}
}
}

View File

@ -0,0 +1,109 @@
using System;
using System.Threading.Tasks;
using LavishScriptAPI;
using Microsoft.Extensions.Logging;
using TinyLogger;
namespace MRBot;
internal class InnerspaceLogRenderer : ILogRenderer
{
public Task Flush()
{
return Task.CompletedTask;
}
public Task Render(TokenizedMessage message)
{
using var sb = Pooling.RentStringBuilder();
using var messageTokens = message.RentMessageTokenList();
for (var i = 0; i < messageTokens.Value.Count; i++)
{
var token = messageTokens.Value[i];
if (token.Type != MessageTokenType.ObjectToken)
{
token.Write(sb.Value);
continue;
}
var colorCode = GetColorCode(token.Value, message.LogLevel);
sb.Value.Append(colorCode);
token.Write(sb.Value);
}
LavishScript.ExecuteCommand($@"echo {sb.Value}");
return Task.CompletedTask;
}
private string GetColorCode(object? value, LogLevel logLevel)
{
return (value, logLevel) switch
{
(bool b, _) => b ? ColorCode.Magenta : string.Empty,
(byte _, _) => ColorCode.Magenta,
(sbyte _, _) => ColorCode.Magenta,
(short _, _) => ColorCode.Magenta,
(ushort _, _) => ColorCode.Magenta,
(int _, _) => ColorCode.Magenta,
(uint _, _) => ColorCode.Magenta,
(long _, _) => ColorCode.Magenta,
(ulong _, _) => ColorCode.Magenta,
(float _, _) => ColorCode.Magenta,
(double _, _) => ColorCode.Magenta,
(decimal _, _) => ColorCode.Magenta,
(char _, _) _ => ColorCode.Yellow,
(string _, _) _ => ColorCode.Yellow,
(DateTime _, _) _ => ColorCode.Teal,
(DateTimeOffset _, _) _ => ColorCode.Teal,
(TimeSpan _, _) _ => ColorCode.Teal,
(Guid _, _) _ => ColorCode.DarkMagenta,
(Uri _, _) _ => ColorCode.DarkMagenta,
(Version _, _) _ => ColorCode.DarkMagenta,
(Exception _, LogLevel.Warning) _ => ColorCode.DarkOrange,
(Exception _, LogLevel.Error) _ => ColorCode.DarkRed,
(Exception _, LogLevel.Critical) _ => ColorCode.DarkRed,
(EventId _, _) _ => ColorCode.Yellow,
(LogLevel.Trace, _) => ColorCode.DarkWhite,
(LogLevel.Debug, _) => ColorCode.DarkBlue,
(LogLevel.Information, _) => ColorCode.DarkGreen,
(LogLevel.Warning, _) => ColorCode.DarkYellow,
(LogLevel.Error, _) => ColorCode.Red,
(LogLevel.Critical, _) => ColorCode.DarkRed,
(_, _) => ColorCode.White
};
}
private static class ColorCode
{
public const string Yellow = @"\ay";
public const string DarkYellow = @"\a-y";
public const string Orange = @"\ao";
public const string DarkOrange = @"\a-o";
public const string Green = @"\ag";
public const string DarkGreen = @"\a-g";
public const string Blue = @"\au";
public const string DarkBlue = @"\a-u";
public const string Red = @"\ar";
public const string DarkRed = @"\a-r";
public const string Teal = @"\at";
public const string DarkTeal = @"\a-t";
public const string Black = @"\ab";
public const string Magenta = @"\am";
public const string DarkMagenta = @"\a-m";
public const string Purple = @"\ap";
public const string DarkPurple = @"\a-p";
public const string White = @"\aw";
public const string DarkWhite = @"\a-w";
public const string Previous = @"\ax";
}
}

View File

@ -0,0 +1,65 @@
using System.Globalization;
using InnerSpaceAPI;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
public class Ability : LavishScriptObject
{
public Ability(LavishScriptObject copy) : base(copy) { }
public uint Id => this.GetUIntFromLSO("ID");
public bool IsReady => this.GetBoolFromLSO("IsReady");
public float TimeUntilReady => this.GetFloatFromLSO("TimeUntilReady");
public float IsQueued => this.GetFloatFromLSO("IsQueued");
public bool IsAbilityInfoAvailable => this.GetBoolFromLSO("IsAbilityInfoAvailable");
public AbilityInfo AbilityInfo => new AbilityInfo(GetMember("ToAbilityInfo"));
public bool Use() => ExecuteMethod("Use");
public bool Examine() => ExecuteMethod("Examine");
}
public class AbilityInfo : LavishScriptObject
{
public AbilityInfo(LavishScriptObject copy) : base(copy) { }
public string Name => this.GetStringFromLSO("Name");
public string Description => this.GetStringFromLSO("Description");
public string Tier => this.GetStringFromLSO("Tier");
public int HealthCost => this.GetIntFromLSO("HealthCost");
public int PowerCost => this.GetIntFromLSO("PowerCost");
public int DissonanceCost => this.GetIntFromLSO("DissonanceCost");
public int SavageryCost => this.GetIntFromLSO("SavageryCost");
public int ConcentrationCost => this.GetIntFromLSO("ConcentrationCost");
public int MainIconID => this.GetIntFromLSO("MainIconID");
public int HOIconID => this.GetIntFromLSO("HOIconID");
public float CastingTime => this.GetFloatFromLSO("CastingTime");
public float RecoveryTime => this.GetFloatFromLSO("RecoveryTime");
public float RecastTime => this.GetFloatFromLSO("RecastTime");
public float MaxDuration => this.GetFloatFromLSO("MaxDuration");
public int NumClasses => this.GetIntFromLSO("NumClasses");
public int NumEffects => this.GetIntFromLSO("NumEffects");
public AbilityEffect Effect(int index) => new AbilityEffect(GetMember("Effect", index.ToString(CultureInfo.InvariantCulture)));
public int BackDropIconID => this.GetIntFromLSO("BackDropIconID");
public int HealthCostPerTick => this.GetIntFromLSO("HealthCostPerTick");
public int PowerCostPerTick => this.GetIntFromLSO("PowerCostPerTick");
public int DissonanceCostPerTick => this.GetIntFromLSO("DissonanceCostPerTick");
public int SavageryCostPerTick => this.GetIntFromLSO("SavageryCostPerTick");
public int MaxAOETargets => this.GetIntFromLSO("MaxAOETargets");
public bool DoesNotExpire => this.GetBoolFromLSO("DoesNotExpire");
public bool GroupRestricted => this.GetBoolFromLSO("GroupRestricted");
public bool AllowRaid => this.GetBoolFromLSO("AllowRaid");
public bool IsBeneficial => this.GetBoolFromLSO("IsBeneficial");
public float EffectRadius => this.GetFloatFromLSO("EffectRadius");
public int TargetType => this.GetIntFromLSO("TargetType");
public int SpellBookType => this.GetIntFromLSO("SpellBookType");
public float MinRange => this.GetFloatFromLSO("MinRange");
public float MaxRange => this.GetFloatFromLSO("MaxRange");
public string ToLink => this.GetStringFromLSO("ToLink");
public Class Class(int index) => GetMember<Class>("Class", index.ToString(CultureInfo.InvariantCulture));
public Class Class(string className) => new Class(GetMember("Class", className));
}
}

View File

@ -0,0 +1,21 @@
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
public class AbilityEffect : LavishScriptObject
{
public AbilityEffect(LavishScriptObject copy) : base(copy) { }
private int? _percentSuccess;
public int PercentSuccess => _percentSuccess ?? (_percentSuccess = this.GetIntFromLSO("PercentSuccess")).Value;
private int? _indentation;
public int Indentation => _indentation ?? (_indentation = this.GetIntFromLSO("Indentation")).Value;
private string _description;
public string Description => _description ?? (_description = this.GetStringFromLSO("Description"));
}
}

View File

@ -0,0 +1,186 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to Achievements.
/// </summary>
public class Achievement : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Achievement(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of description
/// </summary>
private string _description;
/// <summary>
/// Achievement Description
/// </summary>
public string Description
{
get
{
Trace.WriteLine(String.Format("Achievement:Description"));
return _description ?? (_description = this.GetStringFromLSO("Description"));
}
}
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// Achievement ID
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("Achievement:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of Level
/// </summary>
private int? _level;
/// <summary>
/// Achievement level
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("Achievement:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Cache of MaxLevel
/// </summary>
private int? _maxLevel;
/// <summary>
/// Max Level of the Achievement
/// </summary>
public int MaxLevel
{
get
{
Trace.WriteLine(String.Format("Achievement:MaxLevel"));
if(!_maxLevel.HasValue)
_maxLevel = this.GetIntFromLSO("MaxLevel");
return _maxLevel.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Achievement name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Achievement:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Cache of PointCostPerLevel
/// </summary>
private int? _pointCostPerLevel;
/// <summary>
/// Achievement point cost per level
/// </summary>
public int PointCostPerLevel
{
get
{
Trace.WriteLine(String.Format("Achievement:PointCostPerLevel"));
if(!_pointCostPerLevel.HasValue)
_pointCostPerLevel = this.GetIntFromLSO("PointCostPerLevel");
return _pointCostPerLevel.Value;
}
}
/// <summary>
/// Cache of ReqLevelToBuy
/// </summary>
private int? _reqLevelToBuy;
/// <summary>
/// Requred level to purchase the Achievement
/// </summary>
public int ReqLevelToBuy
{
get
{
Trace.WriteLine(String.Format("Achievement:ReqLevelToBuy"));
if(!_reqLevelToBuy.HasValue)
_reqLevelToBuy = this.GetIntFromLSO("ReqLevelToBuy");
return _reqLevelToBuy.Value;
}
}
/// <summary>
/// Returns the achievement as an ability
/// </summary>
/// <returns>ability</returns>
public Ability ToAbility
{
get
{
Trace.WriteLine(String.Format("Achievement:ToAbility"));
return new Ability(this.GetMember("ToAbility"));
}
}
#endregion
#region Methods
/// <summary>
/// Examines the achievement
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Achievement:Examine()"));
return this.ExecuteMethod("Examine");
}
#endregion
}
}

View File

@ -0,0 +1,66 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related
/// to information about the classes that can use abilities or items.
/// </summary>
public class Class : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Class(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of Level
/// </summary>
private int? _level;
/// <summary>
/// Required level of this class
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("Class:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Class name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Class:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
#endregion
}
}

View File

@ -0,0 +1,189 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to effects that are on the current player character.
/// </summary>
public class Effect : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Effect(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of BackDropID
/// </summary>
private int? _backDropID;
/// <summary>
/// Back Drop ID of Effect
/// </summary>
public int BackDropIconID
{
get
{
Trace.WriteLine(String.Format("Effect:BackDropIconID"));
if(!_backDropID.HasValue)
_backDropID = this.GetIntFromLSO("BackDropIconID");
return _backDropID.Value;
}
}
/// <summary>
/// Current Increments on Effect
/// </summary>
public int CurrentIncrements
{
get
{
Trace.WriteLine(String.Format("Effect:CurrentIncrements"));
return this.GetIntFromLSO("CurrentIncrements");
}
}
/// <summary>
/// Cache of Description
/// </summary>
private string _description;
/// <summary>
/// Effect Description
/// </summary>
public string Description
{
get
{
Trace.WriteLine(String.Format("Effect:Description"));
return _description ?? (_description = this.GetStringFromLSO("Description"));
}
}
/// <summary>
/// This is the current duration of the effect in seconds.
/// </summary>
public float Duration
{
get
{
Trace.WriteLine(String.Format("Effect:Duration"));
return this.GetFloatFromLSO("Duration");
}
}
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// Effect ID
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("Effect:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of MainIconID
/// </summary>
private int? _mainIconID;
/// <summary>
/// Effect main icon ID
/// </summary>
public int MainIconID
{
get
{
Trace.WriteLine(String.Format("Effect:MainIconID"));
if(!_mainIconID.HasValue)
_mainIconID = this.GetIntFromLSO("MainIconID");
return _mainIconID.Value;
}
}
/// <summary>
/// Cache of MaxDuration
/// </summary>
private float? _maxDuration;
/// <summary>
/// This is the maximum duration of the effect in seconds.
/// Note: If you log off and back on with 'duration' buffs/effects,
/// will notice that the 'MaxDuration' will change to reflect that.
/// </summary>
public float MaxDuration
{
get
{
Trace.WriteLine(String.Format("Effect:MaxDuration"));
if(!_maxDuration.HasValue)
_maxDuration = this.GetFloatFromLSO("MaxDuration");
return _maxDuration.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Effect Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Effect:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
#endregion
#region Methods
/// <summary>
/// Cancels the effect, if possible
/// </summary>
/// <returns>call success</returns>
public bool Cancel()
{
Trace.WriteLine(String.Format("Effect:Cancel()"));
return this.ExecuteMethod("Cancel");
}
/// <summary>
/// Examines the effect
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Effect:Examine()"));
return this.ExecuteMethod("Examine");
}
#endregion
}
}

View File

@ -0,0 +1,189 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.CharacterActor;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.AbilityEffect
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to
/// maintained buffs or debuffs attributed to the current player character.
/// </summary>
public class Maintained : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Maintained(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of ConcentrationCost
/// </summary>
private int? _concentrationCost;
/// <summary>
/// Maintained effect concentration cost
/// </summary>
public int ConcentrationCost
{
get
{
Trace.WriteLine(String.Format("Maintained:ConcentrationCost"));
if(!_concentrationCost.HasValue)
_concentrationCost = this.GetIntFromLSO("ConcentrationCost");
return _concentrationCost.Value;
}
}
/// <summary>
/// Returns the total number of increments of the maintained effect
/// </summary>
public int CurrentIncrements
{
get
{
Trace.WriteLine(String.Format("Maintained:CurrentIncrements"));
return this.GetIntFromLSO("CurrentIncrements");
}
}
/// <summary>
/// This is the current duration of the buff/debuff in seconds.
/// Buffs/Debuffs that do not have a duration (ie, last forever) will return -1.
/// </summary>
public float Duration
{
get
{
Trace.WriteLine(String.Format("Maintained:Duration"));
return this.GetFloatFromLSO("Duration");
}
}
/// <summary>
/// Cache of IsBeneficial
/// </summary>
private bool? _isBeneficial;
/// <summary>
/// Returns TRUE if teh maintained effect is beneficial (buff)
/// </summary>
public bool IsBeneficial
{
get
{
Trace.WriteLine(String.Format("Maintained:IsBeneficial"));
if (!_isBeneficial.HasValue)
_isBeneficial = this.GetBoolFromLSO("IsBeneficial");
return _isBeneficial.Value;
}
}
/// <summary>
/// Cache of MaxDuration
/// </summary>
private float? _maxDuration;
/// <summary>
/// This is the current duration of the buff/debuff in seconds.
/// Buffs/Debuffs that do not have a duration (ie, last forever) will return -1.
/// </summary>
public float MaxDuration
{
get
{
Trace.WriteLine(String.Format("Maintained:MaxDuration"));
if(!_maxDuration.HasValue)
_maxDuration = this.GetFloatFromLSO("MaxDuration");
return _maxDuration.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Maintained effect name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Maintained:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Returns the targget of the maintained buff.
/// This only works for maintained buffs/debuffs that are of the "Type": 'single target'.
/// If the Target is no longer alive or present in the game, it will return NULL.
/// </summary>
/// <returns>maintained effect target as actor</returns>
public Actor Target
{
get
{
Trace.WriteLine(String.Format("Maintained:Target"));
return new Actor(this.GetMember("Target"));
}
}
/// <summary>
/// Cache of Type
/// </summary>
private string _type;
/// <summary>
/// This member returns one of the following strings: self only,pet only,group, or single target
/// </summary>
public string Type
{
get
{
Trace.WriteLine(String.Format("Maintained:Type"));
return _type ?? (_type = this.GetStringFromLSO("Type"));
}
}
#endregion
#region Methods
/// <summary>
/// Cancels the maintained effect, if possible
/// </summary>
/// <returns>call success</returns>
public bool Cancel()
{
Trace.WriteLine(String.Format("Maintained:Cancel()"));
return this.ExecuteMethod("Cancel");
}
/// <summary>
/// Examines the maintained effect
/// </summary>
/// <returns></returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Maintained:Examine()"));
return this.ExecuteMethod("Examine");
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,322 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.CharacterActor
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to group members.
/// </summary>
public class GroupMember : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public GroupMember(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Arcane Affliction counter. A value of -1 indicates that the affliction is incurable.
/// </summary>
public int Arcane
{
get
{
Trace.WriteLine(String.Format("GroupMember:Arcane"));
return this.GetIntFromLSO("Arcane");
}
}
private string _class;
/// <summary>
/// Class
/// </summary>
public string Class
{
get
{
Trace.WriteLine(String.Format("GroupMember:Class"));
return _class ?? (_class = this.GetStringFromLSO("Class"));
}
}
/// <summary>
/// Cursed Counter. A value of -1 indicates that the affliction is incurable.
/// </summary>
public int Cursed
{
get
{
Trace.WriteLine(String.Format("GroupMember:Cursed"));
return this.GetIntFromLSO("Cursed");
}
}
/// <summary>
/// Cache of EffectiveLevel
/// </summary>
private int? _effectiveLevel;
/// <summary>
/// Effective Level (mentored or chrono)
/// </summary>
public int EffectiveLevel
{
get
{
Trace.WriteLine(String.Format("GroupMember:EffectiveLevel"));
if(!_effectiveLevel.HasValue)
_effectiveLevel = this.GetIntFromLSO("EffectiveLevel");
return _effectiveLevel.Value;
}
}
/// <summary>
/// Elemental Affliction Counter. A value of -1 indicates that the affliction is incurable.
/// </summary>
public int Elemental
{
get
{
Trace.WriteLine(String.Format("GroupMember:Elemental"));
return this.GetIntFromLSO("Elemental");
}
}
/// <summary>
/// Hit Points
/// </summary>
public int HitPoints
{
get
{
Trace.WriteLine(String.Format("GroupMember:HitPoints"));
return this.GetIntFromLSO("HitPoints");
}
}
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// ID
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("GroupMember:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Returns true if actor is afflicted by arcane, noxious, etc.
/// </summary>
public bool IsAfflicted
{
get
{
Trace.WriteLine(String.Format("GroupMember:IsAfflicted"));
return this.GetBoolFromLSO("IsAfflicted");
}
}
/// <summary>
/// Cache of Level
/// </summary>
private int? _level;
/// <summary>
/// Level
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("GroupMember:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Max Hit Points
/// </summary>
public int MaxHitPoints
{
get
{
Trace.WriteLine(String.Format("GroupMember:MaxHitPoints"));
return this.GetIntFromLSO("MaxHitPoints");
}
}
/// <summary>
/// Max Power
/// </summary>
public int MaxPower
{
get
{
Trace.WriteLine(String.Format("GroupMember:MaxPower"));
return this.GetIntFromLSO("MaxPower");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("GroupMember:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Noxious Affliction Counter. A value of -1 indicates that the affliction is incurable.
/// </summary>
public int Noxious
{
get
{
Trace.WriteLine(String.Format("GroupMember:Noxious"));
return this.GetIntFromLSO("Noxious");
}
}
/// <summary>
/// Cache of PetID
/// </summary>
private int? _petID;
/// <summary>
/// ID of the members pet, if any. A value of -1 indicates that there is no pet.
/// </summary>
public int PetID
{
get
{
Trace.WriteLine(String.Format("GroupMember:PetID"));
if(!_petID.HasValue)
_petID = this.GetIntFromLSO("PetID");
return _petID.Value;
}
}
/// <summary>
/// Power
/// </summary>
public int Power
{
get
{
Trace.WriteLine(String.Format("GroupMember:Power"));
return this.GetIntFromLSO("Power");
}
}
/// <summary>
/// Cache of Race
/// </summary>
private string _race;
/// <summary>
/// Race
/// </summary>
public string Race
{
get
{
Trace.WriteLine(String.Format("GroupMember:Race"));
return _race ?? (_race = this.GetStringFromLSO("Race"));
}
}
/// <summary>
/// If in a raid, the group number 1-4. Otherwise NULL.
/// </summary>
public int RaidGroupNum
{
get
{
Trace.WriteLine(String.Format("GroupMember:RaidGroupNum"));
return GetMember<int>("RaidGroupNum");
}
}
/// TODO: Test GroupMember.RaidRole
/// <summary>
/// Raid Role Assigned
/// </summary>
public int RaidRole
{
get
{
Trace.WriteLine(String.Format("GroupMember:RaidRole"));
return this.GetIntFromLSO("RaidRole");
}
}
/// <summary>
/// Accesses the Actor class of the GroupMember
/// </summary>
public Actor ToActor
{
get
{
Trace.WriteLine(String.Format("GroupMember:ToActor"));
return new Actor(this.GetMember("ToActor"));
}
}
/// <summary>
/// Trauma Affliction Counter. A value of -1 indicates that the affliction is incurable.
/// </summary>
public int Trauma
{
get
{
Trace.WriteLine(String.Format("GroupMember:Trauma"));
return this.GetIntFromLSO("Trauma");
}
}
/// <summary>
/// Current Zone name
/// </summary>
public string ZoneName
{
get
{
Trace.WriteLine(String.Format("GroupMember:ZoneName"));
return this.GetStringFromLSO("ZoneName");
}
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

1045
MRBot/IsxEq2/Extension.cs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,193 @@
using System;
using LavishScriptAPI;
using LavishScriptAPI.Interfaces;
namespace MRBot.IsxEq2.Extensions
{
internal static class LavishScriptObjectExtensions
{
public static string GetString(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : lavishScriptObject.GetValue<string>();
}
}
public static string GetString(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : lavishScriptObject.GetValue<string>();
}
}
public static Int64 GetInt64(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<Int64>();
}
}
public static UInt64 GetUInt64(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? 0 : lavishScriptObject.GetValue<UInt64>();
}
}
public static Int64 GetInt64(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<Int64>();
}
}
public static float GetFloat(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<float>();
}
}
public static float GetFloat(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<float>();
}
}
public static double GetDouble(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<double>();
}
}
public static double GetDouble(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<double>();
}
}
public static int GetInt(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<int>();
}
}
public static int GetInt(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<int>();
}
}
public static bool GetBool(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? false : lavishScriptObject.GetValue<bool>();
}
}
public static bool GetBool(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? false : lavishScriptObject.GetValue<bool>();
}
}
public static Int64? GetNullableInt64(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (Int64?)lavishScriptObject.GetValue<Int64>();
}
}
public static Int64? GetNullableInt64(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (Int64?)lavishScriptObject.GetValue<Int64>();
}
}
public static float? GetNullableFloat(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (float?)lavishScriptObject.GetValue<float>();
}
}
public static float? GetNullableFloat(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (float?)lavishScriptObject.GetValue<float>();
}
}
public static double? GetNullableDouble(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (double?)lavishScriptObject.GetValue<double>();
}
}
public static double? GetNullableDouble(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (double?)lavishScriptObject.GetValue<double>();
}
}
public static int? GetNullableInt(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (int?)lavishScriptObject.GetValue<int>();
}
}
public static int? GetNullableInt(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (int?)lavishScriptObject.GetValue<int>();
}
}
public static bool? GetNullableBool(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (bool?)lavishScriptObject.GetValue<bool>();
}
}
public static bool? GetNullableBool(this ILSObject obj, string member, params string[] args)
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? null : (bool?)lavishScriptObject.GetValue<bool>();
}
}
}
}

View File

@ -0,0 +1,440 @@
// Disable all XML Comment warnings in this file //
#pragma warning disable 1591
// Credit for this entire class goes to GliderPro. //
using System;
using LavishScriptAPI;
using LavishScriptAPI.Interfaces;
namespace MRBot.IsxEq2.Helpers
{
/// <summary>
/// Extensions to the LavishScriptObject Class
/// </summary>
public static class LavishScriptObjectExtensions
{
/// <summary>
/// Returns the requested string member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject string member value</returns>
public static string GetStringFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: lavishScriptObject.GetValue<string>();
}
}
/// <summary>
/// Returns the requested string member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of the arguments to pass to the member</param>
/// <returns>LavishScriptObject string member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static string GetStringFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: lavishScriptObject.GetValue<string>();
}
}
/// <summary>
/// Returns the requested Int64 member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject Int64 member value</returns>
public static Int64 GetInt64FromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<Int64>();
}
}
/// <summary>
/// Returns the requested UInt64 member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject UInt64 member value</returns>
public static UInt64 GetUInt64FromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? 0
: lavishScriptObject.GetValue<UInt64>();
}
}
/// <summary>
/// Returns the requested Int64 member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject Int64 member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static Int64 GetInt64FromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<Int64>();
}
}
/// <summary>
/// Retrieves the requested float member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject float member value</returns>
public static float GetFloatFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<float>();
}
}
/// <summary>
/// Retrieves the requested float member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject float member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static float GetFloatFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<float>();
}
}
/// <summary>
/// Retrieves the requested double member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject double member value</returns>
public static double GetDoubleFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<double>();
}
}
/// <summary>
/// Retrieves the requested double member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject double member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static double GetDoubleFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? -1
: lavishScriptObject.GetValue<double>();
}
}
/// <summary>
/// Retrieves the requested integer member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject integer member value</returns>
public static int GetIntFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<int>();
}
}
/// <summary>
/// Retrieves the requested unsigned integer member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject integer member value</returns>
public static uint GetUIntFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? 0 : lavishScriptObject.GetValue<uint>();
}
}
/// <summary>
/// Retrieves the requested integer member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject integer member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static int GetIntFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? -1 : lavishScriptObject.GetValue<int>();
}
}
/// <summary>
/// Retrieves the requested unsigned integer member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject integer member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static uint GetUIntFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject) ? 0 : lavishScriptObject.GetValue<uint>();
}
}
/// <summary>
/// Retireves the requested boolean member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject boolean member value</returns>
public static bool GetBoolFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return !LavishScriptObject.IsNullOrInvalid(lavishScriptObject) && lavishScriptObject.GetValue<bool>();
}
}
/// <summary>
/// Retrieves the requested boolean member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args"></param>
/// <returns>LavishScriptObject boolean member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static bool GetBoolFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return !LavishScriptObject.IsNullOrInvalid(lavishScriptObject) && lavishScriptObject.GetValue<bool>();
}
}
/// <summary>
/// Returns the requested Int64 member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject Int64 member value</returns>
public static Int64? GetNullableInt64FromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (Int64?) lavishScriptObject.GetValue<Int64>();
}
}
/// <summary>
/// Returns the requested Int64 member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject Int64 member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static Int64? GetNullableInt64FromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (Int64?) lavishScriptObject.GetValue<Int64>();
}
}
/// <summary>
/// Retrieves the requested float member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject float member value</returns>
public static float? GetNullableFloatFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (float?) lavishScriptObject.GetValue<float>();
}
}
/// <summary>
/// Retrieves the requested float member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject float member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static float? GetNullableFloatFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (float?) lavishScriptObject.GetValue<float>();
}
}
/// <summary>
/// Retrieves the requested double member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject double member value</returns>
public static double? GetNullableDoubleFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (double?) lavishScriptObject.GetValue<double>();
}
}
/// <summary>
/// Retrieves the requested double member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject double member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static double? GetNullableDoubleFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (double?) lavishScriptObject.GetValue<double>();
}
}
/// <summary>
/// Retrieves the requested integer member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject integer member value</returns>
public static int? GetNullableIntFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (int?) lavishScriptObject.GetValue<int>();
}
}
/// <summary>
/// Retrieves the requested integer member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args">string array of arguments to pass to the member</param>
/// <returns>LavishScriptObject integer member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static int? GetNullableIntFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (int?) lavishScriptObject.GetValue<int>();
}
}
/// <summary>
/// Retireves the requested boolean member
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <returns>LavishScriptObject boolean member value</returns>
public static bool? GetNullableBoolFromLSO(this ILSObject obj, string member)
{
using (var lavishScriptObject = obj.GetMember(member))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (bool?) lavishScriptObject.GetValue<bool>();
}
}
/// <summary>
/// Retrieves the requested boolean member based on the arguments provided
/// </summary>
/// <param name="obj">this</param>
/// <param name="member">the member to retrieve</param>
/// <param name="args"></param>
/// <returns>LavishScriptObject boolean member value</returns>
// ReSharper disable MethodOverloadWithOptionalParameter
public static bool? GetNullableBoolFromLSO(this ILSObject obj, string member, params string[] args)
// ReSharper restore MethodOverloadWithOptionalParameter
{
using (var lavishScriptObject = obj.GetMember(member, args))
{
return LavishScriptObject.IsNullOrInvalid(lavishScriptObject)
? null
: (bool?) lavishScriptObject.GetValue<bool>();
}
}
}
}

View File

@ -0,0 +1,352 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using InnerSpaceAPI;
using LavishScriptAPI;
using LavishScriptAPI.Interfaces;
using MRBot.IsxEq2.Extensions;
namespace MRBot.IsxEq2.Helpers
{
/// <summary>
/// CallbackDelegate used in trace logging.
/// </summary>
/// <param name="method"></param>
/// <param name="args"></param>
public delegate void CallbackDelegate(string method, string args);
/// <summary>
/// Class used for trace logging.
/// </summary>
public class Tracing
{
/// <summary>
/// Callback to use for logging.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")]
public static CallbackDelegate Callback;
/// <summary>
/// Add a callback delegate for trace logging.
/// </summary>
/// <param name="callbackDelegate"></param>
public static void AddCallback(CallbackDelegate callbackDelegate)
{
Callback = callbackDelegate;
}
/// <summary>
/// Clear the callback delegate.
/// </summary>
public static void RemoveCallback()
{
Callback = null;
}
/// <summary>
/// Use the callback delegate to send a log message.
/// </summary>
/// <param name="message"></param>
/// <param name="args"></param>
public static void SendCallback(string message, params object[] args)
{
if (Callback == null) return;
var argString = new StringBuilder();
if (args.Length > 0)
{
argString.Append(args[0].ToString());
}
for (int idx = 1; idx < args.Length; idx++)
{
argString.Append(String.Format(CultureInfo.InvariantCulture, ", {0}", args[idx]));
}
Callback(message, argString.ToString());
}
}
public static class Util
{
private static readonly Dictionary<Type, Type> _implementingTypesByInterfaceType = new Dictionary<Type, Type>();
private static readonly Dictionary<Type, ConstructorInfo> _constructorInfoByType = new Dictionary<Type, ConstructorInfo>();
private static T[] PrefixArray<T>(T first, T[] rest)
{
var newArray = new T[rest.Length + 1];
newArray[0] = first;
for (var i = 0; i < rest.Length; i++)
newArray[i + 1] = rest[i];
return newArray;
}
private static Type GetImplementingTypeForInterfaceType(Type interfaceType)
{
if (!_implementingTypesByInterfaceType.ContainsKey(interfaceType))
{
var implementingType = interfaceType.Assembly.GetTypes()
.Where(t => t.IsClass)
.FirstOrDefault(interfaceType.IsAssignableFrom);
if (implementingType == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Could not find implementing type for interface type {0}.", interfaceType.Name));
}
_implementingTypesByInterfaceType.Add(interfaceType, implementingType);
}
return _implementingTypesByInterfaceType[interfaceType];
}
private static ConstructorInfo GetConstructorInfoForType(Type type)
{
if (!_constructorInfoByType.ContainsKey(type))
{
ConstructorInfo constructorInfo;
if (type.IsInterface)
{
var implementingType = GetImplementingTypeForInterfaceType(type);
constructorInfo = implementingType.GetConstructor(new[] { typeof(LavishScriptObject) });
}
else
{
constructorInfo = type.GetConstructor(new[] { typeof(LavishScriptObject) });
}
if (constructorInfo == null)
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Could not find a constructor for type {0}.", type.Name));
_constructorInfoByType.Add(type, constructorInfo);
}
return _constructorInfoByType[type];
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1820:TestForEmptyStringsUsingStringLength")]
private static List<T> IndexToLavishScriptObjectList<T>(LavishScriptObject index, string lsTypeName)
{
var list = new List<T>();
var count = index.GetMember<int>("Used");
if (count == 0)
{
InnerSpace.Echo($"IndexToLavishScriptObjectList: count is 0");
return list;
}
//Tracing.SendCallback(methodName, "get constructor info");
var constructorInfo = GetConstructorInfoForType(typeof(T));
//Tracing.SendCallback(methodName, "loop add items");
for (var i = 1; i <= count; i++)
{
var objectLso = index.GetIndex(i.ToString(CultureInfo.CurrentCulture));
if (LavishScriptObject.IsNullOrInvalid(objectLso))
{
Tracing.SendCallback(String.Format(CultureInfo.InvariantCulture, "Error: Index contains invalid LSO. NewObject will fail; aborting."));
InnerSpace.Echo($"Error: Index contains invalid LSO at index {i}. NewObject will fail; aborting.");
continue;
}
var objectId = objectLso.GetString("ID");
if (objectId == null)
{
Tracing.SendCallback(String.Format(CultureInfo.InvariantCulture, "Error: LStype \"{0}\" has no ID member. NewObject will fail; aborting.", lsTypeName));
InnerSpace.Echo($"Error: LStype {lsTypeName} has no ID member. NewObject will fail; abortig.");
return list;
}
if (objectId == string.Empty)
{
Tracing.SendCallback(String.Format(CultureInfo.InvariantCulture, "Error: LStype \"{0}\" has an ID member but it is returning an empty string. NewObject will fail; aborting.", lsTypeName));
InnerSpace.Echo($"Error: LStype {lsTypeName} has an ID member but it is returning an empty string. NewObject will fail; aborting.");
return list;
}
var lsObject = LavishScript.Objects.NewObject(lsTypeName, objectId);
var item = (T)constructorInfo.Invoke(new object[] { lsObject });
list.Add(item);
}
return list;
}
private static List<T> IndexToStructList<T>(LavishScriptObject index)
{
InnerSpace.Echo($"IndexToStructList: {typeof(T).Name}");
var list = new List<T>();
var count = index.GetMember<int>("Used");
for (var i = 1; i <= count; i++)
list.Add(index.GetIndex<T>(i.ToString(CultureInfo.CurrentCulture)));
return list;
}
public static List<T> IndexToList<T>(LavishScriptObject index, string lsTypeName)
{
InnerSpace.Echo($"IndexToList: {typeof(T).Name}");
return (typeof(LavishScriptObject)).IsAssignableFrom(typeof(T)) ? IndexToLavishScriptObjectList<T>(index, lsTypeName) : IndexToStructList<T>(index);
}
public static T GetIndexMember<T>(LavishScriptObject index, int number)
{
if (typeof(T).IsSubclassOf(typeof(LavishScriptObject)))
return (T)typeof(T).GetConstructor(new[] { typeof(LavishScriptObject) }).Invoke(new object[] { index.GetIndex(number.ToString(CultureInfo.CurrentCulture)) });
return index.GetIndex<T>(number.ToString(CultureInfo.CurrentCulture));
}
/// <summary>
/// Translate an index of a given LavishScript type returned from the given method on the given object to a List of a .NET datatype equivalent.
/// </summary>
/// <param name="obj"></param>
/// <param name="methodName"></param>
/// <param name="lsTypeName"></param>
/// <param name="args"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static List<T> GetListFromMethod<T>(this ILSObject obj, string methodName, string lsTypeName, params string[] args)
{
if (obj == null || !obj.IsValid)
{
InnerSpace.Echo("GetListFromMethod: obj is null or invalid");
return null;
}
using (var index = LavishScript.Objects.NewObject("index:" + lsTypeName))
{
string[] allargs;
if (args.Length > 0)
{
allargs = PrefixArray(index.LSReference, args);
}
else
{
allargs = new string[1];
allargs[0] = index.LSReference;
}
if (!obj.ExecuteMethod(methodName, allargs))
{
InnerSpace.Echo($"Failed to execute method {methodName}");
return null;
}
using (var used = index.GetMember("Used"))
{
if (LavishScriptObject.IsNullOrInvalid(used))
{
InnerSpace.Echo($"LSO.IsNullOrInvalid (used)");
return null;
}
InnerSpace.Echo($"used: {used.GetValue<int>()}");
}
var list = IndexToList<T>(index, lsTypeName);
return list;
}
}
internal static T GetFromIndexMethod<T>(ILSObject obj, string methodName, string lsTypeName, int number, params string[] args)
{
// argument is 0-based
number += 1;
if (obj == null || !obj.IsValid || number <= 0)
return default;
using (var index = LavishScript.Objects.NewObject("index:" + lsTypeName))
{
var allargs = PrefixArray(index.LSReference, args);
if (!obj.ExecuteMethod(methodName, allargs))
return default;
using (var used = index.GetMember("Used"))
{
// if it failed or we want one off the end, return
if (LavishScriptObject.IsNullOrInvalid(used) || used.GetValue<int>() < number)
return default;
}
var member = GetIndexMember<T>(index, number);
return member;
}
}
/// <summary>
/// Translate an index of a given LavishScript type returned from the given member on the given object to a List of a .NET datatype equivalent.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="memberName"></param>
/// <param name="lsTypeName"></param>
/// <param name="args"></param>
/// <returns></returns>
public static List<T> GetListFromMember<T>(this LavishScriptObject obj, string memberName, string lsTypeName, params string[] args)
{
if (obj == null || !obj.IsValid)
return null;
//Tracing.SendCallback(methodName, "new index");
using (var index = LavishScript.Objects.NewObject("index:" + lsTypeName))
{
//Tracing.SendCallback(methodName, "arg condensing");
var allargs = PrefixArray(index.LSReference, args);
//Tracing.SendCallback(methodName, "getmember retval");
using (var retval = obj.GetMember(memberName, allargs))
{
if (LavishScriptObject.IsNullOrInvalid(retval))
return null;
}
//Tracing.SendCallback(methodName, "index to list");
var list = IndexToList<T>(index, lsTypeName);
//Tracing.SendCallback(methodName, "invalidate");
//Tracing.SendCallback(methodName, "return");
return list;
}
}
internal static T GetFromIndexMember<T>(ILSObject obj, string memberName, string lsTypeName, int number, params string[] args)
{
// argument is 0-based
number += 1;
if (obj == null || !obj.IsValid)
return default;
using (var index = LavishScript.Objects.NewObject("index:" + lsTypeName))
{
var allargs = PrefixArray(index.LSReference, args);
using (var retval = obj.GetMember(memberName, allargs))
{
if (LavishScriptObject.IsNullOrInvalid(retval) || retval.GetValue<int>() < number)
return default;
}
var member = GetIndexMember<T>(index, number);
return member;
}
}
}
}

View File

@ -0,0 +1,204 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
using MRBot.IsxEq2.UI;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This TLO returns a new datatype: 'eq2brokerwindow'. This new datatype inherits all members/methods of the 'eq2window' type.
/// </summary>
public class BrokerWindow : EQ2Window
{
#region Constructor
/// <summary>
/// Constructor - Copies the LavishScript object
/// </summary>
/// <param name="Obj">LS Object</param>
public BrokerWindow(LavishScriptObject Obj) : base(Obj) { }
/// <summary>
/// Constructor - Constructs a BrokerWindow object based on the LavishScript object BrokerWindow
/// </summary>
public BrokerWindow() : base(LavishScript.Objects.GetObject("BrokerWindow")) { }
#endregion
#region Members
/// <summary>
/// number of items returned by search (usually 0 to 8)
/// </summary>
public int NumSearchResults
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:NumSearchResults"));
return this.GetIntFromLSO("NumSearchResults");
}
}
/// <summary>
/// number of the current search page
/// </summary>
public int CurrentSearchPage
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:CurrentSearchPage"));
return this.GetIntFromLSO("CurrentSearchPage");
}
}
/// <summary>
/// number of total search pages
/// </summary>
public int TotalSearchPages
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:TotalSearchPages"));
return this.GetIntFromLSO("TotalSearchPages");
}
}
/// <summary>
/// This member returns either a 'consignment' or 'merchandise' object that the
/// broker or vendor is currently capable of selling (on the current 'Search Page'
/// only, for broker) based upon the index. Only the members and methods they have
/// in common are available.
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public Consignment SearchResult(int index)
{
Trace.WriteLine(String.Format("BrokerWindow:SearchResult({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Consignment(this.GetMember("SearchResult", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// This member returns either a 'consignment' or 'merchandise' object that the
/// broker or vendor is currently capable of selling (on the current 'Search Page'
/// only, for broker) based upon an exact match of the item name. Only the members
/// and methods they have in common are available.
/// </summary>
/// <param name="name">name</param>
/// <returns>call success</returns>
public Consignment SearchResult(string name)
{
Trace.WriteLine(String.Format("BrokerWindow:SearchResult({0})", name));
return new Consignment(this.GetMember("SearchResult", name));
}
/// <summary>
/// Number of your vending containers
/// </summary>
public int NumVendingContainers
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:NumVendingContainers"));
return this.GetIntFromLSO("NumVendingContainers");
}
}
/// <summary>
/// Number of items for sale (use with Broker or Merchant 1 to NumItemsForSale)
/// </summary>
public int NumItemsForSale
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:NumItemsForSale"));
return this.GetIntFromLSO("NumItemsForSale");
}
}
/// <summary>
/// total capacity for the current selected vendor container
/// </summary>
public int TotalVendingCapacity
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:TotalVendingCapacity"));
return this.GetIntFromLSO("TotalVendingCapacity");
}
}
/// <summary>
/// free slots left in the current selected vendor container
/// </summary>
public int VendingCapacityFree
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:VendingCapacityFree"));
return this.GetIntFromLSO("VendingCapacityFree");
}
}
/// <summary>
/// slots currently used in the current selected vendor container
/// </summary>
public int VendingCapacityUsed
{
get
{
Trace.WriteLine(String.Format("BrokerWindow:VendingCapacityUsed"));
return this.GetIntFromLSO("VendingCapacityUsed");
}
}
/// <summary>
/// # is between 1 and NumVendingContainers (or 6, if you prefer to use the maximum)
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public VendingContainer VendingContainer(int index)
{
Trace.WriteLine(String.Format("BrokerWindow:VendingContainer({0})", index.ToString(CultureInfo.InvariantCulture)));
return new VendingContainer(this.GetMember("VendingContainer", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// name is the name of the vending container
/// </summary>
/// <param name="name">name</param>
/// <returns>call success</returns>
public VendingContainer VendingContainer(string name)
{
Trace.WriteLine(String.Format("BrokerWindow:VendingContainer({0})", name));
return new VendingContainer(this.GetMember("VendingContainer", name));
}
#endregion
#region Methods
/// <summary>
/// Selects the indicated page between 1 and TotalSearchPages (Broker Only)
/// </summary>
/// <param name="page">page</param>
/// <returns>call success</returns>
public bool GotoSearchPage(int page)
{
Trace.WriteLine(String.Format("BrokerWindow:GotoSearchPage({0})", page.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("GotoSearchPage", page.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Changes the active vendor container (Broker Only)
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public bool ChangeActiveVendingContainer(int index)
{
Trace.WriteLine(String.Format("BrokerWindow:ChangeActiveVendingContainer({0})", index.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("ChangeActiveVendingContainer", index.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}

View File

@ -0,0 +1,294 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to items that can be bought from brokers.
/// </summary>
public class Consignment : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Consignment(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// The price of the item, without broker commission, in silver pieces.
/// </summary>
public float BasePrice
{
get
{
Trace.WriteLine(String.Format("Consignment:BasePrice"));
return this.GetFloatFromLSO("BasePrice");
}
}
/// <summary>
/// The price of the item, without broker commission, in the following format: #p,#g,#s,#c
/// </summary>
public string BasePriceString
{
get
{
Trace.WriteLine(String.Format("Consignment:BasePriceString"));
return this.GetStringFromLSO("BasePriceString");
}
}
/// <summary>
/// Returns TRUE is the item is listed
/// </summary>
public bool IsListed
{
get
{
Trace.WriteLine(String.Format("Consignment:IsListed"));
return this.GetBoolFromLSO("IsListed");
}
}
/// <summary>
/// Cache of Level
/// </summary>
private int? _level;
/// <summary>
/// Level of the consignment
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("Consignment:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Link ID
/// </summary>
public int LinkID
{
get
{
Trace.WriteLine(String.Format("Consignment:LinkID"));
return this.GetIntFromLSO("LinkID");
}
}
/// <summary>
/// Possible values: "Qeynos" "Freeport" "Kelethin" "Haven" "Neriak" (or "Unknown" which should not be possible)
/// </summary>
public string Market
{
get
{
Trace.WriteLine(String.Format("Consignment:Market"));
return this.GetStringFromLSO("Market");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Consignment name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Consignment:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// The price of the item, including broker commission, in silver pieces.
/// </summary>
public float Price
{
get
{
Trace.WriteLine(String.Format("Consignment:Price"));
return this.GetFloatFromLSO("Price");
}
}
/// <summary>
/// Item quantity in consignment
/// </summary>
public int Quantity
{
get
{
Trace.WriteLine(String.Format("Consignment:Quantity"));
return this.GetIntFromLSO("Quantity");
}
}
/// <summary>
/// Consignment Serial Number
/// </summary>
public long SerialNumber
{
get
{
Trace.WriteLine(String.Format("Consignment:SerialNumber"));
return this.GetInt64FromLSO("SerialNumber");
}
}
/// <summary>
/// This will recreate the actual link used with in game chat channels (used typically with eq2echo or eq2execute).
/// </summary>
public string ToLink
{
get
{
Trace.WriteLine(String.Format("Consignment:ToLink"));
return this.GetStringFromLSO("ToLink");
}
}
/// <summary>
/// Cache of Value
/// </summary>
private float? _value;
/// <summary>
/// This is the price (in silver pieces) that an NPC merchant would buy this item from you.
/// </summary>
public float Value
{
get
{
Trace.WriteLine(String.Format("Consignment:Value"));
if(!_value.HasValue)
_value = this.GetFloatFromLSO("Value");
return _value.Value;
}
}
#endregion
#region Methods
/// <summary>
/// Buys 1 of the items in consignment
/// </summary>
/// <returns>call success</returns>
public bool Buy()
{
Trace.WriteLine(String.Format("Consignment:Buy()"));
return this.ExecuteMethod("Buy");
}
/// <summary>
/// Buys the quantity specified from the consignment.
/// If # is specified, it is assumed to be the quantity of items to buy.
/// If the value is large, it will buy as many as are in the selected stack.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool Buy(int quantity)
{
Trace.WriteLine(String.Format("Consignment:Buy({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("Buy", quantity.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// This brings up the 'examine window' for the given item.
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Consignment:Examine()"));
return this.ExecuteMethod("Examine");
}
/// <summary>
/// Lists any item for sale that is currently in your consignment listing.
/// </summary>
/// <returns>call success</returns>
public bool List()
{
Trace.WriteLine(String.Format("Consignment:List()"));
return this.ExecuteMethod("List");
}
/// <summary>
/// Removes a consignment item from the vendor and places it in your inventory.
/// </summary>
/// <returns></returns>
public bool Remove()
{
Trace.WriteLine(String.Format("Consignment:Remove()"));
return this.ExecuteMethod("Remove");
}
/// <summary>
/// Removes the quantity of a consignment item from the vendor and places it in your inventory.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool Remove(int quantity)
{
Trace.WriteLine(String.Format("Consignment:Remove({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("Remove", Quantity.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sets the price of any consignment item that is currently in your consignment listing.
/// The price is one value in silver pieces and it CAN be a float value (eg, 1.20 == 1 silver, 20 copper).
/// </summary>
/// <param name="price">price in silver as float</param>
/// <returns>call success</returns>
public bool SetPrice(float price)
{
Trace.WriteLine(String.Format("Consignment:SetPrice({0})", price.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetPrice", price.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sets the price of any consignment item that is currently in your consignment listing.
/// The price is one value in silver pieces.
/// </summary>
/// <param name="price">price in silver</param>
/// <returns>call success</returns>
public bool SetPrice(int price)
{
Trace.WriteLine(String.Format("Consignment:SetPrice({0})", price.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetPrice", price.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Unlists any consignment item that is currently for sale.
/// </summary>
/// <returns>call success</returns>
public bool Unlist()
{
Trace.WriteLine(String.Format("Consignment:Unlist()"));
return this.ExecuteMethod("Unlist");
}
#endregion
}
}

View File

@ -0,0 +1,85 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// *** Notes:
/// *** 1. A "ContainerWindow" is any window that says 'Container' on it's name tab. As of right now, it refers most often to the
/// *** 'Harvest Supply Depot'.
/// *** 2. You may only have one "ContainerWindow" open at a time.
/// *** 3. The "ContainerWindow" TLO and related datatypes are only available when the container window is OPEN. (However, it does
/// *** not matter how far away you are from said container.)
/// </summary>
public class ContainerWindow : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ContainerWindow(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns the ContainerWindowItem at the specified index. (1 to NumItems)
/// </summary>
/// <param name="index">index</param>
public ContainerWindowItem Item(int index)
{
Trace.WriteLine(String.Format("ContainerWindow:Item({0})", index.ToString(CultureInfo.InvariantCulture)));
return new ContainerWindowItem(this.GetMember("Item", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// Returns the ContainerWindowItem by name.
/// </summary>
/// <param name="name">name</param>
public ContainerWindowItem Item(string name)
{
Trace.WriteLine(String.Format("ContainerWindow:Item({0})", name));
return new ContainerWindowItem(this.GetMember("Item", name));
}
/// <summary>
/// The number of ContainerWindowItems in the ContainerWindow
/// </summary>
public int NumItems
{
get
{
Trace.WriteLine(String.Format("ContainerWindow:NumItems"));
return this.GetIntFromLSO("NumItems");
}
}
#endregion
#region Methods
/// <summary>
/// Removes the quantity of the ContainerWindowItem from the ContainerWindow
/// </summary>
/// <param name="itemID">ContainerWindowItem ID</param>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool RemoveItem(int itemID, int quantity)
{
Trace.WriteLine(String.Format("ContainerWindow:RemoveItem({0}, {1})",
itemID.ToString(CultureInfo.InvariantCulture), quantity.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("RemoveItem",itemID.ToString(CultureInfo.InvariantCulture),
quantity.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}

View File

@ -0,0 +1,110 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// Represents an item in a ContainerWindow (Supply Depot Items). Only available when the ContainerWindow is open.
/// </summary>
public class ContainerWindowItem : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ContainerWindowItem(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// Item ID. Note: The 'ID' MEMBER of the 'containerwindowitem' datatype is used
/// exlusively for the "RemoveItem" METHOD of the 'containerwindow' datatype.
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("ContainerWindowItem:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of Level
/// </summary>
private int? _level;
/// <summary>
/// Item Level (Tier?)
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("ContainerWindowItem:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Item Quantity
/// </summary>
public int LinkID
{
get
{
Trace.WriteLine(String.Format("ContainerWindowItem:LinkID"));
return this.GetIntFromLSO("LinkID");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Item Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("ContainerWindowItem:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Item Quantity
/// </summary>
public int Quantity
{
get
{
Trace.WriteLine(String.Format("ContainerWindowItem:Quantity"));
return this.GetIntFromLSO("Quantity");
}
}
#endregion
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,108 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// Although this datatype is used natively in some parts of EQ2, its primary function is to
/// store and return item "details". The client does not need to know these details all of the time,
/// so when the player examines an item, or when ISXEQ2 requests it, the details are downloaded from
/// the server and stored in a cache.
/// </summary>
public class ItemInfo : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ItemInfo(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns TRUE if the item can be scribed right now.
/// It is the responsibility of scripts to check item.IsScribeable
/// </summary>
public bool CanScribeNow
{
get
{
Trace.WriteLine(String.Format("Item:CanScribeNow"));
return this.GetBoolFromLSO("CanScribeNow");
}
}
/// <summary>
/// Containers Only. Returns TRUE if the contents of the container are for sale.
/// It is the responsibility of scripts to check item.IsContainer.
/// </summary>
public bool ContentsForSale
{
get
{
Trace.WriteLine(String.Format("Item:ContentsForSale"));
return this.GetBoolFromLSO("ContentsForSale");
}
}
/// <summary>
/// Containers only. The number of empty slots in the container.
/// It is the responsibility of scripts to check item.IsContainer.
/// </summary>
public int EmptySlots
{
get
{
Trace.WriteLine(String.Format("Item:EmptySlots"));
return this.GetIntFromLSO("EmptySlots");
}
}
/// <summary>
/// Cache of Label
/// </summary>
private string _label;
/// <summary>
/// Item Label (Container).
/// It is the responsibility of scripts to check item.IsContainer.
/// </summary>
public string Label
{
get
{
Trace.WriteLine(String.Format("Item:Label"));
return _label ?? (_label = this.GetStringFromLSO("Label"));
}
}
/// <summary>
/// Cache of IsActivatable
/// </summary>
private bool? _isActivatable;
/// <summary>
/// Returns TRUE if the item is activatable.
/// It is the responsibility of scripts to check item.IsUsable
/// </summary>
public bool IsActivatable
{
get
{
Trace.WriteLine(String.Format("Item:IsActivatable"));
if (!_isActivatable.HasValue)
_isActivatable = this.GetBoolFromLSO("IsActivatable");
return _isActivatable.Value;
}
}
#endregion
}
}

View File

@ -0,0 +1,82 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to modifiers on items.
/// </summary>
public class ItemModifier : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ItemModifier(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of SubType
/// </summary>
private string _subType;
/// <summary>
/// Modifier SubType
/// </summary>
public string SubType
{
get
{
Trace.WriteLine(String.Format("ItemModifier:SubType"));
return _subType ?? (_subType = this.GetStringFromLSO("SubType"));
}
}
/// <summary>
/// Cache of Type
/// </summary>
private string _type;
/// <summary>
/// Modifier Type
/// </summary>
public string Type
{
get
{
Trace.WriteLine(String.Format("ItemModifier:Type"));
return _type ?? (_type = this.GetStringFromLSO("Type"));
}
}
/// <summary>
/// Cache of Value
/// </summary>
private int? _value;
/// <summary>
/// Modifier Value
/// </summary>
public int Value
{
get
{
Trace.WriteLine(String.Format("ItemModifier:Value"));
if(!_value.HasValue)
_value = this.GetIntFromLSO("Value");
return _value.Value;
}
}
#endregion
}
}

View File

@ -0,0 +1,262 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to items that can be either bought from or sold to NPC or PC merchants.
/// </summary>
public class Merchandise : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Merchandise(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns FALSE if the "not for sale" checkbox/flag is selected for this item
/// </summary>
public bool IsForSale
{
get
{
Trace.WriteLine(String.Format("Merchandise:IsForSale"));
return this.GetBoolFromLSO("IsForSale");
}
}
/// <summary>
/// Merchandise Level
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("Merchandise:Level"));
return this.GetIntFromLSO("Level");
}
}
/// <summary>
/// Link ID
/// </summary>
public int LinkID
{
get
{
Trace.WriteLine(String.Format("Merchandise:LinkID"));
return this.GetIntFromLSO("LinkID");
}
}
/// <summary>
/// For stackable items, this number will be the maximum number that a stack can hold.
/// Therefore, it is the maximum quantity of said item that can be bought at once.
/// </summary>
public int MaxQuantity
{
get
{
Trace.WriteLine(String.Format("Merchandise:MaxQuantity"));
return this.GetIntFromLSO("MaxQuantity");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Merchandise:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// The price of the item in silver pieces.
/// </summary>
public float Price
{
get
{
Trace.WriteLine(String.Format("Merchandise:Price"));
return this.GetFloatFromLSO("Price");
}
}
/// <summary>
/// If the item has a status cost, then the format of this string will be #SP,#p,#g,#s,#c.
/// Otherwise, the format will be #p,#g,#s,#c
/// </summary>
public string PriceString
{
get
{
Trace.WriteLine(String.Format("Merchandise:PriceString"));
return GetMember<string>("PriceString");
}
}
/// <summary>
/// Quantity Available
/// </summary>
public int Quantity
{
get
{
Trace.WriteLine(String.Format("Merchandise:Quantity"));
return this.GetIntFromLSO("Quantity");
}
}
/// <summary>
/// Status Cost
/// </summary>
public int StatusCost
{
get
{
Trace.WriteLine(String.Format("Merchandise:StatusCost"));
return this.GetIntFromLSO("StatusCost");
}
}
/// <summary>
/// This will recreate the actual link used with in game chat channels (used typically with eq2echo or eq2execute).
/// </summary>
public string ToLink
{
get
{
Trace.WriteLine(String.Format("Merchandise:ToLink"));
return this.GetStringFromLSO("ToLink");
}
}
#endregion
#region Methods
/// <summary>
/// Will try to buy 1 of an item
/// </summary>
/// <returns>call success</returns>
public bool Buy()
{
Trace.WriteLine(String.Format("Merchandise:Buy()"));
return this.ExecuteMethod("Buy");
}
/// <summary>
/// Will try to buy the quantity of an item.
/// Quantity only works for items that are stackable.
/// If you try to buy more than MaxQuantity, Quantity will default to MaxQuantity.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool Buy(int quantity)
{
Trace.WriteLine(String.Format("Merchandise:Buy({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return ExecuteMethod("Buy", quantity.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// This brings up the 'examine window' for the given item.
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Merchandise:Examine()"));
return this.ExecuteMethod("Examine");
}
/// <summary>
/// This datatype method is used to set a piece of store merchandise to be 'for sale'.
/// Please note that you should test to see if the merchandise's bool IsForSale is
/// already set or not before using this method in order to avoid sending bogus messages
/// to the server asking to set an item for sale that's already 'for sale'.
/// </summary>
/// <returns>call success</returns>
public bool ListForSale()
{
Trace.WriteLine(String.Format("Merchandise:ListForSale"));
return this.ExecuteMethod("ListForSale");
}
/// <summary>
/// Will try to buy 1 of the item
/// </summary>
/// <returns>call success</returns>
public bool Sell()
{
Trace.WriteLine(String.Format("Merchandise:Sell"));
return this.ExecuteMethod("Sell");
}
/// <summary>
/// Will try to sell the quantity of the item.
/// If you try sell more than the current quantity of that stack,
/// "Quantity#" will default to the current quantity of the stack.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool Sell(int quantity)
{
Trace.WriteLine(String.Format("Merchandise:Sell({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return ExecuteMethod("Sell", quantity.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// This datatype method is used in conjunction with player stores in order to set the price of a piece of merchandise.
/// The format is SetPrice[platinum,gold,silver,copper].
/// </summary>
/// <param name="platinum">platinum</param>
/// <param name="gold">gold</param>
/// <param name="silver">silver</param>
/// <param name="copper">copper</param>
/// <returns></returns>
public bool SetPrice(int platinum, int gold, int silver, int copper)
{
Trace.WriteLine(String.Format("Merchandise:SetPrice({0}, {1}, {2}, {3})",
platinum.ToString(CultureInfo.InvariantCulture), gold.ToString(CultureInfo.InvariantCulture),
silver.ToString(CultureInfo.InvariantCulture), copper.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetPrice", platinum.ToString(CultureInfo.InvariantCulture),
gold.ToString(CultureInfo.InvariantCulture), silver.ToString(CultureInfo.InvariantCulture),
copper.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// This datatype method is used to unlist a piece of store merchandise from the market.
/// Please note that you should test to see if the merchandise's bool IsForSale is already
/// set or not before using this method in order to avoid sending bogus messages to the
/// server asking to unlist an item that's not currently on the market in the first place.
/// </summary>
/// <returns>call success</returns>
public bool UnListForSale()
{
Trace.WriteLine(String.Format("Merchandise:UnListForSale()"));
return this.ExecuteMethod("UnListForSale");
}
#endregion
}
}

View File

@ -0,0 +1,213 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to
/// containers/vending machines/actors that are held within the consignment system.
/// </summary>
public class VendingContainer : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public VendingContainer(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Retrieves the consignment matching the supplied name
/// </summary>
/// <param name="name">name</param>
/// <returns>Consignment</returns>
public Consignment Consignment(string name)
{
Trace.WriteLine(String.Format("VendingContainer:Consignment({0})", name));
return new Consignment(this.GetMember("Consignment", name));
}
/// <summary>
/// Retrieves the consignment at the specified index (1 to NumItems)
/// </summary>
/// <param name="index">index</param>
/// <returns>Consignment</returns>
public Consignment Consignment(int index)
{
Trace.WriteLine(String.Format("VendingContainer:Consignment({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Consignment(this.GetMember("Consignment", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// Current value in silver pieces on container
/// </summary>
public float CurrentCoin
{
get
{
Trace.WriteLine(String.Format("VendingContainer:CurrentCoin"));
return this.GetFloatFromLSO("CurrentCoin");
}
}
/// <summary>
/// Possible values: "Qeynos" "Freeport" "Kelethin" "Haven" "Neriak" (or "Unknown" which should not be possible)
/// </summary>
public string Market
{
get
{
Trace.WriteLine(String.Format("VendingContainer:Market"));
return this.GetStringFromLSO("Market");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Container Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("VendingContainer:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Number of Consignments in container
/// </summary>
public int NumItems
{
get
{
Trace.WriteLine(String.Format("VendingContainer:NumItems"));
return this.GetIntFromLSO("NumItems");
}
}
/// <summary>
/// Cache of SerialNumber
/// </summary>
private long? _serialNumber;
/// <summary>
/// Container Serial Number
/// </summary>
public long SerialNumber
{
get
{
Trace.WriteLine(String.Format("VendingContainer:SerialNumber"));
if(!_serialNumber.HasValue)
_serialNumber = this.GetInt64FromLSO("SerialNumber");
return _serialNumber.Value;
}
}
/// <summary>
/// Cache of TotalCapacity
/// </summary>
private int? _totalCapacity;
/// <summary>
/// Total Capacity of the container
/// </summary>
public int TotalCapacity
{
get
{
Trace.WriteLine(String.Format("VendingContainer:TotalCapacity"));
if(!_totalCapacity.HasValue)
_totalCapacity = this.GetIntFromLSO("TotalCapacity");
return _totalCapacity.Value;
}
}
/// <summary>
/// All time value in silver pieces
/// </summary>
public float TotalCoin
{
get
{
Trace.WriteLine(String.Format("VendingContainer:TotalCoin"));
return this.GetFloatFromLSO("TotalCoin");
}
}
/// <summary>
/// Used Capacity (Free slots = Total - Used)
/// </summary>
public int UsedCapacity
{
get
{
Trace.WriteLine(String.Format("VendingContainer:UsedCapacity"));
return this.GetIntFromLSO("UsedCapacity");
}
}
#endregion
#region Methods
/// <summary>
/// Selects this vending container
/// </summary>
/// <returns>call success</returns>
public bool ChangeTo()
{
Trace.WriteLine(String.Format("VendingContainer:ChangeTo()"));
return this.ExecuteMethod("ChangeTo");
}
/// <summary>
/// Removes this vending container from the consignment system.
/// </summary>
/// <returns>call success</returns>
public bool Remove()
{
Trace.WriteLine(String.Format("VendingContainer:Remove()"));
return this.ExecuteMethod("Remove");
}
/// <summary>
/// Retrieves all of the money currently housed in that vendor.
/// </summary>
/// <returns>call success</returns>
public bool TakeCoin()
{
Trace.WriteLine(String.Format("VendingContainer:TakeCoin()"));
return this.ExecuteMethod("TakeCoin");
}
/// <summary>
/// Retrieves the amount of coin specified (in silver pieces) from the vending container.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool TakeCoin(int quantity)
{
Trace.WriteLine(String.Format("VendingContainer:TakeCoin({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("TakeCoin", quantity.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}

View File

@ -0,0 +1,208 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to vendors within the game.
/// For the purposes of ISXEQ2, a vendor is any actor that is capable of selling and/or buying items.
/// </summary>
public class Vendor : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Vendor(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// This member returns a 'consignment' object that the broker is currently capable of selling (on the current 'Search
/// Page' only) based upon the index of its location within the array.
/// </summary>
/// <param name="index">index</param>
/// <returns>Consignment</returns>
public Consignment Broker(int index)
{
Trace.WriteLine(String.Format("Vendor:Broker({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Consignment(this.GetMember("Broker", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// This member returns a 'consignment' object that the broker is currently capable of selling (on the current 'Search
/// Page' only) based upon a substring of the item's name.
/// </summary>
/// <param name="name">name</param>
/// <returns>Consignment</returns>
public Consignment Broker(string name)
{
Trace.WriteLine(String.Format("Vendor:Broker({0})", name));
return new Consignment(this.GetMember("Broker", name));
}
/// <summary>
/// Percent commission. Brokers Only. Non-Brokers will be zero.
/// </summary>
public float Commission
{
get
{
Trace.WriteLine(String.Format("Vendor:Commission"));
return this.GetFloatFromLSO("Commission");
}
}
/// <summary>
/// Current Search Page. Brokers only.
/// </summary>
public int CurrentSearchPage
{
get
{
Trace.WriteLine(String.Format("Vendor:CurrentSearchPage"));
return this.GetIntFromLSO("CurrentSearchPage");
}
}
/// <summary>
/// Cache of IsBroker
/// </summary>
private bool? _isBroker;
/// <summary>
/// Returns TRUE if the vendor is a broker (PC)
/// </summary>
public bool IsBroker
{
get
{
Trace.WriteLine(String.Format("Vendor:IsBroker"));
if(!_isBroker.HasValue)
_isBroker = this.GetBoolFromLSO("IsBroker");
return _isBroker.Value;
}
}
/// <summary>
/// Cache of IsMerchant
/// </summary>
private bool? _isMerchant;
/// <summary>
/// Returns TRUE if the vendor is a merchant (NPC)
/// </summary>
public bool IsMerchant
{
get
{
Trace.WriteLine(String.Format("Vendor:IsMerchant"));
if(!_isMerchant.HasValue)
_isMerchant = this.GetBoolFromLSO("IsMerchant");
return _isMerchant.Value;
}
}
/// <summary>
/// This member returns either a 'consignment' or 'merchandise' object that the
/// broker or vendor is currently capable of selling (on the current 'Search Page'
/// only, for broker) based upon the index. Only the members and methods they have
/// in common are available.
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public VendorItem Item(int index)
{
Trace.WriteLine(String.Format("Vendor:Item({0})", index.ToString(CultureInfo.InvariantCulture)));
return new VendorItem(this.GetMember("Item", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// This member returns either a 'consignment' or 'merchandise' object that the
/// broker or vendor is currently capable of selling (on the current 'Search Page'
/// only, for broker) based upon an exact match of the item name. Only the members
/// and methods they have in common are available.
/// </summary>
/// <param name="name">name</param>
/// <returns>call success</returns>
public VendorItem Item(string name)
{
Trace.WriteLine(String.Format("Vendor:Item({0})", name));
return new VendorItem(this.GetMember("Item", name));
}
/// <summary>
/// Number of items for sale (use with Broker or Merchant 1 to NumItemsForSale)
/// </summary>
public int NumItemsForSale
{
get
{
Trace.WriteLine(String.Format("Vendor:NumItemsForSale"));
return this.GetIntFromLSO("NumItemsForSale");
}
}
/// <summary>
/// This member returns a 'merchandise' object that the merchant is currently capable of selling
/// (on the current 'Search Page' only) based upon the index of its location within the array.
/// </summary>
/// <param name="index">index</param>
/// <returns>Merchandise</returns>
public Merchandise Merchant(int index)
{
Trace.WriteLine(String.Format("Vendor:Merchant({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Merchandise(this.GetMember("Merchant", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// This member returns a 'merchandise' object that the merchant is currently capable of selling
/// (on the current 'Search Page' only) based upon a substring of the item's name.
/// </summary>
/// <param name="name">name</param>
/// <returns>Merchandise</returns>
public Merchandise Merchant(string name)
{
Trace.WriteLine(String.Format("Vendor:Merchant({0})", name));
return new Merchandise(this.GetMember("Merchant", name));
}
/// <summary>
/// Total Number of Search Pages (Broker Only)
/// </summary>
public int TotalSearchPages
{
get
{
Trace.WriteLine(String.Format("Vendor:TotalSearchPages"));
return this.GetIntFromLSO("TotalSearchPages");
}
}
#endregion
#region Methods
/// <summary>
/// Selects the indicated page between 1 and TotalSearchPages (Broker Only)
/// </summary>
/// <param name="page">page</param>
/// <returns>call success</returns>
public bool GoToSearchPage(int page)
{
Trace.WriteLine(String.Format("Vendor:GoToSearchPage({0})", page.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("GoToSearchPage", page.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}

View File

@ -0,0 +1,145 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.InventoryConsignment
{
/// <summary>
/// This class is a hybrid of the common members and methods of the Merchandise
/// and Consignment DataTypes to allow the Item() Member of Vendor to work
/// </summary>
public class VendorItem : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public VendorItem(LavishScriptObject copy) : base(copy) {}
#endregion
#region Members
/// <summary>
/// Level
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("VendorItem:Level"));
return this.GetIntFromLSO("Level");
}
}
/// <summary>
/// Link ID
/// </summary>
public int LinkID
{
get
{
Trace.WriteLine(String.Format("VendorItem:LinkID"));
return this.GetIntFromLSO("LinkID");
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("VendorItem:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// The price of the item in silver pieces.
/// </summary>
public float Price
{
get
{
Trace.WriteLine(String.Format("VendorItem:Price"));
return this.GetFloatFromLSO("Price");
}
}
/// <summary>
/// Quantity Available
/// </summary>
public int Quantity
{
get
{
Trace.WriteLine(String.Format("VendorItem:Quantity"));
return this.GetIntFromLSO("Quantity");
}
}
/// <summary>
/// This will recreate the actual link used with in game chat channels (used typically with eq2echo or eq2execute).
/// </summary>
public string ToLink
{
get
{
Trace.WriteLine(String.Format("VendorItem:ToLink"));
return this.GetStringFromLSO("ToLink");
}
}
#endregion
#region Method
/// <summary>
/// Will try to buy 1 of an item
/// </summary>
/// <returns>call success</returns>
public bool Buy()
{
Trace.WriteLine(String.Format("VendorItem:Buy()"));
return this.ExecuteMethod("Buy");
}
/// <summary>
/// Will try to buy the quantity of an item.
/// Quantity only works for items that are stackable.
/// Tf you try to buy more than a stack can hold, Quantity will default to max.
/// </summary>
/// <param name="quantity">quantity</param>
/// <returns>call success</returns>
public bool Buy(int quantity)
{
Trace.WriteLine(String.Format("VendorItem:Buy({0})", quantity.ToString(CultureInfo.InvariantCulture)));
return ExecuteMethod("Buy", quantity.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// This brings up the 'examine window' for the given item.
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Merchandise:Examine()"));
return this.ExecuteMethod("Examine");
}
#endregion
}
}

View File

@ -0,0 +1,77 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Recipe
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to tradeskill recipe components.
/// </summary>
public class Component : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Component(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Component name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Component:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Cache of Quantity
/// </summary>
private int? _quantity;
/// <summary>
/// Quantity of component required
/// </summary>
public int Quantity
{
get
{
Trace.WriteLine(String.Format("Component:Quantity"));
if(!_quantity.HasValue)
_quantity = this.GetIntFromLSO("Quantity");
return _quantity.Value;
}
}
/// <summary>
/// The quantity of the compoent on hand
/// </summary>
public int QuantityOnHand
{
get
{
Trace.WriteLine(String.Format("Component:QuantityOnHand"));
return this.GetIntFromLSO("QuantityOnHand");
}
}
#endregion
}
}

View File

@ -0,0 +1,314 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.AbilityEffect;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Recipe
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to tradeskill recipes.
/// </summary>
public class Recipe : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Recipe(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// A recipe component
/// </summary>
public Component BuildComponent1
{
get
{
Trace.WriteLine(String.Format("Recipe:BuildComponent1"));
return new Component(this.GetMember("BuildComponent1"));
}
}
/// <summary>
/// A recipe component
/// </summary>
public Component BuildComponent2
{
get
{
Trace.WriteLine(String.Format("Recipe:BuildComponent2"));
return new Component(this.GetMember("BuildComponent2"));
}
}
/// <summary>
/// A recipe component
/// </summary>
public Component BuildComponent3
{
get
{
Trace.WriteLine(String.Format("Recipe:BuildComponent3"));
return new Component(this.GetMember("BuildComponent3"));
}
}
/// <summary>
/// A recipe component
/// </summary>
public Component BuildComponent4
{
get
{
Trace.WriteLine(String.Format("Recipe:BuildComponent4"));
return new Component(this.GetMember("BuildComponent4"));
}
}
/// <summary>
/// Returns the class at the specified index
/// </summary>
/// <param name="index">index</param>
/// <returns>Class</returns>
public Class Class(int index)
{
Trace.WriteLine(String.Format("Recipe:Class({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Class(this.GetMember("Class", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// Cache of description
/// </summary>
private string _description;
/// <summary>
/// Recipe Description
/// </summary>
public string Description
{
get
{
Trace.WriteLine(String.Format("Recipe:Description"));
return _description ?? (_description = this.GetStringFromLSO("Description"));
}
}
/// <summary>
/// Cache of Device
/// </summary>
private string _device;
/// <summary>
/// Tradeskill device to craft
/// </summary>
public string Device
{
get
{
Trace.WriteLine(String.Format("Recipe:Device"));
return _device ?? (_device = this.GetStringFromLSO("Device"));
}
}
/// <summary>
/// Fuel Component
/// </summary>
public Component Fuel
{
get
{
Trace.WriteLine(String.Format("Recipe:Fuel"));
return new Component(this.GetMember("Fuel"));
}
}
/// <summary>
/// Cache of ID
/// </summary>
private uint? _iD;
/// <summary>
/// Recipe ID
/// </summary>
public uint ID
{
get
{
Trace.WriteLine(String.Format("Recipe:ID"));
if (!_iD.HasValue)
_iD = this.GetUIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of Knowledge
/// </summary>
private string _knowledge;
/// <summary>
/// Recipe knowledge
/// </summary>
public string Knowledge
{
get
{
Trace.WriteLine(String.Format("Recipe:Knowledge"));
return _knowledge ?? (_knowledge = this.GetStringFromLSO("Knowledge"));
}
}
/// <summary>
/// Cache of level
/// </summary>
private int? _level;
/// <summary>
/// Recipe level
/// </summary>
public int Level
{
get
{
Trace.WriteLine(String.Format("Recipe:Level"));
if(!_level.HasValue)
_level = this.GetIntFromLSO("Level");
return _level.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// Recipe name
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Recipe:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Cache of NumClasses
/// </summary>
private int? _numClasses;
/// <summary>
/// The number of classes that can use (used in Class(int index))
/// </summary>
public int NumClasses
{
get
{
Trace.WriteLine(String.Format("Recipe:NumClasses"));
if(!_numClasses.HasValue)
_numClasses = this.GetIntFromLSO("NumClasses");
return _numClasses.Value;
}
}
/// <summary>
/// Cache of PrimaryComponent
/// </summary>
private string _primaryComponent;
/// <summary>
/// The name of the primary component of the recipe
/// </summary>
public string PrimaryComponent
{
get
{
Trace.WriteLine(String.Format("Recipe:PrimaryComponent"));
return _primaryComponent ?? (_primaryComponent = this.GetStringFromLSO("PrimaryComponent"));
}
}
/// <summary>
/// Then quantity of primary component on hand
/// </summary>
public int PrimaryComponentQuantityOnHand
{
get
{
Trace.WriteLine(String.Format("Recipe:PrimaryComponentOnHand"));
return this.GetIntFromLSO("PrimaryComponentQuantityOnHand");
}
}
/// <summary>
/// Cache of RecipeBook
/// </summary>
private string _recipeBook;
/// <summary>
/// The name of the recipe book for the recipe
/// </summary>
public string RecipeBook
{
get
{
Trace.WriteLine(String.Format("Recipe:RecipeBook"));
return _recipeBook ?? (_recipeBook = this.GetStringFromLSO("RecipeBook"));
}
}
/// <summary>
/// Cache of Technique
/// </summary>
private string _technique;
/// <summary>
/// Tradeskill technique needed
/// </summary>
public string Technique
{
get
{
Trace.WriteLine(String.Format("Recipe:Technique"));
return _technique ?? (_technique = this.GetStringFromLSO("Technique"));
}
}
#endregion
#region Methods
/// <summary>
/// Begins creation of the recipe
/// </summary>
/// <returns>call success</returns>
public bool Create()
{
Trace.WriteLine(String.Format("Recipe:Create()"));
return this.ExecuteMethod("Create");
}
/// <summary>
/// Examines the recipe
/// </summary>
/// <returns>call success</returns>
public bool Examine()
{
Trace.WriteLine(String.Format("Recipe:Examine()"));
return this.ExecuteMethod("Examine");
}
#endregion
}
}

View File

@ -0,0 +1,101 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to Choice windows.
/// </summary>
public class ChoiceWindow : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ChoiceWindow(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// First Choice
/// </summary>
public string Choice1
{
get
{
Trace.WriteLine(String.Format("ChoiceWindow:Choice1"));
return this.GetStringFromLSO("Choice1");
}
}
/// <summary>
/// Second Choice
/// </summary>
public string Choice2
{
get
{
Trace.WriteLine(String.Format("ChoiceWindow:Choice2"));
return this.GetStringFromLSO("Choice2");
}
}
/// <summary>
/// Choice window text
/// </summary>
public string Text
{
get
{
Trace.WriteLine(String.Format("ChoiceWindow:Text"));
return this.GetStringFromLSO("Text");
}
}
/// <summary>
/// Returns the choice window as an EQ2Window
/// </summary>
public EQ2Window ToEQ2UIPage
{
get
{
Trace.WriteLine(String.Format("ChoiceWindow:ToEQ2UIPage"));
return new EQ2Window(this.GetMember("ToEQ2UIPage"));
}
}
#endregion
#region Methods
/// <summary>
/// Selects Choice1
/// </summary>
/// <returns>call success</returns>
public bool DoChoice1()
{
Trace.WriteLine(String.Format("ChoiceWindow:DoChoice1()"));
return this.ExecuteMethod("DoChoice1");
}
/// <summary>
/// Selects Choice2
/// </summary>
/// <returns>call success</returns>
public bool DoChoice2()
{
Trace.WriteLine(String.Format("ChoiceWindow:DoChoice2()"));
return this.ExecuteMethod("DoChoice2");
}
#endregion
}
}

View File

@ -0,0 +1,434 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.AbilityEffect;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related
/// to UI Elements such as buttons, icons, checkboxes, UI Text, composites and others.
/// </summary>
public class EQ2Widget : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public EQ2Widget(LavishScriptObject copy) : base(copy) { }
/// <summary>
/// Constructor - Constructs a EQ2Window object based on the LavishScript object EQ2Window
/// </summary>
public EQ2Widget() : base(LavishScript.Objects.GetObject("EQ2Widget")) { }
#endregion
#region Members
/// <summary>
/// If the result of a GetProperty call is a boolean value, then it will return "TRUE" or "FALSE".
/// Otherwise, it will return a string unless an additional argument is provided as follows
/// </summary>
public string GetProperty(string name)
{
Trace.WriteLine(String.Format("EQ2UIElement:GetProperty({0})", name));
return this.GetStringFromLSO("GetProperty", name);
}
/// <summary>
/// Retrieves the specified Child. This data member only works for Composite UI element types.
/// This data member uses two arguments. The first is the 'type' the element, which can be
/// either "Button", "Icon", "Text", "CheckBox", "Page", "DataSourceContainer", or "Composite".
/// The second argument is the index location of the child within the composite's children array.
/// This number will be between 1 and NumChildren.
/// </summary>
/// <param name="type">type</param>
/// <param name="index">index</param>
/// <returns>EQ2UIElement</returns>
public EQ2Widget Child(ElementType type, int index)
{
Trace.WriteLine(String.Format("EQ2UIElement:Child({0}, {1})", type.ToString(), index.ToString(CultureInfo.InvariantCulture)));
return new EQ2Widget(this.GetMember("ChildType", type.ToString(), index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// Retrieves the ChildType at the specified index.
/// This data member only works for Composite UI element types.
/// This data member uses one argument. This argument is a
/// number between 1 and NumChildren representing the location in the composite's children array.
/// </summary>
/// <param name="index">index</param>
/// <returns>ElementType</returns>
public ElementType ChildType(int index)
{
Trace.WriteLine(String.Format("EQ2UIElement:ChildType({0})", index.ToString(CultureInfo.InvariantCulture)));
switch (this.GetStringFromLSO("ChildType", index.ToString(CultureInfo.InvariantCulture)))
{
case "Button":
return ElementType.Button;
case "Icon":
return ElementType.Icon;
case "Text":
return ElementType.Text;
case "CheckBox":
return ElementType.CheckBox;
case "Page":
return ElementType.Page;
case "DataSourceContainer":
return ElementType.DataSourceContainer;
case "Composite":
return ElementType.Composite;
case "DynamicData":
return ElementType.DynamicData;
case "TextBox":
return ElementType.TextBox;
case "List":
return ElementType.List;
case "VolumePage":
return ElementType.VolumePage;
case "DataSource":
return ElementType.DataSource;
default:
return ElementType.Unknown;
}
}
/// <summary>
/// Retrieves the dynamic data UI element at the specified path
/// </summary>
/// <param name="path">path</param>
/// <returns>EQ2UIElement</returns>
public EQ2Widget GetDynamicData(string path)
{
Trace.WriteLine(String.Format("EQ2UIElement:GetDynamicData({0})", path));
return new EQ2Widget(this.GetMember("GetDynamicData", path));
}
/// <summary>
/// Returns true if the element is checked. This data member only works for Checkbox and DynamicData UI element types.
/// </summary>
public bool IsChecked
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:IsChecked"));
return this.GetBoolFromLSO("IsChecked");
}
}
/// <summary>
/// This data member has only been tested to work with 'button' types thus far.
/// </summary>
public bool IsEnabled
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:IsEnabled"));
return this.GetBoolFromLSO("IsEnabled");
}
}
/// <summary>
/// This member is an exact replica of IsChecked.
/// This data member only works for Checkbox and DynamicData UI element types.
/// </summary>
public bool IsSet
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:IsSet"));
return this.GetBoolFromLSO("IsSet");
}
}
/// <summary>
/// Cache of Label
/// </summary>
private string _label;
/// <summary>
/// Label. This data member only works for Checkbox, Text, DynamicData, and Button UI element types.
/// </summary>
public string Label
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:Label"));
return _label ?? (_label = this.GetStringFromLSO("Text"));
}
}
/// <summary>
/// Number of children. This data member only works for Composite UI element types.
/// </summary>
public int NumChildren
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:NumChildren"));
return this.GetIntFromLSO("NumChildren");
}
}
/// <summary>
/// Parent
/// </summary>
public EQ2Widget Parent
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:Parent"));
return new EQ2Widget(this.GetMember("Parent"));
}
}
/// <summary>
/// ProgressBar completion. For ProgressBar types only.
/// </summary>
public float Percent
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:Percent"));
return this.GetFloatFromLSO("Percent");
}
}
/// <summary>
/// Highlighted list row. "List" types only.
/// </summary>
public int RowHighlighted
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:RowHighlighted"));
return this.GetIntFromLSO("RowHighlighted");
}
}
/// <summary>
/// Cache of ShortLabel
/// </summary>
private string _shortLabel;
/// <summary>
/// Short Label. This data member only works for DynamicData UI element types.
/// </summary>
public string ShortLabel
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:ShortLabel"));
return _shortLabel ?? (_shortLabel = this.GetStringFromLSO("ShortLabel"));
}
}
/// <summary>
/// Cache of Text
/// </summary>
private string _text;
/// <summary>
/// Text. This data member only works for Checkbox, Text, DynamicData, and Button UI element types.
/// </summary>
public string Text
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:Text"));
return _text ?? (_text = this.GetStringFromLSO("Text"));
}
}
/// <summary>
/// Returns the ability associated with the icon. For Icons only.
/// </summary>
public Ability ToAbility
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:ToAbility"));
return new Ability(this.GetMember("ToAbility"));
}
}
/// <summary>
/// Element Type
/// </summary>
public ElementType Type
{
get
{
Trace.WriteLine(String.Format("EQ2UIElement:Type"));
switch (this.GetStringFromLSO("Type"))
{
case "Button":
return ElementType.Button;
case "Icon":
return ElementType.Icon;
case "Text":
return ElementType.Text;
case "CheckBox":
return ElementType.CheckBox;
case "Page":
return ElementType.Page;
case "DataSourceContainer":
return ElementType.DataSourceContainer;
case "Composite":
return ElementType.Composite;
case "DynamicData":
return ElementType.DynamicData;
case "TextBox":
return ElementType.TextBox;
case "List":
return ElementType.List;
case "VolumePage":
return ElementType.VolumePage;
case "DataSource":
return ElementType.DataSource;
default:
return ElementType.Unknown;
}
}
}
#endregion
#region Methods
/// <summary>
/// Adds text to textbox. This should work for pretty much any "text entry" box in the EQ2 UI.
/// Only works for Textbox type eq2uielements.
/// </summary>
/// <param name="text">text</param>
/// <returns>call success</returns>
public bool SetProperty(string propertyName, string value)
{
Trace.WriteLine(String.Format("EQ2UIElement:SetProperty({0},{1})", propertyName, value));
return this.ExecuteMethod("SetProperty", propertyName, value);
}
/// <summary>
/// Clicks a button. Only works for Button type eq2uielements.
/// </summary>
/// <returns>call success</returns>
public bool ClickButton()
{
Trace.WriteLine(String.Format("EQ2UIElement:ClickButton()"));
return this.ExecuteMethod("ClickButton");
}
/// <summary>
/// Performs a double left click of the eq2uielement.
/// </summary>
/// <returns>call success</returns>
public bool DoubleLeftClick()
{
Trace.WriteLine(String.Format("EQ2UIElement:DoubleLeftClick()"));
return this.ExecuteMethod("DoubleLeftClick");
}
/// <summary>
/// Highlights the specified row in the list
/// </summary>
/// <param name="row">row</param>
/// <returns>call success</returns>
public bool HighlightRow(int row)
{
Trace.WriteLine(String.Format("EQ2UIElement:HighlightRow({0})", row.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("HighlightRow", row.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// LeftClicks the eq2uielement
/// </summary>
/// <returns>call success</returns>
public bool LeftClick()
{
Trace.WriteLine(String.Format("EQ2UIElement:LeftClick()"));
return this.ExecuteMethod("LeftClick");
}
/// <summary>
/// RightClicks the eq2uielement
/// </summary>
/// <returns></returns>
public bool RightClick()
{
Trace.WriteLine(String.Format("EQ2UIElement:RightClick()"));
return this.ExecuteMethod("RightClick");
}
#endregion
#region Enums
/// <summary>
/// UI Element Types
/// </summary>
public enum ElementType
{
/// <summary>
/// Element Type Button
/// </summary>
Button,
/// <summary>
/// Element Type Text
/// </summary>
Text,
/// <summary>
/// Element Type TextBox
/// </summary>
TextBox,
/// <summary>
/// Element Type CheckBox
/// </summary>
CheckBox,
/// <summary>
/// Element Type Page
/// </summary>
Page,
/// <summary>
/// Element Type Composite
/// </summary>
Composite,
/// <summary>
/// Element Type Icon
/// </summary>
Icon,
/// <summary>
/// Element Type DataSourceContainer
/// </summary>
DataSourceContainer,
/// <summary>
/// Element Type DynamicData
/// </summary>
DynamicData,
/// <summary>
/// Element Type Volume Page
/// </summary>
VolumePage,
/// <summary>
/// Element Type DataSource
/// </summary>
DataSource,
/// <summary>
/// Element Type Lists
/// </summary>
List,
/// <summary>
/// Element Type Unknown
/// </summary>
Unknown
}
#endregion
}
}

View File

@ -0,0 +1,59 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to User Interface Pages.
/// Many times, this refers to UI Windows; however, it is not restricted to that.
/// </summary>
public class EQ2Window : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public EQ2Window(LavishScriptObject copy) : base(copy) { }
/// <summary>
/// Constructor - Constructs a EQ2Window object based on the LavishScript object EQ2Window
/// </summary>
public EQ2Window() : base(LavishScript.Objects.GetObject("EQ2Window")) { }
#endregion
#region Members
/// <summary>
/// The Child UI Element
/// </summary>
/// <param name="type">type</param>
/// <param name="name">name</param>
/// <returns>EQ2UIElement</returns>
public EQ2Widget Child(EQ2Widget.ElementType type, string name)
{
Trace.WriteLine(String.Format("EQ2Window:Child({0}, {1})", type.ToString(), name));
return new EQ2Widget(this.GetMember("Child", type.ToString(), name));
}
/// <summary>
/// Returns TRUE if the window is visible
/// </summary>
public bool IsVisible
{
get
{
Trace.WriteLine(String.Format("EQ2Window:IsVisible"));
return this.GetBoolFromLSO("IsVisible");
}
}
#endregion
}
}

View File

@ -0,0 +1,79 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
using MRBot.IsxEq2.InventoryConsignment;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to Item Examine windows.
/// </summary>
public class ExamineItemWindow : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ExamineItemWindow(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns the item being examined as an item datatype object.
/// (Note: All members of the item should be available without initialization when accessed via the examineitemwindow.)
/// </summary>
public Item ToItem
{
get
{
Trace.WriteLine(String.Format("ExamineItemWindow:ToItem"));
return new Item(this.GetMember("ToItem"));
}
}
/// <summary>
/// Returns a "checkbox" eq2uielement type.
/// </summary>
public EQ2Widget GetPVPCheckbox
{
get
{
Trace.WriteLine(String.Format("ExamineItemWindow:GetPVPCheckbox"));
return new EQ2Widget(this.GetMember("GetPVPCheckBox"));
}
}
/// <summary>
/// Number of "Texts" in the TextVector
/// </summary>
public int NumTextVector
{
get
{
Trace.WriteLine(String.Format("ExamineItemWindow:NumTextVector"));
return this.GetIntFromLSO("NumTextVector");
}
}
/// <summary>
/// Returns a "text" eq2uielement type
/// </summary>
/// <param name="index">index</param>
/// <returns>EQ2UIElement</returns>
public EQ2Widget TextVector(int index)
{
Trace.WriteLine(String.Format("ExamineItemWindow:TextVector({0}})", index.ToString(CultureInfo.InvariantCulture)));
return new EQ2Widget(this.GetMember("TextVector", index.ToString(CultureInfo.InvariantCulture)));
}
#endregion
}
}

View File

@ -0,0 +1,192 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
using MRBot.IsxEq2.InventoryConsignment;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to the "loot" window.
/// </summary>
public class LootWindow : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public LootWindow(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns TRUE if Lotto Loot
/// </summary>
public bool IsLotto
{
get
{
Trace.WriteLine(String.Format("LootWindow:IsLotto"));
return this.GetBoolFromLSO("IsLotto");
}
}
/// <summary>
/// Returns the item at the index provided. (From 1 to NumItems)
/// </summary>
/// <param name="index">index</param>
/// <returns>Item</returns>
public Item Item(int index)
{
Trace.WriteLine(String.Format("LootWindow:Item({0})", index.ToString(CultureInfo.InvariantCulture)));
return new Item(this.GetMember("Item", index.ToString(CultureInfo.InvariantCulture)));
}
/// <summary>
/// Returns the item that matches the substring name
/// </summary>
/// <param name="name">name</param>
/// <returns>call success</returns>
public Item Item(string name)
{
Trace.WriteLine(String.Format("LootWindow:Item({0})", name));
return new Item(this.GetMember("Item", name));
}
/// <summary>
/// The number of items in the loot window
/// </summary>
public int NumItems
{
get
{
Trace.WriteLine(String.Format("LootWindow:NumItems"));
return this.GetIntFromLSO("NumItems");
}
}
/// <summary>
/// Returns the LootWindow as an EQ2Window
/// </summary>
public EQ2Window ToEQ2UIPage
{
get
{
Trace.WriteLine(String.Format("LootWindow:ToEQ2UIPage"));
return new EQ2Window(this.GetMember("ToEQ2UIPage"));
}
}
/// <summary>
/// Returns "Free For All" "Lottery" "Need Before Greed" or "Unknown"
/// </summary>
public string Type
{
get
{
Trace.WriteLine(String.Format("LootWindow:Type"));
return this.GetStringFromLSO("Type");
}
}
#endregion
#region Methods
/// <summary>
/// Declines the Lotto
/// </summary>
/// <returns>call success</returns>
public bool DeclineLotto()
{
Trace.WriteLine(String.Format("LootWindow:DeclineLotto()"));
return this.ExecuteMethod("DeclineLotto");
}
/// <summary>
/// Decline Need Before Greed
/// </summary>
/// <returns>call success</returns>
public bool DeclineNBG()
{
Trace.WriteLine(String.Format("LootWindow:DeclineLotto()"));
return this.ExecuteMethod("DeclineNBG");
}
/// <summary>
/// Loots all items in loot window
/// </summary>
/// <returns>call success</returns>
public bool LootAll()
{
Trace.WriteLine(String.Format("LootWindow:LootAll()"));
return this.ExecuteMethod("LootAll");
}
/// <summary>
/// Loots the single item in the loot window. This method does
/// not work for Lotto loot window, only for FreeForAll, LeaderOnly, or Solo.
/// </summary>
/// <returns></returns>
public bool LootItem()
{
Trace.WriteLine(String.Format("LootWindow:LootItem()"));
return this.ExecuteMethod("LootItem");
}
/// <summary>
/// Attempts to loot the item with ID provided
/// </summary>
/// <param name="id">ID</param>
/// <param name="lootNoTrade">Loot No Trade Items</param>
/// <returns>call success</returns>
public bool LootItem(int id, bool lootNoTrade = false)
{
Trace.WriteLine(String.Format("LootWindow:LootItem({0}, {1})", id.ToString(CultureInfo.InvariantCulture),
lootNoTrade.ToString(CultureInfo.InvariantCulture)));
return lootNoTrade
? this.ExecuteMethod("LootItem", id.ToString(CultureInfo.InvariantCulture))
: this.ExecuteMethod("LootItem", id.ToString(CultureInfo.InvariantCulture),
0.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Click Request All Button. Defaults to LootAll if no RequestAll button.
/// </summary>
/// <returns>call success</returns>
public bool RequestAll()
{
Trace.WriteLine(String.Format("LootWindow:RequestAll()"));
return this.ExecuteMethod("RequestAll");
}
/// <summary>
/// Selects the greed button
/// </summary>
/// <returns>call success</returns>
public bool SelectGreed()
{
Trace.WriteLine(String.Format("LootWindow:SelectGreed()"));
return this.ExecuteMethod("SelectGreed");
}
/// <summary>
/// Selects the need button
/// </summary>
/// <returns>call success</returns>
public bool SelectNeed()
{
Trace.WriteLine(String.Format("LootWindow:SelectNeed()"));
return this.ExecuteMethod("SelectNeed");
}
#endregion
}
}

View File

@ -0,0 +1,81 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to reply dialogs.
/// </summary>
public class ReplyDialog : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ReplyDialog(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Text
/// </summary>
public string Text
{
get
{
Trace.WriteLine(String.Format("ReplyDialog:Text"));
return this.GetStringFromLSO("Text");
}
}
/// <summary>
/// Returns the ReplyDialog as an EQ2Window
/// </summary>
public EQ2Window ToEQ2UIPage
{
get
{
Trace.WriteLine(String.Format("ReplyDialog:ToEQ2UIPage"));
return new EQ2Window(this.GetMember("ToEQ2UIPage"));
}
}
#endregion
#region Methods
/// <summary>
/// Selects the dialog by index.
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public bool Choose(int index)
{
Trace.WriteLine(String.Format("ReplyDialog:Choose({0})", index.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("Choose", index.ToString(CultureInfo.InvariantCulture));
}
/// TODO:Find out if Select is Redundant
/// <summary>
/// Selects the dialog by index.
/// </summary>
/// <param name="index">index</param>
/// <returns>call success</returns>
public bool Select(int index)
{
Trace.WriteLine(String.Format("ReplyDialog:Select({0})", index.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("Select", index.ToString(CultureInfo.InvariantCulture));
}
#endregion
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
namespace MRBot.IsxEq2.UI
{
/// <summary>
/// Allows interaction with Reward Windows.
/// </summary>
public class RewardWindow : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public RewardWindow(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns the RewardWindow as an EQ2Window
/// </summary>
public EQ2Window ToEQ2UIPage
{
get
{
Trace.WriteLine(String.Format("RewardWindow:ToEQ2UIPage"));
return new EQ2Window(this.GetMember("ToEQ2UIPage"));
}
}
#endregion
#region Methods
/// <summary>
/// Accepts the reward
/// </summary>
/// <returns>call success</returns>
public bool Accept()
{
Trace.WriteLine(String.Format("RewardWindow:Accept()"));
return this.ExecuteMethod("Accept");
}
/// <summary>
/// Cancels the reward window
/// </summary>
/// <returns>call success</returns>
public bool Cancel()
{
Trace.WriteLine(String.Format("RewardWindow:Cancel()"));
return this.ExecuteMethod("Cancel");
}
/// <summary>
/// Receives the reward
/// </summary>
/// <returns></returns>
public bool Receive()
{
Trace.WriteLine(String.Format("RewardWindow:Receive()"));
return this.ExecuteMethod("Receive");
}
#endregion
}
}

565
MRBot/IsxEq2/Utility/EQ2.cs Normal file
View File

@ -0,0 +1,565 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.CharacterActor;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// This DataType includes miscellaneous data that is available to ISXEQ2 that does not fit into any other ISXEQ2 DataType
/// </summary>
public class EQ2 : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
public EQ2() : base(LavishScript.Objects.GetObject("EQ2")) { }
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public EQ2(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Returns a boolean stating whether or not two points (1 and 2) have Line of Sight.
/// Please note that this checks a direct line between two points for a collision.
/// This is subject to false positives or negativesdue to railings (seeing between the rails,
/// false negative) or staircases (top to bottom, false positive).
/// </summary>
/// <param name="x1">x-coordinate of 1</param>
/// <param name="y1">y-coordinate of 1</param>
/// <param name="z1">z-coordinate of 1</param>
/// <param name="x2">x-coordinate of 2</param>
/// <param name="y2">y-coordinate of 2</param>
/// <param name="z2">z-coordinate of 2</param>
public bool CheckCollision(float x1, float y1, float z1, float x2, float y2, float z2)
{
Trace.WriteLine(String.Format("EQ2:CheckCollision({0}, {1}, {2}, {3}, {4}, {5})",
x1.ToString(CultureInfo.InvariantCulture), y1.ToString(CultureInfo.InvariantCulture), z1.ToString(CultureInfo.InvariantCulture),
x2.ToString(CultureInfo.InvariantCulture), y2.ToString(CultureInfo.InvariantCulture), z2.ToString(CultureInfo.InvariantCulture)));
return this.GetBoolFromLSO("CheckCollision",
x1.ToString(CultureInfo.InvariantCulture), y1.ToString(CultureInfo.InvariantCulture), z1.ToString(CultureInfo.InvariantCulture),
x2.ToString(CultureInfo.InvariantCulture), y2.ToString(CultureInfo.InvariantCulture), z2.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Returns the size of the custom actor array.
/// </summary>
public int CustomActorArraySize
{
get
{
Trace.WriteLine(String.Format("EQ2:CustomActorArraySize"));
return this.GetIntFromLSO("CustomActorArraySize");
}
}
/// <summary>
/// Returns the true heading from the "from" point (1) to the "to" point (2).
/// </summary>
/// <param name="fromX">x-coordinate of 1</param>
/// <param name="fromY">y-coordinate of 1</param>
/// <param name="fromZ">z-coordinate of 1</param>
/// <param name="toX">x-coordinate of 2</param>
/// <param name="toY">y-coordinate of 2</param>
/// <param name="toZ">z-coordinate of 2</param>
public float HeadingTo(float fromX, float fromY, float fromZ, float toX, float toY, float toZ)
{
Trace.WriteLine(String.Format("EQ2:HeadingTo({0}, {1}, {2}, {3}, {4}, {5})",
fromX.ToString(CultureInfo.InvariantCulture), fromY.ToString(CultureInfo.InvariantCulture), fromZ.ToString(CultureInfo.InvariantCulture),
toX.ToString(CultureInfo.InvariantCulture), toY.ToString(CultureInfo.InvariantCulture), toZ.ToString(CultureInfo.InvariantCulture)));
return this.GetFloatFromLSO("HeadingTo",
fromX.ToString(CultureInfo.InvariantCulture), fromY.ToString(CultureInfo.InvariantCulture), fromZ.ToString(CultureInfo.InvariantCulture),
toX.ToString(CultureInfo.InvariantCulture), toY.ToString(CultureInfo.InvariantCulture), toZ.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Returns the last known active Heroic Opportunity wheel slot
/// </summary>
public int HOCurrentWheelSlot
{
get
{
Trace.WriteLine(String.Format("EQ2:HOCurrentWheelSlot"));
return this.GetIntFromLSO("HOCurrentWheelSlot");
}
}
/// <summary>
/// Returns the description of the Heroic Opportunity
/// </summary>
public string HODescription
{
get
{
Trace.WriteLine(String.Format("EQ2:HODescription"));
return this.GetStringFromLSO("HODescription");
}
}
/// <summary>
/// Returns the IconID of slot 1
/// </summary>
public int HOIconID1
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID1"));
return this.GetIntFromLSO("HOIconID1");
}
}
/// <summary>
/// Returns the IconID of slot 2
/// </summary>
public int HOIconID2
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID2"));
return this.GetIntFromLSO("HOIconID2");
}
}
/// <summary>
/// Returns the IconID of slot 3
/// </summary>
public int HOIconID3
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID3"));
return this.GetIntFromLSO("HOIconID3");
}
}
/// <summary>
/// Returns the IconID of slot 4
/// </summary>
public int HOIconID4
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID1"));
return this.GetIntFromLSO("HOIconID4");
}
}
/// <summary>
/// Returns the IconID of slot 5
/// </summary>
public int HOIconID5
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID5"));
return this.GetIntFromLSO("HOIconID5");
}
}
/// <summary>
/// Returns the IconID of slot 6
/// </summary>
public int HOIconID6
{
get
{
Trace.WriteLine(String.Format("EQ2:HOIconID6"));
return this.GetIntFromLSO("HOIconID6");
}
}
/// <summary>
/// Returns the last actor to initialize/manipulate the Heroic Opportunity window/wheel
/// </summary>
public Actor HOLastManipulator
{
get
{
Trace.WriteLine(String.Format("EQ2:HOLastManipulator"));
return new Actor(this.GetMember("HOLastManipulator"));
}
}
/// <summary>
/// Returns the name of the Heroic Opportunity
/// </summary>
public string HOName
{
get
{
Trace.WriteLine(String.Format("EQ2:HOName"));
return this.GetStringFromLSO("HOName");
}
}
/// <summary>
/// Returns the total time elapsed on the current Heroic Opportunity
/// </summary>
public float HOTimeElapsed
{
get
{
Trace.WriteLine(String.Format("EQ2:HOTimeElapsed"));
return this.GetFloatFromLSO("HOTimeElapsed");
}
}
/// <summary>
/// Returns the total time allowed for the cuurent Heroic Opportunity
/// </summary>
public float HOTimeLimit
{
get
{
Trace.WriteLine(String.Format("EQ2:HOTimeLimit"));
return this.GetFloatFromLSO("HOTimeLimit");
}
}
/// <summary>
/// Returns the time remaining on the current Heroic Opportunity
/// </summary>
public float HOTimeRemaining
{
get
{
Trace.WriteLine(String.Format("EQ2:HOTimeRemaining"));
return this.GetFloatFromLSO("HOTimeRemaining");
}
}
/// <summary>
/// Returns the ID# of the wheel
/// </summary>
public int HOWheelID
{
get
{
Trace.WriteLine(String.Format("EQ2:HOWheelID"));
return this.GetIntFromLSO("HOWheelID");
}
}
/// <summary>
/// Returns the last known state of the Heroic Opportunity wheel
/// </summary>
public int HOWheelState
{
get
{
Trace.WriteLine(String.Format("EQ2:HOWheelState"));
return this.GetIntFromLSO("HOWheelState");
}
}
/// <summary>
/// Returns a boolean indicating whether or not the Heroic Opportunity window is active
/// </summary>
public bool HOWindowActive
{
get
{
Trace.WriteLine(String.Format("EQ2:HOWindowActive"));
return this.GetBoolFromLSO("HOWindowActive");
}
}
/// <summary>
/// Current state of the Heroic Opportunity window
/// </summary>
public int HOWindowState
{
get
{
Trace.WriteLine(String.Format("EQ2:HOWindowState"));
return this.GetIntFromLSO("HOWindowState");
}
}
/// <summary>
/// Returns the number of mail items in the character's inbox.
/// The mailbox must have been opened at least once.
/// </summary>
public int InboxMailCount
{
get
{
Trace.WriteLine(String.Format("EQ2:InboxMailCount"));
return this.GetIntFromLSO("InboxMailCount");
}
}
/// <summary>
/// Returns the current master volume as a percentage
/// </summary>
public float MasterVolume
{
get
{
Trace.WriteLine(String.Format("EQ2:MasterVolume"));
return this.GetFloatFromLSO("MasterVolume");
}
}
/// <summary>
/// Returns the number of active radars
/// </summary>
public int NumRadars
{
get
{
Trace.WriteLine(String.Format("EQ2:NumRadars"));
return this.GetIntFromLSO("NumRadars");
}
}
/// <summary>
/// Returns the description of the quest currently being offered
/// </summary>
public string PendingQuestDescription
{
get
{
Trace.WriteLine(String.Format("EQ2:PendingQuestDescription"));
return this.GetStringFromLSO("PendingQuestDescription");
}
}
/// <summary>
/// Returns the name of the quest currently being offered.
/// Returns "none" if no quest is currently being offered.
/// </summary>
public string PendingQuestName
{
get
{
Trace.WriteLine(String.Format("EQ2:PendingQuestName"));
return this.GetStringFromLSO("PendingQuestName");
}
}
/// <summary>
/// Returns the Persistent Zone ID for a given zone name
/// </summary>
/// <param name="zoneName">zone name</param>
/// <returns>zone id</returns>
public uint PersistentZoneID(string zoneName)
{
Trace.WriteLine(String.Format("EQ2:PersistentZoneID({0})", zoneName));
return this.GetUIntFromLSO("PersistentZoneID", zoneName);
}
/// <summary>
/// Returns a boolean identifying whether or not a reward is pending
/// </summary>
public bool RewardPending
{
get
{
Trace.WriteLine(String.Format("EQ2:RewardPending"));
return this.GetBoolFromLSO("RewardPending");
}
}
/// <summary>
/// Returns the name of the server. This is only available when in the game proper.
/// </summary>
public string ServerName
{
get
{
Trace.WriteLine(String.Format("EQ2:ServerName"));
return this.GetStringFromLSO("ServerName");
}
}
/// <summary>
/// Returns an integer indicating the zoning status of the character. -1 = unsure, 0 = not zoning, 1 = zoning
/// </summary>
public int Zoning
{
get
{
Trace.WriteLine(String.Format("EQ2:Zoning"));
return this.GetIntFromLSO("Zoning");
}
}
#endregion
#region Methods
/// <summary>
/// Accepts the pending quest
/// </summary>
/// <returns>call success</returns>
public bool AcceptPendingQuest()
{
Trace.WriteLine(String.Format("ISXEQ2:AcceptPendingQuest()"));
return this.ExecuteMethod("AcceptPendingQuest");
}
/// <summary>
/// Accepts the current reward
/// </summary>
/// <returns>call success</returns>
public bool AcceptReward()
{
Trace.WriteLine(String.Format("EQ2:AcceptReward()"));
return this.ExecuteMethod("AcceptReward");
}
/// <summary>
/// Confirms the highlighted teleporter destination.
/// NOTE: This should be used after selecting the appropriate
/// destination using the 'HighlightRow' method of the
/// EQ2UIElement datatype.
/// </summary>
/// <returns>call success</returns>
public bool ConfirmZoneTeleporterDestination()
{
Trace.WriteLine(String.Format("EQ2:ConfirmZoneTeleporterDestination"));
return this.ExecuteMethod("ConfirmZoneTeleporterDestination");
}
/// <summary>
/// Creates an array of actors based on the sort criteria submitted
/// </summary>
/// <param name="args">sort method, radius, type</param>
/// <returns>call success</returns>
/// <remarks>
/// Sort Methods:
/// byDist, byLevel, byType, byName (byDist is defualt)
/// Type refers to npc, etc.
/// </remarks>
public bool CreateCustomActorArray(params string[] args)
{
Trace.WriteLine(String.Format("EQ2:CreateCustomActorArray({0})", String.Join(", ", args)));
return this.ExecuteMethod("CreateCustomActorArray", args);
}
/// <summary>
/// Declines the pending quest
/// </summary>
/// <returns>call success</returns>
public bool DeclinePendingQuest()
{
Trace.WriteLine(String.Format("EQ2:DeclinePendingQuest()"));
return this.ExecuteMethod("DeclinePendingQuest");
}
/// <summary>
/// Gets all actors in range
/// </summary>
/// <returns>Enumerable sorted by distance</returns>
public IEnumerable<Actor> GetActors()
{
Trace.WriteLine(String.Format("EQ2:GetActors()"));
return Util.GetListFromMethod<Actor>(this, "GetActors", "actor");
}
/// <summary>
/// Gets all actors in range that meet the search criteria
/// </summary>
/// <param name="args"></param>
/// <returns>Enumerable</returns>
/// <remarks>
/// Search Options:
/// pc - nearest pc
/// npc - nearest npc
/// NamedNPC - nearest named npc
/// guild, "guild" - nearest actor with that guild tag
/// pet - nearest pet that is not your own
/// mypet - your pet, or NULL
/// tsunit - nearest trade skill unit
/// resource - nearest resource node
/// nokillnpc - nearest no kill npc
/// special - nearest special actor
/// corpse - nearest corpse
/// me - me as actor
/// chest - nearest chest
/// door - nearest door
/// level, # - nearest actor of that level
/// levels, #, # - nearest actor between the two levels given
/// id, # - returns the actor with the id given
/// notid, # - excludes the actor with the id given
/// class, "class" - nearest actor with class given
/// race, "race" - nearest actor with race given
/// radius, # - nearest actor within the radius given (you are the center)
/// radiusr, #, # - nearest actor between the two radii (you are the center)
/// xzrange, # - nearest actor within the 2 dimmensional range
/// yrange, # - nearest actor within the supplied y range (vertical)
/// nopcnear [, #] - nearest actor for which there is no PC within the given radius from it. If no argument is given, then it defaults to a range of 100
/// loc,#,# [,#] - actor at the location provided X, Z, or X, Z, Y if third parameter provided
/// "string" - nearest actor with that string in their name
/// </remarks>
public IEnumerable<Actor> GetActors(params string[] args)
{
Trace.WriteLine(String.Format("EQ2:GetActors({0})", String.Join(", ", args)));
return Util.GetListFromMethod<Actor>(this, "GetActors", "actor", args);
}
/// <summary>
/// Returns a list of Persistent Zones
/// </summary>
/// <returns>Enumerable</returns>
public IEnumerable<string> GetPersistentZones()
{
Trace.WriteLine(String.Format("EQ2:GetPersistentZones()"));
return Util.GetListFromMethod<string>(this, "GetPersistentZones", "string");
}
/// <summary>
/// Sets the ambient light to the requested amount
/// </summary>
/// <param name="ambientPct">float value between 0 and 100</param>
/// <returns>call success</returns>
/// <remarks>
/// It should be noted that the EQ2 in-game ambient light controls
/// ..when at maximum...are only at 50%, by this setting.
/// </remarks>
public bool SetAmbientLight(float ambientPct)
{
Trace.WriteLine(String.Format("EQ2:SetAmbientLight({0})",
ambientPct.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetAmbientLight", ambientPct.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sets the master sound volume
/// </summary>
/// <param name="volPct">float value between 0 and 100</param>
/// <returns>call success</returns>
public bool SetMasterVolume(float volPct)
{
Trace.WriteLine(String.Format("EQ2:SetMasterVolume({0})",
volPct.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetMasterVolume", volPct.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Toggles the onscreen announcment that combat xp is disabled (if it is disabled)
/// </summary>
public bool ShowAllOnScreenAnnouncements()
{
Trace.WriteLine(String.Format("EQ2:ShowAllOnScreenAnnouncements()"));
return this.ExecuteMethod("ShowAllOnScreenAnnouncements");
}
#endregion
}
}

View File

@ -0,0 +1,172 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// This DataType provides control over and information about Saved EQ2 Locations.
/// </summary>
public class EQ2Location : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public EQ2Location(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of Label
/// </summary>
private string _label;
/// <summary>
/// The label appended to the location
/// </summary>
public string Label
{
get
{
Trace.WriteLine(String.Format("EQ2Location:Label"));
return _label ?? (_label = this.GetStringFromLSO("Label"));
}
}
/// <summary>
/// Cache of Notes
/// </summary>
private string _notes;
/// <summary>
/// Notes associated with this location
/// </summary>
public string Notes
{
get
{
Trace.WriteLine(String.Format("EQ2Location:Notes"));
return _notes ?? (_notes = this.GetStringFromLSO("Notes"));
}
}
/// <summary>
/// Cache of X
/// </summary>
private float? _x;
/// <summary>
/// x-coordinate
/// </summary>
public float X
{
get
{
Trace.WriteLine(String.Format("EQ2Location:X"));
if(!_x.HasValue)
_x = this.GetFloatFromLSO("X");
return _x.Value;
}
}
/// <summary>
/// Cache of Y
/// </summary>
private float? _y;
/// <summary>
/// y-coordinate
/// </summary>
public float Y
{
get
{
Trace.WriteLine(String.Format("EQ2Location:Y"));
if(!_y.HasValue)
_y = this.GetFloatFromLSO("Y");
return _y.Value;
}
}
/// <summary>
/// Cache of Z
/// </summary>
private float? _z;
/// <summary>
/// z-coordinate
/// </summary>
public float Z
{
get
{
Trace.WriteLine(String.Format("EQ2Location:Z"));
if(!_z.HasValue)
_z = this.GetFloatFromLSO("Z");
return _z.Value;
}
}
/// <summary>
/// Cache of Zone
/// </summary>
private string _zone;
/// <summary>
/// The zone of the eq2location
/// </summary>
public string Zone
{
get
{
Trace.WriteLine(String.Format("EQ2Location:Zone"));
return _zone ?? (_zone = this.GetStringFromLSO("Zone"));
}
}
#endregion
#region Methods
/// <summary>
/// Deletes the eq2location
/// </summary>
/// <returns>call success</returns>
public bool Delete()
{
Trace.WriteLine(String.Format("EQ2Location:Delete"));
return this.ExecuteMethod("Delete");
}
/// <summary>
/// Rotates the character towards the eq2location
/// </summary>
/// <returns>call success</returns>
public bool Face()
{
Trace.WriteLine(String.Format("EQ2Location:Face"));
return this.ExecuteMethod("Face");
}
/// <summary>
/// Creates an ingame waypoint to the eq2location
/// </summary>
/// <returns>call success</returns>
public bool WaypointTo()
{
Trace.WriteLine(String.Format("EQ2Location:WaypointTo"));
return this.ExecuteMethod("WaypointTo");
}
#endregion
}
}

View File

@ -0,0 +1,391 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
using MRBot.IsxEq2.InventoryConsignment;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to an individual email
/// </summary>
public class EQ2Mail : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public EQ2Mail(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// Cache of Body
/// </summary>
private string _body;
/// <summary>
/// The body of the email
/// </summary>
public string Body
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Body"));
return _body ?? (_body = this.GetStringFromLSO("Body"));
}
}
/// <summary>
/// Cache of Copper
/// </summary>
private int? _copper;
/// <summary>
/// Amount of copper attached to the email. Only works if mail is opened or composing.
/// </summary>
public int Copper
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Copper"));
if(!_copper.HasValue)
_copper = this.GetIntFromLSO("Copper");
return _copper.Value;
}
}
/// <summary>
/// Should return the item datatype for the attachment
/// </summary>
public Item Gift
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Gift"));
return new Item(this.GetMember("Gift"));
}
}
/// <summary>
/// Cache of Gold
/// </summary>
private int? _gold;
/// <summary>
/// Amount of gold attached to the email. Only works if mail is opened or composing.
/// </summary>
public int Gold
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Gold"));
if(!_gold.HasValue)
_gold = this.GetIntFromLSO("Gold");
return _gold.Value;
}
}
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// Mail ID
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of Platinum
/// </summary>
private int? _platinum;
/// <summary>
/// Amount of platinum attached to the email. Only works if mail is opened or composing.
/// </summary>
public int Platinum
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Platinum"));
if(!_platinum.HasValue)
_platinum = this.GetIntFromLSO("Platinum");
return _platinum.Value;
}
}
/// <summary>
/// Cache of recipient
/// </summary>
private string _recipient;
/// <summary>
/// Name of the recipient
/// </summary>
public string Recipient
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Recipient"));
return _recipient ?? (_recipient = this.GetStringFromLSO("Recipient"));
}
}
/// <summary>
/// Cache of Sender
/// </summary>
private string _sender;
/// <summary>
/// Returns the name of the sender
/// </summary>
public string Sender
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Sender"));
return _sender ?? (_sender = this.GetStringFromLSO("Sender"));
}
}
/// <summary>
/// Cache of Silver
/// </summary>
private int? _silver;
/// <summary>
/// Amount of silver attached to the email. Only works if mail is opened or composing.
/// </summary>
public int Silver
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Silver"));
if(!_silver.HasValue)
_silver = this.GetIntFromLSO("Silver");
return _silver.Value;
}
}
/// <summary>
/// Cache of Subject
/// </summary>
private string _subject;
/// <summary>
/// The subject of the email
/// </summary>
public string Subject
{
get
{
Trace.WriteLine(String.Format("EQ2Mail:Subject"));
return _subject ?? (_subject = this.GetStringFromLSO("Subject"));
}
}
#endregion
#region Methods
/// <summary>
/// Adds copper to an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of ccopper to add</param>
/// <returns>call success</returns>
public bool AddCopper(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:AddCopper({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("AddCopper", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Add gold to an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of gold to add</param>
/// <returns>call success</returns>
public bool AddGold(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:AddGold({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("AddGold", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Adds platinum to an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of platinum to add</param>
/// <returns>call success</returns>
public bool AddPlatinum(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:AddPlatinum({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("AddPlatinum", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Adds silver to an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of silver to add</param>
/// <returns>call success</returns>
public bool AddSilver(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:AddSilver({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("AddSilver", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Adds additional text to the body of an email. Requires email to be composing.
/// </summary>
/// <param name="text">text to append</param>
/// <returns>call success</returns>
public bool AppendBody(string text)
{
Trace.WriteLine(String.Format("EQ2Mail:AppendBody({0})", text));
return this.ExecuteMethod("AppendBody", text);
}
/// <summary>
/// Adds an additional recipient to an email. Requires email to be composing.
/// </summary>
/// <param name="text">text to append</param>
/// <returns>call success</returns>
public bool AppendRecipient(string text)
{
Trace.WriteLine(String.Format("EQ2Mail:AppendRecipient({0})", text));
return this.ExecuteMethod("AppendRecipient", text);
}
/// <summary>
/// Adds additional text to the subject of an email. Requires email to be composing.
/// </summary>
/// <param name="text">text to append</param>
/// <returns>call success</returns>
public bool AppendSubject(string text)
{
Trace.WriteLine(String.Format("EQ2Mail:AppendSubject({0})", text));
return this.ExecuteMethod("AppendSubject", text);
}
/// <summary>
/// Cancels the email.
/// </summary>
/// <returns>call success</returns>
public bool Cancel()
{
Trace.WriteLine(String.Format("EQ2Mail:Cancel()"));
return this.ExecuteMethod("Cancel");
}
/// <summary>
/// Deletes the email. Does not require the email to be opened or composing.
/// </summary>
/// <returns>call success</returns>
public bool Delete()
{
Trace.WriteLine(String.Format("EQ2Mail:Delete()"));
return this.ExecuteMethod("Delete");
}
/// <summary>
/// Opens the email. Does not require the email to be opened or composing.
/// </summary>
/// <returns>call success</returns>
public bool Open()
{
Trace.WriteLine(String.Format("EQ2Mail:Open()"));
return this.ExecuteMethod("Open");
}
/// <summary>
/// Extracts the attached gift from the email. Does not require the email to be opened or composing.
/// </summary>
/// <returns>call success</returns>
public bool ReceiveGifts()
{
Trace.WriteLine(String.Format("EQ2Mail:ReceiveGifts()"));
return this.ExecuteMethod("ReceiveGifts");
}
/// <summary>
/// Removes copper from an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of copper to remove</param>
/// <returns>call success</returns>
public bool RemoveCopper(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:RemoveCopper({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("RemoveCopper", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Removes the gift from an email. Requires email to be composing.
/// </summary>
/// <returns>call success</returns>
public bool RemoveGift()
{
Trace.WriteLine(String.Format("EQ2Mail:RemoveGift()"));
return this.ExecuteMethod("RemoveGift");
}
/// <summary>
/// Removes gold from an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of gold to remove</param>
/// <returns>call success</returns>
public bool RemoveGold(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:RemoveGold({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("RemoveGold", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Removes platinum from an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of platinum to remove</param>
/// <returns>call success</returns>
public bool RemovePlatinum(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:RemovePlatinum({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("RemovePlatinum", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Removes silver from an email. Requires email to be composing.
/// </summary>
/// <param name="value">the amount of silver to remove</param>
/// <returns>call success</returns>
public bool RemoveSilver(int value)
{
Trace.WriteLine(String.Format("EQ2Mail:RemoveSilver({0})", value.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("RemoveSilver", value.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sends the email. Requires email to be composing.
/// </summary>
/// <returns>call success</returns>
public bool Send()
{
Trace.WriteLine(String.Format("EQ2Mail:Send()"));
return this.ExecuteMethod("Send");
}
#endregion
}
}

View File

@ -0,0 +1,276 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// Represents all of the data available about ISXEQ2 itself
/// </summary>
public class ISXEQ2 : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public ISXEQ2(LavishScriptObject copy) : base(copy) { }
/// <summary>
/// Constructor
/// </summary>
public ISXEQ2() : base(LavishScript.Objects.GetObject("ISXEQ2")) { }
#endregion
#region Members
/// <summary>
/// Indicates whether or not Affliction Events are on or off
/// </summary>
public bool AfflictionEventsOn
{
get
{
Trace.WriteLine(String.Format("ISXEQ2:AfflictionEventsOn"));
return this.GetBoolFromLSO("AfflictionEventsOn");
}
}
/// <summary>
/// Returns the total amount of EQ2Locations in the current zone or all zones
/// </summary>
/// <param name="allZones">show all zones</param>
public int EQ2LocsCount(bool allZones = false)
{
Trace.WriteLine(String.Format("ISXEQ2:EQ2LocsCount"));
return !allZones ? this.GetIntFromLSO("EQ2LocsCount") : this.GetIntFromLSO("EQ2LocsCount", "AllZones");
}
/// <summary>
/// Indicates whether or not Actor Effects are initializing
/// </summary>
public bool InitializingActorEffects
{
get
{
Trace.WriteLine(String.Format("ISXEQ2:InitializingActorEffects"));
return this.GetBoolFromLSO("InitializingActorEffects");
}
}
/// <summary>
/// Cached value of IsReady
/// </summary>
private bool? _isReady;
/// <summary>
/// Returns TRUE when the authentication and patching routines are complete and ISXEQ2 is truly ready.
/// </summary>
public bool IsReady
{
get
{
Trace.WriteLine(String.Format("ISXEQ2:IsReady"));
if(!_isReady.HasValue)
_isReady = this.GetBoolFromLSO("IsReady");
return _isReady.Value;
}
}
/// <summary>
/// Returns a boolean indicating whether or not a key board key is a valid eq2press key
/// </summary>
/// <param name="keyName"></param>
/// <returns>boolean indicating whether or not the key is valid</returns>
public bool IsValidEQ2PressKey(string keyName)
{
Trace.WriteLine(String.Format("ISXEQ2:IsValidEQ2PressKey({0})", keyName));
return this.GetBoolFromLSO("IsValidEQ2PressKey", keyName);
}
/// <summary>
/// Cached value of Version
/// </summary>
private string _version;
/// <summary>
/// The ISXEQ2 version
/// </summary>
public string Version
{
get
{
Trace.WriteLine(String.Format("ISXEQ2:Version"));
return _version ?? (_version = this.GetStringFromLSO("Version"));
}
}
#endregion
#region Methods
/// <summary>
/// Used to add an EQ2Location
/// </summary>
/// <param name="label">EQ2Location label</param>
public bool AddLoc(string label)
{
Trace.WriteLine(String.Format("ISXEQ2:AddLoc({0})", label));
return this.ExecuteMethod("AddLoc", label);
}
/// <summary>
/// Used to add an EQ2Location
/// </summary>
/// <param name="label">EQ2location label</param>
/// <param name="notes">EQ2Location notes</param>
public bool AddLoc(string label, string notes)
{
Trace.WriteLine(String.Format("ISXEQ2:AddLoc({0}, {1})", label, notes));
return this.ExecuteMethod("AddLoc", label, notes);
}
/// <summary>
/// Clears the abilities cache which means it will be rebuilt automatically when abilities are next used
/// </summary>
public bool ClearAbilitiesCache()
{
Trace.WriteLine(String.Format("ISXEQ:ClearAbilitiesCache()"));
return this.ExecuteMethod("ClearAbilitiesCache");
}
/// <summary>
/// Disables Actor Events
/// </summary>
public bool DisableActorEvents()
{
Trace.WriteLine(String.Format("ISXEQ2:DisableActorEvents()"));
return this.ExecuteMethod("DisableActorEvents");
}
/// <summary>
/// Disables Affliction Events
/// </summary>
public bool DisableAfflictionEvents()
{
Trace.WriteLine(String.Format("DisableAfflictionEvents()"));
return this.ExecuteMethod("DisableAfflictionEvents");
}
/// <summary>
/// Enables Actor Events
/// </summary>
public bool EnableActorEvents()
{
Trace.WriteLine(String.Format("ISXEQ2:EnableActorEvents()"));
return this.ExecuteMethod("EnableActorEvents");
}
/// <summary>
/// Enables Affliction Events
/// </summary>
public bool EnableAfflictionEvents()
{
Trace.WriteLine(String.Format("ISXEQ2:EnableAfflictionEvents()"));
return this.ExecuteMethod("EnableAfflictionEvents");
}
/// <summary>
/// Used to enable or disable Enduring Breath
/// </summary>
/// <param name="benefits">Enable or Disable</param>
public bool EnduringBreath(BenefitToggle benefits)
{
Trace.WriteLine(String.Format("ISXEQ2:EnduringBreath({0})", benefits.ToString()));
return this.ExecuteMethod("EnduringBreath", benefits.ToString());
}
/// <summary>
/// Used to Enable or Disable No Fog
/// </summary>
/// <param name="benefits">Enable or Disable</param>
public bool NoFog(BenefitToggle benefits)
{
Trace.WriteLine(String.Format("ISXEQ2:NoFog({0})", benefits.ToString()));
return this.ExecuteMethod("NoFog", benefits.ToString());
}
/// <summary>
/// Creates an ISXEQ2 popup window (LGUI window). Title and Status are optional.
/// </summary>
/// <param name="args">Title and/or Status</param>
public bool Popup(params string[] args)
{
Trace.WriteLine("ISXEQ2:Popup({0})", String.Join(" ", args));
return this.ExecuteMethod("Popup", args);
}
/// <summary>
/// This should be called in your script before doing any calls to the vendingcontainer datatype
/// that would be occurring after any user manipulation of the system within the game.
/// </summary>
public bool ResetInternalVendingSystem()
{
Trace.WriteLine(String.Format("ISXEQ2:ResetInternalVendingSystem()"));
return this.ExecuteMethod("ResetInternalVendingSystem");
}
/// <summary>
/// Sets the range for Actor events
/// </summary>
/// <param name="range">range</param>
public bool SetActorEventsRange(float range)
{
Trace.WriteLine(String.Format("ISXEQ2:SetActorEventsRange({0})",
range.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetActorEventsRange", range.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sets the time interval used to check for Actor events
/// </summary>
/// <param name="time">time in ms</param>
public bool SetActorEventsTimeInterval(float time)
{
Trace.WriteLine(String.Format("ISXEQ2:SetActorEventsTimeInterval({0})",
time.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetActorEventsTimeInterval", time.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Sets the time period used to check for Affliction events
/// </summary>
/// <param name="time">time in ms</param>
public bool SetAfflictionEventsTimeInterval(int time)
{
Trace.WriteLine(String.Format("ISXEQ2:SetAfflictionEventsTimeInterval({0})",
time.ToString(CultureInfo.InvariantCulture)));
return ExecuteMethod("SetAfflictionEventsTimeInterval", time.ToString(CultureInfo.InvariantCulture));
}
#endregion
#region Enums
/// <summary>
/// Enum used as argument to toggle certain client based effects on or off
/// </summary>
public enum BenefitToggle
{
/// <summary>
/// Enable
/// </summary>
Enable,
/// <summary>
/// Disable
/// </summary>
Disable
}
#endregion
}
}

View File

@ -0,0 +1,600 @@
using System;
using System.Diagnostics;
using System.Globalization;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// This DataType includes all of the data available through ISXEQ2 that is related to your radar.
/// </summary>
public class Radar : LavishScriptObject
{
#region Construct
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Radar(LavishScriptObject copy) : base(copy) { }
#endregion
#region Members
/// <summary>
/// True if text clipping is on
/// </summary>
public bool ClippingTextOn
{
get
{
Trace.WriteLine(String.Format("Radar:ClippingTextOn"));
return this.GetBoolFromLSO("ClippingTextOn");
}
}
/// <summary>
/// True if radius clipping is on
/// </summary>
public bool ClipRadiusOn
{
get
{
Trace.WriteLine(String.Format("Radar:ClipRadiusOn"));
return this.GetBoolFromLSO("ClipRadiusOn");
}
}
/// <summary>
/// True if labels are colorized
/// </summary>
public bool ColorizingLabels
{
get
{
Trace.WriteLine(String.Format("Radar:ColorizingLabels"));
return this.GetBoolFromLSO("ColorizingLabels");
}
}
/// <summary>
/// Returns the filter at the selected index
/// </summary>
/// <param name="index">the index</param>
/// <returns>custom filter</returns>
public string CustomFilter(int index)
{
Trace.WriteLine(String.Format("Radar:CustomFilter"));
return this.GetStringFromLSO("CustomFilter", index.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// A list of the custom filters in effect
/// </summary>
public string CustomFiltersList
{
get
{
Trace.WriteLine(String.Format("Radar:CustomFiltersList"));
return this.GetStringFromLSO("CustomFiltersList");
}
}
/// <summary>
/// The name of the object on the radar
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Radar:Name"));
return this.GetStringFromLSO("Name");
}
}
/// <summary>
/// Returns the number of filters active on the radar
/// </summary>
public int NumCustomFilters
{
get
{
Trace.WriteLine(String.Format("Radar:NumCustomFilters"));
return this.GetIntFromLSO("NumCustomFilters");
}
}
/// <summary>
/// True if radar rotation is on
/// </summary>
public bool RotationOn
{
get
{
Trace.WriteLine(String.Format("Radar:RotationOn"));
return this.GetBoolFromLSO("RotationOn");
}
}
/// <summary>
/// True if the radar is displaying Aggro NPCs
/// </summary>
public bool ShowingAggroNPCs
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingAggroNPCs"));
return this.GetBoolFromLSO("ShowingAggroNPCs");
}
}
/// <summary>
/// True if the radar is displating chests
/// </summary>
public bool ShowingChests
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingChests"));
return this.GetBoolFromLSO("ShowingChests");
}
}
/// <summary>
/// True if the radar is displaying corpses
/// </summary>
public bool ShowingCorpses
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingCorpses"));
return this.GetBoolFromLSO("ShowingCorpses");
}
}
/// <summary>
/// True if the radar is showing doors
/// </summary>
public bool ShowingDoors
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingDoors"));
return this.GetBoolFromLSO("ShowingDoors");
}
}
/// <summary>
/// True if the radar is showing labels
/// </summary>
public bool ShowingLabels
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingLabels"));
return this.GetBoolFromLSO("ShowingLabels");
}
}
/// <summary>
/// True if the radar is showing the client
/// </summary>
public bool ShowingMe
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingMe"));
return this.GetBoolFromLSO("ShowingMe");
}
}
/// <summary>
/// True if Showing Mercenaries
/// </summary>
public bool ShowingMercenaries
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingMercenaries"));
return this.GetBoolFromLSO("ShowingMercenaries");
}
}
/// <summary>
/// True if the radar is displaying client's pet
/// </summary>
public bool ShowingMyPet
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingMyPet"));
return this.GetBoolFromLSO("ShowingMyPet");
}
}
/// <summary>
/// True if the radar is showing Named NPCs
/// </summary>
public bool ShowingNamedNPCs
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingNamedNPCs"));
return this.GetBoolFromLSO("ShowingNamedNPCs");
}
}
/// <summary>
/// True if the radar is displaying NPCs that cannot be attacked
/// </summary>
public bool ShowingNoKillNPCs
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingNoKillNPCs"));
return this.GetBoolFromLSO("ShowingNoKillNPCs");
}
}
/// <summary>
/// True if the radar is showing NPCs
/// </summary>
public bool ShowingNPCs
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingNPCs"));
return this.GetBoolFromLSO("ShowingNPCs");
}
}
/// <summary>
/// True if the radar is displaying PCs
/// </summary>
public bool ShowingPCs
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingPCs"));
return this.GetBoolFromLSO("ShowingPCs");
}
}
/// <summary>
/// True if the radar is displaying pets
/// </summary>
public bool ShowingPets
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingPets"));
return this.GetBoolFromLSO("ShowingPets");
}
}
/// <summary>
/// True if the radar is showing Resources
/// </summary>
public bool ShowingResources
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingResources"));
return this.GetBoolFromLSO("ShowingResources");
}
}
/// <summary>
/// True if the radar is showing Specials
/// </summary>
public bool ShowingSpecials
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingSpecials"));
return this.GetBoolFromLSO("ShowingSpecials");
}
}
/// <summary>
/// True if the radar is displaying Tradeskill units
/// </summary>
public bool ShowingTSUnits
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingTSUnits"));
return this.GetBoolFromLSO("ShowingTSUnits");
}
}
/// <summary>
/// True if the radar is displaying unknowns
/// </summary>
public bool ShowingUnknowns
{
get
{
Trace.WriteLine(String.Format("Radar:ShowingUnknowns"));
return this.GetBoolFromLSO("ShowingUnknowns");
}
}
/// <summary>
/// The value used for "zooming"
/// </summary>
public int Size
{
get
{
Trace.WriteLine(String.Format("Radar:Size"));
return this.GetIntFromLSO("Size");
}
}
/// <summary>
/// True if Y Axis Clipping is on
/// </summary>
public bool YAxisClippingOn
{
get
{
Trace.WriteLine(String.Format("Radar:YAvisClippingOn"));
return this.GetBoolFromLSO("YAxisClippingOn");
}
}
#endregion
#region Methods
/// <summary>
/// Toggles the custom filter "Clip Radius"
/// </summary>
/// <returns>call success</returns>
public bool ClipRadius()
{
Trace.WriteLine(String.Format("Radar:ClipRadius()"));
return this.ExecuteMethod("ClipRadius");
}
/// <summary>
/// Toggles the custom filter "Show Text"
/// </summary>
/// <returns>call success</returns>
public bool ClipText()
{
Trace.WriteLine(String.Format("Radar:ClipText()"));
return this.ExecuteMethod("ClipText");
}
/// <summary>
/// Toggles the custom filter "Show Con Color"
/// </summary>
/// <returns>call success</returns>
public bool ColorizeLabels()
{
Trace.WriteLine(String.Format("Radar:ColorizeLabels()"));
return this.ExecuteMethod("ColorizeLabels");
}
/// <summary>
/// Toggles the custom filter "Show Aggro"
/// </summary>
/// <returns>call success</returns>
public bool FilterAggroNPCs()
{
Trace.WriteLine(String.Format("Radar:FilterAggroNPCs()"));
return this.ExecuteMethod("FilterAggroNPCs");
}
/// <summary>
/// Toggles the custom filter "Show Chests"
/// </summary>
/// <returns>call success</returns>
public bool FilterChests()
{
Trace.WriteLine(String.Format("Radar:FilterChests()"));
return this.ExecuteMethod("FilterChests");
}
/// <summary>
/// Toggles the custom filter "Show Corpses"
/// </summary>
/// <returns>call success</returns>
public bool FilterCorpses()
{
Trace.WriteLine(String.Format("Radar:FilterCorpses()"));
return this.ExecuteMethod("FilterCorpses");
}
/// <summary>
/// Toggles the custom filter "Show Doors"
/// </summary>
/// <returns>call success</returns>
public bool FilterDoors()
{
Trace.WriteLine(String.Format("Radar:FilterDoors()"));
return this.ExecuteMethod("FilterDoors");
}
/// <summary>
/// Toggles the custom filter "Show Me"
/// </summary>
/// <returns>call success</returns>
public bool FilterMe()
{
Trace.WriteLine(String.Format("Radar:FilterMe()"));
return this.ExecuteMethod("FilterMe");
}
/// <summary>
/// Toggle the "Show Mercenaries" filter
/// </summary>
/// <returns>call success</returns>
public bool FilterMercenaries()
{
Trace.WriteLine(String.Format("Radar:FilterMercenaries()"));
return this.ExecuteMethod("FilterMercenaries");
}
/// <summary>
/// Toggles the custom filter "Show My Pet"
/// </summary>
/// <returns>call success</returns>
public bool FilterMyPet()
{
Trace.WriteLine(String.Format("Radar:FilterMyPet()"));
return this.ExecuteMethod("FilterMyPet");
}
/// <summary>
/// Toggles the custom filter "Show Named"
/// </summary>
/// <returns>call success</returns>
public bool FilterNamedNPCs()
{
Trace.WriteLine(String.Format("Radar:FilterNamedNPCs()"));
return this.ExecuteMethod("FilterNamedNPCs");
}
/// <summary>
/// Toggles the "Show NoKillNPCs" filter
/// </summary>
/// <returns>call success</returns>
public bool FilterNoKillNPCs()
{
Trace.WriteLine(String.Format("Radar:FilterNoKillNPCs()"));
return this.ExecuteMethod("FilterNoKillNPCs");
}
/// <summary>
/// Toggles the custom filter "Show NPCs"
/// </summary>
/// <returns>call success</returns>
public bool FilterNPCs()
{
Trace.WriteLine(String.Format("Radar:FilterNPCs()"));
return this.ExecuteMethod("FilterNPCs");
}
/// <summary>
/// Toggles the custom filter "Show PCs"
/// </summary>
/// <returns>call success</returns>
public bool FilterPCs()
{
Trace.WriteLine(String.Format("Radar:FilterNPCs()"));
return this.ExecuteMethod("FilterPCs");
}
/// <summary>
/// Toggles the custom filter "Show Pets"
/// </summary>
/// <returns>call success</returns>
public bool FilterPets()
{
Trace.WriteLine(String.Format("Radar:FilterPets()"));
return this.ExecuteMethod("FilterPets");
}
/// <summary>
/// Toggles the custom filter "Show Resources"
/// </summary>
/// <returns>call success</returns>
public bool FilterResources()
{
Trace.WriteLine(String.Format("Radar:FilterResources()"));
return this.ExecuteMethod("FilterResources");
}
/// <summary>
/// Toggles the custom filter "Show Specials"
/// </summary>
/// <returns>call success</returns>
public bool FilterSpecials()
{
Trace.WriteLine(String.Format("Radar:FilterSpecials()"));
return this.ExecuteMethod("FilterSpecials");
}
/// <summary>
/// Toggles the custom filter "Show Tradeskill"
/// </summary>
/// <returns>call success</returns>
public bool FilterTSUnits()
{
Trace.WriteLine(String.Format("Radar:FilterTSUnits()"));
return this.ExecuteMethod("FilterTSUnits");
}
/// <summary>
/// Toggles the custom filter "Show Unknowns"
/// </summary>
/// <returns>call success</returns>
public bool FilterUnknowns()
{
Trace.WriteLine(String.Format("Radar:FilterUnknowns()"));
return this.ExecuteMethod("FilterUnknowns");
}
/// <summary>
/// Toggles radar rotation
/// </summary>
/// <returns>call success</returns>
public bool Rotation()
{
Trace.WriteLine(String.Format("Radar:Rotation()"));
return this.ExecuteMethod("Rotation");
}
/// <summary>
/// Used to toggle a specific custom filter
/// </summary>
/// <param name="filter">The selected filter to toggle</param>
/// <returns>call success</returns>
public bool SetCustomFilter(string filter)
{
Trace.WriteLine(String.Format("Radar:SetCustomFilter({0})", filter));
return this.ExecuteMethod("SetCustomFilter", filter);
}
/// <summary>
/// Sets the "zoom" of the radar
/// </summary>
/// <param name="size">the new zoom</param>
/// <returns>call success</returns>
public bool SetSize(int size)
{
Trace.WriteLine(String.Format("Radar:SetSize({0})", size.ToString(CultureInfo.InvariantCulture)));
return this.ExecuteMethod("SetSize", size.ToString(CultureInfo.InvariantCulture));
}
/// <summary>
/// Toggles the custom filter "Show Labels"
/// </summary>
/// <returns>call success</returns>
public bool ShowLabels()
{
Trace.WriteLine(String.Format("Radar:ShowLabels()"));
return this.ExecuteMethod("ShowLabels");
}
/// <summary>
/// Toggles the custom filter "Y-axis Clipping"
/// </summary>
/// <returns>call success</returns>
public bool YAxisClipping()
{
Trace.WriteLine(String.Format("Radar:YAxisClipping()"));
return this.ExecuteMethod("YAxisClipping");
}
#endregion
}
}

View File

@ -0,0 +1,89 @@
using System;
using System.Diagnostics;
using LavishScriptAPI;
using MRBot.IsxEq2.Helpers;
namespace MRBot.IsxEq2.Utility
{
/// <summary>
/// This DataType includes all of the data available to ISXEQ2 that is related to the current zone.
/// </summary>
public class Zone : LavishScriptObject
{
#region Constructor
/// <summary>
/// Constructor
/// </summary>
/// <param name="copy">LS Object</param>
public Zone(LavishScriptObject copy) : base(copy) { }
/// <summary>
/// Constructor - Constructs a Zone object based on the LavishScript object Zone
/// </summary>
public Zone() : base(LavishScript.Objects.GetObject("Zone")) { }
#endregion
#region Members
/// <summary>
/// Cache of ID
/// </summary>
private int? _iD;
/// <summary>
/// The ID of the zone
/// </summary>
public int ID
{
get
{
Trace.WriteLine(String.Format("Zone:ID"));
if(!_iD.HasValue)
_iD = this.GetIntFromLSO("ID");
return _iD.Value;
}
}
/// <summary>
/// Cache of Name
/// </summary>
private string _name;
/// <summary>
/// The name of the zone
/// </summary>
public string Name
{
get
{
Trace.WriteLine(String.Format("Zone:Name"));
return _name ?? (_name = this.GetStringFromLSO("Name"));
}
}
/// <summary>
/// Cache of ShortName
/// </summary>
private string _shortName;
/// <summary>
/// The short name of the zone
/// </summary>
public string ShortName
{
get
{
Trace.WriteLine(String.Format("Zone:ShortName"));
return _shortName ?? (_shortName = this.GetStringFromLSO("ShortName"));
}
}
#endregion
}
}

170
MRBot/MRBot.csproj Normal file
View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MRBot</RootNamespace>
<AssemblyName>MRBot</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32bit>false</Prefer32bit>
<OutputPath>bin\x64\Release\</OutputPath>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32bit>false</Prefer32bit>
<OutputPath>bin\x64\Debug\</OutputPath>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<StartupObject/>
</PropertyGroup>
<ItemGroup>
<Reference Include="Lavish.InnerSpace">
<HintPath>..\..\..\..\..\Games\InnerSpace\Lavish.InnerSpace.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp"/>
<Reference Include="mscorlib"/>
<Reference Include="System"/>
<Reference Include="System.ComponentModel.DataAnnotations"/>
<Reference Include="System.Core"/>
<Reference Include="System.Data"/>
<Reference Include="System.Numerics"/>
<Reference Include="System.Runtime"/>
<Reference Include="System.Xml"/>
<Reference Include="Microsoft.Extensions.Hosting.Abstractions"/>
</ItemGroup>
<ItemGroup>
<Compile Include="Api\BotApi.cs"/>
<Compile Include="Bot\AbilityExporter\ExportableAbilityEffect.cs"/>
<Compile Include="Bot\AbilityExporter\ExportableAbility.cs"/>
<Compile Include="Bot\AbilityExporter\AbilityExporter.cs"/>
<Compile Include="Bot\AbilityExporter\AbilityList.cs"/>
<Compile Include="Extensions\StringExtensionMethods.cs"/>
<Compile Include="InnerspaceLogRender.cs"/>
<Compile Include="IsxEq2\AbilityEffect\Ability.cs"/>
<Compile Include="IsxEq2\AbilityEffect\AbilityEffect.cs"/>
<Compile Include="IsxEq2\AbilityEffect\Achievement.cs"/>
<Compile Include="IsxEq2\AbilityEffect\Class.cs"/>
<Compile Include="IsxEq2\AbilityEffect\Effect.cs"/>
<Compile Include="IsxEq2\AbilityEffect\Maintained.cs"/>
<Compile Include="IsxEq2\CharacterActor\Actor.cs"/>
<Compile Include="IsxEq2\CharacterActor\Character.cs"/>
<Compile Include="IsxEq2\CharacterActor\GroupMember.cs"/>
<Compile Include="IsxEq2\Events\EQ2Event.cs"/>
<Compile Include="IsxEq2\Extension.cs"/>
<Compile Include="IsxEq2\Extensions\LavishScriptObjectExtensions.cs"/>
<Compile Include="IsxEq2\Helpers\LavishScriptObjectExtensions.cs"/>
<Compile Include="IsxEq2\Helpers\Utils.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\BrokerWindow.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\Consignment.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\ContainerWindow.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\ContainerWindowItem.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\Item.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\ItemInfo.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\ItemModifier.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\Merchandise.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\VendingContainer.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\Vendor.cs"/>
<Compile Include="IsxEq2\InventoryConsignment\VendorItem.cs"/>
<Compile Include="IsxEq2\Recipe\Component.cs"/>
<Compile Include="IsxEq2\Recipe\Recipe.cs"/>
<Compile Include="IsxEq2\UI\ChoiceWindow.cs"/>
<Compile Include="IsxEq2\UI\EQ2Widget.cs"/>
<Compile Include="IsxEq2\UI\EQ2Window.cs"/>
<Compile Include="IsxEq2\UI\ExamineItemWindow.cs"/>
<Compile Include="IsxEq2\UI\LootWindow.cs"/>
<Compile Include="IsxEq2\UI\ReplyDialog.cs"/>
<Compile Include="IsxEq2\UI\RewardWindow.cs"/>
<Compile Include="IsxEq2\Utility\EQ2.cs"/>
<Compile Include="IsxEq2\Utility\EQ2Location.cs"/>
<Compile Include="IsxEq2\Utility\EQ2Mail.cs"/>
<Compile Include="IsxEq2\Utility\ISXEQ2.cs"/>
<Compile Include="IsxEq2\Utility\Radar.cs"/>
<Compile Include="IsxEq2\Utility\Zone.cs"/>
<Compile Include="Navigation\Location.cs"/>
<Compile Include="Navigation\MrNavigation.cs"/>
<Compile Include="PassiveTasks\FollowTask.cs"/>
<Compile Include="PassiveTasks\IPassiveTask.cs"/>
<Compile Include="PassiveTasks\PassiveTaskList.cs"/>
<Compile Include="Program.cs"/>
<Compile Include="Properties\AssemblyInfo.cs"/>
<Compile Include="SampledProfiler.cs"/>
<Compile Include="Services\CommandProcessor.cs"/>
<Compile Include="Services\PassiveTaskManager.cs"/>
<Compile Include="Services\WindowManagerService.cs"/>
<Compile Include="UI\IWindow.cs"/>
<Compile Include="UI\MainWindow.cs"/>
<Compile Include="UI\SettingsWindow.cs"/>
<Compile Include="UI\WindowNames.cs"/>
</ItemGroup>
<ItemGroup>
<Content Include="IsxEq2\bin\Debug\ISXEQ2Wrapper.dll"/>
<Content Include="IsxEq2\bin\Debug\ISXEQ2Wrapper.pdb"/>
<Content Include="IsxEq2\bin\Debug\ISXEQ2Wrapper.xml"/>
</ItemGroup>
<ItemGroup>
<None Include="App.config"/>
<None Include="IsxEq2\bin\Debug\PostBuild.bat"/>
<None Include="IsxEq2\bin\Release\PostBuild.bat"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting">
<Version>8.0.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions">
<Version>8.0.0</Version>
</PackageReference>
<PackageReference Include="MiniProfiler">
<Version>4.3.8</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.3</Version>
</PackageReference>
<PackageReference Include="System.Memory">
<Version>4.5.5</Version>
</PackageReference>
<PackageReference Include="System.Runtime.CompilerServices.Unsafe">
<Version>6.0.0</Version>
</PackageReference>
<PackageReference Include="TinyIpc">
<Version>4.2.0</Version>
</PackageReference>
<PackageReference Include="TinyLogger">
<Version>1.9.0</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="AfterBuild">
<ItemGroup>
<SourceFiles Include="$(TargetDir)*.*"/>
</ItemGroup>
<Copy SourceFiles="@(SourceFiles)" DestinationFolder="$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\App Paths\InnerSpace.exe@Path)\.NET Programs" SkipUnchangedFiles="true"/>
</Target>
</Project>

6
MRBot/MRBot.csproj.user Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,45 @@
using System;
namespace MRBot.Navigation;
internal class Location
{
public double X { get; private set; }
public double Y { get; private set; }
public double Z { get; private set; }
public Location(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public void Set(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public float AngleTo(Location target)
{
double deltaX = X - target.X;
double deltaZ = Z - target.Z;
// Calculate the angle in radians using Math.Atan2
double angleRad = Math.Atan2(deltaX, deltaZ);
// Convert radians to degrees
float angleDegrees = (float)(angleRad * (180.0 / Math.PI));
// Ensure the angle is in the range [0, 360)
if (angleDegrees < 0)
{
angleDegrees += 360;
}
return angleDegrees;
}
}

View File

@ -0,0 +1,89 @@
using System;
using LavishScriptAPI;
using Microsoft.Extensions.Logging;
using MRBot.IsxEq2;
using StackExchange.Profiling;
namespace MRBot.Navigation;
internal class MrNavigation
{
private const string AutoRunKey = "num lock";
private readonly ILogger<MrNavigation> _logger;
private readonly MiniProfiler _profiler;
public MrNavigation(ILogger<MrNavigation> logger, MiniProfiler profiler)
{
_logger = logger;
//_profiler = profiler;
}
private float AngleTo(double startingX, double startingZ, double targetX, double targetZ)
{
var deltaX = startingX - targetX;
var deltaZ = startingZ - targetZ;
// Calculate the angle in radians using Math.Atan2
double angleRad;
// using (_profiler.Step("MrNavigation.AngleTo.Math.Atan2"))
{
angleRad = Math.Atan2(deltaX, deltaZ);
}
// Convert radians to degrees
float angleDegrees;
// using (_profiler.Step("MrNavigation.AngleTo.ConvertRadiansToDegrees"))
{
angleDegrees = (float)(angleRad * (180.0 / Math.PI));
}
// using (_profiler.Step("MrNavigation.AngleTo.EnsureAngleIsInRange"))
{
// Ensure the angle is in the range [0, 360)
if (angleDegrees < 0) angleDegrees += 360;
}
return angleDegrees;
}
public void RunTowardsPoint(double targetX, double targetZ)
{
// using (_profiler.Step("MrNavigation.RunTowardsPoint"))
{
float angle;
// using (_profiler.Step("MrNavigation.RunTowardsPoint.AngleTo"))
{
angle = AngleTo(Extension.Me.Loc.X, Extension.Me.Loc.Z, targetX, targetZ);
}
// using (_profiler.Step("MrNavigation.RunTowardsPoint.Face"))
{
Extension.Me.Face(angle);
}
}
// using (_profiler.Step("MrNavigation.RunTowardsPoint.CheckIfMoving"))
{
if (Extension.Me.IsMoving) return;
}
// using (_profiler.Step("Logging navigation start"))
{
_logger.LogInformation("Starting navigation to ({targetX}, {targetZ})", targetX, targetZ);
}
// using (_profiler.Step("MrNavigation.RunTowardsPoint.Start"))
{
LavishScript.ExecuteCommand($"press \"{AutoRunKey}\"");
}
}
public void Stop()
{
if (!Extension.Me.IsMoving) return;
_logger.LogInformation("Stopping navigation");
LavishScript.ExecuteCommand($"press \"{AutoRunKey}\"");
}
}

View File

@ -0,0 +1,89 @@
using LavishVMAPI;
using Microsoft.Extensions.Logging;
using MRBot.IsxEq2;
using MRBot.IsxEq2.CharacterActor;
using MRBot.Navigation;
using StackExchange.Profiling;
namespace MRBot.PassiveTasks;
internal sealed class FollowTask : IPassiveTask
{
private const int LeashDistance = 70;
private const uint PulseRate = 5;
private readonly int _followTargetId;
private readonly ILogger<FollowTask> _logger;
private readonly MrNavigation _mrNavigation;
private readonly MiniProfiler _profiler;
private uint _pulseCount;
public FollowTask(
string targetName,
MrNavigation mrNavigation,
ILogger<FollowTask> logger,
MiniProfiler profiler)
{
_mrNavigation = mrNavigation;
_logger = logger;
_profiler = profiler;
using (new FrameLock())
{
_followTargetId = Extension.Actor("Name", targetName).ID;
}
}
private bool ShouldPulse
{
get
{
if (_pulseCount < PulseRate)
{
_pulseCount++;
return false;
}
_logger.LogInformation("Pulsing");
_pulseCount = 0;
return true;
}
}
public TaskType Type => TaskType.Follow;
public void Execute()
{
_logger.LogInformation("Executing follow task");
// using (_profiler.Step("FollowTask.Execute"))
{
Actor followTarget;
// using (_profiler.Step("FollowTask.Execute.GetFollowTarget"))
{
followTarget = Extension.Actor(_followTargetId);
}
// using (_profiler.Step("FollowTask.Execute.CheckFollowTargetIsValid"))
{
if (!followTarget.IsValid)
{
_logger.LogWarning("Follow target is invalid");
return;
}
}
if (followTarget.Distance is > 5 and < LeashDistance)
// using (_profiler.Step("FollowTask.Execute.RunTowardsPoint"))
{
_logger.LogInformation("Navigating to target ({targetX}, {targetZ})",
followTarget.Loc.X, followTarget.Loc.Z);
_mrNavigation.RunTowardsPoint(followTarget.Loc.X, followTarget.Loc.Z);
}
else
// using (_profiler.Step("FollowTask.Execute.Stop"))
{
_logger.LogInformation("Stopping navigation");
_mrNavigation.Stop();
}
}
}
}

View File

@ -0,0 +1,12 @@
namespace MRBot.PassiveTasks;
internal enum TaskType
{
Follow
}
internal interface IPassiveTask
{
TaskType Type { get; }
public void Execute();
}

View File

@ -0,0 +1,48 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
namespace MRBot.PassiveTasks;
internal interface IPassiveTaskList : IEnumerable<IPassiveTask>
{
public void AddTask(IPassiveTask task);
public void RemoveTask(IPassiveTask task);
}
internal sealed class PassiveTaskList : IPassiveTaskList
{
private readonly ILogger<PassiveTaskList> _logger;
private readonly ConcurrentDictionary<TaskType, IPassiveTask> _tasks;
public PassiveTaskList(ILogger<PassiveTaskList> logger)
{
_logger = logger;
_tasks = new ConcurrentDictionary<TaskType, IPassiveTask>();
}
public void AddTask(IPassiveTask task)
{
_logger.LogInformation($"Adding task {Enum.GetName(typeof(TaskType), task.Type)}");
_tasks[task.Type] = task;
}
public void RemoveTask(IPassiveTask task)
{
_logger.LogInformation($"Removing task {Enum.GetName(typeof(TaskType), task.Type)}");
_tasks.TryRemove(task.Type, out _);
}
public IEnumerator<IPassiveTask> GetEnumerator()
{
return _tasks.Values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

88
MRBot/Program.cs Normal file
View File

@ -0,0 +1,88 @@
#nullable enable
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using InnerSpaceAPI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MRBot.Api;
using MRBot.Navigation;
using MRBot.PassiveTasks;
using MRBot.Services;
using MRBot.UI;
using StackExchange.Profiling;
using TinyLogger;
namespace MRBot;
internal class Program
{
public static async Task Main(string[] args)
{
var bindingRedirects = new Dictionary<string, Assembly>
{
{
"System.Runtime.CompilerServices.Unsafe",
typeof(Unsafe).Assembly
},
{
"System.Buffers",
typeof(ArrayPool<>).Assembly
},
{
"System.Memory",
typeof(IBufferWriter<>).Assembly
}
}
.ToImmutableDictionary();
// Binding redirects don't seem to work, so we'll do it manually
AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) =>
{
var assemblyName = eventArgs.Name.Split(',')[0];
return !bindingRedirects.TryGetValue(assemblyName, out var redirect) ? null : redirect;
};
var profiler = MiniProfiler.StartNew("MRBot");
var host = Host.CreateDefaultBuilder(args)
.ConfigureLogging(builder =>
{
builder.AddTinyLogger(options =>
{
options.Template = "[{timestamp_utc}] {logLevel_short}: {message} {exception_message}{newLine}";
options.AddRollingFile(() => $"mrbot-{DateTime.Now:yyyMMdd}.log");
options.Renderers.Add(new InnerspaceLogRenderer());
});
})
.ConfigureServices(services =>
{
services.AddTinyIpc(options => { options.Name = "EC1B8F23-6464-4FD6-9DE9-E9D252E29310"; });
services.AddSingleton<IWindow, MainWindow>();
services.AddSingleton<IWindow, SettingsWindow>();
services.AddSingleton<IPassiveTaskList, PassiveTaskList>();
services.AddSingleton<FollowTask>();
services.AddSingleton<BotApi>();
services.AddSingleton<MrNavigation>();
services.AddSingleton<SampledProfiler>(_ => new SampledProfiler(TimeSpan.FromSeconds(5)));
services.AddHostedService<WindowManagerService>();
services.AddHostedService<PassiveTaskManager>();
services.AddSingleton<MiniProfiler>(_ =>
(profiler ?? MiniProfiler.StartNew("MRBot")) ?? throw new InvalidOperationException());
//services.AddHostedService<CommandProcessor>();
})
.Build();
await host.RunAsync();
var profilerOutput = profiler?.RenderPlainText();
if (profilerOutput != null) InnerSpace.Echo(profilerOutput);
}
}

View File

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MRBot")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MRBot")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("31F53DCC-5E73-4733-A4C3-8EC5AA5CE96F")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

93
MRBot/SampledProfiler.cs Normal file
View File

@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.Extensions.Logging;
namespace MRBot;
internal interface ISegmentProfiler : IDisposable
{
public string SegmentName { get; }
public TimeSpan GetElapsed();
}
internal class NoOpProfiler : ISegmentProfiler
{
public string SegmentName => "NoOpProfiler";
public TimeSpan GetElapsed()
{
return TimeSpan.Zero;
}
public void Dispose()
{
}
}
internal class SegmentProfiler : ISegmentProfiler
{
private readonly Stopwatch _profilingTimer;
public SegmentProfiler(string segmentName)
{
SegmentName = segmentName;
_profilingTimer = new Stopwatch();
_profilingTimer.Start();
}
public string SegmentName { get; }
public TimeSpan GetElapsed()
{
return _profilingTimer.Elapsed;
}
public void Dispose()
{
if (_profilingTimer.IsRunning) _profilingTimer.Stop();
}
}
internal class SampledProfiler
{
private readonly TimeSpan _profilingInterval;
private readonly List<SegmentProfiler> _segments = new();
private DateTime _lastProfiledTime = DateTime.MinValue;
public SampledProfiler(TimeSpan profilingInterval)
{
_profilingInterval = profilingInterval;
}
private bool ShouldProfile => DateTime.Now.Subtract(_lastProfiledTime) > _profilingInterval;
public ISegmentProfiler StartSegment(string segmentName)
{
if (!ShouldProfile) return new NoOpProfiler();
_lastProfiledTime = DateTime.Now;
var segment = new SegmentProfiler(segmentName);
_segments.Add(segment);
return segment;
}
public void Stop()
{
_segments.ForEach(s => s.Dispose());
}
public void Log(ILogger logger)
{
foreach (var segment in _segments)
logger.LogCritical($"Segment {segment.SegmentName} took {segment.GetElapsed()}");
_segments.Clear();
}
public void Dispose()
{
_segments.Clear();
}
}

View File

@ -0,0 +1,46 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using LavishVMAPI;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using TinyIpc.DependencyInjection;
namespace MRBot.Services
{
internal sealed class CommandProcessor : BackgroundService
{
private readonly ITinyIpcFactory _tinyIpcFactory;
private readonly ILogger<CommandProcessor> _logger;
public CommandProcessor(ITinyIpcFactory tinyIpcFactory, ILogger<CommandProcessor> logger)
{
_tinyIpcFactory = tinyIpcFactory;
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting command processor");
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var tinyIpcInstance = _tinyIpcFactory.CreateInstance();
try
{
await foreach (var message in tinyIpcInstance.MessageBus.SubscribeAsync(stoppingToken))
{
if(stoppingToken.IsCancellationRequested) return;
_logger.LogInformation($"Received message: {message}");
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
}

View File

@ -0,0 +1,92 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using LavishVMAPI;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MRBot.PassiveTasks;
using StackExchange.Profiling;
namespace MRBot.Services;
internal sealed class PassiveTaskManager : BackgroundService
{
private const uint PulseRate = 10;
private readonly ILogger<PassiveTaskManager> _logger;
private readonly IPassiveTaskList _passiveTaskList;
private readonly MiniProfiler _profiler;
private DateTime _lastLogTime = DateTime.MinValue;
private uint _pulseCount;
public PassiveTaskManager(IPassiveTaskList passiveTaskList, ILogger<PassiveTaskManager> logger,
MiniProfiler profiler)
{
_passiveTaskList = passiveTaskList;
_logger = logger;
_profiler = profiler;
}
private bool ShouldPulse
{
get
{
if (_pulseCount >= PulseRate)
{
_pulseCount = 0;
return true;
}
_pulseCount++;
return false;
}
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting passive task manager");
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Stopping passive task manager");
return base.StopAsync(cancellationToken);
}
private Task ServiceLoopAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if (!ShouldPulse) continue;
// using (_profiler.Step("PassiveTaskManager.ServiceLoopAsync"))
{
foreach (var task in _passiveTaskList)
{
if (stoppingToken.IsCancellationRequested) return Task.FromCanceled(stoppingToken);
_logger.LogInformation($"Pulsing task {task.Type}");
// using (_profiler.Step($"FrameLock.{task.Type}"))
using (new FrameLock(true))
{
task.Execute();
}
}
}
Thread.Sleep(500);
}
return Task.CompletedTask;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
return Task.Factory.StartNew(async () => { await ServiceLoopAsync(stoppingToken); }, stoppingToken,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
public override void Dispose()
{
_logger.LogInformation("Disposing passive task manager");
base.Dispose();
}
}

View File

@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using LavishScriptAPI;
using LavishVMAPI;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MRBot.UI;
namespace MRBot.Services;
internal sealed class WindowManagerService : BackgroundService
{
private readonly IHostApplicationLifetime _applicationLifetime;
private readonly ILogger<WindowManagerService> _logger;
private readonly List<IWindow> _activeWindows = new();
private readonly List<IWindow> _inactiveWindows;
public WindowManagerService(IEnumerable<IWindow> windows, IHostApplicationLifetime applicationLifetime, ILogger<WindowManagerService> logger)
{
_applicationLifetime = applicationLifetime;
_logger = logger;
_inactiveWindows = windows.ToList();
}
private void RemoveWindow(object sender, LSEventArgs args)
{
var window = sender as IWindow;
if(window == null) return;
_activeWindows.Remove(window);
_inactiveWindows.Add(window);
window.Hide();
window?.Dispose();
if (_activeWindows.Count == 0)
{
_applicationLifetime.StopApplication();
}
}
private void OpenWindow(string windowName)
{
var window = _inactiveWindows.FirstOrDefault(w => w.Name == windowName);
if (window == null) return;
_inactiveWindows.Remove(window);
_activeWindows.Add(window);
window.Show();
window.OnWindowClose += RemoveWindow;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting window manager");
return base.StartAsync(cancellationToken);
}
private void ServiceLoopAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Thread.Sleep(500);
Frame.Wait(false);
}
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
OpenWindow(WindowNames.MainWindow);
await Task.Factory.StartNew(() =>
{
ServiceLoopAsync(stoppingToken);
}, stoppingToken, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
public override void Dispose()
{
foreach (var window in _activeWindows)
{
window.OnWindowClose -= RemoveWindow;
window.Dispose();
}
base.Dispose();
}
}

13
MRBot/UI/IWindow.cs Normal file
View File

@ -0,0 +1,13 @@
using System;
using LavishScriptAPI;
namespace MRBot.UI;
internal interface IWindow : IDisposable
{
public string Name { get; }
event EventHandler<LSEventArgs> OnWindowClose;
public void Show();
public void Hide();
}

85
MRBot/UI/MainWindow.cs Normal file
View File

@ -0,0 +1,85 @@
using System;
using LavishScriptAPI;
using LavishVMAPI;
using Microsoft.Extensions.Logging;
using MRBot.Api;
using MRBot.IsxEq2;
namespace MRBot.UI;
internal class MainWindow : IWindow
{
private const string BotControllerScript = "mr/bot/bot.iss";
private const string BotControllerObject = "MRBotController";
private readonly BotApi _botApi;
private readonly ILogger<MainWindow> _logger;
private bool UiAttached
{
get
{
var command = $"${{{BotControllerObject}.UIAttached}}";
var uiAttached = false;
return LavishScript.DataParse(command, ref uiAttached) && uiAttached;
}
}
public MainWindow(BotApi botApi, ILogger<MainWindow> logger)
{
_botApi = botApi;
_logger = logger;
}
public string Name => WindowNames.MainWindow;
public event EventHandler<LSEventArgs> OnWindowClose;
public void Show()
{
_logger.LogTrace("Showing MainWindow.");
LavishScript.ExecuteCommand($"run {BotControllerScript}");
while(!UiAttached)
{
_logger.LogTrace("Waiting for UI to attach.");
Frame.Wait(false);
}
LavishScript.Events.AttachEventTarget("OnBotToggle", OnBotToggle);
LavishScript.Events.AttachEventTarget("OnBotClose", CloseBot);
_logger.LogTrace("MainWindow shown and events are attached.");
}
public void Hide()
{
_logger.LogTrace("Hiding MainWindow.");
LavishScript.Events.DetachEventTarget("OnBotToggle", OnBotToggle);
LavishScript.Events.DetachEventTarget("OnBotClose", CloseBot);
_logger.LogTrace("MainWindow hidden and events are detached.");
}
private void CloseBot(object sender, LSEventArgs args)
{
OnWindowClose?.Invoke(this, args);
}
private void OnBotToggle(object sender, LSEventArgs args)
{
_logger.LogInformation("Bot Toggled.");
_botApi.FollowPlayer(Extension.Me.Target.Name);
}
public void Dispose()
{
LavishScript.Events.DetachEventTarget("OnBotToggle", OnBotToggle);
LavishScript.Events.DetachEventTarget("OnBotClose", CloseBot);
try
{
LavishScript.ExecuteCommand($"endscript {BotControllerScript}");
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}

View File

@ -0,0 +1,33 @@
using System;
using LavishScriptAPI;
using Microsoft.Extensions.Logging;
namespace MRBot.UI;
internal class SettingsWindow : IWindow
{
private readonly ILogger<SettingsWindow> _logger;
public SettingsWindow(ILogger<SettingsWindow> logger)
{
_logger = logger;
}
public string Name => WindowNames.SettingsWindow;
public event EventHandler<LSEventArgs> OnWindowClose;
public void Show()
{
throw new NotImplementedException();
}
public void Hide()
{
}
public void Dispose()
{
// TODO release managed resources here
}
}

7
MRBot/UI/WindowNames.cs Normal file
View File

@ -0,0 +1,7 @@
namespace MRBot.UI;
internal static class WindowNames
{
public static readonly string MainWindow = "MainWindow";
public static readonly string SettingsWindow = "SettingsWindow";
}

2
UiTest.sln.DotSettings Normal file
View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Lgui/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=E_003A_005CGames_005CInnerSpace_005CLavish_002EInnerSpace_002Edll/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>