// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.npc.decisionmaker.core.conditions;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
import com.hypixel.hytale.server.npc.decisionmaker.core.EvaluationContext;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.CommandBuffer;
import javax.annotation.Nullable;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.server.npc.movement.MovementState;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.SimpleCondition;

public class TargetMovementStateCondition extends SimpleCondition
{
    public static final BuilderCodec<TargetMovementStateCondition> CODEC;
    protected MovementState movementState;
    
    @Override
    protected boolean evaluate(final int selfIndex, final ArchetypeChunk<EntityStore> archetypeChunk, @Nullable final Ref<EntityStore> target, @Nonnull final CommandBuffer<EntityStore> commandBuffer, final EvaluationContext context) {
        return target != null && target.isValid() && MotionController.isInMovementState(target, this.movementState, commandBuffer);
    }
    
    static {
        CODEC = BuilderCodec.builder(TargetMovementStateCondition.class, TargetMovementStateCondition::new, TargetMovementStateCondition.ABSTRACT_CODEC).documentation("A simple boolean condition that returns whether the target is in a given movement state.").appendInherited(new KeyedCodec("State", new EnumCodec(MovementState.class)), (condition, e) -> condition.movementState = e, condition -> condition.movementState, (condition, parent) -> condition.movementState = parent.movementState).addValidator(Validators.nonNull()).documentation("The movement state to check for.").add().build();
    }
}
