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

package com.hypixel.hytale.builtin.adventure.objectives.config.markerarea;

import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.component.ComponentType;
import com.hypixel.hytale.math.vector.Vector3d;
import java.util.List;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.spatial.SpatialResource;
import com.hypixel.hytale.math.shape.Box;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class ObjectiveLocationAreaBox extends ObjectiveLocationMarkerArea
{
    public static final BuilderCodec<ObjectiveLocationAreaBox> CODEC;
    private static final Box DEFAULT_ENTRY_BOX;
    private static final Box DEFAULT_EXIT_BOX;
    private Box entryArea;
    private Box exitArea;
    
    public ObjectiveLocationAreaBox(final Box entryBox, final Box exitBox) {
        this.entryArea = entryBox;
        this.exitArea = exitBox;
        this.computeAreaBoxes();
    }
    
    protected ObjectiveLocationAreaBox() {
        this(ObjectiveLocationAreaBox.DEFAULT_ENTRY_BOX, ObjectiveLocationAreaBox.DEFAULT_EXIT_BOX);
    }
    
    public Box getEntryArea() {
        return this.entryArea;
    }
    
    public Box getExitArea() {
        return this.exitArea;
    }
    
    @Override
    public void getPlayersInEntryArea(@Nonnull final SpatialResource<Ref<EntityStore>, EntityStore> spatialComponent, @Nonnull final List<Ref<EntityStore>> results, @Nonnull final Vector3d markerPosition) {
        getPlayersInArea(spatialComponent, results, markerPosition, this.entryArea);
    }
    
    @Override
    public void getPlayersInExitArea(@Nonnull final SpatialResource<Ref<EntityStore>, EntityStore> spatialComponent, @Nonnull final List<Ref<EntityStore>> results, @Nonnull final Vector3d markerPosition) {
        getPlayersInArea(spatialComponent, results, markerPosition, this.exitArea);
    }
    
    @Override
    public boolean hasPlayerInExitArea(@Nonnull final SpatialResource<Ref<EntityStore>, EntityStore> spatialComponent, @Nonnull final ComponentType<EntityStore, PlayerRef> playerRefComponentType, @Nonnull final Vector3d markerPosition, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        final Ref<EntityStore> reference = spatialComponent.getSpatialStructure().closest(markerPosition);
        if (reference == null) {
            return false;
        }
        final TransformComponent transformComponent = commandBuffer.getComponent(reference, TransformComponent.getComponentType());
        assert transformComponent != null;
        return this.exitArea.containsPosition(markerPosition, transformComponent.getPosition());
    }
    
    @Override
    public boolean isPlayerInEntryArea(@Nonnull final Vector3d playerPosition, @Nonnull final Vector3d markerPosition) {
        return this.entryArea.containsPosition(markerPosition, playerPosition);
    }
    
    @Nonnull
    @Override
    public ObjectiveLocationMarkerArea getRotatedArea(final float yaw, final float pitch) {
        final float snappedYaw = Math.round(yaw / 1.5707964f) * 1.5707964f;
        if (Math.abs(snappedYaw % 6.2831855f) > 0.7853982f) {
            final Box entry = this.entryArea.clone().rotateY(snappedYaw).normalize();
            final Box exit = this.exitArea.clone().rotateY(snappedYaw).normalize();
            return new ObjectiveLocationAreaBox(entry, exit);
        }
        return this;
    }
    
    @Override
    protected void computeAreaBoxes() {
        this.entryAreaBox = this.entryArea;
        this.exitAreaBox = this.exitArea;
    }
    
    private static void getPlayersInArea(@Nonnull final SpatialResource<Ref<EntityStore>, EntityStore> spatialComponent, final List<Ref<EntityStore>> results, @Nonnull final Vector3d markerPosition, @Nonnull final Box box) {
        spatialComponent.getSpatialStructure().collect(markerPosition, box.getMaximumExtent(), results);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ObjectiveLocationAreaBox{} " + super.toString();
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokevirtual   java/lang/Class.desiredAssertionStatus:()Z
        //     5: ifne            12
        //     8: iconst_1       
        //     9: goto            13
        //    12: iconst_0       
        //    13: putstatic       com/hypixel/hytale/builtin/adventure/objectives/config/markerarea/ObjectiveLocationAreaBox.$assertionsDisabled:Z
        //    16: ldc             Lcom/hypixel/hytale/builtin/adventure/objectives/config/markerarea/ObjectiveLocationAreaBox;.class
        //    18: invokedynamic   BootstrapMethod #1, get:()Ljava/util/function/Supplier;
        //    23: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    26: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    29: dup            
        //    30: ldc             "EntryBox"
        //    32: getstatic       com/hypixel/hytale/math/shape/Box.CODEC:Lcom/hypixel/hytale/codec/Codec;
        //    35: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    38: invokedynamic   BootstrapMethod #2, accept:()Ljava/util/function/BiConsumer;
        //    43: invokedynamic   BootstrapMethod #3, apply:()Ljava/util/function/Function;
        //    48: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    51: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    54: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    57: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    60: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    63: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    66: dup            
        //    67: ldc             "ExitBox"
        //    69: getstatic       com/hypixel/hytale/math/shape/Box.CODEC:Lcom/hypixel/hytale/codec/Codec;
        //    72: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    75: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    80: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/Function;
        //    85: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    88: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    91: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    94: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    97: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   100: invokedynamic   BootstrapMethod #6, accept:()Ljava/util/function/Consumer;
        //   105: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.afterDecode:(Ljava/util/function/Consumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   108: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   111: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   114: putstatic       com/hypixel/hytale/builtin/adventure/objectives/config/markerarea/ObjectiveLocationAreaBox.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   117: new             Lcom/hypixel/hytale/math/shape/Box;
        //   120: dup            
        //   121: ldc2_w          -5.0
        //   124: ldc2_w          -5.0
        //   127: ldc2_w          -5.0
        //   130: ldc2_w          5.0
        //   133: ldc2_w          5.0
        //   136: ldc2_w          5.0
        //   139: invokespecial   com/hypixel/hytale/math/shape/Box.<init>:(DDDDDD)V
        //   142: putstatic       com/hypixel/hytale/builtin/adventure/objectives/config/markerarea/ObjectiveLocationAreaBox.DEFAULT_ENTRY_BOX:Lcom/hypixel/hytale/math/shape/Box;
        //   145: new             Lcom/hypixel/hytale/math/shape/Box;
        //   148: dup            
        //   149: ldc2_w          -10.0
        //   152: ldc2_w          -10.0
        //   155: ldc2_w          -10.0
        //   158: ldc2_w          10.0
        //   161: ldc2_w          10.0
        //   164: ldc2_w          10.0
        //   167: invokespecial   com/hypixel/hytale/math/shape/Box.<init>:(DDDDDD)V
        //   170: putstatic       com/hypixel/hytale/builtin/adventure/objectives/config/markerarea/ObjectiveLocationAreaBox.DEFAULT_EXIT_BOX:Lcom/hypixel/hytale/math/shape/Box;
        //   173: return         
        //    StackMapTable: 00 02 0C 40 01
        // 
        // The error that occurred was:
        // 
        // java.lang.UnsupportedOperationException: The requested operation is not supported.
        //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
        //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:225)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:211)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypesForVariables(TypeAnalysis.java:593)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:405)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:109)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
        //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
        //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
        //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
        // 
        throw new IllegalStateException("An error occurred while decompiling this method.");
    }
}
