fix(pocket-base): accept recovery compass metadata
This commit is contained in:
@@ -165,6 +165,11 @@ description: Chronological record of material decisions affecting the Spigot Bas
|
|||||||
- Restored Back buttons from nested native dialog screens to the main Base Settings dashboard.
|
- Restored Back buttons from nested native dialog screens to the main Base Settings dashboard.
|
||||||
- Verified 149 tests and the Java 25 plugin artifact with `./gradlew clean check jar`.
|
- Verified 149 tests and the Java 25 plugin artifact with `./gradlew clean check jar`.
|
||||||
|
|
||||||
|
## 2026-08-29 — Recovery Compass metadata compatibility
|
||||||
|
|
||||||
|
- Accepted Purpur's valid generic item metadata when creating the Pocket Base Keystone instead of requiring the legacy Compass-specific metadata subtype.
|
||||||
|
- Added regression coverage and verified 158 tests and the Java 25 plugin artifact with `./gradlew clean check jar`.
|
||||||
|
|
||||||
## 2026-08-29 — Pocket Base Keystone travel
|
## 2026-08-29 — Pocket Base Keystone travel
|
||||||
|
|
||||||
- Added a reusable Recovery Compass keystone recipe with an Ender Pearl center, cardinal Netherite Ingots, and Obsidian corners.
|
- Added a reusable Recovery Compass keystone recipe with an Ender Pearl center, cardinal Netherite Ingots, and Obsidian corners.
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ As a **Pocket Base owner**, I want to craft a reusable keystone that instantly t
|
|||||||
## Acceptance criteria
|
## Acceptance criteria
|
||||||
|
|
||||||
- [x] The Pocket Base Keystone is a distinct Recovery Compass identified by persistent item metadata rather than its display name alone.
|
- [x] The Pocket Base Keystone is a distinct Recovery Compass identified by persistent item metadata rather than its display name alone.
|
||||||
|
- [x] Keystone creation accepts the valid generic item metadata supplied for Recovery Compasses by the supported Purpur runtime.
|
||||||
- [x] Its shaped recipe places an Ender Pearl in the center, Netherite Ingots on the four cardinal slots, and Obsidian in the four corners.
|
- [x] Its shaped recipe places an Ender Pearl in the center, Netherite Ingots on the four cardinal slots, and Obsidian in the four corners.
|
||||||
- [x] Only a player who has unlocked Pocket Base I can complete the recipe or use a keystone.
|
- [x] Only a player who has unlocked Pocket Base I can complete the recipe or use a keystone.
|
||||||
- [x] Right-clicking a keystone outside a Pocket Base instantly teleports the player to their own Pocket Base arrival point.
|
- [x] Right-clicking a keystone outside a Pocket Base instantly teleports the player to their own Pocket Base arrival point.
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import org.bukkit.event.player.PlayerTeleportEvent;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.ShapedRecipe;
|
import org.bukkit.inventory.ShapedRecipe;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.inventory.meta.CompassMeta;
|
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
import org.bukkit.persistence.PersistentDataType;
|
||||||
|
|
||||||
final class PocketBaseKeystoneService implements Listener {
|
final class PocketBaseKeystoneService implements Listener {
|
||||||
@@ -201,8 +200,13 @@ final class PocketBaseKeystoneService implements Listener {
|
|||||||
|
|
||||||
static ItemStack createKeystone(NamespacedKey markerKey) {
|
static ItemStack createKeystone(NamespacedKey markerKey) {
|
||||||
ItemStack item = new ItemStack(Material.RECOVERY_COMPASS);
|
ItemStack item = new ItemStack(Material.RECOVERY_COMPASS);
|
||||||
|
decorateKeystone(item, markerKey);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void decorateKeystone(ItemStack item, NamespacedKey markerKey) {
|
||||||
ItemMeta metadata = item.getItemMeta();
|
ItemMeta metadata = item.getItemMeta();
|
||||||
if (!(metadata instanceof CompassMeta)) {
|
if (metadata == null) {
|
||||||
throw new IllegalStateException("Recovery Compass metadata is unavailable");
|
throw new IllegalStateException("Recovery Compass metadata is unavailable");
|
||||||
}
|
}
|
||||||
metadata.displayName(Component.text(
|
metadata.displayName(Component.text(
|
||||||
@@ -218,7 +222,6 @@ final class PocketBaseKeystoneService implements Listener {
|
|||||||
markerKey, PersistentDataType.BYTE, (byte) 1
|
markerKey, PersistentDataType.BYTE, (byte) 1
|
||||||
);
|
);
|
||||||
item.setItemMeta(metadata);
|
item.setItemMeta(metadata);
|
||||||
return item;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static RecipeSpec recipeSpecification() {
|
static RecipeSpec recipeSpecification() {
|
||||||
|
|||||||
@@ -34,6 +34,22 @@ import org.bukkit.persistence.PersistentDataType;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
final class PocketBaseKeystoneServiceTest {
|
final class PocketBaseKeystoneServiceTest {
|
||||||
|
@Test
|
||||||
|
void createsKeystoneWithGenericRecoveryCompassMetadata() {
|
||||||
|
NamespacedKey key = NamespacedKey.minecraft("pocket_base_keystone");
|
||||||
|
ItemStack item = mock(ItemStack.class);
|
||||||
|
ItemMeta genericMetadata = mock(ItemMeta.class);
|
||||||
|
PersistentDataContainer data = mock(PersistentDataContainer.class);
|
||||||
|
|
||||||
|
when(item.getItemMeta()).thenReturn(genericMetadata);
|
||||||
|
when(genericMetadata.getPersistentDataContainer()).thenReturn(data);
|
||||||
|
|
||||||
|
PocketBaseKeystoneService.decorateKeystone(item, key);
|
||||||
|
|
||||||
|
verify(data).set(key, PersistentDataType.BYTE, (byte) 1);
|
||||||
|
verify(item).setItemMeta(genericMetadata);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void recipeUsesNetheriteOnCardinalsAndObsidianInCorners() {
|
void recipeUsesNetheriteOnCardinalsAndObsidianInCorners() {
|
||||||
PocketBaseKeystoneService.RecipeSpec recipe =
|
PocketBaseKeystoneService.RecipeSpec recipe =
|
||||||
|
|||||||
Reference in New Issue
Block a user