diff --git a/api/src/main/java/net/islandearth/rpgregions/api/events/RegionDiscoverEvent.java b/api/src/main/java/net/islandearth/rpgregions/api/events/RegionDiscoverEvent.java index c75ab69..77f4493 100644 --- a/api/src/main/java/net/islandearth/rpgregions/api/events/RegionDiscoverEvent.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/events/RegionDiscoverEvent.java @@ -1,5 +1,6 @@ package net.islandearth.rpgregions.api.events; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.data.region.Discovery; import org.bukkit.entity.Player; @@ -10,11 +11,13 @@ public class RegionDiscoverEvent extends Event { private static final HandlerList HANDLER_LIST = new HandlerList(); private final Player player; + private final RPGRegionsAccount account; private final ConfiguredRegion region; private final Discovery discovery; - public RegionDiscoverEvent(Player player, ConfiguredRegion region, Discovery discovery) { + public RegionDiscoverEvent(Player player, RPGRegionsAccount account, ConfiguredRegion region, Discovery discovery) { this.player = player; + this.account = account; this.region = region; this.discovery = discovery; } @@ -27,6 +30,14 @@ public class RegionDiscoverEvent extends Event { return player; } + /** + * Gets the account of the player involved in this event. + * @return the account of the player involved + */ + public RPGRegionsAccount getAccount() { + return account; + } + /** * Gets the region that has been discovered. * @return {@link ConfiguredRegion} that was discovered diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java index 48d116a..6bed022 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.managers.data.account; import net.islandearth.rpgregions.managers.data.region.Discovery; +import net.islandearth.rpgregions.rewards.DiscoveryReward; import net.islandearth.rpgregions.utils.TimeEntry; import java.util.ArrayList; @@ -16,6 +17,7 @@ public class RPGRegionsAccount { private final Map discoveries; private final List cooldowns; private final Map secondsInRegion; + private final Map lastAwards = new HashMap<>(); public RPGRegionsAccount(UUID uuid, Map discoveries) { this.uuid = uuid; @@ -44,18 +46,33 @@ public class RPGRegionsAccount { return cooldowns; } + public Map getTimedEntries() { + return Map.copyOf(secondsInRegion); + } + public Optional getTimeEntryInRegion(String region) { return Optional.ofNullable(secondsInRegion.getOrDefault(region, null)); } - public void addTimeEntryInRegion(String region, long time) { - secondsInRegion.put(region, new TimeEntry(time)); + public TimeEntry addTimeEntryInRegion(String region, long time) { + System.out.println("added time entry: " + region + ", " + time); + final TimeEntry timeEntry = new TimeEntry(time); + secondsInRegion.put(region, timeEntry); + return timeEntry; } public void removeStartTimeInRegion(String region) { secondsInRegion.remove(region); } + public void updateAwardTime(DiscoveryReward reward) { + this.lastAwards.put(reward, System.currentTimeMillis()); + } + + public Optional getLastAwardTime(DiscoveryReward reward) { + return Optional.ofNullable(this.lastAwards.get(reward)); + } + public enum AccountCooldown { ICON_COMMAND, TELEPORT diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index d4a3b7e..985d889 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -371,7 +371,7 @@ public class ConfiguredRegion { this.teleportCooldown = teleportCooldown; } - public void setTeleportCost(int teleportCost) { this.teleportCost = teleportCost; } + public void setTeleportCost(int teleportCost) { this.teleportCost = teleportCost; } public boolean showActionbar() { return showActionbar; diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java index 0fd2694..3f7adf5 100644 --- a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java +++ b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java @@ -3,6 +3,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; import net.islandearth.rpgregions.gui.IGuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.entity.Player; public abstract class DiscoveryReward implements IGuiEditable { @@ -15,8 +16,6 @@ public abstract class DiscoveryReward implements IGuiEditable { @GuiEditable("Time Between Reward (s)") private int timeBetweenReward; - private long lastReward; - public DiscoveryReward(IRPGRegionsAPI api) { this.api = api; } @@ -29,10 +28,10 @@ public abstract class DiscoveryReward implements IGuiEditable { * Awards this reward to the specified player * @param player player to award to */ - public abstract void award(Player player); + public abstract void award(Player player, RPGRegionsAccount account); - protected void updateAwardTime() { - this.lastReward = System.currentTimeMillis(); + protected void updateAwardTime(RPGRegionsAccount account) { + account.updateAwardTime(this); } public boolean isAlwaysAward() { @@ -51,8 +50,8 @@ public abstract class DiscoveryReward implements IGuiEditable { this.timeBetweenReward = timeBetweenReward; } - public boolean canAward() { - return (System.currentTimeMillis() - lastReward) >= (timeBetweenReward * 1000L); + public boolean canAward(RPGRegionsAccount account) { + return (System.currentTimeMillis() - account.getLastAwardTime(this).orElse(0L)) >= (timeBetweenReward * 1000L); } public String getPluginRequirement() { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/CuboidRegion.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/CuboidRegion.java index 1af5717..f4b9d07 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/CuboidRegion.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/region/CuboidRegion.java @@ -19,12 +19,12 @@ public class CuboidRegion extends RPGRegionsRegion { @Nullable public Location getFirstCorner() { - return getPoints().get(0); + return getPoints().isEmpty() ? null : getPoints().get(0); } @Nullable public Location getSecondCorner() { - return getPoints().get(1); + return getPoints().size() < 2 ? null : getPoints().get(1); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/DiscoveriesCommand.java b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/DiscoveriesCommand.java index 0f5ed33..3648f0e 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/DiscoveriesCommand.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/DiscoveriesCommand.java @@ -121,7 +121,7 @@ public class DiscoveriesCommand { if (target.getPlayer() != null) { Player player = target.getPlayer(); player.sendMessage(ChatColor.GREEN + "An administrator added a discovery to your account."); - Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, configuredRegion, worldDiscovery)); + Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, account, configuredRegion, worldDiscovery)); } plugin.getManagers().getStorageManager().removeCachedAccount(target.getUniqueId()); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java b/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java index 60ae455..ee16ac5 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/listener/RegionListener.java @@ -115,11 +115,11 @@ public class RegionListener implements Listener { LocalDateTime date = LocalDateTime.now(); Discovery discovery = new WorldDiscovery(date, regionId); account.addDiscovery(discovery); - Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, configuredRegion, discovery)); + Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, account, configuredRegion, discovery)); } else if (prioritised && configuredRegion.isDiscoverable() && has) { if (configuredRegion.getRewards() != null) configuredRegion.getRewards().forEach(reward -> { - if (reward.isAlwaysAward() && reward.canAward()) { - reward.award(player); + if (reward.isAlwaysAward() && reward.canAward(account)) { + reward.award(player, account); } }); } @@ -146,7 +146,7 @@ public class RegionListener implements Listener { plugin.getConfig().getInt("settings.server.discoveries.discovered.sound.pitch") )); - if (region.getRewards() != null) region.getRewards().forEach(reward -> reward.award(player)); + if (region.getRewards() != null) region.getRewards().forEach(reward -> reward.award(player, rde.getAccount())); if (region.getRegenerate() != null && region.getRegenerate().isOnDiscover()) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java index 3114805..227c4b5 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java @@ -11,6 +11,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.Discovery; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; +import net.islandearth.rpgregions.utils.TimeEntry; import org.bukkit.Bukkit; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.output.ValidateOutput; @@ -19,7 +20,7 @@ import org.flywaydb.core.api.output.ValidateResult; import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; +import java.time.format.DateTimeParseException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,8 +32,14 @@ public abstract class SQLCommonStorage implements IStorageManager { protected static final String SELECT_REGION = "SELECT * FROM rpgregions_discoveries WHERE uuid = ?"; protected static final String INSERT_DISCOVERY = "INSERT INTO rpgregions_discoveries (uuid, discovery_id, time) VALUES (?, ?, ?)"; - protected static final String DELETE_DISCOVERIES = "DELETE * FROM rpgregions_discoveries WHERE uuid = ?"; - protected static final String DELETE_DISCOVERY = "DELETE * FROM rpgregions_discoveries WHERE uuid = ? AND discovery_id = ?"; + protected static final String DELETE_DISCOVERIES = "DELETE FROM rpgregions_discoveries WHERE uuid = ?"; + protected static final String DELETE_DISCOVERY = "DELETE FROM rpgregions_discoveries WHERE uuid = ? AND discovery_id = ?"; + + // Timed region discoveries + protected static final String SELECT_TIMED_REGION = "SELECT * FROM rpgregions_timed_discoveries WHERE uuid = ?"; + protected static final String INSERT_TIMED_REGION = "INSERT INTO rpgregions_timed_discoveries (uuid, region, start, latest) VALUES (?, ?, ?)"; + protected static final String DELETE_TIMED_REGIONS = "DELETE FROM rpgregions_timed_discoveries WHERE uuid = ?"; + protected static final String DELETE_TIMED_REGION = "DELETE FROM rpgregions_timed_discoveries WHERE uuid = ? AND region = ?"; private final AsyncCache cachedAccounts; @@ -129,11 +136,28 @@ public abstract class SQLCommonStorage implements IStorageManager { Map regions = new HashMap<>(); for (DbRow row : results) { String discoveryId = row.getString("discovery_id"); - regions.put(discoveryId, new WorldDiscovery(LocalDateTime.parse(row.getString("time")), discoveryId)); + LocalDateTime time; + try { + time = LocalDateTime.parse(row.getString("time")); + } catch (DateTimeParseException e) { + plugin.getLogger().info("Migrating legacy stored date for " + uuid + ": " + e.getMessage()); + time = plugin.getDateFormatter().parse(row.getString("time"), LocalDateTime::from); + } + regions.put(discoveryId, new WorldDiscovery(time, discoveryId)); + } + + final RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); + + final List timedResults = DB.getResultsAsync(SELECT_TIMED_REGION, getDatabaseUuid(uuid)).join(); + for (DbRow row : timedResults) { + final String regionId = row.getString("region"); + final Long start = row.getLong("start"); + final Long latest = row.getLong("latest"); + final TimeEntry timeEntry = account.addTimeEntryInRegion(regionId, start); + timeEntry.setLatestEntry(latest); } plugin.debug("Created user account: " + uuid); - final RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); future.complete(account); return account; }).exceptionally(t -> { @@ -193,19 +217,22 @@ public abstract class SQLCommonStorage implements IStorageManager { @Override public CompletableFuture saveAccount(RPGRegionsAccount account) { final UUID uuid = account.getUuid(); - return DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { - List current = new ArrayList<>(); - for (DbRow row : results) { - current.add(row.getString("discovery_id")); - } - - for (Discovery discovery : account.getDiscoveries().values()) { - if (!current.contains(discovery.getDiscoveredName())) { + return CompletableFuture.supplyAsync(() -> { + try { + DB.executeUpdate(DELETE_DISCOVERIES, getDatabaseUuid(uuid)); + for (Discovery discovery : account.getDiscoveries().values()) { executeInsert(INSERT_DISCOVERY, getDatabaseUuid(uuid), discovery.getDiscoveredName(), DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(discovery.getDate())); } + + // Remove all existing timed regions first + DB.executeUpdate(DELETE_TIMED_REGIONS, getDatabaseUuid(uuid)); + account.getTimedEntries().forEach((regionId, entry) -> { + if (account.getDiscoveries().containsKey(regionId)) return; // Ignore if this somehow happened + executeInsert(INSERT_TIMED_REGION, getDatabaseUuid(uuid), regionId, entry.getStart(), entry.getLatestEntry()); + }); + } catch (SQLException e) { + e.printStackTrace(); } - }).exceptionally(t -> { - t.printStackTrace(); return null; }); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java index 6e14acd..d3f1905 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java @@ -10,6 +10,7 @@ import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.Discovery; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; +import net.islandearth.rpgregions.utils.TimeEntry; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -19,6 +20,7 @@ import java.io.IOException; import java.nio.file.Files; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -71,19 +73,50 @@ public class YamlStorage implements IStorageManager { File file = new File(plugin.getDataFolder() + "/accounts/" + uuid.toString() + ".yml"); FileConfiguration config = YamlConfiguration.loadConfiguration(file); + Map regions = getDiscoveries(uuid, config); + final Map timeEntries = getTimeEntries(config); + + plugin.debug("Created user account: " + uuid); + RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); + timeEntries.forEach((region, e) -> { + final TimeEntry entry = account.addTimeEntryInRegion(region, e.getStart()); + entry.setLatestEntry(e.getLatestEntry()); + }); + cachedAccounts.put(uuid, CompletableFuture.completedFuture(account)); + future.complete(account); + return future; + } + + private Map getDiscoveries(UUID uuid, FileConfiguration config) { Map regions = new HashMap<>(); for (String results : config.getStringList("Discoveries")) { String[] data = results.split(";"); String time = data[0]; String region = data[1]; - regions.put(region, new WorldDiscovery(LocalDateTime.parse(time), region)); + LocalDateTime localDateTime; + try { + localDateTime = LocalDateTime.parse(time); + } catch (DateTimeParseException e) { + plugin.getLogger().info("Migrating legacy stored date for " + uuid + ": " + e.getMessage()); + localDateTime = plugin.getDateFormatter().parse(time, LocalDateTime::from); + } + regions.put(region, new WorldDiscovery(localDateTime, region)); } + return regions; + } - plugin.debug("Created user account: " + uuid); - RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); - cachedAccounts.put(uuid, CompletableFuture.completedFuture(account)); - future.complete(account); - return future; + private Map getTimeEntries(FileConfiguration config) { + Map timeEntries = new HashMap<>(); + for (String timedDiscovery : config.getStringList("timed_discoveries")) { + final String[] data = timedDiscovery.split(";"); + String region = data[0]; + long start = Long.parseLong(data[1]); + long latest = Long.parseLong(data[2]); + TimeEntry entry = new TimeEntry(start); + entry.setLatestEntry(latest); + timeEntries.put(region, entry); + } + return timeEntries; } @Override @@ -93,9 +126,7 @@ public class YamlStorage implements IStorageManager { @Override public void clearDiscoveries(UUID uuid) { - getAccount(uuid).thenAccept(account -> { - account.getDiscoveries().clear(); - }).exceptionally(t -> { + getAccount(uuid).thenAccept(account -> account.getDiscoveries().clear()).exceptionally(t -> { t.printStackTrace(); return null; }); @@ -121,20 +152,12 @@ public class YamlStorage implements IStorageManager { File file = new File(plugin.getDataFolder() + "/accounts/" + uuid.toString() + ".yml"); FileConfiguration config = YamlConfiguration.loadConfiguration(file); - Map regions = new HashMap<>(); - for (String results : config.getStringList("Discoveries")) { - String[] data = results.split(";"); - String time = data[0]; - String region = data[1]; - regions.put(region, new WorldDiscovery(LocalDateTime.parse(time), region)); - } - + Map regions = getDiscoveries(uuid, config); regions.remove(regionId); - List newData = config.getStringList("Discoveries"); - newData.clear(); + List newData = new ArrayList<>(); for (Discovery region : regions.values()) { - newData.add(region.getDate() + ";" + region.getDiscoveredName()); + newData.add(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(region.getDate()) + ";" + region.getDiscoveredName()); } config.set("Discoveries", newData); @@ -178,6 +201,14 @@ public class YamlStorage implements IStorageManager { } config.set("Discoveries", newData); + + List timedEntryData = new ArrayList<>(); + account.getTimedEntries().forEach((region, entry) -> { + if (account.getDiscoveries().containsKey(region)) return; // Ignore if this somehow happened + timedEntryData.add(region + ";" + entry.getStart() + ";" + entry.getLatestEntry()); + }); + config.set("timed_discoveries", timedEntryData); + try { config.save(file); } catch (IOException e) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java index 123011e..e61e453 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import com.alonsoaliaga.alonsolevels.api.AlonsoLevelsAPI; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.entity.Player; public class AlonsoLevelReward extends LevelReward { @@ -15,9 +16,9 @@ public class AlonsoLevelReward extends LevelReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { AlonsoLevelsAPI.addLevel(player.getUniqueId(), getLevel()); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/BetonQuestReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/BetonQuestReward.java index d59f130..fe00d44 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/BetonQuestReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/BetonQuestReward.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.entity.Player; public class BetonQuestReward extends QuestReward { @@ -10,7 +11,7 @@ public class BetonQuestReward extends QuestReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { //todo: According to the developer, BetonQuest has no such concept of "starting" or "completing" quests? } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java index a82083f..0ec8e00 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java @@ -3,6 +3,7 @@ package net.islandearth.rpgregions.rewards; import me.clip.placeholderapi.PlaceholderAPI; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -23,13 +24,13 @@ public class ConsoleCommandReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { String command = this.command.replace("%player%", player.getName()); if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { command = PlaceholderAPI.setPlaceholders(player, command); } Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java index b522672..24569e5 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -21,9 +22,9 @@ public class ExperienceReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { player.giveExp(xp); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java index a2a772a..d3c32cf 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -21,11 +22,11 @@ public class ItemReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { player.getInventory().addItem(item).forEach((pos, item) -> { player.getLocation().getWorld().dropItemNaturally(player.getLocation(), item); }); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MMOCoreLevelReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MMOCoreLevelReward.java index 9033152..16446f0 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MMOCoreLevelReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MMOCoreLevelReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import net.Indyuce.mmocore.api.player.PlayerData; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.entity.Player; public class MMOCoreLevelReward extends LevelReward { @@ -15,10 +16,10 @@ public class MMOCoreLevelReward extends LevelReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { final PlayerData playerData = PlayerData.get(player.getUniqueId()); playerData.setLevel(playerData.getLevel() + this.getLevel()); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java index 229eb39..2c3a408 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -28,9 +29,9 @@ public class MessageReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { messages.forEach(message -> player.sendMessage(ChatColor.translateAlternateColorCodes('&', message))); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java index a07d69e..d290958 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -23,7 +24,7 @@ public class MoneyReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { return; } @@ -34,7 +35,7 @@ public class MoneyReward extends DiscoveryReward { } economy.getProvider().depositPlayer(player, amount); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlaceholderConsoleCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlaceholderConsoleCommandReward.java index 037f365..fdba5d3 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlaceholderConsoleCommandReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlaceholderConsoleCommandReward.java @@ -3,6 +3,7 @@ package net.islandearth.rpgregions.rewards; import me.clip.placeholderapi.PlaceholderAPI; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.utils.PlaceholderCompareType; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -35,10 +36,10 @@ public class PlaceholderConsoleCommandReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { if (hasPlaceholder(player)) { Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), PlaceholderAPI.setPlaceholders(player, command.replace("%player%", player.getName()))); - this.updateAwardTime(); + this.updateAwardTime(account); } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java index 3f10072..394547a 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java @@ -3,6 +3,7 @@ package net.islandearth.rpgregions.rewards; import me.clip.placeholderapi.PlaceholderAPI; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -23,13 +24,13 @@ public class PlayerCommandReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { String command = this.command.replace("%player%", player.getName()); if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { command = PlaceholderAPI.setPlaceholders(player, command); } player.performCommand(command); - this.updateAwardTime(); + this.updateAwardTime(account); } @Override diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java index afceead..617892d 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java @@ -5,6 +5,7 @@ import me.blackvein.quests.Quests; import me.blackvein.quests.player.IQuester; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.thread.Blocking; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -42,7 +43,7 @@ public class QuestReward extends DiscoveryReward implements Blocking { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { Quests quests = JavaPlugin.getPlugin(Quests.class); try { // Have to perform blocking operation. IQuester quester = quests.getStorage().loadQuester(player.getUniqueId()).get(); @@ -50,7 +51,7 @@ public class QuestReward extends DiscoveryReward implements Blocking { if (quest == null) return; if (start) quester.takeQuest(quest, ignoreRequirements); else quest.completeQuest(quester); - this.updateAwardTime(); + this.updateAwardTime(account); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/RegionDiscoverReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/RegionDiscoverReward.java index 8dc5229..0f0e0d1 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/RegionDiscoverReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/RegionDiscoverReward.java @@ -4,6 +4,7 @@ import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionDiscoverEvent; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; import org.bukkit.Bukkit; @@ -27,7 +28,7 @@ public class RegionDiscoverReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { IRPGRegionsAPI api = RPGRegionsAPI.getAPI(); final Optional region = api.getManagers().getRegionsCache().getConfiguredRegion(this.region); if (region.isEmpty()) { @@ -35,12 +36,10 @@ public class RegionDiscoverReward extends DiscoveryReward { return; } - api.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAccept(account -> { - LocalDateTime date = LocalDateTime.now(); - final WorldDiscovery worldDiscovery = new WorldDiscovery(date, this.region); - account.addDiscovery(worldDiscovery); - Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, region.get(), worldDiscovery)); - this.updateAwardTime(); - }); + LocalDateTime date = LocalDateTime.now(); + final WorldDiscovery worldDiscovery = new WorldDiscovery(date, this.region); + account.addDiscovery(worldDiscovery); + Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, account, region.get(), worldDiscovery)); + this.updateAwardTime(account); } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/TeleportReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/TeleportReward.java index 57a64a6..0cea158 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/TeleportReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/TeleportReward.java @@ -3,6 +3,7 @@ package net.islandearth.rpgregions.rewards; import io.papermc.lib.PaperLib; import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -32,8 +33,8 @@ public class TeleportReward extends DiscoveryReward { } @Override - public void award(Player player) { + public void award(Player player, RPGRegionsAccount account) { PaperLib.teleportAsync(player, location); - this.updateAwardTime(); + this.updateAwardTime(account); } } diff --git a/rpgregions/src/main/resources/db/migration/V4__Create_TimedDiscoveries_Table.sql b/rpgregions/src/main/resources/db/migration/V4__Create_TimedDiscoveries_Table.sql new file mode 100644 index 0000000..e241c8f --- /dev/null +++ b/rpgregions/src/main/resources/db/migration/V4__Create_TimedDiscoveries_Table.sql @@ -0,0 +1 @@ +CREATE TABLE IF NOT EXISTS rpgregions_timed_discoveries (uuid varchar(32) NOT NULL, region varchar(32) NOT NULL, start bigint(9223372036854775807) NOT NULL, latest bigint(9223372036854775807), PRIMARY KEY(uuid, region));