mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-30 21:23:00 +00:00 
			
		
		
		
	Try to handle a turtle being broken while ticked
Hopefully fixes #585. Hopefully.
This commit is contained in:
		| @@ -388,3 +388,11 @@ will no longer function (as gsub returns multiple arguments). However, | |||||||
| I've done a quick search through GH and my Pastebin archives and can't | I've done a quick search through GH and my Pastebin archives and can't | ||||||
| find any programs which would break. Fingers crossed. | find any programs which would break. Fingers crossed. | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | 24af36743d08fcdb58439c52bf587b33ed828263 | ||||||
|  |  | ||||||
|  | Try to handle a turtle being broken while ticked | ||||||
|  |  | ||||||
|  | Hopefully fixes #585. Hopefully. | ||||||
|  | ``` | ||||||
|   | |||||||
| @@ -66,6 +66,9 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static ServerComputer getServerComputer(@Nonnull ItemStack stack) { |     public static ServerComputer getServerComputer(@Nonnull ItemStack stack) { | ||||||
|  |         int session = getSessionID( stack ); | ||||||
|  |         if( session != ComputerCraft.serverComputerRegistry.getSessionID() ) return null; | ||||||
|  |  | ||||||
|         int instanceID = getInstanceID(stack); |         int instanceID = getInstanceID(stack); | ||||||
|         return instanceID >= 0 ? ComputerCraft.serverComputerRegistry.get(instanceID) : null; |         return instanceID >= 0 ? ComputerCraft.serverComputerRegistry.get(instanceID) : null; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -163,6 +163,10 @@ public class TurtleBrain implements ITurtleAccess { | |||||||
|         if (!world.isClient) { |         if (!world.isClient) { | ||||||
|             // Advance movement |             // Advance movement | ||||||
|             this.updateCommands(); |             this.updateCommands(); | ||||||
|  |  | ||||||
|  |             // The block may have been broken while the command was executing (for instance, if a block explodes | ||||||
|  |             // when being mined). If so, abort. | ||||||
|  |             if( m_owner.isRemoved() ) return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Advance animation |         // Advance animation | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import dan200.computercraft.api.turtle.event.TurtleAttackEvent; | |||||||
| import dan200.computercraft.api.turtle.event.TurtleBlockEvent; | import dan200.computercraft.api.turtle.event.TurtleBlockEvent; | ||||||
| import dan200.computercraft.api.turtle.event.TurtleEvent; | import dan200.computercraft.api.turtle.event.TurtleEvent; | ||||||
| import dan200.computercraft.shared.TurtlePermissions; | import dan200.computercraft.shared.TurtlePermissions; | ||||||
|  | import dan200.computercraft.shared.turtle.core.TurtleBrain; | ||||||
| import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; | import dan200.computercraft.shared.turtle.core.TurtlePlaceCommand; | ||||||
| import dan200.computercraft.shared.turtle.core.TurtlePlayer; | import dan200.computercraft.shared.turtle.core.TurtlePlayer; | ||||||
| import dan200.computercraft.shared.util.DropConsumer; | import dan200.computercraft.shared.util.DropConsumer; | ||||||
| @@ -94,10 +95,13 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|         return TransformedModel.of(this.getCraftingItem(), new AffineTransformation(new Vector3f(xOffset + 1, 0, 1), Vector3f.POSITIVE_Y.getDegreesQuaternion(270), new Vector3f(1, 1, 1), Vector3f.POSITIVE_Z.getDegreesQuaternion(90))); |         return TransformedModel.of(this.getCraftingItem(), new AffineTransformation(new Vector3f(xOffset + 1, 0, 1), Vector3f.POSITIVE_Y.getDegreesQuaternion(270), new Vector3f(1, 1, 1), Vector3f.POSITIVE_Z.getDegreesQuaternion(90))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private TurtleCommandResult attack(final ITurtleAccess turtle, Direction direction, TurtleSide side) { |     private TurtleCommandResult attack( ITurtleAccess turtle, Direction direction, TurtleSide side ) { | ||||||
|         // Create a fake player, and orient it appropriately |         // Create a fake player, and orient it appropriately | ||||||
|         final World world = turtle.getWorld(); |         World world = turtle.getWorld(); | ||||||
|         final BlockPos position = turtle.getPosition(); |         BlockPos position = turtle.getPosition(); | ||||||
|  |         BlockEntity turtleBlock = turtle instanceof TurtleBrain ? ((TurtleBrain) turtle).getOwner() : world.getBlockEntity( position ); | ||||||
|  |         if( turtleBlock == null ) return TurtleCommandResult.failure( "Turtle has vanished from existence." ); | ||||||
|  |  | ||||||
|         final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer(turtle, position, direction); |         final TurtlePlayer turtlePlayer = TurtlePlaceCommand.createPlayer(turtle, position, direction); | ||||||
|  |  | ||||||
|         // See if there is an entity present |         // See if there is an entity present | ||||||
| @@ -105,7 +109,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|         Vec3d rayDir = turtlePlayer.getRotationVec(1.0f); |         Vec3d rayDir = turtlePlayer.getRotationVec(1.0f); | ||||||
|         Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities(world, turtlePos, rayDir, 1.5); |         Pair<Entity, Vec3d> hit = WorldUtil.rayTraceEntities(world, turtlePos, rayDir, 1.5); | ||||||
|         if (hit != null) { |         if (hit != null) { | ||||||
|             // Load up the turtle's inventory |             // Load up the turtle's inventoryf | ||||||
|             ItemStack stackCopy = this.item.copy(); |             ItemStack stackCopy = this.item.copy(); | ||||||
|             turtlePlayer.loadInventory(stackCopy); |             turtlePlayer.loadInventory(stackCopy); | ||||||
|  |  | ||||||
| @@ -127,7 +131,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Start claiming entity drops |             // Start claiming entity drops | ||||||
|             DropConsumer.set(hitEntity, turtleDropConsumer(turtle)); |             DropConsumer.set( hitEntity, turtleDropConsumer( turtleBlock, turtle ) ); | ||||||
|  |  | ||||||
|             // Attack the entity |             // Attack the entity | ||||||
|             boolean attacked = false; |             boolean attacked = false; | ||||||
| @@ -152,7 +156,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Stop claiming drops |             // Stop claiming drops | ||||||
|             stopConsuming(turtle); |             stopConsuming( turtleBlock, turtle ); | ||||||
|  |  | ||||||
|             // Put everything we collected into the turtles inventory, then return |             // Put everything we collected into the turtles inventory, then return | ||||||
|             if (attacked) { |             if (attacked) { | ||||||
| @@ -168,6 +172,10 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|         // Get ready to dig |         // Get ready to dig | ||||||
|         World world = turtle.getWorld(); |         World world = turtle.getWorld(); | ||||||
|         BlockPos turtlePosition = turtle.getPosition(); |         BlockPos turtlePosition = turtle.getPosition(); | ||||||
|  |         BlockEntity turtleBlock = turtle instanceof TurtleBrain ? ((TurtleBrain) turtle).getOwner() : world.getBlockEntity( turtlePosition ); | ||||||
|  |         if( turtleBlock == null ) return TurtleCommandResult.failure( "Turtle has vanished from existence." ); | ||||||
|  |  | ||||||
|  |  | ||||||
|         BlockPos blockPosition = turtlePosition.offset(direction); |         BlockPos blockPosition = turtlePosition.offset(direction); | ||||||
|  |  | ||||||
|         if (world.isAir(blockPosition) || WorldUtil.isLiquidBlock(world, blockPosition)) { |         if (world.isAir(blockPosition) || WorldUtil.isLiquidBlock(world, blockPosition)) { | ||||||
| @@ -198,7 +206,7 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Consume the items the block drops |         // Consume the items the block drops | ||||||
|         DropConsumer.set(world, blockPosition, turtleDropConsumer(turtle)); |         DropConsumer.set( world, blockPosition, turtleDropConsumer( turtleBlock, turtle ) ); | ||||||
|  |  | ||||||
|         BlockEntity tile = world.getBlockEntity(blockPosition); |         BlockEntity tile = world.getBlockEntity(blockPosition); | ||||||
|  |  | ||||||
| @@ -220,28 +228,28 @@ public class TurtleTool extends AbstractTurtleUpgrade { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         stopConsuming(turtle); |         stopConsuming(turtleBlock, turtle); | ||||||
|  |  | ||||||
|         return TurtleCommandResult.success(); |         return TurtleCommandResult.success(); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static Function<ItemStack, ItemStack> turtleDropConsumer(ITurtleAccess turtle) { |     private static Function<ItemStack, ItemStack> turtleDropConsumer(BlockEntity turtleBlock, ITurtleAccess turtle) { | ||||||
|         return drop -> InventoryUtil.storeItems(drop, turtle.getItemHandler(), turtle.getSelectedSlot()); |         return drop -> turtleBlock.isRemoved() ? drop : InventoryUtil.storeItems(drop, turtle.getItemHandler(), turtle.getSelectedSlot()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected float getDamageMultiplier() { |     protected float getDamageMultiplier() { | ||||||
|         return 3.0f; |         return 3.0f; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static void stopConsuming(ITurtleAccess turtle) { |     private static void stopConsuming(BlockEntity turtleBlock, ITurtleAccess turtle) { | ||||||
|  |         Direction direction = turtleBlock.isRemoved() ? null : turtle.getDirection().getOpposite(); | ||||||
|         List<ItemStack> extra = DropConsumer.clear(); |         List<ItemStack> extra = DropConsumer.clear(); | ||||||
|         for (ItemStack remainder : extra) { |         for (ItemStack remainder : extra) { | ||||||
|             WorldUtil.dropItemStack(remainder, |             WorldUtil.dropItemStack(remainder, | ||||||
|                                     turtle.getWorld(), |                                     turtle.getWorld(), | ||||||
|                                     turtle.getPosition(), |                                     turtle.getPosition(), | ||||||
|                                     turtle.getDirection() |                                     direction); | ||||||
|                                           .getOpposite()); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Merith-TK
					Merith-TK