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 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
*/
public CycleClick(String 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
public boolean onClick(Panel panel, User user, ClickType click, int slot) {
// Get the world
@ -53,15 +69,15 @@ public class CycleClick implements PanelItem.ClickHandler {
Flag flag = plugin.getFlagsManager().getFlagByID(id);
int currentRank = island.getFlag(flag);
if (click.equals(ClickType.LEFT)) {
if (currentRank == RanksManager.OWNER_RANK) {
island.setFlag(flag, RanksManager.VISITOR_RANK);
if (currentRank >= maxRank) {
island.setFlag(flag, minRank);
} else {
island.setFlag(flag, rm.getRankUpValue(currentRank));
}
user.getPlayer().playSound(user.getLocation(), Sound.BLOCK_STONE_BUTTON_CLICK_ON, 1F, 1F);
} else if (click.equals(ClickType.RIGHT)) {
if (currentRank == RanksManager.VISITOR_RANK) {
island.setFlag(flag, RanksManager.OWNER_RANK);
if (currentRank <= minRank) {
island.setFlag(flag, maxRank);
} else {
island.setFlag(flag, rm.getRankDownValue(currentRank));
}
@ -75,4 +91,18 @@ public class CycleClick implements PanelItem.ClickHandler {
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.Type;
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.BreakBlocksListener;
import world.bentobox.bentobox.listeners.flags.BreedingListener;
@ -143,6 +144,7 @@ public class Flags {
public static final Flag LOCK = new FlagBuilder().id("LOCK")
.icon(Material.TRIPWIRE_HOOK).type(Type.PROTECTION).allowedByDefault(true)
.defaultRank(RanksManager.VISITOR_RANK).listener(new LockAndBanListener())
.onClick(new CycleClick("LOCK", RanksManager.VISITOR_RANK, RanksManager.MEMBER_RANK))
.build();
/*
@ -216,7 +218,7 @@ public class Flags {
*/
public static final Flag CREEPER_GRIEFING = new FlagBuilder().id("CREEPER_GRIEFING").icon(Material.CREEPER_HEAD).type(Type.WORLD_SETTING)
.allowedByDefault(false).build();
public static final Flag COMMAND_RANKS = new FlagBuilder().id("COMMAND_RANKS").icon(Material.PLAYER_HEAD).type(Type.WORLD_SETTING)
.onClick(new CommandRankClickListener()).subPanel(true).build();

View File

@ -61,6 +61,7 @@ public class CycleClickTest {
private Panel panel;
private Inventory inv;
private IslandWorldManager iwm;
private RanksManager rm;
/**
* @throws java.lang.Exception - exception
@ -167,15 +168,21 @@ public class CycleClickTest {
when(fm.getFlagByID(Mockito.anyString())).thenReturn(flag);
when(plugin.getFlagsManager()).thenReturn(fm);
RanksManager rm = mock(RanksManager.class);
rm = mock(RanksManager.class);
when(plugin.getRanksManager()).thenReturn(rm);
// Provide a current rank value - member
when(island.getFlag(Mockito.any())).thenReturn(RanksManager.MEMBER_RANK);
// 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.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);
inv = mock(Inventory.class);
@ -236,14 +243,35 @@ public class CycleClickTest {
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
public void testOnRightClick() {
final int SLOT = 5;
CycleClick udc = new CycleClick("LOCK");
// Rank starts at member
// Right click
// Right click - down rank to Trusted
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(inv).setItem(Mockito.eq(SLOT), Mockito.any());
// Check rollover
@ -255,6 +283,27 @@ public class CycleClickTest {
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
public void testAllClicks() {
// Test all possible click types