153 lines
4.6 KiB
Java
153 lines
4.6 KiB
Java
package WayofTime.bloodmagic.alchemyArray;
|
|
|
|
import java.util.Random;
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import WayofTime.bloodmagic.event.TeleposeEvent;
|
|
import WayofTime.bloodmagic.tile.TileAlchemyArray;
|
|
import WayofTime.bloodmagic.util.Constants;
|
|
import WayofTime.bloodmagic.util.Utils;
|
|
|
|
public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect
|
|
{
|
|
public static final int TELEPOSE_DELAY = 4;
|
|
|
|
private BlockPos currentPos = BlockPos.ORIGIN;
|
|
|
|
private int radius = -1;
|
|
private int teleportHeightOffset = 5;
|
|
|
|
public AlchemyArrayEffectLaputa(String key)
|
|
{
|
|
super(key);
|
|
}
|
|
|
|
@Override
|
|
public boolean update(TileEntity tile, int ticksActive)
|
|
{
|
|
if (ticksActive >= 100)
|
|
{
|
|
World world = tile.getWorld();
|
|
|
|
if (radius == -1)
|
|
{
|
|
((TileAlchemyArray) tile).setItemDrop(false);
|
|
radius = getRandomRadius(world.rand);
|
|
teleportHeightOffset = getRandomHeightOffset(world.rand);
|
|
currentPos = new BlockPos(-radius, -radius, -radius);
|
|
}
|
|
|
|
BlockPos pos = tile.getPos();
|
|
if (world.isRemote)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
int j = -radius;
|
|
int i = -radius;
|
|
int k = -radius;
|
|
|
|
if (currentPos != null)
|
|
{
|
|
j = currentPos.getY();
|
|
i = currentPos.getX();
|
|
k = currentPos.getZ();
|
|
}
|
|
int checks = 0;
|
|
int maxChecks = 100;
|
|
|
|
while (j <= radius)
|
|
{
|
|
while (i <= radius)
|
|
{
|
|
while (k <= radius)
|
|
{
|
|
if (i == 0 && j == 0 && k == 0)
|
|
{
|
|
k++;
|
|
continue;
|
|
}
|
|
|
|
checks++;
|
|
if (checks >= maxChecks)
|
|
{
|
|
this.currentPos = new BlockPos(i, j, k);
|
|
return false;
|
|
}
|
|
|
|
if (checkIfSphere(radius, i, j, k))
|
|
{
|
|
BlockPos newPos = pos.add(i, j, k);
|
|
BlockPos offsetPos = newPos.up(teleportHeightOffset);
|
|
|
|
TeleposeEvent event = new TeleposeEvent(world, newPos, world, offsetPos);
|
|
if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event))
|
|
{
|
|
k++;
|
|
this.currentPos = new BlockPos(i, j, k);
|
|
|
|
return false;
|
|
}
|
|
}
|
|
k++;
|
|
}
|
|
i++;
|
|
k = -radius;
|
|
}
|
|
j++;
|
|
i = -radius;
|
|
this.currentPos = new BlockPos(i, j, k);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public boolean checkIfSphere(float radius, float xOff, float yOff, float zOff)
|
|
{
|
|
float possOffset = 0.5f;
|
|
return xOff * xOff + yOff * yOff + zOff * zOff <= ((radius + possOffset) * (radius + possOffset));
|
|
}
|
|
|
|
public int getRandomRadius(Random rand)
|
|
{
|
|
return rand.nextInt(4) + 4;
|
|
}
|
|
|
|
public int getRandomHeightOffset(Random rand)
|
|
{
|
|
return radius * 2 + 1 + rand.nextInt(5);
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound tag)
|
|
{
|
|
tag.setInteger("radius", radius);
|
|
tag.setInteger("teleportHeightOffset", teleportHeightOffset);
|
|
tag.setInteger(Constants.NBT.X_COORD, currentPos.getX());
|
|
tag.setInteger(Constants.NBT.Y_COORD, currentPos.getY());
|
|
tag.setInteger(Constants.NBT.Z_COORD, currentPos.getZ());
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound tag)
|
|
{
|
|
radius = tag.getInteger("radius");
|
|
teleportHeightOffset = tag.getInteger("teleportHeightOffset");
|
|
currentPos = new BlockPos(tag.getInteger(Constants.NBT.X_COORD), tag.getInteger(Constants.NBT.Y_COORD), tag.getInteger(Constants.NBT.Z_COORD));
|
|
}
|
|
|
|
@Override
|
|
public AlchemyArrayEffect getNewCopy()
|
|
{
|
|
return new AlchemyArrayEffectLaputa(key);
|
|
}
|
|
}
|