From 1456245ee06fcbfccf67b8c9c3d91a8dcd12ea47 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 20 Jun 2020 11:56:29 +0200 Subject: [PATCH] Added a toggle for backwards compatibility --- CHANGELOG.md | 1 + .../slimefun4/core/SlimefunRegistry.java | 27 +++++++++++++++++++ .../metrics/CompatibilityModeChart.java | 16 +++++++++++ .../core/services/metrics/MetricsService.java | 1 + .../implementation/items/androids/Script.java | 6 ++--- .../Objects/SlimefunItem/SlimefunItem.java | 19 +++++++------ src/main/resources/config.yml | 1 + .../testing/mocks/MockSlimefunItem.java | 3 ++- .../items/TestSlimefunItemRegistration.java | 17 +++++++++--- .../tests/utils/TestSoulboundItem.java | 3 ++- 10 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java diff --git a/CHANGELOG.md b/CHANGELOG.md index e92d88846..1f6e9bc78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ #### Additions * Added a starting sound for the Ancient Altar +* Added config option to disable backwards compatibility and improve performance #### Changes * Coolant Cells now last twice as long diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java index 39fffb2c5..bfcdbb596 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java @@ -58,6 +58,7 @@ public class SlimefunRegistry { private final List researchRanks = new ArrayList<>(); private final Set researchingPlayers = new HashSet<>(); + private boolean backwardsCompatibility; private boolean automaticallyLoadItems; private boolean enableResearches; private boolean freeCreativeResearches; @@ -99,6 +100,7 @@ public class SlimefunRegistry { researchRanks.addAll(cfg.getStringList("research-ranks")); + backwardsCompatibility = cfg.getBoolean("options.backwards-compatibility"); freeCreativeResearches = cfg.getBoolean("researches.free-in-creative-mode"); researchFireworks = cfg.getBoolean("researches.enable-fireworks"); } @@ -115,6 +117,21 @@ public class SlimefunRegistry { return automaticallyLoadItems; } + /** + * This method returns whether backwards-compatibility is enabled. + * Backwards compatibility allows Slimefun to recognize items from older versions but comes + * at a huge performance cost. + * + * @return Whether backwards compatibility is enabled + */ + public boolean isBackwardsCompatible() { + return backwardsCompatibility; + } + + public void setBackwardsCompatible(boolean compatible) { + backwardsCompatibility = compatible; + } + public void setAutoLoadingMode(boolean mode) { automaticallyLoadItems = mode; } @@ -123,10 +140,20 @@ public class SlimefunRegistry { return categories; } + /** + * This {@link List} contains every {@link SlimefunItem}, even disabled items. + * + * @return A {@link List} containing every {@link SlimefunItem} + */ public List getAllSlimefunItems() { return slimefunItems; } + /** + * This {@link List} contains every enabled {@link SlimefunItem}. + * + * @return A {@link List} containing every enabled {@link SlimefunItem} + */ public List getEnabledSlimefunItems() { return enabledItems; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java new file mode 100644 index 000000000..9d45c6e9b --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/CompatibilityModeChart.java @@ -0,0 +1,16 @@ +package io.github.thebusybiscuit.slimefun4.core.services.metrics; + +import org.bstats.bukkit.Metrics.SimplePie; + +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + +class CompatibilityModeChart extends SimplePie { + + CompatibilityModeChart() { + super("compatibility_mode", () -> { + boolean enabled = SlimefunPlugin.getRegistry().isBackwardsCompatible(); + return enabled ? "enabled" : "disabled"; + }); + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java index 3ce65bd36..c338a6735 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/metrics/MetricsService.java @@ -49,6 +49,7 @@ public class MetricsService { metrics.addCustomChart(new AddonsChart()); metrics.addCustomChart(new CommandChart()); metrics.addCustomChart(new ServerSizeChart()); + metrics.addCustomChart(new CompatibilityModeChart()); } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Script.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Script.java index e81a25df7..9aac880dc 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Script.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/androids/Script.java @@ -31,15 +31,15 @@ public final class Script { this.config = config; this.name = config.getString("name"); this.code = config.getString("code"); - String author = config.getString("author"); + String uuid = config.getString("author"); Validate.notNull(name); Validate.notNull(code); - Validate.notNull(author); + Validate.notNull(uuid); Validate.notNull(config.getStringList("rating.positive")); Validate.notNull(config.getStringList("rating.negative")); - OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(author)); + OfflinePlayer player = Bukkit.getOfflinePlayer(UUID.fromString(uuid)); this.author = player.getName() != null ? player.getName() : config.getString("author_name"); } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 2a6d3121b..b5ea85b6e 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -807,15 +807,18 @@ public class SlimefunItem implements Placeable { } } - // Quite expensive performance-wise - // But necessary for supporting legacy items - for (SlimefunItem sfi : SlimefunPlugin.getRegistry().getAllSlimefunItems()) { - if (sfi.isItem(wrapper)) { - // If we have to loop all items for the given item, then at least - // set the id via PersistenDataAPI for future performance boosts - SlimefunPlugin.getItemDataService().setItemData(item, sfi.getID()); + // Backwards compatibility + if (SlimefunPlugin.getMinecraftVersion().isBefore(MinecraftVersion.MINECRAFT_1_14) || SlimefunPlugin.getRegistry().isBackwardsCompatible()) { + // Quite expensive performance-wise + // But necessary for supporting legacy items + for (SlimefunItem sfi : SlimefunPlugin.getRegistry().getAllSlimefunItems()) { + if (sfi.isItem(wrapper)) { + // If we have to loop all items for the given item, then at least + // set the id via PersistenDataAPI for future performance boosts + SlimefunPlugin.getItemDataService().setItemData(item, sfi.getID()); - return sfi; + return sfi; + } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cb8f1bf2c..3ff862a3d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -5,6 +5,7 @@ options: # You can download the latest stable build here: https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/ auto-update: true + backwards-compatibility: true chat-prefix: '&a&lSlimefun 4 &7>' armor-update-interval: 10 enable-armor-effects: true diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/mocks/MockSlimefunItem.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/mocks/MockSlimefunItem.java index 596d8f63e..158098d85 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/mocks/MockSlimefunItem.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/mocks/MockSlimefunItem.java @@ -5,11 +5,12 @@ import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class MockSlimefunItem extends SlimefunItem { public MockSlimefunItem(Category category, ItemStack item, String id) { - super(category, item, id, RecipeType.NULL, new ItemStack[9]); + super(category, new SlimefunItemStack(id, item), RecipeType.NULL, new ItemStack[9]); } } diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestSlimefunItemRegistration.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestSlimefunItemRegistration.java index 63bb88834..43c6acb8f 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestSlimefunItemRegistration.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/items/TestSlimefunItemRegistration.java @@ -9,6 +9,8 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import be.seeseemelk.mockbukkit.MockBukkit; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; @@ -147,10 +149,12 @@ public class TestSlimefunItemRegistration { Assertions.assertThrows(IllegalArgumentException.class, () -> item.setRecipeType(null)); } - @Test - public void testIsItem() { + @ParameterizedTest + @ValueSource(booleans = { true, false }) + public void testIsItem(boolean compatibility) { CustomItem item = new CustomItem(Material.BEACON, "&cItem Test"); - SlimefunItem sfItem = TestUtilities.mockSlimefunItem(plugin, "IS_ITEM_TEST", item); + String id = "IS_ITEM_TEST" + (compatibility ? "_COMPATIBLE" : ""); + SlimefunItem sfItem = TestUtilities.mockSlimefunItem(plugin, id, item); sfItem.register(plugin); Assertions.assertTrue(sfItem.isItem(sfItem.getItem())); @@ -161,7 +165,12 @@ public class TestSlimefunItemRegistration { Assertions.assertFalse(sfItem.isItem(new ItemStack(Material.BEACON))); Assertions.assertFalse(sfItem.isItem(new CustomItem(Material.REDSTONE, "&cTest"))); - Assertions.assertEquals(sfItem, SlimefunItem.getByItem(item)); + if (compatibility) { + SlimefunPlugin.getRegistry().setBackwardsCompatible(true); + Assertions.assertEquals(sfItem, SlimefunItem.getByItem(item)); + SlimefunPlugin.getRegistry().setBackwardsCompatible(false); + } + Assertions.assertEquals(sfItem, SlimefunItem.getByItem(new SlimefunItemStack(sfItem.getID(), item))); } diff --git a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestSoulboundItem.java b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestSoulboundItem.java index 4de533370..09683c4db 100644 --- a/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestSoulboundItem.java +++ b/src/test/java/io/github/thebusybiscuit/slimefun4/testing/tests/utils/TestSoulboundItem.java @@ -16,6 +16,7 @@ import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class TestSoulboundItem { @@ -84,7 +85,7 @@ public class TestSoulboundItem { private class SoulboundMock extends SlimefunItem implements Soulbound { public SoulboundMock(Category category) { - super(category, new CustomItem(Material.REDSTONE, "&4Almighty Redstone"), "MOCK_SOULBOUND", RecipeType.NULL, new ItemStack[9]); + super(category, new SlimefunItemStack("MOCK_SOULBOUND", Material.REDSTONE, "&4Almighty Redstone"), RecipeType.NULL, new ItemStack[9]); } }