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

package com.hypixel.hytale.server.flock.config;

import javax.annotation.Nonnull;
import java.util.Arrays;
import com.hypixel.hytale.common.util.ArrayUtil;
import com.hypixel.hytale.assetstore.AssetRegistry;
import com.hypixel.hytale.assetstore.AssetExtraInfo;
import com.hypixel.hytale.assetstore.AssetStore;
import com.hypixel.hytale.codec.validation.ValidatorCache;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;

public abstract class FlockAsset implements JsonAssetWithMap<String, IndexedLookupTableAssetMap<String, FlockAsset>>
{
    public static final BuilderCodec<FlockAsset> ABSTRACT_CODEC;
    public static final AssetCodecMapCodec<String, FlockAsset> CODEC;
    public static final Codec<String> CHILD_ASSET_CODEC;
    public static final ValidatorCache<String> VALIDATOR_CACHE;
    private static AssetStore<String, FlockAsset, IndexedLookupTableAssetMap<String, FlockAsset>> ASSET_STORE;
    private AssetExtraInfo.Data data;
    protected String id;
    protected int maxGrowSize;
    protected String[] blockedRoles;
    
    public static AssetStore<String, FlockAsset, IndexedLookupTableAssetMap<String, FlockAsset>> getAssetStore() {
        if (FlockAsset.ASSET_STORE == null) {
            FlockAsset.ASSET_STORE = AssetRegistry.getAssetStore(FlockAsset.class);
        }
        return FlockAsset.ASSET_STORE;
    }
    
    public static IndexedLookupTableAssetMap<String, FlockAsset> getAssetMap() {
        return getAssetStore().getAssetMap();
    }
    
    protected FlockAsset() {
        this.maxGrowSize = 8;
        this.blockedRoles = ArrayUtil.EMPTY_STRING_ARRAY;
    }
    
    protected FlockAsset(final String id) {
        this.maxGrowSize = 8;
        this.blockedRoles = ArrayUtil.EMPTY_STRING_ARRAY;
        this.id = id;
    }
    
    @Override
    public String getId() {
        return this.id;
    }
    
    public abstract int getMinFlockSize();
    
    public abstract int pickFlockSize();
    
    public int getMaxGrowSize() {
        return this.maxGrowSize;
    }
    
    public String[] getBlockedRoles() {
        return this.blockedRoles;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "FlockAsset{id='" + this.id + "', maxGrowSize=" + this.maxGrowSize + ", blockedRoles=" + Arrays.toString(this.blockedRoles);
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.abstractBuilder:(Ljava/lang/Class;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //     5: ldc             "A flock definition."
        //     7: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    10: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    13: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    16: dup            
        //    17: ldc             "MaxGrowSize"
        //    19: getstatic       com/hypixel/hytale/codec/Codec.INTEGER:Lcom/hypixel/hytale/codec/codecs/simple/IntegerCodec;
        //    22: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    25: invokedynamic   BootstrapMethod #1, accept:()Ljava/util/function/BiConsumer;
        //    30: invokedynamic   BootstrapMethod #2, apply:()Ljava/util/function/Function;
        //    35: invokedynamic   BootstrapMethod #3, accept:()Ljava/util/function/BiConsumer;
        //    40: 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;
        //    43: ldc             "The maximum size a flock can possibly grow to after spawning. It is technically possible to spawn a flock without specifying a definition (e.g. via a command), in which case the maximum grow size is irrelevant."
        //    45: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    48: iconst_0       
        //    49: invokestatic    java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        //    52: invokestatic    com/hypixel/hytale/codec/validation/Validators.greaterThanOrEqual:(Ljava/lang/Comparable;)Lcom/hypixel/hytale/codec/validation/Validator;
        //    55: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    58: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    61: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    64: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    67: dup            
        //    68: ldc             "BlockedRoles"
        //    70: getstatic       com/hypixel/hytale/codec/Codec.STRING_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //    73: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    76: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    81: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/Function;
        //    86: invokedynamic   BootstrapMethod #6, accept:()Ljava/util/function/BiConsumer;
        //    91: 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;
        //    94: ldc             "An array of roles that will not be allowed to join this flock once it has been spawned. This is used to exclude roles from the list of allowed roles in the NPC configuration of the initial leader."
        //    96: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    99: invokestatic    com/hypixel/hytale/codec/validation/Validators.uniqueInArray:()Lcom/hypixel/hytale/codec/validation/Validator;
        //   102: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   105: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()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/server/flock/config/FlockAsset.ABSTRACT_CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   117: new             Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   120: dup            
        //   121: getstatic       com/hypixel/hytale/codec/Codec.STRING:Lcom/hypixel/hytale/codec/codecs/simple/StringCodec;
        //   124: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //   129: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //   134: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //   139: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //   144: iconst_1       
        //   145: invokespecial   com/hypixel/hytale/assetstore/codec/AssetCodecMapCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Z)V
        //   148: getstatic       com/hypixel/hytale/codec/lookup/Priority.DEFAULT:Lcom/hypixel/hytale/codec/lookup/Priority;
        //   151: ldc             "Default"
        //   153: ldc             Lcom/hypixel/hytale/server/flock/config/RangeSizeFlockAsset;.class
        //   155: getstatic       com/hypixel/hytale/server/flock/config/RangeSizeFlockAsset.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   158: invokevirtual   com/hypixel/hytale/assetstore/codec/AssetCodecMapCodec.register:(Lcom/hypixel/hytale/codec/lookup/Priority;Ljava/lang/String;Ljava/lang/Class;Lcom/hypixel/hytale/codec/builder/BuilderCodec;)Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   161: putstatic       com/hypixel/hytale/server/flock/config/FlockAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   164: new             Lcom/hypixel/hytale/assetstore/codec/ContainedAssetCodec;
        //   167: dup            
        //   168: ldc             Lcom/hypixel/hytale/server/flock/config/FlockAsset;.class
        //   170: getstatic       com/hypixel/hytale/server/flock/config/FlockAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   173: invokespecial   com/hypixel/hytale/assetstore/codec/ContainedAssetCodec.<init>:(Ljava/lang/Class;Lcom/hypixel/hytale/assetstore/codec/AssetCodec;)V
        //   176: putstatic       com/hypixel/hytale/server/flock/config/FlockAsset.CHILD_ASSET_CODEC:Lcom/hypixel/hytale/codec/Codec;
        //   179: new             Lcom/hypixel/hytale/codec/validation/ValidatorCache;
        //   182: dup            
        //   183: new             Lcom/hypixel/hytale/assetstore/AssetKeyValidator;
        //   186: dup            
        //   187: invokedynamic   BootstrapMethod #11, get:()Ljava/util/function/Supplier;
        //   192: invokespecial   com/hypixel/hytale/assetstore/AssetKeyValidator.<init>:(Ljava/util/function/Supplier;)V
        //   195: invokespecial   com/hypixel/hytale/codec/validation/ValidatorCache.<init>:(Lcom/hypixel/hytale/codec/validation/Validator;)V
        //   198: putstatic       com/hypixel/hytale/server/flock/config/FlockAsset.VALIDATOR_CACHE:Lcom/hypixel/hytale/codec/validation/ValidatorCache;
        //   201: getstatic       com/hypixel/hytale/server/flock/config/FlockAsset.CODEC:Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   204: ldc             "Weighted"
        //   206: ldc             Lcom/hypixel/hytale/server/flock/config/WeightedSizeFlockAsset;.class
        //   208: getstatic       com/hypixel/hytale/server/flock/config/WeightedSizeFlockAsset.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   211: invokevirtual   com/hypixel/hytale/assetstore/codec/AssetCodecMapCodec.register:(Ljava/lang/String;Ljava/lang/Class;Lcom/hypixel/hytale/codec/builder/BuilderCodec;)Lcom/hypixel/hytale/assetstore/codec/AssetCodecMapCodec;
        //   214: pop            
        //   215: 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: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: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: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.");
    }
}
