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

package com.hypixel.hytale.server.npc.corecomponents.world;

import javax.annotation.Nullable;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.server.npc.components.messaging.PlayerEntityEventSupport;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.npc.blackboard.view.event.entity.EntityEventType;
import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorEvent;
import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorEntityEvent;

public class SensorEntityEvent extends SensorEvent
{
    private final boolean flockOnly;
    
    public SensorEntityEvent(@Nonnull final BuilderSensorEntityEvent builder, @Nonnull final BuilderSupport support) {
        super(builder, support);
        this.flockOnly = builder.isFlockOnly(support);
        final EntityEventType type = builder.getEventType(support);
        final int npcGroup = builder.getNPCGroup(support);
        switch (this.searchType) {
            case PlayerFirst:
            case NpcFirst: {
                this.playerEventMessageSlot = support.getEntityEventSlot(type, npcGroup, this.range, true);
                this.npcEventMessageSlot = support.getEntityEventSlot(type, npcGroup, this.range, false);
                break;
            }
            case PlayerOnly: {
                this.playerEventMessageSlot = support.getEntityEventSlot(type, npcGroup, this.range, true);
                this.npcEventMessageSlot = -1;
                break;
            }
            case NpcOnly: {
                this.playerEventMessageSlot = -1;
                this.npcEventMessageSlot = support.getEntityEventSlot(type, npcGroup, this.range, false);
                break;
            }
            default: {
                this.playerEventMessageSlot = -1;
                this.npcEventMessageSlot = -1;
                break;
            }
        }
    }
    
    @Nullable
    @Override
    protected Ref<EntityStore> getPlayerTarget(@Nonnull final Ref<EntityStore> parent, @Nonnull final Store<EntityStore> store) {
        final PlayerEntityEventSupport entityEventSupportComponent = store.getComponent(parent, PlayerEntityEventSupport.getComponentType());
        assert entityEventSupportComponent != null;
        final TransformComponent transformComponent = store.getComponent(parent, SensorEntityEvent.TRANSFORM_COMPONENT_TYPE);
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        if (!entityEventSupportComponent.hasFlockMatchingMessage(this.playerEventMessageSlot, position, this.range, this.flockOnly)) {
            return null;
        }
        return entityEventSupportComponent.pollMessage(this.playerEventMessageSlot);
    }
    
    @Nullable
    @Override
    protected Ref<EntityStore> getNpcTarget(@Nonnull final Ref<EntityStore> parent, @Nonnull final Store<EntityStore> store) {
        final PlayerEntityEventSupport entityEventSupportComponent = store.getComponent(parent, PlayerEntityEventSupport.getComponentType());
        assert entityEventSupportComponent != null;
        final TransformComponent transformComponent = store.getComponent(parent, SensorEntityEvent.TRANSFORM_COMPONENT_TYPE);
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        if (!entityEventSupportComponent.hasFlockMatchingMessage(this.npcEventMessageSlot, position, this.range, this.flockOnly)) {
            return null;
        }
        return entityEventSupportComponent.pollMessage(this.npcEventMessageSlot);
    }
}
