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

package com.hypixel.hytale.server.npc.movement.controllers;

import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
import com.hypixel.hytale.server.core.entity.movement.MovementStatesComponent;
import com.hypixel.hytale.server.npc.movement.MovementState;
import com.hypixel.hytale.server.core.modules.physics.component.PhysicsValues;
import com.hypixel.hytale.server.npc.movement.NavState;
import com.hypixel.hytale.server.core.modules.splitvelocity.VelocityConfig;
import com.hypixel.hytale.protocol.MovementStates;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.npc.movement.Steering;
import javax.annotation.Nonnull;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.math.shape.Box;
import com.hypixel.hytale.server.core.asset.type.model.config.Model;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.npc.role.Role;

public interface MotionController
{
    String getType();
    
    Role getRole();
    
    void setRole(final Role p0);
    
    void setInertia(final double p0);
    
    void setKnockbackScale(final double p0);
    
    double getGravity();
    
    void setHeadPitchAngleRange(@Nullable final float[] p0);
    
    void spawned();
    
    void activate();
    
    void deactivate();
    
    void updateModelParameters(@Nullable final Ref<EntityStore> p0, final Model p1, final Box p2, @Nullable final ComponentAccessor<EntityStore> p3);
    
    double steer(@Nonnull final Ref<EntityStore> p0, @Nonnull final Role p1, @Nonnull final Steering p2, @Nonnull final Steering p3, final double p4, @Nonnull final ComponentAccessor<EntityStore> p5);
    
    double probeMove(@Nonnull final Ref<EntityStore> p0, final Vector3d p1, final Vector3d p2, final ProbeMoveData p3, @Nonnull final ComponentAccessor<EntityStore> p4);
    
    double probeMove(@Nonnull final Ref<EntityStore> p0, final ProbeMoveData p1, @Nonnull final ComponentAccessor<EntityStore> p2);
    
    void constrainRotations(final Role p0, final TransformComponent p1);
    
    double getCurrentMaxBodyRotationSpeed();
    
    void updateMovementState(@Nonnull final Ref<EntityStore> p0, @Nonnull final MovementStates p1, @Nonnull final Steering p2, @Nonnull final Vector3d p3, @Nonnull final ComponentAccessor<EntityStore> p4);
    
    boolean isValidPosition(final Vector3d p0, final ComponentAccessor<EntityStore> p1);
    
    boolean canAct(@Nonnull final Ref<EntityStore> p0, @Nonnull final ComponentAccessor<EntityStore> p1);
    
    boolean isInProgress();
    
    boolean isObstructed();
    
    boolean inAir();
    
    boolean inWater();
    
    boolean onGround();
    
    boolean standingOnBlockOfType(final int p0);
    
    double getMaximumSpeed();
    
    double getCurrentSpeed();
    
    boolean estimateVelocity(final Steering p0, final Vector3d p1);
    
    double getCurrentTurnRadius();
    
    double waypointDistance(final Vector3d p0, final Vector3d p1);
    
    double waypointDistanceSquared(final Vector3d p0, final Vector3d p1);
    
    double waypointDistance(@Nonnull final Ref<EntityStore> p0, final Vector3d p1, @Nonnull final ComponentAccessor<EntityStore> p2);
    
    double waypointDistanceSquared(@Nonnull final Ref<EntityStore> p0, final Vector3d p1, @Nonnull final ComponentAccessor<EntityStore> p2);
    
    float getMaxClimbAngle();
    
    float getMaxSinkAngle();
    
    boolean translateToAccessiblePosition(final Vector3d p0, final Box p1, final double p2, final double p3, final ComponentAccessor<EntityStore> p4);
    
    Vector3d getComponentSelector();
    
    Vector3d getPlanarComponentSelector();
    
    void setComponentSelector(final Vector3d p0);
    
    boolean is2D();
    
    Vector3d getWorldNormal();
    
    Vector3d getWorldAntiNormal();
    
    void addForce(@Nonnull final Vector3d p0, @Nullable final VelocityConfig p1);
    
    Vector3d getForce();
    
    void forceVelocity(@Nonnull final Vector3d p0, @Nullable final VelocityConfig p1, final boolean p2);
    
    VerticalRange getDesiredVerticalRange(@Nonnull final Ref<EntityStore> p0, @Nonnull final ComponentAccessor<EntityStore> p1);
    
    double getWanderVerticalMovementRatio();
    
    void setAvoidingBlockDamage(final boolean p0);
    
    boolean isAvoidingBlockDamage();
    
    boolean willReceiveBlockDamage();
    
    void requirePreciseMovement(final Vector3d p0);
    
    void requireDepthProbing();
    
    void enableHeadingBlending(final double p0, final Vector3d p1, final double p2);
    
    void enableHeadingBlending();
    
    void setRelaxedMoveConstraints(final boolean p0);
    
    boolean isRelaxedMoveConstraints();
    
    NavState getNavState();
    
    double getThrottleDuration();
    
    double getTargetDeltaSquared();
    
    void setNavState(final NavState p0, final double p1, final double p2);
    
    void setForceRecomputePath(final boolean p0);
    
    boolean isForceRecomputePath();
    
    boolean canRestAtPlace();
    
    void beforeInstructionSensorsAndActions(final double p0);
    
    void beforeInstructionMotion(final double p0);
    
    default boolean matchesType(@Nonnull final Class<? extends MotionController> clazz) {
        return clazz.isInstance(this);
    }
    
    double getDesiredAltitudeWeight();
    
    double getHeightOverGround();
    
    default void clearOverrides() {
    }
    
    default double getSquaredDistance(@Nonnull final Vector3d p1, @Nonnull final Vector3d p2, final boolean useProjectedDistance) {
        return useProjectedDistance ? this.waypointDistanceSquared(p1, p2) : p1.distanceSquaredTo(p2);
    }
    
    void updatePhysicsValues(final PhysicsValues p0);
    
    default boolean isInMovementState(@Nonnull final Ref<EntityStore> ref, @Nonnull final MovementState state, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        final MovementStatesComponent movementStatesComponent = componentAccessor.getComponent(ref, MovementStatesComponent.getComponentType());
        assert movementStatesComponent != null;
        final Velocity velocityComponent = componentAccessor.getComponent(ref, Velocity.getComponentType());
        assert velocityComponent != null;
        final MovementStates states = movementStatesComponent.getMovementStates();
        return switch (state) {
            default -> throw new MatchException(null, null);
            case CLIMBING -> states.climbing;
            case FALLING -> states.falling;
            case CROUCHING -> states.crouching;
            case FLYING -> states.flying;
            case JUMPING -> states.jumping;
            case SPRINTING -> states.sprinting;
            case RUNNING -> states.running;
            case IDLE -> velocityComponent.getVelocity().closeToZero(0.001);
            case WALKING -> !velocityComponent.getVelocity().closeToZero(0.001) && !states.falling && !states.climbing && !states.flying && !states.running && !states.sprinting && !states.jumping && !states.crouching;
            case ANY -> true;
        };
    }
    
    default static {
        if (MotionController$1.$assertionsDisabled) {}
    }
    
    public static class VerticalRange
    {
        public double current;
        public double min;
        public double max;
        
        public void assign(final double current, final double min, final double max) {
            this.current = current;
            this.min = min;
            this.max = max;
        }
        
        public boolean isWithinRange() {
            return this.current >= this.min && this.current <= this.max;
        }
    }
}
