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

package com.hypixel.hytale.builtin.model;

import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.component.query.Query;
import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
import com.hypixel.hytale.server.core.asset.type.model.config.Model;
import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.ArchetypeChunk;
import java.util.Map;
import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
import com.hypixel.hytale.server.core.command.system.AbstractCommand;
import com.hypixel.hytale.builtin.model.commands.ModelCommand;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class ModelPlugin extends JavaPlugin
{
    public ModelPlugin(@Nonnull final JavaPluginInit init) {
        super(init);
    }
    
    @Override
    protected void setup() {
        this.getCommandRegistry().registerCommand(new ModelCommand());
        this.getEventRegistry().register(LoadedAssetsEvent.class, ModelAsset.class, this::updateModelAssets);
    }
    
    private void checkForModelUpdate(@Nonnull final Map<String, ModelAsset> reloadedModelAssets, final int index, @Nonnull final ArchetypeChunk<EntityStore> archetypeChunk, @Nonnull final CommandBuffer<EntityStore> commandBuffer) {
        final ModelComponent modelComponent = archetypeChunk.getComponent(index, ModelComponent.getComponentType());
        final Model oldModel = modelComponent.getModel();
        final ModelAsset newModel = reloadedModelAssets.get(oldModel.getModelAssetId());
        if (newModel != null) {
            final Model model = Model.createScaledModel(newModel, oldModel.getScale(), oldModel.getRandomAttachmentIds());
            commandBuffer.putComponent(archetypeChunk.getReferenceTo(index), ModelComponent.getComponentType(), new ModelComponent(model));
        }
    }
    
    private void updateModelAssets(@Nonnull final LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> event) {
        final Map<String, ModelAsset> map = event.getLoadedAssets();
        Universe.get().getWorlds().forEach((name, world) -> world.execute(() -> world.getEntityStore().getStore().forEachEntityParallel(ModelComponent.getComponentType(), (index, archetypeChunk, commandBuffer) -> this.checkForModelUpdate(map, index, archetypeChunk, commandBuffer))));
    }
}
