ReferenceManager.cs
ReferenceManager.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using RSBot.Core.Client.ReferenceObjects;
using RSBot.Core.Cryptography;
using RSBot.Core.Event;
using RSBot.Core.Extensions;
using RSBot.Core.Objects;
using RSBot.NavMeshApi;
namespace RSBot.Core.Client;
worker.ReportProgress(10, "Texts");
LoadTextData();
worker.ReportProgress(20, "Characters");
LoadCharacterData();
worker.ReportProgress(30, "Items");
LoadItemData();
worker.ReportProgress(40, "Skills");
LoadSkillData();
worker.ReportProgress(50, "Quests");
LoadQuestData();
worker.ReportProgress(60, "Shops");
LoadShopData();
worker.ReportProgress(70, "Teleporters");
LoadTeleportData();
worker.ReportProgress(80, "Alchemy");
LoadAlchemyData();
worker.ReportProgress(90, "Misc");
LoadOptLevelData();
LoadLevelData();
sw.Stop();
Log.Debug(GetDebugInfo());
Log.Notify($"Loaded all game data in {sw.ElapsedMilliseconds}ms!");
worker.ReportProgress(100, "Done");
EventManager.FireEvent("OnLoadGameData");
}
LoadReferenceFile($"{ServerDep}\\TextDataName.txt", TextData);
LoadReferenceFile($"{ServerDep}\\TextQuest.txt", TextData);
}
}
private void LoadCharacterData()
{
if (Game.ClientType < GameClientType.Thailand)
LoadReferenceFile($"{ServerDep}\\CharacterData.txt", CharacterData);
else
LoadReferenceListFile($"{ServerDep}\\CharacterData.txt",
CharacterData);
}
LoadReferenceFile($"{ServerDep}\\SkillMasteryData.txt", SkillMasteryData);
}
//Skip invalid
if (string.IsNullOrEmpty(line) || line.StartsWith("//"))
continue;
filesToLoad.Add(line);
}
}
var files = Game.MediaPk2.GetFileList(ServerDep, filesToLoad.ToArray());
foreach (var file in files)
LoadReferenceFileEnc(file.OpenRead().GetStream(), destination);
}
LoadReferenceFile(decryptedStream, destination);
}
//Skip invalid
if (string.IsNullOrEmpty(line) || line.StartsWith("//"))
continue;
filesToLoad.Add(line);
}
//Skip invalid
if (string.IsNullOrEmpty(line) || line.StartsWith("//"))
continue;
filesToLoad.Add(line);
}
//Actual loading
var files = Game.MediaPk2.GetFileList(ServerDep, filesToLoad.ToArray());
foreach (var file in files)
LoadReferenceFile(file.OpenRead().GetStream(), destination);
}
while (!reader.EndOfStream)
{
var line = reader.ReadLineByCRLF(builder);
//Skip invalid
if (string.IsNullOrEmpty(line) || line.StartsWith("//"))
continue;
try
{
var reference = new TReference();
if (reference.Load(new ReferenceParser(line)))
destination.Add(reference);
}
catch
{
Debug.WriteLine($"Exception in reference line: {line}");
}
}
}
//Skip invalid
if (string.IsNullOrEmpty(line) || line.StartsWith("//"))
continue;
try
{
var reference = new TReference();
if (reference.Load(new ReferenceParser(line)))
destination[reference.PrimaryKey] = reference;
}
catch
{
Debug.WriteLine($"Exception in reference line: {line}");
}
}
}
return name;
}
public RefObjCommon GetRefObjCommon(uint refObjID)
{
if (CharacterData.TryGetValue(refObjID, out var refChar))
return refChar;
return null;
}
return null;
}
return null;
}
return null;
}
return skill.Value;
}
public RefSkillMastery GetRefSkillMastery(uint id)
{
if (Game.ClientType == GameClientType.Chinese &&
id >= 273 && id <= 275)
id = 277; // csro shit
return null;
}
return null;
}
return null;
}
return null;
}
if (!PackageItemScrap.ContainsKey(good.RefPackageItemCodeName))
continue;
return result;
}
if (availableGood != null)
return i;
}
}
return 0xFF;
}
/// <summary>
/// Gets the filtered items.
/// </summary>
/// <param name="filters">The filters.</param>
/// <param name="degreeFrom">The degree from.</param>
/// <param name="degreeTo">The degree to.</param>
/// <param name="gender">The gender.</param>
/// <param name="searchPattern">The search pattern.</param>
/// <returns></returns>
public List<RefObjItem> GetFilteredItems(
List<TypeIdFilter> filters,
byte degreeFrom = 0,
byte degreeTo = 0,
ObjectGender gender = ObjectGender.Neutral,
bool rare = false,
string searchPattern = null)
{
var result = new List<RefObjItem>(10000);
foreach (var refItem in ItemData.Values)
{
if (refItem.IsGold)
continue;
if (itemRealName.IndexOf(searchPattern,
StringComparison.InvariantCultureIgnoreCase) == -1)
continue;
}
result.Add(refItem);
}
}
return result;
}
/// <summary>
/// Gets the teleporters in the specific sector
/// </summary>
/// <param name="regionId"></param>
/// <returns></returns>
public RefTeleport[] GetTeleporters(Region region)
{
return TeleportData.Where(t => t.GenRegionID == region).ToArray();
}
/// <summary>
/// Gets the ground teleporters.
/// </summary>
/// <param name="regionId">The region identifier.</param>
/// <returns></returns>
public RefTeleport[] GetGroundTeleporters(Region region)
{
return TeleportData.Where(t => t.GenRegionID == region && t.AssocRefObjId
== 0).ToArray();
}
/// <summary>
/// Gets a magic option by its id
/// </summary>
/// <param name="id">The id of the magic option</param>
/// <returns></returns>
public RefMagicOpt GetMagicOption(uint id)
{
return MagicOptions?.FirstOrDefault(m => m.Id == id);
}
/// <summary>
/// Gets the first magic option of the specified group
/// </summary>
/// <param name="group">The group</param>
/// <returns></returns>
public RefMagicOpt GetMagicOption(string group)
{
return MagicOptions?.FirstOrDefault(m => m.Group == group);
}
/// <summary>
/// Gets a magic option by its group and degree
/// </summary>
/// <param name="group">The group</param>
/// <param name="degree">The degree</param>
/// <returns></returns>
public RefMagicOpt GetMagicOption(string group, byte degree)
{
return MagicOptions?.FirstOrDefault(m => m.Group == group && m.Level ==
degree);
}
/// <summary>
/// Gets a list of magic options for the specified type ids
/// </summary>
/// <param name="typeId3">The TID3</param>
/// <param name="typeId4">The TID4</param>
/// <returns></returns>
public List<RefMagicOpt> GetAssignments(byte typeId3, byte typeId4)
{
return MagicOptionAssignments.FirstOrDefault(a => a.TypeId3 == typeId3 &&
a.TypeId4 == typeId4)
?.AvailableMagicOptions.Select(GetMagicOption).ToList();
}
/// <summary>
/// Gets a ability item for the specified <paramref name="itemId" /> and
<paramref name="optLevel" />
/// </summary>
/// <param name="itemId">Item Id</param>
/// <param name="optLevel">Opt Level</param>
/// <returns></returns>
public RefAbilityByItemOptLevel GetAbilityItem(uint itemId, byte optLevel)
{
return AbilityItemByOptLevel.Values.FirstOrDefault(p => p.ItemId == itemId
&& p.OptLevel == optLevel);
}
/// <summary>
/// Gets a ability item for the specified <paramref name="itemId" /> and
<paramref name="optLevel" />
/// </summary>
/// <param name="itemId">Item Id</param>
/// <param name="optLevel">Opt Level</param>
/// <returns></returns>
public IEnumerable<RefExtraAbilityByEquipItemOptLevel>
GetExtraAbilityItems(uint itemId, byte optLevel)
{
return ExtraAbilityByEquipItemOptLevel.Where(p => p.ItemId == itemId &&
p.OptLevel == optLevel);
}
/// <summary>
/// Gets a list of reward items for the specified quest.
/// </summary>
/// <param name="questId"></param>
/// <returns></returns>
public IEnumerable<RefQuestRewardItem> GetQuestRewardItems(uint questId)
{
return QuestRewardItems.Where(r => r.QuestId == questId);
}
/// <summary>
/// Returns the reward for the specified quest
/// </summary>
/// <param name="questId"></param>
/// <returns></returns>
public RefQuestReward GetQuestReward(uint questId)
{
QuestRewards.TryGetValue(questId, out var result);
return result;
}
return builder.ToString();
}
}