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

package com.hypixel.hytale.server.core.universe.world.connectedblocks;

import com.hypixel.hytale.server.core.modules.interaction.InteractionModule;
import com.hypixel.hytale.server.core.modules.entity.EntityModule;
import java.util.Iterator;
import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
import com.hypixel.hytale.server.core.universe.world.connectedblocks.builtin.RoofConnectedBlockRuleSet;
import com.hypixel.hytale.server.core.universe.world.connectedblocks.builtin.StairConnectedBlockRuleSet;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
import com.hypixel.hytale.assetstore.AssetRegistry;
import com.hypixel.hytale.assetstore.codec.AssetCodec;
import java.util.function.Function;
import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.common.plugin.PluginManifest;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class ConnectedBlocksModule extends JavaPlugin
{
    public static final PluginManifest MANIFEST;
    private static ConnectedBlocksModule instance;
    
    public static ConnectedBlocksModule get() {
        return ConnectedBlocksModule.instance;
    }
    
    public ConnectedBlocksModule(@Nonnull final JavaPluginInit init) {
        super(init);
        ConnectedBlocksModule.instance = this;
    }
    
    @Override
    protected void setup() {
        AssetRegistry.register(((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(CustomConnectedBlockTemplateAsset.class, new DefaultAssetMap()).setPath()).setKeyFunction(CustomConnectedBlockTemplateAsset::getId)).setCodec(CustomConnectedBlockTemplateAsset.CODEC)).build());
        this.getEventRegistry().register(LoadedAssetsEvent.class, BlockType.class, ConnectedBlocksModule::onBlockTypesChanged);
        CustomTemplateConnectedBlockPattern.CODEC.register("Custom", CustomConnectedBlockPattern.class, CustomConnectedBlockPattern.CODEC);
        ConnectedBlockRuleSet.CODEC.register("CustomTemplate", CustomTemplateConnectedBlockRuleSet.class, CustomTemplateConnectedBlockRuleSet.CODEC);
        ConnectedBlockRuleSet.CODEC.register("Stair", StairConnectedBlockRuleSet.class, StairConnectedBlockRuleSet.CODEC);
        ConnectedBlockRuleSet.CODEC.register("Roof", RoofConnectedBlockRuleSet.class, RoofConnectedBlockRuleSet.CODEC);
    }
    
    private static void onBlockTypesChanged(@Nonnull final LoadedAssetsEvent<String, BlockType, BlockTypeAssetMap<String, BlockType>> event) {
        for (final BlockType blockType : event.getLoadedAssets().values()) {
            final ConnectedBlockRuleSet ruleSet = blockType.getConnectedBlockRuleSet();
            if (ruleSet != null) {
                ruleSet.updateCachedBlockTypes(blockType, event.getAssetMap());
            }
        }
    }
    
    static {
        MANIFEST = PluginManifest.corePlugin(ConnectedBlocksModule.class).depends(EntityModule.class).depends(InteractionModule.class).build();
    }
}
