diff --git a/src/main/java/net/tfminecraft/research/Research.java b/src/main/java/net/tfminecraft/research/Research.java index 3f7333f..1d69ddd 100644 --- a/src/main/java/net/tfminecraft/research/Research.java +++ b/src/main/java/net/tfminecraft/research/Research.java @@ -30,9 +30,17 @@ public class Research extends JavaPlugin { private final CommandManager commandManager = new CommandManager(); private final PlayerManager playerManager = new PlayerManager(); private final ResearchManager researchManager = new ResearchManager(playerManager); + private boolean started; @Override public void onEnable() { + try { + net.tfminecraft.tlibs.character.Characters.available(); + } catch (LinkageError error) { + getLogger().severe("Research requires TLibs 2.3.0 or newer. Update TLibs and restart the server."); + getServer().getPluginManager().disablePlugin(this); + return; + } plugin = this; createFolders(); createConfigs(); @@ -43,12 +51,15 @@ public void onEnable() { getCommand("research").setTabCompleter(commandManager); getServer().getPluginManager().registerEvents(researchManager, this); researchManager.start(); + started = true; getLogger().info("Research enabled."); } @Override public void onDisable() { - researchManager.unloadAll(); + if (started) { + researchManager.unloadAll(); + } getLogger().info("Research disabled."); } diff --git a/src/main/java/net/tfminecraft/research/manager/ResearchManager.java b/src/main/java/net/tfminecraft/research/manager/ResearchManager.java index 8e76c88..f0e3bf3 100644 --- a/src/main/java/net/tfminecraft/research/manager/ResearchManager.java +++ b/src/main/java/net/tfminecraft/research/manager/ResearchManager.java @@ -383,10 +383,6 @@ private void confirmExperiment(Player player, ResearchStation station, Inventory return; } - if (!((StationMenuHolder) inventory.getHolder()).isCurrent(player)) { - return; - } - project.markTested(match.getItemRef()); boolean primaryScored = applyExperimentAspect(player, project, outputDef, match.getPrimaryAspect(), ExternalModifiers.adjustExperimentPoints(player, match.getPrimaryPoints())); diff --git a/src/test/java/net/tfminecraft/research/ResearchLifecycleTest.java b/src/test/java/net/tfminecraft/research/ResearchLifecycleTest.java index fb1cadc..49ab57e 100644 --- a/src/test/java/net/tfminecraft/research/ResearchLifecycleTest.java +++ b/src/test/java/net/tfminecraft/research/ResearchLifecycleTest.java @@ -4,6 +4,7 @@ import net.tfminecraft.research.loader.ConfigLoader; import net.tfminecraft.research.manager.*; import net.tfminecraft.research.util.ItemRef; +import net.tfminecraft.tlibs.character.Characters; import org.bukkit.command.*; import org.bukkit.plugin.java.JavaPlugin; import org.junit.jupiter.api.*; @@ -47,6 +48,17 @@ class ResearchLifecycleTest { assertTrue(Files.readString(plugin.getDataFolder().toPath().resolve("config.yml")).contains("external_modifiers")); plugin.onDisable(); verify(plugin.getResearchManager()).unloadAll(); } + @Test void olderTLibsDisablesResearchBeforeItRegistersAnything() { + try (MockedStatic characters = mockStatic(Characters.class)) { + characters.when(Characters::available).thenThrow(new NoClassDefFoundError("CharacterSession")); + Research plugin = MockBukkit.load(Research.class); + assertFalse(plugin.isEnabled()); + ResearchManager manager = managers.constructed().getFirst(); + verify(manager, never()).start(); verify(manager, never()).unloadAll(); + assertFalse(Files.exists(plugin.getDataFolder().toPath().resolve("config.yml"))); + assertFalse(plugin.getCommand("research").getExecutor() instanceof CommandManager); + } + } @Test void firstInstallCreatesTheDataRootWhenItDoesNotExist() throws Exception { Research plugin = MockBukkit.load(Research.class); Path fresh = plugin.getDataFolder().toPath(); diff --git a/src/test/java/net/tfminecraft/research/manager/ResearchManagerTest.java b/src/test/java/net/tfminecraft/research/manager/ResearchManagerTest.java index 1f60c5a..377cac2 100644 --- a/src/test/java/net/tfminecraft/research/manager/ResearchManagerTest.java +++ b/src/test/java/net/tfminecraft/research/manager/ResearchManagerTest.java @@ -1131,20 +1131,15 @@ void overflowRefundCannotDuplicateWhenTheDropSwitchesCharacters(boolean confirms } @Test - void endingSessionDuringFocusSpendCannotProgressOrRefundTheClosedExperimentAgain() { - ItemStack experiment = prepareExperiment("fire", null, Map.of("fire", 10)); - when(points.trySpendMentalPoints(player, 1)).thenAnswer(call -> { - currentSession.set(null); - manager.onInventoryClose(new InventoryCloseEvent(view)); - return true; - }); + void endedSessionCannotSpendFocusThroughItsOpenMenu() { + prepareExperiment("fire", null, Map.of("fire", 10)); + currentSession.set(null); confirm(); + verify(points, never()).trySpendMentalPoints(any(), anyInt()); assertFalse(project.hasTestedItem("vanilla.COAL")); assertEquals(0, project.getAspectPoints("fire")); - verify(bottom, times(1)).addItem(experiment); - assertNull(topItems.get(GridLayout.SLOT_EXPERIMENT)); store.verify(() -> StationStore.saveStation(any()), never()); }