Skip to content

Commit

Permalink
Fix: use Mattocks consistently from the Miner block
Browse files Browse the repository at this point in the history
The current positioning of the fake player at the Miner corner means that the Mattock behaviour will inconsistently apply based on the distance and only in relative negative coordinates.
  • Loading branch information
Gegy committed Jan 1, 2025
1 parent 353d626 commit e538428
Showing 1 changed file with 23 additions and 7 deletions.
30 changes: 23 additions & 7 deletions src/main/java/com/lothrazar/cyclic/block/miner/TileMiner.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.lothrazar.cyclic.registry.ItemRegistry;
import com.lothrazar.cyclic.registry.TileRegistry;
import com.lothrazar.library.cap.CustomEnergyStorage;
import net.minecraft.commands.arguments.EntityAnchorArgument;
import com.lothrazar.library.util.ShapeUtil;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
Expand All @@ -29,6 +30,7 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.ForgeConfigSpec.IntValue;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
Expand Down Expand Up @@ -189,28 +191,30 @@ private boolean updateMiningProgress(List<BlockPos> shape) {
isCurrentlyMining = true;
//then keep current target
}
else { // no valid target, back out
else { // no valid target, back out
updateTargetPos(shape);
resetProgress();
}
Integer cost = POWERCONF.get();
if (energy.getEnergyStored() < cost && cost > 0) {
return false;
}
FakePlayer fakePlayer = this.fakePlayer.get();
//currentlyMining may have changed, and we are still turned on:
if (isCurrentlyMining) {
BlockState targetState = level.getBlockState(targetPos);
float relative = targetState.getDestroyProgress(fakePlayer.get(), level, targetPos);
float relative = targetState.getDestroyProgress(fakePlayer, level, targetPos);
//state.getPlayerRelativeBlockHardness(player, worldIn, pos);UtilItemStack.getPlayerRelativeBlockHardness(targetState.getBlock(), targetState, fakePlayer.get(), world, targetPos);
curBlockDamage += relative;
//
//if hardness is relative, jus fekin break it like air eh
if (curBlockDamage >= 1.0f || relative == 0) {
boolean harvested = fakePlayer.get().gameMode.destroyBlock(targetPos);
placePlayerBehindBlock(fakePlayer, targetPos);
boolean harvested = fakePlayer.gameMode.destroyBlock(targetPos);
if (!harvested) {
// world.destroyBlock(targetPos, true, fakePlayer.get());
//removedByPlayer
harvested = level.getBlockState(targetPos).onDestroyedByPlayer(level, targetPos, fakePlayer.get(), true, level.getFluidState(targetPos));
harvested = level.getBlockState(targetPos).onDestroyedByPlayer(level, targetPos, fakePlayer, true, level.getFluidState(targetPos));
// ModCyclic.LOGGER.info("Miner:removedByPlayer hacky workaround " + targetPos);
}
if (harvested) {
Expand All @@ -219,16 +223,28 @@ private boolean updateMiningProgress(List<BlockPos> shape) {
resetProgress();
}
else {
level.destroyBlockProgress(fakePlayer.get().getUUID().hashCode(), targetPos, (int) (curBlockDamage * 10.0F) - 1);
level.destroyBlockProgress(fakePlayer.getUUID().hashCode(), targetPos, (int) (curBlockDamage * 10.0F) - 1);
}
}
}
else { //is mining is false
level.destroyBlockProgress(fakePlayer.get().getUUID().hashCode(), targetPos, (int) (curBlockDamage * 10.0F) - 1);
else { //is mining is false
level.destroyBlockProgress(fakePlayer.getUUID().hashCode(), targetPos, (int) (curBlockDamage * 10.0F) - 1);
}
return false;
}

private void placePlayerBehindBlock(FakePlayer player, BlockPos targetPos) {
// Some items (such as Mattock) use the position of the player relative to the block to determine mining behavior
// Place the fake player just behind the block
Direction facing = getBlockState().getValue(BlockStateProperties.FACING);
player.moveTo(
targetPos.getX() - facing.getStepX() + 0.5,
targetPos.getY() - facing.getStepY() + 0.5 - player.getEyeHeight(),
targetPos.getZ() - facing.getStepZ() + 0.5
);
player.lookAt(EntityAnchorArgument.Anchor.EYES, Vec3.atCenterOf(targetPos));
}

/***
* Unbreakable blocks and fluid blocks are not valid. Otherwise checks if player:canHarvestBlock using its equipped item
*/
Expand Down

0 comments on commit e538428

Please sign in to comment.