feat(pocket-base): add purchasable biome changes
This commit is contained in:
@@ -100,6 +100,25 @@ final class BaseSettingsCommandTest {
|
||||
List.of("mobs"),
|
||||
command.onTabComplete(null, null, "basesettings", new String[] {"pocket", "m"})
|
||||
);
|
||||
assertEquals(
|
||||
List.of("type"),
|
||||
command.onTabComplete(null, null, "basesettings", new String[] {"pocket", "t"})
|
||||
);
|
||||
assertEquals(
|
||||
List.of("nether"),
|
||||
command.onTabComplete(
|
||||
null, null, "basesettings", new String[] {"pocket", "type", "n"}
|
||||
)
|
||||
);
|
||||
assertEquals(
|
||||
List.of("crimson_forest"),
|
||||
command.onTabComplete(
|
||||
null,
|
||||
null,
|
||||
"basesettings",
|
||||
new String[] {"pocket", "type", "nether", "c"}
|
||||
)
|
||||
);
|
||||
assertEquals(
|
||||
List.of("enable"),
|
||||
command.onTabComplete(
|
||||
@@ -209,6 +228,73 @@ final class BaseSettingsCommandTest {
|
||||
verify(inventory).setStorageContents(any(ItemStack[].class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void pocketOwnerCanPurchaseBiomeChangeWithConfiguredCurrency() throws Exception {
|
||||
UUID playerId = UUID.randomUUID();
|
||||
Player player = mock(Player.class);
|
||||
when(player.getUniqueId()).thenReturn(playerId);
|
||||
when(player.getName()).thenReturn("Builder");
|
||||
PlayerInventory inventory = mock(PlayerInventory.class);
|
||||
when(player.getInventory()).thenReturn(inventory);
|
||||
when(inventory.getStorageContents()).thenReturn(new ItemStack[] {
|
||||
new ItemStack(Material.NETHERITE_BLOCK, 16)
|
||||
});
|
||||
BaseStateManager stateManager = mock(BaseStateManager.class);
|
||||
when(stateManager.player(playerId, "Builder"))
|
||||
.thenReturn(PlayerState.newPlayer(playerId, "Builder"));
|
||||
PocketBaseManager pocketBases = mock(PocketBaseManager.class);
|
||||
PocketBaseState current = new PocketBaseState(playerId, 1, java.util.Optional.empty());
|
||||
when(pocketBases.state(playerId)).thenReturn(current);
|
||||
when(pocketBases.setBiome(playerId, PocketBaseBiome.CRIMSON_FOREST))
|
||||
.thenReturn(current.withBiome(PocketBaseBiome.CRIMSON_FOREST));
|
||||
BaseSettingsCommand command = new BaseSettingsCommand(
|
||||
stateManager,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
mock(BaseFlightController.class),
|
||||
pocketBases
|
||||
);
|
||||
|
||||
command.onCommand(player, null, "basesettings", new String[] {
|
||||
"pocket", "type", "nether", "crimson_forest"
|
||||
});
|
||||
|
||||
verify(pocketBases).setBiome(playerId, PocketBaseBiome.CRIMSON_FOREST);
|
||||
verify(inventory).setStorageContents(any(ItemStack[].class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void selectingCurrentPocketBiomeDoesNotCharge() throws Exception {
|
||||
UUID playerId = UUID.randomUUID();
|
||||
Player player = mock(Player.class);
|
||||
when(player.getUniqueId()).thenReturn(playerId);
|
||||
when(player.getName()).thenReturn("Builder");
|
||||
PlayerInventory inventory = mock(PlayerInventory.class);
|
||||
when(player.getInventory()).thenReturn(inventory);
|
||||
BaseStateManager stateManager = mock(BaseStateManager.class);
|
||||
when(stateManager.player(playerId, "Builder"))
|
||||
.thenReturn(PlayerState.newPlayer(playerId, "Builder"));
|
||||
PocketBaseManager pocketBases = mock(PocketBaseManager.class);
|
||||
when(pocketBases.state(playerId)).thenReturn(
|
||||
new PocketBaseState(playerId, 1, java.util.Optional.empty())
|
||||
);
|
||||
BaseSettingsCommand command = new BaseSettingsCommand(
|
||||
stateManager,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
mock(BaseFlightController.class),
|
||||
pocketBases
|
||||
);
|
||||
|
||||
command.onCommand(player, null, "basesettings", new String[] {
|
||||
"pocket", "type", "void", "the_void"
|
||||
});
|
||||
|
||||
verify(pocketBases, never()).setBiome(
|
||||
org.mockito.ArgumentMatchers.eq(playerId),
|
||||
org.mockito.ArgumentMatchers.any(PocketBaseBiome.class)
|
||||
);
|
||||
verify(inventory, never()).setStorageContents(any(ItemStack[].class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void pocketOwnerCanEnableNaturalMobSpawning() throws Exception {
|
||||
UUID playerId = UUID.randomUUID();
|
||||
@@ -366,6 +452,7 @@ final class BaseSettingsCommandTest {
|
||||
|
||||
verify(player).sendMessage(org.mockito.ArgumentMatchers.<String>argThat(
|
||||
message -> message.contains("Pocket Base 1")
|
||||
&& message.contains("type=void/the_void")
|
||||
&& message.contains("mob spawning=disabled")
|
||||
));
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ final class PluginSettingsTest {
|
||||
assertEquals(16, settings.pocketBaseUpgradeCost());
|
||||
assertEquals("DIAMOND_BLOCK", settings.pocketBaseCurrencyMaterial());
|
||||
assertEquals("DIAMOND_BLOCK", settings.pocketBasePortalFrameMaterial());
|
||||
assertEquals(16, settings.pocketBaseBiomeChangeCost());
|
||||
assertEquals("NETHERITE_BLOCK", settings.pocketBaseBiomeCurrencyMaterial());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -33,13 +35,17 @@ final class PluginSettingsTest {
|
||||
"pocket-base-unlock-cost", 32,
|
||||
"pocket-base-upgrade-cost", 8,
|
||||
"pocket-base-currency-material", "EMERALD_BLOCK",
|
||||
"pocket-base-portal-frame-material", "GOLD_BLOCK"
|
||||
"pocket-base-portal-frame-material", "GOLD_BLOCK",
|
||||
"pocket-base-biome-change-cost", 12,
|
||||
"pocket-base-biome-currency-material", "NETHERITE_INGOT"
|
||||
));
|
||||
|
||||
assertEquals(32, settings.pocketBaseUnlockCost());
|
||||
assertEquals(8, settings.pocketBaseUpgradeCost());
|
||||
assertEquals("EMERALD_BLOCK", settings.pocketBaseCurrencyMaterial());
|
||||
assertEquals("GOLD_BLOCK", settings.pocketBasePortalFrameMaterial());
|
||||
assertEquals(12, settings.pocketBaseBiomeChangeCost());
|
||||
assertEquals("NETHERITE_INGOT", settings.pocketBaseBiomeCurrencyMaterial());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -85,6 +85,57 @@ final class PocketBaseManagerTest {
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void persistsBiomeAfterApplyingItToTheUnlockedArea() throws Exception {
|
||||
UUID ownerId = UUID.randomUUID();
|
||||
PocketBaseState current = new PocketBaseState(ownerId, 2, Optional.empty());
|
||||
PocketBaseStateManager states = mock(PocketBaseStateManager.class);
|
||||
PocketBaseWorldService worlds = mock(PocketBaseWorldService.class);
|
||||
when(states.state(ownerId)).thenReturn(current);
|
||||
when(states.updateAndSave(org.mockito.ArgumentMatchers.eq(ownerId),
|
||||
org.mockito.ArgumentMatchers.any())).thenAnswer(invocation -> {
|
||||
@SuppressWarnings("unchecked")
|
||||
UnaryOperator<PocketBaseState> operation = invocation.getArgument(1);
|
||||
return operation.apply(current);
|
||||
});
|
||||
PocketBaseManager manager = new PocketBaseManager(
|
||||
states,
|
||||
worlds,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of()))
|
||||
);
|
||||
|
||||
PocketBaseState updated = manager.setBiome(ownerId, PocketBaseBiome.WARPED_FOREST);
|
||||
|
||||
assertEquals(PocketBaseBiome.WARPED_FOREST, updated.biome());
|
||||
InOrder order = inOrder(worlds, states);
|
||||
order.verify(worlds).setBiome(ownerId, 2, PocketBaseBiome.WARPED_FOREST);
|
||||
order.verify(states).updateAndSave(
|
||||
org.mockito.ArgumentMatchers.eq(ownerId), org.mockito.ArgumentMatchers.any()
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void restoresPreviousBiomeWhenPersistenceFails() throws Exception {
|
||||
UUID ownerId = UUID.randomUUID();
|
||||
PocketBaseState current = new PocketBaseState(ownerId, 1, Optional.empty());
|
||||
PocketBaseStateManager states = mock(PocketBaseStateManager.class);
|
||||
PocketBaseWorldService worlds = mock(PocketBaseWorldService.class);
|
||||
when(states.state(ownerId)).thenReturn(current);
|
||||
when(states.updateAndSave(org.mockito.ArgumentMatchers.eq(ownerId),
|
||||
org.mockito.ArgumentMatchers.any())).thenThrow(new IOException("save failed"));
|
||||
PocketBaseManager manager = new PocketBaseManager(
|
||||
states,
|
||||
worlds,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of()))
|
||||
);
|
||||
|
||||
assertThrows(IOException.class,
|
||||
() -> manager.setBiome(ownerId, PocketBaseBiome.DESERT));
|
||||
|
||||
verify(worlds).setBiome(ownerId, 1, PocketBaseBiome.DESERT);
|
||||
verify(worlds).setBiome(ownerId, 1, PocketBaseBiome.THE_VOID);
|
||||
}
|
||||
|
||||
@Test
|
||||
void restoresWorldSettingWhenPersistenceFails() throws Exception {
|
||||
UUID ownerId = UUID.randomUUID();
|
||||
|
||||
@@ -31,9 +31,12 @@ final class PocketBaseWorldServiceTest {
|
||||
when(server.createWorld(any(WorldCreator.class))).thenReturn(world);
|
||||
when(world.getUID()).thenReturn(worldId);
|
||||
when(world.getName()).thenReturn("pocket");
|
||||
when(world.getMinHeight()).thenReturn(0);
|
||||
when(world.getMaxHeight()).thenReturn(8);
|
||||
PocketBaseWorldService service = new PocketBaseWorldService(
|
||||
server,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of()))
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
ignored -> null
|
||||
);
|
||||
|
||||
service.expand(ownerId, 0, 1);
|
||||
@@ -84,7 +87,8 @@ final class PocketBaseWorldServiceTest {
|
||||
when(world.getUID()).thenReturn(UUID.randomUUID());
|
||||
PocketBaseWorldService service = new PocketBaseWorldService(
|
||||
server,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of()))
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
ignored -> null
|
||||
);
|
||||
|
||||
service.loadExisting(Map.of(
|
||||
@@ -95,6 +99,32 @@ final class PocketBaseWorldServiceTest {
|
||||
verify(world).setSpawnFlags(true, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
void appliesSelectedBiomeAcrossUnlockedColumnsWithoutChangingBlocks() {
|
||||
UUID ownerId = UUID.randomUUID();
|
||||
Server server = mock(Server.class);
|
||||
World world = mock(World.class);
|
||||
when(server.getWorld(org.mockito.ArgumentMatchers.anyString())).thenReturn(world);
|
||||
when(world.getUID()).thenReturn(UUID.randomUUID());
|
||||
when(world.getMinHeight()).thenReturn(0);
|
||||
when(world.getMaxHeight()).thenReturn(8);
|
||||
PocketBaseWorldService service = new PocketBaseWorldService(
|
||||
server,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
ignored -> null
|
||||
);
|
||||
|
||||
service.setBiome(ownerId, 1, PocketBaseBiome.CRIMSON_FOREST);
|
||||
|
||||
verify(world).setBiome(-32, 0, -32, null);
|
||||
verify(world).setBiome(28, 4, 28, null);
|
||||
verify(world, never()).getBlockAt(
|
||||
org.mockito.ArgumentMatchers.anyInt(),
|
||||
org.mockito.ArgumentMatchers.anyInt(),
|
||||
org.mockito.ArgumentMatchers.anyInt()
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
void laterLevelAddsRingWithoutOverwritingExistingTerrain() {
|
||||
UUID ownerId = UUID.randomUUID();
|
||||
@@ -104,9 +134,12 @@ final class PocketBaseWorldServiceTest {
|
||||
when(server.createWorld(any(WorldCreator.class))).thenReturn(world);
|
||||
when(world.getUID()).thenReturn(UUID.randomUUID());
|
||||
when(world.getName()).thenReturn("pocket");
|
||||
when(world.getMinHeight()).thenReturn(0);
|
||||
when(world.getMaxHeight()).thenReturn(8);
|
||||
PocketBaseWorldService service = new PocketBaseWorldService(
|
||||
server,
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of()))
|
||||
new PluginSettingsProvider(PluginSettings.from(Map.of())),
|
||||
ignored -> null
|
||||
);
|
||||
Block existingCenter = world.getBlockAt(0, 64, 0);
|
||||
|
||||
@@ -116,6 +149,8 @@ final class PocketBaseWorldServiceTest {
|
||||
.setType(Material.GRASS_BLOCK, false);
|
||||
verify(existingCenter, never())
|
||||
.setType(any(Material.class), org.mockito.ArgumentMatchers.anyBoolean());
|
||||
verify(world).setBiome(44, 4, 44, null);
|
||||
verify(world, never()).setBiome(0, 0, 0, null);
|
||||
}
|
||||
|
||||
private static Map<BlockPosition, Block> blocks(World world) {
|
||||
|
||||
@@ -29,7 +29,8 @@ final class YamlPocketBaseRepositoryTest {
|
||||
Optional.of(new PocketPortalLocation(
|
||||
worldId, "pocket", 20, 65, 12, PocketPortalAxis.Z
|
||||
)),
|
||||
true
|
||||
true,
|
||||
PocketBaseBiome.CRIMSON_FOREST
|
||||
);
|
||||
YamlPocketBaseRepository repository = new YamlPocketBaseRepository(
|
||||
temporaryDirectory.resolve("pocket-bases.yml")
|
||||
@@ -51,5 +52,6 @@ final class YamlPocketBaseRepositoryTest {
|
||||
|
||||
assertFalse(loaded.mobSpawningEnabled());
|
||||
assertTrue(loaded.returnPortal().isEmpty());
|
||||
assertEquals(PocketBaseBiome.THE_VOID, loaded.biome());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user