Compare commits
2 Commits
v1.0.43-ma
...
v1.0.45-ma
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9c185d5577 | ||
![]() |
8b6c401531 |
@@ -130,17 +130,17 @@ namespace Torch.Server.Views
|
||||
//blocking
|
||||
editor.Edit<string>(idList, "Mods");
|
||||
|
||||
modList.RemoveAll(m =>
|
||||
{
|
||||
var mod = m.ToString();
|
||||
return idList.Any(mod.Equals);
|
||||
});
|
||||
modList.Clear();
|
||||
modList.AddRange(idList.Select(id =>
|
||||
{
|
||||
var info = new ModItemInfo(ModItemUtils.Create(id));
|
||||
if (!ModItemUtils.TryParse(id, out var item))
|
||||
return null;
|
||||
|
||||
var info = new ModItemInfo(item);
|
||||
tasks.Add(Task.Run(info.UpdateModInfoAsync));
|
||||
return info;
|
||||
}));
|
||||
}).Where(b => b is not null));
|
||||
|
||||
_instanceManager.DedicatedConfig.Mods.Clear();
|
||||
foreach (var mod in modList)
|
||||
_instanceManager.DedicatedConfig.Mods.Add(mod);
|
||||
|
@@ -1,34 +1,52 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Mono.Cecil;
|
||||
using NLog;
|
||||
|
||||
namespace Torch.Plugins;
|
||||
|
||||
internal static class AssemblyRewriter
|
||||
{
|
||||
private static readonly ILogger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private static readonly IAssemblyResolver Resolver;
|
||||
private static readonly ZipResolver _zipResolver;
|
||||
private static readonly DefaultAssemblyResolver _defaultResolver;
|
||||
|
||||
static AssemblyRewriter()
|
||||
{
|
||||
var resolver = new DefaultAssemblyResolver();
|
||||
Resolver = resolver;
|
||||
resolver.AddSearchDirectory(Directory.GetCurrentDirectory());
|
||||
resolver.AddSearchDirectory(Path.Combine(Directory.GetCurrentDirectory(), "DedicatedServer64"));
|
||||
_defaultResolver = new();
|
||||
_zipResolver = new(_defaultResolver);
|
||||
_defaultResolver.AddSearchDirectory(Directory.GetCurrentDirectory());
|
||||
_defaultResolver.AddSearchDirectory(Path.Combine(Directory.GetCurrentDirectory(), "DedicatedServer64"));
|
||||
}
|
||||
|
||||
public static Assembly ProcessWeavers(this Stream stream)
|
||||
public static Assembly ProcessWeavers(this Stream stream, ZipArchive archive)
|
||||
{
|
||||
_zipResolver.Archive = archive;
|
||||
using var assStream = new MemoryStream();
|
||||
stream.CopyTo(assStream);
|
||||
assStream.Position = 0;
|
||||
using var module = ModuleDefinition.ReadModule(assStream, new()
|
||||
var ass = ProcessInternal(assStream, _zipResolver);
|
||||
_zipResolver.Archive = null;
|
||||
return ass;
|
||||
}
|
||||
|
||||
public static Assembly ProcessWeavers(this Stream stream, string path)
|
||||
{
|
||||
_defaultResolver.AddSearchDirectory(path);
|
||||
using var assStream = new MemoryStream();
|
||||
stream.CopyTo(assStream);
|
||||
assStream.Position = 0;
|
||||
var ass = ProcessInternal(assStream, _defaultResolver);
|
||||
_defaultResolver.RemoveSearchDirectory(path);
|
||||
return ass;
|
||||
}
|
||||
|
||||
private static Assembly ProcessInternal(Stream inputStream, IAssemblyResolver resolver)
|
||||
{
|
||||
using var module = ModuleDefinition.ReadModule(inputStream, new()
|
||||
{
|
||||
AssemblyResolver = Resolver
|
||||
AssemblyResolver = _zipResolver
|
||||
});
|
||||
foreach (var fieldDefinition in FindAllToRewrite(module))
|
||||
{
|
||||
@@ -47,4 +65,40 @@ internal static class AssemblyRewriter
|
||||
|
||||
private static bool HasValidAttributes(FieldDefinition definition) =>
|
||||
definition.CustomAttributes.Any(b => b.AttributeType.Name.Contains("Reflected") || b.AttributeType.Name == "DependencyAttribute");
|
||||
|
||||
private class ZipResolver : IAssemblyResolver
|
||||
{
|
||||
private readonly IAssemblyResolver _fallbackResolver;
|
||||
public ZipArchive Archive { get; set; }
|
||||
|
||||
public ZipResolver(IAssemblyResolver fallbackResolver)
|
||||
{
|
||||
_fallbackResolver = fallbackResolver;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_fallbackResolver.Dispose();
|
||||
}
|
||||
|
||||
public AssemblyDefinition Resolve(AssemblyNameReference name)
|
||||
{
|
||||
return Resolve(name, new());
|
||||
}
|
||||
|
||||
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
|
||||
{
|
||||
var fileName = $"{name.Name}.dll";
|
||||
|
||||
if (Archive.Entries.FirstOrDefault(entry => entry.Name == fileName) is not { } archiveEntry)
|
||||
return _fallbackResolver.Resolve(name, parameters);
|
||||
|
||||
using var stream = archiveEntry.Open();
|
||||
using var memStream = new MemoryStream();
|
||||
stream.CopyTo(memStream);
|
||||
memStream.Position = 0;
|
||||
|
||||
return AssemblyDefinition.ReadAssembly(memStream, parameters);
|
||||
}
|
||||
}
|
||||
}
|
@@ -360,7 +360,7 @@ namespace Torch.Managers
|
||||
|
||||
|
||||
using var stream = entry.Open();
|
||||
assemblies.Add(stream.ProcessWeavers());
|
||||
assemblies.Add(stream.ProcessWeavers(zipFile));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -378,7 +378,7 @@ namespace Torch.Managers
|
||||
// continue;
|
||||
|
||||
using var stream = File.OpenRead(file);
|
||||
assemblies.Add(stream.ProcessWeavers());
|
||||
assemblies.Add(stream.ProcessWeavers(item.Path));
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Sandbox.Engine.Networking;
|
||||
using Torch.API;
|
||||
@@ -19,6 +20,43 @@ namespace Torch.Utils
|
||||
return new MyObjectBuilder_Checkpoint.ModItem(ulong.Parse(arr[0]), arr[1]);
|
||||
}
|
||||
|
||||
public static bool TryParse(string str, out MyObjectBuilder_Checkpoint.ModItem item)
|
||||
{
|
||||
item = default;
|
||||
|
||||
var arr = str.Split('-');
|
||||
|
||||
if (arr.Length is 0 or > 2)
|
||||
return false;
|
||||
|
||||
if (!ulong.TryParse(arr[0], out var id))
|
||||
return false;
|
||||
|
||||
if (arr.Length == 1 || !TryParseServiceName(arr[1], out var serviceName))
|
||||
serviceName = GetDefaultServiceName();
|
||||
|
||||
item = new(id, serviceName);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool TryParseServiceName(string str, out string serviceName)
|
||||
{
|
||||
if (str.Equals("steam", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
serviceName = "Steam";
|
||||
return true;
|
||||
}
|
||||
if (str.Equals("mod.io", StringComparison.OrdinalIgnoreCase) ||
|
||||
str.Equals("eos", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
serviceName = "mod.io";
|
||||
return true;
|
||||
}
|
||||
|
||||
serviceName = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
//because KEEEN!
|
||||
public static string GetDefaultServiceName()
|
||||
{
|
||||
|
Reference in New Issue
Block a user