Skip to content

Commit

Permalink
Add copy/paste audit
Browse files Browse the repository at this point in the history
  • Loading branch information
Equinox- committed Feb 27, 2024
1 parent a6aba5a commit 3fecbe5
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 2 deletions.
35 changes: 33 additions & 2 deletions Meds.Wrapper/Audit/AuditPayloads.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
using Sandbox.Game;
using Sandbox.Game.Entities;
using Sandbox.Game.Players;
using VRage.Components.Entity.CubeGrid;
using VRage.Game;
using VRage.Game.Entity;
using VRage.Library.Utils;
using VRageMath;
using ZLogger;
Expand All @@ -28,6 +30,9 @@ public enum AuditEvent

MedievalMasterStart,
MedievalMasterStop,

ClipboardCut,
ClipboardPaste,
}

public class AuditPayload
Expand All @@ -41,6 +46,8 @@ public class AuditPayload

public ControlOpPayload? ControlOp;

public ClipboardOpPayload? ClipboardOp;

public static AuditPayload Create(AuditEvent evt, MyPlayer acting, MyPlayer owning = null, Vector3D? owningLocation = null)
{
var payload = new AuditPayload
Expand Down Expand Up @@ -83,6 +90,12 @@ public AuditPayload ControlOpPayload(in ControlOpPayload payload)
return this;
}

public AuditPayload ClipboardOpPayload(in ClipboardOpPayload payload)
{
ClipboardOp = payload;
return this;
}

private static AuditLoggerHolder _logger;

public void Emit()
Expand All @@ -104,8 +117,8 @@ public void Emit()
}

log.Logger.ZLogInformationWithPayload(this, "{0} by {1} on {2} ({3})", AuditEvent, ActingPlayer.DisplayName,
InventoryOp?.ToEntity ?? InventoryOp?.FromEntity ?? ControlOp?.Entity,
OwningPlayer?.DisplayName);
InventoryOp?.ToEntity ?? InventoryOp?.FromEntity ?? ControlOp?.Entity,
OwningPlayer?.DisplayName);
}

private sealed class AuditLoggerHolder
Expand Down Expand Up @@ -143,6 +156,24 @@ public struct ControlOpPayload
public string Slot;
}

public struct ClipboardOpPayload
{
public int Grids;
public int Blocks;

public void Add(MyGridDataComponent grid)
{
Grids++;
Blocks += grid.BlockCount;
}

public void Add(MyEntity entity)
{
if (entity.Components.TryGet(out MyGridDataComponent grid))
Add(grid);
}
}

public struct PlayerPayload
{
public ulong SteamId;
Expand Down
69 changes: 69 additions & 0 deletions Meds.Wrapper/Audit/MedievalMasterAudit.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
using System.Collections.Generic;
using HarmonyLib;
using Medieval.GameSystems.Building;
using Meds.Wrapper.Shim;
using Sandbox.Game.Multiplayer;
using Sandbox.Game.Players;
using Sandbox.Game.SessionComponents.Clipboard;
using Sandbox.Game.World;
using VRage.Game.Components;
using VRage.Network;
using VRage.Scene;
using VRageMath;

namespace Meds.Wrapper.Audit
{
Expand All @@ -26,5 +32,68 @@ public static void Postfix()
.Emit();
}
}

[HarmonyPatch(typeof(MyGridPlacer), "ProcessPasting")]
[AlwaysPatch]
public static class AuditPasteGrids
{
public static void Postfix(List<MyGridPlacer.MergeScene> createdScenes)
{
var userId = MyEventContext.Current.IsLocallyInvoked ? Sync.MyId : MyEventContext.Current.Sender.Value;
var player = MyPlayers.Static?.GetPlayer(new MyPlayer.PlayerId(userId));
if (player == null)
return;
var clipboard = new ClipboardOpPayload();
var bounds = BoundingBoxD.CreateInvalid();
foreach (var scene in createdScenes)
foreach (var grid in scene.Grids)
{
clipboard.Add(grid);
bounds.Include(grid.Container.Get<MyPositionComponentBase>().WorldAABB);
}

if (clipboard.Grids == 0)
return;

AuditPayload.Create(AuditEvent.ClipboardPaste, player, owningLocation: bounds.Center)
.ClipboardOpPayload(in clipboard)
.Emit();
}
}

[HarmonyPatch(typeof(MyClipboardComponent), "OnGridClosedRequest")]
[AlwaysPatch]
public static class AuditCutGrids
{
public static void Prefix(EntityId entityId)
{
var scene = MySession.Static.Scene;
if (!scene.TryGetEntity(entityId, out var entity))
return;
var userId = MyEventContext.Current.IsLocallyInvoked ? Sync.MyId : MyEventContext.Current.Sender.Value;
var player = MyPlayers.Static?.GetPlayer(new MyPlayer.PlayerId(userId));
if (player == null)
return;

var clipboard = new ClipboardOpPayload();
var bounds = BoundingBoxD.CreateInvalid();

var collector = scene.GetCollector();
collector.CollectAllConnectedEntities(entity);

foreach (var attached in collector.Entities)
{
clipboard.Add(attached);
bounds.Include(attached.PositionComp.WorldAABB);
}

if (clipboard.Grids == 0)
return;

AuditPayload.Create(AuditEvent.ClipboardCut, player, owningLocation: bounds.Center)
.ClipboardOpPayload(in clipboard)
.Emit();
}
}
}
}

0 comments on commit 3fecbe5

Please sign in to comment.