Infer NumberSelector type in EntityTables (#36568)
* Infer number selector types from context * forgor
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
using System.Globalization;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Robust.Shared.Serialization.Markdown.Validation;
|
||||
using Robust.Shared.Serialization.Markdown.Value;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Shared.EntityTable.ValueSelector;
|
||||
|
||||
[TypeSerializer]
|
||||
public sealed class NumberSelectorTypeSerializer :
|
||||
ITypeReader<NumberSelector, ValueDataNode>
|
||||
{
|
||||
public ValidationNode Validate(ISerializationManager serializationManager,
|
||||
ValueDataNode node,
|
||||
IDependencyCollection dependencies,
|
||||
ISerializationContext? context = null)
|
||||
{
|
||||
// ConstantNumberSelector validation
|
||||
if (int.TryParse(node.Value, out _))
|
||||
return new ValidatedValueNode(node);
|
||||
|
||||
// RangeNumberSelector validation
|
||||
if (VectorSerializerUtility.TryParseArgs(node.Value, 2, out _))
|
||||
{
|
||||
return new ValidatedValueNode(node);
|
||||
}
|
||||
|
||||
return new ErrorNode(node, "Custom validation not supported! Please specify the type manually!");
|
||||
}
|
||||
|
||||
public NumberSelector Read(ISerializationManager serializationManager,
|
||||
ValueDataNode node,
|
||||
IDependencyCollection dependencies,
|
||||
SerializationHookContext hookCtx,
|
||||
ISerializationContext? context = null,
|
||||
ISerializationManager.InstantiationDelegate<NumberSelector>? instanceProvider = null)
|
||||
{
|
||||
var type = typeof(NumberSelector);
|
||||
|
||||
if (int.TryParse(node.Value, out var result))
|
||||
return new ConstantNumberSelector(result);
|
||||
|
||||
if (VectorSerializerUtility.TryParseArgs(node.Value, 2, out var args))
|
||||
{
|
||||
var x = int.Parse(args[0], CultureInfo.InvariantCulture);
|
||||
var y = int.Parse(args[1], CultureInfo.InvariantCulture);
|
||||
return new RangeNumberSelector(new Vector2i(x, y));
|
||||
}
|
||||
|
||||
return (NumberSelector) serializationManager.Read(type, node, context)!;
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,11 @@ public sealed partial class RangeNumberSelector : NumberSelector
|
||||
[DataField]
|
||||
public Vector2i Range = new(1, 1);
|
||||
|
||||
public RangeNumberSelector(Vector2i range)
|
||||
{
|
||||
Range = range;
|
||||
}
|
||||
|
||||
public override int Get(System.Random rand)
|
||||
{
|
||||
// rand.Next() is inclusive on the first number and exclusive on the second number,
|
||||
|
||||
@@ -236,8 +236,7 @@
|
||||
- !type:NestedSelector
|
||||
tableId: MaintFluffTable
|
||||
weight: 5
|
||||
rolls: !type:RangeNumberSelector
|
||||
range: 1, 2
|
||||
rolls: 1, 2
|
||||
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
@@ -426,18 +425,16 @@
|
||||
children:
|
||||
- id: MobSharkSalvage
|
||||
- id: MobCarpSalvage
|
||||
amount: !type:ConstantNumberSelector
|
||||
value: 2
|
||||
amount: 2
|
||||
- !type:NestedSelector
|
||||
rolls: !type:RangeNumberSelector
|
||||
range: 1, 3
|
||||
rolls: 1, 3
|
||||
tableId: SalvageTreasureSpawnerValuable
|
||||
- !type:NestedSelector
|
||||
rolls: !type:RangeNumberSelector
|
||||
range: 7, 10
|
||||
rolls: 7, 10
|
||||
tableId: TreasureCoinPileRare
|
||||
#- id: MobHivebot (solo hivebot spawn)
|
||||
|
||||
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
id: SalvageSpawnerMobMagnet
|
||||
@@ -525,8 +522,7 @@
|
||||
children:
|
||||
- id: MobSharkSalvage
|
||||
- id: MobCarpSalvage
|
||||
amount: !type:ConstantNumberSelector
|
||||
value: 3
|
||||
amount: 3
|
||||
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
|
||||
Reference in New Issue
Block a user