mirror of
				https://github.com/Theta-Dev/ConstructionWand.git
				synced 2025-10-31 19:23:47 +01:00 
			
		
		
		
	Compare commits
	
		
			2 commits
		
	
	
		
			
				61a5707094
			
			...
			
				cd3a451e54
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cd3a451e54 | |||
| 9435dd8d30 | 
					 4 changed files with 25 additions and 13 deletions
				
			
		|  | @ -11,4 +11,4 @@ mcp_mappings=20200723-1.16.1 | ||||||
| botania=1.16-398 | botania=1.16-398 | ||||||
| 
 | 
 | ||||||
| version_major=2 | version_major=2 | ||||||
| version_minor=2 | version_minor=4 | ||||||
|  | @ -7,12 +7,9 @@ import net.minecraft.entity.Entity; | ||||||
| import net.minecraft.entity.LivingEntity; | import net.minecraft.entity.LivingEntity; | ||||||
| import net.minecraft.entity.player.PlayerEntity; | import net.minecraft.entity.player.PlayerEntity; | ||||||
| import net.minecraft.item.BlockItem; | import net.minecraft.item.BlockItem; | ||||||
| import net.minecraft.item.BlockItemUseContext; |  | ||||||
| import net.minecraft.item.Item; | import net.minecraft.item.Item; | ||||||
| import net.minecraft.item.ItemStack; | import net.minecraft.item.ItemStack; | ||||||
| import net.minecraft.state.Property; | import net.minecraft.item.Items; | ||||||
| import net.minecraft.state.properties.BlockStateProperties; |  | ||||||
| import net.minecraft.state.properties.SlabType; |  | ||||||
| import net.minecraft.stats.Stats; | import net.minecraft.stats.Stats; | ||||||
| import net.minecraft.util.Direction; | import net.minecraft.util.Direction; | ||||||
| import net.minecraft.util.EntityPredicates; | import net.minecraft.util.EntityPredicates; | ||||||
|  | @ -208,17 +205,23 @@ public class WandUtil | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Tests if a wand can place a block at a certain position. |      * Tests if a wand can place a block at a certain position. | ||||||
|      * This check is independent from the used block. |      * This check is independent of the used block. | ||||||
|      */ |      */ | ||||||
|     public static boolean isPositionPlaceable(World world, PlayerEntity player, BlockPos pos, boolean replace) { |     public static boolean isPositionPlaceable(World world, PlayerEntity player, BlockPos pos, boolean replace) { | ||||||
|         if(!isPositionModifiable(world,player, pos)) return false; |         if(!isPositionModifiable(world, player, pos)) return false; | ||||||
| 
 | 
 | ||||||
|         // If replace mode is off, target has to be air |         // If replace mode is off, target has to be air | ||||||
|         return replace || world.isAirBlock(pos); |         if(world.isAirBlock(pos)) return true; | ||||||
|  | 
 | ||||||
|  |         // Otherwise, check if the block can be replaced by a generic block | ||||||
|  |         return replace && world.getBlockState(pos).isReplaceable( | ||||||
|  |                 new WandItemUseContext(world, player, | ||||||
|  |                         new BlockRayTraceResult(new Vector3d(0, 0, 0), Direction.DOWN, pos, false), | ||||||
|  |                         pos, (BlockItem) Items.STONE)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static boolean isBlockRemovable(World world, PlayerEntity player, BlockPos pos) { |     public static boolean isBlockRemovable(World world, PlayerEntity player, BlockPos pos) { | ||||||
|         if(!isPositionModifiable(world,player, pos)) return false; |         if(!isPositionModifiable(world, player, pos)) return false; | ||||||
| 
 | 
 | ||||||
|         if(!player.isCreative()) { |         if(!player.isCreative()) { | ||||||
|             return !(world.getBlockState(pos).getBlockHardness(world, pos) <= -1) && world.getTileEntity(pos) == null; |             return !(world.getBlockState(pos).getBlockHardness(world, pos) <= -1) && world.getTileEntity(pos) == null; | ||||||
|  | @ -226,6 +229,10 @@ public class WandUtil | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public static boolean isBlockPermeable(World world, BlockPos pos) { | ||||||
|  |         return world.isAirBlock(pos) || world.getBlockState(pos).getCollisionShape(world, pos).isEmpty(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public static boolean entitiesCollidingWithBlock(World world, BlockState blockState, BlockPos pos) { |     public static boolean entitiesCollidingWithBlock(World world, BlockState blockState, BlockPos pos) { | ||||||
|         VoxelShape shape = blockState.getCollisionShape(world, pos); |         VoxelShape shape = blockState.getCollisionShape(world, pos); | ||||||
|         if(!shape.isEmpty()) { |         if(!shape.isEmpty()) { | ||||||
|  |  | ||||||
|  | @ -39,14 +39,14 @@ public class ActionDestruction implements IWandAction | ||||||
|         HashSet<BlockPos> allCandidates = new HashSet<>(); |         HashSet<BlockPos> allCandidates = new HashSet<>(); | ||||||
| 
 | 
 | ||||||
|         // Block face the wand was pointed at |         // Block face the wand was pointed at | ||||||
|         Direction breakDirection = rayTraceResult.getFace(); |         Direction breakFace = rayTraceResult.getFace(); | ||||||
|         // Block the wand was pointed at |         // Block the wand was pointed at | ||||||
|         BlockPos startingPoint = rayTraceResult.getPos(); |         BlockPos startingPoint = rayTraceResult.getPos(); | ||||||
|         BlockState targetBlock = world.getBlockState(rayTraceResult.getPos()); |         BlockState targetBlock = world.getBlockState(rayTraceResult.getPos()); | ||||||
| 
 | 
 | ||||||
|         // Is break direction allowed by lock? |         // Is break direction allowed by lock? | ||||||
|         // Tried to break blocks from top/bottom face, so the wand should allow breaking in NS/EW direction |         // Tried to break blocks from top/bottom face, so the wand should allow breaking in NS/EW direction | ||||||
|         if(breakDirection == Direction.UP || breakDirection == Direction.DOWN) { |         if(breakFace == Direction.UP || breakFace == Direction.DOWN) { | ||||||
|             if(options.testLock(WandOptions.LOCK.NORTHSOUTH) || options.testLock(WandOptions.LOCK.EASTWEST)) |             if(options.testLock(WandOptions.LOCK.NORTHSOUTH) || options.testLock(WandOptions.LOCK.EASTWEST)) | ||||||
|                 candidates.add(startingPoint); |                 candidates.add(startingPoint); | ||||||
|         } |         } | ||||||
|  | @ -57,6 +57,10 @@ public class ActionDestruction implements IWandAction | ||||||
|         // Process current candidates, stop when none are avaiable or block limit is reached |         // Process current candidates, stop when none are avaiable or block limit is reached | ||||||
|         while(!candidates.isEmpty() && destroySnapshots.size() < limit) { |         while(!candidates.isEmpty() && destroySnapshots.size() < limit) { | ||||||
|             BlockPos currentCandidate = candidates.removeFirst(); |             BlockPos currentCandidate = candidates.removeFirst(); | ||||||
|  | 
 | ||||||
|  |             // Only break blocks facing the player, with no collidable blocks in between | ||||||
|  |             if(!WandUtil.isBlockPermeable(world, currentCandidate.offset(breakFace))) continue; | ||||||
|  | 
 | ||||||
|             try { |             try { | ||||||
|                 BlockState candidateBlock = world.getBlockState(currentCandidate); |                 BlockState candidateBlock = world.getBlockState(currentCandidate); | ||||||
| 
 | 
 | ||||||
|  | @ -67,7 +71,7 @@ public class ActionDestruction implements IWandAction | ||||||
|                     if(snapshot == null) continue; |                     if(snapshot == null) continue; | ||||||
|                     destroySnapshots.add(snapshot); |                     destroySnapshots.add(snapshot); | ||||||
| 
 | 
 | ||||||
|                     switch(breakDirection) { |                     switch(breakFace) { | ||||||
|                         case DOWN: |                         case DOWN: | ||||||
|                         case UP: |                         case UP: | ||||||
|                             if(options.testLock(WandOptions.LOCK.NORTHSOUTH)) { |                             if(options.testLock(WandOptions.LOCK.NORTHSOUTH)) { | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ import net.minecraft.entity.player.PlayerEntity; | ||||||
| import net.minecraft.item.BlockItem; | import net.minecraft.item.BlockItem; | ||||||
| import net.minecraft.item.Item; | import net.minecraft.item.Item; | ||||||
| import net.minecraft.item.ItemStack; | import net.minecraft.item.ItemStack; | ||||||
|  | import net.minecraft.item.Items; | ||||||
| import net.minecraft.util.Hand; | import net.minecraft.util.Hand; | ||||||
| import net.minecraft.util.math.BlockPos; | import net.minecraft.util.math.BlockPos; | ||||||
| import net.minecraft.util.math.BlockRayTraceResult; | import net.minecraft.util.math.BlockRayTraceResult; | ||||||
|  | @ -51,7 +52,7 @@ public class SupplierInventory implements IWandSupplier | ||||||
|             addBlockItem((BlockItem) offhandStack.getItem()); |             addBlockItem((BlockItem) offhandStack.getItem()); | ||||||
|         } |         } | ||||||
|         // Otherwise use target block |         // Otherwise use target block | ||||||
|         else { |         else if(target != null && target != Items.AIR) { | ||||||
|             addBlockItem(target); |             addBlockItem(target); | ||||||
| 
 | 
 | ||||||
|             // Add replacement items |             // Add replacement items | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue