package com.hypixel.hytale.builtin.hytalegenerator.assets.tintproviders; import com.hypixel.hytale.assetstore.AssetExtraInfo; import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec; import com.hypixel.hytale.assetstore.codec.ContainedAssetCodec; import com.hypixel.hytale.assetstore.map.DefaultAssetMap; import com.hypixel.hytale.assetstore.map.JsonAssetWithMap; import com.hypixel.hytale.builtin.hytalegenerator.LoggerUtil; import com.hypixel.hytale.builtin.hytalegenerator.assets.Cleanable; import com.hypixel.hytale.builtin.hytalegenerator.material.MaterialCache; import com.hypixel.hytale.builtin.hytalegenerator.referencebundle.ReferenceBundle; import com.hypixel.hytale.builtin.hytalegenerator.seed.SeedBox; import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer; import com.hypixel.hytale.builtin.hytalegenerator.tintproviders.TintProvider; import com.hypixel.hytale.codec.Codec; import com.hypixel.hytale.codec.KeyedCodec; import com.hypixel.hytale.codec.builder.BuilderCodec; import com.hypixel.hytale.codec.codecs.array.ArrayCodec; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nonnull; public abstract class TintProviderAsset implements Cleanable, JsonAssetWithMap> { public static final AssetCodecMapCodec CODEC = new AssetCodecMapCodec<>( Codec.STRING, (t, k) -> t.id = k, t -> t.id, (t, data) -> t.data = data, t -> t.data ); private static final Map exportedNodes = new ConcurrentHashMap<>(); public static final Codec CHILD_ASSET_CODEC = new ContainedAssetCodec<>(TintProviderAsset.class, CODEC); public static final Codec CHILD_ASSET_CODEC_ARRAY = new ArrayCodec<>(CHILD_ASSET_CODEC, String[]::new); public static final BuilderCodec ABSTRACT_CODEC = BuilderCodec.abstractBuilder(TintProviderAsset.class) .append(new KeyedCodec<>("Skip", Codec.BOOLEAN, false), (t, k) -> t.skip = k, t -> t.skip) .add() .append(new KeyedCodec<>("ExportAs", Codec.STRING, false), (t, k) -> t.exportName = k, t -> t.exportName) .add() .afterDecode(asset -> { if (asset.exportName != null && !asset.exportName.isEmpty()) { if (exportedNodes.containsKey(asset.exportName)) { LoggerUtil.getLogger().warning("Duplicate export name for asset: " + asset.exportName); } exportedNodes.put(asset.exportName, asset); LoggerUtil.getLogger().fine("Registered imported node asset with name '" + asset.exportName + "' with asset id '" + asset.id); } }) .build(); private String id; private AssetExtraInfo.Data data; private boolean skip = false; private String exportName = ""; protected TintProviderAsset() { } public abstract TintProvider build(@Nonnull TintProviderAsset.Argument var1); @Nonnull public static TintProviderAsset getFallbackAsset() { return new ConstantTintProviderAsset(); } public boolean isSkipped() { return this.skip; } public static TintProviderAsset getExportedAsset(@Nonnull String name) { return exportedNodes.get(name); } public String getId() { return this.id; } @Override public void cleanUp() { } public static class Argument { public SeedBox parentSeed; public MaterialCache materialCache; public ReferenceBundle referenceBundle; public WorkerIndexer workerIndexer; public Argument( @Nonnull SeedBox parentSeed, @Nonnull MaterialCache materialCache, @Nonnull ReferenceBundle referenceBundle, @Nonnull WorkerIndexer workerIndexer ) { this.parentSeed = parentSeed; this.materialCache = materialCache; this.referenceBundle = referenceBundle; this.workerIndexer = workerIndexer; } public Argument(@Nonnull TintProviderAsset.Argument argument) { this.parentSeed = argument.parentSeed; this.materialCache = argument.materialCache; this.referenceBundle = argument.referenceBundle; this.workerIndexer = argument.workerIndexer; } } }