From f1072e59847304399a4fec7fa592e1e252b38d82 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 09:47:51 -0800 Subject: [PATCH 01/97] Fixed flag optional aspect. --- src/main/java/us/tastybento/bskyblock/api/flags/Flag.java | 6 +++--- .../us/tastybento/bskyblock/api/flags/FlagBuilder.java | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 9ae4eb859..7061f6ee9 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -11,9 +11,9 @@ public class Flag { private String id; private PanelItem icon; - private Optional listener; + private Listener listener; - public Flag(String id, PanelItem icon, Optional listener) { + public Flag(String id, PanelItem icon, Listener listener) { this.id = id; this.icon = icon; this.listener = listener; @@ -29,6 +29,6 @@ public class Flag { } public Optional getListener() { - return listener; + return Optional.of(listener); } } diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index fe874cdbc..d90a7f781 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -1,11 +1,9 @@ package us.tastybento.bskyblock.api.flags; -import java.util.Optional; - import org.bukkit.Material; import org.bukkit.event.Listener; - import org.bukkit.inventory.ItemStack; + import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; @@ -13,7 +11,7 @@ public class FlagBuilder { private String id = ""; private PanelItem icon = PanelItem.empty(); - private Optional listener = Optional.empty(); + private Listener listener; public FlagBuilder id(String id) { this.id = id; @@ -34,7 +32,7 @@ public class FlagBuilder { } public FlagBuilder listener(Listener listener) { - this.listener = Optional.of(listener); + this.listener = listener; return this; } From eec4e9917242936a5c9de70def09857ddc46e56a Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 11:48:54 -0800 Subject: [PATCH 02/97] Added ranks to island members. More to do! --- .../bskyblock/database/objects/Island.java | 131 +++++++----------- src/test/java/bskyblock/TestBSkyBlock.java | 124 +++++++++++++++++ 2 files changed, 177 insertions(+), 78 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index cd3c7be2e..6a193e546 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -2,6 +2,7 @@ package us.tastybento.bskyblock.database.objects; import java.util.HashMap; import java.util.HashSet; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -14,6 +15,7 @@ import org.bukkit.block.BlockState; import org.bukkit.entity.Entity; 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.island.IslandEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent; @@ -32,6 +34,11 @@ import us.tastybento.bskyblock.util.Util; */ 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 = ""; public String getUniqueId() { @@ -77,19 +84,8 @@ public class Island implements DataObject { private long updatedDate; //// Team //// - // Owner (Team Leader) private UUID owner; - - // Members (use set because each value must be unique) - private Set members = new HashSet<>(); - - // Trustees - private Set trustees = new HashSet<>(); - // Coops - private Set coops = new HashSet<>(); - - // Banned players - private Set banned = new HashSet<>(); + private HashMap ranks = new HashMap<>(); //// State //// private boolean locked = false; private boolean spawn = false; @@ -104,13 +100,13 @@ public class Island implements DataObject { public Island() {} public Island(Location location, UUID owner, int protectionRange) { - this.members.add(owner); this.owner = owner; + this.ranks.put(owner, OWNER_RANK); this.createdDate = System.currentTimeMillis(); this.updatedDate = System.currentTimeMillis(); this.world = location.getWorld(); this.center = location; - this.range = BSkyBlock.getInstance().getSettings().getIslandProtectionRange(); + this.range = BSkyBlock.getInstance().getSettings().getIslandDistance(); this.minX = center.getBlockX() - range; this.minZ = center.getBlockZ() - range; this.protectionRange = protectionRange; @@ -123,8 +119,7 @@ public class Island implements DataObject { * @param playerUUID */ public void addMember(UUID playerUUID) { - members.add(playerUUID); - banned.remove(playerUUID); + ranks.put(playerUUID, MEMBER_RANK); } /** @@ -135,16 +130,7 @@ public class Island implements DataObject { */ public boolean addToBanList(UUID targetUUID) { // TODO fire ban event - if (members.contains(targetUUID)) { - members.remove(targetUUID); - } - if (coops.contains(targetUUID)) { - coops.remove(targetUUID); - } - if (trustees.contains(targetUUID)) { - trustees.remove(targetUUID); - } - banned.add(targetUUID); + ranks.put(targetUUID, BANNED_RANK); return true; } @@ -152,7 +138,13 @@ public class Island implements DataObject { * @return the banned */ public Set getBanned() { - return banned; + Set result = new HashSet<>(); + for (Entry 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 the coop players of the island - */ - public Set getCoops(){ - return coops; - } - /** * @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) */ public Set getMembers(){ - if (members == null) { - members = new HashSet<>(); + Set result = new HashSet<>(); + for (Entry 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 the trustees players of the island - */ - public Set getTrustees(){ - return trustees; - } - /** * @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 */ 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) { // TODO fire unban event - banned.remove(targetUUID); + ranks.remove(targetUUID); return true; } - /** - * @param banned the banned to set - */ - public void setBanned(Set banned) { - this.banned = banned; - } - /** * @param center the center to set */ @@ -396,13 +370,6 @@ public class Island implements DataObject { this.center = center; } - /** - * @param coops - the coops to set - */ - public void setCoops(Set coops){ - this.coops = coops; - } - /** * @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 members){ - //Bukkit.getLogger().info("DEBUG: members size = " + members.size()); - this.members = members; - } - /** * @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 */ public void setOwner(UUID 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 } - /** - * @param trustees - the trustees to set - */ - public void setTrustees(Set trustees){ - this.trustees = trustees; - } - /** * @param updatedDate - the updatedDate to sets */ @@ -666,6 +618,29 @@ public class Island implements DataObject { } 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 getRanks() { + return ranks; + } + + /** + * @param ranks the ranks to set + */ + public void setRanks(HashMap ranks) { + this.ranks = ranks; } } \ No newline at end of file diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 907129ff1..2826cf748 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -2,6 +2,7 @@ package bskyblock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -13,10 +14,12 @@ import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.logging.Logger; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; 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.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; +import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.util.Util; public class TestBSkyBlock { private final UUID playerUUID = UUID.randomUUID(); private static CommandSender sender; private static Player player; + private static Location location; private static BSkyBlock plugin; @BeforeClass @@ -61,6 +66,12 @@ public class TestBSkyBlock { plugin = mock(BSkyBlock.class); //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 @@ -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 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 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 + * + * + */ + } } From 417f767705e96fbf0bb684fba15da01907a07c7a Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 12:47:17 -0800 Subject: [PATCH 03/97] Added a Ranks Manager --- .../us/tastybento/bskyblock/BSkyBlock.java | 12 ++ .../us/tastybento/bskyblock/Settings.java | 18 +- .../bskyblock/database/objects/Island.java | 36 ++-- .../bskyblock/managers/RanksManager.java | 165 ++++++++++++++++++ 4 files changed, 217 insertions(+), 14 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/managers/RanksManager.java diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 9a379211a..760c7cc11 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -15,6 +15,7 @@ import us.tastybento.bskyblock.managers.AddonsManager; import us.tastybento.bskyblock.managers.CommandsManager; import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.LocalesManager; +import us.tastybento.bskyblock.managers.RanksManager; /** * Main BSkyBlock class - provides an island minigame in the sky @@ -38,6 +39,7 @@ public class BSkyBlock extends JavaPlugin { private AddonsManager addonsManager; private FlagsManager flagsManager; private IslandWorld islandWorldManager; + private RanksManager ranksManager; // Settings Settings settings; @@ -67,6 +69,7 @@ public class BSkyBlock extends JavaPlugin { playersManager = new PlayersManager(this); islandsManager = new IslandsManager(this); + ranksManager = new RanksManager(this); // Load metrics metrics = new Metrics(plugin); @@ -250,4 +253,13 @@ public class BSkyBlock extends JavaPlugin { return islandWorldManager; } + + + /** + * @return the ranksManager + */ + public RanksManager getRanksManager() { + return ranksManager; + } + } diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index a582bea6c..a63dd8134 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -165,6 +165,10 @@ public class Settings implements ISettings { @ConfigEntry(path = "island.deaths.sum-team") private boolean deathsSumTeam = false; + + // Ranks + @ConfigEntry(path = "island.customranks") + private HashMap customRanks = new HashMap<>(); // --------------------------------------------- @@ -288,6 +292,12 @@ public class Settings implements ISettings { public EntityType getCompanionType() { return companionType; } + /** + * @return the customRanks + */ + public HashMap getCustomRanks() { + return customRanks; + } /** * @return the databaseBackupPeriod */ @@ -839,6 +849,12 @@ public class Settings implements ISettings { public void setCompanionType(EntityType companionType) { this.companionType = companionType; } + /** + * @param customRanks the customRanks to set + */ + public void setCustomRanks(HashMap customRanks) { + this.customRanks = customRanks; + } /** * @param databaseBackupPeriod the databaseBackupPeriod to set */ @@ -1109,6 +1125,7 @@ public class Settings implements ISettings { public void setRemoveMobsOnIsland(boolean removeMobsOnIsland) { this.removeMobsOnIsland = removeMobsOnIsland; } + /** * @param removeMobsOnLogin the removeMobsOnLogin to set */ @@ -1121,7 +1138,6 @@ public class Settings implements ISettings { public void setRemoveMobsWhitelist(List removeMobsWhitelist) { this.removeMobsWhitelist = removeMobsWhitelist; } - /** * @param resetConfirmation the resetConfirmation to set */ diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 6a193e546..5f21ea13f 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -85,7 +85,8 @@ public class Island implements DataObject { //// Team //// private UUID owner; - private HashMap ranks = new HashMap<>(); + private HashMap members = new HashMap<>(); + //// State //// private boolean locked = false; private boolean spawn = false; @@ -101,7 +102,7 @@ public class Island implements DataObject { public Island(Location location, UUID owner, int protectionRange) { this.owner = owner; - this.ranks.put(owner, OWNER_RANK); + this.members.put(owner, OWNER_RANK); this.createdDate = System.currentTimeMillis(); this.updatedDate = System.currentTimeMillis(); this.world = location.getWorld(); @@ -119,7 +120,7 @@ public class Island implements DataObject { * @param playerUUID */ public void addMember(UUID playerUUID) { - ranks.put(playerUUID, MEMBER_RANK); + members.put(playerUUID, MEMBER_RANK); } /** @@ -130,7 +131,7 @@ public class Island implements DataObject { */ public boolean addToBanList(UUID targetUUID) { // TODO fire ban event - ranks.put(targetUUID, BANNED_RANK); + members.put(targetUUID, BANNED_RANK); return true; } @@ -139,7 +140,7 @@ public class Island implements DataObject { */ public Set getBanned() { Set result = new HashSet<>(); - for (Entry member: ranks.entrySet()) { + for (Entry member: members.entrySet()) { if (member.getValue() <= BANNED_RANK) { result.add(member.getKey()); } @@ -187,7 +188,7 @@ public class Island implements DataObject { */ public Set getMembers(){ Set result = new HashSet<>(); - for (Entry member: ranks.entrySet()) { + for (Entry member: members.entrySet()) { if (member.getValue() >= MEMBER_RANK) { result.add(member.getKey()); } @@ -311,7 +312,7 @@ public class Island implements DataObject { * @return Returns true if target is banned on this island */ public boolean isBanned(UUID targetUUID) { - return ranks.containsKey(targetUUID) && ranks.get(targetUUID) == BANNED_RANK ? true : false; + return members.containsKey(targetUUID) && members.get(targetUUID) == BANNED_RANK ? true : false; } /** @@ -359,7 +360,7 @@ public class Island implements DataObject { */ public boolean removeFromBanList(UUID targetUUID) { // TODO fire unban event - ranks.remove(targetUUID); + members.remove(targetUUID); return true; } @@ -465,7 +466,7 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; - this.ranks.put(owner, OWNER_RANK); + this.members.put(owner, OWNER_RANK); } /** @@ -618,7 +619,7 @@ public class Island implements DataObject { } public void removeMember(UUID playerUUID) { - ranks.remove(playerUUID); + members.remove(playerUUID); } /** @@ -627,20 +628,29 @@ public class Island implements DataObject { * @return rank integer */ public int getRank(User user) { - return ranks.containsKey(user.getUniqueId()) ? ranks.get(user.getUniqueId()) : VISITOR_RANK; + return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : VISITOR_RANK; + } + + /** + * Set user's rank to an arbitrary rank value + * @param user + * @param rank + */ + public void setRank(User user, int rank) { + members.put(user.getUniqueId(), rank); } /** * @return the ranks */ public HashMap getRanks() { - return ranks; + return members; } /** * @param ranks the ranks to set */ public void setRanks(HashMap ranks) { - this.ranks = ranks; + this.members = ranks; } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java new file mode 100644 index 000000000..41a161bda --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java @@ -0,0 +1,165 @@ +package us.tastybento.bskyblock.managers; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import us.tastybento.bskyblock.BSkyBlock; + +public class RanksManager { + + // Constants that define the hard coded rank values + private static final String OWNER_RANK_REF = "ranks.owner"; + private static final String MEMBER_RANK_REF = "ranks.member"; + private static final String VISITOR_RANK_REF = "ranks.visitor"; + private static final String BANNED_RANK_REF = "ranks.banned"; + 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 BSkyBlock plugin; + + // The store of ranks + private LinkedHashMap ranks = new LinkedHashMap<>(); + { + // Hard coded ranks + addRank(OWNER_RANK_REF, OWNER_RANK); + addRank(MEMBER_RANK_REF, MEMBER_RANK); + addRank(VISITOR_RANK_REF, VISITOR_RANK); + addRank(BANNED_RANK_REF, BANNED_RANK); + } + + /** + * @param plugin + */ + public RanksManager(BSkyBlock plugin) { + super(); + this.plugin = plugin; + loadCustomRanks(); + } + + /** + * Loads the custom ranks from the settings + */ + public void loadCustomRanks() { + for (Entry en : plugin.getSettings().getCustomRanks().entrySet()) { + if (!addRank(en.getKey(),en.getValue())) { + plugin.getLogger().severe("Error loading custom rank: " + en.getKey() + " " + en.getValue() + " skipping..."); + } + } + } + + /** + * Try to add a new rank. Owner, member, visitor and banned ranks cannot be changed. + * @param reference + * @param value + * @return true if the rank was successfully added + */ + public boolean addRank(String reference, int value) { + if (reference.equalsIgnoreCase(OWNER_RANK_REF) + || reference.equalsIgnoreCase(MEMBER_RANK_REF) + || reference.equalsIgnoreCase(VISITOR_RANK_REF) + || reference.equalsIgnoreCase(BANNED_RANK_REF)) { + return false; + } + ranks.put(reference, value); + // Sort + ranks = ranks.entrySet().stream() + .sorted(Map.Entry.comparingByValue()) + .collect(Collectors.toMap( + Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + return true; + } + + /** + * Try to remove a rank. Owner, member, visitor and banned ranks cannot be removed. + * @param reference + * @return true if removed + */ + public boolean removeRank(String reference) { + if (reference.equalsIgnoreCase(OWNER_RANK_REF) + || reference.equalsIgnoreCase(MEMBER_RANK_REF) + || reference.equalsIgnoreCase(VISITOR_RANK_REF) + || reference.equalsIgnoreCase(BANNED_RANK_REF)) { + return false; + } + + return ranks.remove(reference) == null ? false : true; + } + + /** + * Get the rank value for this reference + * @param reference - locale reference to the name of this rank + * @return rank value or zero if this is an unknown rank + */ + public int getRankValue(String reference) { + return ranks.getOrDefault(reference, VISITOR_RANK); + } + + /** + * Get the ranks. Ranks are listed in ascending order + * @return immutable map of ranks + */ + public LinkedHashMap getRanks() { + return new LinkedHashMap<>(ranks); + } + + /** + * @return the ownerRankRef + */ + public static String getOwnerRankRef() { + return OWNER_RANK_REF; + } + + /** + * @return the memberRankRef + */ + public static String getMemberRankRef() { + return MEMBER_RANK_REF; + } + + /** + * @return the visitorRankRef + */ + public static String getVisitorRankRef() { + return VISITOR_RANK_REF; + } + + /** + * @return the bannedRankRef + */ + public static String getBannedRankRef() { + return BANNED_RANK_REF; + } + + /** + * @return the ownerRank + */ + public static Integer getOwnerRank() { + return OWNER_RANK; + } + + /** + * @return the memberRank + */ + public static Integer getMemberRank() { + return MEMBER_RANK; + } + + /** + * @return the visitorRank + */ + public static Integer getVisitorRank() { + return VISITOR_RANK; + } + + /** + * @return the bannedRank + */ + public static Integer getBannedRank() { + return BANNED_RANK; + } + +} From ba62989788362cb5d506bfb26912f4539fa63c9a Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 18:13:45 -0800 Subject: [PATCH 04/97] Shifted some constants around. --- .../bskyblock/database/objects/Island.java | 22 +++--- .../bskyblock/managers/RanksManager.java | 71 +++---------------- src/test/java/bskyblock/TestBSkyBlock.java | 5 +- 3 files changed, 20 insertions(+), 78 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 5f21ea13f..a24d6bd31 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -22,6 +22,7 @@ import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandUnlockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.Reason; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; /** @@ -34,11 +35,6 @@ import us.tastybento.bskyblock.util.Util; */ 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 = ""; public String getUniqueId() { @@ -102,7 +98,7 @@ public class Island implements DataObject { public Island(Location location, UUID owner, int protectionRange) { this.owner = owner; - this.members.put(owner, OWNER_RANK); + this.members.put(owner, RanksManager.OWNER_RANK); this.createdDate = System.currentTimeMillis(); this.updatedDate = System.currentTimeMillis(); this.world = location.getWorld(); @@ -120,7 +116,7 @@ public class Island implements DataObject { * @param playerUUID */ public void addMember(UUID playerUUID) { - members.put(playerUUID, MEMBER_RANK); + members.put(playerUUID, RanksManager.MEMBER_RANK); } /** @@ -131,7 +127,7 @@ public class Island implements DataObject { */ public boolean addToBanList(UUID targetUUID) { // TODO fire ban event - members.put(targetUUID, BANNED_RANK); + members.put(targetUUID, RanksManager.BANNED_RANK); return true; } @@ -141,7 +137,7 @@ public class Island implements DataObject { public Set getBanned() { Set result = new HashSet<>(); for (Entry member: members.entrySet()) { - if (member.getValue() <= BANNED_RANK) { + if (member.getValue() <= RanksManager.BANNED_RANK) { result.add(member.getKey()); } } @@ -189,7 +185,7 @@ public class Island implements DataObject { public Set getMembers(){ Set result = new HashSet<>(); for (Entry member: members.entrySet()) { - if (member.getValue() >= MEMBER_RANK) { + if (member.getValue() >= RanksManager.MEMBER_RANK) { result.add(member.getKey()); } } @@ -312,7 +308,7 @@ public class Island implements DataObject { * @return Returns true if target is banned on this island */ public boolean isBanned(UUID targetUUID) { - return members.containsKey(targetUUID) && members.get(targetUUID) == BANNED_RANK ? true : false; + return members.containsKey(targetUUID) && members.get(targetUUID) == RanksManager.BANNED_RANK ? true : false; } /** @@ -466,7 +462,7 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; - this.members.put(owner, OWNER_RANK); + this.members.put(owner, RanksManager.OWNER_RANK); } /** @@ -628,7 +624,7 @@ public class Island implements DataObject { * @return rank integer */ public int getRank(User user) { - return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : VISITOR_RANK; + return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : RanksManager.VISITOR_RANK; } /** diff --git a/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java index 41a161bda..3c2aba087 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java @@ -10,14 +10,14 @@ import us.tastybento.bskyblock.BSkyBlock; public class RanksManager { // Constants that define the hard coded rank values - private static final String OWNER_RANK_REF = "ranks.owner"; - private static final String MEMBER_RANK_REF = "ranks.member"; - private static final String VISITOR_RANK_REF = "ranks.visitor"; - private static final String BANNED_RANK_REF = "ranks.banned"; - 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; + public static final String OWNER_RANK_REF = "ranks.owner"; + public static final String MEMBER_RANK_REF = "ranks.member"; + public static final String VISITOR_RANK_REF = "ranks.visitor"; + public static final String BANNED_RANK_REF = "ranks.banned"; + public static final int OWNER_RANK = 1000; + public static final int MEMBER_RANK = 900; + public static final int VISITOR_RANK = 0; + public static final int BANNED_RANK = -1; private BSkyBlock plugin; @@ -106,60 +106,5 @@ public class RanksManager { return new LinkedHashMap<>(ranks); } - /** - * @return the ownerRankRef - */ - public static String getOwnerRankRef() { - return OWNER_RANK_REF; - } - - /** - * @return the memberRankRef - */ - public static String getMemberRankRef() { - return MEMBER_RANK_REF; - } - - /** - * @return the visitorRankRef - */ - public static String getVisitorRankRef() { - return VISITOR_RANK_REF; - } - - /** - * @return the bannedRankRef - */ - public static String getBannedRankRef() { - return BANNED_RANK_REF; - } - - /** - * @return the ownerRank - */ - public static Integer getOwnerRank() { - return OWNER_RANK; - } - - /** - * @return the memberRank - */ - public static Integer getMemberRank() { - return MEMBER_RANK; - } - - /** - * @return the visitorRank - */ - public static Integer getVisitorRank() { - return VISITOR_RANK; - } - - /** - * @return the bannedRank - */ - public static Integer getBannedRank() { - return BANNED_RANK; - } } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 2826cf748..d40a2df3b 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -35,6 +35,7 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; public class TestBSkyBlock { @@ -282,8 +283,8 @@ public class TestBSkyBlock { assertNotNull(island); User visitor = User.getInstance(UUID.randomUUID()); - assertEquals(1000, island.getRank(owner)); - assertEquals(0, island.getRank(visitor)); + assertEquals(RanksManager.OWNER_RANK, island.getRank(owner)); + assertEquals(RanksManager.VISITOR_RANK, island.getRank(visitor)); // Make members UUID member1 = UUID.randomUUID(); From f7b689855982fee18625ec3bdf5bb58b5a1f9aed Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 20:44:57 -0800 Subject: [PATCH 05/97] Added protection methods. --- .idea/misc.xml | 13 ++ .idea/modules.xml | 8 + .idea/vcs.xml | 6 + bskyblock.iml | 43 ++++ pom.xml | 13 ++ .../us/tastybento/bskyblock/BSkyBlock.java | 2 +- .../tastybento/bskyblock/api/flags/Flag.java | 1 + .../bskyblock/api/flags/FlagBuilder.java | 2 +- .../bskyblock/api/panels/PanelItem.java | 6 +- .../api/panels/builders/PanelItemBuilder.java | 7 +- .../bskyblock/database/objects/Island.java | 46 ++-- .../database/objects/NameToUUID.java | 68 ------ .../bskyblock/managers/FlagsManager.java | 10 +- .../bskyblock/util/YmlCommentParser.java | 215 ++++++++++++++++++ .../bskyblock/util/YmlConfiguration.java | 44 ++++ src/test/java/bskyblock/TestBSkyBlock.java | 92 ++++++-- 16 files changed, 455 insertions(+), 121 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 bskyblock.iml delete mode 100644 src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java create mode 100644 src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java create mode 100644 src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..e8942bd65 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..b7d631524 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/bskyblock.iml b/bskyblock.iml new file mode 100644 index 000000000..686b4846a --- /dev/null +++ b/bskyblock.iml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a0a08b04d..799b8bfc2 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ 1.8 UTF-8 UTF-8 + 1.7.1 clean package install @@ -75,6 +76,18 @@ 1.12.2-R0.1-SNAPSHOT provided + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito + ${powermock.version} + test + diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 760c7cc11..6ff4ce516 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -104,7 +104,7 @@ public class BSkyBlock extends JavaPlugin { registerListeners(); // Load Flags - flagsManager = new FlagsManager(); + flagsManager = new FlagsManager(plugin); // Load addons addonsManager = new AddonsManager(plugin); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 7061f6ee9..5c6cc8581 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -6,6 +6,7 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; +import us.tastybento.bskyblock.managers.FlagsManager; public class Flag { diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index d90a7f781..86cb54448 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -10,7 +10,7 @@ import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; public class FlagBuilder { private String id = ""; - private PanelItem icon = PanelItem.empty(); + private PanelItem icon; private Listener listener; public FlagBuilder id(String id) { diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java index 29860370b..f31a04ffd 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java @@ -19,13 +19,13 @@ public class PanelItem { } private ItemStack icon; - private Optional clickHandler; + private ClickHandler clickHandler; private List description; private String name; private boolean glow; private ItemMeta meta; - public PanelItem(ItemStack icon, String name, List description, boolean glow, Optional clickHandler) { + public PanelItem(ItemStack icon, String name, List description, boolean glow, ClickHandler clickHandler) { this.icon = icon; // Get the meta meta = icon.getItemMeta(); @@ -70,7 +70,7 @@ public class PanelItem { } public Optional getClickHandler() { - return clickHandler; + return Optional.of(clickHandler); } public boolean isGlow() { diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java index 956d87dd2..b53496cd7 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -16,7 +17,7 @@ public class PanelItemBuilder { private String name = ""; private List description = new ArrayList<>(); private boolean glow = false; - private Optional clickHandler = Optional.empty(); + private PanelItem.ClickHandler clickHandler; public PanelItemBuilder icon(Material icon) { this.icon = new ItemStack(icon); @@ -54,11 +55,13 @@ public class PanelItemBuilder { } public PanelItemBuilder clickHandler(ClickHandler clickHandler) { - this.clickHandler = Optional.of(clickHandler); + this.clickHandler = clickHandler; return this; } public PanelItem build() { + if (icon == null) + Bukkit.getLogger().info("DEBUG: icon is null"); return new PanelItem(icon, name, description, glow, clickHandler); } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index a24d6bd31..02562f2a7 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -88,7 +88,7 @@ public class Island implements DataObject { private boolean spawn = false; private boolean purgeProtected = false; //// Protection //// - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); private int levelHandicap; @@ -159,23 +159,23 @@ public class Island implements DataObject { } /** - * Get the Island Guard flag status + * Get the Island Guard flag ranking * @param flag - * @return true or false, or false if flag is not in the list + * @return flag rank. Players must have at least this rank to bypass this flag */ - public boolean getFlag(Flag flag){ + public int getFlag(Flag flag){ if(flags.containsKey(flag)) { return flags.get(flag); } else { - flags.put(flag, false); - return false; + flags.put(flag, RanksManager.MEMBER_RANK); + return RanksManager.MEMBER_RANK; } } /** * @return the flags */ - public HashMap getFlags() { + public HashMap getFlags() { return flags; } @@ -375,18 +375,18 @@ public class Island implements DataObject { } /** - * Set the Island Guard flag status + * Set the Island Guard flag rank * @param flag * @param value */ - public void setFlag(Flag flag, boolean value){ + public void setFlag(Flag flag, int value){ flags.put(flag, value); } /** * @param flags the flags to set */ - public void setFlags(HashMap flags) { + public void setFlags(HashMap flags) { this.flags = flags; } @@ -462,6 +462,12 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; + // Defensive code: demote any previous owner + for (Entry en : members.entrySet()) { + if (en.getValue().equals(RanksManager.OWNER_RANK)) { + en.setValue(RanksManager.MEMBER_RANK); + } + } this.members.put(owner, RanksManager.OWNER_RANK); } @@ -516,16 +522,6 @@ public class Island implements DataObject { this.world = world; } - /** - * Toggles the Island Guard flag status if it is in the list - * @param flag - */ - public void toggleFlag(Flag flag){ - if(flags.containsKey(flag)) { - flags.put(flag, !flags.get(flag)); - } - } - /** * @return the levelHandicap */ @@ -649,4 +645,14 @@ public class Island implements DataObject { public void setRanks(HashMap ranks) { this.members = ranks; } + + /** + * Check if a user is allowed to bypass the flag or not + * @param user - user + * @param flag - flag + * @return true if allowed, false if not + */ + public boolean isAllowed(User user, Flag flag) { + return (this.getRank(user) >= this.getFlag(flag)) ? true : false; + } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java b/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java deleted file mode 100644 index e60923b64..000000000 --- a/src/main/java/us/tastybento/bskyblock/database/objects/NameToUUID.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * - */ -package us.tastybento.bskyblock.database.objects; - -import java.util.HashMap; -import java.util.UUID; - -import us.tastybento.bskyblock.api.commands.User; - -/** - * A bean to hold name to UUID lookup - * @author tastybento - * - */ -public class NameToUUID implements DataObject { - - public HashMap namesToUUID; - - public NameToUUID() {} - - /** - * @return the namesToUUID - */ - public HashMap getNamesToUUID() { - return namesToUUID; - } - - /** - * @param namesToUUID the namesToUUID to set - */ - public void setNamesToUUID(HashMap namesToUUID) { - this.namesToUUID = namesToUUID; - } - - /* (non-Javadoc) - * @see us.tastybento.bskyblock.database.objects.DataObject#getUniqueId() - */ - @Override - public String getUniqueId() { - return "names-uuid"; - } - - /* (non-Javadoc) - * @see us.tastybento.bskyblock.database.objects.DataObject#setUniqueId(java.lang.String) - */ - @Override - public void setUniqueId(String uniqueId) { - // Do nothing - } - - /** - * Add or update a name - * @param user - */ - public void addName(User user) { - this.namesToUUID.put(user.getName(), user.getUniqueId()); - } - - /** - * Get UUID for name - * @param name - * @return UUID or null if not found - */ - public UUID getUUID(String name) { - return this.namesToUUID.get(name); - } -} diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 1bc1cc914..68c1ddb16 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -9,7 +9,13 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.panels.PanelItem; -public final class FlagsManager { +public class FlagsManager { + + private BSkyBlock plugin; + + public FlagsManager(BSkyBlock plugin) { + this.plugin = plugin; + } private List flags = new ArrayList<>(); @@ -17,7 +23,7 @@ public final class FlagsManager { //TODO all the security checks flags.add(flag); // If there is a listener, register it into Bukkit. - flag.getListener().ifPresent(l -> Bukkit.getPluginManager().registerEvents(l, BSkyBlock.getInstance())); + flag.getListener().ifPresent(l -> plugin.getServer().getPluginManager().registerEvents(l, plugin)); } public List getFlags() { diff --git a/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java new file mode 100644 index 000000000..1f15f0c52 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java @@ -0,0 +1,215 @@ +package us.tastybento.bskyblock.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A very simplistic yml parser, that only do the following: + *
    + *
  1. Keep track of indentation-levels and sections.
  2. + *
  3. Handle comments.
  4. + *
+ */ +public class YmlCommentParser { + private static final Logger log = Logger.getLogger(YmlCommentParser.class.getName()); + private static final Pattern SECTION_PATTERN = Pattern.compile("^(?\\s*)(?[^ \\-][^:]*):(?[^#]*)?(?#.*)?"); + private static final Pattern COMMENT_PATTERN = Pattern.compile("^(?\\s*)(?#.*)"); + private Map commentMap = new HashMap<>(); + + public Map getCommentMap() { + return Collections.unmodifiableMap(commentMap); + } + + + public void addComment(String path, String comment) { + commentMap.put(path, comment); + } + + public void addComments(Map comments) { + commentMap.putAll(comments); + } + + private void readLines(BufferedReader rdr) throws IOException { + int indentLevel = 0; + Deque
sections = new ArrayDeque<>(); + StringBuilder comments = new StringBuilder(); + String baseKey = null; + sections.add(new Section(null, 0)); + String line; + int lineNum = 1; + boolean isFirstAfterSection = true; + while ((line = rdr.readLine()) != null) { + Matcher commentM = COMMENT_PATTERN.matcher(line); + Matcher sectionM = SECTION_PATTERN.matcher(line); + if (commentM.matches()) { + comments.append(commentM.group("comment") + "\n"); + } else if (sectionM.matches()) { + String comment = sectionM.group("comment"); + if (comment != null && !comment.trim().isEmpty()) { + comments.append(comment + "\n"); + } + String name = sectionM.group("name").trim(); + String value = sectionM.group("value"); + String indent = sectionM.group("indent"); + if (isFirstAfterSection && indent.length() > indentLevel) { + indentLevel = indent.length(); + sections.peek().setIndentation(indentLevel); + } else if (indent.length() < indentLevel) { + while (indent.length() < indentLevel && !sections.isEmpty()) { + sections.pop(); + baseKey = sections.peek().getPath(); + indentLevel = sections.peek().getIndentation(); + isFirstAfterSection = false; + } + } + String path = getPath(baseKey, name); + if (value != null && !value.trim().isEmpty()) { + // Scalar with value + addComments(path, comments); + if (!isFirstAfterSection && indent.length() > indentLevel) { + log.warning("line " + lineNum + ": mixed indentation, expected " + indentLevel + " but got " + indent.length()); + } + isFirstAfterSection = false; + } else if (indent.length() >= indentLevel) { + indentLevel = indent.length(); + sections.push(createSection(path, indentLevel, comments)); + baseKey = path; + isFirstAfterSection = true; + } + } else if (line.trim().isEmpty()) { + // Currently gathered comments are reset - they are "floating", decoupled from sections. + comments.setLength(0); + comments.trimToSize(); + } + lineNum++; + } + } + + private String getPath(String baseKey, String name) { + return baseKey != null ? baseKey + "." + name : name; + } + + private Section createSection(String path, int indentLevel, StringBuilder comments) { + Section section = new Section(path, indentLevel); + addComments(path, comments); + return section; + } + + private void addComments(String path, StringBuilder comments) { + if (comments.length() > 0) { + commentMap.put(path, comments.toString()); + comments.setLength(0); + comments.trimToSize(); + } + } + + public String getComment(String path) { + return commentMap.get(path); + } + + /** + * Merges the comments into the "pure" yml. + * @param ymlPure A YML data-tree, without comments. + * @return A YML data-tree including comments. + */ + public String mergeComments(String ymlPure) { + StringBuilder sb = new StringBuilder(); + boolean isFirstAfterSection = true; + Deque
sections = new ArrayDeque<>(); + sections.push(new Section(null, 0)); + int indentLevel = 0; + String baseKey = null; + int lineNum = 1; + // First section shares comments with the header - so ignore that one + boolean isHeader = true; + for (String line : ymlPure.split("\n")) { + // Skip header + Matcher commentM = COMMENT_PATTERN.matcher(line); + if (isHeader && (commentM.matches() || line.trim().isEmpty())) { + continue; // Skip header + } + isHeader = false; + Matcher sectionM = SECTION_PATTERN.matcher(line); + if (sectionM.matches()) { + String name = sectionM.group("name").trim(); + String value = sectionM.group("value"); + String indent = sectionM.group("indent"); + if (isFirstAfterSection && indent.length() > indentLevel) { + indentLevel = indent.length(); + sections.peek().setIndentation(indentLevel); + } else if (indent.length() < indentLevel) { + while (indent.length() < indentLevel && !sections.isEmpty()) { + sections.pop(); + baseKey = sections.peek().getPath(); + indentLevel = sections.peek().getIndentation(); + isFirstAfterSection = false; + } + } + String path = getPath(baseKey, name); + String comment = getComment(path); + if (comment != null) { + sb.append((lineNum > 1 ? "\n" : "") + comment + .replaceAll("^#", Matcher.quoteReplacement(indent + "#")) + .replaceAll("\n#", Matcher.quoteReplacement("\n" + indent + "#"))); + } + if (value != null && !value.trim().isEmpty()) { + // Scalar with value + isFirstAfterSection = false; + } else if (indent.length() >= indentLevel) { + indentLevel = indent.length(); + sections.push(new Section(path, indentLevel)); + baseKey = path; + isFirstAfterSection = true; + } + } + lineNum++; + sb.append(line + "\n"); + } + return sb.toString().replaceAll("\r\n", "\n").replaceAll("\n\r", "\n").replaceAll("\n", "\r\n"); + } + + public void load(Reader reader) throws IOException { + readLines(new BufferedReader(reader)); + } + + public void loadFromString(String contents) { + try { + readLines(new BufferedReader(new StringReader(contents))); + } catch (IOException e) { + throw new IllegalStateException("Unable to read from string", e); + } + } + + + private static class Section { + private int indentation; + private final String path; + + private Section(String name, int indentation) { + this.indentation = indentation; + this.path = name; + } + + public int getIndentation() { + return indentation; + } + + public String getPath() { + return path; + } + + public void setIndentation(int indentLevel) { + indentation = indentLevel; + } + } +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java b/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java new file mode 100644 index 000000000..8ca1b6769 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/YmlConfiguration.java @@ -0,0 +1,44 @@ +package us.tastybento.bskyblock.util; + +import java.util.Map; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; + +/** + * A YamlConfiguration that supports comments + * + * Note: This includes a VERY SIMPLISTIC Yaml-parser, which sole purpose is to detect and store comments. + */ +public class YmlConfiguration extends YamlConfiguration { + private YmlCommentParser commentParser = new YmlCommentParser(); + + public String getComment(String key) { + String comment = commentParser.getComment(key); + return comment != null ? comment.replaceAll("^# ?", "").replaceAll("\n# ?", "") : null; + } + + public Map getComments() { + return commentParser.getCommentMap(); + } + + public void addComment(String path, String comment) { + commentParser.addComment(path, comment); + } + public void addComments(Map comments) { + commentParser.addComments(comments); + } + + @Override + public void loadFromString(String contents) throws InvalidConfigurationException { + super.loadFromString(contents); + commentParser.loadFromString(contents); + } + + @Override + public String saveToString() { + String ymlPure = super.saveToString(); + return commentParser.mergeComments(ymlPure); + } + +} \ No newline at end of file diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index d40a2df3b..18836760f 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -1,33 +1,22 @@ package bskyblock; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.logging.Logger; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.ItemFactory; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mockito; - +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; +import org.powermock.modules.junit4.PowerMockRunner; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; @@ -35,15 +24,30 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; +import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; +import java.util.*; +import java.util.Map.Entry; +import java.util.logging.Logger; + +import static org.junit.Assert.*; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +//@RunWith(PowerMockRunner.class) +//@SuppressStaticInitializationFor("us.tastybento.BSkyBlock") +//@PrepareForTest( { BSkyBlock.class }) public class TestBSkyBlock { private final UUID playerUUID = UUID.randomUUID(); private static CommandSender sender; private static Player player; private static Location location; private static BSkyBlock plugin; + private static FlagsManager flagsManager; @BeforeClass public static void setUp() { @@ -72,7 +76,19 @@ public class TestBSkyBlock { Mockito.when(location.getBlockX()).thenReturn(0); Mockito.when(location.getBlockY()).thenReturn(0); Mockito.when(location.getBlockZ()).thenReturn(0); - + + // This doesn't work! + /* + mockStatic(Bukkit.class); + ItemFactory itemFactory = PowerMockito.mock(ItemFactory.class); + PowerMockito.when(Bukkit.getItemFactory()).thenReturn(itemFactory); + PowerMockito.when(itemFactory.getItemMeta(any())).thenReturn(PowerMockito.mock(ItemMeta.class)); + + mockStatic(BSkyBlock.class); + flagsManager = mock(FlagsManager.class); + PowerMockito.when(BSkyBlock.getInstance()).thenReturn(plugin); + Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); + */ } @Test @@ -265,8 +281,7 @@ public class TestBSkyBlock { @Override public boolean execute(User user, List args) { Bukkit.getLogger().info("args are " + args.toString()); - if (args.size() == 3) return true; - return false; + return args.size() == 3 ? true : false; } } @@ -325,8 +340,37 @@ public class TestBSkyBlock { island.removeFromBanList(member1); assertFalse(island.getBanned().contains(member1)); - - //island.isAllowed(visitor, Flags.BREAK_BLOCKS); + // Protection + // Set up protection settings - members can break blocks, visitors and place blocks + // These tests do not work because of static method calls in the code and Bukkit. + /* + island.setFlag(Flags.BREAK_BLOCKS, RanksManager.MEMBER_RANK); + island.setFlag(Flags.PLACE_BLOCKS, RanksManager.VISITOR_RANK); + + // Owner should be able to do anything + assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(owner, Flags.BREAK_BLOCKS)); + + // Visitor can only place blocks + assertTrue(island.isAllowed(visitor, Flags.PLACE_BLOCKS)); + assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); + + // Check if the members have capability + User mem1 = User.getInstance(member1); + User mem2 = User.getInstance(member2); + User mem3 = User.getInstance(member3); + + assertTrue(island.isAllowed(mem1, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem1, Flags.BREAK_BLOCKS)); + + assertTrue(island.isAllowed(mem2, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem2, Flags.BREAK_BLOCKS)); + + // Member 3 is no longer a member and is a visitor + assertTrue(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); + +*/ /* * * Score approach: From 085db6cb21b57dae32aefb39803011b4c245fe5c Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 28 Jan 2018 20:52:06 -0800 Subject: [PATCH 06/97] Added in config and locale settings for ranks. --- config.yml | 7 +++++++ locales/en-US.yml | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/config.yml b/config.yml index 199e5d6ca..3452a8944 100644 --- a/config.yml +++ b/config.yml @@ -273,6 +273,13 @@ island: # Permission size cannot be less than the default below. max-team-size: 4 + # Ranks for players + # Pre-defined ranks are: + # Owner (1000), Member (700), Visitor (0) and Banned (-1) + # Rank names should be references to locale settings and must be in quotes + # like "ranks.coop". + "ranks.coop": 100 + # Default maximum number of homes a player can have. Min = 1 # Accessed via sethome or go # Use this permission to set for specific user groups: askyblock.island.maxhomes. diff --git a/locales/en-US.yml b/locales/en-US.yml index 067e6ca17..54cbf3463 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -134,6 +134,13 @@ commands: description: "select language" parameters: "" +ranks: + owner: "Owner" + member: "Member" + coop: "Coop" + visitor: "Visitor" + banned: "Banned" + protection: flags: ACID_DAMAGE: "Acid damage" From 177023f314a267ec0bd35c6e1d1e95b54cbffa7b Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 30 Jan 2018 16:59:10 -0800 Subject: [PATCH 07/97] Added code to support protection flag listeners. Made getIslandsAt() Optional to enable better code structures in the listeners. Created an abstract class to simplify flag protection listeners. Added default setting for flags that will be able to be set by config. This default is used for any space in the worlds not occupied by an island. --- config.yml | 4 +- locales/en-US.yml | 1 + .../us/tastybento/bskyblock/Settings.java | 31 ++--- .../tastybento/bskyblock/api/flags/Flag.java | 12 +- .../bskyblock/api/flags/FlagBuilder.java | 13 +- .../database/managers/PlayersManager.java | 8 +- .../managers/island/IslandsManager.java | 62 ++++------ .../bskyblock/listeners/FlagListener.java | 112 ++++++++++++++++++ .../listeners/JoinLeaveListener.java | 3 +- .../listeners/flags/BreakBlocksListener.java | 42 ++++++- .../listeners/flags/PlaceBlocksListener.java | 41 ++++++- .../listeners/protection/FlyingMobEvents.java | 8 +- .../bskyblock/util/SafeSpotTeleport.java | 2 +- src/test/java/bskyblock/TestBSkyBlock.java | 37 +++--- 14 files changed, 282 insertions(+), 94 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java diff --git a/config.yml b/config.yml index 3452a8944..8dbe431e9 100644 --- a/config.yml +++ b/config.yml @@ -70,7 +70,9 @@ general: mute-death-messages: false # Allow FTB Autonomous Activator to work (will allow a pseudo player [CoFH] to place and break blocks and hang items) - allow-FTB-auto-activator: false + # Add other fake player names here if required + fakeplayers: + - "[CoFH]" # Allow obsidian to be scooped up with an empty bucket back into lava # This only works if there is a single block of obsidian (no obsidian within 10 blocks) diff --git a/locales/en-US.yml b/locales/en-US.yml index 54cbf3463..0f8aa5c90 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -142,6 +142,7 @@ ranks: banned: "Banned" protection: + protected: "&cIsland protected!" flags: ACID_DAMAGE: "Acid damage" ANVIL: "Use anvil" diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index a63dd8134..7a4505770 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -3,7 +3,9 @@ package us.tastybento.bskyblock; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -66,9 +68,8 @@ public class Settings implements ISettings { @ConfigEntry(path = "general.database.backup-period") private int databaseBackupPeriod = 5; - //TODO change allowAutoActivator to the fakePlayers introduced in ASB 3.0.8 - @ConfigEntry(path = "general.allow-FTB-auto-activators") - private boolean allowAutoActivator = false; + @ConfigEntry(path = "general.fakeplayers") + private Set fakePlayers = new HashSet<>(); @ConfigEntry(path = "general.allow-obsidian-scooping") private boolean allowObsidianScooping = true; @@ -537,12 +538,6 @@ public class Settings implements ISettings { public boolean isAcidDamageOp() { return acidDamageOp; } - /** - * @return the allowAutoActivator - */ - public boolean isAllowAutoActivator() { - return allowAutoActivator; - } /** * @return the allowChestDamage */ @@ -771,12 +766,6 @@ public class Settings implements ISettings { public void setAcidRainDamage(int acidRainDamage) { this.acidRainDamage = acidRainDamage; } - /** - * @param allowAutoActivator the allowAutoActivator to set - */ - public void setAllowAutoActivator(boolean allowAutoActivator) { - this.allowAutoActivator = allowAutoActivator; - } /** * @param allowChestDamage the allowChestDamage to set */ @@ -1216,6 +1205,18 @@ public class Settings implements ISettings { public void setWorldName(String worldName) { this.worldName = worldName; } + /** + * @return the fakePlayers + */ + public Set getFakePlayers() { + return fakePlayers; + } + /** + * @param fakePlayers the fakePlayers to set + */ + public void setFakePlayers(Set fakePlayers) { + this.fakePlayers = fakePlayers; + } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 5c6cc8581..fe3252a73 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -6,15 +6,15 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; -import us.tastybento.bskyblock.managers.FlagsManager; public class Flag { private String id; private PanelItem icon; private Listener listener; + private boolean defaultSetting; - public Flag(String id, PanelItem icon, Listener listener) { + public Flag(String id, PanelItem icon, Listener listener, boolean defaultSetting) { this.id = id; this.icon = icon; this.listener = listener; @@ -32,4 +32,12 @@ public class Flag { public Optional getListener() { return Optional.of(listener); } + + public boolean isAllowed() { + return defaultSetting; + } + + public void setDefaultSetting(boolean defaultSetting) { + this.defaultSetting = defaultSetting; + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 86cb54448..4713203e3 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -12,6 +12,7 @@ public class FlagBuilder { private String id = ""; private PanelItem icon; private Listener listener; + private boolean defaultSetting; public FlagBuilder id(String id) { this.id = id; @@ -37,6 +38,16 @@ public class FlagBuilder { } public Flag build() { - return new Flag(id, icon, listener); + return new Flag(id, icon, listener, defaultSetting); + } + + /** + * Sets the default setting for this flag in the world + * @param setting + * @return + */ + public FlagBuilder allowedByDefault(boolean setting) { + this.defaultSetting = setting; + return this; } } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java index adf85eb16..1c269292f 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -376,11 +377,8 @@ public class PlayersManager{ if (loc == null) return null; // Look in the grid - Island island = plugin.getIslands().getIslandAt(loc); - if (island != null) { - return island.getOwner(); - } - return null; + Optional island = plugin.getIslands().getIslandAt(loc); + return island.map(x->x.getOwner()).orElse(null); } /** diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 2facd150a..023611019 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -2,6 +2,7 @@ package us.tastybento.bskyblock.database.managers.island; import java.util.Collection; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -160,11 +161,12 @@ public class IslandsManager { height = i; depth = i; } else { - Island island = getIslandAt(l); - if (island == null) { + + Optional island = getIslandAt(l); + if (!island.isPresent()) { return null; } - i = island.getProtectionRange(); + i = island.get().getProtectionRange(); height = l.getWorld().getMaxHeight() - l.getBlockY(); depth = l.getBlockY(); } @@ -344,28 +346,28 @@ public class IslandsManager { } /** - * Returns the island at the location or null if there is none. + * Returns the island at the location or Optional empty if there is none. * This includes the full island space, not just the protected area * * @param location * @return Island object */ - public Island getIslandAt(Location location) { + public Optional getIslandAt(Location location) { if (location == null) { //plugin.getLogger().info("DEBUG: location is null"); - return null; + return Optional.empty(); } // World check if (!Util.inWorld(location)) { //plugin.getLogger().info("DEBUG: not in right world"); - return null; + return Optional.empty(); } // Check if it is spawn if (spawn != null && spawn.onIsland(location)) { //plugin.getLogger().info("DEBUG: spawn"); - return spawn; + return Optional.of(spawn); } - return getIslandAt(location.getBlockX(), location.getBlockZ()); + return Optional.ofNullable(getIslandAt(location.getBlockX(), location.getBlockZ())); } /** @@ -405,31 +407,20 @@ public class IslandsManager { } /** - * Returns the island being public at the location or null if there is none + * Returns the island being public at the location or Optional Empty if there is none * * @param location - * @return Island object + * @return Optional Island object */ - public Island getProtectedIslandAt(Location location) { + + public Optional getProtectedIslandAt(Location location) { //plugin.getLogger().info("DEBUG: getProtectedIslandAt " + location); // Try spawn if (spawn != null && spawn.onIsland(location)) { - return spawn; + return Optional.of(spawn); } - Island island = getIslandAt(location); - if (island == null) { - if (DEBUG2) - plugin.getLogger().info("DEBUG: no island at this location"); - return null; - } - if (island.onIsland(location)) { - if (DEBUG2) - plugin.getLogger().info("DEBUG: on island"); - return island; - } - if (DEBUG2) - plugin.getLogger().info("DEBUG: not in island protection zone"); - return null; + Optional island = getIslandAt(location); + return island.map(x->x.onIsland(location) ? island.get() : null); } /** @@ -760,15 +751,8 @@ public class IslandsManager { // Must be in the same world as the locations being checked // Note that getWorld can return null if a world has been deleted on the server if (islandTestLocation != null && islandTestLocation.getWorld() != null && islandTestLocation.getWorld().equals(loc.getWorld())) { - int protectionRange = plugin.getSettings().getIslandProtectionRange(); - if (getIslandAt(islandTestLocation) != null) { - // Get the protection range for this location if possible - Island island = getProtectedIslandAt(islandTestLocation); - if (island != null) { - // We are in a protected island area. - protectionRange = island.getProtectionRange(); - } - } + int protectionRange = getIslandAt(islandTestLocation).map(x->x.getProtectionRange()) + .orElse(plugin.getSettings().getIslandProtectionRange()); if (loc.getX() > islandTestLocation.getX() - protectionRange && loc.getX() < islandTestLocation.getX() + protectionRange && loc.getZ() > islandTestLocation.getZ() - protectionRange @@ -793,15 +777,15 @@ public class IslandsManager { return false; } // Get the player's island from the grid if it exists - Island island = getIslandAt(loc); - if (island != null) { + Optional island = getIslandAt(loc); + if (island.isPresent()) { //plugin.getLogger().info("DEBUG: island here is " + island.getCenter()); // On an island in the grid //plugin.getLogger().info("DEBUG: onIsland = " + island.onIsland(loc)); //plugin.getLogger().info("DEBUG: members = " + island.getMembers()); //plugin.getLogger().info("DEBUG: player UUID = " + player.getUniqueId()); - if (island.onIsland(loc) && island.getMembers().contains(player.getUniqueId())) { + if (island.get().onIsland(loc) && island.get().getMembers().contains(player.getUniqueId())) { //plugin.getLogger().info("DEBUG: allowed"); // In a protected zone but is on the list of acceptable players return true; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java new file mode 100644 index 000000000..1ee308626 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java @@ -0,0 +1,112 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.PlayerLeashEntityEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.event.inventory.InventoryPickupItemEvent; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; + +/** + * Abstract class for flag listeners to inherit. Provides some common code. + * @author ben + * + */ +public abstract class FlagListener implements Listener { + + private static final boolean DEBUG = false; + protected BSkyBlock plugin; + protected User user; + + public FlagListener(BSkyBlock plugin) { + super(); + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onEvent(Event e) { + if (DEBUG) { + plugin.getLogger().info(e.getEventName()); + } + } + + /* + * The following methods cover the cancellable events and enable a simple noGo(e) to be used to cancel and send the error message + */ + /** + * Sends the island protected message to user + * @param e + */ + protected void noGo(BlockBreakEvent e) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + + /** + * Sends the island protected message to user + * @param e + */ + protected void noGo(BlockPlaceEvent e) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + + /** + * Sends the island protected message to user + * @param e + */ + protected void noGo(InventoryPickupItemEvent e) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + + /** + * Sends the island protected message to user + * @param e + */ + protected void noGo(PlayerLeashEntityEvent e) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + + /** + * Sends the island protected message to user + * @param e + */ + protected void noGo(InventoryMoveItemEvent e) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + + /** + * Check if loc is in the island worlds + * @param loc + * @return true if the location is in the island worlds + */ + protected boolean inWorld(Location loc) { + return (loc.getWorld().equals(plugin.getIslandWorldManager().getIslandWorld()) + || loc.getWorld().equals(plugin.getIslandWorldManager().getNetherWorld()) + || loc.getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) ? true : false; + } + + /** + * Check if the entity is in the island worlds + * @param entity - the entity + * @return true if in world + */ + protected boolean inWorld(Entity entity) { + return inWorld(entity.getLocation()); + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java index f389419b3..90c313771 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java @@ -1,5 +1,6 @@ package us.tastybento.bskyblock.listeners; +import java.util.Optional; import java.util.UUID; import org.bukkit.event.EventHandler; @@ -67,7 +68,7 @@ public class JoinLeaveListener implements Listener { } // Check if they logged in to a locked island and expel them or if they are banned - Island currentIsland = plugin.getIslands().getIslandAt(user.getLocation()); + Island currentIsland = plugin.getIslands().getIslandAt(user.getLocation()).orElse(null); if (currentIsland != null && (currentIsland.isLocked() || plugin.getPlayers().isBanned(currentIsland.getOwner(),user.getUniqueId()))) { if (DEBUG) plugin.getLogger().info("DEBUG: Current island is locked, or player is banned"); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index fac279a06..b29da55e2 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -1,6 +1,44 @@ package us.tastybento.bskyblock.listeners.flags; -import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockBreakEvent; -public class BreakBlocksListener implements Listener { +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.listeners.FlagListener; +import us.tastybento.bskyblock.lists.Flags; + +public class BreakBlocksListener extends FlagListener { + + public BreakBlocksListener() { + super(BSkyBlock.getInstance()); + } + + /** + * Prevents blocks from being broken + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockBreak(final BlockBreakEvent e) { + + // If this is not an Island World, skip + if (!inWorld(e.getPlayer())) return; + + // Handle fake players + if (plugin.getSettings().getFakePlayers().contains(e.getPlayer().getName())) return; + + // Real players + // Get the island and if present, check the flag, react if required and return + plugin.getIslands().getIslandAt(e.getBlock().getLocation()).ifPresent(x -> { + if (!x.isAllowed(User.getInstance(e.getPlayer()), Flags.BREAK_BLOCKS)) noGo(e); + return; + }); + + // The player is in the world, but not on an island, so general world settings apply + if (!Flags.BREAK_BLOCKS.isAllowed()) noGo(e); + } + + } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index fcbd359be..193d6c618 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -1,6 +1,43 @@ package us.tastybento.bskyblock.listeners.flags; -import org.bukkit.event.Listener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; -public class PlaceBlocksListener implements Listener { +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.listeners.FlagListener; +import us.tastybento.bskyblock.lists.Flags; + +public class PlaceBlocksListener extends FlagListener { + + public PlaceBlocksListener() { + super(BSkyBlock.getInstance()); + } + + /** + * Prevents blocks from being broken + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockPlace(final BlockPlaceEvent e) { + + // If this is not an Island World, skip + if (!inWorld(e.getPlayer())) return; + + // Handle fake players + if (plugin.getSettings().getFakePlayers().contains(e.getPlayer().getName())) return; + + // Real players + // Get the island and if present, check the flag, react if required and return + plugin.getIslands().getIslandAt(e.getBlock().getLocation()).ifPresent(x -> { + if (!x.isAllowed(User.getInstance(e.getPlayer()), Flags.PLACE_BLOCKS)) noGo(e); + return; + }); + + // The player is in the world, but not on an island, so general world settings apply + if (!Flags.PLACE_BLOCKS.isAllowed()) noGo(e); + } + } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java index 01f2ba36b..50849dc26 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java @@ -86,13 +86,7 @@ public class FlyingMobEvents implements Listener { plugin.getLogger().info("Flying mobs " + e.getEventName()); } // Store where this mob originated - Island island = plugin.getIslands().getIslandAt(e.getLocation()); - if (island != null) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: Mob spawned on known island - id = " + e.getEntity().getUniqueId()); - } - mobSpawnInfo.put(e.getEntity(),island); - } // Else do nothing - maybe an Op spawned it? If so, on their head be it! + plugin.getIslands().getIslandAt(e.getLocation()).map(island->mobSpawnInfo.put(e.getEntity(),island)); } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index 14fd4b281..edf7af39d 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -67,7 +67,7 @@ public class SafeSpotTeleport { //this.plugin = plugin; //plugin.getLogger().info("DEBUG: running safe spot"); // Get island - Island island = plugin.getIslands().getIslandAt(islandLoc); + Island island = plugin.getIslands().getIslandAt(islandLoc).orElse(null); if (island != null) { final World world = islandLoc.getWorld(); // Get the chunks diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 18836760f..25d14199c 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -1,22 +1,33 @@ package bskyblock; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.logging.Logger; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.ItemFactory; import org.junit.BeforeClass; import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; -import org.powermock.modules.junit4.PowerMockRunner; + import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; @@ -24,20 +35,10 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; import us.tastybento.bskyblock.database.objects.Island; -import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; -import java.util.*; -import java.util.Map.Entry; -import java.util.logging.Logger; - -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.powermock.api.mockito.PowerMockito.mockStatic; - //@RunWith(PowerMockRunner.class) //@SuppressStaticInitializationFor("us.tastybento.BSkyBlock") //@PrepareForTest( { BSkyBlock.class }) From 5b087c83e7c9e5c64ae283fc38950c02f98ca9d5 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 30 Jan 2018 17:00:09 -0800 Subject: [PATCH 08/97] Fixed comment. --- .../bskyblock/listeners/flags/PlaceBlocksListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index 193d6c618..d4922b637 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -16,7 +16,7 @@ public class PlaceBlocksListener extends FlagListener { } /** - * Prevents blocks from being broken + * Prevents blocks from being placed * * @param e */ From 4fe94bee3b082730b708f71e62fe8a7c24e0eeb3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 31 Jan 2018 15:46:38 -0800 Subject: [PATCH 09/97] Finished up the place and break block listeners. There's a lot more that needs to be checked in these listeners! I moved some common methods into the abstract class because they will be used again and again by other listeners. Added an anvil listener. Added the flags. They were from ASkyBlock so may have name changes. --- pom.xml | 34 ++-- .../bskyblock/api/commands/User.java | 6 + .../bskyblock/listeners/FlagListener.java | 177 ++++++++++++------ .../listeners/flags/AnvilListener.java | 39 ++++ .../listeners/flags/BreakBlocksListener.java | 137 ++++++++++++-- .../listeners/flags/PlaceBlocksListener.java | 87 +++++++-- .../us/tastybento/bskyblock/lists/Flags.java | 44 +++++ 7 files changed, 413 insertions(+), 111 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java diff --git a/pom.xml b/pom.xml index 799b8bfc2..d9b064db8 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,12 @@ + + org.bukkit + bukkit + 1.12.2-R0.1-SNAPSHOT + provided + org.mockito mockito-all @@ -71,28 +77,22 @@ test - org.bukkit - bukkit - 1.12.2-R0.1-SNAPSHOT - provided + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito + ${powermock.version} + test - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito - ${powermock.version} - test - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + https://hub.spigotmc.org/nexus/content/repositories/snapshots diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/User.java b/src/main/java/us/tastybento/bskyblock/api/commands/User.java index 1826e3848..ce59e3556 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/User.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/User.java @@ -257,4 +257,10 @@ public class User { return Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage()); } + + @SuppressWarnings("deprecation") + public void updateInventory() { + player.updateInventory(); + + } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java index 1ee308626..dedf42541 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java @@ -3,20 +3,19 @@ */ package us.tastybento.bskyblock.listeners; +import java.util.Optional; + import org.bukkit.Location; import org.bukkit.entity.Entity; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.PlayerLeashEntityEvent; -import org.bukkit.event.inventory.InventoryMoveItemEvent; -import org.bukkit.event.inventory.InventoryPickupItemEvent; +import org.bukkit.event.player.PlayerEvent; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.database.objects.Island; /** * Abstract class for flag listeners to inherit. Provides some common code. @@ -24,71 +23,74 @@ import us.tastybento.bskyblock.api.commands.User; * */ public abstract class FlagListener implements Listener { - - private static final boolean DEBUG = false; + protected BSkyBlock plugin; - protected User user; - + private User user = null; + public FlagListener(BSkyBlock plugin) { super(); this.plugin = plugin; } - - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onEvent(Event e) { - if (DEBUG) { - plugin.getLogger().info(e.getEventName()); - } + + /** + * Sets the player associated with this event. + * If the user is a fake player, they are not counted. + * @param e - the event + * @return user or empty + */ + protected Optional getEventUser(Event e) { + // Set the user + if (e instanceof PlayerEvent) { + user = User.getInstance(((PlayerEvent)e).getPlayer()); + // Handle fake players + if (plugin.getSettings().getFakePlayers().contains(user.getName())) user = null; + } + return Optional.ofNullable(user); + } + + /** + * Explicitly set the user + * @param user + */ + protected void setUser(User user) { + this.user = user; + } + + /** + * Get the user associated with this event + * @return User or null + */ + protected User getUser() { + return user; } /* * The following methods cover the cancellable events and enable a simple noGo(e) to be used to cancel and send the error message */ + /** - * Sends the island protected message to user - * @param e + * Cancels the event and sends the island protected message to user + * @param e Event */ - protected void noGo(BlockBreakEvent e) { - e.setCancelled(true); - user.sendMessage("protection.protected"); + protected void noGo(Event e) { + noGo(e, false); } - + /** - * Sends the island protected message to user - * @param e + * Cancels the event and sends the island protected message to user unless silent is true + * @param e Event + * @param silent - if true, message is not sent */ - protected void noGo(BlockPlaceEvent e) { - e.setCancelled(true); - user.sendMessage("protection.protected"); + protected void noGo(Event e, boolean silent) { + if (e instanceof Cancellable) + ((Cancellable)e).setCancelled(true); + if (user != null) { + if (!silent) + user.sendMessage("protection.protected"); + user.updateInventory(); + } } - - /** - * Sends the island protected message to user - * @param e - */ - protected void noGo(InventoryPickupItemEvent e) { - e.setCancelled(true); - user.sendMessage("protection.protected"); - } - - /** - * Sends the island protected message to user - * @param e - */ - protected void noGo(PlayerLeashEntityEvent e) { - e.setCancelled(true); - user.sendMessage("protection.protected"); - } - - /** - * Sends the island protected message to user - * @param e - */ - protected void noGo(InventoryMoveItemEvent e) { - e.setCancelled(true); - user.sendMessage("protection.protected"); - } - + /** * Check if loc is in the island worlds * @param loc @@ -99,7 +101,7 @@ public abstract class FlagListener implements Listener { || loc.getWorld().equals(plugin.getIslandWorldManager().getNetherWorld()) || loc.getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) ? true : false; } - + /** * Check if the entity is in the island worlds * @param entity - the entity @@ -108,5 +110,64 @@ public abstract class FlagListener implements Listener { protected boolean inWorld(Entity entity) { return inWorld(entity.getLocation()); } - + + /** + * Check if user is in the island worlds + * @param user - a user + * @return true if in world + */ + protected boolean inWorld(User user) { + return inWorld(user.getLocation()); + } + + /** + * Generic place blocks checker + * @param e + * @param loc + * @return true if the check is okay, false if it was disallowed + */ + protected boolean checkIsland(Event e, Location loc, Flag flag) { + return checkIsland(e, loc, flag, false); + } + + + + /** + * Generic place blocks checker + * @param e + * @param loc + * @param silent - if true, no attempt is made to tell the user + * @return true if the check is okay, false if it was disallowed + */ + protected boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { + // If the user is not set, try to get it from the event + if (getUser() == null) { + // Set the user associated with this event + if (!getEventUser(e).isPresent()) return true; + } + // If this is not an Island World, skip + if (!inWorld(getUser())) return true; + + // Get the island and if present, check the flag, react if required and return + Optional island = plugin.getIslands().getIslandAt(loc); + + if (island.isPresent()) { + if (!island.get().isAllowed(getUser(), flag)) { + noGo(e, silent); + return false; + } else { + return true; + } + } + + // The player is in the world, but not on an island, so general world settings apply + if (!flag.isAllowed()) { + noGo(e, silent); + return false; + } else { + return true; + } + + } + } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java new file mode 100644 index 000000000..0a662e69e --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java @@ -0,0 +1,39 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.listeners.FlagListener; +import us.tastybento.bskyblock.lists.Flags; + +/** + * @author ben + * + */ +public class AnvilListener extends FlagListener { + + public AnvilListener() { + super(BSkyBlock.getInstance()); + } + + /** + * Handle placing of Anvils + * @param e + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent e) { + if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + if (e.getClickedBlock().getType().equals(Material.ANVIL)) { + checkIsland(e, getUser().getLocation(), Flags.ANVIL); + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index b29da55e2..d86e41742 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -1,8 +1,20 @@ package us.tastybento.bskyblock.listeners.flags; +import org.bukkit.Material; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.vehicle.VehicleDamageEvent; +import org.bukkit.util.BlockIterator; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; @@ -14,7 +26,7 @@ public class BreakBlocksListener extends FlagListener { public BreakBlocksListener() { super(BSkyBlock.getInstance()); } - + /** * Prevents blocks from being broken * @@ -22,23 +34,112 @@ public class BreakBlocksListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onBlockBreak(final BlockBreakEvent e) { - - // If this is not an Island World, skip - if (!inWorld(e.getPlayer())) return; - - // Handle fake players - if (plugin.getSettings().getFakePlayers().contains(e.getPlayer().getName())) return; - - // Real players - // Get the island and if present, check the flag, react if required and return - plugin.getIslands().getIslandAt(e.getBlock().getLocation()).ifPresent(x -> { - if (!x.isAllowed(User.getInstance(e.getPlayer()), Flags.BREAK_BLOCKS)) noGo(e); - return; - }); - - // The player is in the world, but not on an island, so general world settings apply - if (!Flags.BREAK_BLOCKS.isAllowed()) noGo(e); + checkIsland(e, e.getBlock().getLocation(), Flags.BREAK_BLOCKS); } - + /** + * Prevents the breakage of hanging items + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW) + public void onBreakHanging(final HangingBreakByEntityEvent e) { + if (e.getRemover() instanceof Player) { + setUser(User.getInstance(e.getRemover())); + checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); + } + } + + /** + * Handles breaking objects + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent e) { + // Only handle hitting things + if (!e.getAction().equals(Action.LEFT_CLICK_BLOCK)) return; + + // Look along player's sight line to see if any blocks are skulls + try { + BlockIterator iter = new BlockIterator(e.getPlayer(), 10); + Block lastBlock = iter.next(); + while (iter.hasNext()) { + lastBlock = iter.next(); + if (lastBlock.getType().equals(Material.SKULL)) { + checkIsland(e, lastBlock.getLocation(), Flags.BREAK_BLOCKS); + return; + } + } + } catch (Exception ex) {} + + switch (e.getClickedBlock().getType()) { + case CAKE_BLOCK: + case DRAGON_EGG: + case MOB_SPAWNER: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.BREAK_BLOCKS); + return; + case BED_BLOCK: + if (e.getPlayer().getWorld().getEnvironment().equals(Environment.NETHER)) { + // Prevent explosions checkIsland(e, e.getClickedBlock().getLocation(), Flags.BREAK_BLOCKS); + return; + } + default: + break; + } + } + + + /** + * Handles vehicle breaking + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onVehicleDamageEvent(VehicleDamageEvent e) { + if (inWorld(e.getVehicle()) && e.getAttacker() instanceof Player) { + User user = User.getInstance((Player) e.getAttacker()); + // Get the island and if present, check the flag, react if required and return + plugin.getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { + if (!x.isAllowed(getUser(), Flags.BREAK_BLOCKS)) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + return; + }); + + // The player is in the world, but not on an island, so general world settings apply + if (!Flags.BREAK_BLOCKS.isAllowed()) { + e.setCancelled(true); + user.sendMessage("protection.protected"); + } + } + } + + /** + * Protect item frames, armor stands, etc. Entities that are actually blocks... + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityDamage(EntityDamageByEntityEvent e) { + // Only handle item frames + if (!(e.getEntity() instanceof ItemFrame) && !e.getEntityType().toString().endsWith("STAND")) return; + + // Get the attacker + if (e.getDamager() instanceof Player) { + setUser(User.getInstance(e.getDamager())); + checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); + } else if (e.getDamager() instanceof Projectile) { + // Find out who fired the arrow + Projectile p = (Projectile) e.getDamager(); + if (p.getShooter() instanceof Player) { + setUser(User.getInstance((Player)p.getShooter())); + if (!checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS)) { + e.getEntity().setFireTicks(0); + e.getDamager().remove(); + } + } + } + } + + } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index d4922b637..a1b212721 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -1,11 +1,16 @@ package us.tastybento.bskyblock.listeners.flags; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.EntityBlockFormEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.listeners.FlagListener; import us.tastybento.bskyblock.lists.Flags; @@ -14,30 +19,76 @@ public class PlaceBlocksListener extends FlagListener { public PlaceBlocksListener() { super(BSkyBlock.getInstance()); } - + + /** - * Prevents blocks from being placed + * Check blocks being placed in general * * @param e */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onBlockPlace(final BlockPlaceEvent e) { + checkIsland(e, e.getBlock().getLocation(), Flags.PLACE_BLOCKS); + } - // If this is not an Island World, skip - if (!inWorld(e.getPlayer())) return; - - // Handle fake players - if (plugin.getSettings().getFakePlayers().contains(e.getPlayer().getName())) return; - - // Real players - // Get the island and if present, check the flag, react if required and return - plugin.getIslands().getIslandAt(e.getBlock().getLocation()).ifPresent(x -> { - if (!x.isAllowed(User.getInstance(e.getPlayer()), Flags.PLACE_BLOCKS)) noGo(e); - return; - }); - - // The player is in the world, but not on an island, so general world settings apply - if (!Flags.PLACE_BLOCKS.isAllowed()) noGo(e); + /** + * Handles placing items into ItemFrames + * @param e + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerHitEntity(PlayerInteractEntityEvent e) { + if (e.getRightClicked().getType().equals(EntityType.ITEM_FRAME)) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.PLACE_BLOCKS); + } + } + + /** + * Handle placing of fireworks, mine carts, end crystals, doors, chests and boats on land + * The doors and chests are related to an exploit. + * @param e + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent e) { + if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + switch (e.getClickedBlock().getType()) { + case FIREWORK: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.PLACE_BLOCKS); + return; + case RAILS: + case POWERED_RAIL: + case DETECTOR_RAIL: + case ACTIVATOR_RAIL: + if (e.getMaterial() != null && (e.getMaterial() == Material.MINECART || e.getMaterial() == Material.STORAGE_MINECART || e.getMaterial() == Material.HOPPER_MINECART + || e.getMaterial() == Material.EXPLOSIVE_MINECART || e.getMaterial() == Material.POWERED_MINECART)) { + checkIsland(e, e.getClickedBlock().getLocation(), Flags.PLACE_BLOCKS); + } + return; + default: + // Check in-hand items + if (e.getMaterial() != null) { + // This check protects against an exploit in 1.7.9 against cactus + // and sugar cane and placing boats on non-liquids + if (e.getMaterial().equals(Material.END_CRYSTAL) || e.getMaterial() == Material.WOOD_DOOR || e.getMaterial() == Material.CHEST + || e.getMaterial() == Material.TRAPPED_CHEST || e.getMaterial() == Material.IRON_DOOR + || (e.getMaterial().name().contains("BOAT") && !e.getClickedBlock().isLiquid())) { + checkIsland(e, getUser().getLocation(), Flags.PLACE_BLOCKS); + } + } + } } + /** + * Handles Frost Walking on visitor's islands. This creates ice blocks, which is like placing blocks + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onBlockForm(EntityBlockFormEvent e) { + if (e.getNewState().getType().equals(Material.FROSTED_ICE)) { + // Silently check + checkIsland(e, getUser().getLocation(), Flags.PLACE_BLOCKS, true); + } + } + } diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 58b551020..66edc3c7c 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -9,4 +9,48 @@ public class Flags { public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener()).build(); public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.DIRT).listener(new AnvilListener()).build(); + public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BED = new FlagBuilder().id("BED").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag DOOR = new FlagBuilder().id("DOOR").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag GATE = new FlagBuilder().id("GATE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag PVP = new FlagBuilder().id("PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag NETHER_PVP = new FlagBuilder().id("NETHER_PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag END_PVP = new FlagBuilder().id("END_PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag TRADING = new FlagBuilder().id("TRADING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag VISITOR_ITEM_DROP = new FlagBuilder().id("VISITOR_ITEM_DROP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag VISITOR_ITEM_PICKUP = new FlagBuilder().id("VISITOR_ITEM_PICKUP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + + } From 72c99656ccfcd07273c6b849d866e575dd6f6f48 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 1 Feb 2018 20:30:57 -0800 Subject: [PATCH 10/97] Added the protection listeners. Took all day! Generally these are very easy to understand. They use an abstract class for common code. I have not tested these in-game. I would like to see if I can create some test classes but it may not be possible because of the static BSkyBlock calls. --- .../us/tastybento/bskyblock/BSkyBlock.java | 69 ++-- .../api/events/island/IslandEvent.java | 1 - .../bskyblock/api/panels/PanelItem.java | 1 - .../api/panels/builders/PanelItemBuilder.java | 1 - .../bskyblock/database/objects/Island.java | 12 +- .../listeners/JoinLeaveListener.java | 1 - .../AbstractFlagListener.java} | 54 ++- .../listeners/flags/AnvilListener.java | 39 -- .../flags/BlockInteractionListener.java | 138 +++++++ .../listeners/flags/BreakBlocksListener.java | 22 +- .../listeners/flags/BreedingListener.java | 51 +++ .../listeners/flags/BucketListener.java | 56 +++ .../listeners/flags/EggListener.java | 30 ++ .../flags/EntityInteractListener.java | 43 +++ .../listeners/flags/FireListener.java | 165 +++++++++ .../listeners/flags/HurtingListener.java | 207 +++++++++++ .../listeners/flags/InventoryListener.java | 59 +++ .../flags/ItemDropPickUpListener.java | 39 ++ .../listeners/flags/LeashListener.java | 53 +++ .../listeners/flags/MobSpawnListener.java | 79 ++++ .../listeners/flags/PVPListener.java | 157 ++++++++ .../flags/PhysicalInteractionListener.java | 46 +++ .../listeners/flags/PlaceBlocksListener.java | 13 +- .../listeners/flags/PortalListener.java | 23 ++ .../listeners/flags/ShearingListener.java | 25 ++ .../flags/TeleportationListener.java | 37 ++ .../us/tastybento/bskyblock/lists/Flags.java | 147 +++++--- .../bskyblock/managers/FlagsManager.java | 2 - .../bskyblock/util/SafeSpotTeleport.java | 347 ++++++++---------- 29 files changed, 1541 insertions(+), 376 deletions(-) rename src/main/java/us/tastybento/bskyblock/listeners/{FlagListener.java => flags/AbstractFlagListener.java} (72%) delete mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java create mode 100644 src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 6ff4ce516..1830f204d 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -19,7 +19,7 @@ import us.tastybento.bskyblock.managers.RanksManager; /** * Main BSkyBlock class - provides an island minigame in the sky - * @author Tastybento + * @author tastybento * @author Poslovitch */ public class BSkyBlock extends JavaPlugin { @@ -83,57 +83,34 @@ public class BSkyBlock extends JavaPlugin { // These items have to be loaded when the server has done 1 tick. // Note Worlds are not loaded this early, so any Locations or World reference will be null // at this point. Therefore, the 1 tick scheduler is required. - getServer().getScheduler().runTask(this, new Runnable() { + getServer().getScheduler().runTask(this, () -> { + // Create the world if it does not exist + islandWorldManager = new IslandWorld(plugin); - @Override - public void run() { - // Create the world if it does not exist - islandWorldManager = new IslandWorld(plugin); + getServer().getScheduler().runTask(plugin, () -> { + // Load islands from database + islandsManager.load(); - getServer().getScheduler().runTask(plugin, new Runnable() { + localesManager = new LocalesManager(plugin); + //TODO localesManager.registerLocales(plugin); - @Override - public void run() { - // Load islands from database - islandsManager.load(); + // Register Listeners + registerListeners(); - localesManager = new LocalesManager(plugin); - //TODO localesManager.registerLocales(plugin); + // Load Flags + flagsManager = new FlagsManager(plugin); - // Register Listeners - registerListeners(); + // Load addons + addonsManager = new AddonsManager(plugin); + addonsManager.enableAddons(); - // Load Flags - flagsManager = new FlagsManager(plugin); - - // Load addons - addonsManager = new AddonsManager(plugin); - addonsManager.enableAddons(); - - /* - *DEBUG CODE - Island loadedIsland = islandsManager.getIsland(owner); - getLogger().info("Island name = " + loadedIsland.getName()); - getLogger().info("Island locked = " + loadedIsland.getLocked()); - //getLogger().info("Random set = " + randomSet); - getLogger().info("Island coops = " + loadedIsland.getCoops()); - for (Entry flag: loadedIsland.getFlags().entrySet()) { - getLogger().info("Flag " + flag.getKey().name() + " = " + flag.getValue()); - } - */ - // Save islands & players data asynchronously every X minutes - getSettings().setDatabaseBackupPeriod(10 * 60 * 20); - plugin.getServer().getScheduler().runTaskTimer(plugin, new Runnable() { - - @Override - public void run() { - playersManager.save(true); - islandsManager.save(true); - } - }, getSettings().getDatabaseBackupPeriod(), getSettings().getDatabaseBackupPeriod()); - } - }); - } + // Save islands & players data asynchronously every X minutes + getSettings().setDatabaseBackupPeriod(10 * 60 * 20); + plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { + playersManager.save(true); + islandsManager.save(true); + }, getSettings().getDatabaseBackupPeriod(), getSettings().getDatabaseBackupPeriod()); + }); }); } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java index e7b937310..2d8cd423e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java @@ -2,7 +2,6 @@ package us.tastybento.bskyblock.api.events.island; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.Location; import us.tastybento.bskyblock.BSkyBlock; diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java index f31a04ffd..ba1c7ea94 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java @@ -3,7 +3,6 @@ package us.tastybento.bskyblock.api.panels; import java.util.List; import java.util.Optional; -import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java index b53496cd7..cf86fec50 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java @@ -3,7 +3,6 @@ package us.tastybento.bskyblock.api.panels.builders; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 02562f2a7..539d4ac25 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -377,7 +377,7 @@ public class Island implements DataObject { /** * Set the Island Guard flag rank * @param flag - * @param value + * @param value - rank value. If the flag applies to the island, a positive number = true, negative = false */ public void setFlag(Flag flag, int value){ flags.put(flag, value); @@ -655,4 +655,14 @@ public class Island implements DataObject { public boolean isAllowed(User user, Flag flag) { return (this.getRank(user) >= this.getFlag(flag)) ? true : false; } + + /** + * Check if the flag is allowed or not + * For flags that are for the island in general and not related to rank + * @param flag + * @return true if allowed, false if not + */ + public boolean isAllowed(Flag flag) { + return this.getFlag(flag) >= 0 ? true : false; + } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java index 90c313771..e3618927b 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java @@ -1,6 +1,5 @@ package us.tastybento.bskyblock.listeners; -import java.util.Optional; import java.util.UUID; import org.bukkit.event.EventHandler; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java similarity index 72% rename from src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java rename to src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index dedf42541..f8aeb8601 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/FlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -1,7 +1,7 @@ /** * */ -package us.tastybento.bskyblock.listeners; +package us.tastybento.bskyblock.listeners.flags; import java.util.Optional; @@ -18,18 +18,18 @@ import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.objects.Island; /** - * Abstract class for flag listeners to inherit. Provides some common code. - * @author ben + * Abstract class for flag listeners. Provides common code. + * @author tastybento * */ -public abstract class FlagListener implements Listener { +public abstract class AbstractFlagListener implements Listener { - protected BSkyBlock plugin; + public BSkyBlock plugin; private User user = null; - public FlagListener(BSkyBlock plugin) { + public AbstractFlagListener() { super(); - this.plugin = plugin; + this.plugin = BSkyBlock.getInstance(); } /** @@ -38,7 +38,7 @@ public abstract class FlagListener implements Listener { * @param e - the event * @return user or empty */ - protected Optional getEventUser(Event e) { + private Optional createEventUser(Event e) { // Set the user if (e instanceof PlayerEvent) { user = User.getInstance(((PlayerEvent)e).getPlayer()); @@ -52,41 +52,33 @@ public abstract class FlagListener implements Listener { * Explicitly set the user * @param user */ - protected void setUser(User user) { + public void setUser(User user) { this.user = user; } - /** - * Get the user associated with this event - * @return User or null - */ - protected User getUser() { - return user; - } - /* * The following methods cover the cancellable events and enable a simple noGo(e) to be used to cancel and send the error message */ /** - * Cancels the event and sends the island protected message to user + * Cancels the event and sends the island public message to user * @param e Event */ - protected void noGo(Event e) { + public void noGo(Event e) { noGo(e, false); } /** - * Cancels the event and sends the island protected message to user unless silent is true + * Cancels the event and sends the island public message to user unless silent is true * @param e Event * @param silent - if true, message is not sent */ - protected void noGo(Event e, boolean silent) { + public void noGo(Event e, boolean silent) { if (e instanceof Cancellable) ((Cancellable)e).setCancelled(true); if (user != null) { if (!silent) - user.sendMessage("protection.protected"); + user.sendMessage("protection.public"); user.updateInventory(); } } @@ -96,7 +88,7 @@ public abstract class FlagListener implements Listener { * @param loc * @return true if the location is in the island worlds */ - protected boolean inWorld(Location loc) { + public boolean inWorld(Location loc) { return (loc.getWorld().equals(plugin.getIslandWorldManager().getIslandWorld()) || loc.getWorld().equals(plugin.getIslandWorldManager().getNetherWorld()) || loc.getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) ? true : false; @@ -107,7 +99,7 @@ public abstract class FlagListener implements Listener { * @param entity - the entity * @return true if in world */ - protected boolean inWorld(Entity entity) { + public boolean inWorld(Entity entity) { return inWorld(entity.getLocation()); } @@ -116,7 +108,7 @@ public abstract class FlagListener implements Listener { * @param user - a user * @return true if in world */ - protected boolean inWorld(User user) { + public boolean inWorld(User user) { return inWorld(user.getLocation()); } @@ -126,7 +118,7 @@ public abstract class FlagListener implements Listener { * @param loc * @return true if the check is okay, false if it was disallowed */ - protected boolean checkIsland(Event e, Location loc, Flag flag) { + public boolean checkIsland(Event e, Location loc, Flag flag) { return checkIsland(e, loc, flag, false); } @@ -139,20 +131,20 @@ public abstract class FlagListener implements Listener { * @param silent - if true, no attempt is made to tell the user * @return true if the check is okay, false if it was disallowed */ - protected boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { + public boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { // If the user is not set, try to get it from the event - if (getUser() == null) { + if (user == null) { // Set the user associated with this event - if (!getEventUser(e).isPresent()) return true; + if (!createEventUser(e).isPresent()) return true; } // If this is not an Island World, skip - if (!inWorld(getUser())) return true; + if (!inWorld(user)) return true; // Get the island and if present, check the flag, react if required and return Optional island = plugin.getIslands().getIslandAt(loc); if (island.isPresent()) { - if (!island.get().isAllowed(getUser(), flag)) { + if (!island.get().isAllowed(user, flag)) { noGo(e, silent); return false; } else { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java deleted file mode 100644 index 0a662e69e..000000000 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AnvilListener.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * - */ -package us.tastybento.bskyblock.listeners.flags; - -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; - -import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.listeners.FlagListener; -import us.tastybento.bskyblock.lists.Flags; - -/** - * @author ben - * - */ -public class AnvilListener extends FlagListener { - - public AnvilListener() { - super(BSkyBlock.getInstance()); - } - - /** - * Handle placing of Anvils - * @param e - */ - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onPlayerInteract(final PlayerInteractEvent e) { - if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { - return; - } - if (e.getClickedBlock().getType().equals(Material.ANVIL)) { - checkIsland(e, getUser().getLocation(), Flags.ANVIL); - } - } -} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java new file mode 100644 index 000000000..c63130cc5 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -0,0 +1,138 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * @author ben + * + */ +public class BlockInteractionListener extends AbstractFlagListener { + + /** + * Handle interaction with blocks + * @param e + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent e) { + if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + return; + } + switch (e.getClickedBlock().getType()) { + case ANVIL: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.ANVIL); + break; + case BEACON: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.BEACON); + break; + case BED_BLOCK: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.BED); + break; + case BREWING_STAND: + case CAULDRON: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.BREWING); + break; + case CHEST: + case STORAGE_MINECART: + case TRAPPED_CHEST: + case BLACK_SHULKER_BOX: + case BLUE_SHULKER_BOX: + case BROWN_SHULKER_BOX: + case CYAN_SHULKER_BOX: + case GRAY_SHULKER_BOX: + case GREEN_SHULKER_BOX: + case LIGHT_BLUE_SHULKER_BOX: + case LIME_SHULKER_BOX: + case PINK_SHULKER_BOX: + case MAGENTA_SHULKER_BOX: + case ORANGE_SHULKER_BOX: + case PURPLE_SHULKER_BOX: + case RED_SHULKER_BOX: + case SILVER_SHULKER_BOX: + case WHITE_SHULKER_BOX: + case YELLOW_SHULKER_BOX: + case DISPENSER: + case DROPPER: + case HOPPER: + case HOPPER_MINECART: + + checkIsland(e, e.getClickedBlock().getLocation(), Flags.CHEST); + break; + + case ACACIA_DOOR: + case BIRCH_DOOR: + case DARK_OAK_DOOR: + case IRON_DOOR: + case IRON_DOOR_BLOCK: + case IRON_TRAPDOOR: + case JUNGLE_DOOR: + case SPRUCE_DOOR: + case TRAP_DOOR: + case WOODEN_DOOR: + case WOOD_DOOR: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.DOOR); + break; + case ACACIA_FENCE_GATE: + case BIRCH_FENCE_GATE: + case DARK_OAK_FENCE_GATE: + case FENCE_GATE: + case JUNGLE_FENCE_GATE: + case SPRUCE_FENCE_GATE: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.GATE); + break; + + case BURNING_FURNACE: + case FURNACE: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.FURNACE); + break; + case ENCHANTMENT_TABLE: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.ENCHANTING); + break; + case ENDER_CHEST: + break; + case JUKEBOX: + case NOTE_BLOCK: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.MUSIC); + break; + case WORKBENCH: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.CRAFTING); + break; + case STONE_BUTTON: + case WOOD_BUTTON: + case LEVER: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.LEVER_BUTTON); + break; + case DIODE: + case DIODE_BLOCK_OFF: + case DIODE_BLOCK_ON: + case REDSTONE_COMPARATOR_ON: + case REDSTONE_COMPARATOR_OFF: + case DAYLIGHT_DETECTOR: + case DAYLIGHT_DETECTOR_INVERTED: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.REDSTONE); + break; + default: + break; + } + // Now check for in-hand items + if (e.getItem() != null) { + switch (e.getItem().getType()) { + case ENDER_PEARL: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.ENDER_PEARL); + break; + case MONSTER_EGG: + checkIsland(e, e.getClickedBlock().getLocation(), Flags.SPAWN_EGGS); + default: + break; + + } + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index d86e41742..3dfc9277c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -3,6 +3,7 @@ package us.tastybento.bskyblock.listeners.flags; import org.bukkit.Material; import org.bukkit.World.Environment; import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -16,16 +17,10 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; import org.bukkit.util.BlockIterator; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.listeners.FlagListener; import us.tastybento.bskyblock.lists.Flags; -public class BreakBlocksListener extends FlagListener { - - public BreakBlocksListener() { - super(BSkyBlock.getInstance()); - } +public class BreakBlocksListener extends AbstractFlagListener { /** * Prevents blocks from being broken @@ -36,7 +31,7 @@ public class BreakBlocksListener extends FlagListener { public void onBlockBreak(final BlockBreakEvent e) { checkIsland(e, e.getBlock().getLocation(), Flags.BREAK_BLOCKS); } - + /** * Prevents the breakage of hanging items * @@ -59,7 +54,7 @@ public class BreakBlocksListener extends FlagListener { public void onPlayerInteract(final PlayerInteractEvent e) { // Only handle hitting things if (!e.getAction().equals(Action.LEFT_CLICK_BLOCK)) return; - + // Look along player's sight line to see if any blocks are skulls try { BlockIterator iter = new BlockIterator(e.getPlayer(), 10); @@ -72,7 +67,7 @@ public class BreakBlocksListener extends FlagListener { } } } catch (Exception ex) {} - + switch (e.getClickedBlock().getType()) { case CAKE_BLOCK: case DRAGON_EGG: @@ -100,7 +95,7 @@ public class BreakBlocksListener extends FlagListener { User user = User.getInstance((Player) e.getAttacker()); // Get the island and if present, check the flag, react if required and return plugin.getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { - if (!x.isAllowed(getUser(), Flags.BREAK_BLOCKS)) { + if (!x.isAllowed(user, Flags.BREAK_BLOCKS)) { e.setCancelled(true); user.sendMessage("protection.protected"); } @@ -121,8 +116,8 @@ public class BreakBlocksListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityDamage(EntityDamageByEntityEvent e) { - // Only handle item frames - if (!(e.getEntity() instanceof ItemFrame) && !e.getEntityType().toString().endsWith("STAND")) return; + // Only handle item frames and armor stands + if (!(e.getEntity() instanceof ItemFrame) && !(e.getEntity() instanceof ArmorStand)) return; // Get the attacker if (e.getDamager() instanceof Player) { @@ -141,5 +136,4 @@ public class BreakBlocksListener extends FlagListener { } } - } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java new file mode 100644 index 000000000..c26b4d997 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java @@ -0,0 +1,51 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import java.util.Arrays; +import java.util.List; + +import org.bukkit.Material; +import org.bukkit.entity.Animals; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles breeding protection + * Note - animal protection is done elsewhere. + * @author tastybento + * + */ +public class BreedingListener extends AbstractFlagListener { + + /** + * A list of items that cause breeding if a player has them in their hand and they click an animal + * This list may need to be extended with future versions of Minecraft. + */ + private final static List BREEDING_ITEMS = Arrays.asList( + Material.EGG, + Material.WHEAT, + Material.CARROT_ITEM, + Material.SEEDS); + + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onPlayerInteract(final PlayerInteractAtEntityEvent e) { + if (e.getRightClicked() != null && e.getRightClicked() instanceof Animals) { + ItemStack inHand = e.getPlayer().getInventory().getItemInMainHand(); + if (e.getHand().equals(EquipmentSlot.OFF_HAND)) { + inHand = e.getPlayer().getInventory().getItemInOffHand(); + } + if (inHand != null && BREEDING_ITEMS.contains(inHand.getType())) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.BREEDING); + } + } + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java new file mode 100644 index 000000000..a6accff38 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java @@ -0,0 +1,56 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles interaction with beds + * Note - bed protection from breaking or placing is done elsewhere. + * @author tastybento + * + */ +public class BucketListener extends AbstractFlagListener { + + /** + * Prevents emptying of buckets + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBucketEmpty(final PlayerBucketEmptyEvent e) { + if (e.getBlockClicked() != null) { + // This is where the water or lava actually will be dumped + Block dumpBlock = e.getBlockClicked().getRelative(e.getBlockFace()); + checkIsland(e, dumpBlock.getLocation(), Flags.BUCKET); + } + } + + /** + * Prevents collecting of lava, water, milk. If bucket use is denied in general, it is blocked. + * @param e + */ + @EventHandler(priority = EventPriority.LOW) + public void onBucketFill(final PlayerBucketFillEvent e) { + // Check filling of various liquids + if (e.getItemStack().getType().equals(Material.LAVA_BUCKET)) { + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA)) return; + } + if (e.getItemStack().getType().equals(Material.WATER_BUCKET)) { + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_WATER)) return; + } + if (e.getItemStack().getType().equals(Material.MILK_BUCKET)) { + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.MILKING)) return; + } + // Check general bucket use + checkIsland(e, e.getBlockClicked().getLocation(), Flags.BUCKET); + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java new file mode 100644 index 000000000..ceb297d27 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java @@ -0,0 +1,30 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerEggThrowEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles throwing regular eggs (not spawn eggs) + * @author tastybento + * + */ +public class EggListener extends AbstractFlagListener { + + /** + * Handle visitor chicken egg throwing + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEggThrow(PlayerEggThrowEvent e) { + if (!checkIsland(e, e.getEgg().getLocation(), Flags.EGGS)) { + e.setHatching(false); + } + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java new file mode 100644 index 000000000..382958aab --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java @@ -0,0 +1,43 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.entity.Animals; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Vehicle; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles interaction with entities like armor stands + * Note - armor stand protection from breaking or placing is done elsewhere. + * @author tastybento + * + */ +public class EntityInteractListener extends AbstractFlagListener { + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onPlayerInteract(final PlayerInteractAtEntityEvent e) { + if (e.getRightClicked() instanceof ArmorStand) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.ARMOR_STAND); + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerHitEntity(PlayerInteractEntityEvent e) { + // Animal riding + if (e.getRightClicked() instanceof Vehicle && e.getRightClicked() instanceof Animals) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.RIDING); + } + // Villager trading + if (e.getRightClicked().getType().equals(EntityType.VILLAGER)) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.TRADING); + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java new file mode 100644 index 000000000..8d7c524bd --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -0,0 +1,165 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import java.util.Optional; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.util.BlockIterator; + +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles fire + * @author tastybento + * + */ +public class FireListener extends AbstractFlagListener { + + /** + * Prevents fire spread + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockBurn(BlockBurnEvent e) { + if (!inWorld(e.getBlock().getLocation())) { + return; + } + // Check if the island exists and if fire is allowed + Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + island.ifPresent(x -> { + if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + }); + // If not on an island, check the default setting + if (!island.isPresent() && !Flags.FIRE_SPREAD.isAllowed()) e.setCancelled(true); + } + + /** + * Prevent fire spread + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockSpread(BlockSpreadEvent e) { + if (e.getSource().getType().equals(Material.FIRE)) { + if (!inWorld(e.getBlock().getLocation())) { + return; + } + // Check if the island exists and if fire is allowed + Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + island.ifPresent(x -> { + if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + }); + // If not on an island, check the default setting + if (!island.isPresent() && !Flags.FIRE_SPREAD.isAllowed()) e.setCancelled(true); + } + } + + /** + * Igniting fires + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockIgnite(BlockIgniteEvent e) { + if (!inWorld(e.getBlock().getLocation())) { + return; + } + // Check if this is a portal lighting - that is allowed any time + if (e.getBlock().getType().equals(Material.OBSIDIAN)) { + return; + } + // Check if the island exists and if fire is allowed + Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + island.ifPresent(x -> { + if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); + }); + // If not on an island, check the default setting + if (!island.isPresent() && !Flags.FIRE.isAllowed()) e.setCancelled(true); + + } + + /** + * Flint & Steel and Extinguishing fire + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerInteract(PlayerInteractEvent e) { + if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && e.getMaterial() != null && e.getMaterial().equals(Material.FLINT_AND_STEEL)) { + checkIsland(e, e.getClickedBlock().getLocation(), Flags.FIRE); + } + // Look along player's sight line to see if any blocks are fire. Players can hit fire out quite a long way away. + try { + BlockIterator iter = new BlockIterator(e.getPlayer(), 10); + Block lastBlock = iter.next(); + while (iter.hasNext()) { + lastBlock = iter.next(); + if (lastBlock.equals(e.getClickedBlock())) { + break; + } + if (lastBlock.getType().equals(Material.FIRE)) { + checkIsland(e, lastBlock.getLocation(), Flags.FIRE_EXTINGUISH); + } + } + } catch (Exception ex) { + // To catch at block iterator exceptions that can happen in the void or at the very top of blocks + } + } + + /** + * Protect TNT. + * Note that allowing TNT to explode is governed by the Break Blocks flag. + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onTNTPrimed(EntityChangeBlockEvent e) { + // Check world + if (!inWorld(e.getBlock().getLocation())) { + return; + } + // Check for TNT + if (!e.getBlock().getType().equals(Material.TNT)) { + //plugin.getLogger().info("DEBUG: not tnt"); + return; + } + // Check if the island exists and if fire is allowed + Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + island.ifPresent(x -> { + if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); + }); + // If not on an island, check the default setting + if (!island.isPresent() && !Flags.FIRE.isAllowed()) e.setCancelled(true); + + // If either of these canceled the event, return + if (e.isCancelled()) return; + + // Stop TNT from being damaged if it is being caused by a visitor with a flaming arrow + if (e.getEntity() instanceof Projectile) { + Projectile projectile = (Projectile) e.getEntity(); + // Find out who fired it + if (projectile.getShooter() instanceof Player) { + if (projectile.getFireTicks() > 0) { + Player shooter = (Player)projectile.getShooter(); + setUser(User.getInstance(shooter)); + if (checkIsland(e, e.getBlock().getLocation(), Flags.BREAK_BLOCKS)) { + // Remove the arrow + projectile.remove(); + } + } + } + } + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java new file mode 100644 index 000000000..c5aff48d1 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -0,0 +1,207 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Material; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Entity; +import org.bukkit.entity.IronGolem; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Slime; +import org.bukkit.entity.Snowman; +import org.bukkit.entity.Squid; +import org.bukkit.entity.Villager; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.LingeringPotionSplashEvent; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.potion.PotionEffect; + +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles hurting of monsters and animals directly and indirectly + * @author tastybento + * + */ +public class HurtingListener extends AbstractFlagListener { + + private HashMap thrownPotions = new HashMap<>(); + + + /** + * Handles mob and monster protection + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityDamage(final EntityDamageByEntityEvent e) { + // Mobs being hurt + if (e.getEntity() instanceof Animals || e.getEntity() instanceof IronGolem || e.getEntity() instanceof Snowman + || e.getEntity() instanceof Villager) { + respond(e, e.getDamager(), Flags.HURT_MOBS); + } else if (e.getEntity() instanceof Monster || e.getEntity() instanceof Squid || e.getEntity() instanceof Slime) { + respond(e, e.getDamager(), Flags.HURT_MONSTERS); + } + } + + /** + * Finds the true attacker, even if the attack was via a projectile + * @param event + * @param damager + * @param flag + */ + private void respond(Event event, Entity damager, Flag flag) { + // Get the attacker + if (damager instanceof Player) { + setUser(User.getInstance(damager)); + checkIsland(event, damager.getLocation(), flag); + } else if (damager instanceof Projectile) { + // Find out who fired the projectile + Projectile p = (Projectile) damager; + if (p.getShooter() instanceof Player) { + setUser(User.getInstance((Player)p.getShooter())); + if (!checkIsland(event, damager.getLocation(), flag)) { + damager.setFireTicks(0); + damager.remove(); + } + } + } + + } + + /** + * Handle attacks with a fishing rod + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onFishing(PlayerFishEvent e) { + if (e.getCaught() == null) + return; + + if (e.getCaught() instanceof Animals || e.getCaught() instanceof IronGolem || e.getCaught() instanceof Snowman + || e.getCaught() instanceof Villager) { + if (checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { + e.getHook().remove(); + return; + } + } else if (e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) { + if (checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { + e.getHook().remove(); + return; + } + } + } + + + /** + * Handles feeding cookies to animals, which may hurt them + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerHitEntity(PlayerInteractEntityEvent e) { + if (e.getRightClicked() instanceof Animals) { + if ((e.getHand().equals(EquipmentSlot.HAND) && e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.COOKIE)) + || (e.getHand().equals(EquipmentSlot.OFF_HAND) && e.getPlayer().getInventory().getItemInOffHand().getType().equals(Material.COOKIE))) { + checkIsland(e, e.getRightClicked().getLocation(), Flags.HURT_MOBS); + } + } + } + + /** + * Checks for splash damage. Remove damage if it should not affect. + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onSplashPotionSplash(final PotionSplashEvent e) { + // Try to get the shooter + Projectile projectile = (Projectile) e.getEntity(); + if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { + Player attacker = (Player)projectile.getShooter(); + setUser(User.getInstance(attacker)); + // Run through all the affected entities + for (LivingEntity entity: e.getAffectedEntities()) { + // Self damage + if (attacker.equals(entity)) { + continue; + } + // Monsters being hurt + if (entity instanceof Monster || entity instanceof Slime || entity instanceof Squid) { + if (!checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS)) { + for (PotionEffect effect : e.getPotion().getEffects()) { + entity.removePotionEffect(effect.getType()); + } + } + } + + // Mobs being hurt + if (entity instanceof Animals || entity instanceof IronGolem || entity instanceof Snowman + || entity instanceof Villager) { + if (!checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS)) { + for (PotionEffect effect : e.getPotion().getEffects()) { + entity.removePotionEffect(effect.getType()); + } + } + } + } + } + } + + /** + * Handle lingering potions. This tracks when a potion has been initially splashed. + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onLingeringPotionSplash(final LingeringPotionSplashEvent e) { + // Try to get the shooter + Projectile projectile = (Projectile) e.getEntity(); + if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { + UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); + // Store it and remove it when the effect is gone + thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); + }, e.getAreaEffectCloud().getDuration()); + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onLingeringPotionDamage(final EntityDamageByEntityEvent e) { + if (e.getEntity() == null || e.getEntity().getUniqueId() == null) { + return; + } + + if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { + UUID attacker = thrownPotions.get(e.getDamager().getEntityId()); + // Self damage + if (attacker.equals(e.getEntity().getUniqueId())) { + return; + } + Entity entity = e.getEntity(); + // Monsters being hurt + if (entity instanceof Monster || entity instanceof Slime || entity instanceof Squid) { + checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS); + } + // Mobs being hurt + else if (entity instanceof Animals || entity instanceof IronGolem || entity instanceof Snowman + || entity instanceof Villager) { + checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS); + } + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java new file mode 100644 index 000000000..00d004ba0 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java @@ -0,0 +1,59 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.block.Beacon; +import org.bukkit.block.BrewingStand; +import org.bukkit.block.Chest; +import org.bukkit.block.Dispenser; +import org.bukkit.block.Dropper; +import org.bukkit.block.Furnace; +import org.bukkit.block.Hopper; +import org.bukkit.block.ShulkerBox; +import org.bukkit.entity.Animals; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.inventory.InventoryClickEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles inventory protection + * @author tastybento + * + */ +public class InventoryListener extends AbstractFlagListener { + + /** + * Prevents visitors picking items from inventories + * @param event + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onMountInventoryClick(InventoryClickEvent event) { + if (event.getInventory().getHolder() == null) { + return; + } + if (event.getInventory().getHolder() instanceof Animals) { + checkIsland(event, event.getInventory().getLocation(), Flags.MOUNT_INVENTORY); + } + else if (event.getInventory().getHolder() instanceof Chest + || event.getInventory().getHolder() instanceof Dispenser + || event.getInventory().getHolder() instanceof Hopper + || event.getInventory().getHolder() instanceof Dropper + || event.getInventory().getHolder() instanceof ShulkerBox) { + checkIsland(event, event.getInventory().getLocation(), Flags.CHEST); + } + else if (event.getInventory().getHolder() instanceof Furnace) { + checkIsland(event, event.getInventory().getLocation(), Flags.FURNACE); + } + else if (event.getInventory().getHolder() instanceof BrewingStand) { + checkIsland(event, event.getInventory().getLocation(), Flags.BREWING); + } + else if (event.getInventory().getHolder() instanceof Beacon) { + checkIsland(event, event.getInventory().getLocation(), Flags.BEACON); + } + } + + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java new file mode 100644 index 000000000..b73e2f4b3 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -0,0 +1,39 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.player.PlayerDropItemEvent; + +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.lists.Flags; + +/** + * @author tastybento + * + */ +public class ItemDropPickUpListener extends AbstractFlagListener { + + /* + * Handle item drop by visitors + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onVisitorDrop(PlayerDropItemEvent e) { + checkIsland(e, e.getItemDrop().getLocation(), Flags.VISITOR_ITEM_DROP); + } + + /* + * Handle item pickup by visitors + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onVisitorDrop(EntityPickupItemEvent e) { + if (e.getEntity() instanceof Player) { + setUser(User.getInstance(e.getEntity())); + checkIsland(e, e.getItem().getLocation(), Flags.VISITOR_ITEM_PICKUP); + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java new file mode 100644 index 000000000..0899842b1 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java @@ -0,0 +1,53 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.PlayerLeashEntityEvent; +import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerUnleashEntityEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * @author tastybento + * + */ +public class LeashListener extends AbstractFlagListener { + + /** + * Prevents leashing + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onLeashUse(PlayerLeashEntityEvent e) { + checkIsland(e, e.getEntity().getLocation(),Flags.LEASH); + } + + + /** + * Prevents unleashing + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onLeashUse(PlayerUnleashEntityEvent e) { + checkIsland(e, e.getEntity().getLocation(),Flags.LEASH); + } + + /** + * Prevents hitching + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerLeashHitch(final HangingPlaceEvent e) { + if (e.getEntity() != null && e.getEntity().getType().equals(EntityType.LEASH_HITCH)) { + checkIsland(e, e.getEntity().getLocation(),Flags.LEASH); + } + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java new file mode 100644 index 000000000..2dded771b --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -0,0 +1,79 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import java.util.Optional; + +import org.bukkit.entity.Animals; +import org.bukkit.entity.Monster; +import org.bukkit.entity.Slime; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; + +import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles natural mob spawning. + * @author tastybento + * + */ +public class MobSpawnListener extends AbstractFlagListener { + + /** + * Prevents mobs spawning naturally + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onNaturalMobSpawn(final CreatureSpawnEvent e) { + // If not in the right world, return + if (!inWorld(e.getEntity())) { + return; + } + // Deal with natural spawning + if (e.getSpawnReason().equals(SpawnReason.NATURAL) + || e.getSpawnReason().equals(SpawnReason.JOCKEY) + || e.getSpawnReason().equals(SpawnReason.CHUNK_GEN) + || e.getSpawnReason().equals(SpawnReason.DEFAULT) + || e.getSpawnReason().equals(SpawnReason.MOUNT) + || e.getSpawnReason().equals(SpawnReason.JOCKEY) + || e.getSpawnReason().equals(SpawnReason.NETHER_PORTAL)) { + Optional island = plugin.getIslands().getIslandAt(e.getLocation()); + if (island.isPresent()) { + if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { + if (!island.get().isAllowed(Flags.MOB_SPAWN)) { + // Mobs not allowed to spawn + e.setCancelled(true); + return; + } + } else if (e.getEntity() instanceof Animals) { + if (!island.get().isAllowed(Flags.MONSTER_SPAWN)) { + // Mobs not allowed to spawn + e.setCancelled(true); + return; + } + } + } else { + // Outside of the island + if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { + if (!Flags.MOB_SPAWN.isAllowed()) { + // Mobs not allowed to spawn + e.setCancelled(true); + return; + } + } else if (e.getEntity() instanceof Animals) { + if (!Flags.MONSTER_SPAWN.isAllowed()) { + // Mobs not allowed to spawn + e.setCancelled(true); + return; + } + } + } + } + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java new file mode 100644 index 000000000..428b193f5 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -0,0 +1,157 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.LingeringPotionSplashEvent; +import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.potion.PotionEffect; + +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles PVP + * @author tastybento + * + */ +public class PVPListener extends AbstractFlagListener { + + private HashMap thrownPotions = new HashMap<>(); + + + /** + * This method protects players from PVP if it is not allowed and from + * arrows fired by other players + * + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityDamage(final EntityDamageByEntityEvent e) { + if (e.getEntity() instanceof Player) { + Flag flag = Flags.PVP; + if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; + else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + respond(e, e.getDamager(), flag); + } + } + + private void respond(Event event, Entity damager, Flag flag) { + // Get the attacker + if (damager instanceof Player) { + setUser(User.getInstance(damager)); + checkIsland(event, damager.getLocation(), flag); + } else if (damager instanceof Projectile) { + // Find out who fired the arrow + Projectile p = (Projectile) damager; + if (p.getShooter() instanceof Player) { + setUser(User.getInstance((Player)p.getShooter())); + if (!checkIsland(event, damager.getLocation(), flag)) { + damager.setFireTicks(0); + damager.remove(); + } + } + } + + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onFishing(PlayerFishEvent e) { + if (e.getCaught() != null && e.getCaught() instanceof Player) { + Flag flag = Flags.PVP; + if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; + else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + if (checkIsland(e, e.getCaught().getLocation(), flag)) { + e.getHook().remove(); + return; + } + } + } + + /** + * Checks for splash damage. Remove damage if it should not affect. + * @param e + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onSplashPotionSplash(final PotionSplashEvent e) { + // Deduce the world + Flag flag = Flags.PVP; + if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; + else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + + // Try to get the thrower + Projectile projectile = (Projectile) e.getEntity(); + if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { + Player attacker = (Player)projectile.getShooter(); + setUser(User.getInstance(attacker)); + // Run through all the affected entities + for (LivingEntity entity: e.getAffectedEntities()) { + // Self damage + if (attacker.equals(entity)) { + continue; + } + // PVP? + if (entity instanceof Player) { + if (!checkIsland(e, entity.getLocation(), flag)) { + for (PotionEffect effect : e.getPotion().getEffects()) { + entity.removePotionEffect(effect.getType()); + } + } + } + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onLingeringPotionSplash(final LingeringPotionSplashEvent e) { + // Try to get the shooter + Projectile projectile = (Projectile) e.getEntity(); + if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { + UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); + // Store it and remove it when the effect is gone + thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); + }, e.getAreaEffectCloud().getDuration()); + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void onLingeringPotionDamage(final EntityDamageByEntityEvent e) { + if (e.getEntity() == null || e.getEntity().getUniqueId() == null) { + return; + } + + if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { + // Deduce the world + Flag flag = Flags.PVP; + if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; + else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + + UUID attacker = thrownPotions.get(e.getDamager().getEntityId()); + // Self damage + if (attacker.equals(e.getEntity().getUniqueId())) { + return; + } + Entity entity = e.getEntity(); + // PVP? + if (entity instanceof Player) { + checkIsland(e, entity.getLocation(), flag); + } + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java new file mode 100644 index 000000000..77a594f74 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java @@ -0,0 +1,46 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * @author ben + * + */ +public class PhysicalInteractionListener extends AbstractFlagListener { + + /** + * Handle physical interaction with blocks + * Crop trample, pressure plates, triggering redstone, tripwires + * @param e + */ + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent e) { + if (!e.getAction().equals(Action.PHYSICAL)) { + return; + } + switch (e.getClickedBlock().getType()) { + case SOIL: + // Crop trample + checkIsland(e, e.getPlayer().getLocation(), Flags.CROP_TRAMPLE); + break; + case WOOD_PLATE: + case STONE_PLATE: + case GOLD_PLATE: + case IRON_PLATE: + // Pressure plates + checkIsland(e, e.getPlayer().getLocation(), Flags.PRESSURE_PLATE); + break; + default: + break; + + } + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index a1b212721..83c4d0413 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -10,16 +10,9 @@ import org.bukkit.event.block.EntityBlockFormEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.listeners.FlagListener; import us.tastybento.bskyblock.lists.Flags; -public class PlaceBlocksListener extends FlagListener { - - public PlaceBlocksListener() { - super(BSkyBlock.getInstance()); - } - +public class PlaceBlocksListener extends AbstractFlagListener { /** * Check blocks being placed in general @@ -73,7 +66,7 @@ public class PlaceBlocksListener extends FlagListener { if (e.getMaterial().equals(Material.END_CRYSTAL) || e.getMaterial() == Material.WOOD_DOOR || e.getMaterial() == Material.CHEST || e.getMaterial() == Material.TRAPPED_CHEST || e.getMaterial() == Material.IRON_DOOR || (e.getMaterial().name().contains("BOAT") && !e.getClickedBlock().isLiquid())) { - checkIsland(e, getUser().getLocation(), Flags.PLACE_BLOCKS); + checkIsland(e, e.getPlayer().getLocation(), Flags.PLACE_BLOCKS); } } } @@ -87,7 +80,7 @@ public class PlaceBlocksListener extends FlagListener { public void onBlockForm(EntityBlockFormEvent e) { if (e.getNewState().getType().equals(Material.FROSTED_ICE)) { // Silently check - checkIsland(e, getUser().getLocation(), Flags.PLACE_BLOCKS, true); + checkIsland(e, e.getBlock().getLocation(), Flags.PLACE_BLOCKS, true); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java new file mode 100644 index 000000000..e32d870c6 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java @@ -0,0 +1,23 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerPortalEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles portal protection + * @author tastybento + * + */ +public class PortalListener extends AbstractFlagListener { + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerPortal(PlayerPortalEvent e) { + checkIsland(e, e.getFrom(), Flags.PORTAL); + } +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java new file mode 100644 index 000000000..2b404a5cc --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java @@ -0,0 +1,25 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerShearEntityEvent; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles shearing + * @author tastybento + * + */ +public class ShearingListener extends AbstractFlagListener { + + // Protect sheep + @EventHandler(priority = EventPriority.LOW) + public void onShear(final PlayerShearEntityEvent e) { + checkIsland(e, e.getEntity().getLocation(), Flags.SHEARING); + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java new file mode 100644 index 000000000..cbb5cd6e6 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java @@ -0,0 +1,37 @@ +/** + * + */ +package us.tastybento.bskyblock.listeners.flags; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; + +import us.tastybento.bskyblock.lists.Flags; + +/** + * Handles interaction with entities like armor stands + * Note - armor stand protection from breaking or placing is done elsewhere. + * @author tastybento + * + */ +public class TeleportationListener extends AbstractFlagListener { + + /** + * Ender pearl and chorus fruit teleport checks + * + * @param e + */ + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onPlayerTeleport(final PlayerTeleportEvent e) { + + if (e.getCause() != null) { + if (e.getCause().equals(TeleportCause.ENDER_PEARL)) { + checkIsland(e, e.getTo(), Flags.ENDER_PEARL); + } else if (e.getCause().equals(TeleportCause.CHORUS_FRUIT)) { + checkIsland(e, e.getTo(), Flags.CHORUS_FRUIT); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 66edc3c7c..62ec5cb48 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -1,56 +1,121 @@ package us.tastybento.bskyblock.lists; import org.bukkit.Material; + import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.FlagBuilder; -import us.tastybento.bskyblock.listeners.flags.*; +import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; +import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; +import us.tastybento.bskyblock.listeners.flags.BreedingListener; +import us.tastybento.bskyblock.listeners.flags.BucketListener; +import us.tastybento.bskyblock.listeners.flags.EggListener; +import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; +import us.tastybento.bskyblock.listeners.flags.FireListener; +import us.tastybento.bskyblock.listeners.flags.HurtingListener; +import us.tastybento.bskyblock.listeners.flags.InventoryListener; +import us.tastybento.bskyblock.listeners.flags.LeashListener; +import us.tastybento.bskyblock.listeners.flags.PVPListener; +import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; +import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; +import us.tastybento.bskyblock.listeners.flags.PortalListener; +import us.tastybento.bskyblock.listeners.flags.ShearingListener; +import us.tastybento.bskyblock.listeners.flags.TeleportationListener; public class Flags { + /* + * Protection Flags + */ + + // Break and place blocks public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener()).build(); public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.DIRT).listener(new AnvilListener()).build(); - public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag BED = new FlagBuilder().id("BED").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag DOOR = new FlagBuilder().id("DOOR").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag GATE = new FlagBuilder().id("GATE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag PVP = new FlagBuilder().id("PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag NETHER_PVP = new FlagBuilder().id("NETHER_PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag END_PVP = new FlagBuilder().id("END_PVP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag TRADING = new FlagBuilder().id("TRADING").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + + // Block interactions - all use BlockInteractionListener() + public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener()).build(); + public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(); + public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(); + public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(); + public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(); + public static final Flag DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(); + public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(); + public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(); + public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(); + public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(); + public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(); + public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(); + public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).listener(new PlaceBlocksListener()).build(); + public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).listener(new PlaceBlocksListener()).build(); + + // Entity interactions + public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); + public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(); + public static final Flag TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(); + + // Breeding + public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener()).build(); + + // Buckets. All bucket use is covered by one listener + public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener()).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 MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); + + // 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 ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(); + + // Physical interactions + public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener()).build(); + public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(); + + // Egg throwing + public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener()).build(); + + /* + * Fire + * I'll take you to burn. + * Fire + * I'll take you to learn. + * You gonna burn, burn, burn + * Fire + * I'll take you to burn + * - The Crazy World of Arthur Brown + */ + public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener()).build(); + public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(); + public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(); + + // Inventories + public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener()).build(); + + // Hurting things + public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener()).build(); + public static final Flag HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(); + + // Leashes + public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener()).build(); + + // Portal use protection + public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener()).build(); + + // PVP + public static final Flag PVP = new FlagBuilder().id("PVP").icon(Material.ARROW).listener(new PVPListener()).build(); + public static final Flag NETHER_PVP = new FlagBuilder().id("NETHER_PVP").icon(Material.IRON_AXE).build(); + public static final Flag END_PVP = new FlagBuilder().id("END_PVP").icon(Material.END_CRYSTAL).build(); + + // Shearing + public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener()).build(); + + // Visitor item pickup or drop public static final Flag VISITOR_ITEM_DROP = new FlagBuilder().id("VISITOR_ITEM_DROP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); public static final Flag VISITOR_ITEM_PICKUP = new FlagBuilder().id("VISITOR_ITEM_PICKUP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + /* + * Non-protection flags + */ + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); + public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); + public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); } diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 68c1ddb16..960f83478 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -3,8 +3,6 @@ package us.tastybento.bskyblock.managers; import java.util.ArrayList; import java.util.List; -import org.bukkit.Bukkit; - import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.panels.PanelItem; diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index edf7af39d..c2790efef 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -98,203 +98,174 @@ public class SafeSpotTeleport { } final int worldHeight = maxHeight; //plugin.getLogger().info("DEBUG:world height = " + worldHeight); - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - // Find a safe spot, defined as a solid block, with 2 air spaces above it - //long time = System.nanoTime(); - int x = 0; - int y = 0; - int z = 0; - ChunkSnapshot safeChunk = null; - ChunkSnapshot portalChunk = null; - boolean safeSpotFound = false; - Vector safeSpotInChunk = null; - Vector portalPart = null; - double distance = 0D; - double safeDistance = 0D; - for (ChunkSnapshot chunk: finalChunk) { - for (x = 0; x< 16; x++) { - for (z = 0; z < 16; z++) { - // Work down from the entry point up - for (y = Math.min(chunk.getHighestBlockYAt(x, z), worldHeight); y >= 0; y--) { - //System.out.println("Trying " + (16 * chunk.getX() + x) + " " + y + " " + (16 * chunk.getZ() + z)); - // Check for portal - only if this is not a safe home search - if (!setHome && chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { - if (portalPart == null || (distance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { - // First one found or a closer one, save the chunk the position and the distance - portalChunk = chunk; - portalPart = new Vector(x,y,z); - distance = portalPart.distanceSquared(islandLoc.toVector()); - } - } - // Check for safe spot, but only if it is closer than one we have found already - if (!safeSpotFound || (safeDistance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { - // No safe spot yet, or closer distance - if (checkBlock(chunk,x,y,z, worldHeight)) { - safeChunk = chunk; - safeSpotFound = true; - safeSpotInChunk = new Vector(x,y,z); - safeDistance = islandLoc.toVector().distanceSquared(safeSpotInChunk); - } + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { + // Find a safe spot, defined as a solid block, with 2 air spaces above it + //long time = System.nanoTime(); + int x = 0; + int y = 0; + int z = 0; + ChunkSnapshot safeChunk = null; + ChunkSnapshot portalChunk = null; + boolean safeSpotFound = false; + Vector safeSpotInChunk = null; + Vector portalPart = null; + double distance = 0D; + double safeDistance = 0D; + for (ChunkSnapshot chunk: finalChunk) { + for (x = 0; x< 16; x++) { + for (z = 0; z < 16; z++) { + // Work down from the entry point up + for (y = Math.min(chunk.getHighestBlockYAt(x, z), worldHeight); y >= 0; y--) { + //System.out.println("Trying " + (16 * chunk.getX() + x) + " " + y + " " + (16 * chunk.getZ() + z)); + // Check for portal - only if this is not a safe home search + if (!setHome && chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { + if (portalPart == null || (distance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { + // First one found or a closer one, save the chunk the position and the distance + portalChunk = chunk; + portalPart = new Vector(x,y,z); + distance = portalPart.distanceSquared(islandLoc.toVector()); } } - } //end z - } // end x - //if (safeSpotFound) { - //System.out.print("DEBUG: safe spot found " + safeSpotInChunk.toString()); - //break search; - //} - } - // End search - // Check if the portal is safe (it should be) - if (portalPart != null) { - //System.out.print("DEBUG: Portal found"); - // There is a portal available, but is it safe? - // Get the lowest portal spot - x = portalPart.getBlockX(); - y = portalPart.getBlockY(); - z = portalPart.getBlockZ(); - while (portalChunk.getBlockType(x,y,z).equals(Material.PORTAL)) { - y--; - } - //System.out.print("DEBUG: Portal teleport loc = " + (16 * portalChunk.getX() + x) + "," + (y) + "," + (16 * portalChunk.getZ() + z)); - // Now check if this is a safe location - if (checkBlock(portalChunk,x,y,z, worldHeight)) { - // Yes, so use this instead of the highest location - //System.out.print("DEBUG: Portal is safe"); - safeSpotFound = true; - safeSpotInChunk = new Vector(x,y,z); - safeChunk = portalChunk; - // TODO: Add safe portal spot to island - } - } - //System.out.print("Seconds = " + ((System.nanoTime() - time) * 0.000000001)); - if (safeChunk != null && safeSpotFound) { - //final Vector spot = new Vector((16 *currentChunk.getX()) + x + 0.5D, y +1, (16 * currentChunk.getZ()) + z + 0.5D) - final Vector spot = new Vector((16 *safeChunk.getX()) + 0.5D, 1, (16 * safeChunk.getZ()) + 0.5D).add(safeSpotInChunk); - // Return to main thread and teleport the player - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Location destination = spot.toLocation(islandLoc.getWorld()); - //plugin.getLogger().info("DEBUG: safe spot found = " + destination); - - // Create a portal - // TODO Add if statement here - //Block b = player.getLocation().getBlock(); - //if (b.getType() != Material.PORTAL) { - /* - if (world.equals(BSkyBlock.getNetherWorld())) { - for (int x = -1; x < 3; x++) { - for (int y = -1; y< 4; y++) { - Location l = new Location(islandLoc.getWorld(), destination.getBlockX() + x, destination.getBlockY() + y, destination.getBlockZ() -1); - if (x == -1 || x == 2 || y == -1 || y == 3) { - //nms.setBlockSuperFast(l.getBlock(), Material.OBSIDIAN.getId(), (byte)0, false); - //l.getBlock().setType(Material.OBSIDIAN); - //plugin.getLogger().info("DEBUG: obsidian at "+ l); - } else { - //plugin.getLogger().info("DEBUG: Portal at "+ l); - nms.setBlockSuperFast(l.getBlock(), Material.PORTAL.getId(), (byte)0, false); - //l.getBlock().setType(Material.PORTAL); - } - } - } - }*/ - if (setHome && entity instanceof Player) { - plugin.getPlayers().setHomeLocation(entity.getUniqueId(), destination, homeNumber); - } - Vector velocity = entity.getVelocity(); - entity.teleport(destination); - entity.setVelocity(velocity); - // Exit spectator mode if in it - if (entity instanceof Player) { - Player player = (Player)entity; - if (player.getGameMode().equals(GameMode.SPECTATOR)) { - player.setGameMode(GameMode.SURVIVAL); + // Check for safe spot, but only if it is closer than one we have found already + if (!safeSpotFound || (safeDistance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { + // No safe spot yet, or closer distance + if (checkBlock(chunk,x,y,z, worldHeight)) { + safeChunk = chunk; + safeSpotFound = true; + safeSpotInChunk = new Vector(x,y,z); + safeDistance = islandLoc.toVector().distanceSquared(safeSpotInChunk); } } - }}); - } else { - // We did not find a spot - plugin.getServer().getScheduler().runTask(plugin, () -> { - //plugin.getLogger().info("DEBUG: safe spot not found"); - if (entity instanceof Player) { - if (!failureMessage.isEmpty()) { - entity.sendMessage(failureMessage); - } else { - entity.sendMessage("Warp not safe"); - } } - }); + } //end z + } // end x + //if (safeSpotFound) { + //System.out.print("DEBUG: safe spot found " + safeSpotInChunk.toString()); + //break search; + //} + } + // End search + // Check if the portal is safe (it should be) + if (portalPart != null) { + //System.out.print("DEBUG: Portal found"); + // There is a portal available, but is it safe? + // Get the lowest portal spot + x = portalPart.getBlockX(); + y = portalPart.getBlockY(); + z = portalPart.getBlockZ(); + while (portalChunk.getBlockType(x,y,z).equals(Material.PORTAL)) { + y--; + } + //System.out.print("DEBUG: Portal teleport loc = " + (16 * portalChunk.getX() + x) + "," + (y) + "," + (16 * portalChunk.getZ() + z)); + // Now check if this is a safe location + if (checkBlock(portalChunk,x,y,z, worldHeight)) { + // Yes, so use this instead of the highest location + //System.out.print("DEBUG: Portal is safe"); + safeSpotFound = true; + safeSpotInChunk = new Vector(x,y,z); + safeChunk = portalChunk; + // TODO: Add safe portal spot to island } } - - /** - * Returns true if the location is a safe one. - * @param chunk - * @param x - * @param y - * @param z - * @param worldHeight - * @return - */ - @SuppressWarnings("deprecation") - private boolean checkBlock(ChunkSnapshot chunk, int x, int y, int z, int worldHeight) { - int type = chunk.getBlockTypeId(x, y, z); - if (type != 0) { // AIR - int space1 = chunk.getBlockTypeId(x, Math.min(y + 1, worldHeight), z); - int space2 = chunk.getBlockTypeId(x, Math.min(y + 2, worldHeight), z); - if ((space1 == 0 && space2 == 0) || (space1 == Material.PORTAL.getId() || space2 == Material.PORTAL.getId())) { - // Now there is a chance that this is a safe spot - // Check for safe ground - Material mat = Material.getMaterial(type); - if (!mat.toString().contains("FENCE") - && !mat.toString().contains("DOOR") - && !mat.toString().contains("GATE") - && !mat.toString().contains("PLATE")) { - switch (mat) { - // Unsafe - case ANVIL: - case BARRIER: - case BOAT: - case CACTUS: - case DOUBLE_PLANT: - case ENDER_PORTAL: - case FIRE: - case FLOWER_POT: - case LADDER: - case LAVA: - case LEVER: - case LONG_GRASS: - case PISTON_EXTENSION: - case PISTON_MOVING_PIECE: - case PORTAL: - case SIGN_POST: - case SKULL: - case STANDING_BANNER: - case STATIONARY_LAVA: - case STATIONARY_WATER: - case STONE_BUTTON: - case TORCH: - case TRIPWIRE: - case WATER: - case WEB: - case WOOD_BUTTON: - //System.out.println("Block is dangerous " + mat.toString()); - break; - default: - // Safe - // System.out.println("Block is safe " + mat.toString()); - return true; - } + //System.out.print("Seconds = " + ((System.nanoTime() - time) * 0.000000001)); + if (safeChunk != null && safeSpotFound) { + //final Vector spot = new Vector((16 *currentChunk.getX()) + x + 0.5D, y +1, (16 * currentChunk.getZ()) + z + 0.5D) + final Vector spot = new Vector((16 *safeChunk.getX()) + 0.5D, 1, (16 * safeChunk.getZ()) + 0.5D).add(safeSpotInChunk); + // Return to main thread and teleport the player + plugin.getServer().getScheduler().runTask(plugin, () -> { + Location destination = spot.toLocation(islandLoc.getWorld()); + if (setHome && entity instanceof Player) { + plugin.getPlayers().setHomeLocation(entity.getUniqueId(), destination, homeNumber); + } + Vector velocity = entity.getVelocity(); + entity.teleport(destination); + entity.setVelocity(velocity); + // Exit spectator mode if in it + if (entity instanceof Player) { + Player player = (Player)entity; + if (player.getGameMode().equals(GameMode.SPECTATOR)) { + player.setGameMode(GameMode.SURVIVAL); } } - } - return false; - }}); + }); + } else { + // We did not find a spot + plugin.getServer().getScheduler().runTask(plugin, () -> { + //plugin.getLogger().info("DEBUG: safe spot not found"); + if (entity instanceof Player) { + if (!failureMessage.isEmpty()) { + entity.sendMessage(failureMessage); + } else { + entity.sendMessage("Warp not safe"); + } + } + }); + } + }); } } + + /** + * Returns true if the location is a safe one. + * @param chunk + * @param x + * @param y + * @param z + * @param worldHeight + * @return + */ + @SuppressWarnings("deprecation") + private boolean checkBlock(ChunkSnapshot chunk, int x, int y, int z, int worldHeight) { + int type = chunk.getBlockTypeId(x, y, z); + if (type != 0) { // AIR + int space1 = chunk.getBlockTypeId(x, Math.min(y + 1, worldHeight), z); + int space2 = chunk.getBlockTypeId(x, Math.min(y + 2, worldHeight), z); + if ((space1 == 0 && space2 == 0) || (space1 == Material.PORTAL.getId() || space2 == Material.PORTAL.getId())) { + // Now there is a chance that this is a safe spot + // Check for safe ground + Material mat = Material.getMaterial(type); + if (!mat.toString().contains("FENCE") + && !mat.toString().contains("DOOR") + && !mat.toString().contains("GATE") + && !mat.toString().contains("PLATE")) { + switch (mat) { + // Unsafe + case ANVIL: + case BARRIER: + case BOAT: + case CACTUS: + case DOUBLE_PLANT: + case ENDER_PORTAL: + case FIRE: + case FLOWER_POT: + case LADDER: + case LAVA: + case LEVER: + case LONG_GRASS: + case PISTON_EXTENSION: + case PISTON_MOVING_PIECE: + case PORTAL: + case SIGN_POST: + case SKULL: + case STANDING_BANNER: + case STATIONARY_LAVA: + case STATIONARY_WATER: + case STONE_BUTTON: + case TORCH: + case TRIPWIRE: + case WATER: + case WEB: + case WOOD_BUTTON: + //System.out.println("Block is dangerous " + mat.toString()); + break; + default: + // Safe + // System.out.println("Block is safe " + mat.toString()); + return true; + } + } + } + } + return false; + } } \ No newline at end of file From b19cfb515228311167305a07a72a7a143a9f349a Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Fri, 2 Feb 2018 07:46:53 +0100 Subject: [PATCH 11/97] Removed IDEA junk files and added a .gitignore --- .gitignore | 6 ++++++ .idea/misc.xml | 13 ------------- .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 4 files changed, 6 insertions(+), 27 deletions(-) create mode 100644 .gitignore delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..9adaadaa0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/bin/ +.classpath +.project +/.settings/ +*.iml +/target diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index e8942bd65..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index b7d631524..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From f930504dabca6c670bbc5361b6b004355230c783 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Fri, 2 Feb 2018 07:50:17 +0100 Subject: [PATCH 12/97] And remove another IDEA junk file --- bskyblock.iml | 43 ------------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 bskyblock.iml diff --git a/bskyblock.iml b/bskyblock.iml deleted file mode 100644 index 686b4846a..000000000 --- a/bskyblock.iml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 5293d647c0454fb1c244e9e57c69e5fe9891bcb4 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Fri, 2 Feb 2018 15:22:37 +0100 Subject: [PATCH 13/97] Removed duplicate listeners in Flags --- .../java/us/tastybento/bskyblock/lists/Flags.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 62ec5cb48..110d76c6d 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -44,8 +44,8 @@ public class Flags { public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(); public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(); public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(); - public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).listener(new PlaceBlocksListener()).build(); - public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).listener(new PlaceBlocksListener()).build(); + public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(); + public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(); // Entity interactions public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); @@ -108,14 +108,14 @@ public class Flags { public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener()).build(); // Visitor item pickup or drop - public static final Flag VISITOR_ITEM_DROP = new FlagBuilder().id("VISITOR_ITEM_DROP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); - public static final Flag VISITOR_ITEM_PICKUP = new FlagBuilder().id("VISITOR_ITEM_PICKUP").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag VISITOR_ITEM_DROP = new FlagBuilder().id("VISITOR_ITEM_DROP").icon(Material.DIRT).build(); + public static final Flag VISITOR_ITEM_PICKUP = new FlagBuilder().id("VISITOR_ITEM_PICKUP").icon(Material.DIRT).build(); /* * Non-protection flags */ - public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); - public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); - public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).listener(new PlaceBlocksListener()).build(); + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(); + public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(); + public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(); } From 3d7b1bc6479bda2866c0a5c1d82534356aeafd63 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Fri, 2 Feb 2018 15:29:24 +0100 Subject: [PATCH 14/97] Renamed PVP and Item Drop/pickup related flags Also assigned the ItemDropPickUpListener() to the related events --- .../flags/ItemDropPickUpListener.java | 4 +-- .../listeners/flags/PVPListener.java | 24 +++++++-------- .../us/tastybento/bskyblock/lists/Flags.java | 30 +++++-------------- 3 files changed, 22 insertions(+), 36 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index b73e2f4b3..1a550ffc7 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -23,7 +23,7 @@ public class ItemDropPickUpListener extends AbstractFlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onVisitorDrop(PlayerDropItemEvent e) { - checkIsland(e, e.getItemDrop().getLocation(), Flags.VISITOR_ITEM_DROP); + checkIsland(e, e.getItemDrop().getLocation(), Flags.ITEM_DROP); } /* @@ -33,7 +33,7 @@ public class ItemDropPickUpListener extends AbstractFlagListener { public void onVisitorDrop(EntityPickupItemEvent e) { if (e.getEntity() instanceof Player) { setUser(User.getInstance(e.getEntity())); - checkIsland(e, e.getItem().getLocation(), Flags.VISITOR_ITEM_PICKUP); + checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP); } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 428b193f5..52932d4db 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -43,9 +43,9 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() instanceof Player) { - Flag flag = Flags.PVP; - if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; - else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + Flag flag = Flags.PVP_OVERWORLD; + if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; respond(e, e.getDamager(), flag); } } @@ -72,9 +72,9 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFishing(PlayerFishEvent e) { if (e.getCaught() != null && e.getCaught() instanceof Player) { - Flag flag = Flags.PVP; - if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; - else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + Flag flag = Flags.PVP_OVERWORLD; + if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; if (checkIsland(e, e.getCaught().getLocation(), flag)) { e.getHook().remove(); return; @@ -89,9 +89,9 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onSplashPotionSplash(final PotionSplashEvent e) { // Deduce the world - Flag flag = Flags.PVP; - if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; - else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + Flag flag = Flags.PVP_OVERWORLD; + if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; // Try to get the thrower Projectile projectile = (Projectile) e.getEntity(); @@ -138,9 +138,9 @@ public class PVPListener extends AbstractFlagListener { if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { // Deduce the world - Flag flag = Flags.PVP; - if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.NETHER_PVP; - else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.END_PVP; + Flag flag = Flags.PVP_OVERWORLD; + if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; UUID attacker = thrownPotions.get(e.getDamager().getEntityId()); // Self damage diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 110d76c6d..08e4e297d 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -4,22 +4,7 @@ import org.bukkit.Material; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.FlagBuilder; -import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; -import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; -import us.tastybento.bskyblock.listeners.flags.BreedingListener; -import us.tastybento.bskyblock.listeners.flags.BucketListener; -import us.tastybento.bskyblock.listeners.flags.EggListener; -import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; -import us.tastybento.bskyblock.listeners.flags.FireListener; -import us.tastybento.bskyblock.listeners.flags.HurtingListener; -import us.tastybento.bskyblock.listeners.flags.InventoryListener; -import us.tastybento.bskyblock.listeners.flags.LeashListener; -import us.tastybento.bskyblock.listeners.flags.PVPListener; -import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; -import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; -import us.tastybento.bskyblock.listeners.flags.PortalListener; -import us.tastybento.bskyblock.listeners.flags.ShearingListener; -import us.tastybento.bskyblock.listeners.flags.TeleportationListener; +import us.tastybento.bskyblock.listeners.flags.*; public class Flags { @@ -100,20 +85,21 @@ public class Flags { public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener()).build(); // PVP - public static final Flag PVP = new FlagBuilder().id("PVP").icon(Material.ARROW).listener(new PVPListener()).build(); - public static final Flag NETHER_PVP = new FlagBuilder().id("NETHER_PVP").icon(Material.IRON_AXE).build(); - public static final Flag END_PVP = new FlagBuilder().id("END_PVP").icon(Material.END_CRYSTAL).build(); + public static final Flag PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener()).build(); + public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(); + public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(); // Shearing public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener()).build(); - // Visitor item pickup or drop - public static final Flag VISITOR_ITEM_DROP = new FlagBuilder().id("VISITOR_ITEM_DROP").icon(Material.DIRT).build(); - public static final Flag VISITOR_ITEM_PICKUP = new FlagBuilder().id("VISITOR_ITEM_PICKUP").icon(Material.DIRT).build(); + // Item pickup or drop + public static final Flag ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).listener(new ItemDropPickUpListener()).build(); + public static final Flag ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(); /* * Non-protection flags */ + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(); public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(); public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(); From 0d645600fc7fa58edd84e829df136b5e25ded630 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Fri, 2 Feb 2018 08:18:56 -0800 Subject: [PATCH 15/97] Fixed bugs with start up and flag registration. Protection does not work yet. Still need more debugging. --- .../us/tastybento/bskyblock/BSkyBlock.java | 2 + .../tastybento/bskyblock/api/flags/Flag.java | 2 +- .../teams/IslandTeamInviteAcceptCommand.java | 2 +- .../database/managers/island/IslandCache.java | 10 +- .../managers/island/IslandsManager.java | 4 +- .../bskyblock/database/objects/Island.java | 362 +++++++++--------- .../listeners/JoinLeaveListener.java | 2 +- .../us/tastybento/bskyblock/lists/Flags.java | 1 - .../bskyblock/managers/FlagsManager.java | 1 + src/test/java/bskyblock/TestBSkyBlock.java | 6 +- 10 files changed, 204 insertions(+), 188 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 1830f204d..5d98582ec 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -11,6 +11,7 @@ import us.tastybento.bskyblock.database.managers.island.IslandsManager; import us.tastybento.bskyblock.generators.IslandWorld; import us.tastybento.bskyblock.listeners.JoinLeaveListener; import us.tastybento.bskyblock.listeners.PanelListenerManager; +import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.AddonsManager; import us.tastybento.bskyblock.managers.CommandsManager; import us.tastybento.bskyblock.managers.FlagsManager; @@ -99,6 +100,7 @@ public class BSkyBlock extends JavaPlugin { // Load Flags flagsManager = new FlagsManager(plugin); + new Flags(); // Load addons addonsManager = new AddonsManager(plugin); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index fe3252a73..c17823be3 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -30,7 +30,7 @@ public class Flag { } public Optional getListener() { - return Optional.of(listener); + return Optional.ofNullable(listener); } public boolean isAllowed() { diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java index cfa762a34..89a81ca68 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java @@ -101,7 +101,7 @@ public class IslandTeamInviteAcceptCommand extends AbstractIslandTeamCommand { } getIslands().save(false); if (DEBUG) - getPlugin().getLogger().info("DEBUG: After save " + getIslands().getIsland(prospectiveTeamLeaderUUID).getMembers().toString()); + getPlugin().getLogger().info("DEBUG: After save " + getIslands().getIsland(prospectiveTeamLeaderUUID).getMemberSet().toString()); return true; } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index 9c4fa9bc1..463a1f2f3 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -43,8 +43,8 @@ public class IslandCache { plugin.getLogger().info("DEBUG: owner = " + island.getOwner()); islandsByUUID.put(island.getOwner(), island); if (DEBUG) - plugin.getLogger().info("DEBUG: island has " + island.getMembers().size() + " members"); - for (UUID member: island.getMembers()) { + plugin.getLogger().info("DEBUG: island has " + island.getMemberSet().size() + " members"); + for (UUID member: island.getMemberSet()) { if (DEBUG) plugin.getLogger().info("DEBUG: " + member); islandsByUUID.put(member, island); @@ -288,7 +288,7 @@ public class IslandCache { public Set getMembers(UUID playerUUID) { Island island = islandsByUUID.get(playerUUID); if (island != null) - return new HashSet(island.getMembers()); + return new HashSet(island.getMemberSet()); return new HashSet(0); } @@ -336,10 +336,10 @@ public class IslandCache { if (DEBUG) plugin.getLogger().info("DEBUG: player is the owner of this island"); // Clear ownership and members - island.getMembers().clear(); + island.getMemberSet().clear(); island.setOwner(null); } - island.getMembers().remove(playerUUID); + island.getMemberSet().remove(playerUUID); } if (DEBUG) plugin.getLogger().info("DEBUG: removing reference to island by UUID"); diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 023611019..ff4531a1f 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -785,7 +785,7 @@ public class IslandsManager { //plugin.getLogger().info("DEBUG: members = " + island.getMembers()); //plugin.getLogger().info("DEBUG: player UUID = " + player.getUniqueId()); - if (island.get().onIsland(loc) && island.get().getMembers().contains(player.getUniqueId())) { + if (island.get().onIsland(loc) && island.get().getMemberSet().contains(player.getUniqueId())) { //plugin.getLogger().info("DEBUG: allowed"); // In a protected zone but is on the list of acceptable players return true; @@ -972,7 +972,7 @@ public class IslandsManager { islandCache.addPlayer(playerUUID, teamIsland); if (DEBUG) { plugin.getLogger().info("DEBUG: new team member list:"); - plugin.getLogger().info(teamIsland.getMembers().toString()); + plugin.getLogger().info(teamIsland.getMemberSet().toString()); } // Save the database save(false); diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 539d4ac25..ce5abc8cf 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -37,18 +37,6 @@ public class Island implements DataObject { private String uniqueId = ""; - public String getUniqueId() { - // Island's have UUID's that are randomly assigned if they do not exist - if (uniqueId.isEmpty()) { - uniqueId = UUID.randomUUID().toString(); - } - return uniqueId; - } - - public void setUniqueId(String uniqueId) { - this.uniqueId = uniqueId; - } - //// Island //// // The center of the island itself private Location center; @@ -77,25 +65,25 @@ public class Island implements DataObject { // Time parameters private long createdDate; + private long updatedDate; //// Team //// private UUID owner; private HashMap members = new HashMap<>(); - + //// State //// private boolean locked = false; private boolean spawn = false; + private boolean purgeProtected = false; //// Protection //// private HashMap flags = new HashMap<>(); - private int levelHandicap; - private Location spawnPoint; public Island() {} - + public Island(Location location, UUID owner, int protectionRange) { this.owner = owner; this.members.put(owner, RanksManager.OWNER_RANK); @@ -118,7 +106,7 @@ public class Island implements DataObject { public void addMember(UUID playerUUID) { members.put(playerUUID, RanksManager.MEMBER_RANK); } - + /** * Adds target to a list of banned players for this island. May be blocked by the event being cancelled. * If the player is a member, coop or trustee, they will be removed from those lists. @@ -179,10 +167,31 @@ public class Island implements DataObject { return flags; } + /** + * @return the levelHandicap + */ + public int getLevelHandicap() { + return levelHandicap; + } + + /** + * @return true if the island is locked, otherwise false + */ + public boolean getLocked(){ + return locked; + } + + /** + * @return the members + */ + public HashMap getMembers() { + return members; + } + /** * @return the members of the island (owner included) */ - public Set getMembers(){ + public Set getMemberSet(){ Set result = new HashSet<>(); for (Entry member: members.entrySet()) { if (member.getValue() >= RanksManager.MEMBER_RANK) { @@ -249,6 +258,13 @@ public class Island implements DataObject { return protectionRange; } + /** + * @return true if the island is protected from the Purge, otherwise false + */ + public boolean getPurgeProtected(){ + return purgeProtected; + } + /** * @return the island range */ @@ -256,6 +272,85 @@ public class Island implements DataObject { return range; } + /** + * Get the rank of user for this island + * @param user + * @return rank integer + */ + public int getRank(User user) { + return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : RanksManager.VISITOR_RANK; + } + + /** + * @return the ranks + */ + public HashMap getRanks() { + return members; + } + + /** + * @return true if the island is the spawn otherwise false + */ + public boolean getSpawn(){ + return spawn; + } + + public Location getSpawnPoint() { + return spawnPoint; + } + + /** + * @param material + * @return count of how many tile entities of type mat are on the island at last count. Counts are done when a player places + * a tile entity. + */ + public int getTileEntityCount(Material material, World world) { + int result = 0; + for (int x = getMinProtectedX() /16; x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { + for (int z = getMinProtectedZ() /16; z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { + for (BlockState holder : world.getChunkAt(x, z).getTileEntities()) { + //plugin.getLogger().info("DEBUG: tile entity: " + holder.getType()); + if (onIsland(holder.getLocation())) { + if (holder.getType() == material) { + result++; + } else if (material.equals(Material.REDSTONE_COMPARATOR_OFF)) { + if (holder.getType().equals(Material.REDSTONE_COMPARATOR_ON)) { + result++; + } + } else if (material.equals(Material.FURNACE)) { + if (holder.getType().equals(Material.BURNING_FURNACE)) { + result++; + } + } else if (material.toString().endsWith("BANNER")) { + if (holder.getType().toString().endsWith("BANNER")) { + result++; + } + } else if (material.equals(Material.WALL_SIGN) || material.equals(Material.SIGN_POST)) { + if (holder.getType().equals(Material.WALL_SIGN) || holder.getType().equals(Material.SIGN_POST)) { + result++; + } + } + } + } + for (Entity holder : world.getChunkAt(x, z).getEntities()) { + //plugin.getLogger().info("DEBUG: entity: " + holder.getType()); + if (holder.getType().toString().equals(material.toString()) && onIsland(holder.getLocation())) { + result++; + } + } + } + } + return result; + } + + public String getUniqueId() { + // Island's have UUID's that are randomly assigned if they do not exist + if (uniqueId.isEmpty()) { + uniqueId = UUID.randomUUID().toString(); + } + return uniqueId; + } + /** * @return the date when the island was updated (team member connection, etc...) */ @@ -302,6 +397,33 @@ public class Island implements DataObject { return (x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2) ? true: false; } + public boolean inIslandSpace(Location location) { + if (Util.inWorld(location)) { + return inIslandSpace(location.getBlockX(), location.getBlockZ()); + } + return false; + } + + /** + * Check if the flag is allowed or not + * For flags that are for the island in general and not related to rank + * @param flag + * @return true if allowed, false if not + */ + public boolean isAllowed(Flag flag) { + return this.getFlag(flag) >= 0 ? true : false; + } + + /** + * Check if a user is allowed to bypass the flag or not + * @param user - user + * @param flag - flag + * @return true if allowed, false if not + */ + public boolean isAllowed(User user, Flag flag) { + return (this.getRank(user) >= this.getFlag(flag)) ? true : false; + } + /** * Check if banned * @param targetUUID @@ -312,23 +434,16 @@ public class Island implements DataObject { } /** - * @return true if the island is locked, otherwise false + * @return true if island is locked, false if not */ - public boolean getLocked(){ + public boolean isLocked() { return locked; } /** - * @return true if the island is protected from the Purge, otherwise false + * @return spawn */ - public boolean getPurgeProtected(){ - return purgeProtected; - } - - /** - * @return true if the island is the spawn otherwise false - */ - public boolean getSpawn(){ + public boolean isSpawn() { return spawn; } @@ -360,6 +475,10 @@ public class Island implements DataObject { return true; } + public void removeMember(UUID playerUUID) { + members.remove(playerUUID); + } + /** * @param center the center to set */ @@ -399,6 +518,13 @@ public class Island implements DataObject { }*/ //TODO default flags } + /** + * @param levelHandicap the levelHandicap to set + */ + public void setLevelHandicap(int levelHandicap) { + this.levelHandicap = levelHandicap; + } + /** * Locks/Unlocks the island. May be cancelled by * {@link IslandLockEvent} or {@link IslandUnlockEvent}. @@ -420,6 +546,13 @@ public class Island implements DataObject { } } + /** + * @param members the members to set + */ + public void setMembers(HashMap members) { + this.members = members; + } + /** * @param minProtectedX the minProtectedX to set */ @@ -492,13 +625,29 @@ public class Island implements DataObject { this.range = range; } + /** + * Set user's rank to an arbitrary rank value + * @param user + * @param rank + */ + public void setRank(User user, int rank) { + members.put(user.getUniqueId(), rank); + } + + /** + * @param ranks the ranks to set + */ + public void setRanks(HashMap ranks) { + this.members = ranks; + } + /** * @param isSpawn - if the island is the spawn */ public void setSpawn(boolean isSpawn){ this.spawn = isSpawn; } - + /** * Resets the flags to their default as set in config.yml for the spawn */ @@ -508,6 +657,15 @@ public class Island implements DataObject { }*/ //TODO default flags } + public void setSpawnPoint(Location location) { + spawnPoint = location; + + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + /** * @param updatedDate - the updatedDate to sets */ @@ -521,148 +679,4 @@ public class Island implements DataObject { public void setWorld(World world) { this.world = world; } - - /** - * @return the levelHandicap - */ - public int getLevelHandicap() { - return levelHandicap; - } - - /** - * @param levelHandicap the levelHandicap to set - */ - public void setLevelHandicap(int levelHandicap) { - this.levelHandicap = levelHandicap; - } - - /** - * @return true if island is locked, false if not - */ - public boolean isLocked() { - return locked; - } - - /** - * @return spawn - */ - public boolean isSpawn() { - return spawn; - } - - /** - * @param material - * @return count of how many tile entities of type mat are on the island at last count. Counts are done when a player places - * a tile entity. - */ - public int getTileEntityCount(Material material, World world) { - int result = 0; - for (int x = getMinProtectedX() /16; x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { - for (int z = getMinProtectedZ() /16; z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { - for (BlockState holder : world.getChunkAt(x, z).getTileEntities()) { - //plugin.getLogger().info("DEBUG: tile entity: " + holder.getType()); - if (onIsland(holder.getLocation())) { - if (holder.getType() == material) { - result++; - } else if (material.equals(Material.REDSTONE_COMPARATOR_OFF)) { - if (holder.getType().equals(Material.REDSTONE_COMPARATOR_ON)) { - result++; - } - } else if (material.equals(Material.FURNACE)) { - if (holder.getType().equals(Material.BURNING_FURNACE)) { - result++; - } - } else if (material.toString().endsWith("BANNER")) { - if (holder.getType().toString().endsWith("BANNER")) { - result++; - } - } else if (material.equals(Material.WALL_SIGN) || material.equals(Material.SIGN_POST)) { - if (holder.getType().equals(Material.WALL_SIGN) || holder.getType().equals(Material.SIGN_POST)) { - result++; - } - } - } - } - for (Entity holder : world.getChunkAt(x, z).getEntities()) { - //plugin.getLogger().info("DEBUG: entity: " + holder.getType()); - if (holder.getType().toString().equals(material.toString()) && onIsland(holder.getLocation())) { - result++; - } - } - } - } - return result; - } - - public boolean inIslandSpace(Location location) { - if (Util.inWorld(location)) { - return inIslandSpace(location.getBlockX(), location.getBlockZ()); - } - return false; - } - - public void setSpawnPoint(Location location) { - spawnPoint = location; - - } - - public Location getSpawnPoint() { - return spawnPoint; - } - - public void removeMember(UUID playerUUID) { - members.remove(playerUUID); - } - - /** - * Get the rank of user for this island - * @param user - * @return rank integer - */ - public int getRank(User user) { - return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : RanksManager.VISITOR_RANK; - } - - /** - * Set user's rank to an arbitrary rank value - * @param user - * @param rank - */ - public void setRank(User user, int rank) { - members.put(user.getUniqueId(), rank); - } - - /** - * @return the ranks - */ - public HashMap getRanks() { - return members; - } - - /** - * @param ranks the ranks to set - */ - public void setRanks(HashMap ranks) { - this.members = ranks; - } - - /** - * Check if a user is allowed to bypass the flag or not - * @param user - user - * @param flag - flag - * @return true if allowed, false if not - */ - public boolean isAllowed(User user, Flag flag) { - return (this.getRank(user) >= this.getFlag(flag)) ? true : false; - } - - /** - * Check if the flag is allowed or not - * For flags that are for the island in general and not related to rank - * @param flag - * @return true if allowed, false if not - */ - public boolean isAllowed(Flag flag) { - return this.getFlag(flag) >= 0 ? true : false; - } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java index e3618927b..0d83aab2a 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java @@ -71,7 +71,7 @@ public class JoinLeaveListener implements Listener { if (currentIsland != null && (currentIsland.isLocked() || plugin.getPlayers().isBanned(currentIsland.getOwner(),user.getUniqueId()))) { if (DEBUG) plugin.getLogger().info("DEBUG: Current island is locked, or player is banned"); - if (!currentIsland.getMembers().contains(playerUUID) && !user.hasPermission(Constants.PERMPREFIX + "mod.bypassprotect")) { + if (!currentIsland.getMemberSet().contains(playerUUID) && !user.hasPermission(Constants.PERMPREFIX + "mod.bypassprotect")) { if (DEBUG) plugin.getLogger().info("DEBUG: No bypass - teleporting"); user.sendMessage("locked.islandlocked"); diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 62ec5cb48..5221d00ad 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -22,7 +22,6 @@ import us.tastybento.bskyblock.listeners.flags.ShearingListener; import us.tastybento.bskyblock.listeners.flags.TeleportationListener; public class Flags { - /* * Protection Flags */ diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 960f83478..8b5884de9 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -19,6 +19,7 @@ public class FlagsManager { public void registerFlag(Flag flag) { //TODO all the security checks + plugin.getLogger().info("DEBUG: registering flag " + flag.getID()); flags.add(flag); // If there is a listener, register it into Bukkit. flag.getListener().ifPresent(l -> plugin.getServer().getPluginManager().registerEvents(l, plugin)); diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 25d14199c..d17969031 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -312,7 +312,7 @@ public class TestBSkyBlock { island.addMember(member2); island.addMember(member3); - Set members = island.getMembers(); + Set members = island.getMemberSet(); assertTrue(members.contains(playerUUID)); assertTrue(members.contains(member1)); assertTrue(members.contains(member2)); @@ -320,7 +320,7 @@ public class TestBSkyBlock { // Remove members island.removeMember(member3); - members = island.getMembers(); + members = island.getMemberSet(); assertTrue(members.contains(playerUUID)); assertTrue(members.contains(member1)); assertTrue(members.contains(member2)); @@ -328,7 +328,7 @@ public class TestBSkyBlock { // Ban member island.addToBanList(member1); - members = island.getMembers(); + members = island.getMemberSet(); assertTrue(members.contains(playerUUID)); assertFalse(members.contains(member1)); assertTrue(members.contains(member2)); From df0ecca2176e27a74e306d8975112f1798174727 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 3 Feb 2018 11:54:33 -0800 Subject: [PATCH 16/97] Added dependency injection (DI) for flag listeners for plugin. This is required for automated testing (can't use static getInstance). I really need automated testing of the protection classes, so even though this adds a parameter to the classes, it's important to have it right now. --- .gitignore | 1 + .../us/tastybento/bskyblock/BSkyBlock.java | 2 +- .../tastybento/bskyblock/api/flags/Flag.java | 4 +- .../bskyblock/api/flags/FlagBuilder.java | 5 +- .../listeners/flags/AbstractFlagListener.java | 5 +- .../flags/BlockInteractionListener.java | 5 + .../listeners/flags/BreakBlocksListener.java | 5 + .../listeners/flags/BreedingListener.java | 6 + .../listeners/flags/BucketListener.java | 5 + .../listeners/flags/EggListener.java | 5 + .../flags/EntityInteractListener.java | 5 + .../listeners/flags/FireListener.java | 5 + .../listeners/flags/HurtingListener.java | 5 + .../listeners/flags/InventoryListener.java | 5 + .../flags/ItemDropPickUpListener.java | 8 +- .../listeners/flags/LeashListener.java | 6 + .../listeners/flags/MobSpawnListener.java | 5 + .../listeners/flags/PVPListener.java | 5 + .../flags/PhysicalInteractionListener.java | 5 + .../listeners/flags/PlaceBlocksListener.java | 5 + .../listeners/flags/PortalListener.java | 5 + .../listeners/flags/ShearingListener.java | 5 + .../flags/TeleportationListener.java | 8 +- .../us/tastybento/bskyblock/lists/Flags.java | 123 +++++++++++------- 24 files changed, 178 insertions(+), 60 deletions(-) diff --git a/.gitignore b/.gitignore index 9adaadaa0..f6d4ea0cf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /.settings/ *.iml /target +/.DS_Store diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 5d98582ec..b17943fca 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -100,7 +100,7 @@ public class BSkyBlock extends JavaPlugin { // Load Flags flagsManager = new FlagsManager(plugin); - new Flags(); + new Flags(plugin); // Load addons addonsManager = new AddonsManager(plugin); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index c17823be3..3f5564043 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -14,11 +14,11 @@ public class Flag { private Listener listener; private boolean defaultSetting; - public Flag(String id, PanelItem icon, Listener listener, boolean defaultSetting) { + public Flag(BSkyBlock plugin, String id, PanelItem icon, Listener listener, boolean defaultSetting) { this.id = id; this.icon = icon; this.listener = listener; - BSkyBlock.getInstance().getFlagsManager().registerFlag(this); + plugin.getFlagsManager().registerFlag(this); } public String getID() { diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 4713203e3..7ced27066 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -4,6 +4,7 @@ import org.bukkit.Material; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; @@ -37,8 +38,8 @@ public class FlagBuilder { return this; } - public Flag build() { - return new Flag(id, icon, listener, defaultSetting); + public Flag build(BSkyBlock plugin) { + return new Flag(plugin, id, icon, listener, defaultSetting); } /** diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index f8aeb8601..5f604f04c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -27,9 +27,9 @@ public abstract class AbstractFlagListener implements Listener { public BSkyBlock plugin; private User user = null; - public AbstractFlagListener() { + public AbstractFlagListener(BSkyBlock plugin) { super(); - this.plugin = BSkyBlock.getInstance(); + this.plugin = plugin; } /** @@ -116,6 +116,7 @@ public abstract class AbstractFlagListener implements Listener { * Generic place blocks checker * @param e * @param loc + * @param flag * @return true if the check is okay, false if it was disallowed */ public boolean checkIsland(Event e, Location loc, Flag flag) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index c63130cc5..f4bd2fe5f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -8,6 +8,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -16,6 +17,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BlockInteractionListener extends AbstractFlagListener { + public BlockInteractionListener(BSkyBlock plugin) { + super(plugin); + } + /** * Handle interaction with blocks * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index 3dfc9277c..bcf3b4e78 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -17,11 +17,16 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; import org.bukkit.util.BlockIterator; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; public class BreakBlocksListener extends AbstractFlagListener { + public BreakBlocksListener(BSkyBlock plugin) { + super(plugin); + } + /** * Prevents blocks from being broken * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java index c26b4d997..3c6cee3a6 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java @@ -14,6 +14,7 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -24,6 +25,11 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BreedingListener extends AbstractFlagListener { + public BreedingListener(BSkyBlock plugin) { + super(plugin); + } + + /** * A list of items that cause breeding if a player has them in their hand and they click an animal * This list may need to be extended with future versions of Minecraft. diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java index a6accff38..d35e16a91 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -20,6 +21,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BucketListener extends AbstractFlagListener { + public BucketListener(BSkyBlock plugin) { + super(plugin); + } + /** * Prevents emptying of buckets * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java index ceb297d27..1bf5e5e3b 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerEggThrowEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -16,6 +17,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class EggListener extends AbstractFlagListener { + public EggListener(BSkyBlock plugin) { + super(plugin); + } + /** * Handle visitor chicken egg throwing * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java index 382958aab..61ed0444e 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java @@ -12,6 +12,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -22,6 +23,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class EntityInteractListener extends AbstractFlagListener { + public EntityInteractListener(BSkyBlock plugin) { + super(plugin); + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onPlayerInteract(final PlayerInteractAtEntityEvent e) { if (e.getRightClicked() instanceof ArmorStand) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index 8d7c524bd..b54f55877 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -19,6 +19,7 @@ import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.BlockIterator; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.lists.Flags; @@ -30,6 +31,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class FireListener extends AbstractFlagListener { + public FireListener(BSkyBlock plugin) { + super(plugin); + } + /** * Prevents fire spread * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index c5aff48d1..aa3d21bc3 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -30,6 +30,7 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.potion.PotionEffect; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; @@ -41,6 +42,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class HurtingListener extends AbstractFlagListener { + public HurtingListener(BSkyBlock plugin) { + super(plugin); + } + private HashMap thrownPotions = new HashMap<>(); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java index 00d004ba0..a245693ae 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java @@ -16,6 +16,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -25,6 +26,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class InventoryListener extends AbstractFlagListener { + public InventoryListener(BSkyBlock plugin) { + super(plugin); + } + /** * Prevents visitors picking items from inventories * @param event diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index 1a550ffc7..530417e8e 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.player.PlayerDropItemEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; @@ -18,6 +19,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class ItemDropPickUpListener extends AbstractFlagListener { + public ItemDropPickUpListener(BSkyBlock plugin) { + super(plugin); + } + /* * Handle item drop by visitors */ @@ -33,7 +38,8 @@ public class ItemDropPickUpListener extends AbstractFlagListener { public void onVisitorDrop(EntityPickupItemEvent e) { if (e.getEntity() instanceof Player) { setUser(User.getInstance(e.getEntity())); - checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP); + // Disallow, but don't tell the player an error + checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP, false); } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java index 0899842b1..954f4b6ce 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.entity.PlayerLeashEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerUnleashEntityEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -18,6 +19,11 @@ import us.tastybento.bskyblock.lists.Flags; */ public class LeashListener extends AbstractFlagListener { + public LeashListener(BSkyBlock plugin) { + super(plugin); + } + + /** * Prevents leashing * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index 2dded771b..7c3a7a4d7 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -13,6 +13,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.lists.Flags; @@ -23,6 +24,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class MobSpawnListener extends AbstractFlagListener { + public MobSpawnListener(BSkyBlock plugin) { + super(plugin); + } + /** * Prevents mobs spawning naturally * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 52932d4db..409d1b648 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -20,6 +20,7 @@ import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.potion.PotionEffect; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; @@ -31,6 +32,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PVPListener extends AbstractFlagListener { + public PVPListener(BSkyBlock plugin) { + super(plugin); + } + private HashMap thrownPotions = new HashMap<>(); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java index 77a594f74..28e2af986 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java @@ -8,6 +8,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -16,6 +17,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PhysicalInteractionListener extends AbstractFlagListener { + public PhysicalInteractionListener(BSkyBlock plugin) { + super(plugin); + } + /** * Handle physical interaction with blocks * Crop trample, pressure plates, triggering redstone, tripwires diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index 83c4d0413..df9970812 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -10,10 +10,15 @@ import org.bukkit.event.block.EntityBlockFormEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; public class PlaceBlocksListener extends AbstractFlagListener { + public PlaceBlocksListener(BSkyBlock plugin) { + super(plugin); + } + /** * Check blocks being placed in general * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java index e32d870c6..ddf338c5c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerPortalEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -16,6 +17,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PortalListener extends AbstractFlagListener { + public PortalListener(BSkyBlock plugin) { + super(plugin); + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onPlayerPortal(PlayerPortalEvent e) { checkIsland(e, e.getFrom(), Flags.PORTAL); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java index 2b404a5cc..8bcf0bd17 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerShearEntityEvent; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -16,6 +17,10 @@ import us.tastybento.bskyblock.lists.Flags; */ public class ShearingListener extends AbstractFlagListener { + public ShearingListener(BSkyBlock plugin) { + super(plugin); + } + // Protect sheep @EventHandler(priority = EventPriority.LOW) public void onShear(final PlayerShearEntityEvent e) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java index cbb5cd6e6..6d3e4fc9f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java @@ -8,16 +8,20 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** - * Handles interaction with entities like armor stands - * Note - armor stand protection from breaking or placing is done elsewhere. + * Handles teleporting due to enderpearl or chorus fruit. * @author tastybento * */ public class TeleportationListener extends AbstractFlagListener { + public TeleportationListener(BSkyBlock plugin) { + super(plugin); + } + /** * Ender pearl and chorus fruit teleport checks * diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 81d5f4b8c..5f0121128 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -2,59 +2,82 @@ package us.tastybento.bskyblock.lists; import org.bukkit.Material; +import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.FlagBuilder; -import us.tastybento.bskyblock.listeners.flags.*; +import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; +import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; +import us.tastybento.bskyblock.listeners.flags.BreedingListener; +import us.tastybento.bskyblock.listeners.flags.BucketListener; +import us.tastybento.bskyblock.listeners.flags.EggListener; +import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; +import us.tastybento.bskyblock.listeners.flags.FireListener; +import us.tastybento.bskyblock.listeners.flags.HurtingListener; +import us.tastybento.bskyblock.listeners.flags.InventoryListener; +import us.tastybento.bskyblock.listeners.flags.ItemDropPickUpListener; +import us.tastybento.bskyblock.listeners.flags.LeashListener; +import us.tastybento.bskyblock.listeners.flags.PVPListener; +import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; +import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; +import us.tastybento.bskyblock.listeners.flags.PortalListener; +import us.tastybento.bskyblock.listeners.flags.ShearingListener; +import us.tastybento.bskyblock.listeners.flags.TeleportationListener; +/** + * Protection flags + * @author tastybento + * + */ public class Flags { - /* - * Protection Flags - */ + private static BSkyBlock p; + public Flags(BSkyBlock plugin) { + p = plugin; + } // Break and place blocks - public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener()).build(); - public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); + public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); // Block interactions - all use BlockInteractionListener() - public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener()).build(); - public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(); - public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(); - public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(); - public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(); - public static final Flag DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(); - public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(); - public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(); - public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(); - public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(); - public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(); - public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(); - public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(); - public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(); + public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); + public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(p); + public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(p); + public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(p); + public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(p); + public static final Flag DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); + public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(p); + public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); + public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(p); + public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(p); + public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(p); + public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(p); + public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(p); + public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(p); // Entity interactions - public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); - public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(); - public static final Flag TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(); + public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); + public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(p); + public static final Flag TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(p); // Breeding - public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener()).build(); + public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener(p)).build(p); // Buckets. All bucket use is covered by one listener - public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener()).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 MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); + public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener(p)).build(p); + public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build(p); + public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build(p); + public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(p); // 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 ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(); + public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); + public static final Flag ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(p); // Physical interactions - public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener()).build(); - public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(); + public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); + public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(p); // Egg throwing - public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener()).build(); + public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener(p)).build(p); /* * Fire @@ -66,41 +89,41 @@ public class Flags { * I'll take you to burn * - The Crazy World of Arthur Brown */ - public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener()).build(); - public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(); - public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(); + public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); + public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(p); + public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(p); // Inventories - public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener()).build(); + public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); // Hurting things - public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener()).build(); - public static final Flag HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(); + public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); + public static final Flag HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(p); // Leashes - public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener()).build(); + public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener(p)).build(p); // Portal use protection - public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener()).build(); + public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); // PVP - public static final Flag PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener()).build(); - public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(); - public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(); + public static final Flag PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener(p)).build(p); + public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(p); + public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(p); // Shearing - public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener()).build(); + public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); // Item pickup or drop - public static final Flag ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).listener(new ItemDropPickUpListener()).build(); - public static final Flag ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(); + public static final Flag ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); + public static final Flag ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(p); /* * Non-protection flags */ - public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(); - public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(); - public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(); + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(p); + public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(p); + public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); } From c64840985871689dc1ff5cfb7c8d1c3225a37984 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 3 Feb 2018 15:26:13 -0800 Subject: [PATCH 17/97] Reworked code so it can be tested using automated unit tests. See TestBSkyBlock.java class for protection tests. More to come! --- .../tastybento/bskyblock/api/flags/Flag.java | 4 + .../bskyblock/database/objects/Island.java | 7 +- .../us/tastybento/bskyblock/lists/Flags.java | 235 +++++++++++------- src/test/java/bskyblock/TestBSkyBlock.java | 64 +++-- 4 files changed, 191 insertions(+), 119 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 3f5564043..184bb693d 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -13,11 +13,15 @@ public class Flag { private PanelItem icon; private Listener listener; private boolean defaultSetting; + + public Flag() {} public Flag(BSkyBlock plugin, String id, PanelItem icon, Listener listener, boolean defaultSetting) { this.id = id; this.icon = icon; this.listener = listener; + //System.out.println("DEBUG: " + plugin); + //System.out.println("DEBUG: " + plugin.getFlagsManager()); plugin.getFlagsManager().registerFlag(this); } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index ce5abc8cf..171903864 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -151,7 +151,7 @@ public class Island implements DataObject { * @param flag * @return flag rank. Players must have at least this rank to bypass this flag */ - public int getFlag(Flag flag){ + public int getFlagReq(Flag flag){ if(flags.containsKey(flag)) { return flags.get(flag); } else { @@ -411,7 +411,7 @@ public class Island implements DataObject { * @return true if allowed, false if not */ public boolean isAllowed(Flag flag) { - return this.getFlag(flag) >= 0 ? true : false; + return this.getFlagReq(flag) >= 0 ? true : false; } /** @@ -421,7 +421,8 @@ public class Island implements DataObject { * @return true if allowed, false if not */ public boolean isAllowed(User user, Flag flag) { - return (this.getRank(user) >= this.getFlag(flag)) ? true : false; + Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); + return (this.getRank(user) >= this.getFlagReq(flag)) ? true : false; } /** diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 5f0121128..7ee39a30f 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -29,101 +29,148 @@ import us.tastybento.bskyblock.listeners.flags.TeleportationListener; * */ public class Flags { - private static BSkyBlock p; - + public static Flag ANVIL; + public static Flag ARMOR_STAND; + public static Flag BEACON; + public static Flag BED; + public static Flag BREAK_BLOCKS; + public static Flag BREEDING; + public static Flag BREWING; + public static Flag BUCKET; + public static Flag CHEST; + public static Flag CHORUS_FRUIT; + public static Flag COLLECT_LAVA; + public static Flag COLLECT_WATER; + public static Flag CRAFTING; + public static Flag CROP_TRAMPLE; + public static Flag DOOR; + public static Flag EGGS; + public static Flag ENCHANTING; + public static Flag ENDER_PEARL; + public static Flag ENTER_EXIT_MESSAGES; + public static Flag FIRE; + public static Flag FIRE_EXTINGUISH; + public static Flag FIRE_SPREAD; + public static Flag FURNACE; + public static Flag GATE; + public static Flag HURT_MOBS; + public static Flag HURT_MONSTERS; + public static Flag ITEM_DROP; + public static Flag ITEM_PICKUP; + public static Flag LEASH; + public static Flag LEVER_BUTTON; + public static Flag MILKING; + public static Flag MOB_SPAWN; + public static Flag MONSTER_SPAWN; + public static Flag MOUNT_INVENTORY; + public static Flag MUSIC; + public static Flag PLACE_BLOCKS; + public static Flag PORTAL; + public static Flag PRESSURE_PLATE; + public static Flag PVP_END; + public static Flag PVP_NETHER; + public static Flag PVP_OVERWORLD; + public static Flag REDSTONE; + public static Flag RIDING; + public static Flag SHEARING; + public static Flag SPAWN_EGGS; + public static Flag TRADING; + + private BSkyBlock p; + public Flags(BSkyBlock plugin) { p = plugin; + + // Break and place blocks + BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); + PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); + + // Block interactions - all use BlockInteractionListener() + ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); + BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(p); + BED = new FlagBuilder().id("BED").icon(Material.BED).build(p); + BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(p); + CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(p); + DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); + CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(p); + ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); + FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(p); + GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(p); + MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(p); + LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(p); + REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(p); + SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(p); + + // Entity interactions + ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); + RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(p); + TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(p); + + // Breeding + BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener(p)).build(p); + + // Buckets. All bucket use is covered by one listener + BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener(p)).build(p); + COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build(p); + COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build(p); + MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(p); + + // Chorus Fruit and Enderpearls + CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); + ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(p); + + // Physical interactions + CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); + PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(p); + + // Egg throwing + EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener(p)).build(p); + + /* + * Fire + * I'll take you to burn. + * Fire + * I'll take you to learn. + * You gonna burn, burn, burn + * Fire + * I'll take you to burn + * - The Crazy World of Arthur Brown + */ + FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); + FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(p); + FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(p); + + // Inventories + MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); + + // Hurting things + HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); + HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(p); + + // Leashes + LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener(p)).build(p); + + // Portal use protection + PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); + + // PVP + PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener(p)).build(p); + PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(p); + PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(p); + + // Shearing + SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); + + // Item pickup or drop + ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); + ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(p); + + /* + * Non-protection flags + */ + + ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(p); + MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(p); + MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); } - // Break and place blocks - public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); - public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); - - // Block interactions - all use BlockInteractionListener() - public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); - public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(p); - public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(p); - public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(p); - public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(p); - public static final Flag DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); - public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(p); - public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); - public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(p); - public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(p); - public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(p); - public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(p); - public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(p); - public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(p); - - // Entity interactions - public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); - public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(p); - public static final Flag TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(p); - - // Breeding - public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener(p)).build(p); - - // Buckets. All bucket use is covered by one listener - public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener(p)).build(p); - public static final Flag COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build(p); - public static final Flag COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build(p); - public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(p); - - // Chorus Fruit and Enderpearls - public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); - public static final Flag ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(p); - - // Physical interactions - public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); - public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(p); - - // Egg throwing - public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener(p)).build(p); - - /* - * Fire - * I'll take you to burn. - * Fire - * I'll take you to learn. - * You gonna burn, burn, burn - * Fire - * I'll take you to burn - * - The Crazy World of Arthur Brown - */ - public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); - public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(p); - public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(p); - - // Inventories - public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); - - // Hurting things - public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); - public static final Flag HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(p); - - // Leashes - public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener(p)).build(p); - - // Portal use protection - public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); - - // PVP - public static final Flag PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener(p)).build(p); - public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(p); - public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(p); - - // Shearing - public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); - - // Item pickup or drop - public static final Flag ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); - public static final Flag ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(p); - - /* - * Non-protection flags - */ - - public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(p); - public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(p); - public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); - } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index d17969031..c6eac0659 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -24,9 +24,15 @@ import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.meta.ItemMeta; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.Constants; @@ -35,13 +41,15 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; -//@RunWith(PowerMockRunner.class) +@RunWith(PowerMockRunner.class) //@SuppressStaticInitializationFor("us.tastybento.BSkyBlock") -//@PrepareForTest( { BSkyBlock.class }) +//@PrepareForTest( { Bukkit.class }) +@PrepareForTest( { Flags.class }) public class TestBSkyBlock { private final UUID playerUUID = UUID.randomUUID(); private static CommandSender sender; @@ -52,6 +60,7 @@ public class TestBSkyBlock { @BeforeClass public static void setUp() { + //PowerMockito.mockStatic(Bukkit.class); //Mockito.doReturn(plugin).when(BSkyBlock.getPlugin()); //Mockito.when().thenReturn(plugin); World world = mock(World.class); @@ -69,7 +78,7 @@ public class TestBSkyBlock { player = mock(Player.class); Mockito.when(player.hasPermission(Constants.PERMPREFIX + "default.permission")).thenReturn(true); - plugin = mock(BSkyBlock.class); + //Mockito.when(plugin.getServer()).thenReturn(server); location = mock(Location.class); @@ -78,18 +87,17 @@ public class TestBSkyBlock { Mockito.when(location.getBlockY()).thenReturn(0); Mockito.when(location.getBlockZ()).thenReturn(0); - // This doesn't work! - /* - mockStatic(Bukkit.class); + // Mock itemFactory for ItemStack ItemFactory itemFactory = PowerMockito.mock(ItemFactory.class); PowerMockito.when(Bukkit.getItemFactory()).thenReturn(itemFactory); - PowerMockito.when(itemFactory.getItemMeta(any())).thenReturn(PowerMockito.mock(ItemMeta.class)); - - mockStatic(BSkyBlock.class); - flagsManager = mock(FlagsManager.class); - PowerMockito.when(BSkyBlock.getInstance()).thenReturn(plugin); + ItemMeta itemMeta = PowerMockito.mock(ItemMeta.class); + PowerMockito.when(itemFactory.getItemMeta(Mockito.any())).thenReturn(itemMeta); + + PowerMockito.mockStatic(Flags.class); + + plugin = Mockito.mock(BSkyBlock.class); + flagsManager = Mockito.mock(FlagsManager.class); Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); - */ } @Test @@ -342,11 +350,22 @@ public class TestBSkyBlock { assertFalse(island.getBanned().contains(member1)); // Protection - // Set up protection settings - members can break blocks, visitors and place blocks - // These tests do not work because of static method calls in the code and Bukkit. - /* + new Flags(plugin); + // Check default settings + // Owner should be able to do anything + assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); + assertTrue(island.isAllowed(owner, Flags.BREAK_BLOCKS)); + + // Visitor can do nothing + assertFalse(island.isAllowed(visitor, Flags.PLACE_BLOCKS)); + assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); + + // Set up protection settings - members can break blocks, visitors and place blocks island.setFlag(Flags.BREAK_BLOCKS, RanksManager.MEMBER_RANK); + assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); + island.setFlag(Flags.PLACE_BLOCKS, RanksManager.VISITOR_RANK); + assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); // Owner should be able to do anything assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); @@ -357,21 +376,22 @@ public class TestBSkyBlock { assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); // Check if the members have capability - User mem1 = User.getInstance(member1); - User mem2 = User.getInstance(member2); - User mem3 = User.getInstance(member3); + User mem1 = User.getInstance(member1); // Visitor + User mem2 = User.getInstance(member2); // Member + island.addToBanList(member3); + User mem3 = User.getInstance(member3); // Banned assertTrue(island.isAllowed(mem1, Flags.PLACE_BLOCKS)); - assertTrue(island.isAllowed(mem1, Flags.BREAK_BLOCKS)); + assertFalse(island.isAllowed(mem1, Flags.BREAK_BLOCKS)); assertTrue(island.isAllowed(mem2, Flags.PLACE_BLOCKS)); assertTrue(island.isAllowed(mem2, Flags.BREAK_BLOCKS)); // Member 3 is no longer a member and is a visitor - assertTrue(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); - assertTrue(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); + assertFalse(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); + assertFalse(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); + -*/ /* * * Score approach: From 6c2078fbecb5b16cb90be78c6f0872c8e4d519e8 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 3 Feb 2018 19:25:53 -0800 Subject: [PATCH 18/97] Added event tests. Fixed bug with user being retained after a checkIsland. --- .../bskyblock/database/objects/Island.java | 1 + .../listeners/flags/AbstractFlagListener.java | 51 +++++--- .../listeners/flags/BreakBlocksListener.java | 9 +- .../listeners/flags/FireListener.java | 3 +- .../listeners/flags/HurtingListener.java | 9 +- .../flags/ItemDropPickUpListener.java | 3 +- .../listeners/flags/PVPListener.java | 10 +- src/test/java/bskyblock/TestBSkyBlock.java | 118 +++++++++++++++--- 8 files changed, 146 insertions(+), 58 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 171903864..9d9506315 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -278,6 +278,7 @@ public class Island implements DataObject { * @return rank integer */ public int getRank(User user) { + Bukkit.getLogger().info("DEBUG: user UUID = " + user.getUniqueId()); return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : RanksManager.VISITOR_RANK; } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index 5f604f04c..d9e6ff20f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -3,14 +3,16 @@ */ package us.tastybento.bskyblock.listeners.flags; +import java.lang.reflect.Method; import java.util.Optional; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerEvent; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; @@ -36,24 +38,29 @@ public abstract class AbstractFlagListener implements Listener { * Sets the player associated with this event. * If the user is a fake player, they are not counted. * @param e - the event - * @return user or empty + * @return true if found, otherwise false */ - private Optional createEventUser(Event e) { - // Set the user - if (e instanceof PlayerEvent) { - user = User.getInstance(((PlayerEvent)e).getPlayer()); - // Handle fake players - if (plugin.getSettings().getFakePlayers().contains(user.getName())) user = null; - } - return Optional.ofNullable(user); + private boolean createEventUser(Event e) { + try { + // Use reflection to get the getPlayer method if it exists + Method getPlayer = e.getClass().getMethod("getPlayer"); + if (getPlayer != null) { + setUser(User.getInstance((Player)getPlayer.invoke(e))); + return true; + } + } catch (Exception e1) { + e1.printStackTrace(); + } + return false; } /** - * Explicitly set the user + * Explicitly set the user for the next {@link #checkIsland(Event, Location, Flag)} or {@link #checkIsland(Event, Location, Flag, boolean)} * @param user */ - public void setUser(User user) { - this.user = user; + public AbstractFlagListener setUser(User user) { + if (!plugin.getSettings().getFakePlayers().contains(user.getName())) this.user = user; + return this; } /* @@ -133,22 +140,31 @@ public abstract class AbstractFlagListener implements Listener { * @return true if the check is okay, false if it was disallowed */ public boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { - // If the user is not set, try to get it from the event + + // If the user is not set already, try to get it from the event if (user == null) { // Set the user associated with this event - if (!createEventUser(e).isPresent()) return true; + if (!createEventUser(e)) { + // The user is not set, and the event does not hold a getPlayer, so return false + // TODO: is this the correct handling here? + Bukkit.getLogger().severe("Check island had no associated user!"); + return false; + } } // If this is not an Island World, skip if (!inWorld(user)) return true; - + // Get the island and if present, check the flag, react if required and return Optional island = plugin.getIslands().getIslandAt(loc); if (island.isPresent()) { if (!island.get().isAllowed(user, flag)) { noGo(e, silent); + // Clear the user for the next time + user = null; return false; } else { + user = null; return true; } } @@ -156,11 +172,12 @@ public abstract class AbstractFlagListener implements Listener { // The player is in the world, but not on an island, so general world settings apply if (!flag.isAllowed()) { noGo(e, silent); + user = null; return false; } else { + user = null; return true; } - } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index bcf3b4e78..53a92a78c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -45,8 +45,7 @@ public class BreakBlocksListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW) public void onBreakHanging(final HangingBreakByEntityEvent e) { if (e.getRemover() instanceof Player) { - setUser(User.getInstance(e.getRemover())); - checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); + setUser(User.getInstance(e.getRemover())).checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); } } @@ -126,14 +125,12 @@ public class BreakBlocksListener extends AbstractFlagListener { // Get the attacker if (e.getDamager() instanceof Player) { - setUser(User.getInstance(e.getDamager())); - checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); + setUser(User.getInstance(e.getDamager())).checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS); } else if (e.getDamager() instanceof Projectile) { // Find out who fired the arrow Projectile p = (Projectile) e.getDamager(); if (p.getShooter() instanceof Player) { - setUser(User.getInstance((Player)p.getShooter())); - if (!checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS)) { + if (!setUser(User.getInstance((Player)p.getShooter())).checkIsland(e, e.getEntity().getLocation(), Flags.BREAK_BLOCKS)) { e.getEntity().setFireTicks(0); e.getDamager().remove(); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index b54f55877..f04cb7071 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -157,8 +157,7 @@ public class FireListener extends AbstractFlagListener { if (projectile.getShooter() instanceof Player) { if (projectile.getFireTicks() > 0) { Player shooter = (Player)projectile.getShooter(); - setUser(User.getInstance(shooter)); - if (checkIsland(e, e.getBlock().getLocation(), Flags.BREAK_BLOCKS)) { + if (setUser(User.getInstance(shooter)).checkIsland(e, e.getBlock().getLocation(), Flags.BREAK_BLOCKS)) { // Remove the arrow projectile.remove(); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index aa3d21bc3..3ed085f6c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -74,14 +74,12 @@ public class HurtingListener extends AbstractFlagListener { private void respond(Event event, Entity damager, Flag flag) { // Get the attacker if (damager instanceof Player) { - setUser(User.getInstance(damager)); - checkIsland(event, damager.getLocation(), flag); + setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); } else if (damager instanceof Projectile) { // Find out who fired the projectile Projectile p = (Projectile) damager; if (p.getShooter() instanceof Player) { - setUser(User.getInstance((Player)p.getShooter())); - if (!checkIsland(event, damager.getLocation(), flag)) { + if (!setUser(User.getInstance((Player)p.getShooter())).checkIsland(event, damager.getLocation(), flag)) { damager.setFireTicks(0); damager.remove(); } @@ -138,7 +136,6 @@ public class HurtingListener extends AbstractFlagListener { Projectile projectile = (Projectile) e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { Player attacker = (Player)projectile.getShooter(); - setUser(User.getInstance(attacker)); // Run through all the affected entities for (LivingEntity entity: e.getAffectedEntities()) { // Self damage @@ -147,7 +144,7 @@ public class HurtingListener extends AbstractFlagListener { } // Monsters being hurt if (entity instanceof Monster || entity instanceof Slime || entity instanceof Squid) { - if (!checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS)) { + if (!setUser(User.getInstance(attacker)).checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS)) { for (PotionEffect effect : e.getPotion().getEffects()) { entity.removePotionEffect(effect.getType()); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index 530417e8e..41c334068 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -37,9 +37,8 @@ public class ItemDropPickUpListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onVisitorDrop(EntityPickupItemEvent e) { if (e.getEntity() instanceof Player) { - setUser(User.getInstance(e.getEntity())); // Disallow, but don't tell the player an error - checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP, false); + setUser(User.getInstance(e.getEntity())).checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP, false); } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 409d1b648..e92019d10 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -58,14 +58,13 @@ public class PVPListener extends AbstractFlagListener { private void respond(Event event, Entity damager, Flag flag) { // Get the attacker if (damager instanceof Player) { - setUser(User.getInstance(damager)); - checkIsland(event, damager.getLocation(), flag); + setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); } else if (damager instanceof Projectile) { // Find out who fired the arrow Projectile p = (Projectile) damager; if (p.getShooter() instanceof Player) { - setUser(User.getInstance((Player)p.getShooter())); - if (!checkIsland(event, damager.getLocation(), flag)) { + ; + if (!setUser(User.getInstance((Player)p.getShooter())).checkIsland(event, damager.getLocation(), flag)) { damager.setFireTicks(0); damager.remove(); } @@ -102,7 +101,6 @@ public class PVPListener extends AbstractFlagListener { Projectile projectile = (Projectile) e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { Player attacker = (Player)projectile.getShooter(); - setUser(User.getInstance(attacker)); // Run through all the affected entities for (LivingEntity entity: e.getAffectedEntities()) { // Self damage @@ -111,7 +109,7 @@ public class PVPListener extends AbstractFlagListener { } // PVP? if (entity instanceof Player) { - if (!checkIsland(e, entity.getLocation(), flag)) { + if (!setUser(User.getInstance(attacker)).checkIsland(e, entity.getLocation(), flag)) { for (PotionEffect effect : e.getPotion().getEffects()) { entity.removePotionEffect(effect.getType()); } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index c6eac0659..c48b9ee71 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -10,6 +10,8 @@ import static org.mockito.Mockito.mock; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; @@ -22,10 +24,14 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.meta.ItemMeta; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,11 +42,15 @@ import org.powermock.modules.junit4.PowerMockRunner; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.Constants; +import us.tastybento.bskyblock.Settings; import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; +import us.tastybento.bskyblock.database.managers.island.IslandsManager; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.generators.IslandWorld; +import us.tastybento.bskyblock.listeners.flags.AbstractFlagListener; import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.FlagsManager; import us.tastybento.bskyblock.managers.RanksManager; @@ -51,19 +61,26 @@ import us.tastybento.bskyblock.util.Util; //@PrepareForTest( { Bukkit.class }) @PrepareForTest( { Flags.class }) public class TestBSkyBlock { + private static final UUID MEMBER_UUID = UUID.randomUUID(); + private static final UUID OWNER_UUID = UUID.randomUUID(); + private static final UUID VISITOR_UUID = UUID.randomUUID(); private final UUID playerUUID = UUID.randomUUID(); private static CommandSender sender; private static Player player; private static Location location; private static BSkyBlock plugin; private static FlagsManager flagsManager; + private static Block block; + private static World world; + private static Player ownerOfIsland; + private static Player visitorToIsland; @BeforeClass public static void setUp() { //PowerMockito.mockStatic(Bukkit.class); //Mockito.doReturn(plugin).when(BSkyBlock.getPlugin()); //Mockito.when().thenReturn(plugin); - World world = mock(World.class); + world = mock(World.class); //Mockito.when(world.getWorldFolder()).thenReturn(worldFile); @@ -76,6 +93,8 @@ public class TestBSkyBlock { Mockito.when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); sender = mock(CommandSender.class); player = mock(Player.class); + ownerOfIsland = mock(Player.class); + visitorToIsland = mock(Player.class); Mockito.when(player.hasPermission(Constants.PERMPREFIX + "default.permission")).thenReturn(true); @@ -86,6 +105,14 @@ public class TestBSkyBlock { Mockito.when(location.getBlockX()).thenReturn(0); Mockito.when(location.getBlockY()).thenReturn(0); Mockito.when(location.getBlockZ()).thenReturn(0); + + Mockito.when(player.getLocation()).thenReturn(location); + Mockito.when(ownerOfIsland.getLocation()).thenReturn(location); + Mockito.when(visitorToIsland.getLocation()).thenReturn(location); + + Mockito.when(player.getUniqueId()).thenReturn(MEMBER_UUID); + Mockito.when(ownerOfIsland.getUniqueId()).thenReturn(OWNER_UUID); + Mockito.when(visitorToIsland.getUniqueId()).thenReturn(VISITOR_UUID); // Mock itemFactory for ItemStack ItemFactory itemFactory = PowerMockito.mock(ItemFactory.class); @@ -98,6 +125,40 @@ public class TestBSkyBlock { plugin = Mockito.mock(BSkyBlock.class); flagsManager = Mockito.mock(FlagsManager.class); Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); + + block = Mockito.mock(Block.class); + + // Worlds + IslandWorld iwm = mock(IslandWorld.class); + Mockito.when(plugin.getIslandWorldManager()).thenReturn(iwm); + Mockito.when(iwm.getIslandWorld()).thenReturn(world); + Mockito.when(iwm.getNetherWorld()).thenReturn(world); + Mockito.when(iwm.getEndWorld()).thenReturn(world); + + // User + //User user = Mockito.mock(User.class); + //Mockito.when(user.getName()).thenReturn("tastybento"); + + // Islands + IslandsManager im = mock(IslandsManager.class); + Mockito.when(plugin.getIslands()).thenReturn(im); + + Island island = new Island(); + island.setOwner(OWNER_UUID); + island.setCenter(location); + island.setProtectionRange(100); + HashMap members = new HashMap<>(); + members.put(OWNER_UUID, RanksManager.OWNER_RANK); + members.put(MEMBER_UUID, RanksManager.MEMBER_RANK); + island.setMembers(members); + Bukkit.getLogger().info("SETUP: owner UUID = " + OWNER_UUID); + Bukkit.getLogger().info("SETUP: member UUID = " + MEMBER_UUID); + Bukkit.getLogger().info("SETUP: visitor UUID = " + VISITOR_UUID); + Mockito.when(im.getIslandAt(Mockito.any())).thenReturn(Optional.of(island)); + + Settings settings = mock(Settings.class); + Mockito.when(plugin.getSettings()).thenReturn(settings); + Mockito.when(settings.getFakePlayers()).thenReturn(new HashSet()); } @Test @@ -381,16 +442,21 @@ public class TestBSkyBlock { island.addToBanList(member3); User mem3 = User.getInstance(member3); // Banned + // Member 1 is a visitor assertTrue(island.isAllowed(mem1, Flags.PLACE_BLOCKS)); assertFalse(island.isAllowed(mem1, Flags.BREAK_BLOCKS)); + // Member 2 is a team member assertTrue(island.isAllowed(mem2, Flags.PLACE_BLOCKS)); assertTrue(island.isAllowed(mem2, Flags.BREAK_BLOCKS)); - // Member 3 is no longer a member and is a visitor + // Member 3 is no longer a member and is banned assertFalse(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); assertFalse(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); - + } + + @Test + public void TestEventProtection() { /* * @@ -430,22 +496,36 @@ public class TestBSkyBlock { * 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 - * - * */ + + // Now test events + FlagListener fl = new FlagListener(plugin); + Bukkit.getLogger().info("SETUP: owner UUID = " + ownerOfIsland.getUniqueId()); + Bukkit.getLogger().info("SETUP: member UUID = " + player.getUniqueId()); + Bukkit.getLogger().info("SETUP: visitor UUID = " + visitorToIsland.getUniqueId()); + + Bukkit.getLogger().info("DEBUG: checking events - vistor"); + Event e3 = new BlockBreakEvent(block, visitorToIsland); + Assert.assertFalse(fl.checkIsland(e3, location, Flags.BREAK_BLOCKS, true)); + + Bukkit.getLogger().info("DEBUG: checking events - owner"); + Event e = new BlockBreakEvent(block, ownerOfIsland); + Assert.assertTrue(fl.checkIsland(e, location, Flags.BREAK_BLOCKS, true)); + + // Set up an event with a random player + Bukkit.getLogger().info("DEBUG: checking events - member"); + + Event e2 = new BlockBreakEvent(block, player); + Assert.assertTrue(fl.checkIsland(e2, location, Flags.BREAK_BLOCKS, true)); + } + + private class FlagListener extends AbstractFlagListener { + + public FlagListener(BSkyBlock plugin) { + super(plugin); + + } + } + } From 83d08484295223f068194c44e27f51364d885a88 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 3 Feb 2018 20:42:12 -0800 Subject: [PATCH 19/97] Fixed bugs with protection. Added serializer adapter for the Flags hashmap in Island. Teams don't work. Need to work out why. PVP doesn't work correctly. It allows members to hit visitors anytime, but visitors can only hit others if PVP is off. This isn't how it is supposed to work! --- .../us/tastybento/bskyblock/BSkyBlock.java | 8 ++-- .../bskyblock/api/configuration/Adapter.java | 7 +++ .../api/configuration/ConfigEntry.java | 2 +- .../database/objects/FlagSerializer.java | 46 +++++++++++++++++++ .../bskyblock/database/objects/Island.java | 6 ++- .../listeners/flags/AbstractFlagListener.java | 11 ++--- .../listeners/flags/InventoryListener.java | 37 +++++++-------- .../flags/ItemDropPickUpListener.java | 4 +- .../listeners/flags/PVPListener.java | 1 + src/test/java/bskyblock/TestBSkyBlock.java | 1 - 10 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index b17943fca..b2ed664d9 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -89,6 +89,11 @@ public class BSkyBlock extends JavaPlugin { islandWorldManager = new IslandWorld(plugin); getServer().getScheduler().runTask(plugin, () -> { + + // Load Flags + flagsManager = new FlagsManager(plugin); + new Flags(plugin); + // Load islands from database islandsManager.load(); @@ -98,9 +103,6 @@ public class BSkyBlock extends JavaPlugin { // Register Listeners registerListeners(); - // Load Flags - flagsManager = new FlagsManager(plugin); - new Flags(plugin); // Load addons addonsManager = new AddonsManager(plugin); diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java b/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java index f7016896b..fd2d14c6b 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java @@ -1,6 +1,13 @@ package us.tastybento.bskyblock.api.configuration; +/** + * Convert from to S or to V + * @author tastybento + * + * @param + * @param + */ public interface Adapter { /** diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java index cf138bc84..38137d22a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java @@ -16,7 +16,7 @@ import us.tastybento.bskyblock.Constants.GameType; @Target(ElementType.FIELD) public @interface ConfigEntry { - String path(); + String path() default ""; String since() default "1.0"; boolean overrideOnChange() default false; boolean experimental() default false; diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java new file mode 100644 index 000000000..bbd692dad --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java @@ -0,0 +1,46 @@ +package us.tastybento.bskyblock.database.objects; + +import java.util.HashMap; +import java.util.Map.Entry; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.MemorySection; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.configuration.Adapter; +import us.tastybento.bskyblock.api.flags.Flag; + +/** + * Serializes the {@link us.tastybento.bskyblock.database.objects.Island#getFlags() getFlags()} and + * {@link us.tastybento.bskyblock.database.objects.Island#setFlags() setFlags()} + * in {@link us.tastybento.bskyblock.database.objects.Island} + * @author tastybento + * + */ +public class FlagSerializer implements Adapter, HashMap> { + + @Override + public HashMap convertFrom(Object from) { + HashMap result = new HashMap<>(); + MemorySection section = (MemorySection) from; + for (String key : section.getKeys(false)) { + Bukkit.getLogger().info("DEBUG: " + key + " = " + section.getInt(key)); + + result.put(BSkyBlock.getInstance().getFlagsManager().getFlagByID(key), section.getInt(key)); + } + return result; + } + + @Override + public HashMap convertTo(Object to) { + HashMap result = new HashMap<>(); + HashMap flags = (HashMap)to; + for (Entry en: flags.entrySet()) { + result.put(en.getKey().getID(), en.getValue()); + } + return result; + } + + + +} diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 9d9506315..6ac43d5bf 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -16,6 +16,7 @@ import org.bukkit.entity.Entity; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent; @@ -77,8 +78,11 @@ public class Island implements DataObject { private boolean spawn = false; private boolean purgeProtected = false; - //// Protection //// + + //// Protection flags //// + @ConfigEntry(adapter = FlagSerializer.class) private HashMap flags = new HashMap<>(); + private int levelHandicap; private Location spawnPoint; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index d9e6ff20f..7e133fb9d 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -43,14 +43,13 @@ public abstract class AbstractFlagListener implements Listener { private boolean createEventUser(Event e) { try { // Use reflection to get the getPlayer method if it exists + Method getPlayer = e.getClass().getMethod("getPlayer"); if (getPlayer != null) { setUser(User.getInstance((Player)getPlayer.invoke(e))); return true; } - } catch (Exception e1) { - e1.printStackTrace(); - } + } catch (Exception e1) { e1.printStackTrace();} return false; } @@ -76,7 +75,7 @@ public abstract class AbstractFlagListener implements Listener { } /** - * Cancels the event and sends the island public message to user unless silent is true + * Cancels the event and sends the island protected message to user unless silent is true * @param e Event * @param silent - if true, message is not sent */ @@ -85,7 +84,7 @@ public abstract class AbstractFlagListener implements Listener { ((Cancellable)e).setCancelled(true); if (user != null) { if (!silent) - user.sendMessage("protection.public"); + user.sendMessage("protection.protected"); user.updateInventory(); } } @@ -147,7 +146,7 @@ public abstract class AbstractFlagListener implements Listener { if (!createEventUser(e)) { // The user is not set, and the event does not hold a getPlayer, so return false // TODO: is this the correct handling here? - Bukkit.getLogger().severe("Check island had no associated user!"); + Bukkit.getLogger().severe("Check island had no associated user! " + e.getEventName()); return false; } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java index a245693ae..c351d7d45 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java @@ -17,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; /** @@ -32,31 +33,31 @@ public class InventoryListener extends AbstractFlagListener { /** * Prevents visitors picking items from inventories - * @param event + * @param e */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) - public void onMountInventoryClick(InventoryClickEvent event) { - if (event.getInventory().getHolder() == null) { + public void onMountInventoryClick(InventoryClickEvent e) { + if (e.getInventory().getHolder() == null) { return; + } + if (e.getInventory().getHolder() instanceof Animals) { + checkIsland(e, e.getInventory().getLocation(), Flags.MOUNT_INVENTORY); } - if (event.getInventory().getHolder() instanceof Animals) { - checkIsland(event, event.getInventory().getLocation(), Flags.MOUNT_INVENTORY); + else if (e.getInventory().getHolder() instanceof Chest + || e.getInventory().getHolder() instanceof Dispenser + || e.getInventory().getHolder() instanceof Hopper + || e.getInventory().getHolder() instanceof Dropper + || e.getInventory().getHolder() instanceof ShulkerBox) { + setUser(User.getInstance(e.getWhoClicked())).checkIsland(e, e.getInventory().getLocation(), Flags.CHEST); } - else if (event.getInventory().getHolder() instanceof Chest - || event.getInventory().getHolder() instanceof Dispenser - || event.getInventory().getHolder() instanceof Hopper - || event.getInventory().getHolder() instanceof Dropper - || event.getInventory().getHolder() instanceof ShulkerBox) { - checkIsland(event, event.getInventory().getLocation(), Flags.CHEST); + else if (e.getInventory().getHolder() instanceof Furnace) { + setUser(User.getInstance(e.getWhoClicked())).checkIsland(e, e.getInventory().getLocation(), Flags.FURNACE); } - else if (event.getInventory().getHolder() instanceof Furnace) { - checkIsland(event, event.getInventory().getLocation(), Flags.FURNACE); + else if (e.getInventory().getHolder() instanceof BrewingStand) { + setUser(User.getInstance(e.getWhoClicked())).checkIsland(e, e.getInventory().getLocation(), Flags.BREWING); } - else if (event.getInventory().getHolder() instanceof BrewingStand) { - checkIsland(event, event.getInventory().getLocation(), Flags.BREWING); - } - else if (event.getInventory().getHolder() instanceof Beacon) { - checkIsland(event, event.getInventory().getLocation(), Flags.BEACON); + else if (e.getInventory().getHolder() instanceof Beacon) { + setUser(User.getInstance(e.getWhoClicked())).checkIsland(e, e.getInventory().getLocation(), Flags.BEACON); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index 41c334068..c77dff2ac 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -35,10 +35,10 @@ public class ItemDropPickUpListener extends AbstractFlagListener { * Handle item pickup by visitors */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onVisitorDrop(EntityPickupItemEvent e) { + public void onVisitorPickup(EntityPickupItemEvent e) { if (e.getEntity() instanceof Player) { // Disallow, but don't tell the player an error - setUser(User.getInstance(e.getEntity())).checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP, false); + setUser(User.getInstance(e.getEntity())).checkIsland(e, e.getItem().getLocation(), Flags.ITEM_PICKUP, true); } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index e92019d10..2ebb8951a 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -26,6 +26,7 @@ import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; /** + * TODO: PVP is different to other flags - it's either allowed for everyone or not allowed for everyone. Currently owners can hit visitors. * Handles PVP * @author tastybento * diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index c48b9ee71..03b024aef 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -512,7 +512,6 @@ public class TestBSkyBlock { Event e = new BlockBreakEvent(block, ownerOfIsland); Assert.assertTrue(fl.checkIsland(e, location, Flags.BREAK_BLOCKS, true)); - // Set up an event with a random player Bukkit.getLogger().info("DEBUG: checking events - member"); Event e2 = new BlockBreakEvent(block, player); From fa1ccd0c99cd217e657d7743d2cb9cdca2722da9 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 4 Feb 2018 12:53:17 -0800 Subject: [PATCH 20/97] Fixed bugs with MySQL saving and loading. Added the adapter annotation to MySQL and fixed issues with empty hashmaps causing null errors. Added a flag serializer adapter for the protection flags so that flags are saved and loaded correctly. Renamed the Adapter notation class to be clearer about what it is doing. --- .../us/tastybento/bskyblock/BSkyBlock.java | 1 - .../us/tastybento/bskyblock/Settings.java | 1 - .../bskyblock/api/configuration/Adapter.java | 14 +++-- .../api/configuration/ISettings.java | 7 +-- .../PotionEffectListAdpater.java | 4 +- .../flatfile/FlatFileDatabaseHandler.java | 4 +- .../database/managers/island/IslandCache.java | 4 ++ .../managers/island/IslandsManager.java | 5 +- .../database/mysql/MySQLDatabaseHandler.java | 54 ++++++++++++++++--- .../database/objects/FlagSerializer.java | 27 +++++++--- .../bskyblock/database/objects/Island.java | 16 +++--- .../bskyblock/managers/FlagsManager.java | 2 +- 12 files changed, 102 insertions(+), 37 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index b2ed664d9..a0f98fe13 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -98,7 +98,6 @@ public class BSkyBlock extends JavaPlugin { islandsManager.load(); localesManager = new LocalesManager(plugin); - //TODO localesManager.registerLocales(plugin); // Register Listeners registerListeners(); diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index 7a4505770..ad73bf43e 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -367,7 +367,6 @@ public class Settings implements ISettings { } @Override public Settings getInstance() { - // TODO Auto-generated method stub return this; } /** diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java b/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java index fd2d14c6b..d87f26531 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java @@ -11,10 +11,16 @@ package us.tastybento.bskyblock.api.configuration; public interface Adapter { /** - * Convert from to something - * @param from + * Serialize object + * @param object - object + * @return serialized object */ - S convertFrom(Object from); + S serialize(Object object); - V convertTo(Object to); + /** + * Deserialize object + * @param object + * @return deserialized object + */ + V deserialize(Object object); } diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index f619c7b1f..82d43387b 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -14,6 +14,7 @@ import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; * Simple interface for tagging all classes containing ConfigEntries. * * @author Poslovitch + * @author tastybento * @param */ public interface ISettings { @@ -30,10 +31,10 @@ public interface ISettings { } default void saveBackup() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { - // Save backup in real database + // Save backup @SuppressWarnings("unchecked") - AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(getInstance().getClass()); - dbhandler.saveObject(getInstance()); + AbstractDatabaseHandler backupHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); + backupHandler.saveObject(getInstance()); } // --------------- Loader ------------------ diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java b/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java index d79263028..2abe0e836 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java @@ -9,7 +9,7 @@ public class PotionEffectListAdpater implements Adapter, @SuppressWarnings("unchecked") @Override - public List convertFrom(Object from) { + public List serialize(Object from) { List result = new ArrayList<>(); if (from instanceof ArrayList) { for (String type: (ArrayList)from) { @@ -21,7 +21,7 @@ public class PotionEffectListAdpater implements Adapter, @SuppressWarnings("unchecked") @Override - public List convertTo(Object to) { + public List deserialize(Object to) { List result = new ArrayList<>(); if (to instanceof ArrayList) { for (PotionEffectType type: (ArrayList)to) { diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 1838dda5d..9695a7468 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -182,7 +182,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { if (!configEntry.adapter().equals(Adapter.class)) { // A conversion adapter has been defined Object value = config.get(storageLocation); - method.invoke(instance, ((Adapter)configEntry.adapter().newInstance()).convertFrom(value)); + method.invoke(instance, ((Adapter)configEntry.adapter().newInstance()).serialize(value)); if (DEBUG) { plugin.getLogger().info("DEBUG: value = " + value); plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType()); @@ -355,7 +355,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { if (!configEntry.adapter().equals(Adapter.class)) { // A conversion adapter has been defined try { - config.set(storageLocation, ((Adapter)configEntry.adapter().newInstance()).convertTo(value)); + config.set(storageLocation, ((Adapter)configEntry.adapter().newInstance()).deserialize(value)); } catch (InstantiationException e) { e.printStackTrace(); } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index 463a1f2f3..13dd1e32a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -37,6 +37,10 @@ public class IslandCache { islandsByUUID = new HashMap<>(); } + /** + * Adds an island to the grid + * @param island + */ public void addIsland(Island island) { islandsByLocation.put(island.getCenter(), island); if (DEBUG) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index ff4531a1f..e9e4bb2c3 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -40,7 +40,6 @@ import us.tastybento.bskyblock.util.Util; public class IslandsManager { private static final boolean DEBUG = false; - private static final boolean DEBUG2 = false; /** * Checks if this location is safe for a player to teleport to. Used by * warps and boat exits Unsafe is any liquid or air and also if there's no @@ -713,12 +712,14 @@ public class IslandsManager { plugin.getLogger().info("DEBUG: loading grid"); for (Island island : handler.loadObjects()) { if (DEBUG) - plugin.getLogger().info("DEBUG: addin island at "+ island.getCenter()); + plugin.getLogger().info("DEBUG: adding island at "+ island.getCenter()); islandCache.addIsland(island); } } catch (Exception e) { e.printStackTrace(); } + if (DEBUG) + plugin.getLogger().info("DEBUG: islands loaded"); } /** diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 1c26bf128..c5631e76a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -32,6 +32,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.plugin.Plugin; +import us.tastybento.bskyblock.api.configuration.Adapter; +import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.util.Util; @@ -271,7 +273,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (DEBUG) plugin.getLogger().info("DEBUG: collection columns = " + col); } - + return columns; } @@ -414,6 +416,22 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Object value = method.invoke(instance); if (DEBUG) plugin.getLogger().info("DEBUG: value = " + value); + // Adapter + // Check if there is an annotation on the field + ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); + // If there is a config annotation then do something + if (configEntry != null) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is a configEntry"); + if (!configEntry.adapter().equals(Adapter.class)) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((Adapter)configEntry.adapter().newInstance()).deserialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); + } + } // Create set and map table inserts if this is a Collection if (propertyDescriptor.getPropertyType().equals(Set.class) || propertyDescriptor.getPropertyType().equals(Map.class) || @@ -465,6 +483,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Iterator it = collection.entrySet().iterator(); while (it.hasNext()) { Entry en = (Entry) it.next(); + if (DEBUG) + plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); + // Get the key and serialize it Object key = serialize(en.getKey(), en.getKey().getClass()); if (DEBUG) @@ -668,10 +689,14 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Get the write method for this field, because we are going to use it to write the value // once we get the value from the database Method method = propertyDescriptor.getWriteMethod(); + if (DEBUG) + plugin.getLogger().info("DEBUG: propertyDescriptor.getPropertyType() = " + propertyDescriptor.getPropertyType()); // If the type is a Collection, then we need to deal with set and map tables - if (Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + if (Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType()) + || Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { // Collection - //plugin.getLogger().info("DEBUG: Collection"); + if (DEBUG) + plugin.getLogger().info("DEBUG: Collection or Map"); // TODO Get the values from the subsidiary tables. // value is just of type boolean right now String setSql = "SELECT "; @@ -720,7 +745,8 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); ((List) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); } - } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || + HashMap.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { if (DEBUG) plugin.getLogger().info("DEBUG: Adding a map "); // Loop through the collection resultset @@ -756,6 +782,22 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { plugin.getLogger().info("DEBUG: regular type"); value = deserialize(value, propertyDescriptor.getPropertyType()); } + // Adapter + // Check if there is an annotation on the field + ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); + // If there is a config annotation then do something + if (configEntry != null) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is a configEntry"); + if (!configEntry.adapter().equals(Adapter.class)) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((Adapter)configEntry.adapter().newInstance()).serialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after serialization = " + value); + } + } if (DEBUG) { plugin.getLogger().info("DEBUG: invoking method " + method.getName()); if (value == null) { @@ -914,12 +956,12 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { public void saveSettings(T instance) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { plugin.getLogger().severe("This method should not be used because configs are not stored in MySQL"); - + } @Override public T loadSettings(String uniqueId, T dbConfig) throws InstantiationException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IntrospectionException { + IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IntrospectionException { plugin.getLogger().severe("This method should not be used because configs are not stored in MySQL"); return null; } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java index bbd692dad..c3b2db36f 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java @@ -20,21 +20,32 @@ import us.tastybento.bskyblock.api.flags.Flag; public class FlagSerializer implements Adapter, HashMap> { @Override - public HashMap convertFrom(Object from) { + public HashMap serialize(Object object) { HashMap result = new HashMap<>(); - MemorySection section = (MemorySection) from; - for (String key : section.getKeys(false)) { - Bukkit.getLogger().info("DEBUG: " + key + " = " + section.getInt(key)); - - result.put(BSkyBlock.getInstance().getFlagsManager().getFlagByID(key), section.getInt(key)); + if (object == null) + return result; + // For YAML + if (object instanceof MemorySection) { + MemorySection section = (MemorySection) object; + for (String key : section.getKeys(false)) { + Bukkit.getLogger().info("DEBUG: " + key + " = " + section.getInt(key)); + + result.put(BSkyBlock.getInstance().getFlagsManager().getFlagByID(key), section.getInt(key)); + } + } else { + for (Entry en : ((HashMap)object).entrySet()) { + result.put(BSkyBlock.getInstance().getFlagsManager().getFlagByID(en.getKey()), en.getValue()); + } } return result; } @Override - public HashMap convertTo(Object to) { + public HashMap deserialize(Object object) { HashMap result = new HashMap<>(); - HashMap flags = (HashMap)to; + if (object == null) + return result; + HashMap flags = (HashMap)object; for (Entry en: flags.entrySet()) { result.put(en.getKey().getID(), en.getValue()); } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 6ac43d5bf..eae614cdb 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -89,8 +89,7 @@ public class Island implements DataObject { public Island() {} public Island(Location location, UUID owner, int protectionRange) { - this.owner = owner; - this.members.put(owner, RanksManager.OWNER_RANK); + setOwner(owner); this.createdDate = System.currentTimeMillis(); this.updatedDate = System.currentTimeMillis(); this.world = location.getWorld(); @@ -108,7 +107,8 @@ public class Island implements DataObject { * @param playerUUID */ public void addMember(UUID playerUUID) { - members.put(playerUUID, RanksManager.MEMBER_RANK); + if (playerUUID != null) + members.put(playerUUID, RanksManager.MEMBER_RANK); } /** @@ -119,7 +119,8 @@ public class Island implements DataObject { */ public boolean addToBanList(UUID targetUUID) { // TODO fire ban event - members.put(targetUUID, RanksManager.BANNED_RANK); + if (targetUUID != null) + members.put(targetUUID, RanksManager.BANNED_RANK); return true; } @@ -282,7 +283,7 @@ public class Island implements DataObject { * @return rank integer */ public int getRank(User user) { - Bukkit.getLogger().info("DEBUG: user UUID = " + user.getUniqueId()); + //Bukkit.getLogger().info("DEBUG: user UUID = " + user.getUniqueId()); return members.containsKey(user.getUniqueId()) ? members.get(user.getUniqueId()) : RanksManager.VISITOR_RANK; } @@ -426,7 +427,7 @@ public class Island implements DataObject { * @return true if allowed, false if not */ public boolean isAllowed(User user, Flag flag) { - Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); + //Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); return (this.getRank(user) >= this.getFlagReq(flag)) ? true : false; } @@ -601,6 +602,7 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; + if (owner == null) return; // Defensive code: demote any previous owner for (Entry en : members.entrySet()) { if (en.getValue().equals(RanksManager.OWNER_RANK)) { @@ -637,7 +639,7 @@ public class Island implements DataObject { * @param rank */ public void setRank(User user, int rank) { - members.put(user.getUniqueId(), rank); + if (user.getUniqueId() != null) members.put(user.getUniqueId(), rank); } /** diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 8b5884de9..9ad9f3e87 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -19,7 +19,7 @@ public class FlagsManager { public void registerFlag(Flag flag) { //TODO all the security checks - plugin.getLogger().info("DEBUG: registering flag " + flag.getID()); + //plugin.getLogger().info("DEBUG: registering flag " + flag.getID()); flags.add(flag); // If there is a listener, register it into Bukkit. flag.getListener().ifPresent(l -> plugin.getServer().getPluginManager().registerEvents(l, plugin)); From 26956d838636db81188539824c2f978c7ed95f94 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sun, 4 Feb 2018 21:48:34 -0800 Subject: [PATCH 21/97] Fixed missing locale text for invites. Fixed config settings for teams. --- locales/en-US.yml | 8 +++++ .../us/tastybento/bskyblock/Settings.java | 30 +++++++++++++++---- .../island/teams/IslandTeamInviteCommand.java | 22 +++++++------- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 0f8aa5c90..52a88d99d 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -81,10 +81,18 @@ commands: description: "display detailed info about your team" invite: description: "invite a player to join your island" + invitation-sent: "Invitation sent to [name]" + removing-invite: "Removing invite" + name-has-invited-you: "[name] has invited you to join their island." + to-accept-or-reject: "Do /island team accept to accept, or /island team reject to reject" + you-will-lose-your-island: "&cWARNING! You will lose your island if you accept!" errors: + cannot-invite-self: "&cYou cannot invite yourself!" + cooldown: "&cYou cannot invite that person for another [time] seconds" island-is-full: "&cYour island is full, you can't invite anyone else." none-invited-you: "&cNo one invited you :c." you-already-are-in-team: "&cYou are already on a team!" + already-on-team: "&cThat player is already on a team!" invalid-invite: "&cThat invite is no longer valid, sorry." parameters: "" you-can-invite: "You can invite [number] more players." diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index ad73bf43e..b6efe91e7 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -134,30 +134,48 @@ public class Settings implements ISettings { // --------------------------------------------- /* ISLAND */ - private int maxTeamSize; - private int maxHomes; + @ConfigEntry(path = "island.max-team-size") + private int maxTeamSize = 4; + @ConfigEntry(path = "island.max-homes") + private int maxHomes = 5; + @ConfigEntry(path = "island.name.min-length") private int nameMinLength; + @ConfigEntry(path = "island.name.max-length") private int nameMaxLength; - private int inviteWait; + @ConfigEntry(path = "island.invite-wait") + private int inviteWait = 60; // Reset - private int resetLimit; + @ConfigEntry(path = "island.reset.reset-limit") + private int resetLimit = -1; + @ConfigEntry(path = "island.require-confirmation.reset") private boolean resetConfirmation; - @ConfigEntry(path = "island.require-confirmation.reset-wait") - private long resetWait; + @ConfigEntry(path = "island.reset-wait") + private long resetWait = 300; + @ConfigEntry(path = "island.reset.leavers-lose-reset") private boolean leaversLoseReset; + + @ConfigEntry(path = "island.reset.kicked-keep-inventory") private boolean kickedKeepInventory; // Remove mobs + @ConfigEntry(path = "island.remove-mobs.on-login") private boolean removeMobsOnLogin; + @ConfigEntry(path = "island.remove-mobs.on-island") private boolean removeMobsOnIsland; + + @ConfigEntry(path = "island.remove-mobs.whitelist") private List removeMobsWhitelist = new ArrayList<>(); + @ConfigEntry(path = "island.make-island-if-none") private boolean makeIslandIfNone; + + @ConfigEntry(path = "island.immediate-teleport-on-island") private boolean immediateTeleportOnIsland; + private boolean respawnOnIsland; // Deaths diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index b70961243..e75808dd7 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -48,9 +48,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { // Invite label with no name, i.e., /island invite - tells the player who has invited them so far if (inviteList.containsKey(playerUUID)) { OfflinePlayer inviter = getPlugin().getServer().getOfflinePlayer(inviteList.get(playerUUID)); - user.sendMessage("invite.nameHasInvitedYou", "[name]", inviter.getName()); + user.sendMessage("commands.island.team.invite.name-has-invited-you", "[name]", inviter.getName()); } else { - user.sendMessage("help.island.invite"); + this.getSubCommand("help").get().execute(user, args); } return true; } else { @@ -67,19 +67,19 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { } // Player cannot invite themselves if (playerUUID.equals(invitedPlayerUUID)) { - user.sendMessage("invite.error.YouCannotInviteYourself"); + user.sendMessage("commands.island.team.invite.cannot-invite-self"); return true; } // Check if this player can be invited to this island, or // whether they are still on cooldown long time = getPlayers().getInviteCoolDownTime(invitedPlayerUUID, getIslands().getIslandLocation(playerUUID)); if (time > 0 && !user.isOp()) { - user.sendMessage("invite.error.CoolDown", "[time]", String.valueOf(time)); + user.sendMessage("commands.island.team.invite.cooldown", "[time]", String.valueOf(time)); return true; } // Player cannot invite someone already on a team if (getPlayers().inTeam(invitedPlayerUUID)) { - user.sendMessage("invite.error.ThatPlayerIsAlreadyInATeam"); + user.sendMessage("commands.island.team.invite.already-on-team"); return true; } Set teamMembers = getMembers(user); @@ -111,7 +111,7 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { // Players can only have one invite one at a time - interesting if (inviteList.containsValue(playerUUID)) { inviteList.inverse().remove(playerUUID); - user.sendMessage("invite.removingInvite"); + user.sendMessage("commands.island.team.invite.removing-invite"); } // Fire event so add-ons can run commands, etc. IslandBaseEvent event = TeamEvent.builder() @@ -124,15 +124,15 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { // Put the invited player (key) onto the list with inviter (value) // If someone else has invited a player, then this invite will overwrite the previous invite! inviteList.put(invitedPlayerUUID, playerUUID); - user.sendMessage("invite.inviteSentTo", "[name]", args.get(0)); + user.sendMessage("commands.island.team.invite.invitation-sent", "[name]", args.get(0)); // Send message to online player - invitedPlayer.sendMessage("invite.nameHasInvitedYou", "[name]", user.getName()); - invitedPlayer.sendMessage("invite.toAcceptOrReject", "[label]", getLabel()); + invitedPlayer.sendMessage("commands.island.team.invite.name-has-invited-you", "[name]", user.getName()); + invitedPlayer.sendMessage("commands.island.team.invite.to-accept-or-reject", "[label]", getLabel()); if (getPlayers().hasIsland(invitedPlayer.getUniqueId())) { - invitedPlayer.sendMessage("invite.warningYouWillLoseIsland"); + invitedPlayer.sendMessage("commands.island.team.invite.you-will-lose-your-island"); } } else { - user.sendMessage("invite.error.YourIslandIsFull"); + user.sendMessage("commands.island.team.invite.errors.island-is-full"); } } return false; From 812594783e6fd001d5035c93c1ba905bc97066ce Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 5 Feb 2018 11:35:50 -0800 Subject: [PATCH 22/97] Made Adapter its own annotation. --- .../us/tastybento/bskyblock/Settings.java | 6 +- .../api/configuration/ConfigEntry.java | 3 +- .../flatfile/FlatFileDatabaseHandler.java | 62 +++++++++++-------- .../database/mysql/MySQLDatabaseHandler.java | 40 ++++++------ .../bskyblock/database/objects/Island.java | 4 +- .../database/objects/adapters/Adapter.java | 19 ++++++ .../objects/adapters/AdapterInterface.java} | 4 +- .../{ => adapters}/FlagSerializer.java | 5 +- .../adapters/PotionEffectListAdapter.java} | 4 +- 9 files changed, 91 insertions(+), 56 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java rename src/main/java/us/tastybento/bskyblock/{api/configuration/Adapter.java => database/objects/adapters/AdapterInterface.java} (78%) rename src/main/java/us/tastybento/bskyblock/database/objects/{ => adapters}/FlagSerializer.java (89%) rename src/main/java/us/tastybento/bskyblock/{api/configuration/PotionEffectListAdpater.java => database/objects/adapters/PotionEffectListAdapter.java} (83%) diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index b6efe91e7..de86476da 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -14,10 +14,11 @@ import org.bukkit.potion.PotionEffectType; import us.tastybento.bskyblock.Constants.GameType; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.configuration.ISettings; -import us.tastybento.bskyblock.api.configuration.PotionEffectListAdpater; import us.tastybento.bskyblock.api.configuration.StoreAt; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.BSBDatabase.DatabaseType; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.PotionEffectListAdapter; /** * All the plugin settings are here @@ -237,7 +238,8 @@ public class Settings implements ISettings { @ConfigEntry(path = "acid.damage.rain", specificTo = GameType.ACIDISLAND) private int acidRainDamage = 1; - @ConfigEntry(path = "acid.damage.effects", specificTo = GameType.ACIDISLAND, adapter = PotionEffectListAdpater.class) + @ConfigEntry(path = "acid.damage.effects", specificTo = GameType.ACIDISLAND) + @Adapter(PotionEffectListAdapter.class) private List acidEffects = new ArrayList<>(Arrays.asList(PotionEffectType.CONFUSION, PotionEffectType.SLOW)); /* SCHEMATICS */ diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java index 38137d22a..4f814a20a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java @@ -16,12 +16,11 @@ import us.tastybento.bskyblock.Constants.GameType; @Target(ElementType.FIELD) public @interface ConfigEntry { - String path() default ""; + String path(); String since() default "1.0"; boolean overrideOnChange() default false; boolean experimental() default false; boolean needsReset() default false; GameType specificTo() default GameType.BOTH; - Class adapter() default Adapter.class; } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 9695a7468..3fae3482b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -26,11 +26,12 @@ import org.bukkit.plugin.Plugin; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.Constants.GameType; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.configuration.StoreAt; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.AdapterInterface; import us.tastybento.bskyblock.util.Util; /** @@ -179,21 +180,24 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { continue; } // TODO: Add handling of other ConfigEntry elements - if (!configEntry.adapter().equals(Adapter.class)) { - // A conversion adapter has been defined - Object value = config.get(storageLocation); - method.invoke(instance, ((Adapter)configEntry.adapter().newInstance()).serialize(value)); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value = " + value); - plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType()); - plugin.getLogger().info("DEBUG: " + value.getClass()); - } - if (value != null && !value.getClass().equals(MemorySection.class)) { - method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType())); - } - // We are done here - continue; + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + Object value = config.get(storageLocation); + method.invoke(instance, ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value)); + if (DEBUG) { + plugin.getLogger().info("DEBUG: value = " + value); + plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType()); + plugin.getLogger().info("DEBUG: " + value.getClass()); } + if (value != null && !value.getClass().equals(MemorySection.class)) { + method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType())); + } + // We are done here + continue; } // Look in the YAML Config to see if this field exists (it should) @@ -352,18 +356,24 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { storageLocation = configEntry.path(); } // TODO: add in game-specific saving - if (!configEntry.adapter().equals(Adapter.class)) { - // A conversion adapter has been defined - try { - config.set(storageLocation, ((Adapter)configEntry.adapter().newInstance()).deserialize(value)); - } catch (InstantiationException e) { - e.printStackTrace(); - } - // We are done here - continue fields; - } - + } + + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + // A conversion adapter has been defined + try { + config.set(storageLocation, ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value)); + } catch (InstantiationException e) { + e.printStackTrace(); + } + // We are done here + continue fields; + } + //plugin.getLogger().info("DEBUG: property desc = " + propertyDescriptor.getPropertyType().getTypeName()); // Depending on the vale type, it'll need serializing differenty // Check if this field is the mandatory UniqueId field. This is used to identify this instantiation of the class diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index c5631e76a..1603d05d2 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -32,10 +32,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.plugin.Plugin; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.AdapterInterface; import us.tastybento.bskyblock.util.Util; /** @@ -423,14 +424,15 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (configEntry != null) { if (DEBUG) plugin.getLogger().info("DEBUG: there is a configEntry"); - if (!configEntry.adapter().equals(Adapter.class)) { - if (DEBUG) - plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined - value = ((Adapter)configEntry.adapter().newInstance()).deserialize(value); - if (DEBUG) - plugin.getLogger().info("DEBUG: value now after deserialization = " + value); - } + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); } // Create set and map table inserts if this is a Collection if (propertyDescriptor.getPropertyType().equals(Set.class) || @@ -485,7 +487,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Entry en = (Entry) it.next(); if (DEBUG) plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); - + // Get the key and serialize it Object key = serialize(en.getKey(), en.getKey().getClass()); if (DEBUG) @@ -789,14 +791,16 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (configEntry != null) { if (DEBUG) plugin.getLogger().info("DEBUG: there is a configEntry"); - if (!configEntry.adapter().equals(Adapter.class)) { - if (DEBUG) - plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined - value = ((Adapter)configEntry.adapter().newInstance()).serialize(value); - if (DEBUG) - plugin.getLogger().info("DEBUG: value now after serialization = " + value); - } + // TODO: add config entry handling + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); } if (DEBUG) { plugin.getLogger().info("DEBUG: invoking method " + method.getName()); diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index eae614cdb..b16961a81 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -23,6 +23,8 @@ import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandUnlockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.Reason; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; @@ -80,7 +82,7 @@ public class Island implements DataObject { private boolean purgeProtected = false; //// Protection flags //// - @ConfigEntry(adapter = FlagSerializer.class) + @Adapter(FlagSerializer.class) private HashMap flags = new HashMap<>(); private int levelHandicap; diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java new file mode 100644 index 000000000..da5ec607d --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java @@ -0,0 +1,19 @@ +package us.tastybento.bskyblock.database.objects.adapters; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * Denotes which adapter should be used to serialize or deserialize this field + * @author tastybento + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Adapter { + + Class value(); + +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java similarity index 78% rename from src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java index d87f26531..ac1187081 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java @@ -1,4 +1,4 @@ -package us.tastybento.bskyblock.api.configuration; +package us.tastybento.bskyblock.database.objects.adapters; /** @@ -8,7 +8,7 @@ package us.tastybento.bskyblock.api.configuration; * @param * @param */ -public interface Adapter { +public interface AdapterInterface { /** * Serialize object diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java similarity index 89% rename from src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java index c3b2db36f..e4ddb3d48 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java @@ -1,4 +1,4 @@ -package us.tastybento.bskyblock.database.objects; +package us.tastybento.bskyblock.database.objects.adapters; import java.util.HashMap; import java.util.Map.Entry; @@ -7,7 +7,6 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.MemorySection; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.flags.Flag; /** @@ -17,7 +16,7 @@ import us.tastybento.bskyblock.api.flags.Flag; * @author tastybento * */ -public class FlagSerializer implements Adapter, HashMap> { +public class FlagSerializer implements AdapterInterface, HashMap> { @Override public HashMap serialize(Object object) { diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java similarity index 83% rename from src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java index 2abe0e836..c1a2d3f3a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java @@ -1,11 +1,11 @@ -package us.tastybento.bskyblock.api.configuration; +package us.tastybento.bskyblock.database.objects.adapters; import java.util.ArrayList; import java.util.List; import org.bukkit.potion.PotionEffectType; -public class PotionEffectListAdpater implements Adapter, List> { +public class PotionEffectListAdapter implements AdapterInterface, List> { @SuppressWarnings("unchecked") @Override From ffbf938a32100250d9ac2a447be3eeb02711ee3b Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 5 Feb 2018 14:30:35 -0800 Subject: [PATCH 23/97] WIP trying out moving flags into flag manager. --- .../tastybento/bskyblock/api/flags/Flag.java | 22 ++- .../bskyblock/api/flags/FlagBuilder.java | 7 +- .../objects/adapters/FlagSerializer.java | 2 +- .../flags/BlockInteractionListener.java | 3 +- .../us/tastybento/bskyblock/lists/Flaggs.java | 51 ++++++ .../us/tastybento/bskyblock/lists/Flags.java | 144 ++++++---------- .../bskyblock/managers/FlagsManager.java | 155 ++++++++++++++++-- 7 files changed, 260 insertions(+), 124 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/lists/Flaggs.java diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 184bb693d..e134ff67f 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -6,18 +6,17 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; +import us.tastybento.bskyblock.lists.Flaggs; -public class Flag { +public class Flag implements Comparable { - private String id; - private PanelItem icon; - private Listener listener; + private final Flaggs id; + private final PanelItem icon; + private final Listener listener; private boolean defaultSetting; - public Flag() {} - - public Flag(BSkyBlock plugin, String id, PanelItem icon, Listener listener, boolean defaultSetting) { - this.id = id; + public Flag(BSkyBlock plugin, Flaggs id2, PanelItem icon, Listener listener, boolean defaultSetting) { + this.id = id2; this.icon = icon; this.listener = listener; //System.out.println("DEBUG: " + plugin); @@ -25,7 +24,7 @@ public class Flag { plugin.getFlagsManager().registerFlag(this); } - public String getID() { + public Flaggs getID() { return id; } @@ -44,4 +43,9 @@ public class Flag { public void setDefaultSetting(boolean defaultSetting) { this.defaultSetting = defaultSetting; } + + @Override + public int compareTo(Flag o) { + return id.compareTo(o.getID()); + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 7ced27066..60149203b 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -7,16 +7,17 @@ import org.bukkit.inventory.ItemStack; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; +import us.tastybento.bskyblock.lists.Flaggs; public class FlagBuilder { - private String id = ""; + private Flaggs id; private PanelItem icon; private Listener listener; private boolean defaultSetting; - public FlagBuilder id(String id) { - this.id = id; + public FlagBuilder id(Flaggs flag) { + this.id = flag; return this; } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java index e4ddb3d48..5cc02aa9a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java @@ -46,7 +46,7 @@ public class FlagSerializer implements AdapterInterface, return result; HashMap flags = (HashMap)object; for (Entry en: flags.entrySet()) { - result.put(en.getKey().getID(), en.getValue()); + result.put(en.getKey().getID().name(), en.getValue()); } return result; } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index f4bd2fe5f..c43563b07 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.lists.Flaggs; import us.tastybento.bskyblock.lists.Flags; /** @@ -32,7 +33,7 @@ public class BlockInteractionListener extends AbstractFlagListener { } switch (e.getClickedBlock().getType()) { case ANVIL: - checkIsland(e, e.getClickedBlock().getLocation(), Flags.ANVIL); + checkIsland(e, e.getClickedBlock().getLocation(), plugin.getFlagsManager().getFlagByID(Flaggs.ANVIL)); break; case BEACON: checkIsland(e, e.getClickedBlock().getLocation(), Flags.BEACON); diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java b/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java new file mode 100644 index 000000000..d63cd64b4 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java @@ -0,0 +1,51 @@ +package us.tastybento.bskyblock.lists; + + +public enum Flaggs { + ANVIL, + ARMOR_STAND, + BEACON, + BED, + BREAK_BLOCKS, + BREEDING, + BREWING, + BUCKET, + CHEST, + CHORUS_FRUIT, + COLLECT_LAVA, + COLLECT_WATER, + CRAFTING, + CROP_TRAMPLE, + DOOR, + EGGS, + ENCHANTING, + ENDER_PEARL, + ENTER_EXIT_MESSAGES, + FIRE, + FIRE_EXTINGUISH, + FIRE_SPREAD, + FURNACE, + GATE, + HURT_MOBS, + HURT_MONSTERS, + ITEM_DROP, + ITEM_PICKUP, + LEASH, + LEVER_BUTTON, + MILKING, + MOB_SPAWN, + MONSTER_SPAWN, + MOUNT_INVENTORY, + MUSIC, + PLACE_BLOCKS, + PORTAL, + PRESSURE_PLATE, + PVP_END, + PVP_NETHER, + PVP_OVERWORLD, + REDSTONE, + RIDING, + SHEARING, + SPAWN_EGGS, + TRADING +} diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 7ee39a30f..4083a2487 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -3,7 +3,6 @@ package us.tastybento.bskyblock.lists; import org.bukkit.Material; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.FlagBuilder; import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; @@ -28,53 +27,8 @@ import us.tastybento.bskyblock.listeners.flags.TeleportationListener; * @author tastybento * */ + public class Flags { - public static Flag ANVIL; - public static Flag ARMOR_STAND; - public static Flag BEACON; - public static Flag BED; - public static Flag BREAK_BLOCKS; - public static Flag BREEDING; - public static Flag BREWING; - public static Flag BUCKET; - public static Flag CHEST; - public static Flag CHORUS_FRUIT; - public static Flag COLLECT_LAVA; - public static Flag COLLECT_WATER; - public static Flag CRAFTING; - public static Flag CROP_TRAMPLE; - public static Flag DOOR; - public static Flag EGGS; - public static Flag ENCHANTING; - public static Flag ENDER_PEARL; - public static Flag ENTER_EXIT_MESSAGES; - public static Flag FIRE; - public static Flag FIRE_EXTINGUISH; - public static Flag FIRE_SPREAD; - public static Flag FURNACE; - public static Flag GATE; - public static Flag HURT_MOBS; - public static Flag HURT_MONSTERS; - public static Flag ITEM_DROP; - public static Flag ITEM_PICKUP; - public static Flag LEASH; - public static Flag LEVER_BUTTON; - public static Flag MILKING; - public static Flag MOB_SPAWN; - public static Flag MONSTER_SPAWN; - public static Flag MOUNT_INVENTORY; - public static Flag MUSIC; - public static Flag PLACE_BLOCKS; - public static Flag PORTAL; - public static Flag PRESSURE_PLATE; - public static Flag PVP_END; - public static Flag PVP_NETHER; - public static Flag PVP_OVERWORLD; - public static Flag REDSTONE; - public static Flag RIDING; - public static Flag SHEARING; - public static Flag SPAWN_EGGS; - public static Flag TRADING; private BSkyBlock p; @@ -82,49 +36,49 @@ public class Flags { p = plugin; // Break and place blocks - BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); - PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); + new FlagBuilder().id(Flaggs.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); + new FlagBuilder().id(Flaggs.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); // Block interactions - all use BlockInteractionListener() - ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); - BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(p); - BED = new FlagBuilder().id("BED").icon(Material.BED).build(p); - BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(p); - CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(p); - DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); - CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(p); - ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); - FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(p); - GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(p); - MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(p); - LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(p); - REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(p); - SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(p); + new FlagBuilder().id(Flaggs.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); + new FlagBuilder().id(Flaggs.BEACON).icon(Material.BEACON).build(p); + new FlagBuilder().id(Flaggs.BED).icon(Material.BED).build(p); + new FlagBuilder().id(Flaggs.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); + new FlagBuilder().id(Flaggs.CHEST).icon(Material.CHEST).build(p); + new FlagBuilder().id(Flaggs.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); + new FlagBuilder().id(Flaggs.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); + new FlagBuilder().id(Flaggs.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); + new FlagBuilder().id(Flaggs.FURNACE).icon(Material.FURNACE).build(p); + new FlagBuilder().id(Flaggs.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); + new FlagBuilder().id(Flaggs.MUSIC).icon(Material.JUKEBOX).build(p); + new FlagBuilder().id(Flaggs.LEVER_BUTTON).icon(Material.LEVER).build(p); + new FlagBuilder().id(Flaggs.REDSTONE).icon(Material.REDSTONE).build(p); + new FlagBuilder().id(Flaggs.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); // Entity interactions - ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); - RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(p); - TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(p); + new FlagBuilder().id(Flaggs.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); + new FlagBuilder().id(Flaggs.RIDING).icon(Material.GOLD_BARDING).build(p); + new FlagBuilder().id(Flaggs.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); // Breeding - BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener(p)).build(p); + new FlagBuilder().id(Flaggs.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); // Buckets. All bucket use is covered by one listener - BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener(p)).build(p); - COLLECT_LAVA = new FlagBuilder().id("COLLECT_LAVA").icon(Material.LAVA_BUCKET).build(p); - COLLECT_WATER = new FlagBuilder().id("COLLECT_WATER").icon(Material.WATER_BUCKET).build(p); - MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(p); + new FlagBuilder().id(Flaggs.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); + new FlagBuilder().id(Flaggs.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); + new FlagBuilder().id(Flaggs.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); + new FlagBuilder().id(Flaggs.MILKING).icon(Material.MILK_BUCKET).build(p); // Chorus Fruit and Enderpearls - CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); - ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(p); + new FlagBuilder().id(Flaggs.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); + new FlagBuilder().id(Flaggs.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); // Physical interactions - CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); - PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(p); + new FlagBuilder().id(Flaggs.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); + new FlagBuilder().id(Flaggs.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); // Egg throwing - EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener(p)).build(p); + new FlagBuilder().id(Flaggs.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); /* * Fire @@ -136,41 +90,39 @@ public class Flags { * I'll take you to burn * - The Crazy World of Arthur Brown */ - FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); - FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(p); - FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(p); + new FlagBuilder().id(Flaggs.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); + new FlagBuilder().id(Flaggs.FIRE_EXTINGUISH).icon(Material.POTION).build(p); + new FlagBuilder().id(Flaggs.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); // Inventories - MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); + new FlagBuilder().id(Flaggs.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); // Hurting things - HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); - HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(p); + new FlagBuilder().id(Flaggs.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); + new FlagBuilder().id(Flaggs.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); // Leashes - LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener(p)).build(p); + new FlagBuilder().id(Flaggs.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); // Portal use protection - PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); - - // PVP - PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).listener(new PVPListener(p)).build(p); - PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).build(p); - PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).build(p); + new FlagBuilder().id(Flaggs.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); // Shearing - SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); + new FlagBuilder().id(Flaggs.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); // Item pickup or drop - ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); - ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(p); + new FlagBuilder().id(Flaggs.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); + new FlagBuilder().id(Flaggs.ITEM_PICKUP).icon(Material.DIRT).build(p); /* * Non-protection flags */ - - ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).build(p); - MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).build(p); - MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); + // PVP + new FlagBuilder().id(Flaggs.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); + new FlagBuilder().id(Flaggs.PVP_NETHER).icon(Material.IRON_AXE).build(p); + new FlagBuilder().id(Flaggs.PVP_END).icon(Material.END_CRYSTAL).build(p); + new FlagBuilder().id(Flaggs.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); + new FlagBuilder().id(Flaggs.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); + new FlagBuilder().id(Flaggs.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); } } diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 9ad9f3e87..4b8620793 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -1,45 +1,172 @@ package us.tastybento.bskyblock.managers; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; + +import org.bukkit.Material; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.api.flags.FlagBuilder; import us.tastybento.bskyblock.api.panels.PanelItem; +import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; +import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; +import us.tastybento.bskyblock.listeners.flags.BreedingListener; +import us.tastybento.bskyblock.listeners.flags.BucketListener; +import us.tastybento.bskyblock.listeners.flags.EggListener; +import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; +import us.tastybento.bskyblock.listeners.flags.FireListener; +import us.tastybento.bskyblock.listeners.flags.HurtingListener; +import us.tastybento.bskyblock.listeners.flags.InventoryListener; +import us.tastybento.bskyblock.listeners.flags.ItemDropPickUpListener; +import us.tastybento.bskyblock.listeners.flags.LeashListener; +import us.tastybento.bskyblock.listeners.flags.PVPListener; +import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; +import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; +import us.tastybento.bskyblock.listeners.flags.PortalListener; +import us.tastybento.bskyblock.listeners.flags.ShearingListener; +import us.tastybento.bskyblock.listeners.flags.TeleportationListener; +import us.tastybento.bskyblock.lists.Flaggs; public class FlagsManager { - private BSkyBlock plugin; + private BSkyBlock p; public FlagsManager(BSkyBlock plugin) { - this.plugin = plugin; + this.p = plugin; + + // Register flags + registerFlags(); } - private List flags = new ArrayList<>(); + private HashMap flags = new HashMap<>(); public void registerFlag(Flag flag) { //TODO all the security checks //plugin.getLogger().info("DEBUG: registering flag " + flag.getID()); - flags.add(flag); + flags.put(flag.getID(), flag); // If there is a listener, register it into Bukkit. - flag.getListener().ifPresent(l -> plugin.getServer().getPluginManager().registerEvents(l, plugin)); + flag.getListener().ifPresent(l -> p.getServer().getPluginManager().registerEvents(l, p)); } - public List getFlags() { + public HashMap getFlags() { return flags; } - public Flag getFlagByID(String id) { - for (Flag flag : flags) { - if (flag.getID().equals(id.toUpperCase())) return flag; - } - return null; + public Flag getFlagByID(Flaggs id) { + return flags.get(id); } public Flag getFlagByIcon(PanelItem item) { - for (Flag flag : flags) { + for (Flag flag : flags.values()) { if (flag.getIcon().equals(item)) return flag; } return null; } + + private void registerFlags() { + + // Break and place blocks + new FlagBuilder().id(Flaggs.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); + new FlagBuilder().id(Flaggs.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); + + // Block interactions - all use BlockInteractionListener() + new FlagBuilder().id(Flaggs.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); + new FlagBuilder().id(Flaggs.BEACON).icon(Material.BEACON).build(p); + new FlagBuilder().id(Flaggs.BED).icon(Material.BED).build(p); + new FlagBuilder().id(Flaggs.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); + new FlagBuilder().id(Flaggs.CHEST).icon(Material.CHEST).build(p); + new FlagBuilder().id(Flaggs.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); + new FlagBuilder().id(Flaggs.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); + new FlagBuilder().id(Flaggs.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); + new FlagBuilder().id(Flaggs.FURNACE).icon(Material.FURNACE).build(p); + new FlagBuilder().id(Flaggs.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); + new FlagBuilder().id(Flaggs.MUSIC).icon(Material.JUKEBOX).build(p); + new FlagBuilder().id(Flaggs.LEVER_BUTTON).icon(Material.LEVER).build(p); + new FlagBuilder().id(Flaggs.REDSTONE).icon(Material.REDSTONE).build(p); + new FlagBuilder().id(Flaggs.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); + + // Entity interactions + new FlagBuilder().id(Flaggs.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); + new FlagBuilder().id(Flaggs.RIDING).icon(Material.GOLD_BARDING).build(p); + new FlagBuilder().id(Flaggs.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); + + // Breeding + new FlagBuilder().id(Flaggs.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); + + // Buckets. All bucket use is covered by one listener + new FlagBuilder().id(Flaggs.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); + new FlagBuilder().id(Flaggs.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); + new FlagBuilder().id(Flaggs.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); + new FlagBuilder().id(Flaggs.MILKING).icon(Material.MILK_BUCKET).build(p); + + // Chorus Fruit and Enderpearls + new FlagBuilder().id(Flaggs.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); + new FlagBuilder().id(Flaggs.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); + + // Physical interactions + new FlagBuilder().id(Flaggs.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); + new FlagBuilder().id(Flaggs.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); + + // Egg throwing + new FlagBuilder().id(Flaggs.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); + + /* + * Fire + * I'll take you to burn. + * Fire + * I'll take you to learn. + * You gonna burn, burn, burn + * Fire + * I'll take you to burn + * - The Crazy World of Arthur Brown + */ + new FlagBuilder().id(Flaggs.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); + new FlagBuilder().id(Flaggs.FIRE_EXTINGUISH).icon(Material.POTION).build(p); + new FlagBuilder().id(Flaggs.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); + + // Inventories + new FlagBuilder().id(Flaggs.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); + + // Hurting things + new FlagBuilder().id(Flaggs.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); + new FlagBuilder().id(Flaggs.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); + + // Leashes + new FlagBuilder().id(Flaggs.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); + + // Portal use protection + new FlagBuilder().id(Flaggs.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); + + // Shearing + new FlagBuilder().id(Flaggs.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); + + // Item pickup or drop + new FlagBuilder().id(Flaggs.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); + new FlagBuilder().id(Flaggs.ITEM_PICKUP).icon(Material.DIRT).build(p); + + /* + * Non-protection flags + */ + // PVP + new FlagBuilder().id(Flaggs.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); + new FlagBuilder().id(Flaggs.PVP_NETHER).icon(Material.IRON_AXE).build(p); + new FlagBuilder().id(Flaggs.PVP_END).icon(Material.END_CRYSTAL).build(p); + new FlagBuilder().id(Flaggs.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); + new FlagBuilder().id(Flaggs.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); + new FlagBuilder().id(Flaggs.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); + + } + + /** + * Get flag by string + * @param key - string name same as the enum + * @return Flag or null if not known + */ + public Flag getFlagByID(String key) { + for (Flaggs flag: Flaggs.values()) { + if (flag.name().equalsIgnoreCase(key)) return this.getFlagByID(flag); + } + return null; + } + } From 645b4eb61088cca09a8bdff4372aed7dda14c27f Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 5 Feb 2018 14:51:03 -0800 Subject: [PATCH 24/97] Implements flags as enum so flags are protected. --- .../us/tastybento/bskyblock/BSkyBlock.java | 2 - .../tastybento/bskyblock/api/flags/Flag.java | 8 +- .../bskyblock/api/flags/FlagBuilder.java | 6 +- .../bskyblock/database/objects/Island.java | 17 +- .../listeners/flags/AbstractFlagListener.java | 25 ++- .../flags/BlockInteractionListener.java | 3 +- .../listeners/flags/BreakBlocksListener.java | 2 +- .../listeners/flags/FireListener.java | 8 +- .../listeners/flags/HurtingListener.java | 3 +- .../listeners/flags/MobSpawnListener.java | 4 +- .../listeners/flags/PVPListener.java | 11 +- .../us/tastybento/bskyblock/lists/Flaggs.java | 51 ------ .../us/tastybento/bskyblock/lists/Flags.java | 171 +++++------------- .../bskyblock/managers/FlagsManager.java | 107 +++++------ src/test/java/bskyblock/TestBSkyBlock.java | 2 +- 15 files changed, 152 insertions(+), 268 deletions(-) delete mode 100644 src/main/java/us/tastybento/bskyblock/lists/Flaggs.java diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index a0f98fe13..1a9455396 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -11,7 +11,6 @@ import us.tastybento.bskyblock.database.managers.island.IslandsManager; import us.tastybento.bskyblock.generators.IslandWorld; import us.tastybento.bskyblock.listeners.JoinLeaveListener; import us.tastybento.bskyblock.listeners.PanelListenerManager; -import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.AddonsManager; import us.tastybento.bskyblock.managers.CommandsManager; import us.tastybento.bskyblock.managers.FlagsManager; @@ -92,7 +91,6 @@ public class BSkyBlock extends JavaPlugin { // Load Flags flagsManager = new FlagsManager(plugin); - new Flags(plugin); // Load islands from database islandsManager.load(); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index e134ff67f..b0e8feb59 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -6,16 +6,16 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; -import us.tastybento.bskyblock.lists.Flaggs; +import us.tastybento.bskyblock.lists.Flags; public class Flag implements Comparable { - private final Flaggs id; + private final Flags id; private final PanelItem icon; private final Listener listener; private boolean defaultSetting; - public Flag(BSkyBlock plugin, Flaggs id2, PanelItem icon, Listener listener, boolean defaultSetting) { + public Flag(BSkyBlock plugin, Flags id2, PanelItem icon, Listener listener, boolean defaultSetting) { this.id = id2; this.icon = icon; this.listener = listener; @@ -24,7 +24,7 @@ public class Flag implements Comparable { plugin.getFlagsManager().registerFlag(this); } - public Flaggs getID() { + public Flags getID() { return id; } diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 60149203b..75a454e7d 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -7,16 +7,16 @@ import org.bukkit.inventory.ItemStack; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; -import us.tastybento.bskyblock.lists.Flaggs; +import us.tastybento.bskyblock.lists.Flags; public class FlagBuilder { - private Flaggs id; + private Flags id; private PanelItem icon; private Listener listener; private boolean defaultSetting; - public FlagBuilder id(Flaggs flag) { + public FlagBuilder id(Flags flag) { this.id = flag; return this; } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index b16961a81..d7cd16234 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -16,15 +16,14 @@ import org.bukkit.entity.Entity; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.events.IslandBaseEvent; 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.IslandUnlockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.Reason; -import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.objects.adapters.Adapter; import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; +import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; @@ -83,7 +82,7 @@ public class Island implements DataObject { //// Protection flags //// @Adapter(FlagSerializer.class) - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); private int levelHandicap; private Location spawnPoint; @@ -158,7 +157,7 @@ public class Island implements DataObject { * @param flag * @return flag rank. Players must have at least this rank to bypass this flag */ - public int getFlagReq(Flag flag){ + public int getFlagReq(Flags flag){ if(flags.containsKey(flag)) { return flags.get(flag); } else { @@ -170,7 +169,7 @@ public class Island implements DataObject { /** * @return the flags */ - public HashMap getFlags() { + public HashMap getFlags() { return flags; } @@ -418,7 +417,7 @@ public class Island implements DataObject { * @param flag * @return true if allowed, false if not */ - public boolean isAllowed(Flag flag) { + public boolean isAllowed(Flags flag) { return this.getFlagReq(flag) >= 0 ? true : false; } @@ -428,7 +427,7 @@ public class Island implements DataObject { * @param flag - flag * @return true if allowed, false if not */ - public boolean isAllowed(User user, Flag flag) { + public boolean isAllowed(User user, Flags flag) { //Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); return (this.getRank(user) >= this.getFlagReq(flag)) ? true : false; } @@ -507,14 +506,14 @@ public class Island implements DataObject { * @param flag * @param value - rank value. If the flag applies to the island, a positive number = true, negative = false */ - public void setFlag(Flag flag, int value){ + public void setFlag(Flags flag, int value){ flags.put(flag, value); } /** * @param flags the flags to set */ - public void setFlags(HashMap flags) { + public void setFlags(HashMap flags) { this.flags = flags; } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index 7e133fb9d..eeaa00224 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -18,6 +18,7 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.objects.Island; +import us.tastybento.bskyblock.lists.Flags; /** * Abstract class for flag listeners. Provides common code. @@ -122,23 +123,23 @@ public abstract class AbstractFlagListener implements Listener { * Generic place blocks checker * @param e * @param loc - * @param flag + * @param redstone * @return true if the check is okay, false if it was disallowed */ - public boolean checkIsland(Event e, Location loc, Flag flag) { - return checkIsland(e, loc, flag, false); + public boolean checkIsland(Event e, Location loc, Flags redstone) { + return checkIsland(e, loc, redstone, false); } /** - * Generic place blocks checker + * Check if flag is allowed * @param e * @param loc * @param silent - if true, no attempt is made to tell the user * @return true if the check is okay, false if it was disallowed */ - public boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { + public boolean checkIsland(Event e, Location loc, Flags flag, boolean silent) { // If the user is not set already, try to get it from the event if (user == null) { @@ -169,7 +170,7 @@ public abstract class AbstractFlagListener implements Listener { } // The player is in the world, but not on an island, so general world settings apply - if (!flag.isAllowed()) { + if (!isAllowed(flag)) { noGo(e, silent); user = null; return false; @@ -179,4 +180,16 @@ public abstract class AbstractFlagListener implements Listener { } } + /** + * Get the flag for this ID + * @param flag + * @return Flag denoted by the id + */ + protected Flag id(Flags flag) { + return plugin.getFlagsManager().getFlagByID(flag); + } + + protected boolean isAllowed(Flags flag) { + return plugin.getFlagsManager().isAllowed(flag); + } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index c43563b07..f4bd2fe5f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -9,7 +9,6 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.lists.Flaggs; import us.tastybento.bskyblock.lists.Flags; /** @@ -33,7 +32,7 @@ public class BlockInteractionListener extends AbstractFlagListener { } switch (e.getClickedBlock().getType()) { case ANVIL: - checkIsland(e, e.getClickedBlock().getLocation(), plugin.getFlagsManager().getFlagByID(Flaggs.ANVIL)); + checkIsland(e, e.getClickedBlock().getLocation(), Flags.ANVIL); break; case BEACON: checkIsland(e, e.getClickedBlock().getLocation(), Flags.BEACON); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index 53a92a78c..451fb3d54 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -107,7 +107,7 @@ public class BreakBlocksListener extends AbstractFlagListener { }); // The player is in the world, but not on an island, so general world settings apply - if (!Flags.BREAK_BLOCKS.isAllowed()) { + if (!isAllowed(Flags.BREAK_BLOCKS)) { e.setCancelled(true); user.sendMessage("protection.protected"); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index f04cb7071..153dd220c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -50,7 +50,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE_SPREAD.isAllowed()) e.setCancelled(true); + if (!island.isPresent() && !isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); } /** @@ -69,7 +69,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE_SPREAD.isAllowed()) e.setCancelled(true); + if (!island.isPresent() && !isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); } } @@ -92,7 +92,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE.isAllowed()) e.setCancelled(true); + if (!island.isPresent() && !isAllowed(Flags.FIRE)) e.setCancelled(true); } @@ -145,7 +145,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE.isAllowed()) e.setCancelled(true); + if (!island.isPresent() && !isAllowed(Flags.FIRE)) e.setCancelled(true); // If either of these canceled the event, return if (e.isCancelled()) return; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index 3ed085f6c..84490f431 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -32,7 +32,6 @@ import org.bukkit.potion.PotionEffect; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; /** @@ -71,7 +70,7 @@ public class HurtingListener extends AbstractFlagListener { * @param damager * @param flag */ - private void respond(Event event, Entity damager, Flag flag) { + private void respond(Event event, Entity damager, Flags flag) { // Get the attacker if (damager instanceof Player) { setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index 7c3a7a4d7..613fbb242 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -65,13 +65,13 @@ public class MobSpawnListener extends AbstractFlagListener { } else { // Outside of the island if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { - if (!Flags.MOB_SPAWN.isAllowed()) { + if (!isAllowed(Flags.MOB_SPAWN)) { // Mobs not allowed to spawn e.setCancelled(true); return; } } else if (e.getEntity() instanceof Animals) { - if (!Flags.MONSTER_SPAWN.isAllowed()) { + if (!isAllowed(Flags.MONSTER_SPAWN)) { // Mobs not allowed to spawn e.setCancelled(true); return; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 2ebb8951a..4cdb49f79 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -22,7 +22,6 @@ import org.bukkit.potion.PotionEffect; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; /** @@ -49,14 +48,14 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() instanceof Player) { - Flag flag = Flags.PVP_OVERWORLD; + Flags flag = Flags.PVP_OVERWORLD; if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; respond(e, e.getDamager(), flag); } } - private void respond(Event event, Entity damager, Flag flag) { + private void respond(Event event, Entity damager, Flags flag) { // Get the attacker if (damager instanceof Player) { setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); @@ -77,7 +76,7 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFishing(PlayerFishEvent e) { if (e.getCaught() != null && e.getCaught() instanceof Player) { - Flag flag = Flags.PVP_OVERWORLD; + Flags flag = Flags.PVP_OVERWORLD; if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; if (checkIsland(e, e.getCaught().getLocation(), flag)) { @@ -94,7 +93,7 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onSplashPotionSplash(final PotionSplashEvent e) { // Deduce the world - Flag flag = Flags.PVP_OVERWORLD; + Flags flag = Flags.PVP_OVERWORLD; if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; @@ -142,7 +141,7 @@ public class PVPListener extends AbstractFlagListener { if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { // Deduce the world - Flag flag = Flags.PVP_OVERWORLD; + Flags flag = Flags.PVP_OVERWORLD; if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java b/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java deleted file mode 100644 index d63cd64b4..000000000 --- a/src/main/java/us/tastybento/bskyblock/lists/Flaggs.java +++ /dev/null @@ -1,51 +0,0 @@ -package us.tastybento.bskyblock.lists; - - -public enum Flaggs { - ANVIL, - ARMOR_STAND, - BEACON, - BED, - BREAK_BLOCKS, - BREEDING, - BREWING, - BUCKET, - CHEST, - CHORUS_FRUIT, - COLLECT_LAVA, - COLLECT_WATER, - CRAFTING, - CROP_TRAMPLE, - DOOR, - EGGS, - ENCHANTING, - ENDER_PEARL, - ENTER_EXIT_MESSAGES, - FIRE, - FIRE_EXTINGUISH, - FIRE_SPREAD, - FURNACE, - GATE, - HURT_MOBS, - HURT_MONSTERS, - ITEM_DROP, - ITEM_PICKUP, - LEASH, - LEVER_BUTTON, - MILKING, - MOB_SPAWN, - MONSTER_SPAWN, - MOUNT_INVENTORY, - MUSIC, - PLACE_BLOCKS, - PORTAL, - PRESSURE_PLATE, - PVP_END, - PVP_NETHER, - PVP_OVERWORLD, - REDSTONE, - RIDING, - SHEARING, - SPAWN_EGGS, - TRADING -} diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 4083a2487..e8e7905a5 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -1,128 +1,51 @@ package us.tastybento.bskyblock.lists; -import org.bukkit.Material; -import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.flags.FlagBuilder; -import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; -import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; -import us.tastybento.bskyblock.listeners.flags.BreedingListener; -import us.tastybento.bskyblock.listeners.flags.BucketListener; -import us.tastybento.bskyblock.listeners.flags.EggListener; -import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; -import us.tastybento.bskyblock.listeners.flags.FireListener; -import us.tastybento.bskyblock.listeners.flags.HurtingListener; -import us.tastybento.bskyblock.listeners.flags.InventoryListener; -import us.tastybento.bskyblock.listeners.flags.ItemDropPickUpListener; -import us.tastybento.bskyblock.listeners.flags.LeashListener; -import us.tastybento.bskyblock.listeners.flags.PVPListener; -import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; -import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; -import us.tastybento.bskyblock.listeners.flags.PortalListener; -import us.tastybento.bskyblock.listeners.flags.ShearingListener; -import us.tastybento.bskyblock.listeners.flags.TeleportationListener; - -/** - * Protection flags - * @author tastybento - * - */ - -public class Flags { - - private BSkyBlock p; - - public Flags(BSkyBlock plugin) { - p = plugin; - - // Break and place blocks - new FlagBuilder().id(Flaggs.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); - new FlagBuilder().id(Flaggs.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); - - // Block interactions - all use BlockInteractionListener() - new FlagBuilder().id(Flaggs.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); - new FlagBuilder().id(Flaggs.BEACON).icon(Material.BEACON).build(p); - new FlagBuilder().id(Flaggs.BED).icon(Material.BED).build(p); - new FlagBuilder().id(Flaggs.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); - new FlagBuilder().id(Flaggs.CHEST).icon(Material.CHEST).build(p); - new FlagBuilder().id(Flaggs.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); - new FlagBuilder().id(Flaggs.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); - new FlagBuilder().id(Flaggs.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); - new FlagBuilder().id(Flaggs.FURNACE).icon(Material.FURNACE).build(p); - new FlagBuilder().id(Flaggs.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); - new FlagBuilder().id(Flaggs.MUSIC).icon(Material.JUKEBOX).build(p); - new FlagBuilder().id(Flaggs.LEVER_BUTTON).icon(Material.LEVER).build(p); - new FlagBuilder().id(Flaggs.REDSTONE).icon(Material.REDSTONE).build(p); - new FlagBuilder().id(Flaggs.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); - - // Entity interactions - new FlagBuilder().id(Flaggs.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); - new FlagBuilder().id(Flaggs.RIDING).icon(Material.GOLD_BARDING).build(p); - new FlagBuilder().id(Flaggs.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); - - // Breeding - new FlagBuilder().id(Flaggs.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); - - // Buckets. All bucket use is covered by one listener - new FlagBuilder().id(Flaggs.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); - new FlagBuilder().id(Flaggs.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); - new FlagBuilder().id(Flaggs.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); - new FlagBuilder().id(Flaggs.MILKING).icon(Material.MILK_BUCKET).build(p); - - // Chorus Fruit and Enderpearls - new FlagBuilder().id(Flaggs.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); - new FlagBuilder().id(Flaggs.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); - - // Physical interactions - new FlagBuilder().id(Flaggs.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); - new FlagBuilder().id(Flaggs.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); - - // Egg throwing - new FlagBuilder().id(Flaggs.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); - - /* - * Fire - * I'll take you to burn. - * Fire - * I'll take you to learn. - * You gonna burn, burn, burn - * Fire - * I'll take you to burn - * - The Crazy World of Arthur Brown - */ - new FlagBuilder().id(Flaggs.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); - new FlagBuilder().id(Flaggs.FIRE_EXTINGUISH).icon(Material.POTION).build(p); - new FlagBuilder().id(Flaggs.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); - - // Inventories - new FlagBuilder().id(Flaggs.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); - - // Hurting things - new FlagBuilder().id(Flaggs.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); - new FlagBuilder().id(Flaggs.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); - - // Leashes - new FlagBuilder().id(Flaggs.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); - - // Portal use protection - new FlagBuilder().id(Flaggs.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); - - // Shearing - new FlagBuilder().id(Flaggs.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); - - // Item pickup or drop - new FlagBuilder().id(Flaggs.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); - new FlagBuilder().id(Flaggs.ITEM_PICKUP).icon(Material.DIRT).build(p); - - /* - * Non-protection flags - */ - // PVP - new FlagBuilder().id(Flaggs.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); - new FlagBuilder().id(Flaggs.PVP_NETHER).icon(Material.IRON_AXE).build(p); - new FlagBuilder().id(Flaggs.PVP_END).icon(Material.END_CRYSTAL).build(p); - new FlagBuilder().id(Flaggs.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); - new FlagBuilder().id(Flaggs.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); - new FlagBuilder().id(Flaggs.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); - } +public enum Flags { + ANVIL, + ARMOR_STAND, + BEACON, + BED, + BREAK_BLOCKS, + BREEDING, + BREWING, + BUCKET, + CHEST, + CHORUS_FRUIT, + COLLECT_LAVA, + COLLECT_WATER, + CRAFTING, + CROP_TRAMPLE, + DOOR, + EGGS, + ENCHANTING, + ENDER_PEARL, + ENTER_EXIT_MESSAGES, + FIRE, + FIRE_EXTINGUISH, + FIRE_SPREAD, + FURNACE, + GATE, + HURT_MOBS, + HURT_MONSTERS, + ITEM_DROP, + ITEM_PICKUP, + LEASH, + LEVER_BUTTON, + MILKING, + MOB_SPAWN, + MONSTER_SPAWN, + MOUNT_INVENTORY, + MUSIC, + PLACE_BLOCKS, + PORTAL, + PRESSURE_PLATE, + PVP_END, + PVP_NETHER, + PVP_OVERWORLD, + REDSTONE, + RIDING, + SHEARING, + SPAWN_EGGS, + TRADING } diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 4b8620793..f7a414209 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -25,7 +25,7 @@ import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; import us.tastybento.bskyblock.listeners.flags.PortalListener; import us.tastybento.bskyblock.listeners.flags.ShearingListener; import us.tastybento.bskyblock.listeners.flags.TeleportationListener; -import us.tastybento.bskyblock.lists.Flaggs; +import us.tastybento.bskyblock.lists.Flags; public class FlagsManager { @@ -38,7 +38,7 @@ public class FlagsManager { registerFlags(); } - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); public void registerFlag(Flag flag) { //TODO all the security checks @@ -48,11 +48,11 @@ public class FlagsManager { flag.getListener().ifPresent(l -> p.getServer().getPluginManager().registerEvents(l, p)); } - public HashMap getFlags() { + public HashMap getFlags() { return flags; } - public Flag getFlagByID(Flaggs id) { + public Flag getFlagByID(Flags id) { return flags.get(id); } @@ -66,49 +66,49 @@ public class FlagsManager { private void registerFlags() { // Break and place blocks - new FlagBuilder().id(Flaggs.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); - new FlagBuilder().id(Flaggs.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); + new FlagBuilder().id(Flags.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); + new FlagBuilder().id(Flags.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); // Block interactions - all use BlockInteractionListener() - new FlagBuilder().id(Flaggs.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); - new FlagBuilder().id(Flaggs.BEACON).icon(Material.BEACON).build(p); - new FlagBuilder().id(Flaggs.BED).icon(Material.BED).build(p); - new FlagBuilder().id(Flaggs.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); - new FlagBuilder().id(Flaggs.CHEST).icon(Material.CHEST).build(p); - new FlagBuilder().id(Flaggs.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); - new FlagBuilder().id(Flaggs.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); - new FlagBuilder().id(Flaggs.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); - new FlagBuilder().id(Flaggs.FURNACE).icon(Material.FURNACE).build(p); - new FlagBuilder().id(Flaggs.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); - new FlagBuilder().id(Flaggs.MUSIC).icon(Material.JUKEBOX).build(p); - new FlagBuilder().id(Flaggs.LEVER_BUTTON).icon(Material.LEVER).build(p); - new FlagBuilder().id(Flaggs.REDSTONE).icon(Material.REDSTONE).build(p); - new FlagBuilder().id(Flaggs.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); + new FlagBuilder().id(Flags.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); + new FlagBuilder().id(Flags.BEACON).icon(Material.BEACON).build(p); + new FlagBuilder().id(Flags.BED).icon(Material.BED).build(p); + new FlagBuilder().id(Flags.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); + new FlagBuilder().id(Flags.CHEST).icon(Material.CHEST).build(p); + new FlagBuilder().id(Flags.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); + new FlagBuilder().id(Flags.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); + new FlagBuilder().id(Flags.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); + new FlagBuilder().id(Flags.FURNACE).icon(Material.FURNACE).build(p); + new FlagBuilder().id(Flags.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); + new FlagBuilder().id(Flags.MUSIC).icon(Material.JUKEBOX).build(p); + new FlagBuilder().id(Flags.LEVER_BUTTON).icon(Material.LEVER).build(p); + new FlagBuilder().id(Flags.REDSTONE).icon(Material.REDSTONE).build(p); + new FlagBuilder().id(Flags.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); // Entity interactions - new FlagBuilder().id(Flaggs.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); - new FlagBuilder().id(Flaggs.RIDING).icon(Material.GOLD_BARDING).build(p); - new FlagBuilder().id(Flaggs.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); + new FlagBuilder().id(Flags.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); + new FlagBuilder().id(Flags.RIDING).icon(Material.GOLD_BARDING).build(p); + new FlagBuilder().id(Flags.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); // Breeding - new FlagBuilder().id(Flaggs.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); + new FlagBuilder().id(Flags.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); // Buckets. All bucket use is covered by one listener - new FlagBuilder().id(Flaggs.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); - new FlagBuilder().id(Flaggs.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); - new FlagBuilder().id(Flaggs.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); - new FlagBuilder().id(Flaggs.MILKING).icon(Material.MILK_BUCKET).build(p); + new FlagBuilder().id(Flags.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); + new FlagBuilder().id(Flags.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); + new FlagBuilder().id(Flags.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); + new FlagBuilder().id(Flags.MILKING).icon(Material.MILK_BUCKET).build(p); // Chorus Fruit and Enderpearls - new FlagBuilder().id(Flaggs.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); - new FlagBuilder().id(Flaggs.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); + new FlagBuilder().id(Flags.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); + new FlagBuilder().id(Flags.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); // Physical interactions - new FlagBuilder().id(Flaggs.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); - new FlagBuilder().id(Flaggs.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); + new FlagBuilder().id(Flags.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); + new FlagBuilder().id(Flags.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); // Egg throwing - new FlagBuilder().id(Flaggs.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); + new FlagBuilder().id(Flags.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); /* * Fire @@ -120,40 +120,40 @@ public class FlagsManager { * I'll take you to burn * - The Crazy World of Arthur Brown */ - new FlagBuilder().id(Flaggs.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); - new FlagBuilder().id(Flaggs.FIRE_EXTINGUISH).icon(Material.POTION).build(p); - new FlagBuilder().id(Flaggs.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); + new FlagBuilder().id(Flags.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); + new FlagBuilder().id(Flags.FIRE_EXTINGUISH).icon(Material.POTION).build(p); + new FlagBuilder().id(Flags.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); // Inventories - new FlagBuilder().id(Flaggs.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); + new FlagBuilder().id(Flags.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); // Hurting things - new FlagBuilder().id(Flaggs.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); - new FlagBuilder().id(Flaggs.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); + new FlagBuilder().id(Flags.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); + new FlagBuilder().id(Flags.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); // Leashes - new FlagBuilder().id(Flaggs.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); + new FlagBuilder().id(Flags.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); // Portal use protection - new FlagBuilder().id(Flaggs.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); + new FlagBuilder().id(Flags.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); // Shearing - new FlagBuilder().id(Flaggs.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); + new FlagBuilder().id(Flags.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); // Item pickup or drop - new FlagBuilder().id(Flaggs.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); - new FlagBuilder().id(Flaggs.ITEM_PICKUP).icon(Material.DIRT).build(p); + new FlagBuilder().id(Flags.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); + new FlagBuilder().id(Flags.ITEM_PICKUP).icon(Material.DIRT).build(p); /* * Non-protection flags */ // PVP - new FlagBuilder().id(Flaggs.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); - new FlagBuilder().id(Flaggs.PVP_NETHER).icon(Material.IRON_AXE).build(p); - new FlagBuilder().id(Flaggs.PVP_END).icon(Material.END_CRYSTAL).build(p); - new FlagBuilder().id(Flaggs.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); - new FlagBuilder().id(Flaggs.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); - new FlagBuilder().id(Flaggs.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); + new FlagBuilder().id(Flags.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); + new FlagBuilder().id(Flags.PVP_NETHER).icon(Material.IRON_AXE).build(p); + new FlagBuilder().id(Flags.PVP_END).icon(Material.END_CRYSTAL).build(p); + new FlagBuilder().id(Flags.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); + new FlagBuilder().id(Flags.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); + new FlagBuilder().id(Flags.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); } @@ -163,10 +163,15 @@ public class FlagsManager { * @return Flag or null if not known */ public Flag getFlagByID(String key) { - for (Flaggs flag: Flaggs.values()) { + for (Flags flag: Flags.values()) { if (flag.name().equalsIgnoreCase(key)) return this.getFlagByID(flag); } return null; } + public boolean isAllowed(Flags flag) { + if (flags.containsKey(flag)) return flags.get(flag).isAllowed(); + return false; + } + } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 03b024aef..493f2ebaf 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -411,7 +411,7 @@ public class TestBSkyBlock { assertFalse(island.getBanned().contains(member1)); // Protection - new Flags(plugin); + new FlagsManager(plugin); // Check default settings // Owner should be able to do anything assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); From be5404e9c2f12fdea1f3582a73e2cadbe31f3ecb Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 5 Feb 2018 17:39:04 -0800 Subject: [PATCH 25/97] Added Setting type to flags. Flags can be Protection type or Setting Type. Still needs testing for PVP. --- .../tastybento/bskyblock/api/flags/Flag.java | 22 +++- .../bskyblock/api/flags/FlagBuilder.java | 17 ++- .../listeners/flags/AbstractFlagListener.java | 37 ++++-- .../listeners/flags/BreakBlocksListener.java | 2 +- .../listeners/flags/FireListener.java | 8 +- .../listeners/flags/MobSpawnListener.java | 4 +- .../bskyblock/managers/FlagsManager.java | 115 +++++++++--------- src/test/java/bskyblock/TestBSkyBlock.java | 10 +- 8 files changed, 131 insertions(+), 84 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index b0e8feb59..d863271c0 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -4,24 +4,27 @@ import java.util.Optional; import org.bukkit.event.Listener; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.lists.Flags; public class Flag implements Comparable { + public enum FlagType { + PROTECTION, + SETTING + } + private final Flags id; private final PanelItem icon; private final Listener listener; + private final FlagType type; private boolean defaultSetting; - public Flag(BSkyBlock plugin, Flags id2, PanelItem icon, Listener listener, boolean defaultSetting) { + public Flag(Flags id2, PanelItem icon, Listener listener, boolean defaultSetting, FlagType type) { this.id = id2; this.icon = icon; this.listener = listener; - //System.out.println("DEBUG: " + plugin); - //System.out.println("DEBUG: " + plugin.getFlagsManager()); - plugin.getFlagsManager().registerFlag(this); + this.type = type; } public Flags getID() { @@ -36,7 +39,7 @@ public class Flag implements Comparable { return Optional.ofNullable(listener); } - public boolean isAllowed() { + public boolean isDefaultSetting() { return defaultSetting; } @@ -44,6 +47,13 @@ public class Flag implements Comparable { this.defaultSetting = defaultSetting; } + /** + * @return the type + */ + public FlagType getType() { + return type; + } + @Override public int compareTo(Flag o) { return id.compareTo(o.getID()); diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 75a454e7d..aa34b7c2e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -4,7 +4,7 @@ import org.bukkit.Material; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; -import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.flags.Flag.FlagType; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; import us.tastybento.bskyblock.lists.Flags; @@ -15,6 +15,7 @@ public class FlagBuilder { private PanelItem icon; private Listener listener; private boolean defaultSetting; + private FlagType type = FlagType.PROTECTION; public FlagBuilder id(Flags flag) { this.id = flag; @@ -39,8 +40,8 @@ public class FlagBuilder { return this; } - public Flag build(BSkyBlock plugin) { - return new Flag(plugin, id, icon, listener, defaultSetting); + public Flag build() { + return new Flag(id, icon, listener, defaultSetting, type); } /** @@ -52,4 +53,14 @@ public class FlagBuilder { this.defaultSetting = setting; return this; } + + /** + * Set the type of this flag + * @param type {@link FlagType} + * @return FlagBuilder + */ + public FlagBuilder type(FlagType type) { + this.type = type; + return this; + } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index eeaa00224..e6091b6df 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -17,6 +17,7 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.api.flags.Flag.FlagType; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.lists.Flags; @@ -140,6 +141,21 @@ public abstract class AbstractFlagListener implements Listener { * @return true if the check is okay, false if it was disallowed */ public boolean checkIsland(Event e, Location loc, Flags flag, boolean silent) { + // If this is not an Island World, skip + if (!inWorld(loc)) return true; + + // Get the island and if present + Optional island = plugin.getIslands().getIslandAt(loc); + + // Handle Settings Flag + id(flag); + id(flag).getType(); + if (id(flag).getType().equals(FlagType.SETTING)) { + // If the island exists, return the setting, otherwise return the default setting for this flag + return island.map(x -> x.isAllowed(flag)).orElse(isDefaultAllowed(flag)); + } + + // Protection flag // If the user is not set already, try to get it from the event if (user == null) { @@ -151,12 +167,8 @@ public abstract class AbstractFlagListener implements Listener { return false; } } - // If this is not an Island World, skip - if (!inWorld(user)) return true; - - // Get the island and if present, check the flag, react if required and return - Optional island = plugin.getIslands().getIslandAt(loc); - + + if (island.isPresent()) { if (!island.get().isAllowed(user, flag)) { noGo(e, silent); @@ -170,7 +182,7 @@ public abstract class AbstractFlagListener implements Listener { } // The player is in the world, but not on an island, so general world settings apply - if (!isAllowed(flag)) { + if (!isDefaultAllowed(flag)) { noGo(e, silent); user = null; return false; @@ -188,8 +200,13 @@ public abstract class AbstractFlagListener implements Listener { protected Flag id(Flags flag) { return plugin.getFlagsManager().getFlagByID(flag); } - - protected boolean isAllowed(Flags flag) { - return plugin.getFlagsManager().isAllowed(flag); + + /** + * Return the default setting for this flag + * @param flag + * @return + */ + protected boolean isDefaultAllowed(Flags flag) { + return plugin.getFlagsManager().isDefaultAllowed(flag); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index 451fb3d54..4ada274b3 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -107,7 +107,7 @@ public class BreakBlocksListener extends AbstractFlagListener { }); // The player is in the world, but not on an island, so general world settings apply - if (!isAllowed(Flags.BREAK_BLOCKS)) { + if (!isDefaultAllowed(Flags.BREAK_BLOCKS)) { e.setCancelled(true); user.sendMessage("protection.protected"); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index 153dd220c..8a955a01d 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -50,7 +50,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); } /** @@ -69,7 +69,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); } } @@ -92,7 +92,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isAllowed(Flags.FIRE)) e.setCancelled(true); + if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE)) e.setCancelled(true); } @@ -145,7 +145,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isAllowed(Flags.FIRE)) e.setCancelled(true); + if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE)) e.setCancelled(true); // If either of these canceled the event, return if (e.isCancelled()) return; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index 613fbb242..fb97a1f27 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -65,13 +65,13 @@ public class MobSpawnListener extends AbstractFlagListener { } else { // Outside of the island if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { - if (!isAllowed(Flags.MOB_SPAWN)) { + if (!isDefaultAllowed(Flags.MOB_SPAWN)) { // Mobs not allowed to spawn e.setCancelled(true); return; } } else if (e.getEntity() instanceof Animals) { - if (!isAllowed(Flags.MONSTER_SPAWN)) { + if (!isDefaultAllowed(Flags.MONSTER_SPAWN)) { // Mobs not allowed to spawn e.setCancelled(true); return; diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index f7a414209..ddf69aa5e 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -2,10 +2,12 @@ package us.tastybento.bskyblock.managers; import java.util.HashMap; +import org.bukkit.Bukkit; import org.bukkit.Material; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.api.flags.Flag.FlagType; import us.tastybento.bskyblock.api.flags.FlagBuilder; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; @@ -29,23 +31,22 @@ import us.tastybento.bskyblock.lists.Flags; public class FlagsManager { - private BSkyBlock p; + private BSkyBlock plugin; + private HashMap flags = new HashMap<>(); + public FlagsManager(BSkyBlock plugin) { - this.p = plugin; + this.plugin = plugin; // Register flags registerFlags(); } - private HashMap flags = new HashMap<>(); - public void registerFlag(Flag flag) { - //TODO all the security checks - //plugin.getLogger().info("DEBUG: registering flag " + flag.getID()); + //Bukkit.getLogger().info("DEBUG: registering flag " + flag.getID()); flags.put(flag.getID(), flag); // If there is a listener, register it into Bukkit. - flag.getListener().ifPresent(l -> p.getServer().getPluginManager().registerEvents(l, p)); + flag.getListener().ifPresent(l -> Bukkit.getServer().getPluginManager().registerEvents(l, plugin)); } public HashMap getFlags() { @@ -53,6 +54,7 @@ public class FlagsManager { } public Flag getFlagByID(Flags id) { + //Bukkit.getLogger().info("DEBUG: requesting " + id + " flags size = " + flags.size()); return flags.get(id); } @@ -66,49 +68,49 @@ public class FlagsManager { private void registerFlags() { // Break and place blocks - new FlagBuilder().id(Flags.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(p)).build(p); - new FlagBuilder().id(Flags.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(plugin)).build()); // Block interactions - all use BlockInteractionListener() - new FlagBuilder().id(Flags.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(p)).build(p); - new FlagBuilder().id(Flags.BEACON).icon(Material.BEACON).build(p); - new FlagBuilder().id(Flags.BED).icon(Material.BED).build(p); - new FlagBuilder().id(Flags.BREWING).icon(Material.BREWING_STAND_ITEM).build(p); - new FlagBuilder().id(Flags.CHEST).icon(Material.CHEST).build(p); - new FlagBuilder().id(Flags.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build(p); - new FlagBuilder().id(Flags.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build(p); - new FlagBuilder().id(Flags.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(p); - new FlagBuilder().id(Flags.FURNACE).icon(Material.FURNACE).build(p); - new FlagBuilder().id(Flags.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build(p); - new FlagBuilder().id(Flags.MUSIC).icon(Material.JUKEBOX).build(p); - new FlagBuilder().id(Flags.LEVER_BUTTON).icon(Material.LEVER).build(p); - new FlagBuilder().id(Flags.REDSTONE).icon(Material.REDSTONE).build(p); - new FlagBuilder().id(Flags.SPAWN_EGGS).icon(Material.MONSTER_EGG).build(p); + registerFlag(new FlagBuilder().id(Flags.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.BEACON).icon(Material.BEACON).build()); + registerFlag(new FlagBuilder().id(Flags.BED).icon(Material.BED).build()); + registerFlag(new FlagBuilder().id(Flags.BREWING).icon(Material.BREWING_STAND_ITEM).build()); + registerFlag(new FlagBuilder().id(Flags.CHEST).icon(Material.CHEST).build()); + registerFlag(new FlagBuilder().id(Flags.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build()); + registerFlag(new FlagBuilder().id(Flags.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build()); + registerFlag(new FlagBuilder().id(Flags.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build()); + registerFlag(new FlagBuilder().id(Flags.FURNACE).icon(Material.FURNACE).build()); + registerFlag(new FlagBuilder().id(Flags.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build()); + registerFlag(new FlagBuilder().id(Flags.MUSIC).icon(Material.JUKEBOX).build()); + registerFlag(new FlagBuilder().id(Flags.LEVER_BUTTON).icon(Material.LEVER).build()); + registerFlag(new FlagBuilder().id(Flags.REDSTONE).icon(Material.REDSTONE).build()); + registerFlag(new FlagBuilder().id(Flags.SPAWN_EGGS).icon(Material.MONSTER_EGG).build()); // Entity interactions - new FlagBuilder().id(Flags.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(p)).build(p); - new FlagBuilder().id(Flags.RIDING).icon(Material.GOLD_BARDING).build(p); - new FlagBuilder().id(Flags.TRADING).allowedByDefault(true).icon(Material.EMERALD).build(p); + registerFlag(new FlagBuilder().id(Flags.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.RIDING).icon(Material.GOLD_BARDING).build()); + registerFlag(new FlagBuilder().id(Flags.TRADING).allowedByDefault(true).icon(Material.EMERALD).build()); // Breeding - new FlagBuilder().id(Flags.BREEDING).icon(Material.CARROT).listener(new BreedingListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.BREEDING).icon(Material.CARROT).listener(new BreedingListener(plugin)).build()); // Buckets. All bucket use is covered by one listener - new FlagBuilder().id(Flags.BUCKET).icon(Material.BUCKET).listener(new BucketListener(p)).build(p); - new FlagBuilder().id(Flags.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build(p); - new FlagBuilder().id(Flags.COLLECT_WATER).icon(Material.WATER_BUCKET).build(p); - new FlagBuilder().id(Flags.MILKING).icon(Material.MILK_BUCKET).build(p); + registerFlag(new FlagBuilder().id(Flags.BUCKET).icon(Material.BUCKET).listener(new BucketListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build()); + registerFlag(new FlagBuilder().id(Flags.COLLECT_WATER).icon(Material.WATER_BUCKET).build()); + registerFlag(new FlagBuilder().id(Flags.MILKING).icon(Material.MILK_BUCKET).build()); // Chorus Fruit and Enderpearls - new FlagBuilder().id(Flags.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(p)).build(p); - new FlagBuilder().id(Flags.ENDER_PEARL).icon(Material.ENDER_PEARL).build(p); + registerFlag(new FlagBuilder().id(Flags.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.ENDER_PEARL).icon(Material.ENDER_PEARL).build()); // Physical interactions - new FlagBuilder().id(Flags.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(p)).build(p); - new FlagBuilder().id(Flags.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build(p); + registerFlag(new FlagBuilder().id(Flags.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build()); // Egg throwing - new FlagBuilder().id(Flags.EGGS).icon(Material.EGG).listener(new EggListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.EGGS).icon(Material.EGG).listener(new EggListener(plugin)).build()); /* * Fire @@ -120,40 +122,41 @@ public class FlagsManager { * I'll take you to burn * - The Crazy World of Arthur Brown */ - new FlagBuilder().id(Flags.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(p)).build(p); - new FlagBuilder().id(Flags.FIRE_EXTINGUISH).icon(Material.POTION).build(p); - new FlagBuilder().id(Flags.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build(p); + registerFlag(new FlagBuilder().id(Flags.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.FIRE_EXTINGUISH).icon(Material.POTION).build()); + registerFlag(new FlagBuilder().id(Flags.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build()); // Inventories - new FlagBuilder().id(Flags.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(plugin)).build()); // Hurting things - new FlagBuilder().id(Flags.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(p)).build(p); - new FlagBuilder().id(Flags.HURT_MONSTERS).icon(Material.WOOD_SWORD).build(p); + registerFlag(new FlagBuilder().id(Flags.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.HURT_MONSTERS).icon(Material.WOOD_SWORD).build()); // Leashes - new FlagBuilder().id(Flags.LEASH).icon(Material.LEASH).listener(new LeashListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.LEASH).icon(Material.LEASH).listener(new LeashListener(plugin)).build()); // Portal use protection - new FlagBuilder().id(Flags.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(plugin)).build()); // Shearing - new FlagBuilder().id(Flags.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(p)).build(p); + registerFlag(new FlagBuilder().id(Flags.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(plugin)).build()); // Item pickup or drop - new FlagBuilder().id(Flags.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(p)).build(p); - new FlagBuilder().id(Flags.ITEM_PICKUP).icon(Material.DIRT).build(p); + registerFlag(new FlagBuilder().id(Flags.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.ITEM_PICKUP).icon(Material.DIRT).build()); /* - * Non-protection flags + * Settings flags (not protection flags) */ // PVP - new FlagBuilder().id(Flags.PVP_OVERWORLD).icon(Material.ARROW).listener(new PVPListener(p)).build(p); - new FlagBuilder().id(Flags.PVP_NETHER).icon(Material.IRON_AXE).build(p); - new FlagBuilder().id(Flags.PVP_END).icon(Material.END_CRYSTAL).build(p); - new FlagBuilder().id(Flags.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).build(p); - new FlagBuilder().id(Flags.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).build(p); - new FlagBuilder().id(Flags.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).build(p); + registerFlag(new FlagBuilder().id(Flags.PVP_OVERWORLD).icon(Material.ARROW).type(FlagType.SETTING).listener(new PVPListener(plugin)).build()); + registerFlag(new FlagBuilder().id(Flags.PVP_NETHER).icon(Material.IRON_AXE).type(FlagType.SETTING).build()); + registerFlag(new FlagBuilder().id(Flags.PVP_END).icon(Material.END_CRYSTAL).type(FlagType.SETTING).build()); + // Others + registerFlag(new FlagBuilder().id(Flags.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).type(FlagType.SETTING).build()); + registerFlag(new FlagBuilder().id(Flags.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).type(FlagType.SETTING).build()); + registerFlag(new FlagBuilder().id(Flags.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).type(FlagType.SETTING).build()); } @@ -169,8 +172,8 @@ public class FlagsManager { return null; } - public boolean isAllowed(Flags flag) { - if (flags.containsKey(flag)) return flags.get(flag).isAllowed(); + public boolean isDefaultAllowed(Flags flag) { + if (flags.containsKey(flag)) return flags.get(flag).isDefaultSetting(); return false; } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 493f2ebaf..ab9f4f365 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -31,6 +31,7 @@ import org.bukkit.event.Event; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.PluginManager; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -91,6 +92,9 @@ public class TestBSkyBlock { Mockito.when(server.getVersion()).thenReturn("BSB_Mocking"); Bukkit.setServer(server); Mockito.when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); + PluginManager pluginManager = mock(PluginManager.class); + Mockito.when(server.getPluginManager()).thenReturn(pluginManager); + sender = mock(CommandSender.class); player = mock(Player.class); ownerOfIsland = mock(Player.class); @@ -123,7 +127,7 @@ public class TestBSkyBlock { PowerMockito.mockStatic(Flags.class); plugin = Mockito.mock(BSkyBlock.class); - flagsManager = Mockito.mock(FlagsManager.class); + flagsManager = new FlagsManager(plugin); Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); block = Mockito.mock(Block.class); @@ -159,6 +163,7 @@ public class TestBSkyBlock { Settings settings = mock(Settings.class); Mockito.when(plugin.getSettings()).thenReturn(settings); Mockito.when(settings.getFakePlayers()).thenReturn(new HashSet()); + } @Test @@ -411,7 +416,7 @@ public class TestBSkyBlock { assertFalse(island.getBanned().contains(member1)); // Protection - new FlagsManager(plugin); + // Check default settings // Owner should be able to do anything assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); @@ -499,6 +504,7 @@ public class TestBSkyBlock { */ // Now test events + FlagListener fl = new FlagListener(plugin); Bukkit.getLogger().info("SETUP: owner UUID = " + ownerOfIsland.getUniqueId()); Bukkit.getLogger().info("SETUP: member UUID = " + player.getUniqueId()); From ace6294e23df13a2f1cac92c4173b2dabb20f740 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Mon, 5 Feb 2018 23:53:07 -0800 Subject: [PATCH 26/97] Came full circle - kept Flags as final statics This approach simulates an enum, but one that can be extended by others to add custom flags. I added a handy values() method that uses reflection to provide a list of all the flags in the class. See TestBSkyBlock.java test classes for the tests of the default flag registration and the custom flag registration. --- .../tastybento/bskyblock/api/flags/Flag.java | 7 +- .../bskyblock/api/flags/FlagBuilder.java | 17 +- .../bskyblock/database/objects/Island.java | 28 +-- .../objects/adapters/FlagSerializer.java | 2 +- .../listeners/flags/AbstractFlagListener.java | 44 ++--- .../flags/BlockInteractionListener.java | 5 - .../listeners/flags/BreakBlocksListener.java | 7 +- .../listeners/flags/BreedingListener.java | 6 - .../listeners/flags/BucketListener.java | 5 - .../listeners/flags/EggListener.java | 5 - .../flags/EntityInteractListener.java | 5 - .../listeners/flags/FireListener.java | 13 +- .../listeners/flags/HurtingListener.java | 14 +- .../listeners/flags/InventoryListener.java | 5 - .../flags/ItemDropPickUpListener.java | 5 - .../listeners/flags/LeashListener.java | 6 - .../listeners/flags/MobSpawnListener.java | 9 +- .../listeners/flags/PVPListener.java | 16 +- .../flags/PhysicalInteractionListener.java | 5 - .../listeners/flags/PlaceBlocksListener.java | 5 - .../listeners/flags/PortalListener.java | 5 - .../listeners/flags/ShearingListener.java | 5 - .../flags/TeleportationListener.java | 5 - .../us/tastybento/bskyblock/lists/Flags.java | 179 +++++++++++++----- .../bskyblock/managers/FlagsManager.java | 153 ++------------- src/test/java/bskyblock/TestBSkyBlock.java | 86 ++++----- 26 files changed, 255 insertions(+), 387 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index d863271c0..63870174f 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -5,7 +5,6 @@ import java.util.Optional; import org.bukkit.event.Listener; import us.tastybento.bskyblock.api.panels.PanelItem; -import us.tastybento.bskyblock.lists.Flags; public class Flag implements Comparable { @@ -14,20 +13,20 @@ public class Flag implements Comparable { SETTING } - private final Flags id; + private final String id; private final PanelItem icon; private final Listener listener; private final FlagType type; private boolean defaultSetting; - public Flag(Flags id2, PanelItem icon, Listener listener, boolean defaultSetting, FlagType type) { + public Flag(String id2, PanelItem icon, Listener listener, boolean defaultSetting, FlagType type) { this.id = id2; this.icon = icon; this.listener = listener; this.type = type; } - public Flags getID() { + public String getID() { return id; } diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index aa34b7c2e..7d676a83e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -7,18 +7,17 @@ import org.bukkit.inventory.ItemStack; import us.tastybento.bskyblock.api.flags.Flag.FlagType; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.api.panels.builders.PanelItemBuilder; -import us.tastybento.bskyblock.lists.Flags; public class FlagBuilder { - private Flags id; + private String id; private PanelItem icon; private Listener listener; private boolean defaultSetting; private FlagType type = FlagType.PROTECTION; - public FlagBuilder id(Flags flag) { - this.id = flag; + public FlagBuilder id(String string) { + this.id = string; return this; } @@ -63,4 +62,14 @@ public class FlagBuilder { this.type = type; return this; } + + /** + * Set the id of this flag to the name of this enum value + * @param flag + * @return + */ + public FlagBuilder id(Enum flag) { + this.id = flag.name(); + return this; + } } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index d7cd16234..d7661263a 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -21,9 +21,9 @@ 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.IslandUnlockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.Reason; +import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.objects.adapters.Adapter; import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; -import us.tastybento.bskyblock.lists.Flags; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; @@ -82,7 +82,7 @@ public class Island implements DataObject { //// Protection flags //// @Adapter(FlagSerializer.class) - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); private int levelHandicap; private Location spawnPoint; @@ -154,14 +154,14 @@ public class Island implements DataObject { /** * Get the Island Guard flag ranking - * @param flag + * @param breakBlocks * @return flag rank. Players must have at least this rank to bypass this flag */ - public int getFlagReq(Flags flag){ - if(flags.containsKey(flag)) { - return flags.get(flag); + public int getFlagReq(Flag breakBlocks){ + if(flags.containsKey(breakBlocks)) { + return flags.get(breakBlocks); } else { - flags.put(flag, RanksManager.MEMBER_RANK); + flags.put(breakBlocks, RanksManager.MEMBER_RANK); return RanksManager.MEMBER_RANK; } } @@ -169,7 +169,7 @@ public class Island implements DataObject { /** * @return the flags */ - public HashMap getFlags() { + public HashMap getFlags() { return flags; } @@ -414,11 +414,11 @@ public class Island implements DataObject { /** * Check if the flag is allowed or not * For flags that are for the island in general and not related to rank - * @param flag + * @param breakBlocks * @return true if allowed, false if not */ - public boolean isAllowed(Flags flag) { - return this.getFlagReq(flag) >= 0 ? true : false; + public boolean isAllowed(Flag breakBlocks) { + return this.getFlagReq(breakBlocks) >= 0 ? true : false; } /** @@ -427,7 +427,7 @@ public class Island implements DataObject { * @param flag - flag * @return true if allowed, false if not */ - public boolean isAllowed(User user, Flags flag) { + public boolean isAllowed(User user, Flag flag) { //Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); return (this.getRank(user) >= this.getFlagReq(flag)) ? true : false; } @@ -506,14 +506,14 @@ public class Island implements DataObject { * @param flag * @param value - rank value. If the flag applies to the island, a positive number = true, negative = false */ - public void setFlag(Flags flag, int value){ + public void setFlag(Flag flag, int value){ flags.put(flag, value); } /** * @param flags the flags to set */ - public void setFlags(HashMap flags) { + public void setFlags(HashMap flags) { this.flags = flags; } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java index 5cc02aa9a..e4ddb3d48 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java @@ -46,7 +46,7 @@ public class FlagSerializer implements AdapterInterface, return result; HashMap flags = (HashMap)object; for (Entry en: flags.entrySet()) { - result.put(en.getKey().getID().name(), en.getValue()); + result.put(en.getKey().getID(), en.getValue()); } return result; } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index e6091b6df..0300e740b 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -19,7 +19,6 @@ import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.Flag.FlagType; import us.tastybento.bskyblock.database.objects.Island; -import us.tastybento.bskyblock.lists.Flags; /** * Abstract class for flag listeners. Provides common code. @@ -28,14 +27,17 @@ import us.tastybento.bskyblock.lists.Flags; */ public abstract class AbstractFlagListener implements Listener { - public BSkyBlock plugin; + public BSkyBlock plugin = BSkyBlock.getInstance(); private User user = null; - - public AbstractFlagListener(BSkyBlock plugin) { - super(); + + /** + * Used for unit testing only to set the plugin + * @param plugin + */ + public void setPlugin(BSkyBlock plugin) { this.plugin = plugin; } - + /** * Sets the player associated with this event. * If the user is a fake player, they are not counted. @@ -124,11 +126,11 @@ public abstract class AbstractFlagListener implements Listener { * Generic place blocks checker * @param e * @param loc - * @param redstone + * @param breakBlocks * @return true if the check is okay, false if it was disallowed */ - public boolean checkIsland(Event e, Location loc, Flags redstone) { - return checkIsland(e, loc, redstone, false); + public boolean checkIsland(Event e, Location loc, Flag breakBlocks) { + return checkIsland(e, loc, breakBlocks, false); } @@ -140,7 +142,7 @@ public abstract class AbstractFlagListener implements Listener { * @param silent - if true, no attempt is made to tell the user * @return true if the check is okay, false if it was disallowed */ - public boolean checkIsland(Event e, Location loc, Flags flag, boolean silent) { + public boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { // If this is not an Island World, skip if (!inWorld(loc)) return true; @@ -148,11 +150,9 @@ public abstract class AbstractFlagListener implements Listener { Optional island = plugin.getIslands().getIslandAt(loc); // Handle Settings Flag - id(flag); - id(flag).getType(); - if (id(flag).getType().equals(FlagType.SETTING)) { + if (flag.getType().equals(FlagType.SETTING)) { // If the island exists, return the setting, otherwise return the default setting for this flag - return island.map(x -> x.isAllowed(flag)).orElse(isDefaultAllowed(flag)); + return island.map(x -> x.isAllowed(flag)).orElse(flag.isDefaultSetting()); } // Protection flag @@ -182,7 +182,7 @@ public abstract class AbstractFlagListener implements Listener { } // The player is in the world, but not on an island, so general world settings apply - if (!isDefaultAllowed(flag)) { + if (!flag.isDefaultSetting()) { noGo(e, silent); user = null; return false; @@ -194,19 +194,11 @@ public abstract class AbstractFlagListener implements Listener { /** * Get the flag for this ID - * @param flag + * @param id * @return Flag denoted by the id */ - protected Flag id(Flags flag) { - return plugin.getFlagsManager().getFlagByID(flag); + protected Flag id(String id) { + return plugin.getFlagsManager().getFlagByID(id); } - /** - * Return the default setting for this flag - * @param flag - * @return - */ - protected boolean isDefaultAllowed(Flags flag) { - return plugin.getFlagsManager().isDefaultAllowed(flag); - } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index f4bd2fe5f..c63130cc5 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -8,7 +8,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -17,10 +16,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BlockInteractionListener extends AbstractFlagListener { - public BlockInteractionListener(BSkyBlock plugin) { - super(plugin); - } - /** * Handle interaction with blocks * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index 4ada274b3..cc8e23954 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -17,16 +17,11 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.vehicle.VehicleDamageEvent; import org.bukkit.util.BlockIterator; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; public class BreakBlocksListener extends AbstractFlagListener { - public BreakBlocksListener(BSkyBlock plugin) { - super(plugin); - } - /** * Prevents blocks from being broken * @@ -107,7 +102,7 @@ public class BreakBlocksListener extends AbstractFlagListener { }); // The player is in the world, but not on an island, so general world settings apply - if (!isDefaultAllowed(Flags.BREAK_BLOCKS)) { + if (!Flags.BREAK_BLOCKS.isDefaultSetting()) { e.setCancelled(true); user.sendMessage("protection.protected"); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java index 3c6cee3a6..c26b4d997 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java @@ -14,7 +14,6 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -25,11 +24,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BreedingListener extends AbstractFlagListener { - public BreedingListener(BSkyBlock plugin) { - super(plugin); - } - - /** * A list of items that cause breeding if a player has them in their hand and they click an animal * This list may need to be extended with future versions of Minecraft. diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java index d35e16a91..a6accff38 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java @@ -10,7 +10,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -21,10 +20,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class BucketListener extends AbstractFlagListener { - public BucketListener(BSkyBlock plugin) { - super(plugin); - } - /** * Prevents emptying of buckets * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java index 1bf5e5e3b..ceb297d27 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java @@ -7,7 +7,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerEggThrowEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -17,10 +16,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class EggListener extends AbstractFlagListener { - public EggListener(BSkyBlock plugin) { - super(plugin); - } - /** * Handle visitor chicken egg throwing * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java index 61ed0444e..382958aab 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java @@ -12,7 +12,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -23,10 +22,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class EntityInteractListener extends AbstractFlagListener { - public EntityInteractListener(BSkyBlock plugin) { - super(plugin); - } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onPlayerInteract(final PlayerInteractAtEntityEvent e) { if (e.getRightClicked() instanceof ArmorStand) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index 8a955a01d..0fe2e49b3 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -19,7 +19,6 @@ import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.util.BlockIterator; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.lists.Flags; @@ -31,10 +30,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class FireListener extends AbstractFlagListener { - public FireListener(BSkyBlock plugin) { - super(plugin); - } - /** * Prevents fire spread * @param e @@ -50,7 +45,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) e.setCancelled(true); } /** @@ -69,7 +64,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) e.setCancelled(true); } } @@ -92,7 +87,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE)) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) e.setCancelled(true); } @@ -145,7 +140,7 @@ public class FireListener extends AbstractFlagListener { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); // If not on an island, check the default setting - if (!island.isPresent() && !isDefaultAllowed(Flags.FIRE)) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) e.setCancelled(true); // If either of these canceled the event, return if (e.isCancelled()) return; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index 84490f431..d5b753235 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -30,8 +30,8 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.potion.PotionEffect; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; /** @@ -41,10 +41,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class HurtingListener extends AbstractFlagListener { - public HurtingListener(BSkyBlock plugin) { - super(plugin); - } - private HashMap thrownPotions = new HashMap<>(); @@ -68,17 +64,17 @@ public class HurtingListener extends AbstractFlagListener { * Finds the true attacker, even if the attack was via a projectile * @param event * @param damager - * @param flag + * @param hurtMobs */ - private void respond(Event event, Entity damager, Flags flag) { + private void respond(Event event, Entity damager, Flag hurtMobs) { // Get the attacker if (damager instanceof Player) { - setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); + setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), hurtMobs); } else if (damager instanceof Projectile) { // Find out who fired the projectile Projectile p = (Projectile) damager; if (p.getShooter() instanceof Player) { - if (!setUser(User.getInstance((Player)p.getShooter())).checkIsland(event, damager.getLocation(), flag)) { + if (!setUser(User.getInstance((Player)p.getShooter())).checkIsland(event, damager.getLocation(), hurtMobs)) { damager.setFireTicks(0); damager.remove(); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java index c351d7d45..3c1ee775f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java @@ -16,7 +16,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; @@ -27,10 +26,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class InventoryListener extends AbstractFlagListener { - public InventoryListener(BSkyBlock plugin) { - super(plugin); - } - /** * Prevents visitors picking items from inventories * @param e diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index c77dff2ac..e0f8bc848 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -9,7 +9,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.player.PlayerDropItemEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.lists.Flags; @@ -19,10 +18,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class ItemDropPickUpListener extends AbstractFlagListener { - public ItemDropPickUpListener(BSkyBlock plugin) { - super(plugin); - } - /* * Handle item drop by visitors */ diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java index 954f4b6ce..0899842b1 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java @@ -10,7 +10,6 @@ import org.bukkit.event.entity.PlayerLeashEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerUnleashEntityEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -19,11 +18,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class LeashListener extends AbstractFlagListener { - public LeashListener(BSkyBlock plugin) { - super(plugin); - } - - /** * Prevents leashing * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index fb97a1f27..06596a53a 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -13,7 +13,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.lists.Flags; @@ -24,10 +23,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class MobSpawnListener extends AbstractFlagListener { - public MobSpawnListener(BSkyBlock plugin) { - super(plugin); - } - /** * Prevents mobs spawning naturally * @@ -65,13 +60,13 @@ public class MobSpawnListener extends AbstractFlagListener { } else { // Outside of the island if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { - if (!isDefaultAllowed(Flags.MOB_SPAWN)) { + if (!Flags.MOB_SPAWN.isDefaultSetting()) { // Mobs not allowed to spawn e.setCancelled(true); return; } } else if (e.getEntity() instanceof Animals) { - if (!isDefaultAllowed(Flags.MONSTER_SPAWN)) { + if (!Flags.MONSTER_SPAWN.isDefaultSetting()) { // Mobs not allowed to spawn e.setCancelled(true); return; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 4cdb49f79..81a8b57d7 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -20,8 +20,8 @@ import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.potion.PotionEffect; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.lists.Flags; /** @@ -32,10 +32,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PVPListener extends AbstractFlagListener { - public PVPListener(BSkyBlock plugin) { - super(plugin); - } - private HashMap thrownPotions = new HashMap<>(); @@ -48,14 +44,14 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() instanceof Player) { - Flags flag = Flags.PVP_OVERWORLD; + Flag flag = Flags.PVP_OVERWORLD; if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; respond(e, e.getDamager(), flag); } } - private void respond(Event event, Entity damager, Flags flag) { + private void respond(Event event, Entity damager, Flag flag) { // Get the attacker if (damager instanceof Player) { setUser(User.getInstance(damager)).checkIsland(event, damager.getLocation(), flag); @@ -76,7 +72,7 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFishing(PlayerFishEvent e) { if (e.getCaught() != null && e.getCaught() instanceof Player) { - Flags flag = Flags.PVP_OVERWORLD; + Flag flag = Flags.PVP_OVERWORLD; if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; if (checkIsland(e, e.getCaught().getLocation(), flag)) { @@ -93,7 +89,7 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onSplashPotionSplash(final PotionSplashEvent e) { // Deduce the world - Flags flag = Flags.PVP_OVERWORLD; + Flag flag = Flags.PVP_OVERWORLD; if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; @@ -141,7 +137,7 @@ public class PVPListener extends AbstractFlagListener { if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { // Deduce the world - Flags flag = Flags.PVP_OVERWORLD; + Flag flag = Flags.PVP_OVERWORLD; if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java index 28e2af986..77a594f74 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java @@ -8,7 +8,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -17,10 +16,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PhysicalInteractionListener extends AbstractFlagListener { - public PhysicalInteractionListener(BSkyBlock plugin) { - super(plugin); - } - /** * Handle physical interaction with blocks * Crop trample, pressure plates, triggering redstone, tripwires diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index df9970812..83c4d0413 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -10,15 +10,10 @@ import org.bukkit.event.block.EntityBlockFormEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; public class PlaceBlocksListener extends AbstractFlagListener { - public PlaceBlocksListener(BSkyBlock plugin) { - super(plugin); - } - /** * Check blocks being placed in general * diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java index ddf338c5c..e32d870c6 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java @@ -7,7 +7,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerPortalEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -17,10 +16,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class PortalListener extends AbstractFlagListener { - public PortalListener(BSkyBlock plugin) { - super(plugin); - } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onPlayerPortal(PlayerPortalEvent e) { checkIsland(e, e.getFrom(), Flags.PORTAL); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java index 8bcf0bd17..2b404a5cc 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java @@ -7,7 +7,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerShearEntityEvent; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -17,10 +16,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class ShearingListener extends AbstractFlagListener { - public ShearingListener(BSkyBlock plugin) { - super(plugin); - } - // Protect sheep @EventHandler(priority = EventPriority.LOW) public void onShear(final PlayerShearEntityEvent e) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java index 6d3e4fc9f..f9c30e145 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java @@ -8,7 +8,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.lists.Flags; /** @@ -18,10 +17,6 @@ import us.tastybento.bskyblock.lists.Flags; */ public class TeleportationListener extends AbstractFlagListener { - public TeleportationListener(BSkyBlock plugin) { - super(plugin); - } - /** * Ender pearl and chorus fruit teleport checks * diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index e8e7905a5..b357c5dba 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -1,51 +1,136 @@ package us.tastybento.bskyblock.lists; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; -public enum Flags { - ANVIL, - ARMOR_STAND, - BEACON, - BED, - BREAK_BLOCKS, - BREEDING, - BREWING, - BUCKET, - CHEST, - CHORUS_FRUIT, - COLLECT_LAVA, - COLLECT_WATER, - CRAFTING, - CROP_TRAMPLE, - DOOR, - EGGS, - ENCHANTING, - ENDER_PEARL, - ENTER_EXIT_MESSAGES, - FIRE, - FIRE_EXTINGUISH, - FIRE_SPREAD, - FURNACE, - GATE, - HURT_MOBS, - HURT_MONSTERS, - ITEM_DROP, - ITEM_PICKUP, - LEASH, - LEVER_BUTTON, - MILKING, - MOB_SPAWN, - MONSTER_SPAWN, - MOUNT_INVENTORY, - MUSIC, - PLACE_BLOCKS, - PORTAL, - PRESSURE_PLATE, - PVP_END, - PVP_NETHER, - PVP_OVERWORLD, - REDSTONE, - RIDING, - SHEARING, - SPAWN_EGGS, - TRADING +import org.bukkit.Material; + +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.api.flags.Flag.FlagType; +import us.tastybento.bskyblock.api.flags.FlagBuilder; +import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; +import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; +import us.tastybento.bskyblock.listeners.flags.BreedingListener; +import us.tastybento.bskyblock.listeners.flags.BucketListener; +import us.tastybento.bskyblock.listeners.flags.EggListener; +import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; +import us.tastybento.bskyblock.listeners.flags.FireListener; +import us.tastybento.bskyblock.listeners.flags.HurtingListener; +import us.tastybento.bskyblock.listeners.flags.InventoryListener; +import us.tastybento.bskyblock.listeners.flags.ItemDropPickUpListener; +import us.tastybento.bskyblock.listeners.flags.LeashListener; +import us.tastybento.bskyblock.listeners.flags.PVPListener; +import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; +import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; +import us.tastybento.bskyblock.listeners.flags.PortalListener; +import us.tastybento.bskyblock.listeners.flags.ShearingListener; +import us.tastybento.bskyblock.listeners.flags.TeleportationListener; + +public class Flags { + + public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener()).build(); + public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); + + // Block interactions - all use BlockInteractionListener() + public static final Flag ANVIL = new FlagBuilder().id("ANVIL").icon(Material.ANVIL).listener(new BlockInteractionListener()).build(); + public static final Flag BEACON = new FlagBuilder().id("BEACON").icon(Material.BEACON).build(); + public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(); + public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(); + public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(); + public static final Flag DOOR = new FlagBuilder().id("DOOR).allowedByDefault(true").icon(Material.WOODEN_DOOR).build(); + public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING).allowedByDefault(true").icon(Material.WORKBENCH).build(); + public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING).allowedByDefault(true").icon(Material.ENCHANTMENT_TABLE).build(); + public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(); + public static final Flag GATE = new FlagBuilder().id("GATE).allowedByDefault(true").icon(Material.FENCE_GATE).build(); + public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(); + public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(); + public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(); + public static final Flag SPAWN_EGGS = new FlagBuilder().id("SPAWN_EGGS").icon(Material.MONSTER_EGG).build(); + + // Entity interactions + public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); + public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(); + public static final Flag TRADING = new FlagBuilder().id("TRADING).allowedByDefault(true").icon(Material.EMERALD).build(); + + // Breeding + public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener()).build(); + + // Buckets. All bucket use is covered by one listener + public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener()).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 MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); + + // 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 ENDER_PEARL = new FlagBuilder().id("ENDER_PEARL").icon(Material.ENDER_PEARL).build(); + + // Physical interactions + public static final Flag CROP_TRAMPLE = new FlagBuilder().id("CROP_TRAMPLE").icon(Material.WHEAT).listener(new PhysicalInteractionListener()).build(); + public static final Flag PRESSURE_PLATE = new FlagBuilder().id("PRESSURE_PLATE").icon(Material.GOLD_PLATE).build(); + + // Egg throwing + public static final Flag EGGS = new FlagBuilder().id("EGGS").icon(Material.EGG).listener(new EggListener()).build(); + + /* + * Fire + * I'll take you to burn. + * Fire + * I'll take you to learn. + * You gonna burn, burn, burn + * Fire + * I'll take you to burn + * - The Crazy World of Arthur Brown + */ + public static final Flag FIRE = new FlagBuilder().id("FIRE").icon(Material.FLINT_AND_STEEL).listener(new FireListener()).build(); + public static final Flag FIRE_EXTINGUISH = new FlagBuilder().id("FIRE_EXTINGUISH").icon(Material.POTION).build(); + public static final Flag FIRE_SPREAD = new FlagBuilder().id("FIRE_SPREAD").icon(Material.FIREWORK_CHARGE).build(); + + // Inventories + public static final Flag MOUNT_INVENTORY = new FlagBuilder().id("MOUNT_INVENTORY").icon(Material.IRON_BARDING).listener(new InventoryListener()).build(); + + // Hurting things + public static final Flag HURT_MOBS = new FlagBuilder().id("HURT_MOBS").icon(Material.STONE_SWORD).listener(new HurtingListener()).build(); + public static final Flag HURT_MONSTERS = new FlagBuilder().id("HURT_MONSTERS").icon(Material.WOOD_SWORD).build(); + + // Leashes + public static final Flag LEASH = new FlagBuilder().id("LEASH").icon(Material.LEASH).listener(new LeashListener()).build(); + + // Portal use protection + public static final Flag PORTAL = new FlagBuilder().id("PORTAL").icon(Material.OBSIDIAN).listener(new PortalListener()).build(); + + // Shearing + public static final Flag SHEARING = new FlagBuilder().id("SHEARING").icon(Material.SHEARS).listener(new ShearingListener()).build(); + + // Item pickup or drop + public static final Flag ITEM_DROP = new FlagBuilder().id("ITEM_DROP").icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener()).build(); + public static final Flag ITEM_PICKUP = new FlagBuilder().id("ITEM_PICKUP").icon(Material.DIRT).build(); + + /* + * Settings flags (not protection flags) + */ + // PVP + public static final Flag PVP_OVERWORLD = new FlagBuilder().id("PVP_OVERWORLD").icon(Material.ARROW).type(FlagType.SETTING).listener(new PVPListener()).build(); + public static final Flag PVP_NETHER = new FlagBuilder().id("PVP_NETHER").icon(Material.IRON_AXE).type(FlagType.SETTING).build(); + public static final Flag PVP_END = new FlagBuilder().id("PVP_END").icon(Material.END_CRYSTAL).type(FlagType.SETTING).build(); + // Others + public static final Flag ENTER_EXIT_MESSAGES = new FlagBuilder().id("ENTER_EXIT_MESSAGES").icon(Material.DIRT).allowedByDefault(true).type(FlagType.SETTING).build(); + public static final Flag MOB_SPAWN = new FlagBuilder().id("MOB_SPAWN").icon(Material.APPLE).allowedByDefault(true).type(FlagType.SETTING).build(); + public static final Flag MONSTER_SPAWN = new FlagBuilder().id("MONSTER_SPAWN").icon(Material.MOB_SPAWNER).allowedByDefault(true).type(FlagType.SETTING).build(); + + /** + * @return List of all the flags in this class + */ + public static List values() { + return Arrays.asList(Flags.class.getFields()).stream().map(field -> { + try { + return (Flag)field.get(null); + } catch (IllegalArgumentException | IllegalAccessException e) { + + e.printStackTrace(); + } + return null; + }).collect(Collectors.toList()); + } } diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index ddf69aa5e..38d90cefb 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -3,45 +3,31 @@ package us.tastybento.bskyblock.managers; import java.util.HashMap; import org.bukkit.Bukkit; -import org.bukkit.Material; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; -import us.tastybento.bskyblock.api.flags.Flag.FlagType; -import us.tastybento.bskyblock.api.flags.FlagBuilder; import us.tastybento.bskyblock.api.panels.PanelItem; -import us.tastybento.bskyblock.listeners.flags.BlockInteractionListener; -import us.tastybento.bskyblock.listeners.flags.BreakBlocksListener; -import us.tastybento.bskyblock.listeners.flags.BreedingListener; -import us.tastybento.bskyblock.listeners.flags.BucketListener; -import us.tastybento.bskyblock.listeners.flags.EggListener; -import us.tastybento.bskyblock.listeners.flags.EntityInteractListener; -import us.tastybento.bskyblock.listeners.flags.FireListener; -import us.tastybento.bskyblock.listeners.flags.HurtingListener; -import us.tastybento.bskyblock.listeners.flags.InventoryListener; -import us.tastybento.bskyblock.listeners.flags.ItemDropPickUpListener; -import us.tastybento.bskyblock.listeners.flags.LeashListener; -import us.tastybento.bskyblock.listeners.flags.PVPListener; -import us.tastybento.bskyblock.listeners.flags.PhysicalInteractionListener; -import us.tastybento.bskyblock.listeners.flags.PlaceBlocksListener; -import us.tastybento.bskyblock.listeners.flags.PortalListener; -import us.tastybento.bskyblock.listeners.flags.ShearingListener; -import us.tastybento.bskyblock.listeners.flags.TeleportationListener; import us.tastybento.bskyblock.lists.Flags; public class FlagsManager { private BSkyBlock plugin; - private HashMap flags = new HashMap<>(); + private HashMap flags = new HashMap<>(); public FlagsManager(BSkyBlock plugin) { this.plugin = plugin; - // Register flags - registerFlags(); + // Register default flags + for (Flag flag : Flags.values()) { + registerFlag(flag); + } } + /** + * Register a new flag with BSkyBlock + * @param flag + */ public void registerFlag(Flag flag) { //Bukkit.getLogger().info("DEBUG: registering flag " + flag.getID()); flags.put(flag.getID(), flag); @@ -49,11 +35,16 @@ public class FlagsManager { flag.getListener().ifPresent(l -> Bukkit.getServer().getPluginManager().registerEvents(l, plugin)); } - public HashMap getFlags() { + public HashMap getFlags() { return flags; } - public Flag getFlagByID(Flags id) { + /** + * Get flag by string + * @param key - string name same as the enum + * @return Flag or null if not known + */ + public Flag getFlagByID(String id) { //Bukkit.getLogger().info("DEBUG: requesting " + id + " flags size = " + flags.size()); return flags.get(id); } @@ -64,117 +55,5 @@ public class FlagsManager { } return null; } - - private void registerFlags() { - - // Break and place blocks - registerFlag(new FlagBuilder().id(Flags.BREAK_BLOCKS).icon(Material.STONE).listener(new BreakBlocksListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.PLACE_BLOCKS).icon(Material.DIRT).listener(new PlaceBlocksListener(plugin)).build()); - - // Block interactions - all use BlockInteractionListener() - registerFlag(new FlagBuilder().id(Flags.ANVIL).icon(Material.ANVIL).listener(new BlockInteractionListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.BEACON).icon(Material.BEACON).build()); - registerFlag(new FlagBuilder().id(Flags.BED).icon(Material.BED).build()); - registerFlag(new FlagBuilder().id(Flags.BREWING).icon(Material.BREWING_STAND_ITEM).build()); - registerFlag(new FlagBuilder().id(Flags.CHEST).icon(Material.CHEST).build()); - registerFlag(new FlagBuilder().id(Flags.DOOR).allowedByDefault(true).icon(Material.WOODEN_DOOR).build()); - registerFlag(new FlagBuilder().id(Flags.CRAFTING).allowedByDefault(true).icon(Material.WORKBENCH).build()); - registerFlag(new FlagBuilder().id(Flags.ENCHANTING).allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build()); - registerFlag(new FlagBuilder().id(Flags.FURNACE).icon(Material.FURNACE).build()); - registerFlag(new FlagBuilder().id(Flags.GATE).allowedByDefault(true).icon(Material.FENCE_GATE).build()); - registerFlag(new FlagBuilder().id(Flags.MUSIC).icon(Material.JUKEBOX).build()); - registerFlag(new FlagBuilder().id(Flags.LEVER_BUTTON).icon(Material.LEVER).build()); - registerFlag(new FlagBuilder().id(Flags.REDSTONE).icon(Material.REDSTONE).build()); - registerFlag(new FlagBuilder().id(Flags.SPAWN_EGGS).icon(Material.MONSTER_EGG).build()); - - // Entity interactions - registerFlag(new FlagBuilder().id(Flags.ARMOR_STAND).icon(Material.ARMOR_STAND).listener(new EntityInteractListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.RIDING).icon(Material.GOLD_BARDING).build()); - registerFlag(new FlagBuilder().id(Flags.TRADING).allowedByDefault(true).icon(Material.EMERALD).build()); - - // Breeding - registerFlag(new FlagBuilder().id(Flags.BREEDING).icon(Material.CARROT).listener(new BreedingListener(plugin)).build()); - - // Buckets. All bucket use is covered by one listener - registerFlag(new FlagBuilder().id(Flags.BUCKET).icon(Material.BUCKET).listener(new BucketListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.COLLECT_LAVA).icon(Material.LAVA_BUCKET).build()); - registerFlag(new FlagBuilder().id(Flags.COLLECT_WATER).icon(Material.WATER_BUCKET).build()); - registerFlag(new FlagBuilder().id(Flags.MILKING).icon(Material.MILK_BUCKET).build()); - - // Chorus Fruit and Enderpearls - registerFlag(new FlagBuilder().id(Flags.CHORUS_FRUIT).icon(Material.CHORUS_FRUIT).listener(new TeleportationListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.ENDER_PEARL).icon(Material.ENDER_PEARL).build()); - - // Physical interactions - registerFlag(new FlagBuilder().id(Flags.CROP_TRAMPLE).icon(Material.WHEAT).listener(new PhysicalInteractionListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.PRESSURE_PLATE).icon(Material.GOLD_PLATE).build()); - - // Egg throwing - registerFlag(new FlagBuilder().id(Flags.EGGS).icon(Material.EGG).listener(new EggListener(plugin)).build()); - - /* - * Fire - * I'll take you to burn. - * Fire - * I'll take you to learn. - * You gonna burn, burn, burn - * Fire - * I'll take you to burn - * - The Crazy World of Arthur Brown - */ - registerFlag(new FlagBuilder().id(Flags.FIRE).icon(Material.FLINT_AND_STEEL).listener(new FireListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.FIRE_EXTINGUISH).icon(Material.POTION).build()); - registerFlag(new FlagBuilder().id(Flags.FIRE_SPREAD).icon(Material.FIREWORK_CHARGE).build()); - - // Inventories - registerFlag(new FlagBuilder().id(Flags.MOUNT_INVENTORY).icon(Material.IRON_BARDING).listener(new InventoryListener(plugin)).build()); - - // Hurting things - registerFlag(new FlagBuilder().id(Flags.HURT_MOBS).icon(Material.STONE_SWORD).listener(new HurtingListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.HURT_MONSTERS).icon(Material.WOOD_SWORD).build()); - - // Leashes - registerFlag(new FlagBuilder().id(Flags.LEASH).icon(Material.LEASH).listener(new LeashListener(plugin)).build()); - - // Portal use protection - registerFlag(new FlagBuilder().id(Flags.PORTAL).icon(Material.OBSIDIAN).listener(new PortalListener(plugin)).build()); - - // Shearing - registerFlag(new FlagBuilder().id(Flags.SHEARING).icon(Material.SHEARS).listener(new ShearingListener(plugin)).build()); - - // Item pickup or drop - registerFlag(new FlagBuilder().id(Flags.ITEM_DROP).icon(Material.DIRT).allowedByDefault(true).listener(new ItemDropPickUpListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.ITEM_PICKUP).icon(Material.DIRT).build()); - - /* - * Settings flags (not protection flags) - */ - // PVP - registerFlag(new FlagBuilder().id(Flags.PVP_OVERWORLD).icon(Material.ARROW).type(FlagType.SETTING).listener(new PVPListener(plugin)).build()); - registerFlag(new FlagBuilder().id(Flags.PVP_NETHER).icon(Material.IRON_AXE).type(FlagType.SETTING).build()); - registerFlag(new FlagBuilder().id(Flags.PVP_END).icon(Material.END_CRYSTAL).type(FlagType.SETTING).build()); - // Others - registerFlag(new FlagBuilder().id(Flags.ENTER_EXIT_MESSAGES).icon(Material.DIRT).allowedByDefault(true).type(FlagType.SETTING).build()); - registerFlag(new FlagBuilder().id(Flags.MOB_SPAWN).icon(Material.APPLE).allowedByDefault(true).type(FlagType.SETTING).build()); - registerFlag(new FlagBuilder().id(Flags.MONSTER_SPAWN).icon(Material.MOB_SPAWNER).allowedByDefault(true).type(FlagType.SETTING).build()); - - } - - /** - * Get flag by string - * @param key - string name same as the enum - * @return Flag or null if not known - */ - public Flag getFlagByID(String key) { - for (Flags flag: Flags.values()) { - if (flag.name().equalsIgnoreCase(key)) return this.getFlagByID(flag); - } - return null; - } - - public boolean isDefaultAllowed(Flags flag) { - if (flags.containsKey(flag)) return flags.get(flag).isDefaultSetting(); - return false; - } } diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index ab9f4f365..826850731 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -10,6 +10,7 @@ import static org.mockito.Mockito.mock; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -22,6 +23,7 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.block.Block; @@ -48,6 +50,8 @@ import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.events.IslandBaseEvent; import us.tastybento.bskyblock.api.events.team.TeamEvent; +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.api.flags.FlagBuilder; import us.tastybento.bskyblock.database.managers.island.IslandsManager; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.generators.IslandWorld; @@ -462,48 +466,7 @@ public class TestBSkyBlock { @Test public void TestEventProtection() { - - /* - * - * 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. - */ - - // Now test events + // Test events FlagListener fl = new FlagListener(plugin); Bukkit.getLogger().info("SETUP: owner UUID = " + ownerOfIsland.getUniqueId()); @@ -525,11 +488,42 @@ public class TestBSkyBlock { } - private class FlagListener extends AbstractFlagListener { + @Test + public void TestDefaultFlags() { + // Check all the default flags + FlagsManager fm = new FlagsManager(plugin); + Collection defaultFlags = Flags.values(); + Collection f = fm.getFlags().values(); + for (Flag flag : defaultFlags) { + assertTrue(flag.getID(), f.contains(flag)); + } + for (Flag flag : f) { + assertTrue(flag.getID(), defaultFlags.contains(flag)); + } + } - public FlagListener(BSkyBlock plugin) { - super(plugin); - + @Test + public void TestCustomFlags() { + // Custom + FlagListener fl = new FlagListener(plugin); + Flag customFlag = new FlagBuilder().id("CUSTOM_FLAG").icon(Material.DIAMOND).listener(fl).build(); + assertEquals("CUSTOM_FLAG", customFlag.getID()); + assertEquals(Material.DIAMOND, customFlag.getIcon().getItem().getType()); + assertEquals(fl, customFlag.getListener().get()); + // Add it to the Flag Manager + flagsManager.registerFlag(customFlag); + assertEquals(customFlag, flagsManager.getFlagByID("CUSTOM_FLAG")); + assertEquals(customFlag, flagsManager.getFlagByIcon(customFlag.getIcon())); + } + + /** + * Dummy flag listener + * + */ + private class FlagListener extends AbstractFlagListener { + FlagListener(BSkyBlock plugin) { + // Set the plugin explicitly + setPlugin(plugin); } } From 1ddf706c681c7b4b00344764027da7158a0b8360 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:21:08 -0800 Subject: [PATCH 27/97] Bug fixes to avoid NPE's and Optional gets without isPresent --- .../java/us/tastybento/bskyblock/Metrics.java | 4 +- .../bskyblock/api/addons/Addon.java | 50 +++++++++---------- .../api/addons/AddonClassLoader.java | 20 ++++---- .../api/commands/CompositeCommand.java | 6 +-- .../api/commands/DefaultHelpCommand.java | 7 +-- .../bskyblock/commands/AdminCommand.java | 3 +- .../bskyblock/commands/IslandCommand.java | 7 +-- .../island/teams/IslandTeamInviteCommand.java | 6 +-- .../island/teams/IslandTeamKickCommand.java | 3 +- .../teams/IslandTeamSetownerCommand.java | 3 +- .../bskyblock/managers/AddonsManager.java | 2 +- 11 files changed, 52 insertions(+), 59 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/Metrics.java b/src/main/java/us/tastybento/bskyblock/Metrics.java index 555cf2e5d..25be8f7ed 100755 --- a/src/main/java/us/tastybento/bskyblock/Metrics.java +++ b/src/main/java/us/tastybento/bskyblock/Metrics.java @@ -157,7 +157,7 @@ public class Metrics { } }); } - }, 1000*60*5, 1000*60*30); + }, 1000*60*5L, 1000*60*30L); // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! // WARNING: Just don't do it! @@ -283,7 +283,7 @@ public class Metrics { // Compress the data to save bandwidth byte[] compressedData = compress(data.toString()); - + if (compressedData == null) throw new Exception(); // Add headers connection.setRequestMethod("POST"); connection.addRequestProperty("Accept", "application/json"); diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java index b44d2544a..ac774c9fc 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java @@ -157,36 +157,32 @@ public abstract class Addon implements AddonInterface { } jarResource = jarResource.replace('\\', '/'); - InputStream in = null; - try { - JarFile jar = new JarFile(file); + try (JarFile jar = new JarFile(file)) { JarEntry config = jar.getJarEntry(jarResource); if (config != null) { - in = jar.getInputStream(config); + try (InputStream in = jar.getInputStream(config)) { + if (in == null) { + jar.close(); + throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); + } + // There are two options, use the path of the resource or not + File outFile = new File(destinationFolder, jarResource); + if (noPath) { + outFile = new File(destinationFolder, outFile.getName()); + } + // Make any dirs that need to be made + outFile.getParentFile().mkdirs(); + if (DEBUG) { + Bukkit.getLogger().info("DEBUG: outFile = " + outFile.getAbsolutePath()); + Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName()); + } + if (!outFile.exists() || replace) { + java.nio.file.Files.copy(in, outFile.toPath()); + } + } } - if (in == null) { - jar.close(); - throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); - } - - // There are two options, use the path of the resource or not - File outFile = new File(destinationFolder, jarResource); - if (noPath) { - outFile = new File(destinationFolder, outFile.getName()); - } - // Make any dirs that need to be made - outFile.getParentFile().mkdirs(); - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: outFile = " + outFile.getAbsolutePath()); - Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName()); - } - if (!outFile.exists() || replace) { - java.nio.file.Files.copy(in, outFile.toPath()); - } - in.close(); - jar.close(); - } catch (IOException ex) { - ex.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } } diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index e03df0d89..37f77b0ef 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -25,13 +25,17 @@ public class AddonClassLoader extends URLClassLoader { public Addon addon; private AddonsManager loader; - public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, BufferedReader reader, ClassLoader parent) throws InvalidAddonInheritException, MalformedURLException, InvalidAddonFormatException, InvalidDescriptionException { + public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, BufferedReader reader, ClassLoader parent) + throws InvalidAddonInheritException, + MalformedURLException, + InvalidAddonFormatException, + InvalidDescriptionException, + InstantiationException, + IllegalAccessException { super(new URL[]{path.toURI().toURL()}, parent); this.loader = addonsManager; - - Addon addon = null; - + Class javaClass = null; try { //Bukkit.getLogger().info("data " + data.get("main")); @@ -51,15 +55,11 @@ public class AddonClassLoader extends URLClassLoader { Class addonClass; try{ addonClass = javaClass.asSubclass(Addon.class); - }catch(ClassCastException e){ + } catch(ClassCastException e){ throw new InvalidAddonInheritException("Main class doesn't not extends super class 'Addon'"); } - try { - addon = addonClass.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - e.printStackTrace(); - } + Addon addon = addonClass.newInstance(); addon.setDescription(this.asDescription(data)); diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index a165aa1ae..2e080d2ab 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -195,8 +195,8 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi // get the subcommand corresponding to the arg if (subCommand.hasSubCommmands()) { if (DEBUG) - Bukkit.getLogger().info("DEBUG: This command has subcommands"); - if (subCommand.hasSubCommand(args[i])) { + Bukkit.getLogger().info("DEBUG: This command has subcommands"); + if (subCommand.getSubCommand(args[i]).isPresent()) { // Step down one subCommand = subCommand.getSubCommand(args[i]).get(); if (DEBUG) @@ -337,7 +337,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * @param subCommand * @return true if this command has this sub command */ - private boolean hasSubCommand(String subCommand) { + protected boolean hasSubCommand(String subCommand) { return subCommands.containsKey(subCommand) || subCommandAliases.containsKey(subCommand); } diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java index 1fa00bdd5..f11883ceb 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java @@ -74,14 +74,11 @@ public class DefaultHelpCommand extends CompositeCommand { // Ignore the help command if (!subCommand.getLabel().equals("help")) { // Every command should have help because every command has a default help - if (subCommand.getSubCommand("help").isPresent()) { - // This sub-sub command has a help, so use it - subCommand.getSubCommand("help").get().execute(user, Arrays.asList(String.valueOf(newDepth))); - } + subCommand.getSubCommand("help").ifPresent(sub -> execute(user, Arrays.asList(String.valueOf(newDepth)))); } } } - + if (depth == 0) { user.sendMessage("commands.help.end"); } diff --git a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java index c03f35d96..8e77600a8 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java @@ -27,7 +27,8 @@ public class AdminCommand extends CompositeCommand { @Override public boolean execute(User user, List args) { - return this.getSubCommand("help").get().execute(user, args); + // By default run the attached help command, if it exists (it should) + return this.getSubCommand("help").map(help -> execute(user, args)).orElse(false); } } diff --git a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java index 45d0e19f9..612da5d0e 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java @@ -43,11 +43,12 @@ public class IslandCommand extends CompositeCommand { @Override public boolean execute(User user, List args) { + // If this player does not have an island, create one if (!getPlugin().getIslands().hasIsland(user.getUniqueId())) { - return this.getSubCommand("create").get().execute(user, args); + return this.getSubCommand("create").map(command -> execute(user, args)).orElse(false); } - // Currently, just go home - return this.getSubCommand("go").get().execute(user, args); + // Otherwise, currently, just go home + return this.getSubCommand("go").map(command -> execute(user, args)).orElse(false); } } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index e75808dd7..6574e76a2 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -49,10 +49,10 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { if (inviteList.containsKey(playerUUID)) { OfflinePlayer inviter = getPlugin().getServer().getOfflinePlayer(inviteList.get(playerUUID)); user.sendMessage("commands.island.team.invite.name-has-invited-you", "[name]", inviter.getName()); - } else { - this.getSubCommand("help").get().execute(user, args); + return true; } - return true; + // Show help + return this.getSubCommand("help").map(command -> execute(user, args)).orElse(false); } else { // Only online players can be invited UUID invitedPlayerUUID = getPlayers().getUUID(args.get(0)); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java index f3316846f..ce1e49c1e 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java @@ -40,8 +40,7 @@ public class IslandTeamKickCommand extends AbstractIslandTeamCommand { } // If args are not right, show help if (args.size() != 1) { - this.getSubCommand("help").get().execute(user, new ArrayList<>()); - return true; + return this.getSubCommand("help").map(command -> execute(user, new ArrayList<>())).orElse(false); } // Get target UUID targetUUID = getPlayers().getUUID(args.get(0)); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java index 3a5ebc9ce..47f866b2a 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java @@ -41,8 +41,7 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { } // If args are not right, show help if (args.size() != 1) { - this.getSubCommand("help").get().execute(user, new ArrayList<>()); - return true; + return this.getSubCommand("help").map(command -> execute(user, new ArrayList<>())).orElse(false); } //getPlugin().getLogger().info("DEBUG: arg[0] = " + args.get(0)); UUID targetUUID = getPlayers().getUUID(args.get(0)); diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 898db2123..e93718315 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -148,7 +148,7 @@ public final class AddonsManager { // Close the jar jar.close(); - } catch (IOException e) { + } catch (Exception e) { if (DEBUG) { plugin.getLogger().info(f.getName() + "is not a jarfile, ignoring..."); } From f7c4e5a988f101bb51a5d5ec1fc522e7c1160814 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:33:08 -0800 Subject: [PATCH 28/97] Added null checks. --- .../database/flatfile/FlatFileDatabaseHandler.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 3fae3482b..c25cf3d79 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -219,7 +219,12 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { // TODO: this may not work with all keys. Further serialization may be required. Map value = new HashMap(); for (String key : config.getConfigurationSection(storageLocation).getKeys(false)) { + // Keys cannot be null - skip if they exist Object mapKey = deserialize(key,Class.forName(keyType.getTypeName())); + if (mapKey == null) { + continue; + } + // Map values can be null - it is allowed here Object mapValue = deserialize(config.get(storageLocation + "." + key), Class.forName(valueType.getTypeName())); if (DEBUG) { plugin.getLogger().info("DEBUG: mapKey = " + mapKey + " (" + mapKey.getClass().getCanonicalName() + ")"); @@ -460,6 +465,10 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { if (value != null) plugin.getLogger().info("DEBUG: value class is " + value.getClass().getCanonicalName()); } + // If value is already null, then it can be nothing else + if (value == null) { + return null; + } if (value instanceof String && value.equals("null")) { // If the value is null as a string, return null return null; From 84d36a1a242db46973f7e30dffcdcdbb36b672fe Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:35:17 -0800 Subject: [PATCH 29/97] Simplified some logic. --- .../managers/island/IslandsManager.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index e9e4bb2c3..3e09ff60d 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -73,19 +73,19 @@ public class IslandsManager { return false; } // In BSkyBlock, liquid may be unsafe - if (ground.isLiquid() || space1.isLiquid() || space2.isLiquid()) { - // Check if acid has no damage - if (plugin.getSettings().getAcidDamage() > 0D) { - // Bukkit.getLogger().info("DEBUG: acid"); - return false; - } else if (ground.getType().equals(Material.STATIONARY_LAVA) || ground.getType().equals(Material.LAVA) - || space1.getType().equals(Material.STATIONARY_LAVA) || space1.getType().equals(Material.LAVA) - || space2.getType().equals(Material.STATIONARY_LAVA) || space2.getType().equals(Material.LAVA)) { - // Lava check only - // Bukkit.getLogger().info("DEBUG: lava"); - return false; - } + // Check if acid has no damage + if (plugin.getSettings().getAcidDamage() > 0D && (ground.isLiquid() || space1.isLiquid() || space2.isLiquid())) { + // Bukkit.getLogger().info("DEBUG: acid"); + return false; } + if (ground.getType().equals(Material.STATIONARY_LAVA) || ground.getType().equals(Material.LAVA) + || space1.getType().equals(Material.STATIONARY_LAVA) || space1.getType().equals(Material.LAVA) + || space2.getType().equals(Material.STATIONARY_LAVA) || space2.getType().equals(Material.LAVA)) { + // Lava check only + // Bukkit.getLogger().info("DEBUG: lava"); + return false; + } + MaterialData md = ground.getState().getData(); if (md instanceof SimpleAttachableMaterialData) { //Bukkit.getLogger().info("DEBUG: trapdoor/button/tripwire hook etc."); @@ -160,7 +160,7 @@ public class IslandsManager { height = i; depth = i; } else { - + Optional island = getIslandAt(l); if (!island.isPresent()) { return null; @@ -649,7 +649,7 @@ public class IslandsManager { location = getClosestIsland(location); if (islandCache.contains(location)) return true; - + if (!plugin.getSettings().isUseOwnGenerator()) { // Block check if (!location.getBlock().isEmpty() && !location.getBlock().isLiquid()) { @@ -689,7 +689,7 @@ public class IslandsManager { long y = plugin.getSettings().getIslandHeight(); return new Location(location.getWorld(), x, y, z); } - + /** * @param uniqueId * @return true if the player is the owner of their island, i.e., owner or team leader @@ -863,7 +863,7 @@ public class IslandsManager { public boolean playerIsOnIsland(User user, boolean coop) { return locationIsAtHome(user.getUniqueId(), coop, user.getLocation()); } - + /** * @param location */ From 06e61d858c25a9e374787ed0dfc2bbbd15d0eea3 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:52:25 -0800 Subject: [PATCH 30/97] Fixed a lot of unclosed prepared statements, connections and resultset --- .../database/mysql/MySQLDatabaseHandler.java | 187 +++++++++--------- 1 file changed, 96 insertions(+), 91 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 1603d05d2..172693f39 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -164,10 +164,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //plugin.getLogger().info(setSql); // Execute the statement - PreparedStatement collections = connection.prepareStatement(setSql); - if (DEBUG) - plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); - collections.executeUpdate(); + try (PreparedStatement collections = connection.prepareStatement(setSql)) { + if (DEBUG) + plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); + collections.executeUpdate(); + } } } else { // The Java type is not in the hashmap, so we'll just guess that it can be stored in a string @@ -191,7 +192,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } finally { // Close the database properly MySQLDatabaseResourceCloser.close(pstmt); - MySQLDatabaseResourceCloser.close(pstmt); } } @@ -525,7 +525,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } finally { // Close properly - MySQLDatabaseResourceCloser.close(preparedStatement); + MySQLDatabaseResourceCloser.close(connection); MySQLDatabaseResourceCloser.close(preparedStatement); } } @@ -626,18 +626,18 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try { connection = databaseConnecter.createConnection(); String query = "SELECT " + getColumns(false) + " FROM `" + dataObject.getCanonicalName() + "` WHERE uniqueId = ? LIMIT 1"; - PreparedStatement preparedStatement = connection.prepareStatement(query); - preparedStatement.setString(1, uniqueId); - if (DEBUG) - plugin.getLogger().info("DEBUG: load Object query = " + preparedStatement.toString()); - resultSet = preparedStatement.executeQuery(); + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, uniqueId); + if (DEBUG) + plugin.getLogger().info("DEBUG: load Object query = " + preparedStatement.toString()); + resultSet = preparedStatement.executeQuery(); - List result = createObjects(resultSet); - if (!result.isEmpty()) { - return result.get(0); + List result = createObjects(resultSet); + if (!result.isEmpty()) { + return result.get(0); + } } return null; - } finally { MySQLDatabaseResourceCloser.close(resultSet); MySQLDatabaseResourceCloser.close(statement); @@ -708,76 +708,79 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // We will need to fill in the ? later with the unique id of the class from the database setSql += "WHERE uniqueId = ?"; // Prepare the statement - PreparedStatement collStatement = connection.prepareStatement(setSql); - // Set the unique ID - collStatement.setObject(1, uniqueId); - if (DEBUG) - plugin.getLogger().info("DEBUG: collStatement = " + collStatement.toString()); - ResultSet collectionResultSet = collStatement.executeQuery(); - //plugin.getLogger().info("DEBUG: collectionResultSet = " + collectionResultSet.toString()); - // Do single dimension types (set and list) - if (Set.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { + // Set the unique ID + collStatement.setObject(1, uniqueId); if (DEBUG) - plugin.getLogger().info("DEBUG: adding a set"); - // Loop through the collection resultset - // Note that we have no idea what type this is - List collectionTypes = Util.getCollectionParameterTypes(method); - // collectionTypes should be only 1 long - Type setType = collectionTypes.get(0); - value = new HashSet(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); - plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); + plugin.getLogger().info("DEBUG: collStatement = " + collStatement.toString()); + try (ResultSet collectionResultSet = collStatement.executeQuery()) { + + //plugin.getLogger().info("DEBUG: collectionResultSet = " + collectionResultSet.toString()); + // Do single dimension types (set and list) + if (Set.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: adding a set"); + // Loop through the collection resultset + // Note that we have no idea what type this is + List collectionTypes = Util.getCollectionParameterTypes(method); + // collectionTypes should be only 1 long + Type setType = collectionTypes.get(0); + value = new HashSet(); + if (DEBUG) { + plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); + plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); + } + while (collectionResultSet.next()) { + ((Set) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); + } + } else if (List.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: Adding a list "); + // Loop through the collection resultset + // Note that we have no idea what type this is + List collectionTypes = Util.getCollectionParameterTypes(method); + // collectionTypes should be only 1 long + Type setType = collectionTypes.get(0); + value = new ArrayList(); + //plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); + while (collectionResultSet.next()) { + //plugin.getLogger().info("DEBUG: adding to the list"); + //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); + ((List) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); + } + } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || + HashMap.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: Adding a map "); + // Loop through the collection resultset + // Note that we have no idea what type this is + List collectionTypes = Util.getCollectionParameterTypes(method); + // collectionTypes should be 2 long + Type keyType = collectionTypes.get(0); + Type valueType = collectionTypes.get(1); + value = new HashMap(); + if (DEBUG) + plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); + while (collectionResultSet.next()) { + if (DEBUG) + plugin.getLogger().info("DEBUG: adding to the map"); + //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); + // Work through the columns + // Key + Object key = deserialize(collectionResultSet.getObject(1),Class.forName(keyType.getTypeName())); + if (DEBUG) + plugin.getLogger().info("DEBUG: key = " + key); + Object mapValue = deserialize(collectionResultSet.getObject(2),Class.forName(valueType.getTypeName())); + if (DEBUG) + plugin.getLogger().info("DEBUG: value = " + mapValue); + ((Map) value).put(key,mapValue); + } + } else { + // Set value for the main insert. For collections, this is just a dummy value because the real values are in the + // additional table. + value = true; + } } - while (collectionResultSet.next()) { - ((Set) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); - } - } else if (List.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) - plugin.getLogger().info("DEBUG: Adding a list "); - // Loop through the collection resultset - // Note that we have no idea what type this is - List collectionTypes = Util.getCollectionParameterTypes(method); - // collectionTypes should be only 1 long - Type setType = collectionTypes.get(0); - value = new ArrayList(); - //plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); - while (collectionResultSet.next()) { - //plugin.getLogger().info("DEBUG: adding to the list"); - //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); - ((List) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); - } - } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || - HashMap.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) - plugin.getLogger().info("DEBUG: Adding a map "); - // Loop through the collection resultset - // Note that we have no idea what type this is - List collectionTypes = Util.getCollectionParameterTypes(method); - // collectionTypes should be 2 long - Type keyType = collectionTypes.get(0); - Type valueType = collectionTypes.get(1); - value = new HashMap(); - if (DEBUG) - plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); - while (collectionResultSet.next()) { - if (DEBUG) - plugin.getLogger().info("DEBUG: adding to the map"); - //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); - // Work through the columns - // Key - Object key = deserialize(collectionResultSet.getObject(1),Class.forName(keyType.getTypeName())); - if (DEBUG) - plugin.getLogger().info("DEBUG: key = " + key); - Object mapValue = deserialize(collectionResultSet.getObject(2),Class.forName(valueType.getTypeName())); - if (DEBUG) - plugin.getLogger().info("DEBUG: value = " + mapValue); - ((Map) value).put(key,mapValue); - } - } else { - // Set value for the main insert. For collections, this is just a dummy value because the real values are in the - // additional table. - value = true; } } else { if (DEBUG) @@ -905,19 +908,21 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { propertyDescriptor.getPropertyType().equals(HashMap.class) || propertyDescriptor.getPropertyType().equals(ArrayList.class)) { // First substitution is the table name - preparedStatement = connection.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "." + field.getName() + "`")); - // Second is the unique ID - preparedStatement.setString(1, uniqueId); - preparedStatement.addBatch(); - // Execute - if (DEBUG) - plugin.getLogger().info("DEBUG: " + preparedStatement.toString()); - preparedStatement.executeBatch(); + try (PreparedStatement preparedStatement2 = connection.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "." + field.getName() + "`"))) { + // Second is the unique ID + preparedStatement2.setString(1, uniqueId); + preparedStatement2.addBatch(); + // Execute + if (DEBUG) + plugin.getLogger().info("DEBUG: " + preparedStatement2.toString()); + preparedStatement2.executeBatch(); + } } } } finally { // Close properly MySQLDatabaseResourceCloser.close(preparedStatement); + MySQLDatabaseResourceCloser.close(connection); } } From 2c1d52761fff31084b381a129a6949840283f13f Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:54:23 -0800 Subject: [PATCH 31/97] Cast operand to double. --- .../tastybento/bskyblock/generators/ChunkGeneratorWorld.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java index daabe31b2..eab94633b 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java @@ -91,7 +91,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator { } // Next three layers are a mix of netherrack and air for (int y = 5; y < 8; y++) { - double r = gen.noise(x, maxHeight - y, z, 0.5, 0.5); + double r = gen.noise(x, (double)maxHeight - y, z, 0.5, 0.5); if (r > 0D) { result.setBlock(x, (maxHeight - y), z, Material.NETHERRACK); } else { @@ -99,7 +99,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator { } } // Layer 8 may be glowstone - double r = gen.noise(x, maxHeight - 8, z, random.nextFloat(), random.nextFloat()); + double r = gen.noise(x, (double)maxHeight - 8, z, random.nextFloat(), random.nextFloat()); if (r > 0.5D) { // Have blobs of glowstone switch (random.nextInt(4)) { From d2098c3dbebb380927998a1a7c3dcc2aa70f9fda Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 13:59:23 -0800 Subject: [PATCH 32/97] Check if Optional click handler exists before getting it. --- .../bskyblock/listeners/PanelListenerManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java index 9a0879a57..4b32a96bb 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java @@ -38,12 +38,12 @@ public class PanelListenerManager implements Listener { if (slot == event.getRawSlot()) { // Check that they left clicked on it // TODO: in the future, we may want to support right clicking - if (panel.getItems().get(slot).getClickHandler().isPresent()) { - // Cancel the event if true was returned by the ClickHandler - event.setCancelled(panel.getItems().get(slot).getClickHandler().get().onClick(user, ClickType.LEFT)); + panel.getItems().get(slot).getClickHandler().ifPresent(handler -> { + // Execute the handler's onClick method and optionally cancel the event if the handler returns true + event.setCancelled(handler.onClick(user, ClickType.LEFT)); // If there is a listener, then run it. panel.getListener().ifPresent(l -> l.onInventoryClick(user, inventory, event.getCurrentItem())); - } + }); } } } else { From 941d9d3dc581925743a9600f772b36403cf56231 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 14:01:52 -0800 Subject: [PATCH 33/97] Removed if/else change because it is not required. --- .../bskyblock/listeners/flags/HurtingListener.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index d5b753235..338bfa4bb 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -98,7 +98,8 @@ public class HurtingListener extends AbstractFlagListener { e.getHook().remove(); return; } - } else if (e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) { + } + if (e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) { if (checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { e.getHook().remove(); return; @@ -195,7 +196,7 @@ public class HurtingListener extends AbstractFlagListener { checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS); } // Mobs being hurt - else if (entity instanceof Animals || entity instanceof IronGolem || entity instanceof Snowman + if (entity instanceof Animals || entity instanceof IronGolem || entity instanceof Snowman || entity instanceof Villager) { checkIsland(e, entity.getLocation(), Flags.HURT_MONSTERS); } From 8743ac50ef06096c30bb634bc0ceeec9593a6a26 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 14:02:58 -0800 Subject: [PATCH 34/97] Removed duplicate sub-expression in if statement. --- .../tastybento/bskyblock/listeners/flags/MobSpawnListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index 06596a53a..a157ff5da 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -40,7 +40,6 @@ public class MobSpawnListener extends AbstractFlagListener { || e.getSpawnReason().equals(SpawnReason.CHUNK_GEN) || e.getSpawnReason().equals(SpawnReason.DEFAULT) || e.getSpawnReason().equals(SpawnReason.MOUNT) - || e.getSpawnReason().equals(SpawnReason.JOCKEY) || e.getSpawnReason().equals(SpawnReason.NETHER_PORTAL)) { Optional island = plugin.getIslands().getIslandAt(e.getLocation()); if (island.isPresent()) { From 28b88763e67da9ce641512b9c704d774391f4967 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 14:05:48 -0800 Subject: [PATCH 35/97] Changed Optional map to ifPresent because return value is not needed. --- .../bskyblock/listeners/protection/FlyingMobEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java index 50849dc26..883e633eb 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java @@ -86,7 +86,7 @@ public class FlyingMobEvents implements Listener { plugin.getLogger().info("Flying mobs " + e.getEventName()); } // Store where this mob originated - plugin.getIslands().getIslandAt(e.getLocation()).map(island->mobSpawnInfo.put(e.getEntity(),island)); + plugin.getIslands().getIslandAt(e.getLocation()).ifPresent(island->mobSpawnInfo.put(e.getEntity(),island)); } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) From 56ff9f62e488fa1df650ecc6b7a9b574d7193fcb Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 14:07:35 -0800 Subject: [PATCH 36/97] Used try-with-resources to ensure jar is closed. --- .../bskyblock/managers/AddonsManager.java | 89 +++++++++---------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index e93718315..30c34f2d2 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -101,53 +101,52 @@ public final class AddonsManager { if (!f.getName().endsWith(".jar")) { return; } - JarFile jar = new JarFile(f); - - // Obtain the addon.yml file - JarEntry entry = jar.getJarEntry("addon.yml"); - if (entry == null) { - jar.close(); - throw new InvalidAddonFormatException("Addon doesn't contains description file"); + try (JarFile jar = new JarFile(f)) { - } - // Open a reader to the jar - BufferedReader reader = new BufferedReader(new InputStreamReader(jar.getInputStream(entry))); - // Grab the description in the addon.yml file - Map data = this.data(reader); + // Obtain the addon.yml file + JarEntry entry = jar.getJarEntry("addon.yml"); + if (entry == null) { + jar.close(); + throw new InvalidAddonFormatException("Addon doesn't contains description file"); - // Load the addon - AddonClassLoader loader = new AddonClassLoader(this, data, f, reader, this.getClass().getClassLoader()); - // Add to the list of loaders - this.loader.add(loader); - - // Get the addon itself - addon = loader.addon; - // Initialize some settings - addon.setDataFolder(new File(f.getParent(), addon.getDescription().getName())); - addon.setAddonFile(f); - - File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + addon.getDescription().getName()); - // Obtain any locale files and save them - for (String localeFile : listJarYamlFiles(jar, "locales")) { - //plugin.getLogger().info("DEBUG: saving " + localeFile + " from jar"); - addon.saveResource(localeFile, localeDir, false, true); + } + // Open a reader to the jar + BufferedReader reader = new BufferedReader(new InputStreamReader(jar.getInputStream(entry))); + // Grab the description in the addon.yml file + Map data = this.data(reader); + + // Load the addon + AddonClassLoader loader = new AddonClassLoader(this, data, f, reader, this.getClass().getClassLoader()); + // Add to the list of loaders + this.loader.add(loader); + + // Get the addon itself + addon = loader.addon; + // Initialize some settings + addon.setDataFolder(new File(f.getParent(), addon.getDescription().getName())); + addon.setAddonFile(f); + + File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + addon.getDescription().getName()); + // Obtain any locale files and save them + for (String localeFile : listJarYamlFiles(jar, "locales")) { + //plugin.getLogger().info("DEBUG: saving " + localeFile + " from jar"); + addon.saveResource(localeFile, localeDir, false, true); + } + plugin.getLocalesManager().loadLocales(addon.getDescription().getName()); + + // Fire the load event + Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.LOAD).build()); + + // Add it to the list of addons + this.addons.add(addon); + + // Run the onLoad() method + addon.onLoad(); + + // Inform the console + plugin.getLogger().info("Loading BSkyBlock addon " + addon.getDescription().getName() + "..."); } - plugin.getLocalesManager().loadLocales(addon.getDescription().getName()); - - // Fire the load event - Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.LOAD).build()); - - // Add it to the list of addons - this.addons.add(addon); - - // Run the onLoad() method - addon.onLoad(); - - // Inform the console - plugin.getLogger().info("Loading BSkyBlock addon " + addon.getDescription().getName() + "..."); - - // Close the jar - jar.close(); + } catch (Exception e) { if (DEBUG) { plugin.getLogger().info(f.getName() + "is not a jarfile, ignoring..."); @@ -201,7 +200,7 @@ public final class AddonsManager { this.loader = loader; } - + /** * Finds a class by name that has been loaded by this loader * Code copied from Bukkit JavaPluginLoader From 672d43fb67e255b5e1944f12e49fd077a9d1e4ef Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 14:11:10 -0800 Subject: [PATCH 37/97] Fixed unnecessary if statement and removed redundant code. --- .../us/tastybento/bskyblock/util/Util.java | 85 +------------------ 1 file changed, 1 insertion(+), 84 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/util/Util.java b/src/main/java/us/tastybento/bskyblock/util/Util.java index 7334528b0..c8beca68f 100755 --- a/src/main/java/us/tastybento/bskyblock/util/Util.java +++ b/src/main/java/us/tastybento/bskyblock/util/Util.java @@ -247,9 +247,7 @@ public class Util { public static List getOnlinePlayerList(User user) { final List returned = new ArrayList<>(); for (Player p : Bukkit.getServer().getOnlinePlayers()) { - if (user == null) { - returned.add(p.getName()); - } else if (user.getPlayer().canSee(p)) { + if (user == null || user.getPlayer().canSee(p)) { returned.add(p.getName()); } } @@ -327,87 +325,6 @@ public class Util { } - /** - * Checks if this location is safe for a player to teleport to. Used by - * warps and boat exits Unsafe is any liquid or air and also if there's no - * space - * - * @param l - * - Location to be checked - * @return true if safe, otherwise false - */ - public static boolean isSafeLocation(final Location l) { - if (l == null) { - return false; - } - // TODO: improve the safe location finding. - //Bukkit.getLogger().info("DEBUG: " + l.toString()); - final Block ground = l.getBlock().getRelative(BlockFace.DOWN); - final Block space1 = l.getBlock(); - final Block space2 = l.getBlock().getRelative(BlockFace.UP); - //Bukkit.getLogger().info("DEBUG: ground = " + ground.getType()); - //Bukkit.getLogger().info("DEBUG: space 1 = " + space1.getType()); - //Bukkit.getLogger().info("DEBUG: space 2 = " + space2.getType()); - // Portals are not "safe" - if (space1.getType() == Material.PORTAL || ground.getType() == Material.PORTAL || space2.getType() == Material.PORTAL - || space1.getType() == Material.ENDER_PORTAL || ground.getType() == Material.ENDER_PORTAL || space2.getType() == Material.ENDER_PORTAL) { - return false; - } - // If ground is AIR, then this is either not good, or they are on slab, - // stair, etc. - if (ground.getType() == Material.AIR) { - // Bukkit.getLogger().info("DEBUG: air"); - return false; - } - // In ASkyBlock, liquid may be unsafe - if (ground.isLiquid() || space1.isLiquid() || space2.isLiquid()) { - // Check if acid has no damage - if (plugin.getSettings().getAcidDamage() > 0D) { - // Bukkit.getLogger().info("DEBUG: acid"); - return false; - } else if (ground.getType().equals(Material.STATIONARY_LAVA) || ground.getType().equals(Material.LAVA) - || space1.getType().equals(Material.STATIONARY_LAVA) || space1.getType().equals(Material.LAVA) - || space2.getType().equals(Material.STATIONARY_LAVA) || space2.getType().equals(Material.LAVA)) { - // Lava check only - // Bukkit.getLogger().info("DEBUG: lava"); - return false; - } - } - MaterialData md = ground.getState().getData(); - if (md instanceof SimpleAttachableMaterialData) { - //Bukkit.getLogger().info("DEBUG: trapdoor/button/tripwire hook etc."); - if (md instanceof TrapDoor) { - TrapDoor trapDoor = (TrapDoor)md; - if (trapDoor.isOpen()) { - //Bukkit.getLogger().info("DEBUG: trapdoor open"); - return false; - } - } else { - return false; - } - //Bukkit.getLogger().info("DEBUG: trapdoor closed"); - } - if (ground.getType().equals(Material.CACTUS) || ground.getType().equals(Material.BOAT) || ground.getType().equals(Material.FENCE) - || ground.getType().equals(Material.NETHER_FENCE) || ground.getType().equals(Material.SIGN_POST) || ground.getType().equals(Material.WALL_SIGN)) { - // Bukkit.getLogger().info("DEBUG: cactus"); - return false; - } - // Check that the space is not solid - // The isSolid function is not fully accurate (yet) so we have to - // check - // a few other items - // isSolid thinks that PLATEs and SIGNS are solid, but they are not - if (space1.getType().isSolid() && !space1.getType().equals(Material.SIGN_POST) && !space1.getType().equals(Material.WALL_SIGN)) { - return false; - } - if (space2.getType().isSolid()&& !space2.getType().equals(Material.SIGN_POST) && !space2.getType().equals(Material.WALL_SIGN)) { - return false; - } - // Safe - //Bukkit.getLogger().info("DEBUG: safe!"); - return true; - } - /** * Get the maximum value of a numerical perm setting * @param player - the player to check From 1e920825ef5209fbd5517a7c66a1a28ad89ca294 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 15:55:31 -0800 Subject: [PATCH 38/97] Added context to raw stack trace dump after exception. --- src/main/java/us/tastybento/bskyblock/BSkyBlock.java | 4 ++-- .../us/tastybento/bskyblock/api/configuration/ISettings.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 1a9455396..7e022a264 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -57,14 +57,14 @@ public class BSkyBlock extends JavaPlugin { //settings.saveSettings(); settings = settings.loadSettings(); } catch (Exception e) { - e.printStackTrace(); + getLogger().severe("Settings could not be loaded" + e.getMessage()); } // Save a backup of settings to the database so it can be checked next time try { settings.saveBackup(); } catch (Exception e) { - e.printStackTrace(); + getLogger().severe("Settings backup could not be saved" + e.getMessage()); } playersManager = new PlayersManager(this); diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index 82d43387b..f46246535 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -39,7 +39,7 @@ public interface ISettings { // --------------- Loader ------------------ @SuppressWarnings("unchecked") - default T loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException { + default T loadSettings() throws Exception { // See if this settings object already exists in the database AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(this.getClass()); T dbConfig = null; From 7e2f8052da41595d7d192dd28ca75f0963d38e51 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 15:59:42 -0800 Subject: [PATCH 39/97] Improved exception handling error messages. --- src/main/java/us/tastybento/bskyblock/api/addons/Addon.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java index ac774c9fc..b16edd571 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java @@ -101,7 +101,7 @@ public abstract class Addon implements AddonInterface { config = new YamlConfiguration(); config.load(yamlFile); } catch (Exception e) { - e.printStackTrace(); + Bukkit.getLogger().severe("Could not load YAML file: " + file); } } return config; @@ -122,7 +122,7 @@ public abstract class Addon implements AddonInterface { try { this.config.save(new File(dataFolder, ADDON_CONFIG_FILENAME)); } catch (IOException e) { - e.printStackTrace(); + Bukkit.getLogger().severe("Could not save config!"); } } @@ -182,7 +182,7 @@ public abstract class Addon implements AddonInterface { } } } catch (IOException e) { - e.printStackTrace(); + Bukkit.getLogger().severe("Could not save from jar file. From " + jarResource + " to " + destinationFolder.getAbsolutePath()); } } From 04a4394752326747cf038b3892e9f3073679a38b Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 16:04:22 -0800 Subject: [PATCH 40/97] Make addon non-public and provide getter to address minor vulnerability. --- .../bskyblock/api/addons/AddonClassLoader.java | 9 ++++++++- .../us/tastybento/bskyblock/managers/AddonsManager.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index 37f77b0ef..62b1aa9dd 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -22,7 +22,7 @@ import us.tastybento.bskyblock.managers.AddonsManager; public class AddonClassLoader extends URLClassLoader { private final Map> classes = new HashMap>(); - public Addon addon; + private Addon addon; private AddonsManager loader; public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, BufferedReader reader, ClassLoader parent) @@ -115,5 +115,12 @@ public class AddonClassLoader extends URLClassLoader { return result; } + + /** + * @return the addon + */ + public Addon getAddon() { + return addon; + } } diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 30c34f2d2..910ed1273 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -121,7 +121,7 @@ public final class AddonsManager { this.loader.add(loader); // Get the addon itself - addon = loader.addon; + addon = loader.getAddon(); // Initialize some settings addon.setDataFolder(new File(f.getParent(), addon.getDescription().getName())); addon.setAddonFile(f); From 8b7d92d8e6c6d629f1e822296e53c6bf334afe57 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 16:06:04 -0800 Subject: [PATCH 41/97] Added better error message for exception when loading addons. --- .../java/us/tastybento/bskyblock/managers/AddonsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 910ed1273..27be6583d 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -55,7 +55,7 @@ public final class AddonsManager { try { this.loadAddon(file); } catch (InvalidAddonFormatException | InvalidAddonInheritException | InvalidDescriptionException e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not load addon " + file.getName() + " : " + e.getMessage()); } } } From aac17990bcee249f7fe401b073bf2c7d6bd7b79f Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 16:09:49 -0800 Subject: [PATCH 42/97] Made description private. --- .../us/tastybento/bskyblock/api/addons/AddonDescription.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java index 42473922c..b778f8233 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java @@ -81,7 +81,7 @@ public final class AddonDescription { public static class AddonDescriptionBuilder{ - public AddonDescription description; + private AddonDescription description; public AddonDescriptionBuilder(String name){ description = new AddonDescription(); From bb404380f5e5aa8e6cd175aa6c26bef18bbefd9e Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 6 Feb 2018 16:37:34 -0800 Subject: [PATCH 43/97] Replaced raw stack trace dumps with helpful error messages. --- .../commands/island/IslandCreateCommand.java | 3 +- .../commands/island/IslandResetCommand.java | 3 +- .../flatfile/FlatFileDatabaseConnecter.java | 5 ++-- .../flatfile/FlatFileDatabaseHandler.java | 17 ++++++----- .../database/managers/PlayersManager.java | 29 ++++++------------- .../managers/island/IslandsManager.java | 8 ++--- .../mysql/MySQLDatabaseConnecter.java | 4 +-- .../database/mysql/MySQLDatabaseHandler.java | 14 ++++----- 8 files changed, 34 insertions(+), 49 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java index 9073124e5..4cfc976c6 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java @@ -60,9 +60,8 @@ public class IslandCreateCommand extends CompositeCommand { .reason(Reason.CREATE) .build(); } catch (IOException e) { - getPlugin().getLogger().severe("Could not create island for player."); + getPlugin().getLogger().severe("Could not create island for player. " + e.getMessage()); user.sendMessage("commands.island.create.unable-create-island"); - e.printStackTrace(); } } } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java index 242721c65..227e007af 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java @@ -62,9 +62,8 @@ public class IslandResetCommand extends CompositeCommand { .oldIsland(oldIsland) .build(); } catch (IOException e) { - getPlugin().getLogger().severe("Could not create island for player."); + getPlugin().getLogger().severe("Could not create island for player. " + e.getMessage()); user.sendMessage("commands.island.create.unable-create-island"); - e.printStackTrace(); } return true; } diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java index c2243d17f..b3d8c3017 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java @@ -5,6 +5,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; @@ -52,7 +53,7 @@ public class FlatFileDatabaseConnecter implements DatabaseConnecter { config = new YamlConfiguration(); config.load(yamlFile); } catch (Exception e) { - e.printStackTrace(); + Bukkit.getLogger().severe("Could not load yaml file from database " + tableName + " " + fileName + " " + e.getMessage()); } } else { // Create the missing file @@ -93,7 +94,7 @@ public class FlatFileDatabaseConnecter implements DatabaseConnecter { try { yamlConfig.save(file); } catch (Exception e) { - e.printStackTrace(); + Bukkit.getLogger().severe("Could not save yaml file to database " + tableName + " " + fileName + " " + e.getMessage()); } } diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index c25cf3d79..ce547914b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -361,24 +361,23 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { storageLocation = configEntry.path(); } // TODO: add in game-specific saving - + } - + Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { if (DEBUG) plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined - // A conversion adapter has been defined + // A conversion adapter has been defined try { config.set(storageLocation, ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value)); } catch (InstantiationException e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not instatiate adapter " + adapterNotation.value().getName() + " " + e.getMessage()); } // We are done here continue fields; } - + //plugin.getLogger().info("DEBUG: property desc = " + propertyDescriptor.getPropertyType().getTypeName()); // Depending on the vale type, it'll need serializing differenty // Check if this field is the mandatory UniqueId field. This is used to identify this instantiation of the class @@ -503,7 +502,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } catch (Exception e) { // Maybe this value does not exist? // TODO return something? - e.printStackTrace(); + plugin.getLogger().severe("Could not deserialize enum: " + clazz.getCanonicalName() + " " + value); } } return value; @@ -522,7 +521,9 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { File tableFolder = new File(dataFolder, dataObject.getSimpleName()); if (tableFolder.exists()) { File file = new File(tableFolder, fileName); - file.delete(); + if (!file.delete()) { + plugin.getLogger().severe("Could not delete yaml database object! " + file.getName()); + } } } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java index 1c269292f..592b2a7de 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java @@ -31,7 +31,6 @@ public class PlayersManager{ private HashMap playerCache; private Set inTeleport; - private HashMap nameCache; /** * Provides a memory cache of online player information @@ -62,7 +61,7 @@ public class PlayersManager{ playerCache.put(player.getPlayerUUID(), player); } } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not load players from the database!" + e.getMessage()); } } @@ -82,7 +81,7 @@ public class PlayersManager{ try { handler.saveObject(player); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not save player " + player.getPlayerName() + " "+ player.getUniqueId() + " " + e.getMessage()); } } }; @@ -94,7 +93,7 @@ public class PlayersManager{ try { handler.saveObject(player); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not save player " + player.getPlayerName() + " "+ player.getUniqueId() + " " + e.getMessage()); } } } @@ -137,7 +136,7 @@ public class PlayersManager{ try { player = handler.loadObject(playerUUID.toString()); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not load player " + playerUUID + " " + e.getMessage()); } } else { if (DEBUG) @@ -160,26 +159,16 @@ public class PlayersManager{ * */ public void removeOnlinePlayer(final UUID player) { - // plugin.getLogger().info("Removing player from cache: " + player); - if (playerCache.containsKey(player)) { - try { - handler.saveObject(playerCache.get(player)); - playerCache.remove(player); - } catch (IllegalAccessException | IllegalArgumentException - | InvocationTargetException | SecurityException - | InstantiationException | NoSuchMethodException - | IntrospectionException | SQLException e) { - e.printStackTrace(); - } - } + save(player); + playerCache.remove(player); } /** - * Removes all players on the server now from cache and saves their info + * Saves all players on the server and clears the cache */ public void removeAllPlayers() { for (UUID pl : playerCache.keySet()) { - removeOnlinePlayer(pl); + save(pl); } playerCache.clear(); } @@ -597,7 +586,7 @@ public class PlayersManager{ | InvocationTargetException | SecurityException | InstantiationException | NoSuchMethodException | IntrospectionException | SQLException e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not save player to database: " + playerUUID + " " + e.getMessage()); } } else { if (DEBUG) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 3e09ff60d..7bf705ea3 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -271,7 +271,7 @@ public class IslandsManager { try { handler.deleteObject(island); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not delete island from database! " + e.getMessage()); } // Remove blocks from world new DeleteIslandChunks(plugin, island); @@ -716,7 +716,7 @@ public class IslandsManager { islandCache.addIsland(island); } } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not load islands to cache! " + e.getMessage()); } if (DEBUG) plugin.getLogger().info("DEBUG: islands loaded"); @@ -930,7 +930,7 @@ public class IslandsManager { try { handler.saveObject(island); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not save island to datavase when running async! " + e.getMessage()); } } }; @@ -943,7 +943,7 @@ public class IslandsManager { try { handler.saveObject(island); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not save island to datavase when running sync! " + e.getMessage()); } } } diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseConnecter.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseConnecter.java index 1bf9df8b3..0ef6436ca 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseConnecter.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseConnecter.java @@ -4,6 +4,7 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import us.tastybento.bskyblock.database.DatabaseConnecter; @@ -24,8 +25,7 @@ public class MySQLDatabaseConnecter implements DatabaseConnecter { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); + Bukkit.getLogger().severe("Could not instantiate JDBC driver! " + e.getMessage()); } // jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false connectionUrl = "jdbc:mysql://" + dbSettings.getHost() + "/" + dbSettings.getDatabaseName() + "?autoReconnect=true&useSSL=false&allowMultiQueries=true"; diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 172693f39..cdac63e6b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -113,10 +113,8 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Check if the table exists in the database and if not, create it try { createSchema(); - } catch (IntrospectionException e) { - e.printStackTrace(); - } catch (SQLException e) { - e.printStackTrace(); + } catch (IntrospectionException | SQLException e) { + plugin.getLogger().severe("Could not create database schema! " + e.getMessage()); } } @@ -188,7 +186,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { plugin.getLogger().info("DEBUG: pstmt = " + pstmt.toString()); pstmt.executeUpdate(); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not create database schema! " + e.getMessage()); } finally { // Close the database properly MySQLDatabaseResourceCloser.close(pstmt); @@ -858,9 +856,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Class enumClass = (Class)clazz; value = Enum.valueOf(enumClass, (String)value); } catch (Exception e) { - // Maybe this value does not exist? - // TODO return something? - e.printStackTrace(); + plugin.getLogger().severe("Could not deserialize enum! " + e.getMessage()); } } return value; @@ -952,7 +948,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { return resultSet.getBoolean(1); } } catch (SQLException e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not check if key exists in database! " + key + " " + e.getMessage()); } finally { MySQLDatabaseResourceCloser.close(resultSet); MySQLDatabaseResourceCloser.close(preparedStatement); From ed622dc9c009d7622167aef045668beef3687416 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:30:35 -0800 Subject: [PATCH 44/97] Fixed switch break bug. --- .../us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java index eab94633b..7369d523c 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java @@ -118,6 +118,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator { for (int i = 0; i < random.nextInt(10); i++) { result.setBlock(x, (maxHeight - 8 - i), z, Material.GLOWSTONE); } + break; case 3: result.setBlock(x, (maxHeight - 8), z, Material.GLOWSTONE); if (x > 3 && z > 3) { From 5a5ae2d07756a3c5b2c2d1afcd760e76f8c176f3 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:30:56 -0800 Subject: [PATCH 45/97] Used Java standard ordering of words --- .../java/us/tastybento/bskyblock/Constants.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/Constants.java b/src/main/java/us/tastybento/bskyblock/Constants.java index cb41fd8b4..1d12b6247 100644 --- a/src/main/java/us/tastybento/bskyblock/Constants.java +++ b/src/main/java/us/tastybento/bskyblock/Constants.java @@ -11,23 +11,23 @@ public class Constants { BSKYBLOCK, ACIDISLAND, BOTH } /* - public final static GameType GAMETYPE = GameType.ACIDISLAND; + public static final GameType GAMETYPE = GameType.ACIDISLAND; // The spawn command (Essentials spawn for example) - public final static String SPAWNCOMMAND = "spawn"; + public static final String SPAWNCOMMAND = "spawn"; // Permission prefix - public final static String PERMPREFIX = "acidisland."; + public static final String PERMPREFIX = "acidisland."; // The island command - public final static String ISLANDCOMMAND = "ai"; + public static final String ISLANDCOMMAND = "ai"; // Admin command public static final String ADMINCOMMAND = "acid"; */ - public final static GameType GAMETYPE = GameType.BSKYBLOCK; + public static final GameType GAMETYPE = GameType.BSKYBLOCK; // Permission prefix - public final static String PERMPREFIX = "bskyblock."; + public static final String PERMPREFIX = "bskyblock."; // The island command - public final static String ISLANDCOMMAND = "island"; + public static final String ISLANDCOMMAND = "island"; // The spawn command (Essentials spawn for example) - public final static String SPAWNCOMMAND = "spawn"; + public static final String SPAWNCOMMAND = "spawn"; // Admin command public static final String ADMINCOMMAND = "bsadmin"; From 2d64070d3fefaec91f535f91c51ff2235a0a5b44 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:31:19 -0800 Subject: [PATCH 46/97] Avoided setting static variable in non-static method. --- src/main/java/us/tastybento/bskyblock/BSkyBlock.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 7e022a264..966641d99 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -49,8 +49,8 @@ public class BSkyBlock extends JavaPlugin { public void onEnable(){ // Save the default config from config.yml saveDefaultConfig(); - plugin = this; - + setInstance(this); + settings = new Settings(); // Load settings from config.yml. This will check if there are any issues with it too. try { @@ -184,6 +184,10 @@ public class BSkyBlock extends JavaPlugin { return islandsManager; } + private static void setInstance(BSkyBlock plugin) { + BSkyBlock.plugin = plugin; + } + public static BSkyBlock getInstance() { return plugin; } From fdc7a62990505658456583ed2cc5832ce89dc4b7 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:31:59 -0800 Subject: [PATCH 47/97] Fixed issue where Optional was not being explicitly checked before get. --- .../api/commands/CompositeCommand.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index 2e080d2ab..5f3eb0e22 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -173,7 +173,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi if (event.isCancelled()) { return true; } - + // Execute and trim args return cmd.execute(user, Arrays.asList(args).subList(cmd.subCommandLevel, args.length)); } @@ -195,17 +195,17 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi // get the subcommand corresponding to the arg if (subCommand.hasSubCommmands()) { if (DEBUG) - Bukkit.getLogger().info("DEBUG: This command has subcommands"); - if (subCommand.getSubCommand(args[i]).isPresent()) { - // Step down one - subCommand = subCommand.getSubCommand(args[i]).get(); - if (DEBUG) - Bukkit.getLogger().info("DEBUG: Moved to " + subCommand.getLabel()); - // Set the label - subCommand.setLabel(args[i]); - } else { + Bukkit.getLogger().info("DEBUG: This command has subcommands"); + Optional sub = subCommand.getSubCommand(args[i]); + if (!sub.isPresent()) { return subCommand; } + // Step down one + subCommand = sub.orElse(subCommand); + if (DEBUG) + Bukkit.getLogger().info("DEBUG: Moved to " + subCommand.getLabel()); + // Set the label + subCommand.setLabel(args[i]); } else { // We are at the end of the walk if (DEBUG) From 2e89a2654fe470d8faaac7d0ee425c60a2e82631 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:33:05 -0800 Subject: [PATCH 48/97] Added more try-with-resource to auto-close prepared statement --- .../database/mysql/MySQLDatabaseHandler.java | 114 +++++++++--------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index cdac63e6b..103f88f28 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -440,11 +440,12 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Collection // The table is cleared for this uniqueId every time the data is stored String clearTableSql = "DELETE FROM `" + dataObject.getCanonicalName() + "." + field.getName() + "` WHERE uniqueId = ?"; - PreparedStatement collStatement = connection.prepareStatement(clearTableSql); - collStatement.setString(1, uniqueId); - collStatement.execute(); - if (DEBUG) - plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); + try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql)) { + collStatement.setString(1, uniqueId); + collStatement.execute(); + if (DEBUG) + plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); + } // Insert into the table String setSql = "INSERT INTO `" + dataObject.getCanonicalName() + "." + field.getName() + "` (uniqueId, "; // Get the columns we are going to insert, just the names of them @@ -452,60 +453,61 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Get all the ?'s for the columns setSql += "VALUES ('" + uniqueId + "'," + getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false) + ")"; // Prepare the statement - collStatement = connection.prepareStatement(setSql); - if (DEBUG) - plugin.getLogger().info("DEBUG: collection insert =" + setSql); - // Do single dimension types (set and list) - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - //plugin.getLogger().info("DEBUG: set class for "); - // Loop through the set or list - // Note that we have no idea what type this is - Collection collection = (Collection)value; - Iterator it = collection.iterator(); - while (it.hasNext()) { - Object setValue = it.next(); - //if (setValue instanceof UUID) { - // Serialize everything - setValue = serialize(setValue, setValue.getClass()); - //} - // Set the value from ? to whatever it is - collStatement.setObject(1, setValue); - if (DEBUG) - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - // Execute the SQL in the database - collStatement.execute(); - } - } else if (propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class)) { - // Loop through the map - Map collection = (Map)value; - Iterator it = collection.entrySet().iterator(); - while (it.hasNext()) { - Entry en = (Entry) it.next(); - if (DEBUG) - plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); + try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { + if (DEBUG) + plugin.getLogger().info("DEBUG: collection insert =" + setSql); + // Do single dimension types (set and list) + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + //plugin.getLogger().info("DEBUG: set class for "); + // Loop through the set or list + // Note that we have no idea what type this is + Collection collection = (Collection)value; + Iterator it = collection.iterator(); + while (it.hasNext()) { + Object setValue = it.next(); + //if (setValue instanceof UUID) { + // Serialize everything + setValue = serialize(setValue, setValue.getClass()); + //} + // Set the value from ? to whatever it is + collStatement.setObject(1, setValue); + if (DEBUG) + plugin.getLogger().info("DEBUG: " + collStatement.toString()); + // Execute the SQL in the database + collStatement.execute(); + } + } else if (propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class)) { + // Loop through the map + Map collection = (Map)value; + Iterator it = collection.entrySet().iterator(); + while (it.hasNext()) { + Entry en = (Entry) it.next(); + if (DEBUG) + plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); - // Get the key and serialize it - Object key = serialize(en.getKey(), en.getKey().getClass()); - if (DEBUG) - plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); - // Get the value and serialize it - Object mapValue = serialize(en.getValue(), en.getValue().getClass()); - if (DEBUG) - plugin.getLogger().info("DEBUG: mapValue = " + mapValue); - // Write the objects into prepared statement - collStatement.setObject(1, key); - collStatement.setObject(2, mapValue); - if (DEBUG) - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - // Write to database - collStatement.execute(); + // Get the key and serialize it + Object key = serialize(en.getKey(), en.getKey().getClass()); + if (DEBUG) + plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); + // Get the value and serialize it + Object mapValue = serialize(en.getValue(), en.getValue().getClass()); + if (DEBUG) + plugin.getLogger().info("DEBUG: mapValue = " + mapValue); + // Write the objects into prepared statement + collStatement.setObject(1, key); + collStatement.setObject(2, mapValue); + if (DEBUG) + plugin.getLogger().info("DEBUG: " + collStatement.toString()); + // Write to database + collStatement.execute(); + } } + // Set value for the main insert. For collections, this is just a dummy value because the real values are in the + // additional table. + value = true; } - // Set value for the main insert. For collections, this is just a dummy value because the real values are in the - // additional table. - value = true; } else { // If the value is not a collection, it just needs to be serialized to go into the database. value = serialize(value, propertyDescriptor.getPropertyType()); From 574febb327d2b46e1e08ac4f42beac3ce0182305 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:34:20 -0800 Subject: [PATCH 49/97] Added missing break statement in switch. --- .../bskyblock/listeners/flags/BlockInteractionListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index c63130cc5..13e508080 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -129,6 +129,7 @@ public class BlockInteractionListener extends AbstractFlagListener { break; case MONSTER_EGG: checkIsland(e, e.getClickedBlock().getLocation(), Flags.SPAWN_EGGS); + break; default: break; From 81b0543f25489291b49b087cfe3f03e888fdb41c Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:34:48 -0800 Subject: [PATCH 50/97] Added missing break statement to switch. --- .../bskyblock/listeners/flags/BreakBlocksListener.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index cc8e23954..9c9bf9a11 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -78,6 +78,7 @@ public class BreakBlocksListener extends AbstractFlagListener { // Prevent explosions checkIsland(e, e.getClickedBlock().getLocation(), Flags.BREAK_BLOCKS); return; } + break; default: break; } From f4c7a3fe451613521718166620a6bec0b6f2013f Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:40:29 -0800 Subject: [PATCH 51/97] Made command return false if unsuccessful. --- .../bskyblock/commands/admin/AdminTeleportCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java index 7b0d14113..baf5069fa 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java @@ -34,7 +34,7 @@ public class AdminTeleportCommand extends CompositeCommand { final UUID targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("errors.unknown-player"); - return true; + return false; } else { if (getPlayers().hasIsland(targetUUID) || getPlayers().inTeam(targetUUID)) { Location warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getIslandWorld()); @@ -50,7 +50,7 @@ public class AdminTeleportCommand extends CompositeCommand { return true; } user.sendMessage("command.admin.tp.no-island"); - return true; + return false; } } From 219d1e66abf1f33dc7b258a5a09de0fd73584226 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:43:31 -0800 Subject: [PATCH 52/97] Fixed brackets. --- .../api/commands/CompositeCommand.java | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index 5f3eb0e22..daf5e72a4 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -78,9 +78,9 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi this.subCommands = new LinkedHashMap<>(); this.subCommandAliases = new LinkedHashMap<>(); this.setup(); - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) + if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); - + } } @@ -106,11 +106,12 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi setUsage(""); this.setup(); // If this command does not define its own help class, then use the default help command - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) + if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); - - if (DEBUG) + } + if (DEBUG) { Bukkit.getLogger().info("DEBUG: registering command " + label); + } } /** @@ -120,8 +121,9 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi */ public CompositeCommand(String label, String... aliases) { super(label); - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: top level command registering..." + label); + } this.setAliases(new ArrayList<>(Arrays.asList(aliases))); this.parent = null; setUsage(""); @@ -133,9 +135,9 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi getPlugin().getCommandsManager().registerCommand(this); } this.setup(); - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) + if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); - + } } @@ -145,8 +147,9 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi */ @Override public boolean execute(CommandSender sender, String label, String[] args) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: executing command " + label); + } // Get the User instance for this sender User user = User.getInstance(sender); CompositeCommand cmd = getCommandFromArgs(args); @@ -186,30 +189,35 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi private CompositeCommand getCommandFromArgs(String[] args) { CompositeCommand subCommand = this; // Run through any arguments - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: Running through args: " + Arrays.asList(args).toString()); + } if (args.length > 0) { for (int i = 0; i < args.length; i++) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: Argument " + i); + } // get the subcommand corresponding to the arg if (subCommand.hasSubCommmands()) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: This command has subcommands"); + } Optional sub = subCommand.getSubCommand(args[i]); if (!sub.isPresent()) { return subCommand; } // Step down one subCommand = sub.orElse(subCommand); - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: Moved to " + subCommand.getLabel()); + } // Set the label subCommand.setLabel(args[i]); } else { // We are at the end of the walk - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: End of traversal"); + } return subCommand; } // else continue the loop @@ -294,17 +302,20 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi * @return CompositeCommand or null if none found */ public Optional getSubCommand(String label) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: label = " + label); + } for (Map.Entry entry : subCommands.entrySet()) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: " + entry.getKey()); + } if (entry.getKey().equalsIgnoreCase(label)) return Optional.of(subCommands.get(label)); } // Try aliases for (Map.Entry entry : subCommandAliases.entrySet()) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: alias " + entry.getKey()); + } if (entry.getKey().equalsIgnoreCase(label)) return Optional.of(subCommandAliases.get(label)); } return Optional.empty(); @@ -422,13 +433,15 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi } // Check for console and permissions if (cmd.onlyPlayer && !(sender instanceof Player)) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: returning, only for player"); + } return options; } if (!cmd.getPermission().isEmpty() && !sender.hasPermission(cmd.getPermission())) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: failed perm check"); + } return options; } // Add any tab completion from the subcommand From 3e2d2ec2d6bd9de07843b9e77106667abf8e2822 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:44:40 -0800 Subject: [PATCH 53/97] Return false if unsuccessful due to no island. --- .../tastybento/bskyblock/commands/island/IslandGoCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java index 3b9fd0549..afe4090fa 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java @@ -39,7 +39,7 @@ public class IslandGoCommand extends CompositeCommand { public boolean execute(User user, List args) { if (!getIslands().hasIsland(user.getUniqueId())) { user.sendMessage(ChatColor.RED + "general.errors.no-island"); - return true; + return false; } if (!args.isEmpty() && NumberUtils.isDigits(args.get(0))) { int homeValue = Integer.valueOf(args.get(0)); From 00470b1fc8f3ae3597f0421f6b4159d5837f33a6 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:45:10 -0800 Subject: [PATCH 54/97] Return false if error. --- .../bskyblock/commands/island/IslandResetnameCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java index 077b0afd0..d3b298e0c 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java @@ -37,12 +37,12 @@ public class IslandResetnameCommand extends CompositeCommand { if (!getIslands().hasIsland(playerUUID)) { user.sendMessage("general.errors.no-island"); - return true; + return false; } if (!getIslands().isOwner(playerUUID)) { user.sendMessage("general.errors.not-leader"); - return true; + return false; } // Resets the island name getIslands().getIsland(playerUUID).setName(null); From a9373a3eea3393788035157e629dfab59361d05f Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:46:59 -0800 Subject: [PATCH 55/97] Fixed return values - false = error --- .../bskyblock/commands/island/IslandSethomeCommand.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java index d79f8a597..08fb0c471 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java @@ -28,11 +28,11 @@ public class IslandSethomeCommand extends CompositeCommand { // Check island if (getPlugin().getIslands().getIsland(user.getUniqueId()) == null) { user.sendMessage("general.errors.no-island"); - return true; + return false; } if (!getPlugin().getIslands().playerIsOnIsland(user)) { user.sendMessage("commands.island.sethome.must-be-on-your-island"); - return true; + return false; } if (args.isEmpty()) { // island sethome @@ -48,15 +48,18 @@ public class IslandSethomeCommand extends CompositeCommand { number = Integer.valueOf(args.get(0)); if (number < 1 || number > maxHomes) { user.sendMessage("commands.island.sethome.num-homes", "[max]", String.valueOf(maxHomes)); + return false; } else { getPlugin().getPlayers().setHomeLocation(playerUUID, user.getLocation(), number); user.sendMessage("commands.island.sethome.home-set"); } } catch (Exception e) { user.sendMessage("commands.island.sethome.num-homes", "[max]", String.valueOf(maxHomes)); + return false; } } else { user.sendMessage("general.errors.no-permission"); + return false; } } return true; From af5c7e472ed1f564eb09c3e2978f9038029ea1cb Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:48:59 -0800 Subject: [PATCH 56/97] Fixed execute return values. --- .../commands/island/IslandSetnameCommand.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java index a58b5c9c0..e79c6ecae 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java @@ -42,17 +42,17 @@ public class IslandSetnameCommand extends CompositeCommand { if (!getIslands().hasIsland(playerUUID)) { user.sendMessage("general.errors.no-island"); - return true; + return false; } if (!getIslands().isOwner(playerUUID)) { user.sendMessage("general.errors.not-leader"); - return true; + return false; } // Explain command if (args.isEmpty()) { - user.sendMessage(getUsage()); - return true; + this.getSubCommand("help").ifPresent(help -> help.execute(user, args)); + return false; } // Naming the island - join all the arguments with spaces. @@ -61,11 +61,11 @@ public class IslandSetnameCommand extends CompositeCommand { // Check if the name isn't too short or too long if (name.length() < getSettings().getNameMinLength()) { user.sendMessage("commands.island.setname.too-short", "[length]", String.valueOf(getSettings().getNameMinLength())); - return true; + return false; } if (name.length() > getSettings().getNameMaxLength()) { user.sendMessage("commands.island.setname.too-long", "[length]", String.valueOf(getSettings().getNameMaxLength())); - return true; + return false; } // Set the name From eefcd48c7c0f81d14ed3db81653c64dd3d279022 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:57:45 -0800 Subject: [PATCH 57/97] Fixed return values for execute. --- .../island/teams/IslandTeamInviteCommand.java | 24 +++++++++---------- .../teams/IslandTeamInviteRejectCommand.java | 3 ++- .../island/teams/IslandTeamLeaveCommand.java | 9 +++---- .../teams/IslandTeamSetownerCommand.java | 15 ++++++------ 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index 6574e76a2..f5d4b05f5 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -37,12 +37,11 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { public boolean execute(User user, List args) { UUID playerUUID = user.getUniqueId(); // Player issuing the command must have an island - if (!getPlayers().hasIsland(playerUUID)) { - // If the player is in a team, they are not the leader - if (getPlayers().inTeam(playerUUID)) { - user.sendMessage("general.errors.not-leader"); - } - user.sendMessage("general.errors.no-island"); + boolean inTeam = getPlugin().getPlayers().inTeam(playerUUID); + UUID teamLeaderUUID = getPlugin().getIslands().getTeamLeader(playerUUID); + if (!(inTeam && teamLeaderUUID.equals(playerUUID))) { + user.sendMessage("general.errors.not-leader"); + return false; } if (args.isEmpty() || args.size() > 1) { // Invite label with no name, i.e., /island invite - tells the player who has invited them so far @@ -58,29 +57,29 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { UUID invitedPlayerUUID = getPlayers().getUUID(args.get(0)); if (invitedPlayerUUID == null) { user.sendMessage("general.errors.offline-player"); - return true; + return false; } User invitedPlayer = User.getInstance(invitedPlayerUUID); if (!invitedPlayer.isOnline()) { user.sendMessage("general.errors.offline-player"); - return true; + return false; } // Player cannot invite themselves if (playerUUID.equals(invitedPlayerUUID)) { user.sendMessage("commands.island.team.invite.cannot-invite-self"); - return true; + return false; } // Check if this player can be invited to this island, or // whether they are still on cooldown long time = getPlayers().getInviteCoolDownTime(invitedPlayerUUID, getIslands().getIslandLocation(playerUUID)); if (time > 0 && !user.isOp()) { user.sendMessage("commands.island.team.invite.cooldown", "[time]", String.valueOf(time)); - return true; + return false; } // Player cannot invite someone already on a team if (getPlayers().inTeam(invitedPlayerUUID)) { user.sendMessage("commands.island.team.invite.already-on-team"); - return true; + return false; } Set teamMembers = getMembers(user); // Check if player has space on their team @@ -131,11 +130,12 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { if (getPlayers().hasIsland(invitedPlayer.getUniqueId())) { invitedPlayer.sendMessage("commands.island.team.invite.you-will-lose-your-island"); } + return true; } else { user.sendMessage("commands.island.team.invite.errors.island-is-full"); + return false; } } - return false; } @Override diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java index db8432783..60e33fd63 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java @@ -34,7 +34,7 @@ public class IslandTeamInviteRejectCommand extends AbstractIslandTeamCommand { .involvedPlayer(playerUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return true; + if (event.isCancelled()) return false; // Remove this player from the global invite list inviteList.remove(user.getUniqueId()); @@ -45,6 +45,7 @@ public class IslandTeamInviteRejectCommand extends AbstractIslandTeamCommand { } else { // Someone typed /island reject and had not been invited user.sendMessage("commands.island.team.invite.errors.none-invited-you"); + return false; } return true; } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java index 77865800c..dfb8c7cae 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java @@ -11,13 +11,13 @@ import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.User; public class IslandTeamLeaveCommand extends AbstractIslandTeamCommand { - + Set leaveSet; public IslandTeamLeaveCommand(IslandTeamCommand islandTeamCommand) { super(islandTeamCommand, "leave"); } - + @Override public void setup() { this.setPermission(Constants.PERMPREFIX + "island.team"); @@ -30,7 +30,7 @@ public class IslandTeamLeaveCommand extends AbstractIslandTeamCommand { public boolean execute(User user, List args) { if (!getPlayers().inTeam(user.getUniqueId())) { user.sendMessage("general.errors.no-team"); - return true; + return false; } if (!getSettings().isKickConfirmation() || leaveSet.contains(user.getUniqueId())) { leaveSet.remove(user.getUniqueId()); @@ -40,6 +40,7 @@ public class IslandTeamLeaveCommand extends AbstractIslandTeamCommand { } getIslands().removePlayer(user.getUniqueId()); user.sendMessage("general.success"); + return true; } else { user.sendMessage("commands.island.team.leave.type-again"); leaveSet.add(user.getUniqueId()); @@ -50,8 +51,8 @@ public class IslandTeamLeaveCommand extends AbstractIslandTeamCommand { leaveSet.remove(user.getUniqueId()); user.sendMessage("general.errors.command-cancelled"); }}.runTaskLater(getPlugin(), getSettings().getKickWait()); + return false; } - return true; } } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java index 47f866b2a..42f6d0c0a 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java @@ -37,7 +37,8 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { boolean inTeam = getPlugin().getPlayers().inTeam(playerUUID); UUID teamLeaderUUID = getPlugin().getIslands().getTeamLeader(playerUUID); if (!(inTeam && teamLeaderUUID.equals(playerUUID))) { - return true; + user.sendMessage("general.errors.not-leader"); + return false; } // If args are not right, show help if (args.size() != 1) { @@ -47,23 +48,23 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { UUID targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player"); - return true; + return false; } if (!getPlayers().inTeam(playerUUID)) { user.sendMessage("general.errors.no-team"); - return true; + return false; } if (!teamLeaderUUID.equals(playerUUID)) { user.sendMessage("general.errors.not-leader"); - return true; + return false; } if (targetUUID.equals(playerUUID)) { user.sendMessage("commands.island.team.setowner.errors.cant-transfer-to-yourself"); - return true; + return false; } if (!getPlugin().getIslands().getMembers(playerUUID).contains(targetUUID)) { user.sendMessage("commands.island.team.setowner.errors.target-is-not-member"); - return true; + return false; } // Fire event so add-ons can run commands, etc. IslandBaseEvent event = TeamEvent.builder() @@ -73,7 +74,7 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { .involvedPlayer(targetUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return true; + if (event.isCancelled()) return false; // target is the new leader getIslands().getIsland(playerUUID).setOwner(targetUUID); From ad50b04177c75c3aa129cdc39a98eb3db92c55c8 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 21:59:15 -0800 Subject: [PATCH 58/97] Removed unneeded method. --- .../bskyblock/database/managers/PlayersManager.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java index 592b2a7de..2f81a2dac 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java @@ -594,11 +594,4 @@ public class PlayersManager{ } } - public boolean isKnown(String string) { - UUID uuid = this.getUUID(string); - if (uuid == null) return false; - return false; - } - - } From 61f0a6f9973bc92d482610f822d6f922cf025942 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 22:02:14 -0800 Subject: [PATCH 59/97] Made homeTeleport void because it does not return anything useful --- .../database/managers/island/IslandsManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 7bf705ea3..7416d317d 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -570,8 +570,8 @@ public class IslandsManager { * @param player * @return true if the home teleport is successful */ - public boolean homeTeleport(final Player player) { - return homeTeleport(player, 1); + public void homeTeleport(final Player player) { + homeTeleport(player, 1); } /** @@ -582,7 +582,7 @@ public class IslandsManager { * @return true if successful, false if not */ @SuppressWarnings("deprecation") - public boolean homeTeleport(final Player player, int number) { + public void homeTeleport(final Player player, int number) { Location home; if (DEBUG) plugin.getLogger().info("home teleport called for #" + number); @@ -605,7 +605,7 @@ public class IslandsManager { plugin.getLogger().info("Fixing home location using safe spot teleport"); // Try to fix this teleport location and teleport the player if possible new SafeSpotTeleport(plugin, player, plugin.getPlayers().getHomeLocation(player.getUniqueId(), number), number); - return true; + return; } if (DEBUG) plugin.getLogger().info("DEBUG: home loc = " + home + " teleporting"); @@ -622,7 +622,7 @@ public class IslandsManager { if (player.getGameMode().equals(GameMode.SPECTATOR)) { player.setGameMode(GameMode.SURVIVAL); } - return true; + return; } /** From 1db21c10da83d604ea276542b496429aaf97b69c Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 22:45:21 -0800 Subject: [PATCH 60/97] Fixed bug with help that I introduced. Added specific convenience showHelp() method to Composite command. --- .../us/tastybento/bskyblock/Settings.java | 31 ++++++++++--------- .../api/commands/CompositeCommand.java | 13 ++++++++ .../api/commands/DefaultHelpCommand.java | 5 ++- .../bskyblock/commands/AdminCommand.java | 3 +- .../bskyblock/commands/IslandCommand.java | 15 +++++++-- .../commands/island/IslandSetnameCommand.java | 2 +- .../island/teams/IslandTeamInviteCommand.java | 3 +- .../island/teams/IslandTeamKickCommand.java | 3 +- .../teams/IslandTeamSetownerCommand.java | 3 +- 9 files changed, 55 insertions(+), 23 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index de86476da..604e9117d 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.bukkit.entity.EntityType; @@ -129,8 +130,8 @@ public class Settings implements ISettings { private boolean endIslands = true; // Entities - private HashMap entityLimits; - private HashMap tileEntityLimits; + private Map entityLimits = new HashMap<>(); + private Map tileEntityLimits = new HashMap<>(); // --------------------------------------------- @@ -188,7 +189,7 @@ public class Settings implements ISettings { // Ranks @ConfigEntry(path = "island.customranks") - private HashMap customRanks = new HashMap<>(); + private Map customRanks = new HashMap<>(); // --------------------------------------------- @@ -201,7 +202,7 @@ public class Settings implements ISettings { private int togglePvPCooldown; - private HashMap defaultFlags; + private Map defaultFlags = new HashMap<>(); //TODO transform these options below into flags private boolean allowEndermanGriefing; @@ -252,7 +253,7 @@ public class Settings implements ISettings { private boolean useOwnGenerator; - private HashMap limitedBlocks; + private Map limitedBlocks = new HashMap<>(); private boolean teamJoinDeathReset; private String uniqueId = "config"; @@ -316,7 +317,7 @@ public class Settings implements ISettings { /** * @return the customRanks */ - public HashMap getCustomRanks() { + public Map getCustomRanks() { return customRanks; } /** @@ -370,7 +371,7 @@ public class Settings implements ISettings { /** * @return the defaultFlags */ - public HashMap getDefaultFlags() { + public Map getDefaultFlags() { return defaultFlags; } /** @@ -382,7 +383,7 @@ public class Settings implements ISettings { /** * @return the entityLimits */ - public HashMap getEntityLimits() { + public Map getEntityLimits() { return entityLimits; } @Override @@ -452,7 +453,7 @@ public class Settings implements ISettings { /** * @return the limitedBlocks */ - public HashMap getLimitedBlocks() { + public Map getLimitedBlocks() { return limitedBlocks; } /** @@ -524,7 +525,7 @@ public class Settings implements ISettings { /** * @return the tileEntityLimits */ - public HashMap getTileEntityLimits() { + public Map getTileEntityLimits() { return tileEntityLimits; } /** @@ -860,7 +861,7 @@ public class Settings implements ISettings { /** * @param customRanks the customRanks to set */ - public void setCustomRanks(HashMap customRanks) { + public void setCustomRanks(Map customRanks) { this.customRanks = customRanks; } /** @@ -920,7 +921,7 @@ public class Settings implements ISettings { /** * @param defaultFlags the defaultFlags to set */ - public void setDefaultFlags(HashMap defaultFlags) { + public void setDefaultFlags(Map defaultFlags) { this.defaultFlags = defaultFlags; } /** @@ -950,7 +951,7 @@ public class Settings implements ISettings { /** * @param entityLimits the entityLimits to set */ - public void setEntityLimits(HashMap entityLimits) { + public void setEntityLimits(Map entityLimits) { this.entityLimits = entityLimits; } /** @@ -1046,7 +1047,7 @@ public class Settings implements ISettings { /** * @param limitedBlocks the limitedBlocks to set */ - public void setLimitedBlocks(HashMap limitedBlocks) { + public void setLimitedBlocks(Map limitedBlocks) { this.limitedBlocks = limitedBlocks; } /** @@ -1191,7 +1192,7 @@ public class Settings implements ISettings { /** * @param tileEntityLimits the tileEntityLimits to set */ - public void setTileEntityLimits(HashMap tileEntityLimits) { + public void setTileEntityLimits(Map tileEntityLimits) { this.tileEntityLimits = tileEntityLimits; } /** diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index daf5e72a4..b511bb284 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -477,4 +477,17 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi } return Util.tabLimit(options, lastArg); } + + /** + * Show help + * @param command + * @param user + * @param args + */ + protected void showHelp(CompositeCommand command, User user, List args) { + Optional helpCommand = command.getSubCommand("help"); + if (helpCommand.isPresent()) { + helpCommand.get().execute(user, args); + } + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java index f11883ceb..ebe81d8c6 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java @@ -74,7 +74,10 @@ public class DefaultHelpCommand extends CompositeCommand { // Ignore the help command if (!subCommand.getLabel().equals("help")) { // Every command should have help because every command has a default help - subCommand.getSubCommand("help").ifPresent(sub -> execute(user, Arrays.asList(String.valueOf(newDepth)))); + Optional sub = subCommand.getSubCommand("help"); + if (sub.isPresent()) { + sub.get().execute(user, Arrays.asList(String.valueOf(newDepth))); + } } } } diff --git a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java index 8e77600a8..64b0baba0 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java @@ -28,7 +28,8 @@ public class AdminCommand extends CompositeCommand { @Override public boolean execute(User user, List args) { // By default run the attached help command, if it exists (it should) - return this.getSubCommand("help").map(help -> execute(user, args)).orElse(false); + showHelp(this, user, args); + return false; } } diff --git a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java index 612da5d0e..2fb7d6cf3 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java @@ -1,6 +1,8 @@ package us.tastybento.bskyblock.commands; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; @@ -45,10 +47,19 @@ public class IslandCommand extends CompositeCommand { public boolean execute(User user, List args) { // If this player does not have an island, create one if (!getPlugin().getIslands().hasIsland(user.getUniqueId())) { - return this.getSubCommand("create").map(command -> execute(user, args)).orElse(false); + Optional subCreate = this.getSubCommand("create"); + if (subCreate.isPresent()) { + subCreate.get().execute(user, new ArrayList<>()); + } } + Optional go = this.getSubCommand("go"); // Otherwise, currently, just go home - return this.getSubCommand("go").map(command -> execute(user, args)).orElse(false); + if (go.isPresent()) { + go.get().execute(user, new ArrayList<>()); + } + + return true; } + } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java index e79c6ecae..30cb3e686 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java @@ -51,7 +51,7 @@ public class IslandSetnameCommand extends CompositeCommand { } // Explain command if (args.isEmpty()) { - this.getSubCommand("help").ifPresent(help -> help.execute(user, args)); + showHelp(this, user, args); return false; } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index f5d4b05f5..ba0770144 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -51,7 +51,8 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { return true; } // Show help - return this.getSubCommand("help").map(command -> execute(user, args)).orElse(false); + showHelp(this, user, args); + return false; } else { // Only online players can be invited UUID invitedPlayerUUID = getPlayers().getUUID(args.get(0)); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java index ce1e49c1e..5a8f22959 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java @@ -40,7 +40,8 @@ public class IslandTeamKickCommand extends AbstractIslandTeamCommand { } // If args are not right, show help if (args.size() != 1) { - return this.getSubCommand("help").map(command -> execute(user, new ArrayList<>())).orElse(false); + showHelp(this, user, args); + return false; } // Get target UUID targetUUID = getPlayers().getUUID(args.get(0)); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java index 42f6d0c0a..d0c02ee4e 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java @@ -42,7 +42,8 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { } // If args are not right, show help if (args.size() != 1) { - return this.getSubCommand("help").map(command -> execute(user, new ArrayList<>())).orElse(false); + showHelp(this, user, args); + return false; } //getPlugin().getLogger().info("DEBUG: arg[0] = " + args.get(0)); UUID targetUUID = getPlayers().getUUID(args.get(0)); From e5a87ccf7ab3ec1814f9f0ae8d49233f4f6b2001 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Tue, 6 Feb 2018 23:04:09 -0800 Subject: [PATCH 61/97] Code cleanup and bug fixing. This just cleans up a lot of code that could cause confusion or was actually wrong. --- .../bskyblock/api/addons/Addon.java | 14 +++--- .../api/addons/AddonClassLoader.java | 3 +- .../api/commands/CompositeCommand.java | 45 ++++++------------- .../api/commands/DefaultHelpCommand.java | 10 +++-- .../island/teams/IslandTeamInviteCommand.java | 8 ++-- .../island/teams/IslandTeamKickCommand.java | 1 - .../bskyblock/managers/AddonsManager.java | 2 +- 7 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java index b16edd571..7782b3e56 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java @@ -95,16 +95,16 @@ public abstract class Addon implements AddonInterface { private FileConfiguration loadYamlFile(String file) { File yamlFile = new File(dataFolder, file); - YamlConfiguration config = null; + YamlConfiguration yamlConfig = null; if (yamlFile.exists()) { try { - config = new YamlConfiguration(); - config.load(yamlFile); + yamlConfig = new YamlConfiguration(); + yamlConfig.load(yamlFile); } catch (Exception e) { Bukkit.getLogger().severe("Could not load YAML file: " + file); } } - return config; + return yamlConfig; } /** @@ -158,9 +158,9 @@ public abstract class Addon implements AddonInterface { jarResource = jarResource.replace('\\', '/'); try (JarFile jar = new JarFile(file)) { - JarEntry config = jar.getJarEntry(jarResource); - if (config != null) { - try (InputStream in = jar.getInputStream(config)) { + JarEntry jarConfig = jar.getJarEntry(jarResource); + if (jarConfig != null) { + try (InputStream in = jar.getInputStream(jarConfig)) { if (in == null) { jar.close(); throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index 62b1aa9dd..2ea3ef24c 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -1,6 +1,5 @@ package us.tastybento.bskyblock.api.addons; -import java.io.BufferedReader; import java.io.File; import java.net.MalformedURLException; import java.net.URL; @@ -25,7 +24,7 @@ public class AddonClassLoader extends URLClassLoader { private Addon addon; private AddonsManager loader; - public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, BufferedReader reader, ClassLoader parent) + public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, ClassLoader parent) throws InvalidAddonInheritException, MalformedURLException, InvalidAddonFormatException, diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index b511bb284..dea2130df 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -189,39 +189,22 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi private CompositeCommand getCommandFromArgs(String[] args) { CompositeCommand subCommand = this; // Run through any arguments - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: Running through args: " + Arrays.asList(args).toString()); - } - if (args.length > 0) { - for (int i = 0; i < args.length; i++) { - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: Argument " + i); - } - // get the subcommand corresponding to the arg - if (subCommand.hasSubCommmands()) { - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: This command has subcommands"); - } - Optional sub = subCommand.getSubCommand(args[i]); - if (!sub.isPresent()) { - return subCommand; - } - // Step down one - subCommand = sub.orElse(subCommand); - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: Moved to " + subCommand.getLabel()); - } - // Set the label - subCommand.setLabel(args[i]); - } else { - // We are at the end of the walk - if (DEBUG) { - Bukkit.getLogger().info("DEBUG: End of traversal"); - } + for (int i = 0; i < args.length; i++) { + // get the subcommand corresponding to the arg + if (subCommand.hasSubCommmands()) { + Optional sub = subCommand.getSubCommand(args[i]); + if (!sub.isPresent()) { return subCommand; } - // else continue the loop + // Step down one + subCommand = sub.orElse(subCommand); + // Set the label + subCommand.setLabel(args[i]); + } else { + // We are at the end of the walk + return subCommand; } + // else continue the loop } return subCommand; } @@ -477,7 +460,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi } return Util.tabLimit(options, lastArg); } - + /** * Show help * @param command diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java index ebe81d8c6..5fc53a412 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java @@ -16,6 +16,10 @@ public class DefaultHelpCommand extends CompositeCommand { // TODO: make this a setting private static final int MAX_DEPTH = 2; + private static final String USAGE_PLACEHOLDER = "[usage]"; + private static final String PARAMS_PLACEHOLDER = "[parameters]"; + private static final String DESC_PLACEHOLDER = "[description]"; + private static final String HELP_SYNTAX_REF = "commands.help.syntax"; public DefaultHelpCommand(CompositeCommand parent) { super(parent, "help"); @@ -39,7 +43,7 @@ public class DefaultHelpCommand extends CompositeCommand { String usage = user.getTranslation(parent.getUsage()); String params = user.getTranslation("commands.help.parameters"); String desc = user.getTranslation("commands.help.description"); - user.sendMessage("commands.help.syntax", "[usage]", usage, "[parameters]", params, "[description]", desc); + user.sendMessage(HELP_SYNTAX_REF, USAGE_PLACEHOLDER, usage, PARAMS_PLACEHOLDER, params, DESC_PLACEHOLDER, desc); return true; } } @@ -57,14 +61,14 @@ public class DefaultHelpCommand extends CompositeCommand { if (user.isPlayer()) { // Player. Check perms if (user.hasPermission(parent.getPermission())) { - user.sendMessage("commands.help.syntax", "[usage]", usage, "[parameters]", params, "[description]", desc); + user.sendMessage(HELP_SYNTAX_REF, USAGE_PLACEHOLDER, usage, PARAMS_PLACEHOLDER, params, DESC_PLACEHOLDER, desc); } else { // No permission, nothing to see here. If you don't have permission, you cannot see any sub commands return true; } } else if (!parent.isOnlyPlayer()) { // Console. Only show if it is a console command - user.sendMessage("commands.help.syntax", "[usage]", usage, "[parameters]", params, "[description]", desc); + user.sendMessage(HELP_SYNTAX_REF, USAGE_PLACEHOLDER, usage, PARAMS_PLACEHOLDER, params, DESC_PLACEHOLDER, desc); } } // Increment the depth diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index ba0770144..138eef747 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -19,6 +19,8 @@ import us.tastybento.bskyblock.util.Util; public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { + private static final String NAME_PLACEHOLDER = "[name]"; + public IslandTeamInviteCommand(IslandTeamCommand islandTeamCommand) { super(islandTeamCommand, "invite"); } @@ -47,7 +49,7 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { // Invite label with no name, i.e., /island invite - tells the player who has invited them so far if (inviteList.containsKey(playerUUID)) { OfflinePlayer inviter = getPlugin().getServer().getOfflinePlayer(inviteList.get(playerUUID)); - user.sendMessage("commands.island.team.invite.name-has-invited-you", "[name]", inviter.getName()); + user.sendMessage("commands.island.team.invite.name-has-invited-you", NAME_PLACEHOLDER, inviter.getName()); return true; } // Show help @@ -124,9 +126,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { // Put the invited player (key) onto the list with inviter (value) // If someone else has invited a player, then this invite will overwrite the previous invite! inviteList.put(invitedPlayerUUID, playerUUID); - user.sendMessage("commands.island.team.invite.invitation-sent", "[name]", args.get(0)); + user.sendMessage("commands.island.team.invite.invitation-sent", NAME_PLACEHOLDER, args.get(0)); // Send message to online player - invitedPlayer.sendMessage("commands.island.team.invite.name-has-invited-you", "[name]", user.getName()); + invitedPlayer.sendMessage("commands.island.team.invite.name-has-invited-you", NAME_PLACEHOLDER, user.getName()); invitedPlayer.sendMessage("commands.island.team.invite.to-accept-or-reject", "[label]", getLabel()); if (getPlayers().hasIsland(invitedPlayer.getUniqueId())) { invitedPlayer.sendMessage("commands.island.team.invite.you-will-lose-your-island"); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java index 5a8f22959..324917074 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java @@ -1,6 +1,5 @@ package us.tastybento.bskyblock.commands.island.teams; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 27be6583d..cdb137d89 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -116,7 +116,7 @@ public final class AddonsManager { Map data = this.data(reader); // Load the addon - AddonClassLoader loader = new AddonClassLoader(this, data, f, reader, this.getClass().getClassLoader()); + AddonClassLoader loader = new AddonClassLoader(this, data, f, this.getClass().getClassLoader()); // Add to the list of loaders this.loader.add(loader); From 293ab2ccf949770c30c17efd004f4423cf923db2 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 7 Feb 2018 13:16:09 +0100 Subject: [PATCH 62/97] Added default values to Settings --- .../us/tastybento/bskyblock/Settings.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index 604e9117d..4c93bf075 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -27,7 +27,9 @@ import us.tastybento.bskyblock.database.objects.adapters.PotionEffectListAdapter */ @StoreAt(filename="config.yml") // Explicitly call out what name this should have. public class Settings implements ISettings { - + + private String uniqueId = "config"; + // --------------------------------------------- /* GENERAL */ @@ -141,9 +143,9 @@ public class Settings implements ISettings { @ConfigEntry(path = "island.max-homes") private int maxHomes = 5; @ConfigEntry(path = "island.name.min-length") - private int nameMinLength; + private int nameMinLength = 4; @ConfigEntry(path = "island.name.max-length") - private int nameMaxLength; + private int nameMaxLength = 20; @ConfigEntry(path = "island.invite-wait") private int inviteWait = 60; @@ -152,33 +154,33 @@ public class Settings implements ISettings { private int resetLimit = -1; @ConfigEntry(path = "island.require-confirmation.reset") - private boolean resetConfirmation; + private boolean resetConfirmation = true; @ConfigEntry(path = "island.reset-wait") private long resetWait = 300; @ConfigEntry(path = "island.reset.leavers-lose-reset") - private boolean leaversLoseReset; + private boolean leaversLoseReset = false; @ConfigEntry(path = "island.reset.kicked-keep-inventory") - private boolean kickedKeepInventory; + private boolean kickedKeepInventory = false; // Remove mobs @ConfigEntry(path = "island.remove-mobs.on-login") - private boolean removeMobsOnLogin; + private boolean removeMobsOnLogin = false; @ConfigEntry(path = "island.remove-mobs.on-island") - private boolean removeMobsOnIsland; + private boolean removeMobsOnIsland = false; @ConfigEntry(path = "island.remove-mobs.whitelist") private List removeMobsWhitelist = new ArrayList<>(); @ConfigEntry(path = "island.make-island-if-none") - private boolean makeIslandIfNone; + private boolean makeIslandIfNone = false; @ConfigEntry(path = "island.immediate-teleport-on-island") - private boolean immediateTeleportOnIsland; + private boolean immediateTeleportOnIsland = false; - private boolean respawnOnIsland; + private boolean respawnOnIsland = true; // Deaths @ConfigEntry(path = "island.deaths.max") @@ -255,21 +257,19 @@ public class Settings implements ISettings { private Map limitedBlocks = new HashMap<>(); private boolean teamJoinDeathReset; - - private String uniqueId = "config"; // Timeout for team kick and leave commands @ConfigEntry(path = "island.require-confirmation.kick") - private boolean kickConfirmation; + private boolean kickConfirmation = true; @ConfigEntry(path = "island.require-confirmation.kick-wait") - private long kickWait; + private long kickWait = 300; @ConfigEntry(path = "island.require-confirmation.leave") - private boolean leaveConfirmation; + private boolean leaveConfirmation = true; @ConfigEntry(path = "island.require-confirmation.leave-wait") - private long leaveWait; + private long leaveWait = 300; /** From 12cac6b3aa713edc8475bdc43872a22dac137cce Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 7 Feb 2018 13:29:19 +0100 Subject: [PATCH 63/97] Minor adjustments to ranks-related methods in Island --- .../bskyblock/database/objects/Island.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index d7661263a..9b7bf1b2e 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -153,15 +153,15 @@ public class Island implements DataObject { } /** - * Get the Island Guard flag ranking - * @param breakBlocks - * @return flag rank. Players must have at least this rank to bypass this flag + * Gets the rank needed to bypass this Island Guard flag + * @param flag + * @return the rank needed to bypass this flag. Players must have at least this rank to bypass this flag. */ - public int getFlagReq(Flag breakBlocks){ - if(flags.containsKey(breakBlocks)) { - return flags.get(breakBlocks); + public int getFlag(Flag flag){ + if(flags.containsKey(flag)) { + return flags.get(flag); } else { - flags.put(breakBlocks, RanksManager.MEMBER_RANK); + flags.put(flag, RanksManager.MEMBER_RANK); return RanksManager.MEMBER_RANK; } } @@ -401,7 +401,7 @@ public class Island implements DataObject { */ public boolean inIslandSpace(int x, int z) { //Bukkit.getLogger().info("DEBUG: center - " + center); - return (x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2) ? true: false; + return x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2; } public boolean inIslandSpace(Location location) { @@ -414,11 +414,11 @@ public class Island implements DataObject { /** * Check if the flag is allowed or not * For flags that are for the island in general and not related to rank - * @param breakBlocks + * @param flag * @return true if allowed, false if not */ - public boolean isAllowed(Flag breakBlocks) { - return this.getFlagReq(breakBlocks) >= 0 ? true : false; + public boolean isAllowed(Flag flag) { + return this.getFlag(flag) >= 0; } /** @@ -429,7 +429,7 @@ public class Island implements DataObject { */ public boolean isAllowed(User user, Flag flag) { //Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); - return (this.getRank(user) >= this.getFlagReq(flag)) ? true : false; + return this.getRank(user) >= this.getFlag(flag); } /** @@ -438,7 +438,7 @@ public class Island implements DataObject { * @return Returns true if target is banned on this island */ public boolean isBanned(UUID targetUUID) { - return members.containsKey(targetUUID) && members.get(targetUUID) == RanksManager.BANNED_RANK ? true : false; + return members.containsKey(targetUUID) && members.get(targetUUID) == RanksManager.BANNED_RANK; } /** From f33fa2477aa7298f4e28f7e90d76446e4faad802 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 7 Feb 2018 13:33:37 +0100 Subject: [PATCH 64/97] Use .equals() in #isBanned(UUID) in Island --- .../java/us/tastybento/bskyblock/database/objects/Island.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 9b7bf1b2e..6cc474298 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -438,7 +438,7 @@ public class Island implements DataObject { * @return Returns true if target is banned on this island */ public boolean isBanned(UUID targetUUID) { - return members.containsKey(targetUUID) && members.get(targetUUID) == RanksManager.BANNED_RANK; + return members.containsKey(targetUUID) && members.get(targetUUID).equals(RanksManager.BANNED_RANK); } /** From 7b55ca70b276df7a8b749b5d96e1cdf727bb096f Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 7 Feb 2018 13:41:37 +0100 Subject: [PATCH 65/97] Fixed some Flags and added a security check in FlagsManager ...to avoid duplicates of Listeners --- .../us/tastybento/bskyblock/lists/Flags.java | 10 ++++---- .../bskyblock/managers/FlagsManager.java | 23 +++++++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index b357c5dba..87fc3fd29 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -38,11 +38,11 @@ public class Flags { public static final Flag BED = new FlagBuilder().id("BED").icon(Material.BED).build(); public static final Flag BREWING = new FlagBuilder().id("BREWING").icon(Material.BREWING_STAND_ITEM).build(); public static final Flag CHEST = new FlagBuilder().id("CHEST").icon(Material.CHEST).build(); - public static final Flag DOOR = new FlagBuilder().id("DOOR).allowedByDefault(true").icon(Material.WOODEN_DOOR).build(); - public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING).allowedByDefault(true").icon(Material.WORKBENCH).build(); - public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING).allowedByDefault(true").icon(Material.ENCHANTMENT_TABLE).build(); + public static final Flag DOOR = new FlagBuilder().id("DOOR").allowedByDefault(true).icon(Material.WOODEN_DOOR).build(); + public static final Flag CRAFTING = new FlagBuilder().id("CRAFTING").allowedByDefault(true).icon(Material.WORKBENCH).build(); + public static final Flag ENCHANTING = new FlagBuilder().id("ENCHANTING").allowedByDefault(true).icon(Material.ENCHANTMENT_TABLE).build(); public static final Flag FURNACE = new FlagBuilder().id("FURNACE").icon(Material.FURNACE).build(); - public static final Flag GATE = new FlagBuilder().id("GATE).allowedByDefault(true").icon(Material.FENCE_GATE).build(); + public static final Flag GATE = new FlagBuilder().id("GATE").allowedByDefault(true).icon(Material.FENCE_GATE).build(); public static final Flag MUSIC = new FlagBuilder().id("MUSIC").icon(Material.JUKEBOX).build(); public static final Flag LEVER_BUTTON = new FlagBuilder().id("LEVER_BUTTON").icon(Material.LEVER).build(); public static final Flag REDSTONE = new FlagBuilder().id("REDSTONE").icon(Material.REDSTONE).build(); @@ -51,7 +51,7 @@ public class Flags { // Entity interactions public static final Flag ARMOR_STAND = new FlagBuilder().id("ARMOR_STAND").icon(Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); public static final Flag RIDING = new FlagBuilder().id("RIDING").icon(Material.GOLD_BARDING).build(); - public static final Flag TRADING = new FlagBuilder().id("TRADING).allowedByDefault(true").icon(Material.EMERALD).build(); + public static final Flag TRADING = new FlagBuilder().id("TRADING").allowedByDefault(true).icon(Material.EMERALD).build(); // Breeding public static final Flag BREEDING = new FlagBuilder().id("BREEDING").icon(Material.CARROT).listener(new BreedingListener()).build(); diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 38d90cefb..4f59d5559 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -1,19 +1,29 @@ package us.tastybento.bskyblock.managers; +import java.util.ArrayList; import java.util.HashMap; import org.bukkit.Bukkit; +import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.panels.PanelItem; import us.tastybento.bskyblock.lists.Flags; +/** + * @author Poslovitch + * @author tastybento + */ public class FlagsManager { private BSkyBlock plugin; private HashMap flags = new HashMap<>(); + /** + * Stores the flag listeners that have already been registered into Bukkit's API to avoid duplicates. + */ + private ArrayList registeredListeners = new ArrayList<>(); public FlagsManager(BSkyBlock plugin) { this.plugin = plugin; @@ -31,8 +41,13 @@ public class FlagsManager { public void registerFlag(Flag flag) { //Bukkit.getLogger().info("DEBUG: registering flag " + flag.getID()); flags.put(flag.getID(), flag); - // If there is a listener, register it into Bukkit. - flag.getListener().ifPresent(l -> Bukkit.getServer().getPluginManager().registerEvents(l, plugin)); + // If there is a listener which is not already registered, register it into Bukkit. + flag.getListener().ifPresent(l -> { + if (!registeredListeners.contains(l)) { + Bukkit.getServer().getPluginManager().registerEvents(l, plugin); + registeredListeners.add(l); + } + }); } public HashMap getFlags() { @@ -40,8 +55,8 @@ public class FlagsManager { } /** - * Get flag by string - * @param key - string name same as the enum + * Get flag by ID + * @param id * @return Flag or null if not known */ public Flag getFlagByID(String id) { From 7e7b25953164465d1b028c1f6d8b4b5a7021288e Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:12:23 -0800 Subject: [PATCH 66/97] Converted Map to EnumMap When all the keys of a Map are values from the same enum, the Map can be replaced with an EnumMap, which can be much more efficient than other sets because the underlying data structure is a simple array. --- src/main/java/us/tastybento/bskyblock/Settings.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index 4c93bf075..f9b587eb7 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -2,6 +2,7 @@ package us.tastybento.bskyblock; import java.util.ArrayList; import java.util.Arrays; +import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -132,7 +133,9 @@ public class Settings implements ISettings { private boolean endIslands = true; // Entities - private Map entityLimits = new HashMap<>(); + @ConfigEntry(path = "island.limits.entities") + private Map entityLimits = new EnumMap<>(EntityType.class); + @ConfigEntry(path = "island.limits.tile-entities") private Map tileEntityLimits = new HashMap<>(); // --------------------------------------------- From 3f35afc76ab6f50c85ebd42d8a9f767d75ba1f9f Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:13:40 -0800 Subject: [PATCH 67/97] Close is handled automatically. --- src/main/java/us/tastybento/bskyblock/api/addons/Addon.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java index 7782b3e56..105e0c354 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java @@ -162,7 +162,6 @@ public abstract class Addon implements AddonInterface { if (jarConfig != null) { try (InputStream in = jar.getInputStream(jarConfig)) { if (in == null) { - jar.close(); throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); } // There are two options, use the path of the resource or not From e4fbc6fab1f0b2d40fbdb49e8fe247ca12b76b01 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:16:05 -0800 Subject: [PATCH 68/97] Simplified code, no need for internal variable. --- .../us/tastybento/bskyblock/api/addons/AddonClassLoader.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index 2ea3ef24c..aff49e67c 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -58,11 +58,8 @@ public class AddonClassLoader extends URLClassLoader { throw new InvalidAddonInheritException("Main class doesn't not extends super class 'Addon'"); } - Addon addon = addonClass.newInstance(); - + this.addon = addonClass.newInstance(); addon.setDescription(this.asDescription(data)); - - this.addon = addon; } private AddonDescription asDescription(Map data){ From 08b2e2579ba7bbc23e71ac893010c7a707e58035 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:28:29 -0800 Subject: [PATCH 69/97] Reverted to using an explicit throw of all exceptions --- .../us/tastybento/bskyblock/api/configuration/ISettings.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index f46246535..08e4269bb 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -39,13 +39,13 @@ public interface ISettings { // --------------- Loader ------------------ @SuppressWarnings("unchecked") - default T loadSettings() throws Exception { + default T loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException { // See if this settings object already exists in the database AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(this.getClass()); T dbConfig = null; if (dbhandler.objectExits(this.getUniqueId())) { // Load it - dbConfig = dbhandler.loadObject(getUniqueId()); + dbConfig = dbhandler.loadObject(getUniqueId()); } // Get the handler AbstractDatabaseHandler configHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); From 29d09922b9d2c625180c2d55730feb16a6ca5321 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:33:59 -0800 Subject: [PATCH 70/97] Switched to use Files.delete When File.delete fails, this boolean method simply returns false with no indication of the cause. On the other hand, when Files.delete fails, this void method returns one of a series of exception types to better indicate the cause of the failure. More information is generally better in a debugging situation, so I'll use this option. --- .../database/flatfile/FlatFileDatabaseHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index ce547914b..04552239a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -4,10 +4,12 @@ import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -520,9 +522,12 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { File dataFolder = new File(plugin.getDataFolder(), DATABASE_FOLDER_NAME); File tableFolder = new File(dataFolder, dataObject.getSimpleName()); if (tableFolder.exists()) { + File file = new File(tableFolder, fileName); - if (!file.delete()) { - plugin.getLogger().severe("Could not delete yaml database object! " + file.getName()); + try { + Files.delete(file.toPath()); + } catch (IOException e) { + plugin.getLogger().severe("Could not delete yaml database object! " + file.getName() + " - " + e.getMessage()); } } } From 1d5086531d4fd4df5c0e1ca981fa92599919ac27 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:39:00 -0800 Subject: [PATCH 71/97] Removed performance hit of logging Since Java 8, we can use Supplier for logger, which will be evaluated lazily. In general, the debug stuff should be removed when we have more stability. --- .../bskyblock/database/mysql/MySQLDatabaseHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 103f88f28..af2c2aa07 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -911,8 +911,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { preparedStatement2.setString(1, uniqueId); preparedStatement2.addBatch(); // Execute - if (DEBUG) - plugin.getLogger().info("DEBUG: " + preparedStatement2.toString()); + if (DEBUG) { + plugin.getLogger().info(() -> "DEBUG: " + preparedStatement2.toString()); // Evaluated lazily + } preparedStatement2.executeBatch(); } } From 41dd491f05b9a618650c3fb672e9aebd761443cb Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 19:44:10 -0800 Subject: [PATCH 72/97] Code cleanup. --- .../listeners/flags/HurtingListener.java | 25 ++++++++----------- .../bskyblock/managers/AddonsManager.java | 1 - .../us/tastybento/bskyblock/util/Util.java | 4 --- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index 338bfa4bb..e09b88c54 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -92,22 +92,19 @@ public class HurtingListener extends AbstractFlagListener { if (e.getCaught() == null) return; - if (e.getCaught() instanceof Animals || e.getCaught() instanceof IronGolem || e.getCaught() instanceof Snowman - || e.getCaught() instanceof Villager) { - if (checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { - e.getHook().remove(); - return; - } + if ((e.getCaught() instanceof Animals || e.getCaught() instanceof IronGolem || e.getCaught() instanceof Snowman + || e.getCaught() instanceof Villager) && checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { + e.getHook().remove(); + return; } - if (e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) { - if (checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { - e.getHook().remove(); - return; - } + + if ((e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) + && checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { + e.getHook().remove(); + return; } } - /** * Handles feeding cookies to animals, which may hurt them * @param e @@ -173,8 +170,8 @@ public class HurtingListener extends AbstractFlagListener { // Store it and remove it when the effect is gone thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); plugin.getServer().getScheduler().runTaskLater(plugin, () -> { - thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); - }, e.getAreaEffectCloud().getDuration()); + thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); + }, e.getAreaEffectCloud().getDuration()); } } diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index cdb137d89..a5fcc1268 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -106,7 +106,6 @@ public final class AddonsManager { // Obtain the addon.yml file JarEntry entry = jar.getJarEntry("addon.yml"); if (entry == null) { - jar.close(); throw new InvalidAddonFormatException("Addon doesn't contains description file"); } diff --git a/src/main/java/us/tastybento/bskyblock/util/Util.java b/src/main/java/us/tastybento/bskyblock/util/Util.java index c8beca68f..b1209a654 100755 --- a/src/main/java/us/tastybento/bskyblock/util/Util.java +++ b/src/main/java/us/tastybento/bskyblock/util/Util.java @@ -14,14 +14,10 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.MaterialData; -import org.bukkit.material.SimpleAttachableMaterialData; -import org.bukkit.material.TrapDoor; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; From b833b17d220775f0fb5b2e215a04bc3d61e11e50 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 20:43:13 -0800 Subject: [PATCH 73/97] Helped secure the prepared statement --- .../bskyblock/database/mysql/MySQLDatabaseHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index af2c2aa07..b6db74227 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -451,9 +451,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Get the columns we are going to insert, just the names of them setSql += getCollectionColumnString(propertyDescriptor.getWriteMethod(), false, false) + ") "; // Get all the ?'s for the columns - setSql += "VALUES ('" + uniqueId + "'," + getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false) + ")"; + setSql += "VALUES ('?'," + getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false) + ")"; // Prepare the statement try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { + // Set the uniqueId + collStatement.setString(1, uniqueId); if (DEBUG) plugin.getLogger().info("DEBUG: collection insert =" + setSql); // Do single dimension types (set and list) @@ -471,7 +473,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { setValue = serialize(setValue, setValue.getClass()); //} // Set the value from ? to whatever it is - collStatement.setObject(1, setValue); + collStatement.setObject(2, setValue); if (DEBUG) plugin.getLogger().info("DEBUG: " + collStatement.toString()); // Execute the SQL in the database From 2be005acb1d3794a3edb9abccb7ea6c8ddb59552 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 21:11:23 -0800 Subject: [PATCH 74/97] Removed vulnerabilities Mainly leftover raw stacktrace prints in exceptions instead of propper logging statements. --- .../bskyblock/api/panels/Panel.java | 4 +-- .../mysql/MySQLDatabaseResourceCloser.java | 11 ++++---- .../bskyblock/generators/IslandWorld.java | 1 - .../listeners/PanelListenerManager.java | 21 ++++++++++----- .../listeners/flags/AbstractFlagListener.java | 23 +++++++++++++--- .../listeners/flags/BreakBlocksListener.java | 2 +- .../listeners/flags/FireListener.java | 8 +++--- .../listeners/flags/HurtingListener.java | 2 +- .../listeners/flags/MobSpawnListener.java | 2 +- .../listeners/flags/PVPListener.java | 18 ++++++------- .../us/tastybento/bskyblock/lists/Flags.java | 6 ++--- .../bskyblock/managers/AddonsManager.java | 7 ++--- .../bskyblock/managers/LocalesManager.java | 27 +++++++++++-------- .../us/tastybento/bskyblock/util/Util.java | 2 +- .../util/placeholders/PlaceholderHandler.java | 1 - 15 files changed, 78 insertions(+), 57 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java b/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java index 3208cb0e1..ac834fe96 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java @@ -70,7 +70,7 @@ public class Panel { public void open(Player... players) { for (Player player : players) { player.openInventory(inventory); - PanelListenerManager.openPanels.put(player.getUniqueId(), this); + PanelListenerManager.getOpenPanels().put(player.getUniqueId(), this); } } @@ -81,7 +81,7 @@ public class Panel { public void open(User... users) { for (User user : users) { user.getPlayer().openInventory(inventory); - PanelListenerManager.openPanels.put(user.getUniqueId(), this); + PanelListenerManager.getOpenPanels().put(user.getUniqueId(), this); } } diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java index 125f64184..68bd7d217 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java @@ -5,6 +5,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import org.bukkit.Bukkit; + public class MySQLDatabaseResourceCloser { /** @@ -23,8 +25,7 @@ public class MySQLDatabaseResourceCloser { try { resultSet.close(); } catch (SQLException e) { - /* Do some exception-logging here. */ - e.printStackTrace(); + Bukkit.getLogger().severe("Could not close MySQL resultset"); } } } @@ -50,8 +51,7 @@ public class MySQLDatabaseResourceCloser { try { statement.close(); } catch (SQLException e) { - /* Do some exception-logging here. */ - e.printStackTrace(); + Bukkit.getLogger().severe("Could not close MySQL statement"); } } } @@ -72,8 +72,7 @@ public class MySQLDatabaseResourceCloser { try { connection.close(); } catch (SQLException e) { - /* Do some exception-logging here. */ - e.printStackTrace(); + Bukkit.getLogger().severe("Could not close MySQL connection"); } } } diff --git a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java index 35f5dfd84..689eccc4c 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java @@ -81,7 +81,6 @@ public class IslandWorld { } } catch (Exception e) { Bukkit.getLogger().severe("Not successfull! Disabling " + plugin.getName() + "!"); - e.printStackTrace(); Bukkit.getServer().getPluginManager().disablePlugin(plugin); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java index 4b32a96bb..1cd1ad51d 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java @@ -19,7 +19,7 @@ public class PanelListenerManager implements Listener { //private static final boolean DEBUG = false; - public static HashMap openPanels = new HashMap<>(); + private static HashMap openPanels = new HashMap<>(); @EventHandler(priority = EventPriority.LOWEST) public void onInventoryClick(InventoryClickEvent event) { @@ -28,11 +28,11 @@ public class PanelListenerManager implements Listener { //UUID playerUUID = player.getUniqueId(); Inventory inventory = event.getInventory(); // The inventory that was // Open the inventory panel that this player has open (they can only ever have one) - if (openPanels.containsKey(user.getUniqueId())) { + if (getOpenPanels().containsKey(user.getUniqueId())) { // Check the name of the panel - if (inventory.getName().equals(openPanels.get(user.getUniqueId()).getInventory().getName())) { + if (inventory.getName().equals(getOpenPanels().get(user.getUniqueId()).getInventory().getName())) { // Get the panel itself - Panel panel = openPanels.get(user.getUniqueId()); + Panel panel = getOpenPanels().get(user.getUniqueId()); // Check that they clicked on a specific item for (int slot : panel.getItems().keySet()) { if (slot == event.getRawSlot()) { @@ -48,19 +48,26 @@ public class PanelListenerManager implements Listener { } } else { // Wrong name - delete this panel - openPanels.remove(user.getUniqueId()); + getOpenPanels().remove(user.getUniqueId()); } } } @EventHandler(priority = EventPriority.LOWEST) public void onInventoryClose(InventoryCloseEvent event) { - if (openPanels.containsKey(event.getPlayer().getUniqueId())) openPanels.remove(event.getPlayer().getUniqueId()); + if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) getOpenPanels().remove(event.getPlayer().getUniqueId()); } @EventHandler(priority = EventPriority.NORMAL) public void onLogOut(PlayerQuitEvent event) { - if (openPanels.containsKey(event.getPlayer().getUniqueId())) openPanels.remove(event.getPlayer().getUniqueId()); + if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) getOpenPanels().remove(event.getPlayer().getUniqueId()); + } + + /** + * @return the openPanels + */ + public static HashMap getOpenPanels() { + return openPanels; } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index 0300e740b..cde565123 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -18,6 +18,7 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.flags.Flag.FlagType; +import us.tastybento.bskyblock.database.managers.island.IslandsManager; import us.tastybento.bskyblock.database.objects.Island; /** @@ -27,9 +28,16 @@ import us.tastybento.bskyblock.database.objects.Island; */ public abstract class AbstractFlagListener implements Listener { - public BSkyBlock plugin = BSkyBlock.getInstance(); + private BSkyBlock plugin = BSkyBlock.getInstance(); private User user = null; + /** + * @return the plugin + */ + public BSkyBlock getPlugin() { + return plugin; + } + /** * Used for unit testing only to set the plugin * @param plugin @@ -47,13 +55,13 @@ public abstract class AbstractFlagListener implements Listener { private boolean createEventUser(Event e) { try { // Use reflection to get the getPlayer method if it exists - Method getPlayer = e.getClass().getMethod("getPlayer"); if (getPlayer != null) { setUser(User.getInstance((Player)getPlayer.invoke(e))); return true; } - } catch (Exception e1) { e1.printStackTrace();} + } catch (Exception e1) { // Do nothing + } return false; } @@ -147,7 +155,7 @@ public abstract class AbstractFlagListener implements Listener { if (!inWorld(loc)) return true; // Get the island and if present - Optional island = plugin.getIslands().getIslandAt(loc); + Optional island = getIslands().getIslandAt(loc); // Handle Settings Flag if (flag.getType().equals(FlagType.SETTING)) { @@ -201,4 +209,11 @@ public abstract class AbstractFlagListener implements Listener { return plugin.getFlagsManager().getFlagByID(id); } + /** + * Get the island database manager + * @return the island database manager + */ + protected IslandsManager getIslands() { + return plugin.getIslands(); + } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index 9c9bf9a11..a4fc3d858 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -94,7 +94,7 @@ public class BreakBlocksListener extends AbstractFlagListener { if (inWorld(e.getVehicle()) && e.getAttacker() instanceof Player) { User user = User.getInstance((Player) e.getAttacker()); // Get the island and if present, check the flag, react if required and return - plugin.getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { + getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { if (!x.isAllowed(user, Flags.BREAK_BLOCKS)) { e.setCancelled(true); user.sendMessage("protection.protected"); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index 0fe2e49b3..8be3c7d02 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -40,7 +40,7 @@ public class FireListener extends AbstractFlagListener { return; } // Check if the island exists and if fire is allowed - Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); @@ -59,7 +59,7 @@ public class FireListener extends AbstractFlagListener { return; } // Check if the island exists and if fire is allowed - Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); }); @@ -82,7 +82,7 @@ public class FireListener extends AbstractFlagListener { return; } // Check if the island exists and if fire is allowed - Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); @@ -135,7 +135,7 @@ public class FireListener extends AbstractFlagListener { return; } // Check if the island exists and if fire is allowed - Optional island = plugin.getIslands().getIslandAt(e.getBlock().getLocation()); + Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); }); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index e09b88c54..44d8590b7 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -169,7 +169,7 @@ public class HurtingListener extends AbstractFlagListener { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); - plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> { thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); }, e.getAreaEffectCloud().getDuration()); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index a157ff5da..3fab1f489 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -41,7 +41,7 @@ public class MobSpawnListener extends AbstractFlagListener { || e.getSpawnReason().equals(SpawnReason.DEFAULT) || e.getSpawnReason().equals(SpawnReason.MOUNT) || e.getSpawnReason().equals(SpawnReason.NETHER_PORTAL)) { - Optional island = plugin.getIslands().getIslandAt(e.getLocation()); + Optional island = getIslands().getIslandAt(e.getLocation()); if (island.isPresent()) { if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { if (!island.get().isAllowed(Flags.MOB_SPAWN)) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 81a8b57d7..2d5a61761 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -45,8 +45,8 @@ public class PVPListener extends AbstractFlagListener { public void onEntityDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() instanceof Player) { Flag flag = Flags.PVP_OVERWORLD; - if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; respond(e, e.getDamager(), flag); } } @@ -73,8 +73,8 @@ public class PVPListener extends AbstractFlagListener { public void onFishing(PlayerFishEvent e) { if (e.getCaught() != null && e.getCaught() instanceof Player) { Flag flag = Flags.PVP_OVERWORLD; - if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getCaught().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; if (checkIsland(e, e.getCaught().getLocation(), flag)) { e.getHook().remove(); return; @@ -90,8 +90,8 @@ public class PVPListener extends AbstractFlagListener { public void onSplashPotionSplash(final PotionSplashEvent e) { // Deduce the world Flag flag = Flags.PVP_OVERWORLD; - if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getPotion().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; // Try to get the thrower Projectile projectile = (Projectile) e.getEntity(); @@ -123,7 +123,7 @@ public class PVPListener extends AbstractFlagListener { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); - plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> { thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); }, e.getAreaEffectCloud().getDuration()); } @@ -138,8 +138,8 @@ public class PVPListener extends AbstractFlagListener { if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { // Deduce the world Flag flag = Flags.PVP_OVERWORLD; - if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getEntity().getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; + else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; UUID attacker = thrownPotions.get(e.getDamager().getEntityId()); // Self damage diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index 87fc3fd29..dc910c2a0 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.bukkit.Bukkit; import org.bukkit.Material; import us.tastybento.bskyblock.api.flags.Flag; @@ -126,9 +127,8 @@ public class Flags { return Arrays.asList(Flags.class.getFields()).stream().map(field -> { try { return (Flag)field.get(null); - } catch (IllegalArgumentException | IllegalAccessException e) { - - e.printStackTrace(); + } catch (IllegalArgumentException | IllegalAccessException e) { + Bukkit.getLogger().severe("Could not get Flag values " + e.getMessage()); } return null; }).collect(Collectors.toList()); diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index a5fcc1268..373a95caa 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -64,10 +64,7 @@ public final class AddonsManager { try { f.mkdir(); } catch (SecurityException e) { - e.printStackTrace(); - if (DEBUG) { - Bukkit.getLogger().severe("Cannot create folder 'addons' (Permission ?)"); - } + Bukkit.getLogger().severe("Cannot create folder 'addons' (Permission ?)"); } } @@ -182,7 +179,7 @@ public final class AddonsManager { try { loader.close(); } catch (IOException e) { - e.printStackTrace(); + // Do nothing } }); } diff --git a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java index 41b23dcc4..9d14ece75 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java @@ -2,6 +2,7 @@ package us.tastybento.bskyblock.managers; import java.io.File; import java.io.FilenameFilter; +import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Locale; @@ -78,20 +79,24 @@ public final class LocalesManager { try { for (String name : lister.listJar(LOCALE_FOLDER)) { // We cannot use Bukkit's saveResource, because we want it to go into a specific folder, so... - InputStream initialStream = plugin.getResource(name); - // Get the last part of the name - int lastIndex = name.lastIndexOf('/'); - File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length())); - if (DEBUG) - plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath()); - if (!targetFile.exists()) { - java.nio.file.Files.copy(initialStream, targetFile.toPath()); + try (InputStream initialStream = plugin.getResource(name)) { + // Get the last part of the name + int lastIndex = name.lastIndexOf('/'); + File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length())); + if (DEBUG) + plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath()); + if (!targetFile.exists()) { + java.nio.file.Files.copy(initialStream, targetFile.toPath()); + } + } catch (IOException e) { + plugin.getLogger().severe("Could not copy locale files from jar " + e.getMessage()); } - initialStream.close(); + } - } catch (Exception e) { - e.printStackTrace(); + } catch (IOException e) { + plugin.getLogger().severe("Could not copy locale files from jar " + e.getMessage()); } + } // Store all the locales available diff --git a/src/main/java/us/tastybento/bskyblock/util/Util.java b/src/main/java/us/tastybento/bskyblock/util/Util.java index b1209a654..9783cca77 100755 --- a/src/main/java/us/tastybento/bskyblock/util/Util.java +++ b/src/main/java/us/tastybento/bskyblock/util/Util.java @@ -287,7 +287,7 @@ public class Util { config = new YamlConfiguration(); config.load(yamlFile); } catch (Exception e) { - e.printStackTrace(); + plugin.getLogger().severe("Could not load yml file " + e.getMessage()); } } else { // Create the missing file diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java index 1578ccb3c..332f069c1 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java @@ -40,7 +40,6 @@ public class PlaceholderHandler { } catch (Exception e){ // Should never happen. plugin.getLogger().severe("Failed to load default placeholder API"); - e.printStackTrace(); } // Load hooks From fc8876cf8011098d2a239cf84263b9479feacfb2 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 21:13:32 -0800 Subject: [PATCH 75/97] Fixed return values to match pass/fail. --- .../island/teams/IslandTeamInviteAcceptCommand.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java index 89a81ca68..023cefda7 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java @@ -33,23 +33,23 @@ public class IslandTeamInviteAcceptCommand extends AbstractIslandTeamCommand { UUID playerUUID = user.getUniqueId(); if(!inviteList.containsKey(playerUUID)) - return true; + return false; // Check if player has been invited if (!inviteList.containsKey(playerUUID)) { user.sendMessage("commands.island.team.invite.errors.none-invited-you"); - return true; + return false; } // Check if player is already in a team if (getPlayers().inTeam(playerUUID)) { user.sendMessage("commands.island.team.invite.errors.you-already-are-in-team"); - return true; + return false; } // Get the team leader UUID prospectiveTeamLeaderUUID = inviteList.get(playerUUID); if (!getIslands().hasIsland(prospectiveTeamLeaderUUID)) { user.sendMessage("commands.island.team.invite.errors.invalid-invite"); inviteList.remove(playerUUID); - return true; + return false; } if (DEBUG) getPlugin().getLogger().info("DEBUG: Invite is valid"); From b253ff5c64b3433ae7422164479710b3c4db74d1 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 21:33:36 -0800 Subject: [PATCH 76/97] Code cleanup. --- .../us/tastybento/bskyblock/Constants.java | 1 - .../bskyblock/generators/IslandWorld.java | 40 +++++++++++-------- .../bskyblock/managers/AddonsManager.java | 3 +- .../bskyblock/util/SafeSpotTeleport.java | 4 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/Constants.java b/src/main/java/us/tastybento/bskyblock/Constants.java index 1d12b6247..902cb5dfd 100644 --- a/src/main/java/us/tastybento/bskyblock/Constants.java +++ b/src/main/java/us/tastybento/bskyblock/Constants.java @@ -31,5 +31,4 @@ public class Constants { // Admin command public static final String ADMINCOMMAND = "bsadmin"; - } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java index 689eccc4c..307c5936e 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java @@ -9,6 +9,12 @@ import us.tastybento.bskyblock.BSkyBlock; public class IslandWorld { + private static final String MULTIVERSE_SET_GENERATOR = "mv modify set generator "; + private static final String MULTIVERSE_IMPORT = "mv import "; + private static final String NETHER = "_nether"; + private static final String THE_END = "_the_end"; + private static final String CREATING = "Creating "; + private BSkyBlock plugin; private static World islandWorld; private static World netherWorld; @@ -24,32 +30,32 @@ public class IslandWorld { return; } if (plugin.getServer().getWorld(plugin.getSettings().getWorldName()) == null) { - Bukkit.getLogger().info("Creating " + plugin.getName() + "'s Island World..."); + Bukkit.getLogger().info(CREATING + plugin.getName() + "'s Island World..."); } // Create the world if it does not exist islandWorld = WorldCreator.name(plugin.getSettings().getWorldName()).type(WorldType.FLAT).environment(World.Environment.NORMAL).generator(new ChunkGeneratorWorld(plugin)) .createWorld(); // Make the nether if it does not exist if (plugin.getSettings().isNetherGenerate()) { - if (plugin.getServer().getWorld(plugin.getSettings().getWorldName() + "_nether") == null) { - Bukkit.getLogger().info("Creating " + plugin.getName() + "'s Nether..."); + if (plugin.getServer().getWorld(plugin.getSettings().getWorldName() + NETHER) == null) { + Bukkit.getLogger().info(CREATING + plugin.getName() + "'s Nether..."); } if (!plugin.getSettings().isNetherIslands()) { - netherWorld = WorldCreator.name(plugin.getSettings().getWorldName() + "_nether").type(WorldType.NORMAL).environment(World.Environment.NETHER).createWorld(); + netherWorld = WorldCreator.name(plugin.getSettings().getWorldName() + NETHER).type(WorldType.NORMAL).environment(World.Environment.NETHER).createWorld(); } else { - netherWorld = WorldCreator.name(plugin.getSettings().getWorldName() + "_nether").type(WorldType.FLAT).generator(new ChunkGeneratorWorld(plugin)) + netherWorld = WorldCreator.name(plugin.getSettings().getWorldName() + NETHER).type(WorldType.FLAT).generator(new ChunkGeneratorWorld(plugin)) .environment(World.Environment.NETHER).createWorld(); } } // Make the end if it does not exist if (plugin.getSettings().isEndGenerate()) { - if (plugin.getServer().getWorld(plugin.getSettings().getWorldName() + "_the_end") == null) { - Bukkit.getLogger().info("Creating " + plugin.getName() + "'s End World..."); + if (plugin.getServer().getWorld(plugin.getSettings().getWorldName() + THE_END) == null) { + Bukkit.getLogger().info(CREATING + plugin.getName() + "'s End World..."); } if (!plugin.getSettings().isEndIslands()) { - endWorld = WorldCreator.name(plugin.getSettings().getWorldName() + "_the_end").type(WorldType.NORMAL).environment(World.Environment.THE_END).createWorld(); + endWorld = WorldCreator.name(plugin.getSettings().getWorldName() + THE_END).type(WorldType.NORMAL).environment(World.Environment.THE_END).createWorld(); } else { - endWorld = WorldCreator.name(plugin.getSettings().getWorldName() + "_the_end").type(WorldType.FLAT).generator(new ChunkGeneratorWorld(plugin)) + endWorld = WorldCreator.name(plugin.getSettings().getWorldName() + THE_END).type(WorldType.FLAT).generator(new ChunkGeneratorWorld(plugin)) .environment(World.Environment.THE_END).createWorld(); } } @@ -62,22 +68,22 @@ public class IslandWorld { Bukkit.getLogger().info("Trying to register generator with Multiverse "); try { Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv import " + plugin.getSettings().getWorldName() + " normal -g " + plugin.getName()); + MULTIVERSE_IMPORT + plugin.getSettings().getWorldName() + " normal -g " + plugin.getName()); if (!Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv modify set generator " + plugin.getName() + " " + plugin.getSettings().getWorldName())) { + MULTIVERSE_SET_GENERATOR + plugin.getName() + " " + plugin.getSettings().getWorldName())) { Bukkit.getLogger().severe("Multiverse is out of date! - Upgrade to latest version!"); } if (netherWorld != null && plugin.getSettings().isNetherGenerate() && plugin.getSettings().isNetherIslands()) { Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv import " + plugin.getSettings().getWorldName() + "_nether nether -g " + plugin.getName()); + MULTIVERSE_IMPORT + plugin.getSettings().getWorldName() + "_nether nether -g " + plugin.getName()); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv modify set generator " + plugin.getName() + " " + plugin.getSettings().getWorldName() + "_nether"); + MULTIVERSE_SET_GENERATOR + plugin.getName() + " " + plugin.getSettings().getWorldName() + NETHER); } if (endWorld != null && plugin.getSettings().isEndGenerate() && plugin.getSettings().isEndIslands()) { Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv import " + plugin.getSettings().getWorldName() + "_the_end end -g " + plugin.getName()); + MULTIVERSE_IMPORT + plugin.getSettings().getWorldName() + "_the_end end -g " + plugin.getName()); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), - "mv modify set generator " + plugin.getName() + " " + plugin.getSettings().getWorldName() + "_the_end"); + MULTIVERSE_SET_GENERATOR + plugin.getName() + " " + plugin.getSettings().getWorldName() + THE_END); } } catch (Exception e) { Bukkit.getLogger().severe("Not successfull! Disabling " + plugin.getName() + "!"); @@ -103,7 +109,7 @@ public class IslandWorld { */ public World getNetherWorld() { if (plugin.getSettings().isUseOwnGenerator()) { - return Bukkit.getServer().getWorld(plugin.getSettings().getWorldName() + "_nether"); + return Bukkit.getServer().getWorld(plugin.getSettings().getWorldName() + NETHER); } return netherWorld; } @@ -113,7 +119,7 @@ public class IslandWorld { */ public World getEndWorld() { if (plugin.getSettings().isUseOwnGenerator()) { - return Bukkit.getServer().getWorld(plugin.getSettings().getWorldName() + "_the_end"); + return Bukkit.getServer().getWorld(plugin.getSettings().getWorldName() + THE_END); } return endWorld; } diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 373a95caa..46ea6ce92 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -124,8 +124,7 @@ public final class AddonsManager { File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + addon.getDescription().getName()); // Obtain any locale files and save them - for (String localeFile : listJarYamlFiles(jar, "locales")) { - //plugin.getLogger().info("DEBUG: saving " + localeFile + " from jar"); + for (String localeFile : listJarYamlFiles(jar, LOCALE_FOLDER)) { addon.saveResource(localeFile, localeDir, false, true); } plugin.getLocalesManager().loadLocales(addon.getDescription().getName()); diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index c2790efef..a745d7ece 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -23,8 +23,6 @@ import us.tastybento.bskyblock.database.objects.Island; */ public class SafeSpotTeleport { - //private NMSAbstraction nms; - //private BSkyBlock plugin; /** * Teleport to a safe place and if it fails, show a failure message * @param plugin @@ -58,6 +56,8 @@ public class SafeSpotTeleport { } /** * Teleport to a safe spot on an island + * + * TODO: REFACTOR THIS! * @param plugin * @param entity From 5314f3618ad4e57eac10b11c04e84017629aef32 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Wed, 7 Feb 2018 21:33:55 -0800 Subject: [PATCH 77/97] Removed unused imports. --- .../java/us/tastybento/bskyblock/managers/FlagsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 4f59d5559..71984d2e9 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -4,8 +4,8 @@ import java.util.ArrayList; import java.util.HashMap; import org.bukkit.Bukkit; - import org.bukkit.event.Listener; + import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.api.panels.PanelItem; From 98b49ea37a9ee16121b6b674a4eebae4f66ef90b Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 8 Feb 2018 20:06:00 -0800 Subject: [PATCH 78/97] Fixed bug where if statement had a ; in it --- .../database/managers/island/IslandCache.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index 13dd1e32a..a50217191 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -31,12 +31,12 @@ public class IslandCache { private HashMap islandsByUUID; // 2D islandGrid of islands, x,z private TreeMap> islandGrid = new TreeMap<>(); - + public IslandCache() { islandsByLocation = HashBiMap.create(); islandsByUUID = new HashMap<>(); } - + /** * Adds an island to the grid * @param island @@ -55,11 +55,11 @@ public class IslandCache { } addToGrid(island); } - + public void addPlayer(UUID playerUUID, Island teamIsland) { islandsByUUID.put(playerUUID, teamIsland); } - + /** * Adds an island to the grid register * @param newIsland @@ -109,12 +109,12 @@ public class IslandCache { islandGrid.put(newIsland.getMinX(), zEntry); } } - + public void clear() { islandsByLocation.clear(); islandsByUUID.clear(); } - + public Island createIsland(Island island) { islandsByLocation.put(island.getCenter(), island); if (island.getOwner() != null) @@ -122,7 +122,7 @@ public class IslandCache { addToGrid(island); return island; } - + /** * Create an island with no owner at location * @param location @@ -130,7 +130,7 @@ public class IslandCache { public Island createIsland(Location location){ return createIsland(location, null); } - + /** * Create an island with owner. Note this does not create the schematic. It just creates the island data object. * @param location @@ -187,15 +187,15 @@ public class IslandCache { } } } - + public Island get(Location location) { return islandsByLocation.get(location); } - + public Island get(UUID uuid) { return islandsByUUID.get(uuid); } - + /** * Gets the island for this player. If they are in a team, the team island is returned * @param uuid @@ -310,7 +310,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: checking if " + playerUUID + " has an island"); plugin.getLogger().info("DEBUG: islandsByUUID : " + islandsByUUID.toString()); - + if (!islandsByUUID.containsKey(playerUUID)) { plugin.getLogger().info("DEBUG: player is not in islandsByUUID"); } else { @@ -348,7 +348,7 @@ public class IslandCache { if (DEBUG) plugin.getLogger().info("DEBUG: removing reference to island by UUID"); islandsByUUID.remove(playerUUID); - + } public void setIslandName(UUID owner, String name) { @@ -356,7 +356,7 @@ public class IslandCache { Island island = islandsByUUID.get(owner); island.setName(name); } - + } public int size() { @@ -374,8 +374,9 @@ public class IslandCache { } if (o instanceof Island) { Island is = (Island)o; - if (is.getOwner() != null && islandsByUUID.containsKey(is.getOwner())); - return true; + if (is.getOwner() != null && islandsByUUID.containsKey(is.getOwner())) { + return true; + } } return false; } From c916bbf82729fcbcd502de74c271a526fde3adb9 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 8 Feb 2018 20:08:46 -0800 Subject: [PATCH 79/97] Automated code cleanup. Removes spaces, adds {} to if statements, etc. --- .../us/tastybento/bskyblock/BSkyBlock.java | 8 +- .../us/tastybento/bskyblock/Constants.java | 2 +- .../java/us/tastybento/bskyblock/Metrics.java | 34 ++-- .../us/tastybento/bskyblock/Settings.java | 26 +-- .../bskyblock/api/addons/Addon.java | 66 ++++--- .../api/addons/AddonClassLoader.java | 94 ++++----- .../api/addons/AddonDescription.java | 26 +-- .../api/addons/exception/AddonException.java | 16 +- .../InvalidAddonFormatException.java | 38 ++-- .../InvalidAddonInheritException.java | 14 +- .../api/commands/CompositeCommand.java | 66 ++++--- .../api/commands/DefaultHelpCommand.java | 4 +- .../bskyblock/api/commands/User.java | 38 ++-- .../api/configuration/ConfigEntry.java | 2 +- .../api/configuration/ISettings.java | 6 +- .../bskyblock/api/events/IslandBaseEvent.java | 16 +- .../bskyblock/api/events/PremadeEvent.java | 2 +- .../api/events/addon/AddonEvent.java | 16 +- .../api/events/command/CommandEvent.java | 10 +- .../api/events/island/FlagChangeEvent.java | 4 +- .../api/events/island/IslandEvent.java | 6 +- .../api/events/purge/PurgeStartEvent.java | 18 +- .../bskyblock/api/events/team/TeamEvent.java | 4 +- .../tastybento/bskyblock/api/flags/Flag.java | 6 +- .../bskyblock/api/flags/FlagBuilder.java | 10 +- .../bskyblock/api/localization/BSBLocale.java | 12 +- .../bskyblock/api/panels/Panel.java | 2 +- .../bskyblock/api/panels/PanelItem.java | 13 +- .../bskyblock/api/panels/PanelListener.java | 2 +- .../api/panels/builders/PanelBuilder.java | 16 +- .../api/panels/builders/PanelItemBuilder.java | 9 +- .../bskyblock/commands/AdminCommand.java | 6 +- .../bskyblock/commands/IslandCommand.java | 14 +- .../commands/admin/AdminReloadCommand.java | 2 +- .../commands/admin/AdminTeleportCommand.java | 16 +- .../commands/admin/AdminVersionCommand.java | 2 +- .../island/CustomIslandMultiHomeHelp.java | 18 +- .../commands/island/IslandAboutCommand.java | 6 +- .../commands/island/IslandCreateCommand.java | 12 +- .../commands/island/IslandGoCommand.java | 8 +- .../commands/island/IslandResetCommand.java | 19 +- .../island/IslandResetnameCommand.java | 10 +- .../commands/island/IslandSethomeCommand.java | 8 +- .../commands/island/IslandSetnameCommand.java | 18 +- .../teams/AbstractIslandTeamCommand.java | 10 +- .../island/teams/IslandTeamCommand.java | 21 +- .../teams/IslandTeamInviteAcceptCommand.java | 32 +-- .../island/teams/IslandTeamInviteCommand.java | 14 +- .../teams/IslandTeamInviteRejectCommand.java | 14 +- .../island/teams/IslandTeamKickCommand.java | 12 +- .../island/teams/IslandTeamLeaveCommand.java | 6 +- .../teams/IslandTeamPromoteCommand.java | 10 +- .../teams/IslandTeamSetownerCommand.java | 14 +- .../bskyblock/database/BSBDatabase.java | 4 +- .../flatfile/FlatFileDatabaseConnecter.java | 5 +- .../flatfile/FlatFileDatabaseHandler.java | 97 +++++---- .../database/managers/PlayersManager.java | 49 +++-- .../database/managers/island/IslandCache.java | 84 +++++--- .../managers/island/IslandsManager.java | 114 +++++++---- .../database/managers/island/NewIsland.java | 34 ++-- .../database/mysql/MySQLDatabaseHandler.java | 187 +++++++++++------- .../mysql/MySQLDatabaseResourceCloser.java | 9 +- .../database/objects/DataObject.java | 6 +- .../bskyblock/database/objects/Island.java | 58 +++--- .../bskyblock/database/objects/Players.java | 31 +-- .../database/objects/adapters/Adapter.java | 2 +- .../objects/adapters/AdapterInterface.java | 6 +- .../objects/adapters/FlagSerializer.java | 8 +- .../adapters/PotionEffectListAdapter.java | 14 +- .../generators/ChunkGeneratorWorld.java | 2 +- .../bskyblock/generators/IslandWorld.java | 4 +- .../bskyblock/generators/NetherPopulator.java | 22 +-- .../island/builders/IslandBuilder.java | 22 +-- .../listeners/JoinLeaveListener.java | 26 ++- .../listeners/PanelListenerManager.java | 10 +- .../listeners/flags/AbstractFlagListener.java | 30 +-- .../flags/BlockInteractionListener.java | 10 +- .../listeners/flags/BreakBlocksListener.java | 10 +- .../listeners/flags/BreedingListener.java | 2 +- .../listeners/flags/BucketListener.java | 14 +- .../listeners/flags/EggListener.java | 2 +- .../flags/EntityInteractListener.java | 6 +- .../listeners/flags/FireListener.java | 38 +++- .../listeners/flags/HurtingListener.java | 11 +- .../listeners/flags/InventoryListener.java | 6 +- .../flags/ItemDropPickUpListener.java | 2 +- .../listeners/flags/LeashListener.java | 2 +- .../listeners/flags/MobSpawnListener.java | 6 +- .../listeners/flags/PVPListener.java | 36 ++-- .../flags/PhysicalInteractionListener.java | 2 +- .../listeners/flags/PlaceBlocksListener.java | 6 +- .../listeners/flags/PortalListener.java | 2 +- .../listeners/flags/ShearingListener.java | 2 +- .../flags/TeleportationListener.java | 4 +- .../listeners/protection/FlyingMobEvents.java | 2 +- .../us/tastybento/bskyblock/lists/Flags.java | 8 +- .../bskyblock/managers/AddonsManager.java | 29 +-- .../bskyblock/managers/CommandsManager.java | 7 +- .../bskyblock/managers/FlagsManager.java | 4 +- .../bskyblock/managers/LocalesManager.java | 41 ++-- .../bskyblock/managers/RanksManager.java | 16 +- .../bskyblock/util/DeleteIslandChunks.java | 6 +- .../tastybento/bskyblock/util/FileLister.java | 6 +- .../bskyblock/util/SafeSpotTeleport.java | 6 +- .../us/tastybento/bskyblock/util/Util.java | 41 ++-- .../bskyblock/util/YmlCommentParser.java | 4 +- .../util/placeholders/PlaceholderHandler.java | 6 +- .../placeholders/PlaceholderInterface.java | 10 +- .../util/placeholders/Placeholders.java | 4 +- .../hooks/InternalPlaceholderImpl.java | 6 +- src/test/java/bskyblock/TestBSkyBlock.java | 107 +++++----- 111 files changed, 1223 insertions(+), 923 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index 966641d99..ce4595bae 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -50,9 +50,9 @@ public class BSkyBlock extends JavaPlugin { // Save the default config from config.yml saveDefaultConfig(); setInstance(this); - + settings = new Settings(); - // Load settings from config.yml. This will check if there are any issues with it too. + // Load settings from config.yml. This will check if there are any issues with it too. try { //settings.saveSettings(); settings = settings.loadSettings(); @@ -88,7 +88,7 @@ public class BSkyBlock extends JavaPlugin { islandWorldManager = new IslandWorld(plugin); getServer().getScheduler().runTask(plugin, () -> { - + // Load Flags flagsManager = new FlagsManager(plugin); @@ -187,7 +187,7 @@ public class BSkyBlock extends JavaPlugin { private static void setInstance(BSkyBlock plugin) { BSkyBlock.plugin = plugin; } - + public static BSkyBlock getInstance() { return plugin; } diff --git a/src/main/java/us/tastybento/bskyblock/Constants.java b/src/main/java/us/tastybento/bskyblock/Constants.java index 902cb5dfd..f2b12cc68 100644 --- a/src/main/java/us/tastybento/bskyblock/Constants.java +++ b/src/main/java/us/tastybento/bskyblock/Constants.java @@ -20,7 +20,7 @@ public class Constants { public static final String ISLANDCOMMAND = "ai"; // Admin command public static final String ADMINCOMMAND = "acid"; - */ + */ public static final GameType GAMETYPE = GameType.BSKYBLOCK; // Permission prefix public static final String PERMPREFIX = "bskyblock."; diff --git a/src/main/java/us/tastybento/bskyblock/Metrics.java b/src/main/java/us/tastybento/bskyblock/Metrics.java index 25be8f7ed..670c6182f 100755 --- a/src/main/java/us/tastybento/bskyblock/Metrics.java +++ b/src/main/java/us/tastybento/bskyblock/Metrics.java @@ -30,7 +30,7 @@ import org.json.simple.JSONObject; * bStats collects some data for plugin authors. * * Check out https://bStats.org/ to learn more about bStats! - * + * * @author BtoBastian */ @SuppressWarnings("unchecked") @@ -96,7 +96,7 @@ public class Metrics { "To honor their work, you should not disable it.\n" + "This has nearly no effect on the server performance!\n" + "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); + ).copyDefaults(true); try { config.save(configFile); } catch (IOException ignored) { } @@ -150,12 +150,7 @@ public class Metrics { } // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - submitData(); - } - }); + Bukkit.getScheduler().runTask(plugin, () -> submitData()); } }, 1000*60*5L, 1000*60*30L); // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start @@ -250,17 +245,14 @@ public class Metrics { data.put("plugins", pluginData); // Create a new thread for the connection to the bStats server - new Thread(new Runnable() { - @Override - public void run() { - try { - // Send the data - sendData(data); - } catch (Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } + new Thread(() -> { + try { + // Send the data + sendData(data); + } catch (Exception e) { + // Something went wrong! :( + if (logFailedRequests) { + plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); } } }).start(); @@ -283,7 +275,9 @@ public class Metrics { // Compress the data to save bandwidth byte[] compressedData = compress(data.toString()); - if (compressedData == null) throw new Exception(); + if (compressedData == null) { + throw new Exception(); + } // Add headers connection.setRequestMethod("POST"); connection.addRequestProperty("Accept", "application/json"); diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index f9b587eb7..fdf568b61 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -155,7 +155,7 @@ public class Settings implements ISettings { // Reset @ConfigEntry(path = "island.reset.reset-limit") private int resetLimit = -1; - + @ConfigEntry(path = "island.require-confirmation.reset") private boolean resetConfirmation = true; @@ -164,7 +164,7 @@ public class Settings implements ISettings { @ConfigEntry(path = "island.reset.leavers-lose-reset") private boolean leaversLoseReset = false; - + @ConfigEntry(path = "island.reset.kicked-keep-inventory") private boolean kickedKeepInventory = false; @@ -173,16 +173,16 @@ public class Settings implements ISettings { private boolean removeMobsOnLogin = false; @ConfigEntry(path = "island.remove-mobs.on-island") private boolean removeMobsOnIsland = false; - + @ConfigEntry(path = "island.remove-mobs.whitelist") private List removeMobsWhitelist = new ArrayList<>(); @ConfigEntry(path = "island.make-island-if-none") private boolean makeIslandIfNone = false; - + @ConfigEntry(path = "island.immediate-teleport-on-island") private boolean immediateTeleportOnIsland = false; - + private boolean respawnOnIsland = true; // Deaths @@ -191,7 +191,7 @@ public class Settings implements ISettings { @ConfigEntry(path = "island.deaths.sum-team") private boolean deathsSumTeam = false; - + // Ranks @ConfigEntry(path = "island.customranks") private Map customRanks = new HashMap<>(); @@ -250,10 +250,10 @@ public class Settings implements ISettings { /* SCHEMATICS */ private List companionNames = new ArrayList<>(); - + @ConfigEntry(path = "island.chest-items") private List chestItems = new ArrayList<>(); - + private EntityType companionType = EntityType.COW; private boolean useOwnGenerator; @@ -267,13 +267,13 @@ public class Settings implements ISettings { @ConfigEntry(path = "island.require-confirmation.kick-wait") private long kickWait = 300; - + @ConfigEntry(path = "island.require-confirmation.leave") private boolean leaveConfirmation = true; @ConfigEntry(path = "island.require-confirmation.leave-wait") private long leaveWait = 300; - + /** * @return the acidDamage @@ -540,6 +540,7 @@ public class Settings implements ISettings { /** * @return the uniqueId */ + @Override public String getUniqueId() { return uniqueId; } @@ -1137,7 +1138,7 @@ public class Settings implements ISettings { public void setRemoveMobsOnIsland(boolean removeMobsOnIsland) { this.removeMobsOnIsland = removeMobsOnIsland; } - + /** * @param removeMobsOnLogin the removeMobsOnLogin to set */ @@ -1207,6 +1208,7 @@ public class Settings implements ISettings { /** * @param uniqueId the uniqueId to set */ + @Override public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } @@ -1240,6 +1242,6 @@ public class Settings implements ISettings { public void setFakePlayers(Set fakePlayers) { this.fakePlayers = fakePlayers; } - + } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java index 105e0c354..41e345520 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java @@ -16,8 +16,8 @@ import org.bukkit.event.Listener; import us.tastybento.bskyblock.BSkyBlock; /** - * Add-on class for BSkyBlock. Extend this to create an add-on. - * The operation and methods are very similar to Bukkit's JavaPlugin. + * Add-on class for BSkyBlock. Extend this to create an add-on. The operation + * and methods are very similar to Bukkit's JavaPlugin. * * @author tastybento, ComminQ_Q */ @@ -32,10 +32,10 @@ public abstract class Addon implements AddonInterface { private File file; public Addon() { - this.enabled = false; + enabled = false; } - public BSkyBlock getBSkyBlock(){ + public BSkyBlock getBSkyBlock() { return BSkyBlock.getInstance(); } @@ -77,6 +77,7 @@ public abstract class Addon implements AddonInterface { /** * Convenience method to obtain the server + * * @return the server object */ public Server getServer() { @@ -89,6 +90,7 @@ public abstract class Addon implements AddonInterface { /** * Load a YAML file + * * @param file * @return Yaml File configuration */ @@ -109,9 +111,10 @@ public abstract class Addon implements AddonInterface { /** * Register a listener for this addon + * * @param listener */ - public void registerListener(Listener listener){ + public void registerListener(Listener listener) { BSkyBlock.getInstance().getServer().getPluginManager().registerEvents(listener, BSkyBlock.getInstance()); } @@ -120,15 +123,15 @@ public abstract class Addon implements AddonInterface { */ public void saveConfig() { try { - this.config.save(new File(dataFolder, ADDON_CONFIG_FILENAME)); + config.save(new File(dataFolder, ADDON_CONFIG_FILENAME)); } catch (IOException e) { Bukkit.getLogger().severe("Could not save config!"); } } /** - * Saves the addon's config.yml file to the addon's data folder and loads it. - * If the file exists already, it will not be replaced. + * Saves the addon's config.yml file to the addon's data folder and loads it. If + * the file exists already, it will not be replaced. */ public void saveDefaultConfig() { saveResource(ADDON_CONFIG_FILENAME, false); @@ -136,20 +139,30 @@ public abstract class Addon implements AddonInterface { } /** - * Saves a resource contained in this add-on's jar file to the addon's data folder. - * @param resourcePath in jar file - * @param replace - if true, will overwrite previous file + * Saves a resource contained in this add-on's jar file to the addon's data + * folder. + * + * @param resourcePath + * in jar file + * @param replace + * - if true, will overwrite previous file */ public void saveResource(String resourcePath, boolean replace) { saveResource(resourcePath, dataFolder, replace, false); } /** - * Saves a resource contained in this add-on's jar file to the destination folder. - * @param jarResource in jar file - * @param destinationFolder on file system - * @param replace - if true, will overwrite previous file - * @param noPath - if true, the resource's path will be ignored when saving + * Saves a resource contained in this add-on's jar file to the destination + * folder. + * + * @param jarResource + * in jar file + * @param destinationFolder + * on file system + * @param replace + * - if true, will overwrite previous file + * @param noPath + * - if true, the resource's path will be ignored when saving */ public void saveResource(String jarResource, File destinationFolder, boolean replace, boolean noPath) { if (jarResource == null || jarResource.equals("")) { @@ -162,7 +175,8 @@ public abstract class Addon implements AddonInterface { if (jarConfig != null) { try (InputStream in = jar.getInputStream(jarConfig)) { if (in == null) { - throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); + throw new IllegalArgumentException( + "The embedded resource '" + jarResource + "' cannot be found in " + jar.getName()); } // There are two options, use the path of the resource or not File outFile = new File(destinationFolder, jarResource); @@ -181,36 +195,42 @@ public abstract class Addon implements AddonInterface { } } } catch (IOException e) { - Bukkit.getLogger().severe("Could not save from jar file. From " + jarResource + " to " + destinationFolder.getAbsolutePath()); + Bukkit.getLogger().severe( + "Could not save from jar file. From " + jarResource + " to " + destinationFolder.getAbsolutePath()); } } /** * Set the file that contains this addon - * @param f the file to set + * + * @param f + * the file to set */ public void setAddonFile(File f) { - this.file = f; + file = f; } /** * Set this addon's data folder + * * @param file */ public void setDataFolder(File file) { - this.dataFolder = file; + dataFolder = file; } /** * Set this addons description + * * @param desc */ - public void setDescription(AddonDescription desc){ - this.description = desc; + public void setDescription(AddonDescription desc) { + description = desc; } /** * Set whether this addon is enabled or not + * * @param enabled */ public void setEnabled(boolean enabled) { diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index aff49e67c..1c8bbc247 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -20,57 +20,57 @@ import us.tastybento.bskyblock.managers.AddonsManager; */ public class AddonClassLoader extends URLClassLoader { - private final Map> classes = new HashMap>(); - private Addon addon; + private final Map> classes = new HashMap<>(); + private Addon addon; private AddonsManager loader; - - public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, ClassLoader parent) - throws InvalidAddonInheritException, - MalformedURLException, - InvalidAddonFormatException, - InvalidDescriptionException, - InstantiationException, - IllegalAccessException { - super(new URL[]{path.toURI().toURL()}, parent); - - this.loader = addonsManager; - - Class javaClass = null; - try { - //Bukkit.getLogger().info("data " + data.get("main")); - /* + + public AddonClassLoader(AddonsManager addonsManager, Mapdata, File path, ClassLoader parent) + throws InvalidAddonInheritException, + MalformedURLException, + InvalidAddonFormatException, + InvalidDescriptionException, + InstantiationException, + IllegalAccessException { + super(new URL[]{path.toURI().toURL()}, parent); + + loader = addonsManager; + + Class javaClass = null; + try { + //Bukkit.getLogger().info("data " + data.get("main")); + /* for (Entry en : data.entrySet()) { Bukkit.getLogger().info(en.getKey() + " => " + en.getValue()); }*/ - javaClass = Class.forName(data.get("main"), true, this); - if(data.get("main").contains("us.tastybento")){ - throw new InvalidAddonFormatException("Packages declaration cannot start with 'us.tastybento'"); - } - } catch (ClassNotFoundException e) { - BSkyBlock.getInstance().getLogger().severe("Could not load '" + path.getName() + "' in folder '" + path.getParent() + "'"); - throw new InvalidDescriptionException("Invalid addon.yml"); - } - - Class addonClass; - try{ - addonClass = javaClass.asSubclass(Addon.class); - } catch(ClassCastException e){ - throw new InvalidAddonInheritException("Main class doesn't not extends super class 'Addon'"); - } - - this.addon = addonClass.newInstance(); - addon.setDescription(this.asDescription(data)); - } - - private AddonDescription asDescription(Map data){ - String[] authors = data.get("authors").split("\\,"); - - return new AddonDescriptionBuilder(data.get("name")) - .withVersion(data.get("version")) - .withAuthor(authors).build(); - } + javaClass = Class.forName(data.get("main"), true, this); + if(data.get("main").contains("us.tastybento")){ + throw new InvalidAddonFormatException("Packages declaration cannot start with 'us.tastybento'"); + } + } catch (ClassNotFoundException e) { + BSkyBlock.getInstance().getLogger().severe("Could not load '" + path.getName() + "' in folder '" + path.getParent() + "'"); + throw new InvalidDescriptionException("Invalid addon.yml"); + } + + Class addonClass; + try{ + addonClass = javaClass.asSubclass(Addon.class); + } catch(ClassCastException e){ + throw new InvalidAddonInheritException("Main class doesn't not extends super class 'Addon'"); + } + + addon = addonClass.newInstance(); + addon.setDescription(asDescription(data)); + } + + private AddonDescription asDescription(Map data){ + String[] authors = data.get("authors").split("\\,"); + + return new AddonDescriptionBuilder(data.get("name")) + .withVersion(data.get("version")) + .withAuthor(authors).build(); + } + - /* (non-Javadoc) * @see java.net.URLClassLoader#findClass(java.lang.String) */ @@ -118,5 +118,5 @@ public class AddonClassLoader extends URLClassLoader { public Addon getAddon() { return addon; } - + } diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java index b778f8233..22372fa45 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonDescription.java @@ -15,7 +15,7 @@ public final class AddonDescription { private List authors; public AddonDescription() {} - + public AddonDescription(String main, String name, String version, String description, List authors) { this.main = main; this.name = name; @@ -78,34 +78,34 @@ public final class AddonDescription { public List getAuthors() { return authors; } - + public static class AddonDescriptionBuilder{ - + private AddonDescription description; - + public AddonDescriptionBuilder(String name){ description = new AddonDescription(); description.setName(name); } - + public AddonDescriptionBuilder withAuthor(String... authors){ - this.description.setAuthors(Arrays.asList(authors)); + description.setAuthors(Arrays.asList(authors)); return this; } - + public AddonDescriptionBuilder withDescription(String desc){ - this.description.setDescription(desc); + description.setDescription(desc); return this; } - + public AddonDescriptionBuilder withVersion(String version){ - this.description.setVersion(version); + description.setVersion(version); return this; } - + public AddonDescription build(){ - return this.description; + return description; } - + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/exception/AddonException.java b/src/main/java/us/tastybento/bskyblock/api/addons/exception/AddonException.java index a0960e33e..0c15d3988 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/exception/AddonException.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/exception/AddonException.java @@ -2,13 +2,13 @@ package us.tastybento.bskyblock.api.addons.exception; public abstract class AddonException extends Exception { - /** - * - */ - private static final long serialVersionUID = 4203162022348693854L; + /** + * + */ + private static final long serialVersionUID = 4203162022348693854L; + + public AddonException(String errorMessage){ + super("AddonException : " + errorMessage); + } - public AddonException(String errorMessage){ - super("AddonException : " + errorMessage); - } - } diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonFormatException.java b/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonFormatException.java index 8f683b18b..dfcc0b86a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonFormatException.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonFormatException.java @@ -6,25 +6,25 @@ import org.bukkit.Bukkit; public class InvalidAddonFormatException extends AddonException { - /** - * - */ - private static final long serialVersionUID = 7741502900847049986L; + /** + * + */ + private static final long serialVersionUID = 7741502900847049986L; - public InvalidAddonFormatException(String errorMessage) { - super(errorMessage); - } + public InvalidAddonFormatException(String errorMessage) { + super(errorMessage); + } - @Override - public void printStackTrace(){ - super.printStackTrace(); - - System.out.println(""); - - Bukkit.getLogger().log(Level.WARNING, " Basic format : (addon.yml)"); - Bukkit.getLogger().log(Level.WARNING, " main: path.to.your.MainClass"); - Bukkit.getLogger().log(Level.WARNING, " name: "); - Bukkit.getLogger().log(Level.WARNING, " authors: | "); - Bukkit.getLogger().log(Level.WARNING, " version: YourVersion"); - } + @Override + public void printStackTrace(){ + super.printStackTrace(); + + System.out.println(""); + + Bukkit.getLogger().log(Level.WARNING, " Basic format : (addon.yml)"); + Bukkit.getLogger().log(Level.WARNING, " main: path.to.your.MainClass"); + Bukkit.getLogger().log(Level.WARNING, " name: "); + Bukkit.getLogger().log(Level.WARNING, " authors: | "); + Bukkit.getLogger().log(Level.WARNING, " version: YourVersion"); + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonInheritException.java b/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonInheritException.java index 00ee7cb2c..42b56c27b 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonInheritException.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/exception/InvalidAddonInheritException.java @@ -2,13 +2,13 @@ package us.tastybento.bskyblock.api.addons.exception; public class InvalidAddonInheritException extends AddonException { - /** - * - */ - private static final long serialVersionUID = -5847358994397613244L; + /** + * + */ + private static final long serialVersionUID = -5847358994397613244L; - public InvalidAddonInheritException(String errorMessage) { - super(errorMessage); - } + public InvalidAddonInheritException(String errorMessage) { + super(errorMessage); + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index dea2130df..8ea9f4cd8 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -71,14 +71,14 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi */ public CompositeCommand(BSkyBlock plugin, String label, String... string) { super(label); - this.setAliases(new ArrayList<>(Arrays.asList(string))); - this.parent = null; + setAliases(new ArrayList<>(Arrays.asList(string))); + parent = null; setUsage(""); - this.subCommandLevel = 0; // Top level - this.subCommands = new LinkedHashMap<>(); - this.subCommandAliases = new LinkedHashMap<>(); - this.setup(); - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { + subCommandLevel = 0; // Top level + subCommands = new LinkedHashMap<>(); + subCommandAliases = new LinkedHashMap<>(); + setup(); + if (!getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); } } @@ -93,20 +93,20 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi public CompositeCommand(CompositeCommand parent, String label, String... aliases) { super(label); this.parent = parent; - this.subCommandLevel = parent.getLevel() + 1; + subCommandLevel = parent.getLevel() + 1; // Add this sub-command to the parent parent.getSubCommands().put(label, this); - this.setAliases(new ArrayList<>(Arrays.asList(aliases))); - this.subCommands = new LinkedHashMap<>(); - this.subCommandAliases = new LinkedHashMap<>(); + setAliases(new ArrayList<>(Arrays.asList(aliases))); + subCommands = new LinkedHashMap<>(); + subCommandAliases = new LinkedHashMap<>(); // Add aliases to the parent for this command for (String alias : aliases) { parent.subCommandAliases.put(alias, this); } setUsage(""); - this.setup(); + setup(); // If this command does not define its own help class, then use the default help command - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { + if (!getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); } if (DEBUG) { @@ -124,25 +124,25 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi if (DEBUG) { Bukkit.getLogger().info("DEBUG: top level command registering..." + label); } - this.setAliases(new ArrayList<>(Arrays.asList(aliases))); - this.parent = null; + setAliases(new ArrayList<>(Arrays.asList(aliases))); + parent = null; setUsage(""); - this.subCommandLevel = 0; // Top level - this.subCommands = new LinkedHashMap<>(); - this.subCommandAliases = new LinkedHashMap<>(); + subCommandLevel = 0; // Top level + subCommands = new LinkedHashMap<>(); + subCommandAliases = new LinkedHashMap<>(); // Register command if it is not already registered if (getPlugin().getCommand(label) == null) { getPlugin().getCommandsManager().registerCommand(this); } - this.setup(); - if (!this.getSubCommand("help").isPresent() && !label.equals("help")) { + setup(); + if (!getSubCommand("help").isPresent() && !label.equals("help")) { new DefaultHelpCommand(this); } } - /* - * This method deals with the command execution. It traverses the tree of + /* + * This method deals with the command execution. It traverses the tree of * subcommands until it finds the right object and then runs execute on it. */ @Override @@ -189,17 +189,17 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi private CompositeCommand getCommandFromArgs(String[] args) { CompositeCommand subCommand = this; // Run through any arguments - for (int i = 0; i < args.length; i++) { + for (String arg : args) { // get the subcommand corresponding to the arg if (subCommand.hasSubCommmands()) { - Optional sub = subCommand.getSubCommand(args[i]); + Optional sub = subCommand.getSubCommand(arg); if (!sub.isPresent()) { return subCommand; } // Step down one subCommand = sub.orElse(subCommand); // Set the label - subCommand.setLabel(args[i]); + subCommand.setLabel(arg); } else { // We are at the end of the walk return subCommand; @@ -254,7 +254,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi @Override public String getPermission() { - return this.permission; + return permission; } /** @@ -292,14 +292,18 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi if (DEBUG) { Bukkit.getLogger().info("DEBUG: " + entry.getKey()); } - if (entry.getKey().equalsIgnoreCase(label)) return Optional.of(subCommands.get(label)); + if (entry.getKey().equalsIgnoreCase(label)) { + return Optional.of(subCommands.get(label)); + } } // Try aliases for (Map.Entry entry : subCommandAliases.entrySet()) { if (DEBUG) { Bukkit.getLogger().info("DEBUG: alias " + entry.getKey()); } - if (entry.getKey().equalsIgnoreCase(label)) return Optional.of(subCommandAliases.get(label)); + if (entry.getKey().equalsIgnoreCase(label)) { + return Optional.of(subCommandAliases.get(label)); + } } return Optional.empty(); } @@ -396,8 +400,8 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi @Override public Command setUsage(String usage) { // Go up the chain - CompositeCommand parent = this.getParent(); - this.usage = this.getLabel() + " " + usage; + CompositeCommand parent = getParent(); + this.usage = getLabel() + " " + usage; while (parent != null) { this.usage = parent.getLabel() + " " + this.usage; parent = parent.getParent(); @@ -428,7 +432,7 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi return options; } // Add any tab completion from the subcommand - options.addAll(cmd.tabComplete(User.getInstance(sender), alias, new LinkedList(Arrays.asList(args))).orElse(new ArrayList<>())); + options.addAll(cmd.tabComplete(User.getInstance(sender), alias, new LinkedList<>(Arrays.asList(args))).orElse(new ArrayList<>())); // Add any sub-commands automatically if (cmd.hasSubCommmands()) { // Check if subcommands are visible to this sender diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java index 5fc53a412..a03910ff4 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java @@ -28,8 +28,8 @@ public class DefaultHelpCommand extends CompositeCommand { @Override public void setup() { // Set the usage to what the parent's command is - this.setParameters(parent.getParameters()); - this.setDescription(parent.getDescription()); + setParameters(parent.getParameters()); + setDescription(parent.getDescription()); } @Override diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/User.java b/src/main/java/us/tastybento/bskyblock/api/commands/User.java index ce59e3556..ac072b57e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/User.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/User.java @@ -44,8 +44,9 @@ public class User { * @return user */ public static User getInstance(Player player) { - if (player == null) + if (player == null) { return null; + } if (users.containsKey(player.getUniqueId())) { return users.get(player.getUniqueId()); } @@ -80,22 +81,22 @@ public class User { private final CommandSender sender; private User(CommandSender sender) { - this.player = null; - this.playerUUID = null; + player = null; + playerUUID = null; this.sender = sender; } private User(Player player) { this.player = player; - this.sender = player; - this.playerUUID = player.getUniqueId(); + sender = player; + playerUUID = player.getUniqueId(); users.put(player.getUniqueId(), this); } private User(UUID playerUUID) { - this.player = Bukkit.getPlayer(playerUUID); + player = Bukkit.getPlayer(playerUUID); this.playerUUID = playerUUID; - this.sender = null; + sender = null; } public Set getEffectivePermissions() { @@ -160,7 +161,9 @@ public class User { String translation = plugin.getLocalesManager().get(this, reference); // If no translation has been found, return the reference for debug purposes. - if (translation == null) return reference; + if (translation == null) { + return reference; + } // Then replace variables if (variables.length > 1) { @@ -168,7 +171,7 @@ public class User { translation = translation.replace(variables[i], variables[i+1]); } } - + return ChatColor.translateAlternateColorCodes('&', translation); } @@ -182,7 +185,7 @@ public class User { String translation = getTranslation(reference, variables); return translation.equals(reference) ? "" : translation; } - + /** * Send a message to sender if message is not empty. Does not include color codes or spaces. * @param reference - language file reference @@ -199,7 +202,7 @@ public class User { } } } - + /** * Sends a message to sender without any modification (colors, multi-lines, placeholders). * Should only be used for debug purposes. @@ -244,23 +247,24 @@ public class User { public void closeInventory() { player.closeInventory(); } - + /** * Get the user's locale * @return Locale */ public Locale getLocale() { if (sender instanceof Player) { - if (!plugin.getPlayers().getLocale(this.playerUUID).isEmpty()) - return Locale.forLanguageTag(plugin.getPlayers().getLocale(this.playerUUID)); - } + if (!plugin.getPlayers().getLocale(playerUUID).isEmpty()) { + return Locale.forLanguageTag(plugin.getPlayers().getLocale(playerUUID)); + } + } return Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage()); } - + @SuppressWarnings("deprecation") public void updateInventory() { player.updateInventory(); - + } } diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java index 4f814a20a..b81c5a15c 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java @@ -22,5 +22,5 @@ public @interface ConfigEntry { boolean experimental() default false; boolean needsReset() default false; GameType specificTo() default GameType.BOTH; - + } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index 08e4269bb..d8970e58e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -31,7 +31,7 @@ public interface ISettings { } default void saveBackup() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { - // Save backup + // Save backup @SuppressWarnings("unchecked") AbstractDatabaseHandler backupHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); backupHandler.saveObject(getInstance()); @@ -41,11 +41,11 @@ public interface ISettings { @SuppressWarnings("unchecked") default T loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException { // See if this settings object already exists in the database - AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(this.getClass()); + AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(getClass()); T dbConfig = null; if (dbhandler.objectExits(this.getUniqueId())) { // Load it - dbConfig = dbhandler.loadObject(getUniqueId()); + dbConfig = dbhandler.loadObject(getUniqueId()); } // Get the handler AbstractDatabaseHandler configHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); diff --git a/src/main/java/us/tastybento/bskyblock/api/events/IslandBaseEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/IslandBaseEvent.java index 71524cb97..3c44b9c79 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/IslandBaseEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/IslandBaseEvent.java @@ -23,11 +23,11 @@ public class IslandBaseEvent extends PremadeEvent implements Cancellable { public IslandBaseEvent(Island island) { super(); this.island = island; - this.playerUUID = island == null ? null : island.getOwner(); - this.admin = false; - this.location = island == null ? null : island.getCenter(); + playerUUID = island == null ? null : island.getOwner(); + admin = false; + location = island == null ? null : island.getCenter(); } - + /** * @param island * @param playerUUID @@ -46,14 +46,14 @@ public class IslandBaseEvent extends PremadeEvent implements Cancellable { * @return the island involved in this event */ public Island getIsland(){ - return this.island; + return island; } - + /** * @return the owner of the island */ public UUID getOwner() { - return this.getOwner(); + return getOwner(); } /** @@ -84,6 +84,6 @@ public class IslandBaseEvent extends PremadeEvent implements Cancellable { @Override public void setCancelled(boolean cancel) { - this.cancelled = cancel; + cancelled = cancel; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/PremadeEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/PremadeEvent.java index 9a5fa3fe6..ab2f46a2e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/PremadeEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/PremadeEvent.java @@ -6,7 +6,7 @@ import org.bukkit.event.HandlerList; public abstract class PremadeEvent extends Event { private static final HandlerList handlers = new HandlerList(); - + @Override public HandlerList getHandlers() { return handlers; diff --git a/src/main/java/us/tastybento/bskyblock/api/events/addon/AddonEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/addon/AddonEvent.java index 0b6318a41..9a71f1b55 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/addon/AddonEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/addon/AddonEvent.java @@ -57,14 +57,14 @@ public class AddonEvent { public AddonBaseEvent build() { switch (reason) { - case ENABLE: - return new AddonEnableEvent(addon); - case DISABLE: - return new AddonDisableEvent(addon); - case LOAD: - return new AddonLoadEvent(addon); - default: - return new AddonGeneralEvent(addon); + case ENABLE: + return new AddonEnableEvent(addon); + case DISABLE: + return new AddonDisableEvent(addon); + case LOAD: + return new AddonLoadEvent(addon); + default: + return new AddonGeneralEvent(addon); } } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/command/CommandEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/command/CommandEvent.java index 829119696..119ad869e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/command/CommandEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/command/CommandEvent.java @@ -20,7 +20,7 @@ public class CommandEvent extends PremadeEvent implements Cancellable { private final Command command; private final String label; private final String[] args; - + private CommandEvent(CommandSender sender, Command command, String label, String[] args) { super(); this.sender = sender; @@ -32,14 +32,14 @@ public class CommandEvent extends PremadeEvent implements Cancellable { public static CommandEventBuilder builder() { return new CommandEventBuilder(); } - + public static class CommandEventBuilder { // Here field are NOT final. They are just used for the building. private CommandSender sender; private Command command; private String label; private String[] args; - + public CommandEventBuilder setSender(CommandSender sender) { this.sender = sender; return this; @@ -63,7 +63,7 @@ public class CommandEvent extends PremadeEvent implements Cancellable { public CommandEvent build() { return new CommandEvent(sender, command, label, args); } - + } public CommandSender getSender() { @@ -89,6 +89,6 @@ public class CommandEvent extends PremadeEvent implements Cancellable { @Override public void setCancelled(boolean arg0) { - cancelled = arg0; + cancelled = arg0; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/island/FlagChangeEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/island/FlagChangeEvent.java index 3dbf6a610..3ec957989 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/island/FlagChangeEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/island/FlagChangeEvent.java @@ -43,13 +43,13 @@ public class FlagChangeEvent extends IslandBaseEvent { * @return the edited flag */ public Flag getFlag() { - return this.editedFlag; + return editedFlag; } /** * @return enabled/disabled */ public boolean getSetTo() { - return this.setTo; + return setTo; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java index 2d8cd423e..a6427ecbc 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/island/IslandEvent.java @@ -143,10 +143,10 @@ public class IslandEvent { } public IslandEventBuilder location(Location center) { - this.location = center; + location = center; return this; } - + public IslandBaseEvent build() { switch (reason) { case CREATE: @@ -194,7 +194,7 @@ public class IslandEvent { BSkyBlock.getInstance().getServer().getPluginManager().callEvent(general); return general; } - + } } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/purge/PurgeStartEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/purge/PurgeStartEvent.java index 3b6722530..4205e8a61 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/purge/PurgeStartEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/purge/PurgeStartEvent.java @@ -24,7 +24,7 @@ public class PurgeStartEvent extends PremadeEvent implements Cancellable { /** * Called to create the event * @param user - the UUID of the player who launched the purge, may be null if purge is launched using the console. - * @param islandsList - the list of islands to remove, based on their leader's UUID + * @param islandsList - the list of islands to remove, based on their leader's UUID */ public PurgeStartEvent(UUID user, List islandsList) { this.user = user; @@ -35,14 +35,14 @@ public class PurgeStartEvent extends PremadeEvent implements Cancellable { * @return the user who launched the purge, may be null if purge is launched using the console. */ public UUID getUser( ){ - return this.user; + return user; } /** - * @return the list of islands to remove, based on their leader's UUID + * @return the list of islands to remove, based on their leader's UUID */ public List getIslandsList() { - return this.islandsList; + return islandsList; } /** @@ -50,7 +50,9 @@ public class PurgeStartEvent extends PremadeEvent implements Cancellable { * @param - the owner's UUID from the island to remove */ public void add(UUID islandOwner) { - if(!this.islandsList.contains(islandOwner)) islandsList.add(islandOwner); + if(!islandsList.contains(islandOwner)) { + islandsList.add(islandOwner); + } } /** @@ -58,7 +60,9 @@ public class PurgeStartEvent extends PremadeEvent implements Cancellable { * @param - the owner's UUID from the island to remove */ public void remove(UUID islandOwner) { - if(this.islandsList.contains(islandOwner)) islandsList.remove(islandOwner); + if(islandsList.contains(islandOwner)) { + islandsList.remove(islandOwner); + } } /** @@ -76,6 +80,6 @@ public class PurgeStartEvent extends PremadeEvent implements Cancellable { @Override public void setCancelled(boolean cancel) { - this.cancelled = cancel; + cancelled = cancel; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/events/team/TeamEvent.java b/src/main/java/us/tastybento/bskyblock/api/events/team/TeamEvent.java index 2998a9f13..e6d28e84e 100644 --- a/src/main/java/us/tastybento/bskyblock/api/events/team/TeamEvent.java +++ b/src/main/java/us/tastybento/bskyblock/api/events/team/TeamEvent.java @@ -134,10 +134,10 @@ public class TeamEvent { } public TeamEventBuilder location(Location center) { - this.location = center; + location = center; return this; } - + public IslandBaseEvent build() { switch (reason) { case JOIN: diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java index 63870174f..b1dc7b7d1 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/Flag.java @@ -12,15 +12,15 @@ public class Flag implements Comparable { PROTECTION, SETTING } - + private final String id; private final PanelItem icon; private final Listener listener; private final FlagType type; private boolean defaultSetting; - + public Flag(String id2, PanelItem icon, Listener listener, boolean defaultSetting, FlagType type) { - this.id = id2; + id = id2; this.icon = icon; this.listener = listener; this.type = type; diff --git a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java index 7d676a83e..40e02deac 100644 --- a/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/flags/FlagBuilder.java @@ -17,7 +17,7 @@ public class FlagBuilder { private FlagType type = FlagType.PROTECTION; public FlagBuilder id(String string) { - this.id = string; + id = string; return this; } @@ -42,17 +42,17 @@ public class FlagBuilder { public Flag build() { return new Flag(id, icon, listener, defaultSetting, type); } - + /** * Sets the default setting for this flag in the world * @param setting * @return */ public FlagBuilder allowedByDefault(boolean setting) { - this.defaultSetting = setting; + defaultSetting = setting; return this; } - + /** * Set the type of this flag * @param type {@link FlagType} @@ -69,7 +69,7 @@ public class FlagBuilder { * @return */ public FlagBuilder id(Enum flag) { - this.id = flag.name(); + id = flag.name(); return this; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/localization/BSBLocale.java b/src/main/java/us/tastybento/bskyblock/api/localization/BSBLocale.java index f48472ff6..1b0660c0c 100644 --- a/src/main/java/us/tastybento/bskyblock/api/localization/BSBLocale.java +++ b/src/main/java/us/tastybento/bskyblock/api/localization/BSBLocale.java @@ -15,7 +15,7 @@ public class BSBLocale { public BSBLocale(Locale locale, File file) { this.locale = locale; - this.config = YamlConfiguration.loadConfiguration(file); + config = YamlConfiguration.loadConfiguration(file); } /** @@ -35,7 +35,9 @@ public class BSBLocale { * @return the locale language */ public String getLanguage(){ - if(locale == null) return "unknown"; + if(locale == null) { + return "unknown"; + } return locale.getDisplayLanguage(); } @@ -45,7 +47,9 @@ public class BSBLocale { * @return the locale country */ public String getCountry(){ - if(locale == null) return "unknown"; + if(locale == null) { + return "unknown"; + } return locale.getDisplayCountry(); } @@ -55,7 +59,7 @@ public class BSBLocale { * @return the locale language tag */ public String toLanguageTag(){ - return this.locale.toLanguageTag(); + return locale.toLanguageTag(); } /** diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java b/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java index ac834fe96..485d4fad3 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/Panel.java @@ -22,7 +22,7 @@ public class Panel { // If size is undefined (0) then use the number of items if (size == 0) { size = items.keySet().size(); - } + } // Create panel if (size > 0) { // Make sure size is a multiple of 9 diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java index ba1c7ea94..e89d16484 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/PanelItem.java @@ -30,11 +30,11 @@ public class PanelItem { meta = icon.getItemMeta(); this.clickHandler = clickHandler; - + // Create the final item - this.setName(name); - this.setDescription(description); - this.setGlow(glow); + setName(name); + setDescription(description); + setGlow(glow); // Set flags to neaten up the view meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); @@ -78,10 +78,11 @@ public class PanelItem { public void setGlow(boolean glow) { this.glow = glow; - if (glow) + if (glow) { meta.addEnchant(Enchantment.ARROW_DAMAGE, 0, true); - else + } else { meta.addEnchant(Enchantment.ARROW_DAMAGE, 0, false); + } } /** diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/PanelListener.java b/src/main/java/us/tastybento/bskyblock/api/panels/PanelListener.java index 4250b8b72..bd83ad09c 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/PanelListener.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/PanelListener.java @@ -11,7 +11,7 @@ public interface PanelListener { * This is called when the panel is first setup */ void setup(); - + /** * Called when the panel is clicked * @param user diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelBuilder.java b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelBuilder.java index beac3b6fb..378be65e9 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelBuilder.java @@ -27,27 +27,27 @@ public class PanelBuilder { * @return PanelBuilder */ public PanelBuilder addItem(int slot, PanelItem item) { - this.items.put(slot, item); + items.put(slot, item); return this; } public int nextSlot() { - if (this.items.isEmpty()) { + if (items.isEmpty()) { return 0; } else { return items.lastEntry().getKey() + 1; - } + } } - + /** * Checks if a slot is occupied in the panel or not * @param slot to check * @return true or false */ public boolean slotOccupied(int slot) { - return this.items.containsKey(slot); + return items.containsKey(slot); } - + /** * Build the panel * @return Panel @@ -63,9 +63,9 @@ public class PanelBuilder { */ public PanelBuilder addItem(PanelItem item) { if (items.isEmpty()) { - this.items.put(0, item); + items.put(0, item); } else { - this.items.put(items.lastEntry().getKey() + 1, item); + items.put(items.lastEntry().getKey() + 1, item); } return this; } diff --git a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java index cf86fec50..8b2be6ce0 100644 --- a/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/api/panels/builders/PanelItemBuilder.java @@ -29,8 +29,8 @@ public class PanelItemBuilder { } public PanelItemBuilder name(String name) { - this.name = name; - return this; + this.name = name; + return this; } public PanelItemBuilder description(List description) { @@ -47,7 +47,7 @@ public class PanelItemBuilder { this.description.add(description); return this; } - + public PanelItemBuilder glow(boolean glow) { this.glow = glow; return this; @@ -59,8 +59,9 @@ public class PanelItemBuilder { } public PanelItem build() { - if (icon == null) + if (icon == null) { Bukkit.getLogger().info("DEBUG: icon is null"); + } return new PanelItem(icon, name, description, glow, clickHandler); } diff --git a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java index 64b0baba0..d1ac7d079 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java @@ -17,9 +17,9 @@ public class AdminCommand extends CompositeCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "admin.*"); - this.setOnlyPlayer(false); - this.setDescription("admin.help.description"); + setPermission(Constants.PERMPREFIX + "admin.*"); + setOnlyPlayer(false); + setDescription("admin.help.description"); new AdminVersionCommand(this); new AdminReloadCommand(this); new AdminTeleportCommand(this); diff --git a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java index 2fb7d6cf3..3efb75961 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java @@ -27,10 +27,10 @@ public class IslandCommand extends CompositeCommand { */ @Override public void setup() { - this.setDescription("commands.island.help.description"); - this.setOnlyPlayer(true); + setDescription("commands.island.help.description"); + setOnlyPlayer(true); // Permission - this.setPermission(Constants.PERMPREFIX + "island"); + setPermission(Constants.PERMPREFIX + "island"); // Set up subcommands new IslandAboutCommand(this); new IslandCreateCommand(this); @@ -47,19 +47,19 @@ public class IslandCommand extends CompositeCommand { public boolean execute(User user, List args) { // If this player does not have an island, create one if (!getPlugin().getIslands().hasIsland(user.getUniqueId())) { - Optional subCreate = this.getSubCommand("create"); + Optional subCreate = getSubCommand("create"); if (subCreate.isPresent()) { subCreate.get().execute(user, new ArrayList<>()); } } - Optional go = this.getSubCommand("go"); + Optional go = getSubCommand("go"); // Otherwise, currently, just go home if (go.isPresent()) { go.get().execute(user, new ArrayList<>()); } - + return true; } - + } diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java index c3c9c31ad..31f0d30ae 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.commands.admin; diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java index baf5069fa..7d9fb3046 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java @@ -18,9 +18,9 @@ public class AdminTeleportCommand extends CompositeCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "admin.tp"); - this.setOnlyPlayer(true); - this.setDescription("commands.admin.tp.description"); + setPermission(Constants.PERMPREFIX + "admin.tp"); + setOnlyPlayer(true); + setDescription("commands.admin.tp.description"); } @Override @@ -29,7 +29,7 @@ public class AdminTeleportCommand extends CompositeCommand { user.sendMessage("commands.admin.tp.help"); return true; } - + // Convert name to a UUID final UUID targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { @@ -38,10 +38,10 @@ public class AdminTeleportCommand extends CompositeCommand { } else { if (getPlayers().hasIsland(targetUUID) || getPlayers().inTeam(targetUUID)) { Location warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getIslandWorld()); - if (this.getLabel().equals("tpnether")) { - warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getNetherWorld()); - } else if (this.getLabel().equals("tpend")) { - warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getEndWorld()); + if (getLabel().equals("tpnether")) { + warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getNetherWorld()); + } else if (getLabel().equals("tpend")) { + warpSpot = getIslands().getIslandLocation(targetUUID).toVector().toLocation(getPlugin().getIslandWorldManager().getEndWorld()); } // Other wise, go to a safe spot String failureMessage = user.getTranslation("commands.admin.tp.manual", "[location]", warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " " diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java index 577d7eb37..6eee377de 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java @@ -15,7 +15,7 @@ public class AdminVersionCommand extends CompositeCommand { @Override public void setup() { // Permission - this.setPermission(Constants.PERMPREFIX + "admin.version"); + setPermission(Constants.PERMPREFIX + "admin.version"); } @Override diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/CustomIslandMultiHomeHelp.java b/src/main/java/us/tastybento/bskyblock/commands/island/CustomIslandMultiHomeHelp.java index a7ec5f3e6..408b16495 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/CustomIslandMultiHomeHelp.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/CustomIslandMultiHomeHelp.java @@ -11,25 +11,25 @@ import us.tastybento.bskyblock.util.Util; * This is a custom help for the /island go and /island sethome commands. It overrides the default help sub command. * The number of homes can change depending on the player's permissions and config.yml settings. * This is an example of a custom help as much as anything. - * + * * @author tastybento * */ public class CustomIslandMultiHomeHelp extends CompositeCommand { public CustomIslandMultiHomeHelp(CompositeCommand parent) { - super(parent, "help"); + super(parent, "help"); } - + @Override public void setup() { - this.setOnlyPlayer(true); + setOnlyPlayer(true); // Inherit parameters from the respective parent class - in this case, only /island go and /island sethome - this.setParameters(parent.getParameters()); - this.setDescription(parent.getDescription()); - this.setPermission(parent.getPermission()); + setParameters(parent.getParameters()); + setDescription(parent.getDescription()); + setPermission(parent.getPermission()); } - + @Override public boolean execute(User user, List args) { // This will only be shown if it is for a player @@ -56,6 +56,6 @@ public class CustomIslandMultiHomeHelp extends CompositeCommand { } return false; } - + } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandAboutCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandAboutCommand.java index 4b40b6e8a..2e999e26b 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandAboutCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandAboutCommand.java @@ -15,12 +15,12 @@ public class IslandAboutCommand extends CompositeCommand { public IslandAboutCommand(CompositeCommand islandCommand) { super(islandCommand, "about", "ab"); } - + @Override public void setup() { - this.setDescription("commands.island.about.description"); + setDescription("commands.island.about.description"); } - + @Override public boolean execute(User user, List args) { user.sendRawMessage("About " + BSkyBlock.getInstance().getDescription().getName() + " v" + BSkyBlock.getInstance().getDescription().getVersion() + ":"); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java index 4cfc976c6..8516dae65 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandCreateCommand.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.commands.island; @@ -23,12 +23,12 @@ public class IslandCreateCommand extends CompositeCommand { public IslandCreateCommand(IslandCommand islandCommand) { super(islandCommand, "create", "auto"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.create"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.create.description"); + setPermission(Constants.PERMPREFIX + "island.create"); + setOnlyPlayer(true); + setDescription("commands.island.create.description"); } /* (non-Javadoc) @@ -41,7 +41,7 @@ public class IslandCreateCommand extends CompositeCommand { return false; } if (getPlayers().inTeam(user.getUniqueId())) { - return false; + return false; } user.sendMessage("commands.island.create.creating-island"); createIsland(user); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java index afe4090fa..85837bbfb 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandGoCommand.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.commands.island; @@ -26,9 +26,9 @@ public class IslandGoCommand extends CompositeCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.home"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.go.description"); + setPermission(Constants.PERMPREFIX + "island.home"); + setOnlyPlayer(true); + setDescription("commands.island.go.description"); new CustomIslandMultiHomeHelp(this); } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java index 227e007af..572840faa 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetCommand.java @@ -20,12 +20,12 @@ public class IslandResetCommand extends CompositeCommand { public IslandResetCommand(CompositeCommand islandCommand) { super(islandCommand, "reset", "restart"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.create"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.reset.description"); + setPermission(Constants.PERMPREFIX + "island.create"); + setOnlyPlayer(true); + setDescription("commands.island.reset.description"); } @Override @@ -36,7 +36,7 @@ public class IslandResetCommand extends CompositeCommand { } if (!getIslands().isOwner(user.getUniqueId())) { user.sendMessage("general.errors.not-leader"); - return false; + return false; } if (getPlugin().getPlayers().inTeam(user.getUniqueId())) { user.sendMessage("commands.island.reset.must-remove-members"); @@ -46,15 +46,18 @@ public class IslandResetCommand extends CompositeCommand { player.setGameMode(GameMode.SPECTATOR); // Get the player's old island Island oldIsland = getIslands().getIsland(player.getUniqueId()); - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: old island is at " + oldIsland.getCenter().getBlockX() + "," + oldIsland.getCenter().getBlockZ()); + } // Remove them from this island (it still exists and will be deleted later) getIslands().removePlayer(player.getUniqueId()); - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: old island's owner is " + oldIsland.getOwner()); + } // Create new island and then delete the old one - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: making new island "); + } try { NewIsland.builder(getPlugin()) .player(player) diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java index d3b298e0c..559fbc687 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandResetnameCommand.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.commands.island; @@ -19,12 +19,12 @@ public class IslandResetnameCommand extends CompositeCommand { public IslandResetnameCommand(CompositeCommand islandCommand) { super(islandCommand, "resetname"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.name"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.resetname.description"); + setPermission(Constants.PERMPREFIX + "island.name"); + setOnlyPlayer(true); + setDescription("commands.island.resetname.description"); } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java index 08fb0c471..8bfa3410d 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSethomeCommand.java @@ -16,9 +16,9 @@ public class IslandSethomeCommand extends CompositeCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.sethome"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.sethome.description"); + setPermission(Constants.PERMPREFIX + "island.sethome"); + setOnlyPlayer(true); + setDescription("commands.island.sethome.description"); new CustomIslandMultiHomeHelp(this); } @@ -32,7 +32,7 @@ public class IslandSethomeCommand extends CompositeCommand { } if (!getPlugin().getIslands().playerIsOnIsland(user)) { user.sendMessage("commands.island.sethome.must-be-on-your-island"); - return false; + return false; } if (args.isEmpty()) { // island sethome diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java index 30cb3e686..571f898ec 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/IslandSetnameCommand.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.commands.island; @@ -23,13 +23,13 @@ public class IslandSetnameCommand extends CompositeCommand { public IslandSetnameCommand(CompositeCommand islandCommand) { super(islandCommand, "setname"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.name"); - this.setOnlyPlayer(true); - this.setParameters("commands.island.setname.parameters"); - this.setDescription("commands.island.setname.description"); + setPermission(Constants.PERMPREFIX + "island.name"); + setOnlyPlayer(true); + setParameters("commands.island.setname.parameters"); + setDescription("commands.island.setname.description"); } /* (non-Javadoc) @@ -69,9 +69,11 @@ public class IslandSetnameCommand extends CompositeCommand { } // Set the name - if (!player.hasPermission(Constants.PERMPREFIX + "island.name.format")) + if (!player.hasPermission(Constants.PERMPREFIX + "island.name.format")) { getIslands().getIsland(player.getUniqueId()).setName(ChatColor.translateAlternateColorCodes('&', name)); - else getIslands().getIsland(playerUUID).setName(name); + } else { + getIslands().getIsland(playerUUID).setName(name); + } user.sendMessage("general.success"); return true; diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/AbstractIslandTeamCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/AbstractIslandTeamCommand.java index 6de0c3972..be9840364 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/AbstractIslandTeamCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/AbstractIslandTeamCommand.java @@ -20,21 +20,21 @@ import us.tastybento.bskyblock.api.commands.User; * */ public abstract class AbstractIslandTeamCommand extends CompositeCommand { - + protected final static boolean DEBUG = false; - protected static BiMap inviteList = HashBiMap.create(); + protected static BiMap inviteList = HashBiMap.create(); // The time a player has to wait until they can reset their island again protected static HashMap resetWaitTime = new HashMap<>(); protected static Set leavingPlayers = new HashSet<>(); protected static Set kickingPlayers = new HashSet<>(); - + // TODO: It would be good if these could be auto-provided protected User user; - + public AbstractIslandTeamCommand(CompositeCommand command, String label, String... aliases) { super(command, label,aliases); } - + /** * Sets a timeout for player into the Hashmap resetWaitTime * diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamCommand.java index bb9304553..328de6081 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamCommand.java @@ -23,9 +23,9 @@ public class IslandTeamCommand extends AbstractIslandTeamCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.team.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setDescription("commands.island.team.description"); new IslandTeamInviteCommand(this); new IslandTeamLeaveCommand(this); @@ -36,17 +36,20 @@ public class IslandTeamCommand extends AbstractIslandTeamCommand { @Override public boolean execute(User user, List args) { UUID playerUUID = user.getUniqueId(); - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: executing team command for " + playerUUID); + } // Fire event so add-ons can run commands, etc. IslandBaseEvent event = TeamEvent.builder() .island(getIslands() - .getIsland(playerUUID)) + .getIsland(playerUUID)) .reason(TeamEvent.Reason.INFO) .involvedPlayer(playerUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return true; + if (event.isCancelled()) { + return true; + } UUID teamLeaderUUID = getTeamLeader(user); Set teamMembers = getMembers(user); if (teamLeaderUUID.equals(playerUUID)) { @@ -69,9 +72,11 @@ public class IslandTeamCommand extends AbstractIslandTeamCommand { } } // Do some sanity checking - if (maxSize < 1) maxSize = 1; + if (maxSize < 1) { + maxSize = 1; + } } - + if (teamMembers.size() < maxSize) { user.sendMessage("commands.island.team.invite.you-can-invite", "[number]", String.valueOf(maxSize - teamMembers.size())); } else { diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java index 023cefda7..147c27954 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteAcceptCommand.java @@ -18,22 +18,23 @@ public class IslandTeamInviteAcceptCommand extends AbstractIslandTeamCommand { public IslandTeamInviteAcceptCommand(IslandTeamInviteCommand islandTeamInviteCommand) { super(islandTeamInviteCommand, "accept"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.team.invite.accept.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setDescription("commands.island.team.invite.accept.description"); } @Override public boolean execute(User user, List args) { - + Bukkit.getLogger().info("DEBUG: accept - " + inviteList.toString()); - + UUID playerUUID = user.getUniqueId(); - if(!inviteList.containsKey(playerUUID)) - return false; + if(!inviteList.containsKey(playerUUID)) { + return false; + } // Check if player has been invited if (!inviteList.containsKey(playerUUID)) { user.sendMessage("commands.island.team.invite.errors.none-invited-you"); @@ -51,20 +52,24 @@ public class IslandTeamInviteAcceptCommand extends AbstractIslandTeamCommand { inviteList.remove(playerUUID); return false; } - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: Invite is valid"); + } // Fire event so add-ons can run commands, etc. IslandBaseEvent event = TeamEvent.builder() .island(getIslands() - .getIsland(prospectiveTeamLeaderUUID)) + .getIsland(prospectiveTeamLeaderUUID)) .reason(TeamEvent.Reason.JOIN) .involvedPlayer(playerUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return true; + if (event.isCancelled()) { + return true; + } // Remove the invite - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: Removing player from invite list"); + } inviteList.remove(playerUUID); // Put player into Spectator mode user.setGameMode(GameMode.SPECTATOR); @@ -100,8 +105,9 @@ public class IslandTeamInviteAcceptCommand extends AbstractIslandTeamCommand { inviter.sendMessage("commands.island.team.invite.accept.name-joined-your-island", "[name]", user.getName()); } getIslands().save(false); - if (DEBUG) + if (DEBUG) { getPlugin().getLogger().info("DEBUG: After save " + getIslands().getIsland(prospectiveTeamLeaderUUID).getMemberSet().toString()); + } return true; } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java index 138eef747..54da32b0d 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteCommand.java @@ -27,9 +27,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.team.invite.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setDescription("commands.island.team.invite.description"); new IslandTeamInviteAcceptCommand(this); new IslandTeamInviteRejectCommand(this); @@ -106,7 +106,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { } } // Do some sanity checking - if (maxSize < 1) maxSize = 1; + if (maxSize < 1) { + maxSize = 1; + } } if (teamMembers.size() < maxSize) { // If that player already has an invite out then retract it. @@ -122,7 +124,9 @@ public class IslandTeamInviteCommand extends AbstractIslandTeamCommand { .involvedPlayer(invitedPlayerUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return true; + if (event.isCancelled()) { + return true; + } // Put the invited player (key) onto the list with inviter (value) // If someone else has invited a player, then this invite will overwrite the previous invite! inviteList.put(invitedPlayerUUID, playerUUID); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java index 60e33fd63..2410b8c64 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamInviteRejectCommand.java @@ -13,12 +13,12 @@ public class IslandTeamInviteRejectCommand extends AbstractIslandTeamCommand { public IslandTeamInviteRejectCommand(IslandTeamInviteCommand islandTeamInviteCommand) { super(islandTeamInviteCommand, "reject"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.team.invite.reject.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setDescription("commands.island.team.invite.reject.description"); } @Override @@ -29,12 +29,14 @@ public class IslandTeamInviteRejectCommand extends AbstractIslandTeamCommand { // Fire event so add-ons can run commands, etc. IslandBaseEvent event = TeamEvent.builder() .island(getIslands() - .getIsland(inviteList.get(playerUUID))) + .getIsland(inviteList.get(playerUUID))) .reason(TeamEvent.Reason.REJECT) .involvedPlayer(playerUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return false; + if (event.isCancelled()) { + return false; + } // Remove this player from the global invite list inviteList.remove(user.getUniqueId()); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java index 324917074..a2db50a99 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamKickCommand.java @@ -20,10 +20,10 @@ public class IslandTeamKickCommand extends AbstractIslandTeamCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setParameters("commands.island.team.kick.parameters"); - this.setDescription("commands.island.team.kick.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setParameters("commands.island.team.kick.parameters"); + setDescription("commands.island.team.kick.description"); kickSet = new HashSet<>(); } @@ -46,11 +46,11 @@ public class IslandTeamKickCommand extends AbstractIslandTeamCommand { UUID targetUUID = getPlayers().getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player"); - return true; + return true; } if (!getIslands().getMembers(user.getUniqueId()).contains(targetUUID)) { user.sendMessage("general.errors.not-in-team"); - return true; + return true; } if (!getSettings().isKickConfirmation() || kickSet.contains(targetUUID)) { kickSet.remove(targetUUID); diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java index dfb8c7cae..d5272734d 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamLeaveCommand.java @@ -20,9 +20,9 @@ public class IslandTeamLeaveCommand extends AbstractIslandTeamCommand { @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setDescription("commands.island.team.leave.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setDescription("commands.island.team.leave.description"); leaveSet = new HashSet<>(); } diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamPromoteCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamPromoteCommand.java index 48f29c256..419b7ca6d 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamPromoteCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamPromoteCommand.java @@ -10,13 +10,13 @@ public class IslandTeamPromoteCommand extends AbstractIslandTeamCommand { public IslandTeamPromoteCommand(IslandTeamCommand islandTeamCommand) { super(islandTeamCommand, "promote"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setParameters("commands.island.team.promote.parameters"); - this.setDescription("commands.island.team.promote.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setParameters("commands.island.team.promote.parameters"); + setDescription("commands.island.team.promote.description"); } @Override diff --git a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java index d0c02ee4e..657fdbbed 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/island/teams/IslandTeamSetownerCommand.java @@ -21,13 +21,13 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { public IslandTeamSetownerCommand(IslandTeamCommand islandTeamCommand) { super(islandTeamCommand, "setleader"); } - + @Override public void setup() { - this.setPermission(Constants.PERMPREFIX + "island.team"); - this.setOnlyPlayer(true); - this.setParameters("commands.island.team.setowner.parameters"); - this.setDescription("commands.island.team.setowner.description"); + setPermission(Constants.PERMPREFIX + "island.team"); + setOnlyPlayer(true); + setParameters("commands.island.team.setowner.parameters"); + setDescription("commands.island.team.setowner.description"); } @Override @@ -75,7 +75,9 @@ public class IslandTeamSetownerCommand extends AbstractIslandTeamCommand { .involvedPlayer(targetUUID) .build(); getPlugin().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) return false; + if (event.isCancelled()) { + return false; + } // target is the new leader getIslands().getIsland(playerUUID).setOwner(targetUUID); diff --git a/src/main/java/us/tastybento/bskyblock/database/BSBDatabase.java b/src/main/java/us/tastybento/bskyblock/database/BSBDatabase.java index c0bc456b8..eac83c72f 100755 --- a/src/main/java/us/tastybento/bskyblock/database/BSBDatabase.java +++ b/src/main/java/us/tastybento/bskyblock/database/BSBDatabase.java @@ -14,7 +14,9 @@ public abstract class BSBDatabase { */ public static BSBDatabase getDatabase(){ for(DatabaseType type : DatabaseType.values()){ - if(type == BSkyBlock.getInstance().getSettings().getDatabaseType()) return type.database; + if(type == BSkyBlock.getInstance().getSettings().getDatabaseType()) { + return type.database; + } } return DatabaseType.FLATFILE.database; } diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java index b3d8c3017..c078e6542 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseConnecter.java @@ -37,10 +37,11 @@ public class FlatFileDatabaseConnecter implements DatabaseConnecter { /** * Loads a YAML file and if it does not exist it is looked for in the JAR - * + * * @param fileName * @return */ + @Override public YamlConfiguration loadYamlFile(String tableName, String fileName) { if (!fileName.endsWith(".yml")) { fileName = fileName + ".yml"; @@ -77,7 +78,7 @@ public class FlatFileDatabaseConnecter implements DatabaseConnecter { /** * Saves a YAML file - * + * * @param yamlConfig * @param fileName */ diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 04552239a..4d20fa619 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -109,16 +109,13 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { */ @Override public List loadObjects() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException, ClassNotFoundException { - List list = new ArrayList(); - FilenameFilter ymlFilter = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - String lowercaseName = name.toLowerCase(); - if (lowercaseName.endsWith(".yml")) { - return true; - } else { - return false; - } + List list = new ArrayList<>(); + FilenameFilter ymlFilter = (dir, name) -> { + String lowercaseName = name.toLowerCase(); + if (lowercaseName.endsWith(".yml")) { + return true; + } else { + return false; } }; String path = dataObject.getSimpleName(); @@ -166,27 +163,30 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); // Get the write method Method method = propertyDescriptor.getWriteMethod(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: " + field.getName() + ": " + propertyDescriptor.getPropertyType().getTypeName()); + } String storageLocation = field.getName(); // Check if there is an annotation on the field ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); // If there is a config annotation then do something - if (configEntry != null) { + if (configEntry != null) { if (!configEntry.path().isEmpty()) { storageLocation = configEntry.path(); } if (!configEntry.specificTo().equals(GameType.BOTH) && !configEntry.specificTo().equals(Constants.GAMETYPE)) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info(field.getName() + " not applicable to this game type"); + } continue; } // TODO: Add handling of other ConfigEntry elements } Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: there is an adapter"); + } // A conversion adapter has been defined Object value = config.get(storageLocation); method.invoke(instance, ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value)); @@ -199,7 +199,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType())); } // We are done here - continue; + continue; } // Look in the YAML Config to see if this field exists (it should) @@ -216,10 +216,11 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { // collectionTypes should be 2 long Type keyType = collectionTypes.get(0); Type valueType = collectionTypes.get(1); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: is Map or HashMap<" + keyType.getTypeName() + ", " + valueType.getTypeName() + ">"); + } // TODO: this may not work with all keys. Further serialization may be required. - Map value = new HashMap(); + Map value = new HashMap<>(); for (String key : config.getConfigurationSection(storageLocation).getKeys(false)) { // Keys cannot be null - skip if they exist Object mapKey = deserialize(key,Class.forName(keyType.getTypeName())); @@ -240,49 +241,52 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { plugin.getLogger().info("DEBUG: is Set " + propertyDescriptor.getReadMethod().getGenericReturnType().getTypeName()); plugin.getLogger().info("DEBUG: adding a set"); } - // Loop through the collection resultset + // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be only 1 long Type setType = collectionTypes.get(0); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: is HashSet<" + setType.getTypeName() + ">"); - Set value = new HashSet(); + } + Set value = new HashSet<>(); if (DEBUG) { plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); } for (Object listValue: config.getList(storageLocation)) { //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); - ((Set) value).add(deserialize(listValue,Class.forName(setType.getTypeName()))); + value.add(deserialize(listValue,Class.forName(setType.getTypeName()))); } // TODO: this may not work with all keys. Further serialization may be required. - //Set value = new HashSet((List) config.getList(storageLocation)); + //Set value = new HashSet((List) config.getList(storageLocation)); method.invoke(instance, value); } else if (List.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { //plugin.getLogger().info("DEBUG: is Set " + propertyDescriptor.getReadMethod().getGenericReturnType().getTypeName()); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding a set"); - // Loop through the collection resultset + } + // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be only 1 long Type setType = collectionTypes.get(0); - List value = new ArrayList(); + List value = new ArrayList<>(); //plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); //plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); for (Object listValue: config.getList(storageLocation)) { //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); - ((List) value).add(deserialize(listValue,Class.forName(setType.getTypeName()))); + value.add(deserialize(listValue,Class.forName(setType.getTypeName()))); } // TODO: this may not work with all keys. Further serialization may be required. - //Set value = new HashSet((List) config.getList(storageLocation)); + //Set value = new HashSet((List) config.getList(storageLocation)); method.invoke(instance, value); } else { // Not a collection - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: not a collection"); + } Object value = config.get(storageLocation); if (DEBUG) { plugin.getLogger().info("DEBUG: name = " + field.getName()); @@ -303,6 +307,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { /* (non-Javadoc) * @see us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler#saveConfig(java.lang.Object) */ + @Override public void saveSettings(T instance) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { configFlag = true; saveObject(instance); @@ -337,7 +342,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } // Run through all the fields in the class that is being stored. EVERY field must have a get and set method - fields: + fields: for (Field field : dataObject.getDeclaredFields()) { // Get the property descriptor for this field @@ -361,16 +366,17 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } if (!configEntry.path().isEmpty()) { storageLocation = configEntry.path(); - } + } // TODO: add in game-specific saving } Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined + } + // A conversion adapter has been defined try { config.set(storageLocation, ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value)); } catch (InstantiationException e) { @@ -384,7 +390,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { // Depending on the vale type, it'll need serializing differenty // Check if this field is the mandatory UniqueId field. This is used to identify this instantiation of the class if (method.getName().equals("getUniqueId")) { - // If the object does not have a unique name assigned to it already, one is created at random + // If the object does not have a unique name assigned to it already, one is created at random //plugin.getLogger().info("DEBUG: uniqueId = " + value); String id = (String)value; if (value == null || id.isEmpty()) { @@ -393,15 +399,16 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { propertyDescriptor.getWriteMethod().invoke(instance, id); } // Save the name for when the file is saved - if (filename.isEmpty()) + if (filename.isEmpty()) { filename = id; + } } // Collections need special serialization if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { // Maps need to have keys serialized //plugin.getLogger().info("DEBUG: Map for " + storageLocation); if (value != null) { - Map result = new HashMap(); + Map result = new HashMap<>(); for (Entry object : ((Map)value).entrySet()) { // Serialize all key types // TODO: also need to serialize values? @@ -412,10 +419,11 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } } else if (Set.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { // Sets need to be serialized as string lists - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Set for " + storageLocation); + } if (value != null) { - List list = new ArrayList(); + List list = new ArrayList<>(); for (Object object : (Set)value) { list.add(serialize(object)); } @@ -430,7 +438,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { if (filename.isEmpty()) { throw new IllegalArgumentException("No uniqueId in class"); } - databaseConnecter.saveYamlFile(config, path, filename); + databaseConnecter.saveYamlFile(config, path, filename); } /** @@ -463,15 +471,16 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { if (DEBUG) { plugin.getLogger().info("DEBUG: deserialize - class is " + clazz.getCanonicalName()); plugin.getLogger().info("DEBUG: value is " + value); - if (value != null) + if (value != null) { plugin.getLogger().info("DEBUG: value class is " + value.getClass().getCanonicalName()); + } } // If value is already null, then it can be nothing else if (value == null) { return null; } if (value instanceof String && value.equals("null")) { - // If the value is null as a string, return null + // If the value is null as a string, return null return null; } // Bukkit may have deserialized the object already @@ -480,7 +489,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } // Types that need to be deserialized if (clazz.equals(Long.class) && value.getClass().equals(Integer.class)) { - return new Long((Integer)value); + return new Long((Integer)value); } if (clazz.equals(UUID.class)) { value = UUID.fromString((String)value); @@ -522,7 +531,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { File dataFolder = new File(plugin.getDataFolder(), DATABASE_FOLDER_NAME); File tableFolder = new File(dataFolder, dataObject.getSimpleName()); if (tableFolder.exists()) { - + File file = new File(tableFolder, fileName); try { Files.delete(file.toPath()); @@ -537,7 +546,9 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { */ @Override public T loadSettings(String uniqueId, T dbConfig) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IntrospectionException { - if (dbConfig == null) return loadObject(uniqueId); + if (dbConfig == null) { + return loadObject(uniqueId); + } // TODO: compare the loaded with the database copy diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java index 2f81a2dac..6e9fa3cf3 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java @@ -70,14 +70,16 @@ public class PlayersManager{ * @param async - if true, save async */ public void save(boolean async){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving " + async); + } Collection set = Collections.unmodifiableCollection(playerCache.values()); if(async){ Runnable save = () -> { for(Players player : set){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving player " + player.getPlayerName() + " "+ player.getUniqueId()); + } try { handler.saveObject(player); } catch (Exception e) { @@ -88,8 +90,9 @@ public class PlayersManager{ plugin.getServer().getScheduler().runTaskAsynchronously(plugin, save); } else { for(Players player : set){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving player " + player.getPlayerName() + " "+ player.getUniqueId()); + } try { handler.saveObject(player); } catch (Exception e) { @@ -121,33 +124,39 @@ public class PlayersManager{ * @return the players object */ public Players addPlayer(final UUID playerUUID) { - if (playerUUID == null) + if (playerUUID == null) { return null; - if (DEBUG) + } + if (DEBUG) { plugin.getLogger().info("DEBUG: adding player " + playerUUID); + } if (!playerCache.containsKey(playerUUID)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: player not in cache"); + } Players player = null; // If the player is in the database, load it, otherwise create a new player if (handler.objectExits(playerUUID.toString())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: player in database"); + } try { player = handler.loadObject(playerUUID.toString()); } catch (Exception e) { plugin.getLogger().severe("Could not load player " + playerUUID + " " + e.getMessage()); } } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: new player"); + } player = new Players(plugin, playerUUID); } playerCache.put(playerUUID, player); return player; } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: known player"); + } return playerCache.get(playerUUID); } } @@ -331,8 +340,9 @@ public class PlayersManager{ * @param name */ public void setPlayerName(User user) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Setting player name to " + user.getName() + " for " + user.getUniqueId()); + } addPlayer(user.getUniqueId()); playerCache.get(user.getUniqueId()).setPlayerName(user.getName()); } @@ -345,14 +355,16 @@ public class PlayersManager{ * @return String - playerName */ public String getName(UUID playerUUID) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Geting player name"); + } if (playerUUID == null) { return ""; } addPlayer(playerUUID); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: name is " + playerCache.get(playerUUID).getPlayerName()); + } return playerCache.get(playerUUID).getPlayerName(); } @@ -363,8 +375,9 @@ public class PlayersManager{ * @return UUID of owner of island */ public UUID getPlayerFromIslandLocation(Location loc) { - if (loc == null) + if (loc == null) { return null; + } // Look in the grid Optional island = plugin.getIslands().getIslandAt(loc); return island.map(x->x.getOwner()).orElse(null); @@ -425,7 +438,9 @@ public class PlayersManager{ */ public String getLocale(UUID playerUUID) { addPlayer(playerUUID); - if (playerUUID == null) return ""; + if (playerUUID == null) { + return ""; + } return playerCache.get(playerUUID).getLocale(); } @@ -578,8 +593,9 @@ public class PlayersManager{ if (playerCache.containsKey(playerUUID)) { final Players player = playerCache.get(playerUUID); try { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving player by uuid " + player.getPlayerName() + " " + playerUUID + " saved"); + } handler.saveObject(player); } catch (IllegalAccessException | IllegalArgumentException @@ -589,8 +605,9 @@ public class PlayersManager{ plugin.getLogger().severe("Could not save player to database: " + playerUUID + " " + e.getMessage()); } } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: " + playerUUID + " is not in the cache to save"); + } } } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index a50217191..76e44029c 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -43,14 +43,17 @@ public class IslandCache { */ public void addIsland(Island island) { islandsByLocation.put(island.getCenter(), island); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: owner = " + island.getOwner()); + } islandsByUUID.put(island.getOwner(), island); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: island has " + island.getMemberSet().size() + " members"); + } for (UUID member: island.getMemberSet()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: " + member); + } islandsByUUID.put(member, island); } addToGrid(island); @@ -66,12 +69,14 @@ public class IslandCache { */ private void addToGrid(Island newIsland) { if (islandGrid.containsKey(newIsland.getMinX())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: min x is in the grid :" + newIsland.getMinX()); + } TreeMap zEntry = islandGrid.get(newIsland.getMinX()); if (zEntry.containsKey(newIsland.getMinZ())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: min z is in the grid :" + newIsland.getMinZ()); + } // Island already exists Island conflict = islandGrid.get(newIsland.getMinX()).get(newIsland.getMinZ()); plugin.getLogger().warning("*** Duplicate or overlapping islands! ***"); @@ -94,17 +99,19 @@ public class IslandCache { return; } else { // Add island - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: added island to grid at " + newIsland.getMinX() + "," + newIsland.getMinZ()); + } zEntry.put(newIsland.getMinZ(), newIsland); islandGrid.put(newIsland.getMinX(), zEntry); // plugin.getLogger().info("Debug: " + newIsland.toString()); } } else { // Add island - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: added island to grid at " + newIsland.getMinX() + "," + newIsland.getMinZ()); - TreeMap zEntry = new TreeMap(); + } + TreeMap zEntry = new TreeMap<>(); zEntry.put(newIsland.getMinZ(), newIsland); islandGrid.put(newIsland.getMinX(), zEntry); } @@ -117,8 +124,9 @@ public class IslandCache { public Island createIsland(Island island) { islandsByLocation.put(island.getCenter(), island); - if (island.getOwner() != null) + if (island.getOwner() != null) { islandsByUUID.put(island.getOwner(), island); + } addToGrid(island); return island; } @@ -137,12 +145,14 @@ public class IslandCache { * @param owner UUID */ public Island createIsland(Location location, UUID owner){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location); + } Island island = new Island(location, owner, plugin.getSettings().getIslandProtectionRange()); islandsByLocation.put(location, island); - if (owner != null) + if (owner != null) { islandsByUUID.put(owner, island); + } addToGrid(island); return island; } @@ -163,26 +173,31 @@ public class IslandCache { } } // Remove from grid - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: deleting island at " + island.getCenter()); + } if (island != null) { int x = island.getMinX(); int z = island.getMinZ(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: x = " + x + " z = " + z); + } if (islandGrid.containsKey(x)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: x found"); + } TreeMap zEntry = islandGrid.get(x); if (zEntry.containsKey(z)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: z found - deleting the island"); + } // Island exists - delete it zEntry.remove(z); islandGrid.put(x, zEntry); } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: could not find z"); + } } } } @@ -225,12 +240,14 @@ public class IslandCache { // Check if in the island range Island island = ent.getValue(); if (island.inIslandSpace(x, z)) { - if (DEBUG2) + if (DEBUG2) { plugin.getLogger().info("DEBUG: In island space"); + } return island; } - if (DEBUG2) + if (DEBUG2) { plugin.getLogger().info("DEBUG: not in island space"); + } } } return null; @@ -264,8 +281,9 @@ public class IslandCache { * @return Location of player's island or null if one does not exist */ public Location getIslandLocation(UUID playerUUID) { - if (hasIsland(playerUUID)) + if (hasIsland(playerUUID)) { return getIsland(playerUUID).getCenter(); + } return null; } @@ -291,14 +309,16 @@ public class IslandCache { public Set getMembers(UUID playerUUID) { Island island = islandsByUUID.get(playerUUID); - if (island != null) - return new HashSet(island.getMemberSet()); - return new HashSet(0); + if (island != null) { + return new HashSet<>(island.getMemberSet()); + } + return new HashSet<>(0); } public UUID getTeamLeader(UUID playerUUID) { - if (islandsByUUID.containsKey(playerUUID)) + if (islandsByUUID.containsKey(playerUUID)) { return islandsByUUID.get(playerUUID).getOwner(); + } return null; } @@ -318,35 +338,41 @@ public class IslandCache { } } if (islandsByUUID.containsKey(playerUUID) && islandsByUUID.get(playerUUID).getOwner() != null) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: checking for equals"); + } if (islandsByUUID.get(playerUUID).getOwner().equals(playerUUID)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: has island"); + } return true; } } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: doesn't have island"); + } return false; } public void removePlayer(UUID playerUUID) { Island island = islandsByUUID.get(playerUUID); if (island != null) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: island found"); + } if (island.getOwner() != null && island.getOwner().equals(playerUUID)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: player is the owner of this island"); + } // Clear ownership and members island.getMemberSet().clear(); island.setOwner(null); } island.getMemberSet().remove(playerUUID); } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: removing reference to island by UUID"); + } islandsByUUID.remove(playerUUID); } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 7416d317d..a4cae85d6 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -224,7 +224,7 @@ public class IslandsManager { if (maxYradius < height) { maxYradius++; } - //plugin.getLogger().info("DEBUG: Radii " + minXradius + "," + minYradius + "," + minZradius + + //plugin.getLogger().info("DEBUG: Radii " + minXradius + "," + minYradius + "," + minZradius + // "," + maxXradius + "," + maxYradius + "," + maxZradius); } while (minXradius < i || maxXradius < i || minZradius < i || maxZradius < i || minYradius < depth || maxYradius < height); @@ -246,8 +246,9 @@ public class IslandsManager { * @param owner UUID */ public Island createIsland(Location location, UUID owner){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location); + } return islandCache.createIsland(new Island(location, owner, plugin.getSettings().getIslandProtectionRange())); } @@ -257,8 +258,9 @@ public class IslandsManager { * @param removeBlocks - if the island blocks should be removed or not */ public void deleteIsland(Island island, boolean removeBlocks) { - if (island == null) + if (island == null) { return; + } // Set the owner of the island to no one. island.setOwner(null); island.setLocked(false); @@ -291,8 +293,9 @@ public class IslandsManager { */ public void deleteIsland(final UUID player, boolean removeBlocks) { // Removes the island - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: deleting player island"); + } //CoopPlay.getInstance().clearAllIslandCoops(player); //getWarpSignsListener().removeWarp(player); final Island island = getIsland(player); @@ -377,8 +380,9 @@ public class IslandsManager { * @return Location of player's island or null if one does not exist */ public Location getIslandLocation(UUID playerUUID) { - if (hasIsland(playerUUID)) + if (hasIsland(playerUUID)) { return getIsland(playerUUID).getCenter(); + } return null; } @@ -439,8 +443,9 @@ public class IslandsManager { l = plugin.getPlayers().getHomeLocation(playerUUID, number); } // Check if it is safe - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Home location " + l); + } if (l != null) { if (isSafeLocation(l)) { return l; @@ -456,38 +461,45 @@ public class IslandsManager { } } } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Home location either isn't safe, or does not exist so try the island"); + } // Home location either isn't safe, or does not exist so try the island // location if (plugin.getPlayers().inTeam(playerUUID)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG:player is in team"); + } l = plugin.getIslands().getIslandLocation(playerUUID); if (isSafeLocation(l)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG:island loc is safe"); + } plugin.getPlayers().setHomeLocation(playerUUID, l, number); return l; } else { // try team leader's home - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: trying leader's home"); + } Location tlh = plugin.getPlayers().getHomeLocation(plugin.getIslands().getTeamLeader(playerUUID)); if (tlh != null) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: leader has a home"); + } if (isSafeLocation(tlh)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: team leader's home is safe"); + } plugin.getPlayers().setHomeLocation(playerUUID, tlh, number); return tlh; } } } } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: player is not in team - trying island location"); + } l = plugin.getIslands().getIslandLocation(playerUUID); if (isSafeLocation(l)) { plugin.getPlayers().setHomeLocation(playerUUID, l, number); @@ -498,28 +510,32 @@ public class IslandsManager { plugin.getLogger().warning(plugin.getPlayers().getName(playerUUID) + " player has no island!"); return null; } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: If these island locations are not safe, then we need to get creative"); + } // If these island locations are not safe, then we need to get creative // Try the default location - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: try default location"); + } Location dl = new Location(l.getWorld(), l.getX() + 0.5D, l.getY() + 5D, l.getZ() + 2.5D, 0F, 30F); if (isSafeLocation(dl)) { plugin.getPlayers().setHomeLocation(playerUUID, dl, number); return dl; } // Try just above the bedrock - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: above bedrock"); + } dl = new Location(l.getWorld(), l.getX() + 0.5D, l.getY() + 5D, l.getZ() + 0.5D, 0F, 30F); if (isSafeLocation(dl)) { plugin.getPlayers().setHomeLocation(playerUUID, dl, number); return dl; } // Try all the way up to the sky - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: try all the way to the sky"); + } for (int y = l.getBlockY(); y < 255; y++) { final Location n = new Location(l.getWorld(), l.getX() + 0.5D, y, l.getZ() + 0.5D); if (isSafeLocation(n)) { @@ -527,8 +543,9 @@ public class IslandsManager { return n; } } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: unsuccessful"); + } // Unsuccessful return null; } @@ -542,8 +559,9 @@ public class IslandsManager { */ public Location getSpawnPoint() { //plugin.getLogger().info("DEBUG: getting spawn point : " + spawn.getSpawnPoint()); - if (spawn == null) + if (spawn == null) { return null; + } return spawn.getSpawnPoint(); } @@ -584,11 +602,13 @@ public class IslandsManager { @SuppressWarnings("deprecation") public void homeTeleport(final Player player, int number) { Location home; - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("home teleport called for #" + number); + } home = getSafeHomeLocation(player.getUniqueId(), number); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("home get safe loc = " + home); + } // Check if the player is a passenger in a boat if (player.isInsideVehicle()) { Entity boat = player.getVehicle(); @@ -601,14 +621,16 @@ public class IslandsManager { } } if (home == null) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("Fixing home location using safe spot teleport"); + } // Try to fix this teleport location and teleport the player if possible new SafeSpotTeleport(plugin, player, plugin.getPlayers().getHomeLocation(player.getUniqueId(), number), number); return; } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: home loc = " + home + " teleporting"); + } //home.getChunk().load(); player.teleport(home); //player.sendBlockChange(home, Material.GLOWSTONE, (byte)0); @@ -644,11 +666,13 @@ public class IslandsManager { * @return */ public boolean isIsland(Location location){ - if (location == null) + if (location == null) { return true; + } location = getClosestIsland(location); - if (islandCache.contains(location)) + if (islandCache.contains(location)) { return true; + } if (!plugin.getSettings().isUseOwnGenerator()) { // Block check @@ -662,7 +686,7 @@ public class IslandsManager { for (int x = -5; x <= 5; x++) { for (int y = 10; y <= 255; y++) { for (int z = -5; z <= 5; z++) { - if (!location.getWorld().getBlockAt(x + location.getBlockX(), y, z + location.getBlockZ()).isEmpty() + if (!location.getWorld().getBlockAt(x + location.getBlockX(), y, z + location.getBlockZ()).isEmpty() && !location.getWorld().getBlockAt(x + location.getBlockX(), y, z + location.getBlockZ()).isLiquid()) { plugin.getLogger().info("Solid block found during long search - adding "); createIsland(location); @@ -677,14 +701,14 @@ public class IslandsManager { /** * This returns the coordinate of where an island should be on the grid. - * + * * @param location location to query * @return Location of closest island */ public Location getClosestIsland(Location location) { - long x = Math.round((double) location.getBlockX() / plugin.getSettings().getIslandDistance()) + long x = Math.round((double) location.getBlockX() / plugin.getSettings().getIslandDistance()) * plugin.getSettings().getIslandDistance() + plugin.getSettings().getIslandXOffset(); - long z = Math.round((double) location.getBlockZ() / plugin.getSettings().getIslandDistance()) + long z = Math.round((double) location.getBlockZ() / plugin.getSettings().getIslandDistance()) * plugin.getSettings().getIslandDistance() + plugin.getSettings().getIslandZOffset(); long y = plugin.getSettings().getIslandHeight(); return new Location(location.getWorld(), x, y, z); @@ -708,18 +732,21 @@ public class IslandsManager { islandCache.clear(); spawn = null; try { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: loading grid"); + } for (Island island : handler.loadObjects()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding island at "+ island.getCenter()); + } islandCache.addIsland(island); } } catch (Exception e) { plugin.getLogger().severe("Could not load islands to cache! " + e.getMessage()); } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: islands loaded"); + } } /** @@ -731,7 +758,7 @@ public class IslandsManager { */ public boolean locationIsAtHome(UUID uuid, boolean coop, Location loc) { // Make a list of test locations and test them - Set islandTestLocations = new HashSet(); + Set islandTestLocations = new HashSet<>(); if (plugin.getPlayers().hasIsland(uuid) || plugin.getPlayers().inTeam(uuid)) { islandTestLocations.add(plugin.getIslands().getIslandLocation(uuid)); // If new Nether @@ -800,7 +827,7 @@ public class IslandsManager { } // Not in the grid, so do it the old way // Make a list of test locations and test them - Set islandTestLocations = new HashSet(); + Set islandTestLocations = new HashSet<>(); if (plugin.getPlayers().hasIsland(player.getUniqueId()) || plugin.getPlayers().inTeam(player.getUniqueId())) { islandTestLocations.add(getIslandLocation(player.getUniqueId())); } @@ -829,7 +856,7 @@ public class IslandsManager { } public void metrics_setCreatedCount(int count){ - this.metrics_createdcount = count; + metrics_createdcount = count; } /** @@ -877,8 +904,9 @@ public class IslandsManager { * @param playerUUID */ public void removePlayer(UUID playerUUID) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: removing player"); + } islandCache.removePlayer(playerUUID); } @@ -920,13 +948,14 @@ public class IslandsManager { * @param async - if true, saving will be done async */ public void save(boolean async){ - Collection collection = islandCache.getIslands(); + Collection collection = islandCache.getIslands(); if(async){ Runnable save = () -> { int index = 1; for(Island island : collection){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving island async " + index++); + } try { handler.saveObject(island); } catch (Exception e) { @@ -938,8 +967,9 @@ public class IslandsManager { } else { int index = 1; for(Island island : collection){ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saving island " + index++); + } try { handler.saveObject(island); } catch (Exception e) { @@ -967,8 +997,9 @@ public class IslandsManager { */ public boolean setJoinTeam(Island teamIsland, UUID playerUUID) { // Add player to new island - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Adding player to new island"); + } teamIsland.addMember(playerUUID); islandCache.addPlayer(playerUUID, teamIsland); if (DEBUG) { @@ -990,8 +1021,9 @@ public class IslandsManager { * @param playerUUID */ public void setLeaveTeam(UUID playerUUID) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: leaving team"); + } plugin.getPlayers().clearPlayerHomes(playerUUID); removePlayer(playerUUID); } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/NewIsland.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/NewIsland.java index 35e7b9f87..8210ba144 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/NewIsland.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/NewIsland.java @@ -28,7 +28,7 @@ public class NewIsland { private NewIsland(Island oldIsland, Player player, Reason reason) { super(); - this.plugin = BSkyBlock.getInstance(); + plugin = BSkyBlock.getInstance(); this.player = player; this.reason = reason; newIsland(); @@ -47,7 +47,7 @@ public class NewIsland { /** * Start building a new island - * @param plugin + * @param plugin * @return New island builder object */ public static Builder builder(BSkyBlock plugin) { @@ -93,8 +93,9 @@ public class NewIsland { * Makes an island. */ public void newIsland() { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: new island"); + } //long time = System.nanoTime(); final UUID playerUUID = player.getUniqueId(); /* @@ -102,11 +103,13 @@ public class NewIsland { if (!plugin.getPlayers().hasIsland(playerUUID)) { firstTime = true; }*/ - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: finding island location"); + } Location next = getNextIsland(player.getUniqueId()); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: found " + next); + } // Add to the grid island = plugin.getIslands().createIsland(next, playerUUID); @@ -123,16 +126,18 @@ public class NewIsland { plugin.getPlayers().setHomeLocation(playerUUID, next, 1); // Fire event - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: firing event"); + } IslandBaseEvent event = IslandEvent.builder() .involvedPlayer(player.getUniqueId()) .reason(reason) .island(island) .location(island.getCenter()) .build(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: event cancelled status = " + event.isCancelled()); + } if (!event.isCancelled()) { // Create island new IslandBuilder(plugin, island) @@ -153,7 +158,7 @@ public class NewIsland { .setChestItems(plugin.getSettings().getChestItems()) .setType(IslandType.END) .build(); - } + } // Teleport player to their island plugin.getIslands().homeTeleport(player); // Fire exit event @@ -186,25 +191,30 @@ public class NewIsland { Location last = plugin.getIslands().getLast(); if (DEBUG) + { plugin.getLogger().info("DEBUG: last = " + last); - // Find the next free spot + // Find the next free spot + } if (last == null) { last = new Location(plugin.getIslandWorldManager().getIslandWorld(), plugin.getSettings().getIslandXOffset() + plugin.getSettings().getIslandStartX(), plugin.getSettings().getIslandHeight(), plugin.getSettings().getIslandZOffset() + plugin.getSettings().getIslandStartZ()); } Location next = last.clone(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: last 2 = " + last); + } while (plugin.getIslands().isIsland(next)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: getting next loc"); + } next = nextGridLocation(next); }; // Make the last next, last last = next.clone(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: last 3 = " + last); + } return next; } diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index b6db74227..c08ec4d54 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -83,7 +83,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { mySQLmapping.put(Location.class.getTypeName(), "VARCHAR(254)"); mySQLmapping.put(World.class.getTypeName(), "VARCHAR(254)"); - // Collections are stored as additional tables. The boolean indicates whether there + // Collections are stored as additional tables. The boolean indicates whether there // is any data in it or not (maybe) mySQLmapping.put(Set.class.getTypeName(), "BOOL"); mySQLmapping.put(Map.class.getTypeName(), "BOOL"); @@ -97,7 +97,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { /** * Handles the connection to the database and creation of the initial database schema (tables) for - * the class that will be stored. + * the class that will be stored. * @param plugin * @param type - the type of class to be stored in the database. Must inherit DataObject * @param databaseConnecter - authentication details for the database @@ -163,8 +163,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //plugin.getLogger().info(setSql); // Execute the statement try (PreparedStatement collections = connection.prepareStatement(setSql)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); + } collections.executeUpdate(); } } @@ -182,8 +183,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //plugin.getLogger().info("DEBUG: SQL string = " + sql); // Prepare and execute the database statements pstmt = connection.prepareStatement(sql); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: pstmt = " + pstmt.toString()); + } pstmt.executeUpdate(); } catch (Exception e) { plugin.getLogger().severe("Could not create database schema! " + e.getMessage()); @@ -209,15 +211,17 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { boolean first = true; /* Iterate the column-names */ for (Field f : dataObject.getDeclaredFields()) { - if (first) + if (first) { first = false; - else + } else { sb.append(", "); + } - if (usePlaceHolders) + if (usePlaceHolders) { sb.append("?"); - else + } else { sb.append("`" + f.getName() + "`"); + } } return sb.toString(); @@ -240,18 +244,21 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { boolean first = true; for (String col : cols) { // Add commas - if (first) + if (first) { first = false; - else + } else { sb.append(", "); + } // this is used if the string is going to be used to insert something so the value will replace the ? - if (usePlaceHolders) + if (usePlaceHolders) { sb.append("?"); - else + } else { sb.append(col); + } } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collection column string = " + sb.toString()); + } return sb.toString(); } @@ -269,8 +276,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { col += " " + en.getValue(); } columns.add(col); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collection columns = " + col); + } } return columns; @@ -288,11 +296,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // In this way, we can deduce what type needs to be written at runtime. Type[] genericParameterTypes = method.getGenericParameterTypes(); // There could be more than one argument, so step through them - for (int i = 0; i < genericParameterTypes.length; i++) { + for (Type genericParameterType : genericParameterTypes) { // If the argument is a parameter, then do something - this should always be true if the parameter is a collection - if (genericParameterTypes[i] instanceof ParameterizedType) { - // Get the actual type arguments of the parameter - Type[] parameters = ((ParameterizedType)genericParameterTypes[i]).getActualTypeArguments(); + if (genericParameterType instanceof ParameterizedType) { + // Get the actual type arguments of the parameter + Type[] parameters = ((ParameterizedType)genericParameterType).getActualTypeArguments(); //parameters[0] contains java.lang.String for method like "method(List value)" // Run through them one by one and create a SQL string int index = 0; @@ -300,8 +308,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // This is a request for column names. String setMapping = mySQLmapping.get(type.getTypeName()); columns.put("`" + type.getTypeName() + "_" + index + "`", setMapping != null ? setMapping : "VARCHAR(254)"); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collection column = " + "`" + type.getTypeName() + "_" + index + "`" + setMapping); + } } // Increment the index so each column has a unique name index++; @@ -381,8 +390,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Connection connection = null; PreparedStatement preparedStatement = null; - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: saveObject "); + } try { // Try to connect to the database connection = databaseConnecter.createConnection(); @@ -400,37 +410,43 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } // Create the insertion int i = 0; - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: insert Query " + insertQuery); + } // Run through the fields in the class using introspection for (Field field : dataObject.getDeclaredFields()) { // Get the field's property descriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); // Get the read method for this field Method method = propertyDescriptor.getReadMethod(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); + } //sql += "`" + field.getName() + "` " + mapping + ","; // Invoke the read method to obtain the value from the class - this is the value we need to store in the database Object value = method.invoke(instance); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: value = " + value); + } // Adapter // Check if there is an annotation on the field ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); // If there is a config annotation then do something - if (configEntry != null) { - if (DEBUG) + if (configEntry != null) { + if (DEBUG) { plugin.getLogger().info("DEBUG: there is a configEntry"); + } } Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined + } + // A conversion adapter has been defined value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: value now after deserialization = " + value); + } } // Create set and map table inserts if this is a Collection if (propertyDescriptor.getPropertyType().equals(Set.class) || @@ -443,8 +459,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql)) { collStatement.setString(1, uniqueId); collStatement.execute(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); + } } // Insert into the table String setSql = "INSERT INTO `" + dataObject.getCanonicalName() + "." + field.getName() + "` (uniqueId, "; @@ -456,8 +473,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { // Set the uniqueId collStatement.setString(1, uniqueId); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collection insert =" + setSql); + } // Do single dimension types (set and list) if (propertyDescriptor.getPropertyType().equals(Set.class) || propertyDescriptor.getPropertyType().equals(ArrayList.class)) { @@ -474,8 +492,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //} // Set the value from ? to whatever it is collStatement.setObject(2, setValue); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: " + collStatement.toString()); + } // Execute the SQL in the database collStatement.execute(); } @@ -486,22 +505,26 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Iterator it = collection.entrySet().iterator(); while (it.hasNext()) { Entry en = (Entry) it.next(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); + } // Get the key and serialize it Object key = serialize(en.getKey(), en.getKey().getClass()); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); + } // Get the value and serialize it Object mapValue = serialize(en.getValue(), en.getValue().getClass()); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: mapValue = " + mapValue); + } // Write the objects into prepared statement collStatement.setObject(1, key); collStatement.setObject(2, mapValue); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: " + collStatement.toString()); + } // Write to database collStatement.execute(); } @@ -521,8 +544,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Add the statements to a batch preparedStatement.addBatch(); // Execute - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: prepared statement = " + preparedStatement.toString()); + } preparedStatement.executeBatch(); } finally { @@ -600,8 +624,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try { connection = databaseConnecter.createConnection(); statement = connection.createStatement(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: selectQuery = " + selectQuery); + } resultSet = statement.executeQuery(selectQuery); return createObjects(resultSet); @@ -623,15 +648,17 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Connection connection = null; Statement statement = null; ResultSet resultSet = null; - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: loading object for " + uniqueId); + } try { connection = databaseConnecter.createConnection(); String query = "SELECT " + getColumns(false) + " FROM `" + dataObject.getCanonicalName() + "` WHERE uniqueId = ? LIMIT 1"; try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { preparedStatement.setString(1, uniqueId); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: load Object query = " + preparedStatement.toString()); + } resultSet = preparedStatement.executeQuery(); List result = createObjects(resultSet); @@ -673,7 +700,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { IllegalAccessException, IntrospectionException, InvocationTargetException, ClassNotFoundException { - List list = new ArrayList(); + List list = new ArrayList<>(); // The database can return multiple results in one go, e.g., all the islands in the database // Run through them one by one while (resultSet.next()) { @@ -693,14 +720,16 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Get the write method for this field, because we are going to use it to write the value // once we get the value from the database Method method = propertyDescriptor.getWriteMethod(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: propertyDescriptor.getPropertyType() = " + propertyDescriptor.getPropertyType()); - // If the type is a Collection, then we need to deal with set and map tables + } + // If the type is a Collection, then we need to deal with set and map tables if (Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { // Collection - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Collection or Map"); + } // TODO Get the values from the subsidiary tables. // value is just of type boolean right now String setSql = "SELECT "; @@ -713,21 +742,23 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { // Set the unique ID collStatement.setObject(1, uniqueId); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: collStatement = " + collStatement.toString()); + } try (ResultSet collectionResultSet = collStatement.executeQuery()) { //plugin.getLogger().info("DEBUG: collectionResultSet = " + collectionResultSet.toString()); // Do single dimension types (set and list) if (Set.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding a set"); - // Loop through the collection resultset + } + // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be only 1 long Type setType = collectionTypes.get(0); - value = new HashSet(); + value = new HashSet<>(); if (DEBUG) { plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); @@ -736,14 +767,15 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { ((Set) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); } } else if (List.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Adding a list "); - // Loop through the collection resultset + } + // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be only 1 long Type setType = collectionTypes.get(0); - value = new ArrayList(); + value = new ArrayList<>(); //plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); while (collectionResultSet.next()) { //plugin.getLogger().info("DEBUG: adding to the list"); @@ -752,29 +784,34 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || HashMap.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Adding a map "); - // Loop through the collection resultset + } + // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be 2 long Type keyType = collectionTypes.get(0); Type valueType = collectionTypes.get(1); - value = new HashMap(); - if (DEBUG) + value = new HashMap<>(); + if (DEBUG) { plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); + } while (collectionResultSet.next()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: adding to the map"); + } //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); // Work through the columns // Key Object key = deserialize(collectionResultSet.getObject(1),Class.forName(keyType.getTypeName())); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: key = " + key); + } Object mapValue = deserialize(collectionResultSet.getObject(2),Class.forName(valueType.getTypeName())); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: value = " + mapValue); + } ((Map) value).put(key,mapValue); } } else { @@ -785,27 +822,32 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } } } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: regular type"); + } value = deserialize(value, propertyDescriptor.getPropertyType()); } // Adapter // Check if there is an annotation on the field ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); // If there is a config annotation then do something - if (configEntry != null) { - if (DEBUG) + if (configEntry != null) { + if (DEBUG) + { plugin.getLogger().info("DEBUG: there is a configEntry"); - // TODO: add config entry handling + // TODO: add config entry handling + } } Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined + } + // A conversion adapter has been defined value = ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: value now after deserialization = " + value); + } } if (DEBUG) { plugin.getLogger().info("DEBUG: invoking method " + method.getName()); @@ -833,10 +875,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { */ @SuppressWarnings({ "unchecked", "rawtypes" }) private Object deserialize(Object value, Class clazz) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: deserialize - class is " + clazz.getTypeName()); + } if (value instanceof String && value.equals("null")) { - // If the value is null as a string, return null + // If the value is null as a string, return null return null; } // Types that need to be deserialized @@ -894,8 +937,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Second is the unique ID preparedStatement.setString(1, uniqueId); preparedStatement.addBatch(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: DELETE Query " + preparedStatement.toString()); + } preparedStatement.executeBatch(); // Delete from any sub tables created from the object // Run through the fields in the class using introspection @@ -933,8 +977,9 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { */ @Override public boolean objectExits(String key) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: checking if " + key + " exists in the database"); + } Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -945,11 +990,13 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, key); resultSet = preparedStatement.executeQuery(); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: object exists sql " + preparedStatement.toString()); + } if (resultSet.next()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: result is " + resultSet.getBoolean(1)); + } return resultSet.getBoolean(1); } } catch (SQLException e) { diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java index 68bd7d217..8be1706d6 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseResourceCloser.java @@ -17,8 +17,9 @@ public class MySQLDatabaseResourceCloser { */ public static void close(ResultSet... resultSets) { - if (resultSets == null) + if (resultSets == null) { return; + } for (ResultSet resultSet : resultSets) { if (resultSet != null) { @@ -43,8 +44,9 @@ public class MySQLDatabaseResourceCloser { * CallableStatement, because they extend Statement. */ - if (statements == null) + if (statements == null) { return; + } for (Statement statement : statements) { if (statement != null) { @@ -64,8 +66,9 @@ public class MySQLDatabaseResourceCloser { * Connections that should be closed */ public static void close(Connection... connections) { - if (connections == null) + if (connections == null) { return; + } for (Connection connection : connections) { if (connection != null) { diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/DataObject.java b/src/main/java/us/tastybento/bskyblock/database/objects/DataObject.java index 30903bd4e..3a25eba2a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/DataObject.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/DataObject.java @@ -8,11 +8,11 @@ import us.tastybento.bskyblock.BSkyBlock; * */ public interface DataObject { - + default BSkyBlock getPlugin() { return BSkyBlock.getInstance(); } - + /** * @return the uniqueId */ @@ -22,5 +22,5 @@ public interface DataObject { * @param uniqueId the uniqueId to set */ void setUniqueId(String uniqueId); - + } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 6cc474298..7baff9195 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -39,7 +39,7 @@ public class Island implements DataObject { private String uniqueId = ""; - //// Island //// + //// Island //// // The center of the island itself private Location center; @@ -77,13 +77,13 @@ public class Island implements DataObject { //// State //// private boolean locked = false; private boolean spawn = false; - + private boolean purgeProtected = false; - + //// Protection flags //// @Adapter(FlagSerializer.class) private HashMap flags = new HashMap<>(); - + private int levelHandicap; private Location spawnPoint; @@ -91,16 +91,16 @@ public class Island implements DataObject { public Island(Location location, UUID owner, int protectionRange) { setOwner(owner); - this.createdDate = System.currentTimeMillis(); - this.updatedDate = System.currentTimeMillis(); - this.world = location.getWorld(); - this.center = location; - this.range = BSkyBlock.getInstance().getSettings().getIslandDistance(); - this.minX = center.getBlockX() - range; - this.minZ = center.getBlockZ() - range; + createdDate = System.currentTimeMillis(); + updatedDate = System.currentTimeMillis(); + world = location.getWorld(); + center = location; + range = BSkyBlock.getInstance().getSettings().getIslandDistance(); + minX = center.getBlockX() - range; + minZ = center.getBlockZ() - range; this.protectionRange = protectionRange; - this.minProtectedX = center.getBlockX() - protectionRange; - this.minProtectedZ = center.getBlockZ() - protectionRange; + minProtectedX = center.getBlockX() - protectionRange; + minProtectedZ = center.getBlockZ() - protectionRange; } /** @@ -108,10 +108,11 @@ public class Island implements DataObject { * @param playerUUID */ public void addMember(UUID playerUUID) { - if (playerUUID != null) + if (playerUUID != null) { members.put(playerUUID, RanksManager.MEMBER_RANK); + } } - + /** * Adds target to a list of banned players for this island. May be blocked by the event being cancelled. * If the player is a member, coop or trustee, they will be removed from those lists. @@ -120,8 +121,9 @@ public class Island implements DataObject { */ public boolean addToBanList(UUID targetUUID) { // TODO fire ban event - if (targetUUID != null) + if (targetUUID != null) { members.put(targetUUID, RanksManager.BANNED_RANK); + } return true; } @@ -350,6 +352,7 @@ public class Island implements DataObject { return result; } + @Override public String getUniqueId() { // Island's have UUID's that are randomly assigned if they do not exist if (uniqueId.isEmpty()) { @@ -418,7 +421,7 @@ public class Island implements DataObject { * @return true if allowed, false if not */ public boolean isAllowed(Flag flag) { - return this.getFlag(flag) >= 0; + return getFlag(flag) >= 0; } /** @@ -429,7 +432,7 @@ public class Island implements DataObject { */ public boolean isAllowed(User user, Flag flag) { //Bukkit.getLogger().info("DEBUG: " + flag.getID() + " user score = " + getRank(user) + " flag req = "+ this.getFlagReq(flag)); - return this.getRank(user) >= this.getFlag(flag); + return getRank(user) >= getFlag(flag); } /** @@ -547,7 +550,7 @@ public class Island implements DataObject { } } else { // Unlock the island - IslandBaseEvent event = IslandEvent.builder().island(this).reason(Reason.UNLOCK).build(); + IslandBaseEvent event = IslandEvent.builder().island(this).reason(Reason.UNLOCK).build(); if(!event.isCancelled()){ this.locked = locked; } @@ -603,14 +606,16 @@ public class Island implements DataObject { */ public void setOwner(UUID owner){ this.owner = owner; - if (owner == null) return; + if (owner == null) { + return; + } // Defensive code: demote any previous owner for (Entry en : members.entrySet()) { if (en.getValue().equals(RanksManager.OWNER_RANK)) { en.setValue(RanksManager.MEMBER_RANK); } } - this.members.put(owner, RanksManager.OWNER_RANK); + members.put(owner, RanksManager.OWNER_RANK); } /** @@ -640,23 +645,25 @@ public class Island implements DataObject { * @param rank */ public void setRank(User user, int rank) { - if (user.getUniqueId() != null) members.put(user.getUniqueId(), rank); + if (user.getUniqueId() != null) { + members.put(user.getUniqueId(), rank); + } } /** * @param ranks the ranks to set */ public void setRanks(HashMap ranks) { - this.members = ranks; + members = ranks; } /** * @param isSpawn - if the island is the spawn */ public void setSpawn(boolean isSpawn){ - this.spawn = isSpawn; + spawn = isSpawn; } - + /** * Resets the flags to their default as set in config.yml for the spawn */ @@ -671,6 +678,7 @@ public class Island implements DataObject { } + @Override public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Players.java b/src/main/java/us/tastybento/bskyblock/database/objects/Players.java index 119cf2462..e69fa6579 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Players.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Players.java @@ -31,21 +31,22 @@ public class Players implements DataObject { public Players() {} /** - * @param plugin + * @param plugin * @param uniqueId * Constructor - initializes the state variables * */ public Players(BSkyBlock plugin, final UUID uniqueId) { this.uniqueId = uniqueId.toString(); - this.homeLocations = new HashMap<>(); - this.playerName = ""; - this.resetsLeft = plugin.getSettings().getResetLimit(); - this.locale = ""; - this.kickedList = new HashMap<>(); - this.playerName = Bukkit.getServer().getOfflinePlayer(uniqueId).getName(); - if (this.playerName == null) - this.playerName = uniqueId.toString(); + homeLocations = new HashMap<>(); + playerName = ""; + resetsLeft = plugin.getSettings().getResetLimit(); + locale = ""; + kickedList = new HashMap<>(); + playerName = Bukkit.getServer().getOfflinePlayer(uniqueId).getName(); + if (playerName == null) { + playerName = uniqueId.toString(); + } } /** @@ -64,7 +65,7 @@ public class Players implements DataObject { public Location getHomeLocation(int number) { /* Bukkit.getLogger().info("DEBUG: getting home location " + number); - + Bukkit.getLogger().info("DEBUG: " + homeLocations.toString()); for (Entry en : homeLocations.entrySet()) { Bukkit.getLogger().info("DEBUG: " + en.getKey() + " ==> " + en.getValue()); @@ -148,7 +149,7 @@ public class Players implements DataObject { } /** - * Stores the numbered home location of the player. Numbering starts at 1. + * Stores the numbered home location of the player. Numbering starts at 1. * @param location * @param number */ @@ -165,7 +166,7 @@ public class Players implements DataObject { * @param uuid */ public void setPlayerUUID(final UUID uuid) { - this.uniqueId = uuid.toString(); + uniqueId = uuid.toString(); } /** @@ -210,9 +211,9 @@ public class Players implements DataObject { * Add death */ public void addDeath() { - this.deaths++; - if (this.deaths > getPlugin().getSettings().getDeathsMax()) { - this.deaths = getPlugin().getSettings().getDeathsMax(); + deaths++; + if (deaths > getPlugin().getSettings().getDeathsMax()) { + deaths = getPlugin().getSettings().getDeathsMax(); } } diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java index da5ec607d..666ca5bb4 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java @@ -15,5 +15,5 @@ import java.lang.annotation.Target; public @interface Adapter { Class value(); - + } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java index ac1187081..021503675 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java @@ -16,9 +16,9 @@ public interface AdapterInterface { * @return serialized object */ S serialize(Object object); - - /** - * Deserialize object + + /** + * Deserialize object * @param object * @return deserialized object */ diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java index e4ddb3d48..81334490e 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java @@ -10,7 +10,7 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.flags.Flag; /** - * Serializes the {@link us.tastybento.bskyblock.database.objects.Island#getFlags() getFlags()} and + * Serializes the {@link us.tastybento.bskyblock.database.objects.Island#getFlags() getFlags()} and * {@link us.tastybento.bskyblock.database.objects.Island#setFlags() setFlags()} * in {@link us.tastybento.bskyblock.database.objects.Island} * @author tastybento @@ -21,8 +21,9 @@ public class FlagSerializer implements AdapterInterface, @Override public HashMap serialize(Object object) { HashMap result = new HashMap<>(); - if (object == null) + if (object == null) { return result; + } // For YAML if (object instanceof MemorySection) { MemorySection section = (MemorySection) object; @@ -42,8 +43,9 @@ public class FlagSerializer implements AdapterInterface, @Override public HashMap deserialize(Object object) { HashMap result = new HashMap<>(); - if (object == null) + if (object == null) { return result; + } HashMap flags = (HashMap)object; for (Entry en: flags.entrySet()) { result.put(en.getKey().getID(), en.getValue()); diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java index c1a2d3f3a..225c9439b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java @@ -22,13 +22,13 @@ public class PotionEffectListAdapter implements AdapterInterface deserialize(Object to) { - List result = new ArrayList<>(); - if (to instanceof ArrayList) { - for (PotionEffectType type: (ArrayList)to) { - result.add(type.getName()); - } - } - return result; + List result = new ArrayList<>(); + if (to instanceof ArrayList) { + for (PotionEffectType type: (ArrayList)to) { + result.add(type.getName()); + } + } + return result; } } diff --git a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java index 7369d523c..092f82dd9 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/ChunkGeneratorWorld.java @@ -22,7 +22,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator { BSkyBlock plugin; Random rand = new Random(); PerlinOctaveGenerator gen; - + /** * @param plugin */ diff --git a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java index 307c5936e..580196ac0 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java @@ -14,7 +14,7 @@ public class IslandWorld { private static final String NETHER = "_nether"; private static final String THE_END = "_the_end"; private static final String CREATING = "Creating "; - + private BSkyBlock plugin; private static World islandWorld; private static World netherWorld; @@ -91,7 +91,7 @@ public class IslandWorld { } } - + } /** diff --git a/src/main/java/us/tastybento/bskyblock/generators/NetherPopulator.java b/src/main/java/us/tastybento/bskyblock/generators/NetherPopulator.java index 3841795e3..2d0006895 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/NetherPopulator.java +++ b/src/main/java/us/tastybento/bskyblock/generators/NetherPopulator.java @@ -32,17 +32,17 @@ public class NetherPopulator extends BlockPopulator { if (b.getType().equals(Material.MOB_SPAWNER)) { CreatureSpawner cs = (CreatureSpawner) b.getState(); switch (random.nextInt(3)) { - case 0: - cs.setSpawnedType(EntityType.BLAZE); - break; - case 1: - cs.setSpawnedType(EntityType.SKELETON); - break; - case 2: - cs.setSpawnedType(EntityType.MAGMA_CUBE); - break; - default: - cs.setSpawnedType(EntityType.BLAZE); + case 0: + cs.setSpawnedType(EntityType.BLAZE); + break; + case 1: + cs.setSpawnedType(EntityType.SKELETON); + break; + case 2: + cs.setSpawnedType(EntityType.MAGMA_CUBE); + break; + default: + cs.setSpawnedType(EntityType.BLAZE); } } else if (b.getType().equals(Material.OBSIDIAN)) { b.setType(Material.CHEST); diff --git a/src/main/java/us/tastybento/bskyblock/island/builders/IslandBuilder.java b/src/main/java/us/tastybento/bskyblock/island/builders/IslandBuilder.java index a52ccf090..16f0193a9 100644 --- a/src/main/java/us/tastybento/bskyblock/island/builders/IslandBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/island/builders/IslandBuilder.java @@ -50,7 +50,7 @@ public class IslandBuilder { public IslandBuilder(BSkyBlock plugin, Island island) { this.plugin = plugin; this.island = island; - this.world = island.getWorld(); + world = island.getWorld(); } @@ -61,16 +61,16 @@ public class IslandBuilder { this.type = type; switch(type) { case END: - this.world = plugin.getIslandWorldManager().getEndWorld(); + world = plugin.getIslandWorldManager().getEndWorld(); break; case ISLAND: - this.world = plugin.getIslandWorldManager().getIslandWorld(); + world = plugin.getIslandWorldManager().getIslandWorld(); break; case NETHER: - this.world = plugin.getIslandWorldManager().getNetherWorld(); + world = plugin.getIslandWorldManager().getNetherWorld(); break; default: - this.world = island.getWorld(); + world = island.getWorld(); break; } @@ -82,8 +82,8 @@ public class IslandBuilder { * @param player the player to set */ public IslandBuilder setPlayer(Player player) { - this.playerUUID = player.getUniqueId(); - this.playerName = player.getName(); + playerUUID = player.getUniqueId(); + playerName = player.getName(); return this; } @@ -92,7 +92,7 @@ public class IslandBuilder { * @param list the default chestItems to set */ public IslandBuilder setChestItems(List list) { - this.chestItems = list; + chestItems = list; return this; } @@ -109,7 +109,7 @@ public class IslandBuilder { generateNetherBlocks(); } else if (type == IslandType.END){ generateEndBlocks(); - } + } // Do other stuff } @@ -477,12 +477,12 @@ public class IslandBuilder { private void placeSign(int x, int y, int z) { Block blockToChange = world.getBlockAt(x, y, z); blockToChange.setType(Material.SIGN_POST); - if (this.playerUUID != null) { + if (playerUUID != null) { Sign sign = (Sign) blockToChange.getState(); User user = User.getInstance(playerUUID); for (int i = 0; i < 4; i++) { sign.setLine(i, user.getTranslation("new-island.sign.line" + i, "[player]", playerName)); - } + } ((org.bukkit.material.Sign) sign.getData()).setFacingDirection(BlockFace.NORTH); sign.update(); } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java index 0d83aab2a..66f88d7bf 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/JoinLeaveListener.java @@ -25,7 +25,7 @@ public class JoinLeaveListener implements Listener { */ public JoinLeaveListener(BSkyBlock plugin) { this.plugin = plugin; - this.players = plugin.getPlayers(); + players = plugin.getPlayers(); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -39,48 +39,56 @@ public class JoinLeaveListener implements Listener { } UUID playerUUID = user.getUniqueId(); if (plugin.getPlayers().isKnown(playerUUID)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: known player"); + } // Load player players.addPlayer(playerUUID); // Reset resets if the admin changes it to or from unlimited if (plugin.getSettings().getResetLimit() < players.getResetsLeft(playerUUID) || (plugin.getSettings().getResetLimit() >= 0 && players.getResetsLeft(playerUUID) < 0)) { players.setResetsLeft(playerUUID, plugin.getSettings().getResetLimit()); } - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Setting player's name"); + } // Set the player's name (it may have changed), but only if it isn't empty if (!user.getName().isEmpty()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Player name is " + user.getName()); + } players.setPlayerName(user); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Saving player"); + } players.save(playerUUID); } else { plugin.getLogger().warning("Player that just logged in has no name! " + playerUUID.toString()); } if (plugin.getSettings().isRemoveMobsOnLogin()) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Removing mobs"); + } plugin.getIslands().removeMobs(user.getLocation()); } // Check if they logged in to a locked island and expel them or if they are banned Island currentIsland = plugin.getIslands().getIslandAt(user.getLocation()).orElse(null); if (currentIsland != null && (currentIsland.isLocked() || plugin.getPlayers().isBanned(currentIsland.getOwner(),user.getUniqueId()))) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: Current island is locked, or player is banned"); + } if (!currentIsland.getMemberSet().contains(playerUUID) && !user.hasPermission(Constants.PERMPREFIX + "mod.bypassprotect")) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: No bypass - teleporting"); + } user.sendMessage("locked.islandlocked"); plugin.getIslands().homeTeleport(user.getPlayer()); } } } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: not a known player"); + } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java index 1cd1ad51d..752d9128f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java @@ -55,12 +55,16 @@ public class PanelListenerManager implements Listener { @EventHandler(priority = EventPriority.LOWEST) public void onInventoryClose(InventoryCloseEvent event) { - if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) getOpenPanels().remove(event.getPlayer().getUniqueId()); + if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) { + getOpenPanels().remove(event.getPlayer().getUniqueId()); + } } @EventHandler(priority = EventPriority.NORMAL) public void onLogOut(PlayerQuitEvent event) { - if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) getOpenPanels().remove(event.getPlayer().getUniqueId()); + if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) { + getOpenPanels().remove(event.getPlayer().getUniqueId()); + } } /** @@ -69,5 +73,5 @@ public class PanelListenerManager implements Listener { public static HashMap getOpenPanels() { return openPanels; } - + } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java index cde565123..66d08400c 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/AbstractFlagListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -30,7 +30,7 @@ public abstract class AbstractFlagListener implements Listener { private BSkyBlock plugin = BSkyBlock.getInstance(); private User user = null; - + /** * @return the plugin */ @@ -45,7 +45,7 @@ public abstract class AbstractFlagListener implements Listener { public void setPlugin(BSkyBlock plugin) { this.plugin = plugin; } - + /** * Sets the player associated with this event. * If the user is a fake player, they are not counted. @@ -60,7 +60,7 @@ public abstract class AbstractFlagListener implements Listener { setUser(User.getInstance((Player)getPlayer.invoke(e))); return true; } - } catch (Exception e1) { // Do nothing + } catch (Exception e1) { // Do nothing } return false; } @@ -70,7 +70,9 @@ public abstract class AbstractFlagListener implements Listener { * @param user */ public AbstractFlagListener setUser(User user) { - if (!plugin.getSettings().getFakePlayers().contains(user.getName())) this.user = user; + if (!plugin.getSettings().getFakePlayers().contains(user.getName())) { + this.user = user; + } return this; } @@ -92,11 +94,13 @@ public abstract class AbstractFlagListener implements Listener { * @param silent - if true, message is not sent */ public void noGo(Event e, boolean silent) { - if (e instanceof Cancellable) + if (e instanceof Cancellable) { ((Cancellable)e).setCancelled(true); + } if (user != null) { - if (!silent) + if (!silent) { user.sendMessage("protection.protected"); + } user.updateInventory(); } } @@ -137,7 +141,7 @@ public abstract class AbstractFlagListener implements Listener { * @param breakBlocks * @return true if the check is okay, false if it was disallowed */ - public boolean checkIsland(Event e, Location loc, Flag breakBlocks) { + public boolean checkIsland(Event e, Location loc, Flag breakBlocks) { return checkIsland(e, loc, breakBlocks, false); } @@ -152,7 +156,9 @@ public abstract class AbstractFlagListener implements Listener { */ public boolean checkIsland(Event e, Location loc, Flag flag, boolean silent) { // If this is not an Island World, skip - if (!inWorld(loc)) return true; + if (!inWorld(loc)) { + return true; + } // Get the island and if present Optional island = getIslands().getIslandAt(loc); @@ -161,10 +167,10 @@ public abstract class AbstractFlagListener implements Listener { if (flag.getType().equals(FlagType.SETTING)) { // If the island exists, return the setting, otherwise return the default setting for this flag return island.map(x -> x.isAllowed(flag)).orElse(flag.isDefaultSetting()); - } - + } + // Protection flag - + // If the user is not set already, try to get it from the event if (user == null) { // Set the user associated with this event diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java index 13e508080..76a3f2425 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BlockInteractionListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -65,7 +65,7 @@ public class BlockInteractionListener extends AbstractFlagListener { checkIsland(e, e.getClickedBlock().getLocation(), Flags.CHEST); break; - + case ACACIA_DOOR: case BIRCH_DOOR: case DARK_OAK_DOOR: @@ -87,7 +87,7 @@ public class BlockInteractionListener extends AbstractFlagListener { case SPRUCE_FENCE_GATE: checkIsland(e, e.getClickedBlock().getLocation(), Flags.GATE); break; - + case BURNING_FURNACE: case FURNACE: checkIsland(e, e.getClickedBlock().getLocation(), Flags.FURNACE); @@ -121,7 +121,7 @@ public class BlockInteractionListener extends AbstractFlagListener { default: break; } - // Now check for in-hand items + // Now check for in-hand items if (e.getItem() != null) { switch (e.getItem().getType()) { case ENDER_PEARL: @@ -132,7 +132,7 @@ public class BlockInteractionListener extends AbstractFlagListener { break; default: break; - + } } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java index a4fc3d858..6067c5519 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreakBlocksListener.java @@ -52,7 +52,9 @@ public class BreakBlocksListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onPlayerInteract(final PlayerInteractEvent e) { // Only handle hitting things - if (!e.getAction().equals(Action.LEFT_CLICK_BLOCK)) return; + if (!e.getAction().equals(Action.LEFT_CLICK_BLOCK)) { + return; + } // Look along player's sight line to see if any blocks are skulls try { @@ -94,7 +96,7 @@ public class BreakBlocksListener extends AbstractFlagListener { if (inWorld(e.getVehicle()) && e.getAttacker() instanceof Player) { User user = User.getInstance((Player) e.getAttacker()); // Get the island and if present, check the flag, react if required and return - getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { + getIslands().getIslandAt(e.getVehicle().getLocation()).ifPresent(x -> { if (!x.isAllowed(user, Flags.BREAK_BLOCKS)) { e.setCancelled(true); user.sendMessage("protection.protected"); @@ -117,7 +119,9 @@ public class BreakBlocksListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityDamage(EntityDamageByEntityEvent e) { // Only handle item frames and armor stands - if (!(e.getEntity() instanceof ItemFrame) && !(e.getEntity() instanceof ArmorStand)) return; + if (!(e.getEntity() instanceof ItemFrame) && !(e.getEntity() instanceof ArmorStand)) { + return; + } // Get the attacker if (e.getDamager() instanceof Player) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java index c26b4d997..64f63503e 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BreedingListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java index a6accff38..73c36bb7e 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -41,13 +41,19 @@ public class BucketListener extends AbstractFlagListener { public void onBucketFill(final PlayerBucketFillEvent e) { // Check filling of various liquids if (e.getItemStack().getType().equals(Material.LAVA_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA)) return; + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA)) { + return; + } } if (e.getItemStack().getType().equals(Material.WATER_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_WATER)) return; + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_WATER)) { + return; + } } if (e.getItemStack().getType().equals(Material.MILK_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.MILKING)) return; + if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.MILKING)) { + return; + } } // Check general bucket use checkIsland(e, e.getBlockClicked().getLocation(), Flags.BUCKET); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java index ceb297d27..cd43e0a16 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EggListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java index 382958aab..6f19b601d 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/EntityInteractListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -21,14 +21,14 @@ import us.tastybento.bskyblock.lists.Flags; * */ public class EntityInteractListener extends AbstractFlagListener { - + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onPlayerInteract(final PlayerInteractAtEntityEvent e) { if (e.getRightClicked() instanceof ArmorStand) { checkIsland(e, e.getRightClicked().getLocation(), Flags.ARMOR_STAND); } } - + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onPlayerHitEntity(PlayerInteractEntityEvent e) { // Animal riding diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java index 8be3c7d02..b521dbb92 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/FireListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -42,10 +42,14 @@ public class FireListener extends AbstractFlagListener { // Check if the island exists and if fire is allowed Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { - if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!x.isAllowed(Flags.FIRE_SPREAD)) { + e.setCancelled(true); + } }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) { + e.setCancelled(true); + } } /** @@ -61,10 +65,14 @@ public class FireListener extends AbstractFlagListener { // Check if the island exists and if fire is allowed Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { - if (!x.isAllowed(Flags.FIRE_SPREAD)) e.setCancelled(true); + if (!x.isAllowed(Flags.FIRE_SPREAD)) { + e.setCancelled(true); + } }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE_SPREAD.isDefaultSetting()) { + e.setCancelled(true); + } } } @@ -84,10 +92,14 @@ public class FireListener extends AbstractFlagListener { // Check if the island exists and if fire is allowed Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { - if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); + if (!x.isAllowed(Flags.FIRE)) { + e.setCancelled(true); + } }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) { + e.setCancelled(true); + } } @@ -137,13 +149,19 @@ public class FireListener extends AbstractFlagListener { // Check if the island exists and if fire is allowed Optional island = getIslands().getIslandAt(e.getBlock().getLocation()); island.ifPresent(x -> { - if (!x.isAllowed(Flags.FIRE)) e.setCancelled(true); + if (!x.isAllowed(Flags.FIRE)) { + e.setCancelled(true); + } }); // If not on an island, check the default setting - if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) e.setCancelled(true); + if (!island.isPresent() && !Flags.FIRE.isDefaultSetting()) { + e.setCancelled(true); + } // If either of these canceled the event, return - if (e.isCancelled()) return; + if (e.isCancelled()) { + return; + } // Stop TNT from being damaged if it is being caused by a visitor with a flaming arrow if (e.getEntity() instanceof Projectile) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index 44d8590b7..75d0f5cd7 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -89,8 +89,9 @@ public class HurtingListener extends AbstractFlagListener { */ @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onFishing(PlayerFishEvent e) { - if (e.getCaught() == null) + if (e.getCaught() == null) { return; + } if ((e.getCaught() instanceof Animals || e.getCaught() instanceof IronGolem || e.getCaught() instanceof Snowman || e.getCaught() instanceof Villager) && checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { @@ -98,7 +99,7 @@ public class HurtingListener extends AbstractFlagListener { return; } - if ((e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) + if ((e.getCaught() instanceof Monster || e.getCaught() instanceof Squid || e.getCaught() instanceof Slime) && checkIsland(e, e.getCaught().getLocation(), Flags.HURT_MONSTERS)) { e.getHook().remove(); return; @@ -126,7 +127,7 @@ public class HurtingListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onSplashPotionSplash(final PotionSplashEvent e) { // Try to get the shooter - Projectile projectile = (Projectile) e.getEntity(); + Projectile projectile = e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { Player attacker = (Player)projectile.getShooter(); // Run through all the affected entities @@ -164,7 +165,7 @@ public class HurtingListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onLingeringPotionSplash(final LingeringPotionSplashEvent e) { // Try to get the shooter - Projectile projectile = (Projectile) e.getEntity(); + Projectile projectile = e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java index 3c1ee775f..c8da8eef5 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/InventoryListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -34,11 +34,11 @@ public class InventoryListener extends AbstractFlagListener { public void onMountInventoryClick(InventoryClickEvent e) { if (e.getInventory().getHolder() == null) { return; - } + } if (e.getInventory().getHolder() instanceof Animals) { checkIsland(e, e.getInventory().getLocation(), Flags.MOUNT_INVENTORY); } - else if (e.getInventory().getHolder() instanceof Chest + else if (e.getInventory().getHolder() instanceof Chest || e.getInventory().getHolder() instanceof Dispenser || e.getInventory().getHolder() instanceof Hopper || e.getInventory().getHolder() instanceof Dropper diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java index e0f8bc848..a2b01d73d 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ItemDropPickUpListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java index 0899842b1..ba8fb7a1a 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/LeashListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java index 3fab1f489..680160455 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/MobSpawnListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -43,7 +43,7 @@ public class MobSpawnListener extends AbstractFlagListener { || e.getSpawnReason().equals(SpawnReason.NETHER_PORTAL)) { Optional island = getIslands().getIslandAt(e.getLocation()); if (island.isPresent()) { - if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { + if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { if (!island.get().isAllowed(Flags.MOB_SPAWN)) { // Mobs not allowed to spawn e.setCancelled(true); @@ -58,7 +58,7 @@ public class MobSpawnListener extends AbstractFlagListener { } } else { // Outside of the island - if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { + if (e.getEntity() instanceof Monster || e.getEntity() instanceof Slime) { if (!Flags.MOB_SPAWN.isDefaultSetting()) { // Mobs not allowed to spawn e.setCancelled(true); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index 2d5a61761..c62bcde0f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -45,8 +45,11 @@ public class PVPListener extends AbstractFlagListener { public void onEntityDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() instanceof Player) { Flag flag = Flags.PVP_OVERWORLD; - if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) { + flag = Flags.PVP_NETHER; + } else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) { + flag = Flags.PVP_END; + } respond(e, e.getDamager(), flag); } } @@ -73,8 +76,11 @@ public class PVPListener extends AbstractFlagListener { public void onFishing(PlayerFishEvent e) { if (e.getCaught() != null && e.getCaught() instanceof Player) { Flag flag = Flags.PVP_OVERWORLD; - if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) { + flag = Flags.PVP_NETHER; + } else if (e.getCaught().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) { + flag = Flags.PVP_END; + } if (checkIsland(e, e.getCaught().getLocation(), flag)) { e.getHook().remove(); return; @@ -90,11 +96,14 @@ public class PVPListener extends AbstractFlagListener { public void onSplashPotionSplash(final PotionSplashEvent e) { // Deduce the world Flag flag = Flags.PVP_OVERWORLD; - if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) { + flag = Flags.PVP_NETHER; + } else if (e.getPotion().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) { + flag = Flags.PVP_END; + } // Try to get the thrower - Projectile projectile = (Projectile) e.getEntity(); + Projectile projectile = e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { Player attacker = (Player)projectile.getShooter(); // Run through all the affected entities @@ -118,7 +127,7 @@ public class PVPListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) public void onLingeringPotionSplash(final LingeringPotionSplashEvent e) { // Try to get the shooter - Projectile projectile = (Projectile) e.getEntity(); + Projectile projectile = e.getEntity(); if (projectile.getShooter() != null && projectile.getShooter() instanceof Player) { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone @@ -133,13 +142,16 @@ public class PVPListener extends AbstractFlagListener { public void onLingeringPotionDamage(final EntityDamageByEntityEvent e) { if (e.getEntity() == null || e.getEntity().getUniqueId() == null) { return; - } + } if (e.getCause().equals(DamageCause.ENTITY_ATTACK) && thrownPotions.containsKey(e.getDamager().getEntityId())) { // Deduce the world Flag flag = Flags.PVP_OVERWORLD; - if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) flag = Flags.PVP_NETHER; - else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) flag = Flags.PVP_END; + if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) { + flag = Flags.PVP_NETHER; + } else if (e.getEntity().getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) { + flag = Flags.PVP_END; + } UUID attacker = thrownPotions.get(e.getDamager().getEntityId()); // Self damage diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java index 77a594f74..3b019b2d6 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PhysicalInteractionListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java index 83c4d0413..6a5f5c5f4 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PlaceBlocksListener.java @@ -59,7 +59,7 @@ public class PlaceBlocksListener extends AbstractFlagListener { } return; default: - // Check in-hand items + // Check in-hand items if (e.getMaterial() != null) { // This check protects against an exploit in 1.7.9 against cactus // and sugar cane and placing boats on non-liquids @@ -71,7 +71,7 @@ public class PlaceBlocksListener extends AbstractFlagListener { } } } - + /** * Handles Frost Walking on visitor's islands. This creates ice blocks, which is like placing blocks * @param e @@ -80,7 +80,7 @@ public class PlaceBlocksListener extends AbstractFlagListener { public void onBlockForm(EntityBlockFormEvent e) { if (e.getNewState().getType().equals(Material.FROSTED_ICE)) { // Silently check - checkIsland(e, e.getBlock().getLocation(), Flags.PLACE_BLOCKS, true); + checkIsland(e, e.getBlock().getLocation(), Flags.PLACE_BLOCKS, true); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java index e32d870c6..fc649a1b5 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PortalListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java index 2b404a5cc..c2330ce78 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/ShearingListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java index f9c30e145..21f44f864 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/TeleportationListener.java @@ -1,5 +1,5 @@ /** - * + * */ package us.tastybento.bskyblock.listeners.flags; @@ -19,7 +19,7 @@ public class TeleportationListener extends AbstractFlagListener { /** * Ender pearl and chorus fruit teleport checks - * + * * @param e */ @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) diff --git a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java index 883e633eb..2e8adb571 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/protection/FlyingMobEvents.java @@ -38,7 +38,7 @@ public class FlyingMobEvents implements Listener { */ public FlyingMobEvents(BSkyBlock plugin) { this.plugin = plugin; - this.mobSpawnInfo = new WeakHashMap<>(); + mobSpawnInfo = new WeakHashMap<>(); plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { //Bukkit.getLogger().info("DEBUG: checking - mobspawn size = " + mobSpawnInfo.size()); diff --git a/src/main/java/us/tastybento/bskyblock/lists/Flags.java b/src/main/java/us/tastybento/bskyblock/lists/Flags.java index dc910c2a0..acc2fbbe2 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Flags.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Flags.java @@ -29,7 +29,7 @@ import us.tastybento.bskyblock.listeners.flags.ShearingListener; import us.tastybento.bskyblock.listeners.flags.TeleportationListener; public class Flags { - + public static final Flag BREAK_BLOCKS = new FlagBuilder().id("BREAK_BLOCKS").icon(Material.STONE).listener(new BreakBlocksListener()).build(); public static final Flag PLACE_BLOCKS = new FlagBuilder().id("PLACE_BLOCKS").icon(Material.DIRT).listener(new PlaceBlocksListener()).build(); @@ -61,7 +61,7 @@ public class Flags { public static final Flag BUCKET = new FlagBuilder().id("BUCKET").icon(Material.BUCKET).listener(new BucketListener()).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 MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); + public static final Flag MILKING = new FlagBuilder().id("MILKING").icon(Material.MILK_BUCKET).build(); // Chorus Fruit and Enderpearls public static final Flag CHORUS_FRUIT = new FlagBuilder().id("CHORUS_FRUIT").icon(Material.CHORUS_FRUIT).listener(new TeleportationListener()).build(); @@ -79,7 +79,7 @@ public class Flags { * I'll take you to burn. * Fire * I'll take you to learn. - * You gonna burn, burn, burn + * You gonna burn, burn, burn * Fire * I'll take you to burn * - The Crazy World of Arthur Brown @@ -127,7 +127,7 @@ public class Flags { return Arrays.asList(Flags.class.getFields()).stream().map(field -> { try { return (Flag)field.get(null); - } catch (IllegalArgumentException | IllegalAccessException e) { + } catch (IllegalArgumentException | IllegalAccessException e) { Bukkit.getLogger().severe("Could not get Flag values " + e.getMessage()); } return null; diff --git a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java index 46ea6ce92..352b31096 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/AddonsManager.java @@ -34,13 +34,13 @@ public final class AddonsManager { private static final String LOCALE_FOLDER = "locales"; private List addons; private List loader; - private final Map> classes = new HashMap>(); + private final Map> classes = new HashMap<>(); private BSkyBlock plugin; public AddonsManager(BSkyBlock plugin) { this.plugin = plugin; - this.addons = new ArrayList<>(); - this.loader = new ArrayList<>(); + addons = new ArrayList<>(); + loader = new ArrayList<>(); } /** @@ -53,7 +53,7 @@ public final class AddonsManager { for (File file : f.listFiles()) { if (!file.isDirectory()) { try { - this.loadAddon(file); + loadAddon(file); } catch (InvalidAddonFormatException | InvalidAddonInheritException | InvalidDescriptionException e) { plugin.getLogger().severe("Could not load addon " + file.getName() + " : " + e.getMessage()); } @@ -68,7 +68,7 @@ public final class AddonsManager { } } - this.addons.forEach(addon -> { + addons.forEach(addon -> { addon.onEnable(); Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.ENABLE).build()); addon.setEnabled(true); @@ -83,10 +83,14 @@ public final class AddonsManager { * @return */ public Optional getAddonByName(String name){ - if(name.equals("")) return Optional.empty(); + if(name.equals("")) { + return Optional.empty(); + } - for(Addon addon : this.addons){ - if(addon.getDescription().getName().contains(name)) return Optional.of(addon); + for(Addon addon : addons){ + if(addon.getDescription().getName().contains(name)) { + return Optional.of(addon); + } } return Optional.empty(); } @@ -109,7 +113,7 @@ public final class AddonsManager { // Open a reader to the jar BufferedReader reader = new BufferedReader(new InputStreamReader(jar.getInputStream(entry))); // Grab the description in the addon.yml file - Map data = this.data(reader); + Map data = data(reader); // Load the addon AddonClassLoader loader = new AddonClassLoader(this, data, f, this.getClass().getClassLoader()); @@ -133,7 +137,7 @@ public final class AddonsManager { Bukkit.getPluginManager().callEvent(AddonEvent.builder().addon(addon).reason(AddonEvent.Reason.LOAD).build()); // Add it to the list of addons - this.addons.add(addon); + addons.add(addon); // Run the onLoad() method addon.onLoad(); @@ -153,8 +157,9 @@ public final class AddonsManager { private Map data(BufferedReader reader) { Map map = new HashMap<>(); reader.lines().forEach(string -> { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: " + string); + } String[] data = string.split("\\: "); if (data.length > 1) { map.put(data[0], data[1].substring(0, data[1].length())); @@ -223,7 +228,7 @@ public final class AddonsManager { /** * Sets a class that this loader should know about * Code copied from Bukkit JavaPluginLoader - * + * * @param name * @param clazz */ diff --git a/src/main/java/us/tastybento/bskyblock/managers/CommandsManager.java b/src/main/java/us/tastybento/bskyblock/managers/CommandsManager.java index 546264e11..4c5e45fa8 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/CommandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/CommandsManager.java @@ -13,9 +13,10 @@ public final class CommandsManager { private HashMap commands = new HashMap<>(); public void registerCommand(Command command) { - if (DEBUG) + if (DEBUG) { Bukkit.getLogger().info("DEBUG: registering command - " + command.getLabel()); - commands.put(command.getLabel(), command); + } + commands.put(command.getLabel(), command); // Use reflection to obtain the commandMap method in Bukkit's server. It used to be visible, but isn't anymore. try{ Field commandMapField = Bukkit.getServer().getClass().getDeclaredField("commandMap"); @@ -25,7 +26,7 @@ public final class CommandsManager { } catch(Exception exception){ Bukkit.getLogger().severe("Bukkit server commandMap method is not there! This means no commands can be registered!"); - } + } } public Command getCommand(String command) { diff --git a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java index 71984d2e9..972b27df8 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/FlagsManager.java @@ -66,7 +66,9 @@ public class FlagsManager { public Flag getFlagByIcon(PanelItem item) { for (Flag flag : flags.values()) { - if (flag.getIcon().equals(item)) return flag; + if (flag.getIcon().equals(item)) { + return flag; + } } return null; } diff --git a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java index 9d14ece75..65788007b 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java @@ -24,7 +24,7 @@ public final class LocalesManager { public LocalesManager(BSkyBlock plugin) { this.plugin = plugin; - this.loadLocales("BSkyBlock"); // Default + loadLocales("BSkyBlock"); // Default } /** @@ -35,8 +35,9 @@ public final class LocalesManager { */ public String get(User user, String reference) { BSBLocale locale = languages.get(user.getLocale()); - if (locale != null && locale.contains(reference)) + if (locale != null && locale.contains(reference)) { return locale.get(reference); + } // Return the default if (languages.get(Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage())).contains(reference)) { return languages.get(Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage())).get(reference); @@ -54,23 +55,22 @@ public final class LocalesManager { plugin.getLogger().info("DEBUG: loading locale for " + parent); } // Describe the filter - we only want files that are correctly named - FilenameFilter ymlFilter = new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - // Files must be 9 chars long - if (name.toLowerCase().endsWith(".yml") && name.length() == 9) { - if (DEBUG) - plugin.getLogger().info("DEBUG: bsb locale filename = " + name); - return true; - } - return false; + FilenameFilter ymlFilter = (dir, name) -> { + // Files must be 9 chars long + if (name.toLowerCase().endsWith(".yml") && name.length() == 9) { + if (DEBUG) { + plugin.getLogger().info("DEBUG: bsb locale filename = " + name); + } + return true; } + return false; }; // Run through the files and store the locales File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + parent); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: localeDir = " + localeDir.getAbsolutePath()); + } // If the folder does not exist, then make it and fill with the locale files from the jar // If it does exist, then new files will NOT be written! if (!localeDir.exists()) { @@ -83,8 +83,9 @@ public final class LocalesManager { // Get the last part of the name int lastIndex = name.lastIndexOf('/'); File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length())); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath()); + } if (!targetFile.exists()) { java.nio.file.Files.copy(initialStream, targetFile.toPath()); } @@ -101,19 +102,23 @@ public final class LocalesManager { // Store all the locales available for (File language : localeDir.listFiles(ymlFilter)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: parent = " + parent + " language = " + language.getName().substring(0, language.getName().length() - 4)); + } Locale localeObject = Locale.forLanguageTag(language.getName().substring(0, language.getName().length() - 4)); - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: locale country found = " + localeObject.getCountry()); + } if (languages.containsKey(localeObject)) { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: this locale is known"); + } // Merge into current language languages.get(localeObject).merge(language); } else { - if (DEBUG) + if (DEBUG) { plugin.getLogger().info("DEBUG: this locale is not known - new language"); + } // New language languages.put(localeObject, new BSBLocale(localeObject, language)); } diff --git a/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java index 3c2aba087..5cc395148 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/RanksManager.java @@ -49,7 +49,7 @@ public class RanksManager { plugin.getLogger().severe("Error loading custom rank: " + en.getKey() + " " + en.getValue() + " skipping..."); } } - } + } /** * Try to add a new rank. Owner, member, visitor and banned ranks cannot be changed. @@ -67,12 +67,12 @@ public class RanksManager { ranks.put(reference, value); // Sort ranks = ranks.entrySet().stream() - .sorted(Map.Entry.comparingByValue()) - .collect(Collectors.toMap( - Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + .sorted(Map.Entry.comparingByValue()) + .collect(Collectors.toMap( + Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); return true; } - + /** * Try to remove a rank. Owner, member, visitor and banned ranks cannot be removed. * @param reference @@ -85,10 +85,10 @@ public class RanksManager { || reference.equalsIgnoreCase(BANNED_RANK_REF)) { return false; } - + return ranks.remove(reference) == null ? false : true; } - + /** * Get the rank value for this reference * @param reference - locale reference to the name of this rank @@ -97,7 +97,7 @@ public class RanksManager { public int getRankValue(String reference) { return ranks.getOrDefault(reference, VISITOR_RANK); } - + /** * Get the ranks. Ranks are listed in ascending order * @return immutable map of ranks diff --git a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java index 6eb7f0580..77dc3de73 100644 --- a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java +++ b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java @@ -27,11 +27,13 @@ public class DeleteIslandChunks { //plugin.getLogger().info("DEBUG: deleting the island"); // Fire event IslandBaseEvent event = IslandEvent.builder().island(island).reason(Reason.DELETE).build(); - if (event.isCancelled()) + if (event.isCancelled()) { return; + } final World world = island.getCenter().getWorld(); - if (world == null) + if (world == null) { return; + } int minXChunk = island.getMinX() / 16; int maxXChunk = (island.getRange() * 2 + island.getMinX() - 1) /16; int minZChunk = island.getMinZ() / 16; diff --git a/src/main/java/us/tastybento/bskyblock/util/FileLister.java b/src/main/java/us/tastybento/bskyblock/util/FileLister.java index 790ff2d7d..de04ed0ce 100755 --- a/src/main/java/us/tastybento/bskyblock/util/FileLister.java +++ b/src/main/java/us/tastybento/bskyblock/util/FileLister.java @@ -22,7 +22,7 @@ public class FileLister{ private Plugin plugin; public FileLister(Plugin level){ - this.plugin = level; + plugin = level; } /** @@ -52,7 +52,7 @@ public class FileLister{ Method method = JavaPlugin.class.getDeclaredMethod("getFile"); method.setAccessible(true); - jarfile = (File) method.invoke(this.plugin); + jarfile = (File) method.invoke(plugin); } catch (Exception e) { throw new IOException(e); } @@ -97,7 +97,7 @@ public class FileLister{ Method method = JavaPlugin.class.getDeclaredMethod("getFile"); method.setAccessible(true); - jarfile = (File) method.invoke(this.plugin); + jarfile = (File) method.invoke(plugin); } catch (Exception e) { throw new IOException(e); } diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index a745d7ece..dd4d536ab 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -17,7 +17,7 @@ import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.database.objects.Island; /** - * A class that calculates finds a safe spot asynchronously and then teleports the player there. + * A class that calculates finds a safe spot asynchronously and then teleports the player there. * @author tastybento * */ @@ -56,7 +56,7 @@ public class SafeSpotTeleport { } /** * Teleport to a safe spot on an island - * + * * TODO: REFACTOR THIS! * @param plugin @@ -71,7 +71,7 @@ public class SafeSpotTeleport { if (island != null) { final World world = islandLoc.getWorld(); // Get the chunks - List chunkSnapshot = new ArrayList(); + List chunkSnapshot = new ArrayList<>(); // Add the center chunk chunkSnapshot.add(island.getCenter().toVector().toLocation(world).getChunk().getChunkSnapshot()); // Add immediately adjacent chunks diff --git a/src/main/java/us/tastybento/bskyblock/util/Util.java b/src/main/java/us/tastybento/bskyblock/util/Util.java index 9783cca77..80b048cbe 100755 --- a/src/main/java/us/tastybento/bskyblock/util/Util.java +++ b/src/main/java/us/tastybento/bskyblock/util/Util.java @@ -110,11 +110,11 @@ public class Util { // In this way, we can deduce what type needs to be written at runtime. Type[] genericParameterTypes = writeMethod.getGenericParameterTypes(); // There could be more than one argument, so step through them - for (int i = 0; i < genericParameterTypes.length; i++) { + for (Type genericParameterType : genericParameterTypes) { // If the argument is a parameter, then do something - this should always be true if the parameter is a collection - if( genericParameterTypes[i] instanceof ParameterizedType ) { - // Get the actual type arguments of the parameter - Type[] parameters = ((ParameterizedType)genericParameterTypes[i]).getActualTypeArguments(); + if( genericParameterType instanceof ParameterizedType ) { + // Get the actual type arguments of the parameter + Type[] parameters = ((ParameterizedType)genericParameterType).getActualTypeArguments(); result.addAll(Arrays.asList(parameters)); } } @@ -128,17 +128,20 @@ public class Util { */ @SuppressWarnings("deprecation") public static List getPlayerInHandItems(Player player) { - List result = new ArrayList(2); + List result = new ArrayList<>(2); if (plugin.getServer().getVersion().contains("(MC: 1.7") || plugin.getServer().getVersion().contains("(MC: 1.8")) { - if (player.getItemInHand() != null) + if (player.getItemInHand() != null) { result.add(player.getItemInHand()); + } return result; } - if (player.getInventory().getItemInMainHand() != null) + if (player.getInventory().getItemInMainHand() != null) { result.add(player.getInventory().getItemInMainHand()); - if (player.getInventory().getItemInOffHand() != null) + } + if (player.getInventory().getItemInOffHand() != null) { result.add(player.getInventory().getItemInOffHand()); + } return result; } @@ -152,8 +155,9 @@ public class Util { * Credits to mikenon on GitHub! */ public static String prettifyText(String ugly) { - if (!ugly.contains("_") && (!ugly.equals(ugly.toUpperCase()))) + if (!ugly.contains("_") && (!ugly.equals(ugly.toUpperCase()))) { return ugly; + } String fin = ""; ugly = ugly.toLowerCase(); if (ugly.contains("_")) { @@ -162,8 +166,9 @@ public class Util { for (String s : splt) { i += 1; fin += Character.toUpperCase(s.charAt(0)) + s.substring(1); - if (i < splt.length) + if (i < splt.length) { fin += " "; + } } } else { fin += Character.toUpperCase(ugly.charAt(0)) + ugly.substring(1); @@ -251,8 +256,8 @@ public class Util { } /** - * Returns all of the items that begin with the given start, - * ignoring case. Intended for tabcompletion. + * Returns all of the items that begin with the given start, + * ignoring case. Intended for tabcompletion. * * @param list * @param start @@ -261,8 +266,9 @@ public class Util { public static List tabLimit(final List list, final String start) { final List returned = new ArrayList<>(); for (String s : list) { - if (s == null) + if (s == null) { continue; + } if (s.toLowerCase().startsWith(start.toLowerCase())) { returned.add(s); } @@ -273,7 +279,7 @@ public class Util { /** * Loads a YAML file and if it does not exist it is looked for in the JAR - * + * * @param file * @return */ @@ -312,12 +318,7 @@ public class Util { } public static void runCommand(final Player player, final String string) { - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - player.performCommand(string); - }}); + plugin.getServer().getScheduler().runTask(plugin, () -> player.performCommand(string)); } diff --git a/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java index 1f15f0c52..faa9e4518 100644 --- a/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java +++ b/src/main/java/us/tastybento/bskyblock/util/YmlCommentParser.java @@ -160,7 +160,7 @@ public class YmlCommentParser { if (comment != null) { sb.append((lineNum > 1 ? "\n" : "") + comment .replaceAll("^#", Matcher.quoteReplacement(indent + "#")) - .replaceAll("\n#", Matcher.quoteReplacement("\n" + indent + "#"))); + .replaceAll("\n#", Matcher.quoteReplacement("\n" + indent + "#"))); } if (value != null && !value.trim().isEmpty()) { // Scalar with value @@ -197,7 +197,7 @@ public class YmlCommentParser { private Section(String name, int indentation) { this.indentation = indentation; - this.path = name; + path = name; } public int getIndentation() { diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java index 332f069c1..96dab7161 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java @@ -10,7 +10,7 @@ import us.tastybento.bskyblock.BSkyBlock; /** * Handles hooks with other Placeholder APIs. - * + * * @author Poslovitch, Tastybento */ public class PlaceholderHandler { @@ -82,7 +82,9 @@ public class PlaceholderHandler { * @return updated message */ public static String replacePlaceholders(CommandSender receiver, String message){ - if(message == null || message.isEmpty()) return ""; + if(message == null || message.isEmpty()) { + return ""; + } for(PlaceholderInterface api : apis){ message = api.replacePlaceholders(receiver, message); diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java index 59c8a7c74..a3911b814 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java @@ -6,30 +6,30 @@ import us.tastybento.bskyblock.BSkyBlock; /** * Simple interface for every Placeholder API. - * + * * @author Poslovitch */ public interface PlaceholderInterface { - + /** * Get the name of the Placeholder API * @return name of the placeholder plugin */ String getName(); - + /** * Register the placeholder API * @param plugin * @return true if registered */ boolean register(BSkyBlock plugin); - + /** * Unregister the placeholder API * @param plugin */ void unregister(BSkyBlock plugin); - + /** * Replace placeholders in the message according to the receiver * @param sender diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java index 37d3c08ed..8e3ab2d37 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java @@ -9,11 +9,11 @@ import us.tastybento.bskyblock.BSkyBlock; /** * Register placeholders - * + * * @author Poslovitch */ public class Placeholders { - private static Set placeholders = new HashSet(); + private static Set placeholders = new HashSet<>(); private BSkyBlock plugin; diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java index 7d6069061..4bb25e04f 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java @@ -11,7 +11,7 @@ import us.tastybento.bskyblock.util.placeholders.Placeholders.Placeholder; /** * Built-in placeholder API - * + * * @author Poslovitch */ public class InternalPlaceholderImpl implements PlaceholderInterface{ @@ -33,7 +33,9 @@ public class InternalPlaceholderImpl implements PlaceholderInterface{ @Override public String replacePlaceholders(CommandSender receiver, String message) { - if(message == null || message.isEmpty()) return ""; + if(message == null || message.isEmpty()) { + return ""; + } for(Placeholder placeholder : Placeholders.getPlaceholders()){ String identifier = "{" + placeholder.getIdentifier() + "}"; diff --git a/src/test/java/bskyblock/TestBSkyBlock.java b/src/test/java/bskyblock/TestBSkyBlock.java index 826850731..2ac5f1784 100644 --- a/src/test/java/bskyblock/TestBSkyBlock.java +++ b/src/test/java/bskyblock/TestBSkyBlock.java @@ -38,6 +38,7 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Matchers; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -98,14 +99,14 @@ public class TestBSkyBlock { Mockito.when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); PluginManager pluginManager = mock(PluginManager.class); Mockito.when(server.getPluginManager()).thenReturn(pluginManager); - + sender = mock(CommandSender.class); player = mock(Player.class); ownerOfIsland = mock(Player.class); visitorToIsland = mock(Player.class); Mockito.when(player.hasPermission(Constants.PERMPREFIX + "default.permission")).thenReturn(true); - + //Mockito.when(plugin.getServer()).thenReturn(server); location = mock(Location.class); @@ -113,40 +114,40 @@ public class TestBSkyBlock { Mockito.when(location.getBlockX()).thenReturn(0); Mockito.when(location.getBlockY()).thenReturn(0); Mockito.when(location.getBlockZ()).thenReturn(0); - + Mockito.when(player.getLocation()).thenReturn(location); Mockito.when(ownerOfIsland.getLocation()).thenReturn(location); Mockito.when(visitorToIsland.getLocation()).thenReturn(location); - + Mockito.when(player.getUniqueId()).thenReturn(MEMBER_UUID); Mockito.when(ownerOfIsland.getUniqueId()).thenReturn(OWNER_UUID); Mockito.when(visitorToIsland.getUniqueId()).thenReturn(VISITOR_UUID); - // Mock itemFactory for ItemStack + // Mock itemFactory for ItemStack ItemFactory itemFactory = PowerMockito.mock(ItemFactory.class); PowerMockito.when(Bukkit.getItemFactory()).thenReturn(itemFactory); ItemMeta itemMeta = PowerMockito.mock(ItemMeta.class); - PowerMockito.when(itemFactory.getItemMeta(Mockito.any())).thenReturn(itemMeta); - + PowerMockito.when(itemFactory.getItemMeta(Matchers.any())).thenReturn(itemMeta); + PowerMockito.mockStatic(Flags.class); - + plugin = Mockito.mock(BSkyBlock.class); flagsManager = new FlagsManager(plugin); Mockito.when(plugin.getFlagsManager()).thenReturn(flagsManager); - + block = Mockito.mock(Block.class); - + // Worlds IslandWorld iwm = mock(IslandWorld.class); Mockito.when(plugin.getIslandWorldManager()).thenReturn(iwm); Mockito.when(iwm.getIslandWorld()).thenReturn(world); Mockito.when(iwm.getNetherWorld()).thenReturn(world); Mockito.when(iwm.getEndWorld()).thenReturn(world); - + // User //User user = Mockito.mock(User.class); //Mockito.when(user.getName()).thenReturn("tastybento"); - + // Islands IslandsManager im = mock(IslandsManager.class); Mockito.when(plugin.getIslands()).thenReturn(im); @@ -162,12 +163,12 @@ public class TestBSkyBlock { Bukkit.getLogger().info("SETUP: owner UUID = " + OWNER_UUID); Bukkit.getLogger().info("SETUP: member UUID = " + MEMBER_UUID); Bukkit.getLogger().info("SETUP: visitor UUID = " + VISITOR_UUID); - Mockito.when(im.getIslandAt(Mockito.any())).thenReturn(Optional.of(island)); + Mockito.when(im.getIslandAt(Matchers.any())).thenReturn(Optional.of(island)); Settings settings = mock(Settings.class); Mockito.when(plugin.getSettings()).thenReturn(settings); Mockito.when(settings.getFakePlayers()).thenReturn(new HashSet()); - + } @Test @@ -181,7 +182,7 @@ public class TestBSkyBlock { .build(); assertEquals(playerUUID, event.getPlayerUUID()); } - + @Test public void testCommandAPI() { // Test command @@ -203,7 +204,7 @@ public class TestBSkyBlock { // Check aliases for (String alias : command.getValue().getAliases()) { assertEquals(testCommand.getSubCommand(alias), Optional.of(command.getValue())); - } + } } String[] args = {""}; assertEquals(Arrays.asList("sub1","sub2", "help"), testCommand.tabComplete(player, "test", args)); @@ -224,23 +225,23 @@ public class TestBSkyBlock { assertEquals(Arrays.asList(new String[] {"Florian", "Ben", "Bill", "Ted", "help"}), testCommand.tabComplete(player, "test", new String[] {"sub2", "subsub", "subsubsub", ""})); // Test for partial word - assertEquals(Arrays.asList(new String[] {"Ben", "Bill"}), + assertEquals(Arrays.asList(new String[] {"Ben", "Bill"}), testCommand.tabComplete(player, "test", new String[] {"sub2", "subsub", "subsubsub", "b"})); // Test command arguments CompositeCommand argCmd = new Test3ArgsCommand(); argCmd.setOnlyPlayer(true); argCmd.setPermission(Constants.PERMPREFIX + "default.permission"); - assertTrue(argCmd.execute(player, "args", new String[]{"give", "100", "ben"})); + assertTrue(argCmd.execute(player, "args", new String[]{"give", "100", "ben"})); assertFalse(testCommand.execute(player, "test", new String[] {"sub2", "subsub", "subsubsub"})); assertFalse(testCommand.execute(player, "test", new String[] {"sub2", "subsub", "subsubsub", "ben"})); assertFalse(testCommand.execute(player, "test", new String[] {"sub2", "subsub", "subsubsub", "ben", "100"})); assertTrue(testCommand.execute(player, "test", new String[] {"sub2", "subsub", "subsubsub", "ben", "100", "today"})); - + // Usage tests assertEquals("/test", testCommand.getUsage()); assertEquals("test.params", testCommand.getParameters()); - + // Test help //assertTrue(testCommand.execute(player, "test", new String[] {"help"})); } @@ -249,7 +250,7 @@ public class TestBSkyBlock { public TestCommand() { super(plugin, "test", "t", "tt"); - this.setParameters("test.params"); + setParameters("test.params"); } @Override @@ -271,10 +272,10 @@ public class TestBSkyBlock { public TestSubCommand(CompositeCommand parent) { super(parent, "sub1", "subone"); } - + @Override public void setup() { - this.setParameters("sub.params"); + setParameters("sub.params"); } @Override @@ -328,14 +329,16 @@ public class TestBSkyBlock { public TestSubSubSubCommand(CompositeCommand parent) { super(parent, "subsubsub", "level3", "subsubsubby"); } - + @Override public void setup() {} @Override public boolean execute(User user, List args) { Bukkit.getLogger().info("args are " + args.toString()); - if (args.size() == 3) return true; + if (args.size() == 3) { + return true; + } return false; } @@ -347,13 +350,13 @@ public class TestBSkyBlock { return Optional.of(Util.tabLimit(options, lastArg)); } } - + private class Test3ArgsCommand extends CompositeCommand { public Test3ArgsCommand() { super(plugin, "args", ""); } - + @Override public void setup() {} @@ -363,8 +366,8 @@ public class TestBSkyBlock { return args.size() == 3 ? true : false; } - } - + } + // Protection tests @Test public void TestProtection() { @@ -373,29 +376,29 @@ public class TestBSkyBlock { island.setOwner(playerUUID); island.setCenter(location); island.setProtectionRange(100); - + assertNotNull(island); - + User visitor = User.getInstance(UUID.randomUUID()); assertEquals(RanksManager.OWNER_RANK, island.getRank(owner)); assertEquals(RanksManager.VISITOR_RANK, 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 members = island.getMemberSet(); assertTrue(members.contains(playerUUID)); assertTrue(members.contains(member1)); assertTrue(members.contains(member2)); assertTrue(members.contains(member3)); - + // Remove members island.removeMember(member3); members = island.getMemberSet(); @@ -403,7 +406,7 @@ public class TestBSkyBlock { assertTrue(members.contains(member1)); assertTrue(members.contains(member2)); assertFalse(members.contains(member3)); - + // Ban member island.addToBanList(member1); members = island.getMemberSet(); @@ -411,16 +414,16 @@ public class TestBSkyBlock { assertFalse(members.contains(member1)); assertTrue(members.contains(member2)); assertFalse(members.contains(member3)); - + Set banned = island.getBanned(); assertTrue(banned.contains(member1)); - + // Unban island.removeFromBanList(member1); assertFalse(island.getBanned().contains(member1)); - + // Protection - + // Check default settings // Owner should be able to do anything assertTrue(island.isAllowed(owner, Flags.PLACE_BLOCKS)); @@ -429,11 +432,11 @@ public class TestBSkyBlock { // Visitor can do nothing assertFalse(island.isAllowed(visitor, Flags.PLACE_BLOCKS)); assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); - - // Set up protection settings - members can break blocks, visitors and place blocks + + // Set up protection settings - members can break blocks, visitors and place blocks island.setFlag(Flags.BREAK_BLOCKS, RanksManager.MEMBER_RANK); assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); - + island.setFlag(Flags.PLACE_BLOCKS, RanksManager.VISITOR_RANK); assertFalse(island.isAllowed(visitor, Flags.BREAK_BLOCKS)); @@ -463,16 +466,16 @@ public class TestBSkyBlock { assertFalse(island.isAllowed(mem3, Flags.PLACE_BLOCKS)); assertFalse(island.isAllowed(mem3, Flags.BREAK_BLOCKS)); } - + @Test public void TestEventProtection() { // Test events - + FlagListener fl = new FlagListener(plugin); Bukkit.getLogger().info("SETUP: owner UUID = " + ownerOfIsland.getUniqueId()); Bukkit.getLogger().info("SETUP: member UUID = " + player.getUniqueId()); Bukkit.getLogger().info("SETUP: visitor UUID = " + visitorToIsland.getUniqueId()); - + Bukkit.getLogger().info("DEBUG: checking events - vistor"); Event e3 = new BlockBreakEvent(block, visitorToIsland); Assert.assertFalse(fl.checkIsland(e3, location, Flags.BREAK_BLOCKS, true)); @@ -480,14 +483,14 @@ public class TestBSkyBlock { Bukkit.getLogger().info("DEBUG: checking events - owner"); Event e = new BlockBreakEvent(block, ownerOfIsland); Assert.assertTrue(fl.checkIsland(e, location, Flags.BREAK_BLOCKS, true)); - + Bukkit.getLogger().info("DEBUG: checking events - member"); Event e2 = new BlockBreakEvent(block, player); Assert.assertTrue(fl.checkIsland(e2, location, Flags.BREAK_BLOCKS, true)); - + } - + @Test public void TestDefaultFlags() { // Check all the default flags @@ -501,7 +504,7 @@ public class TestBSkyBlock { assertTrue(flag.getID(), defaultFlags.contains(flag)); } } - + @Test public void TestCustomFlags() { // Custom @@ -510,12 +513,12 @@ public class TestBSkyBlock { assertEquals("CUSTOM_FLAG", customFlag.getID()); assertEquals(Material.DIAMOND, customFlag.getIcon().getItem().getType()); assertEquals(fl, customFlag.getListener().get()); - // Add it to the Flag Manager + // Add it to the Flag Manager flagsManager.registerFlag(customFlag); assertEquals(customFlag, flagsManager.getFlagByID("CUSTOM_FLAG")); assertEquals(customFlag, flagsManager.getFlagByIcon(customFlag.getIcon())); } - + /** * Dummy flag listener * From 80f0a78f08922520474ba11d46010eb0dea57840 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 8 Feb 2018 20:12:23 -0800 Subject: [PATCH 80/97] Removed stack trace as exception already logged. --- .../bskyblock/util/placeholders/PlaceholderHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java index 96dab7161..e20e6e91e 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java @@ -56,7 +56,6 @@ public class PlaceholderHandler { } } catch (Exception e){ plugin.getLogger().info("Failed to hook placeholders into " + hook); - e.printStackTrace(); } } } From f3d7bf2af395dfa2f3c33df8bc8d824dccf945b8 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 8 Feb 2018 21:17:16 -0800 Subject: [PATCH 81/97] Refactored code to make it better to maintain and read. --- .../api/addons/AddonClassLoader.java | 35 +- .../api/commands/CompositeCommand.java | 8 +- .../bskyblock/api/commands/User.java | 6 +- .../api/configuration/ISettings.java | 6 +- .../database/mysql/MySQLDatabaseHandler.java | 583 +++++++++--------- 5 files changed, 306 insertions(+), 332 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java index 1c8bbc247..8dd14c6bf 100644 --- a/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java +++ b/src/main/java/us/tastybento/bskyblock/api/addons/AddonClassLoader.java @@ -7,6 +7,7 @@ import java.net.URLClassLoader; import java.util.HashMap; import java.util.Map; +import org.bukkit.Bukkit; import org.bukkit.plugin.InvalidDescriptionException; import us.tastybento.bskyblock.BSkyBlock; @@ -81,34 +82,34 @@ public class AddonClassLoader extends URLClassLoader { /** * This is a custom findClass that enables classes in other addons to be found - * (This code was copied from Bukkit's PluginLoader class * @param name * @param checkGlobal * @return Class - * @throws ClassNotFoundException */ public Class findClass(String name, boolean checkGlobal) throws ClassNotFoundException { if (name.startsWith("us.tastybento.")) { throw new ClassNotFoundException(name); } - Class result = classes.get(name); + return classes.computeIfAbsent(name, k -> createFor(k, checkGlobal)); + } - if (result == null) { - if (checkGlobal) { - result = loader.getClassByName(name); - } - - if (result == null) { - result = super.findClass(name); - - if (result != null) { - loader.setClass(name, result); - } - } - - classes.put(name, result); + private Class createFor(String name, boolean checkGlobal) { + Class result = null; + if (checkGlobal) { + result = loader.getClassByName(name); } + if (result == null) { + try { + result = super.findClass(name); + } catch (ClassNotFoundException e) { + Bukkit.getLogger().severe("Could not find class! " + e.getMessage()); + } + + if (result != null) { + loader.setClass(name, result); + } + } return result; } diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java index 8ea9f4cd8..23bb24008 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/CompositeCommand.java @@ -400,11 +400,11 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi @Override public Command setUsage(String usage) { // Go up the chain - CompositeCommand parent = getParent(); + CompositeCommand parentCommand = getParent(); this.usage = getLabel() + " " + usage; - while (parent != null) { - this.usage = parent.getLabel() + " " + this.usage; - parent = parent.getParent(); + while (parentCommand != null) { + this.usage = parentCommand.getLabel() + " " + this.usage; + parentCommand = parentCommand.getParent(); } this.usage = this.usage.trim(); return this; diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/User.java b/src/main/java/us/tastybento/bskyblock/api/commands/User.java index ac072b57e..6f3e256c3 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/User.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/User.java @@ -253,10 +253,8 @@ public class User { * @return Locale */ public Locale getLocale() { - if (sender instanceof Player) { - if (!plugin.getPlayers().getLocale(playerUUID).isEmpty()) { - return Locale.forLanguageTag(plugin.getPlayers().getLocale(playerUUID)); - } + if (sender instanceof Player && !plugin.getPlayers().getLocale(playerUUID).isEmpty()) { + return Locale.forLanguageTag(plugin.getPlayers().getLocale(playerUUID)); } return Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage()); diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index d8970e58e..18b34ad25 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -21,7 +21,7 @@ public interface ISettings { // ----------------Saver------------------- @SuppressWarnings("unchecked") - default void saveSettings() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { + default void saveSettings() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { // Get the handler AbstractDatabaseHandler settingsHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); // Load every field in the config class @@ -30,7 +30,7 @@ public interface ISettings { settingsHandler.saveSettings(getInstance()); } - default void saveBackup() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { + default void saveBackup() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException { // Save backup @SuppressWarnings("unchecked") AbstractDatabaseHandler backupHandler = (AbstractDatabaseHandler) new FlatFileDatabase().getHandler(getInstance().getClass()); @@ -39,7 +39,7 @@ public interface ISettings { // --------------- Loader ------------------ @SuppressWarnings("unchecked") - default T loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException { + default T loadSettings() throws InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, IntrospectionException, SQLException { // See if this settings object already exists in the database AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(getClass()); T dbConfig = null; diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index c08ec4d54..6233ce4e0 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -32,7 +32,6 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.plugin.Plugin; -import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.database.objects.adapters.Adapter; @@ -124,74 +123,78 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { * @throws SQLException */ private void createSchema() throws IntrospectionException, SQLException { - PreparedStatement pstmt = null; - try { - String sql = "CREATE TABLE IF NOT EXISTS `" + dataObject.getCanonicalName() + "` ("; - // Run through the fields of the class using introspection - for (Field field : dataObject.getDeclaredFields()) { - // Get the description of the field - PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); - //plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); - // Get default SQL mappings - // Get the write method for this field. This method will take an argument of the type of this field. - Method writeMethod = propertyDescriptor.getWriteMethod(); - // The SQL column name is the name of the field - String columnName = field.getName(); - // Get the mapping for this field from the hashmap - String typeName = propertyDescriptor.getPropertyType().getTypeName(); - if (propertyDescriptor.getPropertyType().isEnum()) { - typeName = "Enum"; - } - String mapping = mySQLmapping.get(typeName); - // If it exists, then create the SQL - if (mapping != null) { - // Note that the column name must be enclosed in `'s because it may include reserved words. - sql += "`" + columnName + "` " + mapping + ","; - // Create set and map tables if the type is a collection - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - // The ID in this table relates to the parent table and is unique - String setSql = "CREATE TABLE IF NOT EXISTS `" + dataObject.getCanonicalName() + "." + field.getName() + "` (" - + "uniqueId VARCHAR(36) NOT NULL, "; - // Get columns separated by commas - setSql += getCollectionColumnString(writeMethod,false,true); - // Close the SQL string - setSql += ")"; - - //plugin.getLogger().info(setSql); - // Execute the statement - try (PreparedStatement collections = connection.prepareStatement(setSql)) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); - } - collections.executeUpdate(); - } - } - } else { - // The Java type is not in the hashmap, so we'll just guess that it can be stored in a string - // This should NOT be used in general because every type should be in the hashmap - sql += field.getName() + " VARCHAR(254),"; - plugin.getLogger().severe("Unknown type! Hoping it'll fit in a string!"); - plugin.getLogger().severe(propertyDescriptor.getPropertyType().getTypeName()); - } + StringBuilder sql = new StringBuilder(); + sql.append("CREATE TABLE IF NOT EXISTS `"); + sql.append(dataObject.getCanonicalName()); + sql.append("` ("); + // Run through the fields of the class using introspection + for (Field field : dataObject.getDeclaredFields()) { + // Get the description of the field + PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); + //plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); + // Get default SQL mappings + // Get the write method for this field. This method will take an argument of the type of this field. + Method writeMethod = propertyDescriptor.getWriteMethod(); + // The SQL column name is the name of the field + String columnName = field.getName(); + // Get the mapping for this field from the hashmap + String typeName = propertyDescriptor.getPropertyType().getTypeName(); + if (propertyDescriptor.getPropertyType().isEnum()) { + typeName = "Enum"; } - //plugin.getLogger().info("DEBUG: SQL before trim string = " + sql); - // For the main table for the class, the unique ID is the primary key - sql += " PRIMARY KEY (uniqueId))"; - //plugin.getLogger().info("DEBUG: SQL string = " + sql); - // Prepare and execute the database statements - pstmt = connection.prepareStatement(sql); + String mapping = mySQLmapping.get(typeName); + // If it exists, then create the SQL + if (mapping != null) { + // Note that the column name must be enclosed in `'s because it may include reserved words. + sql.append("`"); + sql.append(columnName); + sql.append("` "); + sql.append(mapping); + sql.append(","); + // Create set and map tables if the type is a collection + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + // The ID in this table relates to the parent table and is unique + StringBuilder setSql = new StringBuilder(); + setSql.append("CREATE TABLE IF NOT EXISTS `"); + setSql.append(dataObject.getCanonicalName()); + setSql.append("."); + setSql.append(field.getName()); + setSql.append("` ("); + setSql.append("uniqueId VARCHAR(36) NOT NULL, "); + // Get columns separated by commas + setSql.append(getCollectionColumnString(writeMethod,false,true)); + // Close the SQL string + setSql.append(")"); + // Execute the statement + try (PreparedStatement collections = connection.prepareStatement(setSql.toString())) { + if (DEBUG) { + plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); + } + collections.executeUpdate(); + } + } + } else { + // The Java type is not in the hashmap, so we'll just guess that it can be stored in a string + // This should NOT be used in general because every type should be in the hashmap + sql.append(field.getName()); + sql.append(" VARCHAR(254),"); + plugin.getLogger().severe("Unknown type! Hoping it'll fit in a string!"); + plugin.getLogger().severe(propertyDescriptor.getPropertyType().getTypeName()); + } + } + //plugin.getLogger().info("DEBUG: SQL before trim string = " + sql); + // For the main table for the class, the unique ID is the primary key + sql.append(" PRIMARY KEY (uniqueId))"); + //plugin.getLogger().info("DEBUG: SQL string = " + sql); + // Prepare and execute the database statements + try (PreparedStatement pstmt = connection.prepareStatement(sql.toString())) { if (DEBUG) { plugin.getLogger().info("DEBUG: pstmt = " + pstmt.toString()); } pstmt.executeUpdate(); - } catch (Exception e) { - plugin.getLogger().severe("Could not create database schema! " + e.getMessage()); - } finally { - // Close the database properly - MySQLDatabaseResourceCloser.close(pstmt); } } @@ -271,11 +274,13 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { private List getCollentionColumnList(Method method, boolean createSchema) { List columns = new ArrayList<>(); for (Entry en : getCollectionColumnMap(method).entrySet()) { - String col = en.getKey(); + StringBuilder col = new StringBuilder(); + col.append(en.getKey()); if (createSchema) { - col += " " + en.getValue(); + col.append(" "); + col.append(en.getValue()); } - columns.add(col); + columns.add(col.toString()); if (DEBUG) { plugin.getLogger().info("DEBUG: collection columns = " + col); } @@ -307,6 +312,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { for (Type type : parameters) { // This is a request for column names. String setMapping = mySQLmapping.get(type.getTypeName()); + // This column name format is typeName_# where # is a number incremented from 0 columns.put("`" + type.getTypeName() + "_" + index + "`", setMapping != null ? setMapping : "VARCHAR(254)"); if (DEBUG) { plugin.getLogger().info("DEBUG: collection column = " + "`" + type.getTypeName() + "_" + index + "`" + setMapping); @@ -388,171 +394,169 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { - Connection connection = null; - PreparedStatement preparedStatement = null; if (DEBUG) { plugin.getLogger().info("DEBUG: saveObject "); } - try { - // Try to connect to the database - connection = databaseConnecter.createConnection(); + // Try to connect to the database + try (Connection connection = databaseConnecter.createConnection()) { // insertQuery is created in super from the createInsertQuery() method - preparedStatement = connection.prepareStatement(insertQuery); - // Get the uniqueId. As each class extends DataObject, it must have this method in it. - PropertyDescriptor propertyDescriptor = new PropertyDescriptor("uniqueId", dataObject); - Method getUniqueId = propertyDescriptor.getReadMethod(); - final String uniqueId = (String) getUniqueId.invoke(instance); - if (DEBUG) { - plugin.getLogger().info("DEBUG: Unique Id = " + uniqueId); - } - if (uniqueId.isEmpty()) { - throw new SQLException("uniqueId is blank"); - } - // Create the insertion - int i = 0; - if (DEBUG) { - plugin.getLogger().info("DEBUG: insert Query " + insertQuery); - } - // Run through the fields in the class using introspection - for (Field field : dataObject.getDeclaredFields()) { - // Get the field's property descriptor - propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); - // Get the read method for this field - Method method = propertyDescriptor.getReadMethod(); + try (PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) { + // Get the uniqueId. As each class extends DataObject, it must have this method in it. + PropertyDescriptor propertyDescriptor = new PropertyDescriptor("uniqueId", dataObject); + Method getUniqueId = propertyDescriptor.getReadMethod(); + final String uniqueId = (String) getUniqueId.invoke(instance); if (DEBUG) { - plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); + plugin.getLogger().info("DEBUG: Unique Id = " + uniqueId); } - //sql += "`" + field.getName() + "` " + mapping + ","; - // Invoke the read method to obtain the value from the class - this is the value we need to store in the database - Object value = method.invoke(instance); + if (uniqueId.isEmpty()) { + throw new SQLException("uniqueId is blank"); + } + // Create the insertion + int i = 0; if (DEBUG) { - plugin.getLogger().info("DEBUG: value = " + value); + plugin.getLogger().info("DEBUG: insert Query " + insertQuery); } - // Adapter - // Check if there is an annotation on the field - ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); - // If there is a config annotation then do something - if (configEntry != null) { + // Run through the fields in the class using introspection + for (Field field : dataObject.getDeclaredFields()) { + // Get the field's property descriptor + propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); + // Get the read method for this field + Method method = propertyDescriptor.getReadMethod(); if (DEBUG) { - plugin.getLogger().info("DEBUG: there is a configEntry"); + plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); } - } - Adapter adapterNotation = field.getAnnotation(Adapter.class); - if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + //sql += "`" + field.getName() + "` " + mapping + ","; + // Invoke the read method to obtain the value from the class - this is the value we need to store in the database + Object value = method.invoke(instance); if (DEBUG) { - plugin.getLogger().info("DEBUG: there is an adapter"); + plugin.getLogger().info("DEBUG: value = " + value); } - // A conversion adapter has been defined - value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value now after deserialization = " + value); - } - } - // Create set and map table inserts if this is a Collection - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - // Collection - // The table is cleared for this uniqueId every time the data is stored - String clearTableSql = "DELETE FROM `" + dataObject.getCanonicalName() + "." + field.getName() + "` WHERE uniqueId = ?"; - try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql)) { - collStatement.setString(1, uniqueId); - collStatement.execute(); + // Adapter Notation + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { if (DEBUG) { - plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); + plugin.getLogger().info("DEBUG: there is an adapter"); + } + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); + if (DEBUG) { + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); } } - // Insert into the table - String setSql = "INSERT INTO `" + dataObject.getCanonicalName() + "." + field.getName() + "` (uniqueId, "; - // Get the columns we are going to insert, just the names of them - setSql += getCollectionColumnString(propertyDescriptor.getWriteMethod(), false, false) + ") "; - // Get all the ?'s for the columns - setSql += "VALUES ('?'," + getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false) + ")"; - // Prepare the statement - try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { - // Set the uniqueId - collStatement.setString(1, uniqueId); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection insert =" + setSql); - } - // Do single dimension types (set and list) - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - //plugin.getLogger().info("DEBUG: set class for "); - // Loop through the set or list - // Note that we have no idea what type this is - Collection collection = (Collection)value; - Iterator it = collection.iterator(); - while (it.hasNext()) { - Object setValue = it.next(); - //if (setValue instanceof UUID) { - // Serialize everything - setValue = serialize(setValue, setValue.getClass()); - //} - // Set the value from ? to whatever it is - collStatement.setObject(2, setValue); - if (DEBUG) { - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - } - // Execute the SQL in the database - collStatement.execute(); - } - } else if (propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class)) { - // Loop through the map - Map collection = (Map)value; - Iterator it = collection.entrySet().iterator(); - while (it.hasNext()) { - Entry en = (Entry) it.next(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); - } - - // Get the key and serialize it - Object key = serialize(en.getKey(), en.getKey().getClass()); - if (DEBUG) { - plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); - } - // Get the value and serialize it - Object mapValue = serialize(en.getValue(), en.getValue().getClass()); - if (DEBUG) { - plugin.getLogger().info("DEBUG: mapValue = " + mapValue); - } - // Write the objects into prepared statement - collStatement.setObject(1, key); - collStatement.setObject(2, mapValue); - if (DEBUG) { - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - } - // Write to database - collStatement.execute(); + // Create set and map table inserts if this is a Collection + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + // Collection + // The table is cleared for this uniqueId every time the data is stored + StringBuilder clearTableSql = new StringBuilder(); + clearTableSql.append("DELETE FROM `"); + clearTableSql.append(dataObject.getCanonicalName()); + clearTableSql.append("."); + clearTableSql.append(field.getName()); + clearTableSql.append("` WHERE uniqueId = ?"); + try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql.toString())) { + collStatement.setString(1, uniqueId); + collStatement.execute(); + if (DEBUG) { + plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); } } - // Set value for the main insert. For collections, this is just a dummy value because the real values are in the - // additional table. - value = true; - } - } else { - // If the value is not a collection, it just needs to be serialized to go into the database. - value = serialize(value, propertyDescriptor.getPropertyType()); - } - // Set the value in the main prepared statement and increment the location - // Note that with prepared statements, they count from 1, not 0, so the ++ goes on the front of i. - preparedStatement.setObject(++i, value); - } - // Add the statements to a batch - preparedStatement.addBatch(); - // Execute - if (DEBUG) { - plugin.getLogger().info("DEBUG: prepared statement = " + preparedStatement.toString()); - } - preparedStatement.executeBatch(); + // Insert into the table + StringBuilder setSql = new StringBuilder(); + setSql.append("INSERT INTO `"); + setSql.append(dataObject.getCanonicalName()); + setSql.append("."); + setSql.append(field.getName()); + setSql.append("` (uniqueId, "); + // Get the columns we are going to insert, just the names of them + setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), false, false)); + setSql.append(") "); + // Get all the ?'s for the columns + setSql.append("VALUES ('?',"); + setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false)); + setSql.append(")"); + // Prepare the statement + try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { + // Set the uniqueId + collStatement.setString(1, uniqueId); + if (DEBUG) { + plugin.getLogger().info("DEBUG: collection insert =" + setSql); + } + // Do single dimension types (set and list) + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + //plugin.getLogger().info("DEBUG: set class for "); + // Loop through the set or list + // Note that we have no idea what type this is + Collection collection = (Collection)value; + Iterator it = collection.iterator(); + while (it.hasNext()) { + Object setValue = it.next(); + //if (setValue instanceof UUID) { + // Serialize everything + setValue = serialize(setValue, setValue.getClass()); + //} + // Set the value from ? to whatever it is + collStatement.setObject(2, setValue); + if (DEBUG) { + plugin.getLogger().info("DEBUG: " + collStatement.toString()); + } + // Execute the SQL in the database + collStatement.execute(); + } + } else if (propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class)) { + // Loop through the map + Map collection = (Map)value; + Iterator it = collection.entrySet().iterator(); + while (it.hasNext()) { + Entry en = (Entry) it.next(); + if (DEBUG) { + plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); + } - } finally { - // Close properly - MySQLDatabaseResourceCloser.close(connection); - MySQLDatabaseResourceCloser.close(preparedStatement); + // Get the key and serialize it + Object key = serialize(en.getKey(), en.getKey().getClass()); + if (DEBUG) { + plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); + } + // Get the value and serialize it + Object mapValue = serialize(en.getValue(), en.getValue().getClass()); + if (DEBUG) { + plugin.getLogger().info("DEBUG: mapValue = " + mapValue); + } + // Write the objects into prepared statement + collStatement.setObject(1, key); + collStatement.setObject(2, mapValue); + if (DEBUG) { + plugin.getLogger().info("DEBUG: " + collStatement.toString()); + } + // Write to database + collStatement.execute(); + } + } + // Set value for the main insert. For collections, this is just a dummy value because the real values are in the + // additional table. + value = true; + } + } else { + // If the value is not a collection, it just needs to be serialized to go into the database. + value = serialize(value, propertyDescriptor.getPropertyType()); + } + // Set the value in the main prepared statement and increment the location + // Note that with prepared statements, they count from 1, not 0, so the ++ goes on the front of i. + preparedStatement.setObject(++i, value); + } + // Add the statements to a batch + preparedStatement.addBatch(); + // Execute + if (DEBUG) { + plugin.getLogger().info("DEBUG: prepared statement = " + preparedStatement.toString()); + } + preparedStatement.executeBatch(); + } } } @@ -617,27 +621,14 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException, ClassNotFoundException { - Connection connection = null; - Statement statement = null; - ResultSet resultSet = null; - - try { - connection = databaseConnecter.createConnection(); - statement = connection.createStatement(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: selectQuery = " + selectQuery); - } - resultSet = statement.executeQuery(selectQuery); - + try (Connection conn = databaseConnecter.createConnection(); + Statement statement = conn.createStatement(); + ResultSet resultSet = statement.executeQuery(selectQuery)) { return createObjects(resultSet); - - } finally { - MySQLDatabaseResourceCloser.close(resultSet); - MySQLDatabaseResourceCloser.close(statement); - MySQLDatabaseResourceCloser.close(connection); } } + /* (non-Javadoc) * @see us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler#selectObject(java.lang.String) */ @@ -645,32 +636,33 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { public T loadObject(String uniqueId) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException, SQLException, SecurityException, ClassNotFoundException { - Connection connection = null; - Statement statement = null; - ResultSet resultSet = null; + if (DEBUG) { plugin.getLogger().info("DEBUG: loading object for " + uniqueId); } - try { - connection = databaseConnecter.createConnection(); - String query = "SELECT " + getColumns(false) + " FROM `" + dataObject.getCanonicalName() + "` WHERE uniqueId = ? LIMIT 1"; - try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + try (Connection conn = databaseConnecter.createConnection()) { + // Build the select query + StringBuilder query = new StringBuilder(); + query.append("SELECT "); + query.append(getColumns(false)); + query.append(" FROM `"); + query.append(dataObject.getCanonicalName()); + query.append("` WHERE uniqueId = ? LIMIT 1"); + + try (PreparedStatement preparedStatement = conn.prepareStatement(query.toString())) { preparedStatement.setString(1, uniqueId); if (DEBUG) { plugin.getLogger().info("DEBUG: load Object query = " + preparedStatement.toString()); } - resultSet = preparedStatement.executeQuery(); - - List result = createObjects(resultSet); - if (!result.isEmpty()) { - return result.get(0); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + // If there is a result, we only want/need the first one + List result = createObjects(resultSet); + if (!result.isEmpty()) { + return result.get(0); + } } } return null; - } finally { - MySQLDatabaseResourceCloser.close(resultSet); - MySQLDatabaseResourceCloser.close(statement); - MySQLDatabaseResourceCloser.close(connection); } } @@ -732,14 +724,20 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } // TODO Get the values from the subsidiary tables. // value is just of type boolean right now - String setSql = "SELECT "; + StringBuilder setSql = new StringBuilder(); + setSql.append("SELECT "); // Get the columns, just the names of them, no ?'s or types - setSql += getCollectionColumnString(method, false, false) + " "; - setSql += "FROM `" + dataObject.getCanonicalName() + "." + field.getName() + "` "; + setSql.append(getCollectionColumnString(method, false, false)); + setSql.append(" "); + setSql.append("FROM `"); + setSql.append(dataObject.getCanonicalName()); + setSql.append("."); + setSql.append(field.getName()); + setSql.append("` "); // We will need to fill in the ? later with the unique id of the class from the database - setSql += "WHERE uniqueId = ?"; + setSql.append("WHERE uniqueId = ?"); // Prepare the statement - try (PreparedStatement collStatement = connection.prepareStatement(setSql)) { + try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { // Set the unique ID collStatement.setObject(1, uniqueId); if (DEBUG) { @@ -778,8 +776,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { value = new ArrayList<>(); //plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); while (collectionResultSet.next()) { - //plugin.getLogger().info("DEBUG: adding to the list"); - //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); + // Add to the list ((List) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); } } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || @@ -829,15 +826,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } // Adapter // Check if there is an annotation on the field - ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class); - // If there is a config annotation then do something - if (configEntry != null) { - if (DEBUG) - { - plugin.getLogger().info("DEBUG: there is a configEntry"); - // TODO: add config entry handling - } - } Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { if (DEBUG) { @@ -917,12 +905,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException, SQLException, NoSuchMethodException, SecurityException { // Delete this object from all tables - Connection connection = null; - PreparedStatement preparedStatement = null; - try { - // Try to connect to the database - connection = databaseConnecter.createConnection(); + //PreparedStatement preparedStatement = null; + + // Try to connect to the database + try (Connection conn = databaseConnecter.createConnection()){ // Get the uniqueId. As each class extends DataObject, it must have this method in it. Method getUniqueId = dataObject.getMethod("getUniqueId"); String uniqueId = (String) getUniqueId.invoke(instance); @@ -933,14 +920,16 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Delete from the main table // First substitution is the table name // deleteQuery is created in super from the createInsertQuery() method - preparedStatement = connection.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "`")); - // Second is the unique ID - preparedStatement.setString(1, uniqueId); - preparedStatement.addBatch(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: DELETE Query " + preparedStatement.toString()); + try (PreparedStatement preparedStatement = conn.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "`"))) { + // Second is the unique ID + preparedStatement.setString(1, uniqueId); + preparedStatement.addBatch(); + if (DEBUG) { + plugin.getLogger().info("DEBUG: DELETE Query " + preparedStatement.toString()); + } + preparedStatement.executeBatch(); } - preparedStatement.executeBatch(); + // Delete from any sub tables created from the object // Run through the fields in the class using introspection for (Field field : dataObject.getDeclaredFields()) { @@ -952,7 +941,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { propertyDescriptor.getPropertyType().equals(HashMap.class) || propertyDescriptor.getPropertyType().equals(ArrayList.class)) { // First substitution is the table name - try (PreparedStatement preparedStatement2 = connection.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "." + field.getName() + "`"))) { + try (PreparedStatement preparedStatement2 = conn.prepareStatement(deleteQuery.replace("[table_name]", "`" + dataObject.getCanonicalName() + "." + field.getName() + "`"))) { // Second is the unique ID preparedStatement2.setString(1, uniqueId); preparedStatement2.addBatch(); @@ -964,12 +953,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } } } - } finally { - // Close properly - MySQLDatabaseResourceCloser.close(preparedStatement); - MySQLDatabaseResourceCloser.close(connection); - } - + } } /* (non-Javadoc) @@ -980,31 +964,22 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (DEBUG) { plugin.getLogger().info("DEBUG: checking if " + key + " exists in the database"); } - Connection connection = null; - PreparedStatement preparedStatement = null; - ResultSet resultSet = null; - String query = "SELECT IF ( EXISTS( SELECT * FROM `" + dataObject.getCanonicalName() + "` WHERE `uniqueId` = ?), 1, 0)"; - //String query = "SELECT * FROM `" + type.getCanonicalName() + "` WHERE uniqueId = ?"; - try { - connection = databaseConnecter.createConnection(); - preparedStatement = connection.prepareStatement(query); + // Create the query to see if this key exists + StringBuilder query = new StringBuilder(); + query.append("SELECT IF ( EXISTS( SELECT * FROM `"); + query.append(dataObject.getCanonicalName()); + query.append("` WHERE `uniqueId` = ?), 1, 0)"); + + try (Connection conn = databaseConnecter.createConnection(); + PreparedStatement preparedStatement = conn.prepareStatement(query.toString())) { preparedStatement.setString(1, key); - resultSet = preparedStatement.executeQuery(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: object exists sql " + preparedStatement.toString()); - } - if (resultSet.next()) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: result is " + resultSet.getBoolean(1)); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + if (resultSet.next()) { + return resultSet.getBoolean(1); } - return resultSet.getBoolean(1); } } catch (SQLException e) { plugin.getLogger().severe("Could not check if key exists in database! " + key + " " + e.getMessage()); - } finally { - MySQLDatabaseResourceCloser.close(resultSet); - MySQLDatabaseResourceCloser.close(preparedStatement); - MySQLDatabaseResourceCloser.close(connection); } return false; } @@ -1012,14 +987,14 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { @Override public void saveSettings(T instance) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { - plugin.getLogger().severe("This method should not be used because configs are not stored in MySQL"); + // This method should not be used because configs are not stored in MySQL } @Override public T loadSettings(String uniqueId, T dbConfig) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, IntrospectionException { - plugin.getLogger().severe("This method should not be used because configs are not stored in MySQL"); + // This method should not be used because configs are not stored in MySQL return null; } From aae4c6d0b23927fb65ea7ada1e4934cfc238b27a Mon Sep 17 00:00:00 2001 From: Tastybento Date: Thu, 8 Feb 2018 23:47:11 -0800 Subject: [PATCH 82/97] Rewrote safe teleport. Needs testing. --- .../commands/admin/AdminTeleportCommand.java | 6 +- .../managers/island/IslandsManager.java | 9 +- .../bskyblock/util/SafeSpotTeleport.java | 380 ++++++++++-------- .../bskyblock/util/SafeTeleportBuilder.java | 92 +++++ 4 files changed, 319 insertions(+), 168 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java index 7d9fb3046..0a63711a3 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java @@ -9,6 +9,7 @@ import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.util.SafeSpotTeleport; +import us.tastybento.bskyblock.util.SafeTeleportBuilder; public class AdminTeleportCommand extends CompositeCommand { @@ -46,7 +47,10 @@ public class AdminTeleportCommand extends CompositeCommand { // Other wise, go to a safe spot String failureMessage = user.getTranslation("commands.admin.tp.manual", "[location]", warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " " + warpSpot.getBlockZ()); - new SafeSpotTeleport(getPlugin(), user.getPlayer(), warpSpot, failureMessage); + new SafeTeleportBuilder(getPlugin()).entity(user.getPlayer()) + .location(warpSpot) + .failureMessage(failureMessage) + .build(); return true; } user.sendMessage("command.admin.tp.no-island"); diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index a4cae85d6..62f604173 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -27,7 +27,7 @@ import us.tastybento.bskyblock.database.BSBDatabase; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.util.DeleteIslandChunks; -import us.tastybento.bskyblock.util.SafeSpotTeleport; +import us.tastybento.bskyblock.util.SafeTeleportBuilder; import us.tastybento.bskyblock.util.Util; /** @@ -625,7 +625,11 @@ public class IslandsManager { plugin.getLogger().info("Fixing home location using safe spot teleport"); } // Try to fix this teleport location and teleport the player if possible - new SafeSpotTeleport(plugin, player, plugin.getPlayers().getHomeLocation(player.getUniqueId(), number), number); + new SafeTeleportBuilder(plugin).entity(player) + .location(plugin.getPlayers().getHomeLocation(player.getUniqueId(), number)) + .setHome(true) + .homeNumber(number) + .build(); return; } if (DEBUG) { @@ -633,7 +637,6 @@ public class IslandsManager { } //home.getChunk().load(); player.teleport(home); - //player.sendBlockChange(home, Material.GLOWSTONE, (byte)0); User user = User.getInstance(player); if (number == 1) { user.sendMessage("commands.island.go.teleport", "[label]", Constants.ISLANDCOMMAND); diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index dd4d536ab..eb90c2804 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -11,9 +11,11 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.database.objects.Island; /** @@ -23,185 +25,234 @@ import us.tastybento.bskyblock.database.objects.Island; */ public class SafeSpotTeleport { + private enum State { + CENTER, SURROUNDING, LAST_CHECK, FAILURE, CENTER_WAIT, SURROUNDING_WAIT + } + private static final long SPEED = 10; + private State step = State.CENTER; + private BukkitTask task; + + + private BSkyBlock plugin; + private final Entity entity; + private final Location location; + private final int homeNumber; + private final boolean setHome; + private int lastX; + private int lastZ; + private int chunksToCheck = 10; + private int worldHeight = 255; + private World world; + private double safeDistance; + private Vector safeSpotInChunk; + private boolean safeSpotFound; + private Vector portalPart; + private ChunkSnapshot portalChunk; + private ChunkSnapshot safeChunk; + /** - * Teleport to a safe place and if it fails, show a failure message - * @param plugin - * @param player - * @param l + * Teleports and entity to a safe spot on island + * @param plugin2 + * @param entity2 + * @param island * @param failureMessage + * @param setHome2 + * @param homeNumber2 */ - public SafeSpotTeleport(final BSkyBlock plugin, final Entity player, final Location l, final String failureMessage) { - new SafeSpotTeleport(plugin, player, l, 1, failureMessage, false); - } + public SafeSpotTeleport(BSkyBlock plugin2, Entity entity2, Location location, String failureMessage, boolean setHome2, + int homeNumber2) { + this.plugin = plugin2; + this.entity = entity2; + this.setHome = setHome2; + this.homeNumber = homeNumber2; + this.location = location; - /** - * Teleport to a safe place and set home - * @param plugin - * @param player - * @param l - * @param number - */ - public SafeSpotTeleport(final BSkyBlock plugin, final Entity player, final Location l, final int number) { - new SafeSpotTeleport(plugin, player, l, number, "", true); - } + // Put player into spectator mode + if (entity instanceof Player && ((Player)entity).getGameMode().equals(GameMode.SURVIVAL)) { + ((Player)entity).setGameMode(GameMode.SPECTATOR); + } + // Get world info + world = location.getWorld(); + worldHeight = world.getEnvironment().equals(Environment.NETHER) ? world.getMaxHeight() - 20 : world.getMaxHeight() - 2; - /** - * Teleport to a safe spot on an island - * @param plugin - * @param player - * @param l - */ - public SafeSpotTeleport(final BSkyBlock plugin, final Entity player, final Location l) { - new SafeSpotTeleport(plugin, player, l, 1, "", false); - } - /** - * Teleport to a safe spot on an island - * - * TODO: REFACTOR THIS! + // Get island mins and max + Island island = plugin.getIslands().getIslandAt(location).orElse(null); + if (island == null) { + if (entity instanceof Player) { + User.getInstance((Player)entity).sendMessage(failureMessage); + } + return; + } + // Set the minimums and maximums + lastX = island.getMinProtectedX() / 16; + lastZ = island.getMinProtectedZ() / 16; + int biggestX = (island.getMinProtectedX() + island.getProtectionRange() - 1) / 16; + int biggestZ = (island.getMinProtectedZ() + island.getProtectionRange() - 1) / 16; - * @param plugin - * @param entity - * @param islandLoc - */ - public SafeSpotTeleport(final BSkyBlock plugin, final Entity entity, final Location islandLoc, final int homeNumber, final String failureMessage, final boolean setHome) { - //this.plugin = plugin; - //plugin.getLogger().info("DEBUG: running safe spot"); - // Get island - Island island = plugin.getIslands().getIslandAt(islandLoc).orElse(null); - if (island != null) { - final World world = islandLoc.getWorld(); - // Get the chunks + // Start a recurring task until done or cancelled + task = plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { List chunkSnapshot = new ArrayList<>(); - // Add the center chunk - chunkSnapshot.add(island.getCenter().toVector().toLocation(world).getChunk().getChunkSnapshot()); - // Add immediately adjacent chunks - for (int x = islandLoc.getChunk().getX()-1; x <= islandLoc.getChunk().getX()+1; x++) { - for (int z = islandLoc.getChunk().getZ()-1; z <= islandLoc.getChunk().getZ()+1; z++) { - if (x != islandLoc.getChunk().getX() || z != islandLoc.getChunk().getZ()) { - chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); + switch (step) { + case CENTER: + // Add the center chunk + chunkSnapshot.add(location.toVector().toLocation(world).getChunk().getChunkSnapshot()); + // Add immediately adjacent chunks + for (int x = location.getChunk().getX()-1; x <= location.getChunk().getX()+1; x++) { + for (int z = location.getChunk().getZ()-1; z <= location.getChunk().getZ()+1; z++) { + if (x != location.getChunk().getX() || z != location.getChunk().getZ()) { + chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); + } + } + } + // Move to next step + step = State.CENTER_WAIT; + checkChunks(chunkSnapshot); + break; + case CENTER_WAIT: + // Do nothing while the center scan is done + break; + case SURROUNDING: + for (int x = lastX; x <= biggestX; x++) { + for (int z = lastZ; z <= biggestZ; z++) { + chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); + if (chunkSnapshot.size() == chunksToCheck) { + lastX = x; + lastZ = z; + step = State.SURROUNDING_WAIT; + checkChunks(chunkSnapshot); + return; + } + } + } + // Last few chunks, may be none + step = State.LAST_CHECK; + checkChunks(chunkSnapshot); + break; + case SURROUNDING_WAIT: + // Do nothing while the surrounding scan is done + break; + case LAST_CHECK: + // Do nothing while the last few chunks are scanned + break; + case FAILURE: + // We are done searching - failure + task.cancel(); + if (entity instanceof Player) { + if (!failureMessage.isEmpty()) { + entity.sendMessage(failureMessage); } } } - // Add the rest of the island protected area - for (int x = island.getMinProtectedX() /16; x <= (island.getMinProtectedX() + island.getProtectionRange() - 1)/16; x++) { - for (int z = island.getMinProtectedZ() /16; z <= (island.getMinProtectedZ() + island.getProtectionRange() - 1)/16; z++) { - // This includes the center spots again, so is not as efficient... - chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); - } - } - //plugin.getLogger().info("DEBUG: size of chunk ss = " + chunkSnapshot.size()); - final List finalChunk = chunkSnapshot; - int maxHeight = world.getMaxHeight() - 2; - if (world.getEnvironment().equals(Environment.NETHER)) { - // We need to ignore the roof - maxHeight -= 20; - } - final int worldHeight = maxHeight; - //plugin.getLogger().info("DEBUG:world height = " + worldHeight); - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { - // Find a safe spot, defined as a solid block, with 2 air spaces above it - //long time = System.nanoTime(); - int x = 0; - int y = 0; - int z = 0; - ChunkSnapshot safeChunk = null; - ChunkSnapshot portalChunk = null; - boolean safeSpotFound = false; - Vector safeSpotInChunk = null; - Vector portalPart = null; - double distance = 0D; - double safeDistance = 0D; - for (ChunkSnapshot chunk: finalChunk) { - for (x = 0; x< 16; x++) { - for (z = 0; z < 16; z++) { - // Work down from the entry point up - for (y = Math.min(chunk.getHighestBlockYAt(x, z), worldHeight); y >= 0; y--) { - //System.out.println("Trying " + (16 * chunk.getX() + x) + " " + y + " " + (16 * chunk.getZ() + z)); - // Check for portal - only if this is not a safe home search - if (!setHome && chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { - if (portalPart == null || (distance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { - // First one found or a closer one, save the chunk the position and the distance - portalChunk = chunk; - portalPart = new Vector(x,y,z); - distance = portalPart.distanceSquared(islandLoc.toVector()); - } - } - // Check for safe spot, but only if it is closer than one we have found already - if (!safeSpotFound || (safeDistance > islandLoc.toVector().distanceSquared(new Vector(x,y,z)))) { - // No safe spot yet, or closer distance - if (checkBlock(chunk,x,y,z, worldHeight)) { - safeChunk = chunk; - safeSpotFound = true; - safeSpotInChunk = new Vector(x,y,z); - safeDistance = islandLoc.toVector().distanceSquared(safeSpotInChunk); - } + }, 0L, SPEED); + } + + private boolean checkChunks(List chunkSnapshot) { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { + // Find a safe spot, defined as a solid block, with 2 air spaces above it + //long time = System.nanoTime(); + int x = 0; + int y = 0; + int z = 0; + double distance = 0D; + + for (ChunkSnapshot chunk: chunkSnapshot) { + // Run through the chunk + for (x = 0; x< 16; x++) { + for (z = 0; z < 16; z++) { + // Work down from the entry point up + for (y = Math.min(chunk.getHighestBlockYAt(x, z), worldHeight); y >= 0; y--) { + //System.out.println("Trying " + (16 * chunk.getX() + x) + " " + y + " " + (16 * chunk.getZ() + z)); + // Check for portal - only if this is not a safe home search + if (!setHome && chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { + if (portalPart == null || (distance > location.toVector().distanceSquared(new Vector(x,y,z)))) { + // First one found or a closer one, save the chunk the position and the distance + portalChunk = chunk; + portalPart = new Vector(x,y,z); + distance = portalPart.distanceSquared(location.toVector()); } } - } //end z - } // end x - //if (safeSpotFound) { - //System.out.print("DEBUG: safe spot found " + safeSpotInChunk.toString()); - //break search; - //} - } - // End search - // Check if the portal is safe (it should be) - if (portalPart != null) { - //System.out.print("DEBUG: Portal found"); - // There is a portal available, but is it safe? - // Get the lowest portal spot - x = portalPart.getBlockX(); - y = portalPart.getBlockY(); - z = portalPart.getBlockZ(); - while (portalChunk.getBlockType(x,y,z).equals(Material.PORTAL)) { - y--; - } - //System.out.print("DEBUG: Portal teleport loc = " + (16 * portalChunk.getX() + x) + "," + (y) + "," + (16 * portalChunk.getZ() + z)); - // Now check if this is a safe location - if (checkBlock(portalChunk,x,y,z, worldHeight)) { - // Yes, so use this instead of the highest location - //System.out.print("DEBUG: Portal is safe"); - safeSpotFound = true; - safeSpotInChunk = new Vector(x,y,z); - safeChunk = portalChunk; - // TODO: Add safe portal spot to island - } - } - //System.out.print("Seconds = " + ((System.nanoTime() - time) * 0.000000001)); - if (safeChunk != null && safeSpotFound) { - //final Vector spot = new Vector((16 *currentChunk.getX()) + x + 0.5D, y +1, (16 * currentChunk.getZ()) + z + 0.5D) - final Vector spot = new Vector((16 *safeChunk.getX()) + 0.5D, 1, (16 * safeChunk.getZ()) + 0.5D).add(safeSpotInChunk); - // Return to main thread and teleport the player - plugin.getServer().getScheduler().runTask(plugin, () -> { - Location destination = spot.toLocation(islandLoc.getWorld()); - if (setHome && entity instanceof Player) { - plugin.getPlayers().setHomeLocation(entity.getUniqueId(), destination, homeNumber); - } - Vector velocity = entity.getVelocity(); - entity.teleport(destination); - entity.setVelocity(velocity); - // Exit spectator mode if in it - if (entity instanceof Player) { - Player player = (Player)entity; - if (player.getGameMode().equals(GameMode.SPECTATOR)) { - player.setGameMode(GameMode.SURVIVAL); + // Check for safe spot, but only if it is closer than one we have found already + if (!safeSpotFound || (safeDistance > location.toVector().distanceSquared(new Vector(x,y,z)))) { + // No safe spot yet, or closer distance + if (checkBlock(chunk,x,y,z, worldHeight)) { + safeChunk = chunk; + safeSpotFound = true; + safeSpotInChunk = new Vector(x,y,z); + safeDistance = location.toVector().distanceSquared(safeSpotInChunk); + } } } - }); - } else { - // We did not find a spot - plugin.getServer().getScheduler().runTask(plugin, () -> { - //plugin.getLogger().info("DEBUG: safe spot not found"); - if (entity instanceof Player) { - if (!failureMessage.isEmpty()) { - entity.sendMessage(failureMessage); - } else { - entity.sendMessage("Warp not safe"); - } - } - }); + } //end z + } // end x + // If this is not a home search do a check for portal + if (!this.setHome) { + checkPortal(); } - }); + + // If successful, teleport otherwise move to the next step in the state machine + if (safeSpotFound) { + task.cancel(); + teleportEntity(); + } else if (step.equals(State.SURROUNDING_WAIT) || step.equals(State.CENTER_WAIT)) { + step = State.SURROUNDING; + } else if (step.equals(State.LAST_CHECK)) { + step = State.FAILURE; + } + } + }); + return false; + } + + + /** + * Teleports entity to the safe spot + */ + private void teleportEntity() { + final Vector spot = new Vector((16 *safeChunk.getX()) + 0.5D, 1, (16 * safeChunk.getZ()) + 0.5D).add(safeSpotInChunk); + // Return to main thread and teleport the player + plugin.getServer().getScheduler().runTask(plugin, () -> { + Location destination = spot.toLocation(world); + if (setHome && entity instanceof Player) { + plugin.getPlayers().setHomeLocation(entity.getUniqueId(), destination, homeNumber); + } + Vector velocity = entity.getVelocity(); + entity.teleport(destination); + // Exit spectator mode if in it + if (entity instanceof Player) { + Player player = (Player)entity; + if (player.getGameMode().equals(GameMode.SPECTATOR)) { + player.setGameMode(GameMode.SURVIVAL); + } + } else { + entity.setVelocity(velocity); + } + }); + + } + + /** + * Checks if a portal is safe + */ + private void checkPortal() { + if (portalPart == null) { + return; + } + // There is a portal available, but is it safe? + // Get the lowest portal spot + int x = portalPart.getBlockX(); + int y = portalPart.getBlockY(); + int z = portalPart.getBlockZ(); + while (portalChunk.getBlockType(x,y,z).equals(Material.PORTAL)) { + y--; + } + //System.out.print("DEBUG: Portal teleport loc = " + (16 * portalChunk.getX() + x) + "," + (y) + "," + (16 * portalChunk.getZ() + z)); + // Now check if this is a safe location + if (checkBlock(portalChunk,x,y,z, worldHeight)) { + // Yes, so use this instead of the highest location + //System.out.print("DEBUG: Portal is safe"); + safeSpotFound = true; + safeSpotInChunk = new Vector(x,y,z); + safeChunk = portalChunk; } } @@ -268,4 +319,5 @@ public class SafeSpotTeleport { } return false; } + } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java b/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java new file mode 100644 index 000000000..330eb9549 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java @@ -0,0 +1,92 @@ +package us.tastybento.bskyblock.util; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.database.objects.Island; + +public class SafeTeleportBuilder { + + private BSkyBlock plugin; + private Entity entity; + private int homeNumber = 0; + private boolean setHome = false; + private String failureMessage = ""; + private Location location; + + + public SafeTeleportBuilder(BSkyBlock plugin) { + this.plugin = plugin; + } + + /** + * Set who or what is going to teleport + * @param entity + * @return + */ + public SafeTeleportBuilder entity(Entity entity) { + this.entity = entity; + return this; + } + + /** + * Set the island to teleport to + * @param island + * @return + */ + public SafeTeleportBuilder island(Island island) { + this.location = island.getCenter(); + return this; + } + + /** + * Set the home number to this number + * @param homeNumber + * @return + */ + public SafeTeleportBuilder homeNumber(int homeNumber) { + this.homeNumber = homeNumber; + return this; + } + + /** + * Set the home of the player to the safe location + * @param setHome + * @return + */ + public SafeTeleportBuilder setHome(boolean setHome) { + this.setHome = setHome; + return this; + } + + /** + * Set the failure message if this teleport cannot happen + * @param failureMessage + * @return + */ + public SafeTeleportBuilder failureMessage(String failureMessage) { + this.failureMessage = failureMessage; + return this; + } + + /** + * Set the desired location + * @param location + * @return + */ + public SafeTeleportBuilder location(Location location) { + this.location = location; + return this; + } + + /** + * Try to teleport the player + * @return + */ + public SafeSpotTeleport build() { + return new SafeSpotTeleport(plugin, entity, location, failureMessage, setHome, homeNumber); + } + + +} From f8da3fbc615a61ec68e2ffff95c24fb1c6959b8b Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 9 Feb 2018 17:06:32 -0800 Subject: [PATCH 83/97] Fixed bugs with MySQLDatabaseHandler Code clean up, fixed bugs. Added automated tests. --- .../api/configuration/ISettings.java | 2 +- .../flatfile/FlatFileDatabaseHandler.java | 2 +- .../managers/AbstractDatabaseHandler.java | 2 +- .../database/managers/PlayersManager.java | 4 +- .../database/mysql/MySQLDatabaseHandler.java | 252 +++---------- .../listeners/PanelListenerManager.java | 21 +- .../mysql/MySQLDatabaseHandlerTest.java | 198 ++++++++++ .../MySQLDatabaseHandlerTestDataObject.java | 349 ++++++++++++++++++ 8 files changed, 619 insertions(+), 211 deletions(-) create mode 100644 src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java create mode 100644 src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTestDataObject.java diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java index 18b34ad25..4b487a9d1 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ISettings.java @@ -43,7 +43,7 @@ public interface ISettings { // See if this settings object already exists in the database AbstractDatabaseHandler dbhandler = (AbstractDatabaseHandler) BSBDatabase.getDatabase().getHandler(getClass()); T dbConfig = null; - if (dbhandler.objectExits(this.getUniqueId())) { + if (dbhandler.objectExists(this.getUniqueId())) { // Load it dbConfig = dbhandler.loadObject(getUniqueId()); } diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 4d20fa619..1dec8c8a0 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -93,7 +93,7 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { } @Override - public boolean objectExits(String key) { + public boolean objectExists(String key) { return databaseConnecter.uniqueIdExists(dataObject.getSimpleName(), key); } diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/AbstractDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/managers/AbstractDatabaseHandler.java index 03ad7df74..0637dd2cb 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/AbstractDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/AbstractDatabaseHandler.java @@ -130,7 +130,7 @@ public abstract class AbstractDatabaseHandler { * @param key * @return true if this key exists */ - public abstract boolean objectExits(String key); + public abstract boolean objectExists(String key); /** * Saves a file as settings diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java index 6e9fa3cf3..03a27151a 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/PlayersManager.java @@ -136,7 +136,7 @@ public class PlayersManager{ } Players player = null; // If the player is in the database, load it, otherwise create a new player - if (handler.objectExits(playerUUID.toString())) { + if (handler.objectExists(playerUUID.toString())) { if (DEBUG) { plugin.getLogger().info("DEBUG: player in database"); } @@ -201,7 +201,7 @@ public class PlayersManager{ return true; } else { // Get from the database - do not add to cache yet - return handler.objectExits(uniqueID.toString()); + return handler.objectExists(uniqueID.toString()); } } diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 6233ce4e0..0902a1586 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -48,7 +48,6 @@ import us.tastybento.bskyblock.util.Util; */ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { - private static final boolean DEBUG = false; /** * Connection to the database */ @@ -56,41 +55,42 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { /** * This hashmap maps Java types to MySQL SQL types because they are not the same */ - private static HashMap mySQLmapping; - { - mySQLmapping = new HashMap<>(); - mySQLmapping.put(boolean.class.getTypeName(), "BOOL"); - mySQLmapping.put(byte.class.getTypeName(), "TINYINT"); - mySQLmapping.put(short.class.getTypeName(), "SMALLINT"); - mySQLmapping.put(int.class.getTypeName(), "INTEGER"); - mySQLmapping.put(long.class.getTypeName(), "BIGINT"); - mySQLmapping.put(double.class.getTypeName(), "DOUBLE PRECISION"); - mySQLmapping.put(Boolean.class.getTypeName(), "BOOL"); - mySQLmapping.put(Byte.class.getTypeName(), "TINYINT"); - mySQLmapping.put(Short.class.getTypeName(), "SMALLINT"); - mySQLmapping.put(Integer.class.getTypeName(), "INTEGER"); - mySQLmapping.put(Long.class.getTypeName(), "BIGINT"); - mySQLmapping.put(Double.class.getTypeName(), "DOUBLE PRECISION"); - mySQLmapping.put(BigDecimal.class.getTypeName(), "DECIMAL(13,0)"); - mySQLmapping.put(String.class.getTypeName(), "VARCHAR(254)"); - mySQLmapping.put(Date.class.getTypeName(), "DATE"); - mySQLmapping.put(Time.class.getTypeName(), "TIME"); - mySQLmapping.put(Timestamp.class.getTypeName(), "TIMESTAMP"); - mySQLmapping.put(UUID.class.getTypeName(), "VARCHAR(36)"); + private static final HashMap MYSQL_MAPPING = new HashMap<>(); + private static final String STRING_MAP = "VARCHAR(254)"; + + static { + MYSQL_MAPPING.put(boolean.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(byte.class.getTypeName(), "TINYINT"); + MYSQL_MAPPING.put(short.class.getTypeName(), "SMALLINT"); + MYSQL_MAPPING.put(int.class.getTypeName(), "INTEGER"); + MYSQL_MAPPING.put(long.class.getTypeName(), "BIGINT"); + MYSQL_MAPPING.put(double.class.getTypeName(), "DOUBLE PRECISION"); + MYSQL_MAPPING.put(Boolean.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(Byte.class.getTypeName(), "TINYINT"); + MYSQL_MAPPING.put(Short.class.getTypeName(), "SMALLINT"); + MYSQL_MAPPING.put(Integer.class.getTypeName(), "INTEGER"); + MYSQL_MAPPING.put(Long.class.getTypeName(), "BIGINT"); + MYSQL_MAPPING.put(Double.class.getTypeName(), "DOUBLE PRECISION"); + MYSQL_MAPPING.put(BigDecimal.class.getTypeName(), "DECIMAL(13,0)"); + MYSQL_MAPPING.put(String.class.getTypeName(), STRING_MAP); + MYSQL_MAPPING.put(Date.class.getTypeName(), "DATE"); + MYSQL_MAPPING.put(Time.class.getTypeName(), "TIME"); + MYSQL_MAPPING.put(Timestamp.class.getTypeName(), "TIMESTAMP"); + MYSQL_MAPPING.put(UUID.class.getTypeName(), "VARCHAR(36)"); // Bukkit Mappings - mySQLmapping.put(Location.class.getTypeName(), "VARCHAR(254)"); - mySQLmapping.put(World.class.getTypeName(), "VARCHAR(254)"); + MYSQL_MAPPING.put(Location.class.getTypeName(), STRING_MAP); + MYSQL_MAPPING.put(World.class.getTypeName(), STRING_MAP); // Collections are stored as additional tables. The boolean indicates whether there // is any data in it or not (maybe) - mySQLmapping.put(Set.class.getTypeName(), "BOOL"); - mySQLmapping.put(Map.class.getTypeName(), "BOOL"); - mySQLmapping.put(HashMap.class.getTypeName(), "BOOL"); - mySQLmapping.put(ArrayList.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(Set.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(Map.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(HashMap.class.getTypeName(), "BOOL"); + MYSQL_MAPPING.put(ArrayList.class.getTypeName(), "BOOL"); // Enums - mySQLmapping.put(Enum.class.getTypeName(), "VARCHAR(254)"); + MYSQL_MAPPING.put(Enum.class.getTypeName(), STRING_MAP); } @@ -131,7 +131,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { for (Field field : dataObject.getDeclaredFields()) { // Get the description of the field PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); - //plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); // Get default SQL mappings // Get the write method for this field. This method will take an argument of the type of this field. Method writeMethod = propertyDescriptor.getWriteMethod(); @@ -142,7 +141,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (propertyDescriptor.getPropertyType().isEnum()) { typeName = "Enum"; } - String mapping = mySQLmapping.get(typeName); + String mapping = MYSQL_MAPPING.get(typeName); // If it exists, then create the SQL if (mapping != null) { // Note that the column name must be enclosed in `'s because it may include reserved words. @@ -170,9 +169,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { setSql.append(")"); // Execute the statement try (PreparedStatement collections = connection.prepareStatement(setSql.toString())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: collections prepared statement = " + collections.toString()); - } collections.executeUpdate(); } } @@ -180,20 +176,17 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // The Java type is not in the hashmap, so we'll just guess that it can be stored in a string // This should NOT be used in general because every type should be in the hashmap sql.append(field.getName()); - sql.append(" VARCHAR(254),"); + sql.append(" "); + sql.append(STRING_MAP); + sql.append(","); plugin.getLogger().severe("Unknown type! Hoping it'll fit in a string!"); plugin.getLogger().severe(propertyDescriptor.getPropertyType().getTypeName()); } } - //plugin.getLogger().info("DEBUG: SQL before trim string = " + sql); // For the main table for the class, the unique ID is the primary key sql.append(" PRIMARY KEY (uniqueId))"); - //plugin.getLogger().info("DEBUG: SQL string = " + sql); // Prepare and execute the database statements try (PreparedStatement pstmt = connection.prepareStatement(sql.toString())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: pstmt = " + pstmt.toString()); - } pstmt.executeUpdate(); } } @@ -259,9 +252,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { sb.append(col); } } - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection column string = " + sb.toString()); - } return sb.toString(); } @@ -281,9 +271,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { col.append(en.getValue()); } columns.add(col.toString()); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection columns = " + col); - } } return columns; @@ -311,15 +298,12 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { int index = 0; for (Type type : parameters) { // This is a request for column names. - String setMapping = mySQLmapping.get(type.getTypeName()); + String setMapping = MYSQL_MAPPING.get(type.getTypeName()); // This column name format is typeName_# where # is a number incremented from 0 - columns.put("`" + type.getTypeName() + "_" + index + "`", setMapping != null ? setMapping : "VARCHAR(254)"); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection column = " + "`" + type.getTypeName() + "_" + index + "`" + setMapping); - } + columns.put("`" + type.getTypeName() + "_" + index + "`", setMapping != null ? setMapping : STRING_MAP); + // Increment the index so each column has a unique name + index++; } - // Increment the index so each column has a unique name - index++; } } return columns; @@ -394,9 +378,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { - if (DEBUG) { - plugin.getLogger().info("DEBUG: saveObject "); - } // Try to connect to the database try (Connection connection = databaseConnecter.createConnection()) { // insertQuery is created in super from the createInsertQuery() method @@ -405,43 +386,25 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { PropertyDescriptor propertyDescriptor = new PropertyDescriptor("uniqueId", dataObject); Method getUniqueId = propertyDescriptor.getReadMethod(); final String uniqueId = (String) getUniqueId.invoke(instance); - if (DEBUG) { - plugin.getLogger().info("DEBUG: Unique Id = " + uniqueId); - } if (uniqueId.isEmpty()) { throw new SQLException("uniqueId is blank"); } // Create the insertion int i = 0; - if (DEBUG) { - plugin.getLogger().info("DEBUG: insert Query " + insertQuery); - } // Run through the fields in the class using introspection for (Field field : dataObject.getDeclaredFields()) { // Get the field's property descriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); // Get the read method for this field Method method = propertyDescriptor.getReadMethod(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: Field = " + field.getName() + "(" + propertyDescriptor.getPropertyType().getTypeName() + ")"); - } //sql += "`" + field.getName() + "` " + mapping + ","; // Invoke the read method to obtain the value from the class - this is the value we need to store in the database Object value = method.invoke(instance); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value = " + value); - } // Adapter Notation Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: there is an adapter"); - } // A conversion adapter has been defined value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value now after deserialization = " + value); - } } // Create set and map table inserts if this is a Collection if (propertyDescriptor.getPropertyType().equals(Set.class) || @@ -459,9 +422,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql.toString())) { collStatement.setString(1, uniqueId); collStatement.execute(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collStatement " + collStatement.toString()); - } } // Insert into the table StringBuilder setSql = new StringBuilder(); @@ -481,9 +441,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { // Set the uniqueId collStatement.setString(1, uniqueId); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection insert =" + setSql); - } // Do single dimension types (set and list) if (propertyDescriptor.getPropertyType().equals(Set.class) || propertyDescriptor.getPropertyType().equals(ArrayList.class)) { @@ -500,9 +457,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { //} // Set the value from ? to whatever it is collStatement.setObject(2, setValue); - if (DEBUG) { - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - } // Execute the SQL in the database collStatement.execute(); } @@ -513,26 +467,13 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Iterator it = collection.entrySet().iterator(); while (it.hasNext()) { Entry en = (Entry) it.next(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); - } - // Get the key and serialize it Object key = serialize(en.getKey(), en.getKey().getClass()); - if (DEBUG) { - plugin.getLogger().info("DEBUG: key class = " + en.getKey().getClass().getTypeName()); - } // Get the value and serialize it Object mapValue = serialize(en.getValue(), en.getValue().getClass()); - if (DEBUG) { - plugin.getLogger().info("DEBUG: mapValue = " + mapValue); - } // Write the objects into prepared statement collStatement.setObject(1, key); collStatement.setObject(2, mapValue); - if (DEBUG) { - plugin.getLogger().info("DEBUG: " + collStatement.toString()); - } // Write to database collStatement.execute(); } @@ -552,9 +493,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Add the statements to a batch preparedStatement.addBatch(); // Execute - if (DEBUG) { - plugin.getLogger().info("DEBUG: prepared statement = " + preparedStatement.toString()); - } preparedStatement.executeBatch(); } } @@ -621,11 +559,10 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException, ClassNotFoundException { - try (Connection conn = databaseConnecter.createConnection(); - Statement statement = conn.createStatement(); + try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(selectQuery)) { return createObjects(resultSet); - } + } } @@ -637,35 +574,28 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException, SQLException, SecurityException, ClassNotFoundException { - if (DEBUG) { - plugin.getLogger().info("DEBUG: loading object for " + uniqueId); - } - try (Connection conn = databaseConnecter.createConnection()) { - // Build the select query - StringBuilder query = new StringBuilder(); - query.append("SELECT "); - query.append(getColumns(false)); - query.append(" FROM `"); - query.append(dataObject.getCanonicalName()); - query.append("` WHERE uniqueId = ? LIMIT 1"); + // Build the select query + StringBuilder query = new StringBuilder(); + query.append("SELECT "); + query.append(getColumns(false)); + query.append(" FROM `"); + query.append(dataObject.getCanonicalName()); + query.append("` WHERE uniqueId = ? LIMIT 1"); - try (PreparedStatement preparedStatement = conn.prepareStatement(query.toString())) { - preparedStatement.setString(1, uniqueId); - if (DEBUG) { - plugin.getLogger().info("DEBUG: load Object query = " + preparedStatement.toString()); - } - try (ResultSet resultSet = preparedStatement.executeQuery()) { - // If there is a result, we only want/need the first one - List result = createObjects(resultSet); - if (!result.isEmpty()) { - return result.get(0); - } + try (PreparedStatement preparedStatement = connection.prepareStatement(query.toString())) { + preparedStatement.setString(1, uniqueId); + try (ResultSet resultSet = preparedStatement.executeQuery()) { + // If there is a result, we only want/need the first one + List result = createObjects(resultSet); + if (!result.isEmpty()) { + return result.get(0); } } - return null; } + return null; } + /** * * Creates a list of s filled with values from the provided ResultSet @@ -712,17 +642,10 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Get the write method for this field, because we are going to use it to write the value // once we get the value from the database Method method = propertyDescriptor.getWriteMethod(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: propertyDescriptor.getPropertyType() = " + propertyDescriptor.getPropertyType()); - } // If the type is a Collection, then we need to deal with set and map tables if (Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { // Collection - if (DEBUG) { - plugin.getLogger().info("DEBUG: Collection or Map"); - } - // TODO Get the values from the subsidiary tables. // value is just of type boolean right now StringBuilder setSql = new StringBuilder(); setSql.append("SELECT "); @@ -740,34 +663,21 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { // Set the unique ID collStatement.setObject(1, uniqueId); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collStatement = " + collStatement.toString()); - } try (ResultSet collectionResultSet = collStatement.executeQuery()) { //plugin.getLogger().info("DEBUG: collectionResultSet = " + collectionResultSet.toString()); // Do single dimension types (set and list) if (Set.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: adding a set"); - } // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); // collectionTypes should be only 1 long Type setType = collectionTypes.get(0); value = new HashSet<>(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); - plugin.getLogger().info("DEBUG: setType = " + setType.getTypeName()); - } while (collectionResultSet.next()) { ((Set) value).add(deserialize(collectionResultSet.getObject(1),Class.forName(setType.getTypeName()))); } } else if (List.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: Adding a list "); - } // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); @@ -781,9 +691,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } } else if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType()) || HashMap.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: Adding a map "); - } // Loop through the collection resultset // Note that we have no idea what type this is List collectionTypes = Util.getCollectionParameterTypes(method); @@ -791,24 +698,11 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Type keyType = collectionTypes.get(0); Type valueType = collectionTypes.get(1); value = new HashMap<>(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: collection type argument = " + collectionTypes); - } while (collectionResultSet.next()) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: adding to the map"); - } - //plugin.getLogger().info("DEBUG: collectionResultSet size = " + collectionResultSet.getFetchSize()); // Work through the columns // Key Object key = deserialize(collectionResultSet.getObject(1),Class.forName(keyType.getTypeName())); - if (DEBUG) { - plugin.getLogger().info("DEBUG: key = " + key); - } Object mapValue = deserialize(collectionResultSet.getObject(2),Class.forName(valueType.getTypeName())); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value = " + mapValue); - } ((Map) value).put(key,mapValue); } } else { @@ -819,31 +713,14 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } } } else { - if (DEBUG) { - plugin.getLogger().info("DEBUG: regular type"); - } value = deserialize(value, propertyDescriptor.getPropertyType()); } // Adapter // Check if there is an annotation on the field Adapter adapterNotation = field.getAnnotation(Adapter.class); if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: there is an adapter"); - } // A conversion adapter has been defined value = ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value now after deserialization = " + value); - } - } - if (DEBUG) { - plugin.getLogger().info("DEBUG: invoking method " + method.getName()); - if (value == null) { - plugin.getLogger().info("DEBUG: value = null"); - } else { - plugin.getLogger().info("DEBUG: value class = " + value.getClass().getName()); - } } // Write the value to the class method.invoke(instance, value); @@ -863,9 +740,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { */ @SuppressWarnings({ "unchecked", "rawtypes" }) private Object deserialize(Object value, Class clazz) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: deserialize - class is " + clazz.getTypeName()); - } if (value instanceof String && value.equals("null")) { // If the value is null as a string, return null return null; @@ -905,9 +779,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException, SQLException, NoSuchMethodException, SecurityException { // Delete this object from all tables - - //PreparedStatement preparedStatement = null; - // Try to connect to the database try (Connection conn = databaseConnecter.createConnection()){ // Get the uniqueId. As each class extends DataObject, it must have this method in it. @@ -924,9 +795,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { // Second is the unique ID preparedStatement.setString(1, uniqueId); preparedStatement.addBatch(); - if (DEBUG) { - plugin.getLogger().info("DEBUG: DELETE Query " + preparedStatement.toString()); - } preparedStatement.executeBatch(); } @@ -946,9 +814,6 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { preparedStatement2.setString(1, uniqueId); preparedStatement2.addBatch(); // Execute - if (DEBUG) { - plugin.getLogger().info(() -> "DEBUG: " + preparedStatement2.toString()); // Evaluated lazily - } preparedStatement2.executeBatch(); } } @@ -957,13 +822,10 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { } /* (non-Javadoc) - * @see us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler#objectExits(java.lang.String) + * @see us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler#objectExists(java.lang.String) */ @Override - public boolean objectExits(String key) { - if (DEBUG) { - plugin.getLogger().info("DEBUG: checking if " + key + " exists in the database"); - } + public boolean objectExists(String key) { // Create the query to see if this key exists StringBuilder query = new StringBuilder(); query.append("SELECT IF ( EXISTS( SELECT * FROM `"); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java index 752d9128f..dd212dc2f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/PanelListenerManager.java @@ -1,6 +1,7 @@ package us.tastybento.bskyblock.listeners; import java.util.HashMap; +import java.util.Map; import java.util.UUID; import org.bukkit.event.EventHandler; @@ -17,8 +18,6 @@ import us.tastybento.bskyblock.api.panels.Panel; public class PanelListenerManager implements Listener { - //private static final boolean DEBUG = false; - private static HashMap openPanels = new HashMap<>(); @EventHandler(priority = EventPriority.LOWEST) @@ -28,11 +27,11 @@ public class PanelListenerManager implements Listener { //UUID playerUUID = player.getUniqueId(); Inventory inventory = event.getInventory(); // The inventory that was // Open the inventory panel that this player has open (they can only ever have one) - if (getOpenPanels().containsKey(user.getUniqueId())) { + if (openPanels.containsKey(user.getUniqueId())) { // Check the name of the panel - if (inventory.getName().equals(getOpenPanels().get(user.getUniqueId()).getInventory().getName())) { + if (inventory.getName().equals(openPanels.get(user.getUniqueId()).getInventory().getName())) { // Get the panel itself - Panel panel = getOpenPanels().get(user.getUniqueId()); + Panel panel = openPanels.get(user.getUniqueId()); // Check that they clicked on a specific item for (int slot : panel.getItems().keySet()) { if (slot == event.getRawSlot()) { @@ -48,29 +47,29 @@ public class PanelListenerManager implements Listener { } } else { // Wrong name - delete this panel - getOpenPanels().remove(user.getUniqueId()); + openPanels.remove(user.getUniqueId()); } } } @EventHandler(priority = EventPriority.LOWEST) public void onInventoryClose(InventoryCloseEvent event) { - if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) { - getOpenPanels().remove(event.getPlayer().getUniqueId()); + if (openPanels.containsKey(event.getPlayer().getUniqueId())) { + openPanels.remove(event.getPlayer().getUniqueId()); } } @EventHandler(priority = EventPriority.NORMAL) public void onLogOut(PlayerQuitEvent event) { - if (getOpenPanels().containsKey(event.getPlayer().getUniqueId())) { - getOpenPanels().remove(event.getPlayer().getUniqueId()); + if (openPanels.containsKey(event.getPlayer().getUniqueId())) { + openPanels.remove(event.getPlayer().getUniqueId()); } } /** * @return the openPanels */ - public static HashMap getOpenPanels() { + public static Map getOpenPanels() { return openPanels; } diff --git a/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java new file mode 100644 index 000000000..7ff2999d2 --- /dev/null +++ b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java @@ -0,0 +1,198 @@ +/** + * + */ +package us.tastybento.bskyblock.database.mysql; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.beans.IntrospectionException; +import java.sql.Statement; +import java.lang.reflect.InvocationTargetException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; + +import us.tastybento.bskyblock.BSkyBlock; + +/** + * @author ben + * + */ +public class MySQLDatabaseHandlerTest { + + private static MySQLDatabaseHandler handler; + private static MySQLDatabaseHandlerTestDataObject instance; + private static String UNIQUE_ID = "xyz"; + + /** + * @throws java.lang.Exception + */ + @BeforeClass + public static void setUp() throws Exception { + BSkyBlock plugin = mock(BSkyBlock.class); + MySQLDatabaseConnecter dbConn = mock(MySQLDatabaseConnecter.class); + Connection connection = mock(Connection.class); + when(dbConn.createConnection()).thenReturn(connection); + PreparedStatement ps = mock(PreparedStatement.class); + when(connection.prepareStatement(Mockito.anyString())).thenReturn(ps); + Statement statement = mock(Statement.class); + when(connection.createStatement()).thenReturn(statement); + ResultSet rs = mock(ResultSet.class); + when(ps.executeQuery()).thenReturn(rs); + when(statement.executeQuery(Mockito.anyString())).thenReturn(rs); + instance = new MySQLDatabaseHandlerTestDataObject(); + instance.setUniqueId(UNIQUE_ID); + handler = new MySQLDatabaseHandler<>(plugin, MySQLDatabaseHandlerTestDataObject.class, dbConn); + + } + + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#getColumns(boolean)}. + */ + @Test + public void testGetColumns() { + // This should be a list of 20 ?'s which related to the 20 + assertEquals("?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?", handler.getColumns(true)); + assertEquals("`uniqueId`, `center`, `range`, `minX`, `minZ`, `minProtectedX`, `minProtectedZ`, " + + "`protectionRange`, `world`, `name`, `createdDate`, `updatedDate`, `owner`, `members`, `locked`, " + + "`spawn`, `purgeProtected`, `flags`, `levelHandicap`, `spawnPoint`", + handler.getColumns(false)); + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#createSelectQuery()}. + */ + @Test + public void testCreateSelectQuery() { + assertEquals("SELECT `uniqueId`, `center`, `range`, `minX`, `minZ`, `minProtectedX`, " + + "`minProtectedZ`, `protectionRange`, `world`, `name`, `createdDate`, `updatedDate`, " + + "`owner`, `members`, `locked`, `spawn`, `purgeProtected`, `flags`, `levelHandicap`, " + + "`spawnPoint` FROM `us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandlerTestDataObject`", + handler.createSelectQuery()); + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#createInsertQuery()}. + */ + @Test + public void testCreateInsertQuery() { + assertEquals("REPLACE INTO `us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandlerTestDataObject`(`uniqueId`, " + + "`center`, `range`, `minX`, `minZ`, `minProtectedX`, `minProtectedZ`, `protectionRange`, " + + "`world`, `name`, `createdDate`, `updatedDate`, `owner`, `members`, `locked`, `spawn`, " + + "`purgeProtected`, `flags`, `levelHandicap`, `spawnPoint`) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + handler.createInsertQuery()); + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#createDeleteQuery()}. + */ + @Test + public void testCreateDeleteQuery() { + assertEquals("DELETE FROM [table_name] WHERE uniqueId = ?", handler.createDeleteQuery()); + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#loadObjects()}. + */ + @Test + public void testLoadObjects() { + try { + java.util.List result = handler.loadObjects(); + System.out.println("Size of result " + result.size()); + } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException + | InvocationTargetException | ClassNotFoundException | SQLException | IntrospectionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#loadObject(java.lang.String)}. + */ + @Test + public void testLoadObject() { + try { + MySQLDatabaseHandlerTestDataObject obj = (MySQLDatabaseHandlerTestDataObject) handler.loadObject(UNIQUE_ID); + assertNull(obj); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | SecurityException | ClassNotFoundException | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#saveObject(java.lang.Object)}. + */ + @Test + public void testSaveObject() { + try { + handler.saveObject(instance); + } catch (SecurityException | IllegalArgumentException | InstantiationException | IllegalAccessException + | InvocationTargetException | NoSuchMethodException | SQLException | IntrospectionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#deleteObject(java.lang.Object)}. + */ + @Test + public void testDeleteObject() { + try { + handler.deleteObject(instance); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException + | SecurityException | IntrospectionException | SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#objectExists(java.lang.String)}. + */ + @Test + public void testObjectExits() { + // This right now is not tested properly + assertFalse(handler.objectExists(UNIQUE_ID)); + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#saveSettings(java.lang.Object)}. + */ + @Test + public void testSaveSettings() { + try { + handler.saveSettings(instance); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException + | IntrospectionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * Test method for {@link us.tastybento.bskyblock.database.mysql.MySQLDatabaseHandler#loadSettings(java.lang.String, java.lang.Object)}. + */ + @Test + public void testLoadSettings() { + try { + handler.loadSettings(UNIQUE_ID, instance); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | ClassNotFoundException | IntrospectionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTestDataObject.java b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTestDataObject.java new file mode 100644 index 000000000..5e0b88a91 --- /dev/null +++ b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTestDataObject.java @@ -0,0 +1,349 @@ +package us.tastybento.bskyblock.database.mysql; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.World; + +import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.database.objects.DataObject; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; + + +public class MySQLDatabaseHandlerTestDataObject implements DataObject { + + private String uniqueId = ""; + + //// Island //// + // The center of the island itself + private Location center; + + // Island range + private int range; + + // Coordinates of the island area + private int minX; + + private int minZ; + + // Coordinates of minimum protected area + private int minProtectedX; + + private int minProtectedZ; + + // Protection size + private int protectionRange; + + // World the island is in + private World world; + + // Display name + private String name; + + // Time parameters + private long createdDate; + + private long updatedDate; + + //// Team //// + private UUID owner; + private HashMap members = new HashMap<>(); + + //// State //// + private boolean locked = false; + private boolean spawn = false; + + private boolean purgeProtected = false; + + //// Protection flags //// + @Adapter(FlagSerializer.class) + private HashMap flags = new HashMap<>(); + + private int levelHandicap; + private Location spawnPoint; + + public MySQLDatabaseHandlerTestDataObject() {} + + /** + * @return the uniqueId + */ + public String getUniqueId() { + return uniqueId; + } + + /** + * @param uniqueId the uniqueId to set + */ + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + + /** + * @return the center + */ + public Location getCenter() { + return center; + } + + /** + * @param center the center to set + */ + public void setCenter(Location center) { + this.center = center; + } + + /** + * @return the range + */ + public int getRange() { + return range; + } + + /** + * @param range the range to set + */ + public void setRange(int range) { + this.range = range; + } + + /** + * @return the minX + */ + public int getMinX() { + return minX; + } + + /** + * @param minX the minX to set + */ + public void setMinX(int minX) { + this.minX = minX; + } + + /** + * @return the minZ + */ + public int getMinZ() { + return minZ; + } + + /** + * @param minZ the minZ to set + */ + public void setMinZ(int minZ) { + this.minZ = minZ; + } + + /** + * @return the minProtectedX + */ + public int getMinProtectedX() { + return minProtectedX; + } + + /** + * @param minProtectedX the minProtectedX to set + */ + public void setMinProtectedX(int minProtectedX) { + this.minProtectedX = minProtectedX; + } + + /** + * @return the minProtectedZ + */ + public int getMinProtectedZ() { + return minProtectedZ; + } + + /** + * @param minProtectedZ the minProtectedZ to set + */ + public void setMinProtectedZ(int minProtectedZ) { + this.minProtectedZ = minProtectedZ; + } + + /** + * @return the protectionRange + */ + public int getProtectionRange() { + return protectionRange; + } + + /** + * @param protectionRange the protectionRange to set + */ + public void setProtectionRange(int protectionRange) { + this.protectionRange = protectionRange; + } + + /** + * @return the world + */ + public World getWorld() { + return world; + } + + /** + * @param world the world to set + */ + public void setWorld(World world) { + this.world = world; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the createdDate + */ + public long getCreatedDate() { + return createdDate; + } + + /** + * @param createdDate the createdDate to set + */ + public void setCreatedDate(long createdDate) { + this.createdDate = createdDate; + } + + /** + * @return the updatedDate + */ + public long getUpdatedDate() { + return updatedDate; + } + + /** + * @param updatedDate the updatedDate to set + */ + public void setUpdatedDate(long updatedDate) { + this.updatedDate = updatedDate; + } + + /** + * @return the owner + */ + public UUID getOwner() { + return owner; + } + + /** + * @param owner the owner to set + */ + public void setOwner(UUID owner) { + this.owner = owner; + } + + /** + * @return the members + */ + public HashMap getMembers() { + return members; + } + + /** + * @param members the members to set + */ + public void setMembers(HashMap members) { + this.members = members; + } + + /** + * @return the locked + */ + public boolean isLocked() { + return locked; + } + + /** + * @param locked the locked to set + */ + public void setLocked(boolean locked) { + this.locked = locked; + } + + /** + * @return the spawn + */ + public boolean isSpawn() { + return spawn; + } + + /** + * @param spawn the spawn to set + */ + public void setSpawn(boolean spawn) { + this.spawn = spawn; + } + + /** + * @return the purgeProtected + */ + public boolean isPurgeProtected() { + return purgeProtected; + } + + /** + * @param purgeProtected the purgeProtected to set + */ + public void setPurgeProtected(boolean purgeProtected) { + this.purgeProtected = purgeProtected; + } + + /** + * @return the flags + */ + public HashMap getFlags() { + return flags; + } + + /** + * @param flags the flags to set + */ + public void setFlags(HashMap flags) { + this.flags = flags; + } + + /** + * @return the levelHandicap + */ + public int getLevelHandicap() { + return levelHandicap; + } + + /** + * @param levelHandicap the levelHandicap to set + */ + public void setLevelHandicap(int levelHandicap) { + this.levelHandicap = levelHandicap; + } + + /** + * @return the spawnPoint + */ + public Location getSpawnPoint() { + return spawnPoint; + } + + /** + * @param spawnPoint the spawnPoint to set + */ + public void setSpawnPoint(Location spawnPoint) { + this.spawnPoint = spawnPoint; + } + +} \ No newline at end of file From 65245a99f511e283fffcf7fa6904c00c858b62ac Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Sat, 10 Feb 2018 11:00:19 +0100 Subject: [PATCH 84/97] Fixes bug where the help could be seen even though not having the perms --- .../us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java index a03910ff4..397784291 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/DefaultHelpCommand.java @@ -30,6 +30,7 @@ public class DefaultHelpCommand extends CompositeCommand { // Set the usage to what the parent's command is setParameters(parent.getParameters()); setDescription(parent.getDescription()); + setPermission(parent.getPermission()); } @Override From b04602302b61c6a3bbb48539226b6296e871ca37 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Sat, 10 Feb 2018 13:54:27 +0100 Subject: [PATCH 85/97] Internal Placeholders are now working It works, but it is more like a DIY patch thing. It has a few problems with the current implementation : 1. It doesn't suit our "code style" : it uses an Handler instead of a Manager, eg. 2. It is a bit laggy (I've got the feeling that it could be improved) 3. It doesn't hook to other Placeholder APIs for now And a few other things. I think this is more like a Proof of Concept : it will have to be improved in the next weeks. --- .../us/tastybento/bskyblock/BSkyBlock.java | 3 +- .../bskyblock/api/commands/User.java | 4 ++ .../api/placeholders/Placeholder.java | 29 +++++++++ .../PlaceholderAPIInterface.java} | 19 +++--- .../api/placeholders/PlaceholderBuilder.java | 21 +++++++ .../placeholders/PlaceholderHandler.java | 30 ++++----- .../hooks/InternalPlaceholderImpl.java | 47 ++++++++++++++ .../bskyblock/lists/Placeholders.java | 29 +++++++++ .../util/placeholders/Placeholders.java | 63 ------------------- .../hooks/InternalPlaceholderImpl.java | 48 -------------- 10 files changed, 154 insertions(+), 139 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/api/placeholders/Placeholder.java rename src/main/java/us/tastybento/bskyblock/{util/placeholders/PlaceholderInterface.java => api/placeholders/PlaceholderAPIInterface.java} (56%) create mode 100644 src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderBuilder.java rename src/main/java/us/tastybento/bskyblock/{util => api}/placeholders/PlaceholderHandler.java (75%) create mode 100644 src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java create mode 100644 src/main/java/us/tastybento/bskyblock/lists/Placeholders.java delete mode 100644 src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java delete mode 100644 src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java diff --git a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java index ce4595bae..6a5cfe4c2 100755 --- a/src/main/java/us/tastybento/bskyblock/BSkyBlock.java +++ b/src/main/java/us/tastybento/bskyblock/BSkyBlock.java @@ -3,6 +3,7 @@ package us.tastybento.bskyblock; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import us.tastybento.bskyblock.api.placeholders.PlaceholderHandler; import us.tastybento.bskyblock.commands.AdminCommand; import us.tastybento.bskyblock.commands.IslandCommand; import us.tastybento.bskyblock.database.BSBDatabase; @@ -96,11 +97,11 @@ public class BSkyBlock extends JavaPlugin { islandsManager.load(); localesManager = new LocalesManager(plugin); + PlaceholderHandler.register(plugin); // Register Listeners registerListeners(); - // Load addons addonsManager = new AddonsManager(plugin); addonsManager.enableAddons(); diff --git a/src/main/java/us/tastybento/bskyblock/api/commands/User.java b/src/main/java/us/tastybento/bskyblock/api/commands/User.java index 6f3e256c3..954a6f30d 100644 --- a/src/main/java/us/tastybento/bskyblock/api/commands/User.java +++ b/src/main/java/us/tastybento/bskyblock/api/commands/User.java @@ -17,6 +17,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.permissions.PermissionAttachmentInfo; import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.placeholders.PlaceholderHandler; /** * BSB's user object. Wraps Player. @@ -172,6 +173,9 @@ public class User { } } + // Replace placeholders + translation = PlaceholderHandler.replacePlaceholders(this, translation); + return ChatColor.translateAlternateColorCodes('&', translation); } diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/Placeholder.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/Placeholder.java new file mode 100644 index 000000000..acfa8a309 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/Placeholder.java @@ -0,0 +1,29 @@ +package us.tastybento.bskyblock.api.placeholders; + +import us.tastybento.bskyblock.api.commands.User; + +/** + * @author Poslovitch + */ +public class Placeholder { + + private String identifier; + private PlaceholderRequest request; + + Placeholder(String identifier, PlaceholderRequest request) { + this.identifier = identifier; + this.request = request; + } + + public String getIdentifier() { + return this.identifier; + } + + public PlaceholderRequest getRequest() { + return request; + } + + public interface PlaceholderRequest { + String request(User user); + } +} diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderAPIInterface.java similarity index 56% rename from src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java rename to src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderAPIInterface.java index a3911b814..70c6d77ee 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderInterface.java +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderAPIInterface.java @@ -1,40 +1,39 @@ -package us.tastybento.bskyblock.util.placeholders; - -import org.bukkit.command.CommandSender; +package us.tastybento.bskyblock.api.placeholders; import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; /** * Simple interface for every Placeholder API. * * @author Poslovitch */ -public interface PlaceholderInterface { +public interface PlaceholderAPIInterface { /** - * Get the name of the Placeholder API + * Gets the name of the Placeholder API * @return name of the placeholder plugin */ String getName(); /** - * Register the placeholder API + * Registers the placeholder API * @param plugin - * @return true if registered + * @return true if successfully registered */ boolean register(BSkyBlock plugin); /** - * Unregister the placeholder API + * Unregisters the placeholder API * @param plugin */ void unregister(BSkyBlock plugin); /** * Replace placeholders in the message according to the receiver - * @param sender + * @param receiver * @param message * @return updated message */ - String replacePlaceholders(CommandSender receiver, String message); + String replacePlaceholders(User receiver, String message); } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderBuilder.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderBuilder.java new file mode 100644 index 000000000..226218dab --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderBuilder.java @@ -0,0 +1,21 @@ +package us.tastybento.bskyblock.api.placeholders; + +public class PlaceholderBuilder { + + private String identifier; + private Placeholder.PlaceholderRequest value; + + public PlaceholderBuilder identifier(String identifier) { + this.identifier = identifier; + return this; + } + + public PlaceholderBuilder value(Placeholder.PlaceholderRequest value) { + this.value = value; + return this; + } + + public Placeholder build() { + return new Placeholder(identifier, value); + } +} diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java similarity index 75% rename from src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java rename to src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java index e20e6e91e..73a187fca 100644 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java @@ -1,12 +1,12 @@ -package us.tastybento.bskyblock.util.placeholders; +package us.tastybento.bskyblock.api.placeholders; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.bukkit.command.CommandSender; - import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.lists.Placeholders; /** * Handles hooks with other Placeholder APIs. @@ -14,7 +14,7 @@ import us.tastybento.bskyblock.BSkyBlock; * @author Poslovitch, Tastybento */ public class PlaceholderHandler { - private static final String PACKAGE = "us.tastybento.bskyblock.util.placeholders.hooks."; + private static final String PACKAGE = "us.tastybento.bskyblock.api.placeholders.hooks."; /** * List of API classes in the package specified above (except the Internal one) */ @@ -22,7 +22,7 @@ public class PlaceholderHandler { //TODO }; - private static List apis = new ArrayList<>(); + private static List apis = new ArrayList<>(); /** * Register placeholders and hooks @@ -30,12 +30,12 @@ public class PlaceholderHandler { */ public static void register(BSkyBlock plugin){ // Register placeholders - new Placeholders(plugin); + new Placeholders(); // Load Internal Placeholder API try{ Class clazz = Class.forName(PACKAGE + "InternalPlaceholderImpl"); - PlaceholderInterface internal = (PlaceholderInterface)clazz.newInstance(); + PlaceholderAPIInterface internal = (PlaceholderAPIInterface)clazz.newInstance(); apis.add(internal); } catch (Exception e){ // Should never happen. @@ -47,7 +47,7 @@ public class PlaceholderHandler { if(plugin.getServer().getPluginManager().isPluginEnabled(hook)){ try{ Class clazz = Class.forName(PACKAGE + hook + "PlaceholderImpl"); - PlaceholderInterface api = (PlaceholderInterface)clazz.newInstance(); + PlaceholderAPIInterface api = (PlaceholderAPIInterface)clazz.newInstance(); if(api.register(plugin)){ plugin.getLogger().info("Hooked placeholders into " + hook); apis.add(api); @@ -66,9 +66,9 @@ public class PlaceholderHandler { * @param plugin */ public static void unregister(BSkyBlock plugin){ - Iterator it = apis.iterator(); + Iterator it = apis.iterator(); while (it.hasNext()) { - PlaceholderInterface api = it.next(); + PlaceholderAPIInterface api = it.next(); api.unregister(plugin); it.remove(); } @@ -80,12 +80,8 @@ public class PlaceholderHandler { * @param message * @return updated message */ - public static String replacePlaceholders(CommandSender receiver, String message){ - if(message == null || message.isEmpty()) { - return ""; - } - - for(PlaceholderInterface api : apis){ + public static String replacePlaceholders(User receiver, String message){ + for(PlaceholderAPIInterface api : apis){ message = api.replacePlaceholders(receiver, message); } @@ -96,6 +92,6 @@ public class PlaceholderHandler { * @return true if APIs are registered (including Internal), otherwise false */ public static boolean hasHooks(){ - return apis != null ? true : false; + return apis != null; } } diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java new file mode 100644 index 000000000..993e6a2e2 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java @@ -0,0 +1,47 @@ +package us.tastybento.bskyblock.api.placeholders.hooks; + +import java.util.regex.Pattern; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.commands.User; +import us.tastybento.bskyblock.api.placeholders.Placeholder; +import us.tastybento.bskyblock.api.placeholders.PlaceholderAPIInterface; +import us.tastybento.bskyblock.lists.Placeholders; + +/** + * Built-in placeholder API + * + * @author Poslovitch + */ +public class InternalPlaceholderImpl implements PlaceholderAPIInterface { + + @Override + public String getName() { + return "Internal"; + } + + @Override + public boolean register(BSkyBlock plugin) { + return true; + } + + @Override + public void unregister(BSkyBlock plugin) { + // Useless : it would disable the placeholders. + } + + @Override + public String replacePlaceholders(User receiver, String message) { + if(message == null || message.isEmpty()) { + return ""; + } + + for(Placeholder placeholder : Placeholders.values()){ + String identifier = "%" + placeholder.getIdentifier() + "%"; + message = message.replaceAll(identifier, placeholder.getRequest().request(receiver)); + } + + return message; + } + +} diff --git a/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java new file mode 100644 index 000000000..384f3a248 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java @@ -0,0 +1,29 @@ +package us.tastybento.bskyblock.lists; + +import org.bukkit.Bukkit; +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.placeholders.Placeholder; +import us.tastybento.bskyblock.api.placeholders.PlaceholderBuilder; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class Placeholders { + + public static final Placeholder PLUGIN_NAME = new PlaceholderBuilder().identifier("bsb_plugin_name").value((user) -> BSkyBlock.getInstance().getDescription().getName()).build(); + + /** + * @return List of all the flags in this class + */ + public static List values() { + return Arrays.asList(Placeholders.class.getFields()).stream().map(field -> { + try { + return (Placeholder)field.get(null); + } catch (IllegalArgumentException | IllegalAccessException e) { + Bukkit.getLogger().severe("Could not get Placeholders values " + e.getMessage()); + } + return null; + }).collect(Collectors.toList()); + } +} diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java deleted file mode 100644 index 8e3ab2d37..000000000 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/Placeholders.java +++ /dev/null @@ -1,63 +0,0 @@ -package us.tastybento.bskyblock.util.placeholders; - -import java.util.HashSet; -import java.util.Set; - -import org.bukkit.command.CommandSender; - -import us.tastybento.bskyblock.BSkyBlock; - -/** - * Register placeholders - * - * @author Poslovitch - */ -public class Placeholders { - private static Set placeholders = new HashSet<>(); - - private BSkyBlock plugin; - - protected Placeholders(BSkyBlock plugin){ - this.plugin = plugin; - register(); - } - - private void register(){ - /* PLUGIN */ - new Placeholder("bsb_name"){ - @Override - public String onRequest(CommandSender receiver) { - return plugin.getDescription().getName(); - } - }; - - new Placeholder("bsb_version") { - - @Override - public String onRequest(CommandSender receiver) { - return plugin.getDescription().getVersion(); - } - }; - - //TODO: add more placeholders - } - - public static Set getPlaceholders(){ - return placeholders; - } - - public abstract class Placeholder{ - private String identifier; - - protected Placeholder(String identifier){ - this.identifier = identifier; - placeholders.add(this); - } - - public String getIdentifier(){ - return identifier; - } - - public abstract String onRequest(CommandSender receiver); - } -} diff --git a/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java b/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java deleted file mode 100644 index 4bb25e04f..000000000 --- a/src/main/java/us/tastybento/bskyblock/util/placeholders/hooks/InternalPlaceholderImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package us.tastybento.bskyblock.util.placeholders.hooks; - -import java.util.regex.Pattern; - -import org.bukkit.command.CommandSender; - -import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.util.placeholders.PlaceholderInterface; -import us.tastybento.bskyblock.util.placeholders.Placeholders; -import us.tastybento.bskyblock.util.placeholders.Placeholders.Placeholder; - -/** - * Built-in placeholder API - * - * @author Poslovitch - */ -public class InternalPlaceholderImpl implements PlaceholderInterface{ - - @Override - public String getName() { - return "Internal"; - } - - @Override - public boolean register(BSkyBlock plugin) { - return true; - } - - @Override - public void unregister(BSkyBlock plugin) { - // Useless : it would disable the placeholders. - } - - @Override - public String replacePlaceholders(CommandSender receiver, String message) { - if(message == null || message.isEmpty()) { - return ""; - } - - for(Placeholder placeholder : Placeholders.getPlaceholders()){ - String identifier = "{" + placeholder.getIdentifier() + "}"; - message = message.replaceAll(Pattern.quote(identifier), placeholder.onRequest(receiver)); - } - - return message; - } - -} From 4bd02a59efcd6c83b16202b915e21d70aebd6001 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Sat, 10 Feb 2018 17:03:57 +0100 Subject: [PATCH 86/97] Added description to /bsb (reload and version) + added some aliases --- .../us/tastybento/bskyblock/commands/AdminCommand.java | 2 +- .../bskyblock/commands/admin/AdminReloadCommand.java | 9 +++------ .../bskyblock/commands/admin/AdminVersionCommand.java | 3 ++- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java index d1ac7d079..89b201ec5 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/AdminCommand.java @@ -19,7 +19,7 @@ public class AdminCommand extends CompositeCommand { public void setup() { setPermission(Constants.PERMPREFIX + "admin.*"); setOnlyPlayer(false); - setDescription("admin.help.description"); + setDescription("commands.admin.help.description"); new AdminVersionCommand(this); new AdminReloadCommand(this); new AdminTeleportCommand(this); diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java index 31f0d30ae..3134f2aef 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminReloadCommand.java @@ -9,18 +9,16 @@ import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; /** - * @author ben + * @author tastybento * */ public class AdminReloadCommand extends CompositeCommand { /** * @param parent - * @param label - * @param aliases */ public AdminReloadCommand(CompositeCommand parent) { - super(parent, "reload"); + super(parent, "reload", "rl"); } /* (non-Javadoc) @@ -28,8 +26,7 @@ public class AdminReloadCommand extends CompositeCommand { */ @Override public void setup() { - // TODO Auto-generated method stub - + setDescription("commands.admin.reload.description"); } /* (non-Javadoc) diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java index 6eee377de..d41b7d482 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminVersionCommand.java @@ -9,13 +9,14 @@ import us.tastybento.bskyblock.api.commands.User; public class AdminVersionCommand extends CompositeCommand { public AdminVersionCommand(CompositeCommand adminCommand) { - super(adminCommand, "version"); + super(adminCommand, "version", "v"); } @Override public void setup() { // Permission setPermission(Constants.PERMPREFIX + "admin.version"); + setDescription("commands.admin.version.description"); } @Override From ed65aa421d70ae92070ee05c311ac07bc623571b Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 13:09:32 -0800 Subject: [PATCH 87/97] Rewrote SafeSpotTeleport Moved coords to longs instead of ints for island locations Created a SafeTeleportBuilder class Created a utility Pair class --- .../commands/admin/AdminTeleportCommand.java | 1 - .../database/managers/island/IslandCache.java | 18 +- .../managers/island/IslandsManager.java | 4 +- .../bskyblock/database/objects/Island.java | 51 ++- .../bskyblock/generators/IslandWorld.java | 6 +- .../bskyblock/util/DeleteIslandChunks.java | 8 +- .../us/tastybento/bskyblock/util/Pair.java | 65 ++++ .../bskyblock/util/SafeSpotTeleport.java | 351 ++++++++++-------- .../bskyblock/util/SafeTeleportBuilder.java | 10 +- 9 files changed, 308 insertions(+), 206 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/util/Pair.java diff --git a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java index 0a63711a3..661a22b4b 100644 --- a/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/admin/AdminTeleportCommand.java @@ -8,7 +8,6 @@ import org.bukkit.Location; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.api.commands.CompositeCommand; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.util.SafeSpotTeleport; import us.tastybento.bskyblock.util.SafeTeleportBuilder; public class AdminTeleportCommand extends CompositeCommand { diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index 76e44029c..a40c8337d 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -30,7 +30,7 @@ public class IslandCache { */ private HashMap islandsByUUID; // 2D islandGrid of islands, x,z - private TreeMap> islandGrid = new TreeMap<>(); + private TreeMap> islandGrid = new TreeMap<>(); public IslandCache() { islandsByLocation = HashBiMap.create(); @@ -72,7 +72,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: min x is in the grid :" + newIsland.getMinX()); } - TreeMap zEntry = islandGrid.get(newIsland.getMinX()); + TreeMap zEntry = islandGrid.get(newIsland.getMinX()); if (zEntry.containsKey(newIsland.getMinZ())) { if (DEBUG) { plugin.getLogger().info("DEBUG: min z is in the grid :" + newIsland.getMinZ()); @@ -111,7 +111,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: added island to grid at " + newIsland.getMinX() + "," + newIsland.getMinZ()); } - TreeMap zEntry = new TreeMap<>(); + TreeMap zEntry = new TreeMap<>(); zEntry.put(newIsland.getMinZ(), newIsland); islandGrid.put(newIsland.getMinX(), zEntry); } @@ -177,8 +177,8 @@ public class IslandCache { plugin.getLogger().info("DEBUG: deleting island at " + island.getCenter()); } if (island != null) { - int x = island.getMinX(); - int z = island.getMinZ(); + long x = island.getMinX(); + long z = island.getMinZ(); if (DEBUG) { plugin.getLogger().info("DEBUG: x = " + x + " z = " + z); } @@ -186,7 +186,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: x found"); } - TreeMap zEntry = islandGrid.get(x); + TreeMap zEntry = islandGrid.get(x); if (zEntry.containsKey(z)) { if (DEBUG) { plugin.getLogger().info("DEBUG: z found - deleting the island"); @@ -228,14 +228,14 @@ public class IslandCache { * @param z * @return Island or null */ - public Island getIslandAt(int x, int z) { + public Island getIslandAt(long x, long z) { if (DEBUG2) { plugin.getLogger().info("DEBUG: getting island at " + x + "," + z); plugin.getLogger().info("DEBUG: island grid is " + islandGrid.size()); } - Entry> en = islandGrid.floorEntry(x); + Entry> en = islandGrid.floorEntry(x); if (en != null) { - Entry ent = en.getValue().floorEntry(z); + Entry ent = en.getValue().floorEntry(z); if (ent != null) { // Check if in the island range Island island = ent.getValue(); diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java index 62f604173..202f35248 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandsManager.java @@ -626,8 +626,8 @@ public class IslandsManager { } // Try to fix this teleport location and teleport the player if possible new SafeTeleportBuilder(plugin).entity(player) - .location(plugin.getPlayers().getHomeLocation(player.getUniqueId(), number)) - .setHome(true) + .island(plugin.getIslands().getIsland(player.getUniqueId())) + .portal(false) .homeNumber(number) .build(); return; diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 7baff9195..787445ae5 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -25,6 +25,7 @@ import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.objects.adapters.Adapter; import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; import us.tastybento.bskyblock.managers.RanksManager; +import us.tastybento.bskyblock.util.Pair; import us.tastybento.bskyblock.util.Util; /** @@ -47,14 +48,14 @@ public class Island implements DataObject { private int range; // Coordinates of the island area - private int minX; + private long minX; - private int minZ; + private long minZ; // Coordinates of minimum protected area - private int minProtectedX; + private long minProtectedX; - private int minProtectedZ; + private long minProtectedZ; // Protection size private int protectionRange; @@ -212,28 +213,28 @@ public class Island implements DataObject { /** * @return the minProtectedX */ - public int getMinProtectedX() { + public long getMinProtectedX() { return minProtectedX; } /** * @return the minProtectedZ */ - public int getMinProtectedZ() { + public long getMinProtectedZ() { return minProtectedZ; } /** * @return the minX */ - public int getMinX() { + public long getMinX() { return minX; } /** * @return the minZ */ - public int getMinZ() { + public long getMinZ() { return minZ; } @@ -315,8 +316,8 @@ public class Island implements DataObject { */ public int getTileEntityCount(Material material, World world) { int result = 0; - for (int x = getMinProtectedX() /16; x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { - for (int z = getMinProtectedZ() /16; z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { + for (int x = (int) (getMinProtectedX() /16); x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { + for (int z = (int) (getMinProtectedZ() /16); z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { for (BlockState holder : world.getChunkAt(x, z).getTileEntities()) { //plugin.getLogger().info("DEBUG: tile entity: " + holder.getType()); if (onIsland(holder.getLocation())) { @@ -396,22 +397,31 @@ public class Island implements DataObject { return center.getBlockZ(); } + public boolean inIslandSpace(Location location) { + if (Util.inWorld(location)) { + return inIslandSpace(location.getBlockX(), location.getBlockZ()); + } + return false; + } + /** * Checks if coords are in the island space * @param x * @param z * @return true if in the island space */ - public boolean inIslandSpace(int x, int z) { + public boolean inIslandSpace(long x, long z) { //Bukkit.getLogger().info("DEBUG: center - " + center); return x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2; } - public boolean inIslandSpace(Location location) { - if (Util.inWorld(location)) { - return inIslandSpace(location.getBlockX(), location.getBlockZ()); - } - return false; + /** + * Checks if the coords are in island space + * @param blockCoord + * @return true or false + */ + public boolean inIslandSpace(Pair blockCoord) { + return inIslandSpace(blockCoord.x, blockCoord.z); } /** @@ -567,28 +577,29 @@ public class Island implements DataObject { /** * @param minProtectedX the minProtectedX to set */ - public void setMinProtectedX(int minProtectedX) { + public final void setMinProtectedX(long minProtectedX) { this.minProtectedX = minProtectedX; } /** * @param minProtectedZ the minProtectedZ to set */ - public void setMinProtectedZ(int minProtectedZ) { + public final void setMinProtectedZ(long minProtectedZ) { this.minProtectedZ = minProtectedZ; } /** * @param minX the minX to set */ - public void setMinX(int minX) { + public final void setMinX(long minX) { this.minX = minX; } + /** * @param minZ the minZ to set */ - public void setMinZ(int minZ) { + public final void setMinZ(long minZ) { this.minZ = minZ; } diff --git a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java index 580196ac0..b3597f4f8 100644 --- a/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java +++ b/src/main/java/us/tastybento/bskyblock/generators/IslandWorld.java @@ -16,9 +16,9 @@ public class IslandWorld { private static final String CREATING = "Creating "; private BSkyBlock plugin; - private static World islandWorld; - private static World netherWorld; - private static World endWorld; + private World islandWorld; + private World netherWorld; + private World endWorld; /** * Generates the Skyblock worlds. diff --git a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java index 77dc3de73..f8dd49b73 100644 --- a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java +++ b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java @@ -34,10 +34,10 @@ public class DeleteIslandChunks { if (world == null) { return; } - int minXChunk = island.getMinX() / 16; - int maxXChunk = (island.getRange() * 2 + island.getMinX() - 1) /16; - int minZChunk = island.getMinZ() / 16; - int maxZChunk = (island.getRange() * 2 + island.getMinZ() - 1) /16; + int minXChunk = (int) (island.getMinX() / 16); + int maxXChunk = (int) ((island.getRange() * 2 + island.getMinX() - 1) /16); + int minZChunk = (int) (island.getMinZ() / 16); + int maxZChunk = (int) ((island.getRange() * 2 + island.getMinZ() - 1) /16); for (int x = minXChunk; x <= maxXChunk; x++) { for (int z = minZChunk; z<=maxZChunk; z++) { world.regenerateChunk(x, z); diff --git a/src/main/java/us/tastybento/bskyblock/util/Pair.java b/src/main/java/us/tastybento/bskyblock/util/Pair.java new file mode 100644 index 000000000..15c0a5b00 --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/util/Pair.java @@ -0,0 +1,65 @@ +package us.tastybento.bskyblock.util; + + +public class Pair { + public X x; + public Z z; + + public Pair(X x, Z z) { + this.x = x; + this.z = z; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Pair [x=" + x + ", z=" + z + "]"; + } + + /* (non-Javadoc) + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((x == null) ? 0 : x.hashCode()); + result = prime * result + ((z == null) ? 0 : z.hashCode()); + return result; + } + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof Pair)) { + return false; + } + Pair other = (Pair) obj; + if (x == null) { + if (other.x != null) { + return false; + } + } else if (!x.equals(other.x)) { + return false; + } + if (z == null) { + if (other.z != null) { + return false; + } + } else if (!z.equals(other.z)) { + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index eb90c2804..f41073336 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -1,21 +1,22 @@ package us.tastybento.bskyblock.util; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.Optional; +import org.bukkit.Bukkit; import org.bukkit.ChunkSnapshot; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.World.Environment; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.database.objects.Island; /** @@ -26,197 +27,221 @@ import us.tastybento.bskyblock.database.objects.Island; public class SafeSpotTeleport { private enum State { - CENTER, SURROUNDING, LAST_CHECK, FAILURE, CENTER_WAIT, SURROUNDING_WAIT + CHECKING, WAITING } + private static final int MAX_CHUNKS = 10; private static final long SPEED = 10; - private State step = State.CENTER; + private State step = State.CHECKING; private BukkitTask task; + + // Parameters + private final Entity entity; + private final Location location; + private final boolean portal; + private final int homeNumber; + + // Locations + private Location bestSpot; private BSkyBlock plugin; - private final Entity entity; - private final Location location; - private final int homeNumber; - private final boolean setHome; - private int lastX; - private int lastZ; - private int chunksToCheck = 10; - private int worldHeight = 255; - private World world; - private double safeDistance; - private Vector safeSpotInChunk; - private boolean safeSpotFound; - private Vector portalPart; - private ChunkSnapshot portalChunk; - private ChunkSnapshot safeChunk; + private List> chunksToScan; /** * Teleports and entity to a safe spot on island - * @param plugin2 - * @param entity2 - * @param island + * @param plugin + * @param entity + * @param location * @param failureMessage - * @param setHome2 - * @param homeNumber2 + * @param portal + * @param homeNumber */ - public SafeSpotTeleport(BSkyBlock plugin2, Entity entity2, Location location, String failureMessage, boolean setHome2, - int homeNumber2) { - this.plugin = plugin2; - this.entity = entity2; - this.setHome = setHome2; - this.homeNumber = homeNumber2; + public SafeSpotTeleport(BSkyBlock plugin, Entity entity, Location location, String failureMessage, boolean portal, + int homeNumber) { + this.plugin = plugin; + this.entity = entity; this.location = location; + this.portal = portal; + this.homeNumber = homeNumber; // Put player into spectator mode if (entity instanceof Player && ((Player)entity).getGameMode().equals(GameMode.SURVIVAL)) { ((Player)entity).setGameMode(GameMode.SPECTATOR); } - // Get world info - world = location.getWorld(); - worldHeight = world.getEnvironment().equals(Environment.NETHER) ? world.getMaxHeight() - 20 : world.getMaxHeight() - 2; - // Get island mins and max - Island island = plugin.getIslands().getIslandAt(location).orElse(null); - if (island == null) { - if (entity instanceof Player) { - User.getInstance((Player)entity).sendMessage(failureMessage); - } - return; - } - // Set the minimums and maximums - lastX = island.getMinProtectedX() / 16; - lastZ = island.getMinProtectedZ() / 16; - int biggestX = (island.getMinProtectedX() + island.getProtectionRange() - 1) / 16; - int biggestZ = (island.getMinProtectedZ() + island.getProtectionRange() - 1) / 16; + // Get chunks to scan + chunksToScan = getChunksToScan(); // Start a recurring task until done or cancelled task = plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { + Bukkit.getLogger().info("State = " + step); + Bukkit.getLogger().info("Chunks to scan size = " + chunksToScan.size()); List chunkSnapshot = new ArrayList<>(); switch (step) { - case CENTER: - // Add the center chunk - chunkSnapshot.add(location.toVector().toLocation(world).getChunk().getChunkSnapshot()); - // Add immediately adjacent chunks - for (int x = location.getChunk().getX()-1; x <= location.getChunk().getX()+1; x++) { - for (int z = location.getChunk().getZ()-1; z <= location.getChunk().getZ()+1; z++) { - if (x != location.getChunk().getX() || z != location.getChunk().getZ()) { - chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); - } - } + case CHECKING: + Iterator> it = chunksToScan.iterator(); + if (!it.hasNext()) { + Bukkit.getLogger().info("Nothing left!"); + // Nothing left + tidyUp(entity, failureMessage); + return; + } + // Add chunk snapshots to the list + while (it.hasNext() && chunkSnapshot.size() < MAX_CHUNKS) { + Pair pair = it.next(); + chunkSnapshot.add(location.getWorld().getChunkAt(pair.x, pair.z).getChunkSnapshot()); + it.remove(); } // Move to next step - step = State.CENTER_WAIT; + step = State.WAITING; + Bukkit.getLogger().info("Chunk snapshot size = " + chunkSnapshot.size()); checkChunks(chunkSnapshot); break; - case CENTER_WAIT: - // Do nothing while the center scan is done + case WAITING: + // Do nothing while the scan is done break; - case SURROUNDING: - for (int x = lastX; x <= biggestX; x++) { - for (int z = lastZ; z <= biggestZ; z++) { - chunkSnapshot.add(world.getChunkAt(x, z).getChunkSnapshot()); - if (chunkSnapshot.size() == chunksToCheck) { - lastX = x; - lastZ = z; - step = State.SURROUNDING_WAIT; - checkChunks(chunkSnapshot); - return; - } - } - } - // Last few chunks, may be none - step = State.LAST_CHECK; - checkChunks(chunkSnapshot); - break; - case SURROUNDING_WAIT: - // Do nothing while the surrounding scan is done - break; - case LAST_CHECK: - // Do nothing while the last few chunks are scanned - break; - case FAILURE: - // We are done searching - failure - task.cancel(); - if (entity instanceof Player) { - if (!failureMessage.isEmpty()) { - entity.sendMessage(failureMessage); - } - } } }, 0L, SPEED); } - private boolean checkChunks(List chunkSnapshot) { + private void tidyUp(Entity entity, String failureMessage) { + // Nothing left to check and still not canceled + task.cancel(); + // Check portal + if (portal && bestSpot != null) { + Bukkit.getLogger().info("No portals found, going to best spot"); + // No portals found, teleport to the best spot we found + teleportEntity(bestSpot); + } + // Failed - no safe spot + if (entity instanceof Player && !failureMessage.isEmpty()) { + entity.sendMessage(failureMessage); + } + } + + /** + * Gets a set of chunk coords that will be scanned. + * @param entity + * @param location + * @return + */ + private List> getChunksToScan() { + List> result = new ArrayList<>(); + // Get island if available + Optional island = plugin.getIslands().getIslandAt(location); + int maxRadius = island.map(x -> x.getProtectionRange()).orElse(plugin.getSettings().getIslandProtectionRange()); + Bukkit.getLogger().info("default island radius = " + plugin.getSettings().getIslandProtectionRange()); + Bukkit.getLogger().info("Max radius = " + maxRadius); + int x = location.getBlockX(); + int z = location.getBlockZ(); + // Create ever increasing squares around the target location + int radius = 0; + do { + for (long i = x - radius; i <= x + radius; i++) { + for (long j = z - radius; j <= z + radius; j++) { + + Pair blockCoord = new Pair<>(i,j); + Pair chunkCoord = new Pair<>((int)i/16, (int)j/16); + if (!result.contains(chunkCoord)) { + Bukkit.getLogger().info("Block coord = " + blockCoord); + Bukkit.getLogger().info("New chunk coord " + chunkCoord); + // Add the chunk coord + if (!island.isPresent()) { + // If there is no island, just add it + Bukkit.getLogger().info("No island, adding chunk coord "); + result.add(chunkCoord); + } else { + // If there is an island, only add it if the coord is in island space + island.ifPresent(is -> { + if (is.inIslandSpace(blockCoord)) { + Bukkit.getLogger().info("Island, adding chunk coord"); + result.add(chunkCoord); + } else { + Bukkit.getLogger().info("Island, block coord not in island space"); + } + }); + } + } + } + } + radius++; + } while (radius < maxRadius); + return result; + } + + /** + * Loops through the chunks and if a safe spot is found, fires off the teleportation + * @param chunkSnapshot + */ + private void checkChunks(List chunkSnapshot) { + // Run async task to scan chunks plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { - // Find a safe spot, defined as a solid block, with 2 air spaces above it - //long time = System.nanoTime(); - int x = 0; - int y = 0; - int z = 0; - double distance = 0D; for (ChunkSnapshot chunk: chunkSnapshot) { - // Run through the chunk - for (x = 0; x< 16; x++) { - for (z = 0; z < 16; z++) { - // Work down from the entry point up - for (y = Math.min(chunk.getHighestBlockYAt(x, z), worldHeight); y >= 0; y--) { - //System.out.println("Trying " + (16 * chunk.getX() + x) + " " + y + " " + (16 * chunk.getZ() + z)); - // Check for portal - only if this is not a safe home search - if (!setHome && chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { - if (portalPart == null || (distance > location.toVector().distanceSquared(new Vector(x,y,z)))) { - // First one found or a closer one, save the chunk the position and the distance - portalChunk = chunk; - portalPart = new Vector(x,y,z); - distance = portalPart.distanceSquared(location.toVector()); - } - } - // Check for safe spot, but only if it is closer than one we have found already - if (!safeSpotFound || (safeDistance > location.toVector().distanceSquared(new Vector(x,y,z)))) { - // No safe spot yet, or closer distance - if (checkBlock(chunk,x,y,z, worldHeight)) { - safeChunk = chunk; - safeSpotFound = true; - safeSpotInChunk = new Vector(x,y,z); - safeDistance = location.toVector().distanceSquared(safeSpotInChunk); - } - } - } - } //end z - } // end x - // If this is not a home search do a check for portal - if (!this.setHome) { - checkPortal(); + if (scanChunk(chunk)) { + return; } - - // If successful, teleport otherwise move to the next step in the state machine - if (safeSpotFound) { - task.cancel(); - teleportEntity(); - } else if (step.equals(State.SURROUNDING_WAIT) || step.equals(State.CENTER_WAIT)) { - step = State.SURROUNDING; - } else if (step.equals(State.LAST_CHECK)) { - step = State.FAILURE; - } } + // Nothing happened, change state + step = State.CHECKING; }); - return false; } + /** + * @param chunk + * @return true if a safe spot was found + */ + private boolean scanChunk(ChunkSnapshot chunk) { + Bukkit.getLogger().info("Scanning chunk at " + chunk.getX() + " " + chunk.getZ()); + Bukkit.getLogger().info("Portal = " + portal); + World world = location.getWorld(); + // Max height + int maxHeight = location.getWorld().getMaxHeight() - 20; + // Run through the chunk + for (int x = 0; x< 16; x++) { + for (int z = 0; z < 16; z++) { + // Work down from the entry point up + for (int y = Math.min(chunk.getHighestBlockYAt(x, z), maxHeight); y >= 0; y--) { + if (checkBlock(chunk, x,y,z, maxHeight)) { + Bukkit.getLogger().info("safe: " + x + " " + y + " "+ z); + Vector newSpot = new Vector(chunk.getX() * 16 + x + 0.5D, y + 1, chunk.getZ() * 16 + z + 0.5D); + // Check for portal + if (portal) { + if (chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { + // Teleport as soon as we find a portal + teleportEntity(newSpot.toLocation(world)); + return true; + } else if (bestSpot == null ) { + // Stash the best spot + bestSpot = newSpot.toLocation(world); + } + } else { + // Regular search - teleport as soon as we find something + teleportEntity(newSpot.toLocation(world)); + return true; + } + } + + } + } //end z + } // end x + return false; + } + /** * Teleports entity to the safe spot */ - private void teleportEntity() { - final Vector spot = new Vector((16 *safeChunk.getX()) + 0.5D, 1, (16 * safeChunk.getZ()) + 0.5D).add(safeSpotInChunk); + private void teleportEntity(Location loc) { + task.cancel(); // Return to main thread and teleport the player plugin.getServer().getScheduler().runTask(plugin, () -> { - Location destination = spot.toLocation(world); - if (setHome && entity instanceof Player) { - plugin.getPlayers().setHomeLocation(entity.getUniqueId(), destination, homeNumber); + if (!portal && entity instanceof Player) { + // Set home + plugin.getPlayers().setHomeLocation(entity.getUniqueId(), loc, homeNumber); } Vector velocity = entity.getVelocity(); - entity.teleport(destination); + entity.teleport(loc); // Exit spectator mode if in it if (entity instanceof Player) { Player player = (Player)entity; @@ -230,10 +255,12 @@ public class SafeSpotTeleport { } + /** - * Checks if a portal is safe + * Subscan to find the bottom of the portal */ - private void checkPortal() { + /* + private Location checkPortal() { if (portalPart == null) { return; } @@ -254,7 +281,7 @@ public class SafeSpotTeleport { safeSpotInChunk = new Vector(x,y,z); safeChunk = portalChunk; } - } + }*/ /** * Returns true if the location is a safe one. @@ -265,21 +292,21 @@ public class SafeSpotTeleport { * @param worldHeight * @return */ - @SuppressWarnings("deprecation") private boolean checkBlock(ChunkSnapshot chunk, int x, int y, int z, int worldHeight) { - int type = chunk.getBlockTypeId(x, y, z); - if (type != 0) { // AIR - int space1 = chunk.getBlockTypeId(x, Math.min(y + 1, worldHeight), z); - int space2 = chunk.getBlockTypeId(x, Math.min(y + 2, worldHeight), z); - if ((space1 == 0 && space2 == 0) || (space1 == Material.PORTAL.getId() || space2 == Material.PORTAL.getId())) { + Bukkit.getLogger().info("checking " + x + " " + y + " "+ z); + Material type = chunk.getBlockType(x, y, z); + if (!type.equals(Material.AIR)) { // AIR + Material space1 = chunk.getBlockType(x, Math.min(y + 1, worldHeight), z); + Material space2 = chunk.getBlockType(x, Math.min(y + 2, worldHeight), z); + if ((space1.equals(Material.AIR) && space2.equals(Material.AIR)) + || (space1.equals(Material.PORTAL) && space2.equals(Material.PORTAL))) { // Now there is a chance that this is a safe spot // Check for safe ground - Material mat = Material.getMaterial(type); - if (!mat.toString().contains("FENCE") - && !mat.toString().contains("DOOR") - && !mat.toString().contains("GATE") - && !mat.toString().contains("PLATE")) { - switch (mat) { + if (!type.toString().contains("FENCE") + && !type.toString().contains("DOOR") + && !type.toString().contains("GATE") + && !type.toString().contains("PLATE")) { + switch (type) { // Unsafe case ANVIL: case BARRIER: @@ -307,11 +334,10 @@ public class SafeSpotTeleport { case WATER: case WEB: case WOOD_BUTTON: - //System.out.println("Block is dangerous " + mat.toString()); + //Block is dangerous break; default: // Safe - // System.out.println("Block is safe " + mat.toString()); return true; } } @@ -320,4 +346,5 @@ public class SafeSpotTeleport { return false; } + } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java b/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java index 330eb9549..0489ca453 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeTeleportBuilder.java @@ -11,7 +11,7 @@ public class SafeTeleportBuilder { private BSkyBlock plugin; private Entity entity; private int homeNumber = 0; - private boolean setHome = false; + private boolean portal = false; private String failureMessage = ""; private Location location; @@ -51,12 +51,12 @@ public class SafeTeleportBuilder { } /** - * Set the home of the player to the safe location + * This is a portal teleportation * @param setHome * @return */ - public SafeTeleportBuilder setHome(boolean setHome) { - this.setHome = setHome; + public SafeTeleportBuilder portal(boolean portal) { + this.portal = portal; return this; } @@ -85,7 +85,7 @@ public class SafeTeleportBuilder { * @return */ public SafeSpotTeleport build() { - return new SafeSpotTeleport(plugin, entity, location, failureMessage, setHome, homeNumber); + return new SafeSpotTeleport(plugin, entity, location, failureMessage, portal, homeNumber); } From 65d34f58426b5a1b3dd21284f47ae20d4ca28a47 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 13:19:54 -0800 Subject: [PATCH 88/97] Reverted change of coords to long because not needed. Mincreaft max coords are +/- 30 million. --- .../database/managers/island/IslandCache.java | 18 ++++++------ .../bskyblock/database/objects/Island.java | 28 +++++++++---------- .../bskyblock/util/SafeSpotTeleport.java | 6 ++-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java index a40c8337d..76e44029c 100644 --- a/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java +++ b/src/main/java/us/tastybento/bskyblock/database/managers/island/IslandCache.java @@ -30,7 +30,7 @@ public class IslandCache { */ private HashMap islandsByUUID; // 2D islandGrid of islands, x,z - private TreeMap> islandGrid = new TreeMap<>(); + private TreeMap> islandGrid = new TreeMap<>(); public IslandCache() { islandsByLocation = HashBiMap.create(); @@ -72,7 +72,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: min x is in the grid :" + newIsland.getMinX()); } - TreeMap zEntry = islandGrid.get(newIsland.getMinX()); + TreeMap zEntry = islandGrid.get(newIsland.getMinX()); if (zEntry.containsKey(newIsland.getMinZ())) { if (DEBUG) { plugin.getLogger().info("DEBUG: min z is in the grid :" + newIsland.getMinZ()); @@ -111,7 +111,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: added island to grid at " + newIsland.getMinX() + "," + newIsland.getMinZ()); } - TreeMap zEntry = new TreeMap<>(); + TreeMap zEntry = new TreeMap<>(); zEntry.put(newIsland.getMinZ(), newIsland); islandGrid.put(newIsland.getMinX(), zEntry); } @@ -177,8 +177,8 @@ public class IslandCache { plugin.getLogger().info("DEBUG: deleting island at " + island.getCenter()); } if (island != null) { - long x = island.getMinX(); - long z = island.getMinZ(); + int x = island.getMinX(); + int z = island.getMinZ(); if (DEBUG) { plugin.getLogger().info("DEBUG: x = " + x + " z = " + z); } @@ -186,7 +186,7 @@ public class IslandCache { if (DEBUG) { plugin.getLogger().info("DEBUG: x found"); } - TreeMap zEntry = islandGrid.get(x); + TreeMap zEntry = islandGrid.get(x); if (zEntry.containsKey(z)) { if (DEBUG) { plugin.getLogger().info("DEBUG: z found - deleting the island"); @@ -228,14 +228,14 @@ public class IslandCache { * @param z * @return Island or null */ - public Island getIslandAt(long x, long z) { + public Island getIslandAt(int x, int z) { if (DEBUG2) { plugin.getLogger().info("DEBUG: getting island at " + x + "," + z); plugin.getLogger().info("DEBUG: island grid is " + islandGrid.size()); } - Entry> en = islandGrid.floorEntry(x); + Entry> en = islandGrid.floorEntry(x); if (en != null) { - Entry ent = en.getValue().floorEntry(z); + Entry ent = en.getValue().floorEntry(z); if (ent != null) { // Check if in the island range Island island = ent.getValue(); diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 787445ae5..565c9c31d 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -48,14 +48,14 @@ public class Island implements DataObject { private int range; // Coordinates of the island area - private long minX; + private int minX; - private long minZ; + private int minZ; // Coordinates of minimum protected area - private long minProtectedX; + private int minProtectedX; - private long minProtectedZ; + private int minProtectedZ; // Protection size private int protectionRange; @@ -213,28 +213,28 @@ public class Island implements DataObject { /** * @return the minProtectedX */ - public long getMinProtectedX() { + public int getMinProtectedX() { return minProtectedX; } /** * @return the minProtectedZ */ - public long getMinProtectedZ() { + public int getMinProtectedZ() { return minProtectedZ; } /** * @return the minX */ - public long getMinX() { + public int getMinX() { return minX; } /** * @return the minZ */ - public long getMinZ() { + public int getMinZ() { return minZ; } @@ -410,7 +410,7 @@ public class Island implements DataObject { * @param z * @return true if in the island space */ - public boolean inIslandSpace(long x, long z) { + public boolean inIslandSpace(int x, int z) { //Bukkit.getLogger().info("DEBUG: center - " + center); return x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2; } @@ -420,7 +420,7 @@ public class Island implements DataObject { * @param blockCoord * @return true or false */ - public boolean inIslandSpace(Pair blockCoord) { + public boolean inIslandSpace(Pair blockCoord) { return inIslandSpace(blockCoord.x, blockCoord.z); } @@ -577,21 +577,21 @@ public class Island implements DataObject { /** * @param minProtectedX the minProtectedX to set */ - public final void setMinProtectedX(long minProtectedX) { + public final void setMinProtectedX(int minProtectedX) { this.minProtectedX = minProtectedX; } /** * @param minProtectedZ the minProtectedZ to set */ - public final void setMinProtectedZ(long minProtectedZ) { + public final void setMinProtectedZ(int minProtectedZ) { this.minProtectedZ = minProtectedZ; } /** * @param minX the minX to set */ - public final void setMinX(long minX) { + public final void setMinX(int minX) { this.minX = minX; } @@ -599,7 +599,7 @@ public class Island implements DataObject { /** * @param minZ the minZ to set */ - public final void setMinZ(long minZ) { + public final void setMinZ(int minZ) { this.minZ = minZ; } diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index f41073336..a711a5fd5 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -137,10 +137,10 @@ public class SafeSpotTeleport { // Create ever increasing squares around the target location int radius = 0; do { - for (long i = x - radius; i <= x + radius; i++) { - for (long j = z - radius; j <= z + radius; j++) { + for (int i = x - radius; i <= x + radius; i++) { + for (int j = z - radius; j <= z + radius; j++) { - Pair blockCoord = new Pair<>(i,j); + Pair blockCoord = new Pair<>(i,j); Pair chunkCoord = new Pair<>((int)i/16, (int)j/16); if (!result.contains(chunkCoord)) { Bukkit.getLogger().info("Block coord = " + blockCoord); From 84e3ae3e8b75b7616f58a558a101d5784576d457 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 13:51:11 -0800 Subject: [PATCH 89/97] Removed imports Fixed vulnerability issue with Pair Fixed database connection issue with MySQLDatabaseHandler --- .../hooks/InternalPlaceholderImpl.java | 2 - .../database/mysql/MySQLDatabaseHandler.java | 229 +++++++++--------- .../bskyblock/lists/Placeholders.java | 11 +- .../us/tastybento/bskyblock/util/Pair.java | 4 +- .../mysql/MySQLDatabaseHandlerTest.java | 6 +- 5 files changed, 125 insertions(+), 127 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java index 993e6a2e2..d059780a1 100644 --- a/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/hooks/InternalPlaceholderImpl.java @@ -1,7 +1,5 @@ package us.tastybento.bskyblock.api.placeholders.hooks; -import java.util.regex.Pattern; - import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.placeholders.Placeholder; diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index 0902a1586..aec96a55b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -378,123 +378,120 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { InstantiationException, IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { - // Try to connect to the database - try (Connection connection = databaseConnecter.createConnection()) { - // insertQuery is created in super from the createInsertQuery() method - try (PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) { - // Get the uniqueId. As each class extends DataObject, it must have this method in it. - PropertyDescriptor propertyDescriptor = new PropertyDescriptor("uniqueId", dataObject); - Method getUniqueId = propertyDescriptor.getReadMethod(); - final String uniqueId = (String) getUniqueId.invoke(instance); - if (uniqueId.isEmpty()) { - throw new SQLException("uniqueId is blank"); - } - // Create the insertion - int i = 0; - // Run through the fields in the class using introspection - for (Field field : dataObject.getDeclaredFields()) { - // Get the field's property descriptor - propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); - // Get the read method for this field - Method method = propertyDescriptor.getReadMethod(); - //sql += "`" + field.getName() + "` " + mapping + ","; - // Invoke the read method to obtain the value from the class - this is the value we need to store in the database - Object value = method.invoke(instance); - // Adapter Notation - Adapter adapterNotation = field.getAnnotation(Adapter.class); - if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { - // A conversion adapter has been defined - value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); - } - // Create set and map table inserts if this is a Collection - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - // Collection - // The table is cleared for this uniqueId every time the data is stored - StringBuilder clearTableSql = new StringBuilder(); - clearTableSql.append("DELETE FROM `"); - clearTableSql.append(dataObject.getCanonicalName()); - clearTableSql.append("."); - clearTableSql.append(field.getName()); - clearTableSql.append("` WHERE uniqueId = ?"); - try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql.toString())) { - collStatement.setString(1, uniqueId); - collStatement.execute(); - } - // Insert into the table - StringBuilder setSql = new StringBuilder(); - setSql.append("INSERT INTO `"); - setSql.append(dataObject.getCanonicalName()); - setSql.append("."); - setSql.append(field.getName()); - setSql.append("` (uniqueId, "); - // Get the columns we are going to insert, just the names of them - setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), false, false)); - setSql.append(") "); - // Get all the ?'s for the columns - setSql.append("VALUES ('?',"); - setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false)); - setSql.append(")"); - // Prepare the statement - try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { - // Set the uniqueId - collStatement.setString(1, uniqueId); - // Do single dimension types (set and list) - if (propertyDescriptor.getPropertyType().equals(Set.class) || - propertyDescriptor.getPropertyType().equals(ArrayList.class)) { - //plugin.getLogger().info("DEBUG: set class for "); - // Loop through the set or list - // Note that we have no idea what type this is - Collection collection = (Collection)value; - Iterator it = collection.iterator(); - while (it.hasNext()) { - Object setValue = it.next(); - //if (setValue instanceof UUID) { - // Serialize everything - setValue = serialize(setValue, setValue.getClass()); - //} - // Set the value from ? to whatever it is - collStatement.setObject(2, setValue); - // Execute the SQL in the database - collStatement.execute(); - } - } else if (propertyDescriptor.getPropertyType().equals(Map.class) || - propertyDescriptor.getPropertyType().equals(HashMap.class)) { - // Loop through the map - Map collection = (Map)value; - Iterator it = collection.entrySet().iterator(); - while (it.hasNext()) { - Entry en = (Entry) it.next(); - // Get the key and serialize it - Object key = serialize(en.getKey(), en.getKey().getClass()); - // Get the value and serialize it - Object mapValue = serialize(en.getValue(), en.getValue().getClass()); - // Write the objects into prepared statement - collStatement.setObject(1, key); - collStatement.setObject(2, mapValue); - // Write to database - collStatement.execute(); - } - } - // Set value for the main insert. For collections, this is just a dummy value because the real values are in the - // additional table. - value = true; - } - } else { - // If the value is not a collection, it just needs to be serialized to go into the database. - value = serialize(value, propertyDescriptor.getPropertyType()); - } - // Set the value in the main prepared statement and increment the location - // Note that with prepared statements, they count from 1, not 0, so the ++ goes on the front of i. - preparedStatement.setObject(++i, value); - } - // Add the statements to a batch - preparedStatement.addBatch(); - // Execute - preparedStatement.executeBatch(); + // insertQuery is created in super from the createInsertQuery() method + try (PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) { + // Get the uniqueId. As each class extends DataObject, it must have this method in it. + PropertyDescriptor propertyDescriptor = new PropertyDescriptor("uniqueId", dataObject); + Method getUniqueId = propertyDescriptor.getReadMethod(); + final String uniqueId = (String) getUniqueId.invoke(instance); + if (uniqueId.isEmpty()) { + throw new SQLException("uniqueId is blank"); } + // Create the insertion + int i = 0; + // Run through the fields in the class using introspection + for (Field field : dataObject.getDeclaredFields()) { + // Get the field's property descriptor + propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); + // Get the read method for this field + Method method = propertyDescriptor.getReadMethod(); + //sql += "`" + field.getName() + "` " + mapping + ","; + // Invoke the read method to obtain the value from the class - this is the value we need to store in the database + Object value = method.invoke(instance); + // Adapter Notation + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); + } + // Create set and map table inserts if this is a Collection + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + // Collection + // The table is cleared for this uniqueId every time the data is stored + StringBuilder clearTableSql = new StringBuilder(); + clearTableSql.append("DELETE FROM `"); + clearTableSql.append(dataObject.getCanonicalName()); + clearTableSql.append("."); + clearTableSql.append(field.getName()); + clearTableSql.append("` WHERE uniqueId = ?"); + try (PreparedStatement collStatement = connection.prepareStatement(clearTableSql.toString())) { + collStatement.setString(1, uniqueId); + collStatement.execute(); + } + // Insert into the table + StringBuilder setSql = new StringBuilder(); + setSql.append("INSERT INTO `"); + setSql.append(dataObject.getCanonicalName()); + setSql.append("."); + setSql.append(field.getName()); + setSql.append("` (uniqueId, "); + // Get the columns we are going to insert, just the names of them + setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), false, false)); + setSql.append(") "); + // Get all the ?'s for the columns + setSql.append("VALUES ('?',"); + setSql.append(getCollectionColumnString(propertyDescriptor.getWriteMethod(), true, false)); + setSql.append(")"); + // Prepare the statement + try (PreparedStatement collStatement = connection.prepareStatement(setSql.toString())) { + // Set the uniqueId + collStatement.setString(1, uniqueId); + // Do single dimension types (set and list) + if (propertyDescriptor.getPropertyType().equals(Set.class) || + propertyDescriptor.getPropertyType().equals(ArrayList.class)) { + //plugin.getLogger().info("DEBUG: set class for "); + // Loop through the set or list + // Note that we have no idea what type this is + Collection collection = (Collection)value; + Iterator it = collection.iterator(); + while (it.hasNext()) { + Object setValue = it.next(); + //if (setValue instanceof UUID) { + // Serialize everything + setValue = serialize(setValue, setValue.getClass()); + //} + // Set the value from ? to whatever it is + collStatement.setObject(2, setValue); + // Execute the SQL in the database + collStatement.execute(); + } + } else if (propertyDescriptor.getPropertyType().equals(Map.class) || + propertyDescriptor.getPropertyType().equals(HashMap.class)) { + // Loop through the map + Map collection = (Map)value; + Iterator it = collection.entrySet().iterator(); + while (it.hasNext()) { + Entry en = (Entry) it.next(); + // Get the key and serialize it + Object key = serialize(en.getKey(), en.getKey().getClass()); + // Get the value and serialize it + Object mapValue = serialize(en.getValue(), en.getValue().getClass()); + // Write the objects into prepared statement + collStatement.setObject(1, key); + collStatement.setObject(2, mapValue); + // Write to database + collStatement.execute(); + } + } + // Set value for the main insert. For collections, this is just a dummy value because the real values are in the + // additional table. + value = true; + } + } else { + // If the value is not a collection, it just needs to be serialized to go into the database. + value = serialize(value, propertyDescriptor.getPropertyType()); + } + // Set the value in the main prepared statement and increment the location + // Note that with prepared statements, they count from 1, not 0, so the ++ goes on the front of i. + preparedStatement.setObject(++i, value); + } + // Add the statements to a batch + preparedStatement.addBatch(); + // Execute + preparedStatement.executeBatch(); } } diff --git a/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java index 384f3a248..dff51a7f9 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java @@ -1,14 +1,15 @@ package us.tastybento.bskyblock.lists; -import org.bukkit.Bukkit; -import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.placeholders.Placeholder; -import us.tastybento.bskyblock.api.placeholders.PlaceholderBuilder; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import org.bukkit.Bukkit; + +import us.tastybento.bskyblock.BSkyBlock; +import us.tastybento.bskyblock.api.placeholders.Placeholder; +import us.tastybento.bskyblock.api.placeholders.PlaceholderBuilder; + public class Placeholders { public static final Placeholder PLUGIN_NAME = new PlaceholderBuilder().identifier("bsb_plugin_name").value((user) -> BSkyBlock.getInstance().getDescription().getName()).build(); diff --git a/src/main/java/us/tastybento/bskyblock/util/Pair.java b/src/main/java/us/tastybento/bskyblock/util/Pair.java index 15c0a5b00..3c85c6f95 100644 --- a/src/main/java/us/tastybento/bskyblock/util/Pair.java +++ b/src/main/java/us/tastybento/bskyblock/util/Pair.java @@ -2,8 +2,8 @@ package us.tastybento.bskyblock.util; public class Pair { - public X x; - public Z z; + public final X x; + public final Z z; public Pair(X x, Z z) { this.x = x; diff --git a/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java index 7ff2999d2..be14d2644 100644 --- a/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java +++ b/src/test/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandlerTest.java @@ -3,17 +3,19 @@ */ package us.tastybento.bskyblock.database.mysql; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.beans.IntrospectionException; -import java.sql.Statement; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import org.junit.BeforeClass; import org.junit.Test; From c76c854ed359a2461c4478441bbbfa6f07543cb5 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 13:56:44 -0800 Subject: [PATCH 90/97] Code smells cleanup Removed unnecessary cast in Island. Combined if statement Removed unnecessary {} --- .../bskyblock/database/objects/Island.java | 4 ++-- .../listeners/flags/BucketListener.java | 18 ++++++------------ .../listeners/flags/HurtingListener.java | 4 +--- .../bskyblock/listeners/flags/PVPListener.java | 4 +--- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index 565c9c31d..c80b66e5d 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -316,8 +316,8 @@ public class Island implements DataObject { */ public int getTileEntityCount(Material material, World world) { int result = 0; - for (int x = (int) (getMinProtectedX() /16); x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { - for (int z = (int) (getMinProtectedZ() /16); z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { + for (int x = getMinProtectedX() /16; x <= (getMinProtectedX() + getProtectionRange() - 1)/16; x++) { + for (int z = getMinProtectedZ() /16; z <= (getMinProtectedZ() + getProtectionRange() - 1)/16; z++) { for (BlockState holder : world.getChunkAt(x, z).getTileEntities()) { //plugin.getLogger().info("DEBUG: tile entity: " + holder.getType()); if (onIsland(holder.getLocation())) { diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java index 73c36bb7e..2a32ad4ed 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/BucketListener.java @@ -40,20 +40,14 @@ public class BucketListener extends AbstractFlagListener { @EventHandler(priority = EventPriority.LOW) public void onBucketFill(final PlayerBucketFillEvent e) { // Check filling of various liquids - if (e.getItemStack().getType().equals(Material.LAVA_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA)) { - return; - } + if (e.getItemStack().getType().equals(Material.LAVA_BUCKET) && (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_LAVA))) { + return; } - if (e.getItemStack().getType().equals(Material.WATER_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_WATER)) { - return; - } + if (e.getItemStack().getType().equals(Material.WATER_BUCKET) && (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.COLLECT_WATER))) { + return; } - if (e.getItemStack().getType().equals(Material.MILK_BUCKET)) { - if (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.MILKING)) { - return; - } + if (e.getItemStack().getType().equals(Material.MILK_BUCKET) && (!checkIsland(e, e.getBlockClicked().getLocation(), Flags.MILKING))) { + return; } // Check general bucket use checkIsland(e, e.getBlockClicked().getLocation(), Flags.BUCKET); diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java index 75d0f5cd7..1e231d05f 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/HurtingListener.java @@ -170,9 +170,7 @@ public class HurtingListener extends AbstractFlagListener { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); - getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> { - thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); - }, e.getAreaEffectCloud().getDuration()); + getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> thrownPotions.remove(e.getAreaEffectCloud().getEntityId()), e.getAreaEffectCloud().getDuration()); } } diff --git a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java index c62bcde0f..841c5859e 100644 --- a/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java +++ b/src/main/java/us/tastybento/bskyblock/listeners/flags/PVPListener.java @@ -132,9 +132,7 @@ public class PVPListener extends AbstractFlagListener { UUID uuid = ((Player)projectile.getShooter()).getUniqueId(); // Store it and remove it when the effect is gone thrownPotions.put(e.getAreaEffectCloud().getEntityId(), uuid); - getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> { - thrownPotions.remove(e.getAreaEffectCloud().getEntityId()); - }, e.getAreaEffectCloud().getDuration()); + getPlugin().getServer().getScheduler().runTaskLater(getPlugin(), () -> thrownPotions.remove(e.getAreaEffectCloud().getEntityId()), e.getAreaEffectCloud().getDuration()); } } From 180517cef3ce14ea1569abb353f5bd0f643630b6 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:00:40 -0800 Subject: [PATCH 91/97] Code smells cleanup --- .../bskyblock/api/placeholders/PlaceholderHandler.java | 3 --- .../java/us/tastybento/bskyblock/lists/Placeholders.java | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java index 73a187fca..01b7c3e7f 100644 --- a/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java @@ -6,7 +6,6 @@ import java.util.List; import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.api.commands.User; -import us.tastybento.bskyblock.lists.Placeholders; /** * Handles hooks with other Placeholder APIs. @@ -29,8 +28,6 @@ public class PlaceholderHandler { * @param plugin */ public static void register(BSkyBlock plugin){ - // Register placeholders - new Placeholders(); // Load Internal Placeholder API try{ diff --git a/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java index dff51a7f9..6aa6748db 100644 --- a/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java +++ b/src/main/java/us/tastybento/bskyblock/lists/Placeholders.java @@ -12,7 +12,10 @@ import us.tastybento.bskyblock.api.placeholders.PlaceholderBuilder; public class Placeholders { - public static final Placeholder PLUGIN_NAME = new PlaceholderBuilder().identifier("bsb_plugin_name").value((user) -> BSkyBlock.getInstance().getDescription().getName()).build(); + // Utility classes, which are collections of static members, are not meant to be instantiated. + private Placeholders() {} + + public static final Placeholder PLUGIN_NAME = new PlaceholderBuilder().identifier("bsb_plugin_name").value(user -> BSkyBlock.getInstance().getDescription().getName()).build(); /** * @return List of all the flags in this class From a9ea8e830daf48f47815b682b8e2ba974e1b189c Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:05:05 -0800 Subject: [PATCH 92/97] Code smells cleanup Extract nested try block into a separate method. --- .../bskyblock/managers/LocalesManager.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java index 65788007b..37e87f158 100644 --- a/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java +++ b/src/main/java/us/tastybento/bskyblock/managers/LocalesManager.java @@ -79,20 +79,13 @@ public final class LocalesManager { try { for (String name : lister.listJar(LOCALE_FOLDER)) { // We cannot use Bukkit's saveResource, because we want it to go into a specific folder, so... - try (InputStream initialStream = plugin.getResource(name)) { - // Get the last part of the name - int lastIndex = name.lastIndexOf('/'); - File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length())); - if (DEBUG) { - plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath()); - } - if (!targetFile.exists()) { - java.nio.file.Files.copy(initialStream, targetFile.toPath()); - } - } catch (IOException e) { - plugin.getLogger().severe("Could not copy locale files from jar " + e.getMessage()); + // Get the last part of the name + int lastIndex = name.lastIndexOf('/'); + File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length())); + if (DEBUG) { + plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath()); } - + copyFile(name, targetFile); } } catch (IOException e) { plugin.getLogger().severe("Could not copy locale files from jar " + e.getMessage()); @@ -124,4 +117,16 @@ public final class LocalesManager { } } } + + private void copyFile(String name, File targetFile) { + try (InputStream initialStream = plugin.getResource(name)) { + if (!targetFile.exists()) { + java.nio.file.Files.copy(initialStream, targetFile.toPath()); + } + } catch (IOException e) { + plugin.getLogger().severe("Could not copy locale files from jar " + e.getMessage()); + } + + + } } From 11c1ffc790f22602e1bea050b840580e9c3847d7 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:06:20 -0800 Subject: [PATCH 93/97] Removed unnecessary (int) --- .../us/tastybento/bskyblock/util/DeleteIslandChunks.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java index f8dd49b73..df705a561 100644 --- a/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java +++ b/src/main/java/us/tastybento/bskyblock/util/DeleteIslandChunks.java @@ -34,10 +34,10 @@ public class DeleteIslandChunks { if (world == null) { return; } - int minXChunk = (int) (island.getMinX() / 16); - int maxXChunk = (int) ((island.getRange() * 2 + island.getMinX() - 1) /16); - int minZChunk = (int) (island.getMinZ() / 16); - int maxZChunk = (int) ((island.getRange() * 2 + island.getMinZ() - 1) /16); + int minXChunk = island.getMinX() / 16; + int maxXChunk = (island.getRange() * 2 + island.getMinX() - 1) /16; + int minZChunk = island.getMinZ() / 16; + int maxZChunk = (island.getRange() * 2 + island.getMinZ() - 1) /16; for (int x = minXChunk; x <= maxXChunk; x++) { for (int z = minZChunk; z<=maxZChunk; z++) { world.regenerateChunk(x, z); From 2b286ca58a1a183160a3b3e3c4b529fe3c08dfa8 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:10:25 -0800 Subject: [PATCH 94/97] Removed debug, cleaned up code --- .../bskyblock/util/SafeSpotTeleport.java | 46 ++++++------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index a711a5fd5..52189f96d 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -26,20 +26,17 @@ import us.tastybento.bskyblock.database.objects.Island; */ public class SafeSpotTeleport { - private enum State { - CHECKING, WAITING - } private static final int MAX_CHUNKS = 10; private static final long SPEED = 10; - private State step = State.CHECKING; + private boolean checking = true; private BukkitTask task; - + // Parameters private final Entity entity; private final Location location; private final boolean portal; private final int homeNumber; - + // Locations private Location bestSpot; @@ -72,13 +69,13 @@ public class SafeSpotTeleport { // Get chunks to scan chunksToScan = getChunksToScan(); + // Start checking + checking = true; + // Start a recurring task until done or cancelled task = plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { - Bukkit.getLogger().info("State = " + step); - Bukkit.getLogger().info("Chunks to scan size = " + chunksToScan.size()); List chunkSnapshot = new ArrayList<>(); - switch (step) { - case CHECKING: + if (checking) { Iterator> it = chunksToScan.iterator(); if (!it.hasNext()) { Bukkit.getLogger().info("Nothing left!"); @@ -93,13 +90,8 @@ public class SafeSpotTeleport { it.remove(); } // Move to next step - step = State.WAITING; - Bukkit.getLogger().info("Chunk snapshot size = " + chunkSnapshot.size()); + checking = false; checkChunks(chunkSnapshot); - break; - case WAITING: - // Do nothing while the scan is done - break; } }, 0L, SPEED); } @@ -109,7 +101,6 @@ public class SafeSpotTeleport { task.cancel(); // Check portal if (portal && bestSpot != null) { - Bukkit.getLogger().info("No portals found, going to best spot"); // No portals found, teleport to the best spot we found teleportEntity(bestSpot); } @@ -130,8 +121,6 @@ public class SafeSpotTeleport { // Get island if available Optional island = plugin.getIslands().getIslandAt(location); int maxRadius = island.map(x -> x.getProtectionRange()).orElse(plugin.getSettings().getIslandProtectionRange()); - Bukkit.getLogger().info("default island radius = " + plugin.getSettings().getIslandProtectionRange()); - Bukkit.getLogger().info("Max radius = " + maxRadius); int x = location.getBlockX(); int z = location.getBlockZ(); // Create ever increasing squares around the target location @@ -139,27 +128,21 @@ public class SafeSpotTeleport { do { for (int i = x - radius; i <= x + radius; i++) { for (int j = z - radius; j <= z + radius; j++) { - + Pair blockCoord = new Pair<>(i,j); Pair chunkCoord = new Pair<>((int)i/16, (int)j/16); if (!result.contains(chunkCoord)) { - Bukkit.getLogger().info("Block coord = " + blockCoord); - Bukkit.getLogger().info("New chunk coord " + chunkCoord); // Add the chunk coord if (!island.isPresent()) { // If there is no island, just add it - Bukkit.getLogger().info("No island, adding chunk coord "); result.add(chunkCoord); } else { // If there is an island, only add it if the coord is in island space island.ifPresent(is -> { if (is.inIslandSpace(blockCoord)) { - Bukkit.getLogger().info("Island, adding chunk coord"); result.add(chunkCoord); - } else { - Bukkit.getLogger().info("Island, block coord not in island space"); } - }); + }); } } } @@ -183,7 +166,7 @@ public class SafeSpotTeleport { } } // Nothing happened, change state - step = State.CHECKING; + checking = true; }); } @@ -193,8 +176,6 @@ public class SafeSpotTeleport { * @return true if a safe spot was found */ private boolean scanChunk(ChunkSnapshot chunk) { - Bukkit.getLogger().info("Scanning chunk at " + chunk.getX() + " " + chunk.getZ()); - Bukkit.getLogger().info("Portal = " + portal); World world = location.getWorld(); // Max height int maxHeight = location.getWorld().getMaxHeight() - 20; @@ -204,7 +185,6 @@ public class SafeSpotTeleport { // Work down from the entry point up for (int y = Math.min(chunk.getHighestBlockYAt(x, z), maxHeight); y >= 0; y--) { if (checkBlock(chunk, x,y,z, maxHeight)) { - Bukkit.getLogger().info("safe: " + x + " " + y + " "+ z); Vector newSpot = new Vector(chunk.getX() * 16 + x + 0.5D, y + 1, chunk.getZ() * 16 + z + 0.5D); // Check for portal if (portal) { @@ -222,7 +202,7 @@ public class SafeSpotTeleport { return true; } } - + } } //end z } // end x @@ -255,7 +235,7 @@ public class SafeSpotTeleport { } - + /** * Subscan to find the bottom of the portal */ From d32a6f8ff1b6b4fdf1b98daea8a724acb80d9045 Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:32:13 -0800 Subject: [PATCH 95/97] Made code easier to understand --- .../bskyblock/util/SafeSpotTeleport.java | 125 +++++++++--------- .../us/tastybento/bskyblock/util/Util.java | 25 ---- 2 files changed, 62 insertions(+), 88 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java index 52189f96d..6f116e74c 100644 --- a/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java +++ b/src/main/java/us/tastybento/bskyblock/util/SafeSpotTeleport.java @@ -71,7 +71,7 @@ public class SafeSpotTeleport { // Start checking checking = true; - + // Start a recurring task until done or cancelled task = plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { List chunkSnapshot = new ArrayList<>(); @@ -120,7 +120,7 @@ public class SafeSpotTeleport { List> result = new ArrayList<>(); // Get island if available Optional island = plugin.getIslands().getIslandAt(location); - int maxRadius = island.map(x -> x.getProtectionRange()).orElse(plugin.getSettings().getIslandProtectionRange()); + int maxRadius = island.map(Island::getProtectionRange).orElse(plugin.getSettings().getIslandProtectionRange()); int x = location.getBlockX(); int z = location.getBlockZ(); // Create ever increasing squares around the target location @@ -130,7 +130,7 @@ public class SafeSpotTeleport { for (int j = z - radius; j <= z + radius; j++) { Pair blockCoord = new Pair<>(i,j); - Pair chunkCoord = new Pair<>((int)i/16, (int)j/16); + Pair chunkCoord = new Pair<>(i/16, j/16); if (!result.contains(chunkCoord)) { // Add the chunk coord if (!island.isPresent()) { @@ -142,7 +142,7 @@ public class SafeSpotTeleport { if (is.inIslandSpace(blockCoord)) { result.add(chunkCoord); } - }); + }); } } } @@ -176,7 +176,6 @@ public class SafeSpotTeleport { * @return true if a safe spot was found */ private boolean scanChunk(ChunkSnapshot chunk) { - World world = location.getWorld(); // Max height int maxHeight = location.getWorld().getMaxHeight() - 20; // Run through the chunk @@ -185,25 +184,9 @@ public class SafeSpotTeleport { // Work down from the entry point up for (int y = Math.min(chunk.getHighestBlockYAt(x, z), maxHeight); y >= 0; y--) { if (checkBlock(chunk, x,y,z, maxHeight)) { - Vector newSpot = new Vector(chunk.getX() * 16 + x + 0.5D, y + 1, chunk.getZ() * 16 + z + 0.5D); - // Check for portal - if (portal) { - if (chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { - // Teleport as soon as we find a portal - teleportEntity(newSpot.toLocation(world)); - return true; - } else if (bestSpot == null ) { - // Stash the best spot - bestSpot = newSpot.toLocation(world); - } - } else { - // Regular search - teleport as soon as we find something - teleportEntity(newSpot.toLocation(world)); - return true; - } + return true; } - - } + } // end y } //end z } // end x return false; @@ -270,56 +253,72 @@ public class SafeSpotTeleport { * @param y * @param z * @param worldHeight - * @return + * @return true if this is a safe spot, false if this is a portal scan */ private boolean checkBlock(ChunkSnapshot chunk, int x, int y, int z, int worldHeight) { + World world = location.getWorld(); + Bukkit.getLogger().info("checking " + x + " " + y + " "+ z); Material type = chunk.getBlockType(x, y, z); if (!type.equals(Material.AIR)) { // AIR Material space1 = chunk.getBlockType(x, Math.min(y + 1, worldHeight), z); Material space2 = chunk.getBlockType(x, Math.min(y + 2, worldHeight), z); if ((space1.equals(Material.AIR) && space2.equals(Material.AIR)) - || (space1.equals(Material.PORTAL) && space2.equals(Material.PORTAL))) { - // Now there is a chance that this is a safe spot - // Check for safe ground - if (!type.toString().contains("FENCE") - && !type.toString().contains("DOOR") - && !type.toString().contains("GATE") - && !type.toString().contains("PLATE")) { - switch (type) { - // Unsafe - case ANVIL: - case BARRIER: - case BOAT: - case CACTUS: - case DOUBLE_PLANT: - case ENDER_PORTAL: - case FIRE: - case FLOWER_POT: - case LADDER: - case LAVA: - case LEVER: - case LONG_GRASS: - case PISTON_EXTENSION: - case PISTON_MOVING_PIECE: - case PORTAL: - case SIGN_POST: - case SKULL: - case STANDING_BANNER: - case STATIONARY_LAVA: - case STATIONARY_WATER: - case STONE_BUTTON: - case TORCH: - case TRIPWIRE: - case WATER: - case WEB: - case WOOD_BUTTON: - //Block is dangerous - break; - default: - // Safe + || (space1.equals(Material.PORTAL) && space2.equals(Material.PORTAL)) + && (!type.toString().contains("FENCE") + && !type.toString().contains("DOOR") + && !type.toString().contains("GATE") + && !type.toString().contains("PLATE"))) { + switch (type) { + // Unsafe + case ANVIL: + case BARRIER: + case BOAT: + case CACTUS: + case DOUBLE_PLANT: + case ENDER_PORTAL: + case FIRE: + case FLOWER_POT: + case LADDER: + case LAVA: + case LEVER: + case LONG_GRASS: + case PISTON_EXTENSION: + case PISTON_MOVING_PIECE: + case PORTAL: + case SIGN_POST: + case SKULL: + case STANDING_BANNER: + case STATIONARY_LAVA: + case STATIONARY_WATER: + case STONE_BUTTON: + case TORCH: + case TRIPWIRE: + case WATER: + case WEB: + case WOOD_BUTTON: + //Block is dangerous + break; + default: + // Safe + Vector newSpot = new Vector(chunk.getX() * 16 + x + 0.5D, y + 1, chunk.getZ() * 16 + z + 0.5D); + // Check for portal + if (portal) { + if (chunk.getBlockType(x, y, z).equals(Material.PORTAL)) { + // Teleport as soon as we find a portal + teleportEntity(newSpot.toLocation(world)); + return true; + } else if (bestSpot == null) { + // Stash the best spot + bestSpot = newSpot.toLocation(world); + return false; + } + } else { + // Regular search - teleport as soon as we find something + teleportEntity(newSpot.toLocation(world)); return true; } + return true; } } } diff --git a/src/main/java/us/tastybento/bskyblock/util/Util.java b/src/main/java/us/tastybento/bskyblock/util/Util.java index 80b048cbe..0dfa724e4 100755 --- a/src/main/java/us/tastybento/bskyblock/util/Util.java +++ b/src/main/java/us/tastybento/bskyblock/util/Util.java @@ -11,7 +11,6 @@ import java.util.List; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.configuration.file.YamlConfiguration; @@ -176,30 +175,6 @@ public class Util { return fin; } - /** - * Checks if player has this type of item in either hand - * @param player - * @param type - * @return true if they are holding an item of type type - */ - @SuppressWarnings("deprecation") - public static boolean playerIsHolding(Player player, Material type) { - if (plugin.getServer().getVersion().contains("(MC: 1.7") - || plugin.getServer().getVersion().contains("(MC: 1.8")) { - if (player.getItemInHand() != null && player.getItemInHand().getType().equals(type)) { - return true; - } - return false; - } - if (player.getInventory().getItemInMainHand() != null && player.getInventory().getItemInMainHand().getType().equals(type)) { - return true; - } - if (player.getInventory().getItemInMainHand() != null && player.getInventory().getItemInOffHand().getType().equals(type)) { - return true; - } - return false; - } - /** * Determines if a location is in the island world or not or * in the new nether if it is activated From 921d25c2d564174c1afb04e76c8fe71f7ab059ac Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:39:57 -0800 Subject: [PATCH 96/97] Added private constructor because all methods are static. --- .../bskyblock/api/placeholders/PlaceholderHandler.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java index 01b7c3e7f..fbea67198 100644 --- a/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java +++ b/src/main/java/us/tastybento/bskyblock/api/placeholders/PlaceholderHandler.java @@ -14,6 +14,10 @@ import us.tastybento.bskyblock.api.commands.User; */ public class PlaceholderHandler { private static final String PACKAGE = "us.tastybento.bskyblock.api.placeholders.hooks."; + + // This class should never be instantiated (all methods are static) + private PlaceholderHandler() {} + /** * List of API classes in the package specified above (except the Internal one) */ @@ -46,13 +50,13 @@ public class PlaceholderHandler { Class clazz = Class.forName(PACKAGE + hook + "PlaceholderImpl"); PlaceholderAPIInterface api = (PlaceholderAPIInterface)clazz.newInstance(); if(api.register(plugin)){ - plugin.getLogger().info("Hooked placeholders into " + hook); + plugin.getLogger().info(() -> "Hooked placeholders into " + hook); // since Java 8, we can use Supplier , which will be evaluated lazily apis.add(api); } else { - plugin.getLogger().info("Failed to hook placeholders into " + hook); + plugin.getLogger().info(() -> "Failed to hook placeholders into " + hook); } } catch (Exception e){ - plugin.getLogger().info("Failed to hook placeholders into " + hook); + plugin.getLogger().info(() -> "Failed to hook placeholders into " + hook); } } } From 487328950ba82be5ecd2bcf21d0763d1771494fa Mon Sep 17 00:00:00 2001 From: Tastybento Date: Sat, 10 Feb 2018 14:48:58 -0800 Subject: [PATCH 97/97] Fixed bug where new /island was doing /go as well. --- .../bskyblock/commands/IslandCommand.java | 1 + .../bskyblock/database/objects/Island.java | 29 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java index 3efb75961..a0f316e00 100755 --- a/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java +++ b/src/main/java/us/tastybento/bskyblock/commands/IslandCommand.java @@ -51,6 +51,7 @@ public class IslandCommand extends CompositeCommand { if (subCreate.isPresent()) { subCreate.get().execute(user, new ArrayList<>()); } + return true; } Optional go = getSubCommand("go"); // Otherwise, currently, just go home diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index c80b66e5d..329994b66 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -73,10 +73,12 @@ public class Island implements DataObject { //// Team //// private UUID owner; + private HashMap members = new HashMap<>(); //// State //// private boolean locked = false; + private boolean spawn = false; private boolean purgeProtected = false; @@ -86,10 +88,10 @@ public class Island implements DataObject { private HashMap flags = new HashMap<>(); private int levelHandicap; + private Location spawnPoint; public Island() {} - public Island(Location location, UUID owner, int protectionRange) { setOwner(owner); createdDate = System.currentTimeMillis(); @@ -113,7 +115,6 @@ public class Island implements DataObject { members.put(playerUUID, RanksManager.MEMBER_RANK); } } - /** * Adds target to a list of banned players for this island. May be blocked by the event being cancelled. * If the player is a member, coop or trustee, they will be removed from those lists. @@ -154,7 +155,6 @@ public class Island implements DataObject { public long getCreatedDate(){ return createdDate; } - /** * Gets the rank needed to bypass this Island Guard flag * @param flag @@ -213,28 +213,28 @@ public class Island implements DataObject { /** * @return the minProtectedX */ - public int getMinProtectedX() { + public final int getMinProtectedX() { return minProtectedX; } /** * @return the minProtectedZ */ - public int getMinProtectedZ() { + public final int getMinProtectedZ() { return minProtectedZ; } /** * @return the minX */ - public int getMinX() { + public final int getMinX() { return minX; } /** * @return the minZ */ - public int getMinZ() { + public final int getMinZ() { return minZ; } @@ -397,13 +397,6 @@ public class Island implements DataObject { return center.getBlockZ(); } - public boolean inIslandSpace(Location location) { - if (Util.inWorld(location)) { - return inIslandSpace(location.getBlockX(), location.getBlockZ()); - } - return false; - } - /** * Checks if coords are in the island space * @param x @@ -415,6 +408,13 @@ public class Island implements DataObject { return x >= minX && x < minX + range*2 && z >= minZ && z < minZ + range*2; } + public boolean inIslandSpace(Location location) { + if (Util.inWorld(location)) { + return inIslandSpace(location.getBlockX(), location.getBlockZ()); + } + return false; + } + /** * Checks if the coords are in island space * @param blockCoord @@ -595,7 +595,6 @@ public class Island implements DataObject { this.minX = minX; } - /** * @param minZ the minZ to set */