Merge branch 'master' into Patron

This commit is contained in:
Brant Martin
2019-08-19 14:40:25 -04:00
13 changed files with 162 additions and 42 deletions

View File

@@ -23,6 +23,7 @@ namespace Torch
string ChatName { get; set; } string ChatName { get; set; }
string ChatColor { get; set; } string ChatColor { get; set; }
string TestPlugin { get; set; } string TestPlugin { get; set; }
bool DisconnectOnRestart { get; set; }
bool Save(string path = null); bool Save(string path = null);
} }

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;
using Sandbox.ModAPI;
namespace Torch.Mod.Messages
{
[ProtoContract]
public class JoinServerMessage : MessageBase
{
[ProtoMember(201)]
public int Delay;
[ProtoMember(202)]
public string Address;
private JoinServerMessage()
{
}
public JoinServerMessage(string address)
{
Address = address;
}
public JoinServerMessage(string address, int delay)
{
Address = address;
Delay = delay;
}
public override void ProcessClient()
{
if (TorchModCore.Debug)
{
MyAPIGateway.Utilities.ShowMessage("Torch", $"Joining server {Address} with delay {Delay}");
}
if (Delay <= 0)
{
MyAPIGateway.Multiplayer.JoinServer(Address);
return;
}
MyAPIGateway.Parallel.StartBackground(() =>
{
MyAPIGateway.Parallel.Sleep(Delay);
MyAPIGateway.Multiplayer.JoinServer(Address);
});
}
public override void ProcessServer()
{
}
}
}

View File

@@ -11,6 +11,7 @@ namespace Torch.Mod.Messages
[ProtoInclude(1, typeof(DialogMessage))] [ProtoInclude(1, typeof(DialogMessage))]
[ProtoInclude(2, typeof(NotificationMessage))] [ProtoInclude(2, typeof(NotificationMessage))]
[ProtoInclude(3, typeof(VoxelResetMessage))] [ProtoInclude(3, typeof(VoxelResetMessage))]
[ProtoInclude(4, typeof(JoinServerMessage))]
#endregion #endregion
[ProtoContract] [ProtoContract]

View File

@@ -10,6 +10,7 @@ using Torch.Mod.Messages;
using VRage; using VRage;
using VRage.Collections; using VRage.Collections;
using VRage.Game.ModAPI; using VRage.Game.ModAPI;
using VRage.Network;
using VRage.Utils; using VRage.Utils;
using Task = ParallelTasks.Task; using Task = ParallelTasks.Task;
@@ -50,6 +51,10 @@ namespace Torch.Mod
{ {
var m = _messagePool.Get(); var m = _messagePool.Get();
m.CompressedData = bytes; m.CompressedData = bytes;
#if TORCH
m.SenderId = MyEventContext.Current.Sender.Value;
#endif
_processing.Add(m); _processing.Add(m);
} }
@@ -59,10 +64,19 @@ namespace Torch.Mod
{ {
try try
{ {
var m = _processing.Take(); MessageBase m;
try
{
m = _processing.Take();
}
catch
{
continue;
}
MyLog.Default.WriteLineAndConsole($"Processing message: {m.GetType().Name}"); MyLog.Default.WriteLineAndConsole($"Processing message: {m.GetType().Name}");
if (m is IncomingMessage) if (m is IncomingMessage) //process incoming messages
{ {
MessageBase i; MessageBase i;
try try
@@ -78,19 +92,22 @@ namespace Torch.Mod
continue; continue;
} }
if (TorchModCore.Debug)
MyAPIGateway.Utilities.ShowMessage("Torch", $"Received message of type {i.GetType().Name}");
if (MyAPIGateway.Multiplayer.IsServer) if (MyAPIGateway.Multiplayer.IsServer)
i.ProcessServer(); i.ProcessServer();
else else
i.ProcessClient(); i.ProcessClient();
} }
else else //process outgoing messages
{ {
if (TorchModCore.Debug)
MyAPIGateway.Utilities.ShowMessage("Torch", $"Sending message of type {m.GetType().Name}");
var b = MyAPIGateway.Utilities.SerializeToBinary(m); var b = MyAPIGateway.Utilities.SerializeToBinary(m);
m.CompressedData = MyCompression.Compress(b); m.CompressedData = MyCompression.Compress(b);
MyAPIGateway.Utilities.InvokeOnGameThread(() =>
{
switch (m.TargetType) switch (m.TargetType)
{ {
case MessageTarget.Single: case MessageTarget.Single:
@@ -107,6 +124,7 @@ namespace Torch.Mod
continue; continue;
MyAPIGateway.Multiplayer.SendMessageTo(NET_ID, m.CompressedData, p.SteamUserId); MyAPIGateway.Multiplayer.SendMessageTo(NET_ID, m.CompressedData, p.SteamUserId);
} }
break; break;
case MessageTarget.AllExcept: case MessageTarget.AllExcept:
MyAPIGateway.Players.GetPlayers(_playerCache); MyAPIGateway.Players.GetPlayers(_playerCache);
@@ -116,12 +134,13 @@ namespace Torch.Mod
continue; continue;
MyAPIGateway.Multiplayer.SendMessageTo(NET_ID, m.CompressedData, p.SteamUserId); MyAPIGateway.Multiplayer.SendMessageTo(NET_ID, m.CompressedData, p.SteamUserId);
} }
break; break;
default: default:
throw new Exception(); throw new Exception();
} }
_playerCache.Clear(); _playerCache.Clear();
});
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -130,7 +149,7 @@ namespace Torch.Mod
} }
} }
MyLog.Default.WriteLineAndConsole("TORCH MOD: COMMUNICATION THREAD: EXIT SIGNAL RECEIVED!"); MyLog.Default.WriteLineAndConsole("TORCH MOD: INFO: Communication thread shut down successfully! THIS IS NOT AN ERROR");
//exit signal received. Clean everything and GTFO //exit signal received. Clean everything and GTFO
_processing?.Dispose(); _processing?.Dispose();
_processing = null; _processing = null;

View File

@@ -10,6 +10,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)Messages\IncomingMessage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Messages\IncomingMessage.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Messages\JoinServerMessage.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Messages\NotificationMessage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Messages\NotificationMessage.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Messages\DialogMessage.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Messages\DialogMessage.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Messages\MessageBase.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Messages\MessageBase.cs" />

View File

@@ -3,6 +3,7 @@ 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 Sandbox.ModAPI;
using VRage.Game.Components; using VRage.Game.Components;
namespace Torch.Mod namespace Torch.Mod
@@ -12,6 +13,7 @@ namespace Torch.Mod
{ {
public const ulong MOD_ID = 1406994352; public const ulong MOD_ID = 1406994352;
private static bool _init; private static bool _init;
public static bool Debug;
public override void UpdateAfterSimulation() public override void UpdateAfterSimulation()
{ {
@@ -20,12 +22,24 @@ namespace Torch.Mod
_init = true; _init = true;
ModCommunication.Register(); ModCommunication.Register();
MyAPIGateway.Utilities.MessageEntered += Utilities_MessageEntered;
}
private void Utilities_MessageEntered(string messageText, ref bool sendToOthers)
{
if (messageText == "@!debug")
{
Debug = !Debug;
MyAPIGateway.Utilities.ShowMessage("Torch", $"Debug: {Debug}");
sendToOthers = false;
}
} }
protected override void UnloadData() protected override void UnloadData()
{ {
try try
{ {
MyAPIGateway.Utilities.MessageEntered -= Utilities_MessageEntered;
ModCommunication.Unregister(); ModCommunication.Unregister();
} }
catch catch

View File

@@ -17,12 +17,24 @@ namespace Torch.Server.Managers
/// <inheritdoc /> /// <inheritdoc />
public override void Attach() public override void Attach()
{ {
if (MySandboxGame.ConfigDedicated.RemoteApiEnabled && !string.IsNullOrEmpty(MySandboxGame.ConfigDedicated.RemoteSecurityKey)) Torch.GameStateChanged += TorchOnGameStateChanged;
base.Attach();
}
/// <inheritdoc />
public override void Detach()
{
Torch.GameStateChanged -= TorchOnGameStateChanged;
base.Detach();
}
private void TorchOnGameStateChanged(MySandboxGame game, TorchGameState newstate)
{
if (newstate == TorchGameState.Loading && MySandboxGame.ConfigDedicated.RemoteApiEnabled && !string.IsNullOrEmpty(MySandboxGame.ConfigDedicated.RemoteSecurityKey))
{ {
var myRemoteServer = new MyRemoteServer(MySandboxGame.ConfigDedicated.RemoteApiPort, MySandboxGame.ConfigDedicated.RemoteSecurityKey); var myRemoteServer = new MyRemoteServer(MySandboxGame.ConfigDedicated.RemoteApiPort, MySandboxGame.ConfigDedicated.RemoteSecurityKey);
LogManager.GetCurrentClassLogger().Info($"Remote API started on port {myRemoteServer.Port}"); LogManager.GetCurrentClassLogger().Info($"Remote API started on port {myRemoteServer.Port}");
} }
base.Attach();
} }
} }
} }

View File

@@ -8,6 +8,7 @@ using System.Reflection;
using System.ServiceProcess; using System.ServiceProcess;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using Microsoft.VisualBasic.Devices;
using NLog; using NLog;
using NLog.Fluent; using NLog.Fluent;
using NLog.Targets; using NLog.Targets;
@@ -59,7 +60,8 @@ namespace Torch.Server
return; return;
} }
if (!Environment.UserInteractive) // Breaks on Windows Server 2019
if (!new ComputerInfo().OSFullName.Contains("Server 2019") && !Environment.UserInteractive)
{ {
using (var service = new TorchService()) using (var service = new TorchService())
ServiceBase.Run(service); ServiceBase.Run(service);

View File

@@ -83,6 +83,7 @@
<HintPath>..\GameBinaries\Microsoft.CodeAnalysis.CSharp.dll</HintPath> <HintPath>..\GameBinaries\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="Microsoft.Win32.Registry, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="Microsoft.Win32.Registry, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Win32.Registry.4.4.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath> <HintPath>..\packages\Microsoft.Win32.Registry.4.4.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
</Reference> </Reference>

View File

@@ -94,6 +94,9 @@ namespace Torch.Server
[Arg("localplugins", "Loads all pluhins from disk, ignores the plugins defined in config.")] [Arg("localplugins", "Loads all pluhins from disk, ignores the plugins defined in config.")]
public bool LocalPlugins { get; set; } public bool LocalPlugins { get; set; }
[Arg("disconnect", "When server restarts, all clients are rejected to main menu to prevent auto rejoin")]
public bool DisconnectOnRestart { get; set; }
public string ChatName { get; set; } = "Server"; public string ChatName { get; set; } = "Server";
public string ChatColor { get; set; } = "Red"; public string ChatColor { get; set; } = "Red";

View File

@@ -19,6 +19,7 @@ using Torch.API.Managers;
using Torch.API.Session; using Torch.API.Session;
using Torch.Commands; using Torch.Commands;
using Torch.Mod; using Torch.Mod;
using Torch.Mod.Messages;
using Torch.Server.Commands; using Torch.Server.Commands;
using Torch.Server.Managers; using Torch.Server.Managers;
using Torch.Utils; using Torch.Utils;
@@ -152,6 +153,11 @@ namespace Torch.Server
/// </summary> /// </summary>
public override void Restart() public override void Restart()
{ {
if (Config.DisconnectOnRestart)
{
ModCommunication.SendMessageToClients(new JoinServerMessage("0.0.0.0:25555"));
}
if (IsRunning) if (IsRunning)
Save().ContinueWith(DoRestart, this, TaskContinuationOptions.RunContinuationsAsynchronously); Save().ContinueWith(DoRestart, this, TaskContinuationOptions.RunContinuationsAsynchronously);
else else

View File

@@ -13,6 +13,7 @@ using Torch.Server.Annotations;
using Torch.Server.Managers; using Torch.Server.Managers;
using Torch.Server.ViewModels; using Torch.Server.ViewModels;
using Torch.Views; using Torch.Views;
using VRage.Game.ModAPI;
namespace Torch.Server.Views namespace Torch.Server.Views
{ {
@@ -129,7 +130,9 @@ namespace Torch.Server.Views
//var w = new RoleEditor(_instanceManager.DedicatedConfig.SelectedWorld); //var w = new RoleEditor(_instanceManager.DedicatedConfig.SelectedWorld);
//w.Show(); //w.Show();
var d = new RoleEditor(); var d = new RoleEditor();
d.Edit(_instanceManager.DedicatedConfig.SelectedWorld.Checkpoint.PromotedUsers.Dictionary); var w = _instanceManager.DedicatedConfig.SelectedWorld;
d.Edit(w.Checkpoint.PromotedUsers.Dictionary);
_instanceManager.DedicatedConfig.Administrators = w.Checkpoint.PromotedUsers.Dictionary.Where(k => k.Value >= MyPromoteLevel.Admin).Select(k => k.Key.ToString()).ToList();
} }
} }
} }