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

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

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 PositionProbeWater extends PositionProbeBase
{
    private double ySwim;
    
    public boolean probePosition(@Nonnull final Ref<EntityStore> ref, @Nonnull final Box boundingBox, @Nonnull final Vector3d position, @Nonnull final CollisionResult collisionResult, final double swimDepth, @Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        this.ySwim = position.y + swimDepth + 1.0E-6;
        return super.probePosition(ref, boundingBox, position, collisionResult, this, PositionProbeWater::blockTest, 6, componentAccessor);
    }
    
    private boolean blockTest(final int code, @Nonnull final BoxBlockIntersectionEvaluator boxBlockIntersection, @Nonnull final CollisionConfig config) {
        final boolean solid = (config.blockMaterialMask & 0x4) != 0x0;
        final boolean fluid = (config.blockMaterialMask & 0x2) != 0x0;
        final boolean submerged = (config.blockMaterialMask & 0x8) != 0x0;
        if (solid && CollisionMath.isTouching(code)) {
            final boolean isOnGround = boxBlockIntersection.isOnGround();
            this.onGround |= isOnGround;
            this.touchCeil |= boxBlockIntersection.touchesCeil();
            if (isOnGround && config.blockY > this.groundLevel) {
                this.groundLevel = config.blockY;
            }
        }
        if ((fluid && CollisionMath.isOverlapping(code)) || submerged) {
            final double yTop = config.blockY + 1;
            this.inWater |= (yTop >= this.ySwim);
            return false;
        }
        return solid;
    }
    
    @Override
    protected void reset() {
        super.reset();
        this.inWater = false;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "PositionProbeWater{ySwim=" + this.ySwim + "} " + super.toString();
    }
}
