1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00
breaking-changes/class-relocation

Conflicts:
	src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/FlexCategory.java
	src/main/java/io/github/thebusybiscuit/slimefun4/core/categories/MultiCategory.java
	src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/CheatSheetSlimefunGuide.java
	src/main/java/io/github/thebusybiscuit/slimefun4/implementation/guide/SurvivalSlimefunGuide.java
This commit is contained in:
TheBusyBiscuit 2021-07-28 14:32:27 +02:00
commit 633a736016
19 changed files with 172 additions and 66 deletions

View File

@ -31,15 +31,18 @@
#### Additions
* A couple more items have their wiki page linked ingame now
* Added Orebfuscator compatibility
#### Changes
* Copper wire can no longer be placed down
* Slimefun chains can no longer be placed down
* (API) FlexCategories can now also appear in non-survival Slimefun guides
#### Fixes
* Fixed #3164
* Fixed #3177
* Fixed unbreakable Flint and Steel still being damaged in Ignition Chambers
* Fixed #2677
## Release Candidate 26 (20 Jul 2021)
https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#26

19
pom.xml
View File

@ -90,6 +90,11 @@
<id>walshy-public</id>
<url>https://repo.walshy.dev/public</url>
</repository>
<repository>
<!-- Orebfuscator -->
<id>imprex-repo</id>
<url>https://imprex.ingrim4.me/repository/maven-public/</url>
</repository>
</repositories>
<build>
@ -473,6 +478,20 @@
<version>2.4.6</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<!-- We don't need any of the dependencies -->
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.imprex</groupId>
<artifactId>orebfuscator-api</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<!-- We don't need any of the dependencies -->

View File

@ -111,7 +111,7 @@ public class ItemGroup implements Keyed {
this.addon = addon;
Slimefun.getRegistry().getCategories().add(this);
Slimefun.getRegistry().getAllItemGroups().add(this);
sortCategoriesByTier();
}
@ -145,7 +145,7 @@ public class ItemGroup implements Keyed {
* This refreshes the {@link ItemGroup} order.
*/
private void sortCategoriesByTier() {
List<ItemGroup> categories = Slimefun.getRegistry().getCategories();
List<ItemGroup> categories = Slimefun.getRegistry().getAllItemGroups();
Collections.sort(categories, Comparator.comparingInt(ItemGroup::getTier));
}
@ -316,7 +316,7 @@ public class ItemGroup implements Keyed {
* @return Whether this {@link ItemGroup} has been registered
*/
public boolean isRegistered() {
return Slimefun.getRegistry().getCategories().contains(this);
return Slimefun.getRegistry().getAllItemGroups().contains(this);
}
}

View File

@ -77,12 +77,12 @@ public abstract class FlexItemGroup extends ItemGroup {
}
@Override
public final void add(SlimefunItem item) {
public final void add(@Nonnull SlimefunItem item) {
throw new UnsupportedOperationException("You cannot add items to a FlexCategory!");
}
@Override
public final List<SlimefunItem> getItems() {
public final @Nonnull List<SlimefunItem> getItems() {
throw new UnsupportedOperationException("A FlexCategory has no items!");
}
@ -92,7 +92,7 @@ public abstract class FlexItemGroup extends ItemGroup {
}
@Override
public final void remove(SlimefunItem item) {
public final void remove(@Nonnull SlimefunItem item) {
throw new UnsupportedOperationException("A FlexCategory has no items, so there is nothing remove!");
}

View File

@ -87,7 +87,7 @@ public class LockedItemGroup extends ItemGroup {
}
}
for (ItemGroup category : Slimefun.getRegistry().getCategories()) {
for (ItemGroup category : Slimefun.getRegistry().getAllItemGroups()) {
if (namespacedKeys.remove(category.getKey())) {
addParent(category);
}

View File

@ -65,7 +65,7 @@ public class NestedItemGroup extends FlexItemGroup {
@Override
@ParametersAreNonnullByDefault
public boolean isVisible(Player p, PlayerProfile profile, SlimefunGuideMode mode) {
return true;
return mode == SlimefunGuideMode.SURVIVAL_MODE;
}
@Override

View File

@ -210,14 +210,14 @@ public class Research implements Keyed {
public void unlockFromGuide(SlimefunGuideImplementation guide, Player player, PlayerProfile profile, SlimefunItem sfItem, ItemGroup category, int page) {
if (!Slimefun.getRegistry().getCurrentlyResearchingPlayers().contains(player.getUniqueId())) {
if (profile.hasUnlocked(this)) {
guide.openCategory(profile, category, page);
guide.openItemGroup(profile, category, page);
} else {
PlayerPreResearchEvent event = new PlayerPreResearchEvent(player, this, sfItem);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
if (this.canUnlock(player)) {
guide.unlockItem(player, sfItem, pl -> guide.openCategory(profile, category, page));
guide.unlockItem(player, sfItem, pl -> guide.openItemGroup(profile, category, page));
} else {
Slimefun.getLocalization().sendMessage(player, "messages.not-enough-xp", true);
}

View File

@ -169,8 +169,7 @@ public final class SlimefunRegistry {
*
* @return {@link List} containing every enabled {@link ItemGroup}
*/
@Nonnull
public List<ItemGroup> getCategories() {
public @Nonnull List<ItemGroup> getAllItemGroups() {
return categories;
}
@ -179,8 +178,7 @@ public final class SlimefunRegistry {
*
* @return A {@link List} containing every {@link SlimefunItem}
*/
@Nonnull
public List<SlimefunItem> getAllSlimefunItems() {
public @Nonnull List<SlimefunItem> getAllSlimefunItems() {
return slimefunItems;
}

View File

@ -189,7 +189,7 @@ public class GuideHistory {
if (entry == null) {
guide.openMainMenu(profile, mainMenuPage);
} else if (entry.getIndexedObject() instanceof ItemGroup) {
guide.openCategory(profile, (ItemGroup) entry.getIndexedObject(), entry.getPage());
guide.openItemGroup(profile, (ItemGroup) entry.getIndexedObject(), entry.getPage());
} else if (entry.getIndexedObject() instanceof SlimefunItem) {
guide.displayItem(profile, (SlimefunItem) entry.getIndexedObject(), false);
} else if (entry.getIndexedObject() instanceof ItemStack) {

View File

@ -83,7 +83,7 @@ public final class SlimefunGuide {
@ParametersAreNonnullByDefault
public static void openCategory(PlayerProfile profile, ItemGroup category, SlimefunGuideMode mode, int selectedPage) {
Slimefun.getRegistry().getSlimefunGuide(mode).openCategory(profile, category, selectedPage);
Slimefun.getRegistry().getSlimefunGuide(mode).openItemGroup(profile, category, selectedPage);
}
@ParametersAreNonnullByDefault

View File

@ -52,7 +52,7 @@ public interface SlimefunGuideImplementation {
void openMainMenu(PlayerProfile profile, int page);
@ParametersAreNonnullByDefault
void openCategory(PlayerProfile profile, ItemGroup category, int page);
void openItemGroup(PlayerProfile profile, ItemGroup group, int page);
@ParametersAreNonnullByDefault
void openSearch(PlayerProfile profile, String input, boolean addToHistory);

View File

@ -46,31 +46,29 @@ public class CheatSheetSlimefunGuide extends SurvivalSlimefunGuide {
* The {@link Player} who opened his {@link SlimefunGuide}
* @param profile
* The {@link PlayerProfile} of the {@link Player}
*
* @return a {@link List} of visible {@link ItemGroup} instances
*/
@Nonnull
@Override
protected List<ItemGroup> getVisibleCategories(@Nonnull Player p, @Nonnull PlayerProfile profile) {
List<ItemGroup> categories = new LinkedList<>();
protected List<ItemGroup> getVisibleItemGroups(@Nonnull Player p, @Nonnull PlayerProfile profile) {
List<ItemGroup> groups = new LinkedList<>();
for (ItemGroup category : Slimefun.getRegistry().getCategories()) {
if (!(category instanceof FlexItemGroup)) {
categories.add(category);
for (ItemGroup group : Slimefun.getRegistry().getAllItemGroups()) {
if (!(group instanceof FlexItemGroup) || ((FlexItemGroup) group).isVisible(p, profile, getMode())) {
groups.add(group);
}
}
return categories;
return groups;
}
@Nonnull
@Override
public SlimefunGuideMode getMode() {
public @Nonnull SlimefunGuideMode getMode() {
return SlimefunGuideMode.CHEAT_MODE;
}
@Nonnull
@Override
public ItemStack getItem() {
public @Nonnull ItemStack getItem() {
return item;
}

View File

@ -56,7 +56,7 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHan
/**
* The {@link SurvivalSlimefunGuide} is the standard version of our {@link SlimefunGuide}.
* It uses an {@link Inventory} to display {@link SlimefunGuide} contents.
*
*
* @author TheBusyBiscuit
*
* @see SlimefunGuide
@ -84,18 +84,17 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
*
* @return The {@link Sound}
*/
@Nonnull
public Sound getSound() {
public @Nonnull Sound getSound() {
return sound;
}
@Override
public SlimefunGuideMode getMode() {
public @Nonnull SlimefunGuideMode getMode() {
return SlimefunGuideMode.SURVIVAL_MODE;
}
@Override
public ItemStack getItem() {
public @Nonnull ItemStack getItem() {
return item;
}
@ -110,29 +109,33 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
* The {@link Player} who opened his {@link SlimefunGuide}
* @param profile
* The {@link PlayerProfile} of the {@link Player}
*
* @return a {@link List} of visible {@link ItemGroup} instances
*/
@Nonnull
protected List<ItemGroup> getVisibleCategories(@Nonnull Player p, @Nonnull PlayerProfile profile) {
List<ItemGroup> categories = new LinkedList<>();
protected @Nonnull List<ItemGroup> getVisibleItemGroups(@Nonnull Player p, @Nonnull PlayerProfile profile) {
List<ItemGroup> groups = new LinkedList<>();
for (ItemGroup category : Slimefun.getRegistry().getCategories()) {
for (ItemGroup group : Slimefun.getRegistry().getAllItemGroups()) {
try {
if (!category.isHidden(p) && (!(category instanceof FlexItemGroup) || ((FlexItemGroup) category).isVisible(p, profile, getMode()))) {
categories.add(category);
if (group instanceof FlexItemGroup) {
if (((FlexItemGroup) group).isVisible(p, profile, getMode())) {
groups.add(group);
}
} else if (!group.isHidden(p)) {
groups.add(group);
}
} catch (Exception | LinkageError x) {
SlimefunAddon addon = category.getAddon();
SlimefunAddon addon = group.getAddon();
if (addon != null) {
addon.getLogger().log(Level.SEVERE, x, () -> "Could not display Category: " + category);
addon.getLogger().log(Level.SEVERE, x, () -> "Could not display Category: " + group);
} else {
Slimefun.logger().log(Level.SEVERE, x, () -> "Could not display Category: " + category);
Slimefun.logger().log(Level.SEVERE, x, () -> "Could not display Category: " + group);
}
}
}
return categories;
return groups;
}
@Override
@ -150,7 +153,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
ChestMenu menu = create(p);
List<ItemGroup> categories = getVisibleCategories(p, profile);
List<ItemGroup> categories = getVisibleItemGroups(p, profile);
int index = 9;
createHeader(p, profile, menu);
@ -161,7 +164,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
target++;
ItemGroup category = categories.get(target);
displayCategory(menu, p, profile, category, index);
showItemGroup(menu, p, profile, category, index);
index++;
}
@ -193,11 +196,11 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
menu.open(p);
}
private void displayCategory(ChestMenu menu, Player p, PlayerProfile profile, ItemGroup category, int index) {
if (!(category instanceof LockedItemGroup) || !isSurvivalMode() || ((LockedItemGroup) category).hasUnlocked(p, profile)) {
menu.addItem(index, category.getItem(p));
private void showItemGroup(ChestMenu menu, Player p, PlayerProfile profile, ItemGroup group, int index) {
if (!(group instanceof LockedItemGroup) || !isSurvivalMode() || ((LockedItemGroup) group).hasUnlocked(p, profile)) {
menu.addItem(index, group.getItem(p));
menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
openCategory(profile, category, 1);
openItemGroup(profile, group, 1);
return false;
});
} else {
@ -210,17 +213,18 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
lore.add("");
for (ItemGroup parent : ((LockedItemGroup) category).getParents()) {
for (ItemGroup parent : ((LockedItemGroup) group).getParents()) {
lore.add(parent.getItem(p).getItemMeta().getDisplayName());
}
menu.addItem(index, new CustomItemStack(Material.BARRIER, "&4" + Slimefun.getLocalization().getMessage(p, "guide.locked") + " &7- &f" + category.getItem(p).getItemMeta().getDisplayName(), lore.toArray(new String[0])));
menu.addItem(index, new CustomItemStack(Material.BARRIER, "&4" + Slimefun.getLocalization().getMessage(p, "guide.locked") + " &7- &f" + group.getItem(p).getItemMeta().getDisplayName(), lore.toArray(new String[0])));
menu.addMenuClickHandler(index, ChestMenuUtils.getEmptyClickHandler());
}
}
@Override
public void openCategory(PlayerProfile profile, ItemGroup category, int page) {
@ParametersAreNonnullByDefault
public void openItemGroup(PlayerProfile profile, ItemGroup category, int page) {
Player p = profile.getPlayer();
if (p == null) {
@ -248,7 +252,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
int next = page - 1;
if (next != page && next > 0) {
openCategory(profile, category, next);
openItemGroup(profile, category, next);
}
return false;
@ -259,7 +263,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
int next = page + 1;
if (next != page && next <= pages) {
openCategory(profile, category, next);
openItemGroup(profile, category, next);
}
return false;
@ -384,6 +388,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
@Override
@ParametersAreNonnullByDefault
public void displayItem(PlayerProfile profile, ItemStack item, int index, boolean addToHistory) {
Player p = profile.getPlayer();
@ -488,6 +493,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
@Override
@ParametersAreNonnullByDefault
public void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory) {
Player p = profile.getPlayer();
@ -621,9 +627,8 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
}
@Nonnull
@ParametersAreNonnullByDefault
private static ItemStack getDisplayItem(Player p, boolean isSlimefunRecipe, ItemStack item) {
private static @Nonnull ItemStack getDisplayItem(Player p, boolean isSlimefunRecipe, ItemStack item) {
if (isSlimefunRecipe) {
SlimefunItem slimefunItem = SlimefunItem.getByItem(item);
@ -724,8 +729,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
return Slimefun.getPermissionsService().hasPermission(p, item);
}
@Nonnull
private ChestMenu create(@Nonnull Player p) {
private @Nonnull ChestMenu create(@Nonnull Player p) {
ChestMenu menu = new ChestMenu(Slimefun.getLocalization().getMessage(p, "guide.title.main"));
menu.setEmptySlotsClickable(false);

View File

@ -55,6 +55,7 @@ public class IntegrationsManager {
private boolean isMcMMOInstalled = false;
private boolean isClearLagInstalled = false;
private boolean isItemsAdderInstalled = false;
private boolean isOrebfuscatorInstalled = false;
// Addon support
private boolean isChestTerminalInstalled = false;
@ -141,6 +142,12 @@ public class IntegrationsManager {
Slimefun.logger().log(Level.WARNING, x, () -> "Failed to load Protection plugin integrations for Slimefun v" + Slimefun.getVersion());
}
// Orebfuscator Integration
load("Orebfuscator", integration -> {
new OrebfuscatorIntegration(plugin).register();
isOrebfuscatorInstalled = true;
});
isChestTerminalInstalled = isAddonInstalled("ChestTerminal");
}
@ -282,4 +289,7 @@ public class IntegrationsManager {
return isChestTerminalInstalled;
}
public boolean isOrebfuscatorInstalled() {
return isOrebfuscatorInstalled;
}
}

View File

@ -0,0 +1,64 @@
package io.github.thebusybiscuit.slimefun4.integrations;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Nonnull;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import io.github.thebusybiscuit.slimefun4.api.events.BlockPlacerPlaceEvent;
import io.github.thebusybiscuit.slimefun4.api.events.ExplosiveToolBreakBlocksEvent;
import io.github.thebusybiscuit.slimefun4.api.events.ReactorExplodeEvent;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
import net.imprex.orebfuscator.api.OrebfuscatorService;
/**
*
* This handles block breaks with orebfuscator
*
* @author NgLoader
*
*/
class OrebfuscatorIntegration implements Listener {
private final Slimefun plugin;
private OrebfuscatorService service;
OrebfuscatorIntegration(@Nonnull Slimefun plugin) {
this.plugin = plugin;
}
/**
* Init orebfuscation service and register listener
*/
public void register() {
this.service = Bukkit.getServer().getServicesManager().getRegistration(OrebfuscatorService.class).getProvider();
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlacerPlace(BlockPlacerPlaceEvent event) {
this.service.deobfuscate(Arrays.asList(event.getBlock(), event.getBlockPlacer()));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onExplosiveToolBreakBlocks(ExplosiveToolBreakBlocksEvent event) {
Set<Block> blocks = new HashSet<>();
blocks.addAll(event.getAdditionalBlocks());
blocks.add(event.getPrimaryBlock());
this.service.deobfuscate(blocks);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onReactorExplode(ReactorExplodeEvent event) {
this.service.deobfuscate(Arrays.asList(event.getLocation().getBlock()));
}
}

View File

@ -21,6 +21,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
@ -316,13 +317,21 @@ public final class SlimefunUtils {
return false;
} else if (itemMeta.hasDisplayName() && sfitemMeta.hasDisplayName() && !itemMeta.getDisplayName().equals(sfitemMeta.getDisplayName())) {
return false;
} else if (!checkLore) {
return true;
} else if (itemMeta.hasLore() && sfitemMeta.hasLore()) {
return equalsLore(itemMeta.getLore(), sfitemMeta.getLore());
} else {
return !itemMeta.hasLore() && !sfitemMeta.hasLore();
} else if (checkLore) {
boolean hasItemMetaLore = itemMeta.hasLore();
boolean hasSfItemMetaLore = sfitemMeta.hasLore();
if (hasItemMetaLore && hasSfItemMetaLore && !equalsLore(itemMeta.getLore(), sfitemMeta.getLore())) {
return false;
} else if (hasItemMetaLore != hasSfItemMetaLore) {
return false;
}
}
if (itemMeta instanceof PotionMeta && sfitemMeta instanceof PotionMeta) {
return ((PotionMeta) itemMeta).getBasePotionData().equals(((PotionMeta) sfitemMeta).getBasePotionData());
}
return true;
}
/**

View File

@ -18,6 +18,7 @@ softdepend:
- ClearLag
- mcMMO
- ItemsAdder
- Orebfuscator
# We hook into these plugins too, but they depend on Slimefun.
loadBefore:

View File

@ -66,7 +66,7 @@ class TestGuideOpening {
SlimefunGuideImplementation guide = Mockito.mock(SlimefunGuideImplementation.class);
PlayerProfile profile = prepare(guide, history -> history.add(category, 1));
Mockito.verify(guide).openCategory(profile, category, 1);
Mockito.verify(guide).openItemGroup(profile, category, 1);
}
@Test

View File

@ -77,7 +77,7 @@ class TestItemSetup {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/languages/en/categories.yml"), StandardCharsets.UTF_8))) {
FileConfiguration config = YamlConfiguration.loadConfiguration(reader);
for (ItemGroup category : Slimefun.getRegistry().getCategories()) {
for (ItemGroup category : Slimefun.getRegistry().getAllItemGroups()) {
String path = category.getKey().getNamespace() + '.' + category.getKey().getKey();
Assertions.assertTrue(config.contains(path));
}