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

package com.hypixel.hytale.builtin.deployables.config;

import com.hypixel.hytale.server.core.entity.knockback.KnockbackComponent;
import com.hypixel.hytale.builtin.deployables.DeployablesUtils;
import com.hypixel.hytale.server.core.modules.entity.damage.DamageSystems;
import com.hypixel.hytale.server.core.modules.entity.damage.DamageCause;
import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
import com.hypixel.hytale.server.core.modules.projectile.config.StandardPhysicsProvider;
import com.hypixel.hytale.builtin.deployables.component.DeployableProjectileComponent;
import java.util.concurrent.atomic.AtomicReference;
import com.hypixel.hytale.component.RemoveReason;
import java.util.Collection;
import java.util.Collections;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.protocol.Opacity;
import com.hypixel.hytale.protocol.BlockMaterial;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
import java.util.UUID;
import java.util.Iterator;
import java.util.List;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.util.TargetUtil;
import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
import com.hypixel.hytale.server.core.modules.entity.DespawnComponent;
import java.time.Instant;
import java.time.temporal.TemporalUnit;
import java.time.temporal.ChronoUnit;
import com.hypixel.hytale.server.core.modules.time.TimeResource;
import com.hypixel.hytale.builtin.deployables.component.DeployableProjectileShooterComponent;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ArchetypeChunk;
import com.hypixel.hytale.builtin.deployables.component.DeployableComponent;
import com.hypixel.hytale.server.core.asset.type.soundevent.config.SoundEvent;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.Map;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.combat.Knockback;
import com.hypixel.hytale.server.core.modules.projectile.config.ProjectileConfig;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class DeployableTurretConfig extends DeployableConfig
{
    @Nonnull
    public static final BuilderCodec<DeployableTurretConfig> CODEC;
    protected float trackableRadius;
    protected float detectionRadius;
    protected float rotationSpeed;
    protected float projectileDamage;
    protected boolean preferOwnerTarget;
    protected int ammo;
    protected ProjectileConfig projectileConfig;
    protected float deployDelay;
    protected float shotInterval;
    protected int burstCount;
    protected float burstCooldown;
    protected boolean canShootOwner;
    protected Knockback projectileKnockback;
    protected Vector3d targetOffset;
    protected boolean doLineOfSightTest;
    protected String projectileHitWorldSoundEventId;
    protected String projectileHitLocalSoundEventId;
    protected int projectileHitLocalSoundEventIndex;
    protected int projectileHitWorldSoundEventIndex;
    protected boolean respectTeams;
    protected Map<String, Vector3d> projectileSpawnOffsets;
    
    public DeployableTurretConfig() {
        this.targetOffset = new Vector3d(0.0, 0.0, 0.0);
        this.doLineOfSightTest = true;
        this.projectileHitLocalSoundEventIndex = 0;
        this.projectileHitWorldSoundEventIndex = 0;
        this.respectTeams = true;
        this.projectileSpawnOffsets = new Object2ObjectOpenHashMap<String, Vector3d>();
    }
    
    protected void processConfig() {
        if (this.projectileHitWorldSoundEventId != null) {
            final int index = SoundEvent.getAssetMap().getIndex(this.projectileHitWorldSoundEventId);
            this.projectileHitLocalSoundEventIndex = index;
            this.projectileHitWorldSoundEventIndex = index;
        }
        if (this.projectileHitLocalSoundEventId != null) {
            this.projectileHitLocalSoundEventIndex = SoundEvent.getAssetMap().getIndex(this.projectileHitLocalSoundEventId);
        }
    }
    
    @Override
    public void tick(@Nonnull final DeployableComponent deployableComponent, final float dt, final int index, @Nonnull final ArchetypeChunk<EntityStore> archetypeChunk, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        final Ref<EntityStore> entityRef = archetypeChunk.getReferenceTo(index);
        switch (deployableComponent.getFlag(DeployableComponent.DeployableFlag.STATE)) {
            case 0: {
                this.tickInitState(entityRef, deployableComponent, store, commandBuffer);
                break;
            }
            case 1: {
                this.tickStartDeployState(entityRef, deployableComponent, store);
                break;
            }
            case 2: {
                this.tickAwaitDeployState(entityRef, deployableComponent, store);
                break;
            }
            case 3: {
                this.tickAttackState(entityRef, deployableComponent, dt, store, commandBuffer);
                break;
            }
        }
    }
    
    private void tickInitState(@Nonnull final Ref<EntityStore> entityRef, @Nonnull final DeployableComponent component, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        component.setFlag(DeployableComponent.DeployableFlag.STATE, 1);
        commandBuffer.addComponent(entityRef, DeployableProjectileShooterComponent.getComponentType());
        DeployableConfig.playAnimation(store, entityRef, this, "Deploy");
    }
    
    private void tickStartDeployState(@Nonnull final Ref<EntityStore> ref, @Nonnull final DeployableComponent component, @Nonnull final Store<EntityStore> store) {
        component.setFlag(DeployableComponent.DeployableFlag.STATE, 2);
        DeployableConfig.playAnimation(store, ref, this, "Deploy");
    }
    
    private void tickAwaitDeployState(@Nonnull final Ref<EntityStore> ref, @Nonnull final DeployableComponent component, @Nonnull final Store<EntityStore> store) {
        final Instant now = store.getResource(TimeResource.getResourceType()).getNow();
        final Instant readyTime = component.getSpawnInstant().plus((long)this.deployDelay, (TemporalUnit)ChronoUnit.SECONDS);
        if (now.isAfter(readyTime)) {
            component.setFlag(DeployableComponent.DeployableFlag.STATE, 3);
            DeployableConfig.playAnimation(store, ref, this, "Loop");
        }
    }
    
    private void tickAttackState(@Nonnull final Ref<EntityStore> ref, @Nonnull final DeployableComponent component, final float dt, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        component.setTimeSinceLastAttack(component.getTimeSinceLastAttack() + dt);
        final World world = commandBuffer.getExternalData().getWorld();
        final DeployableProjectileShooterComponent shooterComponent = store.getComponent(ref, DeployableProjectileShooterComponent.getComponentType());
        final Vector3d spawnPos = Vector3d.ZERO.clone();
        if (this.projectileSpawnOffsets != null) {
            spawnPos.add(this.projectileSpawnOffsets.get(component.getSpawnFace()));
        }
        if (shooterComponent == null) {
            world.execute(() -> {
                if (ref.isValid()) {
                    final DespawnComponent despawn = store.ensureAndGetComponent(ref, DespawnComponent.getComponentType());
                    final WorldTimeResource timeManager = commandBuffer.getResource(WorldTimeResource.getResourceType());
                    despawn.setDespawn(timeManager.getGameTime());
                }
            });
            return;
        }
        final TransformComponent transformComponent = store.getComponent(ref, TransformComponent.getComponentType());
        assert transformComponent != null;
        final HeadRotation headRotationComponent = store.getComponent(ref, HeadRotation.getComponentType());
        assert headRotationComponent != null;
        final Vector3d pos = Vector3d.add(spawnPos, transformComponent.getPosition());
        this.updateProjectiles(store, commandBuffer, shooterComponent);
        boolean hasTarget = false;
        Ref<EntityStore> target = shooterComponent.getActiveTarget();
        if (target != null && target.isValid()) {
            final TransformComponent targetTransformComponent = store.getComponent(target, TransformComponent.getComponentType());
            assert targetTransformComponent != null;
            final Vector3d targetPos = this.calculatedTargetPosition(targetTransformComponent.getPosition());
            final Vector3d direction = Vector3d.directionTo(pos, targetPos);
            if (targetPos.distanceTo(pos) <= this.trackableRadius && this.testLineOfSight(pos, targetPos, direction, commandBuffer)) {
                hasTarget = true;
            }
        }
        if (!hasTarget) {
            Ref<EntityStore> closestTarget = null;
            Vector3d closestTargetPos = Vector3d.MAX;
            final List<Ref<EntityStore>> targetEntityRefs = TargetUtil.getAllEntitiesInSphere(pos, this.detectionRadius, commandBuffer);
            for (final Ref<EntityStore> potentialTargetRef : targetEntityRefs) {
                if (potentialTargetRef != null) {
                    if (!potentialTargetRef.isValid()) {
                        continue;
                    }
                    final TransformComponent targetTransformComponent2 = store.getComponent(potentialTargetRef, TransformComponent.getComponentType());
                    assert targetTransformComponent2 != null;
                    final Vector3d targetPosition = this.calculatedTargetPosition(targetTransformComponent2.getPosition());
                    final Vector3d direction2 = Vector3d.directionTo(pos, targetPosition);
                    if (!this.testLineOfSight(pos, targetPosition, direction2, commandBuffer)) {
                        continue;
                    }
                    if (!this.isValidTarget(ref, store, potentialTargetRef) || pos.distanceTo(targetPosition) >= pos.distanceTo(closestTargetPos)) {
                        continue;
                    }
                    closestTargetPos = targetPosition;
                    closestTarget = potentialTargetRef;
                }
            }
            if (closestTarget != null) {
                shooterComponent.setActiveTarget(closestTarget);
                target = closestTarget;
                hasTarget = true;
            }
        }
        Vector3d targetPos2 = Vector3d.ZERO;
        Vector3f targetLookRotation = Vector3f.ZERO;
        Vector3f lookRotation = Vector3f.ZERO;
        if (hasTarget) {
            final TransformComponent targetTransformComponent3 = store.getComponent(target, TransformComponent.getComponentType());
            assert targetTransformComponent3 != null;
            targetPos2 = this.calculatedTargetPosition(targetTransformComponent3.getPosition().clone());
            final Vector3d relativeTargetOffset = new Vector3d(pos.x - targetPos2.x, pos.y - targetPos2.y, pos.z - targetPos2.z);
            targetLookRotation = Vector3f.lookAt(relativeTargetOffset.negate());
            lookRotation = Vector3f.lerpAngle(headRotationComponent.getRotation(), targetLookRotation, this.rotationSpeed * dt);
        }
        headRotationComponent.setRotation(lookRotation);
        final int shotsFired = component.getFlag(DeployableComponent.DeployableFlag.BURST_SHOTS);
        final float timeSinceLastAttack = component.getTimeSinceLastAttack();
        boolean canFire = false;
        if (shotsFired < this.burstCount && timeSinceLastAttack >= this.shotInterval) {
            component.setFlag(DeployableComponent.DeployableFlag.BURST_SHOTS, shotsFired + 1);
            canFire = true;
        }
        else if (shotsFired >= this.burstCount && timeSinceLastAttack >= this.burstCooldown) {
            component.setFlag(DeployableComponent.DeployableFlag.BURST_SHOTS, 1);
            canFire = true;
        }
        if (canFire && hasTarget) {
            final Vector3d fwdDirection = new Vector3d().assign(lookRotation.getYaw(), lookRotation.getPitch());
            final Vector3d rootPos = transformComponent.getPosition();
            Vector3d projectileSpawnPos = Vector3d.ZERO.clone();
            if (this.projectileSpawnOffsets != null) {
                projectileSpawnPos = this.projectileSpawnOffsets.get(component.getSpawnFace()).clone();
            }
            projectileSpawnPos.add(fwdDirection.clone().normalize());
            projectileSpawnPos.add(rootPos);
            final UUID uuid = store.getComponent(ref, UUIDComponent.getComponentType()).getUuid();
            shooterComponent.spawnProjectile(ref, commandBuffer, this.projectileConfig, uuid, projectileSpawnPos, fwdDirection.clone());
            DeployableConfig.playAnimation(store, ref, this, "Shoot");
            component.setTimeSinceLastAttack(0.0f);
        }
    }
    
    private Vector3d calculatedTargetPosition(@Nonnull final Vector3d original) {
        return Vector3d.add(original.clone(), this.targetOffset);
    }
    
    private boolean isValidTarget(@Nonnull final Ref<EntityStore> ref, @Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> targetRef) {
        if (targetRef.equals(ref)) {
            return false;
        }
        final DeployableComponent deployableComponent = store.getComponent(ref, DeployableComponent.getComponentType());
        return deployableComponent == null || this.canShootOwner || !targetRef.equals(deployableComponent.getOwner());
    }
    
    private boolean testLineOfSight(@Nonnull final Vector3d attackerPos, @Nonnull final Vector3d targetPos, @Nonnull final Vector3d direction, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        if (!this.doLineOfSightTest) {
            return true;
        }
        final com.hypixel.hytale.protocol.Vector3f spawnOffset = this.projectileConfig.getSpawnOffset();
        final Vector3d testFromPos = attackerPos.clone().add(spawnOffset.x, spawnOffset.y + this.generatedModel.getEyeHeight(), spawnOffset.z);
        final double distance = testFromPos.distanceTo(targetPos);
        final World world = commandBuffer.getExternalData().getWorld();
        final Vector3f whiteColor = new Vector3f(1.0f, 1.0f, 1.0f);
        if (this.getDebugVisuals()) {
            final Vector3d increment = direction.scale(distance);
            for (int i = 0; i < 10; ++i) {
                final Vector3d pos = testFromPos.clone();
                pos.addScaled(increment, i / 10.0f);
                DebugUtils.addSphere(world, pos, whiteColor, 0.10000000149011612, 0.5f);
            }
        }
        final Vector3i blockPosition = TargetUtil.getTargetBlock(world, (id, fluid_id) -> {
            if (id == 0) {
                return false;
            }
            else {
                final BlockType blockType = BlockType.getAssetMap().getAsset(id);
                final BlockMaterial material = blockType.getMaterial();
                if (material == BlockMaterial.Empty) {
                    return false;
                }
                else {
                    return blockType.getOpacity() != Opacity.Transparent;
                }
            }
        }, attackerPos.x, attackerPos.y, attackerPos.z, direction.x, direction.y, direction.z, distance);
        if (blockPosition == null) {
            return true;
        }
        final double entityDistance = attackerPos.distanceSquaredTo(targetPos);
        final double blockDistance = attackerPos.distanceSquaredTo(blockPosition.x + 0.5, blockPosition.y + 0.5, blockPosition.z + 0.5);
        return entityDistance < blockDistance;
    }
    
    private void updateProjectiles(@Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer, @Nonnull final DeployableProjectileShooterComponent shooterComponent) {
        final List<Ref<EntityStore>> projectiles = shooterComponent.getProjectiles();
        final List<Ref<EntityStore>> projectilesForRemoval = shooterComponent.getProjectilesForRemoval();
        projectiles.removeAll(Collections.singleton((Object)null));
        for (final Ref<EntityStore> projectile : projectiles) {
            this.updateProjectile(projectile, shooterComponent, store, commandBuffer);
        }
        for (final Ref<EntityStore> projectile : projectilesForRemoval) {
            if (projectile.isValid()) {
                commandBuffer.removeEntity(projectile, RemoveReason.REMOVE);
            }
            projectiles.remove(projectile);
        }
        projectilesForRemoval.clear();
    }
    
    private void updateProjectile(@Nonnull final Ref<EntityStore> projectileRef, @Nonnull final DeployableProjectileShooterComponent shooterComponent, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        if (!projectileRef.isValid()) {
            shooterComponent.getProjectilesForRemoval().add(projectileRef);
            return;
        }
        final TransformComponent projTransformComponent = store.getComponent(projectileRef, TransformComponent.getComponentType());
        assert projTransformComponent != null;
        final Vector3d projPos = projTransformComponent.getPosition();
        final AtomicReference<Boolean> hit = new AtomicReference<Boolean>(Boolean.FALSE);
        final DeployableProjectileComponent dProjComponent = store.getComponent(projectileRef, DeployableProjectileComponent.getComponentType());
        assert dProjComponent != null;
        final Vector3d prevPos = dProjComponent.getPreviousTickPosition();
        final Vector3d increment = new Vector3d((projPos.x - prevPos.x) * 0.10000000149011612, (projPos.y - prevPos.y) * 0.10000000149011612, (projPos.z - prevPos.z) * 0.10000000149011612);
        for (int j = 0; j < 10; ++j) {
            if (!hit.get()) {
                final Vector3d clone;
                final Vector3d scanPos = clone = dProjComponent.getPreviousTickPosition().clone();
                clone.x += increment.x * j;
                final Vector3d vector3d = scanPos;
                vector3d.y += increment.y * j;
                final Vector3d vector3d2 = scanPos;
                vector3d2.z += increment.z * j;
                if (this.getDebugVisuals()) {
                    DebugUtils.addSphere(store.getExternalData().getWorld(), scanPos, new Vector3f(1.0f, 1.0f, 1.0f), 0.10000000149011612, 5.0f);
                }
                final List<Ref<EntityStore>> targetEntityRefs = TargetUtil.getAllEntitiesInSphere(scanPos, 0.1, store);
                for (final Ref<EntityStore> targetEntityRef : targetEntityRefs) {
                    if (hit.get()) {
                        return;
                    }
                    this.projectileHit(targetEntityRef, projectileRef, shooterComponent, store, commandBuffer);
                    hit.set(Boolean.TRUE);
                }
            }
        }
        dProjComponent.setPreviousTickPosition(projPos);
        if (!hit.get()) {
            final StandardPhysicsProvider physics = store.getComponent(projectileRef, StandardPhysicsProvider.getComponentType());
            if (physics != null && physics.getState() != StandardPhysicsProvider.STATE.ACTIVE) {
                shooterComponent.getProjectilesForRemoval().add(projectileRef);
            }
        }
    }
    
    private void projectileHit(@Nonnull final Ref<EntityStore> ref, @Nonnull final Ref<EntityStore> projectileRef, @Nonnull final DeployableProjectileShooterComponent shooterComponent, @Nonnull final Store<EntityStore> store, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        final Damage damageEntry = new Damage(new Damage.EntitySource(ref), DamageCause.PHYSICAL, this.projectileDamage);
        DamageSystems.executeDamage(ref, commandBuffer, damageEntry);
        final TransformComponent projectileTransformComponent = store.getComponent(projectileRef, TransformComponent.getComponentType());
        assert projectileTransformComponent != null;
        final Vector3d projectilePosition = projectileTransformComponent.getPosition().clone();
        if (this.projectileKnockback != null) {
            final float projectileRotationYaw = projectileTransformComponent.getRotation().getYaw();
            store.getExternalData().getWorld().execute(() -> {
                if (ref.isValid()) {
                    this.applyKnockback(ref, projectilePosition, projectileRotationYaw, store);
                }
                return;
            });
        }
        DeployablesUtils.playSoundEventsAtEntity(ref, commandBuffer, this.projectileHitLocalSoundEventIndex, this.projectileHitWorldSoundEventIndex, projectilePosition);
        shooterComponent.getProjectilesForRemoval().add(projectileRef);
    }
    
    private void applyKnockback(@Nonnull final Ref<EntityStore> targetRef, @Nonnull final Vector3d attackerPos, final float attackerYaw, @Nonnull final Store<EntityStore> store) {
        final KnockbackComponent knockbackComponent = store.ensureAndGetComponent(targetRef, KnockbackComponent.getComponentType());
        final TransformComponent transformComponent = store.getComponent(targetRef, TransformComponent.getComponentType());
        assert transformComponent != null;
        knockbackComponent.setVelocity(this.projectileKnockback.calculateVector(attackerPos, attackerYaw, transformComponent.getPosition()));
        knockbackComponent.setVelocityType(this.projectileKnockback.getVelocityType());
        knockbackComponent.setVelocityConfig(this.projectileKnockback.getVelocityConfig());
        knockbackComponent.setDuration(this.projectileKnockback.getDuration());
    }
    
    @Override
    public String toString() {
        return "DeployableTurretConfig{}" + 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/deployables/config/DeployableTurretConfig.$assertionsDisabled:Z
        //    16: ldc             Lcom/hypixel/hytale/builtin/deployables/config/DeployableTurretConfig;.class
        //    18: invokedynamic   BootstrapMethod #4, get:()Ljava/util/function/Supplier;
        //    23: getstatic       com/hypixel/hytale/builtin/deployables/config/DeployableConfig.BASE_CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    26: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;Lcom/hypixel/hytale/codec/builder/BuilderCodec;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    29: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    32: dup            
        //    33: ldc_w           "TrackableRadius"
        //    36: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //    39: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    42: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
        //    47: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
        //    52: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    57: 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;
        //    60: ldc_w           "The radius in which a targeted entity can be tracked"
        //    63: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    66: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    69: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    72: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    75: dup            
        //    76: ldc_w           "DetectionRadius"
        //    79: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //    82: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    85: invokedynamic   BootstrapMethod #8, accept:()Ljava/util/function/BiConsumer;
        //    90: invokedynamic   BootstrapMethod #9, apply:()Ljava/util/function/Function;
        //    95: invokedynamic   BootstrapMethod #10, accept:()Ljava/util/function/BiConsumer;
        //   100: 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;
        //   103: ldc_w           "The radius in which an entity can be targeted"
        //   106: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   109: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   112: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   115: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   118: dup            
        //   119: ldc_w           "RotationSpeed"
        //   122: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   125: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   128: invokedynamic   BootstrapMethod #11, accept:()Ljava/util/function/BiConsumer;
        //   133: invokedynamic   BootstrapMethod #12, apply:()Ljava/util/function/Function;
        //   138: invokedynamic   BootstrapMethod #13, accept:()Ljava/util/function/BiConsumer;
        //   143: 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;
        //   146: ldc_w           "The speed at which the turret can rotate to hit it's target"
        //   149: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   152: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   155: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   158: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   161: dup            
        //   162: ldc_w           "PreferOwnerTarget"
        //   165: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   168: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   171: invokedynamic   BootstrapMethod #14, accept:()Ljava/util/function/BiConsumer;
        //   176: invokedynamic   BootstrapMethod #15, apply:()Ljava/util/function/Function;
        //   181: invokedynamic   BootstrapMethod #16, accept:()Ljava/util/function/BiConsumer;
        //   186: 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;
        //   189: ldc_w           "If true, will prefer targeting entities that the owner is attacking"
        //   192: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   195: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   198: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   201: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   204: dup            
        //   205: ldc_w           "Ammo"
        //   208: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   211: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   214: invokedynamic   BootstrapMethod #17, accept:()Ljava/util/function/BiConsumer;
        //   219: invokedynamic   BootstrapMethod #18, apply:()Ljava/util/function/Function;
        //   224: invokedynamic   BootstrapMethod #19, accept:()Ljava/util/function/BiConsumer;
        //   229: 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;
        //   232: ldc_w           "The total ammo the turret has, each projectile will consume one"
        //   235: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   238: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   241: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   244: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   247: dup            
        //   248: ldc_w           "DeployDelay"
        //   251: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   254: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   257: invokedynamic   BootstrapMethod #20, accept:()Ljava/util/function/BiConsumer;
        //   262: invokedynamic   BootstrapMethod #21, apply:()Ljava/util/function/Function;
        //   267: invokedynamic   BootstrapMethod #22, accept:()Ljava/util/function/BiConsumer;
        //   272: 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;
        //   275: ldc_w           "The delay in seconds until the deployable is ready to begin targeting logic"
        //   278: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   281: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   284: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   287: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   290: dup            
        //   291: ldc_w           "ProjectileConfig"
        //   294: getstatic       com/hypixel/hytale/server/core/modules/projectile/config/ProjectileConfig.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetBuilderCodec;
        //   297: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   300: invokedynamic   BootstrapMethod #23, accept:()Ljava/util/function/BiConsumer;
        //   305: invokedynamic   BootstrapMethod #24, apply:()Ljava/util/function/Function;
        //   310: invokedynamic   BootstrapMethod #25, accept:()Ljava/util/function/BiConsumer;
        //   315: 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;
        //   318: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   321: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   324: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   327: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   330: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   333: dup            
        //   334: ldc_w           "ShotInterval"
        //   337: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   340: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   343: invokedynamic   BootstrapMethod #26, accept:()Ljava/util/function/BiConsumer;
        //   348: invokedynamic   BootstrapMethod #27, apply:()Ljava/util/function/Function;
        //   353: invokedynamic   BootstrapMethod #28, accept:()Ljava/util/function/BiConsumer;
        //   358: 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;
        //   361: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   364: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   367: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   370: dup            
        //   371: ldc_w           "BurstCount"
        //   374: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //   377: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   380: invokedynamic   BootstrapMethod #29, accept:()Ljava/util/function/BiConsumer;
        //   385: invokedynamic   BootstrapMethod #30, apply:()Ljava/util/function/Function;
        //   390: invokedynamic   BootstrapMethod #31, accept:()Ljava/util/function/BiConsumer;
        //   395: 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;
        //   398: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   401: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   404: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   407: dup            
        //   408: ldc_w           "BurstCooldown"
        //   411: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   414: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   417: invokedynamic   BootstrapMethod #32, accept:()Ljava/util/function/BiConsumer;
        //   422: invokedynamic   BootstrapMethod #33, apply:()Ljava/util/function/Function;
        //   427: invokedynamic   BootstrapMethod #34, accept:()Ljava/util/function/BiConsumer;
        //   432: 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;
        //   435: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   438: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   441: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   444: dup            
        //   445: ldc_w           "ProjectileDamage"
        //   448: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   451: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   454: invokedynamic   BootstrapMethod #35, accept:()Ljava/util/function/BiConsumer;
        //   459: invokedynamic   BootstrapMethod #36, apply:()Ljava/util/function/Function;
        //   464: invokedynamic   BootstrapMethod #37, accept:()Ljava/util/function/BiConsumer;
        //   469: 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;
        //   472: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   475: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   478: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   481: dup            
        //   482: ldc_w           "CanShootOwner"
        //   485: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   488: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   491: invokedynamic   BootstrapMethod #38, accept:()Ljava/util/function/BiConsumer;
        //   496: invokedynamic   BootstrapMethod #39, apply:()Ljava/util/function/Function;
        //   501: invokedynamic   BootstrapMethod #40, accept:()Ljava/util/function/BiConsumer;
        //   506: 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;
        //   509: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   512: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   515: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   518: dup            
        //   519: ldc_w           "Knockback"
        //   522: getstatic       com/hypixel/hytale/server/core/modules/interaction/interaction/config/server/combat/Knockback.CODEC:Lcom/hypixel/hytale/codec/lookup/CodecMapCodec;
        //   525: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   528: invokedynamic   BootstrapMethod #41, accept:()Ljava/util/function/BiConsumer;
        //   533: invokedynamic   BootstrapMethod #42, apply:()Ljava/util/function/Function;
        //   538: invokedynamic   BootstrapMethod #43, accept:()Ljava/util/function/BiConsumer;
        //   543: 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;
        //   546: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   549: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   552: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   555: dup            
        //   556: ldc_w           "TargetOffset"
        //   559: getstatic       com/hypixel/hytale/math/vector/Vector3d.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   562: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   565: invokedynamic   BootstrapMethod #44, accept:()Ljava/util/function/BiConsumer;
        //   570: invokedynamic   BootstrapMethod #45, apply:()Ljava/util/function/Function;
        //   575: invokedynamic   BootstrapMethod #46, accept:()Ljava/util/function/BiConsumer;
        //   580: 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;
        //   583: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   586: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   589: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   592: dup            
        //   593: ldc_w           "DoLineOfSightTest"
        //   596: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   599: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   602: invokedynamic   BootstrapMethod #47, accept:()Ljava/util/function/BiConsumer;
        //   607: invokedynamic   BootstrapMethod #48, apply:()Ljava/util/function/Function;
        //   612: invokedynamic   BootstrapMethod #49, accept:()Ljava/util/function/BiConsumer;
        //   617: 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;
        //   620: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   623: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   626: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   629: dup            
        //   630: ldc_w           "ProjectileHitWorldSoundEventId"
        //   633: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   636: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   639: invokedynamic   BootstrapMethod #50, accept:()Ljava/util/function/BiConsumer;
        //   644: invokedynamic   BootstrapMethod #51, apply:()Ljava/util/function/Function;
        //   649: invokedynamic   BootstrapMethod #52, accept:()Ljava/util/function/BiConsumer;
        //   654: 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;
        //   657: ldc_w           "The positioned sound event played to surrounding players when the projectile hits a player"
        //   660: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   663: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   666: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   669: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   672: dup            
        //   673: ldc_w           "ProjectileHitLocalSoundEventId"
        //   676: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   679: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   682: invokedynamic   BootstrapMethod #53, accept:()Ljava/util/function/BiConsumer;
        //   687: invokedynamic   BootstrapMethod #54, apply:()Ljava/util/function/Function;
        //   692: invokedynamic   BootstrapMethod #55, accept:()Ljava/util/function/BiConsumer;
        //   697: 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;
        //   700: ldc_w           "The positioned sound event played to a player hit by the projectile"
        //   703: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   706: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   709: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   712: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   715: dup            
        //   716: ldc_w           "RespectTeams"
        //   719: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   722: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   725: invokedynamic   BootstrapMethod #56, accept:()Ljava/util/function/BiConsumer;
        //   730: invokedynamic   BootstrapMethod #57, apply:()Ljava/util/function/Function;
        //   735: invokedynamic   BootstrapMethod #58, accept:()Ljava/util/function/BiConsumer;
        //   740: 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;
        //   743: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   746: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   749: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   752: dup            
        //   753: ldc_w           "ProjectileSpawnOffsets"
        //   756: new             Lcom/hypixel/hytale/codec/codecs/map/MapCodec;
        //   759: dup            
        //   760: getstatic       com/hypixel/hytale/math/vector/Vector3d.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   763: invokedynamic   BootstrapMethod #59, get:()Ljava/util/function/Supplier;
        //   768: iconst_1       
        //   769: invokespecial   com/hypixel/hytale/codec/codecs/map/MapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/Supplier;Z)V
        //   772: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   775: invokedynamic   BootstrapMethod #60, accept:()Ljava/util/function/BiConsumer;
        //   780: invokedynamic   BootstrapMethod #61, apply:()Ljava/util/function/Function;
        //   785: invokedynamic   BootstrapMethod #62, accept:()Ljava/util/function/BiConsumer;
        //   790: 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;
        //   793: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   796: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   799: invokedynamic   BootstrapMethod #63, accept:()Ljava/util/function/Consumer;
        //   804: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.afterDecode:(Ljava/util/function/Consumer;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   807: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   810: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   813: putstatic       com/hypixel/hytale/builtin/deployables/config/DeployableTurretConfig.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   816: 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: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.");
    }
}
