fix(progress): count tree blocks broken with any tool
Release / release (push) Successful in 1m49s
CI / build (push) Successful in 58s

This commit is contained in:
dmg
2026-08-11 18:27:21 -04:00
parent 904faf1832
commit e7a5a14529
5 changed files with 42 additions and 5 deletions
@@ -40,7 +40,6 @@ public final class TreeProgressListener implements Listener {
Player player = event.getPlayer();
if (event.isCancelled()
|| player.getGameMode() != GameMode.SURVIVAL
|| !TreeTools.isAxe(player.getInventory().getItemInMainHand().getType())
|| automaticBreaks.isMarked(event.getBlock())) {
return;
}
@@ -54,6 +54,34 @@ class TreeFellingListenerTest {
verify(starter, org.mockito.Mockito.times(1)).start(any(), any(), any(), eq(2));
}
@Test
void aNonAxeCanEarnProgressButNeverStartsAutomaticFelling() {
UUID playerId = UUID.randomUUID();
Player player = mock(Player.class);
PlayerInventory inventory = mock(PlayerInventory.class);
when(player.getUniqueId()).thenReturn(playerId);
when(player.getName()).thenReturn("Player");
when(player.getGameMode()).thenReturn(GameMode.SURVIVAL);
when(player.getInventory()).thenReturn(inventory);
when(inventory.getItemInMainHand()).thenReturn(new ItemStack(Material.DIAMOND_PICKAXE));
PlayerStateStore states = mock(PlayerStateStore.class);
when(states.load(playerId)).thenReturn(Optional.of(
PlayerTreeFellerState.initial(playerId, "Player")
.withUnlocked(TreeSpecies.OAK, true)));
TreeFellingStarter starter = mock(TreeFellingStarter.class);
TreeFellingListener listener = new TreeFellingListener(
ignored -> Optional.of(new TreeStructure(
TreeSpecies.OAK, List.of(new BlockPoint(0, 0, 0)))),
states,
new AutomaticBreakRegistry(),
starter,
() -> 2);
listener.onBlockBreak(new BlockBreakEvent(mock(Block.class), player));
verify(starter, never()).start(any(), any(), any(), any(Integer.class));
}
@Test
void administrativeLockSuppressesFellingWithoutChangingTheOrdinaryBreak() {
UUID playerId = UUID.randomUUID();
@@ -19,7 +19,7 @@ import org.junit.jupiter.api.Test;
class TreeProgressListenerTest {
@Test
void recordsOnlyManualSurvivalAxeBreaksFromValidatedTrees() throws Exception {
void recordsManualSurvivalBreaksWithAnEmptyHandOrAnyToolFromValidatedTrees() throws Exception {
UUID playerId = UUID.randomUUID();
Player player = mock(Player.class);
PlayerInventory inventory = mock(PlayerInventory.class);
@@ -50,9 +50,12 @@ class TreeProgressListenerTest {
automaticBreaks.mark(block);
listener.onBlockBreak(event);
automaticBreaks.unmark(block);
when(inventory.getItemInMainHand()).thenReturn(new ItemStack(Material.AIR));
listener.onBlockBreak(event);
when(inventory.getItemInMainHand()).thenReturn(new ItemStack(Material.DIAMOND_PICKAXE));
listener.onBlockBreak(event);
assertEquals(1, states.state.progress(TreeSpecies.OAK));
assertEquals(2, states.state.progress(TreeSpecies.OAK));
}
private static final class InMemoryStateStore implements PlayerStateStore {