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

package com.hypixel.hytale.builtin.adventure.npcobjectives.task;

import com.hypixel.hytale.builtin.adventure.objectives.config.task.ObjectiveTaskAsset;
import com.hypixel.hytale.server.core.entity.Entity;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.entity.EntityUtils;
import com.hypixel.hytale.builtin.tagset.TagSetPlugin;
import com.hypixel.hytale.builtin.tagset.config.NPCGroup;
import com.hypixel.hytale.server.core.modules.entity.damage.Damage;
import com.hypixel.hytale.server.npc.entities.NPCEntity;
import com.hypixel.hytale.builtin.adventure.objectives.Objective;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.builtin.adventure.objectives.config.task.CountObjectiveTaskAsset;
import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillObjectiveTaskAsset;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.builtin.adventure.objectives.task.CountObjectiveTask;

public abstract class KillObjectiveTask extends CountObjectiveTask implements KillTask
{
    public static final BuilderCodec<KillObjectiveTask> CODEC;
    
    public KillObjectiveTask(@Nonnull final KillObjectiveTaskAsset asset, final int taskSetIndex, final int taskIndex) {
        super(asset, taskSetIndex, taskIndex);
    }
    
    protected KillObjectiveTask() {
    }
    
    @Nonnull
    @Override
    public KillObjectiveTaskAsset getAsset() {
        return (KillObjectiveTaskAsset)super.getAsset();
    }
    
    @Override
    public void checkKilledEntity(@Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> npcRef, @Nonnull final Objective objective, @Nonnull final NPCEntity npc, @Nonnull final Damage info) {
        final String key = this.getAsset().getNpcGroupId();
        final int index = NPCGroup.getAssetMap().getIndex(key);
        if (index == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown npc group! " + key);
        }
        if (!TagSetPlugin.get(NPCGroup.class).tagInSet(index, npc.getNPCTypeIndex())) {
            return;
        }
        if (!(info.getSource() instanceof Damage.EntitySource)) {
            return;
        }
        final Ref<EntityStore> attackerEntityRef = ((Damage.EntitySource)info.getSource()).getRef();
        final Entity attackerEntity = EntityUtils.getEntity(attackerEntityRef, attackerEntityRef.getStore());
        if (!(attackerEntity instanceof Player)) {
            return;
        }
        final UUIDComponent attackerUuidComponent = store.getComponent(attackerEntityRef, UUIDComponent.getComponentType());
        assert attackerUuidComponent != null;
        if (!objective.getActivePlayerUUIDs().contains(attackerUuidComponent.getUuid())) {
            return;
        }
        this.increaseTaskCompletion(store, npcRef, 1, objective);
    }
    
    static {
        CODEC = BuilderCodec.abstractBuilder(KillObjectiveTask.class, CountObjectiveTask.CODEC).build();
    }
}
