3
.gitignore
vendored
3
.gitignore
vendored
@@ -252,3 +252,6 @@ ModelManifest.xml
|
|||||||
# FAKE - F# Make
|
# FAKE - F# Make
|
||||||
.fake/
|
.fake/
|
||||||
GameBinaries
|
GameBinaries
|
||||||
|
|
||||||
|
# Generated Files
|
||||||
|
**Gen.cs
|
||||||
|
52
Jenkins/release.ps1
Normal file
52
Jenkins/release.ps1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
param([string] $ApiBase, [string]$tagName, [string]$authinfo, [string[]] $assetPaths)
|
||||||
|
Add-Type -AssemblyName "System.Web"
|
||||||
|
|
||||||
|
$headers = @{
|
||||||
|
Authorization = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($authinfo))
|
||||||
|
Accept = "application/vnd.github.v3+json"
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Write-Output("Checking if release with tag " + $tagName + " already exists...")
|
||||||
|
$release = Invoke-RestMethod -Uri ($ApiBase+"releases/tags/$tagName") -Method "GET" -Headers $headers
|
||||||
|
Write-Output(" Using existing release " + $release.id + " at " + $release.html_url)
|
||||||
|
} catch {
|
||||||
|
Write-Output(" Doesn't exist")
|
||||||
|
$rel_arg = @{
|
||||||
|
tag_name=$tagName
|
||||||
|
name="Generated $tagName"
|
||||||
|
body=""
|
||||||
|
draft=$TRUE
|
||||||
|
prerelease=$tagName.Contains("alpha") -or $tagName.Contains("beta")
|
||||||
|
}
|
||||||
|
Write-Output("Creating new release " + $tagName + "...")
|
||||||
|
$release = Invoke-RestMethod -Uri ($ApiBase+"releases") -Method "POST" -Headers $headers -Body (ConvertTo-Json($rel_arg))
|
||||||
|
Write-Output(" Created new release " + $tagName + " at " + $release.html_url)
|
||||||
|
}
|
||||||
|
|
||||||
|
$assetsApiBase = $release.assets_url
|
||||||
|
Write-Output("Checking for existing assets...")
|
||||||
|
$existingAssets = Invoke-RestMethod -Uri ($assetsApiBase) -Method "GET" -Headers $headers
|
||||||
|
$assetLabels = ($assetPaths | ForEach-Object {[System.IO.Path]::GetFileName($_)})
|
||||||
|
foreach ($asset in $existingAssets) {
|
||||||
|
if ($assetLabels -contains $asset.name) {
|
||||||
|
$uri = $asset.url
|
||||||
|
Write-Output(" Deleting old asset " + $asset.name + " (id " + $asset.id + "); URI=" + $uri)
|
||||||
|
$result = Invoke-RestMethod -Uri $uri -Method "DELETE" -Headers $headers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Output("Uploading assets...")
|
||||||
|
$uploadUrl = $release.upload_url.Substring(0, $release.upload_url.LastIndexOf('{'))
|
||||||
|
foreach ($asset in $assetPaths) {
|
||||||
|
$assetName = [System.IO.Path]::GetFileName($asset)
|
||||||
|
$assetType = [System.Web.MimeMapping]::GetMimeMapping($asset)
|
||||||
|
$assetData = [System.IO.File]::ReadAllBytes($asset)
|
||||||
|
$headerExtra = $headers + @{
|
||||||
|
"Content-Type" = $assetType
|
||||||
|
Name = $assetName
|
||||||
|
}
|
||||||
|
$uri = $uploadUrl + "?name=" + $assetName
|
||||||
|
Write-Output(" Uploading " + $asset + " as " + $assetType + "; URI=" + $uri)
|
||||||
|
$result = Invoke-RestMethod -Uri $uri -Method "POST" -Headers $headerExtra -Body $assetData
|
||||||
|
Write-Output(" ID=" + $result.id + ", found at=" + $result.browser_download_url)
|
||||||
|
}
|
30
Jenkinsfile
vendored
30
Jenkinsfile
vendored
@@ -1,10 +1,11 @@
|
|||||||
node {
|
node {
|
||||||
stage('Checkout') {
|
stage('Checkout') {
|
||||||
checkout scm
|
checkout scm
|
||||||
|
bat 'git pull --tags'
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('Acquire SE') {
|
stage('Acquire SE') {
|
||||||
bat 'powershell -File jenkins-grab-se.ps1'
|
bat 'powershell -File Jenkins/jenkins-grab-se.ps1'
|
||||||
bat 'IF EXIST GameBinaries RMDIR GameBinaries'
|
bat 'IF EXIST GameBinaries RMDIR GameBinaries'
|
||||||
bat 'mklink /J GameBinaries "C:/Steam/Data/DedicatedServer64/"'
|
bat 'mklink /J GameBinaries "C:/Steam/Data/DedicatedServer64/"'
|
||||||
}
|
}
|
||||||
@@ -14,6 +15,7 @@ node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stage('Build') {
|
stage('Build') {
|
||||||
|
currentBuild.description = bat(returnStdout: true, script: '@powershell -File Versioning/version.ps1').trim()
|
||||||
bat "\"${tool 'MSBuild'}msbuild\" Torch.sln /p:Configuration=Release /p:Platform=x64"
|
bat "\"${tool 'MSBuild'}msbuild\" Torch.sln /p:Configuration=Release /p:Platform=x64"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,6 +38,30 @@ node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stage('Archive') {
|
stage('Archive') {
|
||||||
archive 'bin/x64/Release/Torch.*'
|
bat '''IF EXIST bin\\torch-server.zip DEL bin\\torch-server.zip
|
||||||
|
IF EXIST bin\\package-server RMDIR /S /Q bin\\package-server
|
||||||
|
xcopy bin\\x64\\Release bin\\package-server\\
|
||||||
|
del bin\\package-server\\Torch.Client*'''
|
||||||
|
bat "powershell -Command \"Add-Type -Assembly System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::CreateFromDirectory(\\\"\$PWD\\bin\\package-server\\\", \\\"\$PWD\\bin\\torch-server.zip\\\")\""
|
||||||
|
archiveArtifacts artifacts: 'bin/torch-server.zip', caseSensitive: false, onlyIfSuccessful: true
|
||||||
|
|
||||||
|
bat '''IF EXIST bin\\torch-client.zip DEL bin\\torch-client.zip
|
||||||
|
IF EXIST bin\\package-client RMDIR /S /Q bin\\package-client
|
||||||
|
xcopy bin\\x64\\Release bin\\package-client\\
|
||||||
|
del bin\\package-client\\Torch.Server*'''
|
||||||
|
bat "powershell -Command \"Add-Type -Assembly System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::CreateFromDirectory(\\\"\$PWD\\bin\\package-client\\\", \\\"\$PWD\\bin\\torch-client.zip\\\")\""
|
||||||
|
archiveArtifacts artifacts: 'bin/torch-client.zip', caseSensitive: false, onlyIfSuccessful: true
|
||||||
|
|
||||||
|
archiveArtifacts artifacts: 'bin/x64/Release/Torch*', caseSensitive: false, fingerprint: true, onlyIfSuccessful: true
|
||||||
|
}
|
||||||
|
|
||||||
|
gitVersion = bat(returnStdout: true, script: "@git describe --tags").trim()
|
||||||
|
gitSimpleVersion = bat(returnStdout: true, script: "@git describe --tags --abbrev=0").trim()
|
||||||
|
if (gitVersion == gitSimpleVersion) {
|
||||||
|
stage('Release') {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'torch-github', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
|
||||||
|
powershell "& ./Jenkins/release.ps1 \"https://api.github.com/repos/TorchAPI/Torch/\" \"$gitSimpleVersion\" \"$USERNAME:$PASSWORD\" @(\"bin/torch-server.zip\", \"bin/torch-client.zip\")"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -3,7 +3,7 @@
|
|||||||
@echo off
|
@echo off
|
||||||
set /p path="Please enter the folder location of your SpaceEngineersDedicated.exe: "
|
set /p path="Please enter the folder location of your SpaceEngineersDedicated.exe: "
|
||||||
cd %~dp0
|
cd %~dp0
|
||||||
mklink /D GameBinaries %path%
|
mklink /J GameBinaries "%path%"
|
||||||
if errorlevel 1 goto Error
|
if errorlevel 1 goto Error
|
||||||
echo Done! You can now open the Torch solution without issue.
|
echo Done! You can now open the Torch solution without issue.
|
||||||
goto End
|
goto End
|
||||||
|
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Torch.API.Managers;
|
using Torch.API.Managers;
|
||||||
|
using Torch.API.Session;
|
||||||
using VRage.Game.ModAPI;
|
using VRage.Game.ModAPI;
|
||||||
|
|
||||||
namespace Torch.API
|
namespace Torch.API
|
||||||
@@ -33,15 +34,22 @@ namespace Torch.API
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
event Action SessionUnloaded;
|
event Action SessionUnloaded;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the currently running session instance, or null if none exists.
|
||||||
|
/// </summary>
|
||||||
|
ITorchSession CurrentSession { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Configuration for the current instance.
|
/// Configuration for the current instance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ITorchConfig Config { get; }
|
ITorchConfig Config { get; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IMultiplayerManager"/>
|
/// <inheritdoc cref="IMultiplayerManager"/>
|
||||||
|
[Obsolete]
|
||||||
IMultiplayerManager Multiplayer { get; }
|
IMultiplayerManager Multiplayer { get; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IPluginManager"/>
|
/// <inheritdoc cref="IPluginManager"/>
|
||||||
|
[Obsolete]
|
||||||
IPluginManager Plugins { get; }
|
IPluginManager Plugins { get; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IDependencyManager"/>
|
/// <inheritdoc cref="IDependencyManager"/>
|
||||||
|
@@ -1,22 +1,55 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Torch.API.Plugins
|
namespace Torch.API.Plugins
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the given type should be loaded by the plugin manager as a plugin.
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
public class PluginAttribute : Attribute
|
public class PluginAttribute : Attribute
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The display name of the plugin
|
||||||
|
/// </summary>
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// The version of the plugin
|
||||||
|
/// </summary>
|
||||||
public Version Version { get; }
|
public Version Version { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// The GUID of the plugin
|
||||||
|
/// </summary>
|
||||||
public Guid Guid { get; }
|
public Guid Guid { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new plugin attribute with the given attributes
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="version"></param>
|
||||||
|
/// <param name="guid"></param>
|
||||||
public PluginAttribute(string name, string version, string guid)
|
public PluginAttribute(string name, string version, string guid)
|
||||||
{
|
{
|
||||||
Name = name;
|
Name = name;
|
||||||
Version = Version.Parse(version);
|
Version = Version.Parse(version);
|
||||||
Guid = Guid.Parse(guid);
|
Guid = Guid.Parse(guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new plugin attribute with the given attributes. Version is computed as the version of the assembly containing the given type.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="versionSupplier">Version is this type's assembly's version</param>
|
||||||
|
/// <param name="guid"></param>
|
||||||
|
public PluginAttribute(string name, Type versionSupplier, string guid)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Version = versionSupplier.Assembly.GetName().Version;
|
||||||
|
Guid = Guid.Parse(guid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,36 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
[assembly: AssemblyTitle("Torch API")]
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("TorchAPI")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("TorchAPI")]
|
[assembly: AssemblyProduct("Torch")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[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)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
#if DEBUG
|
||||||
[assembly: Guid("fba5d932-6254-4a1e-baf4-e229fa94e3c2")]
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
// Version information for an assembly consists of the following four values:
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
//
|
#endif
|
||||||
// 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")]
|
|
29
Torch.API/Session/ITorchSession.cs
Normal file
29
Torch.API/Session/ITorchSession.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Sandbox.Game.World;
|
||||||
|
using Torch.API.Managers;
|
||||||
|
|
||||||
|
namespace Torch.API.Session
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the Torch code working with a single game session
|
||||||
|
/// </summary>
|
||||||
|
public interface ITorchSession
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The Torch instance this session is bound to
|
||||||
|
/// </summary>
|
||||||
|
ITorchBase Torch { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Space Engineers game session this session is bound to.
|
||||||
|
/// </summary>
|
||||||
|
MySession KeenSession { get; }
|
||||||
|
|
||||||
|
/// <inheritdoc cref="IDependencyManager"/>
|
||||||
|
IDependencyManager Managers { get; }
|
||||||
|
}
|
||||||
|
}
|
46
Torch.API/Session/ITorchSessionManager.cs
Normal file
46
Torch.API/Session/ITorchSessionManager.cs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Torch.API.Managers;
|
||||||
|
|
||||||
|
namespace Torch.API.Session
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a manager for the given session if applicable.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This is for creating managers that will live inside the session, not the manager that controls sesssions.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="session">The session to construct a bound manager for</param>
|
||||||
|
/// <returns>The manager that will live in the session, or null if none.</returns>
|
||||||
|
public delegate IManager SessionManagerFactoryDel(ITorchSession session);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Manages the creation and destruction of <see cref="ITorchSession"/> instances for each <see cref="Sandbox.Game.World.MySession"/> created by Space Engineers.
|
||||||
|
/// </summary>
|
||||||
|
public interface ITorchSessionManager : IManager
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The currently running session
|
||||||
|
/// </summary>
|
||||||
|
ITorchSession CurrentSession { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds the given factory as a supplier for session based managers
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="factory">Session based manager supplier</param>
|
||||||
|
/// <returns>true if added, false if already present</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">If the factory is null</exception>
|
||||||
|
bool AddFactory(SessionManagerFactoryDel factory);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove the given factory from the suppliers for session based managers
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="factory">Session based manager supplier</param>
|
||||||
|
/// <returns>true if removed, false if not present</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">If the factory is null</exception>
|
||||||
|
bool RemoveFactory(SessionManagerFactoryDel factory);
|
||||||
|
}
|
||||||
|
}
|
@@ -10,6 +10,8 @@
|
|||||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -36,8 +38,8 @@
|
|||||||
<HintPath>..\GameBinaries\HavokWrapper.dll</HintPath>
|
<HintPath>..\GameBinaries\HavokWrapper.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NLog">
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.4.4.1\lib\net45\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="PresentationCore" />
|
<Reference Include="PresentationCore" />
|
||||||
@@ -154,6 +156,9 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="ConnectionState.cs" />
|
<Compile Include="ConnectionState.cs" />
|
||||||
<Compile Include="IChatMessage.cs" />
|
<Compile Include="IChatMessage.cs" />
|
||||||
<Compile Include="ITorchConfig.cs" />
|
<Compile Include="ITorchConfig.cs" />
|
||||||
@@ -175,16 +180,15 @@
|
|||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ServerState.cs" />
|
<Compile Include="ServerState.cs" />
|
||||||
<Compile Include="ModAPI\TorchAPI.cs" />
|
<Compile Include="ModAPI\TorchAPI.cs" />
|
||||||
|
<Compile Include="Session\ITorchSession.cs" />
|
||||||
|
<Compile Include="Session\ITorchSessionManager.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
</Project>
|
@@ -1,4 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="4.4.1" targetFramework="net461" />
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@@ -1,36 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
[assembly: AssemblyTitle("Torch Client Tests")]
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("Torch.Client.Tests")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Torch.Client.Tests")]
|
[assembly: AssemblyProduct("Torch")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[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)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
#if DEBUG
|
||||||
[assembly: Guid("632e78c0-0dac-4b71-b411-2f1b333cc310")]
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
// Version information for an assembly consists of the following four values:
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
//
|
#endif
|
||||||
// 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")]
|
|
@@ -34,6 +34,10 @@
|
|||||||
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Client.Tests.xml</DocumentationFile>
|
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Client.Tests.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -56,6 +60,9 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="TorchClientReflectionTest.cs" />
|
<Compile Include="TorchClientReflectionTest.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -81,5 +88,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
</Project>
|
</Project>
|
@@ -1,5 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
||||||
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
||||||
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
||||||
|
@@ -1,4 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("1.0.229.265")]
|
[assembly: AssemblyTitle("Torch Client")]
|
||||||
[assembly: AssemblyFileVersion("1.0.229.265")]
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("Torch")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
|
#endif
|
@@ -1,16 +0,0 @@
|
|||||||
<#@ template debug="false" hostspecific="false" language="C#" #>
|
|
||||||
<#@ assembly name="System.Core" #>
|
|
||||||
<#@ import namespace="System.Linq" #>
|
|
||||||
<#@ import namespace="System.Text" #>
|
|
||||||
<#@ import namespace="System.Collections.Generic" #>
|
|
||||||
<#@ output extension=".cs" #>
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
<# var dt = DateTime.Now;
|
|
||||||
int major = 1;
|
|
||||||
int minor = 0;
|
|
||||||
int build = dt.DayOfYear;
|
|
||||||
int rev = (int)dt.TimeOfDay.TotalMinutes / 2;
|
|
||||||
#>
|
|
||||||
[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")]
|
|
||||||
[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")]
|
|
@@ -1,12 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
[assembly: AssemblyTitle("Torch Client")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("Torch")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
[assembly: ComVisible(false)]
|
|
@@ -13,6 +13,8 @@
|
|||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -40,7 +42,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.4.4.1\lib\net45\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Sandbox.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Sandbox.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
@@ -116,12 +118,10 @@
|
|||||||
<Reference Include="PresentationFramework" />
|
<Reference Include="PresentationFramework" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs">
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
<DependentUpon>AssemblyInfo.tt</DependentUpon>
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Properties\AssemblyInfo1.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="TorchClient.cs" />
|
<Compile Include="TorchClient.cs" />
|
||||||
<Compile Include="TorchClientConfig.cs" />
|
<Compile Include="TorchClientConfig.cs" />
|
||||||
<Compile Include="TorchConsoleScreen.cs" />
|
<Compile Include="TorchConsoleScreen.cs" />
|
||||||
@@ -164,25 +164,13 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Resource Include="torchicon.ico" />
|
<Resource Include="torchicon.ico" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="Properties\AssemblyInfo.tt">
|
|
||||||
<Generator>TextTemplatingFileGenerator</Generator>
|
|
||||||
<LastGenOutput>AssemblyInfo.cs</LastGenOutput>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>copy "$(SolutionDir)NLog.config" "$(TargetDir)"
|
<PostBuildEvent>copy "$(SolutionDir)NLog.config" "$(TargetDir)"
|
||||||
</PostBuildEvent>
|
</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<!-- 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>
|
|
||||||
-->
|
|
||||||
</Project>
|
</Project>
|
@@ -12,6 +12,7 @@ using VRage.Steam;
|
|||||||
using Torch.API;
|
using Torch.API;
|
||||||
using VRage;
|
using VRage;
|
||||||
using VRage.FileSystem;
|
using VRage.FileSystem;
|
||||||
|
using VRage.GameServices;
|
||||||
using VRageRender;
|
using VRageRender;
|
||||||
using VRageRender.ExternalApp;
|
using VRageRender.ExternalApp;
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ namespace Torch.Client
|
|||||||
|
|
||||||
_startup.DetectSharpDxLeaksBeforeRun();
|
_startup.DetectSharpDxLeaksBeforeRun();
|
||||||
var steamService = new SteamService(Game.IsDedicated, APP_ID);
|
var steamService = new SteamService(Game.IsDedicated, APP_ID);
|
||||||
MyServiceManager.Instance.AddService(steamService);
|
MyServiceManager.Instance.AddService<IMyGameService>(steamService);
|
||||||
_renderer = null;
|
_renderer = null;
|
||||||
SpaceEngineersGame.SetupPerGameSettings();
|
SpaceEngineersGame.SetupPerGameSettings();
|
||||||
// I'm sorry, but it's what Keen does in SpaceEngineers.MyProgram
|
// I'm sorry, but it's what Keen does in SpaceEngineers.MyProgram
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="4.4.1" targetFramework="net461" />
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@@ -1,36 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
[assembly: AssemblyTitle("Torch Server Tests")]
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("Torch.Server.Tests")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Torch.Server.Tests")]
|
[assembly: AssemblyProduct("Torch")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[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)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
#if DEBUG
|
||||||
[assembly: Guid("9efd1d91-2fa2-47ed-b537-d8bc3b0e543e")]
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
// Version information for an assembly consists of the following four values:
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
//
|
#endif
|
||||||
// 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")]
|
|
@@ -34,6 +34,10 @@
|
|||||||
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Server.Tests.xml</DocumentationFile>
|
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Server.Tests.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -56,6 +60,9 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="TorchServerReflectionTest.cs" />
|
<Compile Include="TorchServerReflectionTest.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -82,4 +89,5 @@
|
|||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
</Project>
|
</Project>
|
@@ -1,5 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
||||||
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
||||||
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
||||||
|
185
Torch.Server/Initializer.cs
Normal file
185
Torch.Server/Initializer.cs
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
using NLog;
|
||||||
|
using Torch.Utils;
|
||||||
|
|
||||||
|
namespace Torch.Server
|
||||||
|
{
|
||||||
|
public class Initializer
|
||||||
|
{
|
||||||
|
private static readonly Logger Log = LogManager.GetLogger(nameof(Initializer));
|
||||||
|
private bool _init;
|
||||||
|
private const string STEAMCMD_DIR = "steamcmd";
|
||||||
|
private const string STEAMCMD_ZIP = "temp.zip";
|
||||||
|
private static readonly string STEAMCMD_PATH = $"{STEAMCMD_DIR}\\steamcmd.exe";
|
||||||
|
private static readonly string RUNSCRIPT_PATH = $"{STEAMCMD_DIR}\\runscript.txt";
|
||||||
|
private const string RUNSCRIPT = @"force_install_dir ../
|
||||||
|
login anonymous
|
||||||
|
app_update 298740
|
||||||
|
quit";
|
||||||
|
|
||||||
|
private TorchAssemblyResolver _resolver;
|
||||||
|
private TorchConfig _config;
|
||||||
|
private TorchServer _server;
|
||||||
|
private string _basePath;
|
||||||
|
|
||||||
|
public TorchConfig Config => _config;
|
||||||
|
public TorchServer Server => _server;
|
||||||
|
|
||||||
|
public Initializer(string basePath)
|
||||||
|
{
|
||||||
|
_basePath = basePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Initialize(string[] args)
|
||||||
|
{
|
||||||
|
if (_init)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
AppDomain.CurrentDomain.UnhandledException += HandleException;
|
||||||
|
|
||||||
|
if (!args.Contains("-noupdate"))
|
||||||
|
RunSteamCmd();
|
||||||
|
|
||||||
|
_resolver = new TorchAssemblyResolver(Path.Combine(_basePath, "DedicatedServer64"));
|
||||||
|
_config = InitConfig();
|
||||||
|
if (!_config.Parse(args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(_config.WaitForPID))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pid = int.Parse(_config.WaitForPID);
|
||||||
|
var waitProc = Process.GetProcessById(pid);
|
||||||
|
Log.Info("Continuing in 5 seconds.");
|
||||||
|
Thread.Sleep(5000);
|
||||||
|
if (!waitProc.HasExited)
|
||||||
|
{
|
||||||
|
Log.Warn($"Killing old process {pid}.");
|
||||||
|
waitProc.Kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_init = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
_server = new TorchServer(_config);
|
||||||
|
_server.Init();
|
||||||
|
|
||||||
|
if (!_config.NoGui)
|
||||||
|
{
|
||||||
|
var ui = new TorchUI(_server);
|
||||||
|
if (_config.Autostart)
|
||||||
|
new Thread(_server.Start).Start();
|
||||||
|
ui.ShowDialog();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_server.Start();
|
||||||
|
|
||||||
|
_resolver?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TorchConfig InitConfig()
|
||||||
|
{
|
||||||
|
var configName = "Torch.cfg";
|
||||||
|
var configPath = Path.Combine(Directory.GetCurrentDirectory(), configName);
|
||||||
|
if (File.Exists(configName))
|
||||||
|
{
|
||||||
|
Log.Info($"Loading config {configPath}");
|
||||||
|
return TorchConfig.LoadFrom(configPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Info($"Generating default config at {configPath}");
|
||||||
|
var config = new TorchConfig { InstancePath = Path.GetFullPath("Instance") };
|
||||||
|
config.Save(configPath);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RunSteamCmd()
|
||||||
|
{
|
||||||
|
var log = LogManager.GetLogger("SteamCMD");
|
||||||
|
|
||||||
|
if (!Directory.Exists(STEAMCMD_DIR))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(STEAMCMD_DIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(RUNSCRIPT_PATH))
|
||||||
|
File.WriteAllText(RUNSCRIPT_PATH, RUNSCRIPT);
|
||||||
|
|
||||||
|
if (!File.Exists(STEAMCMD_PATH))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.Info("Downloading SteamCMD.");
|
||||||
|
using (var client = new WebClient())
|
||||||
|
client.DownloadFile("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip", STEAMCMD_ZIP);
|
||||||
|
|
||||||
|
ZipFile.ExtractToDirectory(STEAMCMD_ZIP, STEAMCMD_DIR);
|
||||||
|
File.Delete(STEAMCMD_ZIP);
|
||||||
|
log.Info("SteamCMD downloaded successfully!");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
log.Error("Failed to download SteamCMD, unable to update the DS.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("Checking for DS updates.");
|
||||||
|
var steamCmdProc = new ProcessStartInfo(STEAMCMD_PATH, "+runscript runscript.txt")
|
||||||
|
{
|
||||||
|
WorkingDirectory = Path.Combine(Directory.GetCurrentDirectory(), STEAMCMD_DIR),
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
StandardOutputEncoding = Encoding.ASCII
|
||||||
|
};
|
||||||
|
var cmd = Process.Start(steamCmdProc);
|
||||||
|
|
||||||
|
// ReSharper disable once PossibleNullReferenceException
|
||||||
|
while (!cmd.HasExited)
|
||||||
|
{
|
||||||
|
log.Info(cmd.StandardOutput.ReadLine());
|
||||||
|
Thread.Sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void HandleException(object sender, UnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
var ex = (Exception)e.ExceptionObject;
|
||||||
|
Log.Fatal(ex);
|
||||||
|
Console.WriteLine("Exiting in 5 seconds.");
|
||||||
|
Thread.Sleep(5000);
|
||||||
|
if (_config.RestartOnCrash)
|
||||||
|
{
|
||||||
|
var exe = typeof(Program).Assembly.Location;
|
||||||
|
_config.WaitForPID = Process.GetCurrentProcess().Id.ToString();
|
||||||
|
Process.Start(exe, _config.ToString());
|
||||||
|
}
|
||||||
|
//1627 = Function failed during execution.
|
||||||
|
Environment.Exit(1627);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -131,7 +131,7 @@ namespace Torch.Server.Managers
|
|||||||
|
|
||||||
public void SaveConfig()
|
public void SaveConfig()
|
||||||
{
|
{
|
||||||
DedicatedConfig.Save();
|
DedicatedConfig.Save(Path.Combine(Torch.Config.InstancePath, CONFIG_NAME));
|
||||||
Log.Info("Saved dedicated config.");
|
Log.Info("Saved dedicated config.");
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@@ -25,6 +25,7 @@ using System.IO.Compression;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Security.Policy;
|
using System.Security.Policy;
|
||||||
using Torch.Server.Managers;
|
using Torch.Server.Managers;
|
||||||
|
using Torch.Utils;
|
||||||
using VRage.FileSystem;
|
using VRage.FileSystem;
|
||||||
using VRageRender;
|
using VRageRender;
|
||||||
|
|
||||||
@@ -32,268 +33,32 @@ namespace Torch.Server
|
|||||||
{
|
{
|
||||||
internal static class Program
|
internal static class Program
|
||||||
{
|
{
|
||||||
private static ITorchServer _server;
|
/// <remarks>
|
||||||
private static Logger _log = LogManager.GetLogger("Torch");
|
|
||||||
private static bool _restartOnCrash;
|
|
||||||
private static TorchConfig _config;
|
|
||||||
private static bool _steamCmdDone;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This method must *NOT* load any types/assemblies from the vanilla game, otherwise automatic updates will fail.
|
/// This method must *NOT* load any types/assemblies from the vanilla game, otherwise automatic updates will fail.
|
||||||
/// </summary>
|
/// </remarks>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
//Ensures that all the files are downloaded in the Torch directory.
|
//Ensures that all the files are downloaded in the Torch directory.
|
||||||
Directory.SetCurrentDirectory(new FileInfo(typeof(Program).Assembly.Location).Directory.ToString());
|
var workingDir = new FileInfo(typeof(Program).Assembly.Location).Directory.ToString();
|
||||||
|
var binDir = Path.Combine(workingDir, "DedicatedServer64");
|
||||||
foreach (var file in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.old"))
|
Directory.SetCurrentDirectory(workingDir);
|
||||||
File.Delete(file);
|
|
||||||
|
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
|
|
||||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
|
||||||
|
|
||||||
if (!Environment.UserInteractive)
|
if (!Environment.UserInteractive)
|
||||||
{
|
{
|
||||||
using (var service = new TorchService())
|
using (var service = new TorchService())
|
||||||
|
using (new TorchAssemblyResolver(binDir))
|
||||||
{
|
{
|
||||||
ServiceBase.Run(service);
|
ServiceBase.Run(service);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//CommandLine reflection triggers assembly loading, so DS update must be completely separated.
|
var initializer = new Initializer(workingDir);
|
||||||
if (!args.Contains("-noupdate"))
|
if (!initializer.Initialize(args))
|
||||||
{
|
|
||||||
if (!Directory.Exists("DedicatedServer64"))
|
|
||||||
{
|
|
||||||
_log.Error("Game libraries not found. Press the Enter key to install the dedicated server.");
|
|
||||||
Console.ReadLine();
|
|
||||||
}
|
|
||||||
RunSteamCmd();
|
|
||||||
}
|
|
||||||
|
|
||||||
InitConfig();
|
|
||||||
|
|
||||||
if (!_config.Parse(args))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(_config.WaitForPID))
|
initializer.Run();
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var pid = int.Parse(_config.WaitForPID);
|
|
||||||
var waitProc = Process.GetProcessById(pid);
|
|
||||||
_log.Info("Continuing in 5 seconds.");
|
|
||||||
Thread.Sleep(5000);
|
|
||||||
if (!waitProc.HasExited)
|
|
||||||
{
|
|
||||||
_log.Warn($"Killing old process {pid}.");
|
|
||||||
waitProc.Kill();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_restartOnCrash = _config.RestartOnCrash;
|
|
||||||
RunServer(_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void InitConfig()
|
|
||||||
{
|
|
||||||
var configName = "Torch.cfg";
|
|
||||||
var configPath = Path.Combine(Directory.GetCurrentDirectory(), configName);
|
|
||||||
if (File.Exists(configName))
|
|
||||||
{
|
|
||||||
_log.Info($"Loading config {configPath}");
|
|
||||||
_config = TorchConfig.LoadFrom(configPath);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_log.Info($"Generating default config at {configPath}");
|
|
||||||
_config = new TorchConfig { InstancePath = Path.GetFullPath("Instance") };
|
|
||||||
_config.Save(configPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private const string STEAMCMD_DIR = "steamcmd";
|
|
||||||
private const string STEAMCMD_ZIP = "temp.zip";
|
|
||||||
private static readonly string STEAMCMD_PATH = $"{STEAMCMD_DIR}\\steamcmd.exe";
|
|
||||||
private static readonly string RUNSCRIPT_PATH = $"{STEAMCMD_DIR}\\runscript.txt";
|
|
||||||
private const string RUNSCRIPT = @"force_install_dir ../
|
|
||||||
login anonymous
|
|
||||||
app_update 298740
|
|
||||||
quit";
|
|
||||||
|
|
||||||
public static void RunSteamCmd()
|
|
||||||
{
|
|
||||||
if (_steamCmdDone)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var log = LogManager.GetLogger("SteamCMD");
|
|
||||||
|
|
||||||
if (!Directory.Exists(STEAMCMD_DIR))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(STEAMCMD_DIR);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!File.Exists(RUNSCRIPT_PATH))
|
|
||||||
File.WriteAllText(RUNSCRIPT_PATH, RUNSCRIPT);
|
|
||||||
|
|
||||||
if (!File.Exists(STEAMCMD_PATH))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
log.Info("Downloading SteamCMD.");
|
|
||||||
using (var client = new WebClient())
|
|
||||||
client.DownloadFile("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip", STEAMCMD_ZIP);
|
|
||||||
|
|
||||||
ZipFile.ExtractToDirectory(STEAMCMD_ZIP, STEAMCMD_DIR);
|
|
||||||
File.Delete(STEAMCMD_ZIP);
|
|
||||||
log.Info("SteamCMD downloaded successfully!");
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
log.Error("Failed to download SteamCMD, unable to update the DS.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("Checking for DS updates.");
|
|
||||||
var steamCmdProc = new ProcessStartInfo(STEAMCMD_PATH, "+runscript runscript.txt")
|
|
||||||
{
|
|
||||||
WorkingDirectory = Path.Combine(Directory.GetCurrentDirectory(), STEAMCMD_DIR),
|
|
||||||
UseShellExecute = false,
|
|
||||||
RedirectStandardOutput = true,
|
|
||||||
StandardOutputEncoding = Encoding.ASCII
|
|
||||||
};
|
|
||||||
var cmd = Process.Start(steamCmdProc);
|
|
||||||
|
|
||||||
// ReSharper disable once PossibleNullReferenceException
|
|
||||||
while (!cmd.HasExited)
|
|
||||||
{
|
|
||||||
log.Info(cmd.StandardOutput.ReadLine());
|
|
||||||
Thread.Sleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
_steamCmdDone = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void RunServer(TorchConfig config)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (!parser.ParseArguments(args, config))
|
|
||||||
{
|
|
||||||
_log.Error($"Parsing arguments failed: {string.Join(" ", args)}");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(config.Config) && File.Exists(config.Config))
|
|
||||||
{
|
|
||||||
config = ServerConfig.LoadFrom(config.Config);
|
|
||||||
parser.ParseArguments(args, config);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//RestartOnCrash autostart autosave=15
|
|
||||||
//gamepath ="C:\Program Files\Space Engineers DS" instance="Hydro Survival" instancepath="C:\ProgramData\SpaceEngineersDedicated\Hydro Survival"
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (config.InstallService)
|
|
||||||
{
|
|
||||||
var serviceName = $"\"Torch - {config.InstanceName}\"";
|
|
||||||
// Working on installing the service properly instead of with sc.exe
|
|
||||||
_log.Info($"Installing service '{serviceName}");
|
|
||||||
var exePath = $"\"{Assembly.GetExecutingAssembly().Location}\"";
|
|
||||||
var createInfo = new ServiceCreateInfo
|
|
||||||
{
|
|
||||||
Name = config.InstanceName,
|
|
||||||
BinaryPath = exePath,
|
|
||||||
};
|
|
||||||
_log.Info("Service Installed");
|
|
||||||
|
|
||||||
var runArgs = string.Join(" ", args.Skip(1));
|
|
||||||
_log.Info($"Installing Torch as a service with arguments '{runArgs}'");
|
|
||||||
var startInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = "sc.exe",
|
|
||||||
Arguments = $"create Torch binPath=\"{Assembly.GetExecutingAssembly().Location} {runArgs}\"",
|
|
||||||
CreateNoWindow = true,
|
|
||||||
UseShellExecute = true,
|
|
||||||
Verb = "runas"
|
|
||||||
};
|
|
||||||
Process.Start(startInfo).WaitForExit();
|
|
||||||
_log.Info("Torch service installed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.UninstallService)
|
|
||||||
{
|
|
||||||
_log.Info("Uninstalling Torch service");
|
|
||||||
var startInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = "sc.exe",
|
|
||||||
Arguments = "delete Torch",
|
|
||||||
CreateNoWindow = true,
|
|
||||||
UseShellExecute = true,
|
|
||||||
Verb = "runas"
|
|
||||||
};
|
|
||||||
Process.Start(startInfo).WaitForExit();
|
|
||||||
_log.Info("Torch service uninstalled");
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
_server = new TorchServer(config);
|
|
||||||
|
|
||||||
_server.Init();
|
|
||||||
if (config.NoGui || config.Autostart)
|
|
||||||
{
|
|
||||||
new Thread(() => _server.Start()).Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!config.NoGui)
|
|
||||||
{
|
|
||||||
var ui = new TorchUI((TorchServer)_server);
|
|
||||||
ui.ShowDialog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var basePath = Path.Combine(Path.GetDirectoryName(typeof(Program).Assembly.Location), "DedicatedServer64");
|
|
||||||
string asmPath = Path.Combine(basePath, new AssemblyName(args.Name).Name + ".dll");
|
|
||||||
if (File.Exists(asmPath))
|
|
||||||
return Assembly.LoadFrom(asmPath);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// ignored
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
|
||||||
{
|
|
||||||
var ex = (Exception)e.ExceptionObject;
|
|
||||||
_log.Fatal(ex);
|
|
||||||
Console.WriteLine("Exiting in 5 seconds.");
|
|
||||||
Thread.Sleep(5000);
|
|
||||||
if (_restartOnCrash)
|
|
||||||
{
|
|
||||||
var exe = typeof(Program).Assembly.Location;
|
|
||||||
_config.WaitForPID = Process.GetCurrentProcess().Id.ToString();
|
|
||||||
Process.Start(exe, _config.ToString());
|
|
||||||
}
|
|
||||||
//1627 = Function failed during execution.
|
|
||||||
Environment.Exit(1627);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("1.1.229.265")]
|
[assembly: AssemblyTitle("Torch Server")]
|
||||||
[assembly: AssemblyFileVersion("1.1.229.265")]
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("Torch")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
|
#endif
|
@@ -1,16 +0,0 @@
|
|||||||
<#@ template debug="false" hostspecific="false" language="C#" #>
|
|
||||||
<#@ assembly name="System.Core" #>
|
|
||||||
<#@ import namespace="System.Linq" #>
|
|
||||||
<#@ import namespace="System.Text" #>
|
|
||||||
<#@ import namespace="System.Collections.Generic" #>
|
|
||||||
<#@ output extension=".cs" #>
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
<# var dt = DateTime.Now;
|
|
||||||
int major = 1;
|
|
||||||
int minor = 1;
|
|
||||||
int build = dt.DayOfYear;
|
|
||||||
int rev = (int)dt.TimeOfDay.TotalMinutes / 2;
|
|
||||||
#>
|
|
||||||
[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")]
|
|
||||||
[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")]
|
|
@@ -1,12 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
[assembly: AssemblyTitle("Torch Server")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("Torch")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
[assembly: ComVisible(false)]
|
|
@@ -13,6 +13,8 @@
|
|||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -61,7 +63,8 @@
|
|||||||
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.4.4.11\lib\net45\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Sandbox.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Sandbox.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
@@ -184,15 +187,14 @@
|
|||||||
<Reference Include="PresentationFramework" />
|
<Reference Include="PresentationFramework" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="ListBoxExtensions.cs" />
|
<Compile Include="ListBoxExtensions.cs" />
|
||||||
<Compile Include="Managers\InstanceManager.cs" />
|
<Compile Include="Managers\InstanceManager.cs" />
|
||||||
<Compile Include="NativeMethods.cs" />
|
<Compile Include="NativeMethods.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs">
|
<Compile Include="Initializer.cs" />
|
||||||
<AutoGen>True</AutoGen>
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<DependentUpon>AssemblyInfo.tt</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\AssemblyInfo1.cs" />
|
|
||||||
<Compile Include="ServerStatistics.cs" />
|
<Compile Include="ServerStatistics.cs" />
|
||||||
<Compile Include="TorchConfig.cs" />
|
<Compile Include="TorchConfig.cs" />
|
||||||
<Compile Include="TorchService.cs">
|
<Compile Include="TorchService.cs">
|
||||||
@@ -357,22 +359,10 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="Properties\AssemblyInfo.tt">
|
|
||||||
<Generator>TextTemplatingFileGenerator</Generator>
|
|
||||||
<LastGenOutput>AssemblyInfo.cs</LastGenOutput>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>copy "$(SolutionDir)NLog.config" "$(TargetDir)"</PostBuildEvent>
|
<PostBuildEvent>copy "$(SolutionDir)NLog.config" "$(TargetDir)"</PostBuildEvent>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<!-- 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>
|
|
||||||
-->
|
|
||||||
</Project>
|
</Project>
|
@@ -8,6 +8,7 @@ using NLog;
|
|||||||
|
|
||||||
namespace Torch.Server
|
namespace Torch.Server
|
||||||
{
|
{
|
||||||
|
// TODO: redesign this gerbage
|
||||||
public class TorchConfig : CommandLine, ITorchConfig
|
public class TorchConfig : CommandLine, ITorchConfig
|
||||||
{
|
{
|
||||||
private static Logger _log = LogManager.GetLogger("Config");
|
private static Logger _log = LogManager.GetLogger("Config");
|
||||||
|
@@ -145,9 +145,17 @@ namespace Torch.Server
|
|||||||
VRage.Service.ExitListenerSTA.OnExit += delegate { MySandboxGame.Static?.Exit(); };
|
VRage.Service.ExitListenerSTA.OnExit += delegate { MySandboxGame.Static?.Exit(); };
|
||||||
|
|
||||||
base.Start();
|
base.Start();
|
||||||
//Stops RunInternal from calling MyFileSystem.InitUserSpecific(null), we call it in InstanceManager.
|
// Stops RunInternal from calling MyFileSystem.InitUserSpecific(null), we call it in InstanceManager.
|
||||||
MySandboxGame.IsReloading = true;
|
MySandboxGame.IsReloading = true;
|
||||||
_dsRunInternal.Invoke();
|
try
|
||||||
|
{
|
||||||
|
_dsRunInternal.Invoke();
|
||||||
|
}
|
||||||
|
catch (TargetInvocationException e)
|
||||||
|
{
|
||||||
|
// Makes log formatting a little nicer.
|
||||||
|
throw e.InnerException ?? e;
|
||||||
|
}
|
||||||
|
|
||||||
MySandboxGame.Log.Close();
|
MySandboxGame.Log.Close();
|
||||||
State = ServerState.Stopped;
|
State = ServerState.Stopped;
|
||||||
|
@@ -14,13 +14,15 @@ namespace Torch.Server
|
|||||||
{
|
{
|
||||||
public const string Name = "Torch (SEDS)";
|
public const string Name = "Torch (SEDS)";
|
||||||
private TorchServer _server;
|
private TorchServer _server;
|
||||||
private static Logger _log = LogManager.GetLogger("Torch");
|
private Initializer _initializer;
|
||||||
|
|
||||||
public TorchService()
|
public TorchService()
|
||||||
{
|
{
|
||||||
ServiceName = Name;
|
var workingDir = new FileInfo(typeof(TorchService).Assembly.Location).Directory.ToString();
|
||||||
|
Directory.SetCurrentDirectory(workingDir);
|
||||||
|
_initializer = new Initializer(workingDir);
|
||||||
|
|
||||||
CanHandlePowerEvent = true;
|
ServiceName = Name;
|
||||||
CanHandleSessionChangeEvent = false;
|
CanHandleSessionChangeEvent = false;
|
||||||
CanPauseAndContinue = false;
|
CanPauseAndContinue = false;
|
||||||
CanStop = true;
|
CanStop = true;
|
||||||
@@ -31,17 +33,8 @@ namespace Torch.Server
|
|||||||
{
|
{
|
||||||
base.OnStart(args);
|
base.OnStart(args);
|
||||||
|
|
||||||
string configName = args.Length > 0 ? args[0] : "Torch.cfg";
|
_initializer.Initialize(args);
|
||||||
var options = new TorchConfig("Torch");
|
_initializer.Run();
|
||||||
if (File.Exists(configName))
|
|
||||||
options = TorchConfig.LoadFrom(configName);
|
|
||||||
else
|
|
||||||
options.Save(configName);
|
|
||||||
|
|
||||||
_server = new TorchServer(options);
|
|
||||||
_server.Init();
|
|
||||||
_server.RunArgs = args;
|
|
||||||
Task.Run(() => _server.Start());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -50,17 +43,5 @@ namespace Torch.Server
|
|||||||
_server.Stop();
|
_server.Stop();
|
||||||
base.OnStop();
|
base.OnStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void OnShutdown()
|
|
||||||
{
|
|
||||||
base.OnShutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
|
|
||||||
{
|
|
||||||
return base.OnPowerEvent(powerStatus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,20 +10,9 @@
|
|||||||
<RowDefinition/>
|
<RowDefinition/>
|
||||||
<RowDefinition Height="Auto"/>
|
<RowDefinition Height="Auto"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<ListView Grid.Row="0" x:Name="ChatItems" ItemsSource="{Binding ChatHistory}" Margin="5,5,5,5">
|
<ScrollViewer x:Name="ChatScroller" Grid.Row="0" Margin="5,5,5,5" HorizontalScrollBarVisibility="Disabled">
|
||||||
<ScrollViewer HorizontalScrollBarVisibility="Disabled"/>
|
<TextBlock x:Name="ChatItems" />
|
||||||
<ListView.ItemTemplate>
|
</ScrollViewer>
|
||||||
<DataTemplate>
|
|
||||||
<WrapPanel>
|
|
||||||
<TextBlock Text="{Binding Timestamp}"/>
|
|
||||||
<TextBlock Text=" "/>
|
|
||||||
<TextBlock Text="{Binding Name}" FontWeight="Bold"/>
|
|
||||||
<TextBlock Text=": "/>
|
|
||||||
<TextBlock Text="{Binding Message}"/>
|
|
||||||
</WrapPanel>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListView.ItemTemplate>
|
|
||||||
</ListView>
|
|
||||||
<Grid Grid.Row="1">
|
<Grid Grid.Row="1">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition/>
|
<ColumnDefinition/>
|
||||||
|
@@ -41,23 +41,32 @@ namespace Torch.Server
|
|||||||
{
|
{
|
||||||
_server = (TorchBase)server;
|
_server = (TorchBase)server;
|
||||||
_multiplayer = (MultiplayerManager)server.Multiplayer;
|
_multiplayer = (MultiplayerManager)server.Multiplayer;
|
||||||
ChatItems.Items.Clear();
|
|
||||||
DataContext = _multiplayer;
|
DataContext = _multiplayer;
|
||||||
|
|
||||||
|
ChatItems.Inlines.Clear();
|
||||||
|
_multiplayer.ChatHistory.ForEach(InsertMessage);
|
||||||
if (_multiplayer.ChatHistory is INotifyCollectionChanged ncc)
|
if (_multiplayer.ChatHistory is INotifyCollectionChanged ncc)
|
||||||
ncc.CollectionChanged += ChatHistory_CollectionChanged;
|
ncc.CollectionChanged += ChatHistory_CollectionChanged;
|
||||||
|
ChatScroller.ScrollToBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ChatHistory_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
private void ChatHistory_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ChatItems.ScrollToItem(ChatItems.Items.Count - 1);
|
foreach (IChatMessage msg in e.NewItems)
|
||||||
/*
|
InsertMessage(msg);
|
||||||
if (VisualTreeHelper.GetChildrenCount(ChatItems) > 0)
|
}
|
||||||
{
|
|
||||||
|
|
||||||
Border border = (Border)VisualTreeHelper.GetChild(ChatItems, 0);
|
private void InsertMessage(IChatMessage msg)
|
||||||
ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
|
{
|
||||||
scrollViewer.ScrollToBottom();
|
bool atBottom = ChatScroller.VerticalOffset + 8 > ChatScroller.ScrollableHeight;
|
||||||
}*/
|
var span = new Span();
|
||||||
|
span.Inlines.Add($"{msg.Timestamp} ");
|
||||||
|
span.Inlines.Add(new Run(msg.Name) { Foreground = msg.Name == "Server" ? Brushes.DarkBlue : Brushes.Blue });
|
||||||
|
span.Inlines.Add($": {msg.Message}");
|
||||||
|
span.Inlines.Add(new LineBreak());
|
||||||
|
ChatItems.Inlines.Add(span);
|
||||||
|
if (atBottom)
|
||||||
|
ChatScroller.ScrollToBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendButton_Click(object sender, RoutedEventArgs e)
|
private void SendButton_Click(object sender, RoutedEventArgs e)
|
||||||
@@ -81,7 +90,7 @@ namespace Torch.Server
|
|||||||
var commands = _server.Commands;
|
var commands = _server.Commands;
|
||||||
if (commands.IsCommand(text))
|
if (commands.IsCommand(text))
|
||||||
{
|
{
|
||||||
_multiplayer.ChatHistory.Add(new ChatMessage(DateTime.Now, 0, "Server", text));
|
_multiplayer.ChatHistory.Add(new ChatMessage(DateTime.Now, 0, "Server", text));
|
||||||
_server.Invoke(() =>
|
_server.Invoke(() =>
|
||||||
{
|
{
|
||||||
var response = commands.HandleCommandFromServer(text);
|
var response = commands.HandleCommandFromServer(text);
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net461" />
|
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net461" />
|
||||||
<package id="NLog" version="4.4.11" targetFramework="net461" />
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
@@ -1,36 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
[assembly: AssemblyTitle("Torch Tests")]
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("Torch.Tests")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Torch.Tests")]
|
[assembly: AssemblyProduct("Torch")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[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)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
#if DEBUG
|
||||||
[assembly: Guid("c3c8b671-6ad1-44aa-a8da-e0c0dc0fedf5")]
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
// Version information for an assembly consists of the following four values:
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
//
|
#endif
|
||||||
// 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")]
|
|
@@ -34,6 +34,10 @@
|
|||||||
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Tests.xml</DocumentationFile>
|
<DocumentationFile>$(SolutionDir)\bin-test\x64\Release\Torch.Tests.xml</DocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -56,9 +60,12 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ReflectionTestManager.cs" />
|
<Compile Include="ReflectionTestManager.cs" />
|
||||||
<Compile Include="ReflectionSystemTest.cs" />
|
<Compile Include="ReflectionSystemTest.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="TestUtils.cs" />
|
<Compile Include="TestUtils.cs" />
|
||||||
<Compile Include="TorchReflectionTest.cs" />
|
<Compile Include="TorchReflectionTest.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -76,5 +83,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
</Project>
|
</Project>
|
@@ -1,5 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
<package id="xunit" version="2.2.0" targetFramework="net461" />
|
||||||
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
<package id="xunit.abstractions" version="2.0.1" targetFramework="net461" />
|
||||||
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
<package id="xunit.assert" version="2.2.0" targetFramework="net461" />
|
||||||
|
@@ -22,6 +22,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Torch.Server.Tests", "Torch
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Torch.Client.Tests", "Torch.Client.Tests\Torch.Client.Tests.csproj", "{632E78C0-0DAC-4B71-B411-2F1B333CC310}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Torch.Client.Tests", "Torch.Client.Tests\Torch.Client.Tests.csproj", "{632E78C0-0DAC-4B71-B411-2F1B333CC310}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Versioning", "Versioning", "{762F6A0D-55EF-4173-8CDE-309D183F40C4}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
Versioning\AssemblyVersion.cs = Versioning\AssemblyVersion.cs
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
@@ -60,6 +65,9 @@ Global
|
|||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{762F6A0D-55EF-4173-8CDE-309D183F40C4} = {7AD02A71-1D4C-48F9-A8C1-789A5512424F}
|
||||||
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {BB51D91F-958D-4B63-A897-3C40642ACD3E}
|
SolutionGuid = {BB51D91F-958D-4B63-A897-3C40642ACD3E}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
@@ -62,7 +62,7 @@ namespace Torch.Commands
|
|||||||
_parameters = commandMethod.GetParameters();
|
_parameters = commandMethod.GetParameters();
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
sb.Append($"/{string.Join(" ", Path)} ");
|
sb.Append($"!{string.Join(" ", Path)} ");
|
||||||
for (var i = 0; i < _parameters.Length; i++)
|
for (var i = 0; i < _parameters.Length; i++)
|
||||||
{
|
{
|
||||||
var param = _parameters[i];
|
var param = _parameters[i];
|
||||||
|
@@ -108,6 +108,9 @@ namespace Torch.Managers
|
|||||||
|
|
||||||
private async void CheckAndUpdateTorch()
|
private async void CheckAndUpdateTorch()
|
||||||
{
|
{
|
||||||
|
// Doesn't work properly or reliably, TODO update when Jenkins is fully configured
|
||||||
|
return;
|
||||||
|
|
||||||
if (!Torch.Config.GetTorchUpdates)
|
if (!Torch.Config.GetTorchUpdates)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@@ -1,36 +1,17 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
[assembly: AssemblyTitle("Torch")]
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("Piston")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("Piston")]
|
[assembly: AssemblyProduct("Torch")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
[assembly: AssemblyCopyright("Copyright © Torch API 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[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)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
#if DEBUG
|
||||||
[assembly: Guid("7e01635c-3b67-472e-bcd6-c5539564f214")]
|
[assembly: AssemblyConfiguration("Debug")]
|
||||||
|
#else
|
||||||
// Version information for an assembly consists of the following four values:
|
[assembly: AssemblyConfiguration("Release")]
|
||||||
//
|
#endif
|
||||||
// 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")]
|
|
49
Torch/Session/TorchSession.cs
Normal file
49
Torch/Session/TorchSession.cs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NLog;
|
||||||
|
using Sandbox.Game.World;
|
||||||
|
using Torch.API;
|
||||||
|
using Torch.API.Managers;
|
||||||
|
using Torch.API.Session;
|
||||||
|
using Torch.Managers;
|
||||||
|
|
||||||
|
namespace Torch.Session
|
||||||
|
{
|
||||||
|
public class TorchSession : ITorchSession
|
||||||
|
{
|
||||||
|
private static readonly Logger _log = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Torch instance this session is bound to
|
||||||
|
/// </summary>
|
||||||
|
public ITorchBase Torch { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Space Engineers game session this session is bound to.
|
||||||
|
/// </summary>
|
||||||
|
public MySession KeenSession { get; }
|
||||||
|
|
||||||
|
/// <inheritdoc cref="IDependencyManager"/>
|
||||||
|
public IDependencyManager Managers { get; }
|
||||||
|
|
||||||
|
public TorchSession(ITorchBase torch, MySession keenSession)
|
||||||
|
{
|
||||||
|
Torch = torch;
|
||||||
|
KeenSession = keenSession;
|
||||||
|
Managers = new DependencyManager(torch.Managers);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Attach()
|
||||||
|
{
|
||||||
|
Managers.Attach();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Detach()
|
||||||
|
{
|
||||||
|
Managers.Detach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
93
Torch/Session/TorchSessionManager.cs
Normal file
93
Torch/Session/TorchSessionManager.cs
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using NLog;
|
||||||
|
using Sandbox.Game.World;
|
||||||
|
using Torch.API;
|
||||||
|
using Torch.API.Managers;
|
||||||
|
using Torch.API.Session;
|
||||||
|
using Torch.Managers;
|
||||||
|
using Torch.Session;
|
||||||
|
|
||||||
|
namespace Torch.Session
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Manages the creation and destruction of <see cref="TorchSession"/> instances for each <see cref="MySession"/> created by Space Engineers.
|
||||||
|
/// </summary>
|
||||||
|
public class TorchSessionManager : Manager, ITorchSessionManager
|
||||||
|
{
|
||||||
|
private static readonly Logger _log = LogManager.GetCurrentClassLogger();
|
||||||
|
private TorchSession _currentSession;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public ITorchSession CurrentSession => _currentSession;
|
||||||
|
|
||||||
|
private readonly HashSet<SessionManagerFactoryDel> _factories = new HashSet<SessionManagerFactoryDel>();
|
||||||
|
|
||||||
|
public TorchSessionManager(ITorchBase torchInstance) : base(torchInstance)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool AddFactory(SessionManagerFactoryDel factory)
|
||||||
|
{
|
||||||
|
if (factory == null)
|
||||||
|
throw new ArgumentNullException(nameof(factory), "Factory must be non-null");
|
||||||
|
return _factories.Add(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool RemoveFactory(SessionManagerFactoryDel factory)
|
||||||
|
{
|
||||||
|
if (factory == null)
|
||||||
|
throw new ArgumentNullException(nameof(factory), "Factory must be non-null");
|
||||||
|
return _factories.Remove(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SessionLoaded()
|
||||||
|
{
|
||||||
|
if (_currentSession != null)
|
||||||
|
{
|
||||||
|
_log.Warn($"Override old torch session {_currentSession.KeenSession.Name}");
|
||||||
|
_currentSession.Detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
_log.Info($"Starting new torch session for {MySession.Static.Name}");
|
||||||
|
_currentSession = new TorchSession(Torch, MySession.Static);
|
||||||
|
foreach (SessionManagerFactoryDel factory in _factories)
|
||||||
|
{
|
||||||
|
IManager manager = factory(CurrentSession);
|
||||||
|
if (manager != null)
|
||||||
|
CurrentSession.Managers.AddManager(manager);
|
||||||
|
}
|
||||||
|
(CurrentSession as TorchSession)?.Attach();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SessionUnloaded()
|
||||||
|
{
|
||||||
|
if (_currentSession == null)
|
||||||
|
return;
|
||||||
|
_log.Info($"Unloading torch session for {_currentSession.KeenSession.Name}");
|
||||||
|
_currentSession.Detach();
|
||||||
|
_currentSession = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override void Attach()
|
||||||
|
{
|
||||||
|
MySession.AfterLoading += SessionLoaded;
|
||||||
|
MySession.OnUnloaded += SessionUnloaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override void Detach()
|
||||||
|
{
|
||||||
|
_currentSession?.Detach();
|
||||||
|
_currentSession = null;
|
||||||
|
MySession.AfterLoading -= SessionLoaded;
|
||||||
|
MySession.OnUnloaded -= SessionUnloaded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -3,9 +3,11 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NLog;
|
||||||
using SteamSDK;
|
using SteamSDK;
|
||||||
using VRage.Steam;
|
using VRage.Steam;
|
||||||
using Sandbox;
|
using Sandbox;
|
||||||
|
using Sandbox.Engine.Networking;
|
||||||
using Torch.Utils;
|
using Torch.Utils;
|
||||||
using VRage.GameServices;
|
using VRage.GameServices;
|
||||||
|
|
||||||
@@ -19,6 +21,9 @@ namespace Torch
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class SteamService : MySteamService
|
public class SteamService : MySteamService
|
||||||
{
|
{
|
||||||
|
private static readonly Logger _log = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
#pragma warning disable 649
|
||||||
[ReflectedSetter(Name = nameof(SteamServerAPI))]
|
[ReflectedSetter(Name = nameof(SteamServerAPI))]
|
||||||
private static Action<MySteamService, SteamServerAPI> _steamServerAPISetter;
|
private static Action<MySteamService, SteamServerAPI> _steamServerAPISetter;
|
||||||
[ReflectedSetter(Name = "m_gameServer")]
|
[ReflectedSetter(Name = "m_gameServer")]
|
||||||
@@ -45,6 +50,7 @@ namespace Torch
|
|||||||
private static Action<MySteamService> RegisterCallbacks;
|
private static Action<MySteamService> RegisterCallbacks;
|
||||||
[ReflectedSetter(Name = nameof(Peer2Peer))]
|
[ReflectedSetter(Name = nameof(Peer2Peer))]
|
||||||
private static Action<MySteamService, IMyPeer2Peer> _steamPeer2PeerSetter;
|
private static Action<MySteamService, IMyPeer2Peer> _steamPeer2PeerSetter;
|
||||||
|
#pragma warning restore 649
|
||||||
|
|
||||||
public SteamService(bool isDedicated, uint appId)
|
public SteamService(bool isDedicated, uint appId)
|
||||||
: base(true, appId)
|
: base(true, appId)
|
||||||
@@ -63,7 +69,10 @@ namespace Torch
|
|||||||
{
|
{
|
||||||
SteamAPI steamApi = SteamAPI.Instance;
|
SteamAPI steamApi = SteamAPI.Instance;
|
||||||
_steamApiSetter.Invoke(this, steamApi);
|
_steamApiSetter.Invoke(this, steamApi);
|
||||||
_steamIsActiveSetter.Invoke(this, steamApi.Init());
|
bool initResult = steamApi.Init();
|
||||||
|
if (!initResult)
|
||||||
|
_log.Warn("Failed to initialize SteamService");
|
||||||
|
_steamIsActiveSetter.Invoke(this, initResult);
|
||||||
|
|
||||||
if (IsActive)
|
if (IsActive)
|
||||||
{
|
{
|
||||||
@@ -76,7 +85,8 @@ namespace Torch
|
|||||||
|
|
||||||
_steamInventoryAPISetter.Invoke(this, new MySteamInventory());
|
_steamInventoryAPISetter.Invoke(this, new MySteamInventory());
|
||||||
RegisterCallbacks(this);
|
RegisterCallbacks(this);
|
||||||
}
|
} else
|
||||||
|
_log.Warn("SteamService isn't initialized; Torch Client won't start");
|
||||||
}
|
}
|
||||||
|
|
||||||
_steamPeer2PeerSetter.Invoke(this, new MySteamPeer2Peer());
|
_steamPeer2PeerSetter.Invoke(this, new MySteamPeer2Peer());
|
||||||
|
@@ -10,6 +10,8 @@
|
|||||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
|
<NuGetPackageImportStamp>
|
||||||
|
</NuGetPackageImportStamp>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
@@ -41,7 +43,7 @@
|
|||||||
<HintPath>..\GameBinaries\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\GameBinaries\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NLog.4.4.1\lib\net45\NLog.dll</HintPath>
|
<HintPath>..\packages\NLog.4.4.12\lib\net45\NLog.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Octokit, Version=0.24.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Octokit, Version=0.24.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
@@ -147,11 +149,14 @@
|
|||||||
<Reference Include="WindowsBase" />
|
<Reference Include="WindowsBase" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\Versioning\AssemblyVersion.cs">
|
||||||
|
<Link>Properties\AssemblyVersion.cs</Link>
|
||||||
|
</Compile>
|
||||||
<Compile Include="ChatMessage.cs" />
|
<Compile Include="ChatMessage.cs" />
|
||||||
<Compile Include="Collections\ObservableList.cs" />
|
<Compile Include="Collections\ObservableList.cs" />
|
||||||
<Compile Include="DispatcherExtensions.cs" />
|
<Compile Include="DispatcherExtensions.cs" />
|
||||||
<Compile Include="Managers\DependencyManager.cs" />
|
<Compile Include="Managers\DependencyManager.cs" />
|
||||||
<Compile Include="Utils\ReflectedManager.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="SaveGameStatus.cs" />
|
<Compile Include="SaveGameStatus.cs" />
|
||||||
<Compile Include="Collections\KeyTree.cs" />
|
<Compile Include="Collections\KeyTree.cs" />
|
||||||
<Compile Include="Collections\ObservableDictionary.cs" />
|
<Compile Include="Collections\ObservableDictionary.cs" />
|
||||||
@@ -180,9 +185,12 @@
|
|||||||
<Compile Include="Utils\Reflection.cs" />
|
<Compile Include="Utils\Reflection.cs" />
|
||||||
<Compile Include="Managers\ScriptingManager.cs" />
|
<Compile Include="Managers\ScriptingManager.cs" />
|
||||||
<Compile Include="Utils\TorchAssemblyResolver.cs" />
|
<Compile Include="Utils\TorchAssemblyResolver.cs" />
|
||||||
|
<Compile Include="Utils\ReflectedManager.cs" />
|
||||||
|
<Compile Include="Session\TorchSessionManager.cs" />
|
||||||
<Compile Include="TorchBase.cs" />
|
<Compile Include="TorchBase.cs" />
|
||||||
<Compile Include="SteamService.cs" />
|
<Compile Include="SteamService.cs" />
|
||||||
<Compile Include="TorchPluginBase.cs" />
|
<Compile Include="TorchPluginBase.cs" />
|
||||||
|
<Compile Include="Session\TorchSession.cs" />
|
||||||
<Compile Include="ViewModels\ModViewModel.cs" />
|
<Compile Include="ViewModels\ModViewModel.cs" />
|
||||||
<Compile Include="Collections\MTObservableCollection.cs" />
|
<Compile Include="Collections\MTObservableCollection.cs" />
|
||||||
<Compile Include="Extensions\MyPlayerCollectionExtensions.cs" />
|
<Compile Include="Extensions\MyPlayerCollectionExtensions.cs" />
|
||||||
@@ -191,7 +199,6 @@
|
|||||||
<Compile Include="ViewModels\PlayerViewModel.cs" />
|
<Compile Include="ViewModels\PlayerViewModel.cs" />
|
||||||
<Compile Include="ViewModels\ViewModel.cs" />
|
<Compile Include="ViewModels\ViewModel.cs" />
|
||||||
<Compile Include="Managers\PluginManager.cs" />
|
<Compile Include="Managers\PluginManager.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="ViewModels\PluginViewModel.cs" />
|
<Compile Include="ViewModels\PluginViewModel.cs" />
|
||||||
<Compile Include="Views\CollectionEditor.xaml.cs">
|
<Compile Include="Views\CollectionEditor.xaml.cs">
|
||||||
<DependentUpon>CollectionEditor.xaml</DependentUpon>
|
<DependentUpon>CollectionEditor.xaml</DependentUpon>
|
||||||
@@ -213,12 +220,9 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<Import Project="$(SolutionDir)\TransformOnBuild.targets" />
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
</Project>
|
@@ -19,9 +19,11 @@ using SpaceEngineers.Game;
|
|||||||
using Torch.API;
|
using Torch.API;
|
||||||
using Torch.API.Managers;
|
using Torch.API.Managers;
|
||||||
using Torch.API.ModAPI;
|
using Torch.API.ModAPI;
|
||||||
|
using Torch.API.Session;
|
||||||
using Torch.Commands;
|
using Torch.Commands;
|
||||||
using Torch.Managers;
|
using Torch.Managers;
|
||||||
using Torch.Utils;
|
using Torch.Utils;
|
||||||
|
using Torch.Session;
|
||||||
using VRage.Collections;
|
using VRage.Collections;
|
||||||
using VRage.FileSystem;
|
using VRage.FileSystem;
|
||||||
using VRage.Game.ObjectBuilder;
|
using VRage.Game.ObjectBuilder;
|
||||||
@@ -51,21 +53,36 @@ namespace Torch
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public ITorchConfig Config { get; protected set; }
|
public ITorchConfig Config { get; protected set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Version TorchVersion { get; protected set; }
|
public Version TorchVersion { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The version of Torch used, with extra data.
|
||||||
|
/// </summary>
|
||||||
|
public string TorchVersionVerbose { get; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Version GameVersion { get; private set; }
|
public Version GameVersion { get; private set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string[] RunArgs { get; set; }
|
public string[] RunArgs { get; set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
[Obsolete("Use GetManager<T>() or the [Dependency] attribute.")]
|
||||||
public IPluginManager Plugins { get; protected set; }
|
public IPluginManager Plugins { get; protected set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
[Obsolete("Use GetManager<T>() or the [Dependency] attribute.")]
|
||||||
public IMultiplayerManager Multiplayer { get; protected set; }
|
public IMultiplayerManager Multiplayer { get; protected set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
[Obsolete("Use GetManager<T>() or the [Dependency] attribute.")]
|
||||||
public EntityManager Entities { get; protected set; }
|
public EntityManager Entities { get; protected set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
[Obsolete("Use GetManager<T>() or the [Dependency] attribute.")]
|
||||||
public INetworkManager Network { get; protected set; }
|
public INetworkManager Network { get; protected set; }
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
[Obsolete("Use GetManager<T>() or the [Dependency] attribute.")]
|
||||||
public CommandManager Commands { get; protected set; }
|
public CommandManager Commands { get; protected set; }
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public ITorchSession CurrentSession => Managers?.GetManager<ITorchSessionManager>()?.CurrentSession;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public event Action SessionLoading;
|
public event Action SessionLoading;
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -97,6 +114,7 @@ namespace Torch
|
|||||||
Instance = this;
|
Instance = this;
|
||||||
|
|
||||||
TorchVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
TorchVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
|
TorchVersionVerbose = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? TorchVersion.ToString();
|
||||||
RunArgs = new string[0];
|
RunArgs = new string[0];
|
||||||
|
|
||||||
Managers = new DependencyManager();
|
Managers = new DependencyManager();
|
||||||
@@ -107,6 +125,7 @@ namespace Torch
|
|||||||
Network = new NetworkManager(this);
|
Network = new NetworkManager(this);
|
||||||
Commands = new CommandManager(this);
|
Commands = new CommandManager(this);
|
||||||
|
|
||||||
|
Managers.AddManager(new TorchSessionManager(this));
|
||||||
Managers.AddManager(new FilesystemManager(this));
|
Managers.AddManager(new FilesystemManager(this));
|
||||||
Managers.AddManager(new UpdateManager(this));
|
Managers.AddManager(new UpdateManager(this));
|
||||||
Managers.AddManager(Network);
|
Managers.AddManager(Network);
|
||||||
@@ -116,7 +135,6 @@ namespace Torch
|
|||||||
Managers.AddManager(Entities);
|
Managers.AddManager(Entities);
|
||||||
Managers.AddManager(new ChatManager(this));
|
Managers.AddManager(new ChatManager(this));
|
||||||
|
|
||||||
|
|
||||||
TorchAPI.Instance = this;
|
TorchAPI.Instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +163,7 @@ namespace Torch
|
|||||||
{
|
{
|
||||||
callback?.Invoke(SaveGameStatus.GameNotReady);
|
callback?.Invoke(SaveGameStatus.GameNotReady);
|
||||||
}
|
}
|
||||||
else if(MyAsyncSaving.InProgress)
|
else if (MyAsyncSaving.InProgress)
|
||||||
{
|
{
|
||||||
callback?.Invoke(SaveGameStatus.SaveInProgress);
|
callback?.Invoke(SaveGameStatus.SaveInProgress);
|
||||||
}
|
}
|
||||||
@@ -234,11 +252,11 @@ namespace Torch
|
|||||||
SpaceEngineersGame.SetupBasicGameInfo();
|
SpaceEngineersGame.SetupBasicGameInfo();
|
||||||
SpaceEngineersGame.SetupPerGameSettings();
|
SpaceEngineersGame.SetupPerGameSettings();
|
||||||
|
|
||||||
TorchVersion = Assembly.GetEntryAssembly().GetName().Version;
|
Debug.Assert(MyPerGameSettings.BasicGameInfo.GameVersion != null, "MyPerGameSettings.BasicGameInfo.GameVersion != null");
|
||||||
GameVersion = new Version(new MyVersion(MyPerGameSettings.BasicGameInfo.GameVersion.Value).FormattedText.ToString().Replace("_", "."));
|
GameVersion = new Version(new MyVersion(MyPerGameSettings.BasicGameInfo.GameVersion.Value).FormattedText.ToString().Replace("_", "."));
|
||||||
var verInfo = $"{Config.InstanceName} - Torch {TorchVersion}, SE {GameVersion}";
|
try { Console.Title = $"{Config.InstanceName} - Torch {TorchVersion}, SE {GameVersion}"; }
|
||||||
try { Console.Title = verInfo; }
|
catch
|
||||||
catch {
|
{
|
||||||
///Running as service
|
///Running as service
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +265,8 @@ namespace Torch
|
|||||||
#else
|
#else
|
||||||
Log.Info("RELEASE");
|
Log.Info("RELEASE");
|
||||||
#endif
|
#endif
|
||||||
Log.Info(verInfo);
|
Log.Info($"Torch Version: {TorchVersionVerbose}");
|
||||||
|
Log.Info($"Game Version: {GameVersion}");
|
||||||
Log.Info($"Executing assembly: {Assembly.GetEntryAssembly().FullName}");
|
Log.Info($"Executing assembly: {Assembly.GetEntryAssembly().FullName}");
|
||||||
Log.Info($"Executing directory: {AppDomain.CurrentDomain.BaseDirectory}");
|
Log.Info($"Executing directory: {AppDomain.CurrentDomain.BaseDirectory}");
|
||||||
|
|
||||||
@@ -336,7 +355,7 @@ namespace Torch
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual void Update()
|
public virtual void Update()
|
||||||
{
|
{
|
||||||
Plugins.UpdatePlugins();
|
GetManager<IPluginManager>().UpdatePlugins();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,15 @@ namespace Torch.Utils
|
|||||||
/// Declaring type of the member to access. If null, inferred from the instance argument type.
|
/// Declaring type of the member to access. If null, inferred from the instance argument type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Type Type { get; set; } = null;
|
public Type Type { get; set; } = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assembly qualified name of <see cref="Type"/>
|
||||||
|
/// </summary>
|
||||||
|
public string TypeName
|
||||||
|
{
|
||||||
|
get => Type?.AssemblyQualifiedName;
|
||||||
|
set => Type = value == null ? null : Type.GetType(value, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -93,6 +102,19 @@ namespace Torch.Utils
|
|||||||
[AttributeUsage(AttributeTargets.Field)]
|
[AttributeUsage(AttributeTargets.Field)]
|
||||||
public class ReflectedMethodAttribute : ReflectedMemberAttribute
|
public class ReflectedMethodAttribute : ReflectedMemberAttribute
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// When set the parameters types for the method are assumed to be this.
|
||||||
|
/// </summary>
|
||||||
|
public Type[] OverrideTypes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Assembly qualified names of <see cref="OverrideTypes"/>
|
||||||
|
/// </summary>
|
||||||
|
public string[] OverrideTypeNames
|
||||||
|
{
|
||||||
|
get => OverrideTypes.Select(x => x.AssemblyQualifiedName).ToArray();
|
||||||
|
set => OverrideTypes = value?.Select(x => x == null ? null : Type.GetType(x)).ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -232,10 +254,14 @@ namespace Torch.Utils
|
|||||||
trueParameterTypes = parameters.Skip(1).Select(x => x.ParameterType).ToArray();
|
trueParameterTypes = parameters.Skip(1).Select(x => x.ParameterType).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var invokeTypes = new Type[trueParameterTypes.Length];
|
||||||
|
for (var i = 0; i < invokeTypes.Length; i++)
|
||||||
|
invokeTypes[i] = attr.OverrideTypes?[i] ?? trueParameterTypes[i];
|
||||||
|
|
||||||
MethodInfo methodInstance = trueType.GetMethod(attr.Name ?? field.Name,
|
MethodInfo methodInstance = trueType.GetMethod(attr.Name ?? field.Name,
|
||||||
(attr is ReflectedStaticMethodAttribute ? BindingFlags.Static : BindingFlags.Instance) |
|
(attr is ReflectedStaticMethodAttribute ? BindingFlags.Static : BindingFlags.Instance) |
|
||||||
BindingFlags.Public |
|
BindingFlags.Public |
|
||||||
BindingFlags.NonPublic, null, CallingConventions.Any, trueParameterTypes, null);
|
BindingFlags.NonPublic, null, CallingConventions.Any, invokeTypes, null);
|
||||||
if (methodInstance == null)
|
if (methodInstance == null)
|
||||||
{
|
{
|
||||||
string methodType = attr is ReflectedStaticMethodAttribute ? "static" : "instance";
|
string methodType = attr is ReflectedStaticMethodAttribute ? "static" : "instance";
|
||||||
@@ -245,13 +271,38 @@ namespace Torch.Utils
|
|||||||
$"Unable to find {methodType} method {attr.Name ?? field.Name} in type {trueType.FullName} with parameters {methodParams}");
|
$"Unable to find {methodType} method {attr.Name ?? field.Name} in type {trueType.FullName} with parameters {methodParams}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (attr is ReflectedStaticMethodAttribute)
|
if (attr is ReflectedStaticMethodAttribute)
|
||||||
field.SetValue(null, Delegate.CreateDelegate(field.FieldType, methodInstance));
|
{
|
||||||
|
if (attr.OverrideTypes != null)
|
||||||
|
{
|
||||||
|
ParameterExpression[] paramExp =
|
||||||
|
parameters.Select(x => Expression.Parameter(x.ParameterType)).ToArray();
|
||||||
|
var argExp = new Expression[invokeTypes.Length];
|
||||||
|
for (var i = 0; i < argExp.Length; i++)
|
||||||
|
if (invokeTypes[i] != paramExp[i].Type)
|
||||||
|
argExp[i] = Expression.Convert(paramExp[i], invokeTypes[i]);
|
||||||
|
else
|
||||||
|
argExp[i] = paramExp[i];
|
||||||
|
field.SetValue(null,
|
||||||
|
Expression.Lambda(Expression.Call(methodInstance, argExp), paramExp)
|
||||||
|
.Compile());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
field.SetValue(null, Delegate.CreateDelegate(field.FieldType, methodInstance));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ParameterExpression[] paramExp = parameters.Select(x => Expression.Parameter(x.ParameterType)).ToArray();
|
ParameterExpression[] paramExp =
|
||||||
|
parameters.Select(x => Expression.Parameter(x.ParameterType)).ToArray();
|
||||||
|
var argExp = new Expression[invokeTypes.Length];
|
||||||
|
for (var i = 0; i < argExp.Length; i++)
|
||||||
|
if (invokeTypes[i] != paramExp[i + 1].Type)
|
||||||
|
argExp[i] = Expression.Convert(paramExp[i + 1], invokeTypes[i]);
|
||||||
|
else
|
||||||
|
argExp[i] = paramExp[i + 1];
|
||||||
field.SetValue(null,
|
field.SetValue(null,
|
||||||
Expression.Lambda(Expression.Call(paramExp[0], methodInstance, paramExp.Skip(1)), paramExp)
|
Expression.Lambda(Expression.Call(paramExp[0], methodInstance, argExp), paramExp)
|
||||||
.Compile());
|
.Compile());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,7 +338,7 @@ namespace Torch.Utils
|
|||||||
if (trueType == null && isStatic)
|
if (trueType == null && isStatic)
|
||||||
throw new ArgumentException("Static field setters need their type defined", nameof(field));
|
throw new ArgumentException("Static field setters need their type defined", nameof(field));
|
||||||
|
|
||||||
if (!isStatic)
|
if (!isStatic && trueType == null)
|
||||||
trueType = parameters[0].ParameterType;
|
trueType = parameters[0].ParameterType;
|
||||||
}
|
}
|
||||||
else if (attr is ReflectedGetterAttribute)
|
else if (attr is ReflectedGetterAttribute)
|
||||||
@@ -300,7 +351,7 @@ namespace Torch.Utils
|
|||||||
if (trueType == null && isStatic)
|
if (trueType == null && isStatic)
|
||||||
throw new ArgumentException("Static field getters need their type defined", nameof(field));
|
throw new ArgumentException("Static field getters need their type defined", nameof(field));
|
||||||
|
|
||||||
if (!isStatic)
|
if (!isStatic && trueType == null)
|
||||||
trueType = parameters[0].ParameterType;
|
trueType = parameters[0].ParameterType;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -318,10 +369,15 @@ namespace Torch.Utils
|
|||||||
$"Unable to find field or property for {trueName} in {trueType.FullName} or its base types", nameof(field));
|
$"Unable to find field or property for {trueName} in {trueType.FullName} or its base types", nameof(field));
|
||||||
|
|
||||||
ParameterExpression[] paramExp = parameters.Select(x => Expression.Parameter(x.ParameterType)).ToArray();
|
ParameterExpression[] paramExp = parameters.Select(x => Expression.Parameter(x.ParameterType)).ToArray();
|
||||||
|
Expression instanceExpr = null;
|
||||||
|
if (!isStatic)
|
||||||
|
{
|
||||||
|
instanceExpr = trueType == paramExp[0].Type ? (Expression) paramExp[0] : Expression.Convert(paramExp[0], trueType);
|
||||||
|
}
|
||||||
|
|
||||||
MemberExpression fieldExp = sourceField != null
|
MemberExpression fieldExp = sourceField != null
|
||||||
? Expression.Field(isStatic ? null : paramExp[0], sourceField)
|
? Expression.Field(instanceExpr, sourceField)
|
||||||
: Expression.Property(isStatic ? null : paramExp[0], sourceProperty);
|
: Expression.Property(instanceExpr, sourceProperty);
|
||||||
Expression impl;
|
Expression impl;
|
||||||
if (attr is ReflectedSetterAttribute)
|
if (attr is ReflectedSetterAttribute)
|
||||||
{
|
{
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="NLog" version="4.4.1" targetFramework="net461" />
|
<package id="Mono.TextTransform" version="1.0.0" targetFramework="net461" />
|
||||||
|
<package id="NLog" version="4.4.12" targetFramework="net461" />
|
||||||
<package id="Octokit" version="0.24.0" targetFramework="net461" />
|
<package id="Octokit" version="0.24.0" targetFramework="net461" />
|
||||||
</packages>
|
</packages>
|
9
TransformOnBuild.targets
Normal file
9
TransformOnBuild.targets
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Target Name="TransformOnBuild">
|
||||||
|
<ItemGroup>
|
||||||
|
<TemplatePaths Include="@(None)" Condition="'%(None.Generator)' == 'TextTemplatingFileGenerator'" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Exec Command=""$(SolutionDir)\packages\Mono.TextTransform.1.0.0\tools\TextTransform.exe" "%(TemplatePaths.FullPath)"" Condition="'%(TemplatePaths.Identity)' != ''"/>
|
||||||
|
</Target>
|
||||||
|
</Project>
|
4
Versioning/AssemblyVersion.cs
Normal file
4
Versioning/AssemblyVersion.cs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("0.0.0.0")]
|
||||||
|
[assembly: AssemblyInformationalVersion("v0.0.0-dev")]
|
20
Versioning/version.ps1
Normal file
20
Versioning/version.ps1
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
$gitVersion = git describe --tags
|
||||||
|
$gitSimpleVersion = git describe --tags --abbrev=0
|
||||||
|
if ($gitSimpleVersion.Equals($gitVersion)) {
|
||||||
|
$buildSalt = 0
|
||||||
|
} else {
|
||||||
|
$gitLatestCommit = git rev-parse --short HEAD
|
||||||
|
$buildSalt = [System.Numerics.BigInteger]::Abs([System.Numerics.BigInteger]::Parse($gitLatestCommit, [System.Globalization.NumberStyles]::HexNumber) % 16383) + 1
|
||||||
|
}
|
||||||
|
$dotNetVersion = echo $gitSimpleVersion | Select-String -Pattern "([0-9]+)\.([0-9]+)\.([0-9]+)" | % {$_.Matches} | %{$_.Groups[1].Value+"."+$_.Groups[2].Value+"."+$_.Groups[3].Value+".$buildSalt"}
|
||||||
|
|
||||||
|
$fileContent = @"
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("$dotNetVersion")]
|
||||||
|
[assembly: AssemblyInformationalVersion("$gitVersion")]
|
||||||
|
"@
|
||||||
|
|
||||||
|
echo $fileContent | Set-Content "$PSScriptRoot/AssemblyVersion.cs"
|
||||||
|
|
||||||
|
echo "$gitVersion / $dotNetVersion"
|
Reference in New Issue
Block a user