Added min/max options for cycle click and restricted lock flag.

https://github.com/BentoBoxWorld/bentobox/issues/332
This commit is contained in:
tastybento 2018-11-10 19:28:46 -08:00
parent c438f4a45d
commit c2e9490bb0
3 changed files with 90 additions and 9 deletions

View File

@ -22,14 +22,30 @@ public class CycleClick implements PanelItem.ClickHandler {
private BentoBox plugin = BentoBox.getInstance(); private BentoBox plugin = BentoBox.getInstance();
private final String id; private final String id;
private int minRank = RanksManager.VISITOR_RANK;
private int maxRank = RanksManager.OWNER_RANK;
/** /**
* Construct default cycle clicker with min rank of {@link RanksManager#VISITOR_RANK}
* and max rank of {@link RanksManager#OWNER_RANK}
* @param id - the flag id that will be adjusted by this click * @param id - the flag id that will be adjusted by this click
*/ */
public CycleClick(String id) { public CycleClick(String id) {
this.id = id; this.id = id;
} }
/**
* Construct a cycle clicker with a min and max rank
* @param id
* @param minRank
* @param maxRank
*/
public CycleClick(String id, int minRank, int maxRank) {
this.id = id;
this.minRank = minRank;
this.maxRank = maxRank;
}
@Override @Override
public boolean onClick(Panel panel, User user, ClickType click, int slot) { public boolean onClick(Panel panel, User user, ClickType click, int slot) {
// Get the world // Get the world
@ -53,15 +69,15 @@ public class CycleClick implements PanelItem.ClickHandler {
Flag flag = plugin.getFlagsManager().getFlagByID(id); Flag flag = plugin.getFlagsManager().getFlagByID(id);
int currentRank = island.getFlag(flag); int currentRank = island.getFlag(flag);
if (click.equals(ClickType.LEFT)) { if (click.equals(ClickType.LEFT)) {
if (currentRank == RanksManager.OWNER_RANK) { if (currentRank >= maxRank) {
island.setFlag(flag, RanksManager.VISITOR_RANK); island.setFlag(flag, minRank);
} else { } else {
island.setFlag(flag, rm.getRankUpValue(currentRank)); island.setFlag(flag, rm.getRankUpValue(currentRank));
} }
user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F); user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F);
} else if (click.equals(ClickType.RIGHT)) { } else if (click.equals(ClickType.RIGHT)) {
if (currentRank == RanksManager.VISITOR_RANK) { if (currentRank <= minRank) {
island.setFlag(flag, RanksManager.OWNER_RANK); island.setFlag(flag, maxRank);
} else { } else {
island.setFlag(flag, rm.getRankDownValue(currentRank)); island.setFlag(flag, rm.getRankDownValue(currentRank));
} }
@ -75,4 +91,18 @@ public class CycleClick implements PanelItem.ClickHandler {
return true; return true;
} }
/**
* @param minRank the minRank to set
*/
public void setMinRank(int minRank) {
this.minRank = minRank;
}
/**
* @param maxRank the maxRank to set
*/
public void setMaxRank(int maxRank) {
this.maxRank = maxRank;
}
} }

View File

@ -10,6 +10,7 @@ import org.bukkit.Material;
import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.api.flags.Flag.Type; import world.bentobox.bentobox.api.flags.Flag.Type;
import world.bentobox.bentobox.api.flags.FlagBuilder; import world.bentobox.bentobox.api.flags.FlagBuilder;
import world.bentobox.bentobox.api.flags.clicklisteners.CycleClick;
import world.bentobox.bentobox.listeners.flags.BlockInteractionListener; import world.bentobox.bentobox.listeners.flags.BlockInteractionListener;
import world.bentobox.bentobox.listeners.flags.BreakBlocksListener; import world.bentobox.bentobox.listeners.flags.BreakBlocksListener;
import world.bentobox.bentobox.listeners.flags.BreedingListener; import world.bentobox.bentobox.listeners.flags.BreedingListener;
@ -143,6 +144,7 @@ public class Flags {
public static final Flag LOCK = new FlagBuilder().id("LOCK") public static final Flag LOCK = new FlagBuilder().id("LOCK")
.icon(Material.TRIPWIRE_HOOK).type(Type.PROTECTION).allowedByDefault(true) .icon(Material.TRIPWIRE_HOOK).type(Type.PROTECTION).allowedByDefault(true)
.defaultRank(RanksManager.VISITOR_RANK).listener(new LockAndBanListener()) .defaultRank(RanksManager.VISITOR_RANK).listener(new LockAndBanListener())
.onClick(new CycleClick("LOCK", RanksManager.VISITOR_RANK, RanksManager.MEMBER_RANK))
.build(); .build();
/* /*

View File

@ -61,6 +61,7 @@ public class CycleClickTest {
private Panel panel; private Panel panel;
private Inventory inv; private Inventory inv;
private IslandWorldManager iwm; private IslandWorldManager iwm;
private RanksManager rm;
/** /**
* @throws java.lang.Exception - exception * @throws java.lang.Exception - exception
@ -167,15 +168,21 @@ public class CycleClickTest {
when(fm.getFlagByID(Mockito.anyString())).thenReturn(flag); when(fm.getFlagByID(Mockito.anyString())).thenReturn(flag);
when(plugin.getFlagsManager()).thenReturn(fm); when(plugin.getFlagsManager()).thenReturn(fm);
RanksManager rm = mock(RanksManager.class); rm = mock(RanksManager.class);
when(plugin.getRanksManager()).thenReturn(rm); when(plugin.getRanksManager()).thenReturn(rm);
// Provide a current rank value - member // Provide a current rank value - member
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK); when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK);
// Set up up and down ranks // Set up up and down ranks
when(rm.getRankUpValue(Mockito.eq(RanksManager.VISITOR_RANK))).thenReturn(RanksManager.COOP_RANK);
when(rm.getRankUpValue(Mockito.eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.TRUSTED_RANK);
when(rm.getRankUpValue(Mockito.eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.MEMBER_RANK);
when(rm.getRankUpValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.OWNER_RANK); when(rm.getRankUpValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.OWNER_RANK);
when(rm.getRankDownValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.VISITOR_RANK); when(rm.getRankDownValue(Mockito.eq(RanksManager.OWNER_RANK))).thenReturn(RanksManager.MEMBER_RANK);
when(rm.getRankDownValue(Mockito.eq(RanksManager.MEMBER_RANK))).thenReturn(RanksManager.TRUSTED_RANK);
when(rm.getRankDownValue(Mockito.eq(RanksManager.TRUSTED_RANK))).thenReturn(RanksManager.COOP_RANK);
when(rm.getRankDownValue(Mockito.eq(RanksManager.COOP_RANK))).thenReturn(RanksManager.VISITOR_RANK);
panel = mock(Panel.class); panel = mock(Panel.class);
inv = mock(Inventory.class); inv = mock(Inventory.class);
@ -236,14 +243,35 @@ public class CycleClickTest {
Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any());
} }
@Test
public void testOnLeftClickSetMinMax() {
// Provide a current rank value - coop
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.COOP_RANK);
final int SLOT = 5;
CycleClick udc = new CycleClick("LOCK", RanksManager.COOP_RANK, RanksManager.MEMBER_RANK);
// Rank starts at member
// Click left
assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT));
Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.TRUSTED_RANK));
Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any());
Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any());
// Check rollover
// Clicking when Member should go to Coop
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK);
assertTrue(udc.onClick(panel, user, ClickType.LEFT, SLOT));
Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.COOP_RANK));
Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any());
Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any());
}
@Test @Test
public void testOnRightClick() { public void testOnRightClick() {
final int SLOT = 5; final int SLOT = 5;
CycleClick udc = new CycleClick("LOCK"); CycleClick udc = new CycleClick("LOCK");
// Rank starts at member // Rank starts at member
// Right click // Right click - down rank to Trusted
assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT)); assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT));
Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.VISITOR_RANK)); Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.TRUSTED_RANK));
Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any()); Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any());
Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any()); Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any());
// Check rollover // Check rollover
@ -255,6 +283,27 @@ public class CycleClickTest {
Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any()); Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any());
} }
@Test
public void testOnRightClickMinMaxSet() {
// Provide a current rank value - coop
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.TRUSTED_RANK);
final int SLOT = 5;
CycleClick udc = new CycleClick("LOCK", RanksManager.COOP_RANK, RanksManager.MEMBER_RANK);
// Rank starts at member
// Right click
assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT));
Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.COOP_RANK));
Mockito.verify(flag).toPanelItem(Mockito.any(), Mockito.any());
Mockito.verify(inv).setItem(Mockito.eq(SLOT), Mockito.any());
// Check rollover
// Clicking when Coop should go to Member
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.COOP_RANK);
assertTrue(udc.onClick(panel, user, ClickType.RIGHT, SLOT));
Mockito.verify(island).setFlag(Mockito.eq(flag), Mockito.eq(RanksManager.MEMBER_RANK));
Mockito.verify(flag, Mockito.times(2)).toPanelItem(Mockito.any(), Mockito.any());
Mockito.verify(inv, Mockito.times(2)).setItem(Mockito.eq(SLOT), Mockito.any());
}
@Test @Test
public void testAllClicks() { public void testAllClicks() {
// Test all possible click types // Test all possible click types