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

package com.hypixel.hytale.math.vector;

import java.util.Objects;
import javax.annotation.Nullable;
import com.hypixel.hytale.math.Axis;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.math.util.TrigMathUtil;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class Transform
{
    @Nonnull
    public static final BuilderCodec<Transform> CODEC;
    @Nonnull
    public static final BuilderCodec<Transform> CODEC_DEGREES;
    @Nonnull
    protected Vector3d position;
    @Nonnull
    protected Vector3f rotation;
    public static final int X_IS_RELATIVE = 1;
    public static final int Y_IS_RELATIVE = 2;
    public static final int Z_IS_RELATIVE = 4;
    public static final int YAW_IS_RELATIVE = 8;
    public static final int PITCH_IS_RELATIVE = 16;
    public static final int ROLL_IS_RELATIVE = 32;
    public static final int RELATIVE_TO_BLOCK = 64;
    
    public Transform() {
        this(new Vector3d(), new Vector3f(Float.NaN, Float.NaN, Float.NaN));
    }
    
    public Transform(@Nonnull final Vector3i position) {
        this(new Vector3d(position), new Vector3f(Float.NaN, Float.NaN, Float.NaN));
    }
    
    public Transform(@Nonnull final Vector3d position) {
        this(new Vector3d(position), new Vector3f(Float.NaN, Float.NaN, Float.NaN));
    }
    
    public Transform(final double x, final double y, final double z) {
        this(new Vector3d(x, y, z), new Vector3f(Float.NaN, Float.NaN, Float.NaN));
    }
    
    public Transform(final double x, final double y, final double z, final float pitch, final float yaw, final float roll) {
        this(new Vector3d(x, y, z), new Vector3f(pitch, yaw, roll));
    }
    
    public Transform(@Nonnull final Vector3d position, @Nonnull final Vector3f rotation) {
        this.position = position;
        this.rotation = rotation;
    }
    
    public void assign(@Nonnull final Transform transform) {
        this.position.assign(transform.getPosition());
        this.rotation.assign(transform.getRotation());
    }
    
    @Nonnull
    public Vector3d getPosition() {
        return this.position;
    }
    
    public void setPosition(@Nonnull final Vector3d position) {
        this.position = position;
    }
    
    @Nonnull
    public Vector3f getRotation() {
        return this.rotation;
    }
    
    public void setRotation(@Nonnull final Vector3f rotation) {
        this.rotation = rotation;
    }
    
    @Nonnull
    public Vector3d getDirection() {
        return getDirection(this.rotation.getPitch(), this.rotation.getYaw());
    }
    
    @Nonnull
    public static Vector3d getDirection(final float pitch, final float yaw) {
        if (Float.isNaN(pitch)) {
            throw new IllegalStateException("Pitch can't be NaN");
        }
        if (Float.isNaN(yaw)) {
            throw new IllegalStateException("Yaw can't be NaN");
        }
        final double len = TrigMathUtil.cos(pitch);
        final double x = len * -TrigMathUtil.sin(yaw);
        final double y = TrigMathUtil.sin(pitch);
        final double z = len * -TrigMathUtil.cos(yaw);
        return new Vector3d(x, y, z);
    }
    
    @Nonnull
    public Vector3i getAxisDirection() {
        return this.getAxisDirection(this.rotation.getPitch(), this.rotation.getYaw());
    }
    
    @Nonnull
    public Vector3i getAxisDirection(final float pitch, final float yaw) {
        if (Float.isNaN(pitch)) {
            throw new IllegalStateException("Pitch can't be NaN");
        }
        if (Float.isNaN(yaw)) {
            throw new IllegalStateException("Yaw can't be NaN");
        }
        final float len = TrigMathUtil.cos(pitch);
        final float x = len * -TrigMathUtil.sin(yaw);
        final float y = TrigMathUtil.sin(pitch);
        final float z = len * -TrigMathUtil.cos(yaw);
        return new Vector3i(MathUtil.fastRound(x), MathUtil.fastRound(y), MathUtil.fastRound(z));
    }
    
    @Nonnull
    public Axis getAxis() {
        final Vector3i axisDirection = this.getAxisDirection();
        if (axisDirection.getX() != 0) {
            return Axis.X;
        }
        if (axisDirection.getY() != 0) {
            return Axis.Y;
        }
        return Axis.Z;
    }
    
    @Nonnull
    public Transform clone() {
        return new Transform(this.position.clone(), this.rotation.clone());
    }
    
    @Override
    public boolean equals(@Nullable final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final Transform transform = (Transform)o;
        return Objects.equals(this.position, transform.position) && Objects.equals(this.rotation, transform.rotation);
    }
    
    @Override
    public int hashCode() {
        int result = this.position.hashCode();
        result = 31 * result + this.rotation.hashCode();
        return result;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Transform{position=" + String.valueOf(this.position) + ", rotation=" + String.valueOf(this.rotation);
    }
    
    public static void applyMaskedRelativeTransform(@Nonnull final Transform transform, final byte relativeMask, @Nonnull final Vector3d sourcePosition, @Nonnull final Vector3f sourceRotation, @Nonnull final Vector3i blockPosition) {
        if (relativeMask == 0) {
            return;
        }
        if ((relativeMask & 0x40) != 0x0) {
            if ((relativeMask & 0x1) != 0x0) {
                transform.getPosition().setX(transform.getPosition().getX() + blockPosition.getX());
            }
            if ((relativeMask & 0x2) != 0x0) {
                transform.getPosition().setY(transform.getPosition().getY() + blockPosition.getY());
            }
            if ((relativeMask & 0x4) != 0x0) {
                transform.getPosition().setZ(transform.getPosition().getZ() + blockPosition.getZ());
            }
        }
        else {
            if ((relativeMask & 0x1) != 0x0) {
                transform.getPosition().setX(transform.getPosition().getX() + sourcePosition.getX());
            }
            if ((relativeMask & 0x2) != 0x0) {
                transform.getPosition().setY(transform.getPosition().getY() + sourcePosition.getY());
            }
            if ((relativeMask & 0x4) != 0x0) {
                transform.getPosition().setZ(transform.getPosition().getZ() + sourcePosition.getZ());
            }
        }
        if ((relativeMask & 0x8) != 0x0) {
            transform.getRotation().setYaw(transform.getRotation().getYaw() + sourceRotation.getYaw());
        }
        if ((relativeMask & 0x10) != 0x0) {
            transform.getRotation().setPitch(transform.getRotation().getPitch() + sourceRotation.getPitch());
        }
        if ((relativeMask & 0x20) != 0x0) {
            transform.getRotation().setRoll(transform.getRotation().getRoll() + sourceRotation.getRoll());
        }
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #1, get:()Ljava/util/function/Supplier;
        //     7: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    10: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    13: dup            
        //    14: ldc             "X"
        //    16: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //    19: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    22: invokedynamic   BootstrapMethod #2, accept:()Ljava/util/function/BiConsumer;
        //    27: invokedynamic   BootstrapMethod #3, apply:()Ljava/util/function/Function;
        //    32: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    37: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    40: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    43: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    46: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    49: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    52: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    55: dup            
        //    56: ldc_w           "Y"
        //    59: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //    62: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    65: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
        //    70: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
        //    75: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    80: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    83: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    86: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    89: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    92: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    95: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    98: dup            
        //    99: ldc_w           "Z"
        //   102: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //   105: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   108: invokedynamic   BootstrapMethod #8, accept:()Ljava/util/function/BiConsumer;
        //   113: invokedynamic   BootstrapMethod #9, apply:()Ljava/util/function/Function;
        //   118: invokedynamic   BootstrapMethod #10, accept:()Ljava/util/function/BiConsumer;
        //   123: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   126: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   129: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   132: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   135: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   138: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   141: dup            
        //   142: ldc_w           "Pitch"
        //   145: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   148: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   151: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
        //   156: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
        //   161: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
        //   166: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   169: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   172: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   175: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   178: dup            
        //   179: ldc_w           "Yaw"
        //   182: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   185: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   188: invokedynamic   BootstrapMethod #14, accept:()Ljava/util/function/BiConsumer;
        //   193: invokedynamic   BootstrapMethod #15, apply:()Ljava/util/function/Function;
        //   198: invokedynamic   BootstrapMethod #16, accept:()Ljava/util/function/BiConsumer;
        //   203: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   206: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   209: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   212: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   215: dup            
        //   216: ldc_w           "Roll"
        //   219: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   222: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   225: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
        //   230: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
        //   235: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   240: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   243: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   246: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   249: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   252: putstatic       com/hypixel/hytale/math/vector/Transform.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   255: ldc             Lcom/hypixel/hytale/math/vector/Transform;.class
        //   257: invokedynamic   BootstrapMethod #1, get:()Ljava/util/function/Supplier;
        //   262: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   265: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   268: dup            
        //   269: ldc             "X"
        //   271: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //   274: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   277: invokedynamic   BootstrapMethod #20, accept:()Ljava/util/function/BiConsumer;
        //   282: invokedynamic   BootstrapMethod #21, apply:()Ljava/util/function/Function;
        //   287: invokedynamic   BootstrapMethod #22, accept:()Ljava/util/function/BiConsumer;
        //   292: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   295: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   298: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   301: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   304: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   307: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   310: dup            
        //   311: ldc_w           "Y"
        //   314: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //   317: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   320: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
        //   325: invokedynamic   BootstrapMethod #24, apply:()Ljava/util/function/Function;
        //   330: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
        //   335: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   338: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   341: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   344: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   347: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   350: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   353: dup            
        //   354: ldc_w           "Z"
        //   357: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //   360: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   363: invokedynamic   BootstrapMethod #26, accept:()Ljava/util/function/BiConsumer;
        //   368: invokedynamic   BootstrapMethod #27, apply:()Ljava/util/function/Function;
        //   373: invokedynamic   BootstrapMethod #28, accept:()Ljava/util/function/BiConsumer;
        //   378: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   381: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   384: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   387: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   390: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   393: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   396: dup            
        //   397: ldc_w           "Pitch"
        //   400: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   403: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   406: invokedynamic   BootstrapMethod #29, accept:()Ljava/util/function/BiConsumer;
        //   411: invokedynamic   BootstrapMethod #30, apply:()Ljava/util/function/Function;
        //   416: invokedynamic   BootstrapMethod #31, accept:()Ljava/util/function/BiConsumer;
        //   421: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   424: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   427: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   430: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   433: dup            
        //   434: ldc_w           "Yaw"
        //   437: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   440: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   443: invokedynamic   BootstrapMethod #32, accept:()Ljava/util/function/BiConsumer;
        //   448: invokedynamic   BootstrapMethod #33, apply:()Ljava/util/function/Function;
        //   453: invokedynamic   BootstrapMethod #34, accept:()Ljava/util/function/BiConsumer;
        //   458: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   461: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   464: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   467: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   470: dup            
        //   471: ldc_w           "Roll"
        //   474: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   477: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   480: invokedynamic   BootstrapMethod #35, accept:()Ljava/util/function/BiConsumer;
        //   485: invokedynamic   BootstrapMethod #36, apply:()Ljava/util/function/Function;
        //   490: invokedynamic   BootstrapMethod #37, accept:()Ljava/util/function/BiConsumer;
        //   495: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   498: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   501: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   504: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   507: putstatic       com/hypixel/hytale/math/vector/Transform.CODEC_DEGREES:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   510: return         
        // 
        // 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: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: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.runInference(TypeAnalysis.java:667)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
        //     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.");
    }
}
