diff --git a/src/main/java/net/tfminecraft/magic/listener/ArtifactListener.java b/src/main/java/net/tfminecraft/magic/listener/ArtifactListener.java index 20eaa28..a8dec00 100644 --- a/src/main/java/net/tfminecraft/magic/listener/ArtifactListener.java +++ b/src/main/java/net/tfminecraft/magic/listener/ArtifactListener.java @@ -73,6 +73,22 @@ private static void applyCare(ItemStack stack, Inventory inventory) { ArtifactCareStore.Persist.ALWAYS); } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onFurnitureSlotAddCare(FurnitureSlotItemAddEvent event) { + if (!ArtifactDisplayIndex.isDisplayFurniture(event.getFurniture())) { + return; + } + ItemStack item = event.getItem(); + if (ArtifactIds.hasKey(item)) { + ArtifactCareStore.apply( + item, + false, + System.currentTimeMillis(), + ArtifactCareStore.Persist.ALWAYS); + event.setItem(item); + } + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onFurnitureSlotAdd(FurnitureSlotItemAddEvent event) { Furniture furniture = event.getFurniture(); @@ -104,7 +120,15 @@ public void onFurnitureSlotTake(FurnitureSlotItemTakeEvent event) { ShrineChargeService.stop(event.getFurniture().getEntityId(), event.getSlot().getId()); SacrificeRiteService.stop(event.getFurniture().getEntityId(), event.getSlot().getId()); } - event.setItem(VesselLore.updateItem(event.getItem())); + ItemStack item = event.getItem(); + if (ArtifactDisplayIndex.isDisplayFurniture(event.getFurniture()) && ArtifactIds.hasKey(item)) { + ArtifactCareStore.apply( + item, + true, + System.currentTimeMillis(), + ArtifactCareStore.Persist.ALWAYS); + } + event.setItem(VesselLore.updateItem(item)); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/test/java/net/tfminecraft/magic/ArtifactListenerTest.java b/src/test/java/net/tfminecraft/magic/ArtifactListenerTest.java index a8d03b9..8a25521 100644 --- a/src/test/java/net/tfminecraft/magic/ArtifactListenerTest.java +++ b/src/test/java/net/tfminecraft/magic/ArtifactListenerTest.java @@ -168,6 +168,60 @@ void inventoryCareRoutesClickedCursorHotbarAndDraggedSlots() { } } + @Test + void furnitureSlotTransitionsTickArtifactCareAcrossDisplayCases() { + var listener = new ArtifactListener(); + var furniture = mock(Furniture.class); + when(furniture.getEntityId()).thenReturn(UUID.randomUUID()); + var add = mock(FurnitureSlotItemAddEvent.class); + var take = mock(FurnitureSlotItemTakeEvent.class); + var plain = new ItemStack(Material.STONE); + var artifact = new ItemStack(Material.STONE); + ArtifactIds.writeNew(artifact); + when(add.getFurniture()).thenReturn(furniture); + when(add.getItem()).thenReturn(plain); + when(take.getFurniture()).thenReturn(furniture); + when(take.getItem()).thenReturn(artifact); + try (var display = mockStatic(ArtifactDisplayIndex.class); + var care = mockStatic(ArtifactCareStore.class); + var meditation = mockStatic(MeditationService.class); + var shrine = mockStatic(ShrineChargeService.class); + var sacrifice = mockStatic(SacrificeRiteService.class); + var lore = mockStatic(VesselLore.class)) { + listener.onFurnitureSlotAddCare(add); + display.when(() -> ArtifactDisplayIndex.isDisplayFurniture(furniture)).thenReturn(true); + listener.onFurnitureSlotAddCare(add); + verify(add, never()).setItem(plain); + + when(add.getItem()).thenReturn(artifact); + listener.onFurnitureSlotAddCare(add); + verify(add).setItem(artifact); + care.verify( + () -> + ArtifactCareStore.apply( + eq(artifact), + eq(false), + anyLong(), + eq(ArtifactCareStore.Persist.ALWAYS))); + + lore.when(() -> VesselLore.updateItem(artifact)).thenReturn(artifact); + listener.onFurnitureSlotTake(take); + care.verify( + () -> + ArtifactCareStore.apply( + eq(artifact), + eq(true), + anyLong(), + eq(ArtifactCareStore.Persist.ALWAYS))); + verify(take).setItem(artifact); + + display.when(() -> ArtifactDisplayIndex.isDisplayFurniture(furniture)).thenReturn(false); + listener.onFurnitureSlotAddCare(add); + listener.onFurnitureSlotTake(take); + care.verifyNoMoreInteractions(); + } + } + @Test void sacrificeChatOnlyStartsMatchingRpWordsAndHonorsVisibility() { var listener = new SacrificeListener();