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

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

import com.hypixel.hytale.server.npc.components.messaging.NPCBlockEventSupport;
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.PlayerBlockEventSupport;
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.block.BlockEventType;
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.BuilderSensorBlockChange;

public class SensorBlockChange extends SensorEvent
{
    public SensorBlockChange(@Nonnull final BuilderSensorBlockChange builder, @Nonnull final BuilderSupport support) {
        super(builder, support);
        final BlockEventType type = builder.getEventType(support);
        final int blockSet = builder.getBlockSet(support);
        switch (this.searchType) {
            case PlayerFirst:
            case NpcFirst: {
                this.playerEventMessageSlot = support.getBlockEventSlot(type, blockSet, this.range, true);
                this.npcEventMessageSlot = support.getBlockEventSlot(type, blockSet, this.range, false);
                break;
            }
            case PlayerOnly: {
                this.playerEventMessageSlot = support.getBlockEventSlot(type, blockSet, this.range, true);
                this.npcEventMessageSlot = -1;
                break;
            }
            case NpcOnly: {
                this.playerEventMessageSlot = -1;
                this.npcEventMessageSlot = support.getBlockEventSlot(type, blockSet, 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 PlayerBlockEventSupport blockEventSupportComponent = store.getComponent(parent, PlayerBlockEventSupport.getComponentType());
        assert blockEventSupportComponent != null;
        final TransformComponent transformComponent = store.getComponent(parent, SensorBlockChange.TRANSFORM_COMPONENT_TYPE);
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        if (!blockEventSupportComponent.hasMatchingMessage(this.playerEventMessageSlot, position, this.range)) {
            return null;
        }
        return blockEventSupportComponent.pollMessage(this.playerEventMessageSlot);
    }
    
    @Nullable
    @Override
    protected Ref<EntityStore> getNpcTarget(@Nonnull final Ref<EntityStore> parent, @Nonnull final Store<EntityStore> store) {
        final NPCBlockEventSupport blockEventSupportComponent = store.getComponent(parent, NPCBlockEventSupport.getComponentType());
        assert blockEventSupportComponent != null;
        final TransformComponent transformComponent = store.getComponent(parent, SensorBlockChange.TRANSFORM_COMPONENT_TYPE);
        assert transformComponent != null;
        final Vector3d position = transformComponent.getPosition();
        if (!blockEventSupportComponent.hasMatchingMessage(this.npcEventMessageSlot, position, this.range)) {
            return null;
        }
        return blockEventSupportComponent.pollMessage(this.npcEventMessageSlot);
    }
}
