diff --git a/src/main/java/org/adrianvictor/sweetdreams/EventListener.java b/src/main/java/org/adrianvictor/sweetdreams/EventListener.java index 4ec5e40..9a593e4 100644 --- a/src/main/java/org/adrianvictor/sweetdreams/EventListener.java +++ b/src/main/java/org/adrianvictor/sweetdreams/EventListener.java @@ -2,72 +2,48 @@ package org.adrianvictor.sweetdreams; import com.destroystokyo.paper.event.player.PlayerSetSpawnEvent; -import org.bukkit.Sound; -import org.bukkit.World; -import org.bukkit.block.Block; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerBedEnterEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.util.Vector; -import java.util.Objects; -import java.util.UUID; - public class EventListener implements Listener { private final PlayerStorage storage; private final PlayerTeleporter tp; private final YamlConfiguration configuration; - private final World dreamlands; - private final SweetDreams plugin; public EventListener() { this.storage = SweetDreams.getPlugin().getStorage(); this.tp = new PlayerTeleporter(); this.configuration = SweetDreams.getPlugin().getConfiguration().getPluginConfig(); - this.dreamlands = SweetDreams.getPlugin().getWorld(); - this.plugin = SweetDreams.getPlugin(); } @EventHandler(ignoreCancelled = true) public void onPlayerBedEnterEvent(PlayerBedEnterEvent event) { - long time = event.getPlayer().getWorld().getTime(); + if (event.getPlayer().getWorld() == SweetDreams.getPlugin().getWorld()) { + storage.savePlayerSpawnPoint(event.getPlayer()); + event.getPlayer().sendMessage("Respawn point set."); + event.setCancelled(true); + return; + } + + Long time = event.getPlayer().getWorld().getTime(); if (!(time >= 13000 && time <= 23000)) { event.setCancelled(true); return; } - tp.teleport(event.getPlayer(), false, "You feel free...", Sound.BLOCK_BEACON_ACTIVATE); + tp.teleport(event.getPlayer(), false); + event.setCancelled(true); } - @EventHandler - public void onInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - Block type = event.getClickedBlock(); - - if (event.getAction() != Action.LEFT_CLICK_BLOCK) - return; - - if (player.getWorld() != dreamlands || type == null) - return; - - if (type.getType().name().endsWith("_BED")) { - storage.savePlayerSpawnPoint(event.getPlayer()); - event.getPlayer().sendMessage("Respawn point set."); - tp.teleport(event.getPlayer(), false, "Maybe you'll return to this dream....", Sound.BLOCK_BEACON_DEACTIVATE); - event.setCancelled(true); - } - } - @EventHandler public void onPlayerSetSpawn(PlayerSetSpawnEvent event) { if (event.getPlayer().getWorld() != SweetDreams.getPlugin().getWorld()) @@ -104,27 +80,4 @@ public class EventListener implements Listener { tp.teleport(player, true); event.setCancelled(true); } - - @EventHandler - public void onJoin(PlayerJoinEvent event) { - UUID uuid = event.getPlayer().getUniqueId(); - Player player = event.getPlayer(); - PlayerStorage.StorageWorldType actualWorld = storage.getActualWorld(player); - plugin.sendDebugMessage( - "Player %s logged in on %s with inventory from %s. (flag: %s, world: %s)" - .formatted(player.getName(), player.getWorld().getName(), actualWorld.getKey(), storage.getFlag(player).getKey(), actualWorld.getKey()) - ); - - if (storage.exists(uuid) && storage.getFlag(player) != actualWorld) { - plugin.getLogger().warning( - "Player %s was desynced! Changing inventory back to %s." - .formatted(player.getName(), actualWorld.getKey()) - ); - - storage.loadPlayer(player, actualWorld); - player.sendMessage("Your dream ended prematurely..."); - player.playSound(player.getLocation(), Sound.BLOCK_BEACON_DEACTIVATE, 1.0f, 1.0f); - player.teleport(Objects.requireNonNullElse(player.getRespawnLocation(), actualWorld.getWorld().getSpawnLocation())); - } - } } diff --git a/src/main/java/org/adrianvictor/sweetdreams/PlayerStorage.java b/src/main/java/org/adrianvictor/sweetdreams/PlayerStorage.java index 94a1d86..fdcd206 100644 --- a/src/main/java/org/adrianvictor/sweetdreams/PlayerStorage.java +++ b/src/main/java/org/adrianvictor/sweetdreams/PlayerStorage.java @@ -1,23 +1,15 @@ package org.adrianvictor.sweetdreams; -import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.NamespacedKey; -import org.bukkit.World; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataType; import java.util.UUID; public class PlayerStorage { - private final Configuration configuration; - private final YamlConfiguration config; + private final Configuration config; private final YamlConfiguration storage; - private final NamespacedKey worldFlagKey = new NamespacedKey(SweetDreams.getPlugin(), "world_flag"); - private final World overworld; - private final World skylands; // Map inventories = new HashMap<>(); public enum StorageWorldType { @@ -33,22 +25,11 @@ public class PlayerStorage { public String getKey() { return key; } - - public World getWorld() { - if (this.getKey().equals("overworld")) { - return Bukkit.getWorld(SweetDreams.getPlugin().getConfiguration().getPluginConfig().getString("defaultWorld", "world")); - } - - return SweetDreams.getPlugin().getWorld(); - } } public PlayerStorage(Configuration config) { - this.configuration = config; + this.config = config; this.storage = config.getPlayerStorage(); - this.config = config.getPluginConfig(); - this.overworld = Bukkit.getWorld(this.config.getString("defaultWorld", "world")); - this.skylands = SweetDreams.getPlugin().getWorld(); } public void savePlayer(Player player, StorageWorldType type) { @@ -83,7 +64,7 @@ public class PlayerStorage { storage.set(base + ".stats.food", player.getFoodLevel()); storage.set(base + ".stats.saturation", player.getSaturation()); - configuration.savePlayerStorage(); + config.savePlayerStorage(); } public Location loadPlayer(Player player, StorageWorldType type) { @@ -143,15 +124,6 @@ public class PlayerStorage { player.setFoodLevel(storage.getInt(base + ".stats.food", 20)); player.setSaturation((float) storage.getDouble(base + ".stats.saturation", 5.0)); - storage.set("players." + uuid + ".worldFlag", type.name()); - player.getPersistentDataContainer().set( - worldFlagKey, - PersistentDataType.STRING, - type.name() - ); - - configuration.savePlayerStorage(); - Object rawSpawn = storage.get(base + ".spawn"); if (rawSpawn instanceof Location spawn) { return spawn; @@ -160,27 +132,6 @@ public class PlayerStorage { } } - public boolean exists(UUID uuid) { - String base = "players." + uuid; - return storage.contains(base); - } - - public StorageWorldType getFlag(Player player) { - UUID uuid = player.getUniqueId(); - String worldFlag = storage.getString("players." + uuid + ".worldFlag", null); - - if (worldFlag == null) { - worldFlag = player.getPersistentDataContainer().get(worldFlagKey, PersistentDataType.STRING); - } - - return StorageWorldType.valueOf(worldFlag); - } - - public StorageWorldType getActualWorld(Player player) { - return player.getWorld() == SweetDreams.getPlugin().getWorld() ? - StorageWorldType.SKYLANDS : StorageWorldType.OVERWORLD; - } - public void savePlayerSpawnPoint(Player player) { UUID uuid = player.getUniqueId(); String base = "players." + uuid + ".skylands"; diff --git a/src/main/java/org/adrianvictor/sweetdreams/PlayerTeleporter.java b/src/main/java/org/adrianvictor/sweetdreams/PlayerTeleporter.java index 66ced6c..00cff9a 100644 --- a/src/main/java/org/adrianvictor/sweetdreams/PlayerTeleporter.java +++ b/src/main/java/org/adrianvictor/sweetdreams/PlayerTeleporter.java @@ -18,9 +18,11 @@ public class PlayerTeleporter { private final Set teleporting = new HashSet<>(); private final PlayerStorage storage = SweetDreams.getPlugin().getStorage(); - public void teleport(Player player, boolean bad, String message, Sound sound) { + public void teleport(Player player, boolean bad) { UUID uuid = player.getUniqueId(); + Sound sound = bad ? Sound.ENTITY_ENDERMAN_SCREAM : Sound.ENTITY_PLAYER_LEVELUP; YamlConfiguration configuration = SweetDreams.getPlugin().getConfiguration().getPluginConfig(); + String message = bad ? "You woke up from a bad dream..." : "You woke up!"; boolean clearInventory = (bad && configuration.getBoolean("keepInventory", true)); if (!teleporting.add(uuid)) return; @@ -48,13 +50,6 @@ public class PlayerTeleporter { player.playSound(player.getLocation(), sound, 1.0f, 1.0f); } } else { - if (configuration.getBoolean("sendMessageOnWakeUp", true)) { - player.sendMessage(message); - } - - if (configuration.getBoolean("playSoundOnWakeUp", true)) { - player.playSound(player.getLocation(), sound, 1.0f, 1.0f); - } switchInventories(player, PlayerStorage.StorageWorldType.OVERWORLD, PlayerStorage.StorageWorldType.SKYLANDS); player.teleport(storage.loadPlayer(player, PlayerStorage.StorageWorldType.SKYLANDS)); } @@ -64,12 +59,6 @@ public class PlayerTeleporter { }); } - public void teleport(Player player, boolean bad) { - String message = bad ? "You woke up from a bad dream..." : "You woke up!"; - Sound sound = bad ? Sound.ENTITY_ENDERMAN_SCREAM : Sound.ENTITY_PLAYER_LEVELUP; - teleport(player, bad, message, sound); - } - private void switchInventories(Player player, PlayerStorage.StorageWorldType from, PlayerStorage.StorageWorldType to) { storage.savePlayer(player, from); player.getInventory().clear(); diff --git a/src/main/java/org/adrianvictor/sweetdreams/SweetDreams.java b/src/main/java/org/adrianvictor/sweetdreams/SweetDreams.java index b018604..1863a07 100644 --- a/src/main/java/org/adrianvictor/sweetdreams/SweetDreams.java +++ b/src/main/java/org/adrianvictor/sweetdreams/SweetDreams.java @@ -1,9 +1,6 @@ package org.adrianvictor.sweetdreams; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.plugin.java.JavaPlugin; @@ -20,15 +17,40 @@ public final class SweetDreams extends JavaPlugin { public void onEnable() { plugin = this; configuration = new Configuration(); - String worldName = configuration.getPluginConfig().getString("dreamlandsWorld", "world_sweetdreams"); storage = new PlayerStorage(configuration); - world = createSkylandsWorld(worldName); + + boolean generated = false; + + for (World world: getServer().getWorlds()) { + if (world.getName().equals( + configuration.getPluginConfig().getString("dreamlandsWorld", "world_sweetdreams")) + ) { + this.world = world; + generated = true; + } + } + + if (!generated) { + world = createSkylandsWorld("world_sweetdreams"); + } getServer().getPluginManager().registerEvents(new EventListener(), this); Bukkit.getScheduler().runTaskTimer(this, new KickerRunnable(), 20L, 20L); } + private void deleteFolder(File folder) { + if (folder.isDirectory()) { + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + deleteFolder(file); + } + } + } + folder.delete(); + } + @Override public void onDisable() { // Plugin shutdown logic @@ -60,10 +82,4 @@ public final class SweetDreams extends JavaPlugin { public PlayerStorage getStorage() { return storage; } - - public void sendDebugMessage(String message) { - if (configuration.getPluginConfig().getBoolean("debugMessages", false)) { - getLogger().info("[DEBUG] " + message); - } - } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 525f823..1c4166f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -8,7 +8,6 @@ kickOnDayStart: true playSoundOnWakeUp: true sendMessageOnWakeUp: true keepInventory: true -sleepingOnDreamReturnsToOverworld: true # Won't affect already generated chunks # /!\ Don't change unless you know what you're doing @@ -26,6 +25,4 @@ worldGeneration: treeMaxHeight: 3 # Max random number that will be ADDED to the minimum size treeMinHeight: 4 oreMaxDepth: 20 - dirtLayers: 3 - -debugMessages: false \ No newline at end of file + dirtLayers: 3 \ No newline at end of file