1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-07-05 11:32:53 +00:00

Different fix for shadow turtles

This commit is contained in:
Bartek Bok 2017-05-03 16:03:47 +02:00
parent 5284b145f8
commit 4eb4bb933f
No known key found for this signature in database
GPG Key ID: D4AB7344B821F0B5
2 changed files with 93 additions and 35 deletions

View File

@ -47,11 +47,18 @@ public class TileTurtle extends TileComputerBase
// Members // Members
enum MoveState
{
NOT_MOVED,
IN_PROGRESS,
MOVED
}
private ItemStack[] m_inventory; private ItemStack[] m_inventory;
private ItemStack[] m_previousInventory; private ItemStack[] m_previousInventory;
private boolean m_inventoryChanged; private boolean m_inventoryChanged;
private TurtleBrain m_brain; private TurtleBrain m_brain;
private boolean m_moved; private MoveState m_moveState;
public TileTurtle() public TileTurtle()
{ {
@ -59,12 +66,12 @@ public class TileTurtle extends TileComputerBase
m_previousInventory = new ItemStack[ getSizeInventory() ]; m_previousInventory = new ItemStack[ getSizeInventory() ];
m_inventoryChanged = false; m_inventoryChanged = false;
m_brain = createBrain(); m_brain = createBrain();
m_moved = false; m_moveState = MoveState.NOT_MOVED;
} }
public boolean hasMoved() public boolean hasMoved()
{ {
return m_moved; return m_moveState == MoveState.MOVED;
} }
protected TurtleBrain createBrain() protected TurtleBrain createBrain()
@ -276,6 +283,41 @@ public class TileTurtle extends TileComputerBase
} }
} }
@Override
public void onNeighbourChange()
{
if ( m_moveState == MoveState.NOT_MOVED )
{
super.onNeighbourChange();
}
}
@Override
public void onNeighbourTileEntityChange(BlockPos neighbour)
{
if ( m_moveState == MoveState.NOT_MOVED )
{
super.onNeighbourTileEntityChange( neighbour );
}
}
public void notifyMoveStart()
{
if (m_moveState == MoveState.NOT_MOVED)
{
m_moveState = MoveState.IN_PROGRESS;
}
}
public void notifyMoveEnd()
{
// MoveState.MOVED is final
if (m_moveState == MoveState.IN_PROGRESS)
{
m_moveState = MoveState.NOT_MOVED;
}
}
@Override @Override
public void readFromNBT( NBTTagCompound nbttagcompound ) public void readFromNBT( NBTTagCompound nbttagcompound )
{ {
@ -664,6 +706,6 @@ public class TileTurtle extends TileComputerBase
m_inventoryChanged = copy.m_inventoryChanged; m_inventoryChanged = copy.m_inventoryChanged;
m_brain = copy.m_brain; m_brain = copy.m_brain;
m_brain.setOwner( this ); m_brain.setOwner( this );
copy.m_moved = true; copy.m_moveState = MoveState.MOVED;
} }
} }

View File

@ -495,6 +495,7 @@ public class TurtleBrain implements ITurtleAccess
// Cache info about the old turtle (so we don't access this after we delete ourselves) // Cache info about the old turtle (so we don't access this after we delete ourselves)
World oldWorld = getWorld(); World oldWorld = getWorld();
TileTurtle oldOwner = m_owner;
BlockPos oldPos = m_owner.getPos(); BlockPos oldPos = m_owner.getPos();
Block oldBlock = m_owner.getBlock(); Block oldBlock = m_owner.getBlock();
@ -504,8 +505,17 @@ public class TurtleBrain implements ITurtleAccess
return true; return true;
} }
if ( !world.isBlockLoaded( pos ) )
{
return false;
}
oldOwner.notifyMoveStart();
try
{
// Create a new turtle // Create a new turtle
if( world.isBlockLoaded( pos ) && world.setBlockState( pos, oldBlock.getDefaultState(), 0 ) ) if( world.setBlockState( pos, oldBlock.getDefaultState(), 0 ) )
{ {
Block block = world.getBlockState( pos ).getBlock(); Block block = world.getBlockState( pos ).getBlock();
if( block == oldBlock ) if( block == oldBlock )
@ -517,7 +527,7 @@ public class TurtleBrain implements ITurtleAccess
TileTurtle newTurtle = (TileTurtle)newTile; TileTurtle newTurtle = (TileTurtle)newTile;
newTurtle.setWorldObj( world ); newTurtle.setWorldObj( world );
newTurtle.setPos( pos ); newTurtle.setPos( pos );
newTurtle.transferStateFrom( m_owner ); newTurtle.transferStateFrom( oldOwner );
newTurtle.createServerComputer().setWorld( world ); newTurtle.createServerComputer().setWorld( world );
newTurtle.createServerComputer().setPosition( pos ); newTurtle.createServerComputer().setPosition( pos );
@ -535,6 +545,12 @@ public class TurtleBrain implements ITurtleAccess
// Something went wrong, remove the newly created turtle // Something went wrong, remove the newly created turtle
world.setBlockToAir( pos ); world.setBlockToAir( pos );
} }
}
finally
{
// whatever happens, unblock old turtle in case it's still in world
oldOwner.notifyMoveEnd();
}
return false; return false;
} }