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

package com.hypixel.hytale.builtin.mounts.interactions;

import com.hypixel.hytale.codec.validation.Validator;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.codecs.EnumCodec;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.server.core.codec.ProtocolCodecs;
import com.hypixel.hytale.component.CommandBuffer;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.builtin.mounts.MountedByComponent;
import com.hypixel.hytale.builtin.mounts.MountedComponent;
import com.hypixel.hytale.protocol.InteractionState;
import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
import com.hypixel.hytale.server.core.entity.InteractionContext;
import javax.annotation.Nonnull;
import com.hypixel.hytale.protocol.InteractionType;
import com.hypixel.hytale.protocol.MountController;
import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.SimpleInstantInteraction;

public class MountInteraction extends SimpleInstantInteraction
{
    public static final BuilderCodec<MountInteraction> CODEC;
    private Vector3f attachmentOffset;
    private MountController controller;
    
    public MountInteraction() {
        this.attachmentOffset = new Vector3f(0.0f, 0.0f, 0.0f);
    }
    
    @Override
    protected void firstRun(@Nonnull final InteractionType type, @Nonnull final InteractionContext context, @Nonnull final CooldownHandler cooldownHandler) {
        final Ref<EntityStore> target = context.getTargetEntity();
        if (target == null) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        final Ref<EntityStore> self = context.getEntity();
        final CommandBuffer<EntityStore> commandBuffer = context.getCommandBuffer();
        final MountedComponent mounted = commandBuffer.getComponent(self, MountedComponent.getComponentType());
        if (mounted != null) {
            commandBuffer.removeComponent(self, MountedComponent.getComponentType());
            context.getState().state = InteractionState.Failed;
            return;
        }
        final MountedByComponent mountedBy = commandBuffer.getComponent(target, MountedByComponent.getComponentType());
        if (mountedBy != null && !mountedBy.getPassengers().isEmpty()) {
            context.getState().state = InteractionState.Failed;
            return;
        }
        commandBuffer.addComponent(self, MountedComponent.getComponentType(), new MountedComponent(target, this.attachmentOffset, this.controller));
    }
    
    static {
        CODEC = BuilderCodec.builder(MountInteraction.class, MountInteraction::new, SimpleInstantInteraction.CODEC).appendInherited(new KeyedCodec<com.hypixel.hytale.protocol.Vector3f>("AttachmentOffset", ProtocolCodecs.VECTOR3F), (o, v) -> o.attachmentOffset.assign(v.x, v.y, v.z), o -> new com.hypixel.hytale.protocol.Vector3f(o.attachmentOffset.x, o.attachmentOffset.y, o.attachmentOffset.z), (o, p) -> o.attachmentOffset = p.attachmentOffset).add().appendInherited(new KeyedCodec("Controller", new EnumCodec(MountController.class)), (o, v) -> o.controller = v, o -> o.controller, (o, p) -> o.controller = p.controller).addValidator(Validators.nonNull()).add().build();
    }
}
