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

package com.hypixel.hytale.math.shape;

import javax.annotation.Nonnull;
import com.hypixel.hytale.function.predicate.TriIntObjPredicate;
import com.hypixel.hytale.function.predicate.TriIntPredicate;
import com.hypixel.hytale.math.vector.Vector3d;

public class OriginShape<S extends Shape> implements Shape
{
    public final Vector3d origin;
    public S shape;
    
    public OriginShape() {
        this.origin = new Vector3d();
    }
    
    public OriginShape(final Vector3d origin, final S shape) {
        this.origin = origin;
        this.shape = shape;
    }
    
    public Vector3d getOrigin() {
        return this.origin;
    }
    
    public S getShape() {
        return this.shape;
    }
    
    @Override
    public Box getBox(final double x, final double y, final double z) {
        return this.shape.getBox(x + this.origin.getX(), y + this.origin.getY(), z + this.origin.getZ());
    }
    
    @Override
    public boolean containsPosition(final double x, final double y, final double z) {
        return this.shape.containsPosition(x - this.origin.getX(), y - this.origin.getY(), z - this.origin.getZ());
    }
    
    @Override
    public void expand(final double radius) {
        this.shape.expand(radius);
    }
    
    @Override
    public boolean forEachBlock(final double x, final double y, final double z, final double epsilon, final TriIntPredicate consumer) {
        return this.shape.forEachBlock(x + this.origin.getX(), y + this.origin.getY(), z + this.origin.getZ(), epsilon, consumer);
    }
    
    @Override
    public <T> boolean forEachBlock(final double x, final double y, final double z, final double epsilon, final T t, final TriIntObjPredicate<T> consumer) {
        return this.shape.forEachBlock(x + this.origin.getX(), y + this.origin.getY(), z + this.origin.getZ(), epsilon, t, consumer);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "OriginShape{origin=" + String.valueOf(this.origin) + ", shape=" + String.valueOf(this.shape);
    }
}
