Fixes protection for scooping tropical fish.

https://github.com/BentoBoxWorld/bentobox/issues/349

Also added pagination to protection flags and localized alphabetical
sorting of the flags.

Also added defensive code should a flag enum be removed but it is still
in the island database. In this case it will just be ignored and at the
next database object save it will disappear.
This commit is contained in:
tastybento 2018-11-20 16:35:03 -08:00
parent 98264f03d0
commit ff2983629d
6 changed files with 67 additions and 9 deletions

View File

@ -28,7 +28,7 @@ public class IslandSettingsCommand extends CompositeCommand {
public boolean execute(User user, String label, List<String> args) { public boolean execute(User user, String label, List<String> args) {
// Settings are only shown if you are in the right world // Settings are only shown if you are in the right world
if (Util.getWorld(user.getWorld()).equals(getWorld())) { if (Util.getWorld(user.getWorld()).equals(getWorld())) {
SettingsPanel.openPanel(getPlugin(), user, Flag.Type.PROTECTION, getWorld()); SettingsPanel.openPanel(getPlugin(), user, Flag.Type.PROTECTION, getWorld(), 0);
return true; return true;
} else { } else {
user.sendMessage("general.errors.wrong-world"); user.sendMessage("general.errors.wrong-world");

View File

@ -29,11 +29,17 @@ public class FlagSerializer implements AdapterInterface<Map<Flag, Integer>, Map<
if (object instanceof MemorySection) { if (object instanceof MemorySection) {
MemorySection section = (MemorySection) object; MemorySection section = (MemorySection) object;
for (String key : section.getKeys(false)) { for (String key : section.getKeys(false)) {
result.put(BentoBox.getInstance().getFlagsManager().getFlagByID(key), section.getInt(key)); Flag flag = BentoBox.getInstance().getFlagsManager().getFlagByID(key);
if (flag != null) {
result.put(flag, section.getInt(key));
}
} }
} else { } else {
for (Entry<String, Integer> en : ((Map<String, Integer>)object).entrySet()) { for (Entry<String, Integer> en : ((Map<String, Integer>)object).entrySet()) {
result.put(BentoBox.getInstance().getFlagsManager().getFlagByID(en.getKey()), en.getValue()); Flag flag = BentoBox.getInstance().getFlagsManager().getFlagByID(en.getKey());
if (flag != null) {
result.put(flag, en.getValue());
}
} }
} }
return result; return result;
@ -48,7 +54,9 @@ public class FlagSerializer implements AdapterInterface<Map<Flag, Integer>, Map<
} }
Map<Flag, Integer> flags = (Map<Flag, Integer>)object; Map<Flag, Integer> flags = (Map<Flag, Integer>)object;
for (Entry<Flag, Integer> en: flags.entrySet()) { for (Entry<Flag, Integer> en: flags.entrySet()) {
result.put(en.getKey().getID(), en.getValue()); if (en != null && en.getKey() != null) {
result.put(en.getKey().getID(), en.getValue());
}
} }
return result; return result;
} }

View File

@ -1,11 +1,14 @@
package world.bentobox.bentobox.listeners.flags; package world.bentobox.bentobox.listeners.flags;
import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.TropicalFish;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import world.bentobox.bentobox.api.flags.FlagListener; import world.bentobox.bentobox.api.flags.FlagListener;
import world.bentobox.bentobox.lists.Flags; import world.bentobox.bentobox.lists.Flags;
@ -37,6 +40,7 @@ public class BucketListener extends FlagListener {
*/ */
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onBucketFill(final PlayerBucketFillEvent e) { public void onBucketFill(final PlayerBucketFillEvent e) {
Bukkit.getLogger().info("DEBUG: " + e.getEventName());
// Check filling of various liquids // Check filling of various liquids
if (e.getItemStack().getType().equals(Material.LAVA_BUCKET) && (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA))) { if (e.getItemStack().getType().equals(Material.LAVA_BUCKET) && (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA))) {
return; return;
@ -51,4 +55,12 @@ public class BucketListener extends FlagListener {
checkIsland(e, e.getBlockClicked().getLocation(), Flags.BUCKET); checkIsland(e, e.getBlockClicked().getLocation(), Flags.BUCKET);
} }
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onTropicalFishSc(final PlayerInteractEntityEvent e) {
if (e.getRightClicked() instanceof TropicalFish && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.WATER_BUCKET) && (!checkIsland(e, e.getRightClicked().getLocation(), Flags.FISH_SCOOPING))) {
return;
}
}
} }

View File

@ -91,6 +91,7 @@ public class Flags {
public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build(); public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build();
public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build(); public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build();
public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build();
public static final Flag FISH_SCOOPING = new FlagBuilder().id("FISH_SCOOPING").allowedByDefault(false).icon(Material.TROPICAL_FISH_BUCKET).build();
// Chorus Fruit and Enderpearls // Chorus Fruit and Enderpearls
public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener()).build(); public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener()).build();

View File

@ -1,6 +1,8 @@
package world.bentobox.bentobox.panels; package world.bentobox.bentobox.panels;
import java.util.Comparator; import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@ -29,7 +31,7 @@ public class SettingsPanel {
* @param flagType - initial view * @param flagType - initial view
* @param world - world * @param world - world
*/ */
public static void openPanel(BentoBox plugin, User user, Flag.Type flagType, World world) { public static void openPanel(BentoBox plugin, User user, Flag.Type flagType, World world, int page) {
String friendlyWorldName = plugin.getIWM().getFriendlyName(world); String friendlyWorldName = plugin.getIWM().getFriendlyName(world);
// Create the panel // Create the panel
PanelBuilder panelBuilder = new PanelBuilder() PanelBuilder panelBuilder = new PanelBuilder()
@ -38,8 +40,35 @@ public class SettingsPanel {
setupHeader(user, panelBuilder, flagType, world, friendlyWorldName); setupHeader(user, panelBuilder, flagType, world, friendlyWorldName);
plugin.getFlagsManager().getFlags().stream().filter(f -> f.getType().equals(flagType)) // Get a list of flags of the correct type and sort by the translated names
.sorted(Comparator.comparing(Flag::getID)).forEach((f -> panelBuilder.item(f.toPanelItem(plugin, user)))); List<Flag> flags = plugin.getFlagsManager().getFlags().stream().filter(f -> f.getType().equals(flagType))
.sorted(Comparator.comparing(Flag::getID, (s1, s2) -> {
String s1Translation = user.getTranslation(plugin.getFlagsManager().getFlagByID(s1).getNameReference());
String s2Translation = user.getTranslation(plugin.getFlagsManager().getFlagByID(s2).getNameReference());
return s1Translation.compareTo(s2Translation);
}))
.collect(Collectors.toList());
// Use paging
flags.stream().skip(page * 43).limit(page * 43 + 43).forEach((f -> panelBuilder.item(f.toPanelItem(plugin, user))));
// Add forward and backward icons
if (page > 0) {
// Previous page icon
panelBuilder.item(new PanelItemBuilder().icon(Material.SIGN).name(user.getTranslation(PROTECTION_PANEL + "previous")).clickHandler((panel, user1, clickType, slot1) -> {
openPanel(BentoBox.getInstance(), user, flagType, world, page - 1);
return true;
}).build());
}
if ((page + 1) * 44 < flags.size()) {
// Next page icon
panelBuilder.item(new PanelItemBuilder().icon(Material.SIGN).name(user.getTranslation(PROTECTION_PANEL + "next")).clickHandler((panel, user1, clickType, slot1) -> {
openPanel(BentoBox.getInstance(), user, flagType, world, page + 1);
return true;
}).build());
}
// Show it to the player // Show it to the player
panelBuilder.build().open(user); panelBuilder.build().open(user);
@ -55,7 +84,7 @@ public class SettingsPanel {
.glow(flagType.equals(currentFlagType)) .glow(flagType.equals(currentFlagType))
.clickHandler((panel, user1, clickType, slot1) -> { .clickHandler((panel, user1, clickType, slot1) -> {
if (!flagType.equals(currentFlagType)) { if (!flagType.equals(currentFlagType)) {
openPanel(BentoBox.getInstance(), user, flagType, world); openPanel(BentoBox.getInstance(), user, flagType, world, 0);
} }
return true; return true;
}) })

View File

@ -530,6 +530,12 @@ protection:
description: "Toggle spread" description: "Toggle spread"
name: "Fire spread" name: "Fire spread"
hint: "No fire spread allowed" hint: "No fire spread allowed"
FISH_SCOOPING:
description: |
&aAllow scooping of
&atropical fish
name: "Fish Scooping"
hint: "No scooping of tropical fish"
FURNACE: FURNACE:
description: "Toggle use" description: "Toggle use"
name: "Furnace" name: "Furnace"
@ -691,6 +697,8 @@ protection:
spawn-protected: "&cSpawn protected: [description]" spawn-protected: "&cSpawn protected: [description]"
panel: panel:
next: "Next Page"
previous: "Previous Page"
PROTECTION: PROTECTION:
title: "Protection" title: "Protection"
description: |- description: |-