Compare commits

..

No commits in common. "ce17d53f4bd0920d797975a314a4cb1af7a3ec85" and "489e050a7f95280b56256396148804f2eed62155" have entirely different histories.

5 changed files with 35 additions and 38 deletions

View file

@ -11,4 +11,4 @@ mcp_mappings=20200723-1.16.1
botania=1.16.2-405 botania=1.16.2-405
version_major=2 version_major=2
version_minor=4 version_minor=2

View file

@ -7,9 +7,12 @@ 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.item.Items; import net.minecraft.state.Property;
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;
@ -205,23 +208,17 @@ 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 of the used block. * This check is independent from 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
if(world.isAirBlock(pos)) return true; return replace || world.isAirBlock(pos);
// 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;
@ -229,10 +226,6 @@ 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()) {

View file

@ -2,13 +2,14 @@ package thetadev.constructionwand.containers.handlers;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import thetadev.constructionwand.api.IContainerHandler; import thetadev.constructionwand.api.IContainerHandler;
import thetadev.constructionwand.basics.WandUtil;
import java.util.Optional;
/**
* Created by james on 28/12/16.
*/
public class HandlerCapability implements IContainerHandler public class HandlerCapability implements IContainerHandler
{ {
@Override @Override
@ -18,35 +19,43 @@ public class HandlerCapability implements IContainerHandler
@Override @Override
public int countItems(PlayerEntity player, ItemStack itemStack, ItemStack inventoryStack) { public int countItems(PlayerEntity player, ItemStack itemStack, ItemStack inventoryStack) {
Optional<IItemHandler> itemHandlerOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); LazyOptional<IItemHandler> itemHandlerLazyOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if(!itemHandlerOptional.isPresent()) return 0; if(!itemHandlerLazyOptional.isPresent()) return 0;
int total = 0; int total = 0;
IItemHandler itemHandler = itemHandlerOptional.get(); IItemHandler itemHandler = itemHandlerLazyOptional.orElse(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.getDefaultInstance());
for(int i = 0; i < itemHandler.getSlots(); i++) { for(int i = 0; i < itemHandler.getSlots(); i++) {
ItemStack containerStack = itemHandler.getStackInSlot(i); ItemStack containerStack = itemHandler.getStackInSlot(i);
if(WandUtil.stackEquals(itemStack, containerStack)) { if(containerStack != null && itemStack.isItemEqual(containerStack)) {
total += Math.max(0, containerStack.getCount()); total += Math.max(0, containerStack.getCount());
} }
// Already in a container. Don't inception this thing.
} }
return total; return total;
} }
@Override @Override
public int useItems(PlayerEntity player, ItemStack itemStack, ItemStack inventoryStack, int count) { public int useItems(PlayerEntity player, ItemStack itemStack, ItemStack inventoryStack, int count) {
Optional<IItemHandler> itemHandlerOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve(); int toUse = itemStack.getCount();
if(!itemHandlerOptional.isPresent()) return 0;
IItemHandler itemHandler = itemHandlerOptional.get(); LazyOptional<IItemHandler> itemHandlerLazyOptional = inventoryStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if(!itemHandlerLazyOptional.isPresent()) return 0;
IItemHandler itemHandler = itemHandlerLazyOptional.orElse(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.getDefaultInstance());
for(int i = 0; i < itemHandler.getSlots(); i++) { for(int i = 0; i < itemHandler.getSlots(); i++) {
ItemStack handlerStack = itemHandler.getStackInSlot(i); ItemStack handlerStack = itemHandler.getStackInSlot(i);
if(WandUtil.stackEquals(itemStack, handlerStack)) { if(handlerStack != null && handlerStack.isItemEqual(itemStack)) {
ItemStack extracted = itemHandler.extractItem(i, count, false); ItemStack extracted = itemHandler.extractItem(i, count, false);
if(extracted != null) {
count -= extracted.getCount(); count -= extracted.getCount();
if(count <= 0) break; }
if(count <= 0) {
break;
}
} }
} }
return count; return count;

View file

@ -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 breakFace = rayTraceResult.getFace(); Direction breakDirection = 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(breakFace == Direction.UP || breakFace == Direction.DOWN) { if(breakDirection == Direction.UP || breakDirection == 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,10 +57,6 @@ 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);
@ -71,7 +67,7 @@ public class ActionDestruction implements IWandAction
if(snapshot == null) continue; if(snapshot == null) continue;
destroySnapshots.add(snapshot); destroySnapshots.add(snapshot);
switch(breakFace) { switch(breakDirection) {
case DOWN: case DOWN:
case UP: case UP:
if(options.testLock(WandOptions.LOCK.NORTHSOUTH)) { if(options.testLock(WandOptions.LOCK.NORTHSOUTH)) {

View file

@ -5,7 +5,6 @@ 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;
@ -52,7 +51,7 @@ public class SupplierInventory implements IWandSupplier
addBlockItem((BlockItem) offhandStack.getItem()); addBlockItem((BlockItem) offhandStack.getItem());
} }
// Otherwise use target block // Otherwise use target block
else if(target != null && target != Items.AIR) { else {
addBlockItem(target); addBlockItem(target);
// Add replacement items // Add replacement items