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

package com.hypixel.hytale.server.core.entity.entities.player.data;

import com.hypixel.hytale.protocol.MovementStates;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.List;
import javax.annotation.Nullable;
import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
import com.hypixel.hytale.protocol.SavedMovementStates;
import com.hypixel.hytale.math.vector.Transform;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public final class PlayerWorldData
{
    @Nonnull
    public static final BuilderCodec<PlayerWorldData> CODEC;
    private static final int DEATH_POSITIONS_COUNT_MAX = 5;
    private transient PlayerConfigData playerConfigData;
    private Transform lastPosition;
    private SavedMovementStates lastMovementStates;
    private MapMarker[] worldMapMarkers;
    private boolean firstSpawn;
    @Nullable
    private PlayerRespawnPointData[] respawnPoints;
    @Nonnull
    private List<PlayerDeathPositionData> deathPositions;
    
    private PlayerWorldData() {
        this.firstSpawn = true;
        this.deathPositions = new ObjectArrayList<PlayerDeathPositionData>();
    }
    
    PlayerWorldData(@Nonnull final PlayerConfigData playerConfigData) {
        this.firstSpawn = true;
        this.deathPositions = new ObjectArrayList<PlayerDeathPositionData>();
        this.playerConfigData = playerConfigData;
    }
    
    public void setPlayerConfigData(@Nonnull final PlayerConfigData playerConfigData) {
        this.playerConfigData = playerConfigData;
    }
    
    public Transform getLastPosition() {
        return this.lastPosition;
    }
    
    public void setLastPosition(@Nonnull final Transform lastPosition) {
        this.lastPosition = lastPosition;
        this.playerConfigData.markChanged();
    }
    
    public SavedMovementStates getLastMovementStates() {
        return this.lastMovementStates;
    }
    
    public void setLastMovementStates(@Nonnull final MovementStates lastMovementStates, final boolean save) {
        this.setLastMovementStates_internal(lastMovementStates);
        if (save) {
            this.playerConfigData.markChanged();
        }
    }
    
    private void setLastMovementStates_internal(@Nonnull final MovementStates lastMovementStates) {
        this.lastMovementStates = new SavedMovementStates(lastMovementStates.flying);
    }
    
    @Nullable
    public MapMarker[] getWorldMapMarkers() {
        return this.worldMapMarkers;
    }
    
    public void setWorldMapMarkers(final MapMarker[] worldMapMarkers) {
        this.worldMapMarkers = worldMapMarkers;
        this.playerConfigData.markChanged();
    }
    
    public boolean isFirstSpawn() {
        return this.firstSpawn;
    }
    
    public void setFirstSpawn(final boolean firstSpawn) {
        this.firstSpawn = firstSpawn;
    }
    
    @Nullable
    public PlayerRespawnPointData[] getRespawnPoints() {
        return this.respawnPoints;
    }
    
    public void setRespawnPoints(@Nonnull final PlayerRespawnPointData[] respawnPoints) {
        this.respawnPoints = respawnPoints;
        this.playerConfigData.markChanged();
    }
    
    @Nonnull
    public List<PlayerDeathPositionData> getDeathPositions() {
        return this.deathPositions;
    }
    
    public void addLastDeath(@Nonnull final String markerId, @Nonnull final Transform transform, final int deathDay) {
        this.deathPositions.add(new PlayerDeathPositionData(markerId, transform, deathDay));
        while (this.deathPositions.size() > 5) {
            this.deathPositions.removeFirst();
        }
        this.playerConfigData.markChanged();
    }
    
    public void removeLastDeath(@Nonnull final String markerId) {
        this.deathPositions.removeIf(deathPosition -> deathPosition.getMarkerId().equalsIgnoreCase(markerId));
        this.playerConfigData.markChanged();
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #2, 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             "LastPosition"
        //    16: getstatic       com/hypixel/hytale/math/vector/Transform.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    19: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    22: invokedynamic   BootstrapMethod #3, accept:()Ljava/util/function/BiConsumer;
        //    27: invokedynamic   BootstrapMethod #4, apply:()Ljava/util/function/Function;
        //    32: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    35: ldc             "The last known position of the player."
        //    37: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    40: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    43: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    46: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    49: dup            
        //    50: ldc             "LastMovementStates"
        //    52: getstatic       com/hypixel/hytale/server/core/codec/ProtocolCodecs.SAVED_MOVEMENT_STATES:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    55: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    58: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
        //    63: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
        //    68: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    71: ldc             "The last known movement states of the player."
        //    73: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    76: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    79: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    82: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    85: dup            
        //    86: ldc             "WorldMapMarkers"
        //    88: getstatic       com/hypixel/hytale/server/core/codec/ProtocolCodecs.MARKER_ARRAY:Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //    91: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    94: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    99: invokedynamic   BootstrapMethod #8, apply:()Ljava/util/function/Function;
        //   104: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   107: ldc             "The world map markers of the player."
        //   109: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   112: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   115: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   118: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   121: dup            
        //   122: ldc             "FirstSpawn"
        //   124: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   127: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   130: invokedynamic   BootstrapMethod #9, accept:()Ljava/util/function/BiConsumer;
        //   135: invokedynamic   BootstrapMethod #10, apply:()Ljava/util/function/Function;
        //   140: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   143: ldc             "Whether this is the first spawn of the player."
        //   145: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   148: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   151: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   154: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   157: dup            
        //   158: ldc             "RespawnPoints"
        //   160: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   163: dup            
        //   164: getstatic       com/hypixel/hytale/server/core/entity/entities/player/data/PlayerRespawnPointData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   167: invokedynamic   BootstrapMethod #11, apply:()Ljava/util/function/IntFunction;
        //   172: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   175: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   178: invokedynamic   BootstrapMethod #12, accept:()Ljava/util/function/BiConsumer;
        //   183: invokedynamic   BootstrapMethod #13, apply:()Ljava/util/function/Function;
        //   188: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   191: ldc             "The respawn points of the player."
        //   193: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   196: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   199: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   202: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   205: dup            
        //   206: ldc             "DeathPositions"
        //   208: new             Lcom/hypixel/hytale/codec/codecs/array/ArrayCodec;
        //   211: dup            
        //   212: getstatic       com/hypixel/hytale/server/core/entity/entities/player/data/PlayerDeathPositionData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   215: invokedynamic   BootstrapMethod #14, apply:()Ljava/util/function/IntFunction;
        //   220: invokespecial   com/hypixel/hytale/codec/codecs/array/ArrayCodec.<init>:(Lcom/hypixel/hytale/codec/Codec;Ljava/util/function/IntFunction;)V
        //   223: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   226: invokedynamic   BootstrapMethod #15, accept:()Ljava/util/function/BiConsumer;
        //   231: invokedynamic   BootstrapMethod #16, apply:()Ljava/util/function/Function;
        //   236: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   239: ldc             "The death positions of the player in this world."
        //   241: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.documentation:(Ljava/lang/String;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   244: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   247: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   250: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   253: putstatic       com/hypixel/hytale/server/core/entity/entities/player/data/PlayerWorldData.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   256: 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: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: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.");
    }
}
