Compare commits
3 Commits
v1.0.43-ma
...
v1.0.46-ma
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cf5c00ce0e | ||
![]() |
9c185d5577 | ||
![]() |
8b6c401531 |
@@ -29,12 +29,7 @@ namespace Torch.Server
|
||||
private const string STEAMCMD_DIR = "steamcmd";
|
||||
private const string STEAMCMD_ZIP = "temp.zip";
|
||||
private static readonly string STEAMCMD_EXE = "steamcmd.exe";
|
||||
private static readonly string RUNSCRIPT_FILE = "runscript.txt";
|
||||
|
||||
private const string RUNSCRIPT = @"force_install_dir ../
|
||||
login anonymous
|
||||
app_update 298740
|
||||
quit";
|
||||
private const string STEAMCMD_ARGS = "+force_install_dir \"{0}\" +login anonymous +app_update 298740 +quit";
|
||||
private TorchServer _server;
|
||||
|
||||
internal Persistent<TorchConfig> ConfigPersistent { get; }
|
||||
@@ -140,10 +135,6 @@ quit";
|
||||
Directory.CreateDirectory(path);
|
||||
}
|
||||
|
||||
var runScriptPath = Path.Combine(path, RUNSCRIPT_FILE);
|
||||
if (!File.Exists(runScriptPath))
|
||||
File.WriteAllText(runScriptPath, RUNSCRIPT);
|
||||
|
||||
var steamCmdExePath = Path.Combine(path, STEAMCMD_EXE);
|
||||
if (!File.Exists(steamCmdExePath))
|
||||
{
|
||||
@@ -166,8 +157,9 @@ quit";
|
||||
}
|
||||
|
||||
log.Info("Checking for DS updates.");
|
||||
var steamCmdProc = new ProcessStartInfo(steamCmdExePath, "+runscript runscript.txt")
|
||||
var steamCmdProc = new ProcessStartInfo(steamCmdExePath)
|
||||
{
|
||||
Arguments = string.Format(STEAMCMD_ARGS, Environment.GetEnvironmentVariable("TORCH_GAME_PATH") ?? "../"),
|
||||
WorkingDirectory = path,
|
||||
UseShellExecute = false,
|
||||
RedirectStandardOutput = true,
|
||||
|
@@ -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;
|
||||
@@ -18,6 +19,43 @@ namespace Torch.Utils
|
||||
var arr = str.Split('-');
|
||||
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