diff --git a/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoor.java b/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoor.java index 4094c399..05352626 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoor.java +++ b/src/main/java/org/dimdev/dimdoors/shared/blocks/BlockDimensionalDoor.java @@ -6,8 +6,10 @@ import net.minecraft.block.material.EnumPushReaction; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -15,6 +17,8 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; import org.dimdev.ddutils.Location; import org.dimdev.dimdoors.DimDoors; import org.dimdev.dimdoors.shared.rifts.registry.RiftRegistry; @@ -135,10 +139,8 @@ public abstract class BlockDimensionalDoor extends BlockDoor implements IRiftPro DimDoors.log.error("Rift tile entity was null when breaking block at " + new Location(world, pos) + ", please report this error."); } if (rift.isPlaceRiftOnBreak() || rift.isRegistered() && RiftRegistry.instance().getSources(new Location(rift.getWorld(), rift.getPos())).size() > 0 && !rift.isAlwaysDelete()) { - IBlockState oldState = world.getBlockState(rift.getPos()); - world.setBlockState(rift.getPos(), ModBlocks.RIFT.getDefaultState(), 2); - //world.notifyBlockUpdate(rift.getPos(), oldState, ModBlocks.RIFT.getDefaultState(), 3); - world.markBlockRangeForRenderUpdate(rift.getPos(), rift.getPos()); + world.setBlockState(pos, ModBlocks.RIFT.getDefaultState()); + // This isn't run when we change the block from within block break TileEntityFloatingRift newRift = (TileEntityFloatingRift) world.getTileEntity(pos); newRift.copyFrom(rift); newRift.updateType(); diff --git a/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java b/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java index 5f5be3f6..b759543c 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/rifts/TileEntityRift.java @@ -1,15 +1,12 @@ package org.dimdev.dimdoors.shared.rifts; import lombok.Getter; -import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ITickable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -19,8 +16,6 @@ import org.dimdev.ddutils.*; import org.dimdev.ddutils.nbt.NBTUtils; import org.dimdev.dimdoors.DimDoors; import org.dimdev.pocketlib.VirtualLocation; -import org.dimdev.dimdoors.shared.blocks.BlockDimensionalDoor; -import org.dimdev.dimdoors.shared.blocks.BlockFloatingRift; import org.dimdev.dimdoors.shared.rifts.registry.LinkProperties; import org.dimdev.dimdoors.shared.rifts.registry.Rift; import org.dimdev.dimdoors.shared.rifts.registry.RiftRegistry; @@ -91,18 +86,6 @@ import javax.annotation.Nonnull; deserializeNBT(pkt.getNbtCompound()); } - // Tile entity properties - - // Use vanilla behavior of refreshing only when block changes, not state (otherwise, opening the door would destroy the tile entity) - @Override - public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) { - // newState is not accurate if we change the state during onBlockBreak - newSate = world.getBlockState(pos); - return oldState.getBlock() != newSate.getBlock() && - !(oldState.getBlock() instanceof BlockDimensionalDoor - && newSate.getBlock() instanceof BlockFloatingRift); - } - // Modification functions public void setRotation(float yaw, float pitch) { @@ -241,6 +224,7 @@ import javax.annotation.Nonnull; if (color == null && newColor != null || !color.equals(newColor)) { color = newColor; markDirty(); + world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 2); } } } diff --git a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java index 149abf3f..c64e6066 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityEntranceRift.java @@ -1,5 +1,8 @@ package org.dimdev.dimdoors.shared.tileentities; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import org.dimdev.ddutils.nbt.NBTUtils; import org.dimdev.annotatednbt.Saved; import org.dimdev.annotatednbt.NBTSerializable; @@ -79,6 +82,14 @@ import java.util.Random; TeleportUtils.teleport(entity, new Location(world, pos.offset(orientation, tpOffset)), orientation.getHorizontalAngle(), 0); } + // Use vanilla behavior of refreshing only when block changes, not state (otherwise, opening the door would destroy the tile entity) + @Override + public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) { + // newState is not accurate if we change the state during onBlockBreak + newSate = world.getBlockState(pos); + return oldState.getBlock() != newSate.getBlock(); + } + public RGBA getEntranceRenderColor(Random rand) { // TODO: custom color float red, green, blue; switch(world.provider.getDimension()) { @@ -100,4 +111,6 @@ import java.util.Random; public boolean isFloating() { return false; } + + } diff --git a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityFloatingRift.java b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityFloatingRift.java index 403008ea..c0049c21 100644 --- a/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityFloatingRift.java +++ b/src/main/java/org/dimdev/dimdoors/shared/tileentities/TileEntityFloatingRift.java @@ -1,9 +1,13 @@ package org.dimdev.dimdoors.shared.tileentities; import lombok.Setter; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import org.dimdev.ddutils.nbt.NBTUtils; import org.dimdev.annotatednbt.Saved; import org.dimdev.annotatednbt.NBTSerializable; +import org.dimdev.dimdoors.shared.blocks.BlockFloatingRift; import org.dimdev.dimdoors.shared.blocks.ModBlocks; import java.util.List; import java.util.Random; @@ -104,6 +108,15 @@ import net.minecraft.util.math.AxisAlignedBB; return false; } + @Override + public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) { + // newState is not accurate if we change the state during onBlockBreak + newSate = world.getBlockState(pos); + return oldState.getBlock() != newSate.getBlock() && + !(world.getTileEntity(pos) instanceof TileEntityRift && // This is to prevent setBlockState clearing the tile entity right after we set it in breakBlock + newSate.getBlock() instanceof BlockFloatingRift); + } + @Override public boolean shouldRenderInPass(int pass) { return pass == 1;