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

package com.hypixel.hytale.server.npc.util;

import com.hypixel.hytale.protocol.BlockMaterial;
import com.hypixel.hytale.server.core.modules.collision.CollisionMath;
import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
import com.hypixel.hytale.server.core.modules.collision.BoxBlockIntersectionEvaluator;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.modules.collision.CollisionResult;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.shape.Box;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;

public class PositionProbeAir extends PositionProbeBase
{
    protected boolean inAir;
    protected boolean onSolid;
    protected boolean collideWithFluid;
    
    public boolean probePosition(@Nonnull final Ref<EntityStore> ref, @Nonnull final Box boundingBox, @Nonnull final Vector3d position, @Nonnull final CollisionResult collisionResult, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        this.collideWithFluid = ((collisionResult.getConfig().getCollisionByMaterial() & 0x2) != 0x0);
        return this.inAir = super.probePosition(ref, boundingBox, position, collisionResult, this, PositionProbeAir::blockTest, 6, componentAccessor);
    }
    
    private boolean blockTest(final int code, @Nonnull final BoxBlockIntersectionEvaluator boxBlockIntersection, @Nonnull final CollisionConfig config) {
        if (CollisionMath.isTouching(code)) {
            if (config.blockMaterial == BlockMaterial.Solid) {
                final boolean isOnGround = boxBlockIntersection.isOnGround();
                this.onGround |= isOnGround;
                this.touchCeil |= boxBlockIntersection.touchesCeil();
                this.onSolid |= isOnGround;
                if (isOnGround && config.blockY > this.groundLevel) {
                    this.groundLevel = config.blockY;
                }
            }
            return false;
        }
        if (CollisionMath.isOverlapping(code) && (config.blockMaterialMask & 0x2) != 0x0) {
            this.inWater = true;
            return this.collideWithFluid;
        }
        return true;
    }
    
    public boolean isInAir() {
        return this.inAir;
    }
    
    public boolean isOnSolid() {
        return this.onSolid;
    }
    
    @Override
    protected void reset() {
        super.reset();
        this.inAir = false;
        this.onSolid = false;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "PositionProbeAir{inAir=" + this.inAir + ", onSolid=" + this.onSolid + "} " + super.toString();
    }
}
