diff --git a/pom.xml b/pom.xml
index 31c14e79..00a99c29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
dev.efnilite
IP
pom
- 3.8.1
+ 3.8.2
witp
diff --git a/witp/dependency-reduced-pom.xml b/witp/dependency-reduced-pom.xml
index 880b7c67..0cda4679 100644
--- a/witp/dependency-reduced-pom.xml
+++ b/witp/dependency-reduced-pom.xml
@@ -3,31 +3,13 @@
IP
dev.efnilite
- 3.8.1
+ 3.8.2
4.0.0
witp
- 3.8.1
+ 3.8.2
- src/main/java
clean package
-
-
- .
- true
- src/main/resources
-
- lang/items-v3.yml
- lang/messages-v3.yml
- lang/scoreboard-v3.yml
- config.yml
- generation.yml
- rewards-v2.yml
- schematics.yml
-
-
-
- ${project.name}-${project.version}
maven-compiler-plugin
diff --git a/witp/pom.xml b/witp/pom.xml
index 6766db84..fc9fa1c5 100644
--- a/witp/pom.xml
+++ b/witp/pom.xml
@@ -5,12 +5,12 @@
IP
dev.efnilite
- 3.8.1
+ 3.8.2
4.0.0
witp
- 3.8.1
+ 3.8.2
16
@@ -18,25 +18,6 @@
- src/main/java
- ${project.name}-${project.version}
-
-
- src/main/resources
- true
- .
-
- lang/items-v3.yml
- lang/messages-v3.yml
- lang/scoreboard-v3.yml
- config.yml
- generation.yml
- rewards-v2.yml
- schematics.yml
-
-
-
-
clean package
diff --git a/witp/src/main/java/dev/efnilite/ip/IP.java b/witp/src/main/java/dev/efnilite/ip/IP.java
index 944d27d2..f393c082 100644
--- a/witp/src/main/java/dev/efnilite/ip/IP.java
+++ b/witp/src/main/java/dev/efnilite/ip/IP.java
@@ -2,7 +2,7 @@
import dev.efnilite.ip.api.Gamemodes;
import dev.efnilite.ip.api.Registry;
-import dev.efnilite.ip.events.Handler;
+import dev.efnilite.ip.api.events.Handler;
import dev.efnilite.ip.hook.FloodgateHook;
import dev.efnilite.ip.hook.HoloHook;
import dev.efnilite.ip.hook.MultiverseHook;
diff --git a/witp/src/main/java/dev/efnilite/ip/ParkourCommand.java b/witp/src/main/java/dev/efnilite/ip/ParkourCommand.java
index fab35d82..39f80809 100644
--- a/witp/src/main/java/dev/efnilite/ip/ParkourCommand.java
+++ b/witp/src/main/java/dev/efnilite/ip/ParkourCommand.java
@@ -2,9 +2,9 @@
import dev.efnilite.ip.api.Gamemode;
import dev.efnilite.ip.leaderboard.Leaderboard;
-import dev.efnilite.ip.menu.LeaderboardMenu;
+import dev.efnilite.ip.menu.community.LeaderboardMenu;
import dev.efnilite.ip.menu.MainMenu;
-import dev.efnilite.ip.menu.SingleplayerMenu;
+import dev.efnilite.ip.menu.play.SingleplayerMenu;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.ip.player.data.InventoryData;
diff --git a/witp/src/main/java/dev/efnilite/ip/api/ParkourAPI.java b/witp/src/main/java/dev/efnilite/ip/api/ParkourAPI.java
index d9516706..7b54742c 100644
--- a/witp/src/main/java/dev/efnilite/ip/api/ParkourAPI.java
+++ b/witp/src/main/java/dev/efnilite/ip/api/ParkourAPI.java
@@ -1,6 +1,7 @@
package dev.efnilite.ip.api;
import dev.efnilite.ip.IP;
+import dev.efnilite.ip.api.events.BlockGenerateEvent;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.player.ParkourUser;
import org.bukkit.entity.Player;
@@ -12,7 +13,7 @@
* For player joining/leaving, please view {@link ParkourUser}.
* For player settings, please view {@link ParkourPlayer}.
* For player spectating, please view {@link dev.efnilite.ip.player.ParkourSpectator}.
- * For events, please view {@link dev.efnilite.ip.events.BlockGenerateEvent} and others in the events package.
+ * For events, please view {@link BlockGenerateEvent} and others in the events package.
* For Sessions, please view {@link dev.efnilite.ip.session.Session}.
*/
@SuppressWarnings("unused")
diff --git a/witp/src/main/java/dev/efnilite/ip/events/BlockGenerateEvent.java b/witp/src/main/java/dev/efnilite/ip/api/events/BlockGenerateEvent.java
similarity index 94%
rename from witp/src/main/java/dev/efnilite/ip/events/BlockGenerateEvent.java
rename to witp/src/main/java/dev/efnilite/ip/api/events/BlockGenerateEvent.java
index 968c6997..2338738e 100644
--- a/witp/src/main/java/dev/efnilite/ip/events/BlockGenerateEvent.java
+++ b/witp/src/main/java/dev/efnilite/ip/api/events/BlockGenerateEvent.java
@@ -1,4 +1,4 @@
-package dev.efnilite.ip.events;
+package dev.efnilite.ip.api.events;
import dev.efnilite.ip.generator.DefaultGenerator;
import dev.efnilite.ip.player.ParkourPlayer;
diff --git a/witp/src/main/java/dev/efnilite/ip/events/Handler.java b/witp/src/main/java/dev/efnilite/ip/api/events/Handler.java
similarity index 99%
rename from witp/src/main/java/dev/efnilite/ip/events/Handler.java
rename to witp/src/main/java/dev/efnilite/ip/api/events/Handler.java
index 5bebb1b4..585ba02c 100644
--- a/witp/src/main/java/dev/efnilite/ip/events/Handler.java
+++ b/witp/src/main/java/dev/efnilite/ip/api/events/Handler.java
@@ -1,4 +1,4 @@
-package dev.efnilite.ip.events;
+package dev.efnilite.ip.api.events;
import dev.efnilite.ip.IP;
import dev.efnilite.ip.ParkourCommand;
diff --git a/witp/src/main/java/dev/efnilite/ip/events/PlayerFallEvent.java b/witp/src/main/java/dev/efnilite/ip/api/events/PlayerFallEvent.java
similarity index 91%
rename from witp/src/main/java/dev/efnilite/ip/events/PlayerFallEvent.java
rename to witp/src/main/java/dev/efnilite/ip/api/events/PlayerFallEvent.java
index c790903a..df705b06 100644
--- a/witp/src/main/java/dev/efnilite/ip/events/PlayerFallEvent.java
+++ b/witp/src/main/java/dev/efnilite/ip/api/events/PlayerFallEvent.java
@@ -1,4 +1,4 @@
-package dev.efnilite.ip.events;
+package dev.efnilite.ip.api.events;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.vilib.event.EventWrapper;
diff --git a/witp/src/main/java/dev/efnilite/ip/events/PlayerScoreEvent.java b/witp/src/main/java/dev/efnilite/ip/api/events/PlayerScoreEvent.java
similarity index 90%
rename from witp/src/main/java/dev/efnilite/ip/events/PlayerScoreEvent.java
rename to witp/src/main/java/dev/efnilite/ip/api/events/PlayerScoreEvent.java
index fbcd1c74..55a7093d 100644
--- a/witp/src/main/java/dev/efnilite/ip/events/PlayerScoreEvent.java
+++ b/witp/src/main/java/dev/efnilite/ip/api/events/PlayerScoreEvent.java
@@ -1,4 +1,4 @@
-package dev.efnilite.ip.events;
+package dev.efnilite.ip.api.events;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.vilib.event.EventWrapper;
diff --git a/witp/src/main/java/dev/efnilite/ip/generator/DefaultGenerator.java b/witp/src/main/java/dev/efnilite/ip/generator/DefaultGenerator.java
index 9d5500a2..a510c163 100644
--- a/witp/src/main/java/dev/efnilite/ip/generator/DefaultGenerator.java
+++ b/witp/src/main/java/dev/efnilite/ip/generator/DefaultGenerator.java
@@ -3,15 +3,15 @@
import dev.efnilite.ip.IP;
import dev.efnilite.ip.api.Gamemode;
import dev.efnilite.ip.api.Gamemodes;
-import dev.efnilite.ip.events.BlockGenerateEvent;
-import dev.efnilite.ip.events.PlayerFallEvent;
-import dev.efnilite.ip.events.PlayerScoreEvent;
+import dev.efnilite.ip.api.events.BlockGenerateEvent;
+import dev.efnilite.ip.api.events.PlayerFallEvent;
+import dev.efnilite.ip.api.events.PlayerScoreEvent;
import dev.efnilite.ip.generator.base.DefaultGeneratorBase;
import dev.efnilite.ip.generator.base.Direction;
import dev.efnilite.ip.generator.settings.GeneratorOption;
import dev.efnilite.ip.internal.gamemode.DefaultGamemode;
import dev.efnilite.ip.leaderboard.Leaderboard;
-import dev.efnilite.ip.menu.SettingsMenu;
+import dev.efnilite.ip.menu.settings.GameSettingsMenu;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.player.ParkourSpectator;
import dev.efnilite.ip.player.data.Score;
@@ -492,7 +492,7 @@ public void fall() {
@Override
public void menu() {
- SettingsMenu.INSTANCE.open(player);
+ GameSettingsMenu.INSTANCE.open(player);
}
@Override
diff --git a/witp/src/main/java/dev/efnilite/ip/internal/gamemode/SpectatorGamemode.java b/witp/src/main/java/dev/efnilite/ip/internal/gamemode/SpectatorGamemode.java
index be6396e3..0cd62851 100644
--- a/witp/src/main/java/dev/efnilite/ip/internal/gamemode/SpectatorGamemode.java
+++ b/witp/src/main/java/dev/efnilite/ip/internal/gamemode/SpectatorGamemode.java
@@ -2,7 +2,7 @@
import dev.efnilite.ip.api.Gamemode;
import dev.efnilite.ip.leaderboard.Leaderboard;
-import dev.efnilite.ip.menu.SpectatorMenu;
+import dev.efnilite.ip.menu.play.SpectatorMenu;
import dev.efnilite.ip.player.ParkourSpectator;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.ip.session.Session;
diff --git a/witp/src/main/java/dev/efnilite/ip/leaderboard/Leaderboard.java b/witp/src/main/java/dev/efnilite/ip/leaderboard/Leaderboard.java
index f3a07c0a..215da8c4 100644
--- a/witp/src/main/java/dev/efnilite/ip/leaderboard/Leaderboard.java
+++ b/witp/src/main/java/dev/efnilite/ip/leaderboard/Leaderboard.java
@@ -11,6 +11,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
@@ -55,6 +56,8 @@ public Leaderboard(@NotNull String gamemode) {
this.file = FOLDER + gamemode.toLowerCase() + ".json";
if (Option.SQL) {
+ IP.getSqlManager().validateConnection();
+
IP.getSqlManager().sendQuery(
"""
USE `%s`;
@@ -149,6 +152,10 @@ private void _writeSql() {
* writes all leaderboard data to the file
*/
private void _writeFile() {
+ if (!new File(file).exists()) {
+ return;
+ }
+
try (FileWriter writer = new FileWriter(file)) {
IP.getGson().toJson(this, writer);
@@ -224,6 +231,10 @@ private void _readSql() {
* read leaderboard data from the file
*/
private void _readFile() {
+ if (!new File(file).exists()) {
+ return;
+ }
+
try (FileReader reader = new FileReader(file)) {
Leaderboard read = IP.getGson().fromJson(reader, Leaderboard.class);
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/MainMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/MainMenu.java
index 3acda6d7..f9770012 100644
--- a/witp/src/main/java/dev/efnilite/ip/menu/MainMenu.java
+++ b/witp/src/main/java/dev/efnilite/ip/menu/MainMenu.java
@@ -2,6 +2,9 @@
import dev.efnilite.ip.IP;
import dev.efnilite.ip.ParkourOption;
+import dev.efnilite.ip.menu.community.LeaderboardMenu;
+import dev.efnilite.ip.menu.play.SingleplayerMenu;
+import dev.efnilite.ip.menu.play.SpectatorMenu;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.vilib.inventory.Menu;
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/LeaderboardMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/community/LeaderboardMenu.java
similarity index 99%
rename from witp/src/main/java/dev/efnilite/ip/menu/LeaderboardMenu.java
rename to witp/src/main/java/dev/efnilite/ip/menu/community/LeaderboardMenu.java
index cff27fea..f8daf7a8 100644
--- a/witp/src/main/java/dev/efnilite/ip/menu/LeaderboardMenu.java
+++ b/witp/src/main/java/dev/efnilite/ip/menu/community/LeaderboardMenu.java
@@ -1,8 +1,9 @@
-package dev.efnilite.ip.menu;
+package dev.efnilite.ip.menu.community;
import dev.efnilite.ip.IP;
import dev.efnilite.ip.api.Gamemode;
import dev.efnilite.ip.leaderboard.Leaderboard;
+import dev.efnilite.ip.menu.MainMenu;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.ip.player.data.Score;
import dev.efnilite.ip.util.Stopwatch;
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/play/PlayMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/play/PlayMenu.java
new file mode 100644
index 00000000..2bf1f8aa
--- /dev/null
+++ b/witp/src/main/java/dev/efnilite/ip/menu/play/PlayMenu.java
@@ -0,0 +1,52 @@
+package dev.efnilite.ip.menu.play;
+
+import dev.efnilite.ip.IP;
+import dev.efnilite.ip.ParkourOption;
+import dev.efnilite.ip.menu.DynamicMenu;
+import dev.efnilite.vilib.inventory.Menu;
+import dev.efnilite.vilib.inventory.animation.SplitMiddleOutAnimation;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+/**
+ * Class for the main menu, accessed on executing /parkour
+ */
+public class PlayMenu extends DynamicMenu {
+
+ public static final PlayMenu INSTANCE = new PlayMenu();
+
+ public PlayMenu() {
+ // Singleplayer if player is not found
+ registerMainItem(1, 0,
+ user -> IP.getConfiguration().getFromItemData(user, "main.singleplayer").click(
+ event -> SingleplayerMenu.open(event.getPlayer())),
+ ParkourOption.JOIN::check);
+
+ registerMainItem(1, 2,
+ user -> IP.getConfiguration().getFromItemData(user, "main.spectator").click(
+ event -> SpectatorMenu.open(event.getPlayer())),
+ // display spectator if the player isn't already one
+ ParkourOption.JOIN::check);
+
+ // Always allow closing of the menu
+ registerMainItem(3, 10,
+ user -> IP.getConfiguration().getFromItemData(user, "general.close")
+ .click(event -> event.getPlayer().closeInventory()),
+ player -> true);
+ }
+
+ /**
+ * Opens the main menu.
+ *
+ * @param player
+ * The player to open the menu to
+ */
+ public void open(Player player) {
+ Menu menu = new Menu(4, "Play")
+ .fillBackground(Material.GRAY_STAINED_GLASS_PANE)
+ .animation(new SplitMiddleOutAnimation())
+ .distributeRowEvenly(0, 1, 2, 3);
+
+ display(player, menu);
+ }
+}
\ No newline at end of file
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/SingleplayerMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/play/SingleplayerMenu.java
similarity index 97%
rename from witp/src/main/java/dev/efnilite/ip/menu/SingleplayerMenu.java
rename to witp/src/main/java/dev/efnilite/ip/menu/play/SingleplayerMenu.java
index 0d919762..c3e9f390 100644
--- a/witp/src/main/java/dev/efnilite/ip/menu/SingleplayerMenu.java
+++ b/witp/src/main/java/dev/efnilite/ip/menu/play/SingleplayerMenu.java
@@ -1,8 +1,9 @@
-package dev.efnilite.ip.menu;
+package dev.efnilite.ip.menu.play;
import dev.efnilite.ip.IP;
import dev.efnilite.ip.api.Gamemode;
import dev.efnilite.ip.api.MultiGamemode;
+import dev.efnilite.ip.menu.MainMenu;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.ip.util.config.Configuration;
import dev.efnilite.ip.util.config.Option;
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/SpectatorMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/play/SpectatorMenu.java
similarity index 98%
rename from witp/src/main/java/dev/efnilite/ip/menu/SpectatorMenu.java
rename to witp/src/main/java/dev/efnilite/ip/menu/play/SpectatorMenu.java
index 53d29ef5..64ae38c5 100644
--- a/witp/src/main/java/dev/efnilite/ip/menu/SpectatorMenu.java
+++ b/witp/src/main/java/dev/efnilite/ip/menu/play/SpectatorMenu.java
@@ -1,7 +1,8 @@
-package dev.efnilite.ip.menu;
+package dev.efnilite.ip.menu.play;
import dev.efnilite.ip.IP;
import dev.efnilite.ip.api.Gamemodes;
+import dev.efnilite.ip.menu.MainMenu;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.player.ParkourUser;
import dev.efnilite.ip.session.Session;
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/SettingsMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/settings/GameSettingsMenu.java
similarity index 98%
rename from witp/src/main/java/dev/efnilite/ip/menu/SettingsMenu.java
rename to witp/src/main/java/dev/efnilite/ip/menu/settings/GameSettingsMenu.java
index 05ff2b14..31b558fe 100644
--- a/witp/src/main/java/dev/efnilite/ip/menu/SettingsMenu.java
+++ b/witp/src/main/java/dev/efnilite/ip/menu/settings/GameSettingsMenu.java
@@ -1,8 +1,10 @@
-package dev.efnilite.ip.menu;
+package dev.efnilite.ip.menu.settings;
import dev.efnilite.ip.IP;
import dev.efnilite.ip.ParkourOption;
import dev.efnilite.ip.api.StyleType;
+import dev.efnilite.ip.menu.DynamicMenu;
+import dev.efnilite.ip.menu.MainMenu;
import dev.efnilite.ip.player.ParkourPlayer;
import dev.efnilite.ip.util.Util;
import dev.efnilite.ip.util.config.Configuration;
@@ -34,11 +36,11 @@
* @since v3.0.0
* @author Efnilite
*/
-public class SettingsMenu extends DynamicMenu {
+public class GameSettingsMenu extends DynamicMenu {
- public static final SettingsMenu INSTANCE = new SettingsMenu();
+ public static final GameSettingsMenu INSTANCE = new GameSettingsMenu();
- public SettingsMenu(ParkourOption... disabled) {
+ public GameSettingsMenu(ParkourOption... disabled) {
// ---------- top row ----------
diff --git a/witp/src/main/java/dev/efnilite/ip/menu/settings/SettingsMenu.java b/witp/src/main/java/dev/efnilite/ip/menu/settings/SettingsMenu.java
new file mode 100644
index 00000000..079d1be5
--- /dev/null
+++ b/witp/src/main/java/dev/efnilite/ip/menu/settings/SettingsMenu.java
@@ -0,0 +1,73 @@
+package dev.efnilite.ip.menu.settings;
+
+import dev.efnilite.ip.IP;
+import dev.efnilite.ip.ParkourOption;
+import dev.efnilite.ip.menu.DynamicMenu;
+import dev.efnilite.ip.menu.LangMenu;
+import dev.efnilite.ip.menu.community.LeaderboardMenu;
+import dev.efnilite.ip.player.ParkourPlayer;
+import dev.efnilite.ip.player.ParkourUser;
+import dev.efnilite.vilib.inventory.Menu;
+import dev.efnilite.vilib.inventory.animation.SplitMiddleOutAnimation;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+
+/**
+ * Class for the main menu, accessed on executing /parkour
+ */
+public class SettingsMenu extends DynamicMenu {
+
+ public static final SettingsMenu INSTANCE = new SettingsMenu();
+
+ public SettingsMenu() {
+
+ // Settings if player is active
+ registerMainItem(1, 9,
+ user -> IP.getConfiguration().getFromItemData(user, "main.settings").click(event -> {
+ ParkourPlayer pp = ParkourPlayer.getPlayer(event.getPlayer());
+
+ if (pp != null) {
+ pp.getGenerator().menu();
+ }
+ }), player -> ParkourPlayer.isActive(player) && ParkourOption.SETTINGS.check(player));
+
+ // Quit button if player is active
+ registerMainItem(1, 10,
+ user -> IP.getConfiguration().getFromItemData(user, "main.quit").click(event ->
+ ParkourUser.leave(event.getPlayer())),
+ ParkourPlayer::isActive);
+
+ // Leaderboard only if player has perms
+ registerMainItem(3, 0,
+ user -> IP.getConfiguration().getFromItemData(user, "main.leaderboard").click(
+ event -> LeaderboardMenu.open(event.getPlayer())),
+ ParkourOption.LEADERBOARD::check);
+
+ // Language only if player has perms
+ registerMainItem(3, 1,
+ user -> IP.getConfiguration().getFromItemData(user, "main.language").click(
+ event -> LangMenu.open(ParkourPlayer.getPlayer(event.getPlayer()))),
+ player -> ParkourPlayer.isActive(player) && ParkourOption.LANGUAGE.check(player));
+
+ // Always allow closing of the menu
+ registerMainItem(3, 10,
+ user -> IP.getConfiguration().getFromItemData(user, "general.close")
+ .click(event -> event.getPlayer().closeInventory()),
+ player -> true);
+ }
+
+ /**
+ * Opens the main menu.
+ *
+ * @param player
+ * The player to open the menu to
+ */
+ public void open(Player player) {
+ Menu menu = new Menu(4, "Parkour")
+ .fillBackground(Material.GRAY_STAINED_GLASS_PANE)
+ .animation(new SplitMiddleOutAnimation())
+ .distributeRowEvenly(0, 1, 2, 3);
+
+ display(player, menu);
+ }
+}
\ No newline at end of file
diff --git a/witp/src/main/java/dev/efnilite/ip/util/config/Configuration.java b/witp/src/main/java/dev/efnilite/ip/util/config/Configuration.java
index a99161ef..4072e8a7 100644
--- a/witp/src/main/java/dev/efnilite/ip/util/config/Configuration.java
+++ b/witp/src/main/java/dev/efnilite/ip/util/config/Configuration.java
@@ -42,8 +42,7 @@ public class Configuration {
public Configuration(Plugin plugin) {
this.plugin = plugin;
- List defaultFiles = Arrays.asList("config.yml", "rewards-v2.yml", "generation.yml", "schematics.yml",
- "lang/messages-v3.yml", "lang/items-v3.yml", "lang/scoreboard-v3.yml");
+ List defaultFiles = Arrays.asList("config.yml", "rewards-v2.yml", "generation.yml", "schematics.yml", "lang/messages-v3.yml", "lang/items-v3.yml", "lang/scoreboard-v3.yml");
for (String name : defaultFiles) {
File file = new File(plugin.getDataFolder(), name);