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

package com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.system;

import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.BreakpointOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.ReplaceOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.EchoOnceOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.EchoOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.PastePrefabOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.saveandload.PersistentDataOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.ErodeOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.offsets.RandomOffsetOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.global.DisableHoldInteractionOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.DeleteOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.MaterialOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.MeltOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.HeightmapLayerOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.LayerOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.offsets.OffsetOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.ShapeOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.SmoothOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.SetOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.SetDensity;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.LiftOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.LoadIntFromToolArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.LoadMaterialFromToolArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.BlockPatternOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpIfToolArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpIfBlockTypeOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpIfCompareOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpIfClickType;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpIfStringMatchOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpToRandomIndex;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.ExitOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.JumpToIndexOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.saveandload.LoadOperationsFromAssetOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.saveandload.SaveIndexOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.saveandload.LoadBrushConfigOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.saveandload.SaveBrushConfigOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.loops.CircleOffsetFromArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.loops.CircleOffsetAndLoopOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.loops.LoopRandomOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.loops.LoadLoopFromToolArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.flowcontrol.loops.LoopOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.global.DebugBrushOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.global.IgnoreExistingBrushDataOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.AppendMaskFromToolArgOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.AppendMaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.UseOperationMaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.UseBrushMaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.ClearOperationMaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.MaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.masks.HistoryMaskOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.RunCommandOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.dimensions.RandomizeDimensionsOperation;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential.dimensions.DimensionsOperation;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgumentType;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfigCommandExecutor;
import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfig;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import java.util.LinkedHashMap;
import java.util.function.Supplier;
import java.util.Map;
import com.hypixel.hytale.codec.lookup.CodecMapCodec;

public abstract class BrushOperation
{
    public static final CodecMapCodec<BrushOperation> OPERATION_CODEC;
    public static final Map<String, Supplier<BrushOperation>> BRUSH_OPERATION_REGISTRY;
    private final String name;
    private final String description;
    private final Map<String, BrushOperationSetting<?>> registeredOperationSettings;
    
    public BrushOperation(final String name, final String description) {
        this.registeredOperationSettings = new LinkedHashMap<String, BrushOperationSetting<?>>();
        this.name = name;
        this.description = description;
    }
    
    public abstract void modifyBrushConfig(@Nonnull final Ref<EntityStore> p0, @Nonnull final BrushConfig p1, @Nonnull final BrushConfigCommandExecutor p2, @Nonnull final ComponentAccessor<EntityStore> p3);
    
    public void resetInternalState() {
    }
    
    public void preExecutionModifyBrushConfig(final BrushConfigCommandExecutor brushConfigCommandExecutor, final int operationIndex) {
    }
    
    @Nonnull
    public <T> BrushOperationSetting<T> createBrushSetting(@Nonnull final String name, final String description, final T defaultValue, final ArgumentType<T> argumentType) {
        final BrushOperationSetting<T> brushOperationSetting = new BrushOperationSetting<T>(name, description, defaultValue, argumentType);
        this.registeredOperationSettings.put(name.toLowerCase(), brushOperationSetting);
        return brushOperationSetting;
    }
    
    @Nonnull
    public <T> BrushOperationSetting<T> createBrushSetting(@Nonnull final String name, final String description, final T defaultValue, final ArgumentType<T> argumentType, final Function<BrushOperationSetting<T>, String> toStringFunction) {
        final BrushOperationSetting<T> brushOperationSetting = new BrushOperationSetting<T>(name, description, defaultValue, argumentType, toStringFunction);
        this.registeredOperationSettings.put(name.toLowerCase(), brushOperationSetting);
        return brushOperationSetting;
    }
    
    public String getName() {
        return this.name;
    }
    
    public String getDescription() {
        return this.description;
    }
    
    @Nonnull
    public Map<String, BrushOperationSetting<?>> getRegisteredOperationSettings() {
        return this.registeredOperationSettings;
    }
    
    static {
        OPERATION_CODEC = new CodecMapCodec<BrushOperation>("Id");
        (BRUSH_OPERATION_REGISTRY = new ConcurrentHashMap<String, Supplier<BrushOperation>>()).put("dimensions", DimensionsOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("randomdimensions", (Supplier<BrushOperation>)RandomizeDimensionsOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("runcommand", (Supplier<BrushOperation>)RunCommandOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("historymask", (Supplier<BrushOperation>)HistoryMaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("mask", (Supplier<BrushOperation>)MaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("clearoperationmask", (Supplier<BrushOperation>)ClearOperationMaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("usebrushmask", (Supplier<BrushOperation>)UseBrushMaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("useoperationmask", (Supplier<BrushOperation>)UseOperationMaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("appendmask", (Supplier<BrushOperation>)AppendMaskOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("appendmaskfromtoolarg", (Supplier<BrushOperation>)AppendMaskFromToolArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("ignorebrushsettings", (Supplier<BrushOperation>)IgnoreExistingBrushDataOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("debug", (Supplier<BrushOperation>)DebugBrushOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loop", (Supplier<BrushOperation>)LoopOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loadloop", (Supplier<BrushOperation>)LoadLoopFromToolArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("looprandom", (Supplier<BrushOperation>)LoopRandomOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loopcircle", (Supplier<BrushOperation>)CircleOffsetAndLoopOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loopcirclefromarg", (Supplier<BrushOperation>)CircleOffsetFromArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("savebrushconfig", (Supplier<BrushOperation>)SaveBrushConfigOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loadbrushconfig", (Supplier<BrushOperation>)LoadBrushConfigOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("saveindex", (Supplier<BrushOperation>)SaveIndexOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loadoperationsfromasset", (Supplier<BrushOperation>)LoadOperationsFromAssetOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jump", (Supplier<BrushOperation>)JumpToIndexOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("exit", (Supplier<BrushOperation>)ExitOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumprandom", (Supplier<BrushOperation>)JumpToRandomIndex::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumpifequal", (Supplier<BrushOperation>)JumpIfStringMatchOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumpifclicktype", (Supplier<BrushOperation>)JumpIfClickType::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumpifcompare", (Supplier<BrushOperation>)JumpIfCompareOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumpifblocktype", (Supplier<BrushOperation>)JumpIfBlockTypeOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("jumpiftoolarg", (Supplier<BrushOperation>)JumpIfToolArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("pattern", (Supplier<BrushOperation>)BlockPatternOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loadmaterial", (Supplier<BrushOperation>)LoadMaterialFromToolArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("loadint", (Supplier<BrushOperation>)LoadIntFromToolArgOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("lift", (Supplier<BrushOperation>)LiftOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("density", (Supplier<BrushOperation>)SetDensity::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("set", (Supplier<BrushOperation>)SetOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("smooth", (Supplier<BrushOperation>)SmoothOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("shape", (Supplier<BrushOperation>)ShapeOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("offset", (Supplier<BrushOperation>)OffsetOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("layer", (Supplier<BrushOperation>)LayerOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("heightmaplayer", (Supplier<BrushOperation>)HeightmapLayerOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("melt", (Supplier<BrushOperation>)MeltOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("material", (Supplier<BrushOperation>)MaterialOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("delete", (Supplier<BrushOperation>)DeleteOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("disableonhold", (Supplier<BrushOperation>)DisableHoldInteractionOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("randomoffset", (Supplier<BrushOperation>)RandomOffsetOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("erode", (Supplier<BrushOperation>)ErodeOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("persistentdata", (Supplier<BrushOperation>)PersistentDataOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("pasteprefab", (Supplier<BrushOperation>)PastePrefabOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("echo", (Supplier<BrushOperation>)EchoOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("echoonce", (Supplier<BrushOperation>)EchoOnceOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("replace", (Supplier<BrushOperation>)ReplaceOperation::new);
        BrushOperation.BRUSH_OPERATION_REGISTRY.put("breakpoint", (Supplier<BrushOperation>)BreakpointOperation::new);
    }
}
