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]
|
[DataField]
|
||||||
public Vector2i Range = new(1, 1);
|
public Vector2i Range = new(1, 1);
|
||||||
|
|
||||||
|
public RangeNumberSelector(Vector2i range)
|
||||||
|
{
|
||||||
|
Range = range;
|
||||||
|
}
|
||||||
|
|
||||||
public override int Get(System.Random rand)
|
public override int Get(System.Random rand)
|
||||||
{
|
{
|
||||||
// rand.Next() is inclusive on the first number and exclusive on the second number,
|
// rand.Next() is inclusive on the first number and exclusive on the second number,
|
||||||
|
|||||||
@@ -236,8 +236,7 @@
|
|||||||
- !type:NestedSelector
|
- !type:NestedSelector
|
||||||
tableId: MaintFluffTable
|
tableId: MaintFluffTable
|
||||||
weight: 5
|
weight: 5
|
||||||
rolls: !type:RangeNumberSelector
|
rolls: 1, 2
|
||||||
range: 1, 2
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: MarkerBase
|
parent: MarkerBase
|
||||||
@@ -426,18 +425,16 @@
|
|||||||
children:
|
children:
|
||||||
- id: MobSharkSalvage
|
- id: MobSharkSalvage
|
||||||
- id: MobCarpSalvage
|
- id: MobCarpSalvage
|
||||||
amount: !type:ConstantNumberSelector
|
amount: 2
|
||||||
value: 2
|
|
||||||
- !type:NestedSelector
|
- !type:NestedSelector
|
||||||
rolls: !type:RangeNumberSelector
|
rolls: 1, 3
|
||||||
range: 1, 3
|
|
||||||
tableId: SalvageTreasureSpawnerValuable
|
tableId: SalvageTreasureSpawnerValuable
|
||||||
- !type:NestedSelector
|
- !type:NestedSelector
|
||||||
rolls: !type:RangeNumberSelector
|
rolls: 7, 10
|
||||||
range: 7, 10
|
|
||||||
tableId: TreasureCoinPileRare
|
tableId: TreasureCoinPileRare
|
||||||
#- id: MobHivebot (solo hivebot spawn)
|
#- id: MobHivebot (solo hivebot spawn)
|
||||||
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: MarkerBase
|
parent: MarkerBase
|
||||||
id: SalvageSpawnerMobMagnet
|
id: SalvageSpawnerMobMagnet
|
||||||
@@ -525,8 +522,7 @@
|
|||||||
children:
|
children:
|
||||||
- id: MobSharkSalvage
|
- id: MobSharkSalvage
|
||||||
- id: MobCarpSalvage
|
- id: MobCarpSalvage
|
||||||
amount: !type:ConstantNumberSelector
|
amount: 3
|
||||||
value: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: MarkerBase
|
parent: MarkerBase
|
||||||
|
|||||||
Reference in New Issue
Block a user