mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-10-05 10:07:32 +02:00
Added ranks to island members. More to do!
This commit is contained in:
parent
f1072e5984
commit
eec4e99172
@ -2,6 +2,7 @@ package us.tastybento.bskyblock.database.objects;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -14,6 +15,7 @@ import org.bukkit.block.BlockState;
|
|||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
import us.tastybento.bskyblock.BSkyBlock;
|
import us.tastybento.bskyblock.BSkyBlock;
|
||||||
|
import us.tastybento.bskyblock.api.commands.User;
|
||||||
import us.tastybento.bskyblock.api.events.IslandBaseEvent;
|
import us.tastybento.bskyblock.api.events.IslandBaseEvent;
|
||||||
import us.tastybento.bskyblock.api.events.island.IslandEvent;
|
import us.tastybento.bskyblock.api.events.island.IslandEvent;
|
||||||
import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent;
|
import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent;
|
||||||
@ -32,6 +34,11 @@ import us.tastybento.bskyblock.util.Util;
|
|||||||
*/
|
*/
|
||||||
public class Island implements DataObject {
|
public class Island implements DataObject {
|
||||||
|
|
||||||
|
private static final Integer OWNER_RANK = 1000;
|
||||||
|
private static final Integer MEMBER_RANK = 900;
|
||||||
|
private static final Integer VISITOR_RANK = 0;
|
||||||
|
private static final Integer BANNED_RANK = -1;
|
||||||
|
|
||||||
private String uniqueId = "";
|
private String uniqueId = "";
|
||||||
|
|
||||||
public String getUniqueId() {
|
public String getUniqueId() {
|
||||||
@ -77,19 +84,8 @@ public class Island implements DataObject {
|
|||||||
private long updatedDate;
|
private long updatedDate;
|
||||||
|
|
||||||
//// Team ////
|
//// Team ////
|
||||||
// Owner (Team Leader)
|
|
||||||
private UUID owner;
|
private UUID owner;
|
||||||
|
private HashMap<UUID, Integer> ranks = new HashMap<>();
|
||||||
// Members (use set because each value must be unique)
|
|
||||||
private Set<UUID> members = new HashSet<>();
|
|
||||||
|
|
||||||
// Trustees
|
|
||||||
private Set<UUID> trustees = new HashSet<>();
|
|
||||||
// Coops
|
|
||||||
private Set<UUID> coops = new HashSet<>();
|
|
||||||
|
|
||||||
// Banned players
|
|
||||||
private Set<UUID> banned = new HashSet<>();
|
|
||||||
//// State ////
|
//// State ////
|
||||||
private boolean locked = false;
|
private boolean locked = false;
|
||||||
private boolean spawn = false;
|
private boolean spawn = false;
|
||||||
@ -104,13 +100,13 @@ public class Island implements DataObject {
|
|||||||
public Island() {}
|
public Island() {}
|
||||||
|
|
||||||
public Island(Location location, UUID owner, int protectionRange) {
|
public Island(Location location, UUID owner, int protectionRange) {
|
||||||
this.members.add(owner);
|
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
|
this.ranks.put(owner, OWNER_RANK);
|
||||||
this.createdDate = System.currentTimeMillis();
|
this.createdDate = System.currentTimeMillis();
|
||||||
this.updatedDate = System.currentTimeMillis();
|
this.updatedDate = System.currentTimeMillis();
|
||||||
this.world = location.getWorld();
|
this.world = location.getWorld();
|
||||||
this.center = location;
|
this.center = location;
|
||||||
this.range = BSkyBlock.getInstance().getSettings().getIslandProtectionRange();
|
this.range = BSkyBlock.getInstance().getSettings().getIslandDistance();
|
||||||
this.minX = center.getBlockX() - range;
|
this.minX = center.getBlockX() - range;
|
||||||
this.minZ = center.getBlockZ() - range;
|
this.minZ = center.getBlockZ() - range;
|
||||||
this.protectionRange = protectionRange;
|
this.protectionRange = protectionRange;
|
||||||
@ -123,8 +119,7 @@ public class Island implements DataObject {
|
|||||||
* @param playerUUID
|
* @param playerUUID
|
||||||
*/
|
*/
|
||||||
public void addMember(UUID playerUUID) {
|
public void addMember(UUID playerUUID) {
|
||||||
members.add(playerUUID);
|
ranks.put(playerUUID, MEMBER_RANK);
|
||||||
banned.remove(playerUUID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -135,16 +130,7 @@ public class Island implements DataObject {
|
|||||||
*/
|
*/
|
||||||
public boolean addToBanList(UUID targetUUID) {
|
public boolean addToBanList(UUID targetUUID) {
|
||||||
// TODO fire ban event
|
// TODO fire ban event
|
||||||
if (members.contains(targetUUID)) {
|
ranks.put(targetUUID, BANNED_RANK);
|
||||||
members.remove(targetUUID);
|
|
||||||
}
|
|
||||||
if (coops.contains(targetUUID)) {
|
|
||||||
coops.remove(targetUUID);
|
|
||||||
}
|
|
||||||
if (trustees.contains(targetUUID)) {
|
|
||||||
trustees.remove(targetUUID);
|
|
||||||
}
|
|
||||||
banned.add(targetUUID);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +138,13 @@ public class Island implements DataObject {
|
|||||||
* @return the banned
|
* @return the banned
|
||||||
*/
|
*/
|
||||||
public Set<UUID> getBanned() {
|
public Set<UUID> getBanned() {
|
||||||
return banned;
|
Set<UUID> result = new HashSet<>();
|
||||||
|
for (Entry<UUID, Integer> member: ranks.entrySet()) {
|
||||||
|
if (member.getValue() <= BANNED_RANK) {
|
||||||
|
result.add(member.getKey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,13 +154,6 @@ public class Island implements DataObject {
|
|||||||
return center;
|
return center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the coop players of the island
|
|
||||||
*/
|
|
||||||
public Set<UUID> getCoops(){
|
|
||||||
return coops;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the date when the island was created
|
* @return the date when the island was created
|
||||||
*/
|
*/
|
||||||
@ -201,10 +186,13 @@ public class Island implements DataObject {
|
|||||||
* @return the members of the island (owner included)
|
* @return the members of the island (owner included)
|
||||||
*/
|
*/
|
||||||
public Set<UUID> getMembers(){
|
public Set<UUID> getMembers(){
|
||||||
if (members == null) {
|
Set<UUID> result = new HashSet<>();
|
||||||
members = new HashSet<>();
|
for (Entry<UUID, Integer> member: ranks.entrySet()) {
|
||||||
|
if (member.getValue() >= MEMBER_RANK) {
|
||||||
|
result.add(member.getKey());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return members;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -271,13 +259,6 @@ public class Island implements DataObject {
|
|||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the trustees players of the island
|
|
||||||
*/
|
|
||||||
public Set<UUID> getTrustees(){
|
|
||||||
return trustees;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the date when the island was updated (team member connection, etc...)
|
* @return the date when the island was updated (team member connection, etc...)
|
||||||
*/
|
*/
|
||||||
@ -330,7 +311,7 @@ public class Island implements DataObject {
|
|||||||
* @return Returns true if target is banned on this island
|
* @return Returns true if target is banned on this island
|
||||||
*/
|
*/
|
||||||
public boolean isBanned(UUID targetUUID) {
|
public boolean isBanned(UUID targetUUID) {
|
||||||
return banned.contains(targetUUID);
|
return ranks.containsKey(targetUUID) && ranks.get(targetUUID) == BANNED_RANK ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -378,17 +359,10 @@ public class Island implements DataObject {
|
|||||||
*/
|
*/
|
||||||
public boolean removeFromBanList(UUID targetUUID) {
|
public boolean removeFromBanList(UUID targetUUID) {
|
||||||
// TODO fire unban event
|
// TODO fire unban event
|
||||||
banned.remove(targetUUID);
|
ranks.remove(targetUUID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param banned the banned to set
|
|
||||||
*/
|
|
||||||
public void setBanned(Set<UUID> banned) {
|
|
||||||
this.banned = banned;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param center the center to set
|
* @param center the center to set
|
||||||
*/
|
*/
|
||||||
@ -396,13 +370,6 @@ public class Island implements DataObject {
|
|||||||
this.center = center;
|
this.center = center;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param coops - the coops to set
|
|
||||||
*/
|
|
||||||
public void setCoops(Set<UUID> coops){
|
|
||||||
this.coops = coops;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param createdDate - the createdDate to sets
|
* @param createdDate - the createdDate to sets
|
||||||
*/
|
*/
|
||||||
@ -456,14 +423,6 @@ public class Island implements DataObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param members - the members to set
|
|
||||||
*/
|
|
||||||
public void setMembers(Set<UUID> members){
|
|
||||||
//Bukkit.getLogger().info("DEBUG: members size = " + members.size());
|
|
||||||
this.members = members;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param minProtectedX the minProtectedX to set
|
* @param minProtectedX the minProtectedX to set
|
||||||
*/
|
*/
|
||||||
@ -501,12 +460,12 @@ public class Island implements DataObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the owner of the island. If the owner was previous banned, they are unbanned
|
* Sets the owner of the island.
|
||||||
* @param owner - the owner/team leader to set
|
* @param owner - the owner/team leader to set
|
||||||
*/
|
*/
|
||||||
public void setOwner(UUID owner){
|
public void setOwner(UUID owner){
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
this.banned.remove(owner);
|
this.ranks.put(owner, OWNER_RANK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -546,13 +505,6 @@ public class Island implements DataObject {
|
|||||||
}*/ //TODO default flags
|
}*/ //TODO default flags
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param trustees - the trustees to set
|
|
||||||
*/
|
|
||||||
public void setTrustees(Set<UUID> trustees){
|
|
||||||
this.trustees = trustees;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param updatedDate - the updatedDate to sets
|
* @param updatedDate - the updatedDate to sets
|
||||||
*/
|
*/
|
||||||
@ -666,6 +618,29 @@ public class Island implements DataObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void removeMember(UUID playerUUID) {
|
public void removeMember(UUID playerUUID) {
|
||||||
this.members.remove(playerUUID);
|
ranks.remove(playerUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the rank of user for this island
|
||||||
|
* @param user
|
||||||
|
* @return rank integer
|
||||||
|
*/
|
||||||
|
public int getRank(User user) {
|
||||||
|
return ranks.containsKey(user.getUniqueId()) ? ranks.get(user.getUniqueId()) : VISITOR_RANK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the ranks
|
||||||
|
*/
|
||||||
|
public HashMap<UUID, Integer> getRanks() {
|
||||||
|
return ranks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ranks the ranks to set
|
||||||
|
*/
|
||||||
|
public void setRanks(HashMap<UUID, Integer> ranks) {
|
||||||
|
this.ranks = ranks;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,6 +2,7 @@ package bskyblock;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotSame;
|
import static org.junit.Assert.assertNotSame;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
@ -13,10 +14,12 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -31,12 +34,14 @@ import us.tastybento.bskyblock.api.commands.CompositeCommand;
|
|||||||
import us.tastybento.bskyblock.api.commands.User;
|
import us.tastybento.bskyblock.api.commands.User;
|
||||||
import us.tastybento.bskyblock.api.events.IslandBaseEvent;
|
import us.tastybento.bskyblock.api.events.IslandBaseEvent;
|
||||||
import us.tastybento.bskyblock.api.events.team.TeamEvent;
|
import us.tastybento.bskyblock.api.events.team.TeamEvent;
|
||||||
|
import us.tastybento.bskyblock.database.objects.Island;
|
||||||
import us.tastybento.bskyblock.util.Util;
|
import us.tastybento.bskyblock.util.Util;
|
||||||
|
|
||||||
public class TestBSkyBlock {
|
public class TestBSkyBlock {
|
||||||
private final UUID playerUUID = UUID.randomUUID();
|
private final UUID playerUUID = UUID.randomUUID();
|
||||||
private static CommandSender sender;
|
private static CommandSender sender;
|
||||||
private static Player player;
|
private static Player player;
|
||||||
|
private static Location location;
|
||||||
private static BSkyBlock plugin;
|
private static BSkyBlock plugin;
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
@ -61,6 +66,12 @@ public class TestBSkyBlock {
|
|||||||
plugin = mock(BSkyBlock.class);
|
plugin = mock(BSkyBlock.class);
|
||||||
//Mockito.when(plugin.getServer()).thenReturn(server);
|
//Mockito.when(plugin.getServer()).thenReturn(server);
|
||||||
|
|
||||||
|
location = mock(Location.class);
|
||||||
|
Mockito.when(location.getWorld()).thenReturn(world);
|
||||||
|
Mockito.when(location.getBlockX()).thenReturn(0);
|
||||||
|
Mockito.when(location.getBlockY()).thenReturn(0);
|
||||||
|
Mockito.when(location.getBlockZ()).thenReturn(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -258,4 +269,117 @@ public class TestBSkyBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Protection tests
|
||||||
|
@Test
|
||||||
|
public void TestProtection() {
|
||||||
|
User owner = User.getInstance(playerUUID);
|
||||||
|
Island island = new Island();
|
||||||
|
island.setOwner(playerUUID);
|
||||||
|
island.setCenter(location);
|
||||||
|
island.setProtectionRange(100);
|
||||||
|
|
||||||
|
assertNotNull(island);
|
||||||
|
|
||||||
|
User visitor = User.getInstance(UUID.randomUUID());
|
||||||
|
assertEquals(1000, island.getRank(owner));
|
||||||
|
assertEquals(0, island.getRank(visitor));
|
||||||
|
|
||||||
|
// Make members
|
||||||
|
UUID member1 = UUID.randomUUID();
|
||||||
|
UUID member2 = UUID.randomUUID();
|
||||||
|
UUID member3 = UUID.randomUUID();
|
||||||
|
|
||||||
|
// Add members
|
||||||
|
island.addMember(member1);
|
||||||
|
island.addMember(member2);
|
||||||
|
island.addMember(member3);
|
||||||
|
|
||||||
|
Set<UUID> members = island.getMembers();
|
||||||
|
assertTrue(members.contains(playerUUID));
|
||||||
|
assertTrue(members.contains(member1));
|
||||||
|
assertTrue(members.contains(member2));
|
||||||
|
assertTrue(members.contains(member3));
|
||||||
|
|
||||||
|
// Remove members
|
||||||
|
island.removeMember(member3);
|
||||||
|
members = island.getMembers();
|
||||||
|
assertTrue(members.contains(playerUUID));
|
||||||
|
assertTrue(members.contains(member1));
|
||||||
|
assertTrue(members.contains(member2));
|
||||||
|
assertFalse(members.contains(member3));
|
||||||
|
|
||||||
|
// Ban member
|
||||||
|
island.addToBanList(member1);
|
||||||
|
members = island.getMembers();
|
||||||
|
assertTrue(members.contains(playerUUID));
|
||||||
|
assertFalse(members.contains(member1));
|
||||||
|
assertTrue(members.contains(member2));
|
||||||
|
assertFalse(members.contains(member3));
|
||||||
|
|
||||||
|
Set<UUID> banned = island.getBanned();
|
||||||
|
assertTrue(banned.contains(member1));
|
||||||
|
|
||||||
|
// Unban
|
||||||
|
island.removeFromBanList(member1);
|
||||||
|
assertFalse(island.getBanned().contains(member1));
|
||||||
|
|
||||||
|
|
||||||
|
//island.isAllowed(visitor, Flags.BREAK_BLOCKS);
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Score approach:
|
||||||
|
*
|
||||||
|
* Rank definitions are global and apply to all islands
|
||||||
|
*
|
||||||
|
* There are 4 hard-coded ranks:
|
||||||
|
*
|
||||||
|
* Owner is the highest rank = 1000
|
||||||
|
*
|
||||||
|
* Member ranks are >= 900
|
||||||
|
*
|
||||||
|
* Visitors = 0
|
||||||
|
*
|
||||||
|
* Banned = -1
|
||||||
|
*
|
||||||
|
* Owners have full admin capability over the island. Members are required to give up their own island to be a member.
|
||||||
|
* Visitors are everyone else.
|
||||||
|
*
|
||||||
|
* After those 3, it's possible to have custom ranks, e.g.
|
||||||
|
*
|
||||||
|
* Trustees = 750
|
||||||
|
* Coops = 500
|
||||||
|
* etc.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Each flag has a bypass score.
|
||||||
|
* If the user's rank is higher or equal to the bypass score, they will bypass the protection.
|
||||||
|
* Owners can disable/enable the flags.
|
||||||
|
*
|
||||||
|
* Each island will track the rank score for each player on the island.
|
||||||
|
* Unknown players have a rank of 0.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Admins will be able to define groups and their rank value.
|
||||||
|
* During the game, the players will never see the rank value. They will only see the ranks.
|
||||||
|
*
|
||||||
|
* It will be possible to island owners to promote or demote players up and down the ranks.
|
||||||
|
*
|
||||||
|
* This will replace the team system completely.
|
||||||
|
*
|
||||||
|
* Pros:
|
||||||
|
* Very flexible
|
||||||
|
*
|
||||||
|
* Cons:
|
||||||
|
* Too complicated. Are there really ever going to be more than just a few ranks?
|
||||||
|
* To have generic, unlimited ranks, we lose the concept of hard-coded teams, coops, etc.
|
||||||
|
* The problem is that team members must lose their islands and so we have special code around that.
|
||||||
|
* i.e., there's a lot more going on than just ranks.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Permissions-based
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user