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

package com.hypixel.hytale.server.npc.components.messaging;

import com.hypixel.hytale.server.npc.blackboard.view.event.EventNotification;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.flock.FlockMembership;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.npc.blackboard.view.event.EntityEventNotification;
import com.hypixel.hytale.server.npc.blackboard.view.event.entity.EntityEventType;

public abstract class EntityEventSupport extends EventSupport<EntityEventType, EntityEventNotification>
{
    @Override
    public void postMessage(final EntityEventType type, @Nonnull final EntityEventNotification notification, @Nonnull final Ref<EntityStore> parent, @Nonnull final Store<EntityStore> store) {
        final EventMessage slot = this.getMessageSlot(type, notification);
        if (slot == null || !slot.isEnabled()) {
            return;
        }
        final Vector3d parentEntityPosition = store.getComponent(parent, TransformComponent.getComponentType()).getPosition();
        final Vector3d pos = notification.getPosition();
        final double x = pos.getX();
        final double y = pos.getY();
        final double z = pos.getZ();
        final double distanceSquared = parentEntityPosition.distanceSquaredTo(x, y, z);
        if (distanceSquared > slot.getMaxRangeSquared()) {
            return;
        }
        final FlockMembership flockMembership = store.getComponent(parent, FlockMembership.getComponentType());
        final Ref<EntityStore> flockReference = (flockMembership != null) ? flockMembership.getFlockRef() : null;
        final boolean isSameFlock = flockReference != null && flockReference.equals(notification.getFlockReference());
        if (!slot.isActivated() || distanceSquared < slot.getPosition().distanceSquaredTo(parentEntityPosition) || (!slot.isSameFlock() && isSameFlock)) {
            slot.activate(x, y, z, notification.getInitiator(), 2.0);
            slot.setSameFlock(isSameFlock);
        }
    }
    
    public boolean hasFlockMatchingMessage(final int messageIndex, @Nonnull final Vector3d parentPosition, final double range, final boolean flockOnly) {
        if (!this.isMessageQueued(messageIndex)) {
            return false;
        }
        final EventMessage event = this.messageSlots[messageIndex];
        return (!flockOnly || event.isSameFlock()) && event.getPosition().distanceSquaredTo(parentPosition) < range * range;
    }
}
