100 lines
2.5 KiB
C#
100 lines
2.5 KiB
C#
using System.Reflection;
|
|
using System.Xml.Serialization;
|
|
using ProtoBuf;
|
|
using Sandbox.Graphics.GUI;
|
|
using VRage.Game;
|
|
using VRage.GameServices;
|
|
|
|
namespace PluginLoader.Data;
|
|
|
|
[ProtoContract]
|
|
public class ModPlugin : PluginData, ISteamItem
|
|
{
|
|
private bool isLegacy;
|
|
|
|
private string modLocation;
|
|
|
|
public override string Source => "Mod";
|
|
|
|
[ProtoMember(1)]
|
|
[XmlArray]
|
|
[XmlArrayItem("Id")]
|
|
public ulong[] DependencyIds { get; set; } = new ulong[0];
|
|
|
|
[XmlIgnore] public ModPlugin[] Dependencies { get; set; } = new ModPlugin[0];
|
|
|
|
public string ModLocation
|
|
{
|
|
get
|
|
{
|
|
if (modLocation != null)
|
|
return modLocation;
|
|
modLocation = Path.Combine(Path.GetFullPath(@"..\..\..\workshop\content\244850\"), WorkshopId.ToString());
|
|
if (Directory.Exists(modLocation) && !Directory.Exists(Path.Combine(modLocation, "Data")))
|
|
{
|
|
var legacyFile = Directory.EnumerateFiles(modLocation, "*_legacy.bin").FirstOrDefault();
|
|
if (legacyFile != null)
|
|
{
|
|
isLegacy = true;
|
|
modLocation = legacyFile;
|
|
}
|
|
}
|
|
|
|
return modLocation;
|
|
}
|
|
}
|
|
|
|
public bool Exists => Directory.Exists(ModLocation) || (isLegacy && File.Exists(modLocation));
|
|
|
|
[XmlIgnore] public ulong WorkshopId { get; private set; }
|
|
|
|
public override string Id
|
|
{
|
|
get => base.Id;
|
|
set
|
|
{
|
|
base.Id = value;
|
|
WorkshopId = ulong.Parse(Id);
|
|
}
|
|
}
|
|
|
|
public override Assembly GetAssembly()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
public override bool TryLoadAssembly(out Assembly a)
|
|
{
|
|
a = null;
|
|
return false;
|
|
}
|
|
|
|
public override void Show()
|
|
{
|
|
MyGuiSandbox.OpenUrl("https://steamcommunity.com/workshop/filedetails/?id=" + Id,
|
|
UrlOpenMode.SteamOrExternalWithConfirm);
|
|
}
|
|
|
|
public MyObjectBuilder_Checkpoint.ModItem GetModItem()
|
|
{
|
|
var modItem = new MyObjectBuilder_Checkpoint.ModItem(WorkshopId, "Steam");
|
|
modItem.SetModData(new WorkshopItem(ModLocation));
|
|
return modItem;
|
|
}
|
|
|
|
public MyModContext GetModContext()
|
|
{
|
|
var modContext = new MyModContext();
|
|
modContext.Init(GetModItem());
|
|
modContext.Init(WorkshopId.ToString(), null, ModLocation);
|
|
return modContext;
|
|
}
|
|
|
|
private class WorkshopItem : MyWorkshopItem
|
|
{
|
|
public WorkshopItem(string folder)
|
|
{
|
|
Folder = folder;
|
|
}
|
|
}
|
|
} |