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

package com.hypixel.hytale.server.core.modules.collision;

import java.util.Arrays;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;

public class CollisionTracker extends BlockTracker
{
    @Nonnull
    protected BlockData[] blockData;
    @Nonnull
    protected BlockContactData[] contactData;
    
    public CollisionTracker() {
        this.blockData = new BlockData[4];
        this.contactData = new BlockContactData[4];
        for (int i = 0; i < 4; ++i) {
            this.blockData[i] = new BlockData();
            this.contactData[i] = new BlockContactData();
        }
    }
    
    public BlockData getBlockData(final int index) {
        return this.blockData[index];
    }
    
    public BlockContactData getContactData(final int index) {
        return this.contactData[index];
    }
    
    @Override
    public void reset() {
        super.reset();
        for (int i = 0; i < this.count; ++i) {
            this.blockData[i].clear();
            this.contactData[i].clear();
        }
    }
    
    public boolean track(final int x, final int y, final int z, @Nonnull final BlockContactData contactData, @Nonnull final BlockData blockData) {
        if (this.isTracked(x, y, z)) {
            return true;
        }
        this.trackNew(x, y, z, contactData, blockData);
        return false;
    }
    
    @Nonnull
    public BlockContactData trackNew(final int x, final int y, final int z, @Nonnull final BlockContactData contactData, @Nonnull final BlockData blockData) {
        super.trackNew(x, y, z);
        this.blockData[this.count - 1].assign(blockData);
        final BlockContactData data = this.contactData[this.count - 1];
        data.assign(contactData);
        return data;
    }
    
    @Override
    public void untrack(final int index) {
        super.untrack(index);
        if (this.count == 0) {
            this.blockData[0].clear();
            this.contactData[0].clear();
            return;
        }
        final int length = this.count - index;
        final BlockData block = this.blockData[index];
        block.clear();
        System.arraycopy(this.blockData, index + 1, this.blockData, index, length);
        this.blockData[this.count] = block;
        final BlockContactData coll = this.contactData[index];
        coll.clear();
        System.arraycopy(this.contactData, index + 1, this.contactData, index, length);
        this.contactData[this.count] = coll;
    }
    
    @Nullable
    public BlockContactData getContactData(final int x, final int y, final int z) {
        final int index = this.getIndex(x, y, z);
        if (index == -1) {
            return null;
        }
        return this.contactData[index];
    }
    
    @Override
    protected void alloc() {
        super.alloc();
        final int newLength = this.blockData.length + 4;
        this.blockData = Arrays.copyOf(this.blockData, newLength);
        this.contactData = Arrays.copyOf(this.contactData, newLength);
        for (int i = this.count; i < newLength; ++i) {
            this.blockData[i] = new BlockData();
            this.contactData[i] = new BlockContactData();
        }
    }
}
