This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
EveUnity/packages/org.gamecult.eve.surface/Runtime/EveInventoryInteraction.cs
2026-07-17 01:21:07 +01:00

82 lines
4 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using GameCult.Mesh;
#nullable enable
namespace GameCult.Eve.Surface
{
public static class EveInventoryInteraction
{
public const string GridKind = "inventory.grid";
public const string ItemKind = "inventory.item";
public const string DragSessionKind = "inventory.drag_session";
public static bool TryCreateDropRequest(
EveSurfaceDocument document,
EveSurfaceComponent source,
EveSurfaceComponent target,
int destinationX,
int destinationY,
string clientId,
out EveSurfaceCommandRequest? request)
{
request = null;
if (document == null || source == null || target == null ||
!string.Equals(source.Kind, ItemKind, StringComparison.Ordinal) ||
!string.Equals(target.Kind, GridKind, StringComparison.Ordinal))
{
return false;
}
var sourceKind = source.GetProp("sourceKind", source.GetProp("source"));
var command = target.GetProp($"dropCommand.{sourceKind}", target.GetProp("dropCommand"));
if (string.IsNullOrWhiteSpace(sourceKind) || string.IsNullOrWhiteSpace(command))
return false;
var sourceIndex = Int(source.GetProp("sourceIndex"), -1);
var targetIndex = Int(target.GetProp("targetIndex"), -1);
var targetKind = target.GetProp("targetKind");
var payload = new Dictionary<string, string>(StringComparer.Ordinal)
{
["sourceKind"] = sourceKind,
["originEntityKey"] = source.GetProp("sourceEntityKey", source.GetProp("entityKey")),
["originIndex"] = sourceIndex.ToString(CultureInfo.InvariantCulture),
["originCargoIndex"] = (string.Equals(sourceKind, "cargo", StringComparison.Ordinal) ? sourceIndex : -1)
.ToString(CultureInfo.InvariantCulture),
["itemKey"] = source.GetProp("itemKey"),
["quantity"] = Math.Max(1, Int(source.GetProp("quantity"), 1)).ToString(CultureInfo.InvariantCulture),
["sourceX"] = Int(source.GetProp("x"), int.MinValue).ToString(CultureInfo.InvariantCulture),
["sourceY"] = Int(source.GetProp("y"), int.MinValue).ToString(CultureInfo.InvariantCulture),
["destinationKind"] = targetKind,
["destinationEntityKey"] = target.GetProp("targetEntityKey", target.GetProp("entityKey")),
["destinationIndex"] = targetIndex.ToString(CultureInfo.InvariantCulture),
["destinationCargoIndex"] = (string.Equals(targetKind, "cargo", StringComparison.Ordinal) ? targetIndex : -1)
.ToString(CultureInfo.InvariantCulture),
["destinationX"] = destinationX.ToString(CultureInfo.InvariantCulture),
["destinationY"] = destinationY.ToString(CultureInfo.InvariantCulture),
["hasDestinationPosition"] = "true"
};
var template = document.Commands.FirstOrDefault(candidate =>
string.Equals(candidate.Command, command, StringComparison.Ordinal));
var operation = template == null
? CultMesh.OperationInvocation(command)
: CultMesh.OperationInvocation(template.Operation);
request = new EveSurfaceCommandRequest(
document.ProviderId,
document.Surface.Id,
operation,
CultMesh.OperationPayload(payload),
DateTimeOffset.UtcNow,
string.IsNullOrWhiteSpace(clientId) ? "unity-uitoolkit" : clientId);
return true;
}
private static int Int(string value, int fallback) =>
int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed)
? parsed
: fallback;
}
}