Files
2026-07-09 21:33:33 +02:00

53 lines
2.0 KiB
C#

using Sirenix.OdinInspector.Editor.Validation;
using Sirenix.Utilities;
using VOID.Editor.AttributeValidator;
using VOID.Generic.DropTable;
using VOID.Generic.Objects.Abstract;
using VOID.Generic.Objects.Container;
using VOID.Generic.Objects.Unit;
[assembly: RegisterValidator(typeof(DropTableComponentValidator))]
namespace VOID.Editor.AttributeValidator
{
public class DropTableComponentValidator : ValueValidator<DropTableComponent>
{
protected override void Validate(ValidationResult result)
{
if (Value == null) return;
var attachedTo = Value.GetComponent<AbstractObject>();
IsPlacedWithAbstractObject(result, attachedTo);
if (attachedTo == null) return;
CanUseTriggerOnSpawn(result, attachedTo);
IsDropTableDefined(result);
}
private void IsPlacedWithAbstractObject(ValidationResult result, AbstractObject attachedTo)
{
// DropTable's GameObject also needs to have AbstractObject (or its children)
if (attachedTo != null) return;
result.AddError($"{nameof(DropTableComponent)} needs to be placed together with any <u><b>{nameof(AbstractObject)}</b></u>");
}
private void CanUseTriggerOnSpawn(ValidationResult result, AbstractObject attachedTo)
{
// OnSpawn can be used only with Unit or Container
if (Value.trigger is not DropTableTrigger.OnSpawn || attachedTo is UnitObject or ContainerObject) return;
result.AddError($"{nameof(DropTableComponent)}'s {nameof(Value.trigger)}: <u><b>{Value.trigger}</b></u> can't be used with <u><b>{attachedTo.GetType().GetNiceName()}</b></u>");
}
private void IsDropTableDefined(ValidationResult result)
{
// DropTable is required!
if (Value.dropTable != null) return;
result.AddError($"{nameof(DropTableComponent)}'s drop table is not defined!");
}
}
}