BloodMagic/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java

129 lines
7.4 KiB
Java
Raw Normal View History

2015-12-30 23:00:49 -05:00
package WayofTime.bloodmagic.tile;
import WayofTime.bloodmagic.util.Constants;
import WayofTime.bloodmagic.event.TeleposeEvent;
import WayofTime.bloodmagic.teleport.TeleportQueue;
import WayofTime.bloodmagic.util.helper.NBTHelper;
import WayofTime.bloodmagic.util.helper.NetworkHelper;
import WayofTime.bloodmagic.util.helper.PlayerHelper;
import WayofTime.bloodmagic.block.BlockTeleposer;
import WayofTime.bloodmagic.item.ItemTelepositionFocus;
import WayofTime.bloodmagic.ritual.portal.Teleports;
import WayofTime.bloodmagic.util.Utils;
import com.google.common.base.Strings;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import java.util.List;
2016-01-01 12:08:17 -05:00
2017-08-15 21:30:48 -07:00
public class TileTeleposer extends TileInventory implements ITickable {
2016-01-01 12:08:17 -05:00
//TODO FUTURE: Make AreaDescriptor for Teleposer perhaps?
public static final String TELEPOSER_RANGE = "teleposerRange";
private int previousInput;
2017-08-15 21:30:48 -07:00
public TileTeleposer() {
2016-01-01 12:08:17 -05:00
super(1, "teleposer");
}
@Override
2017-08-15 21:30:48 -07:00
public void deserialize(NBTTagCompound tagCompound) {
super.deserialize(tagCompound);
2016-01-01 12:08:17 -05:00
previousInput = tagCompound.getInteger(Constants.NBT.PREVIOUS_INPUT);
}
@Override
2017-08-15 21:30:48 -07:00
public NBTTagCompound serialize(NBTTagCompound tagCompound) {
super.serialize(tagCompound);
2016-01-01 12:08:17 -05:00
tagCompound.setInteger(Constants.NBT.PREVIOUS_INPUT, previousInput);
return tagCompound;
2016-01-01 12:08:17 -05:00
}
@Override
2017-08-15 21:30:48 -07:00
public void update() {
if (!getWorld().isRemote) {
2016-12-12 19:56:36 -08:00
int currentInput = getWorld().getStrongPower(pos);
2016-01-01 12:08:17 -05:00
2017-08-15 21:30:48 -07:00
if (previousInput == 0 && currentInput != 0) {
2016-01-01 12:08:17 -05:00
initiateTeleport();
}
previousInput = currentInput;
}
}
2017-08-15 21:30:48 -07:00
public void initiateTeleport() {
if (!getWorld().isRemote && canInitiateTeleport(this) && getBlockType() instanceof BlockTeleposer) {
2016-12-12 19:56:36 -08:00
ItemStack focusStack = NBTHelper.checkNBT(getStackInSlot(0));
ItemTelepositionFocus focus = (ItemTelepositionFocus) focusStack.getItem();
2016-12-12 19:56:36 -08:00
BlockPos focusPos = focus.getBlockPos(getStackInSlot(0));
World focusWorld = focus.getWorld(getStackInSlot(0));
2016-01-01 12:08:17 -05:00
2017-08-15 21:30:48 -07:00
if (focusWorld != null && focusWorld.getTileEntity(focusPos) instanceof TileTeleposer && !focusWorld.getTileEntity(focusPos).equals(this)) {
2016-12-12 19:56:36 -08:00
final int focusLevel = (getStackInSlot(0).getItemDamage() + 1);
2016-01-01 12:08:17 -05:00
final int lpToBeDrained = (int) (0.5F * Math.sqrt((pos.getX() - focusPos.getX()) * (pos.getX() - focusPos.getX()) + (pos.getY() - focusPos.getY() + 1) * (pos.getY() - focusPos.getY() + 1) + (pos.getZ() - focusPos.getZ()) * (pos.getZ() - focusPos.getZ())));
2017-08-15 21:30:48 -07:00
if (NetworkHelper.getSoulNetwork(focus.getOwnerUUID(focusStack)).syphonAndDamage(PlayerHelper.getPlayerFromUUID(focus.getOwnerUUID(focusStack)), lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1))) {
2016-01-01 12:08:17 -05:00
int blocksTransported = 0;
2017-08-15 21:30:48 -07:00
for (int i = -(focusLevel - 1); i <= (focusLevel - 1); i++) {
for (int j = 0; j <= (focusLevel * 2 - 2); j++) {
for (int k = -(focusLevel - 1); k <= (focusLevel - 1); k++) {
2016-12-12 19:56:36 -08:00
TeleposeEvent event = new TeleposeEvent(getWorld(), pos.add(i, 1 + j, k), focusWorld, focusPos.add(i, 1 + j, k));
2017-08-15 21:30:48 -07:00
if (Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos) && !MinecraftForge.EVENT_BUS.post(event)) {
2016-01-01 12:08:17 -05:00
blocksTransported++;
}
}
}
}
NetworkHelper.syphonFromContainer(focusStack, lpToBeDrained * blocksTransported);
List<Entity> originalWorldEntities;
List<Entity> focusWorldEntities;
AxisAlignedBB originalArea = new AxisAlignedBB(pos.getX(), pos.getY() + 1, pos.getZ(), pos.getX() + 1, Math.min(focusWorld.getHeight(), pos.getY() + 2 * focusLevel), pos.getZ() + 1).expand(focusLevel - 1, 0, focusLevel - 1);
2016-12-12 19:56:36 -08:00
originalWorldEntities = getWorld().getEntitiesWithinAABB(Entity.class, originalArea);
AxisAlignedBB focusArea = new AxisAlignedBB(focusPos.getX(), focusPos.getY() + 1, focusPos.getZ(), focusPos.getX() + 1, Math.min(focusWorld.getHeight(), focusPos.getY() + 2 * focusLevel), focusPos.getZ() + 1).expand(focusLevel - 1, 0, focusLevel - 1);
focusWorldEntities = focusWorld.getEntitiesWithinAABB(Entity.class, focusArea);
2016-01-01 12:08:17 -05:00
2017-08-15 21:30:48 -07:00
if (focusWorld.equals(getWorld())) {
if (!originalWorldEntities.isEmpty()) {
for (Entity entity : originalWorldEntities) {
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true));
2016-01-01 12:08:17 -05:00
}
}
2017-08-15 21:30:48 -07:00
if (!focusWorldEntities.isEmpty()) {
for (Entity entity : focusWorldEntities) {
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), true));
2016-01-01 12:08:17 -05:00
}
}
2017-08-15 21:30:48 -07:00
} else {
if (!originalWorldEntities.isEmpty()) {
for (Entity entity : originalWorldEntities) {
2016-12-12 19:56:36 -08:00
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), getWorld(), focusWorld.provider.getDimension(), true));
2016-01-01 12:08:17 -05:00
}
}
2017-08-15 21:30:48 -07:00
if (!focusWorldEntities.isEmpty()) {
for (Entity entity : focusWorldEntities) {
2016-12-12 19:56:36 -08:00
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, focusStack.getTagCompound().getString(Constants.NBT.OWNER_UUID), focusWorld, getWorld().provider.getDimension(), true));
2016-01-01 12:08:17 -05:00
}
}
}
}
}
}
}
2017-08-15 21:30:48 -07:00
private boolean canInitiateTeleport(TileTeleposer teleposer) {
2016-12-12 19:56:36 -08:00
return !teleposer.getStackInSlot(0).isEmpty() && teleposer.getStackInSlot(0).getItem() instanceof ItemTelepositionFocus && !Strings.isNullOrEmpty(((ItemTelepositionFocus) teleposer.getStackInSlot(0).getItem()).getOwnerName(teleposer.getStackInSlot(0)));
2016-01-01 12:08:17 -05:00
}
2015-12-30 23:00:49 -05:00
}