Screenshot button.
This commit is contained in:
@@ -31,6 +31,7 @@ namespace Content.Client
|
|||||||
IoCManager.Register<IClientPreferencesManager, ClientPreferencesManager>();
|
IoCManager.Register<IClientPreferencesManager, ClientPreferencesManager>();
|
||||||
IoCManager.Register<IItemSlotManager, ItemSlotManager>();
|
IoCManager.Register<IItemSlotManager, ItemSlotManager>();
|
||||||
IoCManager.Register<IStylesheetManager, StylesheetManager>();
|
IoCManager.Register<IStylesheetManager, StylesheetManager>();
|
||||||
|
IoCManager.Register<IScreenshotHook, ScreenshotHook>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,6 +178,7 @@ namespace Content.Client
|
|||||||
IoCManager.Resolve<IParallaxManager>().LoadParallax();
|
IoCManager.Resolve<IParallaxManager>().LoadParallax();
|
||||||
IoCManager.Resolve<IBaseClient>().PlayerJoinedServer += SubscribePlayerAttachmentEvents;
|
IoCManager.Resolve<IBaseClient>().PlayerJoinedServer += SubscribePlayerAttachmentEvents;
|
||||||
IoCManager.Resolve<IStylesheetManager>().Initialize();
|
IoCManager.Resolve<IStylesheetManager>().Initialize();
|
||||||
|
IoCManager.Resolve<IScreenshotHook>().Initialize();
|
||||||
|
|
||||||
IoCManager.InjectDependencies(this);
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ namespace Content.Client.Input
|
|||||||
common.AddFunction(ContentKeyFunctions.ExamineEntity);
|
common.AddFunction(ContentKeyFunctions.ExamineEntity);
|
||||||
common.AddFunction(ContentKeyFunctions.OpenTutorial);
|
common.AddFunction(ContentKeyFunctions.OpenTutorial);
|
||||||
common.AddFunction(ContentKeyFunctions.UseOrAttack);
|
common.AddFunction(ContentKeyFunctions.UseOrAttack);
|
||||||
|
common.AddFunction(ContentKeyFunctions.TakeScreenshot);
|
||||||
|
common.AddFunction(ContentKeyFunctions.TakeScreenshotNoUI);
|
||||||
|
|
||||||
var human = contexts.GetContext("human");
|
var human = contexts.GetContext("human");
|
||||||
human.AddFunction(ContentKeyFunctions.SwapHands);
|
human.AddFunction(ContentKeyFunctions.SwapHands);
|
||||||
|
|||||||
85
Content.Client/ScreenshotHook.cs
Normal file
85
Content.Client/ScreenshotHook.cs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Content.Shared.Input;
|
||||||
|
using Robust.Client.Interfaces.Graphics;
|
||||||
|
using Robust.Client.Interfaces.Input;
|
||||||
|
using Robust.Shared.Input;
|
||||||
|
using Robust.Shared.Interfaces.Resources;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Log;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
using SixLabors.ImageSharp;
|
||||||
|
|
||||||
|
namespace Content.Client
|
||||||
|
{
|
||||||
|
internal class ScreenshotHook : IScreenshotHook
|
||||||
|
{
|
||||||
|
private static readonly ResourcePath BaseScreenshotPath = new ResourcePath("/Screenshots");
|
||||||
|
|
||||||
|
[Dependency] private readonly IInputManager _inputManager = default;
|
||||||
|
[Dependency] private readonly IClyde _clyde = default;
|
||||||
|
[Dependency] private readonly IResourceManager _resourceManager = default;
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
_inputManager.SetInputCommand(ContentKeyFunctions.TakeScreenshot, InputCmdHandler.FromDelegate(_ =>
|
||||||
|
{
|
||||||
|
Take(ScreenshotType.AfterUI);
|
||||||
|
}));
|
||||||
|
|
||||||
|
_inputManager.SetInputCommand(ContentKeyFunctions.TakeScreenshotNoUI, InputCmdHandler.FromDelegate(_ =>
|
||||||
|
{
|
||||||
|
Take(ScreenshotType.BeforeUI);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Take(ScreenshotType type)
|
||||||
|
{
|
||||||
|
var screenshot = await _clyde.ScreenshotAsync(type);
|
||||||
|
|
||||||
|
var time = DateTime.Now.ToString("yyyy-M-dd_HH.mm.ss");
|
||||||
|
|
||||||
|
if (!_resourceManager.UserData.IsDir(BaseScreenshotPath))
|
||||||
|
{
|
||||||
|
_resourceManager.UserData.CreateDir(BaseScreenshotPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var filename = time;
|
||||||
|
|
||||||
|
if (i != 0)
|
||||||
|
{
|
||||||
|
filename = $"{filename}-{i}";
|
||||||
|
}
|
||||||
|
|
||||||
|
await using var file =
|
||||||
|
_resourceManager.UserData.Open(BaseScreenshotPath / $"{filename}.png", FileMode.CreateNew);
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
// Saving takes forever, so don't hang the game on it.
|
||||||
|
screenshot.SaveAsPng(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
Logger.InfoS("screenshot", "Screenshot taken as {0}.png", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
Logger.WarningS("screenshot", "Failed to save screenshot, retrying?:\n{0}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.ErrorS("screenshot", "Unable to save screenshot.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IScreenshotHook
|
||||||
|
{
|
||||||
|
void Initialize();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,5 +24,7 @@ namespace Content.Shared.Input
|
|||||||
public static readonly BoundKeyFunction OpenEntitySpawnWindow = "OpenEntitySpawnWindow";
|
public static readonly BoundKeyFunction OpenEntitySpawnWindow = "OpenEntitySpawnWindow";
|
||||||
public static readonly BoundKeyFunction OpenSandboxWindow = "OpenSandboxWindow";
|
public static readonly BoundKeyFunction OpenSandboxWindow = "OpenSandboxWindow";
|
||||||
public static readonly BoundKeyFunction OpenTileSpawnWindow = "OpenTileSpawnWindow";
|
public static readonly BoundKeyFunction OpenTileSpawnWindow = "OpenTileSpawnWindow";
|
||||||
|
public static readonly BoundKeyFunction TakeScreenshot = "TakeScreenshot";
|
||||||
|
public static readonly BoundKeyFunction TakeScreenshotNoUI = "TakeScreenshotNoUI";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,3 +155,10 @@ binds:
|
|||||||
- function: OpenSandboxWindow
|
- function: OpenSandboxWindow
|
||||||
type: state
|
type: state
|
||||||
key: B
|
key: B
|
||||||
|
- function: TakeScreenshot
|
||||||
|
type: state
|
||||||
|
key: F2
|
||||||
|
- function: TakeScreenshotNoUI
|
||||||
|
type: state
|
||||||
|
key: F2
|
||||||
|
mod1: Shift
|
||||||
|
|||||||
Reference in New Issue
Block a user