9
0
mirror of https://gitlab.com/SamB440/rpgregions-2.git synced 2025-12-20 15:29:23 +00:00

WIP fauna implementation

This commit is contained in:
SamB440
2023-11-19 17:32:05 +00:00
parent 35336884a7
commit c2e1e77bbf
28 changed files with 314 additions and 57 deletions

View File

@@ -75,7 +75,7 @@ public interface IntegrationManager {
List<String> discoveries = new ArrayList<>(); List<String> discoveries = new ArrayList<>();
try { try {
RPGRegionsAccount account = RPGRegionsAPI.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); RPGRegionsAccount account = RPGRegionsAPI.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).get();
discoveries.addAll(account.getDiscoveredRegions().keySet()); discoveries.addAll(account.getDiscoveries().keySet());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -0,0 +1,36 @@
package net.islandearth.rpgregions.fauna;
import net.islandearth.rpgregions.fauna.trigger.FaunaTrigger;
import java.util.List;
public abstract class FaunaInstance<M> {
private final String identifier;
private final String name;
private final M type;
private final List<FaunaTrigger> triggers;
public FaunaInstance(String identifier, String name, M type, List<FaunaTrigger> triggers) {
this.identifier = identifier;
this.name = name;
this.type = type;
this.triggers = triggers;
}
public String getIdentifier() {
return identifier;
}
public String getName() {
return name;
}
public M getType() {
return type;
}
public List<FaunaTrigger> getTriggers() {
return triggers;
}
}

View File

@@ -0,0 +1,14 @@
package net.islandearth.rpgregions.fauna.trigger;
import net.islandearth.rpgregions.fauna.FaunaInstance;
import org.bukkit.entity.Player;
public abstract class FaunaTrigger {
/**
* Tests whether this trigger is met by the specified player.
* @param player the player to check
* @return true if met, false otherwise
*/
public abstract boolean testRepeatable(Player player, FaunaInstance<?> instance);
}

View File

@@ -4,6 +4,7 @@ import net.islandearth.rpgregions.api.integrations.IntegrationManager;
import net.islandearth.rpgregions.gui.element.IGuiFieldElementRegistry; import net.islandearth.rpgregions.gui.element.IGuiFieldElementRegistry;
import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; import net.islandearth.rpgregions.managers.data.IRPGRegionsCache;
import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.IStorageManager;
import net.islandearth.rpgregions.managers.data.fauna.IFaunaCache;
import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry; import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry;
public interface IRPGRegionsManagers { public interface IRPGRegionsManagers {
@@ -12,6 +13,8 @@ public interface IRPGRegionsManagers {
IntegrationManager getIntegrationManager(); IntegrationManager getIntegrationManager();
IFaunaCache getFaunaCache();
IRPGRegionsCache getRegionsCache(); IRPGRegionsCache getRegionsCache();
IRegenerationManager getRegenerationManager(); IRegenerationManager getRegenerationManager();

View File

@@ -13,13 +13,13 @@ import java.util.UUID;
public class RPGRegionsAccount { public class RPGRegionsAccount {
private final UUID uuid; private final UUID uuid;
private final Map<String, Discovery> discoveredRegions; private final Map<String, Discovery> discoveries;
private final List<AccountCooldown> cooldowns; private final List<AccountCooldown> cooldowns;
private final Map<String, TimeEntry> secondsInRegion; private final Map<String, TimeEntry> secondsInRegion;
public RPGRegionsAccount(UUID uuid, Map<String, Discovery> discoveredRegions) { public RPGRegionsAccount(UUID uuid, Map<String, Discovery> discoveries) {
this.uuid = uuid; this.uuid = uuid;
this.discoveredRegions = discoveredRegions; this.discoveries = discoveries;
this.cooldowns = new ArrayList<>(); this.cooldowns = new ArrayList<>();
this.secondsInRegion = new HashMap<>(); this.secondsInRegion = new HashMap<>();
} }
@@ -28,12 +28,16 @@ public class RPGRegionsAccount {
return uuid; return uuid;
} }
public Map<String, Discovery> getDiscoveredRegions() { public Map<String, Discovery> getDiscoveries() {
return discoveredRegions; return discoveries;
}
public boolean hasDiscovered(String discoveryName) {
return discoveries.containsKey(discoveryName);
} }
public void addDiscovery(Discovery discovery) { public void addDiscovery(Discovery discovery) {
discoveredRegions.put(discovery.getRegion(), discovery); discoveries.put(discovery.getDiscoveredName(), discovery);
} }
public List<AccountCooldown> getCooldowns() { public List<AccountCooldown> getCooldowns() {

View File

@@ -0,0 +1,12 @@
package net.islandearth.rpgregions.managers.data.fauna;
import net.islandearth.rpgregions.fauna.FaunaInstance;
import java.util.List;
public interface IFaunaCache {
List<FaunaInstance<?>> getFauna();
void addFauna(FaunaInstance<?> instance);
}

View File

@@ -1,16 +1,18 @@
package net.islandearth.rpgregions.managers.data.region; package net.islandearth.rpgregions.managers.data.region;
import java.time.LocalDateTime;
public interface Discovery { public interface Discovery {
/** /**
* Gets the date this discovery was made. * Gets the date this discovery was made.
* @return date of discovery * @return date of discovery
*/ */
String getDate(); LocalDateTime getDate();
/** /**
* Gets the name of the region that was discovered. * Gets the name of what was discovered.
* @return name of region discovered * @return name of discovered
*/ */
String getRegion(); String getDiscoveredName();
} }

View File

@@ -1,14 +1,17 @@
package net.islandearth.rpgregions.managers.data.region; package net.islandearth.rpgregions.managers.data.region;
public record WorldDiscovery(String date, String region) implements Discovery { import java.time.LocalDate;
import java.time.LocalDateTime;
public record WorldDiscovery(LocalDateTime date, String region) implements Discovery {
@Override @Override
public String getDate() { public LocalDateTime getDate() {
return date; return date;
} }
@Override @Override
public String getRegion() { public String getDiscoveredName() {
return region; return region;
} }
} }

View File

@@ -45,7 +45,10 @@ public enum Translations {
DISCOVERING_AREA_PLACEHOLDER(TranslationKey.of("discovering_area_placeholder")), DISCOVERING_AREA_PLACEHOLDER(TranslationKey.of("discovering_area_placeholder")),
REQUIREMENT_MET(TranslationKey.of("requirement_met")), REQUIREMENT_MET(TranslationKey.of("requirement_met")),
REQUIREMENT_NOT_MET(TranslationKey.of("requirement_not_met")), REQUIREMENT_NOT_MET(TranslationKey.of("requirement_not_met")),
COORDINATES(TranslationKey.of("coordinates")); COORDINATES(TranslationKey.of("coordinates")),
// Fauna
FAUNA_DISCOVER_TITLE(TranslationKey.of("fauna_discover_title")),
FAUNA_DISCOVER_SUBTITLE(TranslationKey.of("fauna_discover_subtitle"));
private final TranslationKey key; private final TranslationKey key;
private final boolean isList; private final boolean isList;

View File

@@ -30,3 +30,6 @@ discovering_area_placeholder: "<gold>Discovering a new area (%d%)..."
requirement_met: "<gradient:dark_green:green>✔ %s" requirement_met: "<gradient:dark_green:green>✔ %s"
requirement_not_met: "<gradient:dark_red:red>✘ %s" requirement_not_met: "<gradient:dark_red:red>✘ %s"
coordinates: "<gray>Coordinates: %d, %d" coordinates: "<gray>Coordinates: %d, %d"
# Fauna related settings
fauna_discover_title: "<#F5AF2F>Bestiary Updated"
fauna_discover_subtitle: "<white>%s <#04DB64>indexed"

View File

@@ -22,7 +22,7 @@ dependencies {
exclude("net.kyori") exclude("net.kyori")
} }
implementation("net.wesjd:anvilgui:1.7.0-SNAPSHOT") // anvilgui implementation("net.wesjd:anvilgui:1.9.0-SNAPSHOT") // anvilgui
implementation("com.github.stefvanschie.inventoryframework:IF:0.10.12") // inventory framework implementation("com.github.stefvanschie.inventoryframework:IF:0.10.12") // inventory framework
implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") // database implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") // database
implementation("org.bstats:bstats-bukkit:3.0.2") // plugin stats implementation("org.bstats:bstats-bukkit:3.0.2") // plugin stats

View File

@@ -18,6 +18,7 @@ import net.islandearth.rpgregions.effects.RegionEffect;
import net.islandearth.rpgregions.effects.RegionEffectRegistry; import net.islandearth.rpgregions.effects.RegionEffectRegistry;
import net.islandearth.rpgregions.effects.VanishEffect; import net.islandearth.rpgregions.effects.VanishEffect;
import net.islandearth.rpgregions.exception.CouldNotStartException; import net.islandearth.rpgregions.exception.CouldNotStartException;
import net.islandearth.rpgregions.fauna.FaunaDiscoverer;
import net.islandearth.rpgregions.folia.schedule.FoliaScheduler; import net.islandearth.rpgregions.folia.schedule.FoliaScheduler;
import net.islandearth.rpgregions.gson.AbstractAdapter; import net.islandearth.rpgregions.gson.AbstractAdapter;
import net.islandearth.rpgregions.gson.ItemStackAdapter; import net.islandearth.rpgregions.gson.ItemStackAdapter;
@@ -77,6 +78,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.logging.Level; import java.util.logging.Level;
@@ -310,6 +312,7 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI {
getScheduler().executeRepeating(new DynmapTask(this), 0L, 20L); getScheduler().executeRepeating(new DynmapTask(this), 0L, 20L);
getLogger().info("Registered support for Dynmap."); getLogger().info("Registered support for Dynmap.");
} }
getScheduler().executeRepeating(new FaunaDiscoverer(this), 0L, 10L);
} }
private void registerMetrics() { private void registerMetrics() {
@@ -334,11 +337,19 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI {
metrics.addCustomChart(new SimplePie("integration_type", () -> getConfig().getString("settings.integration.name"))); metrics.addCustomChart(new SimplePie("integration_type", () -> getConfig().getString("settings.integration.name")));
} }
private DateTimeFormatter formatter;
public DateTimeFormatter getDateFormatter() {
if (formatter != null) return formatter;
return formatter = DateTimeFormatter.ofPattern(getConfig().getString("settings.server.discoveries.date.format"));
}
private Boolean debugEnabled; private Boolean debugEnabled;
// Called when the config is reloaded or the debug value was changed // Called when the config is reloaded or the debug value was changed
public void markDebugDirty() { public void markDebugDirty() {
this.debugEnabled = null; this.debugEnabled = null;
this.formatter = null;
} }
@Override @Override

View File

@@ -56,7 +56,7 @@ public class PlaceholderRegionHook extends PlaceholderExpansion implements Block
try { try {
RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get();
String region = identifier.replace("discovered_region_", ""); String region = identifier.replace("discovered_region_", "");
boolean discovered = account.getDiscoveredRegions().containsKey(region); boolean discovered = account.getDiscoveries().containsKey(region);
return String.valueOf(discovered); return String.valueOf(discovered);
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
@@ -75,7 +75,7 @@ public class PlaceholderRegionHook extends PlaceholderExpansion implements Block
// We have to do a blocking operation :( // We have to do a blocking operation :(
try { try {
RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get();
return String.valueOf(account.getDiscoveredRegions().size()); return String.valueOf(account.getDiscoveries().size());
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -83,7 +83,7 @@ public class PlaceholderRegionHook extends PlaceholderExpansion implements Block
// We have to do a blocking operation :( // We have to do a blocking operation :(
try { try {
RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get();
int percent = totalRegionsConfigured == 0 ? 0 : (account.getDiscoveredRegions().size() / totalRegionsConfigured) * 100; int percent = totalRegionsConfigured == 0 ? 0 : (account.getDiscoveries().size() / totalRegionsConfigured) * 100;
return String.valueOf(percent); return String.valueOf(percent);
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
@@ -102,7 +102,7 @@ public class PlaceholderRegionHook extends PlaceholderExpansion implements Block
// We have to do a blocking operation :( // We have to do a blocking operation :(
try { try {
RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get(); RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).get();
if (account.getDiscoveredRegions().containsKey(region.get().getId())) { if (account.getDiscoveries().containsKey(region.get().getId())) {
return region.get().getCustomName(); return region.get().getCustomName();
} }

View File

@@ -33,7 +33,7 @@ public class PlanRegionHook implements DataExtension {
public long regionCount(UUID playerUUID) throws InterruptedException, ExecutionException { public long regionCount(UUID playerUUID) throws InterruptedException, ExecutionException {
// Have to do blocking operation :( // Have to do blocking operation :(
RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(playerUUID).get(); RPGRegionsAccount account = plugin.getManagers().getStorageManager().getAccount(playerUUID).get();
return account.getDiscoveredRegions().size(); return account.getDiscoveries().size();
} }
@Override @Override

View File

@@ -16,7 +16,6 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DiscoveriesCommand { public class DiscoveriesCommand {
@@ -41,10 +40,7 @@ public class DiscoveriesCommand {
@Argument("player") OfflinePlayer target) { @Argument("player") OfflinePlayer target) {
plugin.getManagers().getStorageManager().getAccount(target.getUniqueId()).thenAccept(account -> { plugin.getManagers().getStorageManager().getAccount(target.getUniqueId()).thenAccept(account -> {
LocalDateTime date = LocalDateTime.now(); LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern(plugin.getConfig().getString("settings.server.discoveries.date.format")); final WorldDiscovery worldDiscovery = new WorldDiscovery(date, configuredRegion.getId());
String formattedDate = date.format(format);
final WorldDiscovery worldDiscovery = new WorldDiscovery(formattedDate, configuredRegion.getId());
account.addDiscovery(worldDiscovery); account.addDiscovery(worldDiscovery);
if (target.getPlayer() != null) { if (target.getPlayer() != null) {
Player player = target.getPlayer(); Player player = target.getPlayer();

View File

@@ -0,0 +1,56 @@
package net.islandearth.rpgregions.fauna;
import com.google.common.base.Enums;
import net.islandearth.rpgregions.RPGRegions;
import net.islandearth.rpgregions.fauna.trigger.FaunaTrigger;
import net.islandearth.rpgregions.managers.data.fauna.IFaunaCache;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.EntityType;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FaunaCache implements IFaunaCache {
private final List<FaunaInstance<?>> fauna = new ArrayList<>();
public FaunaCache(RPGRegions plugin) {
plugin.saveResource("fauna/goat.yml", false);
File faunaFolder = new File(plugin.getDataFolder() + File.separator + "fauna");
for (File file : faunaFolder.listFiles()) {
if (!file.getName().endsWith(".yml")) continue;
final YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
final String typeName = config.getString("type", "");
final String identifier = config.getString("identifier", "");
final String name = config.getString("name", "");
List<FaunaTrigger> triggers = new ArrayList<>();
final ConfigurationSection triggersSection = config.getConfigurationSection("triggers");
for (String triggerId : triggersSection.getKeys(false)) {
final ConfigurationSection triggerSection = triggersSection.getConfigurationSection(triggerId);
if (triggerId.equals("nearby")) {
final double radius = triggerSection.getDouble("radius");
triggers.add(new NearbyFaunaTrigger(radius));
continue;
}
}
final EntityType entityType = Enums.getIfPresent(EntityType.class, typeName).orNull();
if (entityType != null) {
this.addFauna(new VanillaMobFaunaInstance(identifier, name, entityType, triggers));
}
}
}
@Override
public List<FaunaInstance<?>> getFauna() {
return fauna;
}
@Override
public void addFauna(FaunaInstance<?> instance) {
fauna.add(instance);
}
}

View File

@@ -0,0 +1,41 @@
package net.islandearth.rpgregions.fauna;
import net.islandearth.rpgregions.RPGRegions;
import net.islandearth.rpgregions.fauna.trigger.FaunaTrigger;
import net.islandearth.rpgregions.managers.data.region.WorldDiscovery;
import net.islandearth.rpgregions.translation.Translations;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.title.Title;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.time.LocalDateTime;
public class FaunaDiscoverer implements Runnable {
private final RPGRegions plugin;
public FaunaDiscoverer(RPGRegions plugin) {
this.plugin = plugin;
}
@Override
public void run() {
for (Player player : Bukkit.getOnlinePlayers()) {
final Audience audience = plugin.adventure().player(player);
plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAccept(account -> {
for (FaunaInstance<?> fauna : plugin.getManagers().getFaunaCache().getFauna()) {
if (account.hasDiscovered(fauna.getIdentifier())) continue;
for (FaunaTrigger trigger : fauna.getTriggers()) {
if (trigger.testRepeatable(player, fauna)) {
WorldDiscovery discovery = new WorldDiscovery(LocalDateTime.now(), fauna.getIdentifier());
account.addDiscovery(discovery);
audience.showTitle(Title.title(Translations.FAUNA_DISCOVER_TITLE.get(player, fauna.getName()).get(0), Translations.FAUNA_DISCOVER_SUBTITLE.get(player, fauna.getName()).get(0)));
break;
}
}
}
});
}
}
}

View File

@@ -0,0 +1,6 @@
package net.islandearth.rpgregions.fauna;
import org.bukkit.event.Listener;
public class FaunaListener implements Listener {
}

View File

@@ -0,0 +1,30 @@
package net.islandearth.rpgregions.fauna;
import net.islandearth.rpgregions.fauna.trigger.FaunaTrigger;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
public class NearbyFaunaTrigger extends FaunaTrigger {
private final double radius;
public NearbyFaunaTrigger(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public boolean testRepeatable(Player player, FaunaInstance<?> instance) {
for (Entity entity : player.getNearbyEntities(radius, radius, radius)) {
if (instance instanceof VanillaMobFaunaInstance vanilla) {
if (vanilla.getType() == entity.getType()) {
return true;
}
}
}
return false;
}
}

View File

@@ -0,0 +1,13 @@
package net.islandearth.rpgregions.fauna;
import net.islandearth.rpgregions.fauna.trigger.FaunaTrigger;
import org.bukkit.entity.EntityType;
import java.util.List;
public class VanillaMobFaunaInstance extends FaunaInstance<EntityType> {
public VanillaMobFaunaInstance(String identifier, String name, EntityType type, List<FaunaTrigger> triggers) {
super(identifier, name, type, triggers);
}
}

View File

@@ -186,16 +186,16 @@ public class DiscoveryGUI extends RPGRegionsGUI {
plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAcceptAsync(account -> { plugin.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAcceptAsync(account -> {
List<GuiItem> items = new ArrayList<>(); List<GuiItem> items = new ArrayList<>();
for (ConfiguredRegion configuredRegion : plugin.getManagers().getRegionsCache().getConfiguredRegions().values()) { for (ConfiguredRegion configuredRegion : plugin.getManagers().getRegionsCache().getConfiguredRegions().values()) {
boolean hasDiscovered = account.getDiscoveredRegions().containsKey(configuredRegion.getId()); boolean hasDiscovered = account.getDiscoveries().containsKey(configuredRegion.getId());
if ((!hasDiscovered && !player.hasPermission("rpgregions.show")) if ((!hasDiscovered && !player.hasPermission("rpgregions.show"))
|| configuredRegion.isHidden()) continue; || configuredRegion.isHidden()) continue;
final String colour = hasDiscovered final String colour = hasDiscovered
? plugin.getConfig().getString("settings.server.discoveries.discovered.name-colour") ? plugin.getConfig().getString("settings.server.discoveries.discovered.name-colour")
: plugin.getConfig().getString("settings.server.discoveries.undiscovered.name-colour"); : plugin.getConfig().getString("settings.server.discoveries.undiscovered.name-colour");
List<Component> lore = account.getDiscoveredRegions().containsKey(configuredRegion.getId()) List<Component> lore = account.getDiscoveries().containsKey(configuredRegion.getId())
? Translations.DISCOVERED_ON.get(player, ? Translations.DISCOVERED_ON.get(player,
account.getDiscoveredRegions().get(configuredRegion.getId()).getDate()) plugin.getDateFormatter().format(account.getDiscoveries().get(configuredRegion.getId()).getDate()))
: null; : null;
List<Component> coordsLore = configuredRegion.showCoords() List<Component> coordsLore = configuredRegion.showCoords()
&& player.hasPermission("rpgregions.showloc") && player.hasPermission("rpgregions.showloc")
@@ -222,7 +222,7 @@ public class DiscoveryGUI extends RPGRegionsGUI {
for (RegionRequirement requirement : configuredRegion.getRequirements()) { for (RegionRequirement requirement : configuredRegion.getRequirements()) {
boolean meets = requirement.meetsRequirements(player); boolean meets = requirement.meetsRequirements(player);
if (requirement instanceof DependencyRequirement dependencyRequirement) { if (requirement instanceof DependencyRequirement dependencyRequirement) {
List<String> discoveries = new ArrayList<>(account.getDiscoveredRegions().keySet()); List<String> discoveries = new ArrayList<>(account.getDiscoveries().keySet());
meets = dependencyRequirement.meetsRequirements(discoveries); meets = dependencyRequirement.meetsRequirements(discoveries);
} }
if (!meets) { if (!meets) {

View File

@@ -20,7 +20,6 @@ import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -31,12 +30,10 @@ public class RegionListener implements Listener {
private final RPGRegions plugin; private final RPGRegions plugin;
private final List<UUID> titleCooldown; private final List<UUID> titleCooldown;
private final DateTimeFormatter format;
public RegionListener(RPGRegions plugin) { public RegionListener(RPGRegions plugin) {
this.plugin = plugin; this.plugin = plugin;
this.titleCooldown = new ArrayList<>(); this.titleCooldown = new ArrayList<>();
this.format = DateTimeFormatter.ofPattern(plugin.getConfig().getString("settings.server.discoveries.date.format"));
} }
/** /**
@@ -66,8 +63,8 @@ public class RegionListener implements Listener {
final String regionId = configuredRegion.getId(); final String regionId = configuredRegion.getId();
boolean has = false; boolean has = false;
boolean prioritised = event.getPriority().equals(regionId); boolean prioritised = event.getPriority().equals(regionId);
for (Discovery discoveredRegion : account.getDiscoveredRegions().values()) { for (Discovery discoveredRegion : account.getDiscoveries().values()) {
if (discoveredRegion.getRegion().equals(regionId)) { if (discoveredRegion.getDiscoveredName().equals(regionId)) {
has = true; has = true;
break; break;
} }
@@ -115,8 +112,7 @@ public class RegionListener implements Listener {
plugin.debug("Discovering region."); plugin.debug("Discovering region.");
LocalDateTime date = LocalDateTime.now(); LocalDateTime date = LocalDateTime.now();
String formattedDate = date.format(format); Discovery discovery = new WorldDiscovery(date, regionId);
Discovery discovery = new WorldDiscovery(formattedDate, regionId);
account.addDiscovery(discovery); account.addDiscovery(discovery);
Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, configuredRegion, discovery)); Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, configuredRegion, discovery));
} else if (prioritised && configuredRegion.isDiscoverable() && has) { } else if (prioritised && configuredRegion.isDiscoverable() && has) {

View File

@@ -11,6 +11,7 @@ import net.islandearth.rpgregions.effects.RegionEffect;
import net.islandearth.rpgregions.effects.RegionEffectRegistry; import net.islandearth.rpgregions.effects.RegionEffectRegistry;
import net.islandearth.rpgregions.effects.protocol.ProtocolCreator; import net.islandearth.rpgregions.effects.protocol.ProtocolCreator;
import net.islandearth.rpgregions.exception.CouldNotStartException; import net.islandearth.rpgregions.exception.CouldNotStartException;
import net.islandearth.rpgregions.fauna.FaunaCache;
import net.islandearth.rpgregions.gui.element.BooleanGuiFieldElement; import net.islandearth.rpgregions.gui.element.BooleanGuiFieldElement;
import net.islandearth.rpgregions.gui.element.CompareTypeGuiFieldElement; import net.islandearth.rpgregions.gui.element.CompareTypeGuiFieldElement;
import net.islandearth.rpgregions.gui.element.GuiFieldElementRegistry; import net.islandearth.rpgregions.gui.element.GuiFieldElementRegistry;
@@ -24,6 +25,7 @@ import net.islandearth.rpgregions.managers.data.IRPGRegionsCache;
import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.IStorageManager;
import net.islandearth.rpgregions.managers.data.RPGRegionsCache; import net.islandearth.rpgregions.managers.data.RPGRegionsCache;
import net.islandearth.rpgregions.managers.data.StorageType; import net.islandearth.rpgregions.managers.data.StorageType;
import net.islandearth.rpgregions.managers.data.fauna.IFaunaCache;
import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion;
import net.islandearth.rpgregions.managers.regeneration.RegenerationManager; import net.islandearth.rpgregions.managers.regeneration.RegenerationManager;
import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry; import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry;
@@ -74,6 +76,7 @@ public class RPGRegionsManagers implements IRPGRegionsManagers {
private IStorageManager storageManager; private IStorageManager storageManager;
private final IntegrationManager integrationManager; private final IntegrationManager integrationManager;
private final IFaunaCache faunaCache;
private final IRPGRegionsCache regionsCache; private final IRPGRegionsCache regionsCache;
private final IRegenerationManager regenerationManager; private final IRegenerationManager regenerationManager;
private final Map<Class<? extends RPGRegionsRegistry<?>>, RPGRegionsRegistry<?>> registry; private final Map<Class<? extends RPGRegionsRegistry<?>>, RPGRegionsRegistry<?>> registry;
@@ -93,6 +96,7 @@ public class RPGRegionsManagers implements IRPGRegionsManagers {
throw new CouldNotStartException("Unable to load IntegrationManager. The requested plugin is not enabled."); throw new CouldNotStartException("Unable to load IntegrationManager. The requested plugin is not enabled.");
} }
this.faunaCache = new FaunaCache(plugin);
this.regionsCache = new RPGRegionsCache(plugin); this.regionsCache = new RPGRegionsCache(plugin);
this.registry = new ConcurrentHashMap<>(); this.registry = new ConcurrentHashMap<>();
registry.put(RegionRequirementRegistry.class, new RegionRequirementRegistry()); registry.put(RegionRequirementRegistry.class, new RegionRequirementRegistry());
@@ -216,6 +220,11 @@ public class RPGRegionsManagers implements IRPGRegionsManagers {
return integrationManager; return integrationManager;
} }
@Override
public IFaunaCache getFaunaCache() {
return faunaCache;
}
@Override @Override
public IRPGRegionsCache getRegionsCache() { public IRPGRegionsCache getRegionsCache() {
return regionsCache; return regionsCache;

View File

@@ -15,9 +15,10 @@ import org.bukkit.Bukkit;
import org.flywaydb.core.Flyway; import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.output.ValidateOutput; import org.flywaydb.core.api.output.ValidateOutput;
import org.flywaydb.core.api.output.ValidateResult; import org.flywaydb.core.api.output.ValidateResult;
import org.intellij.lang.annotations.Language;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -128,7 +129,7 @@ public abstract class SQLCommonStorage implements IStorageManager {
Map<String, Discovery> regions = new HashMap<>(); Map<String, Discovery> regions = new HashMap<>();
for (DbRow row : results) { for (DbRow row : results) {
String region = row.getString("region"); String region = row.getString("region");
regions.put(region, new WorldDiscovery(row.getString("time"), region)); regions.put(region, new WorldDiscovery(LocalDateTime.parse(row.getString("time")), region));
} }
plugin.debug("Created user account: " + uuid); plugin.debug("Created user account: " + uuid);
@@ -149,7 +150,7 @@ public abstract class SQLCommonStorage implements IStorageManager {
@Override @Override
public void clearDiscoveries(UUID uuid) { public void clearDiscoveries(UUID uuid) {
getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().clear()).exceptionally(t -> { getAccount(uuid).thenAccept(account -> account.getDiscoveries().clear()).exceptionally(t -> {
t.printStackTrace(); t.printStackTrace();
return null; return null;
}); });
@@ -159,7 +160,7 @@ public abstract class SQLCommonStorage implements IStorageManager {
@Override @Override
public void clearDiscovery(UUID uuid, String regionId) { public void clearDiscovery(UUID uuid, String regionId) {
getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().remove(regionId)).exceptionally(t -> { getAccount(uuid).thenAccept(account -> account.getDiscoveries().remove(regionId)).exceptionally(t -> {
t.printStackTrace(); t.printStackTrace();
return null; return null;
}); });
@@ -198,9 +199,9 @@ public abstract class SQLCommonStorage implements IStorageManager {
current.add(row.getString("region")); current.add(row.getString("region"));
} }
for (Discovery region : account.getDiscoveredRegions().values()) { for (Discovery region : account.getDiscoveries().values()) {
if (!current.contains(region.getRegion())) { if (!current.contains(region.getDiscoveredName())) {
executeInsert(INSERT_DISCOVERY, getDatabaseUuid(uuid), region.getRegion(), region.getDate()); executeInsert(INSERT_DISCOVERY, getDatabaseUuid(uuid), region.getDiscoveredName(), DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(region.getDate()));
} }
} }
}).exceptionally(t -> { }).exceptionally(t -> {
@@ -209,7 +210,7 @@ public abstract class SQLCommonStorage implements IStorageManager {
}); });
} }
protected void executeInsert(@Language("SQL") String query, Object... params) { protected void executeInsert(String query, Object... params) {
try { try {
DB.executeInsert(query, params); DB.executeInsert(query, params);
} catch (SQLException e) { } catch (SQLException e) {

View File

@@ -17,6 +17,8 @@ import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -74,7 +76,7 @@ public class YamlStorage implements IStorageManager {
String[] data = results.split(";"); String[] data = results.split(";");
String time = data[0]; String time = data[0];
String region = data[1]; String region = data[1];
regions.put(region, new WorldDiscovery(time, region)); regions.put(region, new WorldDiscovery(LocalDateTime.parse(time), region));
} }
plugin.debug("Created user account: " + uuid); plugin.debug("Created user account: " + uuid);
@@ -92,7 +94,7 @@ public class YamlStorage implements IStorageManager {
@Override @Override
public void clearDiscoveries(UUID uuid) { public void clearDiscoveries(UUID uuid) {
getAccount(uuid).thenAccept(account -> { getAccount(uuid).thenAccept(account -> {
account.getDiscoveredRegions().clear(); account.getDiscoveries().clear();
}).exceptionally(t -> { }).exceptionally(t -> {
t.printStackTrace(); t.printStackTrace();
return null; return null;
@@ -111,7 +113,7 @@ public class YamlStorage implements IStorageManager {
@Override @Override
public void clearDiscovery(UUID uuid, String regionId) { public void clearDiscovery(UUID uuid, String regionId) {
getAccount(uuid).thenAccept(account -> { getAccount(uuid).thenAccept(account -> {
account.getDiscoveredRegions().remove(regionId); account.getDiscoveries().remove(regionId);
}).exceptionally(t -> { }).exceptionally(t -> {
t.printStackTrace(); t.printStackTrace();
return null; return null;
@@ -124,7 +126,7 @@ public class YamlStorage implements IStorageManager {
String[] data = results.split(";"); String[] data = results.split(";");
String time = data[0]; String time = data[0];
String region = data[1]; String region = data[1];
regions.put(region, new WorldDiscovery(time, region)); regions.put(region, new WorldDiscovery(LocalDateTime.parse(time), region));
} }
regions.remove(regionId); regions.remove(regionId);
@@ -132,7 +134,7 @@ public class YamlStorage implements IStorageManager {
List<String> newData = config.getStringList("Discoveries"); List<String> newData = config.getStringList("Discoveries");
newData.clear(); newData.clear();
for (Discovery region : regions.values()) { for (Discovery region : regions.values()) {
newData.add(region.getDate() + ";" + region.getRegion()); newData.add(region.getDate() + ";" + region.getDiscoveredName());
} }
config.set("Discoveries", newData); config.set("Discoveries", newData);
@@ -171,8 +173,8 @@ public class YamlStorage implements IStorageManager {
FileConfiguration config = YamlConfiguration.loadConfiguration(file); FileConfiguration config = YamlConfiguration.loadConfiguration(file);
List<String> newData = new ArrayList<>(); List<String> newData = new ArrayList<>();
for (Discovery region : account.getDiscoveredRegions().values()) { for (Discovery region : account.getDiscoveries().values()) {
newData.add(region.getDate() + ";" + region.getRegion()); newData.add(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(region.getDate()) + ";" + region.getDiscoveredName());
} }
config.set("Discoveries", newData); config.set("Discoveries", newData);

View File

@@ -10,7 +10,6 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional; import java.util.Optional;
public class RegionDiscoverReward extends DiscoveryReward { public class RegionDiscoverReward extends DiscoveryReward {
@@ -38,10 +37,7 @@ public class RegionDiscoverReward extends DiscoveryReward {
api.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAccept(account -> { api.getManagers().getStorageManager().getAccount(player.getUniqueId()).thenAccept(account -> {
LocalDateTime date = LocalDateTime.now(); LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern(api.getConfig().getString("settings.server.discoveries.date.format")); final WorldDiscovery worldDiscovery = new WorldDiscovery(date, this.region);
String formattedDate = date.format(format);
final WorldDiscovery worldDiscovery = new WorldDiscovery(formattedDate, this.region);
account.addDiscovery(worldDiscovery); account.addDiscovery(worldDiscovery);
Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, region.get(), worldDiscovery)); Bukkit.getPluginManager().callEvent(new RegionDiscoverEvent(player, region.get(), worldDiscovery));
this.updateAwardTime(); this.updateAwardTime();

View File

@@ -0,0 +1 @@
ALTER TABLE rpgregions_discoveries RENAME COLUMN region to discovery_id;

View File

@@ -0,0 +1,19 @@
# The type can either be of a vanilla entity type, or a MythicMob
type: GOAT
# A unique identifier for this fauna. Must not be the same name as a region, either.
identifier: goat
# Name shown in placeholder
display_name: "Goat"
# Description shown in bestiary book
description:
- "The Goat is a fluffy, cute mob found in cold mountainous areas."
- "Goats are well-known for their milk that they produce."
- " "
- "But beware! Turn your back, and out of spite you shall find yourself rammed into the air."
# Triggers that define when this entity is discovered
triggers:
# Will be discovered when nearby to a goat in a radius of 5.
nearby:
radius: 5.0