From 36c58cf86cfbde54e67d051ebbaf05a333f1c095 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 15 Jul 2025 22:04:21 +0200 Subject: [PATCH 01/96] Adding a NetworkAPI module for external plugins to access the Network plugin without having access to internals. --- Network-API/pom.xml | 33 +++ .../java/net/bteuk/network/api/ChatAPI.java | 9 + .../net/bteuk/network/api/NetworkAPI.java | 11 + .../java/net/bteuk/network/api/SQLAPI.java | 4 + Plugin/pom.xml | 276 ++++++++++++++++++ .../net/bteuk/network/CommandManager.java | 2 +- .../java/net/bteuk/network/CustomChat.java | 9 +- .../main/java/net/bteuk/network/Network.java | 9 +- .../java/net/bteuk/network/TabManager.java | 0 .../main/java/net/bteuk/network/Timers.java | 0 .../building_companion/BestFitRectangle.java | 0 .../building_companion/BuildingCompanion.java | 0 .../MinecraftRectangleConverter.java | 0 .../building_companion/SavedOutline.java | 0 .../building_companion/TpllListener.java | 0 .../network/building_counter/Building.java | 0 .../ConfirmationListener.java | 0 .../network/commands/AbstractCommand.java | 0 .../java/net/bteuk/network/commands/Afk.java | 2 +- .../commands/BuildingCompanionCommand.java | 0 .../net/bteuk/network/commands/Buildings.java | 0 .../net/bteuk/network/commands/Clear.java | 0 .../net/bteuk/network/commands/Demote.java | 0 .../net/bteuk/network/commands/Discord.java | 6 +- .../net/bteuk/network/commands/Focus.java | 0 .../net/bteuk/network/commands/Gamemode.java | 0 .../java/net/bteuk/network/commands/Hdb.java | 0 .../java/net/bteuk/network/commands/Help.java | 0 .../java/net/bteuk/network/commands/Me.java | 0 .../java/net/bteuk/network/commands/Msg.java | 8 +- .../net/bteuk/network/commands/Navigator.java | 0 .../bteuk/network/commands/Nightvision.java | 0 .../net/bteuk/network/commands/Phead.java | 0 .../java/net/bteuk/network/commands/Plot.java | 0 .../net/bteuk/network/commands/Pmute.java | 0 .../bteuk/network/commands/PmuteAction.java | 2 +- .../bteuk/network/commands/ProgressMap.java | 0 .../net/bteuk/network/commands/Promote.java | 0 .../network/commands/PromotionAction.java | 0 .../net/bteuk/network/commands/Ptime.java | 0 .../net/bteuk/network/commands/Punmute.java | 0 .../net/bteuk/network/commands/Pweather.java | 0 .../bteuk/network/commands/RegionCommand.java | 0 .../net/bteuk/network/commands/Reply.java | 5 +- .../net/bteuk/network/commands/Rules.java | 0 .../net/bteuk/network/commands/Season.java | 0 .../net/bteuk/network/commands/Speed.java | 0 .../bteuk/network/commands/TipsToggle.java | 0 .../net/bteuk/network/commands/Where.java | 0 .../java/net/bteuk/network/commands/Zone.java | 0 .../network/commands/give/GiveBarrier.java | 0 .../network/commands/give/GiveDebugStick.java | 0 .../bteuk/network/commands/give/GiveItem.java | 0 .../network/commands/give/GiveLight.java | 0 .../network/commands/navigation/BTEUK.java | 0 .../network/commands/navigation/Back.java | 0 .../network/commands/navigation/Delhome.java | 0 .../network/commands/navigation/Home.java | 0 .../network/commands/navigation/Homes.java | 0 .../commands/navigation/Navigation.java | 0 .../network/commands/navigation/Server.java | 0 .../network/commands/navigation/Sethome.java | 0 .../network/commands/navigation/Spawn.java | 0 .../bteuk/network/commands/navigation/Tp.java | 0 .../network/commands/navigation/TpToggle.java | 0 .../network/commands/navigation/Tpll.java | 0 .../network/commands/navigation/Warp.java | 0 .../network/commands/navigation/Warps.java | 0 .../net/bteuk/network/commands/staff/Ban.java | 0 .../net/bteuk/network/commands/staff/Exp.java | 0 .../bteuk/network/commands/staff/Kick.java | 0 .../commands/staff/ModerationInfo.java | 0 .../bteuk/network/commands/staff/Mute.java | 0 .../bteuk/network/commands/staff/Staff.java | 2 +- .../bteuk/network/commands/staff/Unban.java | 0 .../bteuk/network/commands/staff/Unmute.java | 0 .../tabcompleters/AbstractTabCompleter.java | 0 .../tabcompleters/FixedArgSelector.java | 0 .../commands/tabcompleters/HomeSelector.java | 0 .../LocationAndSubcategorySelector.java | 0 .../tabcompleters/LocationSelector.java | 0 .../tabcompleters/MultiArgSelector.java | 0 .../tabcompleters/NavigationTabCompleter.java | 0 .../tabcompleters/PlayerSelector.java | 0 .../tabcompleters/ServerSelector.java | 0 .../commands/tabcompleters/TabCompleter.java | 0 .../eventing/events/AbstractEvent.java | 0 .../network/eventing/events/EventManager.java | 0 .../network/eventing/events/InviteEvent.java | 0 .../network/eventing/events/KickEvent.java | 0 .../network/eventing/events/RegionEvent.java | 8 +- .../eventing/events/TeleportEvent.java | 0 .../listeners/ClickableItemListener.java | 0 .../eventing/listeners/CommandPreProcess.java | 2 +- .../network/eventing/listeners/Connect.java | 8 +- .../eventing/listeners/GuiListener.java | 0 .../eventing/listeners/PlayerInteract.java | 0 .../eventing/listeners/PreJoinServer.java | 0 .../global_teleport/MoveListener.java | 0 .../global_teleport/TeleportListener.java | 0 .../navigation/LocationNameListener.java | 0 .../listeners/navigation/LocationSearch.java | 0 .../FeatureGeometryEditorListener.java | 0 .../FeaturePropertiesBookListener.java | 0 .../listeners/regions/RegionTagListener.java | 0 .../staff/ModerationReasonListener.java | 0 .../exceptions/DurationFormatException.java | 0 .../exceptions/InvalidFormatException.java | 0 .../NoBuildPermissionException.java | 0 .../exceptions/NotBannedException.java | 0 .../network/exceptions/NotMutedException.java | 0 .../RegionManagerNotFoundException.java | 0 .../exceptions/RegionNotFoundException.java | 0 .../exceptions/WorldNotFoundException.java | 0 .../DistanceLimitException.java | 0 .../OutsidePlotException.java | 0 .../java/net/bteuk/network/gui/BuildGui.java | 0 .../main/java/net/bteuk/network/gui/Gui.java | 0 .../net/bteuk/network/gui/GuiInterface.java | 0 .../net/bteuk/network/gui/InviteMembers.java | 0 .../net/bteuk/network/gui/NavigatorGui.java | 0 .../main/java/net/bteuk/network/gui/Shop.java | 0 .../java/net/bteuk/network/gui/UtilsGui.java | 0 .../network/gui/navigation/AddLocation.java | 2 +- .../network/gui/navigation/ExploreGui.java | 0 .../network/gui/navigation/LocationMenu.java | 0 .../gui/navigation/SelectSubcategory.java | 0 .../gui/plotsystem/AcceptedPlotMenu.java | 0 .../network/gui/plotsystem/CloseConfirm.java | 0 .../network/gui/plotsystem/DeleteConfirm.java | 0 .../gui/plotsystem/DeniedPlotFeedback.java | 0 .../network/gui/plotsystem/FilterMenu.java | 0 .../network/gui/plotsystem/PlotInfo.java | 0 .../network/gui/plotsystem/PlotMenu.java | 0 .../gui/plotsystem/PlotServerLocations.java | 0 .../gui/plotsystem/PlotsystemLocations.java | 0 .../gui/plotsystem/PlotsystemMembers.java | 0 .../gui/plotsystem/VerificationInfo.java | 0 .../gui/plotsystem/VerificationMenu.java | 0 .../network/gui/plotsystem/ZoneInfo.java | 0 .../network/gui/plotsystem/ZoneMenu.java | 0 .../gui/progressmap/ColourPickerGUI.java | 0 .../gui/progressmap/FeaturePageGUI.java | 0 .../gui/progressmap/LocalFeatureListGUI.java | 0 .../bteuk/network/gui/regions/RegionInfo.java | 0 .../network/gui/regions/RegionMembers.java | 2 +- .../bteuk/network/gui/regions/RegionMenu.java | 0 .../gui/regions/RegionRequestMenu.java | 0 .../gui/regions/ReviewRegionRequest.java | 0 .../gui/regions/ReviewRegionRequests.java | 0 .../bteuk/network/gui/staff/KickMembers.java | 0 .../network/gui/staff/LocationRequests.java | 0 .../bteuk/network/gui/staff/ManageRegion.java | 0 .../gui/staff/ModerationActionGui.java | 0 .../network/gui/staff/ModerationGui.java | 0 .../bteuk/network/gui/staff/SelectUser.java | 0 .../net/bteuk/network/gui/staff/StaffGui.java | 0 .../network/gui/staff/TransferOwner.java | 0 .../tutorials/LessonContinueConfirmer.java | 0 .../network/gui/tutorials/LessonsMenu.java | 0 .../gui/tutorials/RecommendationAddGui.java | 4 +- .../tutorials/RecommendedTutorialsGui.java | 4 +- .../tutorials/RecommendedTutorialsMenu.java | 0 .../gui/tutorials/TutorialLibraryGui.java | 2 - .../network/gui/tutorials/TutorialsGui.java | 0 .../lobby/AbstractReloadableComponent.java | 0 .../network/lobby/HologramClickEvent.java | 0 .../java/net/bteuk/network/lobby/Lobby.java | 0 .../net/bteuk/network/lobby/LobbyCommand.java | 0 .../bteuk/network/lobby/LobbyComponent.java | 0 .../java/net/bteuk/network/lobby/Map.java | 0 .../net/bteuk/network/lobby/MapCommand.java | 0 .../java/net/bteuk/network/lobby/Portal.java | 0 .../bteuk/network/lobby/TakeBookEvent.java | 0 .../net/bteuk/network/lobby/VoidTeleport.java | 0 .../services/NetworkPromotionService.java | 0 .../net/bteuk/network/sql/AbstractSQL.java | 4 +- .../net/bteuk/network/sql/DatabaseInit.java | 0 .../java/net/bteuk/network/sql/GlobalSQL.java | 0 .../java/net/bteuk/network/sql/PlotSQL.java | 2 +- .../java/net/bteuk/network/sql/RegionSQL.java | 0 .../java/net/bteuk/network/utils/Blocks.java | 0 .../java/net/bteuk/network/utils/Coins.java | 0 .../net/bteuk/network/utils/Constants.java | 0 .../net/bteuk/network/utils/Coordinate.java | 0 .../net/bteuk/network/utils/Holograms.java | 0 .../net/bteuk/network/utils/Leaderboard.java | 0 .../net/bteuk/network/utils/LightsOut.java | 0 .../net/bteuk/network/utils/LocationUtil.java | 0 .../bteuk/network/utils/NetworkConfig.java | 0 .../net/bteuk/network/utils/NetworkUser.java | 4 +- .../net/bteuk/network/utils/Permissions.java | 0 .../net/bteuk/network/utils/PlotValues.java | 0 .../java/net/bteuk/network/utils/Points.java | 0 .../java/net/bteuk/network/utils/Role.java | 0 .../java/net/bteuk/network/utils/Roles.java | 12 +- .../net/bteuk/network/utils/Statistics.java | 0 .../net/bteuk/network/utils/SwitchServer.java | 2 +- .../net/bteuk/network/utils/TextureUtils.java | 0 .../java/net/bteuk/network/utils/Time.java | 0 .../java/net/bteuk/network/utils/Tips.java | 0 .../net/bteuk/network/utils/TpllFormat.java | 0 .../network/utils/TutorialRecommendation.java | 5 - .../java/net/bteuk/network/utils/Utils.java | 0 .../network/utils/enums/AddLocationType.java | 0 .../bteuk/network/utils/enums/Category.java | 0 .../network/utils/enums/LeaderboardType.java | 0 .../network/utils/enums/ModerationType.java | 0 .../bteuk/network/utils/enums/PlotStatus.java | 0 .../bteuk/network/utils/enums/PointsType.java | 0 .../network/utils/enums/RegionStatus.java | 0 .../bteuk/network/utils/enums/RegionType.java | 0 .../bteuk/network/utils/enums/ServerType.java | 0 .../network/utils/enums/SubmittedStatus.java | 0 .../bteuk/network/utils/enums/TimesOfDay.java | 0 .../net/bteuk/network/utils/math/Line.java | 0 .../net/bteuk/network/utils/math/Point.java | 0 .../utils/plotsystem/ReviewCategory.java | 0 .../plotsystem/ReviewCategoryFeedback.java | 0 .../utils/plotsystem/ReviewFeedback.java | 0 .../utils/plotsystem/ReviewSelection.java | 0 .../utils/plotsystem/SubmittedPlot.java | 0 .../network/utils/progression/Level.java | 0 .../utils/progression/Progression.java | 2 +- .../network/utils/regions/Inactivity.java | 0 .../bteuk/network/utils/regions/Region.java | 18 +- .../network/utils/regions/RegionManager.java | 0 .../network/utils/regions/RegionMember.java | 0 .../bteuk/network/utils/regions/Request.java | 0 .../bteuk/network/utils/staff/Moderation.java | 6 +- .../texteditorbooks/BookCloseAction.java | 0 .../TextEditorBookListener.java | 0 .../network/utils/worldguard/WorldGuard.java | 0 .../utils/worldguard/WorldguardManager.java | 0 .../utils/worldguard/WorldguardMembers.java | 0 .../worldguard/WorldguardPlotsystem.java | 0 .../utils/worldguard/WorldguardRegions.java | 0 .../utils/worldguard/WorldguardUtils.java | 0 {src => Plugin/src}/main/resources/config.yml | 0 .../src}/main/resources/paper-plugin.yml | 0 .../src}/main/resources/portals.yml | 0 {src => Plugin/src}/main/resources/roles.yml | 0 {src => Plugin/src}/main/resources/rules.yml | 0 .../src}/main/resources/tips-example.txt | 0 .../BestFitRectangleTest.java | 0 .../network/utils/progression/LevelTest.java | 0 .../network/utils/staff/ModerationTest.java | 0 pom.xml | 259 +--------------- 248 files changed, 398 insertions(+), 326 deletions(-) create mode 100644 Network-API/pom.xml create mode 100644 Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java create mode 100644 Plugin/pom.xml rename {src => Plugin/src}/main/java/net/bteuk/network/CommandManager.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/CustomChat.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/Network.java (97%) rename {src => Plugin/src}/main/java/net/bteuk/network/TabManager.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/Timers.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_companion/BestFitRectangle.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_companion/BuildingCompanion.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_companion/MinecraftRectangleConverter.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_companion/SavedOutline.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_companion/TpllListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_counter/Building.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/building_counter/ConfirmationListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/AbstractCommand.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Afk.java (95%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Buildings.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Clear.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Demote.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Discord.java (94%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Focus.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Gamemode.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Hdb.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Help.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Me.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Msg.java (87%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Navigator.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Nightvision.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Phead.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Plot.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Pmute.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/PmuteAction.java (96%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/ProgressMap.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Promote.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/PromotionAction.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Ptime.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Punmute.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Pweather.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/RegionCommand.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Reply.java (88%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Rules.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Season.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Speed.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/TipsToggle.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Where.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/Zone.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/give/GiveBarrier.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/give/GiveDebugStick.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/give/GiveItem.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/give/GiveLight.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/BTEUK.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Back.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Delhome.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Home.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Homes.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Navigation.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Server.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Sethome.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Spawn.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Tp.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/TpToggle.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Tpll.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Warp.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/navigation/Warps.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Ban.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Exp.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Kick.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/ModerationInfo.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Mute.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Staff.java (96%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Unban.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/staff/Unmute.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/AbstractTabCompleter.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/FixedArgSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/MultiArgSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/commands/tabcompleters/TabCompleter.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/AbstractEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/EventManager.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/InviteEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/KickEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/RegionEvent.java (97%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/events/TeleportEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/Connect.java (97%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/GuiListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/DurationFormatException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/InvalidFormatException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/NoBuildPermissionException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/NotBannedException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/NotMutedException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/RegionManagerNotFoundException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/RegionNotFoundException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/WorldNotFoundException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/building_companion/DistanceLimitException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/exceptions/building_companion/OutsidePlotException.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/BuildGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/Gui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/GuiInterface.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/InviteMembers.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/NavigatorGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/Shop.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/UtilsGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/navigation/AddLocation.java (99%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/navigation/ExploreGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/navigation/LocationMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/RegionInfo.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/RegionMembers.java (99%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/RegionMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/KickMembers.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/LocationRequests.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/ManageRegion.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/ModerationGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/SelectUser.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/StaffGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/staff/TransferOwner.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java (99%) rename {src => Plugin/src}/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/AbstractReloadableComponent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/HologramClickEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/Lobby.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/LobbyCommand.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/LobbyComponent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/Map.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/MapCommand.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/Portal.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/TakeBookEvent.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/lobby/VoidTeleport.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/services/NetworkPromotionService.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/sql/AbstractSQL.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/sql/DatabaseInit.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/sql/GlobalSQL.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/sql/PlotSQL.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/sql/RegionSQL.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Blocks.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Coins.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Constants.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Coordinate.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Holograms.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Leaderboard.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/LightsOut.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/LocationUtil.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/NetworkConfig.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/NetworkUser.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Permissions.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/PlotValues.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Points.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Role.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Roles.java (95%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Statistics.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/SwitchServer.java (97%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/TextureUtils.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Time.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Tips.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/TpllFormat.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/TutorialRecommendation.java (90%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/Utils.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/AddLocationType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/Category.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/LeaderboardType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/ModerationType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/PlotStatus.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/PointsType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/RegionStatus.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/RegionType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/ServerType.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/enums/TimesOfDay.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/math/Line.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/math/Point.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/progression/Level.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/progression/Progression.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/regions/Inactivity.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/regions/Region.java (97%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/regions/RegionManager.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/regions/RegionMember.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/regions/Request.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/staff/Moderation.java (98%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/texteditorbooks/BookCloseAction.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java (100%) rename {src => Plugin/src}/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java (100%) rename {src => Plugin/src}/main/resources/config.yml (100%) rename {src => Plugin/src}/main/resources/paper-plugin.yml (100%) rename {src => Plugin/src}/main/resources/portals.yml (100%) rename {src => Plugin/src}/main/resources/roles.yml (100%) rename {src => Plugin/src}/main/resources/rules.yml (100%) rename {src => Plugin/src}/main/resources/tips-example.txt (100%) rename {src => Plugin/src}/test/java/net/bteuk/network/building_companion/BestFitRectangleTest.java (100%) rename {src => Plugin/src}/test/java/net/bteuk/network/utils/progression/LevelTest.java (100%) rename {src => Plugin/src}/test/java/net/bteuk/network/utils/staff/ModerationTest.java (100%) diff --git a/Network-API/pom.xml b/Network-API/pom.xml new file mode 100644 index 00000000..808b69ce --- /dev/null +++ b/Network-API/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + net.bteuk + Network + 1.7.3 + + + net.bteuk.network + api + Network API + API for the Network plugin + 1.0.0 + + + + jitpack.io + https://jitpack.io + + + + + + com.github.BTEUK + NetworkLib + main-SNAPSHOT + + + + \ No newline at end of file diff --git a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java new file mode 100644 index 00000000..019f4f2b --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java @@ -0,0 +1,9 @@ +package net.bteuk.network.api; + +import net.bteuk.network.lib.dto.AbstractTransferObject; + +public interface ChatAPI { + + void sendSocketMessage(AbstractTransferObject chatMessage); + +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java new file mode 100644 index 00000000..0b596e56 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -0,0 +1,11 @@ +package net.bteuk.network.api; + +public interface NetworkAPI { + + ChatAPI getChat(); + + SQLAPI getGlobalSQL(); + + SQLAPI getPlotSQL(); + +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java new file mode 100644 index 00000000..32c03c83 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java @@ -0,0 +1,4 @@ +package net.bteuk.network.api; + +public interface SQLAPI { +} diff --git a/Plugin/pom.xml b/Plugin/pom.xml new file mode 100644 index 00000000..b3dcabc2 --- /dev/null +++ b/Plugin/pom.xml @@ -0,0 +1,276 @@ + + + 4.0.0 + + net.bteuk + Network + 1.7.3 + + + net.bteuk.network + plugin + Network Plugin + Minecraft plugin for the BTEUK Network + + + 21 + UTF-8 + + 5.11.2 + 3.13.0 + 3.6.0 + 3.5.1 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.version} + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven.shade.version} + + + package + + shade + + + true + + + *:* + + META-INF/** + AUTHORS + LICENSE + README.md + Log4j-events.dtd + Log4j-events.xsd + Log4j-config.xsd + Log4j-levels.xsd + Log4j-charsets.properties + mozilla/public-suffix-list.txt + + + + com.github.BTEUK:* + + net/kyori/** + com/google/** + net/daporkchop/lib/binary/** + org/** + com/fasterxml/jackson/** + io/netty/** + config.yml + javax/annotation/** + LZMA/** + net/buildtheearth/** + it/unimi/dsi/fastutil/** + net/daporkchop/lib/** + SCL.lombok/** + plugin.yml + lombok/** + changelog.txt + latestchanges.html + release-timestamp.txt + net/bteuk/teachingtutorials/services/** + + + + com.github.BTEUK:ProgressMapper + + me/bteuk/progressmapperbackend/** + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + jitpack.io + https://jitpack.io + + + sk89q-repo + https://maven.enginehub.org/repo/ + + + DaPorkchop_ + https://maven.daporkchop.net/ + + + OpenCollab Snapshots + https://repo.opencollab.dev/snapshot/ + + + dmulloy2-repo + https://repo.dmulloy2.net/repository/public/ + + + codemc-repo + https://repo.codemc.io/repository/maven-public/ + default + + + + + + + net.bteuk.network + api + 1.0.0 + + + + + io.papermc.paper + paper-api + 1.21.1-R0.1-SNAPSHOT + provided + + + + + com.sk89q.worldguard + worldguard-bukkit + 7.0.12 + provided + + + com.comphenix.protocol + ProtocolLib + 5.3.0 + provided + + + com.github.decentsoftware-eu + decentholograms + 2.8.11 + provided + + + net.luckperms + api + 5.4 + provided + + + + + org.projectlombok + lombok + 1.18.34 + provided + + + io.papermc + paperlib + 1.0.7 + compile + + + org.apache.commons + commons-dbcp2 + 2.12.0 + + + org.apache.commons + commons-lang3 + 3.17.0 + + + commons-io + commons-io + 2.17.0 + + + com.github.BTEUK + terraminusminus + 41d3843a79 + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.google.guava + guava + 33.3.1-jre + + + + + com.github.BTEUK + ProgressMapper + 231624865f + + + com.github.BTEUK + NetworkLib + a781b6371c + + + com.github.BTEUK + TeachingTutorials + 1.13.0 + + + com.github.BTEUK + TeachingTutorialsAPI + 970d3dc3f7 + provided + + + + + org.junit.jupiter + junit-jupiter + ${junit.version} + test + + + \ No newline at end of file diff --git a/src/main/java/net/bteuk/network/CommandManager.java b/Plugin/src/main/java/net/bteuk/network/CommandManager.java similarity index 100% rename from src/main/java/net/bteuk/network/CommandManager.java rename to Plugin/src/main/java/net/bteuk/network/CommandManager.java index 1a880964..c38567c2 100644 --- a/src/main/java/net/bteuk/network/CommandManager.java +++ b/Plugin/src/main/java/net/bteuk/network/CommandManager.java @@ -4,8 +4,8 @@ import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import net.bteuk.network.commands.Afk; -import net.bteuk.network.commands.Buildings; import net.bteuk.network.commands.BuildingCompanionCommand; +import net.bteuk.network.commands.Buildings; import net.bteuk.network.commands.Clear; import net.bteuk.network.commands.Demote; import net.bteuk.network.commands.Discord; diff --git a/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java similarity index 98% rename from src/main/java/net/bteuk/network/CustomChat.java rename to Plugin/src/main/java/net/bteuk/network/CustomChat.java index 94d5b6fe..bf43c2da 100644 --- a/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -1,6 +1,7 @@ package net.bteuk.network; import io.papermc.paper.event.player.AsyncChatEvent; +import net.bteuk.network.api.ChatAPI; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.exceptions.NotMutedException; import net.bteuk.network.lib.dto.AbstractTransferObject; @@ -39,7 +40,7 @@ import static net.bteuk.network.utils.staff.Moderation.getMutedComponent; import static net.bteuk.network.utils.staff.Moderation.isMuted; -public class CustomChat implements Listener, SocketHandler { +public class CustomChat implements Listener, SocketHandler, ChatAPI { private static final String AFK = "%s is now afk"; private static final String NOT_AFK = "%s is no longer afk"; @@ -168,11 +169,11 @@ public void onPlayerChatEvent(AsyncChatEvent e) { updateAfkStatus(user, false); } ChatMessage chatMessage = getChatMessage(e.message(), user); - sendSocketMesage(chatMessage); + sendSocketMessage(chatMessage); } } - public void sendSocketMesage(AbstractTransferObject chatMessage) { + public void sendSocketMessage(AbstractTransferObject chatMessage) { outputSocket.sendSocketMessage(chatMessage); } @@ -307,6 +308,6 @@ public void broadcastAFK(Player p, boolean afk) { } // Send message - sendSocketMesage(chatMessage); + sendSocketMessage(chatMessage); } } diff --git a/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java similarity index 97% rename from src/main/java/net/bteuk/network/Network.java rename to Plugin/src/main/java/net/bteuk/network/Network.java index 7818dac7..211c5a95 100644 --- a/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -1,6 +1,7 @@ package net.bteuk.network; import lombok.Getter; +import net.bteuk.network.api.NetworkAPI; import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.commands.staff.Ban; import net.bteuk.network.commands.staff.Kick; @@ -59,7 +60,7 @@ import static net.bteuk.network.utils.Constants.TUTORIALS; import static net.bteuk.network.utils.NetworkConfig.CONFIG; -public final class Network extends JavaPlugin { +public final class Network extends JavaPlugin implements NetworkAPI { // Returns an instance of the plugin. @Getter @@ -330,7 +331,11 @@ public void enablePlugin() { } // Let the Proxy know that the server is enabled. - instance.getChat().sendSocketMesage(new ServerStartup(SERVER_NAME)); + instance.getChat().sendSocketMessage(new ServerStartup(SERVER_NAME)); + + // Register the API as a service. + getServer().getServicesManager().register(NetworkAPI.class, this, this, ServicePriority.Normal); + } @Override diff --git a/src/main/java/net/bteuk/network/TabManager.java b/Plugin/src/main/java/net/bteuk/network/TabManager.java similarity index 100% rename from src/main/java/net/bteuk/network/TabManager.java rename to Plugin/src/main/java/net/bteuk/network/TabManager.java diff --git a/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java similarity index 100% rename from src/main/java/net/bteuk/network/Timers.java rename to Plugin/src/main/java/net/bteuk/network/Timers.java diff --git a/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java similarity index 100% rename from src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java rename to Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java diff --git a/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java similarity index 100% rename from src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java rename to Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java diff --git a/src/main/java/net/bteuk/network/building_companion/MinecraftRectangleConverter.java b/Plugin/src/main/java/net/bteuk/network/building_companion/MinecraftRectangleConverter.java similarity index 100% rename from src/main/java/net/bteuk/network/building_companion/MinecraftRectangleConverter.java rename to Plugin/src/main/java/net/bteuk/network/building_companion/MinecraftRectangleConverter.java diff --git a/src/main/java/net/bteuk/network/building_companion/SavedOutline.java b/Plugin/src/main/java/net/bteuk/network/building_companion/SavedOutline.java similarity index 100% rename from src/main/java/net/bteuk/network/building_companion/SavedOutline.java rename to Plugin/src/main/java/net/bteuk/network/building_companion/SavedOutline.java diff --git a/src/main/java/net/bteuk/network/building_companion/TpllListener.java b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java similarity index 100% rename from src/main/java/net/bteuk/network/building_companion/TpllListener.java rename to Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java diff --git a/src/main/java/net/bteuk/network/building_counter/Building.java b/Plugin/src/main/java/net/bteuk/network/building_counter/Building.java similarity index 100% rename from src/main/java/net/bteuk/network/building_counter/Building.java rename to Plugin/src/main/java/net/bteuk/network/building_counter/Building.java diff --git a/src/main/java/net/bteuk/network/building_counter/ConfirmationListener.java b/Plugin/src/main/java/net/bteuk/network/building_counter/ConfirmationListener.java similarity index 100% rename from src/main/java/net/bteuk/network/building_counter/ConfirmationListener.java rename to Plugin/src/main/java/net/bteuk/network/building_counter/ConfirmationListener.java diff --git a/src/main/java/net/bteuk/network/commands/AbstractCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/AbstractCommand.java rename to Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java diff --git a/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java similarity index 95% rename from src/main/java/net/bteuk/network/commands/Afk.java rename to Plugin/src/main/java/net/bteuk/network/commands/Afk.java index b7c38991..92b6b64c 100644 --- a/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -21,7 +21,7 @@ public static void updateAfkStatus(NetworkUser user, boolean afk) { UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(user.player.getUniqueId().toString()); userUpdateEvent.setAfk(afk); - Network.getInstance().getChat().sendSocketMesage(userUpdateEvent); + Network.getInstance().getChat().sendSocketMessage(userUpdateEvent); } @Override diff --git a/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java rename to Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java diff --git a/src/main/java/net/bteuk/network/commands/Buildings.java b/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Buildings.java rename to Plugin/src/main/java/net/bteuk/network/commands/Buildings.java diff --git a/src/main/java/net/bteuk/network/commands/Clear.java b/Plugin/src/main/java/net/bteuk/network/commands/Clear.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Clear.java rename to Plugin/src/main/java/net/bteuk/network/commands/Clear.java diff --git a/src/main/java/net/bteuk/network/commands/Demote.java b/Plugin/src/main/java/net/bteuk/network/commands/Demote.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Demote.java rename to Plugin/src/main/java/net/bteuk/network/commands/Demote.java diff --git a/src/main/java/net/bteuk/network/commands/Discord.java b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java similarity index 94% rename from src/main/java/net/bteuk/network/commands/Discord.java rename to Plugin/src/main/java/net/bteuk/network/commands/Discord.java index edd3396b..999e6f28 100644 --- a/src/main/java/net/bteuk/network/commands/Discord.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java @@ -65,7 +65,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setToken(token); - Network.getInstance().getChat().sendSocketMesage(discordLinking); + Network.getInstance().getChat().sendSocketMessage(discordLinking); player.sendMessage(ChatUtils.success("To link your Discord please DM the code %s to the UK Bot within" + " the next 5 minutes.", token)); @@ -88,13 +88,13 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), false); - Network.getInstance().getChat().sendSocketMesage(discordRole); + Network.getInstance().getChat().sendSocketMessage(discordRole); DiscordLinking discordLinking = new DiscordLinking(); discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setDiscordId(user.getDiscordId()); discordLinking.setUnlink(true); - Network.getInstance().getChat().sendSocketMesage(discordLinking); + Network.getInstance().getChat().sendSocketMessage(discordLinking); user.isLinked = false; player.sendMessage(ChatUtils.success("Unlinked your Discord.")); diff --git a/src/main/java/net/bteuk/network/commands/Focus.java b/Plugin/src/main/java/net/bteuk/network/commands/Focus.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Focus.java rename to Plugin/src/main/java/net/bteuk/network/commands/Focus.java diff --git a/src/main/java/net/bteuk/network/commands/Gamemode.java b/Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Gamemode.java rename to Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java diff --git a/src/main/java/net/bteuk/network/commands/Hdb.java b/Plugin/src/main/java/net/bteuk/network/commands/Hdb.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Hdb.java rename to Plugin/src/main/java/net/bteuk/network/commands/Hdb.java diff --git a/src/main/java/net/bteuk/network/commands/Help.java b/Plugin/src/main/java/net/bteuk/network/commands/Help.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Help.java rename to Plugin/src/main/java/net/bteuk/network/commands/Help.java diff --git a/src/main/java/net/bteuk/network/commands/Me.java b/Plugin/src/main/java/net/bteuk/network/commands/Me.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Me.java rename to Plugin/src/main/java/net/bteuk/network/commands/Me.java diff --git a/src/main/java/net/bteuk/network/commands/Msg.java b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java similarity index 87% rename from src/main/java/net/bteuk/network/commands/Msg.java rename to Plugin/src/main/java/net/bteuk/network/commands/Msg.java index 1f9de7b5..b391642c 100644 --- a/src/main/java/net/bteuk/network/commands/Msg.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java @@ -3,8 +3,6 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.commands.tabcompleters.PlayerSelector; -import net.bteuk.network.exceptions.NotMutedException; -import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.PrivateMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; @@ -14,10 +12,6 @@ import java.util.Arrays; -import static net.bteuk.network.CustomChat.getDirectMessage; -import static net.bteuk.network.utils.staff.Moderation.getMutedComponent; -import static net.bteuk.network.utils.staff.Moderation.isMuted; - /** * General message command, includes /tell, /w and /msg */ @@ -72,6 +66,6 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); //DirectMessage directMessage = getDirectMessage(message, player.getName(), player.getUniqueId().toString(),name, uuid, ChatChannels.GLOBAL); PrivateMessage privateMessage = new PrivateMessage(ChatChannels.GLOBAL.getChannelName(), player.getName(), args[0],message, false); - instance.getChat().sendSocketMesage(privateMessage); + instance.getChat().sendSocketMessage(privateMessage); } } diff --git a/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Navigator.java rename to Plugin/src/main/java/net/bteuk/network/commands/Navigator.java diff --git a/src/main/java/net/bteuk/network/commands/Nightvision.java b/Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Nightvision.java rename to Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java diff --git a/src/main/java/net/bteuk/network/commands/Phead.java b/Plugin/src/main/java/net/bteuk/network/commands/Phead.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Phead.java rename to Plugin/src/main/java/net/bteuk/network/commands/Phead.java diff --git a/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Plot.java rename to Plugin/src/main/java/net/bteuk/network/commands/Plot.java diff --git a/src/main/java/net/bteuk/network/commands/Pmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Pmute.java rename to Plugin/src/main/java/net/bteuk/network/commands/Pmute.java diff --git a/src/main/java/net/bteuk/network/commands/PmuteAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java similarity index 96% rename from src/main/java/net/bteuk/network/commands/PmuteAction.java rename to Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java index c28c0695..cfb7586b 100644 --- a/src/main/java/net/bteuk/network/commands/PmuteAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java @@ -46,6 +46,6 @@ public void onCommand(CommandSourceStack stack, String[] args, boolean mute) { MuteEvent muteEvent = new MuteEvent(player.getUniqueId().toString(), uuid, mute); // Feedback will be sent through a direct message to the player by the proxy. - instance.getChat().sendSocketMesage(muteEvent); + instance.getChat().sendSocketMessage(muteEvent); } } diff --git a/src/main/java/net/bteuk/network/commands/ProgressMap.java b/Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/ProgressMap.java rename to Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java diff --git a/src/main/java/net/bteuk/network/commands/Promote.java b/Plugin/src/main/java/net/bteuk/network/commands/Promote.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Promote.java rename to Plugin/src/main/java/net/bteuk/network/commands/Promote.java diff --git a/src/main/java/net/bteuk/network/commands/PromotionAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/PromotionAction.java rename to Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java diff --git a/src/main/java/net/bteuk/network/commands/Ptime.java b/Plugin/src/main/java/net/bteuk/network/commands/Ptime.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Ptime.java rename to Plugin/src/main/java/net/bteuk/network/commands/Ptime.java diff --git a/src/main/java/net/bteuk/network/commands/Punmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Punmute.java rename to Plugin/src/main/java/net/bteuk/network/commands/Punmute.java diff --git a/src/main/java/net/bteuk/network/commands/Pweather.java b/Plugin/src/main/java/net/bteuk/network/commands/Pweather.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Pweather.java rename to Plugin/src/main/java/net/bteuk/network/commands/Pweather.java diff --git a/src/main/java/net/bteuk/network/commands/RegionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/RegionCommand.java rename to Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java diff --git a/src/main/java/net/bteuk/network/commands/Reply.java b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java similarity index 88% rename from src/main/java/net/bteuk/network/commands/Reply.java rename to Plugin/src/main/java/net/bteuk/network/commands/Reply.java index c9806e38..2f272608 100644 --- a/src/main/java/net/bteuk/network/commands/Reply.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java @@ -2,7 +2,6 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; -import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.ReplyMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; @@ -11,8 +10,6 @@ import java.util.Arrays; -import static net.bteuk.network.CustomChat.getDirectMessage; - public class Reply extends AbstractCommand { private final Msg msgCommand; @@ -36,7 +33,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } String message = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); ReplyMessage replymessage = new ReplyMessage(ChatChannels.GLOBAL.getChannelName(),player.getName(),message,false); - instance.getChat().sendSocketMesage(replymessage); + instance.getChat().sendSocketMessage(replymessage); } diff --git a/src/main/java/net/bteuk/network/commands/Rules.java b/Plugin/src/main/java/net/bteuk/network/commands/Rules.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Rules.java rename to Plugin/src/main/java/net/bteuk/network/commands/Rules.java diff --git a/src/main/java/net/bteuk/network/commands/Season.java b/Plugin/src/main/java/net/bteuk/network/commands/Season.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Season.java rename to Plugin/src/main/java/net/bteuk/network/commands/Season.java diff --git a/src/main/java/net/bteuk/network/commands/Speed.java b/Plugin/src/main/java/net/bteuk/network/commands/Speed.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Speed.java rename to Plugin/src/main/java/net/bteuk/network/commands/Speed.java diff --git a/src/main/java/net/bteuk/network/commands/TipsToggle.java b/Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/TipsToggle.java rename to Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java diff --git a/src/main/java/net/bteuk/network/commands/Where.java b/Plugin/src/main/java/net/bteuk/network/commands/Where.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Where.java rename to Plugin/src/main/java/net/bteuk/network/commands/Where.java diff --git a/src/main/java/net/bteuk/network/commands/Zone.java b/Plugin/src/main/java/net/bteuk/network/commands/Zone.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/Zone.java rename to Plugin/src/main/java/net/bteuk/network/commands/Zone.java diff --git a/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/give/GiveBarrier.java rename to Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java diff --git a/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java rename to Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java diff --git a/src/main/java/net/bteuk/network/commands/give/GiveItem.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/give/GiveItem.java rename to Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java diff --git a/src/main/java/net/bteuk/network/commands/give/GiveLight.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/give/GiveLight.java rename to Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/BTEUK.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Back.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Back.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Delhome.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Delhome.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Home.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Home.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Homes.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Homes.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Navigation.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Navigation.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Server.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Server.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Sethome.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Sethome.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Spawn.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Spawn.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Tp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Tp.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/TpToggle.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Tpll.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Tpll.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Warp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Warp.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java diff --git a/src/main/java/net/bteuk/network/commands/navigation/Warps.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/navigation/Warps.java rename to Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Ban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Ban.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Exp.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Exp.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Kick.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Kick.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java diff --git a/src/main/java/net/bteuk/network/commands/staff/ModerationInfo.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/ModerationInfo.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/ModerationInfo.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/ModerationInfo.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Mute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Mute.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java similarity index 96% rename from src/main/java/net/bteuk/network/commands/staff/Staff.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index e53180b6..43a4dc06 100644 --- a/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -81,7 +81,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Send message in staff chat, by temporarily setting the players channel to staff. u.setChatChannel(STAFF.getChannelName()); Network.getInstance().getChat() - .sendSocketMesage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); + .sendSocketMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); u.setChatChannel(GLOBAL.getChannelName()); } return; diff --git a/src/main/java/net/bteuk/network/commands/staff/Unban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Unban.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java diff --git a/src/main/java/net/bteuk/network/commands/staff/Unmute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/staff/Unmute.java rename to Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/AbstractTabCompleter.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/AbstractTabCompleter.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/AbstractTabCompleter.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/AbstractTabCompleter.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/FixedArgSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/FixedArgSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/FixedArgSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/FixedArgSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/MultiArgSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/MultiArgSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/MultiArgSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/MultiArgSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java diff --git a/src/main/java/net/bteuk/network/commands/tabcompleters/TabCompleter.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/TabCompleter.java similarity index 100% rename from src/main/java/net/bteuk/network/commands/tabcompleters/TabCompleter.java rename to Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/TabCompleter.java diff --git a/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java diff --git a/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/events/EventManager.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java diff --git a/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/events/InviteEvent.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java diff --git a/src/main/java/net/bteuk/network/eventing/events/KickEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/events/KickEvent.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java diff --git a/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java similarity index 97% rename from src/main/java/net/bteuk/network/eventing/events/RegionEvent.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java index 4c43fa23..bf18ab4c 100644 --- a/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java @@ -65,7 +65,7 @@ public void event(String uuid, String[] event, String eMessage) { Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data " + "WHERE uuid='" + event[4] + "';"), event[3]), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } else if (event[2].equals("deny")) { @@ -80,7 +80,7 @@ public void event(String uuid, String[] event, String eMessage) { Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data " + "WHERE uuid='" + event[4] + "';"), event[3]), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } case "leave" -> { @@ -105,7 +105,7 @@ public void event(String uuid, String[] event, String eMessage) { ChatUtils.success("Transferred ownership of region %s to you due to the previous owner " + "leaving the region.", region.getTag(member)), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } else if (!region.hasOwner() && !region.hasMember()) { // The region is has no owner and members, set the status to default. @@ -135,7 +135,7 @@ public void event(String uuid, String[] event, String eMessage) { Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data WHERE " + "uuid='" + uuid + "';"), region.getTag(region.getOwner())), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } } diff --git a/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java rename to Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java similarity index 98% rename from src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index 2c600fca..9c7cd27a 100644 --- a/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -157,6 +157,6 @@ public void onServerClose(ArrayList users) { users.clear(); // Let the Proxy know the server is closing. - instance.getChat().sendSocketMesage(new ServerShutdown(SERVER_NAME)); + instance.getChat().sendSocketMessage(new ServerShutdown(SERVER_NAME)); } } diff --git a/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java similarity index 97% rename from src/main/java/net/bteuk/network/eventing/listeners/Connect.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index e515bc6e..a7a72d5c 100644 --- a/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -10,7 +10,6 @@ import net.bteuk.network.lib.dto.UserConnectRequest; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; -import net.bteuk.network.utils.Constants; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.TextureUtils; import net.bteuk.network.utils.Time; @@ -18,7 +17,6 @@ import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -134,7 +132,7 @@ public void joinServerEvent(PlayerJoinEvent e) { e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer") ); Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMesage(userConnectRequest)); + () -> Network.getInstance().getChat().sendSocketMessage(userConnectRequest)); LOGGER.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", e.getPlayer().getName())); } @@ -157,7 +155,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { disconnectEvent.setUuid(e.getPlayer().getUniqueId().toString()); disconnectEvent.setServer(SERVER_NAME); Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMesage(disconnectEvent)); + () -> Network.getInstance().getChat().sendSocketMessage(disconnectEvent)); return; } @@ -196,6 +194,6 @@ public void leaveServerEvent(PlayerQuitEvent e) { // Send a disconnect event to the proxy to handle potential messages. UserDisconnect userDisconnect = user.createDisconnectEvent(); Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMesage(userDisconnect)); + () -> Network.getInstance().getChat().sendSocketMessage(userDisconnect)); } } diff --git a/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java diff --git a/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java similarity index 100% rename from src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java rename to Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java diff --git a/src/main/java/net/bteuk/network/exceptions/DurationFormatException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/DurationFormatException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/DurationFormatException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/DurationFormatException.java diff --git a/src/main/java/net/bteuk/network/exceptions/InvalidFormatException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/InvalidFormatException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/InvalidFormatException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/InvalidFormatException.java diff --git a/src/main/java/net/bteuk/network/exceptions/NoBuildPermissionException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/NoBuildPermissionException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/NoBuildPermissionException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/NoBuildPermissionException.java diff --git a/src/main/java/net/bteuk/network/exceptions/NotBannedException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/NotBannedException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/NotBannedException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/NotBannedException.java diff --git a/src/main/java/net/bteuk/network/exceptions/NotMutedException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/NotMutedException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/NotMutedException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/NotMutedException.java diff --git a/src/main/java/net/bteuk/network/exceptions/RegionManagerNotFoundException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/RegionManagerNotFoundException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/RegionManagerNotFoundException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/RegionManagerNotFoundException.java diff --git a/src/main/java/net/bteuk/network/exceptions/RegionNotFoundException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/RegionNotFoundException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/RegionNotFoundException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/RegionNotFoundException.java diff --git a/src/main/java/net/bteuk/network/exceptions/WorldNotFoundException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/WorldNotFoundException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/WorldNotFoundException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/WorldNotFoundException.java diff --git a/src/main/java/net/bteuk/network/exceptions/building_companion/DistanceLimitException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/building_companion/DistanceLimitException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/building_companion/DistanceLimitException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/building_companion/DistanceLimitException.java diff --git a/src/main/java/net/bteuk/network/exceptions/building_companion/OutsidePlotException.java b/Plugin/src/main/java/net/bteuk/network/exceptions/building_companion/OutsidePlotException.java similarity index 100% rename from src/main/java/net/bteuk/network/exceptions/building_companion/OutsidePlotException.java rename to Plugin/src/main/java/net/bteuk/network/exceptions/building_companion/OutsidePlotException.java diff --git a/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/BuildGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java diff --git a/src/main/java/net/bteuk/network/gui/Gui.java b/Plugin/src/main/java/net/bteuk/network/gui/Gui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/Gui.java rename to Plugin/src/main/java/net/bteuk/network/gui/Gui.java diff --git a/src/main/java/net/bteuk/network/gui/GuiInterface.java b/Plugin/src/main/java/net/bteuk/network/gui/GuiInterface.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/GuiInterface.java rename to Plugin/src/main/java/net/bteuk/network/gui/GuiInterface.java diff --git a/src/main/java/net/bteuk/network/gui/InviteMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/InviteMembers.java rename to Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java diff --git a/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/NavigatorGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java diff --git a/src/main/java/net/bteuk/network/gui/Shop.java b/Plugin/src/main/java/net/bteuk/network/gui/Shop.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/Shop.java rename to Plugin/src/main/java/net/bteuk/network/gui/Shop.java diff --git a/src/main/java/net/bteuk/network/gui/UtilsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/UtilsGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java diff --git a/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java similarity index 99% rename from src/main/java/net/bteuk/network/gui/navigation/AddLocation.java rename to Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index aa33710c..cfe16de4 100644 --- a/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -505,7 +505,7 @@ public void requestLocation(NetworkUser u) { // Notify reviewers. ChatMessage chatMessage = new ChatMessage(REVIEWER.getChannelName(), "server", ChatUtils.success("A new " + "location has been requested.")); - Network.getInstance().getChat().sendSocketMesage(chatMessage); + Network.getInstance().getChat().sendSocketMessage(chatMessage); u.player.sendMessage(ChatUtils.success("Location %s requested.", name)); diff --git a/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java diff --git a/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java diff --git a/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java rename to Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java diff --git a/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java diff --git a/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java rename to Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java diff --git a/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java rename to Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java diff --git a/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java rename to Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java diff --git a/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/regions/RegionInfo.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java diff --git a/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java similarity index 99% rename from src/main/java/net/bteuk/network/gui/regions/RegionMembers.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java index f7504178..828da8dc 100644 --- a/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java @@ -162,7 +162,7 @@ private void createGui() { uuid, "server", ChatUtils.success("You are now the owner of region %s.", region.getTag(uuid)), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); // Return to region info. this.delete(); diff --git a/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/regions/RegionMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java diff --git a/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java diff --git a/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java diff --git a/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java rename to Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java diff --git a/src/main/java/net/bteuk/network/gui/staff/KickMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/KickMembers.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java diff --git a/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/LocationRequests.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java diff --git a/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/ManageRegion.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java diff --git a/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java diff --git a/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/ModerationGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java diff --git a/src/main/java/net/bteuk/network/gui/staff/SelectUser.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/SelectUser.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java diff --git a/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/StaffGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java diff --git a/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/staff/TransferOwner.java rename to Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java diff --git a/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java diff --git a/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java diff --git a/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java index 9a670350..cb21562b 100644 --- a/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java @@ -16,10 +16,10 @@ import teachingtutorials.tutorialobjects.TutorialRecommendation; import teachingtutorials.utils.Display; -import static net.bteuk.network.utils.Constants.LOGGER; - import java.util.UUID; +import static net.bteuk.network.utils.Constants.LOGGER; + public class RecommendationAddGui extends Gui { private final Gui parentGui; diff --git a/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index 9e5084d7..e5e531df 100644 --- a/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -17,10 +17,10 @@ import teachingtutorials.tutorialobjects.Tutorial; import teachingtutorials.utils.DBConnection; -import static net.bteuk.network.utils.Constants.LOGGER; - import java.util.UUID; +import static net.bteuk.network.utils.Constants.LOGGER; + public class RecommendedTutorialsGui extends Gui { private final Gui parentGui; diff --git a/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java diff --git a/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java similarity index 99% rename from src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java index 150159ce..51a2989f 100644 --- a/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java @@ -10,13 +10,11 @@ import org.bukkit.Material; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import teachingtutorials.TeachingTutorials; import teachingtutorials.guis.Event; import teachingtutorials.guis.EventType; import teachingtutorials.tutorialobjects.LessonObject; import teachingtutorials.tutorialobjects.Location; import teachingtutorials.tutorialobjects.Tutorial; -import teachingtutorials.utils.User; import static net.bteuk.network.utils.Constants.LOGGER; diff --git a/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java similarity index 100% rename from src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java rename to Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java diff --git a/src/main/java/net/bteuk/network/lobby/AbstractReloadableComponent.java b/Plugin/src/main/java/net/bteuk/network/lobby/AbstractReloadableComponent.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/AbstractReloadableComponent.java rename to Plugin/src/main/java/net/bteuk/network/lobby/AbstractReloadableComponent.java diff --git a/src/main/java/net/bteuk/network/lobby/HologramClickEvent.java b/Plugin/src/main/java/net/bteuk/network/lobby/HologramClickEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/HologramClickEvent.java rename to Plugin/src/main/java/net/bteuk/network/lobby/HologramClickEvent.java diff --git a/src/main/java/net/bteuk/network/lobby/Lobby.java b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/Lobby.java rename to Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java diff --git a/src/main/java/net/bteuk/network/lobby/LobbyCommand.java b/Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/LobbyCommand.java rename to Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java diff --git a/src/main/java/net/bteuk/network/lobby/LobbyComponent.java b/Plugin/src/main/java/net/bteuk/network/lobby/LobbyComponent.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/LobbyComponent.java rename to Plugin/src/main/java/net/bteuk/network/lobby/LobbyComponent.java diff --git a/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/Map.java rename to Plugin/src/main/java/net/bteuk/network/lobby/Map.java diff --git a/src/main/java/net/bteuk/network/lobby/MapCommand.java b/Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/MapCommand.java rename to Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java diff --git a/src/main/java/net/bteuk/network/lobby/Portal.java b/Plugin/src/main/java/net/bteuk/network/lobby/Portal.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/Portal.java rename to Plugin/src/main/java/net/bteuk/network/lobby/Portal.java diff --git a/src/main/java/net/bteuk/network/lobby/TakeBookEvent.java b/Plugin/src/main/java/net/bteuk/network/lobby/TakeBookEvent.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/TakeBookEvent.java rename to Plugin/src/main/java/net/bteuk/network/lobby/TakeBookEvent.java diff --git a/src/main/java/net/bteuk/network/lobby/VoidTeleport.java b/Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java similarity index 100% rename from src/main/java/net/bteuk/network/lobby/VoidTeleport.java rename to Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java diff --git a/src/main/java/net/bteuk/network/services/NetworkPromotionService.java b/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java similarity index 100% rename from src/main/java/net/bteuk/network/services/NetworkPromotionService.java rename to Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java diff --git a/src/main/java/net/bteuk/network/sql/AbstractSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java similarity index 98% rename from src/main/java/net/bteuk/network/sql/AbstractSQL.java rename to Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java index 544db493..d1f64930 100644 --- a/src/main/java/net/bteuk/network/sql/AbstractSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java @@ -1,5 +1,6 @@ package net.bteuk.network.sql; +import net.bteuk.network.api.SQLAPI; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; @@ -9,11 +10,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.logging.Level; import static net.bteuk.network.utils.Constants.LOGGER; -public abstract class AbstractSQL { +public abstract class AbstractSQL implements SQLAPI { private final BasicDataSource dataSource; diff --git a/src/main/java/net/bteuk/network/sql/DatabaseInit.java b/Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java similarity index 100% rename from src/main/java/net/bteuk/network/sql/DatabaseInit.java rename to Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java diff --git a/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java similarity index 100% rename from src/main/java/net/bteuk/network/sql/GlobalSQL.java rename to Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java diff --git a/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java similarity index 100% rename from src/main/java/net/bteuk/network/sql/PlotSQL.java rename to Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index f688822f..7281da47 100644 --- a/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -2,8 +2,8 @@ import net.bteuk.network.lib.enums.PlotDifficulties; import net.bteuk.network.lib.utils.Reviewing; -import net.bteuk.network.utils.plotsystem.SubmittedPlot; import net.bteuk.network.utils.TutorialRecommendation; +import net.bteuk.network.utils.plotsystem.SubmittedPlot; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; diff --git a/src/main/java/net/bteuk/network/sql/RegionSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java similarity index 100% rename from src/main/java/net/bteuk/network/sql/RegionSQL.java rename to Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java diff --git a/src/main/java/net/bteuk/network/utils/Blocks.java b/Plugin/src/main/java/net/bteuk/network/utils/Blocks.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Blocks.java rename to Plugin/src/main/java/net/bteuk/network/utils/Blocks.java diff --git a/src/main/java/net/bteuk/network/utils/Coins.java b/Plugin/src/main/java/net/bteuk/network/utils/Coins.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Coins.java rename to Plugin/src/main/java/net/bteuk/network/utils/Coins.java diff --git a/src/main/java/net/bteuk/network/utils/Constants.java b/Plugin/src/main/java/net/bteuk/network/utils/Constants.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Constants.java rename to Plugin/src/main/java/net/bteuk/network/utils/Constants.java diff --git a/src/main/java/net/bteuk/network/utils/Coordinate.java b/Plugin/src/main/java/net/bteuk/network/utils/Coordinate.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Coordinate.java rename to Plugin/src/main/java/net/bteuk/network/utils/Coordinate.java diff --git a/src/main/java/net/bteuk/network/utils/Holograms.java b/Plugin/src/main/java/net/bteuk/network/utils/Holograms.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Holograms.java rename to Plugin/src/main/java/net/bteuk/network/utils/Holograms.java diff --git a/src/main/java/net/bteuk/network/utils/Leaderboard.java b/Plugin/src/main/java/net/bteuk/network/utils/Leaderboard.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Leaderboard.java rename to Plugin/src/main/java/net/bteuk/network/utils/Leaderboard.java diff --git a/src/main/java/net/bteuk/network/utils/LightsOut.java b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/LightsOut.java rename to Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java diff --git a/src/main/java/net/bteuk/network/utils/LocationUtil.java b/Plugin/src/main/java/net/bteuk/network/utils/LocationUtil.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/LocationUtil.java rename to Plugin/src/main/java/net/bteuk/network/utils/LocationUtil.java diff --git a/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/NetworkConfig.java rename to Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java diff --git a/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java similarity index 98% rename from src/main/java/net/bteuk/network/utils/NetworkUser.java rename to Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index bccded59..5880abf3 100644 --- a/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -228,7 +228,7 @@ public static Set getChannels(Player player) { public static void sendOfflineMessage(String uuid, Component message) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", message , true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } public UserDisconnect createDisconnectEvent() { @@ -349,7 +349,7 @@ private void setFocusEnabled(boolean enabled) { showPlayers(); } FocusEvent focusEvent = new FocusEvent(player.getUniqueId().toString(), focusEnabled); - instance.getChat().sendSocketMesage(focusEvent); + instance.getChat().sendSocketMessage(focusEvent); } public void hidePlayer(Player playerToHide) { diff --git a/src/main/java/net/bteuk/network/utils/Permissions.java b/Plugin/src/main/java/net/bteuk/network/utils/Permissions.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Permissions.java rename to Plugin/src/main/java/net/bteuk/network/utils/Permissions.java diff --git a/src/main/java/net/bteuk/network/utils/PlotValues.java b/Plugin/src/main/java/net/bteuk/network/utils/PlotValues.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/PlotValues.java rename to Plugin/src/main/java/net/bteuk/network/utils/PlotValues.java diff --git a/src/main/java/net/bteuk/network/utils/Points.java b/Plugin/src/main/java/net/bteuk/network/utils/Points.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Points.java rename to Plugin/src/main/java/net/bteuk/network/utils/Points.java diff --git a/src/main/java/net/bteuk/network/utils/Role.java b/Plugin/src/main/java/net/bteuk/network/utils/Role.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Role.java rename to Plugin/src/main/java/net/bteuk/network/utils/Role.java diff --git a/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java similarity index 95% rename from src/main/java/net/bteuk/network/utils/Roles.java rename to Plugin/src/main/java/net/bteuk/network/utils/Roles.java index c1bc33de..642abce1 100644 --- a/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -190,7 +190,7 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { promotation_message = promotation_message.decorate(TextDecoration.BOLD); ChatMessage chatMessage = new ChatMessage(GLOBAL.getChannelName(), "server", promotation_message); - Network.getInstance().getChat().sendSocketMesage(chatMessage); + Network.getInstance().getChat().sendSocketMessage(chatMessage); } // Check if the player is online. @@ -200,7 +200,7 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", PROMOTION_SELF.append(colouredRole), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } @@ -252,7 +252,7 @@ public static CompletableFuture alterRole(String uuid, String name, S UserUpdate userUpdate = new UserUpdate(); userUpdate.setUuid(uuid); userUpdate.setTabPlayer(tabPlayer); - Network.getInstance().getChat().sendSocketMesage(userUpdate); + Network.getInstance().getChat().sendSocketMessage(userUpdate); // If the new primary role is architect or reviewer, and they were promoted add them to the reviewers // database table. @@ -262,7 +262,7 @@ public static CompletableFuture alterRole(String uuid, String name, S } DiscordRole discordRole = new DiscordRole(uuid, roleId, !remove); - Network.getInstance().getChat().sendSocketMesage(discordRole); + Network.getInstance().getChat().sendSocketMessage(discordRole); if (announce && !remove) { sendPromotionChatMessage(name, role); @@ -285,14 +285,14 @@ private static void sendPromotionChatMessage(String name, Role role) { .append(PROMOTION_TEMPLATE) .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - Network.getInstance().getChat().sendSocketMesage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); + Network.getInstance().getChat().sendSocketMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); } private static void sendPromotionDirectMessage(String uuid, Role role) { Component message = PROMOTION_SELF .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - Network.getInstance().getChat().sendSocketMesage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid + Network.getInstance().getChat().sendSocketMessage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid , "server", message, true)); } } diff --git a/src/main/java/net/bteuk/network/utils/Statistics.java b/Plugin/src/main/java/net/bteuk/network/utils/Statistics.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Statistics.java rename to Plugin/src/main/java/net/bteuk/network/utils/Statistics.java diff --git a/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java similarity index 97% rename from src/main/java/net/bteuk/network/utils/SwitchServer.java rename to Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 8d6ed6b6..b7ed2ae9 100644 --- a/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -62,7 +62,7 @@ public static void switchServer(Player p, String server) { UserDisconnect userDisconnect = user.createDisconnectEvent(); SwitchServerEvent switchServerEvent = new SwitchServerEvent(p.getUniqueId().toString(), server, SERVER_NAME, userDisconnect); - Network.getInstance().getChat().sendSocketMesage(switchServerEvent); + Network.getInstance().getChat().sendSocketMessage(switchServerEvent); } public static void switchToExternalServer(Player player) { diff --git a/src/main/java/net/bteuk/network/utils/TextureUtils.java b/Plugin/src/main/java/net/bteuk/network/utils/TextureUtils.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/TextureUtils.java rename to Plugin/src/main/java/net/bteuk/network/utils/TextureUtils.java diff --git a/src/main/java/net/bteuk/network/utils/Time.java b/Plugin/src/main/java/net/bteuk/network/utils/Time.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Time.java rename to Plugin/src/main/java/net/bteuk/network/utils/Time.java diff --git a/src/main/java/net/bteuk/network/utils/Tips.java b/Plugin/src/main/java/net/bteuk/network/utils/Tips.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Tips.java rename to Plugin/src/main/java/net/bteuk/network/utils/Tips.java diff --git a/src/main/java/net/bteuk/network/utils/TpllFormat.java b/Plugin/src/main/java/net/bteuk/network/utils/TpllFormat.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/TpllFormat.java rename to Plugin/src/main/java/net/bteuk/network/utils/TpllFormat.java diff --git a/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java b/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java similarity index 90% rename from src/main/java/net/bteuk/network/utils/TutorialRecommendation.java rename to Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java index 7450b53a..c6b30bf2 100644 --- a/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java @@ -2,11 +2,6 @@ import net.bteuk.network.Network; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.logging.Level; -import java.util.logging.Logger; - /** * Represents a tutorial recommendation */ diff --git a/src/main/java/net/bteuk/network/utils/Utils.java b/Plugin/src/main/java/net/bteuk/network/utils/Utils.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/Utils.java rename to Plugin/src/main/java/net/bteuk/network/utils/Utils.java diff --git a/src/main/java/net/bteuk/network/utils/enums/AddLocationType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/AddLocationType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/AddLocationType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/AddLocationType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/Category.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/Category.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/Category.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/Category.java diff --git a/src/main/java/net/bteuk/network/utils/enums/LeaderboardType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/LeaderboardType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/LeaderboardType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/LeaderboardType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/ModerationType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/ModerationType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/ModerationType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/ModerationType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/PlotStatus.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java diff --git a/src/main/java/net/bteuk/network/utils/enums/PointsType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/PointsType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/PointsType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/PointsType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/RegionStatus.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java diff --git a/src/main/java/net/bteuk/network/utils/enums/RegionType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/RegionType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/RegionType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/ServerType.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/ServerType.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/ServerType.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/ServerType.java diff --git a/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java diff --git a/src/main/java/net/bteuk/network/utils/enums/TimesOfDay.java b/Plugin/src/main/java/net/bteuk/network/utils/enums/TimesOfDay.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/enums/TimesOfDay.java rename to Plugin/src/main/java/net/bteuk/network/utils/enums/TimesOfDay.java diff --git a/src/main/java/net/bteuk/network/utils/math/Line.java b/Plugin/src/main/java/net/bteuk/network/utils/math/Line.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/math/Line.java rename to Plugin/src/main/java/net/bteuk/network/utils/math/Line.java diff --git a/src/main/java/net/bteuk/network/utils/math/Point.java b/Plugin/src/main/java/net/bteuk/network/utils/math/Point.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/math/Point.java rename to Plugin/src/main/java/net/bteuk/network/utils/math/Point.java diff --git a/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java rename to Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java diff --git a/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java rename to Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java diff --git a/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java rename to Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java diff --git a/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java rename to Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java diff --git a/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java rename to Plugin/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java diff --git a/src/main/java/net/bteuk/network/utils/progression/Level.java b/Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/progression/Level.java rename to Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java diff --git a/src/main/java/net/bteuk/network/utils/progression/Progression.java b/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java similarity index 98% rename from src/main/java/net/bteuk/network/utils/progression/Progression.java rename to Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java index e877d22b..ce587726 100644 --- a/src/main/java/net/bteuk/network/utils/progression/Progression.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java @@ -92,7 +92,7 @@ private static void levelUp(String season, String uuid, int level, boolean annou // Announce level-up. ChatMessage chatMessage = new ChatMessage(ChatChannels.GLOBAL.getChannelName(), "server", globalMessage); - Network.getInstance().getChat().sendSocketMesage(chatMessage); + Network.getInstance().getChat().sendSocketMessage(chatMessage); } // Send a message to the player. diff --git a/src/main/java/net/bteuk/network/utils/regions/Inactivity.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/regions/Inactivity.java rename to Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java diff --git a/src/main/java/net/bteuk/network/utils/regions/Region.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java similarity index 97% rename from src/main/java/net/bteuk/network/utils/regions/Region.java rename to Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java index 6078c82a..c65fe5d6 100644 --- a/src/main/java/net/bteuk/network/utils/regions/Region.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java @@ -137,7 +137,7 @@ public void setPlot() { ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", getTag(uuid)), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); // Leave region in database. Network.getInstance().regionSQL.update("DELETE FROM region_members WHERE region='" + regionName + "' AND " + @@ -398,7 +398,7 @@ public void denyRequest(String uuid) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("Your request to join region %s has been denied.", regionName), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } // Cancel a request for a specific user. @@ -442,7 +442,7 @@ public void requestRegion(NetworkUser u, boolean staffRequest) { ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", ChatUtils.success("A region join request has been submitted by %s for region %s", u.player.getName(), regionName)); - Network.getInstance().getChat().sendSocketMesage(chatMessage); + Network.getInstance().getChat().sendSocketMessage(chatMessage); } else { // Owner request @@ -460,7 +460,7 @@ public void requestRegion(NetworkUser u, boolean staffRequest) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(), "server", ChatUtils.success("%s has requested to join region %s.", u.player.getName(), getTag(getOwner())), false); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } @@ -513,7 +513,7 @@ public void joinRegion(NetworkUser u) { ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(owner)), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); // Set region to default, since it would've been set to inactive previously. setDefault(); @@ -564,7 +564,7 @@ public void joinRegion(String uuid, int coordinateID) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("You have joined the region %s as a member.", regionName), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } else { // If the region is inactive, demote the previous owner to a member. @@ -589,7 +589,7 @@ public void joinRegion(String uuid, int coordinateID) { ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(owner)), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } // Join region as owner. @@ -608,7 +608,7 @@ public void joinRegion(String uuid, int coordinateID) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("You have joined the region %s as the owner.", regionName), true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } } @@ -623,7 +623,7 @@ public void leaveRegion(String uuid, Component message) { // Is sent before actual removal so we can read the region tag. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", message, true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); // Leave region in database. Network.getInstance().regionSQL.update("DELETE FROM region_members WHERE region='" + regionName + "' AND " + diff --git a/src/main/java/net/bteuk/network/utils/regions/RegionManager.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/regions/RegionManager.java rename to Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java diff --git a/src/main/java/net/bteuk/network/utils/regions/RegionMember.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionMember.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/regions/RegionMember.java rename to Plugin/src/main/java/net/bteuk/network/utils/regions/RegionMember.java diff --git a/src/main/java/net/bteuk/network/utils/regions/Request.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/Request.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/regions/Request.java rename to Plugin/src/main/java/net/bteuk/network/utils/regions/Request.java diff --git a/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java similarity index 98% rename from src/main/java/net/bteuk/network/utils/staff/Moderation.java rename to Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index 29241771..2eeacde3 100644 --- a/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -56,12 +56,12 @@ public static void mute(String uuid, long end_time, String reason) throws NotMut Component mutedComponent = getMutedComponent(uuid); ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.MUTE, null, uuid, end_time, mutedComponent); - Network.getInstance().getChat().sendSocketMesage(moderationEvent); + Network.getInstance().getChat().sendSocketMessage(moderationEvent); // Notify the user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", mutedComponent, true); - Network.getInstance().getChat().sendSocketMesage(directMessage); + Network.getInstance().getChat().sendSocketMessage(directMessage); } // Unban the player. @@ -81,7 +81,7 @@ public static void unmute(String uuid) { // Update Tab by sending a moderation event. ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.UNMUTE, null, uuid, 0L, null); - Network.getInstance().getChat().sendSocketMesage(moderationEvent); + Network.getInstance().getChat().sendSocketMessage(moderationEvent); } // Kick the player. diff --git a/src/main/java/net/bteuk/network/utils/texteditorbooks/BookCloseAction.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/BookCloseAction.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/texteditorbooks/BookCloseAction.java rename to Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/BookCloseAction.java diff --git a/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java rename to Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java diff --git a/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java similarity index 100% rename from src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java rename to Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java diff --git a/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to Plugin/src/main/resources/config.yml diff --git a/src/main/resources/paper-plugin.yml b/Plugin/src/main/resources/paper-plugin.yml similarity index 100% rename from src/main/resources/paper-plugin.yml rename to Plugin/src/main/resources/paper-plugin.yml diff --git a/src/main/resources/portals.yml b/Plugin/src/main/resources/portals.yml similarity index 100% rename from src/main/resources/portals.yml rename to Plugin/src/main/resources/portals.yml diff --git a/src/main/resources/roles.yml b/Plugin/src/main/resources/roles.yml similarity index 100% rename from src/main/resources/roles.yml rename to Plugin/src/main/resources/roles.yml diff --git a/src/main/resources/rules.yml b/Plugin/src/main/resources/rules.yml similarity index 100% rename from src/main/resources/rules.yml rename to Plugin/src/main/resources/rules.yml diff --git a/src/main/resources/tips-example.txt b/Plugin/src/main/resources/tips-example.txt similarity index 100% rename from src/main/resources/tips-example.txt rename to Plugin/src/main/resources/tips-example.txt diff --git a/src/test/java/net/bteuk/network/building_companion/BestFitRectangleTest.java b/Plugin/src/test/java/net/bteuk/network/building_companion/BestFitRectangleTest.java similarity index 100% rename from src/test/java/net/bteuk/network/building_companion/BestFitRectangleTest.java rename to Plugin/src/test/java/net/bteuk/network/building_companion/BestFitRectangleTest.java diff --git a/src/test/java/net/bteuk/network/utils/progression/LevelTest.java b/Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java similarity index 100% rename from src/test/java/net/bteuk/network/utils/progression/LevelTest.java rename to Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java diff --git a/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java b/Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java similarity index 100% rename from src/test/java/net/bteuk/network/utils/staff/ModerationTest.java rename to Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java diff --git a/pom.xml b/pom.xml index 550409e9..943498aa 100644 --- a/pom.xml +++ b/pom.xml @@ -6,260 +6,11 @@ net.bteuk Network 1.7.3 - jar + pom Network - - - 21 - UTF-8 - - 5.11.2 - 3.13.0 - 3.6.0 - 3.5.1 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compiler.version} - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven.shade.version} - - - package - - shade - - - true - - - *:* - - META-INF/** - AUTHORS - LICENSE - README.md - Log4j-events.dtd - Log4j-events.xsd - Log4j-config.xsd - Log4j-levels.xsd - Log4j-charsets.properties - mozilla/public-suffix-list.txt - - - - com.github.BTEUK:* - - net/kyori/** - com/google/** - net/daporkchop/lib/binary/** - org/** - com/fasterxml/jackson/** - io/netty/** - config.yml - javax/annotation/** - LZMA/** - net/buildtheearth/** - it/unimi/dsi/fastutil/** - net/daporkchop/lib/** - SCL.lombok/** - plugin.yml - lombok/** - changelog.txt - latestchanges.html - release-timestamp.txt - net/bteuk/teachingtutorials/services/** - - - - com.github.BTEUK:ProgressMapper - - me/bteuk/progressmapperbackend/** - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven.surefire.version} - - - org.junit.jupiter - junit-jupiter-engine - ${junit.version} - - - - - - - src/main/resources - true - - - - - - - papermc-repo - https://repo.papermc.io/repository/maven-public/ - - - sonatype - https://oss.sonatype.org/content/groups/public/ - - - jitpack.io - https://jitpack.io - - - sk89q-repo - https://maven.enginehub.org/repo/ - - - DaPorkchop_ - https://maven.daporkchop.net/ - - - OpenCollab Snapshots - https://repo.opencollab.dev/snapshot/ - - - dmulloy2-repo - https://repo.dmulloy2.net/repository/public/ - - - codemc-repo - https://repo.codemc.io/repository/maven-public/ - default - - - - - - - io.papermc.paper - paper-api - 1.21.1-R0.1-SNAPSHOT - provided - - - - - com.sk89q.worldguard - worldguard-bukkit - 7.0.12 - provided - - - com.comphenix.protocol - ProtocolLib - 5.3.0 - provided - - - com.github.decentsoftware-eu - decentholograms - 2.8.11 - provided - - - net.luckperms - api - 5.4 - provided - - - - - org.projectlombok - lombok - 1.18.34 - provided - - - io.papermc - paperlib - 1.0.7 - compile - - - org.apache.commons - commons-dbcp2 - 2.12.0 - - - org.apache.commons - commons-lang3 - 3.17.0 - - - commons-io - commons-io - 2.17.0 - - - com.github.BTEUK - terraminusminus - 41d3843a79 - - - com.fasterxml.jackson.core - jackson-databind - - - - - com.google.guava - guava - 33.3.1-jre - - - - - com.github.BTEUK - ProgressMapper - 231624865f - - - com.github.BTEUK - NetworkLib - a781b6371c - - - com.github.BTEUK - TeachingTutorials - 1.13.0 - - - com.github.BTEUK - TeachingTutorialsAPI - 970d3dc3f7 - provided - - - - - org.junit.jupiter - junit-jupiter - ${junit.version} - test - - + + Network-API + Plugin + From 277302c6ad28caa4153ac83c982222c31cd05baf Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 10 Aug 2025 17:50:51 +0200 Subject: [PATCH 02/96] Expanding api and started splitting off regions. --- Core/pom.xml | 36 + .../net/bteuk/network/core/Constants.java | 7 + .../java/net/bteuk/network/core/Location.java | 4 + .../net/bteuk/network/core}/ServerType.java | 2 +- .../java/net/bteuk/network/core}/Time.java | 2 +- .../net/bteuk/network/core}/math/Line.java | 2 +- .../net/bteuk/network/core}/math/Point.java | 18 +- .../bteuk/network/core}/sql/AbstractSQL.java | 66 +- .../bteuk/network/core/sql/DatabaseInit.java | 46 + Network-API/pom.xml | 4 +- .../net/bteuk/network/api/CoordinateAPI.java | 8 + .../java/net/bteuk/network/api/EventAPI.java | 54 ++ .../net/bteuk/network/api/NetworkAPI.java | 2 + .../java/net/bteuk/network/api/PlotAPI.java | 83 ++ .../java/net/bteuk/network/api/SQLAPI.java | 13 + .../net/bteuk/network/api/WorldGuardAPI.java | 14 + .../network/api/entity/NetworkLocation.java | 4 + PaperCore/pom.xml | 30 + .../network/papercore/LocationAdapter.java | 11 + Plugin/pom.xml | 52 +- .../main/java/net/bteuk/network/Network.java | 100 ++- .../main/java/net/bteuk/network/Timers.java | 10 +- .../network/api/impl/CoordinateAPIImpl.java | 24 + .../bteuk/network/api/impl/PlotAPIImpl.java | 184 ++++ .../building_companion/BestFitRectangle.java | 4 +- .../building_companion/TpllListener.java | 1 - .../network/commands/navigation/Back.java | 22 +- .../network/eventing/events/EventManager.java | 96 ++- .../tutorials/RecommendedTutorialsGui.java | 1 - .../logging/BukkitForwardingHandler.java | 40 + .../net/bteuk/network/sql/DatabaseInit.java | 38 - .../java/net/bteuk/network/sql/GlobalSQL.java | 37 +- .../java/net/bteuk/network/sql/PlotSQL.java | 17 +- .../java/net/bteuk/network/sql/RegionSQL.java | 101 --- .../java/net/bteuk/network/utils/Blocks.java | 2 +- .../net/bteuk/network/utils/Constants.java | 126 --- .../bteuk/network/utils/NetworkConfig.java | 80 +- .../network/utils/regions/Inactivity.java | 13 - .../bteuk/network/utils/regions/Region.java | 759 ----------------- .../network/utils/regions/RegionManager.java | 71 -- .../network/utils/worldguard/WorldGuard.java | 161 ++-- .../utils/worldguard/WorldguardManager.java | 8 +- .../utils/worldguard/WorldguardMembers.java | 4 +- .../worldguard/WorldguardPlotsystem.java | 6 +- .../utils/worldguard/WorldguardRegions.java | 2 +- .../utils/worldguard/WorldguardUtils.java | 2 +- Regions/pom.xml | 35 + .../net/bteuk/network/regions/Inactivity.java | 4 + .../net/bteuk/network/regions/Region.java | 29 + .../bteuk/network/regions/RegionManager.java | 802 ++++++++++++++++++ .../bteuk/network}/regions/RegionMember.java | 2 +- .../bteuk/network/regions}/RegionStatus.java | 2 +- .../bteuk/network/regions}/RegionType.java | 2 +- .../net/bteuk/network}/regions/Request.java | 2 +- .../bteuk/network/regions/sql/RegionSQL.java | 84 ++ pom.xml | 78 ++ 56 files changed, 2005 insertions(+), 1402 deletions(-) create mode 100644 Core/pom.xml create mode 100644 Core/src/main/java/net/bteuk/network/core/Constants.java create mode 100644 Core/src/main/java/net/bteuk/network/core/Location.java rename {Plugin/src/main/java/net/bteuk/network/utils/enums => Core/src/main/java/net/bteuk/network/core}/ServerType.java (65%) rename {Plugin/src/main/java/net/bteuk/network/utils => Core/src/main/java/net/bteuk/network/core}/Time.java (98%) rename {Plugin/src/main/java/net/bteuk/network/utils => Core/src/main/java/net/bteuk/network/core}/math/Line.java (97%) rename {Plugin/src/main/java/net/bteuk/network/utils => Core/src/main/java/net/bteuk/network/core}/math/Point.java (64%) rename {Plugin/src/main/java/net/bteuk/network => Core/src/main/java/net/bteuk/network/core}/sql/AbstractSQL.java (63%) create mode 100644 Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/EventAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/WorldGuardAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/entity/NetworkLocation.java create mode 100644 PaperCore/pom.xml create mode 100644 PaperCore/src/main/java/net/bteuk/network/papercore/LocationAdapter.java create mode 100644 Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java create mode 100644 Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java create mode 100644 Plugin/src/main/java/net/bteuk/network/logging/BukkitForwardingHandler.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/utils/Constants.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java create mode 100644 Regions/pom.xml create mode 100644 Regions/src/main/java/net/bteuk/network/regions/Inactivity.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/Region.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/RegionManager.java rename {Plugin/src/main/java/net/bteuk/network/utils => Regions/src/main/java/net/bteuk/network}/regions/RegionMember.java (89%) rename {Plugin/src/main/java/net/bteuk/network/utils/enums => Regions/src/main/java/net/bteuk/network/regions}/RegionStatus.java (87%) rename {Plugin/src/main/java/net/bteuk/network/utils/enums => Regions/src/main/java/net/bteuk/network/regions}/RegionType.java (82%) rename {Plugin/src/main/java/net/bteuk/network/utils => Regions/src/main/java/net/bteuk/network}/regions/Request.java (83%) create mode 100644 Regions/src/main/java/net/bteuk/network/regions/sql/RegionSQL.java diff --git a/Core/pom.xml b/Core/pom.xml new file mode 100644 index 00000000..692e378b --- /dev/null +++ b/Core/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + net.bteuk + Network + 1.7.3 + + + net.bteuk.network + core + + + + net.bteuk.network + api + ${project.version} + + + + com.zaxxer + HikariCP + 5.1.0 + + + + com.mysql + mysql-connector-j + 8.4.0 + + + + + \ No newline at end of file diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java new file mode 100644 index 00000000..cd598c80 --- /dev/null +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -0,0 +1,7 @@ +package net.bteuk.network.core; + +import java.util.List; + +public record Constants(String serverName, ServerType serverType, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, int maxY, int minY, String earthWorld, boolean customMessages, + boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, + boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent) { } diff --git a/Core/src/main/java/net/bteuk/network/core/Location.java b/Core/src/main/java/net/bteuk/network/core/Location.java new file mode 100644 index 00000000..7cc2c86f --- /dev/null +++ b/Core/src/main/java/net/bteuk/network/core/Location.java @@ -0,0 +1,4 @@ +package net.bteuk.network.core; + +public record Location() { +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/enums/ServerType.java b/Core/src/main/java/net/bteuk/network/core/ServerType.java similarity index 65% rename from Plugin/src/main/java/net/bteuk/network/utils/enums/ServerType.java rename to Core/src/main/java/net/bteuk/network/core/ServerType.java index b343812c..26f985ca 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/enums/ServerType.java +++ b/Core/src/main/java/net/bteuk/network/core/ServerType.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.enums; +package net.bteuk.network.core; public enum ServerType { LOBBY, diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Time.java b/Core/src/main/java/net/bteuk/network/core/Time.java similarity index 98% rename from Plugin/src/main/java/net/bteuk/network/utils/Time.java rename to Core/src/main/java/net/bteuk/network/core/Time.java index cbe72014..6ba065f2 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Time.java +++ b/Core/src/main/java/net/bteuk/network/core/Time.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils; +package net.bteuk.network.core; import java.sql.Date; import java.text.SimpleDateFormat; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/math/Line.java b/Core/src/main/java/net/bteuk/network/core/math/Line.java similarity index 97% rename from Plugin/src/main/java/net/bteuk/network/utils/math/Line.java rename to Core/src/main/java/net/bteuk/network/core/math/Line.java index e80636ad..9c7c0204 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/math/Line.java +++ b/Core/src/main/java/net/bteuk/network/core/math/Line.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.math; +package net.bteuk.network.core.math; import lombok.Getter; import lombok.Setter; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/math/Point.java b/Core/src/main/java/net/bteuk/network/core/math/Point.java similarity index 64% rename from Plugin/src/main/java/net/bteuk/network/utils/math/Point.java rename to Core/src/main/java/net/bteuk/network/core/math/Point.java index aedbfc29..0bab0776 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/math/Point.java +++ b/Core/src/main/java/net/bteuk/network/core/math/Point.java @@ -1,6 +1,4 @@ -package net.bteuk.network.utils.math; - -import com.sk89q.worldedit.math.BlockVector2; +package net.bteuk.network.core.math; import java.util.List; @@ -9,21 +7,21 @@ public class Point { /** * Get the average point from a list of 2d points. * - * @param points list of {@link BlockVector2} - * @return the average point as {@link BlockVector2} + * @param points list of points + * @return the average point */ - public static BlockVector2 getAveragePoint(List points) { + public static double[] getAveragePoint(List points) { double size = points.size(); double x = 0; double z = 0; - for (BlockVector2 bv : points) { - x += bv.getX() / size; - z += bv.getZ() / size; + for (double[] point : points) { + x += point[0] / size; + z += point[1] / size; } - return (BlockVector2.at(x, z)); + return new double[]{x, z}; } /** diff --git a/Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java b/Core/src/main/java/net/bteuk/network/core/sql/AbstractSQL.java similarity index 63% rename from Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java rename to Core/src/main/java/net/bteuk/network/core/sql/AbstractSQL.java index d1f64930..ea0a6cfa 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/AbstractSQL.java +++ b/Core/src/main/java/net/bteuk/network/core/sql/AbstractSQL.java @@ -1,8 +1,9 @@ -package net.bteuk.network.sql; +package net.bteuk.network.core.sql; +import lombok.extern.java.Log; import net.bteuk.network.api.SQLAPI; -import org.apache.commons.dbcp2.BasicDataSource; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -11,27 +12,23 @@ import java.util.HashMap; import java.util.LinkedHashMap; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public abstract class AbstractSQL implements SQLAPI { - private final BasicDataSource dataSource; - - public AbstractSQL(BasicDataSource datasource) { + private final DataSource dataSource; + public AbstractSQL(DataSource datasource) { this.dataSource = datasource; } - Connection conn() throws SQLException { + protected Connection conn() throws SQLException { return dataSource.getConnection(); } public boolean hasRow(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { return results.next(); @@ -45,8 +42,7 @@ public boolean hasRow(String sql) { public boolean update(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql) + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql) ) { statement.executeUpdate(); @@ -61,9 +57,7 @@ public boolean update(String sql) { public boolean getBoolean(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -82,9 +76,7 @@ public boolean getBoolean(String sql) { public int getInt(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -103,9 +95,7 @@ public int getInt(String sql) { public double getDouble(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -124,9 +114,7 @@ public double getDouble(String sql) { public float getFloat(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -145,9 +133,7 @@ public float getFloat(String sql) { public long getLong(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -166,9 +152,7 @@ public long getLong(String sql) { public String getString(String sql) { try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { if (results.next()) { @@ -189,9 +173,7 @@ public ArrayList getStringList(String sql) { ArrayList list = new ArrayList<>(); try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { while (results.next()) { @@ -211,9 +193,7 @@ public ArrayList getIntList(String sql) { ArrayList list = new ArrayList<>(); try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { while (results.next()) { @@ -233,15 +213,13 @@ public HashMap getIntStringMap(String sql) { HashMap map = new HashMap<>(); try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { while (results.next()) { map.put(results.getInt(1), results.getString(2)); } } catch (SQLException e) { - LOGGER.severe("An invalid sql query was attempted, " + sql); + log.severe("An invalid sql query was attempted, " + sql); } return map; } @@ -251,15 +229,13 @@ public HashMap getStringIntMap(String sql) { HashMap map = new LinkedHashMap<>(); try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() ) { while (results.next()) { map.put(results.getString(1), results.getInt(2)); } } catch (SQLException e) { - LOGGER.severe("An invalid sql query was attempted, " + sql); + log.severe("An invalid sql query was attempted, " + sql); } return map; } diff --git a/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java b/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java new file mode 100644 index 00000000..64df4bb6 --- /dev/null +++ b/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java @@ -0,0 +1,46 @@ +package net.bteuk.network.core.sql; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Properties; + +public class DatabaseInit { + + // Creates the mysql connection. + public DataSource mysqlSetup(String database, String host, int port, String username, String password) throws SQLException { + + HikariConfig cfg = new HikariConfig(); + + cfg.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + database + + "?rewriteBatchedStatements=true" + + "&allowPublicKeyRetrieval=true" + + "&useSSL=false" + + "&cachePrepStmts=true" + + "&prepStmtCacheSize=256" + + "&prepStmtCacheSqlLimit=2048" + + "&connectTimeout=10000" + + "&socketTimeout=30000" + + "&connectionTimeZone=UTC"); + + cfg.setUsername(username); + cfg.setPassword(password); + + cfg.setMaximumPoolSize(20); + cfg.setMinimumIdle(2); + cfg.setConnectionTimeout(15000); + cfg.setIdleTimeout(300000); + cfg.setMaxLifetime(1800000); + cfg.setKeepaliveTime(300000); + cfg.setPoolName("NetworkHikariPool"); + + Properties dsProps = new Properties(); + dsProps.setProperty("useUnicode", "true"); + dsProps.setProperty("characterEncoding", "utf8"); + cfg.setDataSourceProperties(dsProps); + + return new HikariDataSource(cfg); + } +} diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 808b69ce..f0a4dd2c 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -13,7 +13,7 @@ api Network API API for the Network plugin - 1.0.0 + 1.7.3 @@ -26,7 +26,7 @@ com.github.BTEUK NetworkLib - main-SNAPSHOT + a781b6371c diff --git a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java new file mode 100644 index 00000000..28300e04 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java @@ -0,0 +1,8 @@ +package net.bteuk.network.api; + +import net.bteuk.network.api.entity.NetworkLocation; + +public interface CoordinateAPI { + + int addCoordinate(NetworkLocation location); +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java new file mode 100644 index 00000000..3d7fac9f --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java @@ -0,0 +1,54 @@ +package net.bteuk.network.api; + +import net.bteuk.network.api.entity.NetworkLocation; +import net.kyori.adventure.text.Component; + +public interface EventAPI { + + void createJoinEvent(String uuid, String type, String event); + + void createJoinEvent(String uuid, String type, String event, String message); + + void createJoinEvent(String uuid, String type, String event, Component message); + + /** + * Creates an event with the following input parameters: + * + * @param uuid the uuid of the player to which the event should apply + * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a + * custom implementation) + * @param server the server name where the event should occur + * @param event the event arguments in String format + */ + void createEvent(String uuid, String type, String server, String event); + + /** + * Creates an event with the following input parameters: + * + * @param uuid the uuid of the player to which the event should apply + * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a + * custom implementation) + * @param server the server name where the event should occur + * @param event the event arguments in String format + * @param message message to be sent to the player on success + */ + void createEvent(String uuid, String type, String server, String event, String message); + + /** + * Creates an event with the following input parameters: + * + * @param uuid the uuid of the player to which the event should apply + * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a + * custom implementation) + * @param server the server name where the event should occur + * @param event the event arguments in String format + * @param message message to be sent to the player on success + */ + void createEvent(String uuid, String type, String server, String event, Component message); + + void createTeleportEvent(boolean join, String uuid, String type, String event, NetworkLocation previousLocation); + + void createTeleportEvent(boolean join, String uuid, String type, String event, String message, NetworkLocation previousLocation); + + void createTeleportEvent(boolean join, String uuid, String type, String event, Component message, NetworkLocation previousLocation); +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 0b596e56..46829a77 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -4,6 +4,8 @@ public interface NetworkAPI { ChatAPI getChat(); + PlotAPI getPlotAPI(); + SQLAPI getGlobalSQL(); SQLAPI getPlotSQL(); diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java new file mode 100644 index 00000000..8b44872c --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -0,0 +1,83 @@ +package net.bteuk.network.api; + +import java.util.List; + +public interface PlotAPI { + + /** + * Reverts plot submissions for the server. + * - Reverts plots with status under review to status submitted. + * - Reverts plots with status under verification to status awaiting verification. + * + * @param serverName the name of the server + */ + void resetPlotSubmissions(String serverName); + + /** + * Returns a list of active plots for the server. + * + * @param serverName the name of the server + * @return a list of active plots by id + */ + List getActivePlots(String serverName); + + boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform); + + boolean createPlotRegion(String regionName, String server, String locationName); + + boolean setLocationAlias(String locationName, String alias); + + boolean setPlotDifficulty(int plotId, int difficulty); + + boolean clearZoneMembers(int zoneId); + + boolean setPlotStatus(int plotId, String status); + + boolean setZoneStatus(int zoneId, String status); + + boolean clearPlotMembers(int plotId); + + boolean setPlotSubmissionStatus(int plotId, String status); + + boolean removePlotSubmission(int plotId); + + boolean createPlotMember(int plotId, String uuid); + + boolean removePlotMember(int plotId, String uuid); + + boolean createZoneOwner(int zoneId, String uuid); + + boolean createZoneMember(int zoneId, String uuid); + + boolean removeZoneMember(int zoneId, String uuid); + + boolean setPlotLastEnter(int plotId, String uuid); + + boolean savePlotReviewCategoryFeedback(int reviewId, String category, String selection, int bookId); + + boolean saveBook(int bookId, int page, String content); + + boolean setPlotInactivityNotice(int plotId, String uuid); + + boolean createPlotCorner(int plotId, int cornerIndex, int x, int z); + + boolean createZoneCorner(int zoneId, int cornerIndex, int x, int z); + + int createPlot(int size, int difficulty, String locationName, int coordinateId); + + int createZone(String locationName, long expiration, boolean isPublic); + + int[][] getPlotCorners(int plotId); + + double getReviewerReputation(String uuid); + + boolean canReviewPlot(int plotId, String uuid, boolean isArchitect, boolean isReviewer); + + boolean canVerifyPlot(int plotId, String uuid, boolean isReviewer); + + int createReview(int plotId, String plotOwner, String reviewer, boolean accepted, boolean completed); + + int createVerification(int reviewId, String verifier, boolean acceptedOld, boolean acceptedNew); + + boolean savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookIdOld, int bookIdNew); +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java index 32c03c83..9f7c9707 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java @@ -1,4 +1,17 @@ package net.bteuk.network.api; +import java.util.List; + public interface SQLAPI { + + boolean hasRow(String sql); + + int getInt(String sql); + + String getString(String sql); + + List getStringList(String sql); + + List getIntList(String sql); + } diff --git a/Network-API/src/main/java/net/bteuk/network/api/WorldGuardAPI.java b/Network-API/src/main/java/net/bteuk/network/api/WorldGuardAPI.java new file mode 100644 index 00000000..baf6ec9a --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/WorldGuardAPI.java @@ -0,0 +1,14 @@ +package net.bteuk.network.api; + +public interface WorldGuardAPI { + + boolean addMember(String regionName, String uuid, String world); + + boolean removeMember(String regionName, String uuid, String world); + + boolean addGroup(String regionName, String groupName, String world); + + boolean removeGroup(String regionName, String groupName, String world); + + boolean createRegion(String regionName, int xMin, int zMin, int xMax, int zMax, String world); +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkLocation.java b/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkLocation.java new file mode 100644 index 00000000..2a7275a2 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkLocation.java @@ -0,0 +1,4 @@ +package net.bteuk.network.api.entity; + +public record NetworkLocation(String world, double x, double y, double z, float yaw, float pitch) { +} diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml new file mode 100644 index 00000000..e397060a --- /dev/null +++ b/PaperCore/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + net.bteuk + Network + 1.7.3 + + + net.bteuk.network + papercore + + + + + net.bteuk.network + api + ${project.version} + + + + io.papermc.paper + paper-api + 1.21.1-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/PaperCore/src/main/java/net/bteuk/network/papercore/LocationAdapter.java b/PaperCore/src/main/java/net/bteuk/network/papercore/LocationAdapter.java new file mode 100644 index 00000000..bcc77303 --- /dev/null +++ b/PaperCore/src/main/java/net/bteuk/network/papercore/LocationAdapter.java @@ -0,0 +1,11 @@ +package net.bteuk.network.papercore; + +import net.bteuk.network.api.entity.NetworkLocation; +import org.bukkit.Location; + +public class LocationAdapter { + + public static NetworkLocation adapt(Location location) { + return new NetworkLocation(location.getWorld().getName(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } +} diff --git a/Plugin/pom.xml b/Plugin/pom.xml index b3dcabc2..b25e1711 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -15,7 +15,6 @@ Minecraft plugin for the BTEUK Network - 21 UTF-8 5.11.2 @@ -119,55 +118,25 @@ - - - papermc-repo - https://repo.papermc.io/repository/maven-public/ - - - sonatype - https://oss.sonatype.org/content/groups/public/ - - - jitpack.io - https://jitpack.io - - - sk89q-repo - https://maven.enginehub.org/repo/ - - - DaPorkchop_ - https://maven.daporkchop.net/ - - - OpenCollab Snapshots - https://repo.opencollab.dev/snapshot/ - - - dmulloy2-repo - https://repo.dmulloy2.net/repository/public/ - - - codemc-repo - https://repo.codemc.io/repository/maven-public/ - default - - - net.bteuk.network api - 1.0.0 + + + net.bteuk.network + core + + + net.bteuk.network + regions io.papermc.paper paper-api - 1.21.1-R0.1-SNAPSHOT provided @@ -210,11 +179,6 @@ 1.0.7 compile - - org.apache.commons - commons-dbcp2 - 2.12.0 - org.apache.commons commons-lang3 diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 211c5a95..b80b64dd 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -1,13 +1,24 @@ package net.bteuk.network; import lombok.Getter; +import lombok.extern.java.Log; +import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.NetworkAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.WorldGuardAPI; +import net.bteuk.network.api.impl.CoordinateAPIImpl; +import net.bteuk.network.api.impl.PlotAPIImpl; import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.commands.staff.Ban; import net.bteuk.network.commands.staff.Kick; import net.bteuk.network.commands.staff.Mute; import net.bteuk.network.commands.staff.Unban; import net.bteuk.network.commands.staff.Unmute; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; +import net.bteuk.network.core.Time; +import net.bteuk.network.core.sql.DatabaseInit; +import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.eventing.listeners.CommandPreProcess; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.eventing.listeners.GuiListener; @@ -22,21 +33,19 @@ import net.bteuk.network.lib.dto.OnlineUsersReply; import net.bteuk.network.lib.dto.ServerStartup; import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.logging.BukkitForwardingHandler; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; -import net.bteuk.network.sql.DatabaseInit; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.sql.RegionSQL; import net.bteuk.network.utils.NetworkConfig; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Time; import net.bteuk.network.utils.Tips; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.regions.RegionManager; +import net.bteuk.network.utils.worldguard.WorldGuard; import net.bteuk.teachingtutorials.services.PromotionService; import net.buildtheearth.terraminusminus.TerraConfig; -import org.apache.commons.dbcp2.BasicDataSource; import org.bukkit.Material; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.configuration.serialization.ConfigurationSerialization; @@ -46,20 +55,18 @@ import org.bukkit.plugin.java.JavaPlugin; import teachingtutorials.utils.DBConnection; +import javax.sql.DataSource; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.Optional; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.Constants.TIPS; -import static net.bteuk.network.utils.Constants.TPLL_ENABLED; -import static net.bteuk.network.utils.Constants.TUTORIALS; import static net.bteuk.network.utils.NetworkConfig.CONFIG; +@Log public final class Network extends JavaPlugin implements NetworkAPI { // Returns an instance of the plugin. @@ -134,9 +141,32 @@ public final class Network extends JavaPlugin implements NetworkAPI { @Getter private DBConnection tutorialsDBConnection; + @Getter + private PlotAPI plotAPI; + + private CoordinateAPI coordinateAPI; + + private EventManager eventManager; + + private WorldGuardAPI worldGuardAPI; + + private Constants constants; + @Override public void onEnable() { + // Setup the logger. + Logger base = Logger.getLogger("net.bteuk.network"); + base.setLevel(Level.ALL); + base.setUseParentHandlers(false); + + // Make sure we don’t accumulate multiple handlers across reloads + for (Handler h : base.getHandlers()) { + base.removeHandler(h); + } + + base.addHandler(new BukkitForwardingHandler(getLogger())); + // Config Setup Network.instance = this; @@ -161,24 +191,29 @@ public void onEnable() { return; } + constants = networkConfig.getConstants(); + // Setup MySQL try { - DatabaseInit init = new DatabaseInit(); + String host = CONFIG.getString("host"); + int port = CONFIG.getInt("port"); + String username = CONFIG.getString("username"); + String password = CONFIG.getString("password"); // Global Database String global_database = CONFIG.getString("database.global"); - BasicDataSource global_dataSource = init.mysqlSetup(global_database); + DataSource global_dataSource = init.mysqlSetup(global_database, host, port, username, password); globalSQL = new GlobalSQL(global_dataSource); // Region Database String region_database = CONFIG.getString("database.region"); - BasicDataSource region_dataSource = init.mysqlSetup(region_database); + DataSource region_dataSource = init.mysqlSetup(region_database, host, port, username, password); regionSQL = new RegionSQL(region_dataSource); // Plot Database String plot_database = CONFIG.getString("database.plot"); - BasicDataSource plot_dataSource = init.mysqlSetup(plot_database); + DataSource plot_dataSource = init.mysqlSetup(plot_database, host, port, username, password); plotSQL = new PlotSQL(plot_dataSource); } catch (SQLException | RuntimeException e) { getLogger().severe("Failed to connect to the database, please check that you have set the config values " + @@ -188,7 +223,7 @@ public void onEnable() { } // Setup tutorials DB connection and connect - if (TUTORIALS) { + if (constants.tutorials()) { // Initialise the DBConnection object tutorialsDBConnection = new DBConnection(); @@ -211,15 +246,15 @@ public void onEnable() { } } - if (!globalSQL.hasRow("SELECT name FROM server_data WHERE name='" + SERVER_NAME + "';")) { + if (!globalSQL.hasRow("SELECT name FROM server_data WHERE name='" + constants.serverName() + "';")) { // Add server to database and enable server. if (globalSQL.update( - "INSERT INTO server_data(name,type) VALUES('" + SERVER_NAME + "','" + SERVER_TYPE + "');" + "INSERT INTO server_data(name,type) VALUES('" + constants.serverName() + "','" + constants.serverType() + "');" )) { // Enable plugin. - getLogger().info("Server added to database with name " + SERVER_NAME + " and type " + SERVER_TYPE); + getLogger().info("Server added to database with name " + constants.serverName() + " and type " + constants.serverType()); getLogger().info("Enabling Plugin"); enablePlugin(); } else { @@ -242,6 +277,11 @@ public void enablePlugin() { networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); + plotAPI = new PlotAPIImpl(plotSQL); + coordinateAPI = new CoordinateAPIImpl(globalSQL); + eventManager = new EventManager(globalSQL); + worldGuardAPI = new WorldGuard(); + // Enable tab. tab = new TabManager(this); @@ -263,22 +303,22 @@ public void enablePlugin() { new PlayerInteract(this); // Create regionManager if enabled. - if (REGIONS_ENABLED) { - regionManager = new RegionManager(regionSQL); + if (constants.regionsEnabled()) { + regionManager = new RegionManager(regionSQL, globalSQL, plotSQL, chat, coordinateAPI, eventManager, worldGuardAPI, constants); } moveListener = new MoveListener(this); teleportListener = new TeleportListener(this); // Setup Timers - timers = new Timers(this, globalSQL); + timers = new Timers(this, globalSQL, eventManager); timers.startTimers(); // Setup the lobby, most features are only enabled in the lobby server. lobby = new Lobby(this); // Create the rules book. lobby.loadRules(); - if (SERVER_TYPE == ServerType.LOBBY) { + if (constants.serverType() == ServerType.LOBBY) { // Set spawn location and enable auto-spawn teleport when falling in the void. lobby.setSpawn(); @@ -294,7 +334,7 @@ public void enablePlugin() { lobby.reloadMap(); // Enable commands - if (TPLL_ENABLED) { + if (constants.tpllEnabled()) { TerraConfig.reducedConsoleMessages = true; tpll = new Tpll(instance, CONFIG.getBoolean("requires_permission")); } @@ -309,7 +349,7 @@ public void enablePlugin() { new CommandPreProcess(this); // Enable tips. - if (TIPS) { + if (constants.tips()) { // Enable tips in chat. new Tips(); } @@ -325,13 +365,13 @@ public void enablePlugin() { PromotionService promotionService = new NetworkPromotionService(); this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, ServicePriority.High); - LOGGER.info("Registered Network Promotion Service"); + log.info("Registered Network Promotion Service"); } catch (ClassNotFoundException e) { // Only load the PromotionService if the class exists. } // Let the Proxy know that the server is enabled. - instance.getChat().sendSocketMessage(new ServerStartup(SERVER_NAME)); + instance.getChat().sendSocketMessage(new ServerStartup(constants.serverName())); // Register the API as a service. getServer().getServicesManager().register(NetworkAPI.class, this, this, ServicePriority.Normal); @@ -382,7 +422,7 @@ public void onDisable() { } // Disconnect from tutorials - if (TUTORIALS) { + if (constants.tutorials() && tutorialsDBConnection != null) { tutorialsDBConnection.disconnect(); } } diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 34a40278..6c4324dc 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -1,11 +1,10 @@ package net.bteuk.network; -import lombok.Getter; +import net.bteuk.network.core.Time; import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.regions.Inactivity; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Time; -import net.bteuk.network.utils.regions.Inactivity; import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; @@ -32,7 +31,6 @@ public class Timers { // Afk time private final long afk; // Event manager - @Getter private final EventManager eventManager; // Server events private ArrayList events; @@ -42,7 +40,7 @@ public class Timers { private ArrayList inactive_owners; private String uuid; - public Timers(Network instance, GlobalSQL globalSQL) { + public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager) { this.instance = instance; this.users = instance.getUsers(); @@ -51,7 +49,7 @@ public Timers(Network instance, GlobalSQL globalSQL) { this.timers = new ArrayList<>(); - eventManager = new EventManager(); + this.eventManager = eventManager; events = new ArrayList<>(); // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java new file mode 100644 index 00000000..ca9b3faf --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java @@ -0,0 +1,24 @@ +package net.bteuk.network.api.impl; + +import net.bteuk.network.api.CoordinateAPI; +import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.sql.GlobalSQL; + +public class CoordinateAPIImpl implements CoordinateAPI { + + private final GlobalSQL globalSQL; + + public CoordinateAPIImpl(GlobalSQL globalSQL) { + this.globalSQL = globalSQL; + } + + /** + * Add a coordinate to the database and return its id. + * @param location the location to create a coordinate of + * @return the coordinate id + */ + @Override + public int addCoordinate(NetworkLocation location) { + return globalSQL.addCoordinate(location); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java new file mode 100644 index 00000000..59909607 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -0,0 +1,184 @@ +package net.bteuk.network.api.impl; + +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.sql.PlotSQL; + +import java.util.List; + +public class PlotAPIImpl implements PlotAPI { + + private final PlotSQL plotSQL; + + public PlotAPIImpl(PlotSQL plotSQL) { + this.plotSQL = plotSQL; + } + + @Override + public void resetPlotSubmissions(String serverName) { + plotSQL.update( + "UPDATE plot_submission AS ps INNER JOIN plot_data AS pd ON ps.plot_id=pd.id SET ps.status='submitted' WHERE ps.status='under review' AND pd.location IN (SELECT " + + "name FROM location_data WHERE server='" + serverName + "');"); + plotSQL.update( + "UPDATE plot_submission AS ps INNER JOIN plot_data AS pd ON ps.plot_id=pd.id SET ps.status='awaiting verification' WHERE ps.status='under verification' AND pd" + + ".location IN (SELECT name FROM location_data WHERE server='" + serverName + "');"); + } + + @Override + public List getActivePlots(String serverName) { + return plotSQL.getIntList( + "SELECT pd.id FROM plot_data AS pd INNER JOIN location_data AS ld ON ld.name=pd.location WHERE pd.status IN ('unclaimed','claimed','submitted') AND " + "ld" + + ".server='" + serverName + "';"); + } + + @Override + public boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform) { + + + return false; + } + + @Override + public boolean createPlotRegion(String regionName, String server, String locationName) { + return false; + } + + @Override + public boolean setLocationAlias(String locationName, String alias) { + return false; + } + + @Override + public boolean setPlotDifficulty(int plotId, int difficulty) { + return false; + } + + @Override + public boolean clearZoneMembers(int zoneId) { + return false; + } + + @Override + public boolean setPlotStatus(int plotId, String status) { + return false; + } + + @Override + public boolean setZoneStatus(int zoneId, String status) { + return false; + } + + @Override + public boolean clearPlotMembers(int plotId) { + return false; + } + + @Override + public boolean setPlotSubmissionStatus(int plotId, String status) { + return false; + } + + @Override + public boolean removePlotSubmission(int plotId) { + return false; + } + + @Override + public boolean createPlotMember(int plotId, String uuid) { + return false; + } + + @Override + public boolean removePlotMember(int plotId, String uuid) { + return false; + } + + @Override + public boolean createZoneOwner(int zoneId, String uuid) { + return false; + } + + @Override + public boolean createZoneMember(int zoneId, String uuid) { + return false; + } + + @Override + public boolean removeZoneMember(int zoneId, String uuid) { + return false; + } + + @Override + public boolean setPlotLastEnter(int plotId, String uuid) { + return false; + } + + @Override + public boolean savePlotReviewCategoryFeedback(int reviewId, String category, String selection, int bookId) { + return plotSQL.savePlotReviewCategoryFeedback(reviewId, category, selection, bookId); + } + + @Override + public boolean saveBook(int bookId, int page, String content) { + return plotSQL.saveBook(bookId, page, content); + } + + @Override + public boolean setPlotInactivityNotice(int plotId, String uuid) { + return false; + } + + @Override + public boolean createPlotCorner(int plotId, int cornerIndex, int x, int z) { + return false; + } + + @Override + public boolean createZoneCorner(int zoneId, int cornerIndex, int x, int z) { + return false; + } + + @Override + public int createPlot(int size, int difficulty, String locationName, int coordinateId) { + return plotSQL.createPlot(size, difficulty, locationName, coordinateId); + } + + @Override + public int createZone(String locationName, long expiration, boolean isPublic) { + return plotSQL.createZone(locationName, expiration, isPublic); + } + + @Override + public int[][] getPlotCorners(int plotId) { + return plotSQL.getPlotCorners(plotId); + } + + @Override + public double getReviewerReputation(String uuid) { + return plotSQL.getReviewerReputation(uuid); + } + + @Override + public boolean canReviewPlot(int plotId, String uuid, boolean isArchitect, boolean isReviewer) { + return plotSQL.canReviewPlot(plotId, uuid, isArchitect, isReviewer); + } + + @Override + public boolean canVerifyPlot(int plotId, String uuid, boolean isReviewer) { + return plotSQL.canVerifyPlot(plotId, uuid, isReviewer); + } + + @Override + public int createReview(int plotId, String plotOwner, String reviewer, boolean accepted, boolean completed) { + return plotSQL.createReview(plotId, plotOwner, reviewer, accepted, completed); + } + + @Override + public int createVerification(int reviewId, String verifier, boolean acceptedOld, boolean acceptedNew) { + return plotSQL.createVerification(reviewId, verifier, acceptedOld, acceptedNew); + } + + @Override + public boolean savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookIdOld, int bookIdNew) { + return plotSQL.savePlotVerificationCategory(verificationId, category, selectionOld, selectionNew, bookIdOld, bookIdNew); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java index 2fc6cf76..e4796aff 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/BestFitRectangle.java @@ -1,8 +1,8 @@ package net.bteuk.network.building_companion; import lombok.Getter; -import net.bteuk.network.utils.math.Line; -import net.bteuk.network.utils.math.Point; +import net.bteuk.network.core.math.Line; +import net.bteuk.network.core.math.Point; import java.util.Arrays; diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java index d5a9e7a4..d8c7a184 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.commands.navigation.Tpll; -import net.bteuk.network.utils.Constants; import net.bteuk.network.utils.TpllFormat; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java index eae1c50d..b8afde15 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java @@ -2,9 +2,11 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.SwitchServer; import org.bukkit.Location; @@ -17,15 +19,21 @@ public class Back extends AbstractCommand { + private EventAPI eventAPI; + + public Back(EventAPI eventAPI) { + this.eventAPI = eventAPI; + } + // Sets the location as the previous location in the database. - public static void setPreviousCoordinate(String uuid, Location l) { + public static void setPreviousCoordinate(String uuid, NetworkLocation location) { // Set previous location for /back. if (Network.getInstance().getGlobalSQL() .getInt("SELECT previous_coordinate FROM player_data WHERE uuid='" + uuid + "';") == 0) { // No coordinate exists, create new. - int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(l); + int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(location); // Set coordinate id in player data. Network.getInstance().getGlobalSQL() @@ -38,7 +46,7 @@ public static void setPreviousCoordinate(String uuid, Location l) { "player_data WHERE uuid='" + uuid + "';"); // Update existing coordinate. - Network.getInstance().getGlobalSQL().updateCoordinate(coordinateID, l); + Network.getInstance().getGlobalSQL().updateCoordinate(coordinateID, location); } } @@ -72,7 +80,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { Location l = Network.getInstance().getGlobalSQL().getLocation(coordinateID); // Set current location to previous location. - setPreviousCoordinate(player.getUniqueId().toString(), player.getLocation()); + setPreviousCoordinate(player.getUniqueId().toString(), LocationAdapter.adapt(player.getLocation())); // Teleport player to the coordinate. player.teleport(l); @@ -83,14 +91,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); // Create teleport event for location of coordinate id - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + globalSQL.getString("SELECT world FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble("SELECT x FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble("SELECT y FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble("SELECT z FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getFloat("SELECT yaw FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getFloat("SELECT pitch FROM coordinates WHERE id=" + coordinateID + ";"), - "&aTeleport to previous location.", player.getLocation()); + "&aTeleport to previous location.", LocationAdapter.adapt(player.getLocation())); // Switch server. SwitchServer.switchServer(player, server); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index 954621b1..d2885efc 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -1,23 +1,39 @@ package net.bteuk.network.eventing.events; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.navigation.Back; -import org.bukkit.Location; +import net.bteuk.network.sql.GlobalSQL; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import static net.bteuk.network.utils.Constants.SERVER_NAME; -public class EventManager extends AbstractEvent { +public class EventManager extends AbstractEvent implements EventAPI { - public static void createJoinEvent(String uuid, String type, String event) { - Network.getInstance().getGlobalSQL().update("INSERT INTO join_events(uuid,type,event) " + - "VALUES('" + uuid + "','" + type + "','" + event + "') " + - "ON DUPLICATE KEY UPDATE type='" + type + "', event='" + event + "';"); + private final GlobalSQL globalSQL; + + public EventManager(GlobalSQL globalSQL) { + this.globalSQL = globalSQL; + } + + public void createJoinEvent(String uuid, String type, String event) { + globalSQL.update( + "INSERT INTO join_events(uuid,type,event) " + "VALUES('" + uuid + "','" + type + "','" + event + "') " + "ON DUPLICATE KEY UPDATE type='" + type + "', event='" + event + "';"); + } + + public void createJoinEvent(String uuid, String type, String event, String message) { + Network.getInstance().getGlobalSQL() + .update("INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + + "UPDATE type='" + type + "', event='" + event + "', message='" + message + "';"); } - public static void createJoinEvent(String uuid, String type, String event, String message) { - Network.getInstance().getGlobalSQL().update("INSERT INTO join_events(uuid,type,event,message) " + - "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + - "ON DUPLICATE KEY UPDATE type='" + type + "', event='" + event + "', message='" + message + "';"); + public void createJoinEvent(String uuid, String type, String event, Component message) { + String messageString = PlainTextComponentSerializer.plainText().serialize(message); + Network.getInstance().getGlobalSQL() + .update("INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + + "UPDATE type='" + type + "', event='" + event + "', message='" + messageString + "';"); } /** @@ -29,13 +45,12 @@ public static void createJoinEvent(String uuid, String type, String event, Strin * @param server the server name where the event should occur * @param event the event arguments in String format */ - public static void createEvent(String uuid, String type, String server, String event) { + public void createEvent(String uuid, String type, String server, String event) { if (uuid == null) { - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(type,server,event) " + - "VALUES('" + type + "','" + server + "','" + event + "');"); + Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(type,server,event) " + "VALUES('" + type + "','" + server + "','" + event + "');"); } else { - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(uuid,type,server,event) " + - "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "');"); + Network.getInstance().getGlobalSQL() + .update("INSERT INTO server_events(uuid,type,server,event) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "');"); } } @@ -49,18 +64,39 @@ public static void createEvent(String uuid, String type, String server, String e * @param event the event arguments in String format * @param message message to be sent to the player on success */ - public static void createEvent(String uuid, String type, String server, String event, String message) { + public void createEvent(String uuid, String type, String server, String event, String message) { if (uuid == null) { - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(type,server,event,message) " + - "VALUES('" + type + "','" + server + "','" + event + "','" + message + "');"); + Network.getInstance().getGlobalSQL() + .update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + message + "');"); } else { - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(uuid,type,server,event,message) " + - "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + message + "');"); + Network.getInstance().getGlobalSQL() + .update("INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + message + + "');"); } } - public static void createTeleportEvent(boolean join, String uuid, String type, String event, - Location previousLocation) { + /** + * Creates an event with the following input parameters: + * + * @param uuid the uuid of the player to which the event should apply + * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a + * custom implementation) + * @param server the server name where the event should occur + * @param event the event arguments in String format + * @param message message to be sent to the player on success + */ + public void createEvent(String uuid, String type, String server, String event, Component message) { + String messageString = PlainTextComponentSerializer.plainText().serialize(message); + if (uuid == null) { + Network.getInstance().getGlobalSQL() + .update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + messageString + "');"); + } else { + Network.getInstance().getGlobalSQL() + .update("INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + messageString + "');"); + } + } + + public void createTeleportEvent(boolean join, String uuid, String type, String event, NetworkLocation previousLocation) { Back.setPreviousCoordinate(uuid, previousLocation); @@ -72,8 +108,7 @@ public static void createTeleportEvent(boolean join, String uuid, String type, S } } - public static void createTeleportEvent(boolean join, String uuid, String type, String event, String message, - Location previousLocation) { + public void createTeleportEvent(boolean join, String uuid, String type, String event, String message, NetworkLocation previousLocation) { Back.setPreviousCoordinate(uuid, previousLocation); @@ -85,6 +120,19 @@ public static void createTeleportEvent(boolean join, String uuid, String type, S } } + public void createTeleportEvent(boolean join, String uuid, String type, String event, Component message, NetworkLocation previousLocation) { + + String messageString = PlainTextComponentSerializer.plainText().serialize(message); + Back.setPreviousCoordinate(uuid, previousLocation); + + // Create event + if (join) { + createJoinEvent(uuid, type, event, messageString); + } else { + createEvent(uuid, type, SERVER_NAME, event, messageString); + } + } + /** * General implementation of an event, uses a switch expression to run the actual event. * diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index e5e531df..c888c18d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -3,7 +3,6 @@ import net.bteuk.network.Network; import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Constants; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.TutorialRecommendation; diff --git a/Plugin/src/main/java/net/bteuk/network/logging/BukkitForwardingHandler.java b/Plugin/src/main/java/net/bteuk/network/logging/BukkitForwardingHandler.java new file mode 100644 index 00000000..91f904c2 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/logging/BukkitForwardingHandler.java @@ -0,0 +1,40 @@ +package net.bteuk.network.logging; + +import java.util.logging.Handler; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class BukkitForwardingHandler extends Handler { + + private final Logger pluginLogger; + private final String pluginLoggerName; + + public BukkitForwardingHandler(Logger pluginLogger) { + this.pluginLogger = pluginLogger; + this.pluginLoggerName = pluginLogger.getName(); + } + + @Override + public void publish(LogRecord record) { + if (!isLoggable(record)) { + return; + } + + // Avoid feedback loops if someone already uses the plugin logger + String src = record.getLoggerName(); + if (src != null && src.equals(pluginLoggerName)) { + return; + } + + // Delegate to the plugin logger so its prefix/formatting is applied + pluginLogger.log(record); + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java b/Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java deleted file mode 100644 index 537abe2d..00000000 --- a/Plugin/src/main/java/net/bteuk/network/sql/DatabaseInit.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.bteuk.network.sql; - -import org.apache.commons.dbcp2.BasicDataSource; - -import java.sql.Connection; -import java.sql.SQLException; - -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - -public class DatabaseInit { - - // Creates the mysql connection. - public BasicDataSource mysqlSetup(String database) throws SQLException { - - String host = CONFIG.getString("host"); - int port = CONFIG.getInt("port"); - String username = CONFIG.getString("username"); - String password = CONFIG.getString("password"); - - BasicDataSource dataSource = new BasicDataSource(); - - dataSource.setUrl("jdbc:mysql://" + host + ":" + port + "/" + database + "?&allowPublicKeyRetrieval=true" + - "&useSSL=false&"); - dataSource.setUsername(username); - dataSource.setPassword(password); - - testDataSource(dataSource); - return dataSource; - } - - private void testDataSource(BasicDataSource dataSource) throws SQLException { - try (Connection connection = dataSource.getConnection()) { - if (!connection.isValid(1000)) { - throw new SQLException("Could not establish database connection."); - } - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 423c1b5d..7041e18c 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -1,11 +1,13 @@ package net.bteuk.network.sql; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.building_counter.Building; +import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.utils.Coordinate; -import org.apache.commons.dbcp2.BasicDataSource; import org.bukkit.Bukkit; import org.bukkit.Location; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -16,7 +18,7 @@ import static net.bteuk.network.utils.Constants.SERVER_NAME; public class GlobalSQL extends AbstractSQL { - public GlobalSQL(BasicDataSource datasource) { + public GlobalSQL(DataSource datasource) { super(datasource); } @@ -61,6 +63,11 @@ public int addCoordinate(Location l) { return (addCoordinate(SERVER_NAME, l.getWorld().getName(), l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch())); } + // Add new coordinate to database and return the id. + public int addCoordinate(NetworkLocation l) { + return (addCoordinate(SERVER_NAME, l.world(), l.x(), l.y(), l.z(), l.yaw(), l.pitch())); + } + // Add new coordinate to database and return the id. public int addCoordinate(String server, Location l) { @@ -121,11 +128,37 @@ public void updateCoordinate(int coordinateID, String server, Location l) { } } + // Update an existing coordinate. + public void updateCoordinate(int coordinateID, String server, NetworkLocation location) { + + try ( + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement("UPDATE coordinates SET server=?, world=?, x=?, y=?, z=?, yaw=?, pitch=? WHERE id=?;") + ) { + statement.setString(1, server); + statement.setString(2, location.world()); + statement.setDouble(3, location.x()); + statement.setDouble(4, location.y()); + statement.setDouble(5, location.z()); + statement.setFloat(6, location.yaw()); + statement.setFloat(7, location.pitch()); + statement.setInt(8, coordinateID); + statement.executeUpdate(); + } catch (SQLException sql) { + + sql.printStackTrace(); + } + } + // Update an existing coordinate. public void updateCoordinate(int coordinateID, Location l) { updateCoordinate(coordinateID, SERVER_NAME, l); } + // Update an existing coordinate. + public void updateCoordinate(int coordinateID, NetworkLocation location) { + updateCoordinate(coordinateID, SERVER_NAME, location); + } + public ArrayList getBuildings(String condition) { try ( Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index 7281da47..1f1f17d1 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -1,11 +1,12 @@ package net.bteuk.network.sql; +import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.enums.PlotDifficulties; import net.bteuk.network.lib.utils.Reviewing; import net.bteuk.network.utils.TutorialRecommendation; import net.bteuk.network.utils.plotsystem.SubmittedPlot; -import org.apache.commons.dbcp2.BasicDataSource; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -20,7 +21,7 @@ public class PlotSQL extends AbstractSQL { - public PlotSQL(BasicDataSource datasource) { + public PlotSQL(DataSource datasource) { super(datasource); } @@ -323,7 +324,7 @@ private int getLatestAttempt(int plotId, String plotOwner) { return 0; } - public void savePlotReviewCategoryFeedback(int reviewId, String category, String selection, int bookId) { + public boolean savePlotReviewCategoryFeedback(int reviewId, String category, String selection, int bookId) { try ( Connection conn = conn(); PreparedStatement statement = conn.prepareStatement("INSERT INTO plot_category_feedback(review_id," + "category,selection,book_id) VALUES(?, ?, ?, ?);") @@ -336,7 +337,9 @@ public void savePlotReviewCategoryFeedback(int reviewId, String category, String statement.executeUpdate(); } catch (SQLException sql) { sql.printStackTrace(); + return false; } + return true; } /** @@ -384,7 +387,7 @@ public int createVerification(int reviewId, String verifier, boolean acceptedOld * @param bookOld the book id of the reviewers feedback * @param bookNew the book id of the verifiers feedback */ - public void savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookOld, int bookNew) { + public boolean savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookOld, int bookNew) { try ( Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( "INSERT INTO plot_verification_category" + "(verification_id,category,selection_old,selection_new,book_id_old,book_id_new) VALUES(?, ?, ?, ?, ?, ?);") @@ -398,10 +401,12 @@ public void savePlotVerificationCategory(int verificationId, String category, St statement.executeUpdate(); } catch (SQLException sql) { sql.printStackTrace(); + return false; } + return true; } - public void saveBook(int id, int page, String contents) { + public boolean saveBook(int id, int page, String contents) { try ( Connection conn = conn(); PreparedStatement statement = conn.prepareStatement("INSERT INTO book_data(id,page,contents) VALUES(?, ?, ?);") @@ -412,7 +417,9 @@ public void saveBook(int id, int page, String contents) { statement.executeUpdate(); } catch (SQLException sql) { LOGGER.error("An error occurred when executing insert statement: ", sql); + return false; } + return true; } /** diff --git a/Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java deleted file mode 100644 index a3f15f9b..00000000 --- a/Plugin/src/main/java/net/bteuk/network/sql/RegionSQL.java +++ /dev/null @@ -1,101 +0,0 @@ -package net.bteuk.network.sql; - -import net.bteuk.network.Network; -import net.bteuk.network.utils.Constants; -import net.bteuk.network.utils.regions.Inactivity; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionMember; -import net.bteuk.network.utils.regions.Request; -import org.apache.commons.dbcp2.BasicDataSource; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -public class RegionSQL extends AbstractSQL { - public RegionSQL(BasicDataSource datasource) { - super(datasource); - } - - public ArrayList getRequestList(String sql) { - - ArrayList list = new ArrayList<>(); - - try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() - ) { - - while (results.next()) { - - list.add(new Request(results.getString(1), results.getString(2))); - } - } catch (SQLException e) { - e.printStackTrace(); - return null; - } - - return list; - } - - public ArrayList getInactives(String sql) { - - ArrayList list = new ArrayList<>(); - Region region; - - try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement(sql); - ResultSet results = statement.executeQuery() - ) { - - while (results.next()) { - - region = Network.getInstance().getRegionManager().getRegion(results.getString(1)); - - list.add(new Inactivity(region, results.getString(2))); - } - } catch (SQLException e) { - e.printStackTrace(); - return null; - } - - return list; - } - - public List getRegionMembers(String uuid) { - - List list = new ArrayList<>(); - - try ( - Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement("SELECT region,uuid,is_owner,last_enter,tag," + - "coordinate_id,pinned FROM region_members WHERE uuid=? ORDER BY pinned DESC, is_owner DESC, " + - "region ASC") - ) { - - statement.setString(1, uuid); - ResultSet results = statement.executeQuery(); - - while (results.next()) { - list.add(new RegionMember( - results.getString(1), - results.getString(2), - results.getBoolean(3), - results.getLong(4), - results.getString(5), - results.getInt(6), - results.getBoolean(7) - )); - } - } catch (SQLException e) { - Constants.LOGGER.severe(String.format("An error occurred while fetching the region_members entries for " + - "%s", uuid)); - } - return list; - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Blocks.java b/Plugin/src/main/java/net/bteuk/network/utils/Blocks.java index 66367a16..84936e61 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Blocks.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Blocks.java @@ -1,9 +1,9 @@ package net.bteuk.network.utils; import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import net.bteuk.network.core.math.Point; import net.bteuk.network.exceptions.building_companion.DistanceLimitException; import net.bteuk.network.exceptions.building_companion.OutsidePlotException; -import net.bteuk.network.utils.math.Point; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.data.BlockData; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Constants.java b/Plugin/src/main/java/net/bteuk/network/utils/Constants.java deleted file mode 100644 index 29529ef9..00000000 --- a/Plugin/src/main/java/net/bteuk/network/utils/Constants.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.bteuk.network.utils; - -import net.bteuk.network.Network; -import net.bteuk.network.utils.enums.ServerType; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Logger; - -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - -// This class houses static variables that need to be accessed throughout the plugin. -public class Constants { - - // Logger - public static final Logger LOGGER; - - // Server Name - public static final String SERVER_NAME; - public static final ServerType SERVER_TYPE; - - // Regions. - public static final boolean REGIONS_ENABLED; - - // Tpll - public static final boolean TPLL_ENABLED; - - // World height. - public static final int MAX_Y; - public static final int MIN_Y; - - // Earth world name. - public static final String EARTH_WORLD; - - // Custom join/leave messages. - public static final boolean CUSTOM_MESSAGES; - - // Is staff chat enabled - public static final boolean STAFF_CHAT; - - // Are tips enabled - public static final boolean TIPS; - - // Is the tutorial enabled - public static final boolean TUTORIALS; - - // Is /ll enabled - public static final boolean LL; - - // Is the progress map enabled - public static final boolean PROGRESS_MAP; - - // Is progression enabled - public static final boolean PROGRESSION; - public static final boolean ANNOUNCE_OVERALL_LEVELUPS; - public static final boolean ANNOUNCE_SEASONAL_LEVELUPS; - - // Sidebar message details - public static final boolean SIDEBAR_ENABLED; - public static final String SIDEBAR_TITLE; - public static final List SIDEBAR_CONTENT; - - // Message of the day details - public static final boolean MOTD_ENABLED; - public static final String MOTD_CONTENT; - - static { - - LOGGER = Network.getInstance().getLogger(); - - // Set the server name from config. - SERVER_NAME = CONFIG.getString("server_name"); - - // Set the server type from config. - SERVER_TYPE = ServerType.valueOf(CONFIG.getString("server_type")); - - REGIONS_ENABLED = CONFIG.getBoolean("regions_enabled"); - - TPLL_ENABLED = CONFIG.getBoolean("tpll.enabled"); - - MAX_Y = CONFIG.getInt("tpll.max_y"); - MIN_Y = CONFIG.getInt("tpll.min_y"); - - CUSTOM_MESSAGES = CONFIG.getBoolean("chat.custom_messages.enabled"); - - STAFF_CHAT = CONFIG.getBoolean("staff.staff_chat.enabled"); - - TIPS = CONFIG.getBoolean("chat.tips.enabled"); - - TUTORIALS = CONFIG.getBoolean("tutorials.enabled"); - - LL = CONFIG.getBoolean("ll_enabled"); - - PROGRESS_MAP = CONFIG.getBoolean("ProgressMap.enabled"); - - PROGRESSION = CONFIG.getBoolean("progression.enabled"); - ANNOUNCE_OVERALL_LEVELUPS = CONFIG.getBoolean("progression.announce_level-ups.overall"); - ANNOUNCE_SEASONAL_LEVELUPS = CONFIG.getBoolean("progression.announce_level-ups.seasonal"); - - SIDEBAR_ENABLED = CONFIG.getBoolean("sidebar.enabled"); - SIDEBAR_TITLE = CONFIG.getString("sidebar.title", ""); - - List sidebarTextConfig = CONFIG.getList("sidebar.text"); - List sidebarText = new ArrayList<>(); - if (sidebarTextConfig != null && !sidebarTextConfig.isEmpty()) { - sidebarTextConfig.forEach(listItem -> { - if (listItem instanceof String listTextItem) { - sidebarText.add(listTextItem); - } - }); - } - - SIDEBAR_CONTENT = Collections.unmodifiableList(sidebarText); - - MOTD_ENABLED = CONFIG.getBoolean("motd.enabled"); - MOTD_CONTENT = CONFIG.getString("motd.text", ""); - - if (CONFIG.getString("earth_world") == null) { - // Setting default value. - EARTH_WORLD = "earth"; - } else { - EARTH_WORLD = CONFIG.getString("earth_world"); - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 3bc5fcd5..891d865a 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -1,14 +1,18 @@ package net.bteuk.network.utils; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.ServerType; import org.bukkit.configuration.file.FileConfiguration; import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Objects; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class NetworkConfig { public static FileConfiguration CONFIG; @@ -40,7 +44,7 @@ public void updateConfig() { String version = configVersion(); if (!version.equals(latestVersion())) { - LOGGER.info("Your config version is outdated, updating to latest version!"); + log.info("Your config version is outdated, updating to latest version!"); // Get old config values, these are needed to add them back after updating. Map values = CONFIG.getValues(true); @@ -53,7 +57,7 @@ public void updateConfig() { if (!configFile.delete()) { // Something went wrong. - LOGGER.warning("The old config file could not be deleted!"); + log.warning("The old config file could not be deleted!"); return; } @@ -83,9 +87,73 @@ public void updateConfig() { CONFIG = Network.getInstance().getConfig(); - LOGGER.info("Updated config to version " + CONFIG.getString("version")); + log.info("Updated config to version " + CONFIG.getString("version")); } else { - LOGGER.info("The config is up to date!"); + log.info("The config is up to date!"); } } + + public net.bteuk.network.core.Constants getConstants() { + // Set the server name from config. + String serverName = CONFIG.getString("server_name"); + + // Set the server type from config. + ServerType serverType = ServerType.valueOf(CONFIG.getString("server_type")); + + boolean regionsEnabled = CONFIG.getBoolean("regions_enabled"); + + // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds + long regionInactivity = CONFIG.getInt("region_inactivity") * 24L * 60L * 60L * 1000L; + + boolean tpllEnabled = CONFIG.getBoolean("tpll.enabled"); + + int maxY = CONFIG.getInt("tpll.max_y"); + int minY = CONFIG.getInt("tpll.min_y"); + + boolean customMessages = CONFIG.getBoolean("chat.custom_messages.enabled"); + + boolean staffChat = CONFIG.getBoolean("staff.staff_chat.enabled"); + + boolean tips = CONFIG.getBoolean("chat.tips.enabled"); + + boolean tutorials = CONFIG.getBoolean("tutorials.enabled"); + + boolean llEnabled = CONFIG.getBoolean("ll_enabled"); + + boolean progressMap = CONFIG.getBoolean("ProgressMap.enabled"); + + boolean progression = CONFIG.getBoolean("progression.enabled"); + boolean announceOverallLevelUps = CONFIG.getBoolean("progression.announce_level-ups.overall"); + boolean announceSeasonalLevelUps = CONFIG.getBoolean("progression.announce_level-ups.seasonal"); + + boolean sidebarEnabled = CONFIG.getBoolean("sidebar.enabled"); + String sidebarTitle = CONFIG.getString("sidebar.title", ""); + + List sidebarTextConfig = CONFIG.getList("sidebar.text"); + List sidebarText = new ArrayList<>(); + if (sidebarTextConfig != null && !sidebarTextConfig.isEmpty()) { + sidebarTextConfig.forEach(listItem -> { + if (listItem instanceof String listTextItem) { + sidebarText.add(listTextItem); + } + }); + } + + List sidebarTextList = Collections.unmodifiableList(sidebarText); + + boolean motdEnabled = CONFIG.getBoolean("motd.enabled"); + String motdText = CONFIG.getString("motd.text", ""); + + String earthWorld; + if (CONFIG.getString("earth_world") == null) { + // Setting default value. + earthWorld = "earth"; + } else { + earthWorld = CONFIG.getString("earth_world"); + } + + return new net.bteuk.network.core.Constants(serverName, serverType, regionsEnabled, regionInactivity, tpllEnabled, maxY, minY, earthWorld, customMessages, staffChat, tips, + tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, + motdText); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java deleted file mode 100644 index e61f114b..00000000 --- a/Plugin/src/main/java/net/bteuk/network/utils/regions/Inactivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.bteuk.network.utils.regions; - -public class Inactivity { - - public final Region region; - public final String uuid; - - public Inactivity(Region region, String uuid) { - - this.region = region; - this.uuid = uuid; - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java deleted file mode 100644 index c65fe5d6..00000000 --- a/Plugin/src/main/java/net/bteuk/network/utils/regions/Region.java +++ /dev/null @@ -1,759 +0,0 @@ -package net.bteuk.network.utils.regions; - -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.lib.dto.ChatMessage; -import net.bteuk.network.lib.dto.DirectMessage; -import net.bteuk.network.lib.enums.ChatChannels; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Time; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.worldguard.WorldGuard; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.Locale; -import java.util.Objects; - -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - -public record Region(String regionName, int x, int z) { - - // Get the tag of the region for a specific player, or name if no tag is set. - public String getTag(String uuid) { - if (hasTag(uuid)) { - return Network.getInstance().regionSQL.getString( - "SELECT tag FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - } else { - return regionName; - } - } - - // Set the tag of the region for a specific player. - public void setTag(String uuid, String tag) { - Network.getInstance().regionSQL.update("UPDATE region_members SET tag='" + tag.replace("'", "\\'") + "' WHERE" + - " region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Return whether the region has a tag for the specified uuid. - private boolean hasTag(String uuid) { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "' AND tag " + - "IS NOT NULL;")); - } - - // Return whether the player has this region pinned. - public boolean isPinned(String uuid) { - return Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "' AND " + - "pinned=1;"); - } - - // Set the region to (un)pinned for a specific player. - public void setPinned(String uuid, boolean pin) { - Network.getInstance().regionSQL.update("UPDATE region_members SET pinned=" + (pin ? "1" : "0") + " WHERE " + - "region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Get the server of the region. - public String getServer() { - if (Network.getInstance().regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "' AND " + - "status='plot'")) { - // Region is on a plot server. - return (Network.getInstance().getPlotSQL() - .getString("SELECT server FROM regions WHERE region='" + regionName + "';")); - } else { - // Region is on earth server. - return (Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE type='EARTH';")); - } - } - - // Return whether the uuid is the uuid of the region owner. - public boolean isOwner(String uuid) { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "' AND " + - "is_owner=1;")); - } - - // Return whether the uuid is the uuid of a region member. - public boolean isMember(String uuid) { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "' AND " + - "is_owner=0;")); - } - - // Return the region status. - public RegionStatus status() { - String status = - Network.getInstance().regionSQL.getString("SELECT status FROM regions WHERE region='" + regionName + - "';"); - if (status == null) { - return RegionStatus.DEFAULT; - } else { - return (RegionStatus.valueOf(status.toUpperCase(Locale.ROOT))); - } - } - - // Return whether the region is claimable. - public boolean isClaimable() { - return (Network.getInstance().regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "' " + - "AND (status='default' OR status='public' OR status='inactive');")); - } - - // Return whether the region has been claimed in the past. - public boolean wasClaimed() { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_logs WHERE region='" + regionName + "' AND is_owner=1;")); - } - - // Set the region as inactive. - public void setInactive() { - Network.getInstance().regionSQL.update("UPDATE regions SET status='inactive' WHERE region='" + regionName + - "';"); - } - - // Check if the region is in the plot system. - public boolean isPlot() { - return Network.getInstance().regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "' " + - "AND status='plot';"); - } - - // Set the region to be for plots. - public void setPlot() { - - // Kick members if exist. - for (String uuid : getMembers()) { - - // Send message to user. - // Is sent before actual removal so we can read the region tag. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", - getTag(uuid)), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - - // Leave region in database. - Network.getInstance().regionSQL.update("DELETE FROM region_members WHERE region='" + regionName + "' AND " + - "uuid='" + uuid + "';"); - - // Close log of player in region. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Leave region in WorldGuard. - WorldGuard.addMember(regionName, uuid, Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - } - - // Set region to plot. - Network.getInstance().regionSQL.update("UPDATE regions SET status='plot' WHERE region='" + regionName + "';"); - Network.getInstance().getLogger().info("Region " + regionName + " set to plot status."); - } - - // Return whether the region has an owner. - public boolean hasOwner() { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND is_owner=1;")); - } - - // Return whether the region has an owner. - public boolean hasActiveOwner() { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND is_owner=1 AND last_enter>=" + (Time.currentTime() - Network.getInstance() - .getTimers().inactivity) + ";")); - } - - // Return whether the region has a member. - public boolean hasMember() { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND is_owner=0;")); - } - - // Return whether the region has an active member. - public boolean hasActiveMember(long time) { - return (Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + regionName + "' AND is_owner=0 AND last_enter>=" + time + ";")); - } - - // Return the number of members, if any. - public int memberCount() { - return (Network.getInstance().regionSQL.getInt( - "SELECT COUNT(uuid) FROM region_members WHERE region='" + regionName + "' AND is_owner=0;")); - } - - // Return the uuid of the region owner, if exists. - public String getOwner() { - if (hasOwner()) { - return (Network.getInstance().regionSQL.getString( - "SELECT uuid FROM region_members WHERE region='" + regionName + "' AND is_owner=1;")); - } else { - return "null"; - } - } - - // Return the name of the region owner, if exists. - public String ownerName() { - if (hasOwner()) { - return (Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE uuid='" + getOwner() + "';")); - } else { - return "nobody"; - } - } - - // Return string array of member uuids. - public ArrayList getMembers() { - return Network.getInstance().regionSQL.getStringList( - "SELECT uuid FROM region_members WHERE region='" + regionName + "';"); - } - - // Get the coordinate id for the location the player has set. - public int getCoordinateID(String uuid) { - return Network.getInstance().regionSQL.getInt( - "SELECT coordinate_id FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Set the coordinate id for the location of the specified player. - public void setCoordinateID(String uuid, int id) { - Network.getInstance().regionSQL.update( - "UPDATE region_members SET coordinate_id=" + id + " WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Set the last enter time for the region. - public void setLastEnter(String uuid) { - Network.getInstance().regionSQL.update("UPDATE region_members SET last_enter=" + Time.currentTime() + " WHERE" + - " region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Get the most recent member to enter the region. - public String getRecentMember() { - if (hasMember()) { - return Network.getInstance().regionSQL.getString( - "SELECT uuid FROM region_members WHERE region='" + regionName + "' AND is_owner=0 ORDER BY " + - "last_enter DESC;"); - } else { - return null; - } - } - - // Set the region to default. - public void setDefault() { - Network.getInstance().regionSQL.update("UPDATE regions SET status='default' WHERE region='" + regionName + - "';"); - } - - // Set the region to default. - public void setDefault(String removeRole) { - WorldGuard.removeGroup(regionName, removeRole, Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - Network.getInstance().regionSQL.update("UPDATE regions SET status='default' WHERE region='" + regionName + - "';"); - } - - // Set the region to public. - public void setPublic() { - Network.getInstance().regionSQL.update("UPDATE regions SET status='public' WHERE region='" + regionName + "';"); - } - - // Set region to locked. - public void setLocked() { - - // Remove all members and the owner. - removeMembers("The region %s has been locked, you can no longer build here.", false); - - // Set locked. - Network.getInstance().regionSQL.update("UPDATE regions SET status='locked' WHERE region='" + regionName + "';"); - } - - // Set region to open. - public void setOpen() { - - // Remove all members and the owner. - removeMembers("The region %s is now open, you no longer need to claim it to build here.", true); - - // Set open. - WorldGuard.addGroup(regionName, "jrbuilder", Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - Network.getInstance().regionSQL.update("UPDATE regions SET status='open' WHERE region='" + regionName + "';"); - } - - // Check whether the region equals another region. - public boolean equals(Region region) { - return (regionName.equals(region.regionName())); - } - - // Check whether the region is in the database. - public boolean inDatabase() { - return (Network.getInstance().regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "';" - )); - } - - // Add the region to the database. - - public void addToDatabase() { - // Check if it's not already in the database. - if (!inDatabase()) { - Network.getInstance().regionSQL.update("INSERT INTO regions(region,status) VALUES('" + regionName + "'," + - "'default');"); - - // Create region in worldguard. - WorldGuard.createRegion(regionName, Integer.parseInt(regionName.split(",")[0]) * 512, - Integer.parseInt(regionName.split(",")[1]) * 512, - Integer.parseInt(regionName.split(",")[0]) * 512 + 511, - Integer.parseInt(regionName.split(",")[1]) * 512 + 511, - Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - } - } - - // Add the region to the database for plotsystem. - public void addToPlotsystem() { - // Check if it's not already in the database. - if (!inDatabase()) { - Network.getInstance().regionSQL.update("INSERT INTO regions(region,status) VALUES('" + regionName + "'," + - "'plot');"); - - // Create region in worldguard. - WorldGuard.createRegion(regionName, Integer.parseInt(regionName.split(",")[0]) * 512, - Integer.parseInt(regionName.split(",")[1]) * 512, - Integer.parseInt(regionName.split(",")[0]) * 512 + 511, - Integer.parseInt(regionName.split(",")[1]) * 512 + 511, - Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - } - } - - // Check if this region has any requests. - public boolean hasRequests() { - return Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_requests WHERE region='" + regionName + "';"); - } - - // Check if the player has already requested to join this region. - public boolean hasRequest(NetworkUser u) { - return Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_requests WHERE region='" + regionName + "' AND uuid='" + u.player.getUniqueId() + "';"); - } - - // Check if the specified player has been invited to this region. - public boolean hasInvite(String uuid) { - return Network.getInstance().regionSQL.hasRow( - "SELECT region FROM region_invites WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - } - - // Remove a region invite. - public void removeInvite(String uuid) { - Network.getInstance().regionSQL.update("DELETE FROM region_invites WHERE region='" + regionName + "' AND " + - "uuid='" + uuid + "';"); - } - - // Accept any requests for this region. - public void acceptRequests() { - - // Get all requests for this region by uuid. - ArrayList uuids = Network.getInstance().regionSQL.getStringList("SELECT uuid FROM region_requests " + - "WHERE region='" + regionName + "';"); - int coordinate_id; - - // Add all users to the region. - for (String uuid : uuids) { - - // Get coordinate id from request. - coordinate_id = Network.getInstance().regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + - "region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Join region. - joinRegion(uuid, coordinate_id); - } - - // Clear all requests for the region. - Network.getInstance().regionSQL.update("DELETE FROM region_requests WHERE region='" + regionName + "';"); - } - - // Accept a request for a specific user. - public void acceptRequest(String uuid) { - - // Get the coordinate id for the request. - int coordinate_id = Network.getInstance().regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + - "region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Add them to the region. - joinRegion(uuid, coordinate_id); - - // Delete request. - Network.getInstance().regionSQL.update("DELETE FROM region_requests WHERE region='" + regionName + "' AND " + - "uuid='" + uuid + "'; "); - } - - // Deny a request for a specific user. - public void denyRequest(String uuid) { - - // Delete the request. - Network.getInstance().regionSQL.update("DELETE FROM region_requests WHERE region='" + regionName + "' AND " + - "uuid='" + uuid + "';"); - - // Send message to user. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("Your request to join region %s has been denied.", regionName), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - - // Cancel a request for a specific user. - public void cancelRequest(NetworkUser u) { - - // Delete request. - Network.getInstance().regionSQL.update("DELETE FROM region_requests WHERE region='" + regionName + "' AND " + - "uuid='" + u.player.getUniqueId() + "'; "); - - // Send message to user. - u.player.sendMessage(ChatUtils.success("Cancelled region join request.")); - } - - // Join region with owner or staff request. - // If staff request is true then it requires a staff request else it's an owner request. - public void requestRegion(NetworkUser u, boolean staffRequest) { - - // Check if you don't already have a request for this region. - if (hasRequest(u)) { - - u.player.sendMessage(ChatUtils.error("You have already requested to join this region.")); - u.player.sendMessage(ChatUtils.error("Check the request status in the region menu.")); - return; - } - - // Get coordinate of player. - int coordinate = Network.getInstance().getGlobalSQL().addCoordinate(u.player.getLocation()); - if (staffRequest) { - // Staff request - - // Create request. - Network.getInstance().regionSQL.update("INSERT INTO region_requests(region,uuid,owner,staff_accept," + - "coordinate_id) VALUES ('" + regionName + "','" + - u.player.getUniqueId() + "','" + getOwner() + "',0," + coordinate + ");"); - - // Send message to player. - u.player.sendMessage(ChatUtils.success("Requested to join region ") - .append(Component.text(regionName, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", awaiting staff review."))); - - ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", - ChatUtils.success("A region join request has been submitted by %s for region %s", - u.player.getName(), regionName)); - Network.getInstance().getChat().sendSocketMessage(chatMessage); - } else { - // Owner request - - // Create request. - Network.getInstance().regionSQL.update("INSERT INTO region_requests(region,uuid,owner,owner_accept," + - "coordinate_id) VALUES ('" + regionName + "','" + - u.player.getUniqueId() + "','" + getOwner() + "',0," + coordinate + ");"); - - // Send message to player. - u.player.sendMessage(ChatUtils.success("Requested to join region ") - .append(Component.text(regionName, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", awaiting owner review."))); - - // Send the owner a message. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(), "server", - ChatUtils.success("%s has requested to join region %s.", u.player.getName(), getTag(getOwner())), - false); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - } - - // Join region with no request. - public void joinRegion(NetworkUser u) { - - // If region is public then it must already have an owner. - if (status() == RegionStatus.PUBLIC) { - - // Add new coordinate at the location of the player. - int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(u.player.getLocation()); - - // Join region as member. - Network.getInstance().regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + - "VALUES('" + regionName + "','" + - u.player.getUniqueId() + "'," + Time.currentTime() + "," + coordinateID + ");"); - - // Start log of player in region. - Network.getInstance().regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + regionName + "','" + - u.player.getUniqueId() + "'," + Time.currentTime() + ");"); - - // Join region in WorldGuard. - WorldGuard.addMember(regionName, u.player.getUniqueId().toString(), u.player.getWorld()); - - u.player.sendMessage(ChatUtils.success("You have joined the region ") - .append(Component.text(regionName, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" as a member."))); - } else { - - // If the region is inactive, demote the previous owner to a member. - if (status() == RegionStatus.INACTIVE) { - - String owner = getOwner(); - - // Demote owner in database. - Network.getInstance().regionSQL.update( - "UPDATE region_members SET is_owner=0 WHERE region='" + regionName + "' AND uuid='" + owner + "';"); - - // Close log for owner. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + - "WHERE region='" + regionName + "' AND uuid='" + owner + "';"); - - // Open log for previous owner as member. - Network.getInstance().regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + regionName + "','" + - owner + "'," + Time.currentTime() + ");"); - - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", - ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", - getTag(owner)), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - - // Set region to default, since it would've been set to inactive previously. - setDefault(); - } - - // Add new coordinate at the location of the player. - int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(u.player.getLocation()); - - // Join region as owner. - Network.getInstance().regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + - "coordinate_id) VALUES('" + regionName + "','" + - u.player.getUniqueId() + "',1," + Time.currentTime() + "," + coordinateID + ");"); - - // Start log of player in region. - Network.getInstance().regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + regionName + "','" + - u.player.getUniqueId() + "',1," + Time.currentTime() + ");"); - - // Join region in WorldGuard. - WorldGuard.addMember(regionName, u.player.getUniqueId().toString(), u.player.getWorld()); - - u.player.sendMessage(ChatUtils.success("You have joined the region ") - .append(Component.text(regionName, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" as the owner."))); - } - } - - // Join region if we don't know whether the user is online. - public void joinRegion(String uuid, int coordinateID) { - - // If region has an owner join as member. - if (hasOwner()) { - - // Join region as member. - Network.getInstance().regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + - "VALUES('" + regionName + "','" + - uuid + "'," + Time.currentTime() + "," + coordinateID + ");"); - - // Start log of player in region. - Network.getInstance().regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + regionName + "','" + - uuid + "'," + Time.currentTime() + ");"); - - // Join region in WorldGuard. - WorldGuard.addMember(regionName, uuid, Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - - // Send message to user. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("You have joined the region %s as a member.", regionName), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } else { - - // If the region is inactive, demote the previous owner to a member. - if (status() == RegionStatus.INACTIVE) { - - String owner = getOwner(); - - // Demote owner in database. - Network.getInstance().regionSQL.update( - "UPDATE region_members SET is_owner=0 WHERE region='" + regionName + "' AND uuid='" + owner + "';"); - - // Close log for owner. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + - "WHERE region='" + regionName + "' AND uuid='" + owner + "';"); - - // Open log for previous owner as member. - Network.getInstance().regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + regionName + "','" + - owner + "'," + Time.currentTime() + ");"); - - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", - ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", - getTag(owner)), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - - // Join region as owner. - Network.getInstance().regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + - "coordinate_id) VALUES('" + regionName + "','" + - uuid + "',1," + Time.currentTime() + "," + coordinateID + ");"); - - // Start log of player in region. - Network.getInstance().regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + regionName + "','" + - uuid + "',1," + Time.currentTime() + ");"); - - // Join region in WorldGuard. - WorldGuard.addMember(regionName, uuid, Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("You have joined the region %s as the owner.", regionName), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - } - - // Leave region. - public void leaveRegion(String uuid, Component message) { - - // Check if this is the correct server. - // If this is not the earth server then create a server-event. - if (SERVER_TYPE == ServerType.EARTH) { - - // Send message to user. - // Is sent before actual removal so we can read the region tag. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - message, true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - - // Leave region in database. - Network.getInstance().regionSQL.update("DELETE FROM region_members WHERE region='" + regionName + "' AND " + - "uuid='" + uuid + "';"); - - // Close log of player in region. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Leave region in WorldGuard. - WorldGuard.removeMember(regionName, uuid, Bukkit.getWorld(Objects.requireNonNull(EARTH_WORLD))); - } else { - - EventManager.createEvent(uuid, "network", Network.getInstance().getGlobalSQL().getString("SELECT name " + - "FROM server_data WHERE type='EARTH';"), - "region leave " + regionName, PlainTextComponentSerializer.plainText().serialize(message)); - } - } - - // Make the owner a member of the region. - public void makeMember() { - - // Get the owner. - String uuid = getOwner(); - - // Close log of player as owner. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Open log of player as member. - Network.getInstance().regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + regionName + "','" + - uuid + "'," + Time.currentTime() + ");"); - - // Update region member to set as member. - Network.getInstance().regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + regionName + - "' AND uuid='" + uuid + "';"); - } - - // Make a member the owner of the region. - public void makeOwner(String uuid) { - - // Check if they are a member. - if (isMember(uuid)) { - - // Close log of player as member. - Network.getInstance().regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - - // Open log of player as owner. - Network.getInstance().regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + regionName + "','" + - uuid + "',1," + Time.currentTime() + ");"); - - // Update region member to set as owner. - Network.getInstance().regionSQL.update( - "UPDATE region_members SET is_owner=1 WHERE region='" + regionName + "' AND uuid='" + uuid + "';"); - - // If the region is currently set as inactive and the new owner isn't, set it to default. - if (status() == RegionStatus.INACTIVE && hasActiveOwner()) { - setDefault(); - } - } - } - - // Update any region requests. - public void updateRequests() { - - // If the region has no owner, accept all requests. - // If there is an owner, update the owner row in the request. - if (hasOwner()) { - - Network.getInstance().regionSQL.update("UPDATE region_requests SET owner='" + getOwner() + "' WHERE " + - "region='" + regionName + "';"); - } else { - - acceptRequests(); - } - } - - // Remove all members and owner of the region. - // The placeholder %tag% is used in the message to show the region tag. - public void removeMembers(String message, boolean success) { - - if (hasOwner() || hasMember()) { - - // Get all members. - ArrayList uuids = Network.getInstance().regionSQL.getStringList("SELECT uuid FROM region_members " + - "WHERE region='" + regionName + "';"); - - for (String uuid : uuids) { - - leaveRegion(uuid, success ? ChatUtils.success(message, getTag(uuid)) : ChatUtils.error(message, - getTag(uuid))); - } - } - } - - // Get time that a region member was last in this region. - public long lastActive(String uuid) { - return (Network.getInstance().regionSQL.getLong( - "SELECT last_enter FROM region_members WHERE region='" + regionName + "' AND uuid='" + uuid + "';")); - } - - // Check if the player can build in this region. - public boolean canBuild(Player p) { - return ((status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) || isOwner( - p.getUniqueId().toString()) || isMember(p.getUniqueId().toString())); - } - - public boolean equals(int x, int z) { - return this.x == x && this.z == z; - } - - @Override - public boolean equals(Object o) { - if (o == null) { - return false; - } - if (this == o) { - return true; - } - if (o instanceof String str) { - return str.equals(regionName); - } - return false; - } - - @Override - public int hashCode() { - return Objects.hash(x, z); - } -} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java b/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java deleted file mode 100644 index 3185c1c0..00000000 --- a/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionManager.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.bteuk.network.utils.regions; - -import net.bteuk.network.sql.RegionSQL; -import org.bukkit.Location; - -import java.util.HashMap; -import java.util.Map; - -public class RegionManager { - - private final Map regions; - private final RegionSQL regionSQL; - - public RegionManager(RegionSQL regionSQL) { - regions = new HashMap<>(); - - this.regionSQL = regionSQL; - } - - /** - * Get the region at a location. - * - * @param x region x - * @param z region z - * @return the {@link Region} - */ - public Region getRegion(int x, int z) { - return findRegion(x, z); - } - - // Get region at location. - public Region getRegion(Location l) { - // Get x and z of the region as int rounded down. - int x = (l.getX() >= 0 ? (int) l.getX() : ((int) l.getX()) - 1) >> 9; - int z = (l.getZ() >= 0 ? (int) l.getZ() : ((int) l.getZ()) - 1) >> 9; - - return getRegion(x, z); - } - - // Get region at location with coordinate transform. - public Region getRegion(Location l, int dx, int dz) { - // Get x and z of the region as int rounded down with any necessary coordinate transforms. - int x = ((l.getX() >= 0 ? (int) l.getX() : ((int) l.getX()) - 1) + dx) >> 9; - int z = ((l.getZ() >= 0 ? (int) l.getZ() : ((int) l.getZ()) - 1) + dz) >> 9; - - return getRegion(x, z); - } - - public Region getRegion(String region) throws NumberFormatException { - int x = Integer.parseInt(region.split(",")[0]); - int z = Integer.parseInt(region.split(",")[1]); - return findRegion(x, z); - } - - // Check whether the region exists in the database. - // This is mainly used to check whether guests can teleport there. - public boolean exists(String regionName) { - return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "';")); - } - - private Region findRegion(int x, int z) { - String regionName = x + "," + z; - Region region = regions.get(regionName); - if (region == null) { - // Region does not exist, create it. - region = new Region(regionName, x, z); - regions.put(regionName, region); - } - return region; - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java index 7ff79bbd..ed4de6a0 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldGuard.java @@ -7,193 +7,178 @@ import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.api.WorldGuardAPI; import org.bukkit.World; import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; +@Log +public class WorldGuard implements WorldGuardAPI { -public class WorldGuard { + public boolean addMember(String regionName, String uuid, String world) { - public static boolean addMember(String region, String uuid, World world) { + RegionManager regionManager = getRegionManager(world); - // Get instance of WorldGuard. - com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); - - // Get regions. - RegionContainer container = wg.getPlatform().getRegionContainer(); - RegionManager buildRegions = container.get(BukkitAdapter.adapt(world)); - - if (buildRegions == null) { - - LOGGER.warning("RegionManager for world " + world.getName() + " is null!"); + if (regionManager == null) { return false; } - ProtectedRegion buildRegion = buildRegions.getRegion(region); - - if (buildRegion == null) { + ProtectedRegion region = getRegion(regionManager, regionName); - LOGGER.warning("Region " + region + " does not exist!"); + if (region == null) { return false; } // Add the member to the region. - buildRegion.getMembers().addPlayer(UUID.fromString(uuid)); + region.getMembers().addPlayer(UUID.fromString(uuid)); // Save the changes try { - buildRegions.saveChanges(); + regionManager.saveChanges(); return true; } catch (StorageException e1) { - e1.printStackTrace(); return false; } } - public static boolean addGroup(String region, String group, World world) { + public boolean addGroup(String regionName, String group, String world) { - // Get instance of WorldGuard. - com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); + RegionManager regionManager = getRegionManager(world); - // Get regions. - RegionContainer container = wg.getPlatform().getRegionContainer(); - RegionManager buildRegions = container.get(BukkitAdapter.adapt(world)); - - if (buildRegions == null) { - - LOGGER.warning("RegionManager for world " + world.getName() + " is null!"); + if (regionManager == null) { return false; } - ProtectedRegion buildRegion = buildRegions.getRegion(region); - - if (buildRegion == null) { + ProtectedRegion region = getRegion(regionManager, regionName); - LOGGER.warning("Region " + region + " does not exist!"); + if (region == null) { return false; } // Add the group to the region. - buildRegion.getMembers().addGroup(group); - Network.getInstance().getLogger().info("Added " + group + " to " + region); + region.getMembers().addGroup(group); + log.info("Added " + group + " to " + region); // Save the changes try { - buildRegions.saveChanges(); + regionManager.saveChanges(); return true; } catch (StorageException e1) { - e1.printStackTrace(); return false; } } - public static boolean removeMember(String region, String uuid, World world) { + public boolean removeMember(String regionName, String uuid, String world) { - // Get instance of WorldGuard. - com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); + RegionManager regionManager = getRegionManager(world); - // Get regions. - RegionContainer container = wg.getPlatform().getRegionContainer(); - RegionManager buildRegions = container.get(BukkitAdapter.adapt(world)); - - if (buildRegions == null) { - - LOGGER.warning("RegionManager for world " + world.getName() + " is null!"); + if (regionManager == null) { return false; } - ProtectedRegion buildRegion = buildRegions.getRegion(region); - - if (buildRegion == null) { + ProtectedRegion region = getRegion(regionManager, regionName); - LOGGER.warning("Region " + region + " does not exist!"); + if (region == null) { return false; } // Check if the member is in the region. - if (buildRegion.getMembers().contains(UUID.fromString(uuid))) { + if (region.getMembers().contains(UUID.fromString(uuid))) { // Remove the member to the region. - buildRegion.getMembers().removePlayer(UUID.fromString(uuid)); + region.getMembers().removePlayer(UUID.fromString(uuid)); } else { return false; } // Save the changes try { - buildRegions.saveChanges(); + regionManager.saveChanges(); return true; } catch (StorageException e1) { - e1.printStackTrace(); return false; } } - public static boolean removeGroup(String region, String group, World world) { + public boolean removeGroup(String regionName, String group, String world) { - // Get instance of WorldGuard. - com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); + RegionManager regionManager = getRegionManager(world); - // Get regions. - RegionContainer container = wg.getPlatform().getRegionContainer(); - RegionManager buildRegions = container.get(BukkitAdapter.adapt(world)); - - if (buildRegions == null) { - - LOGGER.warning("RegionManager for world " + world.getName() + " is null!"); + if (regionManager == null) { return false; } - // Remove the group from the region. - ProtectedRegion buildRegion = buildRegions.getRegion(region); + ProtectedRegion region = getRegion(regionManager, regionName); - if (buildRegion == null) { - - LOGGER.warning("Region " + region + " does not exist!"); + if (region == null) { return false; } - buildRegion.getMembers().removeGroup(group); + region.getMembers().removeGroup(group); // Save the changes try { - buildRegions.saveChanges(); + regionManager.saveChanges(); return true; } catch ( StorageException e1) { - e1.printStackTrace(); return false; } } - public static boolean createRegion(String regionName, int xmin, int zmin, int xmax, int zmax, World world) { - - // Get instance of WorldGuard. - com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); - - // Get regions. - RegionContainer container = wg.getPlatform().getRegionContainer(); - RegionManager buildRegions = container.get(BukkitAdapter.adapt(world)); + public boolean createRegion(String regionName, int xmin, int zmin, int xmax, int zmax, String world) { - if (buildRegions == null) { + RegionManager regionManager = getRegionManager(world); - LOGGER.warning("RegionManager for world " + world.getName() + " is null!"); + if (regionManager == null) { return false; } ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName, BlockVector3.at(xmin, -512, zmin), BlockVector3.at(xmax, 1536, zmax)); - buildRegions.addRegion(region); + regionManager.addRegion(region); // Save the changes try { - buildRegions.saveChanges(); + regionManager.saveChanges(); return true; } catch (StorageException e1) { - e1.printStackTrace(); return false; } } + + private static RegionManager getRegionManager(String world) { + // Get an instance of WorldGuard. + com.sk89q.worldguard.WorldGuard wg = com.sk89q.worldguard.WorldGuard.getInstance(); + + World bukkitWorld = org.bukkit.Bukkit.getWorld(world); + + if (bukkitWorld == null) { + log.warning("World " + world + " does not exist!"); + return null; + } + + // Get regions. + RegionContainer container = wg.getPlatform().getRegionContainer(); + RegionManager regionManager = container.get(BukkitAdapter.adapt(bukkitWorld)); + + if (regionManager == null) { + log.warning("RegionManager for world " + world + " is null!"); + } + + return regionManager; + } + + private static ProtectedRegion getRegion(RegionManager regionManager, String regionName) { + + // Remove the group from the region. + ProtectedRegion buildRegion = regionManager.getRegion(regionName); + + if (buildRegion == null) { + log.warning("Region " + regionName + " does not exist!"); + } + + return buildRegion; + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java index 06c72378..b6df35ab 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java @@ -6,12 +6,12 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.RegionContainer; -import net.bteuk.network.exceptions.RegionManagerNotFoundException; +import lombok.extern.java.Log; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; import org.bukkit.World; import org.bukkit.entity.Player; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class WorldguardManager { private static WorldGuard instance; @@ -21,7 +21,7 @@ public class WorldguardManager { */ public static void setInstance() { instance = WorldGuard.getInstance(); - LOGGER.info("Set WorldGuard instance"); + log.info("Set WorldGuard instance"); } /** diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java index 0c2ee450..ef12ddf7 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java @@ -4,8 +4,8 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.managers.storage.StorageException; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import net.bteuk.network.exceptions.RegionManagerNotFoundException; -import net.bteuk.network.exceptions.RegionNotFoundException; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionNotFoundException; import org.bukkit.World; import org.bukkit.entity.Player; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java index a2d0ca92..b1592152 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java @@ -3,12 +3,8 @@ import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; -import net.bteuk.network.Network; -import net.bteuk.network.exceptions.RegionManagerNotFoundException; import net.bteuk.network.exceptions.RegionNotFoundException; -import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.math.Point; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; import org.bukkit.Location; import org.bukkit.World; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java index f301bbf8..d37954bf 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java @@ -6,7 +6,7 @@ import com.sk89q.worldguard.protection.managers.storage.StorageException; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; -import net.bteuk.network.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; import org.bukkit.World; public class WorldguardRegions { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java index 6a41f4c1..9d25fc24 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java @@ -6,8 +6,8 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import net.bteuk.network.exceptions.RegionManagerNotFoundException; import net.bteuk.network.exceptions.RegionNotFoundException; +import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; import org.bukkit.World; import org.bukkit.block.Block; diff --git a/Regions/pom.xml b/Regions/pom.xml new file mode 100644 index 00000000..524b95d0 --- /dev/null +++ b/Regions/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + net.bteuk + Network + 1.7.3 + + + net.bteuk.network + regions + + + + net.bteuk.network + core + + + net.bteuk.network + api + + + net.bteuk.network + papercore + + + + io.papermc.paper + paper-api + provided + + + \ No newline at end of file diff --git a/Regions/src/main/java/net/bteuk/network/regions/Inactivity.java b/Regions/src/main/java/net/bteuk/network/regions/Inactivity.java new file mode 100644 index 00000000..32acf8d9 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/Inactivity.java @@ -0,0 +1,4 @@ +package net.bteuk.network.regions; + +public record Inactivity(String regionName, String uuid) { +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/Region.java b/Regions/src/main/java/net/bteuk/network/regions/Region.java new file mode 100644 index 00000000..4cc26066 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/Region.java @@ -0,0 +1,29 @@ +package net.bteuk.network.regions; + +import java.util.Objects; + +public record Region(String regionName, int x, int z) { + + public boolean equals(int x, int z) { + return this.x == x && this.z == z; + } + + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (this == o) { + return true; + } + if (o instanceof String str) { + return str.equals(regionName); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(x, z); + } +} \ No newline at end of file diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java new file mode 100644 index 00000000..f8666968 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -0,0 +1,802 @@ +package net.bteuk.network.regions; + +import lombok.extern.java.Log; +import net.bteuk.network.api.ChatAPI; +import net.bteuk.network.api.CoordinateAPI; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.WorldGuardAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; +import net.bteuk.network.core.Time; +import net.bteuk.network.lib.dto.ChatMessage; +import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.enums.ChatChannels; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.regions.sql.RegionSQL; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +@Log +public class RegionManager { + + private final Map regions; + private final RegionSQL regionSQL; + private final SQLAPI globalSQL; + private final SQLAPI plotSQL; + private final ChatAPI chat; + private final CoordinateAPI coordinateAPI; + private final EventAPI eventAPI; + private final WorldGuardAPI worldGuard; + private final Constants constants; + + public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, SQLAPI plotSQL, ChatAPI chat, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, + Constants constants) { + regions = new HashMap<>(); + + this.regionSQL = regionSQL; + this.globalSQL = globalSQL; + this.plotSQL = plotSQL; + this.chat = chat; + this.coordinateAPI = coordinateAPI; + this.eventAPI = eventAPI; + this.worldGuard = worldGuard; + this.constants = constants; + } + + /** + * Get the region at a location. + * + * @param x region x + * @param z region z + * @return the {@link Region} + */ + public Region getRegion(int x, int z) { + return findRegion(x, z); + } + + // Get region at location. + public Region getRegion(double xCoordinate, double zCoordinate) { + // Get x and z of the region as int rounded down. + int x = (xCoordinate >= 0 ? (int) xCoordinate : ((int) xCoordinate) - 1) >> 9; + int z = (zCoordinate >= 0 ? (int) zCoordinate : ((int) zCoordinate) - 1) >> 9; + + return getRegion(x, z); + } + + // Get region at location with coordinate transform. + public Region getRegion(double xCoordinate, double zCoordinate, int dx, int dz) { + // Get x and z of the region as int rounded down with any necessary coordinate transforms. + int x = ((xCoordinate >= 0 ? (int) xCoordinate : ((int) xCoordinate) - 1) + dx) >> 9; + int z = ((zCoordinate >= 0 ? (int) zCoordinate : ((int) zCoordinate) - 1) + dz) >> 9; + + return getRegion(x, z); + } + + public Region getRegion(String region) throws NumberFormatException { + int x = Integer.parseInt(region.split(",")[0]); + int z = Integer.parseInt(region.split(",")[1]); + return findRegion(x, z); + } + + // Check whether the region exists in the database. + // This is mainly used to check whether guests can teleport there. + public boolean exists(String regionName) { + return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + regionName + "';")); + } + + private Region findRegion(int x, int z) { + String regionName = x + "," + z; + Region region = regions.get(regionName); + if (region == null) { + // Region does not exist, create it. + region = new Region(regionName, x, z); + regions.put(regionName, region); + } + return region; + } + + // Get the tag of the region for a specific player, or name if no tag is set. + public String getTag(Region region, String uuid) { + if (hasTag(region, uuid)) { + return regionSQL.getString( + "SELECT tag FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } else { + return region.regionName(); + } + } + + // Set the tag of the region for a specific player. + public void setTag(Region region, String uuid, String tag) { + regionSQL.update("UPDATE region_members SET tag='" + tag.replace("'", "\\'") + "' WHERE" + + " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Return whether the region has a tag for the specified uuid. + private boolean hasTag(Region region, String uuid) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND tag " + + "IS NOT NULL;")); + } + + // Return whether the player has this region pinned. + public boolean isPinned(Region region, String uuid) { + return regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + + "pinned=1;"); + } + + // Set the region to (un)pinned for a specific player. + public void setPinned(Region region, String uuid, boolean pin) { + regionSQL.update("UPDATE region_members SET pinned=" + (pin ? "1" : "0") + " WHERE " + + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Get the server of the region. + public String getServer(Region region) { + if (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + + "status='plot'")) { + // net.bteuk.network.regions.Region is on a plot server. + return (plotSQL.getString("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); + } else { + // net.bteuk.network.regions.Region is on earth server. + return (globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); + } + } + + // Return whether the uuid is the uuid of the region owner. + public boolean isOwner(Region region, String uuid) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + + "is_owner=1;")); + } + + // Return whether the uuid is the uuid of a region member. + public boolean isMember(Region region, String uuid) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + + "is_owner=0;")); + } + + // Return the region status. + public RegionStatus status(Region region) { + String status = + regionSQL.getString("SELECT status FROM regions WHERE region='" + region.regionName() + + "';"); + if (status == null) { + return RegionStatus.DEFAULT; + } else { + return (RegionStatus.valueOf(status.toUpperCase(Locale.ROOT))); + } + } + + // Return whether the region is claimable. + public boolean isClaimable(Region region) { + return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + + "AND (status='default' OR status='public' OR status='inactive');")); + } + + // Return whether the region has been claimed in the past. + public boolean wasClaimed(Region region) { + return (regionSQL.hasRow( + "SELECT region FROM region_logs WHERE region='" + region.regionName() + "' AND is_owner=1;")); + } + + // Set the region as inactive. + public void setInactive(Region region) { + regionSQL.update("UPDATE regions SET status='inactive' WHERE region='" + region.regionName() + + "';"); + } + + // Check if the region is in the plot system. + public boolean isPlot(Region region) { + return regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + + "AND status='plot';"); + } + + // Set the region to be for plots. + public void setPlot(Region region, ChatAPI chat) { + + // Kick members if exist. + for (String uuid : getMembers(region)) { + + // Send message to user. + // Is sent before actual removal so we can read the region tag. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", + getTag(region, uuid)), + true); + chat.sendSocketMessage(directMessage); + + // Leave region in database. + regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + + "uuid='" + uuid + "';"); + + // Close log of player in region. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Leave region in worldGuard. + worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); + } + + // Set region to plot. + regionSQL.update("UPDATE regions SET status='plot' WHERE region='" + region.regionName() + "';"); + log.info("Region " + region.regionName() + " set to plot status."); + } + + // Return whether the region has an owner. + public boolean hasOwner(Region region) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); + } + + // Return whether the region has an owner. + public boolean hasActiveOwner(Region region) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1 AND last_enter>=" + (Time.currentTime() - constants.regionInactivity()) + ";")); + } + + // Return whether the region has a member. + public boolean hasMember(Region region) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); + } + + // Return whether the region has an active member. + public boolean hasActiveMember(Region region, long time) { + return (regionSQL.hasRow( + "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 AND last_enter>=" + time + ";")); + } + + // Return the number of members, if any. + public int memberCount(Region region) { + return (regionSQL.getInt( + "SELECT COUNT(uuid) FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); + } + + // Return the uuid of the region owner, if exists. + public String getOwner(Region region) { + if (hasOwner(region)) { + return (regionSQL.getString( + "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); + } else { + return "null"; + } + } + + // Return the name of the region owner, if exists. + public String ownerName(Region region) { + if (hasOwner(region)) { + return (globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + getOwner(region) + "';")); + } else { + return "nobody"; + } + } + + // Return string array of member uuids. + public ArrayList getMembers(Region region) { + return regionSQL.getStringList( + "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "';"); + } + + // Get the coordinate id for the location the player has set. + public int getCoordinateID(Region region, String uuid) { + return regionSQL.getInt( + "SELECT coordinate_id FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Set the coordinate id for the location of the specified player. + public void setCoordinateID(Region region, String uuid, int id) { + regionSQL.update( + "UPDATE region_members SET coordinate_id=" + id + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Set the last enter time for the region. + public void setLastEnter(Region region, String uuid) { + regionSQL.update("UPDATE region_members SET last_enter=" + Time.currentTime() + " WHERE" + + " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Get the most recent member to enter the region. + public String getRecentMember(Region region) { + if (hasMember(region)) { + return regionSQL.getString( + "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 ORDER BY " + + "last_enter DESC;"); + } else { + return null; + } + } + + // Set the region to default. + public void setDefault(Region region) { + regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + + "';"); + } + + // Set the region to default. + public void setDefault(Region region, String removeRole) { + worldGuard.removeGroup(region.regionName(), removeRole, constants.earthWorld()); + regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + + "';"); + } + + // Set the region to public. + public void setPublic(Region region) { + regionSQL.update("UPDATE regions SET status='public' WHERE region='" + region.regionName() + "';"); + } + + // Set region to locked. + public void setLocked(Region region) { + + // Remove all members and the owner. + removeMembers(region, "The region %s has been locked, you can no longer build here.", false); + + // Set locked. + regionSQL.update("UPDATE regions SET status='locked' WHERE region='" + region.regionName() + "';"); + } + + // Set region to open. + public void setOpen(Region region) { + + // Remove all members and the owner. + removeMembers(region, "The region %s is now open, you no longer need to claim it to build here.", true); + + // Set open. + worldGuard.addGroup(region.regionName(), "jrbuilder", constants.earthWorld()); + regionSQL.update("UPDATE regions SET status='open' WHERE region='" + region.regionName() + "';"); + } + + // Check whether the region is in the database. + public boolean inDatabase(Region region) { + return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "';" + )); + } + + // Add the region to the database. + public void addToDatabase(Region region) { + // Check if it's not already in the database. + if (!inDatabase(region)) { + regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + + "'default');"); + + createWorldGuardRegion(region); + } + } + + // Add the region to the database for plotsystem. + public void addToPlotsystem(Region region) { + // Check if it's not already in the database. + if (!inDatabase(region)) { + regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + + "'plot');"); + + createWorldGuardRegion(region); + } + } + + private void createWorldGuardRegion(Region region) { + // Create region in worldguard. + worldGuard.createRegion(region.regionName(), Integer.parseInt(region.regionName().split(",")[0]) * 512, + Integer.parseInt(region.regionName().split(",")[1]) * 512, + Integer.parseInt(region.regionName().split(",")[0]) * 512 + 511, + Integer.parseInt(region.regionName().split(",")[1]) * 512 + 511, + constants.earthWorld()); + } + + // Check if this region has any requests. + public boolean hasRequests(Region region) { + return regionSQL.hasRow( + "SELECT region FROM region_requests WHERE region='" + region.regionName() + "';"); + } + + // Check if the player has already requested to join this region. + public boolean hasRequest(Region region, String uuid) { + return regionSQL.hasRow( + "SELECT region FROM region_requests WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Check if the specified player has been invited to this region. + public boolean hasInvite(Region region, String uuid) { + return regionSQL.hasRow( + "SELECT region FROM region_invites WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + } + + // Remove a region invite. + public void removeInvite(Region region, String uuid) { + regionSQL.update("DELETE FROM region_invites WHERE region='" + region.regionName() + "' AND " + + "uuid='" + uuid + "';"); + } + + // Accept any requests for this region. + public void acceptRequests(Region region) { + + // Get all requests for this region by uuid. + ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_requests " + + "WHERE region='" + region.regionName() + "';"); + int coordinate_id; + + // Add all users to the region. + for (String uuid : uuids) { + + // Get coordinate id from request. + coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Join region. + joinRegion(region, uuid, coordinate_id); + } + + // Clear all requests for the region. + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "';"); + } + + // Accept a request for a specific user. + public void acceptRequest(Region region, String uuid) { + + // Get the coordinate id for the request. + int coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Add them to the region. + joinRegion(region, uuid, coordinate_id); + + // Delete request. + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + + "uuid='" + uuid + "'; "); + } + + // Deny a request for a specific user. + public void denyRequest(Region region, String uuid) { + + // Delete the request. + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + + "uuid='" + uuid + "';"); + + // Send message to user. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("Your request to join region %s has been denied.", region.regionName()), + true); + chat.sendSocketMessage(directMessage); + } + + // Cancel a request for a specific player. + public void cancelRequest(Region region, Player player) { + + // Delete request. + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + + "uuid='" + player.getUniqueId() + "'; "); + + // Send message to player. + player.sendMessage(ChatUtils.success("Cancelled region join request.")); + } + + // Join region with owner or staff request. + // If staff request is true then it requires a staff request else it's an owner request. + public void requestRegion(Region region, Player player, boolean staffRequest) { + + // Check if you don't already have a request for this region. + if (hasRequest(region, player.getUniqueId().toString())) { + + player.sendMessage(ChatUtils.error("You have already requested to join this region.")); + player.sendMessage(ChatUtils.error("Check the request status in the region menu.")); + return; + } + + // Get coordinate of player. + int coordinate = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); + if (staffRequest) { + // Staff request + + // Create request. + regionSQL.update("INSERT INTO region_requests(region,uuid,owner,staff_accept," + + "coordinate_id) VALUES ('" + region.regionName() + "','" + + player.getUniqueId() + "','" + getOwner(region) + "',0," + coordinate + ");"); + + // Send message to player. + player.sendMessage(ChatUtils.success("Requested to join region ") + .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", awaiting staff review."))); + + ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", + ChatUtils.success("A region join request has been submitted by %s for region %s", + player.getName(), region.regionName())); + chat.sendSocketMessage(chatMessage); + } else { + // Owner request + + // Create request. + regionSQL.update("INSERT INTO region_requests(region,uuid,owner,owner_accept," + + "coordinate_id) VALUES ('" + region.regionName() + "','" + + player.getUniqueId() + "','" + getOwner(region) + "',0," + coordinate + ");"); + + // Send message to player. + player.sendMessage(ChatUtils.success("Requested to join region ") + .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", awaiting owner review."))); + + // Send the owner a message. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", + ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), + false); + chat.sendSocketMessage(directMessage); + } + } + + // Join region with no request. + public void joinRegion(Region region, Player player) { + + // If region is public then it must already have an owner. + if (status(region) == RegionStatus.PUBLIC) { + + // Add new coordinate at the location of the player. + int coordinateID = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); + + // Join region as member. + regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + + "VALUES('" + region.regionName() + "','" + + player.getUniqueId() + "'," + Time.currentTime() + "," + coordinateID + ");"); + + // Start log of player in region. + regionSQL.update( + "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + + player.getUniqueId() + "'," + Time.currentTime() + ");"); + + // Join region in worldGuard. + worldGuard.addMember(region.regionName(), player.getUniqueId().toString(), player.getWorld().getName()); + + player.sendMessage(ChatUtils.success("You have joined the region ") + .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" as a member."))); + } else { + + // If the region is inactive, demote the previous owner to a member. + if (status(region) == RegionStatus.INACTIVE) { + + String owner = getOwner(region); + + // Demote owner in database. + regionSQL.update( + "UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + + // Close log for owner. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + + "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + + // Open log for previous owner as member. + regionSQL.update( + "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + + owner + "'," + Time.currentTime() + ");"); + + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", + ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", + getTag(region, owner)), + true); + chat.sendSocketMessage(directMessage); + + // Set region to default, since it would've been set to inactive previously. + setDefault(region); + } + + // Add new coordinate at the location of the player. + int coordinateID = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); + + // Join region as owner. + regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + + "coordinate_id) VALUES('" + region.regionName() + "','" + + player.getUniqueId() + "',1," + Time.currentTime() + "," + coordinateID + ");"); + + // Start log of player in region. + regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + + "('" + region.regionName() + "','" + + player.getUniqueId() + "',1," + Time.currentTime() + ");"); + + // Join region in worldGuard. + worldGuard.addMember(region.regionName(), player.getUniqueId().toString(), player.getWorld().getName()); + + player.sendMessage(ChatUtils.success("You have joined the region ") + .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" as the owner."))); + } + } + + // Join region if we don't know whether the user is online. + public void joinRegion(Region region, String uuid, int coordinateID) { + + // If region has an owner join as member. + if (hasOwner(region)) { + + // Join region as member. + regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + + "VALUES('" + region.regionName() + "','" + + uuid + "'," + Time.currentTime() + "," + coordinateID + ");"); + + // Start log of player in region. + regionSQL.update( + "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + + uuid + "'," + Time.currentTime() + ");"); + + // Join region in worldGuard. + worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); + + // Send message to user. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("You have joined the region %s as a member.", region.regionName()), + true); + chat.sendSocketMessage(directMessage); + } else { + + // If the region is inactive, demote the previous owner to a member. + if (status(region) == RegionStatus.INACTIVE) { + + String owner = getOwner(region); + + // Demote owner in database. + regionSQL.update( + "UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + + // Close log for owner. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + + "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + + // Open log for previous owner as member. + regionSQL.update( + "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + + owner + "'," + Time.currentTime() + ");"); + + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", + ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", + getTag(region, owner)), + true); + chat.sendSocketMessage(directMessage); + } + + // Join region as owner. + regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + + "coordinate_id) VALUES('" + region.regionName() + "','" + + uuid + "',1," + Time.currentTime() + "," + coordinateID + ");"); + + // Start log of player in region. + regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + + "('" + region.regionName() + "','" + + uuid + "',1," + Time.currentTime() + ");"); + + // Join region in worldGuard. + worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); + + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("You have joined the region %s as the owner.", region.regionName()), + true); + chat.sendSocketMessage(directMessage); + } + } + + // Leave region. + public void leaveRegion(Region region, String uuid, Component message) { + + // Check if this is the correct server. + // If this is not the earth server then create a server-event. + if (constants.serverType() == ServerType.EARTH) { + + // Send message to user. + // Is sent before actual removal so we can read the region tag. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + message, true); + chat.sendSocketMessage(directMessage); + + // Leave region in database. + regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + + "uuid='" + uuid + "';"); + + // Close log of player in region. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Leave region in worldGuard. + worldGuard.removeMember(region.regionName(), uuid, constants.earthWorld()); + } else { + + eventAPI.createEvent(uuid, "network", globalSQL.getString("SELECT name " + + "FROM server_data WHERE type='EARTH';"), + "region leave " + region.regionName(), message); + } + } + + // Make the owner a member of the region. + public void makeMember(Region region) { + + // Get the owner. + String uuid = getOwner(region); + + // Close log of player as owner. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Open log of player as member. + regionSQL.update( + "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + + uuid + "'," + Time.currentTime() + ");"); + + // Update region member to set as member. + regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + + "' AND uuid='" + uuid + "';"); + } + + // Make a member the owner of the region. + public void makeOwner(Region region, String uuid) { + + // Check if they are a member. + if (isMember(region, uuid)) { + + // Close log of player as member. + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // Open log of player as owner. + regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + + "('" + region.regionName() + "','" + + uuid + "',1," + Time.currentTime() + ");"); + + // Update region member to set as owner. + regionSQL.update( + "UPDATE region_members SET is_owner=1 WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + + // If the region is currently set as inactive and the new owner isn't, set it to default. + if (status(region) == RegionStatus.INACTIVE && hasActiveOwner(region)) { + setDefault(region); + } + } + } + + // Update any region requests. + public void updateRequests(Region region) { + + // If the region has no owner, accept all requests. + // If there is an owner, update the owner row in the request. + if (hasOwner(region)) { + + regionSQL.update("UPDATE region_requests SET owner='" + getOwner(region) + "' WHERE " + + "region='" + region.regionName() + "';"); + } else { + + acceptRequests(region); + } + } + + // Remove all members and owner of the region. + // The placeholder %tag% is used in the message to show the region tag. + public void removeMembers(Region region, String message, boolean success) { + + if (hasOwner(region) || hasMember(region)) { + + // Get all members. + ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_members " + + "WHERE region='" + region.regionName() + "';"); + + for (String uuid : uuids) { + leaveRegion(region, uuid, success ? ChatUtils.success(message, getTag(region, uuid)) : ChatUtils.error(message, + getTag(region, uuid))); + } + } + } + + // Get time that a region member was last in this region. + public long lastActive(Region region, String uuid) { + return (regionSQL.getLong( + "SELECT last_enter FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';")); + } + + // Check if the player can build in this region. + public boolean canBuild(Region region, Player p) { + return ((status(region) == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) || isOwner(region, p.getUniqueId().toString()) || isMember(region, + p.getUniqueId().toString())); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionMember.java b/Regions/src/main/java/net/bteuk/network/regions/RegionMember.java similarity index 89% rename from Plugin/src/main/java/net/bteuk/network/utils/regions/RegionMember.java rename to Regions/src/main/java/net/bteuk/network/regions/RegionMember.java index 970d2f16..86049500 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/regions/RegionMember.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionMember.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.regions; +package net.bteuk.network.regions; /** * Representation of an entry in the region_members table. diff --git a/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java b/Regions/src/main/java/net/bteuk/network/regions/RegionStatus.java similarity index 87% rename from Plugin/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java rename to Regions/src/main/java/net/bteuk/network/regions/RegionStatus.java index 42ac6ad5..1bcbd8f7 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionStatus.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionStatus.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.enums; +package net.bteuk.network.regions; public enum RegionStatus { DEFAULT("Default"), diff --git a/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionType.java b/Regions/src/main/java/net/bteuk/network/regions/RegionType.java similarity index 82% rename from Plugin/src/main/java/net/bteuk/network/utils/enums/RegionType.java rename to Regions/src/main/java/net/bteuk/network/regions/RegionType.java index f9c8dc40..a7d0bd3f 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/enums/RegionType.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionType.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.enums; +package net.bteuk.network.regions; public enum RegionType { REGION("Region"), diff --git a/Plugin/src/main/java/net/bteuk/network/utils/regions/Request.java b/Regions/src/main/java/net/bteuk/network/regions/Request.java similarity index 83% rename from Plugin/src/main/java/net/bteuk/network/utils/regions/Request.java rename to Regions/src/main/java/net/bteuk/network/regions/Request.java index 4f5f4bf6..8b2bb973 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/regions/Request.java +++ b/Regions/src/main/java/net/bteuk/network/regions/Request.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.regions; +package net.bteuk.network.regions; public class Request { diff --git a/Regions/src/main/java/net/bteuk/network/regions/sql/RegionSQL.java b/Regions/src/main/java/net/bteuk/network/regions/sql/RegionSQL.java new file mode 100644 index 00000000..16e67469 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/sql/RegionSQL.java @@ -0,0 +1,84 @@ +package net.bteuk.network.regions.sql; + +import lombok.extern.java.Log; +import net.bteuk.network.core.sql.AbstractSQL; +import net.bteuk.network.regions.Inactivity; +import net.bteuk.network.regions.RegionMember; +import net.bteuk.network.regions.Request; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@Log +public class RegionSQL extends AbstractSQL { + + public RegionSQL(DataSource datasource) { + super(datasource); + } + + public ArrayList getRequestList(String sql) { + + ArrayList list = new ArrayList<>(); + + try ( + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() + ) { + + while (results.next()) { + + list.add(new Request(results.getString(1), results.getString(2))); + } + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + + return list; + } + + public ArrayList getInactives(String sql) { + + ArrayList list = new ArrayList<>(); + + try ( + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement(sql); ResultSet results = statement.executeQuery() + ) { + + while (results.next()) { + list.add(new Inactivity(results.getString(1), results.getString(2))); + } + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + + return list; + } + + public List getRegionMembers(String uuid) { + + List list = new ArrayList<>(); + + try ( + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( + "SELECT region,uuid,is_owner,last_enter,tag," + "coordinate_id,pinned FROM region_members WHERE uuid=? ORDER BY pinned DESC, is_owner DESC, " + "region ASC") + ) { + + statement.setString(1, uuid); + ResultSet results = statement.executeQuery(); + + while (results.next()) { + list.add(new RegionMember(results.getString(1), results.getString(2), results.getBoolean(3), results.getLong(4), results.getString(5), results.getInt(6), + results.getBoolean(7))); + } + } catch (SQLException e) { + log.severe(String.format("An error occurred while fetching the region_members entries for " + "%s", uuid)); + } + return list; + } +} diff --git a/pom.xml b/pom.xml index 943498aa..56d03f92 100644 --- a/pom.xml +++ b/pom.xml @@ -12,5 +12,83 @@ Network-API Plugin + Regions + Core + PaperCore + + + 21 + ${java-version} + + 1.21.4-R0.1-SNAPSHOT + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + jitpack.io + https://jitpack.io + + + sk89q-repo + https://maven.enginehub.org/repo/ + + + DaPorkchop_ + https://maven.daporkchop.net/ + + + OpenCollab Snapshots + https://repo.opencollab.dev/snapshot/ + + + dmulloy2-repo + https://repo.dmulloy2.net/repository/public/ + + + codemc-repo + https://repo.codemc.io/repository/maven-public/ + default + + + + + + + net.bteuk.network + core + ${project.version} + + + net.bteuk.network + api + ${project.version} + + + net.bteuk.network + papercore + ${project.version} + + + net.bteuk.network + regions + ${project.version} + + + + io.papermc.paper + paper-api + ${paper.api.version} + provided + + + From ff7d818f7444db4b441a80f4f076c7d807d2b565 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 16 Aug 2025 12:37:50 +0200 Subject: [PATCH 03/96] Started splitting movement listener in network and region, reworked config to allow for standalone server. --- .../net/bteuk/network/core/Constants.java | 4 +- .../java/net/bteuk/network/core/Location.java | 4 - .../java/net/bteuk/network/api/PlotAPI.java | 8 + .../java/net/bteuk/network/api/ServerAPI.java | 9 + .../network/api/entity/NetworkPlayer.java | 13 + .../network/papercore/NetworkPlayerImpl.java | 29 ++ .../network/papercore/PlayerAdapter.java | 11 + .../main/java/net/bteuk/network/Network.java | 52 +++- .../bteuk/network/api/impl/PlotAPIImpl.java | 22 +- .../global_teleport/MoveListener.java | 261 ------------------ .../bteuk/network/utils/NetworkConfig.java | 24 +- .../net/bteuk/network/utils/SwitchServer.java | 48 ++-- Plugin/src/main/resources/config.yml | 52 ++-- .../bteuk/network/regions/RegionManager.java | 28 +- .../net/bteuk/network/regions/RegionUser.java | 46 +++ .../regions/listener/RegionMoveListener.java | 257 +++++++++++++++++ .../regions/listener/ServerJoinListener.java | 4 + .../regions/listener/ServerQuitListener.java | 4 + .../regions/listener}/TeleportListener.java | 2 +- 19 files changed, 534 insertions(+), 344 deletions(-) delete mode 100644 Core/src/main/java/net/bteuk/network/core/Location.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/ServerAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/entity/NetworkPlayer.java create mode 100644 PaperCore/src/main/java/net/bteuk/network/papercore/NetworkPlayerImpl.java create mode 100644 PaperCore/src/main/java/net/bteuk/network/papercore/PlayerAdapter.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/RegionUser.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java rename {Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport => Regions/src/main/java/net/bteuk/network/regions/listener}/TeleportListener.java (99%) diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index cd598c80..b5dffb28 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -2,6 +2,6 @@ import java.util.List; -public record Constants(String serverName, ServerType serverType, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, int maxY, int minY, String earthWorld, boolean customMessages, +public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, - boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent) { } + boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled) { } diff --git a/Core/src/main/java/net/bteuk/network/core/Location.java b/Core/src/main/java/net/bteuk/network/core/Location.java deleted file mode 100644 index 7cc2c86f..00000000 --- a/Core/src/main/java/net/bteuk/network/core/Location.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.bteuk.network.core; - -public record Location() { -} diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 8b44872c..a1b17f03 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -80,4 +80,12 @@ public interface PlotAPI { int createVerification(int reviewId, String verifier, boolean acceptedOld, boolean acceptedNew); boolean savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookIdOld, int bookIdNew); + + String getRegionLocation(String regionName); + + String getRegionServer(String regionName); + + int getXTransform(String location); + + int getZTransform(String location); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/ServerAPI.java b/Network-API/src/main/java/net/bteuk/network/api/ServerAPI.java new file mode 100644 index 00000000..70ca0adc --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/ServerAPI.java @@ -0,0 +1,9 @@ +package net.bteuk.network.api; + +import net.bteuk.network.api.entity.NetworkPlayer; + +public interface ServerAPI { + + void switchServer(NetworkPlayer player, String server); + +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkPlayer.java b/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkPlayer.java new file mode 100644 index 00000000..0cd143d2 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/entity/NetworkPlayer.java @@ -0,0 +1,13 @@ +package net.bteuk.network.api.entity; + +import net.kyori.adventure.text.Component; + +public interface NetworkPlayer { + + String getUuidAsString(); + + String getName(); + + void sendMessage(Component message); + +} diff --git a/PaperCore/src/main/java/net/bteuk/network/papercore/NetworkPlayerImpl.java b/PaperCore/src/main/java/net/bteuk/network/papercore/NetworkPlayerImpl.java new file mode 100644 index 00000000..c3339229 --- /dev/null +++ b/PaperCore/src/main/java/net/bteuk/network/papercore/NetworkPlayerImpl.java @@ -0,0 +1,29 @@ +package net.bteuk.network.papercore; + +import net.bteuk.network.api.entity.NetworkPlayer; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +public class NetworkPlayerImpl implements NetworkPlayer { + + private final Player player; + + public NetworkPlayerImpl(Player player) { + this.player = player; + } + + @Override + public String getUuidAsString() { + return player.getUniqueId().toString(); + } + + @Override + public String getName() { + return player.getName(); + } + + @Override + public void sendMessage(Component message) { + player.sendMessage(message); + } +} diff --git a/PaperCore/src/main/java/net/bteuk/network/papercore/PlayerAdapter.java b/PaperCore/src/main/java/net/bteuk/network/papercore/PlayerAdapter.java new file mode 100644 index 00000000..d4cffe0c --- /dev/null +++ b/PaperCore/src/main/java/net/bteuk/network/papercore/PlayerAdapter.java @@ -0,0 +1,11 @@ +package net.bteuk.network.papercore; + +import net.bteuk.network.api.entity.NetworkPlayer; +import org.bukkit.entity.Player; + +public class PlayerAdapter { + + public static NetworkPlayer adapt(Player player) { + return new NetworkPlayerImpl(player); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index b80b64dd..23828ba0 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -5,6 +5,7 @@ import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.NetworkAPI; import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.WorldGuardAPI; import net.bteuk.network.api.impl.CoordinateAPIImpl; import net.bteuk.network.api.impl.PlotAPIImpl; @@ -24,8 +25,6 @@ import net.bteuk.network.eventing.listeners.GuiListener; import net.bteuk.network.eventing.listeners.PlayerInteract; import net.bteuk.network.eventing.listeners.PreJoinServer; -import net.bteuk.network.eventing.listeners.global_teleport.MoveListener; -import net.bteuk.network.eventing.listeners.global_teleport.TeleportListener; import net.bteuk.network.gui.NavigatorGui; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.OnlineUserAdd; @@ -35,12 +34,15 @@ import net.bteuk.network.lobby.Lobby; import net.bteuk.network.logging.BukkitForwardingHandler; import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.listener.RegionMoveListener; +import net.bteuk.network.regions.listener.TeleportListener; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkConfig; import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Tips; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.worldguard.WorldGuard; @@ -80,7 +82,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { public ItemStack navigator; public RegionSQL regionSQL; // Movement listeners. - public MoveListener moveListener; + public RegionMoveListener moveListener; public TeleportListener teleportListener; // Return an instance of the regionManager. // RegionManager @@ -141,7 +143,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { @Getter private DBConnection tutorialsDBConnection; - @Getter private PlotAPI plotAPI; private CoordinateAPI coordinateAPI; @@ -152,6 +153,8 @@ public final class Network extends JavaPlugin implements NetworkAPI { private Constants constants; + private ServerAPI serverAPI; + @Override public void onEnable() { @@ -207,14 +210,18 @@ public void onEnable() { globalSQL = new GlobalSQL(global_dataSource); // Region Database - String region_database = CONFIG.getString("database.region"); - DataSource region_dataSource = init.mysqlSetup(region_database, host, port, username, password); - regionSQL = new RegionSQL(region_dataSource); + if (constants.regionsEnabled()) { + String region_database = CONFIG.getString("database.region"); + DataSource region_dataSource = init.mysqlSetup(region_database, host, port, username, password); + regionSQL = new RegionSQL(region_dataSource); + } // Plot Database - String plot_database = CONFIG.getString("database.plot"); - DataSource plot_dataSource = init.mysqlSetup(plot_database, host, port, username, password); - plotSQL = new PlotSQL(plot_dataSource); + if (constants.plotSystemEnabled()) { + String plot_database = CONFIG.getString("database.plot"); + DataSource plot_dataSource = init.mysqlSetup(plot_database, host, port, username, password); + plotSQL = new PlotSQL(plot_dataSource); + } } catch (SQLException | RuntimeException e) { getLogger().severe("Failed to connect to the database, please check that you have set the config values " + "correctly."); @@ -277,11 +284,18 @@ public void enablePlugin() { networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); - plotAPI = new PlotAPIImpl(plotSQL); coordinateAPI = new CoordinateAPIImpl(globalSQL); eventManager = new EventManager(globalSQL); worldGuardAPI = new WorldGuard(); + if (!constants.standalone()) { + serverAPI = new SwitchServer(constants); + } + + if (constants.plotSystemEnabled()) { + plotAPI = new PlotAPIImpl(plotSQL); + } + // Enable tab. tab = new TabManager(this); @@ -302,13 +316,14 @@ public void enablePlugin() { new GuiListener(this); new PlayerInteract(this); - // Create regionManager if enabled. + // Create the region manager if enabled. if (constants.regionsEnabled()) { - regionManager = new RegionManager(regionSQL, globalSQL, plotSQL, chat, coordinateAPI, eventManager, worldGuardAPI, constants); + regionManager = new RegionManager(regionSQL, globalSQL, plotAPI, chat, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); } - moveListener = new MoveListener(this); - teleportListener = new TeleportListener(this); + // TODO: Implement network move and teleport listener. + //moveListener = new RegionMoveListener(this); + //teleportListener = new TeleportListener(this); // Setup Timers timers = new Timers(this, globalSQL, eventManager); @@ -488,4 +503,11 @@ public boolean hasPlayer(String uuid) { } return false; } + + public PlotAPI getPlotAPI() { + if (plotAPI == null) { + throw new IllegalStateException("The plot system is not enabled"); + } + return plotAPI; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 59909607..20be817a 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -33,7 +33,6 @@ public List getActivePlots(String serverName) { @Override public boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform) { - return false; } @@ -181,4 +180,25 @@ public int createVerification(int reviewId, String verifier, boolean acceptedOld public boolean savePlotVerificationCategory(int verificationId, String category, String selectionOld, String selectionNew, int bookIdOld, int bookIdNew) { return plotSQL.savePlotVerificationCategory(verificationId, category, selectionOld, selectionNew, bookIdOld, bookIdNew); } + + @Override + public String getRegionLocation(String regionName) { + return plotSQL.getString("SELECT location FROM regions WHERE region='" + regionName + "';"); + } + + @Override + public String getRegionServer(String regionName) { + return plotSQL.getString("SELECT server FROM regions WHERE region='" + regionName + "';"); + } + + @Override + public int getXTransform(String location) { + return plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + location + "';"); + + } + + @Override + public int getZTransform(String location) { + return plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + location + "';"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java deleted file mode 100644 index f2572b7f..00000000 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/MoveListener.java +++ /dev/null @@ -1,261 +0,0 @@ -package net.bteuk.network.eventing.listeners.global_teleport; - -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.Time; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionManager; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; - -import static net.bteuk.network.commands.Afk.updateAfkStatus; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - -public class MoveListener implements Listener { - - private final boolean teleportEnabled; - - private final RegionManager regionManager; - private final PlotSQL plotSQL; - private boolean blocked; - - public MoveListener(Network instance) { - - Bukkit.getServer().getPluginManager().registerEvents(this, instance); - - teleportEnabled = CONFIG.getBoolean("global_teleport"); - - regionManager = instance.getRegionManager(); - - blocked = false; - - plotSQL = instance.getPlotSQL(); - } - - public void block() { - blocked = true; - } - - @EventHandler - public void onPlayerMove(PlayerMoveEvent e) { - - if (blocked) { - e.setCancelled(true); - return; - } - - Player p = e.getPlayer(); - NetworkUser user = Network.getInstance().getUser(p); - - // If u is null, cancel. - if (user == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); - p.sendMessage(ChatUtils.error("User can not be found, please relog!")); - e.setCancelled(true); - return; - } - - // Cancel event if player is switching server. - if (user.switching) { - e.setCancelled(true); - return; - } - - // Reset last movement of player, if they're afk unset that. - user.last_movement = Time.currentTime(); - - if (user.afk) { - user.afk = false; - updateAfkStatus(user, false); - } - - // If regions are enabled, check for movement between regions. - // If the player is currently not in a region then that implies they are in a world without regions, so - // movement will not effect this. - // Not being in a region also means that region is null. - if (REGIONS_ENABLED && user.inRegion) { - - // Get x and z of the region as int rounded down with any necessary coordinate transforms. - int x = ((e.getTo().getX() >= 0 ? (int) e.getTo().getX() : ((int) e.getTo().getX()) - 1) + user.dx) >> 9; - int z = ((e.getTo().getZ() >= 0 ? (int) e.getTo().getZ() : ((int) e.getTo().getZ()) - 1) + user.dz) >> 9; - - // Check if the player has moved to another region. - if (!user.region.equals(x, z)) { - - // Get new region. - Region region = regionManager.getRegion(x, z); - - // Check if the new region is on this server or not. - if (!user.region.getServer().equals(region.getServer())) { - - // If cross-server teleport is enabled teleport them to the correct server and location. - if (teleportEnabled) { - - // Check if the player can enter the region. - if (region.inDatabase() || p.hasPermission("group.jrbuilder")) { - - // If the server is offline, notify the player. - if (Network.getInstance().getGlobalSQL().getBoolean("SELECT online FROM server_data WHERE" + - " name='" + region.getServer() + "';")) { - - // Add region to database if not exists. - region.addToDatabase(); - - // Region is on another server, teleport them accordingly. - // If the new region is on a plot server, check for coordinate transform. - if (region.status() == RegionStatus.PLOT) { - - // Get server and world of region. - String location = - plotSQL.getString( - "SELECT location FROM regions WHERE region='" + region.regionName() + "';"); - - int xTransform = plotSQL.getInt("SELECT xTransform FROM location_data WHERE " + - "name='" + location + "';"); - int zTransform = plotSQL.getInt("SELECT zTransform FROM location_data WHERE " + - "name='" + location + "';"); - - // Set join event to teleport there. - EventManager.createJoinEvent(user.player.getUniqueId().toString(), "network", - "teleport " + - location + " " + (e.getTo().getX() + xTransform) + " " + (e.getTo() - .getZ() + zTransform) + " " + e.getTo().getYaw() + " " + e.getTo() - .getPitch()); - } else { - - // Set join event to teleport there. - EventManager.createJoinEvent(user.player.getUniqueId().toString(), "network", - "teleport " + - EARTH_WORLD + " " + (e.getTo().getX() + user.dx) + " " + (e.getTo() - .getZ() + user.dz) + " " + e.getTo().getYaw() + " " + e.getTo() - .getPitch()); - } - - // Switch server. - e.setCancelled(true); - SwitchServer.switchServer(user.player, region.getServer()); - } else { - - p.sendMessage(ChatUtils.error("This region is on another server, however the server " + - "is currently offline.")); - } - } else { - - // You can't enter this region. - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you " + - "must be at least Jr.Builder to load new terrain.")); - } - } else { - - // Cancel movement as the location is on another server. - p.sendMessage(ChatUtils.error("The terrain for this location is on another server, you may " + - "not enter.")); - } - e.setCancelled(true); - } else { - - // Check if the player can enter the region. - if (region.inDatabase() || p.hasPermission("group.jrbuilder")) { - - // Add region to database if not exists. - region.addToDatabase(); - - // If the player is the region owner update last enter and tell set the message. - if (region.isOwner(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are the owner of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, set it to active. - if (region.status() == RegionStatus.INACTIVE) { - region.setDefault(); - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + - "set back to default settings.")); - } - - // Check if the player is a region members. - } else if (region.isMember(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are a member of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, make this member to owner. - if (region.status() == RegionStatus.INACTIVE) { - // Make the previous owner a member. - region.makeMember(); - - // Give the new player ownership. - region.makeOwner(p.getUniqueId().toString()); - - // Update any requests to take into account the new region owner. - region.updateRequests(); - - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + - "set back to default settings.")); - p.sendMessage(ChatUtils.success("You have been made the new region owner.")); - } - - // Check if the region is open and the player is at least jr.builder. - } else if (region.status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you can build in this region."))); - } else { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA))); - } - - // Update the region the player is in. - user.region = region; - } else { - - // You can't enter this region. - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you must " + - "be at least Jr.Builder to load new terrain.")); - e.setCancelled(true); - } - } - } - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 891d865a..9a5a82d8 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -2,6 +2,7 @@ import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import org.bukkit.configuration.file.FileConfiguration; @@ -35,7 +36,7 @@ private String configVersion() { private String latestVersion() { String version = Objects.requireNonNull(CONFIG.getDefaults()).getString("version"); // If null return default. - return Objects.requireNonNullElse(version, "1.4.4"); + return Objects.requireNonNullElse(version, "1.8.0"); } // Update config if the version is outdated. @@ -100,19 +101,20 @@ public net.bteuk.network.core.Constants getConstants() { // Set the server type from config. ServerType serverType = ServerType.valueOf(CONFIG.getString("server_type")); - boolean regionsEnabled = CONFIG.getBoolean("regions_enabled"); + // Basically indicates that this server is not running in a network. + boolean standalone = CONFIG.getBoolean("standalone"); + + boolean regionsEnabled = CONFIG.getBoolean("regions.enabled"); // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds - long regionInactivity = CONFIG.getInt("region_inactivity") * 24L * 60L * 60L * 1000L; + long regionInactivity = CONFIG.getInt("region.inactivity_days") * 24L * 60L * 60L * 1000L; boolean tpllEnabled = CONFIG.getBoolean("tpll.enabled"); int maxY = CONFIG.getInt("tpll.max_y"); int minY = CONFIG.getInt("tpll.min_y"); - boolean customMessages = CONFIG.getBoolean("chat.custom_messages.enabled"); - - boolean staffChat = CONFIG.getBoolean("staff.staff_chat.enabled"); + boolean staffChat = CONFIG.getBoolean("staff.chat.enabled"); boolean tips = CONFIG.getBoolean("chat.tips.enabled"); @@ -145,15 +147,17 @@ public net.bteuk.network.core.Constants getConstants() { String motdText = CONFIG.getString("motd.text", ""); String earthWorld; - if (CONFIG.getString("earth_world") == null) { + if (CONFIG.getString("regions.earth_world") == null) { // Setting default value. earthWorld = "earth"; } else { - earthWorld = CONFIG.getString("earth_world"); + earthWorld = CONFIG.getString("regions.earth_world"); } - return new net.bteuk.network.core.Constants(serverName, serverType, regionsEnabled, regionInactivity, tpllEnabled, maxY, minY, earthWorld, customMessages, staffChat, tips, + boolean plotSystemEnabled = CONFIG.getBoolean("plot_system.enabled"); + + return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText); + motdText, plotSystemEnabled); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index b7ed2ae9..6da2b992 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -4,63 +4,73 @@ import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkPlayer; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.dto.SwitchServerEvent; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.utils.ChatUtils; import org.bukkit.entity.Player; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.SERVER_NAME; +import java.util.Optional; -public class SwitchServer { +@Log +public class SwitchServer implements ServerAPI { - public static void switchServer(Player p, String server) { + private final Constants constants; - NetworkUser user = Network.getInstance().getUser(p); + public SwitchServer(Constants constants) { + this.constants = constants; + } + + public void switchServer(NetworkPlayer player, String server) { + + Optional user = Network.getInstance().getNetworkUserByUuid(player.getUuidAsString()); // If u is null, cancel. - if (user == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); - p.sendMessage(ChatUtils.error("User can not be found, please relog!")); + if (user.isEmpty()) { + log.severe("User " + player.getName() + " can not be found!"); + player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } - // If server is null, cancel and notify player. + // If the server is null, cancel and notify the player. if (server == null) { - p.sendMessage(ChatUtils.error("An error occured, server does not exist.")); + player.sendMessage(ChatUtils.error("An error occurred, server does not exist.")); Network.getInstance().getLogger().warning("Player attempting to switch to non-existing server."); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + p.getUniqueId() + + Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; } - // Check if server exists and is online. + // Check if the server exists and is online. if (!Network.getInstance().getGlobalSQL().hasRow("SELECT name FROM server_data WHERE name='" + server + "';")) { - p.sendMessage(ChatUtils.error("The server " + server + " does not exist.")); + player.sendMessage(ChatUtils.error("The server " + server + " does not exist.")); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + p.getUniqueId() + + Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; } else if (Network.getInstance().getGlobalSQL() .hasRow("SELECT online FROM server_data WHERE name='" + server + "' AND online=0;")) { - p.sendMessage(ChatUtils.error("The server " + server + " is currently offline.")); + player.sendMessage(ChatUtils.error("The server " + server + " is currently offline.")); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + p.getUniqueId() + + Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; } // Set switching to true in user. - user.switching = true; + user.get().switching = true; // Send switch server event to the proxy. - UserDisconnect userDisconnect = user.createDisconnectEvent(); - SwitchServerEvent switchServerEvent = new SwitchServerEvent(p.getUniqueId().toString(), server, SERVER_NAME, + UserDisconnect userDisconnect = user.get().createDisconnectEvent(); + SwitchServerEvent switchServerEvent = new SwitchServerEvent(player.getUuidAsString(), server, constants.serverName(), userDisconnect); Network.getInstance().getChat().sendSocketMessage(switchServerEvent); } diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 8b768d18..35f52f58 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Config version, do not update this manually as it could break the config. -version: 1.7.3 +version: 1.8.0 #MySQL is mandatory for this plugin. #Login information @@ -16,9 +16,12 @@ database: #Server configuration #Server types: PLOT, EARTH, LOBBY, TUTORIAL +#If you are running this server standalone, then keep this as 'EARTH'. +#Standalone implies that this is the only server in your network. enabled: false server_name: server_name server_type: EARTH +standalone: false #Lobby info, only necessary if server type is LOBBY. spawn: @@ -43,7 +46,7 @@ map: #Staff features staff: - staff_chat: + chat: enabled: true moderation: enabled: true @@ -75,6 +78,8 @@ homes: #Chat Settings chat: + #The socket configuration is only necessary if running the server as part of a network + #Else, it will be ignored (if standalone=true) socket: input: port: 30590 @@ -102,36 +107,39 @@ tpll: max_y: 1360 #Enable regions and cross-server teleport. -#Regions must be enabled for cross-server teleport to function. +#Regions must be enabled for cross-server teleport to function (if standalone=false). #Earth world must be specified on all servers as it is used to determine cross-server tpll to the earth server. -#To make sure the player is teleported to the correct world if multiple exist. -regions_enabled: true -global_teleport: true -earth_world: earth +#To make sure the player is teleported to the correct world. +regions: + enabled: true + earth_world: earth + + #Number of days a region owner can be inactive before they are demoted to member. + #If the region has no other members, then the owner does not get demoted by the region becomes 'inactive'. + inactivity_days: 30 + + #When staff approval is needed for Jr.Builder region requests. + #These values are only relevant if regions are enabled. + #Always means that staff approval is always required. + #Radius is the square radius around the region that is checked when determining whether staff approval is necessary. + #If someone else owns a region in this radius, staff approval will be needed. + #If you want to disable this entirely, set the radius to 0. + staff_request: + always: false + radius: 5 + +#Whether the server network has a plot system server. +plot_system_enabled: true #Should /ll be enabled. ll_enabled: true -#Time before player is set to AFK (minutes). +#Time before the player is set to AFK (minutes). afk: 5 #Radius to search in the nearby locations tab of the exploration menu, distance in kilometres. navigation_radius: 200 -#When staff approval is needed for Jr.Builder region requests. -#These values are only relevant if regions are enabled. -#Always means that staff approval is always required. -#Radius is the square radius around the region that is checked when determining whether staff approval is necessary. -#If a region in this radius is owned by someone else staff approval will be needed. -#If you want to disable this entirely, set the radius to 0. -staff_request: - always: false - radius: 5 - -#Number of days a region owner can be inactive before they are demoted to member. -#If the region has no other members then the owner does not get demoted by the region becomes 'inactive'. -region_inactivity: 30 - #Discord link discord: 'https://discord.gg/5m56EgEVW6' diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index f8666968..aff38069 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -4,7 +4,9 @@ import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.WorldGuardAPI; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; @@ -14,13 +16,16 @@ import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.regions.listener.RegionMoveListener; import net.bteuk.network.regions.sql.RegionSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -30,25 +35,33 @@ public class RegionManager { private final Map regions; private final RegionSQL regionSQL; private final SQLAPI globalSQL; - private final SQLAPI plotSQL; + private final PlotAPI plotAPI; private final ChatAPI chat; private final CoordinateAPI coordinateAPI; private final EventAPI eventAPI; private final WorldGuardAPI worldGuard; private final Constants constants; - public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, SQLAPI plotSQL, ChatAPI chat, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, - Constants constants) { + private List users = new ArrayList<>(); + + public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, PlotAPI plotAPI, ChatAPI chat, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, + Constants constants, JavaPlugin plugin, ServerAPI serverAPI) { regions = new HashMap<>(); this.regionSQL = regionSQL; this.globalSQL = globalSQL; - this.plotSQL = plotSQL; + this.plotAPI = plotAPI; this.chat = chat; this.coordinateAPI = coordinateAPI; this.eventAPI = eventAPI; this.worldGuard = worldGuard; this.constants = constants; + + new RegionMoveListener(plugin, this, plotAPI, constants, globalSQL, eventAPI, serverAPI); + } + + public RegionUser getUserByPlayer(Player player) { + return users.stream().filter(user -> user.getPlayer().equals(player)).findFirst().orElse(null); } /** @@ -143,10 +156,8 @@ public void setPinned(Region region, String uuid, boolean pin) { public String getServer(Region region) { if (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + "status='plot'")) { - // net.bteuk.network.regions.Region is on a plot server. - return (plotSQL.getString("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); + return (plotAPI.getRegionServer("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); } else { - // net.bteuk.network.regions.Region is on earth server. return (globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); } } @@ -357,8 +368,7 @@ public void setOpen(Region region) { // Check whether the region is in the database. public boolean inDatabase(Region region) { - return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "';" - )); + return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "';")); } // Add the region to the database. diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java new file mode 100644 index 00000000..7e42adb7 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -0,0 +1,46 @@ +package net.bteuk.network.regions; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Player; + +public class RegionUser { + + @Getter + private final Player player; + + // The region that the player was last known to be in. + @Setter + @Getter + private Region trackedRegion; + + // Coordinate transformation in the x direction, relevant in the plot system. + @Getter + int deltaX; + + // Coordinate transformation in the z direction, relevant in the plot system. + @Getter + int deltaZ; + + public RegionUser(Player player) { + this.player = player; + } + + public boolean hasTrackedRegion() { + return trackedRegion != null; + } + + @Override + public boolean equals(Object o) { + if (o instanceof RegionUser u) { + return u.player.equals(player); + } else { + return false; + } + } + + @Override + public int hashCode() { + return player.hashCode(); + } +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java new file mode 100644 index 00000000..dd1c56e1 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -0,0 +1,257 @@ +package net.bteuk.network.regions.listener; + +import lombok.extern.java.Log; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionStatus; +import net.bteuk.network.regions.RegionUser; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.plugin.java.JavaPlugin; + +@Log +public class RegionMoveListener implements Listener { + + private final RegionManager regionManager; + private final PlotAPI plotAPI; + + private final Constants constants; + + private final SQLAPI globalSQL; + + private final EventAPI eventAPI; + + private final ServerAPI serverAPI; + + private boolean blocked; + + public RegionMoveListener(JavaPlugin plugin, RegionManager regionManager, PlotAPI plotAPI, Constants constants, SQLAPI globalSQL, EventAPI eventAPI, ServerAPI serverAPI) { + + Bukkit.getServer().getPluginManager().registerEvents(this, plugin); + + this.regionManager = regionManager; + this.plotAPI = plotAPI; + this.constants = constants; + this.globalSQL = globalSQL; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + + blocked = false; + } + + public void block() { + blocked = true; + } + + @EventHandler + public void onPlayerMove(PlayerMoveEvent e) { + + // TODO: Move to other listener instance. + if (blocked) { + e.setCancelled(true); + return; + } + + // If u is null, cancel. + // TODO: Move to other listener instance. + if (user == null) { + LOGGER.severe("User " + p.getName() + " can not be found!"); + p.sendMessage(ChatUtils.error("User can not be found, please relog!")); + e.setCancelled(true); + return; + } + + // Cancel event if player is switching server. + // TODO: Move to other listener instance. + if (user.switching) { + e.setCancelled(true); + return; + } + + // Reset last movement of player, if they're afk unset that. + // TODO: Move ot other listener instance. + user.last_movement = Time.currentTime(); + if (user.afk) { + user.afk = false; + Afk.updateAfkStatus(user, false); + } + + // If the movement event is already cancelled, skipt his entirely. + if (e.isCancelled()) { + return; + } + + RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (regionUser == null) { + log.severe("Region user is null for player " + e.getPlayer().getName()); + return; + } + + // If regions are enabled, check for movement between regions. + // If the player is currently not in a region then that implies they are in a world without regions, so + // movement will not effect this. + // Not being in a region also means that region is null. + if (constants.regionsEnabled() && regionUser.hasTrackedRegion()) { + + // Get x and z of the region as int rounded down with any necessary coordinate transforms. + int x = ((e.getTo().getX() >= 0 ? (int) e.getTo().getX() : ((int) e.getTo().getX()) - 1) + regionUser.getDeltaX()) >> 9; + int z = ((e.getTo().getZ() >= 0 ? (int) e.getTo().getZ() : ((int) e.getTo().getZ()) - 1) + regionUser.getDeltaZ()) >> 9; + + // Check if the player has moved to another region. + if (!regionUser.getTrackedRegion().equals(x, z)) { + + // Get the new region. + Region region = regionManager.getRegion(x, z); + + // Check if the player can enter the region. + if (regionManager.inDatabase(region) || regionUser.getPlayer().hasPermission("uknet.regions.generate")) { + e.setCancelled(!switchRegion(regionUser, region, e.getTo())); + } else { + // You can't enter this region. + e.setCancelled(true); + regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this region has not been generated, you " + + "do not have permission load new terrain.")); + } + } + } + } + + private boolean switchRegion(RegionUser regionUser, Region newRegion, Location newLocation) { + + // Check if the new region is on this server or not. + if (!regionManager.getServer(regionUser.getTrackedRegion()).equals(regionManager.getServer(newRegion))) { + + // If cross-server teleport is enabled teleport them to the correct server and location. + if (constants.standalone()) { + // Cancel movement as the location is on another server, but the server doesn't support multiple servers. + regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this location is on another server, you may " + + "not enter.")); + return false; + } else { + // If the server is offline, notify the player. + if (globalSQL.hasRow("SELECT 1 FROM server_data WHERE online=1 AND name='" + regionManager.getServer(newRegion) + "';")) { + + // Add the region to the database if not exists. + regionManager.addToDatabase(newRegion); + + // Region is on another server, teleport them accordingly. + // If the new region is on a plot server, check for coordinate transform. + String world = constants.earthWorld(); + int xTransform = regionUser.getDeltaX(); + int zTransform = regionUser.getDeltaZ(); + if (regionManager.status(newRegion) == RegionStatus.PLOT) { + // Get server and world of the region. + String location = plotAPI.getRegionLocation(newRegion.regionName()); + + xTransform = plotAPI.getXTransform(location); + zTransform = plotAPI.getZTransform(location); + + world = location; + } + + // Set join event to teleport there. + eventAPI.createJoinEvent(regionUser.getPlayer().getUniqueId().toString(), "network", + "teleport " + world + " " + " " + (newLocation.getX() + xTransform) + " " + (newLocation.getZ() + zTransform) + " " + newLocation.getYaw() + " " + newLocation.getPitch()); + + // Switch server. + serverAPI.switchServer(PlayerAdapter.adapt(regionUser.getPlayer()), regionManager.getServer(newRegion)); + return false; + } else { + regionUser.getPlayer().sendMessage(ChatUtils.error("This region is on another server, however the server is currently offline.")); + } + } + } else { + + // Add the region to the database if not exists. + regionManager.addToDatabase(newRegion); + + // If the player is the region owner update last enter and tell set the message. + if (region.isOwner(p.getUniqueId().toString())) { + + p.sendActionBar( + ChatUtils.success("You have entered ") + .append(Component.text(region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" and left ")) + .append(Component.text(user.region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", you are the owner of this region."))); + region.setLastEnter(p.getUniqueId().toString()); + + // If the region is inactive, set it to active. + if (region.status() == RegionStatus.INACTIVE) { + region.setDefault(); + p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + + "set back to default settings.")); + } + + // Check if the player is a region members. + } else if (region.isMember(p.getUniqueId().toString())) { + + p.sendActionBar( + ChatUtils.success("You have entered ") + .append(Component.text(region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" and left ")) + .append(Component.text(user.region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", you are a member of this region."))); + region.setLastEnter(p.getUniqueId().toString()); + + // If the region is inactive, make this member to owner. + if (region.status() == RegionStatus.INACTIVE) { + // Make the previous owner a member. + region.makeMember(); + + // Give the new player ownership. + region.makeOwner(p.getUniqueId().toString()); + + // Update any requests to take into account the new region owner. + region.updateRequests(); + + p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + + "set back to default settings.")); + p.sendMessage(ChatUtils.success("You have been made the new region owner.")); + } + + // Check if the region is open and the player is at least jr.builder. + } else if (region.status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) { + + p.sendActionBar( + ChatUtils.success("You have entered ") + .append(Component.text(region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" and left ")) + .append(Component.text(user.region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", you can build in this region."))); + } else { + + // Send default enter message. + p.sendActionBar( + ChatUtils.success("You have entered ") + .append(Component.text(region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" and left ")) + .append(Component.text(user.region.getTag(p.getUniqueId().toString()), + NamedTextColor.DARK_AQUA))); + } + + // Update the region the player is in. + user.region = region; + return true; + } + } +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java new file mode 100644 index 00000000..10500277 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java @@ -0,0 +1,4 @@ +package net.bteuk.network.regions.listener; + +public class ServerJoinListener { +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java new file mode 100644 index 00000000..1b43e771 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java @@ -0,0 +1,4 @@ +package net.bteuk.network.regions.listener; + +public class ServerQuitListener { +} diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java similarity index 99% rename from Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java rename to Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java index c83679e9..b2da40d8 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/global_teleport/TeleportListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java @@ -1,4 +1,4 @@ -package net.bteuk.network.eventing.listeners.global_teleport; +package net.bteuk.network.regions.listener; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; From 0eb59eafec9cc421bbda60d3f0f0334d04b48835 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 24 Aug 2025 21:45:03 +0200 Subject: [PATCH 04/96] Split the movement and teleport listener, region code is completely separate and runs after the main network checks. --- .../java/net/bteuk/network/api/PlotAPI.java | 2 + .../java/net/bteuk/network/CustomChat.java | 4 +- .../main/java/net/bteuk/network/Network.java | 61 ++-- .../main/java/net/bteuk/network/Timers.java | 4 +- .../bteuk/network/api/impl/PlotAPIImpl.java | 5 + .../java/net/bteuk/network/commands/Afk.java | 16 +- .../eventing/listeners/CommandPreProcess.java | 4 +- .../network/eventing/listeners/Connect.java | 4 +- .../listeners/NetworkMoveListener.java | 68 ++++ .../listeners/NetworkTeleportListener.java | 65 ++++ .../net/bteuk/network/utils/NetworkUser.java | 11 +- .../net/bteuk/network/utils/SwitchServer.java | 2 +- .../bteuk/network/regions/RegionManager.java | 2 + .../net/bteuk/network/regions/RegionUser.java | 2 + .../listener/AbstractMoveListener.java | 130 +++++++ .../regions/listener/RegionMoveListener.java | 178 ++------- .../listener/RegionTeleportListener.java | 78 ++++ .../regions/listener/TeleportListener.java | 337 ------------------ 18 files changed, 435 insertions(+), 538 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkMoveListener.java create mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java delete mode 100644 Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index a1b17f03..c4a53057 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -88,4 +88,6 @@ public interface PlotAPI { int getXTransform(String location); int getZTransform(String location); + + boolean hasLocation(String location); } diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index bf43c2da..c925b952 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -164,8 +164,8 @@ public void onPlayerChatEvent(AsyncChatEvent e) { // Reset last movement of player, if they're afk unset that. user.last_movement = Time.currentTime(); - if (user.afk) { - user.afk = false; + if (user.isAfk()) { + user.setAfk(false); updateAfkStatus(user, false); } ChatMessage chatMessage = getChatMessage(e.message(), user); diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 23828ba0..7fb08a00 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -35,7 +35,7 @@ import net.bteuk.network.logging.BukkitForwardingHandler; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.listener.RegionMoveListener; -import net.bteuk.network.regions.listener.TeleportListener; +import net.bteuk.network.regions.listener.RegionTeleportListener; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; import net.bteuk.network.sql.GlobalSQL; @@ -83,7 +83,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { public RegionSQL regionSQL; // Movement listeners. public RegionMoveListener moveListener; - public TeleportListener teleportListener; + public RegionTeleportListener teleportListener; // Return an instance of the regionManager. // RegionManager @Getter @@ -329,30 +329,33 @@ public void enablePlugin() { timers = new Timers(this, globalSQL, eventManager); timers.startTimers(); - // Setup the lobby, most features are only enabled in the lobby server. - lobby = new Lobby(this); - // Create the rules book. - lobby.loadRules(); - if (constants.serverType() == ServerType.LOBBY) { + // Set up the lobby, most features are only enabled in the lobby server. + if (!constants.standalone()) { + lobby = new Lobby(this); + // Create the rules book. + lobby.loadRules(); + if (constants.serverType() == ServerType.LOBBY) { - // Set spawn location and enable auto-spawn teleport when falling in the void. - lobby.setSpawn(); - lobby.enableVoidTeleport(); + // Set spawn location and enable auto-spawn teleport when falling in the void. + lobby.setSpawn(); + lobby.enableVoidTeleport(); - lobby.reloadPortals(); + lobby.reloadPortals(); - // Set the rules lectern. - lobby.setLectern(); - } + // Set the rules lectern. + lobby.setLectern(); + } - // Set up the map. - lobby.reloadMap(); + // Set up the map. + lobby.reloadMap(); + } // Enable commands if (constants.tpllEnabled()) { TerraConfig.reducedConsoleMessages = true; tpll = new Tpll(instance, CONFIG.getBoolean("requires_permission")); } + kick = new Kick(); mute = new Mute(); unmute = new Unmute(); @@ -369,20 +372,22 @@ public void enablePlugin() { new Tips(); } - // Create default season if not exists. + // Create a default season if not exists. if (!globalSQL.hasRow("SELECT id FROM seasons WHERE id='default';")) { globalSQL.update("INSERT INTO seasons(id,active) VALUES('default',1);"); } - // Register Promotion Service. - try { - Class.forName("net.bteuk.teachingtutorials.services.PromotionService"); - PromotionService promotionService = new NetworkPromotionService(); - this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, - ServicePriority.High); - log.info("Registered Network Promotion Service"); - } catch (ClassNotFoundException e) { - // Only load the PromotionService if the class exists. + // Register Promotion Service for tutorials. + if (constants.tutorials()) { + try { + Class.forName("net.bteuk.teachingtutorials.services.PromotionService"); + PromotionService promotionService = new NetworkPromotionService(); + this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, + ServicePriority.High); + log.info("Registered Network Promotion Service"); + } catch (ClassNotFoundException e) { + // Only load the PromotionService if the class exists. + } } // Let the Proxy know that the server is enabled. @@ -429,9 +434,9 @@ public void onDisable() { "UUID='" + uuid + "';"); // Reset last logged time. - if (u.afk) { + if (u.isAfk()) { u.last_movement = Time.currentTime(); - u.afk = false; + u.setAfk(false); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 6c4324dc..874bdc04 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -118,10 +118,10 @@ public void startTimers() { } // Check if the player is afk. - if (user.last_movement < (time - afk) && !user.afk) { + if (user.last_movement < (time - afk) && !user.isAfk()) { // Set player as AFK - user.afk = true; + user.setAfk(true); // Send message to chat and discord. updateAfkStatus(user, true); diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 20be817a..2357066b 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -201,4 +201,9 @@ public int getXTransform(String location) { public int getZTransform(String location) { return plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + location + "';"); } + + @Override + public boolean hasLocation(String location) { + return plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + location + "';"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index 92b6b64c..c5cf5516 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -1,19 +1,19 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Time; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class Afk extends AbstractCommand { - public static void updateAfkStatus(NetworkUser user, boolean afk) { + public void updateAfkStatus(NetworkUser user, boolean afk) { // Broadcast the afk message and send a user update event. Network.getInstance().getChat().broadcastAFK(user.player, afk); @@ -37,19 +37,19 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } // Switch afk status. - if (user.afk) { + if (user.isAfk()) { // Reset last logged time. user.last_movement = Time.currentTime(); - user.afk = false; + user.setAfk(false); updateAfkStatus(user, false); } else { - user.afk = true; + user.setAfk(true); updateAfkStatus(user, true); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index 9c7cd27a..73d7b518 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -51,8 +51,8 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { } user.last_movement = Time.currentTime(); - if (user.afk) { - user.afk = false; + if (user.isAfk()) { + user.setAfk(false); updateAfkStatus(user, false); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index a7a72d5c..b2daf85c 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -160,9 +160,9 @@ public void leaveServerEvent(PlayerQuitEvent e) { } // Reset last logged time. - if (user.afk) { + if (user.isAfk()) { user.last_movement = Time.currentTime(); - user.afk = false; + user.setAfk(false); } // If the companion is enabled, disable it. diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkMoveListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkMoveListener.java new file mode 100644 index 00000000..0dbb430b --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkMoveListener.java @@ -0,0 +1,68 @@ +package net.bteuk.network.eventing.listeners; + +import lombok.extern.java.Log; +import net.bteuk.network.Network; +import net.bteuk.network.commands.Afk; +import net.bteuk.network.core.Time; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.NetworkUser; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +@Log +public class NetworkMoveListener implements Listener { + + private final Network instance; + + private final Afk afk; + + private boolean blocked; + + public NetworkMoveListener(Network plugin, Afk afk) { + + Bukkit.getServer().getPluginManager().registerEvents(this, plugin); + + this.instance = plugin; + this.afk = afk; + + blocked = false; + } + + public void block() { + blocked = true; + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerMove(PlayerMoveEvent e) { + + if (blocked) { + e.setCancelled(true); + return; + } + + // If u is null, cancel. + NetworkUser user = instance.getUser(e.getPlayer()); + if (user == null) { + log.severe("User " + e.getPlayer().getName() + " can not be found!"); + e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); + e.setCancelled(true); + return; + } + + // Cancel event if player is switching server. + if (user.isSwitching()) { + e.setCancelled(true); + return; + } + + // Reset last movement of player, if they're afk unset that. + user.last_movement = Time.currentTime(); + if (user.isAfk()) { + user.setAfk(false); + afk.updateAfkStatus(user, false); + } + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java new file mode 100644 index 00000000..11d2033e --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java @@ -0,0 +1,65 @@ +package net.bteuk.network.eventing.listeners; + +import lombok.extern.java.Log; +import net.bteuk.network.Network; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.NetworkUser; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerTeleportEvent; + +@Log +public class NetworkTeleportListener implements Listener { + + private boolean blocked; + + public NetworkTeleportListener(Network instance) { + + Bukkit.getServer().getPluginManager().registerEvents(this, instance); + + blocked = false; + } + + public void block() { + blocked = true; + } + + @Deprecated + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerTeleport(PlayerTeleportEvent e) { + + if (blocked || e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) { + e.setCancelled(true); + if (e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) { + e.getPlayer().sendMessage(ChatUtils.error("Teleporting via the spectator menu is disabled, please use" + + " /tp ")); + } + return; + } + + Player p = e.getPlayer(); + NetworkUser u = Network.getInstance().getUser(p); + + // If u is null, cancel. + if (u == null) { + log.severe("User " + p.getName() + " can not be found!"); + p.sendMessage(ChatUtils.error("User can not be found, please relog!")); + e.setCancelled(true); + return; + } + + // Cancel event if player is switching server. + if (u.isSwitching()) { + e.setCancelled(true); + return; + } + + // If the building companion is enabled, check if the player changed to a different world. + if (u.getCompanion() != null) { + u.getCompanion().checkChangeWorld(e.getTo().getWorld()); + } + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 5880abf3..075088f4 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -53,9 +53,13 @@ public class NetworkUser { public int dx; public int dz; // If the player is switching server. - public boolean switching; + @Getter + @Setter + private boolean switching; // If the player is afk. - public boolean afk; + @Setter + @Getter + private boolean afk; public long last_movement; // If linked to discord. public boolean isLinked; @@ -119,7 +123,7 @@ public NetworkUser(Player player, UserConnectReply reply) { switching = false; inPortal = false; wasInPortal = false; - afk = false; + setAfk(false); last_movement = Time.currentTime(); primaryRole = Roles.getPrimaryRole(player); @@ -371,4 +375,5 @@ private void showPlayers() { } }); } + } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 6da2b992..59fd8a5a 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -66,7 +66,7 @@ public void switchServer(NetworkPlayer player, String server) { } // Set switching to true in user. - user.get().switching = true; + user.get().setSwitching(true); // Send switch server event to the proxy. UserDisconnect userDisconnect = user.get().createDisconnectEvent(); diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index aff38069..19012944 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -17,6 +17,7 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.papercore.LocationAdapter; import net.bteuk.network.regions.listener.RegionMoveListener; +import net.bteuk.network.regions.listener.RegionTeleportListener; import net.bteuk.network.regions.sql.RegionSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -58,6 +59,7 @@ public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, PlotAPI plotAPI, Cha this.constants = constants; new RegionMoveListener(plugin, this, plotAPI, constants, globalSQL, eventAPI, serverAPI); + new RegionTeleportListener(plugin, this, constants, plotAPI); } public RegionUser getUserByPlayer(Player player) { diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java index 7e42adb7..9db83b17 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -16,10 +16,12 @@ public class RegionUser { // Coordinate transformation in the x direction, relevant in the plot system. @Getter + @Setter int deltaX; // Coordinate transformation in the z direction, relevant in the plot system. @Getter + @Setter int deltaZ; public RegionUser(Player player) { diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java new file mode 100644 index 00000000..f615a6de --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java @@ -0,0 +1,130 @@ +package net.bteuk.network.regions.listener; + +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionStatus; +import net.bteuk.network.regions.RegionUser; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +public abstract class AbstractMoveListener { + + protected final RegionManager regionManager; + + protected AbstractMoveListener(RegionManager regionManager) { + this.regionManager = regionManager; + } + + /** + * Switch the user from one region to another. + * + * @param regionUser the region user + * @param newRegion the region the player is moving to + * @return boolean whether to cancel the movement event + */ + protected boolean switchRegion(RegionUser regionUser, Region newRegion) { + + // Implies that the user has left their current region. + if (newRegion == null) { + // Send default leave message. + regionUser.getPlayer().sendActionBar( + ChatUtils.success("You have left ") + .append(Component.text(regionManager.getTag(regionUser.getTrackedRegion(), regionUser.getPlayer().getUniqueId().toString()), NamedTextColor.DARK_AQUA))); + + // Set inRegion to false. + regionUser.setTrackedRegion(null); + return false; + } + + // Check if the player can enter the region. + if (regionManager.inDatabase(newRegion) || regionUser.getPlayer().hasPermission("uknet.regions.generate")) { + // Add the region to the database if not exists. + regionManager.addToDatabase(newRegion); + + // If the player is the region owner update last enter and send the message. + if (regionManager.isOwner(newRegion, regionUser.getPlayer().getUniqueId().toString())) { + + sendRegionOwnerEnterMessage(regionUser, newRegion); + regionManager.setLastEnter(newRegion, regionUser.getPlayer().getUniqueId().toString()); + + // If the region is inactive, set it to active. + if (regionManager.status(newRegion) == RegionStatus.INACTIVE) { + regionManager.setDefault(newRegion); + regionUser.getPlayer().sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + + "set back to default settings.")); + } + + // Check if the player is a region member. + } else if (regionManager.isMember(newRegion, regionUser.getPlayer().getUniqueId().toString())) { + + sendRegionMemberEnterMessage(regionUser, newRegion); + regionManager.setLastEnter(newRegion, regionUser.getPlayer().getUniqueId().toString()); + + // If the region is inactive, make this member to owner. + if (regionManager.status(newRegion) == RegionStatus.INACTIVE) { + // Make the previous owner a member. + regionManager.makeMember(newRegion); + + // Give the new player ownership. + regionManager.makeOwner(newRegion, regionUser.getPlayer().getUniqueId().toString()); + + // Update any requests to take into account the new region owner. + regionManager.updateRequests(newRegion); + + regionUser.getPlayer().sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + + "set back to default settings.")); + regionUser.getPlayer().sendMessage(ChatUtils.success("You have been made the new region owner.")); + } + + // Check if the region is open and the player is at least jr.builder. + } else if (regionManager.status(newRegion) == RegionStatus.OPEN && regionUser.getPlayer().hasPermission("group.jrbuilder")) { + sendOpenRegionEnterMessage(regionUser, newRegion); + } else { + + // Send the default region entered message. + sendDefaultRegionEnterMessage(regionUser, newRegion); + } + + // Update the region the player is in. + regionUser.setTrackedRegion(newRegion); + return false; + } else { + + // You can't enter this region. + regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this region has not been generated, " + + "you do not have permission to load new terrain.")); + return true; + } + } + + private void sendRegionOwnerEnterMessage(RegionUser regionUser, Region newRegion) { + Component message = getEnteredMessage(regionUser, newRegion); + message = message.append(ChatUtils.success(", you are the owner of this region.")); + regionUser.getPlayer().sendActionBar(message); + } + + private void sendRegionMemberEnterMessage(RegionUser regionUser, Region newRegion) { + Component message = getEnteredMessage(regionUser, newRegion); + message = message.append(ChatUtils.success(", you are a member of this region.")); + regionUser.getPlayer().sendActionBar(message); + } + + private void sendOpenRegionEnterMessage(RegionUser regionUser, Region newRegion) { + Component message = getEnteredMessage(regionUser, newRegion); + message = message.append(ChatUtils.success(", you can build in this region.")); + regionUser.getPlayer().sendActionBar(message); + } + + private void sendDefaultRegionEnterMessage(RegionUser regionUser, Region newRegion) { + regionUser.getPlayer().sendActionBar(getEnteredMessage(regionUser, newRegion)); + } + + private Component getEnteredMessage(RegionUser regionUser, Region newRegion) { + Component message = ChatUtils.success("You have entered ").append(Component.text(regionManager.getTag(newRegion, regionUser.getPlayer().getUniqueId().toString()), NamedTextColor.DARK_AQUA)); + if (regionUser.hasTrackedRegion()) { + message = message.append(ChatUtils.success(" and left ").append(Component.text(regionManager.getTag(regionUser.getTrackedRegion(), regionUser.getPlayer().getUniqueId().toString()), NamedTextColor.DARK_AQUA))); + } + return message; + } +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index dd1c56e1..43aa4d68 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -12,19 +12,16 @@ import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.RegionStatus; import net.bteuk.network.regions.RegionUser; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.plugin.java.JavaPlugin; @Log -public class RegionMoveListener implements Listener { - - private final RegionManager regionManager; +public class RegionMoveListener extends AbstractMoveListener implements Listener { private final PlotAPI plotAPI; private final Constants constants; @@ -35,75 +32,32 @@ public class RegionMoveListener implements Listener { private final ServerAPI serverAPI; - private boolean blocked; - public RegionMoveListener(JavaPlugin plugin, RegionManager regionManager, PlotAPI plotAPI, Constants constants, SQLAPI globalSQL, EventAPI eventAPI, ServerAPI serverAPI) { + super(regionManager); Bukkit.getServer().getPluginManager().registerEvents(this, plugin); - this.regionManager = regionManager; this.plotAPI = plotAPI; this.constants = constants; this.globalSQL = globalSQL; this.eventAPI = eventAPI; this.serverAPI = serverAPI; - - blocked = false; } - public void block() { - blocked = true; - } - - @EventHandler + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent e) { - // TODO: Move to other listener instance. - if (blocked) { - e.setCancelled(true); - return; - } - - // If u is null, cancel. - // TODO: Move to other listener instance. - if (user == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); - p.sendMessage(ChatUtils.error("User can not be found, please relog!")); - e.setCancelled(true); - return; - } - - // Cancel event if player is switching server. - // TODO: Move to other listener instance. - if (user.switching) { - e.setCancelled(true); - return; - } - - // Reset last movement of player, if they're afk unset that. - // TODO: Move ot other listener instance. - user.last_movement = Time.currentTime(); - if (user.afk) { - user.afk = false; - Afk.updateAfkStatus(user, false); - } - - // If the movement event is already cancelled, skipt his entirely. - if (e.isCancelled()) { - return; - } - RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); if (regionUser == null) { log.severe("Region user is null for player " + e.getPlayer().getName()); return; } - // If regions are enabled, check for movement between regions. - // If the player is currently not in a region then that implies they are in a world without regions, so - // movement will not effect this. - // Not being in a region also means that region is null. - if (constants.regionsEnabled() && regionUser.hasTrackedRegion()) { + // Check for movement between regions. + // If the player is currently not in a region, then that implies they are in a world without regions, so + // movement will not affect this. + // Not being in a region also means that the region is null. + if (regionUser.hasTrackedRegion()) { // Get x and z of the region as int rounded down with any necessary coordinate transforms. int x = ((e.getTo().getX() >= 0 ? (int) e.getTo().getX() : ((int) e.getTo().getX()) - 1) + regionUser.getDeltaX()) >> 9; @@ -115,45 +69,40 @@ public void onPlayerMove(PlayerMoveEvent e) { // Get the new region. Region region = regionManager.getRegion(x, z); - // Check if the player can enter the region. - if (regionManager.inDatabase(region) || regionUser.getPlayer().hasPermission("uknet.regions.generate")) { - e.setCancelled(!switchRegion(regionUser, region, e.getTo())); - } else { - // You can't enter this region. + // Check if the new region is on this server or not. + if (!regionManager.getServer(regionUser.getTrackedRegion()).equals(regionManager.getServer(region))) { + switchServer(regionUser, region, e.getTo()); e.setCancelled(true); - regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this region has not been generated, you " + - "do not have permission load new terrain.")); + } else { + e.setCancelled(switchRegion(regionUser, region)); } } } } - private boolean switchRegion(RegionUser regionUser, Region newRegion, Location newLocation) { - - // Check if the new region is on this server or not. - if (!regionManager.getServer(regionUser.getTrackedRegion()).equals(regionManager.getServer(newRegion))) { - + private void switchServer(RegionUser regionUser, Region region, Location newLocation) { + // Check if the player can enter the region. + if (regionManager.inDatabase(region) || regionUser.getPlayer().hasPermission("uknet.regions.generate")) { // If cross-server teleport is enabled teleport them to the correct server and location. if (constants.standalone()) { // Cancel movement as the location is on another server, but the server doesn't support multiple servers. regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this location is on another server, you may " + "not enter.")); - return false; } else { // If the server is offline, notify the player. - if (globalSQL.hasRow("SELECT 1 FROM server_data WHERE online=1 AND name='" + regionManager.getServer(newRegion) + "';")) { + if (globalSQL.hasRow("SELECT 1 FROM server_data WHERE online=1 AND name='" + regionManager.getServer(region) + "';")) { // Add the region to the database if not exists. - regionManager.addToDatabase(newRegion); + regionManager.addToDatabase(region); // Region is on another server, teleport them accordingly. // If the new region is on a plot server, check for coordinate transform. String world = constants.earthWorld(); int xTransform = regionUser.getDeltaX(); int zTransform = regionUser.getDeltaZ(); - if (regionManager.status(newRegion) == RegionStatus.PLOT) { + if (regionManager.status(region) == RegionStatus.PLOT) { // Get server and world of the region. - String location = plotAPI.getRegionLocation(newRegion.regionName()); + String location = plotAPI.getRegionLocation(region.regionName()); xTransform = plotAPI.getXTransform(location); zTransform = plotAPI.getZTransform(location); @@ -166,92 +115,15 @@ private boolean switchRegion(RegionUser regionUser, Region newRegion, Location n "teleport " + world + " " + " " + (newLocation.getX() + xTransform) + " " + (newLocation.getZ() + zTransform) + " " + newLocation.getYaw() + " " + newLocation.getPitch()); // Switch server. - serverAPI.switchServer(PlayerAdapter.adapt(regionUser.getPlayer()), regionManager.getServer(newRegion)); - return false; + serverAPI.switchServer(PlayerAdapter.adapt(regionUser.getPlayer()), regionManager.getServer(region)); } else { regionUser.getPlayer().sendMessage(ChatUtils.error("This region is on another server, however the server is currently offline.")); } } } else { - - // Add the region to the database if not exists. - regionManager.addToDatabase(newRegion); - - // If the player is the region owner update last enter and tell set the message. - if (region.isOwner(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are the owner of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, set it to active. - if (region.status() == RegionStatus.INACTIVE) { - region.setDefault(); - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + - "set back to default settings.")); - } - - // Check if the player is a region members. - } else if (region.isMember(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are a member of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, make this member to owner. - if (region.status() == RegionStatus.INACTIVE) { - // Make the previous owner a member. - region.makeMember(); - - // Give the new player ownership. - region.makeOwner(p.getUniqueId().toString()); - - // Update any requests to take into account the new region owner. - region.updateRequests(); - - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has been " + - "set back to default settings.")); - p.sendMessage(ChatUtils.success("You have been made the new region owner.")); - } - - // Check if the region is open and the player is at least jr.builder. - } else if (region.status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you can build in this region."))); - } else { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(user.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA))); - } - - // Update the region the player is in. - user.region = region; - return true; + // You can't enter this region. + regionUser.getPlayer().sendMessage(ChatUtils.error("The terrain for this region has not been generated, you " + + "do not have permission load new terrain.")); } } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java new file mode 100644 index 00000000..2bba91e1 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java @@ -0,0 +1,78 @@ +package net.bteuk.network.regions.listener; + +import lombok.extern.java.Log; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionUser; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.Objects; + +import static net.bteuk.network.core.ServerType.EARTH; +import static net.bteuk.network.core.ServerType.PLOT; + +@Log +public class RegionTeleportListener extends AbstractMoveListener implements Listener { + + private final Constants constants; + + private final PlotAPI plotAPI; + + public RegionTeleportListener(JavaPlugin instance, RegionManager regionManager, Constants constants, PlotAPI plotAPI) { + super(regionManager); + + Bukkit.getServer().getPluginManager().registerEvents(this, instance); + + this.constants = constants; + this.plotAPI = plotAPI; + } + + @Deprecated + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent e) { + + RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (regionUser == null) { + log.severe("Region user is null for player " + e.getPlayer().getName()); + return; + } + + Region newRegion = getRegion(regionUser, e.getTo()); + + if (Objects.equals(newRegion, regionUser.getTrackedRegion())) { + e.setCancelled(switchRegion(regionUser, newRegion)); + } + } + + private Region getRegion(RegionUser regionUser, Location location) { + Region region = null; + if (constants.serverType() == EARTH) { + if (location.getWorld().getName().equals(constants.earthWorld())) { + // Get region. + region = regionManager.getRegion(location.getX(), location.getZ()); + } + } else if (constants.serverType() == PLOT) { + // Check if the player is teleporting to a buildable world in the plot system. + if (plotAPI.hasLocation(location.getWorld().getName())) { + + // Get negative coordinate transform of new location. + int deltaX = -plotAPI.getXTransform(location.getWorld().getName()); + int deltaZ = -plotAPI.getZTransform(location.getWorld().getName()); + + regionUser.setDeltaX(deltaX); + regionUser.setDeltaZ(deltaZ); + + // Get the region with coordinate transformation. + region = regionManager.getRegion(location.getX() + deltaX, location.getZ() + deltaZ); + } + } + return region; + } +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java deleted file mode 100644 index b2da40d8..00000000 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/TeleportListener.java +++ /dev/null @@ -1,337 +0,0 @@ -package net.bteuk.network.regions.listener; - -import net.bteuk.network.Network; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionManager; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerTeleportEvent; - -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.enums.ServerType.EARTH; - -public class TeleportListener implements Listener { - - private final RegionManager regionManager; - private final PlotSQL plotSQL; - private boolean blocked; - - public TeleportListener(Network instance) { - - Bukkit.getServer().getPluginManager().registerEvents(this, instance); - - regionManager = instance.getRegionManager(); - - blocked = false; - - plotSQL = instance.getPlotSQL(); - } - - public void block() { - blocked = true; - } - - @Deprecated - @EventHandler - public void onPlayerTeleport(PlayerTeleportEvent e) { - - if (blocked || e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) { - e.setCancelled(true); - if (e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) { - e.getPlayer().sendMessage(ChatUtils.error("Teleporting via the spectator menu is disabled, please use" + - " /tp ")); - } - return; - } - - Player p = e.getPlayer(); - NetworkUser u = Network.getInstance().getUser(p); - - // If u is null, cancel. - if (u == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); - p.sendMessage(ChatUtils.error("User can not be found, please relog!")); - e.setCancelled(true); - return; - } - - // Cancel event if player is switching server. - if (u.switching) { - e.setCancelled(true); - return; - } - - // If building companion is enabled, check if the player changed world. - if (u.getCompanion() != null) { - u.getCompanion().checkChangeWorld(e.getTo().getWorld()); - } - - // If regions are enabled, check for movement between regions. - if (REGIONS_ENABLED) { - - // Check whether the player is teleporting to a server and world that uses regions. - // If the player is on the earth server check if they are teleporting to the earth world. - if (SERVER_TYPE == EARTH) { - if (e.getTo().getWorld().getName().equals(EARTH_WORLD)) { - - // Get region. - Region region = regionManager.getRegion(e.getTo()); - - // Player is teleport to earth world on earth server. - // Check if are teleporting to a new region, if currently in one. - if (u.inRegion) { - - // If the regions are not equal - if (!u.region.equals(region)) { - - // Check if the player can enter the region. - if (region.inDatabase() || p.hasPermission("group.jrbuilder")) { - - // Add region to database if not exists. - region.addToDatabase(); - - // If the player is the region owner update last enter and tell set the message. - if (region.isOwner(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(u.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are the owner of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, set it to active. - if (region.status() == RegionStatus.INACTIVE) { - region.setDefault(); - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it " + - "has been set back to default settings.")); - } - - // Check if the player is a region members. - } else if (region.isMember(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(u.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are a member of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, make this member to owner. - if (region.status() == RegionStatus.INACTIVE) { - // Make the previous owner a member. - region.makeMember(); - - // Give the new player ownership. - region.makeOwner(p.getUniqueId().toString()); - - // Update any requests to take into account the new region owner. - region.updateRequests(); - - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it " + - "has been set back to default settings.")); - p.sendMessage(ChatUtils.success("You have been made the new region owner.")); - } - - // Check if the region is open and the player is at least jr.builder. - } else if (region.status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(u.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you can build in this region."))); - } else { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(u.region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA))); - } - - // Update the region the player is in. - u.region = region; - } else { - - // You can't enter this region. - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, " + - "you must be at least Jr.Builder to load new terrain.")); - e.setCancelled(true); - } - } - } else { - - // Check if the player can enter the region. - if (region.inDatabase() || p.hasPermission("group.jrbuilder")) { - - // Add region to database if not exists. - region.addToDatabase(); - - // If the player is the region owner update last enter and tell set the message. - if (region.isOwner(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are the owner of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, set it to active. - if (region.status() == RegionStatus.INACTIVE) { - region.setDefault(); - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has " + - "been set back to default settings.")); - } - - // Check if the player is a region members. - } else if (region.isMember(p.getUniqueId().toString())) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you are a member of this region."))); - region.setLastEnter(p.getUniqueId().toString()); - - // If the region is inactive, make this member to owner. - if (region.status() == RegionStatus.INACTIVE) { - // Make the previous owner a member. - region.makeMember(); - - // Give the new player ownership. - region.makeOwner(p.getUniqueId().toString()); - - // Update any requests to take into account the new region owner. - region.updateRequests(); - - p.sendMessage(ChatUtils.success("This region is no longer \"Inactive\", it has " + - "been set back to default settings.")); - p.sendMessage(ChatUtils.success("You have been made the new region owner.")); - } - - // Check if the region is open and the player is at least jr.builder. - } else if (region.status() == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) { - - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", you can build in this region."))); - } else { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.getTag(p.getUniqueId().toString()), - NamedTextColor.DARK_AQUA))); - } - - // Update the region the player is in. - u.region = region; - u.inRegion = true; - } else { - - // You can't enter this region. - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you " + - "must be at least Jr.Builder to load new terrain.")); - e.setCancelled(true); - } - } - } else if (u.inRegion) { - - // Send default leave message. - p.sendActionBar( - ChatUtils.success("You have left ") - .append(Component.text(u.region.regionName(), NamedTextColor.DARK_AQUA))); - - // Set inRegion to false. - u.inRegion = false; - } - } else if (SERVER_TYPE == ServerType.PLOT) { - - // Check if the player is teleporting to a buildable world in the plot system. - if (plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + e.getTo().getWorld().getName() + - "';")) { - - // Get negative coordinate transform of new location. - Location l = e.getTo().clone(); - u.updateCoordinateTransform(plotSQL, l); - - // Alter location to add necessary coordinate transformation. - l.setX(l.getX() + u.dx); - l.setZ(l.getZ() + u.dz); - - // Get region. - Region region = regionManager.getRegion(l); - - // Check if you are teleporting to a new region, if currently in one. - if (u.inRegion) { - - // If the regions are not equal - if (!u.region.equals(region)) { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" and left ")) - .append(Component.text(u.region.regionName(), NamedTextColor.DARK_AQUA))); - - // Update the region the player is in. - u.region = region; - } - } else { - - // Send default enter message. - p.sendActionBar( - ChatUtils.success("You have entered ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA))); - - // Update the region the player is in. - u.region = region; - u.inRegion = true; - } - } else if (u.inRegion) { - - // Send default leave message. - p.sendActionBar( - ChatUtils.success("You have left ") - .append(Component.text(u.region.regionName(), NamedTextColor.DARK_AQUA))); - - // Set inRegion to false. - u.inRegion = false; - } - } - } - - // Network.getInstance().getLogger().info("Teleport: " + e.getTo().getX() + "," + e.getTo().getZ()); - - } -} From 83fb3027bb3a392f22338f4f877450260c383547 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 24 Aug 2025 23:16:22 +0200 Subject: [PATCH 05/96] More progress fixing stuff for new structure. --- .../java/net/bteuk/network/api/ChatAPI.java | 7 +- .../net/bteuk/network/CommandManager.java | 54 ++++---- .../java/net/bteuk/network/CustomChat.java | 128 +++++++++++------- .../main/java/net/bteuk/network/Network.java | 35 ++--- .../main/java/net/bteuk/network/Timers.java | 51 ++++--- .../building_companion/BuildingCompanion.java | 49 ++++--- .../building_companion/TpllListener.java | 29 ++-- .../java/net/bteuk/network/commands/Afk.java | 16 ++- .../commands/BuildingCompanionCommand.java | 26 +++- .../network/commands/give/GiveBarrier.java | 5 + .../network/commands/give/GiveDebugStick.java | 5 + .../bteuk/network/commands/give/GiveItem.java | 14 +- .../network/commands/give/GiveLight.java | 5 + .../network/eventing/listeners/Connect.java | 70 +++++----- .../java/net/bteuk/network/sql/GlobalSQL.java | 40 +++++- .../net/bteuk/network/utils/NetworkUser.java | 82 ++--------- .../java/net/bteuk/network/utils/Roles.java | 64 +++++---- .../bteuk/network/regions/RegionManager.java | 20 +-- .../net/bteuk/network/regions/RegionUser.java | 24 ++++ .../regions/listener/ServerJoinListener.java | 1 + .../regions/listener/ServerQuitListener.java | 1 + pom.xml | 2 +- 22 files changed, 432 insertions(+), 296 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java index 019f4f2b..d09248cf 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java @@ -1,9 +1,12 @@ package net.bteuk.network.api; -import net.bteuk.network.lib.dto.AbstractTransferObject; +import net.bteuk.network.lib.dto.ChatMessage; +import net.bteuk.network.lib.dto.DirectMessage; public interface ChatAPI { - void sendSocketMessage(AbstractTransferObject chatMessage); + void sendChatMessage(ChatMessage chatMessage); + + void sendDirectMessage(DirectMessage directMessage); } diff --git a/Plugin/src/main/java/net/bteuk/network/CommandManager.java b/Plugin/src/main/java/net/bteuk/network/CommandManager.java index c38567c2..075bd49a 100644 --- a/Plugin/src/main/java/net/bteuk/network/CommandManager.java +++ b/Plugin/src/main/java/net/bteuk/network/CommandManager.java @@ -3,6 +3,7 @@ import io.papermc.paper.command.brigadier.Commands; import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; +import net.bteuk.network.api.EventAPI; import net.bteuk.network.commands.Afk; import net.bteuk.network.commands.BuildingCompanionCommand; import net.bteuk.network.commands.Buildings; @@ -50,20 +51,18 @@ import net.bteuk.network.commands.navigation.Warps; import net.bteuk.network.commands.staff.Exp; import net.bteuk.network.commands.staff.Staff; +import net.bteuk.network.core.Constants; import net.bteuk.network.lobby.LobbyCommand; +import net.bteuk.network.regions.RegionManager; import org.bukkit.plugin.Plugin; import java.util.List; -import static net.bteuk.network.utils.Constants.LL; -import static net.bteuk.network.utils.Constants.PROGRESS_MAP; -import static net.bteuk.network.utils.Constants.TIPS; -import static net.bteuk.network.utils.Constants.TPLL_ENABLED; import static net.bteuk.network.utils.NetworkConfig.CONFIG; public class CommandManager { - public static void registerCommands(Network instance) { + public static void registerCommands(Network instance, Constants constants, EventAPI eventAPI, Afk afk, RegionManager regionManager) { LifecycleEventManager manager = instance.getLifecycleManager(); manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { @@ -72,35 +71,40 @@ public static void registerCommands(Network instance) { /* * Navigation commands. */ - if (TPLL_ENABLED) { + if (constants.tpllEnabled()) { commands.register("tpll", "Teleport to coordinates", instance.getTpll()); } - if (LL) { + if (constants.ll()) { commands.register("where", "Returns the coordinates where the player is standing with a link to google maps.", List.of("location", "ll"), new Where(instance)); } commands.register("teleport", "Teleport to any online player.", List.of("tp"), new Tp()); - commands.register("back", "Teleports the player to the previous teleported location.", new Back()); + commands.register("back", "Teleports the player to the previous teleported location.", new Back(eventAPI)); commands.register("warp", "Warp to locations in the exploration menu.", new Warp()); commands.register("warps", "List all warps on the server, 16 per page.", new Warps()); commands.register("navigation", "Adds commands to do with navigation.", new Navigation()); - commands.register("lobby", "Command for all lobby management.", new LobbyCommand(instance)); + if (!constants.standalone()) { + commands.register("lobby", "Command for all lobby management.", new LobbyCommand(instance)); + commands.register("spawn", "Teleport to spawnpoint in lobby.", new Spawn()); + commands.register("server", "Switch server by command.", new Server()); + } if (CONFIG.getBoolean("homes.enabled")) { commands.register("sethome", "Set a home to your current location.", new Sethome(instance)); commands.register("home", "Teleport to your home.", new Home(instance)); commands.register("delhome", "Delete a home.", new Delhome(instance)); commands.register("homes", "Like warps, but for homes, shows all homes the player has set.", new Homes()); } - commands.register("spawn", "Teleport to spawnpoint in lobby.", new Spawn()); - commands.register("server", "Switch server by command.", new Server()); - /* * Gui commands. */ commands.register("navigator", "Opens the main gui, will always return to the previous menu if possible.", List.of("nav", "gui", "menu", "claim"), new Navigator()); - commands.register("plot", "Allows players to manipulate plots without using the gui.", List.of("plots"), new Plot(instance)); - commands.register("region", "Allows players to manipulate regions without using the gui.", new RegionCommand()); - commands.register("zone", "Zone command.", new Zone()); + if (constants.plotSystemEnabled()) { + commands.register("plot", "Allows players to manipulate plots without using the gui.", List.of("plots"), new Plot(instance)); + commands.register("zone", "Zone command.", new Zone()); + } + if (constants.regionsEnabled()) { + commands.register("region", "Allows players to manipulate regions without using the gui.", new RegionCommand()); + } /* * Staff commands. @@ -119,30 +123,33 @@ public static void registerCommands(Network instance) { */ commands.register("building", "adds or shows completed buildings", new Buildings(instance)); commands.register("teleporttoggle", "Enables/Disables the ability for other players to teleport to you.", List.of("tptoggle", "toggleteleport", "toggletp"), new TpToggle()); - commands.register("discord", "Sends a link to our discord server.", new Discord()); + if (!constants.standalone()) { + commands.register("discord", "Sends a link to our discord server.", new Discord()); + commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); + } commands.register("nightvision", "Toggle nightvision.", List.of("nv"), new Nightvision()); commands.register("speed", "Sets the players speed, value up to 10.", new Speed()); commands.register("help", "Help menu for information on commands and server features.", new Help()); - commands.register("afk", "Toggles afk status.", new Afk()); + commands.register("afk", "Toggles afk status.", afk); commands.register("rules", "Get rules book.", new Rules()); commands.register("clear", "Clears your inventory.", new Clear()); - commands.register("debugstick", "Get the debug stick.", new GiveDebugStick()); - commands.register("light", "Get a light block.", new GiveLight()); - commands.register("barrier", "Get a barrier block.", new GiveBarrier()); + commands.register("debugstick", "Get the debug stick.", new GiveDebugStick(instance)); + commands.register("light", "Get a light block.", new GiveLight(instance)); + commands.register("barrier", "Get a barrier block.", new GiveBarrier(instance)); commands.register("gamemode", "Switch gamemode.", List.of("gm"), new Gamemode()); commands.register("phead", "Get the player head of someone who has connected to the server.", new Phead()); commands.register("hdb", "Added so it can be routed to /skulls", new Hdb()); - if (PROGRESS_MAP) { + if (constants.progressMap()) { commands.register("progressmap", "Sends a link of the progress map", List.of("progress"), new ProgressMap()); } - if (TIPS) { + if (constants.tips()) { commands.register("tips", "Toggles tips in chat.", List.of("toggletips", "tipstoggle"), new TipsToggle()); } commands.register("ptime", "Sets the time of day for the player", new Ptime()); commands.register("pweather", "Sets the weather for the player", new Pweather()); commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); commands.register("exp", "Test command for adding exp.", new Exp()); - commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand()); + commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand(instance, constants, regionManager)); commands.register("pmute", "Mute a player", new Pmute(instance)); commands.register("punmute", "Unmute a player", new Punmute(instance)); Msg msgCommand = new Msg(instance); @@ -152,7 +159,6 @@ public static void registerCommands(Network instance) { commands.register("r","sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); commands.register("promote", "Add a role to a player.", new Promote(instance)); commands.register("demote", "Remove a role from a player.", new Demote(instance)); - commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); commands.register("me", "Disabled", new Me()); // commands.register("bteuk", "Test", new BTEUK()); diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index c925b952..b409cb46 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -1,7 +1,11 @@ package net.bteuk.network; import io.papermc.paper.event.player.AsyncChatEvent; +import lombok.extern.java.Log; import net.bteuk.network.api.ChatAPI; +import net.bteuk.network.commands.Afk; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.exceptions.NotMutedException; import net.bteuk.network.lib.dto.AbstractTransferObject; @@ -21,10 +25,9 @@ import net.bteuk.network.lib.socket.OutputSocket; import net.bteuk.network.lib.socket.SocketHandler; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Role; -import net.bteuk.network.utils.Roles; -import net.bteuk.network.utils.Time; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -33,43 +36,56 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import static net.bteuk.network.commands.Afk.updateAfkStatus; import static net.bteuk.network.lib.enums.ChatChannels.STAFF; -import static net.bteuk.network.utils.Constants.LOGGER; import static net.bteuk.network.utils.NetworkConfig.CONFIG; import static net.bteuk.network.utils.staff.Moderation.getMutedComponent; import static net.bteuk.network.utils.staff.Moderation.isMuted; +@Log public class CustomChat implements Listener, SocketHandler, ChatAPI { private static final String AFK = "%s is now afk"; private static final String NOT_AFK = "%s is no longer afk"; private final Network instance; - private final OutputSocket outputSocket; + private OutputSocket outputSocket; - public CustomChat(Network instance) { + private final Constants constants; + + private final Afk afk; + + private final GlobalSQL globalSQL; + + private final Connect connect; + + public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Connect connect) { this.instance = instance; + this.constants = constants; + this.afk = afk; + this.globalSQL = globalSQL; + this.connect = connect; instance.getServer().getPluginManager().registerEvents(this, instance); // Set up the output socket. - outputSocket = new OutputSocket( - CONFIG.getString("chat.socket.output.IP"), - CONFIG.getInt("chat.socket.output.port") - ); - - // Register input socket for receiving messages from the proxy. - int inputSocketPort = CONFIG.getInt("chat.socket.input.port"); - if (inputSocketPort == 0) { - LOGGER.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); - } else { - // Create the input socket. - InputSocket inputSocket = new InputSocket(inputSocketPort); - inputSocket.start(this); + if (!constants.standalone()) { + outputSocket = new OutputSocket( + CONFIG.getString("chat.socket.output.IP"), + CONFIG.getInt("chat.socket.output.port") + ); + + // Register input socket for receiving messages from the proxy. + int inputSocketPort = CONFIG.getInt("chat.socket.input.port"); + if (inputSocketPort == 0) { + log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); + } else { + // Create the input socket. + InputSocket inputSocket = new InputSocket(inputSocketPort); + inputSocket.start(this); + } } - LOGGER.info("Successfully enabled Chat!"); + log.info("Successfully enabled Chat!"); } public static ChatMessage getChatMessage(Component component, NetworkUser u) { @@ -156,7 +172,7 @@ public void onPlayerChatEvent(AsyncChatEvent e) { // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + e.getPlayer().getName() + " can not be found!"); + log.severe("User " + e.getPlayer().getName() + " can not be found!"); e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } @@ -166,7 +182,7 @@ public void onPlayerChatEvent(AsyncChatEvent e) { if (user.isAfk()) { user.setAfk(false); - updateAfkStatus(user, false); + afk.updateAfkStatus(user, false); } ChatMessage chatMessage = getChatMessage(e.message(), user); sendSocketMessage(chatMessage); @@ -174,31 +190,24 @@ public void onPlayerChatEvent(AsyncChatEvent e) { } public void sendSocketMessage(AbstractTransferObject chatMessage) { - outputSocket.sendSocketMessage(chatMessage); + if (!constants.standalone()) { + outputSocket.sendSocketMessage(chatMessage); + } } @Override public AbstractTransferObject handle(AbstractTransferObject abstractTransferObject) { - if (abstractTransferObject instanceof DirectMessage directMessage) { - handleDirectMessage(directMessage); - } else if (abstractTransferObject instanceof DiscordLinking discordLinking) { - handleDiscordLinking(discordLinking); - } else if (abstractTransferObject instanceof AddTeamEvent addTeamEvent) { - instance.getTab().handle(addTeamEvent); - } else if (abstractTransferObject instanceof UserConnectReply userConnectReply) { - Connect.handleUserConnectReply(userConnectReply); - } else if (abstractTransferObject instanceof UserRemove userRemove) { - Connect.handleUserRemove(userRemove); - } else if (abstractTransferObject instanceof UserUpdate userUpdate) { - handleUserUpdate(userUpdate); - } else if (abstractTransferObject instanceof OnlineUsersReply onlineUsersReply) { - instance.handleOnlineUsersReply(onlineUsersReply); - } else if (abstractTransferObject instanceof OnlineUserAdd onlineUserAdd) { - instance.handleOnlineUserAdd(onlineUserAdd); - } else if (abstractTransferObject instanceof OnlineUserRemove onlineUserRemove) { - instance.handleOnlineUserRemove(onlineUserRemove); - } else { - LOGGER.warning(String.format("Socket object has an unrecognised type %s", + switch (abstractTransferObject) { + case DirectMessage directMessage -> handleDirectMessage(directMessage); + case DiscordLinking discordLinking -> handleDiscordLinking(discordLinking); + case AddTeamEvent addTeamEvent -> instance.getTab().handle(addTeamEvent); // TODO: TAB + case UserConnectReply userConnectReply -> connect.handleUserConnectReply(userConnectReply); + case UserRemove userRemove -> connect.handleUserRemove(userRemove); + case UserUpdate userUpdate -> handleUserUpdate(userUpdate); + case OnlineUsersReply onlineUsersReply -> instance.handleOnlineUsersReply(onlineUsersReply); + case OnlineUserAdd onlineUserAdd -> instance.handleOnlineUserAdd(onlineUserAdd); + case OnlineUserRemove onlineUserRemove -> instance.handleOnlineUserRemove(onlineUserRemove); + default -> log.warning(String.format("Socket object has an unrecognised type %s", abstractTransferObject.getClass().getTypeName())); } return null; @@ -229,6 +238,7 @@ private void handleDirectMessage(DirectMessage message) { }); } + // TODO: Remove from this class, as it has a cyclical with Roles. private void handleDiscordLinking(DiscordLinking discordLinking) { if (discordLinking.isUnlink() && discordLinking.getDiscordId() != -1) { @@ -260,7 +270,7 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { user.setDiscordId(discordLinking.getDiscordId()); // Get the highest role for syncing and sync it, except for guest. - Role role = Roles.builderRole(user.player); + Role role = roles.builderRole(user.player); // Add the role in discord. if (role == null) { @@ -275,6 +285,7 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { }); } + // TODO: Remove from this class, as it has a cyclical with Roles. private void handleUserUpdate(UserUpdate userUpdate) { // If the user is online check if anything needs updating. instance.getUsers().stream().filter(user -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) @@ -282,9 +293,9 @@ private void handleUserUpdate(UserUpdate userUpdate) { if (userUpdate.getTabPlayer() != null && !userUpdate.getTabPlayer().getPrimaryGroup() .equals(user.getPrimaryRole().getId())) { // Update the primary role. - Role primaryRole = Roles.getRoleById(userUpdate.getTabPlayer().getPrimaryGroup()); + Role primaryRole = roles.getRoleById(userUpdate.getTabPlayer().getPrimaryGroup()); if (primaryRole != null) { - LOGGER.info(String.format("Updated primary role for %s to %s", user.player.getName(), + log.info(String.format("Updated primary role for %s to %s", user.player.getName(), primaryRole.getName())); user.setPrimaryRole(primaryRole); } @@ -292,7 +303,7 @@ private void handleUserUpdate(UserUpdate userUpdate) { }); } - // Send afk or no longer afk message to players ingame and discord. + // Send the afk or no longer afk message to all players. public void broadcastAFK(Player p, boolean afk) { ChatMessage chatMessage = new ChatMessage(); @@ -307,7 +318,26 @@ public void broadcastAFK(Player p, boolean afk) { .decoration(TextDecoration.ITALIC, true)); } - // Send message - sendSocketMessage(chatMessage); + // Send the message + sendChatMessage(chatMessage); + } + + public void sendChatMessage(ChatMessage message) { + if (constants.standalone()) { + instance.getServer().broadcast(message.getComponent()); + } else { + sendSocketMessage(message); + } + } + + public void sendDirectMessage(DirectMessage message) { + if (constants.standalone()) { + // Try to send the message to the player if they're online. + // Else use the database to store it for when they next connect. + instance.getServer().getOnlinePlayers().stream().filter(player -> player.getUniqueId().toString().equals(message.getRecipient())).findFirst() + .ifPresentOrElse(player -> player.sendMessage(message.getComponent()), () -> globalSQL.insertMessage(message)); + } else { + sendSocketMessage(message); + } } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 7fb08a00..449e1c03 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -9,6 +9,7 @@ import net.bteuk.network.api.WorldGuardAPI; import net.bteuk.network.api.impl.CoordinateAPIImpl; import net.bteuk.network.api.impl.PlotAPIImpl; +import net.bteuk.network.commands.Afk; import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.commands.staff.Ban; import net.bteuk.network.commands.staff.Kick; @@ -23,6 +24,8 @@ import net.bteuk.network.eventing.listeners.CommandPreProcess; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.eventing.listeners.GuiListener; +import net.bteuk.network.eventing.listeners.NetworkMoveListener; +import net.bteuk.network.eventing.listeners.NetworkTeleportListener; import net.bteuk.network.eventing.listeners.PlayerInteract; import net.bteuk.network.eventing.listeners.PreJoinServer; import net.bteuk.network.gui.NavigatorGui; @@ -34,14 +37,13 @@ import net.bteuk.network.lobby.Lobby; import net.bteuk.network.logging.BukkitForwardingHandler; import net.bteuk.network.regions.RegionManager; -import net.bteuk.network.regions.listener.RegionMoveListener; -import net.bteuk.network.regions.listener.RegionTeleportListener; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkConfig; import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Tips; import net.bteuk.network.utils.Utils; @@ -72,7 +74,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { // Returns an instance of the plugin. - @Getter private static Network instance; // If the server can shutdown. @@ -82,8 +83,8 @@ public final class Network extends JavaPlugin implements NetworkAPI { public ItemStack navigator; public RegionSQL regionSQL; // Movement listeners. - public RegionMoveListener moveListener; - public RegionTeleportListener teleportListener; + public NetworkMoveListener moveListener; + public NetworkTeleportListener teleportListener; // Return an instance of the regionManager. // RegionManager @Getter @@ -96,23 +97,20 @@ public final class Network extends JavaPlugin implements NetworkAPI { // SQL @Getter private PlotSQL plotSQL; + @Getter private GlobalSQL globalSQL; // Chat @Getter private CustomChat chat; // Timers - @Getter private Timers timers; // Get lobby. // Lobby - @Getter private Lobby lobby; // Listener and manager of server connects. - @Getter private Connect connect; // Tab - @Getter private TabManager tab; // Kick Command @@ -207,7 +205,7 @@ public void onEnable() { // Global Database String global_database = CONFIG.getString("database.global"); DataSource global_dataSource = init.mysqlSetup(global_database, host, port, username, password); - globalSQL = new GlobalSQL(global_dataSource); + globalSQL = new GlobalSQL(global_dataSource, constants); // Region Database if (constants.regionsEnabled()) { @@ -299,11 +297,15 @@ public void enablePlugin() { // Enable tab. tab = new TabManager(this); + Afk afk = new Afk(this, chat); + + Roles roles = new Roles(this, chat, plotSQL); + // Enabled chat, both global and normal chat are handled through this. - chat = new CustomChat(this); + chat = new CustomChat(this, constants, afk, globalSQL, connect); // Setup connect, this handles all connections to the server. - connect = new Connect(this); + connect = new Connect(this, constants); // Create navigator. navigatorGui = new NavigatorGui(); @@ -321,12 +323,11 @@ public void enablePlugin() { regionManager = new RegionManager(regionSQL, globalSQL, plotAPI, chat, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); } - // TODO: Implement network move and teleport listener. - //moveListener = new RegionMoveListener(this); - //teleportListener = new TeleportListener(this); + moveListener = new NetworkMoveListener(this, afk); + teleportListener = new NetworkTeleportListener(this); // Setup Timers - timers = new Timers(this, globalSQL, eventManager); + timers = new Timers(this, globalSQL, eventManager, constants, afk); timers.startTimers(); // Set up the lobby, most features are only enabled in the lobby server. @@ -361,7 +362,7 @@ public void enablePlugin() { unmute = new Unmute(); ban = new Ban(); unban = new Unban(); - CommandManager.registerCommands(this); + CommandManager.registerCommands(this, constants, eventManager, afk, regionManager); // Register commandpreprocess to make sure /network:region runs and not that of another plugin. new CommandPreProcess(this); diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 874bdc04..45dc465c 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -1,5 +1,8 @@ package net.bteuk.network; +import lombok.extern.java.Log; +import net.bteuk.network.commands.Afk; +import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.regions.Inactivity; @@ -10,12 +13,9 @@ import java.util.ArrayList; -import static net.bteuk.network.commands.Afk.updateAfkStatus; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_NAME; import static net.bteuk.network.utils.NetworkConfig.CONFIG; +@Log public class Timers { // Region Inactivity @@ -28,10 +28,16 @@ public class Timers { private final ArrayList timers; // SQL private final GlobalSQL globalSQL; + + private final Afk afk; + // Afk time - private final long afk; + private final long afkTime; // Event manager private final EventManager eventManager; + + private final Constants constants; + // Server events private ArrayList events; private boolean isBusy; @@ -40,7 +46,7 @@ public class Timers { private ArrayList inactive_owners; private String uuid; - public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager) { + public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager, Constants constants, Afk afk) { this.instance = instance; this.users = instance.getUsers(); @@ -52,12 +58,16 @@ public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager) this.eventManager = eventManager; events = new ArrayList<>(); + this.constants = constants; + // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds inactivity = CONFIG.getInt("region_inactivity") * 24L * 60L * 60L * 1000L; inactive_owners = new ArrayList<>(); + this.afk = afk; + // Minutes * 60 seconds * 1000 milliseconds - afk = CONFIG.getInt("afk") * 60L * 1000L; + afkTime = CONFIG.getInt("afk") * 60L * 1000L; } public void startTimers() { @@ -66,7 +76,7 @@ public void startTimers() { timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { // Check for new server_events. - if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + SERVER_NAME + "' AND type='network" + + if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "' AND type='network" + "';")) { // If events is not empty, skip this iteration. @@ -77,12 +87,12 @@ public void startTimers() { isBusy = true; // Get events for this server. - events = globalSQL.getEvents(SERVER_NAME, "network", events); + events = globalSQL.getEvents(constants.serverName(), "network", events); for (String[] event : events) { // Deal with events here. - LOGGER.info("Event: " + event[1]); + log.info("Event: " + event[1]); // Split the event by word. String[] aEvent = event[1].split(" "); @@ -118,24 +128,26 @@ public void startTimers() { } // Check if the player is afk. - if (user.last_movement < (time - afk) && !user.isAfk()) { + if (user.last_movement < (time - afkTime) && !user.isAfk()) { // Set player as AFK user.setAfk(true); // Send message to chat and discord. - updateAfkStatus(user, true); + afk.updateAfkStatus(user, true); } } }, 0L, 20L)); // 1-minute timer. - timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { + // TODO: Move to region code. + if (constants.regionsEnabled()) { + timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { + + // Check for inactive owners. + // If the region has members then make another member the new owner, + // If the region has no members then set it inactive. - // Check for inactive owners. - // If the region has members then make another member the new owner, - // If the region has no members then set it inactive. - if (REGIONS_ENABLED) { inactive_owners.clear(); inactive_owners = instance.regionSQL.getInactives("SELECT rm.region,rm.uuid FROM region_members AS rm" + " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - inactivity) + " AND r.status <> " + @@ -162,8 +174,9 @@ public void startTimers() { inactive.region.setInactive(); } } - } - }, 0L, 1200L)); + + }, 0L, 1200L)); + } } public void close() { diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java index 426b84f5..2f765ce4 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java @@ -2,15 +2,18 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.exceptions.NoBuildPermissionException; import net.bteuk.network.exceptions.RegionNotFoundException; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionUser; import net.bteuk.network.utils.Blocks; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionManager; import net.bteuk.network.utils.worldguard.WorldguardMembers; import net.bteuk.network.utils.worldguard.WorldguardUtils; import net.kyori.adventure.text.Component; @@ -32,21 +35,24 @@ import java.util.Set; import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - /** * This class stored all the information about the building companion. * It is player-specific and will be enabled when a player activates it. * Listeners will be registered in here, along with any tool-related variables. */ +@Log public class BuildingCompanion { private static final int MAX_DISTANCE = 2; private static final long TIMEOUT = 20 * 15; + private final Network instance; + + private final Constants constants; + + private final RegionManager regionManager; + // Set of inputs for each corner. No duplicates can exist in a set, // this prevents the player from teleporting to the same corner multiple times // causing the weighting to be skewed. @@ -60,16 +66,20 @@ public class BuildingCompanion { private World world; private boolean asyncActive = false; - public BuildingCompanion(NetworkUser user) { + public BuildingCompanion(NetworkUser user, Network instance, Constants constants, RegionManager regionManager) { this.user = user; + this.instance = instance; + this.constants = constants; + this.regionManager = regionManager; + this.world = user.player.getWorld(); input_corners = new HashSet<>(); saved_outlines = new HashMap<>(); // Enable the tpll listener. listeners = new HashSet<>(); - listeners.add(new TpllListener(this)); + listeners.add(new TpllListener(this, instance, constants, regionManager)); } private static boolean contains(Set list, double[] input) { @@ -86,7 +96,7 @@ private static boolean contains(Set list, double[] input) { */ public void disable() { // Unregister the events. - LOGGER.info("Disabling the building companion for " + user.player.getName()); + log.info("Disabling the building companion for " + user.player.getName()); listeners.forEach(HandlerList::unregisterAll); } @@ -195,7 +205,7 @@ public void drawOutlines() { // Use an async task to not block the main thread. int taskId = drawOutlinesTask().getTaskId(); // Run a task later to cancel the task if it has not yet been completed. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { + Bukkit.getScheduler().runTaskLater(instance, () -> { if (asyncActive && Bukkit.getScheduler().isCurrentlyRunning(taskId)) { sendFeedback(ChatUtils.error("Drawing outlines task timed out, the selection was too difficult to" + " process.")); @@ -212,7 +222,7 @@ public void drawOutlines() { } private BukkitTask drawOutlinesTask() { - return Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), () -> { + return Bukkit.getScheduler().runTaskAsynchronously(instance, () -> { double[][] corners = input_corners.stream().map(this::getAverage).toArray(double[][]::new); @@ -241,7 +251,7 @@ private BukkitTask drawOutlinesTask() { private void drawTempOutlinesTaskWithFeedback(int[][] corners) { // Draw the lines with fake blocks. - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + Bukkit.getScheduler().runTask(instance, () -> { SavedOutline outline = new SavedOutline(UUID.randomUUID(), corners, world); if (drawOutlines(outline, Material.ORANGE_CONCRETE.createBlockData(), false)) { sendFeedback(ChatUtils.success("The outlines have been drawn.")); @@ -268,7 +278,7 @@ private void drawTempOutlinesTaskWithFeedback(int[][] corners) { */ private boolean drawOutlines(SavedOutline outline, BlockData block, boolean permanent) { ProtectedRegion wgRegion = null; - if (SERVER_TYPE == ServerType.PLOT) { + if (constants.serverType() == ServerType.PLOT) { // Get region at first corner. If no region is found return false. try { wgRegion = WorldguardUtils.getRegionAt(world, BlockVector3.at(outline.corners()[0][0], 1, @@ -286,17 +296,18 @@ private boolean drawOutlines(SavedOutline outline, BlockData block, boolean perm "cancelled drawing outlines.")); return false; } - } else if (REGIONS_ENABLED && SERVER_TYPE == ServerType.EARTH) { - RegionManager manager = Network.getInstance().getRegionManager(); + } else if (constants.regionsEnabled() && constants.serverType() == ServerType.EARTH) { for (int[] point : outline.corners()) { - Region region = manager.getRegion(new Location(world, point[0], 1, point[1]), user.dx, user.dz); - if (!region.canBuild(user.player)) { + // TODO: Get dx, dz from regionUser. + RegionUser regionUser = regionManager.getUserByPlayer(user.player); + Region region = regionManager.getRegion(point[0], point[1], regionUser.getDeltaX(), regionUser.getDeltaZ()); + if (!regionManager.canBuild(region, user.player)) { sendFeedback(ChatUtils.error("All or part of your selection is not in a region you can build in, " + "cancelled drawing outlines.")); return false; } } - } else if (SERVER_TYPE != ServerType.EARTH) { + } else if (constants.serverType() != ServerType.EARTH) { sendFeedback(ChatUtils.error("You are not able to generate outlines on this server.")); return false; } diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java index d8c7a184..dc126e24 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java @@ -1,7 +1,11 @@ package net.bteuk.network.building_companion; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.commands.navigation.Tpll; +import net.bteuk.network.core.Constants; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionUser; import net.bteuk.network.utils.TpllFormat; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -11,15 +15,20 @@ import java.util.Arrays; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class TpllListener implements Listener { private final BuildingCompanion companion; - public TpllListener(BuildingCompanion companion) { + private final Constants constants; + + private final RegionManager regionManager; + + public TpllListener(BuildingCompanion companion, Network instance, Constants constants, RegionManager regionManager) { this.companion = companion; - Bukkit.getServer().getPluginManager().registerEvents(this, Network.getInstance()); + this.constants = constants; + this.regionManager = regionManager; + Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @EventHandler @@ -28,7 +37,7 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { return; } - LOGGER.info(e.getMessage()); + log.info(e.getMessage()); if (e.getMessage().startsWith("/network:tpll")) { @@ -52,10 +61,14 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { return; } - // Apply coordinate transform if in the plotsystem. + // Apply coordinate transform if regions are enabled. Location l = new Location(e.getPlayer().getWorld(), proj[0], 1, proj[1]); - if (Constants.REGIONS_ENABLED) { - l = Tpll.applyCoordinateTransformIfPlotSystem(Network.getInstance().getRegionManager().getRegion(l), l); + if (constants.regionsEnabled()) { + RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); + Location newLocation = l.clone(); + newLocation.setX(l.getX() + regionUser.getDeltaX()); + newLocation.setZ(l.getZ() + regionUser.getDeltaZ()); + l = newLocation; } // Add a new corner, or update an existing one. diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index c5cf5516..1f155d0b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.UserUpdate; @@ -13,15 +14,24 @@ @Log public class Afk extends AbstractCommand { + private final Network instance; + + private final CustomChat chat; + + public Afk(Network instance, CustomChat chat) { + this.instance = instance; + this.chat = chat; + } + public void updateAfkStatus(NetworkUser user, boolean afk) { // Broadcast the afk message and send a user update event. - Network.getInstance().getChat().broadcastAFK(user.player, afk); + chat.broadcastAFK(user.player, afk); UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(user.player.getUniqueId().toString()); userUpdateEvent.setAfk(afk); - Network.getInstance().getChat().sendSocketMessage(userUpdateEvent); + chat.sendSocketMessage(userUpdateEvent); } @Override @@ -33,7 +43,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java index 79e8aba3..7713a35f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java @@ -1,9 +1,12 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.building_companion.BuildingCompanion; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -11,17 +14,28 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class BuildingCompanionCommand extends AbstractCommand { private static final Component ERROR = ChatUtils.error("/buildingcompanion "); - public static void toggleCompanion(NetworkUser user) { + private final Network instance; + + private final Constants constants; + + private final RegionManager regionManager; + + public BuildingCompanionCommand(Network instance, Constants constants, RegionManager regionManager) { + this.instance = instance; + this.constants = constants; + this.regionManager = regionManager; + } + + public void toggleCompanion(NetworkUser user) { // Toggle the building companion. BuildingCompanion companion = user.getCompanion(); if (companion == null) { - user.setCompanion(new BuildingCompanion(user)); + user.setCompanion(new BuildingCompanion(user, instance, constants, regionManager)); user.player.sendMessage(ChatUtils.success("Building Companion enabled")); } else { // Disable the building companion. @@ -44,11 +58,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java index ce18d2f0..df04475b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands.give; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -10,6 +11,10 @@ * Extends GiveItem, which handles the actual giving of the item. */ public class GiveBarrier extends GiveItem { + public GiveBarrier(Network instance) { + super(instance); + } + @Override public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { onCommand(stack, "uknet.barrier", ItemStack.of(Material.BARRIER), "Barrier"); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java index d8a41c93..8bd260cc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands.give; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -10,6 +11,10 @@ * Extends GiveItem, which handles the actual giving of the item. */ public class GiveDebugStick extends GiveItem { + public GiveDebugStick(Network instance) { + super(instance); + } + @Override public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { onCommand(stack, "uknet.debugstick", ItemStack.of(Material.DEBUG_STICK), "Debug Stick"); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java index 3461770c..779b2886 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands.give; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; @@ -9,14 +10,19 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import static net.bteuk.network.utils.Constants.LOGGER; - /** * Abstract class for giving an item to a player. * Is used for all commands that give items to a player. */ +@Log public abstract class GiveItem extends AbstractCommand { + private final Network instance; + + public GiveItem(Network instance) { + this.instance = instance; + } + public void onCommand(CommandSourceStack stack, String permission, ItemStack item, String itemName) { // Check if the sender is a player. @@ -30,11 +36,11 @@ public void onCommand(CommandSourceStack stack, String permission, ItemStack ite return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java index 35138f2a..c0e6e6ba 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands.give; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -10,6 +11,10 @@ * Extends GiveItem, which handles the actual giving of the item. */ public class GiveLight extends GiveItem { + public GiveLight(Network instance) { + super(instance); + } + @Override public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { onCommand(stack, "uknet.light", ItemStack.of(Material.LIGHT), "Light"); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index b2daf85c..116f179d 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -1,9 +1,12 @@ package net.bteuk.network.eventing.listeners; import lombok.Setter; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.dto.TabPlayer; import net.bteuk.network.lib.dto.UserConnectReply; @@ -12,7 +15,6 @@ import net.bteuk.network.lib.dto.UserRemove; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.TextureUtils; -import net.bteuk.network.utils.Time; import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; @@ -28,22 +30,21 @@ import java.util.Set; import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.MOTD_CONTENT; -import static net.bteuk.network.utils.Constants.MOTD_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - // This class deals with players joining and leaving the network. +@Log public class Connect implements Listener { private final Network instance; + private final Constants constants; + @Setter private boolean blockLeaveEvent; - public Connect(Network instance) { + public Connect(Network instance, Constants constants) { this.instance = instance; + this.constants = constants; this.blockLeaveEvent = false; @@ -58,38 +59,38 @@ public Connect(Network instance) { * * @param reply the {@link UserConnectReply} */ - public static void handleUserConnectReply(UserConnectReply reply) { + public void handleUserConnectReply(UserConnectReply reply) { - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + Bukkit.getScheduler().runTask(instance, () -> { // Find the player associated with the uuid. Player player = - Network.getInstance().getServer().getOnlinePlayers().stream() + instance.getServer().getOnlinePlayers().stream() .filter(p -> p.getUniqueId().toString().equals(reply.getUuid())).findFirst().orElse(null); if (player == null) { - LOGGER.warning("A UserConnectReply was received but no Player exists with their uuid, maybe they have" + + log.warning("A UserConnectReply was received but no Player exists with their uuid, maybe they have" + " already left?"); return; } - LOGGER.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", + log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", player.getName())); NetworkUser user = new NetworkUser(player, reply); - Network.getInstance().addUser(user); + instance.addUser(user); // Hide this player for all players in focus mode. - Network.getInstance().getUsers().forEach(serverUser -> { + instance.getUsers().forEach(serverUser -> { if (serverUser.isFocusEnabled()) { serverUser.hidePlayer(player); } }); // Sends the message of the day to the player, if applicable - if (MOTD_ENABLED) { + if (constants.motdEnabled()) { MiniMessage miniMessage = MiniMessage.miniMessage(); - //Replaces the player placeholder - String rawMessage = MOTD_CONTENT.replace("%player%", player.getName()); + // Replaces the player placeholder + String rawMessage = constants.motdContent().replace("%player%", player.getName()); Component componentMessage = miniMessage.deserialize(rawMessage); player.sendMessage(componentMessage); @@ -99,16 +100,17 @@ public static void handleUserConnectReply(UserConnectReply reply) { reply.getMessages().forEach(player::sendMessage); // Add the player to the scoreboard. - Network.getInstance().getTab().onPlayerJoin(player); + // TODO: TAB + instance.getTab().onPlayerJoin(player); player.playSound(Sound.sound(Key.key("block.note_block.bell"), Sound.Source.PLAYER, 1f, 1f)); }); } - public static void handleUserRemove(UserRemove userRemove) { + public void handleUserRemove(UserRemove userRemove) { // TODO: Implement users that are no longer on the server but 'offline'. // TODO: This will then remove them. Currently this is not implemented. - LOGGER.info(String.format("User remove event received from the Proxy for %s", userRemove.getUuid())); + log.info(String.format("User remove event received from the Proxy for %s", userRemove.getUuid())); } @EventHandler(priority = EventPriority.HIGHEST) @@ -127,20 +129,22 @@ public void joinServerEvent(PlayerJoinEvent e) { // When the proxy has received the request it'll send a response which will then create the user object on // the server. UserConnectRequest userConnectRequest = new UserConnectRequest( - SERVER_NAME, e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), + constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer") ); - Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMessage(userConnectRequest)); - LOGGER.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", + Bukkit.getScheduler().runTaskAsynchronously(instance, + () -> instance.getChat().sendSocketMessage(userConnectRequest)); + log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", e.getPlayer().getName())); } @EventHandler public void leaveServerEvent(PlayerQuitEvent e) { - e.quitMessage(null); + if (!constants.standalone()) { + e.quitMessage(null); + } if (blockLeaveEvent) { return; @@ -150,12 +154,12 @@ public void leaveServerEvent(PlayerQuitEvent e) { // If u is null, cancel. if (user == null) { - LOGGER.warning("User " + e.getPlayer().getName() + " was not available on disconnect!"); + log.warning("User " + e.getPlayer().getName() + " was not available on disconnect!"); UserDisconnect disconnectEvent = new UserDisconnect(); disconnectEvent.setUuid(e.getPlayer().getUniqueId().toString()); - disconnectEvent.setServer(SERVER_NAME); - Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMessage(disconnectEvent)); + disconnectEvent.setServer(constants.serverName()); + Bukkit.getScheduler().runTaskAsynchronously(instance, + () -> instance.getChat().sendSocketMessage(disconnectEvent)); return; } @@ -192,8 +196,10 @@ public void leaveServerEvent(PlayerQuitEvent e) { } // Send a disconnect event to the proxy to handle potential messages. - UserDisconnect userDisconnect = user.createDisconnectEvent(); - Bukkit.getScheduler().runTaskAsynchronously(Network.getInstance(), - () -> Network.getInstance().getChat().sendSocketMessage(userDisconnect)); + if (!constants.standalone()) { + UserDisconnect userDisconnect = user.createDisconnectEvent(); + Bukkit.getScheduler().runTaskAsynchronously(instance, + () -> instance.getChat().sendSocketMessage(userDisconnect)); + } } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 7041e18c..a2a2ce46 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -1,9 +1,13 @@ package net.bteuk.network.sql; +import lombok.extern.java.Log; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.building_counter.Building; +import net.bteuk.network.core.Constants; import net.bteuk.network.core.sql.AbstractSQL; +import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.utils.Coordinate; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -15,11 +19,14 @@ import java.sql.Statement; import java.util.ArrayList; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - +@Log public class GlobalSQL extends AbstractSQL { - public GlobalSQL(DataSource datasource) { + + private final Constants constants; + + public GlobalSQL(DataSource datasource, Constants constants) { super(datasource); + this.constants = constants; } // Get a hashmap of all events for this server for the Network plugin. @@ -60,12 +67,12 @@ public ArrayList getEvents(String serverName, String type, ArrayList getBuildings(String condition) { @@ -238,4 +245,23 @@ public void deleteBuilding(Building b) { sql.printStackTrace(); } } + + public boolean insertMessage(DirectMessage directMessage) { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement( + "INSERT INTO messages(recipient,message) VALUES(?,?);" + ) + ) { + statement.setString(1, directMessage.getRecipient()); + statement.setString(2, GsonComponentSerializer.gson().serialize(directMessage.getComponent())); + + statement.executeUpdate(); + return true; + + } catch (SQLException e) { + e.printStackTrace(); + return false; + } + } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 075088f4..306a8aff 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -5,15 +5,13 @@ import net.bteuk.network.Network; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.gui.Gui; -import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.FocusEvent; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserDisconnect; -import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -26,12 +24,6 @@ import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; import static net.bteuk.network.lib.enums.ChatChannels.REVIEWER; import static net.bteuk.network.lib.enums.ChatChannels.STAFF; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.enums.ServerType.EARTH; -import static net.bteuk.network.utils.enums.ServerType.PLOT; public class NetworkUser { @@ -39,6 +31,8 @@ public class NetworkUser { public final Player player; // Network instance. private final Network instance; + + private final Constants constants; // Main gui, includes everything that is part of the navigator. public Gui mainGui; @@ -47,11 +41,7 @@ public class NetworkUser { // Staff gui. public Gui staffGui; - // Region information. - public boolean inRegion; - public Region region; - public int dx; - public int dz; + // If the player is switching server. @Getter @Setter @@ -107,9 +97,10 @@ public class NetworkUser { @Getter private boolean focusEnabled; - public NetworkUser(Player player, UserConnectReply reply) { + public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles) { - this.instance = Network.getInstance(); + this.instance = instance; + this.constants = constants; this.player = player; @@ -126,7 +117,7 @@ public NetworkUser(Player player, UserConnectReply reply) { setAfk(false); last_movement = Time.currentTime(); - primaryRole = Roles.getPrimaryRole(player); + primaryRole = roles.getPrimaryRole(player); // Get discord linked status. // If they're linked get discord id. @@ -150,29 +141,6 @@ public NetworkUser(Player player, UserConnectReply reply) { } } - // Check if the player is in a region. - if (REGIONS_ENABLED) { - if (SERVER_TYPE == EARTH) { - // Check if they are in the earth world. - if (player.getWorld().getName().equals(EARTH_WORLD)) { - region = instance.getRegionManager().getRegion(player.getLocation()); - // Add region to database if not exists. - region.addToDatabase(); - inRegion = true; - } - } else if (SERVER_TYPE == PLOT) { - // Check if the player is in a buildable plot world and apply coordinate transform if true. - if (instance.getPlotSQL() - .hasRow("SELECT name FROM location_data WHERE name='" + player.getLocation().getWorld() - .getName() + "';")) { - updateCoordinateTransform(instance.getPlotSQL(), player.getLocation()); - - region = instance.getRegionManager().getRegion(player.getLocation(), dx, dz); - inRegion = true; - } - } - } - runEvents(); // Give the player nightvision if enabled or remove it if disabled. @@ -190,17 +158,6 @@ public NetworkUser(Player player, UserConnectReply reply) { } } - /** - * Get the name of a user. - * - * @param uuid uuid of the user - * @return {@link String} name of the user - */ - public static String getName(String uuid) { - return Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data WHERE uuid='" + uuid + - "';"); - } - /** * Get the chat channels to which this user has access. * @@ -223,22 +180,10 @@ public static Set getChannels(Player player) { return channels; } - /** - * Send the user an offline message. This also works for online players. - * - * @param uuid uuid of the user - * @param message the message to send - */ - public static void sendOfflineMessage(String uuid, Component message) { - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", message - , true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - public UserDisconnect createDisconnectEvent() { return new UserDisconnect( player.getUniqueId().toString(), - SERVER_NAME, + constants.serverName(), isNavigatorEnabled(), isTeleportEnabled(), isNightvisionEnabled(), @@ -275,6 +220,7 @@ private void runEvents() { " type='network';"); // Send the event to the event handler. + // TODO: Timers instance.getTimers().getEventManager().event(player.getUniqueId().toString(), aEvent, message); } }, 20L); @@ -316,11 +262,7 @@ public void sendMessage(Component message) { player.sendMessage(message); } - public void updateCoordinateTransform(PlotSQL plotSQL, Location l) { - dx = -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + l.getWorld().getName() + "';"); - dz = -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + l.getWorld().getName() + "';"); - } - + // TODO: Use regionUser instance to determine coordinate transformation. public Location getLocationWithCoordinateTransform() { return new Location( player.getWorld(), diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 642abce1..1346e59b 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -1,5 +1,7 @@ package net.bteuk.network.utils; +import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; @@ -8,6 +10,7 @@ import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.PlotSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -29,9 +32,9 @@ import java.util.stream.Stream; import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; -import static net.bteuk.network.utils.Constants.LOGGER; import static net.bteuk.network.utils.NetworkConfig.CONFIG; +@Log public final class Roles { private static final Component PROMOTION_TEMPLATE = Component.text(" has been promoted to "); @@ -41,14 +44,26 @@ public final class Roles { .collect(Collectors.toCollection(LinkedHashSet::new)); private static Set ROLES; - public static Set getRoles() { + private final Network instance; + + private final CustomChat customChat; + + private final PlotSQL plotSQL; + + public Roles(Network instance, CustomChat customChat, PlotSQL plotSQL) { + this.instance = instance; + this.customChat = customChat; + this.plotSQL = plotSQL; + } + + public Set getRoles() { if (ROLES == null) { loadRoles(); } return ROLES; } - public static Role getRoleById(String roleId) { + public Role getRoleById(String roleId) { // Get the configuration if not yet fetches. if (ROLES == null) { loadRoles(); @@ -69,7 +84,7 @@ public static Role getRoleById(String roleId) { Architect */ - public static Role builderRole(Player p) { + public Role builderRole(Player p) { String roleToGet = "default"; for (String roleName : BUILDER_ROLE_NAMES) { if (p.hasPermission("group." + roleName)) { @@ -112,7 +127,7 @@ public static CompletableFuture builderRole(String uuid) { }); } - public static Role getPrimaryRole(Player p) { + public Role getPrimaryRole(Player p) { // Get the configuration if not yet fetches. if (ROLES == null) { loadRoles(); @@ -125,12 +140,12 @@ public static Role getPrimaryRole(Player p) { return null; } - private static void loadRoles() { + private void loadRoles() { // Create roles.yml if not exists. // The data folder should already exist since the plugin will always create config.yml first. - File rolesFile = new File(Network.getInstance().getDataFolder(), "roles.yml"); + File rolesFile = new File(instance.getDataFolder(), "roles.yml"); if (!rolesFile.exists()) { - Network.getInstance().saveResource("roles.yml", false); + instance.saveResource("roles.yml", false); } FileConfiguration rolesConfig = YamlConfiguration.loadConfiguration(rolesFile); @@ -159,10 +174,10 @@ private static void loadRoles() { * Discord syncing will not be applied with this method due to deprecation. */ @Deprecated - public static void promoteBuilder(String uuid, String pRole, String nRole) { + public void promoteBuilder(String uuid, String pRole, String nRole) { // Get console sender. - ConsoleCommandSender console = Network.getInstance().getServer().getConsoleSender(); + ConsoleCommandSender console = instance.getServer().getConsoleSender(); // Add new builder role. Bukkit.getServer().dispatchCommand(console, "lp user " + uuid + " parent add " + nRole); @@ -171,7 +186,7 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { Bukkit.getServer().dispatchCommand(console, "lp user " + uuid + " parent remove " + pRole); // Update database. - Network.getInstance().getGlobalSQL().update("UPDATE player_data SET builder_role='" + nRole + "' WHERE " + + instance.getGlobalSQL().update("UPDATE player_data SET builder_role='" + nRole + "' WHERE " + "uuid='" + uuid + "';"); // Announce the promotion in chat and discord. @@ -180,8 +195,7 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { Component colouredRole = Component.text(Objects.requireNonNull(CONFIG.getString("roles." + nRole + ".name")), TextColor.fromHexString(Objects.requireNonNull(CONFIG.getString("roles." + nRole + ".colour")))); if (CONFIG.getBoolean("chat.announce_promotions")) { - String name = - Network.getInstance().getGlobalSQL() + String name = instance.getGlobalSQL() .getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';"); Component promotation_message = Component.text(name) @@ -190,17 +204,17 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { promotation_message = promotation_message.decorate(TextDecoration.BOLD); ChatMessage chatMessage = new ChatMessage(GLOBAL.getChannelName(), "server", promotation_message); - Network.getInstance().getChat().sendSocketMessage(chatMessage); + customChat.sendSocketMessage(chatMessage); } // Check if the player is online. - if (!Network.getInstance().isOnlineOnNetwork(uuid)) { + if (!instance.isOnlineOnNetwork(uuid)) { // Send a message that will show when they next log in. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", PROMOTION_SELF.append(colouredRole), true); - Network.getInstance().getChat().sendSocketMessage(directMessage); + customChat.sendDirectMessage(directMessage); } } @@ -213,7 +227,7 @@ public static void promoteBuilder(String uuid, String pRole, String nRole) { * @param announce whether to announce the promotion (demotion is never announced) * @return {@link CompletableFuture} completableFuture with {@link Component} message. */ - public static CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, + public CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, boolean announce) { // Get the configured group. @@ -240,7 +254,7 @@ public static CompletableFuture alterRole(String uuid, String name, S return ChatUtils.error("Modifying the permissions failed!"); } - LOGGER.info(String.format("Group before %s, group after %s", groupBefore, groupAfter)); + log.info(String.format("Group before %s, group after %s", groupBefore, groupAfter)); if (!groupBefore.equals(groupAfter)) { // Update primary role in TAB. Role primaryRole = getRoleById(groupAfter); @@ -252,17 +266,17 @@ public static CompletableFuture alterRole(String uuid, String name, S UserUpdate userUpdate = new UserUpdate(); userUpdate.setUuid(uuid); userUpdate.setTabPlayer(tabPlayer); - Network.getInstance().getChat().sendSocketMessage(userUpdate); + customChat.sendSocketMessage(userUpdate); // If the new primary role is architect or reviewer, and they were promoted add them to the reviewers // database table. if (!remove && (primaryRole.getId().equals("architect") || primaryRole.getId().equals("reviewer"))) { - Network.getInstance().getPlotSQL().addOrUpdateReviewer(uuid, primaryRole.getId()); + plotSQL.addOrUpdateReviewer(uuid, primaryRole.getId()); } } DiscordRole discordRole = new DiscordRole(uuid, roleId, !remove); - Network.getInstance().getChat().sendSocketMessage(discordRole); + customChat.sendSocketMessage(discordRole); if (announce && !remove) { sendPromotionChatMessage(name, role); @@ -280,19 +294,19 @@ public static CompletableFuture alterRole(String uuid, String name, S }); } - private static void sendPromotionChatMessage(String name, Role role) { + private void sendPromotionChatMessage(String name, Role role) { Component message = Component.text(name) .append(PROMOTION_TEMPLATE) .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - Network.getInstance().getChat().sendSocketMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); + customChat.sendChatMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); } - private static void sendPromotionDirectMessage(String uuid, Role role) { + private void sendPromotionDirectMessage(String uuid, Role role) { Component message = PROMOTION_SELF .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - Network.getInstance().getChat().sendSocketMessage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid + customChat.sendDirectMessage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid , "server", message, true)); } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index 19012944..e909c081 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -43,7 +43,7 @@ public class RegionManager { private final WorldGuardAPI worldGuard; private final Constants constants; - private List users = new ArrayList<>(); + private final List users = new ArrayList<>(); public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, PlotAPI plotAPI, ChatAPI chat, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, Constants constants, JavaPlugin plugin, ServerAPI serverAPI) { @@ -226,7 +226,7 @@ public void setPlot(Region region, ChatAPI chat) { ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", getTag(region, uuid)), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); // Leave region in database. regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + @@ -477,7 +477,7 @@ public void denyRequest(Region region, String uuid) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("Your request to join region %s has been denied.", region.regionName()), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); } // Cancel a request for a specific player. @@ -521,7 +521,7 @@ public void requestRegion(Region region, Player player, boolean staffRequest) { ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", ChatUtils.success("A region join request has been submitted by %s for region %s", player.getName(), region.regionName())); - chat.sendSocketMessage(chatMessage); + chat.sendChatMessage(chatMessage); } else { // Owner request @@ -539,7 +539,7 @@ public void requestRegion(Region region, Player player, boolean staffRequest) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), false); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); } } @@ -592,7 +592,7 @@ public void joinRegion(Region region, Player player) { ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(region, owner)), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); // Set region to default, since it would've been set to inactive previously. setDefault(region); @@ -643,7 +643,7 @@ public void joinRegion(Region region, String uuid, int coordinateID) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("You have joined the region %s as a member.", region.regionName()), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); } else { // If the region is inactive, demote the previous owner to a member. @@ -668,7 +668,7 @@ public void joinRegion(Region region, String uuid, int coordinateID) { ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(region, owner)), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); } // Join region as owner. @@ -687,7 +687,7 @@ public void joinRegion(Region region, String uuid, int coordinateID) { DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", ChatUtils.success("You have joined the region %s as the owner.", region.regionName()), true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); } } @@ -702,7 +702,7 @@ public void leaveRegion(Region region, String uuid, Component message) { // Is sent before actual removal so we can read the region tag. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", message, true); - chat.sendSocketMessage(directMessage); + chat.sendDirectMessage(directMessage); // Leave region in database. regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java index 9db83b17..e165bd12 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -26,6 +26,30 @@ public class RegionUser { public RegionUser(Player player) { this.player = player; + + // TODO: Copied from NetworkUser, implement this. + // Check if the player is in a region. + if (constants.regionsEnabled()) { + if (SERVER_TYPE == EARTH) { + // Check if they are in the earth world. + if (player.getWorld().getName().equals(EARTH_WORLD)) { + region = instance.getRegionManager().getRegion(player.getLocation()); + // Add region to database if not exists. + region.addToDatabase(); + inRegion = true; + } + } else if (SERVER_TYPE == PLOT) { + // Check if the player is in a buildable plot world and apply coordinate transform if true. + if (instance.getPlotSQL() + .hasRow("SELECT name FROM location_data WHERE name='" + player.getLocation().getWorld() + .getName() + "';")) { + updateCoordinateTransform(instance.getPlotSQL(), player.getLocation()); + + region = instance.getRegionManager().getRegion(player.getLocation(), dx, dz); + inRegion = true; + } + } + } } public boolean hasTrackedRegion() { diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java index 10500277..6a4f484d 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java @@ -1,4 +1,5 @@ package net.bteuk.network.regions.listener; public class ServerJoinListener { + // TODO: Add regionUser } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java index 1b43e771..64bd83f2 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java @@ -1,4 +1,5 @@ package net.bteuk.network.regions.listener; public class ServerQuitListener { + // TODO: Remove regionUser } diff --git a/pom.xml b/pom.xml index 56d03f92..d8c00511 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 21 ${java-version} - 1.21.4-R0.1-SNAPSHOT + 1.21.8-R0.1-SNAPSHOT From 7411a7b4b0828a927b915de9449a938db45897f2 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 25 Aug 2025 19:29:14 +0200 Subject: [PATCH 06/96] Timer API and region user adding/removing. --- .../net/bteuk/network/api/NetworkAPI.java | 10 ++- .../java/net/bteuk/network/api/TimerAPI.java | 30 +++++++++ .../network/api/entity/ShutdownHook.java | 12 ++++ .../main/java/net/bteuk/network/Network.java | 13 ++++ .../main/java/net/bteuk/network/Timers.java | 53 +--------------- .../bteuk/network/api/impl/TimerAPIImpl.java | 32 ++++++++++ .../building_companion/BuildingCompanion.java | 9 ++- .../building_companion/TpllListener.java | 14 +++-- .../bteuk/network/regions/PlayerEvent.java | 8 +++ .../bteuk/network/regions/RegionManager.java | 63 ++++++++++++++++--- .../regions/listener/RegionMoveListener.java | 7 ++- .../listener/RegionTeleportListener.java | 6 +- .../regions/listener/ServerJoinListener.java | 21 ++++++- .../regions/listener/ServerQuitListener.java | 21 ++++++- 14 files changed, 225 insertions(+), 74 deletions(-) create mode 100644 Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java create mode 100644 Network-API/src/main/java/net/bteuk/network/api/entity/ShutdownHook.java create mode 100644 Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/PlayerEvent.java diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 46829a77..42c49a46 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -1,5 +1,7 @@ package net.bteuk.network.api; +import net.bteuk.network.api.entity.ShutdownHook; + public interface NetworkAPI { ChatAPI getChat(); @@ -8,6 +10,12 @@ public interface NetworkAPI { SQLAPI getGlobalSQL(); - SQLAPI getPlotSQL(); + TimerAPI getTimerAPI(); + /** + * Register a shutdown hook to run on server shutdown. + * + * @param hook the shutdown hook + */ + void registerShutdownHook(ShutdownHook hook); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java b/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java new file mode 100644 index 00000000..614d63c9 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java @@ -0,0 +1,30 @@ +package net.bteuk.network.api; + +/** + * Timer API allows the registering of timers. + */ +public interface TimerAPI { + + /** + * Registers a timer at a specific interval. + * The timer is run synchronously on the server thread, thus if the server is running below a tick rate of 20, the interval will be longer than the given time. + * + * @param runnable the code to run on each interval + * @param intervalMillis the interval + * @return the timer id + */ + default int registerTimer(Runnable runnable, long intervalMillis) { + return registerTimer(runnable, intervalMillis, 0); + } + + /** + * Registers a timer at a specific interval. + * The timer is run synchronously on the server thread, thus if the server is running below a tick rate of 20, the interval will be longer than the given time. + * + * @param runnable the code to run on each interval + * @param intervalMillis the interval + * @param delay the delay until first execution + * @return the timer id + */ + int registerTimer(Runnable runnable, long intervalMillis, long delay); +} diff --git a/Network-API/src/main/java/net/bteuk/network/api/entity/ShutdownHook.java b/Network-API/src/main/java/net/bteuk/network/api/entity/ShutdownHook.java new file mode 100644 index 00000000..011eb274 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/entity/ShutdownHook.java @@ -0,0 +1,12 @@ +package net.bteuk.network.api.entity; + +/** + * Hook to run on server shutdown, order of execution is not guaranteed. + */ +@FunctionalInterface +public interface ShutdownHook { + /** + * Runs on server shutdown. + */ + void shutdown(); +} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 449e1c03..b94cbaef 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -7,6 +7,7 @@ import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.WorldGuardAPI; +import net.bteuk.network.api.entity.ShutdownHook; import net.bteuk.network.api.impl.CoordinateAPIImpl; import net.bteuk.network.api.impl.PlotAPIImpl; import net.bteuk.network.commands.Afk; @@ -63,6 +64,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Optional; import java.util.logging.Handler; import java.util.logging.Level; @@ -153,6 +155,8 @@ public final class Network extends JavaPlugin implements NetworkAPI { private ServerAPI serverAPI; + private final List shutdownHooks = new ArrayList<>(); + @Override public void onEnable() { @@ -402,6 +406,8 @@ public void enablePlugin() { @Override public void onDisable() { + shutdownHooks.forEach(ShutdownHook::shutdown); + // Shut down chat. if (chat != null) { chat.onDisable(); @@ -516,4 +522,11 @@ public PlotAPI getPlotAPI() { } return plotAPI; } + + @Override + public void registerShutdownHook(ShutdownHook hook) { + if (shutdownHooks != null) { + shutdownHooks.add(hook); + } + } } diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 45dc465c..8a8c34f8 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -5,7 +5,6 @@ import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.regions.Inactivity; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import org.bukkit.Bukkit; @@ -18,8 +17,6 @@ @Log public class Timers { - // Region Inactivity - public final long inactivity; // Plugin private final Network instance; // Users @@ -43,8 +40,6 @@ public class Timers { private boolean isBusy; // Navigator Check private ItemStack slot9; - private ArrayList inactive_owners; - private String uuid; public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager, Constants constants, Afk afk) { @@ -60,10 +55,6 @@ public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager, this.constants = constants; - // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds - inactivity = CONFIG.getInt("region_inactivity") * 24L * 60L * 60L * 1000L; - inactive_owners = new ArrayList<>(); - this.afk = afk; // Minutes * 60 seconds * 1000 milliseconds @@ -76,11 +67,12 @@ public void startTimers() { timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { // Check for new server_events. + // TODO: Make this asynchronous. if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "' AND type='network" + "';")) { - // If events is not empty, skip this iteration. - // Additionally isBusy needs to be false, implying that the server is not still running a previous + // If events are not empty, skip this iteration. + // Additionally, isBusy needs to be false, implying that the server is not still running a previous // iteration. if (events.isEmpty() && !isBusy) { @@ -138,45 +130,6 @@ public void startTimers() { } } }, 0L, 20L)); - - // 1-minute timer. - // TODO: Move to region code. - if (constants.regionsEnabled()) { - timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { - - // Check for inactive owners. - // If the region has members then make another member the new owner, - // If the region has no members then set it inactive. - - inactive_owners.clear(); - inactive_owners = instance.regionSQL.getInactives("SELECT rm.region,rm.uuid FROM region_members AS rm" + - " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - inactivity) + " AND r.status <> " + - "'inactive';"); - for (Inactivity inactive : inactive_owners) { - - // Check if there is another member in this region, they must be active. - if (inactive.region.hasActiveMember(Time.currentTime() - inactivity)) { - - // Get most recent member. - uuid = inactive.region.getRecentMember(); - - // Make the previous owner a member. - inactive.region.makeMember(); - - // Give the new player ownership. - inactive.region.makeOwner(uuid); - - // Update any requests to take into account the new region owner. - inactive.region.updateRequests(); - } else { - - // Set region as inactive. - inactive.region.setInactive(); - } - } - - }, 0L, 1200L)); - } } public void close() { diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java new file mode 100644 index 00000000..a4a9c3ec --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java @@ -0,0 +1,32 @@ +package net.bteuk.network.api.impl; + +import net.bteuk.network.Network; +import net.bteuk.network.api.TimerAPI; +import net.bteuk.network.api.entity.ShutdownHook; + +import java.util.HashMap; + +public class TimerAPIImpl implements TimerAPI, ShutdownHook { + + private final HashMap timers = new HashMap<>(); + + private final Network instance; + + public TimerAPIImpl(Network instance) { + this.instance = instance; + instance.registerShutdownHook(this); + } + + @Override + public int registerTimer(Runnable runnable, long intervalMillis, long delay) { + long serverTickInterval = Math.round(intervalMillis / 50.0); + int id = instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, runnable, delay, serverTickInterval); + timers.put(id, runnable); + return id; + } + + @Override + public void shutdown() { + timers.forEach((id, runnable) -> instance.getServer().getScheduler().cancelTask(id)); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java index 2f765ce4..b1de69c3 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -298,8 +299,12 @@ private boolean drawOutlines(SavedOutline outline, BlockData block, boolean perm } } else if (constants.regionsEnabled() && constants.serverType() == ServerType.EARTH) { for (int[] point : outline.corners()) { - // TODO: Get dx, dz from regionUser. - RegionUser regionUser = regionManager.getUserByPlayer(user.player); + Optional optionalRegionUser = regionManager.getUserByPlayer(user.player); + if (optionalRegionUser.isEmpty()) { + sendFeedback(ChatUtils.error("An error occurred, please relog and try again.")); + return false; + } + RegionUser regionUser = optionalRegionUser.get(); Region region = regionManager.getRegion(point[0], point[1], regionUser.getDeltaX(), regionUser.getDeltaZ()); if (!regionManager.canBuild(region, user.player)) { sendFeedback(ChatUtils.error("All or part of your selection is not in a region you can build in, " + diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java index dc126e24..a2efb97b 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/TpllListener.java @@ -14,6 +14,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import java.util.Arrays; +import java.util.Optional; @Log public class TpllListener implements Listener { @@ -64,11 +65,14 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { // Apply coordinate transform if regions are enabled. Location l = new Location(e.getPlayer().getWorld(), proj[0], 1, proj[1]); if (constants.regionsEnabled()) { - RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); - Location newLocation = l.clone(); - newLocation.setX(l.getX() + regionUser.getDeltaX()); - newLocation.setZ(l.getZ() + regionUser.getDeltaZ()); - l = newLocation; + Optional optionalRegionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (optionalRegionUser.isPresent()) { + RegionUser regionUser = optionalRegionUser.get(); + Location newLocation = l.clone(); + newLocation.setX(l.getX() + regionUser.getDeltaX()); + newLocation.setZ(l.getZ() + regionUser.getDeltaZ()); + l = newLocation; + } } // Add a new corner, or update an existing one. diff --git a/Regions/src/main/java/net/bteuk/network/regions/PlayerEvent.java b/Regions/src/main/java/net/bteuk/network/regions/PlayerEvent.java new file mode 100644 index 00000000..3fa2eb3a --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/PlayerEvent.java @@ -0,0 +1,8 @@ +package net.bteuk.network.regions; + +import org.bukkit.entity.Player; + +@FunctionalInterface +public interface PlayerEvent { + void playerEvent(Player player); +} diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index e909c081..8c3fd673 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -4,9 +4,11 @@ import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.NetworkAPI; import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.SQLAPI; import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.TimerAPI; import net.bteuk.network.api.WorldGuardAPI; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; @@ -18,6 +20,8 @@ import net.bteuk.network.papercore.LocationAdapter; import net.bteuk.network.regions.listener.RegionMoveListener; import net.bteuk.network.regions.listener.RegionTeleportListener; +import net.bteuk.network.regions.listener.ServerJoinListener; +import net.bteuk.network.regions.listener.ServerQuitListener; import net.bteuk.network.regions.sql.RegionSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -26,9 +30,12 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; +import java.util.Set; @Log public class RegionManager { @@ -42,28 +49,31 @@ public class RegionManager { private final EventAPI eventAPI; private final WorldGuardAPI worldGuard; private final Constants constants; + private final Set users = new HashSet<>(); - private final List users = new ArrayList<>(); - - public RegionManager(RegionSQL regionSQL, SQLAPI globalSQL, PlotAPI plotAPI, ChatAPI chat, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, + public RegionManager(RegionSQL regionSQL, NetworkAPI networkAPI, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, Constants constants, JavaPlugin plugin, ServerAPI serverAPI) { regions = new HashMap<>(); this.regionSQL = regionSQL; - this.globalSQL = globalSQL; - this.plotAPI = plotAPI; - this.chat = chat; + this.globalSQL = networkAPI.getGlobalSQL(); + this.plotAPI = networkAPI.getPlotAPI(); + this.chat = networkAPI.getChat(); this.coordinateAPI = coordinateAPI; this.eventAPI = eventAPI; this.worldGuard = worldGuard; this.constants = constants; + new ServerJoinListener(plugin, player -> users.add(new RegionUser(player))); + new ServerQuitListener(plugin, player -> getUserByPlayer(player).ifPresent(users::remove)); new RegionMoveListener(plugin, this, plotAPI, constants, globalSQL, eventAPI, serverAPI); new RegionTeleportListener(plugin, this, constants, plotAPI); + + registerInactivityTimer(networkAPI.getTimerAPI()); } - public RegionUser getUserByPlayer(Player player) { - return users.stream().filter(user -> user.getPlayer().equals(player)).findFirst().orElse(null); + public Optional getUserByPlayer(Player player) { + return users.stream().filter(user -> user.getPlayer().equals(player)).findFirst(); } /** @@ -811,4 +821,41 @@ public boolean canBuild(Region region, Player p) { return ((status(region) == RegionStatus.OPEN && p.hasPermission("group.jrbuilder")) || isOwner(region, p.getUniqueId().toString()) || isMember(region, p.getUniqueId().toString())); } + + private void registerInactivityTimer(TimerAPI timerAPI) { + timerAPI.registerTimer(() -> { + // Check for inactive owners. + // If the region has members, then make the most recently active member the new owner, + // If the region has no members, then set it inactive. + List inactive_owners = regionSQL.getInactives("SELECT rm.region,rm.uuid FROM region_members AS rm" + + " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - constants.regionInactivity()) + " AND r" + + ".status <> " + + "'inactive';"); + long currentTime = Time.currentTime(); + + for (Inactivity inactive : inactive_owners) { + Region region = getRegion(inactive.regionName()); + + // Check if there is another member in this region, they must be active. + if (hasActiveMember(region, currentTime)) { + + // Get the most recently active member. + String uuid = getRecentMember(region); + + // Make the previous owner a member. + makeMember(region); + + // Give the new player ownership. + makeOwner(region, uuid); + + // Update any requests to take into account the new region owner. + updateRequests(region); + + } else { + // Set the region as inactive. + setInactive(region); + } + } + }, 60_000L); + } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index 43aa4d68..ebb7ff47 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -20,6 +20,8 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.plugin.java.JavaPlugin; +import java.util.Optional; + @Log public class RegionMoveListener extends AbstractMoveListener implements Listener { private final PlotAPI plotAPI; @@ -47,11 +49,12 @@ public RegionMoveListener(JavaPlugin plugin, RegionManager regionManager, PlotAP @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent e) { - RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); - if (regionUser == null) { + Optional optionalRegionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (optionalRegionUser.isEmpty()) { log.severe("Region user is null for player " + e.getPlayer().getName()); return; } + RegionUser regionUser = optionalRegionUser.get(); // Check for movement between regions. // If the player is currently not in a region, then that implies they are in a world without regions, so diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java index 2bba91e1..d9dc3fcb 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java @@ -14,6 +14,7 @@ import org.bukkit.plugin.java.JavaPlugin; import java.util.Objects; +import java.util.Optional; import static net.bteuk.network.core.ServerType.EARTH; import static net.bteuk.network.core.ServerType.PLOT; @@ -38,11 +39,12 @@ public RegionTeleportListener(JavaPlugin instance, RegionManager regionManager, @EventHandler public void onPlayerTeleport(PlayerTeleportEvent e) { - RegionUser regionUser = regionManager.getUserByPlayer(e.getPlayer()); - if (regionUser == null) { + Optional optionalRegionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (optionalRegionUser.isEmpty()) { log.severe("Region user is null for player " + e.getPlayer().getName()); return; } + RegionUser regionUser = optionalRegionUser.get(); Region newRegion = getRegion(regionUser, e.getTo()); diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java index 6a4f484d..5a39f1c8 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerJoinListener.java @@ -1,5 +1,22 @@ package net.bteuk.network.regions.listener; -public class ServerJoinListener { - // TODO: Add regionUser +import net.bteuk.network.regions.PlayerEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class ServerJoinListener implements Listener { + + private final PlayerEvent onServerJoin; + + public ServerJoinListener(JavaPlugin plugin, PlayerEvent onServerJoin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + this.onServerJoin = onServerJoin; + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + onServerJoin.playerEvent(event.getPlayer()); + } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java index 64bd83f2..4e3594a7 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/ServerQuitListener.java @@ -1,5 +1,22 @@ package net.bteuk.network.regions.listener; -public class ServerQuitListener { - // TODO: Remove regionUser +import net.bteuk.network.regions.PlayerEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class ServerQuitListener implements Listener { + + private final PlayerEvent onServerQuit; + + public ServerQuitListener(JavaPlugin plugin, PlayerEvent onServerQuit) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + this.onServerQuit = onServerQuit; + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + onServerQuit.playerEvent(event.getPlayer()); + } } From 3748be8011647492932058948b524b16a681d47b Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 25 Aug 2025 20:56:12 +0200 Subject: [PATCH 07/96] Rework command manager, migrating commands. --- .../net/bteuk/network/core/Constants.java | 5 +- .../net/bteuk/network/CommandManager.java | 166 ++--------- .../main/java/net/bteuk/network/Network.java | 277 ++++++++++++------ .../java/net/bteuk/network/TabManager.java | 47 +-- .../network/commands/AbstractCommand.java | 9 + .../java/net/bteuk/network/commands/Afk.java | 10 + .../net/bteuk/network/commands/Where.java | 79 +++-- .../network/commands/navigation/Tpll.java | 10 + .../net/bteuk/network/commands/staff/Ban.java | 42 ++- .../bteuk/network/commands/staff/Kick.java | 41 ++- .../bteuk/network/commands/staff/Mute.java | 43 ++- .../bteuk/network/commands/staff/Unban.java | 40 ++- .../bteuk/network/commands/staff/Unmute.java | 39 ++- .../eventing/listeners/CommandPreProcess.java | 6 +- .../network/eventing/listeners/Connect.java | 66 +++-- .../eventing/listeners/GuiListener.java | 6 +- .../listeners/NetworkTeleportListener.java | 6 +- .../eventing/listeners/PreJoinServer.java | 25 +- .../bteuk/network/utils/NetworkConfig.java | 94 +++--- .../bteuk/network/utils/staff/Moderation.java | 77 ++--- 20 files changed, 588 insertions(+), 500 deletions(-) diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index b5dffb28..5750377b 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -2,6 +2,7 @@ import java.util.List; -public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, int maxY, int minY, String earthWorld, +public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, - boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled) { } + boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, + boolean moderationEnabled) { } diff --git a/Plugin/src/main/java/net/bteuk/network/CommandManager.java b/Plugin/src/main/java/net/bteuk/network/CommandManager.java index 075bd49a..88f158c3 100644 --- a/Plugin/src/main/java/net/bteuk/network/CommandManager.java +++ b/Plugin/src/main/java/net/bteuk/network/CommandManager.java @@ -4,164 +4,46 @@ import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.Afk; -import net.bteuk.network.commands.BuildingCompanionCommand; -import net.bteuk.network.commands.Buildings; -import net.bteuk.network.commands.Clear; -import net.bteuk.network.commands.Demote; -import net.bteuk.network.commands.Discord; -import net.bteuk.network.commands.Focus; -import net.bteuk.network.commands.Gamemode; -import net.bteuk.network.commands.Hdb; -import net.bteuk.network.commands.Help; -import net.bteuk.network.commands.Me; -import net.bteuk.network.commands.Msg; -import net.bteuk.network.commands.Navigator; -import net.bteuk.network.commands.Nightvision; -import net.bteuk.network.commands.Phead; -import net.bteuk.network.commands.Plot; -import net.bteuk.network.commands.Pmute; -import net.bteuk.network.commands.ProgressMap; -import net.bteuk.network.commands.Promote; -import net.bteuk.network.commands.Ptime; -import net.bteuk.network.commands.Punmute; -import net.bteuk.network.commands.Pweather; -import net.bteuk.network.commands.RegionCommand; -import net.bteuk.network.commands.Reply; -import net.bteuk.network.commands.Rules; -import net.bteuk.network.commands.Season; -import net.bteuk.network.commands.Speed; -import net.bteuk.network.commands.TipsToggle; -import net.bteuk.network.commands.Where; -import net.bteuk.network.commands.Zone; -import net.bteuk.network.commands.give.GiveBarrier; -import net.bteuk.network.commands.give.GiveDebugStick; -import net.bteuk.network.commands.give.GiveLight; -import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.commands.navigation.Delhome; -import net.bteuk.network.commands.navigation.Home; -import net.bteuk.network.commands.navigation.Homes; -import net.bteuk.network.commands.navigation.Navigation; -import net.bteuk.network.commands.navigation.Server; -import net.bteuk.network.commands.navigation.Sethome; -import net.bteuk.network.commands.navigation.Spawn; -import net.bteuk.network.commands.navigation.Tp; -import net.bteuk.network.commands.navigation.TpToggle; -import net.bteuk.network.commands.navigation.Warp; -import net.bteuk.network.commands.navigation.Warps; -import net.bteuk.network.commands.staff.Exp; -import net.bteuk.network.commands.staff.Staff; import net.bteuk.network.core.Constants; -import net.bteuk.network.lobby.LobbyCommand; import net.bteuk.network.regions.RegionManager; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -import java.util.List; - -import static net.bteuk.network.utils.NetworkConfig.CONFIG; +import java.util.HashSet; +import java.util.Set; public class CommandManager { - public static void registerCommands(Network instance, Constants constants, EventAPI eventAPI, Afk afk, RegionManager regionManager) { + private final Network instance; - LifecycleEventManager manager = instance.getLifecycleManager(); + private final Set commandsToRegister = new HashSet<>(); + + public CommandManager(Network instance) { + this.instance = instance; + } + + public void registerCommand(AbstractCommand command) { + commandsToRegister.add(command); + } + + public void enableCommands() { + LifecycleEventManager<@NotNull Plugin> manager = instance.getLifecycleManager(); manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { final Commands commands = event.registrar(); - /* - * Navigation commands. - */ - if (constants.tpllEnabled()) { - commands.register("tpll", "Teleport to coordinates", instance.getTpll()); - } - if (constants.ll()) { - commands.register("where", "Returns the coordinates where the player is standing with a link to google maps.", List.of("location", "ll"), new Where(instance)); - } - commands.register("teleport", "Teleport to any online player.", List.of("tp"), new Tp()); - commands.register("back", "Teleports the player to the previous teleported location.", new Back(eventAPI)); - commands.register("warp", "Warp to locations in the exploration menu.", new Warp()); - commands.register("warps", "List all warps on the server, 16 per page.", new Warps()); - commands.register("navigation", "Adds commands to do with navigation.", new Navigation()); - if (!constants.standalone()) { - commands.register("lobby", "Command for all lobby management.", new LobbyCommand(instance)); - commands.register("spawn", "Teleport to spawnpoint in lobby.", new Spawn()); - commands.register("server", "Switch server by command.", new Server()); - } - if (CONFIG.getBoolean("homes.enabled")) { - commands.register("sethome", "Set a home to your current location.", new Sethome(instance)); - commands.register("home", "Teleport to your home.", new Home(instance)); - commands.register("delhome", "Delete a home.", new Delhome(instance)); - commands.register("homes", "Like warps, but for homes, shows all homes the player has set.", new Homes()); - } + commandsToRegister.forEach(command -> commands.register(command.getLabel(), command.getDescription(), command.getAliases(), command)); + }); + } - /* - * Gui commands. - */ - commands.register("navigator", "Opens the main gui, will always return to the previous menu if possible.", List.of("nav", "gui", "menu", "claim"), new Navigator()); - if (constants.plotSystemEnabled()) { - commands.register("plot", "Allows players to manipulate plots without using the gui.", List.of("plots"), new Plot(instance)); - commands.register("zone", "Zone command.", new Zone()); - } - if (constants.regionsEnabled()) { - commands.register("region", "Allows players to manipulate regions without using the gui.", new RegionCommand()); - } + public static void registerCommands(Network instance, Constants constants, EventAPI eventAPI, Afk afk, RegionManager regionManager) { - /* - * Staff commands. - */ - commands.register("staff", "Opens the Staff Menu.", List.of("st"), new Staff()); - if (CONFIG.getBoolean("staff.moderation.enabled")) { - commands.register("ban", "Bans a player for a specific duration and reason.", instance.getBan()); - commands.register("mute", "Mutes a player for a specific duration and reason.", instance.getMute()); - commands.register("kick", "Kick a player for the server.", instance.getKick()); - commands.register("unban", "Unban a previously banned player.", instance.getUnban()); - commands.register("unmute", "Unmute a previously muted player.", instance.getUnmute()); - } + LifecycleEventManager manager = instance.getLifecycleManager(); + manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { + final Commands commands = event.registrar(); - /* - * Utility commands. - */ - commands.register("building", "adds or shows completed buildings", new Buildings(instance)); - commands.register("teleporttoggle", "Enables/Disables the ability for other players to teleport to you.", List.of("tptoggle", "toggleteleport", "toggletp"), new TpToggle()); - if (!constants.standalone()) { - commands.register("discord", "Sends a link to our discord server.", new Discord()); - commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); - } - commands.register("nightvision", "Toggle nightvision.", List.of("nv"), new Nightvision()); - commands.register("speed", "Sets the players speed, value up to 10.", new Speed()); - commands.register("help", "Help menu for information on commands and server features.", new Help()); - commands.register("afk", "Toggles afk status.", afk); - commands.register("rules", "Get rules book.", new Rules()); - commands.register("clear", "Clears your inventory.", new Clear()); - commands.register("debugstick", "Get the debug stick.", new GiveDebugStick(instance)); - commands.register("light", "Get a light block.", new GiveLight(instance)); - commands.register("barrier", "Get a barrier block.", new GiveBarrier(instance)); - commands.register("gamemode", "Switch gamemode.", List.of("gm"), new Gamemode()); - commands.register("phead", "Get the player head of someone who has connected to the server.", new Phead()); - commands.register("hdb", "Added so it can be routed to /skulls", new Hdb()); - if (constants.progressMap()) { - commands.register("progressmap", "Sends a link of the progress map", List.of("progress"), new ProgressMap()); - } - if (constants.tips()) { - commands.register("tips", "Toggles tips in chat.", List.of("toggletips", "tipstoggle"), new TipsToggle()); - } - commands.register("ptime", "Sets the time of day for the player", new Ptime()); - commands.register("pweather", "Sets the weather for the player", new Pweather()); - commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); - commands.register("exp", "Test command for adding exp.", new Exp()); - commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand(instance, constants, regionManager)); - commands.register("pmute", "Mute a player", new Pmute(instance)); - commands.register("punmute", "Unmute a player", new Punmute(instance)); - Msg msgCommand = new Msg(instance); - commands.register("msg", "Sends a direct message to a player.", msgCommand); - commands.register("w", "Sends a direct message to a player.", msgCommand); - commands.register("tell", "Sends a direct message to a player.", msgCommand); - commands.register("r","sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); - commands.register("promote", "Add a role to a player.", new Promote(instance)); - commands.register("demote", "Remove a role from a player.", new Demote(instance)); - commands.register("me", "Disabled", new Me()); - // commands.register("bteuk", "Test", new BTEUK()); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index b94cbaef..3552ecba 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -10,11 +10,58 @@ import net.bteuk.network.api.entity.ShutdownHook; import net.bteuk.network.api.impl.CoordinateAPIImpl; import net.bteuk.network.api.impl.PlotAPIImpl; +import net.bteuk.network.api.impl.TimerAPIImpl; import net.bteuk.network.commands.Afk; +import net.bteuk.network.commands.BuildingCompanionCommand; +import net.bteuk.network.commands.Buildings; +import net.bteuk.network.commands.Clear; +import net.bteuk.network.commands.Demote; +import net.bteuk.network.commands.Discord; +import net.bteuk.network.commands.Focus; +import net.bteuk.network.commands.Gamemode; +import net.bteuk.network.commands.Hdb; +import net.bteuk.network.commands.Help; +import net.bteuk.network.commands.Me; +import net.bteuk.network.commands.Msg; +import net.bteuk.network.commands.Navigator; +import net.bteuk.network.commands.Nightvision; +import net.bteuk.network.commands.Phead; +import net.bteuk.network.commands.Plot; +import net.bteuk.network.commands.Pmute; +import net.bteuk.network.commands.ProgressMap; +import net.bteuk.network.commands.Promote; +import net.bteuk.network.commands.Ptime; +import net.bteuk.network.commands.Punmute; +import net.bteuk.network.commands.Pweather; +import net.bteuk.network.commands.RegionCommand; +import net.bteuk.network.commands.Reply; +import net.bteuk.network.commands.Rules; +import net.bteuk.network.commands.Season; +import net.bteuk.network.commands.Speed; +import net.bteuk.network.commands.TipsToggle; +import net.bteuk.network.commands.Where; +import net.bteuk.network.commands.Zone; +import net.bteuk.network.commands.give.GiveBarrier; +import net.bteuk.network.commands.give.GiveDebugStick; +import net.bteuk.network.commands.give.GiveLight; +import net.bteuk.network.commands.navigation.Back; +import net.bteuk.network.commands.navigation.Delhome; +import net.bteuk.network.commands.navigation.Home; +import net.bteuk.network.commands.navigation.Homes; +import net.bteuk.network.commands.navigation.Navigation; +import net.bteuk.network.commands.navigation.Server; +import net.bteuk.network.commands.navigation.Sethome; +import net.bteuk.network.commands.navigation.Spawn; +import net.bteuk.network.commands.navigation.Tp; +import net.bteuk.network.commands.navigation.TpToggle; import net.bteuk.network.commands.navigation.Tpll; +import net.bteuk.network.commands.navigation.Warp; +import net.bteuk.network.commands.navigation.Warps; import net.bteuk.network.commands.staff.Ban; +import net.bteuk.network.commands.staff.Exp; import net.bteuk.network.commands.staff.Kick; import net.bteuk.network.commands.staff.Mute; +import net.bteuk.network.commands.staff.Staff; import net.bteuk.network.commands.staff.Unban; import net.bteuk.network.commands.staff.Unmute; import net.bteuk.network.core.Constants; @@ -36,6 +83,7 @@ import net.bteuk.network.lib.dto.OnlineUsersReply; import net.bteuk.network.lib.dto.ServerStartup; import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.lobby.LobbyCommand; import net.bteuk.network.logging.BukkitForwardingHandler; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.sql.RegionSQL; @@ -48,6 +96,7 @@ import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Tips; import net.bteuk.network.utils.Utils; +import net.bteuk.network.utils.staff.Moderation; import net.bteuk.network.utils.worldguard.WorldGuard; import net.bteuk.teachingtutorials.services.PromotionService; import net.buildtheearth.terraminusminus.TerraConfig; @@ -70,16 +119,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - @Log public final class Network extends JavaPlugin implements NetworkAPI { - // Returns an instance of the plugin. - private static Network instance; - - // If the server can shutdown. - public boolean allow_shutdown; + // If the server can shut down. + public boolean allowShutdown; // Guis public NavigatorGui navigatorGui; public ItemStack navigator; @@ -97,7 +141,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { // Server User List private ArrayList networkUsers; // SQL - @Getter private PlotSQL plotSQL; @Getter @@ -106,35 +149,11 @@ public final class Network extends JavaPlugin implements NetworkAPI { @Getter private CustomChat chat; // Timers - private Timers timers; - // Get lobby. - // Lobby - private Lobby lobby; - // Listener and manager of server connects. - private Connect connect; + @Getter + private TimerAPIImpl timerAPI; // Tab private TabManager tab; - // Kick Command - @Getter - private Kick kick; - - // Mute Command - @Getter - private Mute mute; - - // Unmute Command - @Getter - private Unmute unmute; - - // Ban Command - @Getter - private Ban ban; - - // Unban Command - @Getter - private Unban unban; - // Tpll Command @Getter private Tpll tpll; @@ -145,12 +164,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { private PlotAPI plotAPI; - private CoordinateAPI coordinateAPI; - - private EventManager eventManager; - - private WorldGuardAPI worldGuardAPI; - private Constants constants; private ServerAPI serverAPI; @@ -172,10 +185,7 @@ public void onEnable() { base.addHandler(new BukkitForwardingHandler(getLogger())); - // Config Setup - Network.instance = this; - - allow_shutdown = true; + allowShutdown = true; // Sets the config if the file has not yet been created. ConfigurationSerialization.registerClass(ConfigurationSerializable.class); @@ -184,10 +194,10 @@ public void onEnable() { // Update the config to the latest version if it's outdated. // It will copy over any keys that remain the same. // This will also set the status variable to access the config project-wide. - NetworkConfig networkConfig = new NetworkConfig(); + NetworkConfig networkConfig = new NetworkConfig(this); networkConfig.updateConfig(); - if (!CONFIG.getBoolean("enabled")) { + if (!networkConfig.getConfig().getBoolean("enabled")) { getLogger().warning("The config must be configured before the plugin can be enabled!"); getLogger().warning("Please edit the database values in the config, give the server a unique name and " + @@ -201,26 +211,26 @@ public void onEnable() { // Setup MySQL try { DatabaseInit init = new DatabaseInit(); - String host = CONFIG.getString("host"); - int port = CONFIG.getInt("port"); - String username = CONFIG.getString("username"); - String password = CONFIG.getString("password"); + String host = networkConfig.getConfig().getString("host"); + int port = networkConfig.getConfig().getInt("port"); + String username = networkConfig.getConfig().getString("username"); + String password = networkConfig.getConfig().getString("password"); // Global Database - String global_database = CONFIG.getString("database.global"); + String global_database = networkConfig.getConfig().getString("database.global"); DataSource global_dataSource = init.mysqlSetup(global_database, host, port, username, password); globalSQL = new GlobalSQL(global_dataSource, constants); // Region Database if (constants.regionsEnabled()) { - String region_database = CONFIG.getString("database.region"); + String region_database = networkConfig.getConfig().getString("database.region"); DataSource region_dataSource = init.mysqlSetup(region_database, host, port, username, password); regionSQL = new RegionSQL(region_dataSource); } // Plot Database if (constants.plotSystemEnabled()) { - String plot_database = CONFIG.getString("database.plot"); + String plot_database = networkConfig.getConfig().getString("database.plot"); DataSource plot_dataSource = init.mysqlSetup(plot_database, host, port, username, password); plotSQL = new PlotSQL(plot_dataSource); } @@ -237,11 +247,11 @@ public void onEnable() { tutorialsDBConnection = new DBConnection(); // Extract database details from the config - String szHost = CONFIG.getString("tutorials.database.host"); - int iPort = CONFIG.getInt("tutorials.database.port"); - String szDBName = CONFIG.getString("tutorials.database.name"); - String szUsername = CONFIG.getString("tutorials.database.username"); - String szPassword = CONFIG.getString("tutorials.database.password"); + String szHost = networkConfig.getConfig().getString("tutorials.database.host"); + int iPort = networkConfig.getConfig().getInt("tutorials.database.port"); + String szDBName = networkConfig.getConfig().getString("tutorials.database.name"); + String szUsername = networkConfig.getConfig().getString("tutorials.database.username"); + String szPassword = networkConfig.getConfig().getString("tutorials.database.password"); // Set up the DBConnection object with details tutorialsDBConnection.externalMySQLSetup(szHost, iPort, szDBName, szUsername, szPassword); @@ -286,9 +296,13 @@ public void enablePlugin() { networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); - coordinateAPI = new CoordinateAPIImpl(globalSQL); - eventManager = new EventManager(globalSQL); - worldGuardAPI = new WorldGuard(); + CommandManager commandManager = new CommandManager(this); + + CoordinateAPI coordinateAPI = new CoordinateAPIImpl(globalSQL); + EventManager eventManager = new EventManager(globalSQL); + WorldGuardAPI worldGuardAPI = new WorldGuard(); + + Roles roles = new Roles(this, chat, plotSQL); if (!constants.standalone()) { serverAPI = new SwitchServer(constants); @@ -299,44 +313,49 @@ public void enablePlugin() { } // Enable tab. - tab = new TabManager(this); + if (!constants.standalone()) { + tab = new TabManager(this, constants, roles); + } Afk afk = new Afk(this, chat); + commandManager.registerCommand(afk); - Roles roles = new Roles(this, chat, plotSQL); + // Setup connect, this handles all connections to the server. + // Listener and manager of server connections. + Connect connect = new Connect(this, constants, tab, roles); - // Enabled chat, both global and normal chat are handled through this. + // Enables chat, both global chat and normal chat are handled through it. chat = new CustomChat(this, constants, afk, globalSQL, connect); - // Setup connect, this handles all connections to the server. - connect = new Connect(this, constants); - - // Create navigator. + // Create the navigator. navigatorGui = new NavigatorGui(); navigator = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the" + " navigator.")); + + Moderation moderation = new Moderation(this, eventManager); // Register events. - new PreJoinServer(this); + new PreJoinServer(this, constants, moderation); new GuiListener(this); new PlayerInteract(this); // Create the region manager if enabled. if (constants.regionsEnabled()) { - regionManager = new RegionManager(regionSQL, globalSQL, plotAPI, chat, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); + regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); } moveListener = new NetworkMoveListener(this, afk); teleportListener = new NetworkTeleportListener(this); // Setup Timers - timers = new Timers(this, globalSQL, eventManager, constants, afk); - timers.startTimers(); + timerAPI = new TimerAPIImpl(this); // Set up the lobby, most features are only enabled in the lobby server. if (!constants.standalone()) { - lobby = new Lobby(this); + // Get lobby. + // Lobby + Lobby lobby = new Lobby(this); // Create the rules book. lobby.loadRules(); if (constants.serverType() == ServerType.LOBBY) { @@ -358,15 +377,97 @@ public void enablePlugin() { // Enable commands if (constants.tpllEnabled()) { TerraConfig.reducedConsoleMessages = true; - tpll = new Tpll(instance, CONFIG.getBoolean("requires_permission")); + tpll = new Tpll(this, constants.tpllRequiresPermission()); + commandManager.registerCommand(tpll); } - kick = new Kick(); - mute = new Mute(); - unmute = new Unmute(); - ban = new Ban(); - unban = new Unban(); - CommandManager.registerCommands(this, constants, eventManager, afk, regionManager); + if (constants.ll()) { + commandManager.registerCommand(new Where(plotSQL, constants)); + } + + if (constants.moderationEnabled()) { + commandManager.registerCommand(new Kick(this, moderation)); + commandManager.registerCommand(new Mute(this, moderation)); + commandManager.registerCommand(new Unmute(this, moderation)); + commandManager.registerCommand(new Ban(this, moderation)); + commandManager.registerCommand(new Unban(this, moderation)); + } + + commands.register("teleport", "Teleport to any online player.", List.of("tp"), new Tp()); + commands.register("back", "Teleports the player to the previous teleported location.", new Back(eventAPI)); + commands.register("warp", "Warp to locations in the exploration menu.", new Warp()); + commands.register("warps", "List all warps on the server, 16 per page.", new Warps()); + commands.register("navigation", "Adds commands to do with navigation.", new Navigation()); + if (!constants.standalone()) { + commands.register("lobby", "Command for all lobby management.", new LobbyCommand(instance)); + commands.register("spawn", "Teleport to spawnpoint in lobby.", new Spawn()); + commands.register("server", "Switch server by command.", new Server()); + } + if (CONFIG.getBoolean("homes.enabled")) { + commands.register("sethome", "Set a home to your current location.", new Sethome(instance)); + commands.register("home", "Teleport to your home.", new Home(instance)); + commands.register("delhome", "Delete a home.", new Delhome(instance)); + commands.register("homes", "Like warps, but for homes, shows all homes the player has set.", new Homes()); + } + + /* + * Gui commands. + */ + commands.register("navigator", "Opens the main gui, will always return to the previous menu if possible.", List.of("nav", "gui", "menu", "claim"), new Navigator()); + if (constants.plotSystemEnabled()) { + commands.register("plot", "Allows players to manipulate plots without using the gui.", List.of("plots"), new Plot(instance)); + commands.register("zone", "Zone command.", new Zone()); + } + if (constants.regionsEnabled()) { + commands.register("region", "Allows players to manipulate regions without using the gui.", new RegionCommand()); + } + + /* + * Staff commands. + */ + commands.register("staff", "Opens the Staff Menu.", List.of("st"), new Staff()); + + /* + * Utility commands. + */ + commands.register("building", "adds or shows completed buildings", new Buildings(instance)); + commands.register("teleporttoggle", "Enables/Disables the ability for other players to teleport to you.", List.of("tptoggle", "toggleteleport", "toggletp"), new TpToggle()); + if (!constants.standalone()) { + commands.register("discord", "Sends a link to our discord server.", new Discord()); + commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); + } + commands.register("nightvision", "Toggle nightvision.", List.of("nv"), new Nightvision()); + commands.register("speed", "Sets the players speed, value up to 10.", new Speed()); + commands.register("help", "Help menu for information on commands and server features.", new Help()); + commands.register("rules", "Get rules book.", new Rules()); + commands.register("clear", "Clears your inventory.", new Clear()); + commands.register("debugstick", "Get the debug stick.", new GiveDebugStick(instance)); + commands.register("light", "Get a light block.", new GiveLight(instance)); + commands.register("barrier", "Get a barrier block.", new GiveBarrier(instance)); + commands.register("gamemode", "Switch gamemode.", List.of("gm"), new Gamemode()); + commands.register("phead", "Get the player head of someone who has connected to the server.", new Phead()); + commands.register("hdb", "Added so it can be routed to /skulls", new Hdb()); + if (constants.progressMap()) { + commands.register("progressmap", "Sends a link of the progress map", List.of("progress"), new ProgressMap()); + } + if (constants.tips()) { + commands.register("tips", "Toggles tips in chat.", List.of("toggletips", "tipstoggle"), new TipsToggle()); + } + commands.register("ptime", "Sets the time of day for the player", new Ptime()); + commands.register("pweather", "Sets the weather for the player", new Pweather()); + commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); + commands.register("exp", "Test command for adding exp.", new Exp()); + commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand(instance, constants, regionManager)); + commands.register("pmute", "Mute a player", new Pmute(instance)); + commands.register("punmute", "Unmute a player", new Punmute(instance)); + Msg msgCommand = new Msg(instance); + commands.register("msg", "Sends a direct message to a player.", msgCommand); + commands.register("w", "Sends a direct message to a player.", msgCommand); + commands.register("tell", "Sends a direct message to a player.", msgCommand); + commands.register("r","sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); + commands.register("promote", "Add a role to a player.", new Promote(instance)); + commands.register("demote", "Remove a role from a player.", new Demote(instance)); + commands.register("me", "Disabled", new Me()); // Register commandpreprocess to make sure /network:region runs and not that of another plugin. new CommandPreProcess(this); @@ -396,7 +497,7 @@ public void enablePlugin() { } // Let the Proxy know that the server is enabled. - instance.getChat().sendSocketMessage(new ServerStartup(constants.serverName())); + chat.sendSocketMessage(new ServerStartup(constants.serverName())); // Register the API as a service. getServer().getServicesManager().register(NetworkAPI.class, this, this, ServicePriority.Normal); @@ -413,16 +514,6 @@ public void onDisable() { chat.onDisable(); } - // Shut down tab. - if (tab != null) { - tab.closeTab(); - } - - // Close timers. - if (timers != null) { - timers.close(); - } - if (getUsers() != null) { for (NetworkUser u : getUsers()) { @@ -437,7 +528,7 @@ public void onDisable() { plotSQL.update("DELETE FROM zone_invites WHERE uuid='" + uuid + "';"); // Set last_online time in playerdata. - instance.globalSQL.update("UPDATE player_data SET last_online=" + Time.currentTime() + " WHERE " + + globalSQL.update("UPDATE player_data SET last_online=" + Time.currentTime() + " WHERE " + "UUID='" + uuid + "';"); // Reset last logged time. @@ -506,7 +597,7 @@ public Optional getOnlineUserByNameIgnoreCase(String name) { return onlineUsers.stream().filter(onlineUser -> onlineUser.getName().equalsIgnoreCase(name)).findFirst(); } - // Check if user is on this server. + // Check if a user is on this server. public boolean hasPlayer(String uuid) { for (NetworkUser u : getUsers()) { if (u.player.getUniqueId().toString().equals(uuid)) { diff --git a/Plugin/src/main/java/net/bteuk/network/TabManager.java b/Plugin/src/main/java/net/bteuk/network/TabManager.java index 7a04e6e6..be8062f6 100644 --- a/Plugin/src/main/java/net/bteuk/network/TabManager.java +++ b/Plugin/src/main/java/net/bteuk/network/TabManager.java @@ -9,6 +9,9 @@ import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketListener; import com.comphenix.protocol.wrappers.PlayerInfoData; +import lombok.extern.java.Log; +import net.bteuk.network.api.entity.ShutdownHook; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.dto.AddTeamEvent; import net.bteuk.network.lib.dto.TabPlayer; import net.bteuk.network.utils.Role; @@ -30,37 +33,40 @@ import java.util.Set; import static com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction.ADD_PLAYER; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.SIDEBAR_CONTENT; -import static net.bteuk.network.utils.Constants.SIDEBAR_ENABLED; -import static net.bteuk.network.utils.Constants.SIDEBAR_TITLE; -public class TabManager { +@Log +public class TabManager implements ShutdownHook { private static final char[] ALPHABET = "abcdefghijklmnopqrstuvwxyz".toCharArray(); private final Network instance; + private final Constants constants; + private final Roles roles; private final ProtocolManager pm; private final Map teams = new HashMap<>(); private PacketListener pl; private Scoreboard scoreboard; - public TabManager(Network instance) { + public TabManager(Network instance, Constants constants, Roles roles) { this.instance = instance; + this.constants = constants; + this.roles = roles; pm = ProtocolLibrary.getProtocolManager(); // Teams are used to sort the tab-list by role. initTeams(); + instance.registerShutdownHook(this); + startTab(); } - public static TabPlayer createTabPlayerFromPlayer(Player player) { + public TabPlayer createTabPlayerFromPlayer(Player player) { TabPlayer tabPlayer = new TabPlayer(); tabPlayer.setUuid(player.getUniqueId().toString()); tabPlayer.setName(player.getName()); tabPlayer.setPing(player.getPing()); - Role primaryRole = Roles.getPrimaryRole(player); + Role primaryRole = roles.getPrimaryRole(player); if (primaryRole != null) { tabPlayer.setPrimaryGroup(primaryRole.getId()); @@ -70,11 +76,6 @@ public static TabPlayer createTabPlayerFromPlayer(Player player) { return tabPlayer; } - public void closeTab() { - pm.removePacketListener(pl); - LOGGER.info("Disabled Tab"); - } - /** * Handler for an {@link AddTeamEvent} * @@ -85,10 +86,15 @@ public void handle(AddTeamEvent addTeamEvent) { } public void onPlayerJoin(Player player) { - LOGGER.info(String.format("Scoreboard is null = %s", scoreboard == null)); player.setScoreboard(scoreboard); } + @Override + public void shutdown() { + pm.removePacketListener(pl); + log.info("Disabled Tab"); + } + private void startTab() { createPacketListeners(); pm.addPacketListener(pl); @@ -103,7 +109,7 @@ private void initTeams() { scoreboard = manager.getNewScoreboard(); // Get all the roles. - Set roles = Roles.getRoles(); + Set roles = this.roles.getRoles(); // Each role will get a 2 character name in order of the alphabet to ensure correct sorting. // This has the limitation of 26^2 number of possible roles, but if you go over that you're a bit crazy. @@ -124,13 +130,12 @@ private void initTeams() { } // Set sidebar if enabled. - if (SIDEBAR_ENABLED) { - + if (constants.sidebarEnabled()) { Objective objective = scoreboard.registerNewObjective("sidebar", Criteria.DUMMY, - Component.text(SIDEBAR_TITLE)); + Component.text(constants.sidebarTitle())); objective.setDisplaySlot(DisplaySlot.SIDEBAR); - int score = SIDEBAR_CONTENT.size(); - for (String sidebarText : SIDEBAR_CONTENT) { + int score = constants.sidebarContent().size(); + for (String sidebarText : constants.sidebarContent()) { score--; objective.getScore(sidebarText).setScore(score); } @@ -171,7 +176,7 @@ public void addToTeam(String name, String primaryRole) { if (team != null) { team.addEntry(name); } else { - LOGGER.warning(String.format("Player %s with primary role %s does not have a team.", name, + log.warning(String.format("Player %s with primary role %s does not have a team.", name, primaryRole)); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java index 350a7704..7d449ff8 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java @@ -11,6 +11,7 @@ import java.util.Collection; import java.util.Collections; +import java.util.List; /** * Abstract class for registering a command. @@ -33,6 +34,14 @@ public Collection suggest(CommandSourceStack commandSourceStack, String[ return Collections.emptyList(); } + public abstract String getLabel(); + + public abstract String getDescription(); + + public List getAliases() { + return Collections.emptyList(); + } + /** * Gets the {@link Player} from the server, if the sender is not a player send them a warning with * 'This command can only be run by a player.' diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index 1f155d0b..37b430b4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -63,4 +63,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { updateAfkStatus(user, true); } } + + @Override + public String getLabel() { + return "afk"; + } + + @Override + public String getDescription() { + return "Toggles afk status."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Where.java b/Plugin/src/main/java/net/bteuk/network/commands/Where.java index b04b0efd..3a46ac34 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Where.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Where.java @@ -1,10 +1,11 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.NetworkUser; import net.buildtheearth.terraminusminus.generator.EarthGeneratorSettings; import net.buildtheearth.terraminusminus.projection.OutOfProjectionBoundsException; import net.kyori.adventure.text.Component; @@ -14,25 +15,26 @@ import org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; +import java.util.List; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.enums.ServerType.PLOT; +import static net.bteuk.network.core.ServerType.PLOT; +@Log public class Where extends AbstractCommand { private static final DecimalFormat DECIMAL_FORMATTER = new DecimalFormat("##.#####"); private final EarthGeneratorSettings bteGeneratorSettings = EarthGeneratorSettings.parse(EarthGeneratorSettings.BTE_DEFAULT_SETTINGS); private final PlotSQL plotSQL; + private final Constants constants; - public Where(Network instance) { - plotSQL = instance.getPlotSQL(); + public Where(PlotSQL plotSQL, Constants constants) { + this.plotSQL = plotSQL; + this.constants = constants; } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -40,58 +42,49 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - // Get coordinates at the location of the player if they're in a region. - NetworkUser user = Network.getInstance().getUser(player); - - // If u is null, cancel. - if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); - player.sendMessage(ChatUtils.error("User can not be found, please relog!")); + if (constants.serverType() != PLOT && !(constants.serverType() == ServerType.EARTH && player.getLocation().getWorld().getName().equals(constants.earthWorld()))) { + player.sendMessage(ChatUtils.error("This world does not support coordinates.")); return; } - // Check is regions are enabled - if (REGIONS_ENABLED) { - // Check if in a valid region. - if (!user.inRegion) { - - player.sendMessage(ChatUtils.error("You must be standing in a region to get the coordinates.")); - return; - } - } - // Send coordinates with a link to Google Maps to the player. try { - - // TEMP: The following if statement is only necessary because the server does not update the dx,dz - // on teleport when regions are disabled, this will be fixed in BTEUK-315! - // If the player is in the plotsystem update their dx,dz. - if (SERVER_TYPE == PLOT && plotSQL.hasRow( - "SELECT name FROM location_data WHERE name='" + player.getWorld().getName() + "';")) { - + int deltaX = 0; + int deltaZ = 0; + if (constants.serverType() == PLOT && plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + player.getWorld().getName() + "';")) { // Get negative coordinate transform of new location. - user.dx = - -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + player.getWorld() - .getName() + "';"); - user.dz = - -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + player.getWorld() - .getName() + "';"); + deltaX = -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + player.getWorld().getName() + "';"); + deltaZ = -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + player.getWorld().getName() + "';"); } - double[] coords = bteGeneratorSettings.projection().toGeo(player.getLocation().getX() + user.dx, - player.getLocation().getZ() + user.dz); + double[] coords = bteGeneratorSettings.projection().toGeo(player.getLocation().getX() + deltaX, + player.getLocation().getZ() + deltaZ); player.sendMessage(ChatUtils.success("Your coordinates are ") .append(Component.text(DECIMAL_FORMATTER.format(coords[1]), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(",")) .append(Component.text(DECIMAL_FORMATTER.format(coords[0]), NamedTextColor.DARK_AQUA))); Component message = ChatUtils.success("Click here to view the coordinates in Google Maps."); - message = message.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https://www.google" + - ".com/maps/@?api=1&map_action=map&basemap=satellite&zoom=21¢er=" + coords[1] + "," + coords[0])); + message = message.clickEvent(ClickEvent.openUrl("https://www.google.com/maps/@?api=1&map_action=map&basemap=satellite&zoom=21¢er=" + coords[1] + "," + coords[0])); player.sendMessage(message); } catch (OutOfProjectionBoundsException e) { player.sendMessage(ChatUtils.error("You are not standing in a location where coordinates can be retrieved" + ".")); } } + + @Override + public String getLabel() { + return "where"; + } + + @Override + public String getDescription() { + return "Returns the coordinates where the player is standing with a link to google maps."; + } + + @Override + public List getAliases() { + return List.of("location", "ll"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java index bdd24e4d..bbaade0b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java @@ -395,4 +395,14 @@ private void teleport(Player p, CompletableFuture altFuture, TpllFormat NamedTextColor.DARK_AQUA))); })); } + + @Override + public String getLabel() { + return "tpll"; + } + + @Override + public String getDescription() { + return "Teleport to coordinates"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java index c77368cd..0d5b90e2 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java @@ -2,11 +2,13 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; import net.bteuk.network.exceptions.NotBannedException; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Time; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; @@ -15,13 +17,17 @@ import java.util.Arrays; -import static net.bteuk.network.utils.staff.Moderation.ban; -import static net.bteuk.network.utils.staff.Moderation.getDuration; - public class Ban extends AbstractCommand { + private final Moderation moderation; + private final SQLAPI globalSQL; + + public Ban(Network instance, Moderation moderation) { + this.moderation = moderation; + this.globalSQL = instance.getGlobalSQL(); + } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if sender is player, then check permissions CommandSender sender = stack.getSender(); @@ -39,24 +45,19 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check player. // If uuid exists for name. - if (!Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (!globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { sender.sendMessage(ChatUtils.error("%s is not a valid player.")); return; } - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); // Get the duration of the ban. long time; try { - time = getDuration(args[1]); + time = moderation.getDuration(args[1]); } catch (DurationFormatException e) { sender.sendMessage(ChatUtils.error("Duration must be in ymdh format, for example 1y6m, which is 1 year " + "and 6 months or 2d12h is 2 days and 12 hours.")); @@ -84,9 +85,8 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { public Component banPlayer(String name, String uuid, long end_time, String reason) { try { - ban(uuid, end_time, reason); + moderation.ban(uuid, end_time, reason); } catch (NotBannedException e) { - e.printStackTrace(); return ChatUtils.error("An error occurred while banning this player, please contact an admin for support."); } @@ -97,4 +97,14 @@ public Component banPlayer(String name, String uuid, long end_time, String reaso .append(ChatUtils.success(" for reason: ")) .append(Component.text(reason, NamedTextColor.DARK_AQUA)); } + + @Override + public String getLabel() { + return "ban"; + } + + @Override + public String getDescription() { + return "Bans a player for a specific duration and reason."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java index 5b7cd857..b0c332dc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java @@ -2,8 +2,10 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; @@ -12,12 +14,20 @@ import java.util.Arrays; -import static net.bteuk.network.utils.staff.Moderation.kick; - public class Kick extends AbstractCommand { + private final Network instance; + private final Moderation moderation; + private final SQLAPI globalSQL; + + public Kick(Network instance, Moderation moderation) { + this.instance = instance; + this.moderation = moderation; + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if sender is player, then check permissions CommandSender sender = stack.getSender(); @@ -35,22 +45,17 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check player. // If uuid exists for name. - if (!Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (!globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { sender.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not a valid player."))); return; } - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); // Check if player is online. - if (!Network.getInstance().isOnlineOnNetwork(uuid)) { + if (!instance.isOnlineOnNetwork(uuid)) { sender.sendMessage(Component.text(name, NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not online."))); return; @@ -64,11 +69,21 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { public Component kickPlayer(String name, String uuid, String reason) { - kick(uuid, reason); + moderation.kick(uuid, reason); return (ChatUtils.success("Kicked ") .append(Component.text(name, NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" for reason: ")) .append(Component.text(reason, NamedTextColor.DARK_AQUA))); } + + @Override + public String getLabel() { + return "kick"; + } + + @Override + public String getDescription() { + return "Kick a player for the server."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java index c1206604..bb4c928d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java @@ -2,11 +2,13 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; import net.bteuk.network.exceptions.NotMutedException; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Time; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; @@ -15,13 +17,18 @@ import java.util.Arrays; -import static net.bteuk.network.utils.staff.Moderation.getDuration; -import static net.bteuk.network.utils.staff.Moderation.mute; - public class Mute extends AbstractCommand { + private final Moderation moderation; + private final SQLAPI globalSQL; + + public Mute(Network instance, Moderation moderation) { + this.moderation = moderation; + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if sender is player, then check permissions CommandSender sender = stack.getSender(); @@ -39,25 +46,20 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check player. // If uuid exists for name. - if (!Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (!globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { sender.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not a valid player."))); return; } - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); // Get the duration of the ban. long time; try { - time = getDuration(args[1]); + time = moderation.getDuration(args[1]); } catch (DurationFormatException e) { sender.sendMessage(ChatUtils.error("Duration must be in ymdh format, for example 1y6m, which is 1 year " + "and 6 months or 2d12h is 2 days and 12 hours.")); @@ -85,9 +87,8 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { public Component mutePlayer(String name, String uuid, long end_time, String reason) { try { - mute(uuid, end_time, reason); + moderation.mute(uuid, end_time, reason); } catch (NotMutedException e) { - e.printStackTrace(); return ChatUtils.error("An error occurred while muting this player, please contact an admin for support."); } @@ -98,4 +99,14 @@ public Component mutePlayer(String name, String uuid, long end_time, String reas .append(ChatUtils.success(" for reason: ")) .append(Component.text(reason, NamedTextColor.DARK_AQUA)); } + + @Override + public String getLabel() { + return "mute"; + } + + @Override + public String getDescription() { + return "Mutes a player for a specific duration and reason."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java index c3bdbfb9..ea2dca20 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java @@ -2,21 +2,28 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.staff.Moderation.isBanned; -import static net.bteuk.network.utils.staff.Moderation.unban; - public class Unban extends AbstractCommand { + private final Moderation moderation; + private final SQLAPI globalSQL; + + public Unban(Network instance, Moderation moderation) { + this.moderation = moderation; + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if sender is player, then check permissions CommandSender sender = stack.getSender(); @@ -34,19 +41,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check player. // If uuid exists for name. - if (!Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (!globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { sender.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not a valid player."))); return; } - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); sender.sendMessage(unbanPlayer(name, uuid)); } @@ -61,10 +63,10 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { public Component unbanPlayer(String name, String uuid) { // Check if the player is currently banned. - if (isBanned(uuid)) { + if (moderation.isBanned(uuid)) { // Unban the player. - unban(uuid); + moderation.unban(uuid); // Send feedback. return (ChatUtils.success("Unbanned ") @@ -73,4 +75,14 @@ public Component unbanPlayer(String name, String uuid) { return (ChatUtils.error(name + " is not currently banned.")); } } + + @Override + public String getLabel() { + return "unban"; + } + + @Override + public String getDescription() { + return "Unban a previously banned player."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java index 2aa26d22..f1b7efed 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java @@ -2,21 +2,27 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.staff.Moderation.isMuted; -import static net.bteuk.network.utils.staff.Moderation.unmute; - public class Unmute extends AbstractCommand { + private final Moderation moderation; + private final SQLAPI globalSQL; + + public Unmute(Network instance, Moderation moderation) { + this.moderation = moderation; + this.globalSQL = instance.getGlobalSQL(); + } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if sender is player, then check permissions CommandSender sender = stack.getSender(); @@ -34,19 +40,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check player. // If uuid exists for name. - if (!Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (!globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { sender.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not a valid player."))); return; } - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); sender.sendMessage(unmutePlayer(name, uuid)); } @@ -61,10 +62,10 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { public Component unmutePlayer(String name, String uuid) { // Check if the player is currently muted. - if (isMuted(uuid)) { + if (moderation.isMuted(uuid)) { // Unban the player. - unmute(uuid); + moderation.unmute(uuid); // Send feedback. return (ChatUtils.success("Unmuted ") @@ -73,4 +74,14 @@ public Component unmutePlayer(String name, String uuid) { return (ChatUtils.error(name + " is not currently muted.")); } } + + @Override + public String getLabel() { + return "unmute"; + } + + @Override + public String getDescription() { + return "Unmute a previously muted player."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index 73d7b518..b51d67c3 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -28,7 +28,7 @@ public class CommandPreProcess implements Listener { public CommandPreProcess(Network instance) { this.instance = instance; - instance.allow_shutdown = false; + instance.allowShutdown = false; Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @@ -99,8 +99,8 @@ private boolean isCommand(String message, String... commands) { @EventHandler public void serverCommand(ServerCommandEvent s) { if (s.getCommand().equalsIgnoreCase("stop")) { - if (!instance.allow_shutdown) { - instance.allow_shutdown = true; + if (!instance.allowShutdown) { + instance.allowShutdown = true; onServerClose(instance.getUsers()); // Delay shutdown by 3 seconds to make sure players have switched server. diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 116f179d..66a08ffc 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -14,6 +14,7 @@ import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.TextureUtils; import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; @@ -35,16 +36,19 @@ public class Connect implements Listener { private final Network instance; - private final Constants constants; + private final TabManager tabManager; + private final Roles roles; @Setter private boolean blockLeaveEvent; - public Connect(Network instance, Constants constants) { + public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles) { this.instance = instance; this.constants = constants; + this.tabManager = tabManager; + this.roles = roles; this.blockLeaveEvent = false; @@ -75,7 +79,7 @@ public void handleUserConnectReply(UserConnectReply reply) { log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", player.getName())); - NetworkUser user = new NetworkUser(player, reply); + NetworkUser user = new NetworkUser(player, reply, instance, constants, roles); instance.addUser(user); // Hide this player for all players in focus mode. @@ -100,8 +104,7 @@ public void handleUserConnectReply(UserConnectReply reply) { reply.getMessages().forEach(player::sendMessage); // Add the player to the scoreboard. - // TODO: TAB - instance.getTab().onPlayerJoin(player); + tabManager.onPlayerJoin(player); player.playSound(Sound.sound(Key.key("block.note_block.bell"), Sound.Source.PLAYER, 1f, 1f)); }); } @@ -114,29 +117,12 @@ public void handleUserRemove(UserRemove userRemove) { } @EventHandler(priority = EventPriority.HIGHEST) - public void joinServerEvent(PlayerJoinEvent e) { - - // Block the default connect message, this will be sent by the proxy. - e.joinMessage(null); - - // Determine the chat channels to which this user has access. - Set channels = NetworkUser.getChannels(e.getPlayer()); - - // Get the TabPlayer instance for this player. - TabPlayer tabPlayer = TabManager.createTabPlayerFromPlayer(e.getPlayer()); - - // Send a user connect request to the proxy, this will handle the rest. - // When the proxy has received the request it'll send a response which will then create the user object on - // the server. - UserConnectRequest userConnectRequest = new UserConnectRequest( - constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), - TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, - e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer") - ); - Bukkit.getScheduler().runTaskAsynchronously(instance, - () -> instance.getChat().sendSocketMessage(userConnectRequest)); - log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", - e.getPlayer().getName())); + public void joinServerEvent(PlayerJoinEvent joinEvent) { + if (constants.standalone()) { + // TODO: Implement standalone connecting. + } else { + networkJoinEvent(joinEvent); + } } @EventHandler @@ -202,4 +188,28 @@ public void leaveServerEvent(PlayerQuitEvent e) { () -> instance.getChat().sendSocketMessage(userDisconnect)); } } + + private void networkJoinEvent(PlayerJoinEvent e) { + // Block the default connect message, this will be sent by the proxy. + e.joinMessage(null); + + // Determine the chat channels to which this user has access. + Set channels = NetworkUser.getChannels(e.getPlayer()); + + // Get the TabPlayer instance for this player. + TabPlayer tabPlayer = tabManager.createTabPlayerFromPlayer(e.getPlayer()); + + // Send a user connect request to the proxy, this will handle the rest. + // When the proxy has received the request it'll send a response which will then create the user object on + // the server. + UserConnectRequest userConnectRequest = new UserConnectRequest( + constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), + TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, + e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer") + ); + Bukkit.getScheduler().runTaskAsynchronously(instance, + () -> instance.getChat().sendSocketMessage(userConnectRequest)); + log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", + e.getPlayer().getName())); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java index aad874f0..701230e7 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java @@ -1,5 +1,6 @@ package net.bteuk.network.eventing.listeners; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; @@ -13,8 +14,7 @@ import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class GuiListener implements Listener { private final Network instance; @@ -42,7 +42,7 @@ public void onClick(InventoryClickEvent e) { // If u is null, cancel. if (u == null) { - LOGGER.severe("User " + e.getWhoClicked().getName() + " can not be found!"); + log.severe("User " + e.getWhoClicked().getName() + " can not be found!"); e.getWhoClicked().sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java index 11d2033e..e8847566 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/NetworkTeleportListener.java @@ -14,12 +14,12 @@ @Log public class NetworkTeleportListener implements Listener { + private final Network instance; private boolean blocked; public NetworkTeleportListener(Network instance) { - Bukkit.getServer().getPluginManager().registerEvents(this, instance); - + this.instance = instance; blocked = false; } @@ -41,7 +41,7 @@ public void onPlayerTeleport(PlayerTeleportEvent e) { } Player p = e.getPlayer(); - NetworkUser u = Network.getInstance().getUser(p); + NetworkUser u = instance.getUser(p); // If u is null, cancel. if (u == null) { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java index d98e7db2..7c560beb 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PreJoinServer.java @@ -1,36 +1,43 @@ package net.bteuk.network.eventing.listeners; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.Constants; import net.bteuk.network.exceptions.NotBannedException; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import static net.bteuk.network.utils.staff.Moderation.getBannedComponent; -import static net.bteuk.network.utils.staff.Moderation.isBanned; - +@Log public class PreJoinServer implements Listener { - public PreJoinServer(Network instance) { + private final Network instance; + private final Constants constants; + private final Moderation moderation; + public PreJoinServer(Network instance, Constants constants, Moderation moderation) { Bukkit.getServer().getPluginManager().registerEvents(this, instance); + this.instance = instance; + this.constants = constants; + this.moderation = moderation; } @EventHandler public void preJoin(AsyncPlayerPreLoginEvent e) { - // If player is banned, stop them from logging in. - if (isBanned(e.getUniqueId().toString())) { + // If the player is banned, stop them from logging in. + if (constants.moderationEnabled() && moderation.isBanned(e.getUniqueId().toString())) { try { - e.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED, getBannedComponent(e.getUniqueId().toString())); + e.disallow(AsyncPlayerPreLoginEvent.Result.KICK_BANNED, moderation.getBannedComponent(e.getUniqueId().toString())); } catch (NotBannedException ex) { - ex.printStackTrace(); + log.severe("The player is no longer banned, but they were less than a millisecond ago!"); } } // Check if server is restarting. - if (Network.getInstance().allow_shutdown) { + if (instance.allowShutdown) { e.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, Component.text("The server is restarting!")); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 9a5a82d8..447ae8c8 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -1,5 +1,6 @@ package net.bteuk.network.utils; +import lombok.Getter; import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.core.Constants; @@ -16,25 +17,29 @@ @Log public class NetworkConfig { - public static FileConfiguration CONFIG; + @Getter + private FileConfiguration config; - public NetworkConfig() { + private final Network instance; + + public NetworkConfig(Network instance) { + this.instance = instance; // Create a config instance. - CONFIG = Network.getInstance().getConfig(); + config = instance.getConfig(); } // Get old config version. private String configVersion() { - String version = CONFIG.getString("version"); + String version = config.getString("version"); // If null return default. return Objects.requireNonNullElse(version, "1.0.0"); } // Get latest config version. private String latestVersion() { - String version = Objects.requireNonNull(CONFIG.getDefaults()).getString("version"); + String version = Objects.requireNonNull(config.getDefaults()).getString("version"); // If null return default. return Objects.requireNonNullElse(version, "1.8.0"); } @@ -48,12 +53,12 @@ public void updateConfig() { log.info("Your config version is outdated, updating to latest version!"); // Get old config values, these are needed to add them back after updating. - Map values = CONFIG.getValues(true); + Map values = config.getValues(true); // Generate a new config file from the default config. // Copy any values that can be reused. // Delete the current config and set the new one. - File configFile = new File(Network.getInstance().getDataFolder(), "config.yml"); + File configFile = new File(instance.getDataFolder(), "config.yml"); if (!configFile.delete()) { @@ -63,16 +68,16 @@ public void updateConfig() { } // Copy the default config and get it. - Network.getInstance().saveDefaultConfig(); - Network.getInstance().reloadConfig(); - CONFIG = Network.getInstance().getConfig(); + instance.saveDefaultConfig(); + instance.reloadConfig(); + config = instance.getConfig(); for (Map.Entry value : values.entrySet()) { - if (CONFIG.contains(value.getKey())) { + if (config.contains(value.getKey())) { // Check if this is a configuration section, if true skip. - if (CONFIG.isConfigurationSection(value.getKey())) { + if (config.isConfigurationSection(value.getKey())) { continue; } @@ -80,15 +85,13 @@ public void updateConfig() { if (value.getKey().equals("version")) { continue; } - CONFIG.set(value.getKey(), value.getValue()); + config.set(value.getKey(), value.getValue()); } } - Network.getInstance().saveConfig(); - - CONFIG = Network.getInstance().getConfig(); - - log.info("Updated config to version " + CONFIG.getString("version")); + instance.saveConfig(); + config = instance.getConfig(); + log.info("Updated config to version " + config.getString("version")); } else { log.info("The config is up to date!"); } @@ -96,42 +99,43 @@ public void updateConfig() { public net.bteuk.network.core.Constants getConstants() { // Set the server name from config. - String serverName = CONFIG.getString("server_name"); + String serverName = config.getString("server_name"); // Set the server type from config. - ServerType serverType = ServerType.valueOf(CONFIG.getString("server_type")); + ServerType serverType = ServerType.valueOf(config.getString("server_type")); // Basically indicates that this server is not running in a network. - boolean standalone = CONFIG.getBoolean("standalone"); + boolean standalone = config.getBoolean("standalone"); - boolean regionsEnabled = CONFIG.getBoolean("regions.enabled"); + boolean regionsEnabled = config.getBoolean("regions.enabled"); // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds - long regionInactivity = CONFIG.getInt("region.inactivity_days") * 24L * 60L * 60L * 1000L; + long regionInactivity = config.getInt("region.inactivity_days") * 24L * 60L * 60L * 1000L; - boolean tpllEnabled = CONFIG.getBoolean("tpll.enabled"); + boolean tpllEnabled = config.getBoolean("tpll.enabled"); + boolean tpllRequiredPermission = config.getBoolean("tpll.requires_permission"); - int maxY = CONFIG.getInt("tpll.max_y"); - int minY = CONFIG.getInt("tpll.min_y"); + int maxY = config.getInt("tpll.max_y"); + int minY = config.getInt("tpll.min_y"); - boolean staffChat = CONFIG.getBoolean("staff.chat.enabled"); + boolean staffChat = config.getBoolean("staff.chat.enabled"); - boolean tips = CONFIG.getBoolean("chat.tips.enabled"); + boolean tips = config.getBoolean("chat.tips.enabled"); - boolean tutorials = CONFIG.getBoolean("tutorials.enabled"); + boolean tutorials = config.getBoolean("tutorials.enabled"); - boolean llEnabled = CONFIG.getBoolean("ll_enabled"); + boolean llEnabled = config.getBoolean("ll_enabled"); - boolean progressMap = CONFIG.getBoolean("ProgressMap.enabled"); + boolean progressMap = config.getBoolean("ProgressMap.enabled"); - boolean progression = CONFIG.getBoolean("progression.enabled"); - boolean announceOverallLevelUps = CONFIG.getBoolean("progression.announce_level-ups.overall"); - boolean announceSeasonalLevelUps = CONFIG.getBoolean("progression.announce_level-ups.seasonal"); + boolean progression = config.getBoolean("progression.enabled"); + boolean announceOverallLevelUps = config.getBoolean("progression.announce_level-ups.overall"); + boolean announceSeasonalLevelUps = config.getBoolean("progression.announce_level-ups.seasonal"); - boolean sidebarEnabled = CONFIG.getBoolean("sidebar.enabled"); - String sidebarTitle = CONFIG.getString("sidebar.title", ""); + boolean sidebarEnabled = config.getBoolean("sidebar.enabled"); + String sidebarTitle = config.getString("sidebar.title", ""); - List sidebarTextConfig = CONFIG.getList("sidebar.text"); + List sidebarTextConfig = config.getList("sidebar.text"); List sidebarText = new ArrayList<>(); if (sidebarTextConfig != null && !sidebarTextConfig.isEmpty()) { sidebarTextConfig.forEach(listItem -> { @@ -143,21 +147,23 @@ public net.bteuk.network.core.Constants getConstants() { List sidebarTextList = Collections.unmodifiableList(sidebarText); - boolean motdEnabled = CONFIG.getBoolean("motd.enabled"); - String motdText = CONFIG.getString("motd.text", ""); + boolean motdEnabled = config.getBoolean("motd.enabled"); + String motdText = config.getString("motd.text", ""); String earthWorld; - if (CONFIG.getString("regions.earth_world") == null) { + if (config.getString("regions.earth_world") == null) { // Setting default value. earthWorld = "earth"; } else { - earthWorld = CONFIG.getString("regions.earth_world"); + earthWorld = config.getString("regions.earth_world"); } - boolean plotSystemEnabled = CONFIG.getBoolean("plot_system.enabled"); + boolean plotSystemEnabled = config.getBoolean("plot_system.enabled"); + + boolean moderationEnabled = config.getBoolean("staff.moderation.enabled"); - return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, maxY, minY, earthWorld, staffChat, tips, + return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText, plotSystemEnabled); + motdText, plotSystemEnabled, moderationEnabled); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index 2eeacde3..d48c2be3 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -1,7 +1,8 @@ package net.bteuk.network.utils.staff; import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; import net.bteuk.network.exceptions.NotBannedException; import net.bteuk.network.exceptions.NotMutedException; @@ -10,7 +11,6 @@ import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.enums.ModerationAction; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Time; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -20,18 +20,27 @@ */ public class Moderation { + private final Network instance; + + private final EventAPI eventAPI; + + public Moderation(Network instance, EventAPI eventAPI) { + this.instance = instance; + this.eventAPI = eventAPI; + } + // Ban the player. - public static void ban(String uuid, long end_time, String reason) throws NotBannedException { + public void ban(String uuid, long end_time, String reason) throws NotBannedException { // Get time. long time = Time.currentTime(); // If the player is already banned, end the old ban. if (isBanned(uuid)) { - Network.getInstance().getGlobalSQL() + instance.getGlobalSQL() .update("UPDATE moderation SET end_time=" + time + " WHERE uuid='" + uuid + "' AND end_time>" + time + " AND type='ban';"); } - Network.getInstance().getGlobalSQL().update("INSERT INTO moderation(uuid,start_time,end_time,reason,type) " + + instance.getGlobalSQL().update("INSERT INTO moderation(uuid,start_time,end_time,reason,type) " + "VALUES('" + uuid + "'," + time + "," + end_time + ",'" + reason + "','ban');"); // If the player is currently online, ban them. @@ -39,59 +48,55 @@ public static void ban(String uuid, long end_time, String reason) throws NotBann } // Mute the player. - public static void mute(String uuid, long end_time, String reason) throws NotMutedException { + public void mute(String uuid, long end_time, String reason) throws NotMutedException { // Get time. long time = Time.currentTime(); // If the player is already muted, end the old mute. if (isMuted(uuid)) { - Network.getInstance().getGlobalSQL() + instance.getGlobalSQL() .update("UPDATE moderation SET end_time=" + time + " WHERE uuid='" + uuid + "' AND end_time>" + time + " AND type='mute';"); } - Network.getInstance().getGlobalSQL().update("INSERT INTO moderation(uuid,start_time,end_time,reason,type) " + + instance.getGlobalSQL().update("INSERT INTO moderation(uuid,start_time,end_time,reason,type) " + "VALUES('" + uuid + "'," + time + "," + end_time + ",'" + reason + "','mute');"); // Update Tab by sending a moderation event. Component mutedComponent = getMutedComponent(uuid); ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.MUTE, null, uuid, end_time, mutedComponent); - Network.getInstance().getChat().sendSocketMessage(moderationEvent); + instance.getChat().sendSocketMessage(moderationEvent); // Notify the user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", mutedComponent, true); - Network.getInstance().getChat().sendSocketMessage(directMessage); + instance.getChat().sendSocketMessage(directMessage); } // Unban the player. - public static void unban(String uuid) { + public void unban(String uuid) { // Get time. long time = Time.currentTime(); - Network.getInstance().getGlobalSQL() + instance.getGlobalSQL() .update("UPDATE moderation SET end_time=" + time + " WHERE uuid='" + uuid + "' AND end_time>" + time + " AND type='ban';"); } // Unmute the player. - public static void unmute(String uuid) { + public void unmute(String uuid) { // Get time. long time = Time.currentTime(); - Network.getInstance().getGlobalSQL() + instance.getGlobalSQL() .update("UPDATE moderation SET end_time=" + time + " WHERE uuid='" + uuid + "' AND end_time>" + time + " AND type='mute';"); // Update Tab by sending a moderation event. ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.UNMUTE, null, uuid, 0L, null); - Network.getInstance().getChat().sendSocketMessage(moderationEvent); + instance.getChat().sendSocketMessage(moderationEvent); } // Kick the player. - public static void kick(String uuid, String reason) { - + public void kick(String uuid, String reason) { // Kick them with the reason, if online. - Network.getInstance().getOnlineUserByUuid(uuid).ifPresent(onlineUser -> EventManager.createEvent(uuid, - "network", - onlineUser.getServer(), - "kick", reason)); + instance.getOnlineUserByUuid(uuid).ifPresent(onlineUser -> eventAPI.createEvent(uuid, "network", onlineUser.getServer(), "kick", reason)); } /** @@ -100,41 +105,41 @@ public static void kick(String uuid, String reason) { * @param uuid the uuid of the player * @return true if the player is currently banned, false if not */ - public static boolean isBanned(String uuid) { - return (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM moderation WHERE uuid='" + uuid + "' " + + public boolean isBanned(String uuid) { + return (instance.getGlobalSQL().hasRow("SELECT uuid FROM moderation WHERE uuid='" + uuid + "' " + "AND end_time>" + Time.currentTime() + " AND type='ban';")); } // If the player is currently muted, return true. - public static boolean isMuted(String uuid) { - return (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM moderation WHERE uuid='" + uuid + "' " + + public boolean isMuted(String uuid) { + return (instance.getGlobalSQL().hasRow("SELECT uuid FROM moderation WHERE uuid='" + uuid + "' " + "AND end_time>" + Time.currentTime() + " AND type='mute';")); } // Get reason why player is banned. - public static String getBannedReason(String uuid) { - return (Network.getInstance().getGlobalSQL().getString("SELECT reason FROM moderation WHERE uuid='" + uuid + + public String getBannedReason(String uuid) { + return (instance.getGlobalSQL().getString("SELECT reason FROM moderation WHERE uuid='" + uuid + "' AND end_time>" + Time.currentTime() + " AND type='ban';")); } // Get reason why player is muted. - public static String getMutedReason(String uuid) { - return (Network.getInstance().getGlobalSQL().getString("SELECT reason FROM moderation WHERE uuid='" + uuid + + public String getMutedReason(String uuid) { + return (instance.getGlobalSQL().getString("SELECT reason FROM moderation WHERE uuid='" + uuid + "' AND end_time>" + Time.currentTime() + " AND type='mute';")); } // Get duration of ban. - public static String getBanDuration(String uuid) { + public String getBanDuration(String uuid) { long time = - Network.getInstance().getGlobalSQL().getLong("SELECT end_time FROM moderation WHERE uuid='" + uuid + + instance.getGlobalSQL().getLong("SELECT end_time FROM moderation WHERE uuid='" + uuid + "' AND end_time>" + Time.currentTime() + " AND type='ban';"); return Time.getDateTime(time); } // Get duration of mute. - public static String getMuteDuration(String uuid) { + public String getMuteDuration(String uuid) { long time = - Network.getInstance().getGlobalSQL().getLong("SELECT end_time FROM moderation WHERE uuid='" + uuid + + instance.getGlobalSQL().getLong("SELECT end_time FROM moderation WHERE uuid='" + uuid + "' AND end_time>" + Time.currentTime() + " AND type='mute';"); return Time.getDateTime(time); } @@ -147,7 +152,7 @@ public static String getMuteDuration(String uuid) { * @return the component of the banned message with reason and duration * @throws NotBannedException if the player is not banned */ - public static Component getBannedComponent(String uuid) throws NotBannedException { + public Component getBannedComponent(String uuid) throws NotBannedException { if (isBanned(uuid)) { return Component.text("You have been banned for ", NamedTextColor.RED) .append(Component.text(getBannedReason(uuid), NamedTextColor.DARK_RED)) @@ -166,7 +171,7 @@ public static Component getBannedComponent(String uuid) throws NotBannedExceptio * @return the component of the muted message with reason and duration * @throws NotMutedException if the player is not muted */ - public static Component getMutedComponent(String uuid) throws NotMutedException { + public Component getMutedComponent(String uuid) throws NotMutedException { if (isMuted(uuid)) { return ChatUtils.error("You have been muted for ") .append(Component.text(getMutedReason(uuid), NamedTextColor.DARK_RED)) @@ -184,7 +189,7 @@ public static Component getMutedComponent(String uuid) throws NotMutedException * @return duration in milliseconds after converting the input string * @throws DurationFormatException if the input string is not formatted correctly */ - public static long getDuration(String formattedInput) throws DurationFormatException { + public long getDuration(String formattedInput) throws DurationFormatException { if (formattedInput == null) { throw new NullPointerException(); From b58d070c4d0e79e7df37a847dfc95920566698a4 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 26 Aug 2025 22:00:32 +0200 Subject: [PATCH 08/96] Converting more commands. --- .../net/bteuk/network/core/Constants.java | 2 +- .../net/bteuk/network/CommandManager.java | 15 -- .../java/net/bteuk/network/CustomChat.java | 2 +- .../main/java/net/bteuk/network/Network.java | 90 +++---- .../main/java/net/bteuk/network/Timers.java | 6 +- .../network/commands/AbstractCommand.java | 3 +- .../net/bteuk/network/commands/Buildings.java | 43 +-- .../net/bteuk/network/commands/Discord.java | 50 ++-- .../net/bteuk/network/commands/Navigator.java | 79 +++--- .../java/net/bteuk/network/commands/Plot.java | 53 ++-- .../bteuk/network/commands/RegionCommand.java | 53 ++-- .../java/net/bteuk/network/commands/Zone.java | 37 ++- .../network/commands/navigation/Back.java | 107 ++++---- .../network/commands/navigation/Delhome.java | 39 ++- .../network/commands/navigation/Home.java | 117 ++++----- .../network/commands/navigation/Homes.java | 65 ++--- .../commands/navigation/Navigation.java | 68 +++-- .../network/commands/navigation/Server.java | 49 ++-- .../network/commands/navigation/Sethome.java | 16 +- .../network/commands/navigation/Spawn.java | 55 +++- .../network/commands/navigation/Teleport.java | 109 ++++++++ .../bteuk/network/commands/navigation/Tp.java | 76 ------ .../network/commands/navigation/TpToggle.java | 45 +++- .../network/commands/navigation/Warp.java | 82 +++--- .../network/commands/navigation/Warps.java | 36 ++- .../bteuk/network/commands/staff/Staff.java | 88 +++++-- .../eventing/listeners/PlayerInteract.java | 44 ++-- .../net/bteuk/network/gui/NavigatorGui.java | 248 ++++++++---------- .../java/net/bteuk/network/lobby/Lobby.java | 4 +- .../net/bteuk/network/lobby/LobbyCommand.java | 27 +- .../bteuk/network/utils/NetworkConfig.java | 15 +- .../net/bteuk/network/utils/NetworkUser.java | 2 +- .../java/net/bteuk/network/utils/Roles.java | 54 ---- Plugin/src/main/resources/config.yml | 10 +- 34 files changed, 978 insertions(+), 811 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index 5750377b..97bfc7b3 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -5,4 +5,4 @@ public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, - boolean moderationEnabled) { } + boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink) { } diff --git a/Plugin/src/main/java/net/bteuk/network/CommandManager.java b/Plugin/src/main/java/net/bteuk/network/CommandManager.java index 88f158c3..c0660947 100644 --- a/Plugin/src/main/java/net/bteuk/network/CommandManager.java +++ b/Plugin/src/main/java/net/bteuk/network/CommandManager.java @@ -3,11 +3,7 @@ import io.papermc.paper.command.brigadier.Commands; import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; -import net.bteuk.network.api.EventAPI; import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.commands.Afk; -import net.bteuk.network.core.Constants; -import net.bteuk.network.regions.RegionManager; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; @@ -32,18 +28,7 @@ public void enableCommands() { LifecycleEventManager<@NotNull Plugin> manager = instance.getLifecycleManager(); manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { final Commands commands = event.registrar(); - commandsToRegister.forEach(command -> commands.register(command.getLabel(), command.getDescription(), command.getAliases(), command)); }); } - - public static void registerCommands(Network instance, Constants constants, EventAPI eventAPI, Afk afk, RegionManager regionManager) { - - LifecycleEventManager manager = instance.getLifecycleManager(); - manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { - final Commands commands = event.registrar(); - - - }); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index b409cb46..de56250f 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -323,7 +323,7 @@ public void broadcastAFK(Player p, boolean afk) { } public void sendChatMessage(ChatMessage message) { - if (constants.standalone()) { + if (constants.standalone() && message.getChannel().equals(ChatChannels.GLOBAL.getChannelName())) { instance.getServer().broadcast(message.getComponent()); } else { sendSocketMessage(message); diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 3552ecba..c33c78c4 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -36,7 +36,6 @@ import net.bteuk.network.commands.RegionCommand; import net.bteuk.network.commands.Reply; import net.bteuk.network.commands.Rules; -import net.bteuk.network.commands.Season; import net.bteuk.network.commands.Speed; import net.bteuk.network.commands.TipsToggle; import net.bteuk.network.commands.Where; @@ -52,13 +51,12 @@ import net.bteuk.network.commands.navigation.Server; import net.bteuk.network.commands.navigation.Sethome; import net.bteuk.network.commands.navigation.Spawn; -import net.bteuk.network.commands.navigation.Tp; +import net.bteuk.network.commands.navigation.Teleport; import net.bteuk.network.commands.navigation.TpToggle; import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.commands.navigation.Warp; import net.bteuk.network.commands.navigation.Warps; import net.bteuk.network.commands.staff.Ban; -import net.bteuk.network.commands.staff.Exp; import net.bteuk.network.commands.staff.Kick; import net.bteuk.network.commands.staff.Mute; import net.bteuk.network.commands.staff.Staff; @@ -126,7 +124,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { public boolean allowShutdown; // Guis public NavigatorGui navigatorGui; - public ItemStack navigator; + public ItemStack navigatorItem; public RegionSQL regionSQL; // Movement listeners. public NetworkMoveListener moveListener; @@ -137,7 +135,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { private RegionManager regionManager; // List of users connected to the network. @Getter - private HashSet onlineUsers; + private HashSet onlineUsers; // TODO: Populate this list on a standalone server using the join/leave events. // Server User List private ArrayList networkUsers; // SQL @@ -328,21 +326,19 @@ public void enablePlugin() { chat = new CustomChat(this, constants, afk, globalSQL, connect); // Create the navigator. - navigatorGui = new NavigatorGui(); - navigator = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the" + - " navigator.")); - + navigatorItem = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the navigator.")); + Moderation moderation = new Moderation(this, eventManager); // Register events. new PreJoinServer(this, constants, moderation); new GuiListener(this); - new PlayerInteract(this); // Create the region manager if enabled. if (constants.regionsEnabled()) { regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); + commandManager.registerCommand(new RegionCommand(regionManager, eventManager)); } moveListener = new NetworkMoveListener(this, afk); @@ -352,12 +348,10 @@ public void enablePlugin() { timerAPI = new TimerAPIImpl(this); // Set up the lobby, most features are only enabled in the lobby server. + Lobby lobby = new Lobby(this); + // Create the rules book. + lobby.loadRules(); if (!constants.standalone()) { - // Get lobby. - // Lobby - Lobby lobby = new Lobby(this); - // Create the rules book. - lobby.loadRules(); if (constants.serverType() == ServerType.LOBBY) { // Set spawn location and enable auto-spawn teleport when falling in the void. @@ -393,47 +387,47 @@ public void enablePlugin() { commandManager.registerCommand(new Unban(this, moderation)); } - commands.register("teleport", "Teleport to any online player.", List.of("tp"), new Tp()); - commands.register("back", "Teleports the player to the previous teleported location.", new Back(eventAPI)); - commands.register("warp", "Warp to locations in the exploration menu.", new Warp()); - commands.register("warps", "List all warps on the server, 16 per page.", new Warps()); - commands.register("navigation", "Adds commands to do with navigation.", new Navigation()); + Back back = new Back(this, constants, eventManager, serverAPI); + commandManager.registerCommand(back); + commandManager.registerCommand(new Teleport(this, back, eventManager, serverAPI, constants)); + commandManager.registerCommand(new TpToggle(this)); + + if (constants.warpsEnabled()) { + new Warp(this, constants, plotAPI, back, eventManager, serverAPI); + new Warps(this); + new Navigation(this); + } + if (!constants.standalone()) { - commands.register("lobby", "Command for all lobby management.", new LobbyCommand(instance)); - commands.register("spawn", "Teleport to spawnpoint in lobby.", new Spawn()); - commands.register("server", "Switch server by command.", new Server()); + commandManager.registerCommand(new LobbyCommand(lobby, constants)); + commandManager.registerCommand(new Spawn(constants, back, lobby, eventManager, serverAPI, globalSQL)); + commandManager.registerCommand(new Server(globalSQL, constants, serverAPI)); } - if (CONFIG.getBoolean("homes.enabled")) { - commands.register("sethome", "Set a home to your current location.", new Sethome(instance)); - commands.register("home", "Teleport to your home.", new Home(instance)); - commands.register("delhome", "Delete a home.", new Delhome(instance)); - commands.register("homes", "Like warps, but for homes, shows all homes the player has set.", new Homes()); + + if (constants.homesEnabled()) { + commandManager.registerCommand(new Sethome(this)); + commandManager.registerCommand(new Home(this, constants, eventManager, serverAPI)); + commandManager.registerCommand(new Delhome(this)); + commandManager.registerCommand(new Homes(this)); } - /* - * Gui commands. - */ - commands.register("navigator", "Opens the main gui, will always return to the previous menu if possible.", List.of("nav", "gui", "menu", "claim"), new Navigator()); + Navigator navigator = new Navigator(this, constants, lobby, back, eventManager, serverAPI); + commandManager.registerCommand(navigator); + new PlayerInteract(this, navigator); + if (constants.plotSystemEnabled()) { - commands.register("plot", "Allows players to manipulate plots without using the gui.", List.of("plots"), new Plot(instance)); - commands.register("zone", "Zone command.", new Zone()); - } - if (constants.regionsEnabled()) { - commands.register("region", "Allows players to manipulate regions without using the gui.", new RegionCommand()); + commandManager.registerCommand(new Plot(this, eventManager, plotSQL)); + commandManager.registerCommand(new Zone(plotSQL, eventManager)); } - /* - * Staff commands. - */ - commands.register("staff", "Opens the Staff Menu.", List.of("st"), new Staff()); + commandManager.registerCommand(new Staff(this, constants, globalSQL, chat)); /* * Utility commands. */ - commands.register("building", "adds or shows completed buildings", new Buildings(instance)); - commands.register("teleporttoggle", "Enables/Disables the ability for other players to teleport to you.", List.of("tptoggle", "toggleteleport", "toggletp"), new TpToggle()); + commandManager.registerCommand(new Buildings(this, constants)); if (!constants.standalone()) { - commands.register("discord", "Sends a link to our discord server.", new Discord()); + commandManager.registerCommand(new Discord(this, chat, roles, constants)); commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); } commands.register("nightvision", "Toggle nightvision.", List.of("nv"), new Nightvision()); @@ -455,8 +449,8 @@ public void enablePlugin() { } commands.register("ptime", "Sets the time of day for the player", new Ptime()); commands.register("pweather", "Sets the weather for the player", new Pweather()); - commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); - commands.register("exp", "Test command for adding exp.", new Exp()); + // commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); + // commands.register("exp", "Test command for adding exp.", new Exp()); commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand(instance, constants, regionManager)); commands.register("pmute", "Mute a player", new Pmute(instance)); commands.register("punmute", "Unmute a player", new Punmute(instance)); @@ -464,7 +458,7 @@ public void enablePlugin() { commands.register("msg", "Sends a direct message to a player.", msgCommand); commands.register("w", "Sends a direct message to a player.", msgCommand); commands.register("tell", "Sends a direct message to a player.", msgCommand); - commands.register("r","sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); + commands.register("r", "sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); commands.register("promote", "Add a role to a player.", new Promote(instance)); commands.register("demote", "Remove a role from a player.", new Demote(instance)); commands.register("me", "Disabled", new Me()); @@ -472,6 +466,8 @@ public void enablePlugin() { // Register commandpreprocess to make sure /network:region runs and not that of another plugin. new CommandPreProcess(this); + commandManager.enableCommands(); + // Enable tips. if (constants.tips()) { // Enable tips in chat. diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 8a8c34f8..849b8cb5 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -113,9 +113,9 @@ public void startTimers() { slot9 = user.player.getInventory().getItem(8); if (slot9 == null) { - user.player.getInventory().setItem(8, instance.navigator); - } else if (!(slot9.equals(instance.navigator))) { - user.player.getInventory().setItem(8, instance.navigator); + user.player.getInventory().setItem(8, instance.navigatorItem); + } else if (!(slot9.equals(instance.navigatorItem))) { + user.player.getInventory().setItem(8, instance.navigatorItem); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java index 7d449ff8..43b7dc1a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java @@ -8,6 +8,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.Collections; @@ -27,7 +28,7 @@ public abstract class AbstractCommand implements BasicCommand { protected TabCompleter tabCompleter; @Override - public Collection suggest(CommandSourceStack commandSourceStack, String[] args) { + public @NotNull Collection suggest(@NotNull CommandSourceStack commandSourceStack, String @NotNull [] args) { if (tabCompleter != null) { return tabCompleter.onTabComplete(commandSourceStack.getSender(), args); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java b/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java index 5d6295ec..98b55db7 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java @@ -5,8 +5,9 @@ import net.bteuk.network.building_counter.Building; import net.bteuk.network.building_counter.ConfirmationListener; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.enums.ServerType; import net.kyori.adventure.text.Component; import org.bukkit.Location; import org.bukkit.Material; @@ -17,20 +18,20 @@ import java.util.Arrays; import java.util.List; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - public class Buildings extends AbstractCommand { private static final Component ERROR = ChatUtils.error("/building add/show/count/delete/definition/query"); private static final int SHOW_BUILDINGS_DURATION = 300; private final Network instance; - private final List playersUsingConfirmationListeners = new ArrayList(); + private final Constants constants; + private final List playersUsingConfirmationListeners = new ArrayList<>(); ; - public Buildings(Network instance) { + public Buildings(Network instance, Constants constants) { super(); this.instance = instance; + this.constants = constants; setTabCompleter(new FixedArgSelector(Arrays.asList("add", "show", "count", "delete", "definition", "query"), 0)); } @@ -48,7 +49,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) switch (args[0]) { case "add": - if (SERVER_TYPE != ServerType.EARTH) { + if (constants.serverType() != ServerType.EARTH) { player.sendMessage(ChatUtils.error("Please join the earth server before running this command")); return; } @@ -60,7 +61,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } break; case "show": - if (SERVER_TYPE != ServerType.EARTH) { + if (constants.serverType() != ServerType.EARTH) { player.sendMessage(ChatUtils.error("Please join the earth server before running this command")); return; } @@ -70,7 +71,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) displayCount(player); break; case "delete": - if (SERVER_TYPE != ServerType.EARTH) { + if (constants.serverType() != ServerType.EARTH) { player.sendMessage(ChatUtils.error("Please join the earth server before running this command")); return; } @@ -78,20 +79,17 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) break; case "definition": player.sendMessage(ChatUtils.success( - "A building is a structure that has walls on all sides, a roof, is larger than 2*3m and can be entered by a human (no sheds or caravans). In other words " + - "use common sense. A " + - "terrace is many buildings (one for each property). A semi detached is one building. Apartments are one building")); + "A building is a structure that has walls on all sides, a roof, is larger than 2*3m and can be entered by a human (no sheds or caravans). In other words " + + "use common sense. A " + "terrace is many buildings (one for each property). A semi detached is one building. Apartments are one building")); break; case "query": - if (SERVER_TYPE != ServerType.EARTH) { + if (constants.serverType() != ServerType.EARTH) { player.sendMessage(ChatUtils.error("Please join the earth server before running this command")); return; } queryBuilding(player); break; - } - } private void deleteBuilding(Player player) { @@ -114,7 +112,7 @@ private Building getClosestBuilding(Player player) { double minDist = 100; Building minbuilding = null; for (Building i : nearbyBuildings) { - double currentDist = getDist(i.coordinate(), player.getLocation()); + double currentDist = i.coordinate().distance(player.getLocation()); if (currentDist < minDist) { minDist = currentDist; minbuilding = i; @@ -126,12 +124,6 @@ private Building getClosestBuilding(Player player) { return minbuilding; } - public static double getDist(Location l1, Location l2) { - double deltax = l1.getX() - l2.getX(); - double deltaz = l2.getZ() - l2.getZ(); - return Math.sqrt((deltax * deltax) + (deltaz * deltaz)); - } - private void displayCount(Player player) { int buildingCount = instance.getGlobalSQL().getInt("SELECT COUNT(*) FROM buildings;"); player.sendMessage(ChatUtils.success("%s buildings have been built!", String.valueOf(buildingCount))); @@ -237,4 +229,13 @@ private void removeDisplayBeacons(Player player, List nearbyBuildings) } + @Override + public String getLabel() { + return "building"; + } + + @Override + public String getDescription() { + return "adds or shows completed buildings"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java index 999e6f28..ff7d1fa9 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java @@ -1,15 +1,18 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.DiscordLinking; import net.bteuk.network.lib.dto.DiscordRole; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; -import net.bteuk.network.utils.Time; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import org.bukkit.entity.Player; @@ -18,12 +21,19 @@ import java.util.Arrays; import java.util.Objects; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - +@Log public class Discord extends AbstractCommand { - public Discord() { + private final Network instance; + private final CustomChat chat; + private final Roles roles; + private final Constants constants; + + public Discord(Network instance, CustomChat chat, Roles roles, Constants constants) { + this.instance = instance; + this.chat = chat; + this.roles = roles; + this.constants = constants; setTabCompleter(new FixedArgSelector(Arrays.asList("link", "unlink"), 0)); } @@ -38,11 +48,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { if (args.length > 0) { - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } @@ -65,10 +75,9 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setToken(token); - Network.getInstance().getChat().sendSocketMessage(discordLinking); + chat.sendSocketMessage(discordLinking); - player.sendMessage(ChatUtils.success("To link your Discord please DM the code %s to the UK Bot within" + - " the next 5 minutes.", token)); + player.sendMessage(ChatUtils.success("To link your Discord please DM the code %s to the UK Bot within" + " the next 5 minutes.", token)); return; } else if (args[0].equalsIgnoreCase("unlink")) { @@ -79,7 +88,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Remove linked roles from discord, then unlink. - Role role = Roles.builderRole(user.player); + Role role = roles.builderRole(user.player); // Remove the role in discord. if (role == null) { @@ -88,13 +97,13 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), false); - Network.getInstance().getChat().sendSocketMessage(discordRole); + chat.sendSocketMessage(discordRole); DiscordLinking discordLinking = new DiscordLinking(); discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setDiscordId(user.getDiscordId()); discordLinking.setUnlink(true); - Network.getInstance().getChat().sendSocketMessage(discordLinking); + chat.sendSocketMessage(discordLinking); user.isLinked = false; player.sendMessage(ChatUtils.success("Unlinked your Discord.")); @@ -102,9 +111,18 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } } - Component discord = ChatUtils.success("Join our discord: " + CONFIG.getString("discord")); - discord = discord.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, - Objects.requireNonNull(CONFIG.getString("discord")))); + Component discord = ChatUtils.success("Join our discord: " + constants.discordLink()); + discord = discord.clickEvent(ClickEvent.openUrl(Objects.requireNonNull(constants.discordLink()))); stack.getSender().sendMessage(discord); } + + @Override + public String getLabel() { + return "discord"; + } + + @Override + public String getDescription() { + return "Sends a link to our discord server."; + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index 5e54fac3..25e5e725 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -1,40 +1,53 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.commands.navigation.Back; +import net.bteuk.network.core.Constants; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.NavigatorGui; import net.bteuk.network.gui.navigation.ExploreGui; import net.bteuk.network.gui.tutorials.TutorialsGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.lobby.Lobby; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.Constants.TUTORIALS; -import static net.bteuk.network.utils.enums.ServerType.TUTORIAL; +import java.util.List; +import static net.bteuk.network.core.ServerType.TUTORIAL; + +@Log public class Navigator extends AbstractCommand { - public static void openNavigator(NetworkUser u) { + private final Network instance; + private final Constants constants; + private final NavigatorGui navigator; + + public Navigator(Network instance, Constants constants, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI) { + this.instance = instance; + this.constants = constants; + navigator = new NavigatorGui(constants, instance.getGlobalSQL(), lobby, back, eventAPI, serverAPI); + } + public void openNavigator(NetworkUser u) { // Check if the mainGui is not null. // If not then open it after refreshing its contents. // If no gui exists open the navigator. - if (u.mainGui != null) { - u.mainGui.refresh(); u.mainGui.open(u); } else { - - Network.getInstance().navigatorGui.open(u); + navigator.open(u); } } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -42,11 +55,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } @@ -54,56 +67,62 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check args, allows the player to open a specific menu directly. if (args.length > 0) { switch (args[0]) { - case "explore" -> openExplore(user); case "building" -> openBuilding(user); case "tutorials" -> openTutorials(user); default -> openNavigator(user); } } else { - // If the player has a previous gui, open that. openNavigator(user); } } private void openExplore(NetworkUser u) { - - if (u.mainGui != null) { - u.mainGui.delete(); - u.mainGui = null; + if (constants.warpsEnabled()) { + if (u.mainGui != null) { + u.mainGui.delete(); + } + u.mainGui = new ExploreGui(u); + u.mainGui.open(u); + } else { + openNavigator(u); } - - u.mainGui = new ExploreGui(u); - u.mainGui.open(u); } private void openBuilding(NetworkUser u) { - if (u.mainGui != null) { u.mainGui.delete(); - u.mainGui = null; } - u.mainGui = new BuildGui(u); u.mainGui.open(u); } // Only if tutorials is enabled and the server is not already tutorials. private void openTutorials(NetworkUser u) { - - if (SERVER_TYPE != TUTORIAL && TUTORIALS) { - + if (constants.serverType() != TUTORIAL && constants.tutorials()) { if (u.mainGui != null) { u.mainGui.delete(); - u.mainGui = null; } - u.mainGui = new TutorialsGui(u); u.mainGui.open(u); } else { - openNavigator(u); } } + + @Override + public String getLabel() { + return "navigator"; + } + + @Override + public String getDescription() { + return "Opens the main gui, will always return to the previous menu if possible."; + } + + @Override + public List getAliases() { + return List.of("nav", "gui", "menu", "claim"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index 5f3b16ff..e46f2753 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -1,9 +1,10 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.plotsystem.PlotInfo; import net.bteuk.network.gui.plotsystem.PlotMenu; import net.bteuk.network.lib.utils.ChatUtils; @@ -16,22 +17,24 @@ import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.List; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class Plot extends AbstractCommand { private final Network instance; + private final EventAPI eventAPI; private final PlotSQL plotSQL; - public Plot(Network instance) { + public Plot(Network instance, EventAPI eventAPI, PlotSQL plotSQL) { this.instance = instance; - plotSQL = Network.getInstance().getPlotSQL(); + this.eventAPI = eventAPI; + this.plotSQL = plotSQL; setTabCompleter(new FixedArgSelector(Arrays.asList("info", "join"), 0)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -69,7 +72,7 @@ private void menu(Player p) { NetworkUser u = instance.getUser(p); if (u == null) { p.sendMessage(ChatUtils.error("An error occurred, please rejoin!")); - LOGGER.severe("No user exists for player " + p.getName()); + log.severe("No user exists for player " + p.getName()); return; } // Open the plot menu. @@ -86,8 +89,7 @@ private void info(Player p, int plot) { return; } // Check if the plot exists and is not deleted. - PlotStatus status = - PlotStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_data WHERE id=" + plot + ";")); + PlotStatus status = PlotStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_data WHERE id=" + plot + ";")); if (status == null || status == PlotStatus.DELETED) { p.sendMessage(ChatUtils.error("This plot does not exist.")); return; @@ -96,7 +98,7 @@ private void info(Player p, int plot) { NetworkUser u = instance.getUser(p); if (u == null) { p.sendMessage(ChatUtils.error("An error occurred, please rejoin!")); - LOGGER.severe("No user exists for player " + p.getName()); + log.severe("No user exists for player " + p.getName()); return; } // Open the plot info menu. @@ -113,13 +115,12 @@ private void join(Player p, int plot) { return; } - // Check if they have an invite for this plot. + // Check if they have an invitation for this plot. if (plotSQL.hasRow("SELECT id FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';")) { // Add server event to join plot. - EventManager.createEvent(p.getUniqueId().toString(), "plotsystem", plotSQL.getString("SELECT server FROM " + - "location_data WHERE name='" + - plotSQL.getString("SELECT location FROM plot_data WHERE id=" + plot + ";") + "';"), + eventAPI.createEvent(p.getUniqueId().toString(), "plotsystem", + plotSQL.getString("SELECT server FROM " + "location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + plot + ";") + "';"), "join plot " + plot); // Remove invite. @@ -137,16 +138,14 @@ private void feedback(Player player, int plot) { // Check if the player is the owner of a member of the plot. // Then open the latest feedback. // And set their Main gui to the plot info of this plot. - if (!plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plot + " AND uuid='" + player.getUniqueId() + - "';")) { + if (!plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plot + " AND uuid='" + player.getUniqueId() + "';")) { player.sendMessage(ChatUtils.error("You are no longer the owner or a member of this plot.")); return; } // Find the latest attempt. String uuid = plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plot + " AND is_owner=1;"); - int latestAttempt = plotSQL.getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + - "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); + int latestAttempt = plotSQL.getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); if (latestAttempt == 0) { player.sendMessage(Utils.error("There is no feedback available for this plot.")); @@ -159,8 +158,7 @@ private void feedback(Player player, int plot) { } // Create book. - int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plot + " AND uuid='" + uuid + "' " + - "AND attempt=" + latestAttempt + ";"); + int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plot + " AND uuid='" + uuid + "' " + "AND attempt=" + latestAttempt + ";"); // Open the book. player.openBook(ReviewFeedback.createFeedbackBook(reviewId)); @@ -172,4 +170,19 @@ private void error(Player p) { p.sendMessage(ChatUtils.error("/plot join ")); p.sendMessage(ChatUtils.error("/plot feedback ")); } + + @Override + public String getLabel() { + return "plot"; + } + + @Override + public String getDescription() { + return "Allows players to manipulate plots without using the gui."; + } + + @Override + public List getAliases() { + return List.of("plots"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java index 3dfbd1cd..6c27f92d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java @@ -1,20 +1,27 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.regions.Region; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; - public class RegionCommand extends AbstractCommand { + private final RegionManager regionManager; + private final EventAPI eventAPI; + + public RegionCommand(RegionManager regionManager, EventAPI eventAPI) { + this.regionManager = regionManager; + this.eventAPI = eventAPI; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -34,40 +41,42 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Check if the region exists. - if (Network.getInstance().getRegionManager().exists(args[1])) { + if (regionManager.exists(args[1])) { // Get the region. - Region region = Network.getInstance().getRegionManager().getRegion(args[1]); + Region region = regionManager.getRegion(args[1]); - // Check if they have an invite for this region. - if (region.hasInvite(player.getUniqueId().toString())) { + // Check if they have an invitation for this region. + if (regionManager.hasInvite(region, player.getUniqueId().toString())) { // Check if the player has permission, else notify the player accordingly. if (player.hasPermission("uknet.regions.join")) { - - // Add server event to join plot. - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(uuid,type,server,event) " + - "VALUES('" + player.getUniqueId() + "'," + "'network'" + ",'" + - EARTH_WORLD + - "','region join " + region.regionName() + "');"); + // Add server event to join the region. + eventAPI.createEvent(player.getUniqueId().toString(), "network", regionManager.getServer(region), "region join " + region.regionName()); } else { - // Send error. player.sendMessage(ChatUtils.error("You do not have permission to join regions.")); player.sendMessage(ChatUtils.error("To join regions you need at least Jr.Builder.")); - player.sendMessage(ChatUtils.error("For more information type ") - .append(Component.text("/help building", NamedTextColor.DARK_RED))); + player.sendMessage(ChatUtils.error("For more information type ").append(Component.text("/help building", NamedTextColor.DARK_RED))); } // Remove invite. - region.removeInvite(player.getUniqueId().toString()); + regionManager.removeInvite(region, player.getUniqueId().toString()); } else { player.sendMessage(ChatUtils.error("You have not been invited to join this region.")); } } else { - player.sendMessage(ChatUtils.error("The region ") - .append(Component.text(args[1], NamedTextColor.DARK_RED)) - .append(ChatUtils.error(" does not exist."))); + player.sendMessage(ChatUtils.error("The region ").append(Component.text(args[1], NamedTextColor.DARK_RED)).append(ChatUtils.error(" does not exist."))); } } + + @Override + public String getLabel() { + return "region"; + } + + @Override + public String getDescription() { + return "Allows players to manipulate regions without using the gui."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Zone.java b/Plugin/src/main/java/net/bteuk/network/commands/Zone.java index 1efc8cd9..98500e8d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Zone.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Zone.java @@ -1,8 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.EventAPI; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.PlotSQL; import org.bukkit.entity.Player; @@ -10,8 +9,16 @@ public class Zone extends AbstractCommand { + private final PlotSQL plotSQL; + private final EventAPI eventAPI; + + public Zone(PlotSQL plotSQL, EventAPI eventAPI) { + this.plotSQL = plotSQL; + this.eventAPI = eventAPI; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -41,16 +48,12 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); + // Check if they have an invitation for this plot. + if (plotSQL.hasRow("SELECT id FROM zone_invites WHERE id=" + zoneID + " AND uuid='" + player.getUniqueId() + "';")) { - // Check if they have an invite for this plot. - if (plotSQL.hasRow("SELECT id FROM zone_invites WHERE id=" + zoneID + " AND uuid='" + player.getUniqueId() + - "';")) { - - // Add server event to join plot. - EventManager.createEvent(player.getUniqueId().toString(), "plotsystem", plotSQL.getString("SELECT server " + - "FROM location_data WHERE name='" + - plotSQL.getString("SELECT location FROM zones WHERE id=" + zoneID + ";") + "';"), + // Add server event to join the plot. + eventAPI.createEvent(player.getUniqueId().toString(), "plotsystem", + plotSQL.getString("SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + zoneID + ";") + "';"), "join zone " + zoneID); // Remove invite. @@ -59,4 +62,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { player.sendMessage(ChatUtils.error("You have not been invited to join this Zone.")); } } + + @Override + public String getLabel() { + return "zone"; + } + + @Override + public String getDescription() { + return "Zone command."; + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java index b8afde15..b40009fe 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java @@ -3,55 +3,35 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.SwitchServer; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.util.Objects; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class Back extends AbstractCommand { + private final Constants constants; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final GlobalSQL globalSQL; - private EventAPI eventAPI; - - public Back(EventAPI eventAPI) { + public Back(Network instance, Constants constants, EventAPI eventAPI, ServerAPI serverAPI) { + this.constants = constants; this.eventAPI = eventAPI; - } - - // Sets the location as the previous location in the database. - public static void setPreviousCoordinate(String uuid, NetworkLocation location) { - - // Set previous location for /back. - if (Network.getInstance().getGlobalSQL() - .getInt("SELECT previous_coordinate FROM player_data WHERE uuid='" + uuid + "';") == 0) { - - // No coordinate exists, create new. - int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(location); - - // Set coordinate id in player data. - Network.getInstance().getGlobalSQL() - .update("UPDATE player_data SET previous_coordinate=" + coordinateID + " WHERE uuid='" + uuid + - "';"); - } else { - - // Get coordinate id. - int coordinateID = Network.getInstance().getGlobalSQL().getInt("SELECT previous_coordinate FROM " + - "player_data WHERE uuid='" + uuid + "';"); - - // Update existing coordinate. - Network.getInstance().getGlobalSQL().updateCoordinate(coordinateID, location); - } + this.serverAPI = serverAPI; + this.globalSQL = instance.getGlobalSQL(); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -60,8 +40,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Get the coordinate ID. - int coordinateID = Network.getInstance().getGlobalSQL().getInt("SELECT previous_coordinate FROM player_data " + - "WHERE uuid='" + player.getUniqueId() + "';"); + int coordinateID = globalSQL.getInt("SELECT previous_coordinate FROM player_data " + "WHERE uuid='" + player.getUniqueId() + "';"); // Check if the player has a previous coordinate. if (coordinateID == 0) { @@ -71,13 +50,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Check if the server is this server. - String server = - Network.getInstance().getGlobalSQL() - .getString("SELECT server FROM coordinates WHERE id=" + coordinateID + ";"); - if (Objects.equals(SERVER_NAME, server)) { + String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinateID + ";"); + if (Objects.equals(constants.serverName(), server)) { // Get location. - Location l = Network.getInstance().getGlobalSQL().getLocation(coordinateID); + Location l = globalSQL.getLocation(coordinateID); // Set current location to previous location. setPreviousCoordinate(player.getUniqueId().toString(), LocationAdapter.adapt(player.getLocation())); @@ -85,24 +62,52 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Teleport player to the coordinate. player.teleport(l); player.sendMessage(ChatUtils.success("Teleported to previous location.")); - } else { + } else if (!constants.standalone()) { // Teleport the player to the correct server with a join event to teleport to the coordinate id. - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - // Create teleport event for location of coordinate id - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + - globalSQL.getString("SELECT world FROM coordinates WHERE id=" + coordinateID + ";") + " " + - globalSQL.getDouble("SELECT x FROM coordinates WHERE id=" + coordinateID + ";") + " " + - globalSQL.getDouble("SELECT y FROM coordinates WHERE id=" + coordinateID + ";") + " " + - globalSQL.getDouble("SELECT z FROM coordinates WHERE id=" + coordinateID + ";") + " " + - globalSQL.getFloat("SELECT yaw FROM coordinates WHERE id=" + coordinateID + ";") + " " + - globalSQL.getFloat("SELECT pitch FROM coordinates WHERE id=" + coordinateID + ";"), - "&aTeleport to previous location.", LocationAdapter.adapt(player.getLocation())); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", + "teleport " + globalSQL.getString("SELECT world FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( + "SELECT x FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( + "SELECT y FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( + "SELECT z FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getFloat( + "SELECT yaw FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getFloat( + "SELECT pitch FROM coordinates WHERE id=" + coordinateID + ";"), "&aTeleport to previous location.", LocationAdapter.adapt(player.getLocation())); // Switch server. - SwitchServer.switchServer(player, server); + serverAPI.switchServer(PlayerAdapter.adapt(player), server); + } + } + + // Sets the location as the previous location in the database. + public void setPreviousCoordinate(String uuid, NetworkLocation location) { + + // Set previous location for /back. + if (globalSQL.getInt("SELECT previous_coordinate FROM player_data WHERE uuid='" + uuid + "';") == 0) { + + // No coordinate exists, create new. + int coordinateID = globalSQL.addCoordinate(location); + + // Set coordinate id in player data. + globalSQL.update("UPDATE player_data SET previous_coordinate=" + coordinateID + " WHERE uuid='" + uuid + "';"); + } else { + + // Get coordinate id. + int coordinateID = globalSQL.getInt("SELECT previous_coordinate FROM " + "player_data WHERE uuid='" + uuid + "';"); + + // Update existing coordinate. + globalSQL.updateCoordinate(coordinateID, location); } } + + @Override + public String getLabel() { + return "back"; + } + + @Override + public String getDescription() { + return "Teleports the player to the previous teleported location."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java index 359e1dc4..a68d8178 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java @@ -19,7 +19,6 @@ public class Delhome extends AbstractCommand { // Constructor to enable the command. public Delhome(Network instance) { - this.globalSQL = instance.getGlobalSQL(); // Set tab completer. @@ -27,7 +26,7 @@ public Delhome(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -41,17 +40,13 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { if (args.length == 0) { // Check if the default home exists. - if (!globalSQL.hasRow( - "SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;")) { - player.sendMessage(ChatUtils.error("You not have a default home set, set one with ") - .append(Component.text("/sethome", NamedTextColor.DARK_RED))); + if (!globalSQL.hasRow("SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;")) { + player.sendMessage(ChatUtils.error("You not have a default home set, set one with ").append(Component.text("/sethome", NamedTextColor.DARK_RED))); return; } // Get coordinate ID. - int coordinate_id = - globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + - "name IS NULL;"); + int coordinate_id = globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + "name IS NULL;"); // Delete default home. globalSQL.update("DELETE FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;"); @@ -63,8 +58,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Check for permission. if (!player.hasPermission("uknet.navigation.homes")) { - player.sendMessage(ChatUtils.error("You do not have permission to delete multiple homes, only to " + - "delete a default home using ") + player.sendMessage(ChatUtils.error("You do not have permission to delete multiple homes, only to " + "delete a default home using ") .append(Component.text("/delhome", NamedTextColor.DARK_RED))); return; } @@ -73,25 +67,30 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { String name = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); // Get coordinate ID. - int coordinate_id = - globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + - "name='" + name + "';"); + int coordinate_id = globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + "name='" + name + "';"); // Check is home with this name exists. - if (!globalSQL.hasRow( - "SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';")) { - player.sendMessage(ChatUtils.error("You do not have a home set with the name ") - .append(Component.text(name, NamedTextColor.DARK_RED))); + if (!globalSQL.hasRow("SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';")) { + player.sendMessage(ChatUtils.error("You do not have a home set with the name ").append(Component.text(name, NamedTextColor.DARK_RED))); return; } // Delete home globalSQL.update("DELETE FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';"); - player.sendMessage(Component.text(name, NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" home removed."))); + player.sendMessage(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" home removed."))); // Delete coordinate id. globalSQL.update("DELETE FROM coordinates WHERE id=" + coordinate_id + ";"); } } + + @Override + public String getLabel() { + return "delhome"; + } + + @Override + public String getDescription() { + return "Delete a home."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java index 250b1031..29e3d56a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java @@ -2,14 +2,18 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.HomeSelector; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.SwitchServer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -17,23 +21,26 @@ import java.util.Arrays; import java.util.Objects; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class Home extends AbstractCommand { private final GlobalSQL globalSQL; + private final Constants constants; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; // Constructor to enable the command. - public Home(Network instance) { - + public Home(Network instance, Constants constants, EventAPI eventAPI, ServerAPI serverAPI) { this.globalSQL = instance.getGlobalSQL(); + this.constants = constants; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; // Set tab completer. setTabCompleter(new HomeSelector()); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -44,50 +51,24 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If no args teleport to default home, if exists. // Else try to set homes with specific names. // For multiple homes the player needs permission. + int coordinateId; + String message; if (args.length == 0) { // If a default home is set, teleport to it. - if (!globalSQL.hasRow( - "SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;")) { - player.sendMessage(ChatUtils.error("You do not have a default home set, you can set it typing ") - .append(Component.text("/sethome", NamedTextColor.DARK_RED))); + if (!globalSQL.hasRow("SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;")) { + player.sendMessage(ChatUtils.error("You do not have a default home set, you can set it typing ").append(Component.text("/sethome", NamedTextColor.DARK_RED))); return; } // Get coordinate ID. - int coordinate_id = - globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + - "name IS NULL;"); - - // Get server. - String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); - - // Check if server is current. - if (Objects.equals(SERVER_NAME, server)) { - - // Get default home location from the coordinate id. - Location l = globalSQL.getLocation(coordinate_id); - - // Teleport to the location. - player.teleport(l); - player.sendMessage(ChatUtils.success("Teleported to your default home.")); - } else { - - // Switch server with join event. - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", - "teleport coordinateID " + coordinate_id, - "&aTeleported to your default home.", - player.getLocation()); - - // Switch server. - SwitchServer.switchServer(player, server); - } + coordinateId = globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND name IS NULL;"); + message = "&aTeleported to your default home."; } else { // Check for permission. if (!player.hasPermission("uknet.navigation.homes")) { - player.sendMessage(ChatUtils.error("You do not have permission to set multiple homes, you can only " + - "use your default home with ") + player.sendMessage(ChatUtils.error("You do not have permission to set multiple homes, you can only " + "use your default home with ") .append(Component.text("/home", NamedTextColor.DARK_RED))); return; } @@ -96,42 +77,46 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { String name = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); // Check if home with this name exists. - if (!globalSQL.hasRow( - "SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';")) { - player.sendMessage(ChatUtils.error("You do not have a home with the name ") - .append(Component.text(name, NamedTextColor.DARK_RED))); + if (!globalSQL.hasRow("SELECT uuid FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';")) { + player.sendMessage(ChatUtils.error("You do not have a home with the name ").append(Component.text(name, NamedTextColor.DARK_RED))); return; } // Get coordinate ID. - int coordinate_id = - globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND " + - "name='" + name + "';"); + coordinateId = globalSQL.getInt("SELECT coordinate_id FROM home WHERE uuid='" + player.getUniqueId() + "' AND name='" + name + "';"); + message = "&aTeleported to your home &3" + name + "&a."; + } - // Get server. - String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); + // Get server. + String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinateId + ";"); - // Check if server is current. - if (Objects.equals(SERVER_NAME, server)) { + // Check if server is current. + if (Objects.equals(constants.serverName(), server)) { - // Get default home location from the coordinate id. - Location l = globalSQL.getLocation(coordinate_id); + // Get default home location from the coordinate id. + Location l = globalSQL.getLocation(coordinateId); - // Teleport to the location. - player.teleport(l); - player.sendMessage(ChatUtils.success("Teleported to your home ") - .append(Component.text(name, NamedTextColor.DARK_AQUA))); - } else { + // Teleport to the location. + player.teleport(l); + player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(message)); + } else if (!constants.standalone()) { - // Switch server with join event. - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", - "teleport coordinateID " + coordinate_id, - "&aTeleported to your home &3" + name + "&a.", - player.getLocation()); + // Switch server with join event. + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport coordinateID " + coordinateId, "&aTeleported to your default home.", + LocationAdapter.adapt(player.getLocation())); - // Switch server. - SwitchServer.switchServer(player, server); - } + // Switch server. + serverAPI.switchServer(PlayerAdapter.adapt(player), server); } } + + @Override + public String getLabel() { + return "home"; + } + + @Override + public String getDescription() { + return "Teleport to your home."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java index a5b216f4..96a7f4da 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Homes.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Utils; @@ -13,12 +14,18 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; +import java.util.List; public class Homes extends AbstractCommand { + private final SQLAPI globalSQL; + + public Homes(Network instance) { + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, @NotNull String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -45,8 +52,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Get all homes in alphabetical order. - ArrayList homes = Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM home WHERE " + - "uuid='" + player.getUniqueId() + "' ORDER BY name ASC;"); + List homes = globalSQL.getStringList("SELECT name FROM home WHERE " + "uuid='" + player.getUniqueId() + "' ORDER BY name ASC;"); // If there are no locations notify the user. if (homes.isEmpty()) { @@ -62,13 +68,9 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { if (((page - 1) * 16) >= homes.size()) { if (homes.size() <= 16) { - player.sendMessage(ChatUtils.error("There is only ") - .append(Component.text("1", NamedTextColor.DARK_RED)) - .append(ChatUtils.error(" page of homes."))); + player.sendMessage(ChatUtils.error("There is only ").append(Component.text("1", NamedTextColor.DARK_RED)).append(ChatUtils.error(" page of homes."))); } else { - player.sendMessage(ChatUtils.error("There are only ") - .append(Component.text(pages, NamedTextColor.DARK_RED)) - .append(ChatUtils.error(" pages of homes."))); + player.sendMessage(ChatUtils.error("There are only ").append(Component.text(pages, NamedTextColor.DARK_RED)).append(ChatUtils.error(" pages of homes."))); } return; } @@ -81,32 +83,27 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Create previousPage button with hover and click event. Component previousPage = Component.text("⏪⏪⏪", TextColor.color(212, 113, 15)); - previousPage = previousPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line( - "Click to view the previous page of homes."))); - previousPage = previousPage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/homes " + (page - 1))); + previousPage = previousPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click to view the previous page of homes."))); + previousPage = previousPage.clickEvent(ClickEvent.runCommand("/homes " + (page - 1))); // Add previousPage button at the start of the first line. message = message.append(previousPage); message = message.append(Component.text(" ")); } - message = message.append(Component.text("Page ", NamedTextColor.GREEN) - .append(Component.text(page, TextColor.color(245, 221, 100))) - .append(Component.text("/", NamedTextColor.GREEN)) - .append(Component.text(pages, TextColor.color(245, 221, 100)))); + message = message.append( + Component.text("Page ", NamedTextColor.GREEN).append(Component.text(page, TextColor.color(245, 221, 100))).append(Component.text("/", NamedTextColor.GREEN)) + .append(Component.text(pages, TextColor.color(245, 221, 100)))); // If this isn't the last page show command for the next page. if ((page * 16) < homes.size()) { - // Create previousPage button with hover and click event. + // Create the previousPage button with hover and click-event. Component nextPage = Component.text("⏩⏩⏩\n", TextColor.color(212, 113, 15)); - nextPage = nextPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click to " + - "view the next page of homes."))); - nextPage = nextPage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/homes " + (page + 1))); + nextPage = nextPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click to " + "view the next page of homes."))); + nextPage = nextPage.clickEvent(ClickEvent.runCommand("/homes " + (page + 1))); - // Add previousPage button at the start of the first line. + // Add the previousPage button at the start of the first line. message = message.append(Component.text(" ")); message = message.append(nextPage); } else { @@ -143,16 +140,24 @@ private Component createHome(String name) { Component home; if (name == null) { home = Component.text("", TextColor.color(245, 221, 100)); - home = home.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to " + - "teleport to your default home."))); - home = home.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/home")); + home = home.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to " + "teleport to your default home."))); + home = home.clickEvent(ClickEvent.runCommand("/home")); } else { home = Component.text(name, TextColor.color(245, 221, 100)); - home = home.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to " + - "teleport to " + name))); - home = home.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/home " + name)); + home = home.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to " + "teleport to " + name))); + home = home.clickEvent(ClickEvent.runCommand("/home " + name)); } return home; } + + @Override + public String getLabel() { + return "homes"; + } + + @Override + public String getDescription() { + return "Like warps, but for homes, shows all homes the player has set."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java index 16eeb0e0..e9775f29 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java @@ -1,11 +1,13 @@ package net.bteuk.network.commands.navigation; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.NavigationTabCompleter; import net.bteuk.network.gui.navigation.AddLocation; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.enums.AddLocationType; import net.bteuk.network.utils.enums.Category; @@ -16,8 +18,7 @@ import java.util.Arrays; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class Navigation extends AbstractCommand { private static final Component ERROR_SUBCATEGORY_ADD = ChatUtils.error("/navigation subcategory add [category] " + @@ -25,12 +26,17 @@ public class Navigation extends AbstractCommand { private static final Component ERROR_SUBCATEGORY_REMOVE = ChatUtils.error("/navigation subcategory remove " + ""); - public Navigation() { + private final Network instance; + private final GlobalSQL globalSQL; + + public Navigation(Network instance) { + this.instance = instance; + this.globalSQL = instance.getGlobalSQL(); setTabCompleter(new NavigationTabCompleter()); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -38,11 +44,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } @@ -103,7 +109,7 @@ private void updateLocation(NetworkUser u, String[] args) { String location = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); // Check if the location exists. - if (!Network.getInstance().getGlobalSQL() + if (!globalSQL .hasRow("SELECT location FROM location_data WHERE location='" + location + "';")) { u.sendMessage(ChatUtils.error("The location ") .append(Component.text(location, NamedTextColor.DARK_RED)) @@ -112,7 +118,7 @@ private void updateLocation(NetworkUser u, String[] args) { } // Check if there is a marker on the map. - if (Network.getInstance().getGlobalSQL() + if (globalSQL .hasRow("SELECT location FROM location_marker WHERE location='" + location + "';")) { u.sendMessage(ChatUtils.error("The location %s has a marker on the map, this must be removed first using " + "%s", @@ -127,16 +133,16 @@ private void updateLocation(NetworkUser u, String[] args) { } // Get details from the location. - Category category = Category.valueOf(Network.getInstance().getGlobalSQL().getString("SELECT category FROM " + + Category category = Category.valueOf(globalSQL.getString("SELECT category FROM " + "location_data WHERE location='" + location + "';")); - int subcategory_id = Network.getInstance().getGlobalSQL().getInt("SELECT subcategory FROM location_data WHERE" + + int subcategory_id = globalSQL.getInt("SELECT subcategory FROM location_data WHERE" + " location='" + location + "';"); String subcategory = null; if (subcategory_id != 0) { - subcategory = Network.getInstance().getGlobalSQL().getString("SELECT name FROM location_subcategory WHERE" + + subcategory = globalSQL.getString("SELECT name FROM location_subcategory WHERE" + " id=" + subcategory_id + ";"); } - int coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM location_data WHERE " + + int coordinate_id = globalSQL.getInt("SELECT coordinate FROM location_data WHERE " + "location='" + location + "';"); u.staffGui = new AddLocation(AddLocationType.UPDATE, location, coordinate_id, category, subcategory); u.staffGui.open(u); @@ -157,7 +163,7 @@ private void removeLocation(NetworkUser u, String[] args) { String location = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); // Check if the location exists. - if (!Network.getInstance().getGlobalSQL() + if (!globalSQL .hasRow("SELECT location FROM location_data WHERE location='" + location + "';")) { u.sendMessage(ChatUtils.error("The location ") .append(Component.text(location, NamedTextColor.DARK_RED)) @@ -166,7 +172,7 @@ private void removeLocation(NetworkUser u, String[] args) { } // Check if there is a marker on the map. - if (Network.getInstance().getGlobalSQL() + if (globalSQL .hasRow("SELECT location FROM location_marker WHERE location='" + location + "';")) { u.sendMessage(ChatUtils.error("The location %s has a marker on the map, this must be removed first using " + "%s", @@ -175,7 +181,7 @@ private void removeLocation(NetworkUser u, String[] args) { } // Delete location. - Network.getInstance().getGlobalSQL().update("DELETE FROM location_data WHERE location='" + location + "';"); + globalSQL.update("DELETE FROM location_data WHERE location='" + location + "';"); u.sendMessage(ChatUtils.success("Location ") .append(Component.text(location, NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" removed."))); @@ -188,20 +194,20 @@ private void suggestedLocation(NetworkUser u, String[] args) { String location = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); // Check if the location exists. - if (Network.getInstance().getGlobalSQL() + if (globalSQL .hasRow("SELECT location FROM location_data WHERE location='" + location + "';")) { // Change suggested status of location. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT location FROM location_data WHERE " + + if (globalSQL.hasRow("SELECT location FROM location_data WHERE " + "location='" + location + "' AND suggested=1;")) { // Location is already suggested, remove that. - Network.getInstance().getGlobalSQL().update("UPDATE location_data SET suggested=0 WHERE " + + globalSQL.update("UPDATE location_data SET suggested=0 WHERE " + "location='" + location + "';"); u.sendMessage(ChatUtils.success("The location ") .append(Component.text(location, NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" will no longer be suggested."))); } else { // Set location as suggested. - Network.getInstance().getGlobalSQL().update("UPDATE location_data SET suggested=1 WHERE " + + globalSQL.update("UPDATE location_data SET suggested=1 WHERE " + "location='" + location + "';"); u.sendMessage(ChatUtils.success("The location ") .append(Component.text(location, NamedTextColor.DARK_AQUA)) @@ -250,12 +256,12 @@ private void addSubcategory(NetworkUser u, String[] args) { .anyMatch(category -> category.toString().equalsIgnoreCase(args[2]))) { // Check that the subcategory does not yet exist. String name = String.join(" ", Arrays.copyOfRange(args, 3, args.length)); - if (Network.getInstance().getGlobalSQL() + if (globalSQL .hasRow("SELECT name FROM location_subcategory WHERE name='" + name + "';")) { u.sendMessage(ChatUtils.error("Subcategory ").append(Component.text(name, NamedTextColor.DARK_RED)).append(ChatUtils.error(" already exists."))); } else { - Network.getInstance().getGlobalSQL().update("INSERT INTO location_subcategory(name,category) " + + globalSQL.update("INSERT INTO location_subcategory(name,category) " + "VALUES('" + name + "','" + args[2].toUpperCase() + "');"); u.sendMessage(ChatUtils.success("Subcategory ").append(Component.text(name, NamedTextColor.DARK_AQUA)) @@ -278,7 +284,7 @@ private void removeSubcategory(NetworkUser u, String[] args) { // Check if a valid subcategory is listed. String name = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); - int subcategory_id = Network.getInstance().getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE " + + int subcategory_id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE " + "name='" + name + "';"); if (subcategory_id == 0) { @@ -288,7 +294,7 @@ private void removeSubcategory(NetworkUser u, String[] args) { } // Check if there is a marker on the map. - if (Network.getInstance().getGlobalSQL() + if (globalSQL .hasRow("SELECT subcategory FROM location_marker WHERE subcategory=" + subcategory_id + ";")) { u.sendMessage(ChatUtils.error("The subcategory %s has a marker on the map, this must be removed first " + "using %s", @@ -297,12 +303,12 @@ private void removeSubcategory(NetworkUser u, String[] args) { } // Set all locations (and requests) with this subcategory to subcategory = null. - Network.getInstance().getGlobalSQL() + globalSQL .update("UPDATE location_data SET subcategory=NULL WHERE subcategory=" + subcategory_id + ";"); - Network.getInstance().getGlobalSQL().update("UPDATE location_requests SET subcategory=NULL WHERE " + + globalSQL.update("UPDATE location_requests SET subcategory=NULL WHERE " + "subcategory=" + subcategory_id + ";"); // Remove the subcategory. - Network.getInstance().getGlobalSQL().update("DELETE FROM location_subcategory WHERE id=" + subcategory_id + + globalSQL.update("DELETE FROM location_subcategory WHERE id=" + subcategory_id + ";"); u.sendMessage(ChatUtils.error("Subcategory ").append(Component.text(name, NamedTextColor.DARK_RED)) .append(ChatUtils.error(" removed."))); @@ -342,4 +348,14 @@ private void errorSubcategory(NetworkUser u) { u.sendMessage(ERROR_SUBCATEGORY_ADD); u.sendMessage(ERROR_SUBCATEGORY_REMOVE); } + + @Override + public String getLabel() { + return "navigation"; + } + + @Override + public String getDescription() { + return "Adds commands to do with navigation."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java index 46fe6c6b..267c7b1d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java @@ -1,11 +1,13 @@ package net.bteuk.network.commands.navigation; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.ServerSelector; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; @@ -15,19 +17,24 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class Server extends AbstractCommand { - public Server() { + private final SQLAPI globalSQL; + private final Constants constants; + private final ServerAPI serverAPI; + + public Server(SQLAPI globalSQL, Constants constants, ServerAPI serverAPI) { + this.globalSQL = globalSQL; + this.constants = constants; + this.serverAPI = serverAPI; setTabCompleter(new ServerSelector()); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -43,8 +50,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If no args are given send a clickable list of servers. // Sort by online servers and highlight the player's current server. if (args.length == 0) { - ArrayList servers = Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM " + - "server_data ORDER BY online DESC"); + List servers = globalSQL.getStringList("SELECT name FROM server_data ORDER BY online DESC"); Component message = Component.text("Available servers: ", NamedTextColor.GREEN); @@ -53,12 +59,11 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If the server is the current server highlight it. // If it's offline, grey it out. Component server; - if (Objects.equals(SERVER_NAME, servers.get(i))) { + if (Objects.equals(constants.serverName(), servers.get(i))) { server = Component.text(servers.get(i), TextColor.color(245, 173, 100)); server = server.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("You are" + " connected to this server."))); - } else if (Network.getInstance().getGlobalSQL() - .hasRow("SELECT name FROM server_data WHERE name='" + servers.get(i) + "' AND online=0;")) { + } else if (globalSQL.hasRow("SELECT name FROM server_data WHERE name='" + servers.get(i) + "' AND online=0;")) { server = Component.text(servers.get(i), NamedTextColor.GRAY); server = server.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("This " + "server is offline."))); @@ -66,8 +71,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { server = Component.text(servers.get(i), TextColor.color(245, 221, 100)); server = server.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click " + "to teleport to " + servers.get(i)))); - server = server.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/server " + servers.get(i))); + server = server.clickEvent(ClickEvent.runCommand("/server " + servers.get(i))); } message = message.append(server); @@ -84,16 +88,15 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Teleport to the server of the first arg. // If that is not a server notify the player. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT name FROM server_data WHERE name='" + args[0] + - "';")) { + if (globalSQL.hasRow("SELECT name FROM server_data WHERE name='" + args[0] + "';")) { // Check if the player is not already on this server. - if (Objects.equals(SERVER_NAME, args[0])) { + if (Objects.equals(constants.serverName(), args[0])) { player.sendMessage(ChatUtils.error("You are already on this server.")); } else { - SwitchServer.switchServer(player, args[0]); + serverAPI.switchServer(PlayerAdapter.adapt(player), args[0]); } } else { @@ -102,4 +105,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } } } + + @Override + public String getLabel() { + return "server"; + } + + @Override + public String getDescription() { + return "Switch server by command."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java index 57d6180c..7c4a0428 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Sethome.java @@ -23,7 +23,7 @@ public Sethome(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -43,7 +43,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - // Set home to current location. + // Set home to the current location. int coordinate_id = getCoordinateID(player.getLocation()); globalSQL.update( @@ -93,6 +93,16 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { private int getCoordinateID(Location l) { // Create location coordinate. - return Network.getInstance().getGlobalSQL().addCoordinate(l); + return globalSQL.addCoordinate(l); + } + + @Override + public String getLabel() { + return "sethome"; + } + + @Override + public String getDescription() { + return "Set a home to your current location."; } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java index fef9cf74..4194c118 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java @@ -1,21 +1,40 @@ package net.bteuk.network.commands.navigation; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.enums.ServerType; +import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - public class Spawn extends AbstractCommand { + private final Constants constants; + private final Back back; + private final Lobby lobby; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final SQLAPI globalSQL; + + public Spawn(Constants constants, Back back, Lobby lobby, EventAPI eventAPI, ServerAPI serverAPI, SQLAPI globalSQL) { + this.constants = constants; + this.back = back; + this.lobby = lobby; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + this.globalSQL = globalSQL; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -29,18 +48,28 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // If server is Lobby, teleport to spawn. - if (SERVER_TYPE == ServerType.LOBBY) { + NetworkLocation location = LocationAdapter.adapt(player.getLocation()); + if (constants.serverType() == ServerType.LOBBY) { - Back.setPreviousCoordinate(player.getUniqueId().toString(), player.getLocation()); - player.teleport(Network.getInstance().getLobby().spawn); + back.setPreviousCoordinate(player.getUniqueId().toString(), location); + player.teleport(lobby.getSpawn()); player.sendMessage(ChatUtils.success("Teleported to spawn.")); } else { // Set teleport event to go to spawn. - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport spawn", - player.getLocation()); - SwitchServer.switchServer(player, Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport spawn", location); + serverAPI.switchServer(PlayerAdapter.adapt(player), globalSQL.getString("SELECT name FROM " + "server_data WHERE type='LOBBY';")); } } + + @Override + public String getLabel() { + return "spawn"; + } + + @Override + public String getDescription() { + return "Teleport to spawnpoint in lobby."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java new file mode 100644 index 00000000..93cbe25b --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java @@ -0,0 +1,109 @@ +package net.bteuk.network.commands.navigation; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.commands.tabcompleters.PlayerSelector; +import net.bteuk.network.core.Constants; +import net.bteuk.network.lib.dto.OnlineUser; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.utils.NetworkUser; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Optional; + +public class Teleport extends AbstractCommand { + + private final Network instance; + private final Back back; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final SQLAPI globalSQL; + private final Constants constants; + + public Teleport(Network instance, Back back, EventAPI eventAPI, ServerAPI serverAPI, Constants constants) { + this.instance = instance; + this.back = back; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + this.globalSQL = instance.getGlobalSQL(); + this.constants = constants; + setTabCompleter(new PlayerSelector()); + } + + @Override + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { + + // Check if the sender is a player. + Player player = getPlayer(stack); + if (player == null) { + return; + } + + // Check if args exist. + if (args.length == 0) { + player.sendMessage(ChatUtils.error("You must specify a player to teleport to.")); + return; + } + + // Try and find the player by name. + Optional optionalOnlineUser = instance.getOnlineUserByNameIgnoreCase(args[0]); + if (optionalOnlineUser.isPresent()) { + + OnlineUser onlineUser = optionalOnlineUser.get(); + + // Check if the player has teleport enabled/disabled. + // If disabled, cancel teleport. + if (player.hasPermission("uknet.navigation.teleport.bypass") || globalSQL.hasRow( + "SELECT uuid FROM player_data WHERE uuid='" + onlineUser.getUuid() + "' AND teleport_enabled=1;")) { + + // If the player is on your server teleport. + // Else switch server and add teleport join event. + Optional optionalNetworkUser = + instance.getNetworkUserByUuid(onlineUser.getUuid()); + + NetworkLocation currentLocation = LocationAdapter.adapt(player.getLocation()); + optionalNetworkUser.ifPresentOrElse(user -> { + // Set the current location for /back + back.setPreviousCoordinate(player.getUniqueId().toString(), currentLocation); + + player.teleport(user.player.getLocation()); + player.sendMessage(ChatUtils.success("Teleported to %s", onlineUser.getName())); + }, () -> { + if (!constants.standalone()) { + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + + "player " + onlineUser.getUuid(), currentLocation); + serverAPI.switchServer(PlayerAdapter.adapt(player), onlineUser.getServer()); + } + }); + } else { + player.sendMessage(ChatUtils.error("%s has teleport disabled.", onlineUser.getName())); + } + } else { + player.sendMessage(ChatUtils.error("%s is not online.", args[0])); + } + } + + @Override + public String getLabel() { + return "teleport"; + } + + @Override + public String getDescription() { + return "Teleport to any online player."; + } + + @Override + public List getAliases() { + return List.of("tp"); + } +} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java deleted file mode 100644 index 19c1e9f4..00000000 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tp.java +++ /dev/null @@ -1,76 +0,0 @@ -package net.bteuk.network.commands.navigation; - -import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; -import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.commands.tabcompleters.PlayerSelector; -import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.lib.dto.OnlineUser; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Optional; - -public class Tp extends AbstractCommand { - - public Tp() { - setTabCompleter(new PlayerSelector()); - } - - @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { - - // Check if the sender is a player. - Player player = getPlayer(stack); - if (player == null) { - return; - } - - // Check if args exist. - if (args.length == 0) { - player.sendMessage(ChatUtils.error("You must specify a player to teleport to.")); - return; - } - - // Try and find the player by name. - Optional optionalOnlineUser = Network.getInstance().getOnlineUserByNameIgnoreCase(args[0]); - if (optionalOnlineUser.isPresent()) { - - OnlineUser onlineUser = optionalOnlineUser.get(); - - // Check if the player has teleport enabled/disabled. - // If disabled cancel teleport. - if (Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE uuid='" + onlineUser.getUuid() + "' AND " + - "teleport_enabled=1;") || player.hasPermission( - "uknet.navigation.teleport.bypass")) { - - // If the player is on your server teleport. - // Else switch server and add teleport join event. - Optional optionalNetworkUser = - Network.getInstance().getNetworkUserByUuid(onlineUser.getUuid()); - if (optionalNetworkUser.isPresent()) { - - Player playerToTeleportTo = optionalNetworkUser.get().player; - - // Set current location for /back - Back.setPreviousCoordinate(player.getUniqueId().toString(), player.getLocation()); - - player.teleport(playerToTeleportTo.getLocation()); - player.sendMessage(ChatUtils.success("Teleported to %s", onlineUser.getName())); - } else { - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + - "player " + onlineUser.getUuid(), player.getLocation()); - SwitchServer.switchServer(player, onlineUser.getServer()); - } - } else { - player.sendMessage(ChatUtils.error("%s has teleport disabled.", onlineUser.getName())); - } - } else { - player.sendMessage(ChatUtils.error("%s is not online.", args[0])); - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java index 41d53e32..5de9c750 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/TpToggle.java @@ -1,19 +1,31 @@ package net.bteuk.network.commands.navigation; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; +import java.util.List; +@Log public class TpToggle extends AbstractCommand { + private final Network instance; + + private final GlobalSQL globalSQL; + + public TpToggle(Network instance) { + this.instance = instance; + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -21,32 +33,43 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } // Invert status. - if (Network.getInstance().getGlobalSQL() - .hasRow("SELECT uuid FROM player_data WHERE uuid='" + player.getUniqueId() + "' AND teleport_enabled" + - "=1;")) { + if (globalSQL.hasRow("SELECT uuid FROM player_data WHERE uuid='" + player.getUniqueId() + "' AND teleport_enabled=1;")) { // Disable teleport. user.setTeleportEnabled(false); - Network.getInstance().getGlobalSQL() - .update("UPDATE player_data SET teleport_enabled=0 WHERE uuid='" + player.getUniqueId() + "';"); + globalSQL.update("UPDATE player_data SET teleport_enabled=0 WHERE uuid='" + player.getUniqueId() + "';"); player.sendMessage(ChatUtils.success("Other players will now no longer be able to teleport to you.")); } else { // Enable teleport. user.setTeleportEnabled(true); - Network.getInstance().getGlobalSQL() - .update("UPDATE player_data SET teleport_enabled=1 WHERE uuid='" + player.getUniqueId() + "';"); + globalSQL.update("UPDATE player_data SET teleport_enabled=1 WHERE uuid='" + player.getUniqueId() + "';"); player.sendMessage(ChatUtils.success("Other players will be now be able to teleport to you.")); } } + + @Override + public String getLabel() { + return "teleporttoggle"; + } + + @Override + public String getDescription() { + return "Enables/Disables the ability for other players to teleport to you."; + } + + @Override + public List getAliases() { + return List.of("tptoggle", "toggleteleport", "toggletp"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java index 52dad7d4..088ed0ef 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java @@ -2,11 +2,17 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.LocationSelector; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; @@ -16,16 +22,27 @@ import java.util.Arrays; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class Warp extends AbstractCommand { - public Warp() { + private final Constants constants; + private final PlotAPI plotAPI; + private final Back back; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final GlobalSQL globalSQL; + + public Warp(Network instance, Constants constants, PlotAPI plotAPI, Back back, EventAPI eventAPI, ServerAPI serverAPI) { + this.constants = constants; + this.plotAPI = plotAPI; + this.back = back; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + this.globalSQL = instance.getGlobalSQL(); setTabCompleter(new LocationSelector()); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -38,62 +55,51 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - // Get location name from all remaining args. + // Get the location name from all remaining args. String location = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); // Find a location. - if (Network.getInstance().getGlobalSQL() - .hasRow("SELECT location FROM location_data WHERE location='" + location + "';")) { + if (globalSQL.hasRow("SELECT location FROM location_data WHERE location='" + location + "';")) { // Get coordinate id. - int coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM location_data " + - "WHERE location='" + location + "';"); + int coordinate_id = globalSQL.getInt("SELECT coordinate FROM location_data WHERE location='" + location + "';"); - // Get server, if server is not current server, + // Get server, if server is not the current server, // teleport the player to the correct server with join event to teleport them to the location. - String server = - Network.getInstance().getGlobalSQL() - .getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); - if (server.equals(SERVER_NAME)) { - // Server is equal. + String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); + NetworkLocation currentLocation = LocationAdapter.adapt(player.getLocation()); + if (server.equals(constants.serverName())) { // Get location from coordinate id. - Location l = Network.getInstance().getGlobalSQL().getLocation(coordinate_id); + Location l = globalSQL.getLocation(coordinate_id); - String worldName = Network.getInstance().getGlobalSQL().getString("SELECT world FROM coordinates " + - "WHERE id=" + coordinate_id + ";"); + String worldName = globalSQL.getString("SELECT world FROM coordinates WHERE id=" + coordinate_id + ";"); // Check if world is in plotsystem. - if (Network.getInstance().getPlotSQL() - .hasRow("SELECT name FROM location_data WHERE name='" + worldName + "';")) { + if (plotAPI.hasLocation(worldName)) { // Add coordinate transformation. l = new Location( Bukkit.getWorld(worldName), - l.getX() + Network.getInstance().getPlotSQL().getInt("SELECT xTransform FROM " + - "location_data WHERE name='" + worldName + "';"), + l.getX() + plotAPI.getXTransform(worldName), l.getY(), - l.getZ() + Network.getInstance().getPlotSQL().getInt("SELECT zTransform FROM " + - "location_data WHERE name='" + worldName + "';"), + l.getZ() + plotAPI.getZTransform(worldName), l.getYaw(), l.getPitch() ); } // Set current location for /back - Back.setPreviousCoordinate(player.getUniqueId().toString(), player.getLocation()); + back.setPreviousCoordinate(player.getUniqueId().toString(), currentLocation); // Teleport to location. player.teleport(l); player.sendMessage(ChatUtils.success("Teleported to ") .append(Component.text(location, NamedTextColor.DARK_AQUA))); } else { - - // Server is different. - EventManager.createTeleportEvent(true, player.getUniqueId().toString(), "network", - "teleport location " + location, player.getLocation()); - - SwitchServer.switchServer(player, server); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", + "teleport location " + location, currentLocation); + serverAPI.switchServer(PlayerAdapter.adapt(player), server); } } else { player.sendMessage(ChatUtils.error("The location ") @@ -105,4 +111,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { private void help(Player p) { p.sendMessage(ChatUtils.error("/warp ")); } + + @Override + public String getLabel() { + return "warp"; + } + + @Override + public String getDescription() { + return "Warp to locations in the exploration menu."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java index 16125b41..f977cf8b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warps.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Utils; @@ -13,12 +14,18 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; +import java.util.List; public class Warps extends AbstractCommand { + private final SQLAPI globalSQL; + + public Warps(Network instance) { + this.globalSQL = instance.getGlobalSQL(); + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -40,10 +47,9 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Get all locations in alphabetical order. - ArrayList locations = Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM " + - "location_data ORDER BY location ASC;"); + List locations = globalSQL.getStringList("SELECT location FROM location_data ORDER BY location ASC;"); - // If there are no locations notify the user. + // If there are no locations, notify the user. if (locations.isEmpty()) { player.sendMessage(ChatUtils.error("There are currently no warps available.")); return; @@ -79,8 +85,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { Component previousPage = Component.text("⏪⏪⏪", TextColor.color(212, 113, 15)); previousPage = previousPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line( "Click to view the previous page of warps."))); - previousPage = previousPage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/warps " + (page - 1))); + previousPage = previousPage.clickEvent(ClickEvent.runCommand("/warps " + (page - 1))); // Add previousPage button at the start of the first line. message = message.append(previousPage); @@ -99,8 +104,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { Component nextPage = Component.text("⏩⏩⏩\n", TextColor.color(212, 113, 15)); nextPage = nextPage.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click to " + "view the next page of warps."))); - nextPage = nextPage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/warps " + (page + 1))); + nextPage = nextPage.clickEvent(ClickEvent.runCommand("/warps " + (page + 1))); // Add previousPage button at the start of the first line. message = message.append(Component.text(" ")); @@ -120,7 +124,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // If it isn't the last entry, as a comma at the end. - // This is calculated by it either being the 16th entry, or the last in the list. + // This is calculated by it either being the 16th entry or the last in the list. if (((locations.indexOf(location) + 1) % 16) == 0 || (locations.indexOf( location) + 1 == locations.size())) { @@ -140,8 +144,18 @@ private Component createWarp(String name) { Component warp = Component.text(name, TextColor.color(245, 221, 100)); warp = warp.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to teleport " + "to " + name))); - warp = warp.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/warp " + name)); + warp = warp.clickEvent(ClickEvent.runCommand("/warp " + name)); return warp; } + + @Override + public String getLabel() { + return "warps"; + } + + @Override + public String getDescription() { + return "List all warps on the server, 16 per page."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index 43a4dc06..18f9b6a4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -1,24 +1,41 @@ package net.bteuk.network.commands.staff; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.api.ChatAPI; import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.core.Constants; import net.bteuk.network.gui.staff.StaffGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; import static net.bteuk.network.lib.enums.ChatChannels.STAFF; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.STAFF_CHAT; +@Log public class Staff extends AbstractCommand { - public static void openStaffMenu(NetworkUser u) { + private final Network instance; + private final Constants constants; + private final GlobalSQL globalSQL; + private final ChatAPI chatAPI; + + public Staff(Network instance, Constants constants, GlobalSQL globalSQL, ChatAPI chatAPI) { + this.instance = instance; + this.constants = constants; + this.globalSQL = globalSQL; + this.chatAPI = chatAPI; + } + + public void openStaffMenu(NetworkUser u) { // Check if the gui exists. // If it does refresh and open it. @@ -36,7 +53,7 @@ public static void openStaffMenu(NetworkUser u) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player p = getPlayer(stack); @@ -44,10 +61,10 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser u = Network.getInstance().getUser(p); + NetworkUser u = instance.getUser(p); // Check if user is member of staff. - // Architects can open the menu, but not use the staff chat. + // Architects can open the menu but not use the staff chat. if (!(hasPermission(p, "uknet.staff"))) { if (hasPermission(p, "uknet.staff.menu")) { openStaffMenu(u); @@ -57,37 +74,54 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If u is null, cancel. if (u == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); + log.severe("User " + p.getName() + " can not be found!"); p.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } - // If first arg is chat, switch the player to and from staff chat if enabled. - if (args.length > 0 && STAFF_CHAT) { - if (args[0].equalsIgnoreCase("chat")) { - String channel = GLOBAL.getChannelName(); - if (u.getChatChannel().equals(STAFF.getChannelName())) { - u.player.sendMessage(ChatUtils.success("Disabled staff chat.")); + // If the first arg is chat, switch the player to and from staff chat if enabled. + if (!constants.standalone()) { + if (args.length > 0 && constants.staffChat()) { + if (args[0].equalsIgnoreCase("chat")) { + String channel = GLOBAL.getChannelName(); + if (u.getChatChannel().equals(STAFF.getChannelName())) { + u.player.sendMessage(ChatUtils.success("Disabled staff chat.")); + } else { + // Set the chat channel to staff. + channel = STAFF.getChannelName(); + u.player.sendMessage(ChatUtils.success("Enabled staff chat.")); + } + // Set channel. + u.setChatChannel(channel); + globalSQL.update("UPDATE player_data SET chat_channel='" + channel + "' " + "WHERE uuid='" + p.getUniqueId() + "';"); } else { - // Set the chat channel to staff. - channel = STAFF.getChannelName(); - u.player.sendMessage(ChatUtils.success("Enabled staff chat.")); + // Send a message in staff-chat, by temporarily setting the player's channel to staff. + u.setChatChannel(STAFF.getChannelName()); + chatAPI.sendChatMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); + u.setChatChannel(GLOBAL.getChannelName()); } - // Set channel. - u.setChatChannel(channel); - Network.getInstance().getGlobalSQL().update("UPDATE player_data SET chat_channel='" + channel + "' " + - "WHERE uuid='" + p.getUniqueId() + "';"); - } else { - // Send message in staff chat, by temporarily setting the players channel to staff. - u.setChatChannel(STAFF.getChannelName()); - Network.getInstance().getChat() - .sendSocketMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); - u.setChatChannel(GLOBAL.getChannelName()); + return; } - return; + } else { + u.player.sendMessage(ChatUtils.error("Staff chat is currently not available in standalone mode!")); } // If the player has a previous gui, open that. openStaffMenu(u); } + + @Override + public String getLabel() { + return "staff"; + } + + @Override + public String getDescription() { + return "Opens the Staff Menu."; + } + + @Override + public List getAliases() { + return List.of("st"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java index 7c970f15..57c55e30 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java @@ -1,5 +1,6 @@ package net.bteuk.network.eventing.listeners; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.commands.Navigator; import net.bteuk.network.lib.utils.ChatUtils; @@ -15,15 +16,15 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent; -import static net.bteuk.network.utils.Constants.LOGGER; - +@Log public class PlayerInteract implements Listener { private final Network instance; + private final Navigator navigator; - public PlayerInteract(Network instance) { - + public PlayerInteract(Network instance, Navigator navigator) { this.instance = instance; + this.navigator = navigator; Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @@ -34,16 +35,16 @@ public void onPlayerInteract(PlayerInteractEvent e) { // If u is null, cancel. if (u == null) { - LOGGER.severe("User " + e.getPlayer().getName() + " can not be found!"); + log.severe("User " + e.getPlayer().getName() + " can not be found!"); e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } if (e.getItem() != null) { - if (e.getItem().equals(instance.navigator)) { + if (e.getItem().equals(instance.navigatorItem)) { e.setCancelled(true); // Open navigator. - Navigator.openNavigator(u); + navigator.openNavigator(u); } } } @@ -60,13 +61,13 @@ public void onClick(InventoryClickEvent e) { // If u is null, cancel. if (u == null) { - LOGGER.severe("User " + e.getWhoClicked().getName() + " can not be found!"); + log.severe("User " + e.getWhoClicked().getName() + " can not be found!"); e.getWhoClicked().sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } // If item is navigator then open it. - if (e.getCurrentItem().equals(instance.navigator)) { + if (e.getCurrentItem().equals(instance.navigatorItem)) { e.setCancelled(true); // If item is not in slot 8, delete it. @@ -76,48 +77,39 @@ public void onClick(InventoryClickEvent e) { } u.player.closeInventory(); - Bukkit.getScheduler().runTaskLater(instance, () -> Navigator.openNavigator(u), 1); + Bukkit.getScheduler().runTaskLater(instance, () -> navigator.openNavigator(u), 1); } } /* - The following events are to prevent the navigator being moved in the inventory, causing duplicate items which are difficult to remove. - */ - @EventHandler public void swapHands(PlayerSwapHandItemsEvent e) { - - if (e.getOffHandItem() == null) { - return; - } - - if (e.getOffHandItem().equals(instance.navigator)) { + if (e.getOffHandItem().equals(instance.navigatorItem)) { e.setCancelled(true); } } @EventHandler public void dropItem(PlayerDropItemEvent e) { - - if (e.getItemDrop().getItemStack().equals(instance.navigator)) { + if (e.getItemDrop().getItemStack().equals(instance.navigatorItem)) { e.setCancelled(true); } } @EventHandler - public void moveItem(InventoryMoveItemEvent e) { - if (e.getItem().equals(instance.navigator)) { + public void dragItem(InventoryMoveItemEvent e) { + if (e.getItem().equals(instance.navigatorItem)) { e.setCancelled(true); } } @EventHandler - public void moveItem(InventoryDragEvent e) { - if (e.getOldCursor().equals(instance.navigator)) { + public void dragItem(InventoryDragEvent e) { + if (e.getOldCursor().equals(instance.navigatorItem)) { e.setCancelled(true); } @@ -125,7 +117,7 @@ public void moveItem(InventoryDragEvent e) { return; } - if (e.getCursor().equals(instance.navigator)) { + if (e.getCursor().equals(instance.navigatorItem)) { e.setCancelled(true); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 1fc3699f..38510f05 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -1,173 +1,139 @@ package net.bteuk.network.gui; -import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.Nightvision; import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.gui.navigation.ExploreGui; import net.bteuk.network.gui.tutorials.TutorialsGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.LightsOut; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.ServerType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; import org.bukkit.potion.PotionEffectType; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.Constants.TUTORIALS; - public class NavigatorGui extends Gui { - public NavigatorGui() { + public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI) { super(27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); - setItem(2, Utils.createItem(Material.DIAMOND_PICKAXE, 1, - Utils.title("Build"), - Utils.line("Click to open the build menu.")), - u -> { - - // Switch to the build menu. - u.mainGui = new BuildGui(u); + setItem(2, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Build"), Utils.line("Click to open the build menu.")), u -> { + + // Switch to the build menu. + u.mainGui = new BuildGui(u); + u.mainGui.open(u); + }); + + setItem(4, Utils.createItem(Material.SPRUCE_BOAT, 1, Utils.title("Explore"), Utils.line("Click to open the explore menu.")), u -> { + + // Click Action + if (constants.warpsEnabled()) { + u.mainGui = new ExploreGui(u); + u.mainGui.open(u); + } else { + u.player.closeInventory(); + u.player.sendMessage(ChatUtils.error("Warps are currently not enabled!")); + } + }); + + setItem(6, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title("Tutorials"), Utils.line("Click to open the tutorials menu.")), u -> { + // Switch to tutorials menu if it's online and enabled. + // If the current server is already tutorials, don't open the gui. + if (constants.serverType() == ServerType.TUTORIAL) { + u.player.closeInventory(); + u.player.sendMessage(ChatUtils.error("You are already in the tutorials server, please use the" + " menu in slot 8.")); + } else if (constants.tutorials()) { + if (globalSQL.hasRow("SELECT name FROM server_data WHERE " + "type='TUTORIAL' AND online=1;")) { + + u.mainGui = new TutorialsGui(u); u.mainGui.open(u); - }); + } else { + u.player.closeInventory(); + u.player.sendMessage(ChatUtils.error("The tutorials server is offline!")); + } + } else { + u.player.closeInventory(); + u.player.sendMessage(ChatUtils.error("Tutorials are currently not enabled!")); + } + }); - setItem(4, Utils.createItem(Material.SPRUCE_BOAT, 1, - Utils.title("Explore"), - Utils.line("Click to open the explore menu.")), - u -> { + setItem(26, Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Toggle Navigator"), Utils.line("Click to toggle the navigator in your inventory."), + Utils.line("You can always open this menu with ").append(Component.text("/navigator", NamedTextColor.GRAY))), u -> { - // Click Action - u.mainGui = new ExploreGui(u); - u.mainGui.open(u); - }); - - setItem(6, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title("Tutorials"), - Utils.line("Click to open the tutorials menu.")), - u -> { - - // Switch to tutorials menu if it's online and enabled. - // If the current server is already tutorials, don't open the gui. - if (SERVER_TYPE == ServerType.TUTORIAL) { - - u.player.closeInventory(); - u.player.sendMessage(ChatUtils.error("You are already in the tutorials server, please use the" + - " menu in slot 8.")); - } else { - if (TUTORIALS) { - if (Network.getInstance().getGlobalSQL().hasRow("SELECT name FROM server_data WHERE " + - "type='TUTORIAL' AND online=1;")) { - - u.mainGui = new TutorialsGui(u); - u.mainGui.open(u); - } else { - u.player.closeInventory(); - u.player.sendMessage(ChatUtils.error("The tutorials server is offline!")); - } - } else { - u.player.closeInventory(); - u.player.sendMessage(ChatUtils.error("Tutorials are currently not enabled!")); - } - } - }); - - setItem(26, Utils.createItem(Material.NETHER_STAR, 1, - Utils.title("Toggle Navigator"), - Utils.line("Click to toggle the navigator in your inventory."), - Utils.line("You can always open this menu with ") - .append(Component.text("/navigator", NamedTextColor.GRAY))), - u -> { - - if (u.isNavigatorEnabled()) { - - // Set navigator to false and remove the navigator from the inventory. - u.setNavigatorEnabled(false); - u.player.getInventory().setItem(8, null); - - // Disable navigator in database. - Network.getInstance().getGlobalSQL() - .update("UPDATE player_data SET navigator=0 WHERE uuid='" + u.player.getUniqueId() + - "';"); - - u.player.sendMessage(ChatUtils.success("Disabled navigator in inventory.")); - } else { - - // Set navigator to true. - u.setNavigatorEnabled(true); - - // Enable navigator in database. - Network.getInstance().getGlobalSQL() - .update("UPDATE player_data SET navigator=1 WHERE uuid='" + u.player.getUniqueId() + - "';"); - - u.player.sendMessage(ChatUtils.success("Enabled navigator in inventory.")); - } - }); - - setItem(25, Utils.createPotion(Material.SPLASH_POTION, PotionEffectType.NIGHT_VISION, 1, - Utils.title("Toggle Nightvision"), - Utils.line("Click to toggle nightvision."), - Utils.line("You can also use the command ") - .append(Component.text("/nightvision", NamedTextColor.GRAY)) - .append(Utils.line(" or ")) - .append(Component.text("/nv", NamedTextColor.GRAY))), - Nightvision::toggleNightvision); - - setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, - Utils.title("Lights Out"), - Utils.line("Play a game of Lights Out.")), - u -> { - - if (u.lightsOut == null) { - - u.lightsOut = new LightsOut(u); - u.lightsOut.open(u); - } else { - - u.lightsOut.open(u); - } - }); + if (u.isNavigatorEnabled()) { - // Set rules. - setItem(21, Utils.createItem(Material.ENCHANTED_BOOK, 1, - Utils.title("Rules"), - Utils.line("Click to view the rules.")), - u -> { + // Set navigator to false and remove the navigator from the inventory. + u.setNavigatorEnabled(false); + u.player.getInventory().setItem(8, null); - u.player.closeInventory(); - u.player.openBook(Network.getInstance().getLobby().getRules()); - }); + // Disable navigator in database. + globalSQL.update("UPDATE player_data SET navigator=0 WHERE uuid='" + u.player.getUniqueId() + "';"); - // Spawn - setItem(23, Utils.createItem(Material.RED_BED, 1, - Utils.title("Spawn"), - Utils.line("Teleport to spawn.")), - u -> + u.player.sendMessage(ChatUtils.success("Disabled navigator in inventory.")); + } else { - { + // Set navigator to true. + u.setNavigatorEnabled(true); - u.player.closeInventory(); + // Enable navigator in database. + globalSQL.update("UPDATE player_data SET navigator=1 WHERE uuid='" + u.player.getUniqueId() + "';"); - // If server is Lobby, teleport to spawn. - if (SERVER_TYPE == ServerType.LOBBY) { - - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); - u.player.teleport(Network.getInstance().getLobby().spawn); - u.player.sendMessage(ChatUtils.success("Teleported to spawn.")); - } else { - - // Set teleport event to go to spawn. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport spawn", u.player.getLocation()); - SwitchServer.switchServer(u.player, Network.getInstance().getGlobalSQL().getString("SELECT " + - "name FROM server_data WHERE type='LOBBY';")); - } - }); + u.player.sendMessage(ChatUtils.success("Enabled navigator in inventory.")); + } + }); + + setItem(25, Utils.createPotion(Material.SPLASH_POTION, PotionEffectType.NIGHT_VISION, 1, Utils.title("Toggle Nightvision"), Utils.line("Click to toggle nightvision."), + Utils.line("You can also use the command ").append(Component.text("/nightvision", NamedTextColor.GRAY)).append(Utils.line(" or ")) + .append(Component.text("/nv", NamedTextColor.GRAY))), Nightvision::toggleNightvision); + + setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), u -> { + if (u.lightsOut == null) { + + u.lightsOut = new LightsOut(u); + u.lightsOut.open(u); + } else { + + u.lightsOut.open(u); + } + }); + + // Set rules. + setItem(21, Utils.createItem(Material.ENCHANTED_BOOK, 1, Utils.title("Rules"), Utils.line("Click to view the rules.")), u -> { + u.player.closeInventory(); + u.player.openBook(lobby.getRules()); + }); + + // Spawn + if (!constants.standalone()) { + setItem(23, Utils.createItem(Material.RED_BED, 1, Utils.title("Spawn"), Utils.line("Teleport to spawn.")), u -> { + u.player.closeInventory(); + + // If server is Lobby, teleport to spawn. + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (constants.serverType() == ServerType.LOBBY) { + + back.setPreviousCoordinate(u.player.getUniqueId().toString(), location); + u.player.teleport(lobby.getSpawn()); + u.player.sendMessage(ChatUtils.success("Teleported to spawn.")); + } else { + + // Set teleport event to go to spawn. + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport spawn", location); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), globalSQL.getString("SELECT " + "name FROM server_data WHERE type='LOBBY';")); + } + }); + } } // This methods is not needed in this class, so it is empty. diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java index b5f6baf3..910f572a 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java @@ -11,6 +11,7 @@ The reason the lobby functions have been separated is to prevent unnecessary resource usage on the non-lobby server. */ +import lombok.Getter; import net.bteuk.network.Network; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.inventory.Book; @@ -37,7 +38,8 @@ public class Lobby { private final Network instance; private final ArrayList portals; - public Location spawn; + @Getter + private Location spawn; private int portalTask; private Book rulesBook; private Map map; diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java b/Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java index fadea3b4..e852cd18 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/LobbyCommand.java @@ -1,32 +1,33 @@ package net.bteuk.network.lobby; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; import net.bteuk.network.commands.AbstractCommand; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.enums.ServerType; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - public class LobbyCommand extends AbstractCommand { private static final Component INVALID_FORMAT = ChatUtils.error("/lobby reload portals"); + private final Lobby lobby; + private final Constants constants; - public LobbyCommand(Network instance) { - this.lobby = instance.getLobby(); + public LobbyCommand(Lobby lobby, Constants constants) { + this.lobby = lobby; + this.constants = constants; } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check permission if player, or if the server is the lobby. CommandSender sender = stack.getSender(); - if (!sender.hasPermission("uknet.lobby.reload") || SERVER_TYPE != ServerType.LOBBY) { + if (!sender.hasPermission("uknet.lobby.reload") || constants.serverType() != ServerType.LOBBY) { if (sender instanceof Player p) { p.performCommand("spawn"); } @@ -48,4 +49,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { sender.sendMessage(INVALID_FORMAT); } } + + @Override + public String getLabel() { + return "lobby"; + } + + @Override + public String getDescription() { + return "Command for all lobby management."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 447ae8c8..c7097b5e 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -98,6 +98,8 @@ public void updateConfig() { } public net.bteuk.network.core.Constants getConstants() { + log.info("Loading constants from config..."); + // Set the server name from config. String serverName = config.getString("server_name"); @@ -162,8 +164,17 @@ public net.bteuk.network.core.Constants getConstants() { boolean moderationEnabled = config.getBoolean("staff.moderation.enabled"); + boolean warpsEnabled = config.getBoolean("warps_enabled"); + + boolean homesEnabled = config.getBoolean("homes_enabled"); + + boolean announcePromotions = config.getBoolean("chat.announce_promotions"); + + String discordLink = config.getString("discord"); + + log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText, plotSystemEnabled, moderationEnabled); + motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink); } -} +} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 306a8aff..03d7a7ba 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -135,7 +135,7 @@ public NetworkUser(Player player, UserConnectReply reply, Network instance, Cons ItemStack slot8 = player.getInventory().getItem(8); if (slot8 != null) { - if (slot8.equals(instance.navigator)) { + if (slot8.equals(instance.navigatorItem)) { player.getInventory().setItem(8, null); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 1346e59b..186018b5 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -12,11 +12,8 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.PlotSQL; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import net.luckperms.api.model.group.Group; -import org.bukkit.Bukkit; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -32,7 +29,6 @@ import java.util.stream.Stream; import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; @Log public final class Roles { @@ -45,9 +41,7 @@ public final class Roles { private static Set ROLES; private final Network instance; - private final CustomChat customChat; - private final PlotSQL plotSQL; public Roles(Network instance, CustomChat customChat, PlotSQL plotSQL) { @@ -170,54 +164,6 @@ private void loadRoles() { ); } - /** - * Discord syncing will not be applied with this method due to deprecation. - */ - @Deprecated - public void promoteBuilder(String uuid, String pRole, String nRole) { - - // Get console sender. - ConsoleCommandSender console = instance.getServer().getConsoleSender(); - - // Add new builder role. - Bukkit.getServer().dispatchCommand(console, "lp user " + uuid + " parent add " + nRole); - - // Remove current builder role. Remove after adding to make sure the player always has a role. - Bukkit.getServer().dispatchCommand(console, "lp user " + uuid + " parent remove " + pRole); - - // Update database. - instance.getGlobalSQL().update("UPDATE player_data SET builder_role='" + nRole + "' WHERE " + - "uuid='" + uuid + "';"); - - // Announce the promotion in chat and discord. - // Send a message to the user if not online, so they'll be notified of their promotion next time they join - // the server. - Component colouredRole = Component.text(Objects.requireNonNull(CONFIG.getString("roles." + nRole + ".name")), - TextColor.fromHexString(Objects.requireNonNull(CONFIG.getString("roles." + nRole + ".colour")))); - if (CONFIG.getBoolean("chat.announce_promotions")) { - String name = instance.getGlobalSQL() - .getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';"); - - Component promotation_message = Component.text(name) - .append(PROMOTION_TEMPLATE) - .append(colouredRole); - promotation_message = promotation_message.decorate(TextDecoration.BOLD); - - ChatMessage chatMessage = new ChatMessage(GLOBAL.getChannelName(), "server", promotation_message); - customChat.sendSocketMessage(chatMessage); - } - - // Check if the player is online. - if (!instance.isOnlineOnNetwork(uuid)) { - - // Send a message that will show when they next log in. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - PROMOTION_SELF.append(colouredRole), - true); - customChat.sendDirectMessage(directMessage); - } - } - /** * Promote/demote a player for a specific role. * diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 35f52f58..2e71fee8 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -72,10 +72,6 @@ ProgressMap: #A web link to the progress map Link: insert_link_to_map_here -#Homes -homes: - enabled: true - #Chat Settings chat: #The socket configuration is only necessary if running the server as part of a network @@ -143,6 +139,12 @@ navigation_radius: 200 #Discord link discord: 'https://discord.gg/5m56EgEVW6' +#Enables warps and the explore-menu. +warps_enabled: true + +#Homes (personal warps) +homes_enabled: true + #Progression progression: enabled: false From b6bf5ba283aeef2ddc6a25b55268fcdb0258fd16 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 26 Aug 2025 22:21:40 +0200 Subject: [PATCH 09/96] distance includes y, so use custom distance --- .../main/java/net/bteuk/network/commands/Buildings.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java b/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java index 98b55db7..01dbbd12 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Buildings.java @@ -112,7 +112,7 @@ private Building getClosestBuilding(Player player) { double minDist = 100; Building minbuilding = null; for (Building i : nearbyBuildings) { - double currentDist = i.coordinate().distance(player.getLocation()); + double currentDist = getXZDistance(i.coordinate(), player.getLocation()); if (currentDist < minDist) { minDist = currentDist; minbuilding = i; @@ -124,6 +124,12 @@ private Building getClosestBuilding(Player player) { return minbuilding; } + public static double getXZDistance(Location l1, Location l2) { + double deltax = l1.getX() - l2.getX(); + double deltaz = l1.getZ() - l2.getZ(); + return Math.sqrt((deltax * deltax) + (deltaz * deltaz)); + } + private void displayCount(Player player) { int buildingCount = instance.getGlobalSQL().getInt("SELECT COUNT(*) FROM buildings;"); player.sendMessage(ChatUtils.success("%s buildings have been built!", String.valueOf(buildingCount))); From 31a88a63ddb40b78d0d39d23ba88b8e964ce7d0f Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 27 Aug 2025 20:45:16 +0200 Subject: [PATCH 10/96] Completed command migration. --- .../net/bteuk/network/core/Constants.java | 2 +- .../java/net/bteuk/network/CustomChat.java | 34 ++-- .../main/java/net/bteuk/network/Network.java | 109 ++++++----- .../commands/BuildingCompanionCommand.java | 19 +- .../net/bteuk/network/commands/Clear.java | 12 +- .../net/bteuk/network/commands/Demote.java | 17 +- .../net/bteuk/network/commands/Focus.java | 32 +++- .../net/bteuk/network/commands/Gamemode.java | 48 +++-- .../java/net/bteuk/network/commands/Hdb.java | 12 +- .../java/net/bteuk/network/commands/Help.java | 177 +++++++++++------- .../java/net/bteuk/network/commands/Me.java | 12 +- .../java/net/bteuk/network/commands/Msg.java | 44 ++--- .../bteuk/network/commands/Nightvision.java | 41 +++- .../net/bteuk/network/commands/Phead.java | 37 ++-- .../net/bteuk/network/commands/Pmute.java | 12 +- .../bteuk/network/commands/ProgressMap.java | 34 +++- .../net/bteuk/network/commands/Promote.java | 17 +- .../network/commands/PromotionAction.java | 12 +- .../net/bteuk/network/commands/Ptime.java | 12 +- .../net/bteuk/network/commands/Punmute.java | 14 +- .../net/bteuk/network/commands/Pweather.java | 12 +- .../net/bteuk/network/commands/Reply.java | 32 +++- .../net/bteuk/network/commands/Rules.java | 22 ++- .../net/bteuk/network/commands/Speed.java | 13 +- .../bteuk/network/commands/TipsToggle.java | 33 +++- .../network/commands/give/GiveBarrier.java | 12 +- .../network/commands/give/GiveDebugStick.java | 12 +- .../network/commands/give/GiveLight.java | 12 +- .../eventing/listeners/CommandPreProcess.java | 67 ++++--- .../network/eventing/listeners/Connect.java | 69 ++++--- .../services/NetworkPromotionService.java | 15 +- .../java/net/bteuk/network/sql/GlobalSQL.java | 21 +++ .../bteuk/network/utils/NetworkConfig.java | 24 ++- .../java/net/bteuk/network/utils/Roles.java | 14 +- Plugin/src/main/resources/config.yml | 5 +- 35 files changed, 724 insertions(+), 336 deletions(-) diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index 97bfc7b3..30db1c7f 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -5,4 +5,4 @@ public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, - boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink) { } + boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort) { } diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index de56250f..6be35d90 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -28,6 +28,8 @@ import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Role; +import net.bteuk.network.utils.Roles; +import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -37,9 +39,6 @@ import org.bukkit.event.Listener; import static net.bteuk.network.lib.enums.ChatChannels.STAFF; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; -import static net.bteuk.network.utils.staff.Moderation.getMutedComponent; -import static net.bteuk.network.utils.staff.Moderation.isMuted; @Log public class CustomChat implements Listener, SocketHandler, ChatAPI { @@ -48,34 +47,33 @@ public class CustomChat implements Listener, SocketHandler, ChatAPI { private static final String NOT_AFK = "%s is no longer afk"; private final Network instance; private OutputSocket outputSocket; - private final Constants constants; - private final Afk afk; - private final GlobalSQL globalSQL; - private final Connect connect; + private final Moderation moderation; + private final TabManager tabManager; + private final Roles roles; - public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Connect connect) { + public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Connect connect, Moderation moderation, TabManager tabManager, Roles roles) { this.instance = instance; this.constants = constants; this.afk = afk; this.globalSQL = globalSQL; this.connect = connect; + this.moderation = moderation; + this.tabManager = tabManager; + this.roles = roles; instance.getServer().getPluginManager().registerEvents(this, instance); // Set up the output socket. if (!constants.standalone()) { - outputSocket = new OutputSocket( - CONFIG.getString("chat.socket.output.IP"), - CONFIG.getInt("chat.socket.output.port") - ); + outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); // Register input socket for receiving messages from the proxy. - int inputSocketPort = CONFIG.getInt("chat.socket.input.port"); + int inputSocketPort = constants.chatSocketInputPort(); if (inputSocketPort == 0) { log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); } else { @@ -151,12 +149,12 @@ public void onDisable() { public void onPlayerChatEvent(AsyncChatEvent e) { // If player is muted cancel. - if (isMuted(e.getPlayer().getUniqueId().toString())) { + if (moderation.isMuted(e.getPlayer().getUniqueId().toString())) { e.setCancelled(true); try { // Send message and end event. - e.getPlayer().sendMessage(getMutedComponent(e.getPlayer().getUniqueId().toString())); + e.getPlayer().sendMessage(moderation.getMutedComponent(e.getPlayer().getUniqueId().toString())); return; } catch (NotMutedException ex) { @@ -167,7 +165,7 @@ public void onPlayerChatEvent(AsyncChatEvent e) { if (!e.isCancelled()) { e.setCancelled(true); - // Get user, if staff chat enabled send message to staff chat. + // Get user, if staff chat is enabled, send the message to staff chat. NetworkUser user = instance.getUser(e.getPlayer()); // If u is null, cancel. @@ -200,7 +198,7 @@ public AbstractTransferObject handle(AbstractTransferObject abstractTransferObje switch (abstractTransferObject) { case DirectMessage directMessage -> handleDirectMessage(directMessage); case DiscordLinking discordLinking -> handleDiscordLinking(discordLinking); - case AddTeamEvent addTeamEvent -> instance.getTab().handle(addTeamEvent); // TODO: TAB + case AddTeamEvent addTeamEvent -> tabManager.handle(addTeamEvent); case UserConnectReply userConnectReply -> connect.handleUserConnectReply(userConnectReply); case UserRemove userRemove -> connect.handleUserRemove(userRemove); case UserUpdate userUpdate -> handleUserUpdate(userUpdate); @@ -238,7 +236,6 @@ private void handleDirectMessage(DirectMessage message) { }); } - // TODO: Remove from this class, as it has a cyclical with Roles. private void handleDiscordLinking(DiscordLinking discordLinking) { if (discordLinking.isUnlink() && discordLinking.getDiscordId() != -1) { @@ -285,7 +282,6 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { }); } - // TODO: Remove from this class, as it has a cyclical with Roles. private void handleUserUpdate(UserUpdate userUpdate) { // If the user is online check if anything needs updating. instance.getUsers().stream().filter(user -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index c33c78c4..fa608889 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -129,13 +129,13 @@ public final class Network extends JavaPlugin implements NetworkAPI { // Movement listeners. public NetworkMoveListener moveListener; public NetworkTeleportListener teleportListener; - // Return an instance of the regionManager. + // Return an this of the regionManager. // RegionManager @Getter private RegionManager regionManager; // List of users connected to the network. @Getter - private HashSet onlineUsers; // TODO: Populate this list on a standalone server using the join/leave events. + private HashSet onlineUsers; // Server User List private ArrayList networkUsers; // SQL @@ -198,8 +198,7 @@ public void onEnable() { if (!networkConfig.getConfig().getBoolean("enabled")) { getLogger().warning("The config must be configured before the plugin can be enabled!"); - getLogger().warning("Please edit the database values in the config, give the server a unique name and " + - "then set 'enabled: true'"); + getLogger().warning("Please edit the database values in the config, give the server a unique name and " + "then set 'enabled: true'"); getLogger().warning("Also make sure to set the server to the correct type."); return; } @@ -233,8 +232,7 @@ public void onEnable() { plotSQL = new PlotSQL(plot_dataSource); } } catch (SQLException | RuntimeException e) { - getLogger().severe("Failed to connect to the database, please check that you have set the config values " + - "correctly."); + getLogger().severe("Failed to connect to the database, please check that you have set the config values " + "correctly."); getLogger().severe("Disabling Network"); return; } @@ -256,8 +254,7 @@ public void onEnable() { // Attempt to connect to the DB if (!tutorialsDBConnection.connect()) { - getLogger().severe("Failed to connect to the Tutorials database, please check that you have set the " + - "config values correctly."); + getLogger().severe("Failed to connect to the Tutorials database, please check that you have set the " + "config values correctly."); getLogger().severe("Disabling Network"); return; } @@ -266,9 +263,7 @@ public void onEnable() { if (!globalSQL.hasRow("SELECT name FROM server_data WHERE name='" + constants.serverName() + "';")) { // Add server to database and enable server. - if (globalSQL.update( - "INSERT INTO server_data(name,type) VALUES('" + constants.serverName() + "','" + constants.serverType() + "');" - )) { + if (globalSQL.update("INSERT INTO server_data(name,type) VALUES('" + constants.serverName() + "','" + constants.serverType() + "');")) { // Enable plugin. getLogger().info("Server added to database with name " + constants.serverName() + " and type " + constants.serverType()); @@ -300,7 +295,7 @@ public void enablePlugin() { EventManager eventManager = new EventManager(globalSQL); WorldGuardAPI worldGuardAPI = new WorldGuard(); - Roles roles = new Roles(this, chat, plotSQL); + Roles roles = new Roles(this, plotSQL); if (!constants.standalone()) { serverAPI = new SwitchServer(constants); @@ -320,16 +315,16 @@ public void enablePlugin() { // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roles); + Connect connect = new Connect(this, constants, tab, roles, globalSQL); + + Moderation moderation = new Moderation(this, eventManager); // Enables chat, both global chat and normal chat are handled through it. - chat = new CustomChat(this, constants, afk, globalSQL, connect); + chat = new CustomChat(this, constants, afk, globalSQL, connect, moderation, tab, roles); // Create the navigator. navigatorItem = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the navigator.")); - Moderation moderation = new Moderation(this, eventManager); - // Register events. new PreJoinServer(this, constants, moderation); @@ -428,43 +423,52 @@ public void enablePlugin() { commandManager.registerCommand(new Buildings(this, constants)); if (!constants.standalone()) { commandManager.registerCommand(new Discord(this, chat, roles, constants)); - commands.register("focus", "Toggle focus mode, hides chat and players.", List.of("focusmode", "fm"), new Focus()); + commandManager.registerCommand(new Focus(this, constants)); + } + + commandManager.registerCommand(new Nightvision(this)); + commandManager.registerCommand(new Speed()); + commandManager.registerCommand(new Help(constants, roles)); + commandManager.registerCommand(new Rules(lobby)); + commandManager.registerCommand(new Clear()); + commandManager.registerCommand(new GiveDebugStick(this)); + commandManager.registerCommand(new GiveLight(this)); + commandManager.registerCommand(new GiveBarrier(this)); + commandManager.registerCommand(new Gamemode(constants)); + commandManager.registerCommand(new Phead(globalSQL)); + if (constants.skullsEnabled()) { + commandManager.registerCommand(new Hdb()); } - commands.register("nightvision", "Toggle nightvision.", List.of("nv"), new Nightvision()); - commands.register("speed", "Sets the players speed, value up to 10.", new Speed()); - commands.register("help", "Help menu for information on commands and server features.", new Help()); - commands.register("rules", "Get rules book.", new Rules()); - commands.register("clear", "Clears your inventory.", new Clear()); - commands.register("debugstick", "Get the debug stick.", new GiveDebugStick(instance)); - commands.register("light", "Get a light block.", new GiveLight(instance)); - commands.register("barrier", "Get a barrier block.", new GiveBarrier(instance)); - commands.register("gamemode", "Switch gamemode.", List.of("gm"), new Gamemode()); - commands.register("phead", "Get the player head of someone who has connected to the server.", new Phead()); - commands.register("hdb", "Added so it can be routed to /skulls", new Hdb()); if (constants.progressMap()) { - commands.register("progressmap", "Sends a link of the progress map", List.of("progress"), new ProgressMap()); + commandManager.registerCommand(new ProgressMap(constants)); } if (constants.tips()) { - commands.register("tips", "Toggles tips in chat.", List.of("toggletips", "tipstoggle"), new TipsToggle()); + commandManager.registerCommand(new TipsToggle(this)); } - commands.register("ptime", "Sets the time of day for the player", new Ptime()); - commands.register("pweather", "Sets the weather for the player", new Pweather()); + commandManager.registerCommand(new Ptime()); + commandManager.registerCommand(new Pweather()); // commands.register("season", "Command for creating, starting and ending seasons.", List.of("seasons"), new Season()); // commands.register("exp", "Test command for adding exp.", new Exp()); - commands.register("buildingcompanion", "Toggle the building companion.", List.of("bc", "companion"), new BuildingCompanionCommand(instance, constants, regionManager)); - commands.register("pmute", "Mute a player", new Pmute(instance)); - commands.register("punmute", "Unmute a player", new Punmute(instance)); - Msg msgCommand = new Msg(instance); - commands.register("msg", "Sends a direct message to a player.", msgCommand); - commands.register("w", "Sends a direct message to a player.", msgCommand); - commands.register("tell", "Sends a direct message to a player.", msgCommand); - commands.register("r", "sends a direct message to the last player you messaged", List.of("reply"), new Reply(msgCommand)); - commands.register("promote", "Add a role to a player.", new Promote(instance)); - commands.register("demote", "Remove a role from a player.", new Demote(instance)); - commands.register("me", "Disabled", new Me()); - - // Register commandpreprocess to make sure /network:region runs and not that of another plugin. - new CommandPreProcess(this); + commandManager.registerCommand(new BuildingCompanionCommand(this, constants, regionManager)); + + if (!constants.standalone()) { + commandManager.registerCommand(new Pmute(this)); + commandManager.registerCommand(new Punmute(this)); + + commandManager.registerCommand(Msg.of(this, "msg")); + commandManager.registerCommand(Msg.of(this, "w")); + commandManager.registerCommand(Msg.of(this, "tell")); + + commandManager.registerCommand(new Reply(chat)); + } + + commandManager.registerCommand(new Promote(this, roles)); + commandManager.registerCommand(new Demote(this, roles)); + + commandManager.registerCommand(new Me()); + + // Register command pre-process to make sure network versions of commands run and not that of another plugin. + new CommandPreProcess(this, constants, afk, connect, serverAPI); commandManager.enableCommands(); @@ -483,9 +487,8 @@ public void enablePlugin() { if (constants.tutorials()) { try { Class.forName("net.bteuk.teachingtutorials.services.PromotionService"); - PromotionService promotionService = new NetworkPromotionService(); - this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, - ServicePriority.High); + PromotionService promotionService = new NetworkPromotionService(roles, chat); + this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, ServicePriority.High); log.info("Registered Network Promotion Service"); } catch (ClassNotFoundException e) { // Only load the PromotionService if the class exists. @@ -524,8 +527,7 @@ public void onDisable() { plotSQL.update("DELETE FROM zone_invites WHERE uuid='" + uuid + "';"); // Set last_online time in playerdata. - globalSQL.update("UPDATE player_data SET last_online=" + Time.currentTime() + " WHERE " + - "UUID='" + uuid + "';"); + globalSQL.update("UPDATE player_data SET last_online=" + Time.currentTime() + " WHERE " + "UUID='" + uuid + "';"); // Reset last logged time. if (u.isAfk()) { @@ -575,10 +577,7 @@ public void handleOnlineUserAdd(OnlineUserAdd onlineUserAdd) { } public void handleOnlineUserRemove(OnlineUserRemove onlineUserRemove) { - Optional optionalOnlineUser = - onlineUsers.stream().filter(onlineUser -> onlineUser.getUuid().equals(onlineUserRemove.getUuid())) - .findFirst(); - optionalOnlineUser.ifPresent(onlineUser -> onlineUsers.remove(onlineUser)); + onlineUsers.stream().filter(onlineUser -> onlineUser.getUuid().equals(onlineUserRemove.getUuid())).findFirst().ifPresent(onlineUser -> onlineUsers.remove(onlineUser)); } public boolean isOnlineOnNetwork(String uuid) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java index 7713a35f..e1c61231 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/BuildingCompanionCommand.java @@ -14,6 +14,8 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.List; + @Log public class BuildingCompanionCommand extends AbstractCommand { @@ -46,7 +48,7 @@ public void toggleCompanion(NetworkUser user) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -118,4 +120,19 @@ private void removeOutlines(NetworkUser user, String[] args) { private void createWalls(NetworkUser user, String[] args) { } + + @Override + public String getLabel() { + return "buildingcompanion"; + } + + @Override + public String getDescription() { + return "Toggle the building companion."; + } + + @Override + public List getAliases() { + return List.of("bc", "companion"); + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Clear.java b/Plugin/src/main/java/net/bteuk/network/commands/Clear.java index 0a1728ff..95841da7 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Clear.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Clear.java @@ -8,7 +8,7 @@ public class Clear extends AbstractCommand { @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -25,4 +25,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { player.getInventory().clear(); player.sendMessage(ChatUtils.success("Cleared your inventory.")); } + + @Override + public String getLabel() { + return "clear"; + } + + @Override + public String getDescription() { + return "Clears your inventory."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Demote.java b/Plugin/src/main/java/net/bteuk/network/commands/Demote.java index c1818897..ec2ee4e4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Demote.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Demote.java @@ -3,6 +3,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -13,15 +14,25 @@ public class Demote extends PromotionAction { private static final Component ERROR = ChatUtils.error("/demote [player] [role]"); - public Demote(Network instance) { - super(instance, ERROR); + public Demote(Network instance, Roles roles) { + super(instance, roles, ERROR); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { CommandSender sender = stack.getSender(); if (hasPermission(sender, "uknet.staff.demote")) { onCommand(sender, args, true); } } + + @Override + public String getLabel() { + return "demote"; + } + + @Override + public String getDescription() { + return "Remove a role from a player."; + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Focus.java b/Plugin/src/main/java/net/bteuk/network/commands/Focus.java index cd775783..d7716364 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Focus.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Focus.java @@ -1,21 +1,30 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; +import java.util.List; /** * Command to enable/disable focus mode. */ +@Log public class Focus extends AbstractCommand { + private final Network instance; + + public Focus(Network instance, Constants constants) { + this.instance = instance; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -23,15 +32,30 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } user.toggleFocus(); } + + @Override + public String getLabel() { + return "focus"; + } + + @Override + public String getDescription() { + return "Toggle focus mode, hides chat and players."; + } + + @Override + public List getAliases() { + return List.of("focusmode", "fm"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java b/Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java index 7912fba7..42dafb75 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Gamemode.java @@ -2,9 +2,10 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.ServerType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -17,24 +18,24 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Locale; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - public class Gamemode extends AbstractCommand { // Gamemodes. - private final ArrayList gamemodes = new ArrayList<>(Arrays.asList("creative", "spectator", "adventure", - "survival")); + private final ArrayList gamemodes = new ArrayList<>(Arrays.asList("creative", "spectator", "adventure", "survival")); + + private final Constants constants; // Constructor to enable the command. - public Gamemode() { - // Set tab completer. + public Gamemode(Constants constants) { + this.constants = constants; setTabCompleter(new FixedArgSelector(gamemodes, 0)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -43,7 +44,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Check allowed server type. - if (SERVER_TYPE != ServerType.PLOT && SERVER_TYPE != ServerType.EARTH) { + if (constants.serverType() != ServerType.PLOT && constants.serverType() != ServerType.EARTH) { player.sendMessage(ChatUtils.error("You do not have permission to use this command here.")); return; } @@ -66,14 +67,12 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // If the player is in the gamemode, highlight it. if (player.getGameMode() == GameMode.valueOf(gamemodes.get(i).toUpperCase(Locale.ROOT))) { gamemode = Component.text(StringUtils.capitalize(gamemodes.get(i)), TextColor.color(245, 173, 100)); - gamemode = gamemode.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("You" + - " are already in this gamemode."))); + gamemode = gamemode.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("You" + " are already in this gamemode."))); } else { gamemode = Component.text(StringUtils.capitalize(gamemodes.get(i)), TextColor.color(245, 221, 100)); - gamemode = gamemode.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/gamemode " + gamemodes.get(i))); - gamemode = gamemode.hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line( - "Click to switch to " + StringUtils.capitalize(gamemodes.get(i))))); + gamemode = gamemode.clickEvent(ClickEvent.runCommand("/gamemode " + gamemodes.get(i))); + gamemode = gamemode.hoverEvent( + HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Utils.line("Click to switch to " + StringUtils.capitalize(gamemodes.get(i))))); } message = message.append(gamemode); @@ -99,9 +98,22 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { // Set the player to this gamemode. player.setGameMode(GameMode.valueOf(args[0].toUpperCase(Locale.ROOT))); - player.sendMessage(ChatUtils.success("Set gamemode to ") - .append(Component.text(StringUtils.capitalize(args[0].toLowerCase(Locale.ROOT)), - NamedTextColor.DARK_AQUA))); + player.sendMessage(ChatUtils.success("Set gamemode to ").append(Component.text(StringUtils.capitalize(args[0].toLowerCase(Locale.ROOT)), NamedTextColor.DARK_AQUA))); } } + + @Override + public String getLabel() { + return "gamemode"; + } + + @Override + public String getDescription() { + return "Switch gamemode."; + } + + @Override + public List getAliases() { + return List.of("gm"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Hdb.java b/Plugin/src/main/java/net/bteuk/network/commands/Hdb.java index e93687a6..3e085c5f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Hdb.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Hdb.java @@ -6,6 +6,16 @@ public class Hdb extends AbstractCommand { @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { + } + + @Override + public String getLabel() { + return "hdb"; + } + + @Override + public String getDescription() { + return "Added so it can be routed to /skulls"; } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Help.java b/Plugin/src/main/java/net/bteuk/network/commands/Help.java index fac025e0..6c1fb213 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Help.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Help.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; @@ -19,13 +20,18 @@ public class Help extends AbstractCommand { private static final Component ROLE_ERROR = ChatUtils.error("An error occurred while loading a role, please " + "contact an administrator."); - public Help() { + private final Constants constants; + private final Roles roles; + + public Help(Constants constants, Roles roles) { + this.constants = constants; + this.roles = roles; setTabCompleter(new FixedArgSelector(Arrays.asList("building", "explore", "plots", "regions", "utils", "worldedit"), 0)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -39,7 +45,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - // Check for first arg to determine message. + // Check for the first argument to determine the message. switch (args[0]) { // Building @@ -72,46 +78,50 @@ private void help(Player p) { // Navigator p.sendMessage(Component.text("/navigator", NamedTextColor.GRAY).append(Utils.line(" - Click to open the " + "navigator, access most server features from here.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/navigator"))); + .clickEvent(ClickEvent.runCommand("/navigator"))); // Exporing p.sendMessage(Component.text("/help explore", NamedTextColor.GRAY).append(Utils.line(" - Click to list " + "commands used for exploring the server.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help explore"))); + .clickEvent(ClickEvent.runCommand("/help explore"))); // Building p.sendMessage(Component.text("/help building", NamedTextColor.GRAY).append(Utils.line(" - Click for " + "information on how to rank-up and build.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help building"))); + .clickEvent(ClickEvent.runCommand("/help building"))); // Plots // Information about plots. - p.sendMessage(Component.text("/help plots", NamedTextColor.GRAY).append(Utils.line(" - Click for details on " + - "plots and how to use them.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help plots"))); + if (constants.plotSystemEnabled()) { + p.sendMessage(Component.text("/help plots", NamedTextColor.GRAY).append(Utils.line(" - Click for details on " + + "plots and how to use them.")) + .clickEvent(ClickEvent.runCommand("/help plots"))); + } // Regions // Information about regions. - p.sendMessage(Component.text("/help regions", NamedTextColor.GRAY).append(Utils.line(" - Click for " + - "information about regions and why we have them.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help regions"))); + if (constants.regionsEnabled()) { + p.sendMessage(Component.text("/help regions", NamedTextColor.GRAY).append(Utils.line(" - Click for " + + "information about regions and why we have them.")) + .clickEvent(ClickEvent.runCommand("/help regions"))); + } // Utilities p.sendMessage(Component.text("/help utils", NamedTextColor.GRAY).append(Utils.line(" - Click for other " + "commands that can be useful in general.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help utils"))); + .clickEvent(ClickEvent.runCommand("/help utils"))); // Worldedit p.sendMessage(Component.text("/help worldedit", NamedTextColor.GRAY).append(Utils.line(" - Click to list " + "available WorldEdit commands.")) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/help worldedit"))); + .clickEvent(ClickEvent.runCommand("/help worldedit"))); } private void building(Player p) { // Building is partially role-specific. // Get the current builder-role of the player. - Role builderRole = Roles.builderRole(p); + Role builderRole = roles.builderRole(p); if (builderRole == null) { p.sendMessage(ChatUtils.error("You have an invalid role, please contact an administrator.")); return; @@ -124,7 +134,7 @@ private void building(Player p) { Component roleSpecificMessage = switch (builderRole.getId()) { case "reviewer" -> { - Role architect = Roles.getRoleById("architect"); + Role architect = roles.getRoleById("architect"); if (architect == null) { yield null; } @@ -136,7 +146,7 @@ private void building(Player p) { } case "architect" -> { - Role builder = Roles.getRoleById("builder"); + Role builder = roles.getRoleById("builder"); if (builder == null) { yield null; } @@ -154,7 +164,7 @@ private void building(Player p) { "To be promoted to &7Architect &fyou need x building points in the last 30 days."*/)); case "jrbuilder" -> { - Role builder = Roles.getRoleById("builder"); + Role builder = roles.getRoleById("builder"); if (builder == null) { yield null; } @@ -166,7 +176,7 @@ private void building(Player p) { } case "apprentice" -> { - Role jrbuilder = Roles.getRoleById("jrbuilder"); + Role jrbuilder = roles.getRoleById("jrbuilder"); if (jrbuilder == null) { yield null; } @@ -178,7 +188,7 @@ private void building(Player p) { } case "applicant" -> { - Role apprentice = Roles.getRoleById("apprentice"); + Role apprentice = roles.getRoleById("apprentice"); if (apprentice == null) { yield null; } @@ -204,22 +214,28 @@ private void building(Player p) { p.sendMessage(roleSpecificMessage); // Tpll and ll. - p.sendMessage(Component.text("/tpll [altitude]", NamedTextColor.GRAY) - .append(Utils.line(" - Teleport to the coordinates provided, altitude is optional."))); - p.sendMessage(Component.text("/ll", NamedTextColor.GRAY) - .append(Utils.line(" - Get the real life coordinates of your current location, with a link to Google " + - "Maps."))); - - p.sendMessage(Component.text("/skulls", NamedTextColor.GRAY) - .append(Utils.line(" - Opens the head menu. To search for a specific head use ")) - .append(Component.text("/skulls search"))); + if (constants.tpllEnabled()) { + p.sendMessage(Component.text("/tpll [altitude]", NamedTextColor.GRAY) + .append(Utils.line(" - Teleport to the coordinates provided, altitude is optional."))); + } + if (constants.ll()) { + p.sendMessage(Component.text("/ll", NamedTextColor.GRAY) + .append(Utils.line(" - Get the real life coordinates of your current location, with a link to Google " + + "Maps."))); + } + + if (constants.skullsEnabled()) { + p.sendMessage(Component.text("/skulls", NamedTextColor.GRAY) + .append(Utils.line(" - Opens the head menu. To search for a specific head use ")) + .append(Component.text("/skulls search"))); + } p.sendMessage(Component.text("/bannermaker", NamedTextColor.GRAY) .append(Utils.line(" - Opens the bannermaker menu, allows you to create and save banners easily."))); } private void explore(Player p) { - Role builderRole = Roles.builderRole(p); + Role builderRole = roles.builderRole(p); if (builderRole == null) { p.sendMessage(ChatUtils.error("You have an invalid role, please contact an administrator.")); return; @@ -228,57 +244,71 @@ private void explore(Player p) { p.sendMessage(Utils.title("Exploring the server:")); // Exploring using the gui or map. - p.sendMessage(Utils.line("Using the navigator ") - .append(Component.text("/navigator", NamedTextColor.GRAY)) - .append(Utils.line(" you can access many locations that are being or have been built on the server."))); - p.sendMessage(Utils.line("Alternatively you can use the ") - .append(Component.text("/map", NamedTextColor.GRAY)) - .append(Utils.line(" located in the ")) - .append(Component.text("/lobby", NamedTextColor.GRAY))); + if (constants.warpsEnabled()) { + p.sendMessage(Utils.line("Using the navigator ") + .append(Component.text("/navigator", NamedTextColor.GRAY)) + .append(Utils.line(" you can access many locations that are being or have been built on the server."))); + } + if (!constants.standalone()) { + p.sendMessage(Utils.line("Alternatively you can use the ") + .append(Component.text("/map", NamedTextColor.GRAY)) + .append(Utils.line(" located in the ")) + .append(Component.text("/lobby", NamedTextColor.GRAY))); + } // Tpll can be used otherwise but for roles without region access they can't load new terrain. // For Jr.Builder also explain how to request new locations. switch (builderRole.getId()) { - case "apprentice", "applicant", "default" -> p.sendMessage(Utils.line("\nTo access other areas you can try using ") - .append(Component.text("/tpll ", NamedTextColor.GRAY)) - .append(Utils.line(", however you will only be able to teleport to locations that have " + - "already been generated on the server."))); + case "apprentice", "applicant", "default" -> { + if (constants.tpllEnabled()) { + p.sendMessage(Utils.line("\nTo access other areas you can try using ") + .append(Component.text("/tpll ", NamedTextColor.GRAY)) + .append(Utils.line(", however you will only be able to teleport to locations that have " + + "already been generated on the server."))); + } + } default -> { - p.sendMessage(Utils.line("\nYou can request new locations to be added to the navigator, " + - "this can be done by standing at the location you want to add and then clicking on 'Add " + - "Location' in the exporation menu. " + - "Please only request locations with a decent bit of progress.")); - - p.sendMessage(Utils.line("\nTo access other areas you can try using ") - .append(Component.text("/tpll ", NamedTextColor.GRAY)) - .append(Utils.line(", however please don't generate new terrain for no good reason."))); + if (constants.warpsEnabled()) { + p.sendMessage(Utils.line("\nYou can request new locations to be added to the navigator, " + + "this can be done by standing at the location you want to add and then clicking on 'Add " + + "Location' in the exporation menu. " + + "Please only request locations with a decent bit of progress.")); + } + + if (constants.tpllEnabled()) { + p.sendMessage(Utils.line("\nTo access other areas you can try using ") + .append(Component.text("/tpll ", NamedTextColor.GRAY)) + .append(Utils.line(", however please don't generate new terrain for no good reason."))); + } } } // Home command for saving personal locations. - switch (builderRole.getId()) { - case "apprentice", "applicant", "default" -> p.sendMessage(Utils.line("\nYou can set a ") - .append(Component.text("/home", NamedTextColor.GRAY)) - .append(Utils.line(" using ")) - .append(Component.text("/sethome", NamedTextColor.GRAY))); - - default -> p.sendMessage(Utils.line("\nYou can set ") - .append(Component.text("/homes", NamedTextColor.GRAY)) - .append(Utils.line(" using ")) - .append(Component.text("/sethome ", NamedTextColor.GRAY))); + if (constants.homesEnabled()) { + switch (builderRole.getId()) { + case "apprentice", "applicant", "default" -> p.sendMessage(Utils.line("\nYou can set a ") + .append(Component.text("/home", NamedTextColor.GRAY)) + .append(Utils.line(" using ")) + .append(Component.text("/sethome", NamedTextColor.GRAY))); + + default -> p.sendMessage(Utils.line("\nYou can set ") + .append(Component.text("/homes", NamedTextColor.GRAY)) + .append(Utils.line(" using ")) + .append(Component.text("/sethome ", NamedTextColor.GRAY))); + } } } private void plots(Player p) { // Get the roles needed for the text. - Role applicant = Roles.getRoleById("applicant"); - Role apprentice = Roles.getRoleById("apprentice"); - Role jrbuilder = Roles.getRoleById("jrbuilder"); - Role builder = Roles.getRoleById("builder"); + Role applicant = roles.getRoleById("applicant"); + Role apprentice = roles.getRoleById("apprentice"); + Role jrbuilder = roles.getRoleById("jrbuilder"); + Role builder = roles.getRoleById("builder"); if (applicant == null || apprentice == null || jrbuilder == null || builder == null) { p.sendMessage(ROLE_ERROR); @@ -332,7 +362,7 @@ private void regions(Player p) { "We keep track of every player who joins a region, this allows us to trace back any wrongdoers with " + "relative ease.")); - Role jrbuilder = Roles.getRoleById("jrbuilder"); + Role jrbuilder = roles.getRoleById("jrbuilder"); p.sendMessage(Utils.line("\nTo join a region you must be a ") .append(jrbuilder.getColouredRoleName()) .append(Utils.line(" or above, this is both to prevent griefers and to ensure building standards."))); @@ -360,8 +390,10 @@ private void utils(Player p) { p.sendMessage(Component.text("/nv", NamedTextColor.GRAY) .append(Utils.line(" - Toggle night vision, also removes glitched shadows."))); - p.sendMessage(Component.text("\n/discord", NamedTextColor.GRAY) - .append(Utils.line(" - Sends you a link to our Discord server."))); + if (!constants.standalone()) { + p.sendMessage(Component.text("\n/discord", NamedTextColor.GRAY) + .append(Utils.line(" - Sends you a link to our Discord server."))); + } } private void worldedit(Player p) { @@ -389,8 +421,17 @@ private void worldedit(Player p) { Component worldEditMessage = Utils.line("For more information you can reference: ") .append(Component.text("https://worldedit.enginehub.org/en/latest/usage/", NamedTextColor.GRAY)); - worldEditMessage = worldEditMessage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https" + - "://worldedit.enginehub.org/en/latest/usage/")); + worldEditMessage = worldEditMessage.clickEvent(ClickEvent.openUrl("https://worldedit.enginehub.org/en/latest/usage/")); p.sendMessage(worldEditMessage); } + + @Override + public String getLabel() { + return "help"; + } + + @Override + public String getDescription() { + return "Help menu for information on commands and server features."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Me.java b/Plugin/src/main/java/net/bteuk/network/commands/Me.java index 7a0838ac..ee5b0b73 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Me.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Me.java @@ -6,7 +6,17 @@ public class Me extends AbstractCommand { @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { stack.getSender().sendMessage(NO_PERMISSION); } + + @Override + public String getLabel() { + return "me"; + } + + @Override + public String getDescription() { + return "Disabled"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java index b391642c..d67d35b4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java @@ -20,14 +20,16 @@ public class Msg extends AbstractCommand { private static final Component ERROR = ChatUtils.error("/msg [player] "); private final Network instance; + private final String commandName; - public Msg(Network instance) { + public Msg(Network instance, String commandName) { this.instance = instance; + this.commandName = commandName; setTabCompleter(new PlayerSelector()); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -41,31 +43,23 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - /* - // Search for the uuid of the player. - // Also retrieve the name, as it is possible the cases aren't correct. - String uuid = instance.getGlobalSQL().getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = instance.getGlobalSQL().getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); - if (uuid == null) { - player.sendMessage(ERROR); - return; - } - - if (isMuted(player.getUniqueId().toString())) { - try { - // Send message and cancel command. - player.sendMessage(getMutedComponent(player.getUniqueId().toString())); - return; - } catch (NotMutedException ex) { - // Ignored - } - } - - */ - // Send direct message, the message is created using all other command arguments. + // Send a direct message, the message is created using all other command arguments. String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - //DirectMessage directMessage = getDirectMessage(message, player.getName(), player.getUniqueId().toString(),name, uuid, ChatChannels.GLOBAL); PrivateMessage privateMessage = new PrivateMessage(ChatChannels.GLOBAL.getChannelName(), player.getName(), args[0],message, false); instance.getChat().sendSocketMessage(privateMessage); } + + public static Msg of(Network instance, String label) { + return new Msg(instance, label); + } + + @Override + public String getLabel() { + return commandName; + } + + @Override + public String getDescription() { + return "Sends a direct message to a player."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java b/Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java index ae4c0d91..abc53359 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nightvision.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -10,11 +11,18 @@ import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; +import java.util.List; +@Log public class Nightvision extends AbstractCommand { - public static void toggleNightvision(NetworkUser user) { + private final Network instance; + + public Nightvision(Network instance) { + this.instance = instance; + } + + public void toggleNightvision(NetworkUser user) { if (user.isNightvisionEnabled()) { removeNightvision(user.player); user.setNightvisionEnabled(false); @@ -26,22 +34,22 @@ public static void toggleNightvision(NetworkUser user) { } } - public static void giveNightvision(Player player) { + public void giveNightvision(Player player) { // Remove any existing night vision first. - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + Bukkit.getScheduler().runTask(instance, () -> { player.removePotionEffect(PotionEffectType.NIGHT_VISION); player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 1, false, false)); }); } - public static void removeNightvision(Player player) { - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + public void removeNightvision(Player player) { + Bukkit.getScheduler().runTask(instance, () -> { player.removePotionEffect(PotionEffectType.NIGHT_VISION); }); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -49,15 +57,30 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - NetworkUser user = Network.getInstance().getUser(player); + NetworkUser user = instance.getUser(player); // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + player.getName() + " can not be found!"); + log.severe("User " + player.getName() + " can not be found!"); player.sendMessage(ChatUtils.error("User can not be found, please relog!")); return; } toggleNightvision(user); } + + @Override + public String getLabel() { + return "nightvision"; + } + + @Override + public String getDescription() { + return "Toggle nightvision."; + } + + @Override + public List getAliases() { + return List.of("nv"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Phead.java b/Plugin/src/main/java/net/bteuk/network/commands/Phead.java index 178d7985..3f2f0739 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Phead.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Phead.java @@ -1,7 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Utils; @@ -13,14 +13,16 @@ public class Phead extends AbstractCommand { + private SQLAPI globalSQL; + // Constructor to enable the command. - public Phead() { - // Set tab completer. + public Phead(SQLAPI globalSQL) { + this.globalSQL = globalSQL; setTabCompleter(new PlayerSelector(false)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -40,23 +42,28 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Check if player exists in the database. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { + if (globalSQL.hasRow("SELECT uuid FROM player_data WHERE name='" + args[0] + "';")) { // Get uuid. - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); - String name = - Network.getInstance().getGlobalSQL() - .getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); + String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); + String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); // Give item to player. - Utils.giveItem(player, Utils.createPlayerSkull(uuid, 1, Component.text(name + "'s head", - NamedTextColor.GOLD).decoration(TextDecoration.ITALIC, false)), name + "'s head"); + Utils.giveItem(player, Utils.createPlayerSkull(uuid, 1, Component.text(name + "'s head", NamedTextColor.GOLD).decoration(TextDecoration.ITALIC, false)), + name + "'s head"); } else { - player.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED).append(ChatUtils.error(" could not be" + - " found."))); + player.sendMessage(Component.text(args[0], NamedTextColor.DARK_RED).append(ChatUtils.error(" could not be" + " found."))); } } + + @Override + public String getLabel() { + return "phead"; + } + + @Override + public String getDescription() { + return "Get the player head of someone who has connected to the server."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java index 40e0c6c3..412aa120 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java @@ -18,7 +18,17 @@ public Pmute(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { onCommand(stack, args, true); } + + @Override + public String getLabel() { + return "pmute"; + } + + @Override + public String getDescription() { + return "Mute a player"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java b/Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java index f8353b47..4b438066 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/ProgressMap.java @@ -1,20 +1,26 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.core.Constants; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; -import org.apache.logging.log4j.util.Strings; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.PROGRESS_MAP; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; +import java.util.List; public class ProgressMap extends AbstractCommand { + + private final Constants constants; + + public ProgressMap(Constants constants) { + this.constants = constants; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -23,12 +29,26 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Send them a link - if (PROGRESS_MAP) { + if (constants.progressMap()) { TextComponent textComponent = Component.text("Click here to view a map of our progress!", NamedTextColor.AQUA); - textComponent = textComponent.clickEvent(ClickEvent.openUrl(CONFIG.getString("ProgressMap.Link", - Strings.EMPTY))); + textComponent = textComponent.clickEvent(ClickEvent.openUrl(constants.progressMapLink())); player.sendMessage(textComponent); } } + + @Override + public String getLabel() { + return "progressmap"; + } + + @Override + public String getDescription() { + return "Sends a link of the progress map"; + } + + @Override + public List getAliases() { + return List.of("progress"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Promote.java b/Plugin/src/main/java/net/bteuk/network/commands/Promote.java index ac09de86..ea2dadcb 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Promote.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Promote.java @@ -3,6 +3,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -13,15 +14,25 @@ public class Promote extends PromotionAction { private static final Component ERROR = ChatUtils.error("/promote [player] [role]"); - public Promote(Network instance) { - super(instance, ERROR); + public Promote(Network instance, Roles roles) { + super(instance, roles, ERROR); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { CommandSender sender = stack.getSender(); if (hasPermission(sender, "uknet.staff.promote")) { onCommand(sender, args, false); } } + + @Override + public String getLabel() { + return "promote"; + } + + @Override + public String getDescription() { + return "Add a role to a player."; + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java index 31457a81..b81eda1e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java @@ -1,5 +1,6 @@ package net.bteuk.network.commands; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.commands.tabcompleters.MultiArgSelector; @@ -21,14 +22,17 @@ public abstract class PromotionAction extends AbstractCommand { private final Component error; - + private final Roles roles; private final Network instance; + private final CustomChat chat; - protected PromotionAction(Network instance, Component error) { + protected PromotionAction(Network instance, Roles roles, CustomChat customChat, Component error) { this.instance = instance; + this.roles = roles; this.error = error; + this.chat = customChat; setTabCompleter(new MultiArgSelector(List.of(new PlayerSelector(false), - new FixedArgSelector(Roles.getRoles().stream().map(Role::getId).collect(Collectors.toList()), 1)))); + new FixedArgSelector(roles.getRoles().stream().map(Role::getId).collect(Collectors.toList()), 1)))); } public void onCommand(CommandSender sender, String[] args, boolean demote) { @@ -47,7 +51,7 @@ public void onCommand(CommandSender sender, String[] args, boolean demote) { return; } - CompletableFuture resultFuture = Roles.alterRole(uuid, name, args[1], demote, false); + CompletableFuture resultFuture = roles.alterRole(uuid, name, args[1], demote, false, chat); Executors.newSingleThreadExecutor().submit(() -> resultFuture.thenAcceptAsync(sender::sendMessage).join()); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Ptime.java b/Plugin/src/main/java/net/bteuk/network/commands/Ptime.java index 512f851b..a95c4dc6 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Ptime.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Ptime.java @@ -26,7 +26,7 @@ public Ptime() { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -125,4 +125,14 @@ private int convertHourToTicks(int hour) { private int convertMinutesToTicks(int minutes) { return minutes * 1000 / 60; } + + @Override + public String getLabel() { + return "ptime"; + } + + @Override + public String getDescription() { + return "Sets the time of day for the player"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java index 6b0d58ee..56dda98b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java @@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull; /** - * Command for personal muting, allows you to mute any player for the current session. + * Command for personal muting; allows you to mute any player for the current session. */ public class Punmute extends PmuteAction { @@ -18,7 +18,17 @@ public Punmute(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { onCommand(stack, args, false); } + + @Override + public String getLabel() { + return "punmute"; + } + + @Override + public String getDescription() { + return "Unmute a player"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Pweather.java b/Plugin/src/main/java/net/bteuk/network/commands/Pweather.java index 2f8fe0f2..976034cf 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Pweather.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Pweather.java @@ -20,7 +20,7 @@ public Pweather() { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -46,4 +46,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { player.setPlayerWeather(weatherType); player.sendMessage(Utils.success("Set weather to %s", weatherType.name())); } + + @Override + public String getLabel() { + return "pweather"; + } + + @Override + public String getDescription() { + return "Sets the weather for the player"; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java index 2f272608..5ebcddb1 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java @@ -1,7 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.CustomChat; import net.bteuk.network.lib.dto.ReplyMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; @@ -9,16 +9,17 @@ import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.List; -public class Reply extends AbstractCommand { +public class Reply extends AbstractCommand { + private static final String ERROR = "/r [message]"; + private final CustomChat chat; - private final Msg msgCommand; - private final String ERROR = "Usage: /r [message]"; - private final Network instance = Network.getInstance(); - public Reply(Msg msgCommand) { - this.msgCommand = msgCommand; + public Reply(CustomChat chat) { + this.chat = chat; } - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -33,8 +34,21 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } String message = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); ReplyMessage replymessage = new ReplyMessage(ChatChannels.GLOBAL.getChannelName(),player.getName(),message,false); - instance.getChat().sendSocketMessage(replymessage); + chat.sendSocketMessage(replymessage); } + @Override + public String getLabel() { + return "reply"; + } + @Override + public String getDescription() { + return "sends a direct message to the last player you messaged"; + } + + @Override + public List getAliases() { + return List.of("r"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Rules.java b/Plugin/src/main/java/net/bteuk/network/commands/Rules.java index a0d51d5c..a9f86bfc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Rules.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Rules.java @@ -1,14 +1,20 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; +import net.bteuk.network.lobby.Lobby; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public class Rules extends AbstractCommand { + private final Lobby lobby; + + public Rules(Lobby lobby) { + this.lobby = lobby; + } + @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -17,6 +23,16 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Open rules book. - player.openBook(Network.getInstance().getLobby().getRules()); + player.openBook(lobby.getRules()); + } + + @Override + public String getLabel() { + return "rules"; + } + + @Override + public String getDescription() { + return "Get rules book."; } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Speed.java b/Plugin/src/main/java/net/bteuk/network/commands/Speed.java index 748d4ed4..3ac173ea 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Speed.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Speed.java @@ -10,7 +10,7 @@ public class Speed extends AbstractCommand { @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -37,7 +37,6 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { speed = getRealMoveSpeed(speed, isFly); if (isFly) { - player.setFlySpeed(speed); player.sendMessage(ChatUtils.success("Set flying speed to ") .append(Component.text(args[0], NamedTextColor.DARK_AQUA))); @@ -78,4 +77,14 @@ private float getRealMoveSpeed(final float userSpeed, final boolean isFly) { private void error(Player p) { p.sendMessage(ChatUtils.error("/speed [0-10]")); } + + @Override + public String getLabel() { + return "speed"; + } + + @Override + public String getDescription() { + return "Sets the players speed, value up to 10."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java b/Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java index 3dd9c480..099cc31f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/TipsToggle.java @@ -1,23 +1,31 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import static net.bteuk.network.utils.Constants.LOGGER; +import java.util.List; +@Log public class TipsToggle extends AbstractCommand { - public static void toggleTips(Player p) { + private final Network instance; + + public TipsToggle(Network instance) { + this.instance = instance; + } + + public void toggleTips(Player p) { // Get the NetworkUser for this player. - NetworkUser user = Network.getInstance().getUser(p); + NetworkUser user = instance.getUser(p); if (user == null) { - LOGGER.warning("NetworkUser for player " + p.getName() + " is null!"); + log.warning("NetworkUser for player " + p.getName() + " is null!"); return; } @@ -34,7 +42,7 @@ public static void toggleTips(Player p) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -44,4 +52,19 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { toggleTips(player); } + + @Override + public String getLabel() { + return "tips"; + } + + @Override + public String getDescription() { + return "Toggles tips in chat."; + } + + @Override + public List getAliases() { + return List.of("tipstoggle", "toggletips"); + } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java index df04475b..c03d448e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveBarrier.java @@ -16,7 +16,17 @@ public GiveBarrier(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { onCommand(stack, "uknet.barrier", ItemStack.of(Material.BARRIER), "Barrier"); } + + @Override + public String getLabel() { + return "barrier"; + } + + @Override + public String getDescription() { + return "Get a barrier block."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java index 8bd260cc..0761f25f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveDebugStick.java @@ -16,7 +16,17 @@ public GiveDebugStick(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, @NotNull String @NotNull [] args) { onCommand(stack, "uknet.debugstick", ItemStack.of(Material.DEBUG_STICK), "Debug Stick"); } + + @Override + public String getLabel() { + return "debugstick"; + } + + @Override + public String getDescription() { + return "Get the debug stick."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java index c0e6e6ba..a5b50dbc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveLight.java @@ -16,7 +16,17 @@ public GiveLight(Network instance) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { onCommand(stack, "uknet.light", ItemStack.of(Material.LIGHT), "Light"); } + + @Override + public String getLabel() { + return "light"; + } + + @Override + public String getDescription() { + return "Get a light block."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index b51d67c3..ef0345d1 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -1,11 +1,15 @@ package net.bteuk.network.eventing.listeners; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.commands.Afk; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.ServerShutdown; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.Time; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; @@ -16,18 +20,21 @@ import java.util.ArrayList; -import static net.bteuk.network.commands.Afk.updateAfkStatus; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.REGIONS_ENABLED; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.TPLL_ENABLED; - +@Log public class CommandPreProcess implements Listener { private final Network instance; + private final Constants constants; + private final Afk afk; + private final Connect connect; + private final ServerAPI serverAPI; - public CommandPreProcess(Network instance) { + public CommandPreProcess(Network instance, Constants constants, Afk afk, Connect connect, ServerAPI serverAPI) { this.instance = instance; + this.constants = constants; + this.afk = afk; + this.connect = connect; + this.serverAPI = serverAPI; instance.allowShutdown = false; Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @@ -44,7 +51,7 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { // If u is null, cancel. if (user == null) { - LOGGER.severe("User " + e.getPlayer().getName() + " can not be found!"); + log.severe("User " + e.getPlayer().getName() + " can not be found!"); e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); e.setCancelled(true); return; @@ -53,24 +60,26 @@ public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { user.last_movement = Time.currentTime(); if (user.isAfk()) { user.setAfk(false); - updateAfkStatus(user, false); + afk.updateAfkStatus(user, false); } } // Replace /region with /network:region if (isCommand(e.getMessage(), "/region")) { - if (REGIONS_ENABLED) { + if (constants.regionsEnabled()) { e.setMessage(e.getMessage().replace("/region", "/network:region")); } } else if (isCommand(e.getMessage(), "/tpll")) { - if (TPLL_ENABLED) { + if (constants.tpllEnabled()) { e.setMessage(e.getMessage().replace("/tpll", "/network:tpll")); } } else if (isCommand(e.getMessage(), "/server")) { - e.setMessage(e.getMessage().replace("/server", "/network:server")); + if (!constants.standalone()) { + e.setMessage(e.getMessage().replace("/server", "/network:server")); + } } else if (isCommand(e.getMessage(), "/hdb")) { - // If skulls plugin exists and is loaded. - if (Bukkit.getServer().getPluginManager().getPlugin("skulls") != null) { + // If the skulls plugin exists and is loaded. + if (constants.skullsEnabled() && Bukkit.getServer().getPluginManager().getPlugin("skulls") != null) { e.setMessage(e.getMessage().replace("/hdb", "/skulls")); } } @@ -107,8 +116,8 @@ public void serverCommand(ServerCommandEvent s) { s.setCancelled(true); Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> { // Disable the LeaveServer event, although everyone should already be disconnected by now. - if (instance.getConnect() != null) { - instance.getConnect().setBlockLeaveEvent(true); + if (connect != null) { + connect.setBlockLeaveEvent(true); } Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "stop"); @@ -118,7 +127,7 @@ public void serverCommand(ServerCommandEvent s) { } // This class executes when the server closes, instead of a player server quit event since that will cause errors. - // It for the most part copies the methods. + // For the most part, it copies the methods. public void onServerClose(ArrayList users) { // Check if another server is online, @@ -128,21 +137,23 @@ public void onServerClose(ArrayList users) { String server = null; // Try different servers. - if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE type='LOBBY' AND online=1 AND name<>'" + SERVER_NAME + "';")) { + if (!constants.standalone()) { + if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE type='LOBBY' AND online=1 AND name<>'" + constants.serverName() + "';")) { - server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE type='LOBBY' AND online=1 AND name<>'" + SERVER_NAME + "';"); - } else if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE type='EARTH' AND online=1 AND name<>'" + SERVER_NAME + "';")) { + server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE type='LOBBY' AND online=1 AND name<>'" + constants.serverName() + "';"); + } else if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE type='EARTH' AND online=1 AND name<>'" + constants.serverName() + "';")) { - server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE type='EARTH' AND online=1 AND name<>'" + SERVER_NAME + "';"); - } else if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE online=1 AND name<>'" + SERVER_NAME + "';")) { + server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE type='EARTH' AND online=1 AND name<>'" + constants.serverName() + "';"); + } else if (instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE online=1 AND name<>'" + constants.serverName() + "';")) { - server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE online=1 AND name<>'" + SERVER_NAME + "';"); + server = instance.getGlobalSQL().getString("SELECT name FROM server_data WHERE online=1 AND name<>'" + constants.serverName() + "';"); + } } for (NetworkUser user : users) { // Switch the player to another server, if available, else kick them. if (server != null) { - SwitchServer.switchServer(user.player, server); + serverAPI.switchServer(PlayerAdapter.adapt(user.player), server); } else { // Kick the player. instance.getServer().getScheduler().runTask(instance, () -> user.player.kick(Component.text("The server is restarting!", NamedTextColor.RED))); @@ -153,10 +164,10 @@ public void onServerClose(ArrayList users) { instance.moveListener.block(); instance.teleportListener.block(); - // Remove users from list. + // Remove users from the list. users.clear(); // Let the Proxy know the server is closing. - instance.getChat().sendSocketMessage(new ServerShutdown(SERVER_NAME)); + instance.getChat().sendSocketMessage(new ServerShutdown(constants.serverName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 66a08ffc..2b1d76be 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -8,11 +8,15 @@ import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; import net.bteuk.network.gui.Gui; +import net.bteuk.network.lib.dto.OnlineUser; +import net.bteuk.network.lib.dto.OnlineUserAdd; +import net.bteuk.network.lib.dto.OnlineUserRemove; import net.bteuk.network.lib.dto.TabPlayer; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserConnectRequest; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.TextureUtils; @@ -20,6 +24,7 @@ import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -28,6 +33,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -39,16 +46,18 @@ public class Connect implements Listener { private final Constants constants; private final TabManager tabManager; private final Roles roles; + private final GlobalSQL globalSQL; @Setter private boolean blockLeaveEvent; - public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles) { + public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL) { this.instance = instance; this.constants = constants; this.tabManager = tabManager; this.roles = roles; + this.globalSQL = globalSQL; this.blockLeaveEvent = false; @@ -67,18 +76,14 @@ public void handleUserConnectReply(UserConnectReply reply) { Bukkit.getScheduler().runTask(instance, () -> { // Find the player associated with the uuid. - Player player = - instance.getServer().getOnlinePlayers().stream() - .filter(p -> p.getUniqueId().toString().equals(reply.getUuid())).findFirst().orElse(null); + Player player = instance.getServer().getOnlinePlayers().stream().filter(p -> p.getUniqueId().toString().equals(reply.getUuid())).findFirst().orElse(null); if (player == null) { - log.warning("A UserConnectReply was received but no Player exists with their uuid, maybe they have" + - " already left?"); + log.warning("A UserConnectReply was received but no Player exists with their uuid, maybe they have" + " already left?"); return; } - log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", - player.getName())); + log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", player.getName())); NetworkUser user = new NetworkUser(player, reply, instance, constants, roles); instance.addUser(user); @@ -119,7 +124,26 @@ public void handleUserRemove(UserRemove userRemove) { @EventHandler(priority = EventPriority.HIGHEST) public void joinServerEvent(PlayerJoinEvent joinEvent) { if (constants.standalone()) { - // TODO: Implement standalone connecting. + Player player = joinEvent.getPlayer(); + + boolean navigatorEnabled = globalSQL.getBoolean("SELECT navigator FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + boolean teleportEnabled = globalSQL.getBoolean("SELECT teleport_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + boolean nightVisionEnabled = globalSQL.getBoolean("SELECT nightvision_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + String chatChannel = globalSQL.getString("SELECT chat_channel FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + boolean tipsEnabled = globalSQL.getBoolean("SELECT tips_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + List messages = globalSQL.getOfflineMessages(player.getUniqueId().toString()); + List components = new ArrayList<>(); + messages.forEach(message -> components.add(GsonComponentSerializer.gson().deserialize(message))); + + UserConnectReply reply = new UserConnectReply(player.getUniqueId().toString(), navigatorEnabled, teleportEnabled, nightVisionEnabled, chatChannel, tipsEnabled, + components, false); + NetworkUser user = new NetworkUser(player, reply, instance, constants, roles); + + OnlineUserAdd onlineUserAdd = new OnlineUserAdd(); + onlineUserAdd.setUser(new OnlineUser(player.getUniqueId().toString(), player.getName(), constants.serverName())); + + instance.addUser(user); + instance.handleOnlineUserAdd(onlineUserAdd); } else { networkJoinEvent(joinEvent); } @@ -144,8 +168,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { UserDisconnect disconnectEvent = new UserDisconnect(); disconnectEvent.setUuid(e.getPlayer().getUniqueId().toString()); disconnectEvent.setServer(constants.serverName()); - Bukkit.getScheduler().runTaskAsynchronously(instance, - () -> instance.getChat().sendSocketMessage(disconnectEvent)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(disconnectEvent)); return; } @@ -181,11 +204,13 @@ public void leaveServerEvent(PlayerQuitEvent e) { user.lightsOut.delete(); } - // Send a disconnect event to the proxy to handle potential messages. - if (!constants.standalone()) { + if (constants.standalone()) { + OnlineUserRemove onlineUserRemove = new OnlineUserRemove(playerUUID.toString()); + instance.handleOnlineUserRemove(onlineUserRemove); + } else { + // Send a disconnect event to the proxy to handle potential messages. UserDisconnect userDisconnect = user.createDisconnectEvent(); - Bukkit.getScheduler().runTaskAsynchronously(instance, - () -> instance.getChat().sendSocketMessage(userDisconnect)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(userDisconnect)); } } @@ -202,14 +227,10 @@ private void networkJoinEvent(PlayerJoinEvent e) { // Send a user connect request to the proxy, this will handle the rest. // When the proxy has received the request it'll send a response which will then create the user object on // the server. - UserConnectRequest userConnectRequest = new UserConnectRequest( - constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), - TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, - e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer") - ); - Bukkit.getScheduler().runTaskAsynchronously(instance, - () -> instance.getChat().sendSocketMessage(userConnectRequest)); - log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", - e.getPlayer().getName())); + UserConnectRequest userConnectRequest = new UserConnectRequest(constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), + TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, e.getPlayer().hasPermission("group.architect"), + e.getPlayer().hasPermission("group.reviewer")); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(userConnectRequest)); + log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", e.getPlayer().getName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java b/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java index 9a6c3db3..ae80773b 100644 --- a/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java +++ b/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java @@ -1,5 +1,6 @@ package net.bteuk.network.services; +import net.bteuk.network.CustomChat; import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.bteuk.teachingtutorials.services.PromotionService; @@ -7,14 +8,22 @@ public class NetworkPromotionService implements PromotionService { + private final Roles roles; + private final CustomChat chat; + + public NetworkPromotionService(Roles roles, CustomChat chat) { + this.roles = roles; + this.chat = chat; + } + @Override public void promote(Player player) { // If the builder role is default, promote the user. - Role currentRole = Roles.builderRole(player); + Role currentRole = roles.builderRole(player); if (currentRole != null && currentRole.getId().equals("default")) { - Roles.alterRole(player.getUniqueId().toString(), player.getName(), "applicant", false, true).join(); - Roles.alterRole(player.getUniqueId().toString(), player.getName(), "default", false, true).join(); + roles.alterRole(player.getUniqueId().toString(), player.getName(), "applicant", false, true, chat).join(); + roles.alterRole(player.getUniqueId().toString(), player.getName(), "default", false, true, chat).join(); } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index a2a2ce46..b37641a0 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -18,6 +18,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.List; @Log public class GlobalSQL extends AbstractSQL { @@ -264,4 +265,24 @@ public boolean insertMessage(DirectMessage directMessage) { return false; } } + + public List getOfflineMessages(String uuid) { + List messages = new ArrayList<>(); + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement( + "SELECT message FROM messages WHERE recipient=?;" + ) + ) { + statement.setString(1, uuid); + ResultSet results = statement.executeQuery(); + + while (results.next()) { + messages.add(results.getString(1)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return messages; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index c7097b5e..9d42b7b5 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -5,6 +5,7 @@ import net.bteuk.network.Network; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; +import org.apache.logging.log4j.util.Strings; import org.bukkit.configuration.file.FileConfiguration; import java.io.File; @@ -135,7 +136,7 @@ public net.bteuk.network.core.Constants getConstants() { boolean announceSeasonalLevelUps = config.getBoolean("progression.announce_level-ups.seasonal"); boolean sidebarEnabled = config.getBoolean("sidebar.enabled"); - String sidebarTitle = config.getString("sidebar.title", ""); + String sidebarTitle = config.getString("sidebar.title", Strings.EMPTY); List sidebarTextConfig = config.getList("sidebar.text"); List sidebarText = new ArrayList<>(); @@ -152,13 +153,7 @@ public net.bteuk.network.core.Constants getConstants() { boolean motdEnabled = config.getBoolean("motd.enabled"); String motdText = config.getString("motd.text", ""); - String earthWorld; - if (config.getString("regions.earth_world") == null) { - // Setting default value. - earthWorld = "earth"; - } else { - earthWorld = config.getString("regions.earth_world"); - } + String earthWorld = config.getString("regions.earth_world", "earth"); boolean plotSystemEnabled = config.getBoolean("plot_system.enabled"); @@ -170,11 +165,20 @@ public net.bteuk.network.core.Constants getConstants() { boolean announcePromotions = config.getBoolean("chat.announce_promotions"); - String discordLink = config.getString("discord"); + String discordLink = config.getString("discord", Strings.EMPTY); + + boolean skullsEnabled = config.getBoolean("skulls_plugin_enabled"); + + String progressMapLink = config.getString("ProgressMap.Link", Strings.EMPTY); + + String chatSocketOutputIP = config.getString("chat.socket.output.IP"); + int chatSocketOutputPort = config.getInt("chat.socket.output.port"); + int chatSocketInputPort = config.getInt("chat.socket.input.port"); log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink); + motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, + chatSocketOutputPort, chatSocketInputPort); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 186018b5..c62e4a2f 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -41,12 +41,10 @@ public final class Roles { private static Set ROLES; private final Network instance; - private final CustomChat customChat; private final PlotSQL plotSQL; - public Roles(Network instance, CustomChat customChat, PlotSQL plotSQL) { + public Roles(Network instance, PlotSQL plotSQL) { this.instance = instance; - this.customChat = customChat; this.plotSQL = plotSQL; } @@ -174,7 +172,7 @@ private void loadRoles() { * @return {@link CompletableFuture} completableFuture with {@link Component} message. */ public CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, - boolean announce) { + boolean announce, CustomChat customChat) { // Get the configured group. Role role = getRoleById(roleId); @@ -225,11 +223,11 @@ public CompletableFuture alterRole(String uuid, String name, String r customChat.sendSocketMessage(discordRole); if (announce && !remove) { - sendPromotionChatMessage(name, role); + sendPromotionChatMessage(name, role, customChat); } if (!remove) { - sendPromotionDirectMessage(uuid, role); + sendPromotionDirectMessage(uuid, role, customChat); } if (remove) { @@ -240,7 +238,7 @@ public CompletableFuture alterRole(String uuid, String name, String r }); } - private void sendPromotionChatMessage(String name, Role role) { + private void sendPromotionChatMessage(String name, Role role, CustomChat customChat) { Component message = Component.text(name) .append(PROMOTION_TEMPLATE) .append(role.getColouredRoleName()) @@ -248,7 +246,7 @@ private void sendPromotionChatMessage(String name, Role role) { customChat.sendChatMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); } - private void sendPromotionDirectMessage(String uuid, Role role) { + private void sendPromotionDirectMessage(String uuid, Role role, CustomChat customChat) { Component message = PROMOTION_SELF .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 2e71fee8..27e00e79 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -168,4 +168,7 @@ sidebar: motd: enabled: false # Use MiniMessage format to define the text. (https://webui.advntr.dev/). Use %player% as player name placeholder - text: "" \ No newline at end of file + text: "" + +# Whether the skulls plugin is used as head database. +skulls_plugin_enabled: true \ No newline at end of file From a21f0a177da16cae5b6c3f41cab845d6b99e31d4 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 27 Aug 2025 21:58:54 +0200 Subject: [PATCH 11/96] Migrate event manager. --- .../net/bteuk/network/core/Constants.java | 2 +- .../java/net/bteuk/network/core/Event.java | 8 +- .../net/bteuk/network/api/CoordinateAPI.java | 2 + .../java/net/bteuk/network/api/PlotAPI.java | 4 + .../main/java/net/bteuk/network/Network.java | 6 +- .../network/api/impl/CoordinateAPIImpl.java | 10 + .../bteuk/network/api/impl/PlotAPIImpl.java | 10 + .../net/bteuk/network/commands/Demote.java | 5 +- .../net/bteuk/network/commands/Promote.java | 5 +- .../net/bteuk/network/commands/Season.java | 274 +++++++++--------- .../net/bteuk/network/commands/staff/Exp.java | 88 +++--- .../network/eventing/events/EventManager.java | 89 +++--- .../network/eventing/events/InviteEvent.java | 65 ++--- .../network/eventing/events/KickEvent.java | 9 +- .../network/eventing/events/RegionEvent.java | 142 --------- .../eventing/events/TeleportEvent.java | 114 ++++---- .../main/java/net/bteuk/network/gui/Gui.java | 5 - .../java/net/bteuk/network/sql/GlobalSQL.java | 11 +- .../bteuk/network/utils/NetworkConfig.java | 4 +- .../java/net/bteuk/network/utils/Tips.java | 35 ++- .../utils/progression/Progression.java | 198 +++++++------ Plugin/src/main/resources/config.yml | 94 +++--- .../bteuk/network/regions/RegionEvent.java | 142 +++++++++ 23 files changed, 679 insertions(+), 643 deletions(-) rename Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java => Core/src/main/java/net/bteuk/network/core/Event.java (61%) delete mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java create mode 100644 Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index 30db1c7f..c7d9d632 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -5,4 +5,4 @@ public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, - boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort) { } + boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency) { } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java b/Core/src/main/java/net/bteuk/network/core/Event.java similarity index 61% rename from Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java rename to Core/src/main/java/net/bteuk/network/core/Event.java index e68bd942..35d87d1b 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/AbstractEvent.java +++ b/Core/src/main/java/net/bteuk/network/core/Event.java @@ -1,16 +1,16 @@ -package net.bteuk.network.eventing.events; +package net.bteuk.network.core; /** * Abstract class for events. */ -public abstract class AbstractEvent { +public interface Event { /** * abstract event method, all events must use this structure. * * @param uuid the uuid of the player to whom this event applies * @param args arguments of the event - * @param message optional message to send to the player after the event has executes successfully + * @param message optional message to send to the player after the event has executed successfully */ - public abstract void event(String uuid, String[] args, String message); + void event(String uuid, String[] args, String message); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java index 28300e04..b9d2fc3a 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java @@ -5,4 +5,6 @@ public interface CoordinateAPI { int addCoordinate(NetworkLocation location); + + int copyCoordinate(int coordinateID); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index c4a53057..d272f18d 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -90,4 +90,8 @@ public interface PlotAPI { int getZTransform(String location); boolean hasLocation(String location); + + String getPlotOwner(int plotID); + + String getZoneOwner(int zoneID); } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index fa608889..57362d74 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -462,8 +462,8 @@ public void enablePlugin() { commandManager.registerCommand(new Reply(chat)); } - commandManager.registerCommand(new Promote(this, roles)); - commandManager.registerCommand(new Demote(this, roles)); + commandManager.registerCommand(new Promote(this, roles, chat)); + commandManager.registerCommand(new Demote(this, roles, chat)); commandManager.registerCommand(new Me()); @@ -475,7 +475,7 @@ public void enablePlugin() { // Enable tips. if (constants.tips()) { // Enable tips in chat. - new Tips(); + new Tips(this, constants); } // Create a default season if not exists. diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java index ca9b3faf..460123a9 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java @@ -3,6 +3,7 @@ import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.utils.Coordinate; public class CoordinateAPIImpl implements CoordinateAPI { @@ -21,4 +22,13 @@ public CoordinateAPIImpl(GlobalSQL globalSQL) { public int addCoordinate(NetworkLocation location) { return globalSQL.addCoordinate(location); } + + @Override + public int copyCoordinate(int coordinateID) { + Coordinate coordinate = globalSQL.getCoordinate(coordinateID); + if (coordinate != null) { + return globalSQL.addCoordinate(coordinate); + } + return -1; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 2357066b..eeaf0a27 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -206,4 +206,14 @@ public int getZTransform(String location) { public boolean hasLocation(String location) { return plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + location + "';"); } + + @Override + public String getPlotOwner(int plotID) { + return plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plotID + " AND is_owner=1;"); + } + + @Override + public String getZoneOwner(int zoneID) { + return plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND is_owner=1;"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Demote.java b/Plugin/src/main/java/net/bteuk/network/commands/Demote.java index ec2ee4e4..7dfeddeb 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Demote.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Demote.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Roles; @@ -14,8 +15,8 @@ public class Demote extends PromotionAction { private static final Component ERROR = ChatUtils.error("/demote [player] [role]"); - public Demote(Network instance, Roles roles) { - super(instance, roles, ERROR); + public Demote(Network instance, Roles roles, CustomChat chat) { + super(instance, roles, chat, ERROR); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Promote.java b/Plugin/src/main/java/net/bteuk/network/commands/Promote.java index ea2dadcb..3380280f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Promote.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Promote.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.CustomChat; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Roles; @@ -14,8 +15,8 @@ public class Promote extends PromotionAction { private static final Component ERROR = ChatUtils.error("/promote [player] [role]"); - public Promote(Network instance, Roles roles) { - super(instance, roles, ERROR); + public Promote(Network instance, Roles roles, CustomChat chat) { + super(instance, roles, chat, ERROR); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Season.java b/Plugin/src/main/java/net/bteuk/network/commands/Season.java index 4842a153..e16671b3 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Season.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Season.java @@ -1,137 +1,137 @@ -package net.bteuk.network.commands; - -import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; -import net.bteuk.network.lib.utils.ChatUtils; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; - -public class Season extends AbstractCommand { - - private static final Component INVALID_COMMAND_ARGUMENTS = ChatUtils.error("/season create|start|end " + - "[season_name]"); - - @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { - - // Check if sender is player, then check permissions - CommandSender sender = stack.getSender(); - if (sender instanceof Player) { - if (!hasPermission(sender, "uknet.season")) { - return; - } - } - - // Check args. - if (args.length >= 2) { - - // Don't allow season command to alter the default season. - if (args[1].equalsIgnoreCase("default")) { - sender.sendMessage(ChatUtils.error("The default season can not be modified!")); - return; - } - - // Check first arg. - if (args[0].equalsIgnoreCase("create")) { - - // Create season with all remaining args as name. - sender.sendMessage(createSeason(args)); - return; - } else if (args[0].equalsIgnoreCase("start")) { - - // Start season with all remaining args as name. - sender.sendMessage(startSeason(args)); - return; - } else if (args[0].equalsIgnoreCase("end")) { - - // End season with all remaining args as name. - sender.sendMessage(endSeason(args)); - return; - } - } - - // If the code reaches here then the command format was invalid. - sender.sendMessage(INVALID_COMMAND_ARGUMENTS); - } - - private Component createSeason(String[] args) { - - // Get the name from the remaining args. - String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - - // Create the season if it does not already exist. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { - return ChatUtils.error("A season with the name ") - .append(Component.text(name, NamedTextColor.DARK_RED) - .append(ChatUtils.error(" already exists."))); - } - - if (Network.getInstance().getGlobalSQL().update("INSERT INTO seasons(id) VALUES('" + name + "');")) { - return ChatUtils.success("Season created with name ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)); - } else { - return ChatUtils.success("An error occurred while creating the season, please contact a server admin."); - } - } - - private Component startSeason(String[] args) { - - // Get the name from the remaining args. - String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - - // Check if the season exists, and is not already active. - if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { - return ChatUtils.error("A season with the name ") - .append(Component.text(name, NamedTextColor.DARK_RED) - .append(ChatUtils.error(" doesn't exists."))); - } else if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "' AND " + - "active=1;")) { - return ChatUtils.error("The season ") - .append(Component.text(name, NamedTextColor.DARK_RED) - .append(ChatUtils.error(" has already started."))); - } else if (Network.getInstance().getGlobalSQL().getInt("SELECT id FROM seasons WHERE id='" + name + "' AND " + - "active=1;") > 1) { - return ChatUtils.error("There is already an active season, cancel season ") - .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT id FROM seasons " + - "WHERE active=1 and id<>'default';"), NamedTextColor.DARK_RED)) - .append(ChatUtils.error(" first.")); - } - - if (Network.getInstance().getGlobalSQL().update("UPDATE seasons SET active=1 WHERE id='" + name + "';")) { - return ChatUtils.success("Started season ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)); - } else { - return ChatUtils.success("An error occurred while starting the season, please contact a server admin."); - } - } - - private Component endSeason(String[] args) { - - // Get the name from the remaining args. - String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - - // Check if the season exists, and is active. - if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { - return ChatUtils.error("A season with the name ") - .append(Component.text(name, NamedTextColor.DARK_RED) - .append(ChatUtils.error(" doesn't exists."))); - } else if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "' AND " + - "active=1;")) { - return ChatUtils.error("The season ") - .append(Component.text(name, NamedTextColor.DARK_RED) - .append(ChatUtils.error(" is not active."))); - } - - if (Network.getInstance().getGlobalSQL().update("UPDATE seasons SET active=0 WHERE id='" + name + "';")) { - return ChatUtils.success("Ended season ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)); - } else { - return ChatUtils.success("An error occurred while starting the season, please contact a server admin."); - } - } -} +// package net.bteuk.network.commands; +// +// import io.papermc.paper.command.brigadier.CommandSourceStack; +// import net.bteuk.network.Network; +// import net.bteuk.network.lib.utils.ChatUtils; +// import net.kyori.adventure.text.Component; +// import net.kyori.adventure.text.format.NamedTextColor; +// import org.bukkit.command.CommandSender; +// import org.bukkit.entity.Player; +// import org.jetbrains.annotations.NotNull; +// +// import java.util.Arrays; +// +// public class Season extends AbstractCommand { +// +// private static final Component INVALID_COMMAND_ARGUMENTS = ChatUtils.error("/season create|start|end " + +// "[season_name]"); +// +// @Override +// public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { +// +// // Check if sender is player, then check permissions +// CommandSender sender = stack.getSender(); +// if (sender instanceof Player) { +// if (!hasPermission(sender, "uknet.season")) { +// return; +// } +// } +// +// // Check args. +// if (args.length >= 2) { +// +// // Don't allow season command to alter the default season. +// if (args[1].equalsIgnoreCase("default")) { +// sender.sendMessage(ChatUtils.error("The default season can not be modified!")); +// return; +// } +// +// // Check first arg. +// if (args[0].equalsIgnoreCase("create")) { +// +// // Create season with all remaining args as name. +// sender.sendMessage(createSeason(args)); +// return; +// } else if (args[0].equalsIgnoreCase("start")) { +// +// // Start season with all remaining args as name. +// sender.sendMessage(startSeason(args)); +// return; +// } else if (args[0].equalsIgnoreCase("end")) { +// +// // End season with all remaining args as name. +// sender.sendMessage(endSeason(args)); +// return; +// } +// } +// +// // If the code reaches here then the command format was invalid. +// sender.sendMessage(INVALID_COMMAND_ARGUMENTS); +// } +// +// private Component createSeason(String[] args) { +// +// // Get the name from the remaining args. +// String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); +// +// // Create the season if it does not already exist. +// if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { +// return ChatUtils.error("A season with the name ") +// .append(Component.text(name, NamedTextColor.DARK_RED) +// .append(ChatUtils.error(" already exists."))); +// } +// +// if (Network.getInstance().getGlobalSQL().update("INSERT INTO seasons(id) VALUES('" + name + "');")) { +// return ChatUtils.success("Season created with name ") +// .append(Component.text(name, NamedTextColor.DARK_AQUA)); +// } else { +// return ChatUtils.success("An error occurred while creating the season, please contact a server admin."); +// } +// } +// +// private Component startSeason(String[] args) { +// +// // Get the name from the remaining args. +// String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); +// +// // Check if the season exists, and is not already active. +// if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { +// return ChatUtils.error("A season with the name ") +// .append(Component.text(name, NamedTextColor.DARK_RED) +// .append(ChatUtils.error(" doesn't exists."))); +// } else if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "' AND " + +// "active=1;")) { +// return ChatUtils.error("The season ") +// .append(Component.text(name, NamedTextColor.DARK_RED) +// .append(ChatUtils.error(" has already started."))); +// } else if (Network.getInstance().getGlobalSQL().getInt("SELECT id FROM seasons WHERE id='" + name + "' AND " + +// "active=1;") > 1) { +// return ChatUtils.error("There is already an active season, cancel season ") +// .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT id FROM seasons " + +// "WHERE active=1 and id<>'default';"), NamedTextColor.DARK_RED)) +// .append(ChatUtils.error(" first.")); +// } +// +// if (Network.getInstance().getGlobalSQL().update("UPDATE seasons SET active=1 WHERE id='" + name + "';")) { +// return ChatUtils.success("Started season ") +// .append(Component.text(name, NamedTextColor.DARK_AQUA)); +// } else { +// return ChatUtils.success("An error occurred while starting the season, please contact a server admin."); +// } +// } +// +// private Component endSeason(String[] args) { +// +// // Get the name from the remaining args. +// String name = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); +// +// // Check if the season exists, and is active. +// if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "';")) { +// return ChatUtils.error("A season with the name ") +// .append(Component.text(name, NamedTextColor.DARK_RED) +// .append(ChatUtils.error(" doesn't exists."))); +// } else if (!Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE id='" + name + "' AND " + +// "active=1;")) { +// return ChatUtils.error("The season ") +// .append(Component.text(name, NamedTextColor.DARK_RED) +// .append(ChatUtils.error(" is not active."))); +// } +// +// if (Network.getInstance().getGlobalSQL().update("UPDATE seasons SET active=0 WHERE id='" + name + "';")) { +// return ChatUtils.success("Ended season ") +// .append(Component.text(name, NamedTextColor.DARK_AQUA)); +// } else { +// return ChatUtils.success("An error occurred while starting the season, please contact a server admin."); +// } +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java index 83a2027e..8736b2db 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Exp.java @@ -1,44 +1,44 @@ -package net.bteuk.network.commands.staff; - -import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.Network; -import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.progression.Progression; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class Exp extends AbstractCommand { - - @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { - - // Check if sender is player, then check permissions - CommandSender sender = stack.getSender(); - if (sender instanceof Player) { - if (!hasPermission(sender, "uknet.exp")) { - return; - } - } - - if (args.length < 3) { - return; - } - - if (args[0].equals("give")) { - String uuid = - Network.getInstance().getGlobalSQL() - .getString("SELECT uuid FROM player_data WHERE name='" + args[1] + "';"); - if (uuid == null) { - sender.sendMessage(ChatUtils.error("Player " + args[1] + " could not be found.")); - } else { - try { - int val = Integer.parseInt(args[2]); - Progression.addExp(uuid, val); - } catch (NumberFormatException ignored) { - } - } - } - } -} +// package net.bteuk.network.commands.staff; +// +// import io.papermc.paper.command.brigadier.CommandSourceStack; +// import net.bteuk.network.Network; +// import net.bteuk.network.commands.AbstractCommand; +// import net.bteuk.network.lib.utils.ChatUtils; +// import net.bteuk.network.utils.progression.Progression; +// import org.bukkit.command.CommandSender; +// import org.bukkit.entity.Player; +// import org.jetbrains.annotations.NotNull; +// +// public class Exp extends AbstractCommand { +// +// @Override +// public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { +// +// // Check if sender is player, then check permissions +// CommandSender sender = stack.getSender(); +// if (sender instanceof Player) { +// if (!hasPermission(sender, "uknet.exp")) { +// return; +// } +// } +// +// if (args.length < 3) { +// return; +// } +// +// if (args[0].equals("give")) { +// String uuid = +// Network.getInstance().getGlobalSQL() +// .getString("SELECT uuid FROM player_data WHERE name='" + args[1] + "';"); +// if (uuid == null) { +// sender.sendMessage(ChatUtils.error("Player " + args[1] + " could not be found.")); +// } else { +// try { +// int val = Integer.parseInt(args[2]); +// Progression.addExp(uuid, val); +// } catch (NumberFormatException ignored) { +// } +// } +// } +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index d2885efc..44ff58de 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -1,21 +1,43 @@ package net.bteuk.network.eventing.events; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.api.ChatAPI; +import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.navigation.Back; +import net.bteuk.network.commands.navigation.Tpll; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Event; +import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.regions.RegionEvent; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import static net.bteuk.network.utils.Constants.SERVER_NAME; +import java.util.HashMap; -public class EventManager extends AbstractEvent implements EventAPI { +@Log +public class EventManager implements EventAPI, Event { + private final HashMap events = new HashMap<>(); private final GlobalSQL globalSQL; + private final Constants constants; + private final Back back; - public EventManager(GlobalSQL globalSQL) { + public EventManager(GlobalSQL globalSQL, Constants constants, Back back, PlotAPI plotAPI, RegionManager regionManager, ServerAPI serverAPI, Tpll tpll, Lobby lobby, ChatAPI chat, CoordinateAPI coordinateAPI) { this.globalSQL = globalSQL; + this.constants = constants; + this.back = back; + + // Register all the events. + events.put("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); + events.put("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, this, tpll, lobby)); + events.put("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); + events.put("kick", new KickEvent()); } public void createJoinEvent(String uuid, String type, String event) { @@ -24,16 +46,16 @@ public void createJoinEvent(String uuid, String type, String event) { } public void createJoinEvent(String uuid, String type, String event, String message) { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + - "UPDATE type='" + type + "', event='" + event + "', message='" + message + "';"); + globalSQL.update( + "INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE " + + "type='" + type + "', event='" + event + "', message='" + message + "';"); } public void createJoinEvent(String uuid, String type, String event, Component message) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); - Network.getInstance().getGlobalSQL() - .update("INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + - "UPDATE type='" + type + "', event='" + event + "', message='" + messageString + "';"); + globalSQL.update( + "INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE " + + "type='" + type + "', event='" + event + "', message='" + messageString + "';"); } /** @@ -47,10 +69,9 @@ public void createJoinEvent(String uuid, String type, String event, Component me */ public void createEvent(String uuid, String type, String server, String event) { if (uuid == null) { - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(type,server,event) " + "VALUES('" + type + "','" + server + "','" + event + "');"); + globalSQL.update("INSERT INTO server_events(type,server,event) " + "VALUES('" + type + "','" + server + "','" + event + "');"); } else { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO server_events(uuid,type,server,event) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "');"); + globalSQL.update("INSERT INTO server_events(uuid,type,server,event) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "');"); } } @@ -66,12 +87,10 @@ public void createEvent(String uuid, String type, String server, String event) { */ public void createEvent(String uuid, String type, String server, String event, String message) { if (uuid == null) { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + message + "');"); + globalSQL.update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + message + "');"); } else { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + message + - "');"); + globalSQL.update( + "INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + message + "');"); } } @@ -88,48 +107,48 @@ public void createEvent(String uuid, String type, String server, String event, S public void createEvent(String uuid, String type, String server, String event, Component message) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); if (uuid == null) { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + messageString + "');"); + globalSQL.update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + messageString + "');"); } else { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + messageString + "');"); + globalSQL.update( + "INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + messageString + + "');"); } } public void createTeleportEvent(boolean join, String uuid, String type, String event, NetworkLocation previousLocation) { - Back.setPreviousCoordinate(uuid, previousLocation); + back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { createJoinEvent(uuid, type, event); } else { - createEvent(uuid, type, SERVER_NAME, event); + createEvent(uuid, type, constants.serverName(), event); } } public void createTeleportEvent(boolean join, String uuid, String type, String event, String message, NetworkLocation previousLocation) { - Back.setPreviousCoordinate(uuid, previousLocation); + back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { createJoinEvent(uuid, type, event, message); } else { - createEvent(uuid, type, SERVER_NAME, event, message); + createEvent(uuid, type, constants.serverName(), event, message); } } public void createTeleportEvent(boolean join, String uuid, String type, String event, Component message, NetworkLocation previousLocation) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); - Back.setPreviousCoordinate(uuid, previousLocation); + back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { createJoinEvent(uuid, type, event, messageString); } else { - createEvent(uuid, type, SERVER_NAME, event, messageString); + createEvent(uuid, type, constants.serverName(), event, messageString); } } @@ -138,17 +157,15 @@ public void createTeleportEvent(boolean join, String uuid, String type, String e * * @param uuid the uuid of the player to whom this event applies * @param event arguments of the event - * @param message optional message to send to the player after the event has executes successfully + * @param message optional message to send to the player after the event has executed successfully */ @Override public void event(String uuid, String[] event, String message) { - - // Start the execution process by looking at the event message structure. - switch (event[0]) { - case "invite" -> new InviteEvent().event(uuid, event, message); - case "teleport" -> new TeleportEvent().event(uuid, event, message); - case "region" -> new RegionEvent().event(uuid, event, message); - case "kick" -> new KickEvent().event(uuid, event, message); + Event eventType = events.get(event[0]); + if (eventType == null) { + log.warning("Event " + event[0] + " is not registered."); + } else { + eventType.event(uuid, event, message); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java index 78de5881..57bfca00 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java @@ -1,10 +1,11 @@ package net.bteuk.network.eventing.events; -import net.bteuk.network.Network; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.core.Event; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.regions.Region; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; @@ -13,7 +14,17 @@ import java.util.UUID; -public class InviteEvent extends AbstractEvent { +public class InviteEvent implements Event { + + private final SQLAPI globalSQL; + private final PlotAPI plotAPI; + private final RegionManager regionManager; + + public InviteEvent(SQLAPI globalSQL, PlotAPI plotAPI, RegionManager regionManager) { + this.globalSQL = globalSQL; + this.plotAPI = plotAPI; + this.regionManager = regionManager; + } @Override public void event(String uuid, String[] event, String sMessage) { @@ -27,21 +38,13 @@ public void event(String uuid, String[] event, String sMessage) { // Send the player a message telling them the command to join the plot. if (p != null) { - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); - int id = Integer.parseInt(event[2]); - p.sendMessage(ChatUtils.success("You have been invited to plot ") - .append(Component.text(event[2], NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" by ")) - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + - plotSQL.getString("SELECT owner FROM plot_invites WHERE id=" + id + ";") + "';"), - NamedTextColor.DARK_AQUA))); + p.sendMessage(ChatUtils.success("You have been invited to plot ").append(Component.text(event[2], NamedTextColor.DARK_AQUA)).append(ChatUtils.success(" by ")) + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + plotAPI.getPlotOwner(id) + "';"), NamedTextColor.DARK_AQUA))); Component message = ChatUtils.success("To join the plot click here!"); - message = message.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/plot join " + event[2])); + message = message.clickEvent(ClickEvent.runCommand("/plot join " + event[2])); p.sendMessage(message); } } @@ -52,47 +55,31 @@ public void event(String uuid, String[] event, String sMessage) { // Send the player a message telling them the command to join the plot. if (p != null) { - - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); - int id = Integer.parseInt(event[2]); - p.sendMessage(ChatUtils.success("You have been invited to zone ") - .append(Component.text(event[2], NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" by ")) - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + - plotSQL.getString("SELECT owner FROM zone_invites WHERE id=" + id + ";") + "';"), - NamedTextColor.DARK_AQUA))); + p.sendMessage(ChatUtils.success("You have been invited to zone ").append(Component.text(event[2], NamedTextColor.DARK_AQUA)).append(ChatUtils.success(" by ")) + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + plotAPI.getZoneOwner(id) + "';"), NamedTextColor.DARK_AQUA))); Component message = ChatUtils.success("To join the zone click here!"); - message = message.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/zone join " + event[2])); + message = message.clickEvent(ClickEvent.runCommand("/zone join " + event[2])); p.sendMessage(message); } } case "region" -> { - // Get player. Player p = Bukkit.getPlayer(UUID.fromString(uuid)); // Send the player a message telling them the command to join the plot. if (p != null) { - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - Region region = Network.getInstance().getRegionManager().getRegion(event[2]); + Region region = regionManager.getRegion(event[2]); - p.sendMessage(ChatUtils.success("You have been invited to region ") - .append(Component.text(event[2], NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" by ")) - .append(Component.text( - globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + region.getOwner() + "';"), + p.sendMessage(ChatUtils.success("You have been invited to region ").append(Component.text(event[2], NamedTextColor.DARK_AQUA)).append(ChatUtils.success(" by ")) + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + regionManager.getOwner(region) + "';"), NamedTextColor.DARK_AQUA))); Component message = ChatUtils.success("To join the region click here!"); - message = message.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, - "/region join " + event[2])); + message = message.clickEvent(ClickEvent.runCommand("/region join " + event[2])); p.sendMessage(message); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java index 9f482c50..4cac1204 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java @@ -1,17 +1,18 @@ package net.bteuk.network.eventing.events; +import lombok.extern.java.Log; +import net.bteuk.network.core.Event; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import static net.bteuk.network.utils.Constants.LOGGER; - /** * Event for kicking players from the server *

* A kick event does not have any additional arguments, but should include a message. */ -public class KickEvent extends AbstractEvent { +@Log +public class KickEvent implements Event { @Override public void event(String uuid, String[] args, String message) { @@ -33,6 +34,6 @@ public void event(String uuid, String[] args, String message) { } // If the player could not be found log it in the console. - LOGGER.warning("Attempted to kick player with uuid " + uuid + " but they could not be found on this server!"); + log.warning("Attempted to kick player with uuid " + uuid + " but they could not be found on this server!"); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java deleted file mode 100644 index bf18ab4c..00000000 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/RegionEvent.java +++ /dev/null @@ -1,142 +0,0 @@ -package net.bteuk.network.eventing.events; - -import net.bteuk.network.Network; -import net.bteuk.network.lib.dto.DirectMessage; -import net.bteuk.network.lib.enums.ChatChannels; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.regions.Region; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import org.bukkit.Location; - -public class RegionEvent extends AbstractEvent { - - @Override - public void event(String uuid, String[] event, String eMessage) { - - Region region; - - switch (event[1]) { - case "set" -> { - - // Get region. - region = Network.getInstance().getRegionManager().getRegion(event[3]); - - // If the region is not in the database add it. - region.addToPlotsystem(); - if (event[2].equals("plotsystem")) { - - // If region is not already set to plotsystem. - if (!(region.status() == RegionStatus.PLOT)) { - - // Set region to plotsystem. - // This will kick any members. - region.setPlot(); - } - } else if (event[2].equals("default")) { - - // If region is not already set to default. - if (!(region.status() == RegionStatus.DEFAULT)) { - - // Set region to default. - region.setDefault(); - } - } - } - case "request" -> { - if (event[2].equals("accept")) { - - // If length is 4 then no user is specified, this implies that it should accept all requests for - // the region, rather than a specific request. - region = Network.getInstance().getRegionManager().getRegion(event[3]); - if (event.length == 4) { - - region.acceptRequests(); - } else { - - // The 5th argument specifies the uuid of the player who created the request. - - region.acceptRequest(event[4]); - - // Send feedback to user who accepted the request. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, - "server", - ChatUtils.success("Accepted region request for %s in the region %s.", - Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data " + - "WHERE uuid='" + event[4] + "';"), event[3]), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - } else if (event[2].equals("deny")) { - - region = Network.getInstance().getRegionManager().getRegion(event[3]); - - region.denyRequest(event[4]); - - // Send feedback to user who denied the request. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, - "server", - ChatUtils.success("Denied region request for %s in the region %s.", - Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data " + - "WHERE uuid='" + event[4] + "';"), event[3]), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - } - case "leave" -> { - - // Get region. - region = Network.getInstance().getRegionManager().getRegion(event[2]); - - // Leave region. - region.leaveRegion(uuid, LegacyComponentSerializer.legacyAmpersand().deserialize(eMessage)); - - // If the region has members after you've left but no owner. - // Find the most recent member and make them owner. - if (region.hasMember() && !region.hasOwner()) { - - String member = region.getRecentMember(); - - region.makeOwner(member); - - // Send message to member that they are now the owner. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), member, - "server", - ChatUtils.success("Transferred ownership of region %s to you due to the previous owner " + - "leaving the region.", region.getTag(member)), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } else if (!region.hasOwner() && !region.hasMember()) { - - // The region is has no owner and members, set the status to default. - region.setDefault(); - } - } - case "join" -> { - - // Get the region. - region = Network.getInstance().getRegionManager().getRegion(event[2]); - - // Add player to the region. - // Create a copy of the coordinate id that the owner has. - // The reason for a copy rather than using the same copy id is for if the user wants to set a new - // location. - // This then allows us to update the existing coordinate rather than create a new coordinate each - // time this is done. - Location l = - Network.getInstance().getGlobalSQL().getLocation(region.getCoordinateID(region.getOwner())); - int coordinateID = Network.getInstance().getGlobalSQL().addCoordinate(l); - region.joinRegion(uuid, coordinateID); - - // Send message to plot owner. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), - region.getOwner(), "server", - ChatUtils.success("%s has joined the region %s.", - Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data WHERE " + - "uuid='" + uuid + "';"), region.getTag(region.getOwner())), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - } - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java index 0635d9a0..60dc504d 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java @@ -1,11 +1,21 @@ package net.bteuk.network.eventing.events; import io.papermc.lib.PaperLib; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.commands.navigation.Tpll; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Event; +import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.regions.Region; +import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -18,12 +28,31 @@ import java.util.Arrays; import java.util.UUID; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - -public class TeleportEvent extends AbstractEvent { +@Log +public class TeleportEvent implements Event { private final DecimalFormat DECIMAL_FORMATTER = new DecimalFormat("##.#####"); + private final GlobalSQL globalSQL; + private final PlotAPI plotAPI; + private final RegionManager regionManager; + private final Constants constants; + private final ServerAPI serverAPI; + private final EventAPI eventAPI; + private final Tpll tpll; + private final Lobby lobby; + + public TeleportEvent(GlobalSQL globalSQL, PlotAPI plotAPI, RegionManager regionManager, Constants constants, ServerAPI serverAPI, EventAPI eventAPI, Tpll tpll, Lobby lobby) { + this.globalSQL = globalSQL; + this.plotAPI = plotAPI; + this.regionManager = regionManager; + this.constants = constants; + this.serverAPI = serverAPI; + this.eventAPI = eventAPI; + this.tpll = tpll; + this.lobby = lobby; + } + @Override public void event(String uuid, String[] event, String message) { @@ -31,7 +60,7 @@ public void event(String uuid, String[] event, String message) { Player p = Bukkit.getPlayer(UUID.fromString(uuid)); if (p == null) { - Network.getInstance().getLogger().warning("Player is null in teleport event."); + log.warning("Player is null in teleport event."); return; } @@ -45,11 +74,9 @@ public void event(String uuid, String[] event, String message) { p.teleport(player.getLocation()); p.sendMessage(ChatUtils.success("Teleported to ") - .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_AQUA))); + .append(Component.text(globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_AQUA))); } else { - p.sendMessage(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_RED) + p.sendMessage(Component.text(globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not online."))); } } @@ -57,7 +84,7 @@ public void event(String uuid, String[] event, String message) { // Check if the teleport is to a specific coordinate ID. case "coordinateID" -> { - p.teleport(Network.getInstance().getGlobalSQL().getLocation(Integer.parseInt(event[2]))); + p.teleport(globalSQL.getLocation(Integer.parseInt(event[2]))); // Check if a message is set. if (message == null) { @@ -74,78 +101,62 @@ public void event(String uuid, String[] event, String message) { // Get the coordinate id. int coordinate_id; if (event[1].equals("location")) { - coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM location_data" + - " WHERE location='" + location + "';"); + coordinate_id = globalSQL.getInt("SELECT coordinate FROM location_data" + " WHERE location='" + location + "';"); } else { - coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM " + - "location_requests WHERE location='" + location + "';"); + coordinate_id = globalSQL.getInt("SELECT coordinate FROM " + "location_requests WHERE location='" + location + "';"); } - Location l = Network.getInstance().getGlobalSQL().getLocation(coordinate_id); + Location l = globalSQL.getLocation(coordinate_id); - String worldName = Network.getInstance().getGlobalSQL().getString("SELECT world FROM coordinates " + - "WHERE id=" + coordinate_id + ";"); + String worldName = globalSQL.getString("SELECT world FROM coordinates " + "WHERE id=" + coordinate_id + ";"); // Check if world is in plotsystem. - if (Network.getInstance().getPlotSQL() - .hasRow("SELECT name FROM location_data WHERE name='" + worldName + "';")) { + if (plotAPI.hasLocation(worldName)) { // Add coordinate transformation. - l = new Location( - Bukkit.getWorld(worldName), - l.getX() + Network.getInstance().getPlotSQL().getInt("SELECT xTransform FROM " + - "location_data WHERE name='" + worldName + "';"), - l.getY(), - l.getZ() + Network.getInstance().getPlotSQL().getInt("SELECT zTransform FROM " + - "location_data WHERE name='" + worldName + "';"), - l.getYaw(), - l.getPitch() - ); + l = new Location(Bukkit.getWorld(worldName), l.getX() + plotAPI.getXTransform(worldName), l.getY(), l.getZ() + plotAPI.getZTransform(worldName), l.getYaw(), + l.getPitch()); } p.teleport(l); - p.sendMessage(ChatUtils.success("Teleported to ") - .append(Component.text(location, NamedTextColor.DARK_AQUA))); + p.sendMessage(ChatUtils.success("Teleported to ").append(Component.text(location, NamedTextColor.DARK_AQUA))); } case "region" -> { // Get the region. - Region region = Network.getInstance().getRegionManager().getRegion(event[2]); - Location l = Network.getInstance().getGlobalSQL().getLocation(region.getCoordinateID(uuid)); + Region region = regionManager.getRegion(event[2]); + int coordinateId = regionManager.getCoordinateID(region, uuid); + Location l = globalSQL.getLocation(coordinateId); if (l == null) { p.sendMessage(ChatUtils.error("An error occurred while fetching the location to teleport.")); - Network.getInstance().getLogger() - .warning("Location is null for coodinate id " + region.getCoordinateID(uuid)); + log.warning("Location is null for coordinate id " + coordinateId); return; } // Teleport player. p.teleport(l); - p.sendMessage(ChatUtils.success("Teleported to region ") - .append(Component.text(region.getTag(uuid), NamedTextColor.DARK_AQUA))); + p.sendMessage(ChatUtils.success("Teleported to region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA))); } case "server" -> // Switch to server. - SwitchServer.switchServer(p, event[2]); + serverAPI.switchServer(PlayerAdapter.adapt(p), event[2]); case "spawn" -> { // If server is Lobby, teleport to spawn. - if (SERVER_TYPE == ServerType.LOBBY) { - p.teleport(Network.getInstance().getLobby().spawn); + if (constants.serverType() == ServerType.LOBBY) { + p.teleport(lobby.getSpawn()); p.sendMessage(ChatUtils.success("Teleported to spawn.")); } else { // Set teleport event to go to spawn. - EventManager.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport spawn", - p.getLocation()); - SwitchServer.switchServer(p, Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "server_data WHERE type='LOBBY';")); + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport spawn", LocationAdapter.adapt(p.getLocation())); + serverAPI.switchServer(PlayerAdapter.adapt(p), globalSQL.getString("SELECT name FROM " + "server_data WHERE type='LOBBY';")); } } // Tpll command format. - case "tpll" -> Network.getInstance().getTpll().tpll(p, Arrays.copyOfRange(event, 2, event.length), true); + case "tpll" -> tpll.tpll(p, Arrays.copyOfRange(event, 2, event.length), true); default -> { @@ -203,11 +214,8 @@ public void event(String uuid, String[] event, String message) { // If custom message is set, send that to player, else send default message. if (message == null) { - p.sendMessage(ChatUtils.success("Teleported to ") - .append(Component.text(DECIMAL_FORMATTER.format(x), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", ")) - .append(Component.text(y, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", ")) + p.sendMessage(ChatUtils.success("Teleported to ").append(Component.text(DECIMAL_FORMATTER.format(x), NamedTextColor.DARK_AQUA)).append(ChatUtils.success(", ")) + .append(Component.text(y, NamedTextColor.DARK_AQUA)).append(ChatUtils.success(", ")) .append(Component.text(DECIMAL_FORMATTER.format(z), NamedTextColor.DARK_AQUA))); } else { p.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(message)); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/Gui.java b/Plugin/src/main/java/net/bteuk/network/gui/Gui.java index 1d6ccb9f..b1f7888c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/Gui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/Gui.java @@ -13,8 +13,6 @@ import java.util.Map; import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; - @Getter public abstract class Gui implements GuiInterface { @@ -73,11 +71,8 @@ public void clearGui() { } public void open(NetworkUser u) { - u.player.openInventory(inv); openInventories.put(u.player.getUniqueId(), getUuid()); - - LOGGER.info("Total gui's = " + inventoriesByUUID.size()); } public void delete() { diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index b37641a0..7c77d7f9 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -68,18 +68,21 @@ public ArrayList getEvents(String serverName, String type, ArrayList tipsMap; + private HashMap tipsMap; /** * Load the tips from the text files in the tips folder, if any exist. * If no files exist in the directory don't load tips. */ - public Tips() { + public Tips(Network instance, Constants constants) { // Create the directory if not exists. - File file = new File(Network.getInstance().getDataFolder() + "/tips"); + File file = new File(instance.getDataFolder() + "/tips"); if (!file.exists()) { if (file.mkdir()) { - // Add example file. + // Add an example file. try { - FileUtils.copyToFile(Objects.requireNonNull(Network.getInstance().getResource("tips-example.txt")), + FileUtils.copyToFile(Objects.requireNonNull(instance.getResource("tips-example.txt")), new File(file + "/tips-example.txt")); - LOGGER.info("Created tips directory and added example file."); + log.info("Created tips directory and added example file."); } catch (IOException | NullPointerException e) { - e.printStackTrace(); + log.severe("An error occurred while creating the tips directory and example file: " + e.getLocalizedMessage()); } } } else { @@ -72,7 +71,7 @@ public Tips() { tipsMap.put(txtFile.getName().replace(".txt", ""), new TipsList(lines)); } } catch (IOException e) { - e.printStackTrace(); + log.severe("An error occurred while loading the tips file " + txtFile.getName() + ": " + e.getLocalizedMessage()); } } @@ -80,18 +79,18 @@ public Tips() { if (!tipsMap.isEmpty()) { // Get interval. - long frequency = CONFIG.getInt("chat.tips.frequency") * 60L * 20L; + long frequency = constants.tipsFrequency() * 60L * 20L; - Bukkit.getScheduler().scheduleSyncRepeatingTask(Network.getInstance(), () -> { + instance.getTimerAPI().registerTimer(() -> { // For all online players see if their builder role has tips, if true send them the current tip. - for (NetworkUser user : Network.getInstance().getUsers()) { + for (NetworkUser user : instance.getUsers()) { // Check if the user has tips enabled. if (user.isTipsEnabled()) { // Get builder role from database. - String role = Network.getInstance().getGlobalSQL().getString("SELECT builder_role " + + String role = instance.getGlobalSQL().getString("SELECT builder_role " + "FROM player_data WHERE uuid='" + user.player.getUniqueId() + "';"); if (tipsMap.containsKey(role)) { @@ -102,9 +101,9 @@ public Tips() { // Increment the counter on all TipsLists tipsMap.values().forEach(TipsList::increment); - }, 2400L, frequency); + }, frequency, 2400L); - LOGGER.info("Enabled tips timer!"); + log.info("Enabled tips timer!"); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java b/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java index ce587726..fc06416d 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/progression/Progression.java @@ -1,101 +1,97 @@ -package net.bteuk.network.utils.progression; - -import net.bteuk.network.Network; -import net.bteuk.network.lib.dto.ChatMessage; -import net.bteuk.network.lib.enums.ChatChannels; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.NetworkUser; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; - -import static net.bteuk.network.utils.Constants.ANNOUNCE_OVERALL_LEVELUPS; -import static net.bteuk.network.utils.Constants.ANNOUNCE_SEASONAL_LEVELUPS; -import static net.bteuk.network.utils.Constants.PROGRESSION; - -public class Progression { - - /** - * Add exp for the player to all active seasons. If the player levels up, this will be processed and announced. - * - * @param uuid the uuid of the player - * @param exp the amount of exp to add - */ - public static void addExp(String uuid, int exp) { - - // If progression is disabled, cancel. - if (!PROGRESSION) { - return; - } - - // Add exp for the overall progression. - addExp("default", uuid, exp, ANNOUNCE_OVERALL_LEVELUPS); - - // Add exp for the active season, if it exists. There can only be 1 active season at a time. - // Don't use the default season, this is always active. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE active=1 and id<>'default'")) { - addExp(Network.getInstance().getGlobalSQL().getString("SELECT id FROM seasons WHERE active=1 and " + - "id<>'default'"), uuid, exp, ANNOUNCE_SEASONAL_LEVELUPS); - } - } - - /** - * Add exp for the player to a specific season. If the player levels up, this will be processed and announced. - * - * @param season the season to add the exp to. - * @param uuid the uuid of the player - * @param exp the amount of exp to add - * @param announce_levelups whether level-ups should be announced - */ - private static void addExp(String season, String uuid, int exp, boolean announce_levelups) { - - Level.addPlayerIfNotExists(season, uuid); - - int currentExp = exp + Level.getExp(season, uuid); - int currentLevel = Level.getLevel(season, uuid); - - while (Level.reachedNextLevel(currentLevel, currentExp)) { - - // Increase level. - currentLevel++; - levelUp(season, uuid, currentLevel, announce_levelups); - - // Get remainig exp. - currentExp = Level.getLeftoverExp(currentLevel, currentExp); - } - - // Set exp. - Level.setExp(season, uuid, currentExp); - } - - private static void levelUp(String season, String uuid, int level, boolean announce_levelup) { - - Level.setLevel(season, uuid, level); - - Component playerMessage = ChatUtils.success("You have reached level ") - .append(Component.text(level, NamedTextColor.DARK_AQUA)); - - Component globalMessage = Component.text(NetworkUser.getName(uuid), NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" has reached level ") - .append(Component.text(level, NamedTextColor.DARK_AQUA))); - - if (!season.equals("default")) { - - playerMessage = playerMessage.append(ChatUtils.success(" in season ") - .append(Component.text(season, NamedTextColor.DARK_AQUA))); - - globalMessage = globalMessage.append(ChatUtils.success(" in season ") - .append(Component.text(season, NamedTextColor.DARK_AQUA))); - } - - // Announce the levelup if enabled. - if (announce_levelup) { - - // Announce level-up. - ChatMessage chatMessage = new ChatMessage(ChatChannels.GLOBAL.getChannelName(), "server", globalMessage); - Network.getInstance().getChat().sendSocketMessage(chatMessage); - } - - // Send a message to the player. - NetworkUser.sendOfflineMessage(uuid, playerMessage); - } -} +// package net.bteuk.network.utils.progression; +// +// import net.bteuk.network.Network; +// import net.bteuk.network.lib.dto.ChatMessage; +// import net.bteuk.network.lib.enums.ChatChannels; +// import net.bteuk.network.lib.utils.ChatUtils; +// import net.bteuk.network.utils.NetworkUser; +// import net.kyori.adventure.text.Component; +// import net.kyori.adventure.text.format.NamedTextColor; +// +// public class Progression { +// +// /** +// * Add exp for the player to all active seasons. If the player levels up, this will be processed and announced. +// * +// * @param uuid the uuid of the player +// * @param exp the amount of exp to add +// */ +// public static void addExp(String uuid, int exp) { +// +// // If progression is disabled, cancel. +// if (!PROGRESSION) { +// return; +// } +// +// // Add exp for the overall progression. +// addExp("default", uuid, exp, ANNOUNCE_OVERALL_LEVELUPS); +// +// // Add exp for the active season, if it exists. There can only be 1 active season at a time. +// // Don't use the default season, this is always active. +// if (Network.getInstance().getGlobalSQL().hasRow("SELECT id FROM seasons WHERE active=1 and id<>'default'")) { +// addExp(Network.getInstance().getGlobalSQL().getString("SELECT id FROM seasons WHERE active=1 and " + +// "id<>'default'"), uuid, exp, ANNOUNCE_SEASONAL_LEVELUPS); +// } +// } +// +// /** +// * Add exp for the player to a specific season. If the player levels up, this will be processed and announced. +// * +// * @param season the season to add the exp to. +// * @param uuid the uuid of the player +// * @param exp the amount of exp to add +// * @param announce_levelups whether level-ups should be announced +// */ +// private static void addExp(String season, String uuid, int exp, boolean announce_levelups) { +// +// Level.addPlayerIfNotExists(season, uuid); +// +// int currentExp = exp + Level.getExp(season, uuid); +// int currentLevel = Level.getLevel(season, uuid); +// +// while (Level.reachedNextLevel(currentLevel, currentExp)) { +// +// // Increase level. +// currentLevel++; +// levelUp(season, uuid, currentLevel, announce_levelups); +// +// // Get remainig exp. +// currentExp = Level.getLeftoverExp(currentLevel, currentExp); +// } +// +// // Set exp. +// Level.setExp(season, uuid, currentExp); +// } +// +// private static void levelUp(String season, String uuid, int level, boolean announce_levelup) { +// +// Level.setLevel(season, uuid, level); +// +// Component playerMessage = ChatUtils.success("You have reached level ") +// .append(Component.text(level, NamedTextColor.DARK_AQUA)); +// +// Component globalMessage = Component.text(NetworkUser.getName(uuid), NamedTextColor.DARK_AQUA) +// .append(ChatUtils.success(" has reached level ") +// .append(Component.text(level, NamedTextColor.DARK_AQUA))); +// +// if (!season.equals("default")) { +// +// playerMessage = playerMessage.append(ChatUtils.success(" in season ") +// .append(Component.text(season, NamedTextColor.DARK_AQUA))); +// +// globalMessage = globalMessage.append(ChatUtils.success(" in season ") +// .append(Component.text(season, NamedTextColor.DARK_AQUA))); +// } +// +// // Announce the levelup if enabled. +// if (announce_levelup) { +// +// // Announce level-up. +// ChatMessage chatMessage = new ChatMessage(ChatChannels.GLOBAL.getChannelName(), "server", globalMessage); +// Network.getInstance().getChat().sendSocketMessage(chatMessage); +// } +// +// // Send a message to the player. +// NetworkUser.sendOfflineMessage(uuid, playerMessage); +// } +// } diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 27e00e79..508d6d72 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -1,29 +1,29 @@ -# Config version, do not update this manually as it could break the config. +# Config version; do not update this manually as it could break the config. version: 1.8.0 -#MySQL is mandatory for this plugin. -#Login information +# MySQL is mandatory for this plugin. +# Login information host: localhost port: 3306 username: root password: password -#Database names (doesn't require adjusting) +# Database names (doesn't require adjusting) database: global: uknet_global plot: uknet_plots region: uknet_regions -#Server configuration -#Server types: PLOT, EARTH, LOBBY, TUTORIAL -#If you are running this server standalone, then keep this as 'EARTH'. -#Standalone implies that this is the only server in your network. +# Server configuration +# Server types: PLOT, EARTH, LOBBY, TUTORIAL +# If you are running this server standalone, then keep this as 'EARTH'. +# Standalone implies that this is the only server in your network. enabled: false server_name: server_name server_type: EARTH standalone: false -#Lobby info, only necessary if server type is LOBBY. +# Lobby info, only necessary if server type is LOBBY. spawn: world: Lobby x: 1000.5 @@ -44,15 +44,15 @@ map: yaw: 90 pitch: 0 -#Staff features +# Staff features staff: chat: enabled: true moderation: enabled: true -#Tutorials -#Enable if your network contains a server with TeachingTutorials setup. +# Tutorials +# Enable if your network contains a server with TeachingTutorials setup. tutorials: enabled: false compulsory_tutorial: true @@ -63,8 +63,8 @@ tutorials: password: password name: TeachingTutorials -#Progress Map -#Enable if you have a MapHub progress map +# Progress Map +# Enable if you have a MapHub progress map ProgressMap: enabled: false MapHubAPIKey: insert_api_key_here @@ -72,10 +72,10 @@ ProgressMap: #A web link to the progress map Link: insert_link_to_map_here -#Chat Settings +# Chat Settings chat: - #The socket configuration is only necessary if running the server as part of a network - #Else, it will be ignored (if standalone=true) + # The socket configuration is only necessary if running the server as part of a network + # Else, it will be ignored (if standalone=true) socket: input: port: 30590 @@ -83,76 +83,76 @@ chat: IP: localhost port: 30589 - #Whether to announce role promotions in chat. + # Whether to announce role promotions in chat. announce_promotions: true - #Tips in chat - #Whether to enable tips in chat and at what frequency they should display. - #Adding messages can be done in files in the 'tips' folder. One file for each builder role you want to display it to. - #Frequency is in minutes. + # Tips in chat + # Whether to enable tips in chat and at what frequency they should display. + # Adding messages can be done in files in the 'tips' folder. One file for each builder role you want to display it to. + # Frequency is in minutes. tips: enabled: true frequency: 5 -#Tpll config. -#The min and max y are for searching altitude for teleport, set it to the same value as the world height. +# Tpll config. +# The min and max y are for searching altitude for teleport, set it to the same value as the world height. tpll: enabled: true requires_permission: false min_y: -128 max_y: 1360 -#Enable regions and cross-server teleport. -#Regions must be enabled for cross-server teleport to function (if standalone=false). -#Earth world must be specified on all servers as it is used to determine cross-server tpll to the earth server. -#To make sure the player is teleported to the correct world. +# Enable regions and cross-server teleport. +# Regions must be enabled for cross-server teleport to function (if standalone=false). +# Earth world must be specified on all servers as it is used to determine cross-server tpll to the earth server. +# To make sure the player is teleported to the correct world. regions: enabled: true earth_world: earth - #Number of days a region owner can be inactive before they are demoted to member. - #If the region has no other members, then the owner does not get demoted by the region becomes 'inactive'. + # Number of days a region owner can be inactive before they are demoted to member. + # If the region has no other members, then the owner does not get demoted by the region becomes 'inactive'. inactivity_days: 30 - #When staff approval is needed for Jr.Builder region requests. - #These values are only relevant if regions are enabled. - #Always means that staff approval is always required. - #Radius is the square radius around the region that is checked when determining whether staff approval is necessary. - #If someone else owns a region in this radius, staff approval will be needed. - #If you want to disable this entirely, set the radius to 0. + # When staff approval is needed for Jr.Builder region requests. + # These values are only relevant if regions are enabled. + # Always means that staff approval is always required. + # Radius is the square radius around the region that is checked when determining whether staff approval is necessary. + # If someone else owns a region in this radius, staff approval will be needed. + # If you want to disable this entirely, set the radius to 0. staff_request: always: false radius: 5 -#Whether the server network has a plot system server. +# Whether the server network has a plot system server. plot_system_enabled: true -#Should /ll be enabled. +# Should /ll be enabled. ll_enabled: true -#Time before the player is set to AFK (minutes). +# Time before the player is set to AFK (minutes). afk: 5 -#Radius to search in the nearby locations tab of the exploration menu, distance in kilometres. -navigation_radius: 200 - -#Discord link +# Discord link discord: 'https://discord.gg/5m56EgEVW6' -#Enables warps and the explore-menu. +# Enables warps and the explore-menu. warps_enabled: true -#Homes (personal warps) +# Radius to search in the nearby locations tab of the exploration menu, distance in kilometres. +navigation_radius: 200 + +# Homes (personal warps) homes_enabled: true -#Progression +# Progression (currently disabled progression: enabled: false announce_level-ups: overall: false seasonal: true -# Scoreboard to display in sidebar. +# Scoreboard to display in the sidebar. sidebar: enabled: false title: "BTE Games" diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java new file mode 100644 index 00000000..eaba6550 --- /dev/null +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java @@ -0,0 +1,142 @@ +package net.bteuk.network.regions; + +import net.bteuk.network.api.ChatAPI; +import net.bteuk.network.api.CoordinateAPI; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.core.Event; +import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.enums.ChatChannels; +import net.bteuk.network.lib.utils.ChatUtils; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +public class RegionEvent implements Event { + + private final RegionManager regionManager; + private final ChatAPI chatAPI; + private final SQLAPI globalSQL; + private final CoordinateAPI coordinateAPI; + + public RegionEvent(RegionManager regionManager, ChatAPI chatAPI, SQLAPI globalSQL, CoordinateAPI coordinateAPI) { + this.regionManager = regionManager; + this.chatAPI = chatAPI; + this.globalSQL = globalSQL; + this.coordinateAPI = coordinateAPI; + } + + @Override + public void event(String uuid, String[] event, String eMessage) { + + Region region; + + switch (event[1]) { + case "set" -> { + + // Get region. + region = regionManager.getRegion(event[3]); + + // If the region is not in the database, add it. + regionManager.addToPlotsystem(region); + if (event[2].equals("plotsystem")) { + + // If region is not already set to plotsystem. + if (!(regionManager.status(region) == RegionStatus.PLOT)) { + + // Set region to plotsystem. + // This will kick any members. + regionManager.setPlot(region, chatAPI); + } + } else if (event[2].equals("default")) { + + // If region is not already set to default. + if (!(regionManager.status(region) == RegionStatus.DEFAULT)) { + + // Set region to default. + regionManager.setDefault(region); + } + } + } + case "request" -> { + if (event[2].equals("accept")) { + + // If length is 4, then no user is specified; this implies that it should accept all requests for + // the region, rather than a specific request. + region = regionManager.getRegion(event[3]); + if (event.length == 4) { + + regionManager.acceptRequests(region); + } else { + + // The 5th argument specifies the uuid of the player who created the request. + + regionManager.acceptRequest(region, event[4]); + + // Send feedback to the user who accepted the request. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("Accepted region request for %s in the region %s.", + globalSQL.getString("SELECT name FROM player_data " + "WHERE uuid='" + event[4] + "';"), event[3]), true); + chatAPI.sendDirectMessage(directMessage); + } + } else if (event[2].equals("deny")) { + + region = regionManager.getRegion(event[3]); + + regionManager.denyRequest(region, event[4]); + + // Send feedback to the user who denied the request. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("Denied region request for %s in the region %s.", + globalSQL.getString("SELECT name FROM player_data " + "WHERE uuid='" + event[4] + "';"), event[3]), true); + chatAPI.sendDirectMessage(directMessage); + } + } + case "leave" -> { + + // Get region. + region = regionManager.getRegion(event[2]); + + // Leave region. + regionManager.leaveRegion(region, uuid, LegacyComponentSerializer.legacyAmpersand().deserialize(eMessage)); + + // If the region has members after you've left but no owner. + // Find the most recent member and make them owner. + if (regionManager.hasMember(region) && !regionManager.hasOwner(region)) { + + String member = regionManager.getRecentMember(region); + + regionManager.makeOwner(region, member); + + // Send a message to member that they are now the owner. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), member, "server", + ChatUtils.success("Transferred ownership of region %s to you due to the previous owner " + "leaving the region.", regionManager.getTag(region, member)), + true); + chatAPI.sendDirectMessage(directMessage); + } else if (!regionManager.hasOwner(region) && !regionManager.hasMember(region)) { + + // The region is has no owner and members, set the status to default. + regionManager.setDefault(region); + } + } + case "join" -> { + + // Get the region. + region = regionManager.getRegion(event[2]); + + // Add player to the region. + // Create a copy of the coordinate id that the owner has. + // The reason for a copy rather than using the same copy id is for if the user wants to set a new + // location. + // This then allows us to update the existing coordinate rather than create a new coordinate each + // time this is done. + int originalCoordinateID = regionManager.getCoordinateID(region, regionManager.getOwner(region)); + int coordinateID = coordinateAPI.copyCoordinate(originalCoordinateID); + regionManager.joinRegion(uuid, coordinateID == -1 ? originalCoordinateID, coordinateID); + + // Send a message to the plot owner. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), regionManager.getOwner(region), "server", + ChatUtils.success("%s has joined the region %s.", globalSQL.getString("SELECT name FROM player_data WHERE " + "uuid='" + uuid + "';"), + regionManager.getTag(region, regionManager.getOwner(region))), true); + chatAPI.sendDirectMessage(directMessage); + } + } + } +} From c401f3f21af0d1353bf1b2928634c0dd68da1c1d Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 27 Aug 2025 23:32:02 +0200 Subject: [PATCH 12/96] Started gui migration, added BTEUKLIB as gui manager. --- Plugin/pom.xml | 5 + .../main/java/net/bteuk/network/Network.java | 37 +- .../net/bteuk/network/commands/Navigator.java | 15 +- .../java/net/bteuk/network/commands/Plot.java | 4 +- .../commands/navigation/Navigation.java | 4 +- .../bteuk/network/commands/staff/Staff.java | 4 +- .../network/eventing/events/EventManager.java | 29 +- .../network/eventing/listeners/Connect.java | 1 - .../eventing/listeners/GuiListener.java | 83 --- .../navigation/LocationNameListener.java | 8 +- .../listeners/navigation/LocationSearch.java | 2 +- .../FeatureGeometryEditorListener.java | 1 - .../staff/ModerationReasonListener.java | 2 +- .../java/net/bteuk/network/gui/BuildGui.java | 671 ++++++++---------- .../main/java/net/bteuk/network/gui/Gui.java | 88 --- .../net/bteuk/network/gui/InviteMembers.java | 6 +- .../net/bteuk/network/gui/NavigatorGui.java | 42 +- .../net/bteuk/network/gui/NetworkGui.java | 34 + .../bteuk/network/gui/NetworkGuiAction.java | 8 + .../network/gui/NetworkRefreshableGui.java | 35 + ...{GuiInterface.java => RefreshableGui.java} | 2 +- .../main/java/net/bteuk/network/gui/Shop.java | 100 +-- .../java/net/bteuk/network/gui/UtilsGui.java | 90 +-- .../network/gui/navigation/AddLocation.java | 240 +++---- .../network/gui/navigation/ExploreGui.java | 16 +- .../network/gui/navigation/LocationMenu.java | 11 +- .../gui/navigation/SelectSubcategory.java | 16 +- .../gui/plotsystem/AcceptedPlotMenu.java | 9 +- .../network/gui/plotsystem/CloseConfirm.java | 5 +- .../network/gui/plotsystem/DeleteConfirm.java | 5 +- .../gui/plotsystem/DeniedPlotFeedback.java | 5 +- .../network/gui/plotsystem/FilterMenu.java | 11 +- .../network/gui/plotsystem/PlotInfo.java | 49 +- .../network/gui/plotsystem/PlotMenu.java | 20 +- .../gui/plotsystem/PlotServerLocations.java | 6 +- .../gui/plotsystem/PlotsystemLocations.java | 10 +- .../gui/plotsystem/PlotsystemMembers.java | 9 +- .../gui/plotsystem/VerificationInfo.java | 15 +- .../gui/plotsystem/VerificationMenu.java | 9 +- .../network/gui/plotsystem/ZoneInfo.java | 31 +- .../network/gui/plotsystem/ZoneMenu.java | 14 +- .../gui/progressmap/ColourPickerGUI.java | 47 +- .../gui/progressmap/FeaturePageGUI.java | 21 +- .../gui/progressmap/LocalFeatureListGUI.java | 9 +- .../bteuk/network/gui/regions/RegionInfo.java | 32 +- .../network/gui/regions/RegionMembers.java | 9 +- .../bteuk/network/gui/regions/RegionMenu.java | 17 +- .../gui/regions/RegionRequestMenu.java | 7 +- .../gui/regions/ReviewRegionRequest.java | 13 +- .../gui/regions/ReviewRegionRequests.java | 11 +- .../bteuk/network/gui/staff/KickMembers.java | 3 +- .../network/gui/staff/LocationRequests.java | 7 +- .../bteuk/network/gui/staff/ManageRegion.java | 23 +- .../gui/staff/ModerationActionGui.java | 15 +- .../network/gui/staff/ModerationGui.java | 15 +- .../bteuk/network/gui/staff/SelectUser.java | 7 +- .../net/bteuk/network/gui/staff/StaffGui.java | 15 +- .../network/gui/staff/TransferOwner.java | 3 +- .../tutorials/LessonContinueConfirmer.java | 1 - .../network/gui/tutorials/LessonsMenu.java | 1 - .../gui/tutorials/RecommendationAddGui.java | 11 +- .../tutorials/RecommendedTutorialsGui.java | 5 +- .../tutorials/RecommendedTutorialsMenu.java | 1 - .../gui/tutorials/TutorialLibraryGui.java | 3 +- .../network/gui/tutorials/TutorialsGui.java | 4 +- .../java/net/bteuk/network/lobby/Map.java | 2 +- .../net/bteuk/network/utils/LightsOut.java | 4 +- .../net/bteuk/network/utils/NetworkUser.java | 5 +- .../TextEditorBookListener.java | 1 - .../bteuk/network/regions/RegionEvent.java | 2 +- pom.xml | 8 + 71 files changed, 897 insertions(+), 1157 deletions(-) delete mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java delete mode 100644 Plugin/src/main/java/net/bteuk/network/gui/Gui.java create mode 100644 Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java create mode 100644 Plugin/src/main/java/net/bteuk/network/gui/NetworkGuiAction.java create mode 100644 Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java rename Plugin/src/main/java/net/bteuk/network/gui/{GuiInterface.java => RefreshableGui.java} (82%) diff --git a/Plugin/pom.xml b/Plugin/pom.xml index b25e1711..7d5f9533 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -133,6 +133,11 @@ regions + + com.github.BTEUK.BTEUKLib + Minecraft + + io.papermc.paper diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 57362d74..ad2b2079 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -2,6 +2,8 @@ import lombok.Getter; import lombok.extern.java.Log; +import net.bteuk.minecraft.gui.GuiListener; +import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.NetworkAPI; import net.bteuk.network.api.PlotAPI; @@ -67,9 +69,11 @@ import net.bteuk.network.core.Time; import net.bteuk.network.core.sql.DatabaseInit; import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.eventing.events.InviteEvent; +import net.bteuk.network.eventing.events.KickEvent; +import net.bteuk.network.eventing.events.TeleportEvent; import net.bteuk.network.eventing.listeners.CommandPreProcess; import net.bteuk.network.eventing.listeners.Connect; -import net.bteuk.network.eventing.listeners.GuiListener; import net.bteuk.network.eventing.listeners.NetworkMoveListener; import net.bteuk.network.eventing.listeners.NetworkTeleportListener; import net.bteuk.network.eventing.listeners.PlayerInteract; @@ -83,6 +87,7 @@ import net.bteuk.network.lobby.Lobby; import net.bteuk.network.lobby.LobbyCommand; import net.bteuk.network.logging.BukkitForwardingHandler; +import net.bteuk.network.regions.RegionEvent; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; @@ -176,7 +181,7 @@ public void onEnable() { base.setLevel(Level.ALL); base.setUseParentHandlers(false); - // Make sure we don’t accumulate multiple handlers across reloads + // Make sure we don't accumulate multiple handlers across reloads for (Handler h : base.getHandlers()) { base.removeHandler(h); } @@ -289,10 +294,12 @@ public void enablePlugin() { networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); + GuiManager networkGuiManager = new GuiManager(); + CommandManager commandManager = new CommandManager(this); CoordinateAPI coordinateAPI = new CoordinateAPIImpl(globalSQL); - EventManager eventManager = new EventManager(globalSQL); + EventManager eventManager = new EventManager(globalSQL, constants); WorldGuardAPI worldGuardAPI = new WorldGuard(); Roles roles = new Roles(this, plotSQL); @@ -328,7 +335,7 @@ public void enablePlugin() { // Register events. new PreJoinServer(this, constants, moderation); - new GuiListener(this); + new GuiListener(networkGuiManager).register(this); // Create the region manager if enabled. if (constants.regionsEnabled()) { @@ -383,6 +390,7 @@ public void enablePlugin() { } Back back = new Back(this, constants, eventManager, serverAPI); + eventManager.registerBack(back); commandManager.registerCommand(back); commandManager.registerCommand(new Teleport(this, back, eventManager, serverAPI, constants)); commandManager.registerCommand(new TpToggle(this)); @@ -406,10 +414,6 @@ public void enablePlugin() { commandManager.registerCommand(new Homes(this)); } - Navigator navigator = new Navigator(this, constants, lobby, back, eventManager, serverAPI); - commandManager.registerCommand(navigator); - new PlayerInteract(this, navigator); - if (constants.plotSystemEnabled()) { commandManager.registerCommand(new Plot(this, eventManager, plotSQL)); commandManager.registerCommand(new Zone(plotSQL, eventManager)); @@ -426,7 +430,8 @@ public void enablePlugin() { commandManager.registerCommand(new Focus(this, constants)); } - commandManager.registerCommand(new Nightvision(this)); + Nightvision nightvision = new Nightvision(this); + commandManager.registerCommand(nightvision); commandManager.registerCommand(new Speed()); commandManager.registerCommand(new Help(constants, roles)); commandManager.registerCommand(new Rules(lobby)); @@ -467,6 +472,10 @@ public void enablePlugin() { commandManager.registerCommand(new Me()); + Navigator navigator = new Navigator(this, networkGuiManager, constants, lobby, back, eventManager, serverAPI, nightvision); + commandManager.registerCommand(navigator); + new PlayerInteract(this, navigator); + // Register command pre-process to make sure network versions of commands run and not that of another plugin. new CommandPreProcess(this, constants, afk, connect, serverAPI); @@ -495,6 +504,12 @@ public void enablePlugin() { } } + // Register all the events. + eventManager.registerEvent("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); + eventManager.registerEvent("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, eventManager, tpll, lobby)); + eventManager.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); + eventManager.registerEvent("kick", new KickEvent()); + // Let the Proxy know that the server is enabled. chat.sendSocketMessage(new ServerStartup(constants.serverName())); @@ -611,8 +626,6 @@ public PlotAPI getPlotAPI() { @Override public void registerShutdownHook(ShutdownHook hook) { - if (shutdownHooks != null) { - shutdownHooks.add(hook); - } + shutdownHooks.add(hook); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index 25e5e725..b6ab82d4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; +import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; @@ -28,10 +29,10 @@ public class Navigator extends AbstractCommand { private final Constants constants; private final NavigatorGui navigator; - public Navigator(Network instance, Constants constants, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI) { + public Navigator(Network instance, GuiManager guiManager, Constants constants, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision) { this.instance = instance; this.constants = constants; - navigator = new NavigatorGui(constants, instance.getGlobalSQL(), lobby, back, eventAPI, serverAPI); + navigator = new NavigatorGui(instance, guiManager, constants, instance.getGlobalSQL(), lobby, back, eventAPI, serverAPI, nightvision); } public void openNavigator(NetworkUser u) { @@ -40,9 +41,9 @@ public void openNavigator(NetworkUser u) { // If no gui exists open the navigator. if (u.mainGui != null) { u.mainGui.refresh(); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { - navigator.open(u); + navigator.open(u.player); } } @@ -84,7 +85,7 @@ private void openExplore(NetworkUser u) { u.mainGui.delete(); } u.mainGui = new ExploreGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { openNavigator(u); } @@ -95,7 +96,7 @@ private void openBuilding(NetworkUser u) { u.mainGui.delete(); } u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } // Only if tutorials is enabled and the server is not already tutorials. @@ -105,7 +106,7 @@ private void openTutorials(NetworkUser u) { u.mainGui.delete(); } u.mainGui = new TutorialsGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { openNavigator(u); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index e46f2753..c5c19ebf 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -80,7 +80,7 @@ private void menu(Player p) { u.mainGui.delete(); } u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } private void info(Player p, int plot) { @@ -106,7 +106,7 @@ private void info(Player p, int plot) { u.mainGui.delete(); } u.mainGui = new PlotInfo(u, plot); - u.mainGui.open(u); + u.mainGui.open(u.player); } private void join(Player p, int plot) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java index e9775f29..e1585fd5 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java @@ -88,7 +88,7 @@ private void addLocation(NetworkUser u) { u.mainGui.delete(); } u.mainGui = new AddLocation(AddLocationType.ADD); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.sendMessage(ChatUtils.error("You do not have permission to use this command.")); } @@ -145,7 +145,7 @@ private void updateLocation(NetworkUser u, String[] args) { int coordinate_id = globalSQL.getInt("SELECT coordinate FROM location_data WHERE " + "location='" + location + "';"); u.staffGui = new AddLocation(AddLocationType.UPDATE, location, coordinate_id, category, subcategory); - u.staffGui.open(u); + u.staffGui.open(u.player); } private void removeLocation(NetworkUser u, String[] args) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index 18f9b6a4..697139a1 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -44,11 +44,11 @@ public void openStaffMenu(NetworkUser u) { if (u.staffGui != null) { u.staffGui.refresh(); - u.staffGui.open(u); + u.staffGui.open(u.player); } else { u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index 44ff58de..5a5ea02f 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -1,19 +1,11 @@ package net.bteuk.network.eventing.events; import lombok.extern.java.Log; -import net.bteuk.network.api.ChatAPI; -import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.EventAPI; -import net.bteuk.network.api.PlotAPI; -import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Event; -import net.bteuk.network.lobby.Lobby; -import net.bteuk.network.regions.RegionEvent; -import net.bteuk.network.regions.RegionManager; import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; @@ -26,18 +18,23 @@ public class EventManager implements EventAPI, Event { private final HashMap events = new HashMap<>(); private final GlobalSQL globalSQL; private final Constants constants; - private final Back back; - public EventManager(GlobalSQL globalSQL, Constants constants, Back back, PlotAPI plotAPI, RegionManager regionManager, ServerAPI serverAPI, Tpll tpll, Lobby lobby, ChatAPI chat, CoordinateAPI coordinateAPI) { + private Back back; + + public EventManager(GlobalSQL globalSQL, Constants constants) { this.globalSQL = globalSQL; this.constants = constants; - this.back = back; + } + + public void registerBack(Back back) { + if (this.back == null) { + this.back = back; + log.info("Back function registered in EventManager."); + } + } - // Register all the events. - events.put("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); - events.put("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, this, tpll, lobby)); - events.put("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); - events.put("kick", new KickEvent()); + public void registerEvent(String name, Event event) { + events.put(name, event); } public void createJoinEvent(String uuid, String type, String event) { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 2b1d76be..2b613c35 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -7,7 +7,6 @@ import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.OnlineUserAdd; import net.bteuk.network.lib.dto.OnlineUserRemove; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java deleted file mode 100644 index 701230e7..00000000 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/GuiListener.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.bteuk.network.eventing.listeners; - -import lombok.extern.java.Log; -import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.NetworkUser; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; - -import java.util.UUID; - -@Log -public class GuiListener implements Listener { - - private final Network instance; - - public GuiListener(Network instance) { - - this.instance = instance; - Bukkit.getServer().getPluginManager().registerEvents(this, instance); - } - - @EventHandler - public void onClick(InventoryClickEvent e) { - - if (!(e.getWhoClicked() instanceof Player player)) { - return; - } - - UUID playerUUID = player.getUniqueId(); - - UUID inventoryUUID = Gui.openInventories.get(playerUUID); - - if (inventoryUUID != null) { - - NetworkUser u = instance.getUser(player); - - // If u is null, cancel. - if (u == null) { - log.severe("User " + e.getWhoClicked().getName() + " can not be found!"); - e.getWhoClicked().sendMessage(ChatUtils.error("User can not be found, please relog!")); - return; - } - - e.setCancelled(true); - Gui gui = Gui.inventoriesByUUID.get(inventoryUUID); - Gui.guiAction action = gui.getActions().get(e.getRawSlot()); - - if (action != null) { - action.click(u); - } - } - } - - @EventHandler - public void onClose(InventoryCloseEvent e) { - - Player p = (Player) e.getPlayer(); - UUID playerUUID = p.getUniqueId(); - - // Get the uuid of the open inventory, if exists. - UUID guiUuid = Gui.openInventories.get(playerUUID); - - if (guiUuid != null) { - - // Get the gui. - Gui gui = Gui.inventoriesByUUID.get(guiUuid); - - // If the gui should delete on close, delete it. - if (gui != null && gui.isDeleteOnClose()) { - gui.delete(); - } else { - // Remove the player from the list of open inventories. - Gui.openInventories.remove(playerUUID); - } - } - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java index 360479d7..e72c981b 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java @@ -44,13 +44,13 @@ public LocationNameListener(Player p, AddLocation gui) { if (gui.getType() == AddLocationType.ADD) { if (Objects.requireNonNull(u).mainGui != null) { if (u.mainGui instanceof AddLocation) { - u.mainGui.open(u); + u.mainGui.open(u.player); } } } else { if (Objects.requireNonNull(u).staffGui != null) { if (u.staffGui instanceof AddLocation) { - u.staffGui.open(u); + u.staffGui.open(u.player); } } } @@ -91,7 +91,7 @@ public void ChatEvent(AsyncChatEvent e) { if (u.mainGui instanceof AddLocation) { Bukkit.getScheduler().runTask(Network.getInstance(), () -> { u.mainGui.refresh(); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } } @@ -100,7 +100,7 @@ public void ChatEvent(AsyncChatEvent e) { if (u.staffGui instanceof AddLocation) { Bukkit.getScheduler().runTask(Network.getInstance(), () -> { u.staffGui.refresh(); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java index 6340213e..848e12ee 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java @@ -63,7 +63,7 @@ public void ChatEvent(AsyncChatEvent e) { u.mainGui.delete(); u.mainGui = gui; - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java index fd082cb3..8cc64315 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java @@ -2,7 +2,6 @@ import me.bteuk.progressmapper.GeometryEditor; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.progressmap.FeaturePageGUI; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java index bcf63775..a0656696 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java @@ -66,7 +66,7 @@ public void ChatEvent(AsyncChatEvent e) { // This also cancels the task and unregisters the listener. gui.refresh(); - Bukkit.getScheduler().runTask(Network.getInstance(), () -> gui.open(u)); + Bukkit.getScheduler().runTask(Network.getInstance(), () -> gui.open(u.player)); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 5fd3237f..39dd8309 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -1,9 +1,14 @@ package net.bteuk.network.gui; import me.bteuk.progressmapper.guis.LocalFeaturesMenu; +import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.gui.plotsystem.PlotMenu; import net.bteuk.network.gui.plotsystem.PlotServerLocations; import net.bteuk.network.gui.plotsystem.PlotsystemLocations; @@ -12,161 +17,177 @@ import net.bteuk.network.gui.regions.RegionInfo; import net.bteuk.network.gui.regions.RegionMenu; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionStatus; +import net.bteuk.network.regions.RegionUser; +import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.enums.ServerType; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -import static net.bteuk.network.utils.Constants.PROGRESS_MAP; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; +import java.util.Optional; -public class BuildGui extends Gui { +public class BuildGui extends NetworkRefreshableGui { private final NetworkUser user; - - public BuildGui(NetworkUser user) { - - super(27, Component.text("Building Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); - + private final PlotSQL plotSQL; + private final Constants constants; + private final Back back; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final RegionManager regionManager; + + public BuildGui(Network instance, GuiManager guiManager, NetworkUser user, PlotSQL plotSQL, Constants constants, Back back, EventAPI eventAPI, ServerAPI serverAPI, RegionManager regionManager) { + super(instance, guiManager, 27, Component.text("Building Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - - createGui(); + this.plotSQL = plotSQL; + this.constants = constants; + this.back = back; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + this.regionManager = regionManager; } - private void createGui() { + protected void createGui() { // Teleport to random unclaimed plot. - setItem(20, Utils.createItem(Material.ENDER_PEARL, 1, - Utils.title("Random Plot"), - Utils.line("Click teleport to a random claimable plot."), - Utils.line("Available plots of each difficulty:"), - Utils.line("Easy: ") - .append(Component.text(Network.getInstance().getPlotSQL().getInt("SELECT count(id) " + - "FROM plot_data WHERE status='unclaimed' AND difficulty=1;"), - NamedTextColor.GRAY)), - Utils.line("Normal: ") - .append(Component.text(Network.getInstance().getPlotSQL().getInt("SELECT count(id) " + - "FROM plot_data WHERE status='unclaimed' AND difficulty=2;"), - NamedTextColor.GRAY)), - Utils.line("Hard: ") - .append(Component.text(Network.getInstance().getPlotSQL().getInt("SELECT count(id) " + - "FROM plot_data WHERE status='unclaimed' AND difficulty=3;"), - NamedTextColor.GRAY))), - u -> { - - int id; - - if (u.player.hasPermission("uknet.plots.suggested.all")) { - - // Select a random plot of any difficulty. - id = Network.getInstance().getPlotSQL().getInt("SELECT id FROM plot_data WHERE " + - "status='unclaimed' ORDER BY RAND() LIMIT 1;"); - } else if (u.player.hasPermission("uknet.plots.suggested.hard")) { - - // Select a random plot of the hard difficulty. - // Since this is the next plot difficulty to get Builder. - id = Network.getInstance().getPlotSQL().getInt("SELECT id FROM plot_data WHERE " + - "status='unclaimed' AND difficulty=3 ORDER BY RAND() LIMIT 1;"); - } else if (u.player.hasPermission("uknet.plots.suggested.normal")) { - - // Select a random plot of the normal difficulty. - // Since this is the next plot difficulty to get Jr.Builder. - id = Network.getInstance().getPlotSQL().getInt("SELECT id FROM plot_data WHERE " + - "status='unclaimed' AND difficulty=2 ORDER BY RAND() LIMIT 1;"); - } else if (u.player.hasPermission("uknet.plots.suggested.easy")) { - - // Select a random plot of the easy difficulty. - // Since this is the next plot difficulty to get Apprentice. - id = Network.getInstance().getPlotSQL().getInt("SELECT id FROM plot_data WHERE " + - "status='unclaimed' AND difficulty=1 ORDER BY RAND() LIMIT 1;"); - } else { + if (constants.plotSystemEnabled()) { + setItem(20, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Random Plot"), Utils.line("Click teleport to a random claimable plot."), + Utils.line("Available plots of each difficulty:"), Utils.line("Easy: ") + .append(Component.text(plotSQL.getInt("SELECT count(id) " + "FROM plot_data WHERE status='unclaimed' AND difficulty=1;"), NamedTextColor.GRAY)), + Utils.line("Normal: ") + .append(Component.text(plotSQL.getInt("SELECT count(id) " + "FROM plot_data WHERE status='unclaimed' AND difficulty=2;"), NamedTextColor.GRAY)), + Utils.line("Hard: ") + .append(Component.text(plotSQL.getInt("SELECT count(id) " + "FROM plot_data WHERE status='unclaimed' AND difficulty=3;"), + NamedTextColor.GRAY))), + (NetworkUser u) -> { + + int id; + + if (u.player.hasPermission("uknet.plots.suggested.all")) { + + // Select a random plot of any difficulty. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE " + "status='unclaimed' ORDER BY RAND() LIMIT 1;"); + } else if (u.player.hasPermission("uknet.plots.suggested.hard")) { + + // Select a random plot of the hard difficulty. + // Since this is the next plot difficulty to get Builder. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE " + "status='unclaimed' AND difficulty=3 ORDER BY RAND() LIMIT 1;"); + } else if (u.player.hasPermission("uknet.plots.suggested.normal")) { + + // Select a random plot of the normal difficulty. + // Since this is the next plot difficulty to get Jr.Builder. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE " + "status='unclaimed' AND difficulty=2 ORDER BY RAND() LIMIT 1;"); + } else if (u.player.hasPermission("uknet.plots.suggested.easy")) { + + // Select a random plot of the easy difficulty. + // Since this is the next plot difficulty to get Apprentice. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE " + "status='unclaimed' AND difficulty=1 ORDER BY RAND() LIMIT 1;"); + } else { - // Select a random plot of any difficulty. - id = Network.getInstance().getPlotSQL().getInt("SELECT id FROM plot_data WHERE " + - "status='unclaimed' ORDER BY RAND() LIMIT 1;"); - } + // Select a random plot of any difficulty. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE " + "status='unclaimed' ORDER BY RAND() LIMIT 1;"); + } - if (id == 0) { + if (id == 0) { - u.player.sendMessage(ChatUtils.error("There are no plots available, please wait for new plots" + - " to be added.")); - u.player.closeInventory(); - } else { + u.player.sendMessage(ChatUtils.error("There are no plots available, please wait for new plots" + " to be added.")); + u.player.closeInventory(); + } else { - // Get the server of the plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + - "location_data WHERE name='" - + Network.getInstance().getPlotSQL().getString("SELECT location FROM plot_data WHERE " + - "id=" + id + ";") - + "';"); + // Get the server of the plot. + String server = plotSQL.getString( + "SELECT server FROM " + "location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE " + "id=" + id + ";") + "';"); - // If the plot is on the current server teleport them directly. - // Else teleport them to the correct server and them teleport them to the plot. - if (server.equals(SERVER_NAME)) { + // If the plot is on the current server teleport them directly. + // Else teleport them to the correct server and them teleport them to the plot. + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (server.equals(constants.serverName())) { - u.player.closeInventory(); + u.player.closeInventory(); - // Set current location for /back - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); + // Set current location for /back + back.setPreviousCoordinate(u.player.getUniqueId().toString(), location); - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + id, u.player.getLocation()); - } else { + eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); + } else { - // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + id, u.player.getLocation()); + // Set the server join event. + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); - // Teleport them to another server. - u.player.closeInventory(); - SwitchServer.switchServer(u.player, server); + // Teleport them to another server. + u.player.closeInventory(); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); + } } - } - }); + }); + + // Choose location. + setItem(19, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Plot Locations"), Utils.line("Click to choose a location to build a plot.")), (NetworkUser u) -> { + // Delete this gui. + this.delete(); - // Choose location. - setItem(19, Utils.createItem(Material.DIAMOND_PICKAXE, 1, - Utils.title("Plot Locations"), - Utils.line("Click to choose a location to build a plot.")), - u -> + // Switch to the plot location gui. + u.mainGui = new PlotServerLocations(u); + u.mainGui.open(u.player); + }); - { + // Plot menu. + setItem(21, Utils.createItem(Material.CHEST, 1, Utils.title("Plot Menu"), Utils.line("View all your active plots.")), (NetworkUser u) -> { + // Delete this gui. + this.delete(); + + // Switch to plot menu. + u.mainGui = new PlotMenu(u); + u.mainGui.open(u.player); + }); + + // Zone menu. + setItem(17, Utils.createItem(Material.BARREL, 1, Utils.title("Zone Menu"), Utils.line("View all zones you can build in.")), (NetworkUser u) -> { + // Must be a jr.builder to open this menu. + if (u.player.hasPermission("uknet.zones.join")) { // Delete this gui. this.delete(); u.mainGui = null; - // Switch to the plot location gui. - u.mainGui = new PlotServerLocations(u); - u.mainGui.open(u); - }); + // Switch to plot menu. + u.mainGui = new ZoneMenu(u); + u.mainGui.open(u.player); + } else { + + u.player.sendMessage(ChatUtils.error("You must be at least a Jr.Builder to join zones.")); + } + }); + + // Menu to teleport to plotsystem locations without going through a plot selection process. + setItem(22, Utils.createItem(Material.MINECART, 1, Utils.title("Plotsystem Locations"), Utils.line("Teleport to a location"), Utils.line("used by the Plotsystem.")), + (NetworkUser u) -> { + + this.delete(); + u.mainGui = null; + + u.mainGui = new PlotsystemLocations(); + u.mainGui.open(u.player); + }); + } // Claim plot // This button only appears when in a plot server, else it'll show the region button. - if (SERVER_TYPE == ServerType.PLOT) { - setItem(4, Utils.createItem(Material.EMERALD, 1, - Utils.title("Claim Plot"), - Utils.line("Click to claim the plot you are currently standing in.")), - u -> { - - // Set the claim event. - u.player.closeInventory(); - Network.getInstance().getGlobalSQL().update("INSERT INTO server_events(uuid,type,server," + - "event) VALUES('" - + u.player.getUniqueId() - + "','plotsystem','" + SERVER_NAME - + "','claim plot');"); - }); - } else { + if (constants.serverType() == ServerType.PLOT && constants.plotSystemEnabled()) { + setItem(4, Utils.createItem(Material.EMERALD, 1, Utils.title("Claim Plot"), Utils.line("Click to claim the plot you are currently standing in.")), (NetworkUser u) -> { + + // Set the claim event. + u.player.closeInventory(); + eventAPI.createEvent(u.player.getUniqueId().toString(), "plotsystem", constants.serverName(), "claim plot"); + }); + } else if (constants.regionsEnabled()) { /* Region Join Button @@ -185,343 +206,235 @@ private void createGui() { // Join region (Jr.Builder+ only) // If region is claimable. // Check if the player is in a region. - if (user.inRegion) { + Optional optionalRegionUser = regionManager.getUserByPlayer(user.player); + if (optionalRegionUser.isPresent() && optionalRegionUser.get().hasTrackedRegion()) { + Region region = optionalRegionUser.get().getTrackedRegion(); // Check if you're an owner or member of this region. // If true then open the region info menu instead. // If you're already waiting for you request to be reviewed then show that. - if (user.region.isOwner(user.player.getUniqueId().toString())) { + if (regionManager.isOwner(region, user.player.getUniqueId().toString())) { - setItem(4, Utils.createItem(Material.LIME_GLAZED_TERRACOTTA, 1, - Utils.title("Region " + user.region.getTag(user.player.getUniqueId().toString())), - Utils.line("You are the owner of this region."), - Utils.line("Click to open the menu of this region.")), - u -> { + setItem(4, Utils.createItem(Material.LIME_GLAZED_TERRACOTTA, 1, Utils.title("Region " + regionManager.getTag(region, user.player.getUniqueId().toString())), + Utils.line("You are the owner of this region."), Utils.line("Click to open the menu of this region.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); + // Delete this gui. + this.delete(); - // Switch to region info. - u.mainGui = new RegionInfo(user.region, u.player.getUniqueId().toString()); - u.mainGui.open(u); - }); - } else if (user.region.isMember(user.player.getUniqueId().toString())) { + // Switch to region info. + u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); + } else if (regionManager.isMember(region, user.player.getUniqueId().toString())) { - setItem(4, Utils.createItem(Material.YELLOW_GLAZED_TERRACOTTA, 1, - Utils.title("Region " + user.region.getTag(user.player.getUniqueId().toString())), - Utils.line("You are a member of this region."), - Utils.line("Click to open the menu of this plot.")), - u -> { + setItem(4, Utils.createItem(Material.YELLOW_GLAZED_TERRACOTTA, 1, Utils.title("Region " + regionManager.getTag(region, user.player.getUniqueId().toString())), + Utils.line("You are a member of this region."), Utils.line("Click to open the menu of this plot.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); + // Delete this gui. + this.delete(); - // Switch to plot info. - u.mainGui = new RegionInfo(user.region, u.player.getUniqueId().toString()); - u.mainGui.open(u); - }); - } else if (user.region.hasRequest(user)) { + // Switch to plot info. + u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); + } else if (regionManager.hasRequest(region, user.getUuid())) { - setItem(4, Utils.createItem(Material.ORANGE_GLAZED_TERRACOTTA, 1, - Utils.title("Region " + user.region.getTag(user.player.getUniqueId().toString())), - Utils.line("You have requested to join this region."), - Utils.line("The request is still pending."), - Utils.line("Click to cancel the request.")), - u -> { + setItem(4, Utils.createItem(Material.ORANGE_GLAZED_TERRACOTTA, 1, Utils.title("Region " + regionManager.getTag(region, user.player.getUniqueId().toString())), + Utils.line("You have requested to join this region."), Utils.line("The request is still pending."), Utils.line("Click to cancel the request.")), + (NetworkUser u) -> { // Close the gui. u.player.closeInventory(); // Cancel the request. - u.region.cancelRequest(u); + regionManager.cancelRequest(region, u); }); } else if (user.player.hasPermission("uknet.regions.join")) { // Check if region is claimable. - if (user.region.isClaimable()) { + if (regionManager.isClaimable(region)) { // If the region has an owner. - if (user.region.hasActiveOwner()) { + if (regionManager.hasActiveOwner(region)) { // Check if the region is public. - if (user.region.status() == RegionStatus.PUBLIC) { - - setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, - Utils.title("Join Region"), - Utils.line("Click to join the region you are standing in."), - Utils.line("The region is owned by ") - .append(Component.text(user.region.ownerName(), - NamedTextColor.GRAY)), - Utils.line("The region is public, so they don't need to accept your " + - "request.")), - u -> { - - u.region.joinRegion(u); - u.player.closeInventory(); - }); + if (regionManager.status(region) == RegionStatus.PUBLIC) { + + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), + Utils.line("The region is owned by ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), + Utils.line("The region is public, so they don't need to accept your " + "request.")), (NetworkUser u) -> { + + regionManager.joinRegion(region, u.player); + u.player.closeInventory(); + }); } else { // Join requires owner to approve request. - setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, - Utils.title("Join Region"), - Utils.line("Click to request to join the region you are standing in."), - Utils.line("The region is owned by ") - .append(Component.text(user.region.ownerName(), - NamedTextColor.GRAY)), - Utils.line("They must accept the request for you to join.")), - u -> { - - u.region.requestRegion(u, false); - u.player.closeInventory(); - }); + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), + Utils.line("Click to request to join the region you are standing in."), + Utils.line("The region is owned by ").append(Component.text(user.region.ownerName(), NamedTextColor.GRAY)), + Utils.line("They must accept the request for you to join.")), (NetworkUser u) -> { + + regionManager.requestRegion(region, u.player, false); + u.player.closeInventory(); + }); } } else // Join region. - setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, - Utils.title("Join Region"), - Utils.line("Click to join the region you are standing in."), - Utils.line("The region currently has no active owner."), - Utils.line("Joining the region will make you the region owner.")), - u -> { - - // If the player does not have the bypass permission. - // Check if any nearby regions are claimed by someone else. - // If true then the region needs to be checked by a staff member. - if (!u.player.hasPermission("uknet.regions.staff_request.bypass")) { - - // If staff approval is always required do that or if the region was - // previously claimed. - if (CONFIG.getBoolean("staff_request.always") || u.region.wasClaimed()) { - - u.region.requestRegion(u, true); - u.player.closeInventory(); - } else { - - // Get region coords. - int x = Integer.parseInt(u.region.regionName().split(",")[0]); - int z = Integer.parseInt(u.region.regionName().split(",")[1]); - - // Get the radius. - int radius = CONFIG.getInt("staff_request.radius"); - - // For zero radius, skip. - if (radius != 0) { - - // Subtract the config radius value. - x -= radius; - z -= radius; - - // Get the region manager. - RegionManager regionManager = - Network.getInstance().getRegionManager(); - - // Iterate through all regions in the radius. - for (int i = x; i <= x + radius * 2; i++) { - for (int j = z; j <= z + radius * 2; j++) { - - String regionName = i + "," + j; - - // If the region exists, check if it has an owner that is - // not the player. - if (regionManager.exists(regionName)) { - - Region region = regionManager.getRegion(regionName); - - if (region.hasOwner()) { - if (!region.getOwner().equals(u.player.getUniqueId() - .toString())) { - - // Staff approval is required. - u.region.requestRegion(u, true); - u.player.closeInventory(); - return; - } - } + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), + Utils.line("The region currently has no active owner."), Utils.line("Joining the region will make you the region owner.")), (NetworkUser u) -> { + + // If the player does not have the bypass permission. + // Check if any nearby regions are claimed by someone else. + // If true then the region needs to be checked by a staff member. + if (!u.player.hasPermission("uknet.regions.staff_request.bypass")) { + + // If staff approval is always required do that or if the region was + // previously claimed. + if (CONFIG.getBoolean("staff_request.always") || u.region.wasClaimed()) { + + u.region.requestRegion(u, true); + u.player.closeInventory(); + } else { + + // Get region coords. + int x = Integer.parseInt(u.region.regionName().split(",")[0]); + int z = Integer.parseInt(u.region.regionName().split(",")[1]); + + // Get the radius. + int radius = CONFIG.getInt("staff_request.radius"); + + // For zero radius, skip. + if (radius != 0) { + + // Subtract the config radius value. + x -= radius; + z -= radius; + + // Get the region manager. + RegionManager regionManager = Network.getInstance().getRegionManager(); + + // Iterate through all regions in the radius. + for (int i = x; i <= x + radius * 2; i++) { + for (int j = z; j <= z + radius * 2; j++) { + + String regionName = i + "," + j; + + // If the region exists, check if it has an owner that is + // not the player. + if (regionManager.exists(regionName)) { + + Region region = regionManager.getRegion(regionName); + + if (region.hasOwner()) { + if (!region.getOwner().equals(u.player.getUniqueId().toString())) { + + // Staff approval is required. + u.region.requestRegion(u, true); + u.player.closeInventory(); + return; } } } } - - u.region.joinRegion(u); - u.player.closeInventory(); } - } else { - - u.region.joinRegion(u); - u.player.closeInventory(); } - }); + + u.region.joinRegion(u); + u.player.closeInventory(); + } + } else { + + u.region.joinRegion(u); + u.player.closeInventory(); + } + }); } else { // If the region is open. if (user.region.status() == RegionStatus.OPEN) { - setItem(4, Utils.createItem(Material.SPYGLASS, 1, - Utils.title("Open Region"), - Utils.line("This region is open to all Jr.Builder+."), + setItem(4, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Open Region"), Utils.line("This region is open to all Jr.Builder+."), Utils.line("You can build here without claiming."))); } else { // This region is not claimable. - setItem(4, Utils.createItem(Material.IRON_DOOR, 1, - Utils.title("Locked Region"), - Utils.line("This region can not be claimed."), + setItem(4, Utils.createItem(Material.IRON_DOOR, 1, Utils.title("Locked Region"), Utils.line("This region can not be claimed."), Utils.line("It is either locked or used in the plot system."))); } } } else { // Can't claim since you don't have jr.builder. - setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, - Utils.title("Unable to Join Region"), - Utils.line("To be able to join a region you"), + setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("Unable to Join Region"), Utils.line("To be able to join a region you"), Utils.line("must gain at least Jr.Builder or above."), - Utils.line("For more information type ") - .append(Component.text("/help building", NamedTextColor.GRAY)))); + Utils.line("For more information type ").append(Component.text("/help building", NamedTextColor.GRAY)))); } } else { // Show that the user is not in a region. - setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, - Utils.title("No Region"), - Utils.line("You are currently not standing in a valid region."), + setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("No Region"), Utils.line("You are currently not standing in a valid region."), Utils.line("This is likely due to being in a lobby."))); } } - // Plot menu. - setItem(21, Utils.createItem(Material.CHEST, 1, - Utils.title("Plot Menu"), - Utils.line("View all your active plots.")), - u -> - - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to plot menu. - u.mainGui = new PlotMenu(u); - u.mainGui.open(u); - }); - // Region menu. - setItem(24, Utils.createItem(Material.ORANGE_SHULKER_BOX, 1, - Utils.title("Region Menu"), - Utils.line("View all regions you can build in.")), - u -> - - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to plot menu. - u.mainGui = new RegionMenu(u); - u.mainGui.open(u); - }); - - // Zone menu. - setItem(17, Utils.createItem(Material.BARREL, 1, - Utils.title("Zone Menu"), - Utils.line("View all zones you can build in.")), - u -> + setItem(24, Utils.createItem(Material.ORANGE_SHULKER_BOX, 1, Utils.title("Region Menu"), Utils.line("View all regions you can build in.")), u -> - { + { - // Must be a jr.builder to open this menu. - if (u.player.hasPermission("uknet.zones.join")) { + // Delete this gui. + this.delete(); + u.mainGui = null; - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to plot menu. - u.mainGui = new ZoneMenu(u); - u.mainGui.open(u); - } else { - - u.player.sendMessage(ChatUtils.error("You must be at least a Jr.Builder to join zones.")); - } - }); - - // Menu to teleport to plotsystem locations without going through a plot selection process. - setItem(22, Utils.createItem(Material.MINECART, 1, - Utils.title("Plotsystem Locations"), - Utils.line("Teleport to a location"), - Utils.line("used by the Plotsystem.")), - u -> { - - this.delete(); - u.mainGui = null; - - u.mainGui = new PlotsystemLocations(); - u.mainGui.open(u); - }); + // Switch to plot menu. + u.mainGui = new RegionMenu(u); + u.mainGui.open(u.player); + }); // Building utils menu. - setItem(8, Utils.createItem(Material.NETHERITE_AXE, 1, - Utils.title("Building Utils"), - Utils.line("Open the building utils menu.")), - u -> { + setItem(8, Utils.createItem(Material.NETHERITE_AXE, 1, Utils.title("Building Utils"), Utils.line("Open the building utils menu.")), (NetworkUser u) -> { - this.delete(); - u.mainGui = null; + this.delete(); + u.mainGui = null; - u.mainGui = new UtilsGui(); - u.mainGui.open(u); - }); + u.mainGui = new UtilsGui(instance, ); u.mainGui.open(u.player); + }); if (PROGRESS_MAP && user.player.hasPermission("uknet.progressmap.edit")) { // Progress map edit menu - setItem(0, Utils.createItem(Material.MAP, 1, - Utils.title("Progress Map"), - Utils.line("Edit or add areas to the progress map")), - u -> { + setItem(0, Utils.createItem(Material.MAP, 1, Utils.title("Progress Map"), Utils.line("Edit or add areas to the progress map")), (NetworkUser u) -> { - // Deletes this GUI - this.delete(); - u.mainGui = null; + // Deletes this GUI + this.delete(); + u.mainGui = null; - LocalFeaturesMenu localFeatures = new LocalFeaturesMenu( - Network.getInstance().getConfig().getInt("ProgressMap.ProgressMapID"), - Network.getInstance().getConfig().getString("ProgressMap.MapHubAPIKey"), - u.player); + LocalFeaturesMenu localFeatures = new LocalFeaturesMenu(Network.getInstance().getConfig().getInt("ProgressMap.ProgressMapID"), + Network.getInstance().getConfig().getString("ProgressMap.MapHubAPIKey"), u.player); - // Check to see if the location could be established - if (localFeatures.getPlayerCoordinates() == null) { - u.mainGui = this; - u.mainGui.open(u); - u.player.sendMessage(ChatUtils.error("Could not locate you")); - } else { - // Switch to local features menu - u.mainGui = new LocalFeatureListGUI(localFeatures, Network.getInstance()); - u.mainGui.open(u); - } - }); + // Check to see if the location could be established + if (localFeatures.getPlayerCoordinates() == null) { + u.mainGui = this; + u.mainGui.open(u.player); + u.player.sendMessage(ChatUtils.error("Could not locate you")); + } else { + // Switch to local features menu + u.mainGui = new LocalFeatureListGUI(localFeatures, Network.getInstance()); + u.mainGui.open(u.player); + } + }); } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the navigator main menu.")), - u -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), u -> - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to navigation menu. - Network.getInstance().navigatorGui.open(u); - }); - } + { - public void refresh() { + // Delete this gui. + this.delete(); + u.mainGui = null; - this.clearGui(); - createGui(); + // Switch to navigation menu. + Network.getInstance().navigatorGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/Gui.java b/Plugin/src/main/java/net/bteuk/network/gui/Gui.java deleted file mode 100644 index b1f7888c..00000000 --- a/Plugin/src/main/java/net/bteuk/network/gui/Gui.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.bteuk.network.gui; - -import lombok.Getter; -import lombok.Setter; -import net.bteuk.network.utils.NetworkUser; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -@Getter -public abstract class Gui implements GuiInterface { - - public static final Map inventoriesByUUID = new HashMap<>(); - public static final Map openInventories = new HashMap<>(); - - // Information about the gui. - private final UUID uuid; - private final Inventory inv; - private final Map actions; - - @Setter - private boolean deleteOnClose = false; - - public Gui(int invSize, Component invName) { - - uuid = UUID.randomUUID(); - inv = Bukkit.createInventory(null, invSize, invName); - actions = new HashMap<>(); - inventoriesByUUID.put(getUuid(), this); - } - - public Gui(Inventory inv) { - this.inv = inv; - uuid = UUID.randomUUID(); - actions = new HashMap<>(); - inventoriesByUUID.put(getUuid(), this); - } - - public Inventory getInventory() { - return inv; - } - - public void setItem(int slot, ItemStack stack, guiAction action) { - - inv.setItem(slot, stack); - if (action != null) { - actions.put(slot, action); - } - } - - public void setItem(int slot, ItemStack stack) { - setItem(slot, stack, null); - } - - public void setAction(int slot, guiAction action) { - - if (action != null) { - actions.put(slot, action); - } - } - - public void clearGui() { - inv.clear(); - actions.clear(); - } - - public void open(NetworkUser u) { - u.player.openInventory(inv); - openInventories.put(u.player.getUniqueId(), getUuid()); - } - - public void delete() { - for (Player p : Bukkit.getOnlinePlayers()) { - openInventories.remove(p.getUniqueId(), getUuid()); - } - inventoriesByUUID.remove(getUuid()); - } - - public interface guiAction { - void click(NetworkUser u); - } -} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java index 2cf98724..36c89963 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java @@ -172,7 +172,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else if (regionType == RegionType.PLOT) { @@ -191,7 +191,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new PlotInfo(u, plotID); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else if (regionType == RegionType.ZONE) { @@ -210,7 +210,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new ZoneInfo(u, zoneID, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 38510f05..e52c2f60 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -1,5 +1,7 @@ package net.bteuk.network.gui; +import net.bteuk.minecraft.gui.GuiManager; +import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; @@ -15,6 +17,7 @@ import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.LightsOut; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -22,32 +25,30 @@ import org.bukkit.Material; import org.bukkit.potion.PotionEffectType; -public class NavigatorGui extends Gui { +public class NavigatorGui extends NetworkGui { - public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI) { - - super(27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); - - setItem(2, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Build"), Utils.line("Click to open the build menu.")), u -> { + public NavigatorGui(Network instance, GuiManager guiManager, Constants constants, GlobalSQL globalSQL, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision) { + super(instance, guiManager, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); + setItem(2, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Build"), Utils.line("Click to open the build menu.")), (NetworkUser u) -> { // Switch to the build menu. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); - setItem(4, Utils.createItem(Material.SPRUCE_BOAT, 1, Utils.title("Explore"), Utils.line("Click to open the explore menu.")), u -> { + setItem(4, Utils.createItem(Material.SPRUCE_BOAT, 1, Utils.title("Explore"), Utils.line("Click to open the explore menu.")), (NetworkUser u) -> { // Click Action if (constants.warpsEnabled()) { u.mainGui = new ExploreGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.player.closeInventory(); u.player.sendMessage(ChatUtils.error("Warps are currently not enabled!")); } }); - setItem(6, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title("Tutorials"), Utils.line("Click to open the tutorials menu.")), u -> { + setItem(6, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title("Tutorials"), Utils.line("Click to open the tutorials menu.")), (NetworkUser u) -> { // Switch to tutorials menu if it's online and enabled. // If the current server is already tutorials, don't open the gui. if (constants.serverType() == ServerType.TUTORIAL) { @@ -57,7 +58,7 @@ public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back if (globalSQL.hasRow("SELECT name FROM server_data WHERE " + "type='TUTORIAL' AND online=1;")) { u.mainGui = new TutorialsGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.player.closeInventory(); u.player.sendMessage(ChatUtils.error("The tutorials server is offline!")); @@ -69,7 +70,7 @@ public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back }); setItem(26, Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Toggle Navigator"), Utils.line("Click to toggle the navigator in your inventory."), - Utils.line("You can always open this menu with ").append(Component.text("/navigator", NamedTextColor.GRAY))), u -> { + Utils.line("You can always open this menu with ").append(Component.text("/navigator", NamedTextColor.GRAY))), (NetworkUser u) -> { if (u.isNavigatorEnabled()) { @@ -95,28 +96,28 @@ public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back setItem(25, Utils.createPotion(Material.SPLASH_POTION, PotionEffectType.NIGHT_VISION, 1, Utils.title("Toggle Nightvision"), Utils.line("Click to toggle nightvision."), Utils.line("You can also use the command ").append(Component.text("/nightvision", NamedTextColor.GRAY)).append(Utils.line(" or ")) - .append(Component.text("/nv", NamedTextColor.GRAY))), Nightvision::toggleNightvision); + .append(Component.text("/nv", NamedTextColor.GRAY))), nightvision::toggleNightvision); - setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), u -> { + setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), (NetworkUser u) -> { if (u.lightsOut == null) { u.lightsOut = new LightsOut(u); - u.lightsOut.open(u); + u.lightsOut.open(u.player); } else { - u.lightsOut.open(u); + u.lightsOut.open(u.player); } }); // Set rules. - setItem(21, Utils.createItem(Material.ENCHANTED_BOOK, 1, Utils.title("Rules"), Utils.line("Click to view the rules.")), u -> { + setItem(21, Utils.createItem(Material.ENCHANTED_BOOK, 1, Utils.title("Rules"), Utils.line("Click to view the rules.")), (NetworkUser u) -> { u.player.closeInventory(); u.player.openBook(lobby.getRules()); }); // Spawn if (!constants.standalone()) { - setItem(23, Utils.createItem(Material.RED_BED, 1, Utils.title("Spawn"), Utils.line("Teleport to spawn.")), u -> { + setItem(23, Utils.createItem(Material.RED_BED, 1, Utils.title("Spawn"), Utils.line("Teleport to spawn.")), (NetworkUser u) -> { u.player.closeInventory(); // If server is Lobby, teleport to spawn. @@ -135,9 +136,4 @@ public NavigatorGui(Constants constants, GlobalSQL globalSQL, Lobby lobby, Back }); } } - - // This methods is not needed in this class, so it is empty. - @Override - public void refresh() { - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java new file mode 100644 index 00000000..efe969a5 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java @@ -0,0 +1,34 @@ +package net.bteuk.network.gui; + +import net.bteuk.minecraft.gui.Gui; +import net.bteuk.minecraft.gui.GuiAction; +import net.bteuk.minecraft.gui.GuiManager; +import net.bteuk.network.Network; +import net.bteuk.network.utils.NetworkUser; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public abstract class NetworkGui extends Gui { + + private final Network instance; + + public NetworkGui(Network instance, GuiManager manager, int inventorySize, Component inventoryName) { + super(manager, inventorySize, inventoryName); + this.instance = instance; + } + + public void setItem(int slot, ItemStack stack, NetworkGuiAction action) { + GuiAction guiAction = clickEvent -> { + if (!(clickEvent.getWhoClicked() instanceof Player player)) { + return; + } + NetworkUser u = instance.getUser(player); + + if (u != null) { + action.click(u); + } + }; + this.setItem(slot, stack, guiAction); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGuiAction.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGuiAction.java new file mode 100644 index 00000000..263e874e --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGuiAction.java @@ -0,0 +1,8 @@ +package net.bteuk.network.gui; + +import net.bteuk.network.utils.NetworkUser; + +@FunctionalInterface +public interface NetworkGuiAction { + void click(NetworkUser networkUser); +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java new file mode 100644 index 00000000..05b01e5c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java @@ -0,0 +1,35 @@ +package net.bteuk.network.gui; + +import net.bteuk.minecraft.gui.GuiManager; +import net.bteuk.network.Network; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +public abstract class NetworkRefreshableGui extends NetworkGui implements RefreshableGui { + + public NetworkRefreshableGui(Network instance, GuiManager manager, int inventorySize, Component inventoryName) { + super(instance, manager, inventorySize, inventoryName); + } + + protected abstract void createGui(); + + /** + * Ensures the gui is refreshed on opening. + * + * @param player the player to open the gui for + */ + @Override + public void open(Player player) { + this.refresh(); + super.open(player); + } + + /** + * Refresh the gui by clearing it and creating it again. + */ + @Override + public void refresh() { + clear(); + createGui(); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/GuiInterface.java b/Plugin/src/main/java/net/bteuk/network/gui/RefreshableGui.java similarity index 82% rename from Plugin/src/main/java/net/bteuk/network/gui/GuiInterface.java rename to Plugin/src/main/java/net/bteuk/network/gui/RefreshableGui.java index e8a8dce7..7cc979d2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/GuiInterface.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/RefreshableGui.java @@ -1,6 +1,6 @@ package net.bteuk.network.gui; -public interface GuiInterface { +public interface RefreshableGui { /** * Refresh the gui. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/Shop.java b/Plugin/src/main/java/net/bteuk/network/gui/Shop.java index ef1ea0de..84eda9bc 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/Shop.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/Shop.java @@ -1,50 +1,50 @@ -package net.bteuk.network.gui; - -import net.bteuk.network.Network; -import net.bteuk.network.utils.Utils; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Material; - -public class Shop extends Gui { - - public Shop() { - - super(27, Component.text("Shop", NamedTextColor.AQUA, TextDecoration.BOLD)); - - createGui(); - } - - private void createGui() { - - setItem(10, Utils.createItem(Material.PINK_CONCRETE_POWDER, 1, - Utils.title("2023 Card Pack"), - Utils.line("Price: 1000")), - u -> { - } - ); - - // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the navigator main menu.")), - u -> - - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to navigation menu. - Network.getInstance().navigatorGui.open(u); - }); - } - - public void refresh() { - - this.clearGui(); - createGui(); - } -} +// package net.bteuk.network.gui; +// +// import net.bteuk.network.Network; +// import net.bteuk.network.utils.Utils; +// import net.kyori.adventure.text.Component; +// import net.kyori.adventure.text.format.NamedTextColor; +// import net.kyori.adventure.text.format.TextDecoration; +// import org.bukkit.Material; +// +// public class Shop extends Gui { +// +// public Shop() { +// +// super(27, Component.text("Shop", NamedTextColor.AQUA, TextDecoration.BOLD)); +// +// createGui(); +// } +// +// private void createGui() { +// +// setItem(10, Utils.createItem(Material.PINK_CONCRETE_POWDER, 1, +// Utils.title("2023 Card Pack"), +// Utils.line("Price: 1000")), +// (NetworkUser u) -> { +// } +// ); +// +// // Return +// setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, +// Utils.title("Return"), +// Utils.line("Open the navigator main menu.")), +// u -> +// +// { +// +// // Delete this gui. +// this.delete(); +// u.mainGui = null; +// +// // Switch to navigation menu. +// Network.getInstance().navigatorGui.open(u.player); +// }); +// } +// +// public void refresh() { +// +// this.clearGui(); +// createGui(); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java index b8a23e6e..dcfb6194 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java @@ -1,89 +1,63 @@ package net.bteuk.network.gui; +import net.bteuk.minecraft.gui.GuiManager; +import net.bteuk.network.Network; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class UtilsGui extends Gui { - - public UtilsGui() { - - super(27, Component.text("Building Utils", NamedTextColor.AQUA, TextDecoration.BOLD)); +public class UtilsGui extends NetworkGui { + public UtilsGui(Network instance, GuiManager manager) { + super(instance, manager, 27, Component.text("Building Utils", NamedTextColor.AQUA, TextDecoration.BOLD)); createGui(); } public void createGui() { // Get debug stick. - setItem(13, Utils.createItem(Material.DEBUG_STICK, 1, - Utils.title("Debug Stick"), - Utils.line("Click to get the debug stick.")), - u -> - - { + setItem(13, Utils.createItem(Material.DEBUG_STICK, 1, Utils.title("Debug Stick"), Utils.line("Click to get the debug stick.")), (NetworkUser u) -> { - // Delete this gui. - u.player.closeInventory(); + // Delete this gui. + u.player.closeInventory(); - // Run the command to get the item. - u.player.performCommand("debugstick"); - }); + // Run the command to get the item. + u.player.performCommand("debugstick"); + }); // Get light block. - setItem(11, Utils.createItem(Material.LIGHT, 1, - Utils.title("Light"), - Utils.line("Click to get a light.")), - u -> + setItem(11, Utils.createItem(Material.LIGHT, 1, Utils.title("Light"), Utils.line("Click to get a light.")), (NetworkUser u) -> { - { + // Delete this gui. + u.player.closeInventory(); - // Delete this gui. - u.player.closeInventory(); - - // Run the command to get the item. - u.player.performCommand("light"); - }); + // Run the command to get the item. + u.player.performCommand("light"); + }); // Get barrier block. - setItem(15, Utils.createItem(Material.BARRIER, 1, - Utils.title("Barrier"), - Utils.line("Click to get a barrier.")), - u -> - - { + setItem(15, Utils.createItem(Material.BARRIER, 1, Utils.title("Barrier"), Utils.line("Click to get a barrier.")), (NetworkUser u) -> { - // Delete this gui. - u.player.closeInventory(); + // Delete this gui. + u.player.closeInventory(); - // Run the command to get the item. - u.player.performCommand("barrier"); - }); + // Run the command to get the item. + u.player.performCommand("barrier"); + }); // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the navigator main menu.")), - u -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), (NetworkUser u) -> { - { + // Delete this gui. + this.delete(); + u.mainGui = null; - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to navigation menu. - u.mainGui = new BuildGui(u); - u.mainGui.open(u); - }); - } - - @Override - public void refresh() { - - clearGui(); - createGui(); + // Switch to navigation menu. + u.mainGui = new BuildGui(u); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index cfe16de4..472b1fc2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -3,21 +3,23 @@ import lombok.Getter; import lombok.Setter; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; import net.bteuk.network.eventing.listeners.navigation.LocationNameListener; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.staff.LocationRequests; import net.bteuk.network.gui.staff.StaffGui; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.AddLocationType; import net.bteuk.network.utils.enums.Category; -import net.bteuk.network.utils.enums.ServerType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -27,13 +29,17 @@ import java.util.Arrays; import static net.bteuk.network.lib.enums.ChatChannels.REVIEWER; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; public class AddLocation extends Gui { + private final Network instance; + @Getter private final AddLocationType type; + private final Constants constants; + private final Back back; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; public SelectSubcategory selectSubcategory; private String old_name; @Setter @@ -46,20 +52,25 @@ public class AddLocation extends Gui { private LocationNameListener locationNameListener; private GlobalSQL globalSQL; - public AddLocation(AddLocationType type) { - + public AddLocation(Network instance, AddLocationType type, Constants constants, Back back, EventAPI eventAPI, ServerAPI serverAPI) { super(27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); + this.instance = instance; this.type = type; + this.constants = constants; + this.back = back; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; createGui(); } // This is used when location details need to be updated. - public AddLocation(AddLocationType type, String name, int coordinate_id, Category category, String subcategory) { - + public AddLocation(Network instance, AddLocationType type, String name, int coordinate_id, Category category, String subcategory) { super(27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); + this.instance = instance; + // Set name. this.old_name = name; this.name = name; @@ -80,56 +91,46 @@ public AddLocation(AddLocationType type, String name, int coordinate_id, Categor } private void createGui() { - - // Get globalSQL. - globalSQL = Network.getInstance().getGlobalSQL(); - // Set/edit name. if (name != null) { - setItem(11, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Update Location Name"), Utils.line( - "Edit the location name."), Utils.line("The current name is: ").append(Component.text(name, - NamedTextColor.GRAY)), Utils.line("You can type the name in chat.")), + setItem(11, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Update Location Name"), Utils.line("Edit the location name."), + Utils.line("The current name is: ").append(Component.text(name, NamedTextColor.GRAY)), Utils.line("You can type the name in chat.")), - u -> { + (NetworkUser u) -> { if (locationNameListener != null) { locationNameListener.unregister(); } locationNameListener = new LocationNameListener(u.player, this); - u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + - "counts. You can include spaces in the name.")); + u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + "counts. You can include spaces in the name.")); u.player.closeInventory(); }); } else { - setItem(11, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Set Location Name"), Utils.line("Add " + - "the location name."), Utils.line("You can type the name in chat.")), + setItem(11, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Set Location Name"), Utils.line("Add " + "the location name."), + Utils.line("You can type the name in chat.")), - u -> { + (NetworkUser u) -> { if (locationNameListener != null) { locationNameListener.unregister(); } locationNameListener = new LocationNameListener(u.player, this); - u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + - "counts. You can include spaces in the name.")); + u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + "counts. You can include spaces in the name.")); u.player.closeInventory(); }); } // Select category. - setItem(15, Utils.createItem(Material.MAP, 1, Utils.title("Select Category"), Utils.line("Click to cycle " + - "through categories."), - Utils.line("Current category is: ").append(Component.text(category.getLabel(), - NamedTextColor.GRAY)), Utils.line("Available categories are:"), Utils.line("England, " + - "Scotland, Wales, Northern Ireland and Other")), + setItem(15, Utils.createItem(Material.MAP, 1, Utils.title("Select Category"), Utils.line("Click to cycle " + "through categories."), + Utils.line("Current category is: ").append(Component.text(category.getLabel(), NamedTextColor.GRAY)), Utils.line("Available categories are:"), + Utils.line("England, " + "Scotland, Wales, Northern Ireland and Other")), - u -> { + (NetworkUser u) -> { // Cycle to next category and refresh the gui. - Category[] categories = - Arrays.stream(Category.values()).filter(Category::isSelectable).toArray(Category[]::new); + Category[] categories = Arrays.stream(Category.values()).filter(Category::isSelectable).toArray(Category[]::new); for (int i = 0; i < categories.length; i++) { if (categories[i] == category) { // Get next. @@ -148,16 +149,16 @@ private void createGui() { }); // Select subcategory. - setItem(16, Utils.createItem(Material.COMPASS, 1, Utils.title("Select Subcategory"), Utils.line("Click to " + - "select a subcategory."), Utils.line("This is optional, you can"), Utils.line("leave it as " + - "'None' if there"), Utils.line("are no suitable options"), Utils.line("Current subcategory " + - "is: ").append(Component.text(subcategory, NamedTextColor.GRAY))), + setItem(16, + Utils.createItem(Material.COMPASS, 1, Utils.title("Select Subcategory"), Utils.line("Click to " + "select a subcategory."), Utils.line("This is optional, you can"), + Utils.line("leave it as " + "'None' if there"), Utils.line("are no suitable options"), + Utils.line("Current subcategory " + "is: ").append(Component.text(subcategory, NamedTextColor.GRAY))), - u -> { + (NetworkUser u) -> { // Open select county menu. - selectSubcategory = new SelectSubcategory(this); - selectSubcategory.open(u); + selectSubcategory = new SelectSubcategory(instance, this); + selectSubcategory.open(u.player); }); // Teleport location update. @@ -166,8 +167,7 @@ private void createGui() { if (type != AddLocationType.ADD) { // Teleport to location. - setItem(21, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Location"), Utils.line( - "Click to teleport to the location.")), u -> { + setItem(21, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Location"), Utils.line("Click to teleport to the location.")), (NetworkUser u) -> { // Close inventory. u.player.closeInventory(); @@ -175,42 +175,39 @@ private void createGui() { // If location is on this server teleport the player, else switch server. // Teleport to location. String server = globalSQL.getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); - if (SERVER_NAME.equalsIgnoreCase(server)) { + if (constants.serverName().equalsIgnoreCase(server)) { // Get location from coordinate id. Location l = globalSQL.getLocation(coordinate_id); // Set current location for /back - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); + back.setPreviousCoordinate(u.player.getUniqueId().toString(), LocationAdapter.adapt(u.player.getLocation())); u.player.teleport(l); } else { // Create teleport event and switch server. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport " + - "location_request " + name, u.player.getLocation()); - SwitchServer.switchServer(u.player, server); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport " + "location_request " + name, + LocationAdapter.adapt(u.player.getLocation())); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } }); // Update teleport location. - setItem(23, Utils.createItem(Material.ACACIA_BOAT, 1, Utils.title("Update teleport location"), - Utils.line("Click to set the teleport"), Utils.line("location to your current position.")), u -> { + setItem(23, Utils.createItem(Material.ACACIA_BOAT, 1, Utils.title("Update teleport location"), Utils.line("Click to set the teleport"), + Utils.line("location to your current position.")), (NetworkUser u) -> { Location l = u.player.getLocation(); // If server is plotsystem add the necessary coordinate transformation. - if (SERVER_TYPE == ServerType.PLOT) { + if (constants.serverType() == ServerType.PLOT) { String worldName = u.player.getLocation().getWorld().getName(); // If location exists. - if (Network.getInstance().getPlotSQL() - .hasRow("SELECT name FROM location_data WHERE name='" + worldName + "';")) { + if (instance.getPlotAPI().hasLocation(worldName)) { // Add coordinate transformation. - l = new Location(l.getWorld(), l.getX() - Network.getInstance().getPlotSQL().getInt("SELECT " + - "xTransform FROM location_data WHERE name='" + worldName + "';"), l.getY(), - l.getZ() - Network.getInstance().getPlotSQL().getInt("SELECT zTransform FROM " + - "location_data WHERE name='" + worldName + "';"), l.getYaw(), l.getPitch()); + l = new Location(l.getWorld(), l.getX() - instance.getPlotAPI().getXTransform(worldName), l.getY(), + l.getZ() - instance.getPlotAPI().getZTransform(worldName), l.getYaw(), l.getPitch()); } } @@ -227,11 +224,10 @@ private void createGui() { Notify reviewers if online using reviewer chat channel */ if (type == AddLocationType.ADD) { - setItem(13, Utils.createItem(Material.EMERALD, 1, Utils.title("Add Location"), Utils.line("Your location " + - "will be added to the exploration menu."), Utils.line("However, it must first be accepted" + - " by a reviewer.")), + setItem(13, Utils.createItem(Material.EMERALD, 1, Utils.title("Add Location"), Utils.line("Your location " + "will be added to the exploration menu."), + Utils.line("However, it must first be accepted" + " by a reviewer.")), - u -> { + (NetworkUser u) -> { // Checks: // Name has been set @@ -241,18 +237,14 @@ private void createGui() { u.player.closeInventory(); // Name isn't duplicate (location or subcategory. - } else if (globalSQL.hasRow("SELECT location FROM location_data WHERE location='" + name + - "';") || globalSQL.hasRow( + } else if (globalSQL.hasRow("SELECT location FROM location_data WHERE location='" + name + "';") || globalSQL.hasRow( "SELECT name FROM location_subcategory WHERE name='" + name + "';")) { - u.player.sendMessage(ChatUtils.error("A location or subcategory with this name already " + - "exists.")); + u.player.sendMessage(ChatUtils.error("A location or subcategory with this name already " + "exists.")); u.player.closeInventory(); - } else if (globalSQL.hasRow( - "SELECT location FROM location_requests WHERE location = '" + name + "';")) { + } else if (globalSQL.hasRow("SELECT location FROM location_requests WHERE location = '" + name + "';")) { - u.player.sendMessage(ChatUtils.error("A location with this name has already been " + - "requested.")); + u.player.sendMessage(ChatUtils.error("A location with this name has already been " + "requested.")); u.player.closeInventory(); } else { @@ -264,16 +256,14 @@ private void createGui() { String worldName = u.player.getLocation().getWorld().getName(); // If location exists. - if (Network.getInstance().getPlotSQL().hasRow("SELECT name FROM location_data WHERE " + - "name='" + worldName + "';")) { + if (Network.getInstance().getPlotSQL().hasRow("SELECT name FROM location_data WHERE " + "name='" + worldName + "';")) { // Add coordinate transformation. l = new Location(l.getWorld(), - l.getX() - Network.getInstance().getPlotSQL().getInt("SELECT xTransform " + - "FROM location_data WHERE name='" + worldName + "';"), l.getY(), - l.getZ() - Network.getInstance().getPlotSQL().getInt("SELECT zTransform " + - "FROM location_data WHERE name='" + worldName + "';"), l.getYaw() - , l.getPitch()); + l.getX() - Network.getInstance().getPlotSQL().getInt("SELECT xTransform " + "FROM location_data WHERE name='" + worldName + "';"), + l.getY(), + l.getZ() - Network.getInstance().getPlotSQL().getInt("SELECT zTransform " + "FROM location_data WHERE name='" + worldName + "';"), + l.getYaw(), l.getPitch()); } } @@ -290,26 +280,21 @@ private void createGui() { } }); } else if (type == AddLocationType.UPDATE) { - setItem(4, Utils.createItem(Material.EMERALD, 1, Utils.title("Update Location"), Utils.line("The location" + - " will be updated"), Utils.line("with the selected settings.")), + setItem(4, Utils.createItem(Material.EMERALD, 1, Utils.title("Update Location"), Utils.line("The location" + " will be updated"), + Utils.line("with the selected settings.")), - u -> { + (NetworkUser u) -> { // Checks: // Name isn't duplicate - if (globalSQL.hasRow("SELECT location FROM location_data WHERE location='" + name + " AND " + - "coordinate<>" + coordinate_id + "';") || globalSQL.hasRow("SELECT name FROM " + - "location_subcategory WHERE name='" + name + "';")) { + if (globalSQL.hasRow("SELECT location FROM location_data WHERE location='" + name + " AND " + "coordinate<>" + coordinate_id + "';") || globalSQL.hasRow( + "SELECT name FROM " + "location_subcategory WHERE name='" + name + "';")) { - u.player.sendMessage(ChatUtils.error("Another location or subcategory with this name " + - "already exists.")); + u.player.sendMessage(ChatUtils.error("Another location or subcategory with this name " + "already exists.")); u.player.closeInventory(); - } else if (globalSQL.hasRow( - "SELECT location FROM location_requests WHERE location = '" + name + " AND coordinate" + - "<>" + coordinate_id + "';")) { + } else if (globalSQL.hasRow("SELECT location FROM location_requests WHERE location = '" + name + " AND coordinate" + "<>" + coordinate_id + "';")) { - u.player.sendMessage(ChatUtils.error("A location with this name has already been " + - "requested.")); + u.player.sendMessage(ChatUtils.error("A location with this name has already been " + "requested.")); u.player.closeInventory(); } else { @@ -319,9 +304,8 @@ private void createGui() { } else if (type == AddLocationType.REVIEW) { // Accept request. - setItem(3, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Location Request"), - Utils.line("Location will be added to"), Utils.line("the exploration menu as well as"), - Utils.line("the list of warps.")), u -> { + setItem(3, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Location Request"), Utils.line("Location will be added to"), + Utils.line("the exploration menu as well as"), Utils.line("the list of warps.")), (NetworkUser u) -> { // Accept request. acceptRequest(u); @@ -330,32 +314,29 @@ private void createGui() { this.delete(); u.staffGui = new LocationRequests(); - u.staffGui.open(u); + u.staffGui.open(u.player); }); // Deny request. - setItem(5, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Deny Location Request"), Utils.line( - "Location request will be denied.")), u -> { + setItem(5, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Deny Location Request"), Utils.line("Location request will be denied.")), (NetworkUser u) -> { // Delete request. globalSQL.update("DELETE FROM location_requests WHERE location='" + name + "';"); // Notify player. - u.player.sendMessage(ChatUtils.error("Denied location request ").append(Component.text(name, - NamedTextColor.DARK_RED))); + u.player.sendMessage(ChatUtils.error("Denied location request ").append(Component.text(name, NamedTextColor.DARK_RED))); // Delete gui and return to previous menu. this.delete(); u.staffGui = new LocationRequests(); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } // Return if (type == AddLocationType.ADD) { - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + - " menu.")), u -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + " menu.")), u -> { @@ -364,27 +345,25 @@ private void createGui() { // Switch to navigation menu. u.mainGui = new ExploreGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else if (type == AddLocationType.REVIEW) { - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to " + - "location requests.")), u -> { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to " + "location requests.")), (NetworkUser u) -> { // Delete gui and return to previous menu. this.delete(); u.staffGui = new LocationRequests(); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } else { - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to staff " + - "menu.")), u -> { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to staff " + "menu.")), (NetworkUser u) -> { // Delete gui and return to previous menu. this.delete(); u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } } @@ -396,22 +375,18 @@ private void addLocation(NetworkUser u) { if (!subcategory.equals("None")) { subcategory_id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + "';"); if (subcategory_id == 0) { - u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + - "subcategory.")); + u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + "subcategory.")); } } if (subcategory_id == 0) { - globalSQL.update( - "INSERT INTO location_data(location,category,coordinate) " + "VALUES('" + name + "','" + category + "'," + coordinate_id + ");"); + globalSQL.update("INSERT INTO location_data(location,category,coordinate) " + "VALUES('" + name + "','" + category + "'," + coordinate_id + ");"); } else { globalSQL.update( - "INSERT INTO location_data(location,category,subcategory,coordinate) " + "VALUES('" + name + "'," + - "'" + category + "'," + subcategory_id + "," + coordinate_id + ");"); + "INSERT INTO location_data(location,category,subcategory,coordinate) " + "VALUES('" + name + "'," + "'" + category + "'," + subcategory_id + "," + coordinate_id + ");"); } - u.player.sendMessage(ChatUtils.success("Location ").append(Component.text(name, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" added to exploration menu."))); + u.player.sendMessage(ChatUtils.success("Location ").append(Component.text(name, NamedTextColor.DARK_AQUA)).append(ChatUtils.success(" added to exploration menu."))); // Delete gui. this.delete(); @@ -428,21 +403,18 @@ public void updateLocation(NetworkUser u) { if (!subcategory.equals("None")) { subcategory_id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + "';"); if (subcategory_id == 0) { - u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + - "subcategory.")); + u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + "subcategory.")); } } if (subcategory_id == 0) { - globalSQL.update("UPDATE location_data SET location='" + name + "',category='" + category + "' WHERE " + - "location='" + old_name + "';"); + globalSQL.update("UPDATE location_data SET location='" + name + "',category='" + category + "' WHERE " + "location='" + old_name + "';"); } else { - globalSQL.update("UPDATE location_data SET location='" + name + "',category='" + category + "'," + - "subcategory=" + subcategory_id + " WHERE location='" + old_name + "';"); + globalSQL.update( + "UPDATE location_data SET location='" + name + "',category='" + category + "'," + "subcategory=" + subcategory_id + " WHERE location='" + old_name + "';"); } - u.player.sendMessage(ChatUtils.success("Updated location ").append(Component.text(name, - NamedTextColor.DARK_AQUA))); + u.player.sendMessage(ChatUtils.success("Updated location ").append(Component.text(name, NamedTextColor.DARK_AQUA))); // Delete gui. this.delete(); @@ -461,24 +433,20 @@ public void acceptRequest(NetworkUser u) { if (!subcategory.equals("None")) { subcategory_id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + "';"); if (subcategory_id == 0) { - u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + - "subcategory.")); + u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + "subcategory.")); } } // Add location. if (subcategory_id == 0) { - globalSQL.update( - "INSERT INTO location_data(location,category,coordinate) " + "VALUES('" + name + "','" + category + "'," + coordinate_id + ");"); + globalSQL.update("INSERT INTO location_data(location,category,coordinate) " + "VALUES('" + name + "','" + category + "'," + coordinate_id + ");"); } else { globalSQL.update( - "INSERT INTO location_data(location,category,subcategory,coordinate) " + "VALUES('" + name + "'," + - "'" + category + "'," + subcategory_id + "," + coordinate_id + ");"); + "INSERT INTO location_data(location,category,subcategory,coordinate) " + "VALUES('" + name + "'," + "'" + category + "'," + subcategory_id + "," + coordinate_id + ");"); } // Notify player. - u.player.sendMessage(ChatUtils.success("Accepted location request ").append(Component.text(name, - NamedTextColor.DARK_AQUA))); + u.player.sendMessage(ChatUtils.success("Accepted location request ").append(Component.text(name, NamedTextColor.DARK_AQUA))); } public void requestLocation(NetworkUser u) { @@ -488,23 +456,19 @@ public void requestLocation(NetworkUser u) { if (!subcategory.equals("None")) { subcategory_id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + "';"); if (subcategory_id == 0) { - u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + - "subcategory.")); + u.player.sendMessage(ChatUtils.error("The subcategory no longer exists, adding location without " + "subcategory.")); } } if (subcategory_id == 0) { - globalSQL.update("INSERT INTO location_requests(location,category,coordinate) " + "VALUES('" + name + "'," + - "'" + category + "'," + coordinate_id + ");"); + globalSQL.update("INSERT INTO location_requests(location,category,coordinate) " + "VALUES('" + name + "'," + "'" + category + "'," + coordinate_id + ");"); } else { globalSQL.update( - "INSERT INTO location_requests(location,category,subcategory,coordinate) " + "VALUES('" + name + - "','" + category + "'," + subcategory_id + "," + coordinate_id + ");"); + "INSERT INTO location_requests(location,category,subcategory,coordinate) " + "VALUES('" + name + "','" + category + "'," + subcategory_id + "," + coordinate_id + ");"); } // Notify reviewers. - ChatMessage chatMessage = new ChatMessage(REVIEWER.getChannelName(), "server", ChatUtils.success("A new " + - "location has been requested.")); + ChatMessage chatMessage = new ChatMessage(REVIEWER.getChannelName(), "server", ChatUtils.success("A new " + "location has been requested.")); Network.getInstance().getChat().sendSocketMessage(chatMessage); u.player.sendMessage(ChatUtils.success("Location %s requested.", name)); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java index 51318396..f62e14e8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java @@ -2,7 +2,7 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.listeners.navigation.LocationSearch; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -15,7 +15,7 @@ import static net.bteuk.network.utils.NetworkConfig.CONFIG; -public class ExploreGui extends Gui { +public class ExploreGui extends NetworkRefreshableGui { private final NetworkUser u; @@ -34,14 +34,14 @@ private void createGui() { if (u.player.hasPermission("uknet.navigation.request")) { setItem(18, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Add Location"), - Utils.line("Request a new location to add"), Utils.line("to the exploration menu.")), u -> { + Utils.line("Request a new location to add"), Utils.line("to the exploration menu.")), (NetworkUser u) -> { this.delete(); u.mainGui = null; // Switch to the location add menu. u.mainGui = new AddLocation(AddLocationType.ADD); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -109,7 +109,7 @@ private void createGui() { // Find Locations setItem(23, Utils.createItem(Material.OAK_SIGN, 1, Utils.title("Find Locations"), - Utils.line("Click to " + "search" + " for locations"), Utils.line("based on chat input.")), u -> { + Utils.line("Click to " + "search" + " for locations"), Utils.line("based on chat input.")), (NetworkUser u) -> { u.player.sendMessage(ChatUtils.success("Type a word or phrase in chat to search for locations.")); new LocationSearch(u); u.player.closeInventory(); @@ -117,13 +117,13 @@ private void createGui() { // Return setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), - Utils.line("Open the navigator " + "main menu.")), u -> { + Utils.line("Open the navigator " + "main menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to navigation menu. - Network.getInstance().navigatorGui.open(u); + Network.getInstance().navigatorGui.open(u.player); }); } @@ -147,7 +147,7 @@ private void openLocation(String name, NetworkUser u, Category category) { // Switch to location menu. this.delete(); u.mainGui = gui; - u.mainGui.open(u); + u.mainGui.open(u.player); } } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java index 04eec02c..868aeabe 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java @@ -3,7 +3,6 @@ import net.bteuk.network.Network; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.SwitchServer; @@ -130,13 +129,13 @@ private void createGui() { Utils.title(location.getKey()), Utils.line("Click to open the menu for"), Utils.line("for this subcategory.")), - u -> { + (NetworkUser u) -> { u.mainGui = new LocationMenu(location.getKey(), u, Category.SUBCATEGORY, category, location.getKey()); // Switch to location menu. this.delete(); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else { // Create location teleport button. @@ -144,7 +143,7 @@ private void createGui() { Utils.title(location.getKey()), Utils.line("Click to teleport here.")), - u -> { + (NetworkUser u) -> { // Get the coordinate id. int coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM " + @@ -217,7 +216,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the previous menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -227,7 +226,7 @@ private void createGui() { if (!returnGui.isDeleteOnClose()) { u.mainGui = returnGui; } - returnGui.open(u); + returnGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("An error occurred, please contact an admin.")); u.player.closeInventory(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java index 4b7111cd..b7cc0994 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.navigation; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.AddLocationType; @@ -14,14 +13,15 @@ public class SelectSubcategory extends Gui { + private final Network instance; private final AddLocation addLocation; private int page = 1; - public SelectSubcategory(AddLocation addLocation) { - + public SelectSubcategory(Network instance, AddLocation addLocation) { super(45, Component.text("Select Subcategory", NamedTextColor.AQUA, TextDecoration.BOLD)); + this.instance = instance; this.addLocation = addLocation; createGui(); } @@ -29,9 +29,9 @@ public SelectSubcategory(AddLocation addLocation) { private void createGui() { // Iterate through subcatories, starting with 'None'. - List subcategories = Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM " + + List subcategories = instance.getGlobalSQL().getStringList("SELECT name FROM " + "location_subcategory WHERE category='" + addLocation.getCategory() + "' ORDER BY name ASC;"); - subcategories.add(0, "None"); + subcategories.addFirst("None"); // If page > 1 set number of iterations that must be skipped. int skip = (page - 1) * 21; @@ -66,7 +66,7 @@ private void createGui() { Utils.title(subcategory), Utils.line("Click to select this subcategory.")), - u -> { + (NetworkUser u) -> { // Set the county. addLocation.setSubcategory(subcategory); returnToAddLocation(u); @@ -124,10 +124,10 @@ private void returnToAddLocation(NetworkUser u) { // Return to addlocation. if (addLocation.getType() == AddLocationType.ADD) { u.mainGui.refresh(); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.staffGui.refresh(); - u.staffGui.open(u); + u.staffGui.open(u.player); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java index 7c56b35d..e9ecf84e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java @@ -4,7 +4,6 @@ import lombok.Getter; import lombok.Setter; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -162,14 +161,14 @@ private void createGuiAsync() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Return to the plot menu. u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -196,14 +195,14 @@ private void createPlayerHeadGuiItem(PlayerProfile profile, int plotID, String u "WHERE uuid='" + uuid + "';"), NamedTextColor.GRAY)), Utils.line("Click to open the menu of this plot.")); - setItem(slot, guiItem, u -> { + setItem(slot, guiItem, (NetworkUser u) -> { // Switch to plot info. if (plotInfo != null) { plotInfo.deleteThis(); } plotInfo = new PlotInfo(u, plotID); plotInfo.setAcceptedPlotMenu(this); - plotInfo.open(u); + plotInfo.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java index e2926dc4..94f559d4 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -32,7 +31,7 @@ private void createGui() { setItem(13, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Save and Close Zone " + id), Utils.line("Saves the zone and closes it.")), - u -> { + (NetworkUser u) -> { // Delete this inventory. this.delete(); @@ -64,7 +63,7 @@ private void createGui() { // Switch back to zone info. u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java index c4cb06cf..7546c120 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java @@ -3,7 +3,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Utils; @@ -37,7 +36,7 @@ private void createGui() { setItem(13, Utils.createItem(Material.TNT, 1, Utils.title("Delete " + regionType.label + " " + id), Utils.line("Delete the " + regionType.label + " and its contents.")), - u -> { + (NetworkUser u) -> { // Delete this inventory. this.delete(); @@ -96,7 +95,7 @@ private void createGui() { u.mainGui = new BuildGui(u); } - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java index b250ec25..5413df6a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.plotsystem; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Utils; @@ -69,7 +68,7 @@ private void createGui() { "AND uuid='" + uuid + "' AND attempt=" + i + ";") + "';"), NamedTextColor.GRAY))), - u -> { + (NetworkUser u) -> { // Close the inventory. u.player.closeInventory(); @@ -106,7 +105,7 @@ private void createGui() { // Switch back to plot menu. u.mainGui = new PlotInfo(u, plotID); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java index 6cf4d11d..87dd52c8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java @@ -2,7 +2,6 @@ import com.destroystokyo.paper.profile.PlayerProfile; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -93,7 +92,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of users.")), - u -> { + (NetworkUser u) -> { // Update the gui. page++; @@ -121,7 +120,7 @@ private void createGui() { Utils.title("All Plots"), Utils.line("Click to set the filter"), Utils.line("to all completed plots.")), - u -> { + (NetworkUser u) -> { // Set the filter and refresh the accepted plots menu at page 1. acceptedPlotMenu.setFilter(uuid); acceptedPlotMenu.setPage(1); @@ -129,7 +128,7 @@ private void createGui() { this.refresh(); // Return to the accepted plot menu. - acceptedPlotMenu.open(u); + acceptedPlotMenu.open(u.player); }); } else { @@ -183,7 +182,7 @@ private void createPlayerHeadGuiItem(PlayerProfile profile, int amount, String u Utils.title(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';")), Utils.line("Click to set the filter"), Utils.line("to this player.")), - u -> { + (NetworkUser u) -> { // Set the filter and refresh the accepted plots menu at page 1. acceptedPlotMenu.setFilter(uuid); acceptedPlotMenu.setPage(1); @@ -191,7 +190,7 @@ private void createPlayerHeadGuiItem(PlayerProfile profile, int amount, String u this.refresh(); // Return to the accepted plot menu. - acceptedPlotMenu.open(u); + acceptedPlotMenu.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 092a24e9..52e1f544 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -3,7 +3,6 @@ import lombok.Setter; import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.InviteMembers; import net.bteuk.network.gui.tutorials.RecommendedTutorialsGui; import net.bteuk.network.lib.utils.ChatUtils; @@ -91,18 +90,18 @@ public void createGui() { } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), u -> { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), (NetworkUser u) -> { // Switch back to plot menu, or accepted plot menu. if (status == PlotStatus.COMPLETED && acceptedPlotMenu != null) { this.deleteThis(); acceptedPlotMenu.setPlotInfo(null); - acceptedPlotMenu.open(u); + acceptedPlotMenu.open(u.player); } else { // Delete this gui. this.delete(); u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } }); @@ -110,7 +109,7 @@ public void createGui() { setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Plot " + plotID), createPlotInfo(status))); // Plot Teleport (Always in slot 24). - setItem(24, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Plot"), Utils.line("Click to teleport to this plot.")), u -> { + setItem(24, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Plot"), Utils.line("Click to teleport to this plot.")), (NetworkUser u) -> { u.player.closeInventory(); // Get the server of the plot. @@ -138,7 +137,7 @@ public void createGui() { // Plot in Google Maps (In slot 20 or 23 depending on the situation). setItem(getSlotForGoogleMapsLink(plotInfoType), - Utils.createItem(Material.ENDER_EYE, 1, Utils.title("View plot in Google Maps"), Utils.line("Click to be linked to the plot in Google Maps.")), u -> { + Utils.createItem(Material.ENDER_EYE, 1, Utils.title("View plot in Google Maps"), Utils.line("Click to be linked to the plot in Google Maps.")), (NetworkUser u) -> { u.player.closeInventory(); // Get corners of the plot. @@ -177,7 +176,7 @@ public void createGui() { // Enable/disable outlines for the plot. (Slot 18 if owner or member) if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER || plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER) { setItem(18, Utils.createItem(Material.ORANGE_STAINED_GLASS, 1, Utils.title("Toggle Outlines"), Utils.line("Enable/disable the outlines"), Utils.line("for this plot."), - Utils.line("Rejoining the server"), Utils.line("will reset this to enabled.")), u -> { + Utils.line("Rejoining the server"), Utils.line("will reset this to enabled.")), (NetworkUser u) -> { EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", SERVER_NAME, "outlines toggle " + plotID); u.player.closeInventory(); }); @@ -187,7 +186,7 @@ public void createGui() { // As well as the submit/retract button. (Slot 2) // If the plot is not under review allow it to be removed. (Slot 6) if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER) { - setItem(20, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Plot Members"), Utils.line("Manage the members of your plot.")), u -> { + setItem(20, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Plot Members"), Utils.line("Manage the members of your plot.")), (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -195,11 +194,11 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new PlotsystemMembers(plotID, RegionType.PLOT); - u.mainGui.open(u); + u.mainGui.open(u.player); }); setItem(19, Utils.createItem(Material.OAK_BOAT, 1, Utils.title("Invite Members"), Utils.line("Invite a new member to your plot."), - Utils.line("You can only invite online users.")), u -> { + Utils.line("You can only invite online users.")), (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -207,12 +206,12 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new InviteMembers(plotID, RegionType.PLOT); - u.mainGui.open(u); + u.mainGui.open(u.player); }); if (status == PlotStatus.CLAIMED) { setItem(2, Utils.createItem(Material.LIGHT_BLUE_CONCRETE, 1, Utils.title("Submit Plot"), Utils.line("Submit your plot to be reviewed."), - Utils.line("Reviewing may take over 24 hours.")), u -> { + Utils.line("Reviewing may take over 24 hours.")), (NetworkUser u) -> { u.player.closeInventory(); @@ -225,7 +224,7 @@ public void createGui() { // The plot can only be retracted if it is not yet under review. if (status == PlotStatus.SUBMITTED && submittedStatus == SubmittedStatus.SUBMITTED) { - setItem(2, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title("Retract Submission"), Utils.line("Your plot will no longer be submitted.")), u -> { + setItem(2, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title("Retract Submission"), Utils.line("Your plot will no longer be submitted.")), (NetworkUser u) -> { u.player.closeInventory(); @@ -238,7 +237,7 @@ public void createGui() { // The plot can only be deleted if it is not yet submitted. if (status != PlotStatus.SUBMITTED) { - setItem(6, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Delete Plot"), Utils.line("Delete the plot and all its contents.")), u -> { + setItem(6, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Delete Plot"), Utils.line("Delete the plot and all its contents.")), (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -246,14 +245,14 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new DeleteConfirm(plotID, RegionType.PLOT); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } } // Members have the option to leave the plot (Slot 20) if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER) { - setItem(20, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Plot"), Utils.line("You will not be able to build in the plot once you leave.")), u -> { + setItem(20, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Plot"), Utils.line("You will not be able to build in the plot once you leave.")), (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -262,7 +261,7 @@ public void createGui() { // Switch back to plot menu. Bukkit.getScheduler().scheduleSyncDelayedTask(Network.getInstance(), () -> { u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }, 20L); // Add server event to leave plot. @@ -277,7 +276,7 @@ public void createGui() { if ((plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER || plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER || plotInfoType == PLOT_INFO_TYPE.REVIEWING_REVIEWER || plotInfoType == PLOT_INFO_TYPE.SUBMITTED_REVIEWER || plotInfoType == PLOT_INFO_TYPE.REVIEWED_REVIEWER || plotInfoType == PLOT_INFO_TYPE.VERIFYING_REVIEWER) && plotSQL.hasRow( "SELECT 1 FROM plot_review WHERE plot_id=" + plotID + " AND uuid='" + plot_owner + "' AND accepted=0 AND completed=1;")) { setItem(getFeedbackSlot(plotInfoType), Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Plot Feedback"), Utils.line("Click to show feedback for this plot.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -285,13 +284,13 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new DeniedPlotFeedback(plotID); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // If the plot is accepted and has feedback show for the owner (Slot 21) } else if (plotInfoType == PLOT_INFO_TYPE.ACCEPTED_OWNER && plotSQL.hasRow( "SELECT 1 FROM " + "plot_category_feedback WHERE review_id=( SELECT id FROM plot_review WHERE plot_id=" + plotID + " AND " + "accepted=1 AND completed=1 );")) { setItem(getFeedbackSlot(plotInfoType), Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Plot Feedback"), Utils.line("Click to show feedback for this plot.")), - u -> { + (NetworkUser u) -> { int reviewId = plotSQL.getInt( "SELECT id FROM plot_review WHERE uuid='" + u.getUuid() + "' " + "AND plot_id=" + plotID + " AND accepted=1 AND completed=1;"); @@ -304,14 +303,14 @@ public void createGui() { switch (plotInfoType) { case CLAIMED_OWNER, CLAIMED_MEMBER, ACCEPTED_OWNER -> { setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see your"), Utils.line("recommended tutorials")), u -> { + Utils.line("Click to see your"), Utils.line("recommended tutorials")), (NetworkUser u) -> { user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, false); user.mainGui.open(user); }); } case SUBMITTED_REVIEWER, REVIEWED_REVIEWER, REVIEWING_REVIEWER, VERIFYING_REVIEWER -> { setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), u -> { + Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), (NetworkUser u) -> { user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, true); user.mainGui.open(user); }); @@ -321,7 +320,7 @@ public void createGui() { // Architects can always add recommendations to claimed plots if (user.hasPermission("group.reviewer") || (user.hasPermission("group.architect") && plotInfoType.equals(PLOT_INFO_TYPE.CLAIMED))) { setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), u -> { + Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), (NetworkUser u) -> { user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, true); user.mainGui.open(user); }); @@ -331,7 +330,7 @@ public void createGui() { // If the plot is submitted add the start review option for reviewers. (Slot 20) if (plotInfoType == PLOT_INFO_TYPE.SUBMITTED_REVIEWER) { - setItem(20, Utils.createItem(Material.EMERALD, 1, Utils.title("Review Plot"), Utils.line("Click to start reviewing this plot.")), u -> { + setItem(20, Utils.createItem(Material.EMERALD, 1, Utils.title("Review Plot"), Utils.line("Click to start reviewing this plot.")), (NetworkUser u) -> { // If you are not owner or member of the plot, start the review. if (canReviewPlot()) { // Get server of plot. @@ -359,7 +358,7 @@ public void createGui() { // If the plot has been reviewed and must be verified add the start verifying option for reviewers. (Slot // 20) } else if (plotInfoType == PLOT_INFO_TYPE.REVIEWED_REVIEWER) { - setItem(20, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Verify Plot"), Utils.line("Click to start verifying this plot.")), u -> { + setItem(20, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Verify Plot"), Utils.line("Click to start verifying this plot.")), (NetworkUser u) -> { if (canVerifyPlot()) { // Get server of plot. String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + Network.getInstance().getPlotSQL() diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java index 384502a8..4d674cbf 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java @@ -2,7 +2,7 @@ import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -13,7 +13,7 @@ import java.util.ArrayList; -public class PlotMenu extends Gui { +public class PlotMenu extends NetworkRefreshableGui { private final NetworkUser user; private final PlotSQL plotSQL; @@ -53,14 +53,14 @@ private void createGui() { 1, Utils.title("Plot " + plots.get(i)), Utils.line("Click to open the menu of this plot.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new PlotInfo(u, plots.get(finalI)); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Increase slot accordingly. @@ -80,13 +80,13 @@ private void createGui() { Utils.title("Verified Reviews"), Utils.line("Click to view all verifications"), Utils.line("on plots that you have reviewed.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; u.mainGui = new VerificationMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -94,28 +94,28 @@ private void createGui() { setItem(40, Utils.createItem(Material.CLOCK, 1, Utils.title("Accepted Plots"), Utils.line("Click to view your accepted plots.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new AcceptedPlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Return setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the building menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java index dce0659f..22ef8b18 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java @@ -3,7 +3,7 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -19,7 +19,7 @@ import static net.bteuk.network.utils.Constants.SERVER_NAME; -public class PlotServerLocations extends Gui { +public class PlotServerLocations extends NetworkRefreshableGui { private final PlotSQL plotSQL; private int plotDifficulty; @@ -306,7 +306,7 @@ private void createGui() { // Create build menu. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java index d95915a0..8fe966a8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java @@ -3,7 +3,7 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.SwitchServer; @@ -20,7 +20,7 @@ import static net.bteuk.network.utils.Constants.SERVER_NAME; -public class PlotsystemLocations extends Gui { +public class PlotsystemLocations extends NetworkRefreshableGui { private final PlotSQL plotSQL; private final GlobalSQL globalSQL; @@ -55,7 +55,7 @@ private void createGui() { )), Utils.line("Click to teleport to the centre"), Utils.line("of this plotsystem location.")), - u -> { + (NetworkUser u) -> { // Teleport to centre of the plotsystem location. // Get coordinate ids for min and max. @@ -117,7 +117,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the building menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -125,7 +125,7 @@ private void createGui() { // Switch to plot info. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java index c661e45f..44555e86 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; @@ -138,7 +137,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new PlotInfo(u, id); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("This player is not a member of your Plot.")); } @@ -159,7 +158,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("This player is not a member of your Zone.")); } @@ -181,7 +180,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the " + regionType.label + " info for this " + regionType.label + ".")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -196,7 +195,7 @@ private void createGui() { u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); } - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index b70989a7..810ba6a9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.SwitchServer; @@ -44,10 +43,10 @@ public void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), - u -> { + (NetworkUser u) -> { this.delete(); u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); } ); @@ -110,7 +109,7 @@ public void createGui() { Utils.line("Click to show initial feedback"), Utils.line("for categories that were"), Utils.line("altered by the verifier.")), - u -> { + (NetworkUser u) -> { // Open the feedback book. u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(verificationId, true)); }); @@ -121,7 +120,7 @@ public void createGui() { Utils.line("Click to show altered feedback"), Utils.line("for categories that were"), Utils.line("altered by the verifier.")), - u -> { + (NetworkUser u) -> { // Open the feedback book. u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(verificationId, false)); }); @@ -130,7 +129,7 @@ public void createGui() { setItem(22, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Plot"), Utils.line("Click to teleport to this plot.")), - u -> { + (NetworkUser u) -> { u.player.closeInventory(); // Get the server of the plot. @@ -157,14 +156,14 @@ public void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the verified review menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to verified review menu. u.mainGui = new VerificationMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java index 55644554..aedd57f7 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.plotsystem; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -71,14 +70,14 @@ private void createGui() { setItem(slot, Utils.createItem(item, 1, Utils.title("Verification " + verificationId), description), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new VerificationInfo(verificationId); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Increase slot accordingly. @@ -94,14 +93,14 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new PlotMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index 68a1da6f..42a921a9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.InviteMembers; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; @@ -69,7 +68,7 @@ public void createGui() { Utils.title("Teleport to Zone"), Utils.line("Click to teleport to this zone.")), - u -> { + (NetworkUser u) -> { u.player.closeInventory(); @@ -106,7 +105,7 @@ public void createGui() { setItem(6, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Delete Zone"), Utils.line("Delete the zone and all its contents.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -114,7 +113,7 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new DeleteConfirm(zoneID, RegionType.ZONE); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Close and save zone. @@ -122,7 +121,7 @@ public void createGui() { setItem(2, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Save and close Zone"), Utils.line("Close the Zone and save its contents.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -130,14 +129,14 @@ public void createGui() { // Open close confirm menu. u.mainGui = new CloseConfirm(zoneID); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // If zone has members, edit plot members. setItem(9, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Zone Members"), Utils.line("Manage the members of your zone.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -145,7 +144,7 @@ public void createGui() { // Open the members menu. u.mainGui = new PlotsystemMembers(zoneID, RegionType.ZONE); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Invite new members to your zone. @@ -153,7 +152,7 @@ public void createGui() { Utils.title("Invite Members"), Utils.line("Invite a new member to your zone."), Utils.line("You can only invite online users.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -161,7 +160,7 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new InviteMembers(zoneID, RegionType.ZONE); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Set public/private @@ -171,7 +170,7 @@ public void createGui() { Utils.title("Set Private"), Utils.line("Private zones require you to"), Utils.line("invite people if they want to build.")), - u -> { + (NetworkUser u) -> { // Set zone to private and refresh this gui. plotSQL.update("UPDATE zones SET is_public=0 WHERE id=" + zoneID + ";"); @@ -187,7 +186,7 @@ public void createGui() { Utils.title("Set Public"), Utils.line("Public zones allow Jr.Builder+"), Utils.line("to join the zone without invitation.")), - u -> { + (NetworkUser u) -> { // Set zone to private and refresh this gui. plotSQL.update("UPDATE zones SET is_public=1 WHERE id=" + zoneID + ";"); @@ -209,7 +208,7 @@ public void createGui() { setItem(4, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Zone"), Utils.line("You will not be able to build in the zone once you leave.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -218,7 +217,7 @@ public void createGui() { // Switch back to zone menu, Bukkit.getScheduler().scheduleSyncDelayedTask(Network.getInstance(), () -> { u.mainGui = new ZoneMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }, 20L); // Add server event to leave plot. @@ -246,7 +245,7 @@ public void createGui() { // Switch back to plot menu. u.mainGui = new ZoneMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -274,7 +273,7 @@ private void setExtendZoneDurationItem(int slot, ZoneExtensionTime extension) { Utils.line("Increases the expiration time"), Utils.line("of the zone by " + extension.hours + " hours,"), Utils.line("can't exceed the maximum of " + ZoneExtensionTime.HOUR_48.hours + " hours.")), - u -> { + (NetworkUser u) -> { // Get expiration time. long expiration = plotSQL.getLong("SELECT expiration FROM zones WHERE id=" + zoneID + ";") + extension.time; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java index c55842c5..0d59e05a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java @@ -3,7 +3,7 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -14,7 +14,7 @@ import java.util.ArrayList; -public class ZoneMenu extends Gui { +public class ZoneMenu extends NetworkRefreshableGui { private final NetworkUser user; private final PlotSQL plotSQL; @@ -67,7 +67,7 @@ private void createGui() { 1, Utils.title("Zone " + zones.get(i)), Utils.line("Click to open the menu of this zone.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -75,7 +75,7 @@ private void createGui() { // Switch to zone info. u.mainGui = new ZoneInfo(u, zones.get(finalI), u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else if (plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zones.get(i) + " AND is_public=1;")) { @@ -83,7 +83,7 @@ private void createGui() { 1, Utils.title("Zone " + zones.get(i)), Utils.line("Click to join this zone.")), - u -> { + (NetworkUser u) -> { // Add server event to join zone. EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", @@ -123,7 +123,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the building menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -131,7 +131,7 @@ private void createGui() { // Switch to plot info. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java index c323faea..0de4b0be 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.progressmap; import me.bteuk.progressmapper.guis.ColourPicker; -import net.bteuk.network.gui.Gui; import org.bukkit.inventory.Inventory; public class ColourPickerGUI extends Gui { @@ -24,55 +23,55 @@ private void setActions() { //---------------------------------------------------- // Default 1 - setAction(0, u -> { + setAction(0, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Dark_Red); refresh(); }); // Default 2 - setAction(1, u -> { + setAction(1, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Red); refresh(); }); // Default 3 - setAction(2, u -> { + setAction(2, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Dark_Orange); refresh(); }); // Default 4 - setAction(3, u -> { + setAction(3, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Orange); refresh(); }); // Default 5 - setAction(4, u -> { + setAction(4, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Light_Orange); refresh(); }); // Default 6 - setAction(5, u -> { + setAction(5, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Yellow); refresh(); }); // Default 7 - setAction(6, u -> { + setAction(6, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Bright_Yellow); refresh(); }); // Default 8 - setAction(7, u -> { + setAction(7, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Sick_Green); refresh(); }); // Default 9 - setAction(8, u -> { + setAction(8, (NetworkUser u) -> { colourPicker.updateColour(ColourPicker.Complete_Green); refresh(); }); @@ -82,25 +81,25 @@ private void setActions() { //----------------------------------------------------- // Lower red 16 - setAction(11, u -> { + setAction(11, (NetworkUser u) -> { colourPicker.lowerRed16(); refresh(); }); // Lower red 1 - setAction(12, u -> { + setAction(12, (NetworkUser u) -> { colourPicker.lowerRed1(); refresh(); }); // Raise red 1 - setAction(14, u -> { + setAction(14, (NetworkUser u) -> { colourPicker.raiseRed1(); refresh(); }); // Raise red 16 - setAction(15, u -> { + setAction(15, (NetworkUser u) -> { colourPicker.raiseRed16(); refresh(); }); @@ -110,25 +109,25 @@ private void setActions() { //----------------------------------------------------- // Lower green 16 - setAction(20, u -> { + setAction(20, (NetworkUser u) -> { colourPicker.lowerGreen16(); refresh(); }); // Lower green 1 - setAction(21, u -> { + setAction(21, (NetworkUser u) -> { colourPicker.lowerGreen1(); refresh(); }); // Raise green 1 - setAction(23, u -> { + setAction(23, (NetworkUser u) -> { colourPicker.raiseGreen1(); refresh(); }); // Raise green 16 - setAction(24, u -> { + setAction(24, (NetworkUser u) -> { colourPicker.raiseGreen16(); refresh(); }); @@ -138,25 +137,25 @@ private void setActions() { //---------------------------------------------------- // Lower blue 16 - setAction(29, u -> { + setAction(29, (NetworkUser u) -> { colourPicker.lowerBlue16(); refresh(); }); // Lower blue 1 - setAction(30, u -> { + setAction(30, (NetworkUser u) -> { colourPicker.lowerBlue1(); refresh(); }); // Raise blue 1 - setAction(32, u -> { + setAction(32, (NetworkUser u) -> { colourPicker.raiseBlue1(); refresh(); }); // Raise blue 16 - setAction(33, u -> { + setAction(33, (NetworkUser u) -> { colourPicker.raiseBlue16(); refresh(); }); @@ -166,7 +165,7 @@ private void setActions() { //----------------------------------------------------- // Return/confirm - setAction(40, u -> { + setAction(40, (NetworkUser u) -> { // Saves the selected colour to the feature colourPicker.confirmColour(); @@ -177,7 +176,7 @@ private void setActions() { // Switch to feature list menu. parentFeatureMenu.refresh(); u.mainGui = parentFeatureMenu; - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java index 6ccd246c..32b3e83b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java @@ -6,7 +6,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.listeners.progressmap.FeatureGeometryEditorListener; import net.bteuk.network.eventing.listeners.progressmap.FeaturePropertiesBookListener; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -38,17 +37,17 @@ private void setActions() { // Slots here are 0 indexed // Title edit - setAction(0, u -> { + setAction(0, (NetworkUser u) -> { openFieldEditor(u, featureMenu.getTitleBook(), Field.Title); }); // Description edit - setAction(2, u -> { + setAction(2, (NetworkUser u) -> { openFieldEditor(u, featureMenu.getDescriptionBook(), Field.Description); }); // Fill/stroke edit - setAction(4, u -> { + setAction(4, (NetworkUser u) -> { // Delete this gui. // this.delete(); - NO. I do not want to do this // u.mainGui = null; - NO. u.mainGui here refers to this gui, so we never want to make it null because it @@ -56,16 +55,16 @@ private void setActions() { // Switch to colour picker menu. u.mainGui = new ColourPickerGUI(featureMenu.getColourPicker(), this); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Media_url edit - setAction(6, u -> { + setAction(6, (NetworkUser u) -> { openFieldEditor(u, featureMenu.getMedialURLBook(), Field.Media_url); }); // Geometry - setAction(8, u -> { + setAction(8, (NetworkUser u) -> { // Gives the blaze rod ItemStack blazeRod = ItemStack.of(Material.BLAZE_ROD, 1); Utils.giveItem(u.player, blazeRod, "Area selection tool"); @@ -81,7 +80,7 @@ private void setActions() { }); // Send update - setAction(22, u -> { + setAction(22, (NetworkUser u) -> { if (featureMenu.isNew()) featureMenu.sendAppend(plugin.getConfig().getString("ProgressMap.MapHubAPIKey")); else featureMenu.sendUpdate(plugin.getConfig().getString("ProgressMap.MapHubAPIKey")); @@ -95,11 +94,11 @@ private void setActions() { // Switch to feature list menu. parentLocalFeatureListGUI.refresh(); u.mainGui = parentLocalFeatureListGUI; - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Return - setAction(26, u -> { + setAction(26, (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; @@ -107,7 +106,7 @@ private void setActions() { // Switch to feature list menu. parentLocalFeatureListGUI.refresh(); u.mainGui = parentLocalFeatureListGUI; - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java index 36529a0f..60ae6776 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java @@ -3,7 +3,6 @@ import me.bteuk.progressmapper.guis.LocalFeaturesMenu; import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; import org.bukkit.inventory.Inventory; public class LocalFeatureListGUI extends Gui { @@ -28,22 +27,22 @@ private void setActions() { // Creates all of the actions for (i = 0; i < iFeatures; i++) { final int iFinalSlot = i; - setAction(i, u -> { + setAction(i, (NetworkUser u) -> { // When a feature is clicked on it needs to open a FeaturePageGUI u.mainGui = new FeaturePageGUI(features.getFeatureMenu(iFinalSlot), plugin, this); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } // Back button - setAction(getInventory().getSize() - 1, u -> { + setAction(getInventory().getSize() - 1, (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index f5c44a86..8c3a2200 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -4,15 +4,13 @@ import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.eventing.listeners.regions.RegionTagListener; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.InviteMembers; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.enums.RegionType; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -22,7 +20,7 @@ import static net.bteuk.network.utils.Constants.SERVER_NAME; -public class RegionInfo extends Gui { +public class RegionInfo extends NetworkRefreshableGui { private final Region region; private final String uuid; @@ -70,7 +68,7 @@ private void createGui() { // Leave Region. setItem(8, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Region")), - u -> { + (NetworkUser u) -> { // Send leave event to server events. EventManager.createEvent(u.player.getUniqueId().toString(), "network", globalSQL.getString( @@ -92,7 +90,7 @@ private void createGui() { Utils.line("You will be prompted to type a name in chat."), Utils.line("It can have a maximum of 64 characters.")), - u -> { + (NetworkUser u) -> { // Create chat listener and send message telling the player. // Listener will automatically close after 1 minute or if a message is sent. @@ -130,7 +128,7 @@ private void createGui() { Utils.line("current set location."), Utils.line("You can edit the location by clicking on the"), Utils.line("'Set Location' button while standing in the region.")), - u -> { + (NetworkUser u) -> { // If the player is on the earth server get the coordinate. if (SERVER_NAME.equals(globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"))) { @@ -164,7 +162,7 @@ private void createGui() { Utils.line("to you current location."), Utils.line("You must be standing in the region"), Utils.line("for this to work.")), - u -> { + (NetworkUser u) -> { u.player.closeInventory(); @@ -197,7 +195,7 @@ private void createGui() { setItem(0, Utils.createItem(Material.IRON_TRAPDOOR, 1, Utils.title("Make Private"), Utils.line("New members will need your approval to join the region.")), - u -> { + (NetworkUser u) -> { // Set the region as private and refresh gui. region.setDefault(); @@ -211,7 +209,7 @@ private void createGui() { setItem(0, Utils.createItem(Material.OAK_TRAPDOOR, 1, Utils.title("Make Public"), Utils.line("New members can join the region without approval.")), - u -> { + (NetworkUser u) -> { // Set the region as public and refresh gui. region.setPublic(); @@ -240,26 +238,26 @@ private void createGui() { Utils.title("Invite Members"), Utils.line("Invite a new member to your region."), Utils.line("You can only invite online users.")), - u -> { + (NetworkUser u) -> { // Open the invite member menu. this.delete(); u.mainGui = new InviteMembers(region, RegionType.REGION); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Manage members. setItem(18, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Region Members"), Utils.line("Manage the members in your region.")), - u -> { + (NetworkUser u) -> { // Open the invite member menu. this.delete(); u.mainGui = new RegionMembers(region); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -267,14 +265,14 @@ private void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the region menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); // Switch to plot info. u.mainGui = new RegionMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java index 828da8dc..b3dc2065 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.regions; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; @@ -59,7 +58,7 @@ private void createGui() { Utils.line("Clicking on a player head"), Utils.line("will kick them from the region.")), - u -> { + (NetworkUser u) -> { transfer = !transfer; this.refresh(); @@ -72,7 +71,7 @@ private void createGui() { Utils.line("Clicking on a player head will"), Utils.line("make them the owner of the region.")), - u -> { + (NetworkUser u) -> { transfer = !transfer; this.refresh(); @@ -169,7 +168,7 @@ private void createGui() { u.mainGui = null; u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } else { @@ -221,7 +220,7 @@ private void createGui() { // Switch back to plot info. u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java index ca8461f9..e6caf421 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.Gui; import net.bteuk.network.sql.RegionSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -131,14 +130,14 @@ private void createGui() { RegionStatus status = region.status(); setItem(slot, getGuiItem(regionMember, status), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); // Switch to region info. u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); // Increase slot accordingly. @@ -160,12 +159,12 @@ private void createGui() { Utils.line("View all region join requests for"), Utils.line("regions that you are the owner of.")), - u -> { + (NetworkUser u) -> { // Delete this gui and switch to review region requests. this.delete(); u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -178,12 +177,12 @@ private void createGui() { Utils.line("that you have made that have"), Utils.line("not yet been accepted.")), - u -> { + (NetworkUser u) -> { // Delete this gui and switch to region request menu. this.delete(); u.mainGui = new RegionRequestMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } @@ -191,14 +190,14 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the building menu.")), - u -> { + (NetworkUser u) -> { // Delete this gui. this.delete(); // Switch to plot info. u.mainGui = new BuildGui(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java index d7b99ef8..fd47f4dc 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.regions; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.RegionSQL; import net.bteuk.network.utils.NetworkUser; @@ -118,7 +117,7 @@ private void createGui() { )), Utils.line("Click to cancel")), - u -> { + (NetworkUser u) -> { // Delete region request. regionSQL.update("DELETE FROM region_requests WHERE region='" + requests.get(finalI) + "' " + @@ -143,14 +142,14 @@ private void createGui() { // Return setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), - Utils.line("Open the region menu.")), u -> { + Utils.line("Open the region menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); // Switch to region menu. u.mainGui = new RegionMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index ab32e53b..0af0d4c9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -3,7 +3,6 @@ import net.bteuk.network.Network; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.RegionSQL; @@ -70,7 +69,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u); + u.staffGui.open(u.player); }, 20L); } else { @@ -79,7 +78,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }, 20L); } }); @@ -107,7 +106,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u); + u.staffGui.open(u.player); }, 20L); } else { @@ -116,7 +115,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }, 20L); } }); @@ -178,7 +177,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u); + u.staffGui.open(u.player); }, 20L); } else { @@ -187,7 +186,7 @@ private void createGui() { // Delay opening to make sure request was dealt with. Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u); + u.mainGui.open(u.player); }, 20L); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java index c556c8c9..382fcc85 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.regions; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.staff.StaffGui; import net.bteuk.network.sql.RegionSQL; import net.bteuk.network.utils.Utils; @@ -106,7 +105,7 @@ private void createGui() { Utils.line("Requested by ") .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + "player_data WHERE uuid='" + requests.get(i).uuid + "';"), NamedTextColor.GRAY)), - Utils.line("Click to open the menu for this request.")), u -> { + Utils.line("Click to open the menu for this request.")), (NetworkUser u) -> { // Delete this gui. this.delete(); @@ -116,14 +115,14 @@ private void createGui() { // Switch to region request. u.staffGui = new ReviewRegionRequest(requests.get(finalI), true); - u.staffGui.open(u); + u.staffGui.open(u.player); } else { u.mainGui = null; // Switch to region request. u.mainGui = new ReviewRegionRequest(requests.get(finalI), false); - u.mainGui.open(u); + u.mainGui.open(u.player); } }); @@ -152,7 +151,7 @@ private void createGui() { // Switch to staff menu. u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } else { @@ -168,7 +167,7 @@ private void createGui() { // Switch to staff menu. u.mainGui = new RegionMenu(u); - u.mainGui.open(u); + u.mainGui.open(u.player); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java index 41559d6a..a50e1bf7 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.staff; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.Utils; @@ -135,7 +134,7 @@ private void createGui() { // Switch back to plot info. u.staffGui = new ManageRegion(u, region); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java index 7581ecce..3dc285d0 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.staff; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.navigation.AddLocation; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.AddLocationType; @@ -38,7 +37,7 @@ private void createGui() { setItem(slot, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title(location), Utils.line("Click to review this location request.")), - u -> { + (NetworkUser u) -> { // Opens location request. this.delete(); @@ -59,7 +58,7 @@ private void createGui() { u.staffGui = new AddLocation(AddLocationType.REVIEW, location, coordinate_id, category, subcategory); - u.staffGui.open(u); + u.staffGui.open(u.player); }); slot++; @@ -83,7 +82,7 @@ private void createGui() { // Switch to staff menu. u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java index 20687244..f7457e62 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java @@ -1,6 +1,5 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -48,7 +47,7 @@ private void createGui() { Utils.line("to join without needing"), Utils.line("the owner to accept it.")), - u -> { + (NetworkUser u) -> { region.setPublic(); u.player.sendMessage(ChatUtils.success("Set region ") @@ -64,7 +63,7 @@ private void createGui() { Utils.line("joining requires the owner"), Utils.line("to accept the request.")), - u -> { + (NetworkUser u) -> { region.setDefault(); u.player.sendMessage(ChatUtils.success("Set region ") @@ -86,7 +85,7 @@ private void createGui() { Utils.line("Allows you to make a member"), Utils.line("the new region owner.")), - u -> { + (NetworkUser u) -> { // Close this menu. this.delete(); @@ -94,7 +93,7 @@ private void createGui() { // Open transfer owner menu. u.staffGui = new TransferOwner(region); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } } @@ -109,7 +108,7 @@ private void createGui() { Utils.line("Remove any current members,"), Utils.line("or the owner from the region.")), - u -> { + (NetworkUser u) -> { // Close this menu. this.delete(); @@ -117,7 +116,7 @@ private void createGui() { // Open transfer owner menu. u.staffGui = new KickMembers(region); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } } @@ -134,7 +133,7 @@ private void createGui() { Utils.line("region, any existing members"), Utils.line("will be kicked")), - u -> { + (NetworkUser u) -> { // If region is currently open, remove jrbuilder group. if (region.status() == RegionStatus.OPEN) { @@ -156,7 +155,7 @@ private void createGui() { Utils.line("people will be able to join"), Utils.line("and build in the region again.")), - u -> { + (NetworkUser u) -> { region.setDefault(); u.player.sendMessage(ChatUtils.success("Set region ") @@ -179,7 +178,7 @@ private void createGui() { Utils.line("needing to join the region."), Utils.line("Any existing members will be kicked.")), - u -> { + (NetworkUser u) -> { region.setOpen(); u.player.sendMessage(ChatUtils.success("Set region ") .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) @@ -194,7 +193,7 @@ private void createGui() { Utils.line("people will again be required"), Utils.line("to join the region to build.")), - u -> { + (NetworkUser u) -> { region.setDefault("jrbuilder"); u.player.sendMessage(ChatUtils.success("Set region ") .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) @@ -216,7 +215,7 @@ private void createGui() { u.staffGui = null; u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java index 10e54ca6..40534ce9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java @@ -4,7 +4,6 @@ import lombok.Setter; import net.bteuk.network.Network; import net.bteuk.network.eventing.listeners.staff.ModerationReasonListener; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.Time; import net.bteuk.network.utils.Utils; @@ -58,7 +57,7 @@ private void createGui() { case KICK -> // Kick - setItem(0, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Kick " + name), Utils.line("Kick the player with the specified reason.")), u -> { + setItem(0, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Kick " + name), Utils.line("Kick the player with the specified reason.")), (NetworkUser u) -> { // If a reason has been set, kick the user, if they're still online. if (Network.getInstance().isOnlineOnNetwork(uuid)) { @@ -94,7 +93,7 @@ private void createGui() { // Time selection buttons. setItem(3, Utils.createItem((hours == 0) ? Material.BARRIER : Material.CLOCK, (hours == 0) ? 1 : hours, Utils.title("Hours"), - Utils.line("Click to increase the hours by 1.")), u -> { + Utils.line("Click to increase the hours by 1.")), (NetworkUser u) -> { hours = (hours == 24) ? 0 : hours + 1; this.refresh(); @@ -102,7 +101,7 @@ private void createGui() { }); setItem(4, Utils.createItem((days == 0) ? Material.BARRIER : Material.CLOCK, (days == 0) ? 1 : days, Utils.title("Days"), - Utils.line("Click to increase the hours by 1.")), u -> { + Utils.line("Click to increase the hours by 1.")), (NetworkUser u) -> { days = (days == 30) ? 0 : days + 1; this.refresh(); @@ -110,7 +109,7 @@ private void createGui() { }); setItem(5, Utils.createItem((months == 0) ? Material.BARRIER : Material.CLOCK, (months == 0) ? 1 : months, Utils.title("Months"), - Utils.line("Click to increase the hours by 1.")), u -> { + Utils.line("Click to increase the hours by 1.")), (NetworkUser u) -> { months = (months == 12) ? 0 : months + 1; this.refresh(); @@ -118,7 +117,7 @@ private void createGui() { }); setItem(6, Utils.createItem((years == 0) ? Material.BARRIER : Material.CLOCK, (years == 0) ? 1 : years, Utils.title("Years"), - Utils.line("Click to increase the hours by 1.")), u -> { + Utils.line("Click to increase the hours by 1.")), (NetworkUser u) -> { years = (years == 5) ? 0 : years + 1; this.refresh(); @@ -127,7 +126,7 @@ private void createGui() { // Ban/Mute setItem(0, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title(type.label + " " + name), - Utils.line(type.label + " the player with the specified reason and time.")), u -> { + Utils.line(type.label + " the player with the specified reason and time.")), (NetworkUser u) -> { // Check if the reason is set. if (reason != null) { @@ -189,7 +188,7 @@ private void createGui() { // Return to request menu. this.delete(); u.staffGui = new SelectUser(type); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java index 8800afe3..f90837bb 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java @@ -1,6 +1,5 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.ModerationType; @@ -25,7 +24,7 @@ private void createGui() { "30506c52de360dfaec1b84998ba060fa6ce12be818fc13edc5db7a7921a35d7e", Material.REDSTONE_BLOCK, 1, Utils.title("Ban"), Utils.line("Click to select an online user to ban.")), - u -> { + (NetworkUser u) -> { if (u.hasPermission("uknet.ban")) { openSelectUser(u, ModerationType.BAN); @@ -37,7 +36,7 @@ private void createGui() { "c2abe43288a6c8cd76d0228f39112d2520c289d7c15c6aafe0c532ad9f5db9ad", Material.REDSTONE_BLOCK, 1, Utils.title("Unban"), Utils.line("Click to select a banned user to unban.")), - u -> { + (NetworkUser u) -> { if (u.hasPermission("uknet.ban")) { openSelectUser(u, ModerationType.UNBAN); @@ -49,7 +48,7 @@ private void createGui() { "4f130f485c3f7697f320ddc1128cd3f17cdbd3791764f7a7bb95cf252738588", Material.REDSTONE_BLOCK, 1, Utils.title("Mute"), Utils.line("Click to select an online user to mute.")), - u -> { + (NetworkUser u) -> { if (u.hasPermission("uknet.mute")) { openSelectUser(u, ModerationType.MUTE); @@ -61,7 +60,7 @@ private void createGui() { "f81422e8ddc0d3109aa657b89b0b0eb1d25cb3bc8d54dc6c99c3c9c081440254", Material.REDSTONE_BLOCK, 1, Utils.title("Unmute"), Utils.line("Click to select a muted user to unmute.")), - u -> { + (NetworkUser u) -> { if (u.hasPermission("uknet.mute")) { openSelectUser(u, ModerationType.UNMUTE); @@ -73,7 +72,7 @@ private void createGui() { "5ae0e486db4ec49ff1b52cfeceda4c3f36fde23c835ea3ccfcaac935e49b5f10", Material.REDSTONE_BLOCK, 1, Utils.title("Kick"), Utils.line("Click to select an online user to kick.")), - u -> { + (NetworkUser u) -> { if (u.hasPermission("uknet.kick")) { openSelectUser(u, ModerationType.KICK); @@ -91,7 +90,7 @@ private void createGui() { // Return to request menu. this.delete(); u.staffGui = new StaffGui(u); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } @@ -107,6 +106,6 @@ private void openSelectUser(NetworkUser u, ModerationType type) { this.delete(); u.staffGui = new SelectUser(type); - u.staffGui.open(u); + u.staffGui.open(u.player); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java index 7774ec83..16551138 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.staff; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.Time; @@ -135,7 +134,7 @@ private void createGui() { // Open the kick menu. this.delete(); u.staffGui = new ModerationActionGui(type, uuid); - u.staffGui.open(u); + u.staffGui.open(u.player); }); case UNBAN, UNMUTE -> // Unban/unmute the player. @@ -143,7 +142,7 @@ private void createGui() { Utils.title(type.label + " " + name), Utils.line(type.label + " the player immediately.")), - u -> { + (NetworkUser u) -> { u.player.closeInventory(); @@ -186,7 +185,7 @@ private void createGui() { u.staffGui = null; u.staffGui = new ModerationGui(); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index 488af64e..c590e911 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -2,7 +2,6 @@ import net.bteuk.network.Network; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.gui.Gui; import net.bteuk.network.gui.regions.ReviewRegionRequests; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -55,7 +54,7 @@ private void createGui() { Utils.title("Location Requests"), Utils.line("Opens a menu to view all location requests for navigation."), lRequestString), - u -> { + (NetworkUser u) -> { // Check if the user has the relevant permissions. if (Network.getInstance().getGlobalSQL() @@ -67,7 +66,7 @@ private void createGui() { u.staffGui = null; u.staffGui = new LocationRequests(); - u.staffGui.open(u); + u.staffGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("You must be a reviewer to review location requests" + ".")); @@ -105,7 +104,7 @@ private void createGui() { // Open manage region menu this.delete(); u.staffGui = new ManageRegion(u, u.region); - u.staffGui.open(u); + u.staffGui.open(u.player); } } @@ -144,7 +143,7 @@ private void createGui() { Utils.title("Review Region Requests"), Utils.line("Opens a menu to review active region join requests by Jr.Builders."), rRequestString), - u -> { + (NetworkUser u) -> { if (Network.getInstance().regionSQL.hasRow("SELECT region FROM region_requests WHERE " + "staff_accept=0;")) { @@ -155,7 +154,7 @@ private void createGui() { u.staffGui = null; u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u); + u.staffGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("You must be a reviewer to review region requests.")); } @@ -187,7 +186,7 @@ private void createGui() { Utils.title("Review Plot"), Utils.line("Click to review a submitted plot."), plotReviewMessage), - u -> { + (NetworkUser u) -> { // Get arraylist of submitted plots. // Order them by submit time, so the oldest submissions are reviewed first. @@ -298,7 +297,7 @@ private void createGui() { this.delete(); u.staffGui = new ModerationGui(); - u.staffGui.open(u); + u.staffGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("You do not have permission to access the Moderation Menu.")); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java index 7b17af26..c0364952 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.staff; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.Utils; @@ -140,7 +139,7 @@ private void createGui() { // Switch back to plot info. u.staffGui = new ManageRegion(u, region); - u.staffGui.open(u); + u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java index 0f56d8ef..1c6f4148 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java index 8d604e37..42c087ae 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java index cb21562b..e6a413ec 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -99,10 +98,10 @@ private void addItems() { ChatUtils.title("Delete"), ChatUtils.line("Go back to the recommended tutorials.")), - u -> { + (NetworkUser u) -> { // Go back to the review gui. u.player.closeInventory(); - parentGui.open(u); + parentGui.open(u.player); delete(); } ); @@ -113,7 +112,7 @@ private void addItems() { ChatUtils.title("Submit"), ChatUtils.line("Add recommendation.")), - u -> { + (NetworkUser u) -> { boolean bTutorialAlreadyRecommendedAndNotComplete = false; @@ -139,7 +138,7 @@ private void addItems() { // Go back to the recommended tutorials list. u.player.closeInventory(); parentGui.refresh(); - parentGui.open(u); + parentGui.open(u.player); delete(); } @@ -149,7 +148,7 @@ private void addItems() { // Reason button setItem(50, Utils.createItem(Material.WRITABLE_BOOK, 1, - ChatUtils.title("Set Reason")), u -> { + ChatUtils.title("Set Reason")), (NetworkUser u) -> { reasonEditor.startEdit("Reason Editor"); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index c888c18d..b01bc3ac 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.SwitchServer; @@ -68,10 +67,10 @@ private void addItems() { setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, ChatUtils.title("Return")), - u -> { + (NetworkUser u) -> { // Go back to the review gui. u.player.closeInventory(); - parentGui.open(u); + parentGui.open(u.player); } ); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java index 3fd1d057..2e1d778f 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java index 51a2989f..c7b869e3 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java @@ -1,7 +1,6 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -136,7 +135,7 @@ private void setActions() { public void click(NetworkUser u) { delete(); u.mainGui = new TutorialsGui(user); - u.mainGui.open(u); + u.mainGui.open(u.player); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java index e0760279..258b28de 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java @@ -1,7 +1,7 @@ package net.bteuk.network.gui.tutorials; import net.bteuk.network.Network; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; @@ -24,7 +24,7 @@ import static net.bteuk.network.utils.Constants.LOGGER; import static net.bteuk.network.utils.NetworkConfig.CONFIG; -public class TutorialsGui extends Gui { +public class TutorialsGui extends NetworkRefreshableGui { private final Network plugin = Network.getInstance(); diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java index 933101e2..0650a778 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java @@ -390,7 +390,7 @@ private void openSubcategoryMenu(NetworkUser u, String subcategory) { menu.setDeleteOnClose(true); // Open the menu. - menu.open(u); + menu.open(u.player); } public interface HologramClickAction { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java index d6fe210a..3f9544ba 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java @@ -1,6 +1,6 @@ package net.bteuk.network.utils; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -10,7 +10,7 @@ import java.util.Arrays; import java.util.Random; -public class LightsOut extends Gui { +public class LightsOut extends NetworkRefreshableGui { // Lights out is a simple game where the objective is to turn off all the lights. // You start with a 6*9 grid of lights that are either on or off. diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 03d7a7ba..b897dfae 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -2,12 +2,13 @@ import lombok.Getter; import lombok.Setter; +import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; -import net.bteuk.network.gui.Gui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.dto.FocusEvent; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserDisconnect; @@ -34,7 +35,7 @@ public class NetworkUser { private final Constants constants; // Main gui, includes everything that is part of the navigator. - public Gui mainGui; + public NetworkRefreshableGui mainGui; // Lights out, a gui game. public LightsOut lightsOut; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java index 6f53818e..d30a8dd1 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java @@ -1,6 +1,5 @@ package net.bteuk.network.utils.texteditorbooks; -import net.bteuk.network.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java index eaba6550..13e9b026 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java @@ -129,7 +129,7 @@ public void event(String uuid, String[] event, String eMessage) { // time this is done. int originalCoordinateID = regionManager.getCoordinateID(region, regionManager.getOwner(region)); int coordinateID = coordinateAPI.copyCoordinate(originalCoordinateID); - regionManager.joinRegion(uuid, coordinateID == -1 ? originalCoordinateID, coordinateID); + regionManager.joinRegion(region, uuid, coordinateID == -1 ? originalCoordinateID : coordinateID); // Send a message to the plot owner. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), regionManager.getOwner(region), "server", diff --git a/pom.xml b/pom.xml index d8c00511..f0891e06 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,8 @@ ${java-version} 1.21.8-R0.1-SNAPSHOT + + 764f5c1ece @@ -83,6 +85,12 @@ ${project.version} + + com.github.BTEUK.BTEUKLib + Minecraft + ${bteuk.lib.version} + + io.papermc.paper paper-api From 03a4ef7e677f65c84c387794f4c1d7fa60b4cf9d Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Thu, 28 Aug 2025 21:18:57 +0200 Subject: [PATCH 13/96] Migrated all plot system gui's. --- .../net/bteuk/network/core/Constants.java | 11 +- .../net/bteuk/network/commands/Navigator.java | 17 +- .../FeatureGeometryEditorListener.java | 4 +- .../java/net/bteuk/network/gui/BuildGui.java | 133 +++---- .../net/bteuk/network/gui/GuiProvider.java | 26 ++ .../net/bteuk/network/gui/InviteMembers.java | 232 +++++------- .../net/bteuk/network/gui/NavigatorGui.java | 16 +- .../net/bteuk/network/gui/NetworkGui.java | 31 +- .../network/gui/NetworkRefreshableGui.java | 6 +- .../main/java/net/bteuk/network/gui/Shop.java | 2 +- .../java/net/bteuk/network/gui/UtilsGui.java | 9 +- .../network/gui/navigation/AddLocation.java | 4 +- .../network/gui/navigation/ExploreGui.java | 14 +- .../network/gui/navigation/LocationMenu.java | 6 +- .../gui/navigation/SelectSubcategory.java | 6 +- .../gui/plotsystem/AcceptedPlotMenu.java | 105 +++--- .../network/gui/plotsystem/CloseConfirm.java | 75 ++-- .../network/gui/plotsystem/DeleteConfirm.java | 81 ++--- .../gui/plotsystem/DeniedPlotFeedback.java | 79 ++--- .../network/gui/plotsystem/FilterMenu.java | 122 +++---- .../network/gui/plotsystem/PlotInfo.java | 196 +++++----- .../network/gui/plotsystem/PlotMenu.java | 27 +- .../gui/plotsystem/PlotServerLocations.java | 334 ++++++++---------- .../gui/plotsystem/PlotsystemLocations.java | 44 +-- .../gui/plotsystem/PlotsystemMembers.java | 94 ++--- .../gui/plotsystem/VerificationInfo.java | 50 ++- .../gui/plotsystem/VerificationMenu.java | 24 +- .../network/gui/plotsystem/ZoneInfo.java | 263 ++++++-------- .../network/gui/plotsystem/ZoneMenu.java | 27 +- .../gui/progressmap/FeaturePageGUI.java | 11 +- .../gui/progressmap/LocalFeatureListGUI.java | 30 +- .../network/gui/regions/RegionMembers.java | 12 +- .../bteuk/network/gui/regions/RegionMenu.java | 16 +- .../gui/regions/RegionRequestMenu.java | 8 +- .../gui/regions/ReviewRegionRequest.java | 8 +- .../gui/regions/ReviewRegionRequests.java | 12 +- .../bteuk/network/gui/staff/KickMembers.java | 10 +- .../network/gui/staff/LocationRequests.java | 2 +- .../bteuk/network/gui/staff/ManageRegion.java | 2 +- .../gui/staff/ModerationActionGui.java | 4 +- .../network/gui/staff/ModerationGui.java | 2 +- .../bteuk/network/gui/staff/SelectUser.java | 10 +- .../net/bteuk/network/gui/staff/StaffGui.java | 6 +- .../network/gui/staff/TransferOwner.java | 10 +- .../tutorials/LessonContinueConfirmer.java | 55 ++- .../gui/tutorials/RecommendationAddGui.java | 70 ++-- .../tutorials/RecommendedTutorialsGui.java | 154 ++++---- .../java/net/bteuk/network/lobby/Map.java | 4 +- .../java/net/bteuk/network/sql/PlotSQL.java | 9 +- .../net/bteuk/network/utils/LightsOut.java | 4 +- .../bteuk/network/utils/NetworkConfig.java | 8 +- .../net/bteuk/network/utils/NetworkUser.java | 3 +- .../TextEditorBookListener.java | 163 ++++----- pom.xml | 2 +- 54 files changed, 1144 insertions(+), 1509 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index c7d9d632..a61f11fb 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -2,7 +2,12 @@ import java.util.List; -public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, +public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, + boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, - boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, - boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency) { } + boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, + boolean plotSystemEnabled, + boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, + String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, + int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey) { +} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index b6ab82d4..01195aff 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -9,6 +9,7 @@ import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.core.Constants; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NavigatorGui; import net.bteuk.network.gui.navigation.ExploreGui; import net.bteuk.network.gui.tutorials.TutorialsGui; @@ -25,6 +26,7 @@ @Log public class Navigator extends AbstractCommand { + private final GuiProvider provider; private final Network instance; private final Constants constants; private final NavigatorGui navigator; @@ -32,7 +34,10 @@ public class Navigator extends AbstractCommand { public Navigator(Network instance, GuiManager guiManager, Constants constants, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision) { this.instance = instance; this.constants = constants; - navigator = new NavigatorGui(instance, guiManager, constants, instance.getGlobalSQL(), lobby, back, eventAPI, serverAPI, nightvision); + + this.provider = new GuiProvider(instance, guiManager, constants, ...); + + navigator = new NavigatorGui(provider); } public void openNavigator(NetworkUser u) { @@ -40,13 +45,17 @@ public void openNavigator(NetworkUser u) { // If not then open it after refreshing its contents. // If no gui exists open the navigator. if (u.mainGui != null) { - u.mainGui.refresh(); u.mainGui.open(u.player); } else { - navigator.open(u.player); + openMainMenu(u); } } + public void openMainMenu(NetworkUser u) { + u.mainGui = null; + navigator.open(u.player); + } + @Override public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { @@ -95,7 +104,7 @@ private void openBuilding(NetworkUser u) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java index 8cc64315..52a8c2f0 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java @@ -37,12 +37,12 @@ public FeatureGeometryEditorListener(Network plugin, FeaturePageGUI featurePageG } private void setActions() { - setAction(2, u -> + setAction(2, (NetworkUser u) -> { selectionCancel(); }); - setAction(6, u -> + setAction(6, (NetworkUser u) -> { selectionConfirm(); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 39dd8309..6814e114 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -1,11 +1,10 @@ package net.bteuk.network.gui; import me.bteuk.progressmapper.guis.LocalFeaturesMenu; -import net.bteuk.minecraft.gui.GuiManager; -import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.commands.Navigator; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; @@ -42,16 +41,18 @@ public class BuildGui extends NetworkRefreshableGui { private final EventAPI eventAPI; private final ServerAPI serverAPI; private final RegionManager regionManager; + private final Navigator navigator; - public BuildGui(Network instance, GuiManager guiManager, NetworkUser user, PlotSQL plotSQL, Constants constants, Back back, EventAPI eventAPI, ServerAPI serverAPI, RegionManager regionManager) { - super(instance, guiManager, 27, Component.text("Building Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + public BuildGui(GuiProvider provider, NetworkUser user) { + super(provider, 27, Component.text("Building Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - this.plotSQL = plotSQL; - this.constants = constants; - this.back = back; - this.eventAPI = eventAPI; - this.serverAPI = serverAPI; - this.regionManager = regionManager; + this.plotSQL = provider.plotSQL(); + this.constants = provider.constants(); + this.back = provider.back(); + this.eventAPI = provider.eventAPI(); + this.serverAPI = provider.serverAPI(); + this.regionManager = provider.regionManager(); + this.navigator = provider.navigator(); } protected void createGui() { @@ -129,22 +130,23 @@ protected void createGui() { }); // Choose location. - setItem(19, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Plot Locations"), Utils.line("Click to choose a location to build a plot.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); + setItem(19, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Plot Locations"), Utils.line("Click to choose a location to build a plot.")), + (NetworkUser u) -> { + // Delete this gui. + this.delete(); - // Switch to the plot location gui. - u.mainGui = new PlotServerLocations(u); - u.mainGui.open(u.player); - }); + // Switch to the plot location gui. + u.mainGui = new PlotServerLocations(provider, u); + u.mainGui.open(u.player); + }); // Plot menu. setItem(21, Utils.createItem(Material.CHEST, 1, Utils.title("Plot Menu"), Utils.line("View all your active plots.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - // Switch to plot menu. - u.mainGui = new PlotMenu(u); + // Switch to the plot menu. + u.mainGui = new PlotMenu(provider, u); u.mainGui.open(u.player); }); @@ -155,10 +157,9 @@ protected void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Switch to plot menu. - u.mainGui = new ZoneMenu(u); + u.mainGui = new ZoneMenu(provider, u); u.mainGui.open(u.player); } else { @@ -171,9 +172,8 @@ protected void createGui() { (NetworkUser u) -> { this.delete(); - u.mainGui = null; - u.mainGui = new PlotsystemLocations(); + u.mainGui = new PlotsystemLocations(provider); u.mainGui.open(u.player); }); } @@ -247,7 +247,7 @@ protected void createGui() { u.player.closeInventory(); // Cancel the request. - regionManager.cancelRequest(region, u); + regionManager.cancelRequest(region, u.player); }); } else if (user.player.hasPermission("uknet.regions.join")) { @@ -272,7 +272,7 @@ protected void createGui() { // Join requires owner to approve request. setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to request to join the region you are standing in."), - Utils.line("The region is owned by ").append(Component.text(user.region.ownerName(), NamedTextColor.GRAY)), + Utils.line("The region is owned by ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), Utils.line("They must accept the request for you to join.")), (NetworkUser u) -> { regionManager.requestRegion(region, u.player, false); @@ -292,18 +292,17 @@ protected void createGui() { // If staff approval is always required do that or if the region was // previously claimed. - if (CONFIG.getBoolean("staff_request.always") || u.region.wasClaimed()) { - - u.region.requestRegion(u, true); + if (constants.regionStaffRequestAlways() || regionManager.wasClaimed(region)) { + regionManager.requestRegion(region, u.player, true); u.player.closeInventory(); } else { // Get region coords. - int x = Integer.parseInt(u.region.regionName().split(",")[0]); - int z = Integer.parseInt(u.region.regionName().split(",")[1]); + int x = Integer.parseInt(region.regionName().split(",")[0]); + int z = Integer.parseInt(region.regionName().split(",")[1]); // Get the radius. - int radius = CONFIG.getInt("staff_request.radius"); + int radius = constants.regionStaffRequestRadius(); // For zero radius, skip. if (radius != 0) { @@ -312,9 +311,6 @@ protected void createGui() { x -= radius; z -= radius; - // Get the region manager. - RegionManager regionManager = Network.getInstance().getRegionManager(); - // Iterate through all regions in the radius. for (int i = x; i <= x + radius * 2; i++) { for (int j = z; j <= z + radius * 2; j++) { @@ -324,14 +320,11 @@ protected void createGui() { // If the region exists, check if it has an owner that is // not the player. if (regionManager.exists(regionName)) { - - Region region = regionManager.getRegion(regionName); - - if (region.hasOwner()) { - if (!region.getOwner().equals(u.player.getUniqueId().toString())) { - + Region regionInRadius = regionManager.getRegion(regionName); + if (regionManager.hasOwner(regionInRadius)) { + if (!regionManager.getOwner(regionInRadius).equals(u.player.getUniqueId().toString())) { // Staff approval is required. - u.region.requestRegion(u, true); + regionManager.requestRegion(region, u.player, true); u.player.closeInventory(); return; } @@ -341,19 +334,19 @@ protected void createGui() { } } - u.region.joinRegion(u); + regionManager.joinRegion(region, u.player); u.player.closeInventory(); } } else { - u.region.joinRegion(u); + regionManager.joinRegion(region, u.player); u.player.closeInventory(); } }); } else { // If the region is open. - if (user.region.status() == RegionStatus.OPEN) { + if (regionManager.status(region) == RegionStatus.OPEN) { setItem(4, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Open Region"), Utils.line("This region is open to all Jr.Builder+."), Utils.line("You can build here without claiming."))); } else { @@ -375,66 +368,50 @@ protected void createGui() { setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("No Region"), Utils.line("You are currently not standing in a valid region."), Utils.line("This is likely due to being in a lobby."))); } - } - - // Region menu. - setItem(24, Utils.createItem(Material.ORANGE_SHULKER_BOX, 1, Utils.title("Region Menu"), Utils.line("View all regions you can build in.")), u -> - { - - // Delete this gui. - this.delete(); - u.mainGui = null; + // Region menu. + setItem(24, Utils.createItem(Material.ORANGE_SHULKER_BOX, 1, Utils.title("Region Menu"), Utils.line("View all regions you can build in.")), (NetworkUser u) -> { + this.delete(); - // Switch to plot menu. - u.mainGui = new RegionMenu(u); - u.mainGui.open(u.player); - }); + // Switch to the region menu. + u.mainGui = new RegionMenu(provider, u); + u.mainGui.open(u.player); + }); + } // Building utils menu. setItem(8, Utils.createItem(Material.NETHERITE_AXE, 1, Utils.title("Building Utils"), Utils.line("Open the building utils menu.")), (NetworkUser u) -> { - this.delete(); - u.mainGui = null; - - u.mainGui = new UtilsGui(instance, ); u.mainGui.open(u.player); + u.mainGui = new UtilsGui(provider); + u.mainGui.open(u.player); }); - if (PROGRESS_MAP && user.player.hasPermission("uknet.progressmap.edit")) { + if (constants.progressMap() && user.player.hasPermission("uknet.progressmap.edit")) { // Progress map edit menu setItem(0, Utils.createItem(Material.MAP, 1, Utils.title("Progress Map"), Utils.line("Edit or add areas to the progress map")), (NetworkUser u) -> { - // Deletes this GUI - this.delete(); - u.mainGui = null; - - LocalFeaturesMenu localFeatures = new LocalFeaturesMenu(Network.getInstance().getConfig().getInt("ProgressMap.ProgressMapID"), - Network.getInstance().getConfig().getString("ProgressMap.MapHubAPIKey"), u.player); + LocalFeaturesMenu localFeatures = new LocalFeaturesMenu(constants.progressMapID(), constants.mapHubAPIKey(), u.player); // Check to see if the location could be established if (localFeatures.getPlayerCoordinates() == null) { - u.mainGui = this; - u.mainGui.open(u.player); u.player.sendMessage(ChatUtils.error("Could not locate you")); } else { - // Switch to local features menu - u.mainGui = new LocalFeatureListGUI(localFeatures, Network.getInstance()); + this.delete(); + // Switch to the local features menu + u.mainGui = new LocalFeatureListGUI(provider, localFeatures); u.mainGui.open(u.player); } }); } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), u -> - - { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - u.mainGui = null; - // Switch to navigation menu. - Network.getInstance().navigatorGui.open(u.player); + // Switch to the navigation menu. + navigator.openMainMenu(u); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java new file mode 100644 index 00000000..ec7455c4 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java @@ -0,0 +1,26 @@ +package net.bteuk.network.gui; + +import net.bteuk.minecraft.gui.GuiManager; +import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.commands.Navigator; +import net.bteuk.network.commands.Nightvision; +import net.bteuk.network.commands.navigation.Back; +import net.bteuk.network.core.Constants; +import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.sql.RegionSQL; +import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.sql.PlotSQL; +import net.bteuk.network.utils.Roles; +import teachingtutorials.utils.DBConnection; + +/** + * Provides gui's with all the necessary dependencies. + */ +public record GuiProvider(Network instance, GuiManager manager, Constants constants, GlobalSQL globalSQL, RegionSQL regionSQL, RegionManager regionManager, PlotSQL plotSQL, + PlotAPI plotAPI, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision, Navigator navigator, Roles roles, + DBConnection tutorialsDBConnection) { +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java index 36c89963..1e7061fa 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java @@ -1,19 +1,17 @@ package net.bteuk.network.gui; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.plotsystem.PlotInfo; import net.bteuk.network.gui.plotsystem.ZoneInfo; import net.bteuk.network.gui.regions.RegionInfo; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionType; +import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.sql.RegionSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionType; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -21,7 +19,7 @@ import java.util.List; -public class InviteMembers extends Gui { +public class InviteMembers extends NetworkRefreshableGui { // This is either a region, plot or zone. // We can decypher it by using the regionType variable. @@ -32,26 +30,24 @@ public class InviteMembers extends Gui { private final PlotSQL plotSQL; private int page; - public InviteMembers(Object o, RegionType regionType) { + public InviteMembers(GuiProvider provider, Object o, RegionType regionType) { - super(45, Component.text("Invite Members", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Invite Members", NamedTextColor.AQUA, TextDecoration.BOLD)); this.o = o; this.regionType = regionType; page = 1; - globalSQL = Network.getInstance().getGlobalSQL(); - regionSQL = Network.getInstance().regionSQL; - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + globalSQL = provider.globalSQL(); + regionSQL = provider.regionSQL(); + plotSQL = provider.plotSQL(); } - private void createGui() { + protected void createGui() { // Get all online players in the network. - List online_users = Network.getInstance().getOnlineUsers().stream().map(OnlineUser::getUuid).toList(); + List online_users = provider.instance().getOnlineUsers().stream().map(OnlineUser::getUuid).toList(); // Slot count. int slot = 10; @@ -61,18 +57,15 @@ private void createGui() { // If page is greater than 1 add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of online users.")), - u -> - - { - - // Update the gui. - page--; - this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); - }); + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of online users.")), (NetworkUser u) -> + + { + + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all online players. @@ -81,19 +74,15 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of online users.")), - u -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of online users.")), (NetworkUser u) -> - { + { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -113,35 +102,31 @@ private void createGui() { // Add player to gui. setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Invite " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " to your " + regionType.label + "."), - Utils.line("They will receive an invitation in chat.")), - u -> - - { - - // Check if the player is still online. - if (Network.getInstance().isOnlineOnNetwork(uuid)) { - - // Check if the player is not already a member of the region, plot or zone. - if (!isMember(uuid)) { - - // Check if the player has not already been invited. - if (!isInvited(uuid)) { - - invite(u, uuid); - } else { - u.player.sendMessage(ChatUtils.error("You've already invited this player to your " - + regionType.label + ".")); - } - } else { - u.player.sendMessage(ChatUtils.error( - "This player is already a member of your " + regionType.label + ".")); - } + Utils.title("Invite " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " to your " + regionType.label + "."), + Utils.line("They will receive an invitation in chat.")), (NetworkUser u) -> + + { + + // Check if the player is still online. + if (provider.instance().isOnlineOnNetwork(uuid)) { + + // Check if the player is not already a member of the region, plot or zone. + if (!isMember(uuid)) { + + // Check if the player has not already been invited. + if (!isInvited(uuid)) { + + invite(u, uuid); } else { - u.player.sendMessage(ChatUtils.error("This player is no longer online.")); + u.player.sendMessage(ChatUtils.error("You've already invited this player to your " + regionType.label + ".")); } - }); + } else { + u.player.sendMessage(ChatUtils.error("This player is already a member of your " + regionType.label + ".")); + } + } else { + u.player.sendMessage(ChatUtils.error("This player is no longer online.")); + } + }); // Increase slot accordingly. if (slot % 9 == 7) { @@ -158,69 +143,54 @@ private void createGui() { Region region = (Region) o; - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of region ") - .append(Component.text(region.getTag(region.getOwner()), NamedTextColor.GRAY))), - u -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of region ") + .append(Component.text(provider.regionManager().getTag(region, provider.regionManager().getOwner(region)), NamedTextColor.GRAY))), (NetworkUser u) -> - { + { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch back to plot info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); + // Switch back to plot info. + u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); } else if (regionType == RegionType.PLOT) { Integer plotID = (Integer) o; - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of plot " + plotID + ".")), - u -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of plot " + plotID + ".")), (NetworkUser u) -> - { + { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch back to plot info. - u.mainGui = new PlotInfo(u, plotID); - u.mainGui.open(u.player); - }); + // Switch back to plot info. + u.mainGui = new PlotInfo(provider, u, plotID); + u.mainGui.open(u.player); + }); } else if (regionType == RegionType.ZONE) { Integer zoneID = (Integer) o; - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of zone " + zoneID + ".")), - u -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of zone " + zoneID + ".")), (NetworkUser u) -> - { + { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch back to plot info. - u.mainGui = new ZoneInfo(u, zoneID, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); + // Switch back to plot info. + u.mainGui = new ZoneInfo(provider, u, zoneID, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); } } - public void refresh() { - - this.clearGui(); - createGui(); - } - public boolean isInvited(String uuid) { // Check whether the player is not already the owner or member of the region, plot or zone, if true skip them. @@ -228,8 +198,7 @@ public boolean isInvited(String uuid) { Region region = (Region) o; - return regionSQL.hasRow("SELECT region FROM region_invites WHERE region='" + region.regionName() + "' AND" + - " uuid='" + uuid + "';"); + return regionSQL.hasRow("SELECT region FROM region_invites WHERE region='" + region.regionName() + "' AND" + " uuid='" + uuid + "';"); } else if (regionType == RegionType.PLOT) { Integer plotID = (Integer) o; @@ -251,8 +220,7 @@ public boolean isMember(String uuid) { Region region = (Region) o; - return regionSQL.hasRow("SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "';"); + return regionSQL.hasRow("SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "';"); } else if (regionType == RegionType.PLOT) { Integer plotID = (Integer) o; @@ -278,17 +246,13 @@ public void invite(NetworkUser u, String uuid) { // Send invite via chat. // The invite will be active until they disconnect from the network. // They will need to run a command to actually join the plot. - regionSQL.update("INSERT INTO region_invites(region,owner,uuid) VALUES('" + region.regionName() + "','" + - u.player.getUniqueId() + "','" + uuid + "');"); + regionSQL.update("INSERT INTO region_invites(region,owner,uuid) VALUES('" + region.regionName() + "','" + u.player.getUniqueId() + "','" + uuid + "');"); String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); - Network.getInstance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - EventManager.createEvent(uuid, "network", onlineUser.getServer(), - "invite region " + region.regionName()); - u.player.sendMessage(ChatUtils.success("Invited %s to region %s", name, - region.getTag(u.player.getUniqueId().toString()))); - }, - () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); + provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { + provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite region " + region.regionName()); + u.player.sendMessage(ChatUtils.success("Invited %s to region %s", name, provider.regionManager().getTag(region, u.player.getUniqueId().toString()))); + }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } else if (regionType == RegionType.PLOT) { Integer plotID = (Integer) o; @@ -296,16 +260,13 @@ public void invite(NetworkUser u, String uuid) { // Send invite via chat. // The invite will be active until they disconnect from the network. // They will need to run a command to actually join the plot. - plotSQL.update("INSERT INTO plot_invites(id,owner,uuid) VALUES(" + plotID + ",'" + - u.player.getUniqueId() + "','" + uuid + "');"); + plotSQL.update("INSERT INTO plot_invites(id,owner,uuid) VALUES(" + plotID + ",'" + u.player.getUniqueId() + "','" + uuid + "');"); String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); - Network.getInstance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - EventManager.createEvent(uuid, "network", onlineUser.getServer(), - "invite plot " + plotID); - u.player.sendMessage(ChatUtils.success("Invited %s to your Plot.", name)); - }, - () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); + provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { + provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite plot " + plotID); + u.player.sendMessage(ChatUtils.success("Invited %s to your Plot.", name)); + }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } else if (regionType == RegionType.ZONE) { Integer zoneID = (Integer) o; @@ -313,16 +274,13 @@ public void invite(NetworkUser u, String uuid) { // Send invite via chat. // The invite will be active until they disconnect from the network. // They will need to run a command to actually join the plot. - plotSQL.update("INSERT INTO zone_invites(id,owner,uuid) VALUES(" + zoneID + ",'" + - u.player.getUniqueId() + "','" + uuid + "');"); + plotSQL.update("INSERT INTO zone_invites(id,owner,uuid) VALUES(" + zoneID + ",'" + u.player.getUniqueId() + "','" + uuid + "');"); String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); - Network.getInstance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - EventManager.createEvent(uuid, "network", onlineUser.getServer(), - "invite zone " + zoneID); - u.player.sendMessage(ChatUtils.success("Invited %s to zone your Zone.", name)); - }, - () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); + provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { + provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite zone " + zoneID); + u.player.sendMessage(ChatUtils.success("Invited %s to zone your Zone.", name)); + }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index e52c2f60..b050e840 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -1,7 +1,5 @@ package net.bteuk.network.gui; -import net.bteuk.minecraft.gui.GuiManager; -import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; @@ -27,12 +25,20 @@ public class NavigatorGui extends NetworkGui { - public NavigatorGui(Network instance, GuiManager guiManager, Constants constants, GlobalSQL globalSQL, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision) { - super(instance, guiManager, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); + public NavigatorGui(GuiProvider provider) { + super(provider, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); + + Constants constants = provider.constants(); + GlobalSQL globalSQL = provider.globalSQL(); + Nightvision nightvision = provider.nightvision(); + Lobby lobby = provider.lobby(); + Back back = provider.back(); + EventAPI eventAPI = provider.eventAPI(); + ServerAPI serverAPI = provider.serverAPI(); setItem(2, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title("Build"), Utils.line("Click to open the build menu.")), (NetworkUser u) -> { // Switch to the build menu. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java index efe969a5..63da41c2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java @@ -2,33 +2,44 @@ import net.bteuk.minecraft.gui.Gui; import net.bteuk.minecraft.gui.GuiAction; -import net.bteuk.minecraft.gui.GuiManager; -import net.bteuk.network.Network; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; public abstract class NetworkGui extends Gui { - private final Network instance; + protected final GuiProvider provider; - public NetworkGui(Network instance, GuiManager manager, int inventorySize, Component inventoryName) { - super(manager, inventorySize, inventoryName); - this.instance = instance; + public NetworkGui(GuiProvider provider, int inventorySize, Component inventoryName) { + super(provider.manager(), inventorySize, inventoryName); + this.provider = provider; + } + + public NetworkGui(GuiProvider provider, Inventory inventory) { + super(provider.manager(), inventory); + this.provider = provider; } public void setItem(int slot, ItemStack stack, NetworkGuiAction action) { - GuiAction guiAction = clickEvent -> { + this.setItem(slot, stack, getGuiAction(action)); + } + + public void setAction(int slot, NetworkGuiAction action) { + super.setAction(slot, getGuiAction(action)); + } + + private GuiAction getGuiAction(NetworkGuiAction action) { + return clickEvent -> { if (!(clickEvent.getWhoClicked() instanceof Player player)) { return; } - NetworkUser u = instance.getUser(player); + NetworkUser u = provider.instance().getUser(player); - if (u != null) { + if (u != null && action != null) { action.click(u); } }; - this.setItem(slot, stack, guiAction); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java index 05b01e5c..3ad719c2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java @@ -1,14 +1,12 @@ package net.bteuk.network.gui; -import net.bteuk.minecraft.gui.GuiManager; -import net.bteuk.network.Network; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; public abstract class NetworkRefreshableGui extends NetworkGui implements RefreshableGui { - public NetworkRefreshableGui(Network instance, GuiManager manager, int inventorySize, Component inventoryName) { - super(instance, manager, inventorySize, inventoryName); + public NetworkRefreshableGui(GuiProvider provider, int inventorySize, Component inventoryName) { + super(provider, inventorySize, inventoryName); } protected abstract void createGui(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/Shop.java b/Plugin/src/main/java/net/bteuk/network/gui/Shop.java index 84eda9bc..f7f272e9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/Shop.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/Shop.java @@ -29,7 +29,7 @@ // setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, // Utils.title("Return"), // Utils.line("Open the navigator main menu.")), -// u -> +// (NetworkUser u) -> // // { // diff --git a/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java index dcfb6194..5449cb24 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/UtilsGui.java @@ -1,7 +1,5 @@ package net.bteuk.network.gui; -import net.bteuk.minecraft.gui.GuiManager; -import net.bteuk.network.Network; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -11,8 +9,8 @@ public class UtilsGui extends NetworkGui { - public UtilsGui(Network instance, GuiManager manager) { - super(instance, manager, 27, Component.text("Building Utils", NamedTextColor.AQUA, TextDecoration.BOLD)); + public UtilsGui(GuiProvider provider) { + super(provider, 27, Component.text("Building Utils", NamedTextColor.AQUA, TextDecoration.BOLD)); createGui(); } @@ -53,10 +51,9 @@ public void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Switch to navigation menu. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index 472b1fc2..68fd0e1d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -145,7 +145,7 @@ private void createGui() { // Update gui. this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); // Select subcategory. @@ -336,7 +336,7 @@ private void createGui() { // Return if (type == AddLocationType.ADD) { - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + " menu.")), u -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + " menu.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java index f62e14e8..22b05f9b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java @@ -65,27 +65,27 @@ private void createGui() { // England setItem(2, Utils.createCustomSkullWithFallback("bee5c850afbb7d8843265a146211ac9c615f733dcc5a8e2190e5c247dea32", Material.ORANGE_CONCRETE_POWDER, 1, Utils.title("England"), Utils.line("Click to pick from"), - Utils.line("locations in England.")), u -> openLocation("England", u, Category.ENGLAND)); + Utils.line("locations in England.")), (NetworkUser u) -> openLocation("England", u, Category.ENGLAND)); // Scotland setItem(3, Utils.createCustomSkullWithFallback("dadc377816389c3c87c65dcacac1d8f880b54334d7c23ea22f099e2c4eab1ff9", Material.LIGHT_BLUE_CONCRETE_POWDER, 1, Utils.title("Scotland"), Utils.line("Click to pick from"), Utils.line("locations in Scotland.")), - u -> openLocation("Scotland", u, Category.SCOTLAND)); + (NetworkUser u) -> openLocation("Scotland", u, Category.SCOTLAND)); // Wales setItem(4, Utils.createCustomSkullWithFallback("8140ad08f7ee1c73bf75660614595c7392caba5529211a9adbe3b5639cb6ad41", Material.RED_CONCRETE_POWDER, 1, Utils.title("Wales"), Utils.line("Click to pick from"), - Utils.line("locations in Wales.")), u -> openLocation("Wales", u, Category.WALES)); + Utils.line("locations in Wales.")), (NetworkUser u) -> openLocation("Wales", u, Category.WALES)); // Northern Ireland setItem(5, Utils.createCustomSkullWithFallback("c00ae311a5c7082e76450ecafcbbbc07dcdc484600ac0bf8d91f27e0a65b7e32", Material.LIME_CONCRETE_POWDER, 1, Utils.title("Northern Ireland"), Utils.line("Click to pick from"), Utils.line("locations in Norther " + "Ireland.")), - u -> openLocation("Northern Ireland", u, Category.NORTHERN_IRELAND)); + (NetworkUser u) -> openLocation("Northern Ireland", u, Category.NORTHERN_IRELAND)); // Other setItem(6, @@ -93,19 +93,19 @@ private void createGui() { Material.YELLOW_CONCRETE_POWDER, 1, Utils.title("Other"), Utils.line("Click to pick from locations"), Utils.line("not in the 4 " + "countries of the UK.")), - u -> openLocation("Other", u, Category.OTHER)); + (NetworkUser u) -> openLocation("Other", u, Category.OTHER)); // Suggested Locations // Gets all locations which have suggested=1 in database. setItem(21, Utils.createItem(Material.GOLD_BLOCK, 1, Utils.title("Suggested Locations"), Utils.line("Click " + "to" + " view locations"), Utils.line("that are recommended to view.")), - u -> openLocation("Suggested" + " " + "Locations", u, Category.SUGGESTED)); + (NetworkUser u) -> openLocation("Suggested" + " " + "Locations", u, Category.SUGGESTED)); // Nearby Locations (radius set in config under navigation_radius) setItem(22, Utils.createItem(Material.COMPASS, 1, Utils.title("Nearby Locations"), Utils.line("Click to view " + "locations"), Utils.line("in a " + CONFIG.getInt("navigation_radius") + "km radius.")), - u -> openLocation("Nearby Locations", u, Category.NEARBY)); + (NetworkUser u) -> openLocation("Nearby Locations", u, Category.NEARBY)); // Find Locations setItem(23, Utils.createItem(Material.OAK_SIGN, 1, Utils.title("Find Locations"), diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java index 868aeabe..005dd886 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java @@ -82,14 +82,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of locations.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -108,7 +108,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of locations.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java index b7cc0994..37ada39f 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java @@ -44,13 +44,13 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of subcategories.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -78,7 +78,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of locations.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java index e9ecf84e..7082bc72 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/AcceptedPlotMenu.java @@ -3,7 +3,8 @@ import com.destroystokyo.paper.profile.PlayerProfile; import lombok.Getter; import lombok.Setter; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -26,7 +27,7 @@ * However, the filter can be altered to view all accepted plots, * or those by a specific user, granted they have completed at least one plot. */ -public class AcceptedPlotMenu extends Gui { +public class AcceptedPlotMenu extends NetworkRefreshableGui { private final PlotSQL plotSQL; private final GlobalSQL globalSQL; @@ -48,41 +49,34 @@ public class AcceptedPlotMenu extends Gui { @Setter private int page = 1; - public AcceptedPlotMenu(NetworkUser user) { + public AcceptedPlotMenu(GuiProvider provider, NetworkUser user) { - super(45, Component.text("Accepted Plot Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Accepted Plot Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); filter = user.player.getUniqueId().toString(); - filterMenu = new FilterMenu(this, user); + this.filterMenu = new FilterMenu(provider, this, user); - plotSQL = Network.getInstance().getPlotSQL(); - globalSQL = Network.getInstance().getGlobalSQL(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); - createGuiAsync(); + createGui(); } - private void createGuiAsync() { + protected void createGui() { // Fetch accepted plots. HashMap plots; if (StringUtils.isEmpty(filter)) { - plots = plotSQL.getIntStringMap("SELECT plot_id,uuid FROM plot_review WHERE accepted=1 AND completed=1 " + - "ORDER BY review_time DESC;"); + plots = plotSQL.getIntStringMap("SELECT plot_id,uuid FROM plot_review WHERE accepted=1 AND completed=1 " + "ORDER BY review_time DESC;"); } else { - plots = plotSQL.getIntStringMap("SELECT plot_id,uuid FROM plot_review WHERE accepted=1 AND completed=1 " + - "AND uuid='" + filter + "' ORDER BY review_time DESC;"); + plots = plotSQL.getIntStringMap("SELECT plot_id,uuid FROM plot_review WHERE accepted=1 AND completed=1 " + "AND uuid='" + filter + "' ORDER BY review_time DESC;"); } // Set the filter. // Open the filter menu. - setItem(4, Utils.createItem( - Material.SPRUCE_SIGN, 1, Utils.title("Set filter"), - Utils.line("The current filter is set to: ").append(Component.text( - StringUtils.isEmpty(filter) ? "All Players" : globalSQL.getString("SELECT name FROM " + - "player_data WHERE uuid='" + filter + "';"), NamedTextColor.GRAY - )), - Utils.line("Click to select a different filter.")), - filterMenu::open); + setItem(4, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Set filter"), Utils.line("The current filter is set to: ") + .append(Component.text(StringUtils.isEmpty(filter) ? "All Players" : globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + filter + "';"), + NamedTextColor.GRAY)), Utils.line("Click to select a different filter.")), (NetworkUser u) -> filterMenu.open(u.player)); // Slot count. int slot = 10; @@ -92,17 +86,12 @@ private void createGuiAsync() { // If page is greater than 1 add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of accepted plots.")), - u -> - - { - // Update the gui. - page--; - this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); - }); + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of accepted plots.")), (NetworkUser u) -> { + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Make a button for each plot. @@ -117,18 +106,14 @@ private void createGuiAsync() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of accepted plots.")), - u -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of accepted plots.")), (NetworkUser u) -> - { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + { + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -158,23 +143,15 @@ private void createGuiAsync() { } // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the plot menu.")), - (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Return to the plot menu. - u.mainGui = new PlotMenu(u); - u.mainGui.open(u.player); - }); - } - - public void refresh() { - this.clearGui(); - createGuiAsync(); + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), (NetworkUser u) -> { + // Delete this gui. + this.delete(); + u.mainGui = null; + + // Return to the plot menu. + u.mainGui = new PlotMenu(provider, u); + u.mainGui.open(u.player); + }); } @Override @@ -189,10 +166,8 @@ public void delete() { } private void createPlayerHeadGuiItem(PlayerProfile profile, int plotID, String uuid, int slot) { - ItemStack guiItem = Utils.createPlayerSkull(profile, 1, - Utils.title("Plot " + plotID), - Utils.line("Completed by: ").append(Component.text(globalSQL.getString("SELECT name FROM player_data " + - "WHERE uuid='" + uuid + "';"), NamedTextColor.GRAY)), + ItemStack guiItem = Utils.createPlayerSkull(profile, 1, Utils.title("Plot " + plotID), + Utils.line("Completed by: ").append(Component.text(globalSQL.getString("SELECT name FROM player_data " + "WHERE uuid='" + uuid + "';"), NamedTextColor.GRAY)), Utils.line("Click to open the menu of this plot.")); setItem(slot, guiItem, (NetworkUser u) -> { @@ -200,7 +175,7 @@ private void createPlayerHeadGuiItem(PlayerProfile profile, int plotID, String u if (plotInfo != null) { plotInfo.deleteThis(); } - plotInfo = new PlotInfo(u, plotID); + plotInfo = new PlotInfo(provider, u, plotID); plotInfo.setAcceptedPlotMenu(this); plotInfo.open(u.player); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java index 94f559d4..0b3e00fc 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java @@ -1,75 +1,58 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class CloseConfirm extends Gui { +public class CloseConfirm extends NetworkRefreshableGui { private final int id; + private final PlotSQL plotSQL; - public CloseConfirm(int id) { + public CloseConfirm(GuiProvider provider, int id) { - super(27, Component.text("Save and Close Zone " + id, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Save and Close Zone " + id, NamedTextColor.AQUA, TextDecoration.BOLD)); this.id = id; - - createGui(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { - - // Get plot sql. - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); + protected void createGui() { // Save and Close zone. - setItem(13, Utils.createItem(Material.LIME_CONCRETE, 1, - Utils.title("Save and Close Zone " + id), - Utils.line("Saves the zone and closes it.")), - (NetworkUser u) -> { + setItem(13, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Save and Close Zone " + id), Utils.line("Saves the zone and closes it.")), (NetworkUser u) -> { - // Delete this inventory. - this.delete(); - u.mainGui = null; + // Delete this inventory. + this.delete(); + u.mainGui = null; - u.mainGui = new ZoneMenu(u); - u.player.closeInventory(); + u.mainGui = new ZoneMenu(u); + u.player.closeInventory(); - // Add server event to delete plot or zone. - EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString( - "SELECT server FROM location_data WHERE name='" + - plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + - "';"), - "close zone" + - " " + id); - }); + // Add server event to delete plot or zone. + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", + plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), + "close zone" + " " + id); + }); // Return to zone menu. - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of Zone " + id + ".")), - u -> - - { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of Zone " + id + ".")), (NetworkUser u) -> - // Delete this inventory. - this.delete(); - u.mainGui = null; - - // Switch back to zone info. - u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); - } + { - public void refresh() { + // Delete this inventory. + this.delete(); + u.mainGui = null; - this.clearGui(); - createGui(); + // Switch back to zone info. + u.mainGui = new ZoneInfo(provider, u, id, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java index 7546c120..3632e3af 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java @@ -1,41 +1,37 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.RegionType; import net.bteuk.network.sql.PlotSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class DeleteConfirm extends Gui { +public class DeleteConfirm extends NetworkRefreshableGui { private final int id; private final RegionType regionType; + private final PlotSQL plotSQL; - public DeleteConfirm(int id, RegionType regionType) { + public DeleteConfirm(GuiProvider provider, int id, RegionType regionType) { - super(27, Component.text("Delete " + regionType.label + " " + id, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Delete " + regionType.label + " " + id, NamedTextColor.AQUA, TextDecoration.BOLD)); this.id = id; this.regionType = regionType; - - createGui(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { - - // Get plot sql. - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); + protected void createGui() { // Delete plot - setItem(13, Utils.createItem(Material.TNT, 1, - Utils.title("Delete " + regionType.label + " " + id), - Utils.line("Delete the " + regionType.label + " and its contents.")), + setItem(13, Utils.createItem(Material.TNT, 1, Utils.title("Delete " + regionType.label + " " + id), Utils.line("Delete the " + regionType.label + " and its contents.")), (NetworkUser u) -> { // Delete this inventory. @@ -46,15 +42,13 @@ private void createGui() { // Then add server event to delete plot or zone. if (regionType == RegionType.PLOT) { - u.mainGui = new PlotMenu(u); + u.mainGui = new PlotMenu(provider, u); u.player.closeInventory(); u.sendMessage(ChatUtils.success("Deleting plot %s...", String.valueOf(id))); // Add server event to delete plot or zone. - EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString( - "SELECT server FROM location_data WHERE name='" + - plotSQL.getString( - "SELECT location FROM plot_data WHERE id=" + id + ";") + "';"), + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString( + "SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";") + "';"), "delete plot " + id); } else if (regionType == RegionType.ZONE) { @@ -63,45 +57,34 @@ private void createGui() { u.sendMessage(ChatUtils.success("Deleting zone %s...", String.valueOf(id))); // Add server event to delete plot or zone. - EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString( - "SELECT server FROM location_data WHERE name='" + - plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), - "delete" + - " zone " + id); + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", + plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), + "delete" + " zone " + id); } }); // Return to plot info menu. - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of " + regionType.label + " " + id + ".")), - u -> - - { - - // Delete this inventory. - this.delete(); - u.mainGui = null; + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of " + regionType.label + " " + id + ".")), (NetworkUser u) -> - // Switch back to plot or zone info. - if (regionType == RegionType.PLOT) { + { - u.mainGui = new PlotInfo(u, id); - } else if (regionType == RegionType.ZONE) { + // Delete this inventory. + this.delete(); + u.mainGui = null; - u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); - } else { + // Switch back to plot or zone info. + if (regionType == RegionType.PLOT) { - u.mainGui = new BuildGui(u); - } + u.mainGui = new PlotInfo(provider, u, id); + } else if (regionType == RegionType.ZONE) { - u.mainGui.open(u.player); - }); - } + u.mainGui = new ZoneInfo(provider, u, id, u.player.getUniqueId().toString()); + } else { - public void refresh() { + u.mainGui = new BuildGui(provider, u); + } - this.clearGui(); - createGui(); + u.mainGui.open(u.player); + }); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java index 5413df6a..d883b79a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java @@ -1,8 +1,10 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.kyori.adventure.text.Component; @@ -10,36 +12,29 @@ import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class DeniedPlotFeedback extends Gui { +public class DeniedPlotFeedback extends NetworkRefreshableGui { private final PlotSQL plotSQL; private final GlobalSQL globalSQL; private final int plotID; - public DeniedPlotFeedback(int plotID) { + public DeniedPlotFeedback(GuiProvider provider, int plotID) { - super(45, Component.text("Plot " + plotID + " feedback", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Plot " + plotID + " feedback", NamedTextColor.AQUA, TextDecoration.BOLD)); this.plotID = plotID; - - // Get plot sql. - plotSQL = Network.getInstance().getPlotSQL(); - - // Get global sql. - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); } - private void createGui() { + protected void createGui() { - // Get plot owner uuid. + // Get the plot owner uuid. String uuid = plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plotID + " AND is_owner=1;"); // Get the number of times the plot was denied for the current plot owner. - int deniedCount = plotSQL.getInt("SELECT COUNT(attempt) FROM plot_review WHERE plot_id=" + plotID + " AND " + - "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); + int deniedCount = plotSQL.getInt("SELECT COUNT(attempt) FROM plot_review WHERE plot_id=" + plotID + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); // Slot count. int slot = 10; @@ -57,33 +52,26 @@ private void createGui() { // Add player to gui. int finalI = i; - setItem(slot, Utils.createItem(Material.WRITTEN_BOOK, 1, - Utils.title("Feedback for submission " + i), - Utils.line("Click to view feedback for this submission."), - Utils.line("Reviewed by ") - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE " + - "uuid='" - + plotSQL.getString( - "SELECT reviewer FROM plot_review WHERE plot_id=" + plotID + " " + - "AND uuid='" + uuid + "' AND attempt=" + i + ";") + "';"), - NamedTextColor.GRAY))), + setItem(slot, Utils.createItem(Material.WRITTEN_BOOK, 1, Utils.title("Feedback for submission " + i), Utils.line("Click to view feedback for this submission."), + Utils.line("Reviewed by ").append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE " + "uuid='" + plotSQL.getString( + "SELECT reviewer FROM plot_review WHERE plot_id=" + plotID + " " + "AND uuid='" + uuid + "' AND attempt=" + i + ";") + "';"), + NamedTextColor.GRAY))), (NetworkUser u) -> { // Close the inventory. u.player.closeInventory(); - // Create book. - int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotID + " AND " + - "uuid='" + uuid + "' AND attempt=" + finalI + ";"); + // Create the feedback book. + int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotID + " AND " + "uuid='" + uuid + "' AND attempt=" + finalI + ";"); // Open the book. u.player.openBook(ReviewFeedback.createFeedbackBook(reviewId)); }); - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { - // Increase row, basically add 3. + // Increase row, add 3. slot += 3; } else { // Increase value by 1. @@ -91,27 +79,16 @@ private void createGui() { } } - // Return to plot info menu. - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of plot " + plotID + ".")), - u -> - - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch back to plot menu. - u.mainGui = new PlotInfo(u, plotID); - u.mainGui.open(u.player); - }); - } + // Return to the plot info menu. + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Return to the menu of plot " + plotID + ".")), (NetworkUser u) -> { - public void refresh() { + // Delete this gui. + this.delete(); + u.mainGui = null; - this.clearGui(); - createGui(); + // Switch back to plot menu. + u.mainGui = new PlotInfo(provider, u, plotID); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java index 87dd52c8..ac009914 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/FilterMenu.java @@ -1,7 +1,8 @@ package net.bteuk.network.gui.plotsystem; import com.destroystokyo.paper.profile.PlayerProfile; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -23,7 +24,7 @@ * it allows the player to set a filter on the plots which show up in the menu. * The filter is per player, or all plots. */ -public class FilterMenu extends Gui { +public class FilterMenu extends NetworkRefreshableGui { private final PlotSQL plotSQL; private final GlobalSQL globalSQL; @@ -31,25 +32,25 @@ public class FilterMenu extends Gui { private final AcceptedPlotMenu acceptedPlotMenu; private int page; - public FilterMenu(AcceptedPlotMenu acceptedPlotMenu, NetworkUser user) { - super(45, Component.text("Set Filter", NamedTextColor.AQUA, TextDecoration.BOLD)); + public FilterMenu(GuiProvider provider, AcceptedPlotMenu acceptedPlotMenu, NetworkUser user) { + super(provider, 45, Component.text("Set Filter", NamedTextColor.AQUA, TextDecoration.BOLD)); this.acceptedPlotMenu = acceptedPlotMenu; this.user = user; - this.plotSQL = Network.getInstance().getPlotSQL(); - this.globalSQL = Network.getInstance().getGlobalSQL(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); page = 1; createGui(); } - private void createGui() { + protected void createGui() { // Get a list of all users that have completed plots. - HashMap map = plotSQL.getStringIntMap("SELECT uuid,COUNT(id) FROM plot_review WHERE " + - "accepted=1 AND completed=1 GROUP BY uuid ORDER BY COUNT(id) DESC;"); + HashMap map = plotSQL.getStringIntMap( + "SELECT uuid,COUNT(id) FROM plot_review WHERE " + "accepted=1 AND completed=1 GROUP BY uuid ORDER BY COUNT(id) DESC;"); HashMap newMap = new LinkedHashMap<>(); // The first item is for all plots. @@ -67,20 +68,17 @@ private void createGui() { // Skip count. int skip = 21 * (page - 1); - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of users.")), - u -> + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of users.")), (NetworkUser u) -> - { + { - // Update the gui. - page--; - this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); - }); + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all accepted plots. @@ -89,17 +87,13 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of users.")), - (NetworkUser u) -> { + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of users.")), (NetworkUser u) -> { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -116,20 +110,17 @@ private void createGui() { // Skip if the count is 0. if (newMap.get(uuid) > 0) { if (StringUtils.isEmpty(uuid)) { - setItem(slot, Utils.createItem(Material.ENDER_CHEST, newMap.get(uuid), - Utils.title("All Plots"), - Utils.line("Click to set the filter"), - Utils.line("to all completed plots.")), - (NetworkUser u) -> { - // Set the filter and refresh the accepted plots menu at page 1. - acceptedPlotMenu.setFilter(uuid); - acceptedPlotMenu.setPage(1); - acceptedPlotMenu.refresh(); - this.refresh(); - - // Return to the accepted plot menu. - acceptedPlotMenu.open(u.player); - }); + setItem(slot, Utils.createItem(Material.ENDER_CHEST, newMap.get(uuid), Utils.title("All Plots"), Utils.line("Click to set the filter"), + Utils.line("to all completed plots.")), (NetworkUser u) -> { + // Set the filter and refresh the accepted plots menu at page 1. + acceptedPlotMenu.setFilter(uuid); + acceptedPlotMenu.setPage(1); + acceptedPlotMenu.refresh(); + this.refresh(); + + // Return to the accepted plot menu. + acceptedPlotMenu.open(u.player); + }); } else { PlayerProfile profile = Bukkit.createProfile(UUID.fromString(uuid)); @@ -142,9 +133,9 @@ private void createGui() { } } - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { - // Increase row, basically add 3. + // Increase row, add 3. slot += 3; } else { // Increase value by 1. @@ -152,17 +143,9 @@ private void createGui() { } } - // Return to plot menu. - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the accepted plot menu.")), - acceptedPlotMenu::open); - } - - public void refresh() { - - this.clearGui(); - createGui(); + // Return to the plot menu. + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the accepted plot menu.")), + (NetworkUser u) -> acceptedPlotMenu.open(u.player)); } @Override @@ -178,20 +161,17 @@ public void deleteThis() { private void createPlayerHeadGuiItem(PlayerProfile profile, int amount, String uuid, int slot) { if (amount != 0) { - setItem(slot, Utils.createPlayerSkull(profile, amount, - Utils.title(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';")), - Utils.line("Click to set the filter"), - Utils.line("to this player.")), - (NetworkUser u) -> { - // Set the filter and refresh the accepted plots menu at page 1. - acceptedPlotMenu.setFilter(uuid); - acceptedPlotMenu.setPage(1); - acceptedPlotMenu.refresh(); - this.refresh(); - - // Return to the accepted plot menu. - acceptedPlotMenu.open(u.player); - }); + setItem(slot, Utils.createPlayerSkull(profile, amount, Utils.title(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';")), + Utils.line("Click to set the filter"), Utils.line("to this player.")), (NetworkUser u) -> { + // Set the filter and refresh the accepted plots menu at page 1. + acceptedPlotMenu.setFilter(uuid); + acceptedPlotMenu.setPage(1); + acceptedPlotMenu.refresh(); + this.refresh(); + + // Return to the accepted plot menu. + acceptedPlotMenu.open(u.player); + }); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 52e1f544..bb480041 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -1,20 +1,25 @@ package net.bteuk.network.gui.plotsystem; import lombok.Setter; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.ServerType; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.InviteMembers; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.tutorials.RecommendedTutorialsGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.RegionType; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.PlotValues; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.PlotStatus; -import net.bteuk.network.utils.enums.RegionType; -import net.bteuk.network.utils.enums.ServerType; import net.bteuk.network.utils.enums.SubmittedStatus; import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.buildtheearth.terraminusminus.generator.EarthGeneratorSettings; @@ -31,38 +36,33 @@ import java.util.List; import java.util.Objects; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.Constants.SERVER_TYPE; - -public class PlotInfo extends Gui { +public class PlotInfo extends NetworkRefreshableGui { private final int plotID; private final NetworkUser user; - private final PlotSQL plotSQL; private final GlobalSQL globalSQL; + private final Constants constants; + private final EventAPI eventAPI; + private final ServerAPI serverAPI; private String plot_owner; @Setter private AcceptedPlotMenu acceptedPlotMenu; - public PlotInfo(NetworkUser user, int plotID) { + public PlotInfo(GuiProvider provider, NetworkUser user, int plotID) { // Create the menu. - super(27, Component.text("Plot " + plotID, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Plot " + plotID, NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; this.plotID = plotID; - - // Get plot sql. - plotSQL = Network.getInstance().getPlotSQL(); - - // Get global sql. - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); + this.constants = provider.constants(); + this.eventAPI = provider.eventAPI(); + this.serverAPI = provider.serverAPI(); } public void createGui() { @@ -92,7 +92,7 @@ public void createGui() { // Return setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the plot menu.")), (NetworkUser u) -> { - // Switch back to plot menu, or accepted plot menu. + // Switch back to the plot menu or the accepted plot menu. if (status == PlotStatus.COMPLETED && acceptedPlotMenu != null) { this.deleteThis(); acceptedPlotMenu.setPlotInfo(null); @@ -100,7 +100,7 @@ public void createGui() { } else { // Delete this gui. this.delete(); - u.mainGui = new PlotMenu(u); + u.mainGui = new PlotMenu(provider, u); u.mainGui.open(u.player); } }); @@ -124,14 +124,15 @@ public void createGui() { // If the plot is on the current server teleport them directly. // Else teleport them to the correct server and then teleport them to the plot. - if (server.equals(SERVER_NAME)) { - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, u.player.getLocation()); + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (server.equals(constants.serverName())) { + eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); } else { // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, u.player.getLocation()); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); // Teleport them to another server. - SwitchServer.switchServer(u.player, server); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } }); @@ -177,23 +178,22 @@ public void createGui() { if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER || plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER) { setItem(18, Utils.createItem(Material.ORANGE_STAINED_GLASS, 1, Utils.title("Toggle Outlines"), Utils.line("Enable/disable the outlines"), Utils.line("for this plot."), Utils.line("Rejoining the server"), Utils.line("will reset this to enabled.")), (NetworkUser u) -> { - EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", SERVER_NAME, "outlines toggle " + plotID); + eventAPI.createEvent(u.player.getUniqueId().toString(), "plotsystem", constants.serverName(), "outlines toggle " + plotID); u.player.closeInventory(); }); } // For the plot owner, add the manage and invite members options. (Slot 20 and 21) // As well as the submit/retract button. (Slot 2) - // If the plot is not under review allow it to be removed. (Slot 6) + // If the plot is not under review, allow it to be removed. (Slot 6) if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER) { setItem(20, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Plot Members"), Utils.line("Manage the members of your plot.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - u.mainGui = null; - // Switch back to plot menu. - u.mainGui = new PlotsystemMembers(plotID, RegionType.PLOT); + // Switch back to the plot members menu. + u.mainGui = new PlotsystemMembers(provider, plotID, RegionType.PLOT); u.mainGui.open(u.player); }); @@ -202,10 +202,9 @@ public void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; - // Switch back to plot menu. - u.mainGui = new InviteMembers(plotID, RegionType.PLOT); + // Switch back to the plot invite menu. + u.mainGui = new InviteMembers(provider, plotID, RegionType.PLOT); u.mainGui.open(u.player); }); @@ -224,15 +223,16 @@ public void createGui() { // The plot can only be retracted if it is not yet under review. if (status == PlotStatus.SUBMITTED && submittedStatus == SubmittedStatus.SUBMITTED) { - setItem(2, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title("Retract Submission"), Utils.line("Your plot will no longer be submitted.")), (NetworkUser u) -> { + setItem(2, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title("Retract Submission"), Utils.line("Your plot will no longer be submitted.")), + (NetworkUser u) -> { - u.player.closeInventory(); + u.player.closeInventory(); - // Add server event to retract plot submission. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( - "SELECT server FROM location_data WHERE name='" + plotSQL.getString( - "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','retract plot " + plotID + "');"); - }); + // Add server event to retract plot submission. + globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + "SELECT server FROM location_data WHERE name='" + plotSQL.getString( + "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','retract plot " + plotID + "');"); + }); } // The plot can only be deleted if it is not yet submitted. @@ -241,10 +241,9 @@ public void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Switch back to plot menu. - u.mainGui = new DeleteConfirm(plotID, RegionType.PLOT); + u.mainGui = new DeleteConfirm(provider, plotID, RegionType.PLOT); u.mainGui.open(u.player); }); } @@ -252,23 +251,24 @@ public void createGui() { // Members have the option to leave the plot (Slot 20) if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER) { - setItem(20, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Plot"), Utils.line("You will not be able to build in the plot once you leave.")), (NetworkUser u) -> { - - // Delete this gui. - this.delete(); - u.mainGui = null; + setItem(20, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Plot"), Utils.line("You will not be able to build in the plot once you leave.")), + (NetworkUser u) -> { - // Switch back to plot menu. - Bukkit.getScheduler().scheduleSyncDelayedTask(Network.getInstance(), () -> { - u.mainGui = new PlotMenu(u); - u.mainGui.open(u.player); - }, 20L); + // Delete this gui. + this.delete(); + u.mainGui = null; - // Add server event to leave plot. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( - "SELECT server FROM location_data WHERE name='" + plotSQL.getString( - "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','leave plot " + plotID + "');"); - }); + // Switch back to plot menu. + Bukkit.getScheduler().scheduleSyncDelayedTask(provider.instance(), () -> { + u.mainGui = new PlotMenu(provider, u); + u.mainGui.open(u.player); + }, 20L); + + // Add server event to leave plot. + globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + "SELECT server FROM location_data WHERE name='" + plotSQL.getString( + "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','leave plot " + plotID + "');"); + }); } // If this plot has feedback, add feedback for the plot owner and members (Slot 22) @@ -283,7 +283,7 @@ public void createGui() { u.mainGui = null; // Switch back to plot menu. - u.mainGui = new DeniedPlotFeedback(plotID); + u.mainGui = new DeniedPlotFeedback(provider, plotID); u.mainGui.open(u.player); }); // If the plot is accepted and has feedback show for the owner (Slot 21) @@ -302,28 +302,31 @@ public void createGui() { // Tutorial recommendations switch (plotInfoType) { case CLAIMED_OWNER, CLAIMED_MEMBER, ACCEPTED_OWNER -> { - setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see your"), Utils.line("recommended tutorials")), (NetworkUser u) -> { - user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, false); - user.mainGui.open(user); - }); + setItem(getRecommendationsSlot(plotInfoType), + Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), Utils.line("Click to see your"), Utils.line("recommended tutorials")), + (NetworkUser u) -> { + user.mainGui = new RecommendedTutorialsGui(provider, this, plotID, user, plot_owner, false); + user.mainGui.open(user.player); + }); } case SUBMITTED_REVIEWER, REVIEWED_REVIEWER, REVIEWING_REVIEWER, VERIFYING_REVIEWER -> { - setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), (NetworkUser u) -> { - user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, true); - user.mainGui.open(user); - }); + setItem(getRecommendationsSlot(plotInfoType), + Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), Utils.line("Click to see the"), Utils.line("tutorial recommendations"), + Utils.line("and add more")), (NetworkUser u) -> { + user.mainGui = new RecommendedTutorialsGui(provider, this, plotID, user, plot_owner, true); + user.mainGui.open(user.player); + }); } case CLAIMED, ACCEPTED -> { // Reviewers can always add recommendations to claimed and accepted plots // Architects can always add recommendations to claimed plots if (user.hasPermission("group.reviewer") || (user.hasPermission("group.architect") && plotInfoType.equals(PLOT_INFO_TYPE.CLAIMED))) { - setItem(getRecommendationsSlot(plotInfoType), Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), - Utils.line("Click to see the"), Utils.line("tutorial recommendations"), Utils.line("and add more")), (NetworkUser u) -> { - user.mainGui = new RecommendedTutorialsGui(this, plotID, user, plot_owner, true); - user.mainGui.open(user); - }); + setItem(getRecommendationsSlot(plotInfoType), + Utils.createItem(Material.LECTERN, 1, Utils.title("Tutorial Recommendations"), Utils.line("Click to see the"), Utils.line("tutorial recommendations"), + Utils.line("and add more")), (NetworkUser u) -> { + user.mainGui = new RecommendedTutorialsGui(provider, this, plotID, user, plot_owner, true); + user.mainGui.open(user.player); + }); } } } @@ -333,23 +336,23 @@ public void createGui() { setItem(20, Utils.createItem(Material.EMERALD, 1, Utils.title("Review Plot"), Utils.line("Click to start reviewing this plot.")), (NetworkUser u) -> { // If you are not owner or member of the plot, start the review. if (canReviewPlot()) { - // Get server of plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + Network.getInstance().getPlotSQL() - .getString("SELECT location FROM plot_data " + "WHERE id=" + plotID + ";") + "';"); + // Get the server of plot. + String server = plotSQL.getString( + "SELECT server FROM " + "location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data " + "WHERE id=" + plotID + ";") + "';"); // If they are not in the same server as the plot teleport them to that server and start // the reviewing process. - if (server.equals(SERVER_NAME)) { + if (server.equals(constants.serverName())) { u.player.closeInventory(); - EventManager.createEvent(u.getUuid(), "plotsystem", SERVER_NAME, "review plot " + plotID); + eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "review plot " + plotID); } else { // Player is not on the current server. // Set the server join event. - EventManager.createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); + eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); // Teleport them to the server. u.player.closeInventory(); - SwitchServer.switchServer(u.player, server); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } } else { user.player.sendMessage(ChatUtils.error("You are not allowed to review this plot.")); @@ -361,22 +364,22 @@ public void createGui() { setItem(20, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Verify Plot"), Utils.line("Click to start verifying this plot.")), (NetworkUser u) -> { if (canVerifyPlot()) { // Get server of plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + Network.getInstance().getPlotSQL() - .getString("SELECT location FROM plot_data " + "WHERE id=" + plotID + ";") + "';"); + String server = plotSQL.getString( + "SELECT server FROM " + "location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data " + "WHERE id=" + plotID + ";") + "';"); // If they are not in the same server as the plot teleport them to that server and start // the reviewing process. - if (server.equals(SERVER_NAME)) { + if (server.equals(constants.serverName())) { u.player.closeInventory(); - EventManager.createEvent(u.getUuid(), "plotsystem", SERVER_NAME, "verify plot " + plotID); + eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "verify plot " + plotID); } else { // Player is not on the current server. // Set the server join event. - EventManager.createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); + eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); // Teleport them to the server. u.player.closeInventory(); - SwitchServer.switchServer(u.player, server); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } } else { user.player.sendMessage(ChatUtils.error("You are not allowed to verify this plot.")); @@ -385,12 +388,6 @@ public void createGui() { } } - public void refresh() { - - this.clearGui(); - createGui(); - } - @Override public void delete() { if (acceptedPlotMenu != null) { @@ -550,17 +547,16 @@ private void teleportToPlotOutsidePlotsystem(NetworkUser user, int plotID) { // Teleport to the location on the Earth server. Component teleportMessage = ChatUtils.success("Teleported to accepted plot %s", String.valueOf(plotID)); - boolean switchServer = SERVER_TYPE != ServerType.EARTH; + boolean switchServer = constants.serverType() != ServerType.EARTH; - EventManager.createTeleportEvent(switchServer, user.player.getUniqueId().toString(), "network", - "teleport " + EARTH_WORLD + " " + x + " " + z + " " - + user.player.getLocation().getYaw() + " " + user.player.getLocation().getPitch(), PlainTextComponentSerializer.plainText().serialize(teleportMessage), - user.player.getLocation()); + eventAPI.createTeleportEvent(switchServer, user.player.getUniqueId().toString(), "network", + "teleport " + constants.earthWorld() + " " + x + " " + z + " " + user.player.getLocation().getYaw() + " " + user.player.getLocation().getPitch(), + PlainTextComponentSerializer.plainText().serialize(teleportMessage), LocationAdapter.adapt(user.player.getLocation())); // Switch to Earth server is necessary. if (switchServer) { user.player.closeInventory(); - SwitchServer.switchServer(user.player, Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE type='EARTH';")); + serverAPI.switchServer(PlayerAdapter.adapt(user.player), globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java index 4d674cbf..bae60b9e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotMenu.java @@ -1,7 +1,7 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -18,17 +18,15 @@ public class PlotMenu extends NetworkRefreshableGui { private final NetworkUser user; private final PlotSQL plotSQL; - public PlotMenu(NetworkUser user) { + public PlotMenu(GuiProvider provider, NetworkUser user) { - super(45, Component.text("Plot Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Plot Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { + protected void createGui() { ArrayList plots = plotSQL.getIntList("SELECT id FROM plot_members WHERE uuid='" + user.player.getUniqueId() + "' ORDER " + @@ -59,7 +57,7 @@ private void createGui() { u.mainGui = null; // Switch to plot info. - u.mainGui = new PlotInfo(u, plots.get(finalI)); + u.mainGui = new PlotInfo(provider, u, plots.get(finalI)); u.mainGui.open(u.player); }); @@ -85,7 +83,7 @@ private void createGui() { this.delete(); u.mainGui = null; - u.mainGui = new VerificationMenu(u); + u.mainGui = new VerificationMenu(provider, u); u.mainGui.open(u.player); }); } @@ -100,7 +98,7 @@ private void createGui() { u.mainGui = null; // Switch to plot info. - u.mainGui = new AcceptedPlotMenu(u); + u.mainGui = new AcceptedPlotMenu(provider, u); u.mainGui.open(u.player); }); @@ -111,17 +109,10 @@ private void createGui() { (NetworkUser u) -> { // Delete this gui. this.delete(); - u.mainGui = null; // Switch to plot info. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java index 22ef8b18..86839cb5 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java @@ -1,14 +1,14 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -17,11 +17,10 @@ import java.util.ArrayList; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class PlotServerLocations extends NetworkRefreshableGui { private final PlotSQL plotSQL; + private final Roles roles; private int plotDifficulty; private Material mDifficulty; private String sDifficulty; @@ -29,11 +28,12 @@ public class PlotServerLocations extends NetworkRefreshableGui { private Material mSize; private String sSize; - public PlotServerLocations(NetworkUser u) { + public PlotServerLocations(GuiProvider provider, NetworkUser u) { - super(45, Component.text("Plot Locations", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Plot Locations", NamedTextColor.AQUA, TextDecoration.BOLD)); - plotSQL = Network.getInstance().getPlotSQL(); + this.plotSQL = provider.plotSQL(); + this.roles = provider.roles(); // Set default values of gui. @@ -57,9 +57,6 @@ public PlotServerLocations(NetworkUser u) { plotSize = 0; mSize = Material.GRAY_CONCRETE; sSize = "Random"; - - // Create gui. - createGui(); } private void setDifficulty() { @@ -94,47 +91,37 @@ private void setSize() { } } - private void createGui() { + protected void createGui() { setDifficulty(); setSize(); // Select plot difficulty. - setItem(3, Utils.createItem(mDifficulty, 1, - Utils.title(sDifficulty), - Utils.line("Click to toggle the difficulty."), - Utils.line("You will only be teleported to"), - Utils.line("plots of the selected difficulty.")), - u -> - - { + setItem(3, Utils.createItem(mDifficulty, 1, Utils.title(sDifficulty), Utils.line("Click to toggle the difficulty."), Utils.line("You will only be teleported to"), + Utils.line("plots of the selected difficulty.")), (NetworkUser u) -> { - // Update the difficulty. - plotDifficulty = (plotDifficulty == 3) ? 0 : plotDifficulty + 1; + // Update the difficulty. + plotDifficulty = (plotDifficulty == 3) ? 0 : plotDifficulty + 1; - // Update the gui. - this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); - }); + // Update the gui. + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Select plot size. - setItem(5, Utils.createItem(mSize, 1, - Utils.title(sSize), - Utils.line("Click to toggle the size."), - Utils.line("You will only be teleported to"), - Utils.line("plots of the selected size.")), - u -> + setItem(5, Utils.createItem(mSize, 1, Utils.title(sSize), Utils.line("Click to toggle the size."), Utils.line("You will only be teleported to"), + Utils.line("plots of the selected size.")), (NetworkUser u) -> - { + { - // Update the Size. - plotSize = (plotSize == 3) ? 0 : plotSize + 1; + // Update the Size. + plotSize = (plotSize == 3) ? 0 : plotSize + 1; - // Update the gui. - this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); - }); + // Update the gui. + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Get all locations from database. ArrayList locations = plotSQL.getStringList("SELECT name FROM location_data"); @@ -146,139 +133,115 @@ private void createGui() { for (String location : locations) { // Create location button. - setItem(slot, Utils.createItem(Material.DIAMOND_PICKAXE, 1, - Utils.title(plotSQL.getString("SELECT alias FROM location_data WHERE name='" + location + "';")), - Utils.line("Click to teleport to a plot in this location"), - Utils.line("subject to the settings shown above."), - Utils.line("Available plots of each difficulty:"), - Utils.line("Easy: ") - .append(Component.text(plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + - "location='" + location + "' AND status='unclaimed' AND " + - "difficulty=1;"), - NamedTextColor.GRAY)), - Utils.line("Normal: ") - .append(Component.text(plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + - "location='" + location + "' AND status='unclaimed' AND " + - "difficulty=2;"), - NamedTextColor.GRAY)), - Utils.line("Hard: ") - .append(Component.text(plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + - "location='" + location + "' AND status='unclaimed' AND " + - "difficulty=3;"), - NamedTextColor.GRAY))), - u -> - - { - - // Check if a plot is available with the given parameters. - // If difficulty and size are 0 pick a random plot within the parameters that is allowed for - // the player. - int id; - - if (plotDifficulty == 0 && plotSize == 0) { - - if (Roles.builderRole(u.player).equals("jrbuilder")) { - - // Select a random plot of the hard difficulty. - // Since this is the next plot difficulty to get Builder. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=3 ORDER BY RAND() LIMIT 1;"); - } else if (Roles.builderRole(u.player).equals("apprentice")) { - - // Select a random plot of the normal difficulty. - // Since this is the next plot difficulty to get Jr.Builder. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=2 ORDER BY RAND() LIMIT 1;"); - } else if (Roles.builderRole(u.player).equals("default")) { - - // Select a random plot of the easy difficulty. - // Since this is the next plot difficulty to get Apprentice. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=1 ORDER BY RAND() LIMIT 1;"); - } else { - - // Select a random plot of any difficulty. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' ORDER BY RAND() LIMIT 1;"); - } - } else if (plotDifficulty == 0) { - // Pick plot with random difficulty but fixed size. - - if (Roles.builderRole(u.player).equals("jrbuilder")) { - - // Select a random plot of the hard difficulty. - // Since this is the next plot difficulty to get Builder. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=3 AND size=" + plotSize + " ORDER BY" + - " RAND() LIMIT 1;"); - } else if (Roles.builderRole(u.player).equals("apprentice")) { - - // Select a random plot of the normal difficulty. - // Since this is the next plot difficulty to get Jr.Builder. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=2 AND size=" + plotSize + " ORDER BY" + - " RAND() LIMIT 1;"); - } else if (Roles.builderRole(u.player).equals("default")) { - - // Select a random plot of the easy difficulty. - // Since this is the next plot difficulty to get Apprentice. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND difficulty=1 AND size=" + plotSize + " ORDER BY" + - " RAND() LIMIT 1;"); - } else { - // Select a random plot of any difficulty. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + - "' AND status='unclaimed' AND size=" + plotSize + " ORDER BY RAND() LIMIT 1;"); - } - } else if (plotSize == 0) { - // Pick plot with random size but fixed difficulty. - - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location='" + location + - "' AND status='unclaimed' AND difficulty=" + plotDifficulty + " ORDER BY RAND() " + - "LIMIT 1;"); - } else { - // Both size and difficulty are specified. - - // Select a random plot of any difficulty. - id = plotSQL.getInt("SELECT id FROM plot_data WHERE location='" + location + - "' AND status='unclaimed' AND difficulty=" + plotDifficulty + " AND size=" + plotSize + " ORDER BY RAND() LIMIT 1;"); - } - - // If no plots fit the specified parameters the id will be 0. - if (id == 0) { - - u.player.sendMessage(ChatUtils.error("No plots are available with the specified settings," - )); - u.player.sendMessage(ChatUtils.error("try another location or change the settings.")); - } else { - - // Get the server of the plot. - String server = plotSQL.getString("SELECT server FROM location_data WHERE name='" - + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";") - + "';"); - - // If the plot is on the current server teleport them directly. - // Else teleport them to the correct server and then teleport them to the plot. - if (server.equals(SERVER_NAME)) { - - u.player.closeInventory(); - - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), - "plotsystem", "teleport plot " + id, u.player.getLocation()); - } else { - - // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem" - , "teleport plot " + id, u.player.getLocation()); - - // Teleport them to another server. - this.delete(); - SwitchServer.switchServer(u.player, server); - } - } - }); - - // Increase slot accordingly. + setItem(slot, Utils.createItem(Material.DIAMOND_PICKAXE, 1, Utils.title(plotSQL.getString("SELECT alias FROM location_data WHERE name='" + location + "';")), + Utils.line("Click to teleport to a plot in this location"), Utils.line("subject to the settings shown above."), + Utils.line("Available plots of each difficulty:"), Utils.line("Easy: ").append(Component.text( + plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + "location='" + location + "' AND status='unclaimed' AND " + "difficulty=1;"), + NamedTextColor.GRAY)), Utils.line("Normal: ").append(Component.text( + plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + "location='" + location + "' AND status='unclaimed' AND " + "difficulty=2;"), + NamedTextColor.GRAY)), Utils.line("Hard: ").append(Component.text( + plotSQL.getInt("SELECT count(id) FROM plot_data WHERE " + "location='" + location + "' AND status='unclaimed' AND " + "difficulty=3;"), + NamedTextColor.GRAY))), (NetworkUser u) -> + + { + + // Check if a plot is available with the given parameters. + // If difficulty and size are 0 pick a random plot within the parameters that is allowed for + // the player. + int id; + + if (plotDifficulty == 0 && plotSize == 0) { + + if (roles.builderRole(u.player).getId().equals("jrbuilder")) { + + // Select a random plot of the hard difficulty. + // Since this is the next plot difficulty to get Builder. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=3 ORDER BY RAND() LIMIT 1;"); + } else if (roles.builderRole(u.player).getId().equals("apprentice")) { + + // Select a random plot of the normal difficulty. + // Since this is the next plot difficulty to get Jr.Builder. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=2 ORDER BY RAND() LIMIT 1;"); + } else if (roles.builderRole(u.player).getId().equals("default")) { + + // Select a random plot of the easy difficulty. + // Since this is the next plot difficulty to get Apprentice. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=1 ORDER BY RAND() LIMIT 1;"); + } else { + + // Select a random plot of any difficulty. + id = plotSQL.getInt("SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' ORDER BY RAND() LIMIT 1;"); + } + } else if (plotDifficulty == 0) { + // Pick plot with random difficulty but fixed size. + + if (roles.builderRole(u.player).getId().equals("jrbuilder")) { + + // Select a random plot of the hard difficulty. + // Since this is the next plot difficulty to get Builder. + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=3 AND size=" + plotSize + " ORDER BY" + " " + "RAND() LIMIT 1;"); + } else if (roles.builderRole(u.player).getId().equals("apprentice")) { + + // Select a random plot of the normal difficulty. + // Since this is the next plot difficulty to get Jr.Builder. + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=2 AND size=" + plotSize + " ORDER BY" + " " + "RAND() LIMIT 1;"); + } else if (roles.builderRole(u.player).getId().equals("default")) { + + // Select a random plot of the easy difficulty. + // Since this is the next plot difficulty to get Apprentice. + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND difficulty=1 AND size=" + plotSize + " ORDER BY" + " " + "RAND() LIMIT 1;"); + } else { + // Select a random plot of any difficulty. + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location = '" + location + "' AND status='unclaimed' AND size=" + plotSize + " ORDER BY RAND() LIMIT 1;"); + } + } else if (plotSize == 0) { + // Pick plot with random size but fixed difficulty. + + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location='" + location + "' AND status='unclaimed' AND difficulty=" + plotDifficulty + " ORDER BY RAND() " + "LIMIT " + "1;"); + } else { + // Both size and difficulty are specified. + + // Select a random plot of any difficulty. + id = plotSQL.getInt( + "SELECT id FROM plot_data WHERE location='" + location + "' AND status='unclaimed' AND difficulty=" + plotDifficulty + " AND size=" + plotSize + " " + "ORDER BY RAND() LIMIT 1;"); + } + + // If no plots fit the specified parameters the id will be 0. + if (id == 0) { + + u.player.sendMessage(ChatUtils.error("No plots are available with the specified settings,")); + u.player.sendMessage(ChatUtils.error("try another location or change the settings.")); + } else { + + // Get the server of the plot. + String server = plotSQL.getString( + "SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";") + "';"); + + // If the plot is on the current server teleport them directly. + // Else teleport them to the correct server and then teleport them to the plot. + if (server.equals(provider.constants().serverName())) { + + u.player.closeInventory(); + + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); + } else { + + // Set the server join event. + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); + + // Teleport them to another server. + this.delete(); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); + } + } + }); + + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -292,27 +255,12 @@ private void createGui() { } // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the build menu.")), - u -> - - { - - // Switch back to build menu. - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Create build menu. - u.mainGui = new BuildGui(u); - u.mainGui.open(u.player); - }); - } - - public void refresh() { + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the build menu.")), (NetworkUser u) -> { - clearGui(); - createGui(); + // Switch back to the build menu. + this.delete(); + u.mainGui = new BuildGui(provider, u); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java index 8fe966a8..c3e0a598 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java @@ -1,12 +1,14 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -18,8 +20,6 @@ import java.util.ArrayList; import java.util.Objects; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - public class PlotsystemLocations extends NetworkRefreshableGui { private final PlotSQL plotSQL; @@ -27,17 +27,15 @@ public class PlotsystemLocations extends NetworkRefreshableGui { private int counter; - public PlotsystemLocations() { - - super(45, Component.text("Plotsystem Locations", NamedTextColor.AQUA, TextDecoration.BOLD)); + public PlotsystemLocations(GuiProvider provider) { - plotSQL = Network.getInstance().getPlotSQL(); - globalSQL = Network.getInstance().getGlobalSQL(); + super(provider, 45, Component.text("Plotsystem Locations", NamedTextColor.AQUA, TextDecoration.BOLD)); - createGui(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); } - private void createGui() { + protected void createGui() { counter = 0; @@ -74,7 +72,8 @@ private void createGui() { String server = plotSQL.getString("SELECT server FROM location_data WHERE name='" + name + "';"); - if (server.equals(SERVER_NAME)) { + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (server.equals(provider.constants().serverName())) { u.player.closeInventory(); @@ -83,23 +82,23 @@ private void createGui() { double y = Objects.requireNonNull(world).getHighestBlockYAt((int) x, (int) z); y++; - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), "network", + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "network", "teleport " + name + " " + x + " " + y + " " + z + " " + u.player.getLocation().getYaw() + " " + u.player.getLocation().getPitch(), "&aTeleported to location &3" + plotSQL.getString("SELECT alias FROM " + - "location_data WHERE name='" + name + "';"), u.player.getLocation()); + "location_data WHERE name='" + name + "';"), location); } else { // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport " + name + " " + x + " " + z + " " + u.player.getLocation().getYaw() + " " + u.player.getLocation().getPitch(), "&aTeleported to location &3" + plotSQL.getString("SELECT alias FROM " + - "location_data WHERE name='" + name + "';"), u.player.getLocation()); + "location_data WHERE name='" + name + "';"), location); // Teleport them to another server. this.delete(); - SwitchServer.switchServer(u.player, server); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } }); @@ -121,20 +120,13 @@ private void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Switch to plot info. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); } - public void refresh() { - - this.clearGui(); - createGui(); - } - private Material nextIcon() { Material mat; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java index 44555e86..6baffd10 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java @@ -1,12 +1,14 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import lombok.extern.java.Log; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.RegionType; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -14,7 +16,8 @@ import java.util.ArrayList; -public class PlotsystemMembers extends Gui { +@Log +public class PlotsystemMembers extends NetworkRefreshableGui { private final int id; private final RegionType regionType; @@ -22,22 +25,20 @@ public class PlotsystemMembers extends Gui { private final PlotSQL plotSQL; private int page; - public PlotsystemMembers(int id, RegionType regionType) { + public PlotsystemMembers(GuiProvider provider, int id, RegionType regionType) { - super(45, Component.text("Manage Members", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Manage Members", NamedTextColor.AQUA, TextDecoration.BOLD)); this.id = id; this.regionType = regionType; page = 1; - globalSQL = Network.getInstance().getGlobalSQL(); - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + this.globalSQL = provider.globalSQL(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { + protected void createGui() { ArrayList members; @@ -50,8 +51,7 @@ private void createGui() { members = plotSQL.getStringList("SELECT uuid FROM zone_members WHERE id=" + id + " AND is_owner=0;"); } else { - Network.getInstance().getLogger().warning("PlotsystemMembers has been created without a valid regionType " + - "(PLOT or ZONE)!"); + log.warning("PlotsystemMembers GUI has been created without a valid regionType (PLOT or ZONE)!"); return; } @@ -63,17 +63,13 @@ private void createGui() { // If page is greater than 1 add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of " + regionType.label + " members.")), - u -> - - { + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of " + regionType.label + " members.")), + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -84,18 +80,15 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the previous page of " + regionType.label + " members.")), - u -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the previous page of " + regionType.label + " members.")), + (NetworkUser u) -> { // Update the gui. page++; this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); // Stop iterating. @@ -110,25 +103,20 @@ private void createGui() { // Add player to gui. setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Kick " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from your " + regionType.label + "."), - Utils.line("Click to remove them as member of your " + regionType.label + "."), - Utils.line("They will no longer be able to build in it.")), - u -> + Utils.title("Kick " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from your " + regionType.label + "."), + Utils.line("Click to remove them as member of your " + regionType.label + "."), Utils.line("They will no longer be able to build in it.")), + (NetworkUser u) -> { if (regionType == RegionType.PLOT) { - if (plotSQL.hasRow( - "SELECT id FROM plot_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { + if (plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { // Kick the member from the plot. - EventManager.createEvent(uuid, "plotsystem", plotSQL.getString("SELECT server " + - "FROM location_data WHERE name='" + - plotSQL.getString( - "SELECT location FROM plot_data WHERE id=" + id + ";") + - "';"), + provider.eventAPI().createEvent(uuid, "plotsystem", plotSQL.getString( + "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";" + ) + "';"), "kick plot " + id); // Return to the previous menu, since otherwise the gui won't have updated. @@ -136,28 +124,26 @@ private void createGui() { u.mainGui = null; // Switch back to plot info. - u.mainGui = new PlotInfo(u, id); + u.mainGui = new PlotInfo(provider, u, id); u.mainGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("This player is not a member of your Plot.")); } } else { - if (plotSQL.hasRow( - "SELECT id FROM zone_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { + if (plotSQL.hasRow("SELECT id FROM zone_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { // Kick the member from the plot. - EventManager.createEvent(uuid, "plotsystem", plotSQL.getString("SELECT server " + - "FROM location_data WHERE name='" + - plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + - "';"), "kick zone " + id); + provider.eventAPI().createEvent(uuid, "plotsystem", plotSQL.getString( + "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), + "kick zone " + id); // Return to the previous menu, since otherwise the gui won't have updated. this.delete(); u.mainGui = null; - // Switch back to plot info. - u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); + // Switch back to zone info. + u.mainGui = new ZoneInfo(provider, u, id, u.player.getUniqueId().toString()); u.mainGui.open(u.player); } else { u.player.sendMessage(ChatUtils.error("This player is not a member of your Zone.")); @@ -177,9 +163,7 @@ private void createGui() { } // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the " + regionType.label + " info for this " + regionType.label + ".")), + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the " + regionType.label + " info for this " + regionType.label + ".")), (NetworkUser u) -> { // Delete this gui. @@ -189,19 +173,13 @@ private void createGui() { // Switch back to plot info. if (regionType == RegionType.PLOT) { - u.mainGui = new PlotInfo(u, id); + u.mainGui = new PlotInfo(provider, u, id); } else { - u.mainGui = new ZoneInfo(u, id, u.player.getUniqueId().toString()); + u.mainGui = new ZoneInfo(provider, u, id, u.player.getUniqueId().toString()); } u.mainGui.open(u.player); }); } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 810ba6a9..7584bc18 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -1,10 +1,13 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.kyori.adventure.text.Component; @@ -12,32 +15,25 @@ import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - -public class VerificationInfo extends Gui { +public class VerificationInfo extends NetworkRefreshableGui { private final int verificationId; private final PlotSQL plotSQL; private final GlobalSQL globalSQL; - public VerificationInfo(int verificationId) { + public VerificationInfo(GuiProvider provider, int verificationId) { // Create the menu. - super(27, Component.text("Verification " + verificationId, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider,27, Component.text("Verification " + verificationId, NamedTextColor.AQUA, TextDecoration.BOLD)); this.verificationId = verificationId; - // Get plot sql. - plotSQL = Network.getInstance().getPlotSQL(); - - // Get global sql. - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); } - public void createGui() { + protected void createGui() { // Return setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, @@ -45,7 +41,7 @@ public void createGui() { Utils.line("Open the plot menu.")), (NetworkUser u) -> { this.delete(); - u.mainGui = new PlotMenu(u); + u.mainGui = new PlotMenu(provider, u); u.mainGui.open(u.player); } ); @@ -139,16 +135,17 @@ public void createGui() { // If the plot is on the current server teleport them directly. // Else teleport them to the correct server and them teleport them to the plot. - if (server.equals(SERVER_NAME)) { - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + plotId, u.player.getLocation()); + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (server.equals(provider.constants().serverName())) { + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", + "teleport plot " + plotId, location); } else { // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + plotId, u.player.getLocation()); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", + "teleport plot " + plotId, location); // Teleport them to another server. - SwitchServer.switchServer(u.player, server); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } }); @@ -162,14 +159,9 @@ public void createGui() { u.mainGui = null; // Switch to verified review menu. - u.mainGui = new VerificationMenu(u); + u.mainGui = new VerificationMenu(provider, u); u.mainGui.open(u.player); }); } - - public void refresh() { - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java index aedd57f7..00e06e1e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java @@ -1,6 +1,7 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -14,22 +15,20 @@ /** * Menu to view previous reviews that have been verified. */ -public class VerificationMenu extends Gui { +public class VerificationMenu extends NetworkRefreshableGui { private final NetworkUser user; private final PlotSQL plotSQL; - public VerificationMenu(NetworkUser user) { - super(45, Component.text("Verified Review Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + public VerificationMenu(GuiProvider provider, NetworkUser user) { + super(provider, 45, Component.text("Verified Review Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { + protected void createGui() { ArrayList verifications = plotSQL.getIntList("SELECT id FROM plot_verification WHERE review_id IN " + "(SELECT id FROM plot_review WHERE reviewer='" + user.getUuid() + "') ORDER BY id ASC;"); @@ -76,7 +75,7 @@ private void createGui() { u.mainGui = null; // Switch to plot info. - u.mainGui = new VerificationInfo(verificationId); + u.mainGui = new VerificationInfo(provider, verificationId); u.mainGui.open(u.player); }); @@ -99,14 +98,9 @@ private void createGui() { u.mainGui = null; // Switch to plot info. - u.mainGui = new PlotMenu(u); + u.mainGui = new PlotMenu(provider, u); u.mainGui.open(u.player); }); } } - - public void refresh() { - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index 42a921a9..ea0ac57d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -1,201 +1,163 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.core.Time; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.InviteMembers; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.RegionType; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.Time; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; import org.bukkit.Material; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - -public class ZoneInfo extends Gui { +public class ZoneInfo extends NetworkRefreshableGui { private final int zoneID; private final String uuid; private final PlotSQL plotSQL; + private final GlobalSQL globalSQL; private final NetworkUser user; - public ZoneInfo(NetworkUser user, int zoneID, String uuid) { + public ZoneInfo(GuiProvider provider, NetworkUser user, int zoneID, String uuid) { - super(27, Component.text("Zone " + zoneID, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Zone " + zoneID, NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; this.zoneID = zoneID; this.uuid = uuid; - // Get plot sql. - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); + this.globalSQL = provider.globalSQL(); } public void createGui() { - // Get global sql. - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - - setItem(4, Utils.createItem(Material.BOOK, 1, - Utils.title("Zone " + zoneID), - Utils.line("Zone Owner: ") - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + - plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND " + - "is_owner=1;") + "';"), NamedTextColor.GRAY)), - Utils.line("Zone Members: ") - .append(Component.text(plotSQL.getInt( - "SELECT COUNT(uuid) FROM zone_members WHERE id=" + zoneID + " AND is_owner=0;"), - NamedTextColor.GRAY)), + setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Zone " + zoneID), Utils.line("Zone Owner: ").append(Component.text(globalSQL.getString( + "SELECT name FROM player_data WHERE uuid='" + plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND " + "is_owner=1;") + + "';"), + NamedTextColor.GRAY)), Utils.line("Zone Members: ") + .append(Component.text(plotSQL.getInt("SELECT COUNT(uuid) FROM zone_members WHERE id=" + zoneID + " AND is_owner=0;"), NamedTextColor.GRAY)), Utils.line("Expiration: ") - .append(Component.text(Time.getDateTime(plotSQL.getLong("SELECT expiration FROM zones WHERE " + - "id=" + zoneID + ";")), NamedTextColor.GRAY)), + .append(Component.text(Time.getDateTime(plotSQL.getLong("SELECT expiration FROM zones WHERE " + "id=" + zoneID + ";")), NamedTextColor.GRAY)), Utils.line("Public: ") - .append(Component.text((plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zoneID + " AND " + - "is_public=1") ? "True" : "False"), NamedTextColor.GRAY)))); + .append(Component.text((plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zoneID + " AND " + "is_public=1") ? "True" : "False"), NamedTextColor.GRAY)))); - setItem(8, Utils.createItem(Material.ENDER_PEARL, 1, - Utils.title("Teleport to Zone"), - Utils.line("Click to teleport to this zone.")), + setItem(8, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Zone"), Utils.line("Click to teleport to this zone.")), (NetworkUser u) -> { u.player.closeInventory(); // Get the server of the plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM location_data " + - "WHERE name='" - + Network.getInstance().getPlotSQL() - .getString("SELECT location FROM zones WHERE id=" + zoneID + ";") - + "';"); + String server = plotSQL.getString( + "SELECT server FROM location_data " + "WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + zoneID + ";") + "';"); // If the plot is on the current server teleport them directly. // Else teleport them to the correct server and them teleport them to the plot. - if (server.equals(SERVER_NAME)) { + NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); + if (server.equals(provider.constants().serverName())) { - EventManager.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", - "teleport zone " + zoneID, u.player.getLocation()); + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); } else { // Set the server join event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", - "teleport zone " + zoneID, u.player.getLocation()); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); // Teleport them to another server. - SwitchServer.switchServer(u.player, server); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } }); // If you the owner of this zone. - if (plotSQL.hasRow("SELECT id FROM zone_members WHERE id=" + zoneID + " AND uuid='" + uuid + "' AND " + - "is_owner=1;")) { + if (plotSQL.hasRow("SELECT id FROM zone_members WHERE id=" + zoneID + " AND uuid='" + uuid + "' AND " + "is_owner=1;")) { // Delete zone button. - // Beware, this will revert any progress made in the zone! - setItem(6, Utils.createItem(Material.RED_CONCRETE, 1, - Utils.title("Delete Zone"), - Utils.line("Delete the zone and all its contents.")), - (NetworkUser u) -> { + // Beware; this will revert any progress made in the zone! + setItem(6, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Delete Zone"), Utils.line("Delete the zone and all its contents.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch back to plot menu. - u.mainGui = new DeleteConfirm(zoneID, RegionType.ZONE); - u.mainGui.open(u.player); - }); + // Switch back to plot menu. + u.mainGui = new DeleteConfirm(provider, zoneID, RegionType.ZONE); + u.mainGui.open(u.player); + }); // Close and save zone. // This will save the progress and then close the zone. - setItem(2, Utils.createItem(Material.LIME_CONCRETE, 1, - Utils.title("Save and close Zone"), - Utils.line("Close the Zone and save its contents.")), - (NetworkUser u) -> { + setItem(2, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Save and close Zone"), Utils.line("Close the Zone and save its contents.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Open close confirm menu. - u.mainGui = new CloseConfirm(zoneID); - u.mainGui.open(u.player); - }); + // Open close confirm menu. + u.mainGui = new CloseConfirm(provider, zoneID); + u.mainGui.open(u.player); + }); // If zone has members, edit plot members. - setItem(9, Utils.createItem(Material.PLAYER_HEAD, 1, - Utils.title("Zone Members"), - Utils.line("Manage the members of your zone.")), - (NetworkUser u) -> { + setItem(9, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Zone Members"), Utils.line("Manage the members of your zone.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Open the members menu. - u.mainGui = new PlotsystemMembers(zoneID, RegionType.ZONE); - u.mainGui.open(u.player); - }); + // Open the members menu. + u.mainGui = new PlotsystemMembers(provider, zoneID, RegionType.ZONE); + u.mainGui.open(u.player); + }); // Invite new members to your zone. - setItem(0, Utils.createItem(Material.OAK_BOAT, 1, - Utils.title("Invite Members"), - Utils.line("Invite a new member to your zone."), - Utils.line("You can only invite online users.")), - (NetworkUser u) -> { + setItem(0, Utils.createItem(Material.OAK_BOAT, 1, Utils.title("Invite Members"), Utils.line("Invite a new member to your zone."), + Utils.line("You can only invite online users.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch back to plot menu. - u.mainGui = new InviteMembers(zoneID, RegionType.ZONE); - u.mainGui.open(u.player); - }); + // Switch back to plot menu. + u.mainGui = new InviteMembers(provider, zoneID, RegionType.ZONE); + u.mainGui.open(u.player); + }); // Set public/private if (plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zoneID + " AND is_public=1;")) { - setItem(18, Utils.createItem(Material.OAK_DOOR, 1, - Utils.title("Set Private"), - Utils.line("Private zones require you to"), - Utils.line("invite people if they want to build.")), - (NetworkUser u) -> { + setItem(18, Utils.createItem(Material.OAK_DOOR, 1, Utils.title("Set Private"), Utils.line("Private zones require you to"), + Utils.line("invite people if they want to build.")), (NetworkUser u) -> { - // Set zone to private and refresh this gui. - plotSQL.update("UPDATE zones SET is_public=0 WHERE id=" + zoneID + ";"); - u.player.sendMessage(ChatUtils.success("Set zone to private.")); + // Set zone to private and refresh this gui. + plotSQL.update("UPDATE zones SET is_public=0 WHERE id=" + zoneID + ";"); + u.player.sendMessage(ChatUtils.success("Set zone to private.")); - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + this.refresh(); + this.updatePlayerInventory(u.player); + }); } else { - setItem(18, Utils.createItem(Material.IRON_DOOR, 1, - Utils.title("Set Public"), - Utils.line("Public zones allow Jr.Builder+"), - Utils.line("to join the zone without invitation.")), - (NetworkUser u) -> { + setItem(18, Utils.createItem(Material.IRON_DOOR, 1, Utils.title("Set Public"), Utils.line("Public zones allow Jr.Builder+"), + Utils.line("to join the zone without invitation.")), (NetworkUser u) -> { - // Set zone to private and refresh this gui. - plotSQL.update("UPDATE zones SET is_public=1 WHERE id=" + zoneID + ";"); - u.player.sendMessage(ChatUtils.success("Set zone to public.")); + // Set zone to private and refresh this gui. + plotSQL.update("UPDATE zones SET is_public=1 WHERE id=" + zoneID + ";"); + u.player.sendMessage(ChatUtils.success("Set zone to public.")); - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Extend zone duration (can't exceed maximum of 48 hours). @@ -205,9 +167,7 @@ public void createGui() { } else { // You are a member of this zone. - setItem(4, Utils.createItem(Material.RED_CONCRETE, 1, - Utils.title("Leave Zone"), - Utils.line("You will not be able to build in the zone once you leave.")), + setItem(4, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Zone"), Utils.line("You will not be able to build in the zone once you leave.")), (NetworkUser u) -> { // Delete this gui. @@ -215,46 +175,36 @@ public void createGui() { u.mainGui = null; // Switch back to zone menu, - Bukkit.getScheduler().scheduleSyncDelayedTask(Network.getInstance(), () -> { - u.mainGui = new ZoneMenu(u); + Bukkit.getScheduler().scheduleSyncDelayedTask(provider.instance(), () -> { + u.mainGui = new ZoneMenu(provider, u); u.mainGui.open(u.player); }, 20L); // Add server event to leave plot. - globalSQL.update( - "INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + - plotSQL.getString("SELECT server FROM location_data WHERE name='" + - plotSQL.getString( - "SELECT location FROM zones WHERE id=" + zoneID + ";") + - "';") + - "','leave zone " + zoneID + "');"); + globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + "SELECT server FROM location_data WHERE name='" + plotSQL.getString( + "SELECT location FROM zones WHERE id=" + zoneID + ";") + "';") + "','leave zone " + zoneID + "');"); }); } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the zone menu.")), - u -> - - { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the zone menu.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Delete this gui. + this.delete(); - // Switch back to plot menu. - u.mainGui = new ZoneMenu(u); - u.mainGui.open(u.player); - }); + // Switch back to the zone menu. + u.mainGui = new ZoneMenu(provider, u); + u.mainGui.open(u.player); + }); } public void refresh() { - this.clearGui(); + this.clear(); - // If the plot no longer exists, return to the plot menu. - if (Network.getInstance().getPlotSQL().hasRow("SELECT id FROM zones WHERE id=" + zoneID + ";")) { + // If the zone no longer exists, return to the plot menu. + if (plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zoneID + ";")) { createGui(); } else { // Delete this gui. @@ -262,30 +212,25 @@ public void refresh() { user.mainGui = null; // Switch back to plot menu. - user.mainGui = new ZoneMenu(user); - user.mainGui.open(user); + user.mainGui = new ZoneMenu(provider, user); + user.mainGui.open(user.player); } } private void setExtendZoneDurationItem(int slot, ZoneExtensionTime extension) { - setItem(slot, Utils.createItem(Material.CLOCK, extension.hours, - Utils.title("Extend Zone Duration by " + extension.hours + " Hours"), - Utils.line("Increases the expiration time"), - Utils.line("of the zone by " + extension.hours + " hours,"), - Utils.line("can't exceed the maximum of " + ZoneExtensionTime.HOUR_48.hours + " hours.")), + setItem(slot, + Utils.createItem(Material.CLOCK, extension.hours, Utils.title("Extend Zone Duration by " + extension.hours + " Hours"), Utils.line("Increases the expiration time"), + Utils.line("of the zone by " + extension.hours + " hours,"), Utils.line("can't exceed the maximum of " + ZoneExtensionTime.HOUR_48.hours + " hours.")), (NetworkUser u) -> { // Get expiration time. - long expiration = - plotSQL.getLong("SELECT expiration FROM zones WHERE id=" + zoneID + ";") + extension.time; + long expiration = plotSQL.getLong("SELECT expiration FROM zones WHERE id=" + zoneID + ";") + extension.time; // Get maximum expiration time. long max_time = Time.currentTime() + ZoneExtensionTime.HOUR_48.time; - plotSQL.update( - "UPDATE zones SET expiration=" + Math.min(expiration, max_time) + " WHERE id=" + zoneID); - u.player.sendMessage(ChatUtils.success("Set Zone expiration time to ") - .append(Component.text(Time.getDateTime(Math.min(expiration, max_time)), - NamedTextColor.DARK_AQUA))); + plotSQL.update("UPDATE zones SET expiration=" + Math.min(expiration, max_time) + " WHERE id=" + zoneID); + u.player.sendMessage( + ChatUtils.success("Set Zone expiration time to ").append(Component.text(Time.getDateTime(Math.min(expiration, max_time)), NamedTextColor.DARK_AQUA))); u.player.closeInventory(); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java index 0d59e05a..91ad8a30 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java @@ -1,8 +1,7 @@ package net.bteuk.network.gui.plotsystem; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; @@ -19,17 +18,15 @@ public class ZoneMenu extends NetworkRefreshableGui { private final NetworkUser user; private final PlotSQL plotSQL; - public ZoneMenu(NetworkUser user) { + public ZoneMenu(GuiProvider provider, NetworkUser user) { - super(45, Component.text("Zone Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Zone Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - plotSQL = Network.getInstance().getPlotSQL(); - - createGui(); + this.plotSQL = provider.plotSQL(); } - private void createGui() { + protected void createGui() { /* Gui layout: @@ -74,7 +71,7 @@ private void createGui() { u.mainGui = null; // Switch to zone info. - u.mainGui = new ZoneInfo(u, zones.get(finalI), u.player.getUniqueId().toString()); + u.mainGui = new ZoneInfo(provider, u, zones.get(finalI), u.player.getUniqueId().toString()); u.mainGui.open(u.player); }); } else if (plotSQL.hasRow("SELECT id FROM zones WHERE id=" + zones.get(i) + " AND is_public=1;")) { @@ -86,7 +83,7 @@ private void createGui() { (NetworkUser u) -> { // Add server event to join zone. - EventManager.createEvent(u.player.getUniqueId().toString(), "plotsystem", + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + zones.get( finalI) + ";") + "';"), @@ -103,7 +100,7 @@ private void createGui() { Utils.line("This zone is private,"), Utils.line("to join this zone you must be"), Utils.line("invited by ") - .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name " + + .append(Component.text(provider.globalSQL().getString("SELECT name " + "FROM player_data WHERE uuid='" + plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zones.get(i) + " AND is_owner=1;") + "';"), NamedTextColor.GRAY)))); @@ -130,14 +127,8 @@ private void createGui() { u.mainGui = null; // Switch to plot info. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java index 32b3e83b..527402b6 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java @@ -3,9 +3,10 @@ import lombok.Getter; import me.bteuk.progressmapper.guis.FeatureMenu; import me.bteuk.progressmapper.guis.Field; -import net.bteuk.network.Network; import net.bteuk.network.eventing.listeners.progressmap.FeatureGeometryEditorListener; import net.bteuk.network.eventing.listeners.progressmap.FeaturePropertiesBookListener; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -19,16 +20,14 @@ // The page for editing a feature // Should we have two different ones for edit and create (and then a shared parent) or just have both within one? -public class FeaturePageGUI extends Gui { +public class FeaturePageGUI extends NetworkGui { @Getter private final FeatureMenu featureMenu; - private final Network plugin; private final LocalFeatureListGUI parentLocalFeatureListGUI; - public FeaturePageGUI(FeatureMenu featureMenu, Network plugin, LocalFeatureListGUI parentLocalFeatureListGUI) { - super(featureMenu.getGUI()); + public FeaturePageGUI(GuiProvider provider, FeatureMenu featureMenu, LocalFeatureListGUI parentLocalFeatureListGUI) { + super(provider, featureMenu.getGUI()); this.featureMenu = featureMenu; - this.plugin = plugin; this.parentLocalFeatureListGUI = parentLocalFeatureListGUI; setActions(); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java index 60ae6776..afa798d3 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java @@ -1,22 +1,23 @@ package net.bteuk.network.gui.progressmap; import me.bteuk.progressmapper.guis.LocalFeaturesMenu; -import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; +import net.bteuk.network.utils.NetworkUser; +import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -public class LocalFeatureListGUI extends Gui { +public class LocalFeatureListGUI extends NetworkGui { // Contains all of the relevant information for each feature in the list - LocalFeaturesMenu features; - Network plugin; + private final LocalFeaturesMenu features; - public LocalFeatureListGUI(LocalFeaturesMenu features, Network plugin) { + public LocalFeatureListGUI(GuiProvider provider, LocalFeaturesMenu features) { // Need a list of things created really. I think this has to be before this one is created. This then holds // all of the Features // Each feature would have a feature menu (not a feature page) - super(features.getGUI()); + super(provider, features.getGUI()); this.features = features; - this.plugin = plugin; setActions(); } @@ -24,12 +25,12 @@ private void setActions() { int i, iFeatures; iFeatures = features.getNumFeatures(); - // Creates all of the actions + // Creates all the actions for (i = 0; i < iFeatures; i++) { final int iFinalSlot = i; setAction(i, (NetworkUser u) -> { // When a feature is clicked on it needs to open a FeaturePageGUI - u.mainGui = new FeaturePageGUI(features.getFeatureMenu(iFinalSlot), plugin, this); + u.mainGui = new FeaturePageGUI(provider, features.getFeatureMenu(iFinalSlot), this); u.mainGui.open(u.player); }); } @@ -47,14 +48,19 @@ private void setActions() { } @Override + public void open(Player player) { + this.refresh(); + super.open(player); + } + public void refresh() { // Reloads the features (with a blank one at the end) - features.loadFeatures(plugin.getConfig().getString("ProgressMap.MapHubAPIKey")); + features.loadFeatures(provider.constants().mapHubAPIKey()); // Refresh icons - this.clearGui(); + this.clear(); Inventory inventory = features.getGUI(); - this.getInventory().setContents(inventory.getContents()); + this.setItemsFromInventory(inventory); // Refresh actions setActions(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java index b3dc2065..9f97a0e2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java @@ -83,14 +83,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -108,7 +108,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), - u -> + (NetworkUser u) -> { @@ -138,7 +138,7 @@ private void createGui() { "owner."), Utils.line("Most recently in this region at " + Time.getDateTime(region.lastActive(uuid))), Utils.line("You will be demoted to region member.")), - u -> + (NetworkUser u) -> { @@ -178,7 +178,7 @@ private void createGui() { "region."), Utils.line("Most recently in this region at: ") .append(Component.text(Time.getDateTime(region.lastActive(uuid))))), - u -> + (NetworkUser u) -> { // Remove them from the region. @@ -210,7 +210,7 @@ private void createGui() { Utils.title("Return"), Utils.line("Return to the menu of region ") .append(Component.text(region.getTag(region.getOwner())))), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java index e6caf421..c270e5e4 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java @@ -2,12 +2,10 @@ import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.sql.RegionSQL; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionMember; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -17,7 +15,7 @@ import java.util.ArrayList; import java.util.List; -public class RegionMenu extends Gui { +public class RegionMenu extends NetworkRefreshableGui { private final NetworkUser user; @@ -25,7 +23,7 @@ public class RegionMenu extends Gui { private int page; - public RegionMenu(NetworkUser user) { + public RegionMenu(GuiProvider provider, NetworkUser user) { super(45, Component.text("Region Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); @@ -85,14 +83,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of regions.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -111,7 +109,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of regions.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java index fd47f4dc..30592047 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java @@ -60,14 +60,14 @@ private void createGui() { if (page > 1) { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), - Utils.line("Open the previous page of region requests.")), u -> + Utils.line("Open the previous page of region requests.")), (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -85,14 +85,14 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), - Utils.line("Open the next page of regions requests.")), u -> + Utils.line("Open the next page of regions requests.")), (NetworkUser u) -> { // Update the gui. page++; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); // Stop iterating. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index 0af0d4c9..6ac1ed39 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -49,7 +49,7 @@ private void createGui() { setItem(11, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Request"), Utils.line("The user will be able to build in this region.")), - u -> + (NetworkUser u) -> { @@ -86,7 +86,7 @@ private void createGui() { setItem(15, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Deny Request"), Utils.line("The user will not be able to build in this region.")), - u -> + (NetworkUser u) -> { @@ -123,7 +123,7 @@ private void createGui() { setItem(22, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Region"), Utils.line("Teleport to the location where the request was made.")), - u -> + (NetworkUser u) -> { @@ -163,7 +163,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the region request menu.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java index 382fcc85..e2f299a4 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java @@ -60,14 +60,14 @@ private void createGui() { if (page > 1) { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), - Utils.line("Open the previous page of region requests.")), u -> + Utils.line("Open the previous page of region requests.")), (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -85,14 +85,14 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), - Utils.line("Open the next page of regions requests.")), u -> + Utils.line("Open the next page of regions requests.")), (NetworkUser u) -> { // Update the gui. page++; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); // Stop iterating. @@ -141,7 +141,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), - Utils.line("Open the staff menu.")), u -> + Utils.line("Open the staff menu.")), (NetworkUser u) -> { @@ -157,7 +157,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), - Utils.line("Open the region menu.")), u -> + Utils.line("Open the region menu.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java index a50e1bf7..570a1f32 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java @@ -47,14 +47,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -67,7 +67,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), - u -> + (NetworkUser u) -> { @@ -92,7 +92,7 @@ private void createGui() { setItem(slot, Utils.createPlayerSkull(uuid, 1, Utils.title("Kick " + globalSQL.getString( "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from the region.")), - u -> + (NetworkUser u) -> { // Remove them from the region. @@ -124,7 +124,7 @@ private void createGui() { Utils.title("Return"), Utils.line("Return to manage region ") .append(Component.text(region.regionName(), NamedTextColor.GRAY))), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java index 3dc285d0..9bf1860c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java @@ -72,7 +72,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the staff menu.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java index f7457e62..ac6f0181 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java @@ -206,7 +206,7 @@ private void createGui() { setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the staff menu.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java index 40534ce9..aac5f0fe 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java @@ -169,7 +169,7 @@ private void createGui() { // Set reason setItem(2, Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Reason"), Utils.line("Click to write the reason in chat."), Utils.line("Your first chat message will be set as reason."), Utils.line("If you don't type anything within 1 minute"), - Utils.line("the action gets " + "cancelled.")), u -> + Utils.line("the action gets " + "cancelled.")), (NetworkUser u) -> { @@ -181,7 +181,7 @@ private void createGui() { }); // Return to select user menu. - setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the select user menu.")), u -> + setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the select user menu.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java index f90837bb..66711aa6 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java @@ -83,7 +83,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the staff menu.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java index 16551138..7b0d62e2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java @@ -72,14 +72,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of regions.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -98,7 +98,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of users.")), - u -> + (NetworkUser u) -> { @@ -127,7 +127,7 @@ private void createGui() { Utils.title(type.label + " " + name), Utils.line("Opens the " + type.label.toLowerCase(Locale.ROOT) + " menu to set" + " the parameters.")), - u -> + (NetworkUser u) -> { @@ -176,7 +176,7 @@ private void createGui() { setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the moderation menu.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index c590e911..761f1ba4 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -93,7 +93,7 @@ private void createGui() { setItem(3, Utils.createItem(Material.ANVIL, 1, Utils.title("Manage Region " + user.region.regionName()), Utils.line("Opens a menu to manage details of the region you are currently in.")), - u -> + (NetworkUser u) -> { @@ -242,7 +242,7 @@ private void createGui() { Utils.title("Verify Plot"), Utils.line("Click to verify a reviewed plot."), plotVerifyMessage), - u -> + (NetworkUser u) -> { @@ -287,7 +287,7 @@ private void createGui() { setItem(5, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Moderation Menu"), Utils.line("Opens the moderation menu to deal with wrongdoers.")), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java index c0364952..ac0c17aa 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java @@ -47,14 +47,14 @@ private void createGui() { setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), - u -> + (NetworkUser u) -> { // Update the gui. page--; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(this.getInventory().getContents()); + this.updatePlayerInventory(u.player); }); } @@ -67,7 +67,7 @@ private void createGui() { setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), - u -> + (NetworkUser u) -> { @@ -93,7 +93,7 @@ private void createGui() { Utils.title("Make " + globalSQL.getString( "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " the region owner."), Utils.line("The previous owner will be demoted to a member.")), - u -> + (NetworkUser u) -> { // Make the previous owner a member. @@ -129,7 +129,7 @@ private void createGui() { Utils.title("Return"), Utils.line("Return to manage region ") .append(Component.text(region.regionName(), NamedTextColor.GRAY))), - u -> + (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java index 1c6f4148..c267e44b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java @@ -1,6 +1,10 @@ package net.bteuk.network.gui.tutorials; +import lombok.extern.java.Log; +import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; @@ -9,9 +13,8 @@ import teachingtutorials.guis.EventType; import teachingtutorials.tutorialobjects.LessonObject; -import static net.bteuk.network.utils.Constants.LOGGER; - -public class LessonContinueConfirmer extends Gui { +@Log +public class LessonContinueConfirmer extends NetworkGui { /** * A reference to the instance of the Network plugin */ @@ -43,8 +46,8 @@ public class LessonContinueConfirmer extends Gui { * @param lessonToContinue The Lesson which is to be restarted or resumed * @param szMessage The message to display to the user */ - public LessonContinueConfirmer(Network plugin, NetworkUser user, Gui parentGui, LessonObject lessonToContinue, String szMessage) { - super(27, Utils.title("Resume or continue lesson?")); + public LessonContinueConfirmer(GuiProvider provider, Network plugin, NetworkUser user, Gui parentGui, LessonObject lessonToContinue, String szMessage) { + super(provider, 27, Utils.title("Resume or continue lesson?")); this.plugin = plugin; this.parentGui = parentGui; this.user = user; @@ -64,15 +67,13 @@ private void addItems() { // Restart lesson super.setItem(12 - 1, Utils.createItem(Material.BOOK, 1, - Utils.title("Restart the lesson")), new guiAction() { - @Override - public void click(NetworkUser u) { - // Switch to the tutorial. - if (Event.addEvent(EventType.RESTART_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), - plugin.getTutorialsDBConnection(), LOGGER)) - TutorialsGui.switchServer(user); - else - user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); + Utils.title("Restart the lesson")), (NetworkUser u) -> { + // Switch to the tutorial. + if (Event.addEvent(EventType.RESTART_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), + plugin.getTutorialsDBConnection(), log)) { + TutorialsGui.switchServer(user); + } else { + user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); } }); @@ -80,37 +81,23 @@ public void click(NetworkUser u) { ItemStack resumeCompulsory = Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Resume the lesson")); - super.setItem(16 - 1, resumeCompulsory, new guiAction() { - @Override - public void click(NetworkUser u) { + super.setItem(16 - 1, resumeCompulsory, (NetworkUser u) -> { // Switch to the tutorial. if (Event.addEvent(EventType.CONTINUE_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), - plugin.getTutorialsDBConnection(), LOGGER)) + plugin.getTutorialsDBConnection(), log)) { TutorialsGui.switchServer(user); - else + } else { user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); - } + } }); // Back button ItemStack back = Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back")); - super.setItem(26, back, new guiAction() { - @Override - public void click(NetworkUser u) { + super.setItem(26, back, (NetworkUser u) -> { user.mainGui = parentGui; - user.mainGui.open(user); + user.mainGui.open(user.player); delete(); - } }); } - - /** - * Refresh the gui. - * This usually involves clearing the content and recreating it. - */ - @Override - public void refresh() { - - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java index e6a413ec..d7117483 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java @@ -1,6 +1,8 @@ package net.bteuk.network.gui.tutorials; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -17,10 +19,9 @@ import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; - -public class RecommendationAddGui extends Gui { - private final Gui parentGui; +@Log +public class RecommendationAddGui extends NetworkRefreshableGui { + private final NetworkRefreshableGui parentGui; private final int iPlotID; @@ -37,7 +38,7 @@ public class RecommendationAddGui extends Gui { private final TextEditorBookListener reasonEditor; - private Tutorial[] allTutorials; + private final Tutorial[] allTutorials; /** * The number of pages in this menu @@ -49,8 +50,9 @@ public class RecommendationAddGui extends Gui { */ private int iPage; - public RecommendationAddGui(Gui parentGui, NetworkUser user, int iPlotID, UUID ownerUUID, net.bteuk.network.utils.TutorialRecommendation[] currentRecommendations) { - super(54, Utils.title("Tutorial Recommendation")); + public RecommendationAddGui(GuiProvider provider, NetworkRefreshableGui parentGui, NetworkUser user, int iPlotID, UUID ownerUUID, + net.bteuk.network.utils.TutorialRecommendation[] currentRecommendations) { + super(provider, 54, Utils.title("Tutorial Recommendation")); this.parentGui = parentGui; this.user = user; this.iPlotID = iPlotID; @@ -58,12 +60,12 @@ public RecommendationAddGui(Gui parentGui, NetworkUser user, int iPlotID, UUID o this.currentRecommendations = currentRecommendations; // Fetches all in use tutorials - allTutorials = Tutorial.fetchAll(true, false, null, Network.getInstance().getTutorialsDBConnection(), LOGGER); + allTutorials = Tutorial.fetchAll(true, false, null, provider.tutorialsDBConnection(), log); this.iPages = ((allTutorials.length - 1) / 45) + 1; this.iPage = 1; - reasonEditor = new TextEditorBookListener(Network.getInstance(), user, this, "Reason Editor", + reasonEditor = new TextEditorBookListener(provider.instance(), user, this, "Reason Editor", new BookCloseAction() { @Override public boolean runBookClose(BookMeta oldBookMeta, BookMeta newBookMeta, TextEditorBookListener textEditorBookListener, String szNewContent) { @@ -84,15 +86,15 @@ public boolean runBookClose(BookMeta oldBookMeta, BookMeta newBookMeta, TextEdit @Override public void runPostClose() { - open(user); + open(user.player); } } , ""); - addItems(); + createGui(); } - private void addItems() { + protected void createGui() { // Back button setItem(53, Utils.createItem(Material.BARRIER, 1, ChatUtils.title("Delete"), @@ -127,7 +129,7 @@ private void addItems() { if (bTutorialAlreadyRecommendedAndNotComplete) { user.player.sendMessage(ChatUtils.error("This tutorial is already recommended and has not been completed")); } else { - int iRecommendationID = TutorialRecommendation.addRecommendation(Network.getInstance().getTutorialsDBConnection(), LOGGER, + int iRecommendationID = TutorialRecommendation.addRecommendation(provider.tutorialsDBConnection(), log, ownerUUID, user.player.getUniqueId(), iTutorialID, -1, ((TextComponent) ((BookMeta) reasonEditor.getBook().getItemMeta()).page(1)).content()); @@ -164,13 +166,10 @@ private void addItems() { ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); - super.setItem(46, pageBack, new net.bteuk.network.gui.Gui.guiAction() { - @Override - public void click(NetworkUser u) { - iPage--; - refresh(); - open(user); - } + super.setItem(46, pageBack, (NetworkUser u) -> { + iPage--; + this.refresh(); + this.updatePlayerInventory(u.player); }); } @@ -179,13 +178,10 @@ public void click(NetworkUser u) { ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); - super.setItem(52, pageBack, new net.bteuk.network.gui.Gui.guiAction() { - @Override - public void click(NetworkUser u) { - iPage++; - refresh(); - open(user); - } + super.setItem(52, pageBack, (NetworkUser u) -> { + iPage++; + this.refresh(); + this.updatePlayerInventory(u.player); }); } @@ -207,21 +203,11 @@ public void click(NetworkUser u) { Utils.title(allTutorials[i].getTutorialName()), Utils.line("By " + Bukkit.getOfflinePlayer(allTutorials[i].getUUIDOfAuthor()).getName())); - super.setItem(i - iStart, tutorial, new guiAction() { - @Override - public void click(NetworkUser u) { - iTutorialID = allTutorials[finalI].getTutorialID(); - refresh(); - open(user); - } + super.setItem(i - iStart, tutorial, (NetworkUser u) -> { + iTutorialID = allTutorials[finalI].getTutorialID(); + this.refresh(); + this.updatePlayerInventory(u.player); }); } } - - @Override - public void refresh() { - clearGui(); - - addItems(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index b01bc3ac..755cbd0b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -1,9 +1,13 @@ package net.bteuk.network.gui.tutorials; +import lombok.extern.java.Log; +import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.TutorialRecommendation; import net.bteuk.network.utils.Utils; import org.bukkit.Material; @@ -17,9 +21,8 @@ import java.util.UUID; -import static net.bteuk.network.utils.Constants.LOGGER; - -public class RecommendedTutorialsGui extends Gui { +@Log +public class RecommendedTutorialsGui extends NetworkRefreshableGui { private final Gui parentGui; private final int iPlotID; @@ -42,74 +45,59 @@ public class RecommendedTutorialsGui extends Gui { */ private int iPage; - public RecommendedTutorialsGui(Gui parentGui, int iPlotID, NetworkUser user, String plotOwner, boolean bStaffView) { - super(54, Utils.title("Recommended Tutorials")); + public RecommendedTutorialsGui(GuiProvider provider, Gui parentGui, int iPlotID, NetworkUser user, String plotOwner, boolean bStaffView) { + super(provider, 54, Utils.title("Recommended Tutorials")); this.parentGui = parentGui; this.iPlotID = iPlotID; this.user = user; - if (plotOwner != null) - this.ownerUUID = UUID.fromString(plotOwner); - else - this.ownerUUID = null; + if (plotOwner != null) this.ownerUUID = UUID.fromString(plotOwner); + else this.ownerUUID = null; this.bStaffView = bStaffView; // Fetches the tutorial recommendations for this plot - tutorialRecommendations = Network.getInstance().getPlotSQL().fetchTutorialRecommendationsForPlot(LOGGER, iPlotID); + tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(iPlotID); this.iPages = ((tutorialRecommendations.length - 1) / 45) + 1; this.iPage = 1; - addItems(); + createGui(); } - private void addItems() { + protected void createGui() { // Back button - setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, - ChatUtils.title("Return")), + setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, ChatUtils.title("Return")), (NetworkUser u) -> { // Go back to the review gui. u.player.closeInventory(); parentGui.open(u.player); - } - ); + }); // Indicates that there are no unfinished lessons if (tutorialRecommendations.length == 0) { - ItemStack noRecommendations = Utils.createItem(Material.BARRIER, 1, - Utils.title("There are no tutorial recommendations")); + ItemStack noRecommendations = Utils.createItem(Material.BARRIER, 1, Utils.title("There are no tutorial recommendations")); setItem(5 - 1, noRecommendations); } // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); - super.setItem(47, pageBack, new guiAction() { - @Override - public void click(NetworkUser u) { - iPage--; - refresh(); - user.mainGui = RecommendedTutorialsGui.this; - user.mainGui.open(user); - } + setItem(47, pageBack, (NetworkUser u) -> { + iPage--; + refresh(); + updatePlayerInventory(u.player); }); } // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); - super.setItem(51, pageBack, new guiAction() { - @Override - public void click(NetworkUser u) { - iPage++; - refresh(); - user.mainGui = RecommendedTutorialsGui.this; - user.mainGui.open(user); - } + super.setItem(51, pageBack, (NetworkUser u) -> { + iPage++; + refresh(); + updatePlayerInventory(u.player); }); } @@ -123,38 +111,26 @@ public void click(NetworkUser u) { // Display different icons depending on whether it is completed or not if (tutorialRecommendation.isCompleted()) { - if (bStaffView) - recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title(tutorialRecommendation.getTutorialName(Network.getInstance().getTutorialsDBConnection(), LOGGER)), - Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), - Utils.line("Completed")); - else - recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title(tutorialRecommendation.getTutorialName(Network.getInstance().getTutorialsDBConnection(), LOGGER)), - Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), - Utils.line("Completed"), - Utils.line("Click to start tutorial again")); + if (bStaffView) recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, + Utils.title(tutorialRecommendation.getTutorialName(provider.tutorialsDBConnection(), log)), + Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), Utils.line("Completed")); + else recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, + Utils.title(tutorialRecommendation.getTutorialName(provider.tutorialsDBConnection(), log)), + Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), Utils.line("Completed"), Utils.line("Click to start tutorial again")); } else { - if (bStaffView) - recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, - Utils.title(tutorialRecommendation.getTutorialName(Network.getInstance().getTutorialsDBConnection(), LOGGER)), - Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName())); - else - recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, - Utils.title(tutorialRecommendation.getTutorialName(Network.getInstance().getTutorialsDBConnection(), LOGGER)), - Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), - Utils.line("Click to start tutorial")); + if (bStaffView) recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, + Utils.title(tutorialRecommendation.getTutorialName(provider.tutorialsDBConnection(), log)), + Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName())); + else recommendationIcon = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, + Utils.title(tutorialRecommendation.getTutorialName(provider.tutorialsDBConnection(), log)), + Utils.line("Recommended by " + tutorialRecommendation.getRecommenderName()), Utils.line("Click to start tutorial")); } - super.setItem(i - iStart, recommendationIcon, new guiAction() { - @Override - public void click(NetworkUser u) { - if (!bStaffView && ownerUUID != null) { - DBConnection dbConnection = Network.getInstance().getTutorialsDBConnection(); - startTutorial(Network.getInstance(), LessonObject.getUnfinishedLessonsOfPlayer(ownerUUID, dbConnection, LOGGER), - user, RecommendedTutorialsGui.this, Tutorial.fetchByTutorialID(tutorialRecommendation.getTutorialID(), dbConnection, LOGGER), - null); - } + super.setItem(i - iStart, recommendationIcon, (NetworkUser u) -> { + if (!bStaffView && ownerUUID != null) { + DBConnection dbConnection = provider.tutorialsDBConnection(); + startTutorial(provider.instance(), LessonObject.getUnfinishedLessonsOfPlayer(ownerUUID, dbConnection, log), user, RecommendedTutorialsGui.this, + Tutorial.fetchByTutorialID(tutorialRecommendation.getTutorialID(), dbConnection, log), null); } }); } @@ -166,37 +142,31 @@ public void click(NetworkUser u) { int iLocationOfAdd = iOrder - iStart; - super.setItem(iLocationOfAdd, - Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title("Add Recommendation"), - Utils.line("Click to recommend a tutorial")), - new guiAction() { - @Override - public void click(NetworkUser u) { - // Opens the new recommendation menu - RecommendationAddGui add = new RecommendationAddGui(RecommendedTutorialsGui.this, user, iPlotID, ownerUUID, tutorialRecommendations); - add.open(user); - } + super.setItem(iLocationOfAdd, Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Add Recommendation"), Utils.line("Click to recommend a tutorial")), + (NetworkUser u) -> { + // Opens the new recommendation menu + RecommendationAddGui add = new RecommendationAddGui(provider, this, user, iPlotID, ownerUUID, tutorialRecommendations); + add.open(user.player); }); } } - public static void startTutorial(Network plugin, LessonObject[] lessons, NetworkUser user, Gui parentGui, Tutorial tutorialToStart, Location locationToStart) { + public void startTutorial(Network plugin, LessonObject[] lessons, NetworkUser user, Gui parentGui, Tutorial tutorialToStart, Location locationToStart) { boolean bLessonFound = false; for (LessonObject lesson : lessons) { if (tutorialToStart.getTutorialID() == lesson.getTutorialID()) { if (locationToStart == null) { bLessonFound = true; - LessonContinueConfirmer confirmer = new LessonContinueConfirmer(plugin, user, parentGui, lesson, "You have a lesson for this tutorial already"); - confirmer.open(user); + LessonContinueConfirmer confirmer = new LessonContinueConfirmer(provider, plugin, user, parentGui, lesson, "You have a lesson for this tutorial already"); + confirmer.open(user.player); break; } if (locationToStart.getLocationID() == lesson.getLocation().getLocationID()) { bLessonFound = true; - LessonContinueConfirmer confirmer = new LessonContinueConfirmer(plugin, user, parentGui, lesson, "You have a lesson at this location already"); - confirmer.open(user); + LessonContinueConfirmer confirmer = new LessonContinueConfirmer(provider, plugin, user, parentGui, lesson, "You have a lesson at this location already"); + confirmer.open(user.player); break; } } @@ -204,16 +174,14 @@ public static void startTutorial(Network plugin, LessonObject[] lessons, Network if (!bLessonFound) { if (locationToStart == null) { - if (Event.addEvent( - EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), Network.getInstance().getTutorialsDBConnection(), Constants.LOGGER)) { - SwitchServer.switchServer(user.player, Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); + if (Event.addEvent(EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), provider.tutorialsDBConnection(), log)) { + provider.serverAPI().switchServer(PlayerAdapter.adapt(user.player), provider.globalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); user.player.closeInventory(); } else { user.sendMessage(Utils.error("A problem occurred, please let staff know")); } - } else if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), Network.getInstance().getTutorialsDBConnection(), - Constants.LOGGER)) { - SwitchServer.switchServer(user.player, Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); + } else if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), provider.tutorialsDBConnection(), log)) { + provider.serverAPI().switchServer(PlayerAdapter.adapt(user.player), provider.globalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); user.player.closeInventory(); } else { user.sendMessage(Utils.error("A problem occurred, please let staff know")); @@ -224,14 +192,14 @@ public static void startTutorial(Network plugin, LessonObject[] lessons, Network @Override public void refresh() { - clearGui(); + clear(); // Fetches the tutorial recommendations for this plot - tutorialRecommendations = Network.getInstance().getPlotSQL().fetchTutorialRecommendationsForPlot(LOGGER, iPlotID); + tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(iPlotID); this.iPages = ((tutorialRecommendations.length - 1) / 45) + 1; this.iPage = 1; - addItems(); + createGui(); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java index 0650a778..e44b9cb8 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java @@ -306,7 +306,7 @@ private void loadLocationMarker(String name, int coordinate_id) { } // Create the click action. - HologramClickAction clickAction = u -> teleportToLocation(u, name); + HologramClickAction clickAction = (NetworkUser u) -> teleportToLocation(u, name); holograms.put(hologram, clickAction); } @@ -331,7 +331,7 @@ private void loadSubcategoryMarker(int subcategory_id, int coordinate_id) { } // Create the click action. - HologramClickAction clickAction = u -> Bukkit.getScheduler().runTask(instance, () -> openSubcategoryMenu(u, + HologramClickAction clickAction = (NetworkUser u) -> Bukkit.getScheduler().runTask(instance, () -> openSubcategoryMenu(u, subcategory)); holograms.put(hologram, clickAction); } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index 1f1f17d1..c54dea51 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -1,5 +1,6 @@ package net.bteuk.network.sql; +import lombok.extern.java.Log; import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.enums.PlotDifficulties; import net.bteuk.network.lib.utils.Reviewing; @@ -14,11 +15,10 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import static net.buildtheearth.terraminusminus.TerraMinusMinus.LOGGER; +@Log public class PlotSQL extends AbstractSQL { public PlotSQL(DataSource datasource) { @@ -425,11 +425,10 @@ public boolean saveBook(int id, int page, String contents) { /** * Fetches a list of tutorial recommendations for a given plot * - * @param logger A logger to output to * @param iPlotID The ID of the plot to fetch the recommended tutorials of * @return A list of tutorial recommendations */ - public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(Logger logger, int iPlotID) { + public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(int iPlotID) { // SQL objects String sql; ResultSet resultSet; @@ -453,7 +452,7 @@ public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(Logger logge recommendations[i] = new TutorialRecommendation(resultSet.getInt("recommendation_id"), iPlotID); } } catch (SQLException e) { - logger.log(Level.WARNING, "Error fetching tutorial recommendations for plot " + iPlotID, e); + log.warning("Error fetching tutorial recommendations for plot " + iPlotID + ": " + e.getLocalizedMessage()); return new TutorialRecommendation[0]; } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java index 3f9544ba..3e910a32 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java @@ -76,12 +76,12 @@ public void setItems() { // Light is on. setItem(i + j * 9, Utils.createItem(Material.SEA_LANTERN, 1, Component.empty()), - u -> invertLights(finalI, finalJ)); + (NetworkUser u) -> invertLights(finalI, finalJ)); } else { // Light is off. setItem(i + j * 9, Utils.createItem(Material.REDSTONE_LAMP, 1, Component.empty()), - u -> invertLights(finalI, finalJ)); + (NetworkUser u) -> invertLights(finalI, finalJ)); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index ec95def5..401e640b 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -177,10 +177,16 @@ public net.bteuk.network.core.Constants getConstants() { int tipsFrequency = config.getInt("chat.tips.frequency"); + boolean regionStaffRequestAlways = config.getBoolean("region.staff_request.always"); + int regionStaffRequestRadius = config.getInt("region.staff_request.radius", 0); + + int progressMapID = config.getInt("ProgressMap.ProgressMapID"); + String mapHubAPIKey = config.getString("ProgressMap.MapHubAPIKey"); + log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, - chatSocketOutputPort, chatSocketInputPort, tipsFrequency); + chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index b897dfae..4c819c47 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -8,7 +8,6 @@ import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; -import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.dto.FocusEvent; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserDisconnect; @@ -35,7 +34,7 @@ public class NetworkUser { private final Constants constants; // Main gui, includes everything that is part of the navigator. - public NetworkRefreshableGui mainGui; + public Gui mainGui; // Lights out, a gui game. public LightsOut lightsOut; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java index d30a8dd1..2a67d9dc 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java @@ -1,5 +1,7 @@ package net.bteuk.network.utils.texteditorbooks; +import lombok.Getter; +import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -27,98 +29,92 @@ /** * A type of listener which handles text edits made through books */ -public class TextEditorBookListener implements Listener -{ - /** A reference to the instance of the plugin */ +public class TextEditorBookListener implements Listener { + /** + * A reference to the instance of the plugin + */ private final JavaPlugin plugin; - /** A reference to the interface object which defines the intended behaviour on book close */ + /** + * A reference to the interface object which defines the intended behaviour on book close + */ private final BookCloseAction bookCloseAction; - /** A reference to the User */ + /** + * A reference to the User + */ private final NetworkUser user; - /** A reference to parent GUI */ + /** + * A reference to parent GUI + */ private final Gui parentGUI; - /** The book item stack */ + /** + * The book item stack + */ + @Getter private final ItemStack book; /** * Constructs the object, gets the book ready - * @param plugin A reference to the instance of the plugin - * @param user A reference to the User - * @param szBookTitle The intended title for the book + * + * @param plugin A reference to the instance of the plugin + * @param user A reference to the User + * @param szBookTitle The intended title for the book * @param bookCloseAction The action to perform on book close */ - public TextEditorBookListener(JavaPlugin plugin, NetworkUser user, Gui parentGUI, String szBookTitle, BookCloseAction bookCloseAction, String... initialValue) - { + public TextEditorBookListener(JavaPlugin plugin, NetworkUser user, Gui parentGUI, String szBookTitle, BookCloseAction bookCloseAction, String... initialValue) { this.plugin = plugin; this.bookCloseAction = bookCloseAction; this.user = user; this.parentGUI = parentGUI; - //Creates the book + // Creates the book this.book = new ItemStack(Material.WRITABLE_BOOK, 1); - //Extracts a reference to the book meta, and sets the title and initial value + // Extracts a reference to the book meta, and sets the title and initial value BookMeta bookMeta = (BookMeta) this.book.getItemMeta(); bookMeta.setTitle(szBookTitle); bookMeta.displayName(Component.text(szBookTitle).decoration(TextDecoration.ITALIC, false)); - if (initialValue.length > 0) - { + if (initialValue.length > 0) { bookMeta.addPages(Component.text(initialValue[0])); } - //Adds the meta of the book back in + // Adds the meta of the book back in this.book.setItemMeta(bookMeta); } - /** - * Returns a reference to the book - * @return An ItemStack of 1 book - */ - public ItemStack getBook() - { - return book; - } - /** * Gives the player the book, closes the current inventory and registers the listeners with the server's event listeners */ - public void startEdit(String szBookName) - { - //Gives the player the book item + public void startEdit(String szBookName) { + // Gives the player the book item - //Closes the current inventory + // Closes the current inventory user.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); boolean bPlayerHasItem = false; - for (int i = 0 ; i < 9 ; i++) - { - if (user.player.getInventory().getItem(i) != null) - if (user.player.getInventory().getItem(i).equals(this.book)) - { - bPlayerHasItem = true; - user.player.getInventory().setHeldItemSlot(i); - } + for (int i = 0; i < 9; i++) { + if (user.player.getInventory().getItem(i) != null) if (user.player.getInventory().getItem(i).equals(this.book)) { + bPlayerHasItem = true; + user.player.getInventory().setHeldItemSlot(i); + } } - if (!bPlayerHasItem) - Utils.giveItem(user.player, this.book, szBookName); + if (!bPlayerHasItem) Utils.giveItem(user.player, this.book, szBookName); - //Registers the book close listener + // Registers the book close listener Bukkit.getServer().getPluginManager().registerEvents(this, plugin); } /** * Unregisters the listeners with the server's event listeners */ - public void unregister() - { + public void unregister() { HandlerList.unregisterAll(this); plugin.getLogger().log(Level.INFO, "Unregistering book listener"); } @@ -127,40 +123,35 @@ public void unregister() * Detects when a player closes a book after editing it, checks whether it is the relevant player and relevant book, * then detects the changes and stores the information in the book. *

Will then run the custom book close logic inserted into this listener at construction

- * @param event + * + * @param event PlayerEditBookEvent */ @EventHandler - public void BookCloseEvent(PlayerEditBookEvent event) - { - //Check the player - if (!event.getPlayer().equals(user.player)) - return; + public void BookCloseEvent(PlayerEditBookEvent event) { + // Check the player + if (!event.getPlayer().equals(user.player)) return; - //Check the book display name - if (!event.getPlayer().getInventory().getItemInMainHand().equals(this.book)) - { + // Check the book display name + if (!event.getPlayer().getInventory().getItemInMainHand().equals(this.book)) { return; } - //Extracts the new content from the book + // Extracts the new content from the book String szNewContent = ""; List pages = event.getNewBookMeta().pages(); - if (!pages.isEmpty()) - { - for (Component page: pages) - { + if (!pages.isEmpty()) { + for (Component page : pages) { szNewContent = szNewContent + ((TextComponent) page).content() + " "; } // Removes the end space, the space after the last page is added in the loop but then needs to be removed szNewContent = szNewContent.substring(0, szNewContent.length() - 1); } - //Performs the predefined instructions upon book close + // Performs the predefined instructions upon book close boolean bSaveAnswers = bookCloseAction.runBookClose(event.getPreviousBookMeta(), event.getNewBookMeta(), this, szNewContent); - if (bSaveAnswers) - { - //Saves the instructions in the book + if (bSaveAnswers) { + // Saves the instructions in the book BookMeta bookMeta = (BookMeta) getBook().getItemMeta(); bookMeta.pages(event.getNewBookMeta().pages()); getBook().setItemMeta(bookMeta); @@ -170,60 +161,44 @@ public void BookCloseEvent(PlayerEditBookEvent event) } @EventHandler - public void bookDestroyed(ItemDespawnEvent event) - { - if (event.getEntity().getItemStack().equals(this.book)) - { + public void bookDestroyed(ItemDespawnEvent event) { + if (event.getEntity().getItemStack().equals(this.book)) { plugin.getLogger().log(Level.INFO, "Book destroyed"); unregister(); } } @EventHandler - public void bookTouched(InventoryClickEvent event) - { - if (event.getCurrentItem() != null) - if (event.getCurrentItem().equals(this.book)) - { - plugin.getLogger().log(Level.INFO, "Book touched, cancelling"); - event.setCancelled(true); - - //Closing the inv will cancel the copying/dragging process. We then want to reopen. - user.player.closeInventory(); - Bukkit.getScheduler().runTaskLater(plugin, new Runnable() { - @Override - public void run() { - parentGUI.open(user); - } - }, 1); - } + public void bookTouched(InventoryClickEvent event) { + if (event.getCurrentItem() != null) if (event.getCurrentItem().equals(this.book)) { + plugin.getLogger().log(Level.INFO, "Book touched, cancelling"); + event.setCancelled(true); + + // Closing the inv will cancel the copying/dragging process. We then want to reopen. + user.player.closeInventory(); + Bukkit.getScheduler().runTaskLater(plugin, () -> parentGUI.open(user.player), 1); + } } @EventHandler - public void bookDragged(InventoryDragEvent event) - { - if (event.getOldCursor().equals(this.book)) - { + public void bookDragged(InventoryDragEvent event) { + if (event.getOldCursor().equals(this.book)) { plugin.getLogger().log(Level.INFO, "Book dragged, cancelling"); event.setCancelled(true); } } @EventHandler - public void bookMoved(InventoryMoveItemEvent event) - { - if (event.getItem().equals(this.book)) - { + public void bookMoved(InventoryMoveItemEvent event) { + if (event.getItem().equals(this.book)) { plugin.getLogger().log(Level.INFO, "Book moved, cancelling"); event.setCancelled(true); } } @EventHandler - public void bookDropped(PlayerDropItemEvent event) - { - if (event.getItemDrop().getItemStack().equals(this.book)) - { + public void bookDropped(PlayerDropItemEvent event) { + if (event.getItemDrop().getItemStack().equals(this.book)) { plugin.getLogger().log(Level.INFO, "Book dropped, cancelling"); event.setCancelled(true); } diff --git a/pom.xml b/pom.xml index f0891e06..d678e6c4 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 1.21.8-R0.1-SNAPSHOT - 764f5c1ece + 5958727df9 From a250872852f0def5ec19bdc990b7dafdb9e5ccd3 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Thu, 28 Aug 2025 22:26:52 +0200 Subject: [PATCH 14/96] Migrated all region and staff gui's. --- .../net/bteuk/network/commands/staff/Ban.java | 30 +- .../bteuk/network/commands/staff/Kick.java | 14 +- .../bteuk/network/commands/staff/Mute.java | 28 +- .../bteuk/network/commands/staff/Unban.java | 25 +- .../bteuk/network/commands/staff/Unmute.java | 25 +- .../listeners/regions/RegionTagListener.java | 22 +- .../java/net/bteuk/network/gui/BuildGui.java | 8 +- .../net/bteuk/network/gui/GuiProvider.java | 4 +- .../network/gui/navigation/AddLocation.java | 90 ++-- .../gui/navigation/SelectSubcategory.java | 74 ++- .../bteuk/network/gui/regions/RegionInfo.java | 279 +++++------ .../network/gui/regions/RegionMembers.java | 212 ++++---- .../bteuk/network/gui/regions/RegionMenu.java | 117 ++--- .../gui/regions/RegionRequestMenu.java | 30 +- .../gui/regions/ReviewRegionRequest.java | 217 ++++----- .../gui/regions/ReviewRegionRequests.java | 84 ++-- .../bteuk/network/gui/staff/KickMembers.java | 104 ++-- .../network/gui/staff/LocationRequests.java | 93 ++-- .../bteuk/network/gui/staff/ManageRegion.java | 201 +++----- .../gui/staff/ModerationActionGui.java | 97 ++-- .../network/gui/staff/ModerationGui.java | 119 ++--- .../bteuk/network/gui/staff/SelectUser.java | 138 ++---- .../net/bteuk/network/gui/staff/StaffGui.java | 460 ++++++++---------- .../network/gui/staff/TransferOwner.java | 110 ++--- .../bteuk/network/utils/staff/Moderation.java | 102 ++++ 25 files changed, 1133 insertions(+), 1550 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java index 0d5b90e2..2a2b4bef 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Ban.java @@ -6,11 +6,8 @@ import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; -import net.bteuk.network.exceptions.NotBannedException; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.staff.Moderation; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -70,32 +67,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Combine all remaining args to create a reason. String reason = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); - sender.sendMessage(banPlayer(name, uuid, end_time, reason)); - } - - /** - * Ban the player and return the feedback so the executor can be notified of success/failure. - * - * @param name Name of the player to ban. - * @param uuid Uuid of the player to ban. - * @param end_time Time for the ban to end in milliseconds. - * @param reason Reason for banning the player. - * @return The Component to display to the executor. - */ - public Component banPlayer(String name, String uuid, long end_time, String reason) { - - try { - moderation.ban(uuid, end_time, reason); - } catch (NotBannedException e) { - return ChatUtils.error("An error occurred while banning this player, please contact an admin for support."); - } - - return ChatUtils.success("Banned ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" until ")) - .append(Component.text(Time.getDateTime(end_time), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" for reason: ")) - .append(Component.text(reason, NamedTextColor.DARK_AQUA)); + sender.sendMessage(moderation.banPlayer(name, uuid, end_time, reason)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java index b0c332dc..1b29264c 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Kick.java @@ -54,7 +54,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); - // Check if player is online. + // Check if the player is online. if (!instance.isOnlineOnNetwork(uuid)) { sender.sendMessage(Component.text(name, NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not online."))); @@ -64,17 +64,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Combine all remaining args to create a reason. String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); - sender.sendMessage(kickPlayer(name, uuid, reason)); - } - - public Component kickPlayer(String name, String uuid, String reason) { - - moderation.kick(uuid, reason); - - return (ChatUtils.success("Kicked ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" for reason: ")) - .append(Component.text(reason, NamedTextColor.DARK_AQUA))); + sender.sendMessage(moderation.kickPlayer(name, uuid, reason)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java index bb4c928d..499f7a89 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Mute.java @@ -6,7 +6,6 @@ import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; -import net.bteuk.network.exceptions.NotMutedException; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; @@ -72,32 +71,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Combine all remaining args to create a reason. String reason = String.join(" ", Arrays.copyOfRange(args, 2, args.length)); - sender.sendMessage(mutePlayer(name, uuid, end_time, reason)); - } - - /** - * Mute the player and return the feedback so the executor can be notified of success/failure. - * - * @param name Name of the player to mute. - * @param uuid Uuid of the player to mute. - * @param end_time Time for the mute to end in milliseconds. - * @param reason Reason for muting the player. - * @return The Component to display to the executor. - */ - public Component mutePlayer(String name, String uuid, long end_time, String reason) { - - try { - moderation.mute(uuid, end_time, reason); - } catch (NotMutedException e) { - return ChatUtils.error("An error occurred while muting this player, please contact an admin for support."); - } - - return ChatUtils.success("Muted ") - .append(Component.text(name, NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" until ")) - .append(Component.text(Time.getDateTime(end_time), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" for reason: ")) - .append(Component.text(reason, NamedTextColor.DARK_AQUA)); + sender.sendMessage(moderation.mutePlayer(name, uuid, end_time, reason)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java index ea2dca20..30819d7e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unban.java @@ -50,30 +50,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); - sender.sendMessage(unbanPlayer(name, uuid)); - } - - /** - * Unban the player and return the feedback so the executor can be notified of success/failure. - * - * @param name Name of the banned player. - * @param uuid Uuid of the banned player. - * @return The Component to display to the executor. - */ - public Component unbanPlayer(String name, String uuid) { - - // Check if the player is currently banned. - if (moderation.isBanned(uuid)) { - - // Unban the player. - moderation.unban(uuid); - - // Send feedback. - return (ChatUtils.success("Unbanned ") - .append(Component.text(name, NamedTextColor.DARK_AQUA))); - } else { - return (ChatUtils.error(name + " is not currently banned.")); - } + sender.sendMessage(moderation.unbanPlayer(name, uuid)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java index f1b7efed..675fbdd9 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Unmute.java @@ -49,30 +49,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) String uuid = globalSQL.getString("SELECT uuid FROM player_data WHERE name='" + args[0] + "';"); String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); - sender.sendMessage(unmutePlayer(name, uuid)); - } - - /** - * Unmute the player and return the feedback so the executor can be notified of success/failure. - * - * @param name Name of the muted player. - * @param uuid Uuid of the muted player. - * @return The Component to display to the executor. - */ - public Component unmutePlayer(String name, String uuid) { - - // Check if the player is currently muted. - if (moderation.isMuted(uuid)) { - - // Unban the player. - moderation.unmute(uuid); - - // Send feedback. - return (ChatUtils.success("Unmuted ") - .append(Component.text(name, NamedTextColor.DARK_AQUA))); - } else { - return (ChatUtils.error(name + " is not currently muted.")); - } + sender.sendMessage(moderation.unmutePlayer(name, uuid)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java index 0e833148..59ca89fc 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/regions/RegionTagListener.java @@ -2,10 +2,12 @@ import io.papermc.paper.event.player.AsyncChatEvent; import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.regions.RegionInfo; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; @@ -23,16 +25,22 @@ public class RegionTagListener implements Listener { private final Region region; private final BukkitTask task; + private final RegionManager regionManager; + private final Network instance; + private final GuiProvider provider; - public RegionTagListener(Player p, Region region) { + public RegionTagListener(GuiProvider provider, Player p, Region region) { + this.provider = provider; + this.instance = provider.instance(); + this.regionManager = provider.regionManager(); this.p = p; this.region = region; - Bukkit.getServer().getPluginManager().registerEvents(this, Network.getInstance()); + Bukkit.getServer().getPluginManager().registerEvents(this, instance); // Start timer to automatically close the listener. - task = Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { + task = Bukkit.getScheduler().runTaskLater(instance, () -> { // Send message to player telling them it's been timer out. if (p != null) { p.sendMessage(ChatUtils.error("'Set Region Tag' cancelled.")); @@ -55,7 +63,7 @@ public void ChatEvent(AsyncChatEvent e) { } else { // Set region tag. - region.setTag(p.getUniqueId().toString(), + regionManager.setTag(region, p.getUniqueId().toString(), PlainTextComponentSerializer.plainText().serialize(e.message())); // Send message to player. @@ -69,9 +77,9 @@ public void ChatEvent(AsyncChatEvent e) { unregister(); // Reset the regionInfo gui - NetworkUser u = Network.getInstance().getUser(p); + NetworkUser u = instance.getUser(p); Objects.requireNonNull(u).mainGui.delete(); - u.mainGui = new RegionInfo(region, p.getUniqueId().toString()); + u.mainGui = new RegionInfo(provider, region, p.getUniqueId().toString()); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 6814e114..afdc955c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -158,7 +158,7 @@ protected void createGui() { // Delete this gui. this.delete(); - // Switch to plot menu. + // Switch to the zone menu. u.mainGui = new ZoneMenu(provider, u); u.mainGui.open(u.player); } else { @@ -222,7 +222,7 @@ protected void createGui() { this.delete(); // Switch to region info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); u.mainGui.open(u.player); }); } else if (regionManager.isMember(region, user.player.getUniqueId().toString())) { @@ -234,7 +234,7 @@ protected void createGui() { this.delete(); // Switch to plot info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); u.mainGui.open(u.player); }); } else if (regionManager.hasRequest(region, user.getUuid())) { @@ -251,7 +251,7 @@ protected void createGui() { }); } else if (user.player.hasPermission("uknet.regions.join")) { - // Check if region is claimable. + // Check if the region is claimable. if (regionManager.isClaimable(region)) { // If the region has an owner. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java index ec7455c4..7d584e51 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java @@ -2,6 +2,7 @@ import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; +import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.ServerAPI; @@ -15,6 +16,7 @@ import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Roles; +import net.bteuk.network.utils.staff.Moderation; import teachingtutorials.utils.DBConnection; /** @@ -22,5 +24,5 @@ */ public record GuiProvider(Network instance, GuiManager manager, Constants constants, GlobalSQL globalSQL, RegionSQL regionSQL, RegionManager regionManager, PlotSQL plotSQL, PlotAPI plotAPI, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision, Navigator navigator, Roles roles, - DBConnection tutorialsDBConnection) { + DBConnection tutorialsDBConnection, ChatAPI chatAPI, Moderation moderation) { } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index 68fd0e1d..4fc3c6a0 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -2,13 +2,14 @@ import lombok.Getter; import lombok.Setter; -import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import net.bteuk.network.eventing.listeners.navigation.LocationNameListener; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.staff.LocationRequests; import net.bteuk.network.gui.staff.StaffGui; import net.bteuk.network.lib.dto.ChatMessage; @@ -30,9 +31,7 @@ import static net.bteuk.network.lib.enums.ChatChannels.REVIEWER; -public class AddLocation extends Gui { - - private final Network instance; +public class AddLocation extends NetworkRefreshableGui { @Getter private final AddLocationType type; @@ -52,26 +51,21 @@ public class AddLocation extends Gui { private LocationNameListener locationNameListener; private GlobalSQL globalSQL; - public AddLocation(Network instance, AddLocationType type, Constants constants, Back back, EventAPI eventAPI, ServerAPI serverAPI) { - super(27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); + public AddLocation(GuiProvider provider, AddLocationType type) { + super(provider, 27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); - this.instance = instance; this.type = type; - this.constants = constants; - this.back = back; - this.eventAPI = eventAPI; - this.serverAPI = serverAPI; - - createGui(); + this.constants = provider.constants(); + this.back = provider.back(); + this.eventAPI = provider.eventAPI(); + this.serverAPI = provider.serverAPI(); } // This is used when location details need to be updated. - public AddLocation(Network instance, AddLocationType type, String name, int coordinate_id, Category category, String subcategory) { - super(27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); + public AddLocation(GuiProvider provider, AddLocationType type, String name, int coordinate_id, Category category, String subcategory) { + super(provider, 27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); - this.instance = instance; - - // Set name. + // Set the name. this.old_name = name; this.name = name; @@ -86,11 +80,13 @@ public AddLocation(Network instance, AddLocationType type, String name, int coor } this.type = type; - - createGui(); + this.constants = provider.constants(); + this.back = provider.back(); + this.eventAPI = provider.eventAPI(); + this.serverAPI = provider.serverAPI(); } - private void createGui() { + protected void createGui() { // Set/edit name. if (name != null) { setItem(11, Utils.createItem(Material.SPRUCE_SIGN, 1, Utils.title("Update Location Name"), Utils.line("Edit the location name."), @@ -157,7 +153,7 @@ private void createGui() { (NetworkUser u) -> { // Open select county menu. - selectSubcategory = new SelectSubcategory(instance, this); + selectSubcategory = new SelectSubcategory(provider, this); selectSubcategory.open(u.player); }); @@ -203,11 +199,11 @@ private void createGui() { String worldName = u.player.getLocation().getWorld().getName(); // If location exists. - if (instance.getPlotAPI().hasLocation(worldName)) { + if (provider.plotAPI().hasLocation(worldName)) { // Add coordinate transformation. - l = new Location(l.getWorld(), l.getX() - instance.getPlotAPI().getXTransform(worldName), l.getY(), - l.getZ() - instance.getPlotAPI().getZTransform(worldName), l.getYaw(), l.getPitch()); + l = new Location(l.getWorld(), l.getX() - provider.plotAPI().getXTransform(worldName), l.getY(), l.getZ() - provider.plotAPI().getZTransform(worldName), + l.getYaw(), l.getPitch()); } } @@ -250,20 +246,19 @@ private void createGui() { Location l = u.player.getLocation(); - // If server is plotsystem add the necessary coordinate transformation. - if (SERVER_TYPE == ServerType.PLOT) { + // If the server is the plot system, add the necessary coordinate transformation. + if (constants.serverType() == ServerType.PLOT) { String worldName = u.player.getLocation().getWorld().getName(); // If location exists. - if (Network.getInstance().getPlotSQL().hasRow("SELECT name FROM location_data WHERE " + "name='" + worldName + "';")) { + if (provider.plotSQL().hasRow("SELECT name FROM location_data WHERE " + "name='" + worldName + "';")) { // Add coordinate transformation. l = new Location(l.getWorld(), - l.getX() - Network.getInstance().getPlotSQL().getInt("SELECT xTransform " + "FROM location_data WHERE name='" + worldName + "';"), - l.getY(), - l.getZ() - Network.getInstance().getPlotSQL().getInt("SELECT zTransform " + "FROM location_data WHERE name='" + worldName + "';"), - l.getYaw(), l.getPitch()); + l.getX() - provider.plotSQL().getInt("SELECT xTransform " + "FROM location_data WHERE name='" + worldName + "';"), l.getY(), + l.getZ() - provider.plotSQL().getInt("SELECT zTransform " + "FROM location_data WHERE name='" + worldName + "';"), l.getYaw(), + l.getPitch()); } } @@ -303,21 +298,20 @@ private void createGui() { }); } else if (type == AddLocationType.REVIEW) { - // Accept request. + // Accept the request. setItem(3, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Location Request"), Utils.line("Location will be added to"), Utils.line("the exploration menu as well as"), Utils.line("the list of warps.")), (NetworkUser u) -> { - // Accept request. acceptRequest(u); // Delete gui and return to previous menu. this.delete(); - u.staffGui = new LocationRequests(); + u.staffGui = new LocationRequests(provider); u.staffGui.open(u.player); }); - // Deny request. + // Deny the request. setItem(5, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Deny Location Request"), Utils.line("Location request will be denied.")), (NetworkUser u) -> { // Delete request. @@ -329,21 +323,19 @@ private void createGui() { // Delete gui and return to previous menu. this.delete(); - u.staffGui = new LocationRequests(); + u.staffGui = new LocationRequests(provider); u.staffGui.open(u.player); }); } // Return if (type == AddLocationType.ADD) { - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + " menu.")), (NetworkUser u) -> - - { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the explore" + " menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - // Switch to navigation menu. + // Switch to the navigation menu. u.mainGui = new ExploreGui(u); u.mainGui.open(u.player); }); @@ -353,7 +345,7 @@ private void createGui() { // Delete gui and return to previous menu. this.delete(); - u.staffGui = new LocationRequests(); + u.staffGui = new LocationRequests(provider); u.staffGui.open(u.player); }); } else { @@ -362,7 +354,7 @@ private void createGui() { // Delete gui and return to previous menu. this.delete(); - u.staffGui = new StaffGui(u); + u.staffGui = new StaffGui(provider, u); u.staffGui.open(u.player); }); } @@ -469,7 +461,7 @@ public void requestLocation(NetworkUser u) { // Notify reviewers. ChatMessage chatMessage = new ChatMessage(REVIEWER.getChannelName(), "server", ChatUtils.success("A new " + "location has been requested.")); - Network.getInstance().getChat().sendSocketMessage(chatMessage); + provider.chatAPI().sendChatMessage(chatMessage); u.player.sendMessage(ChatUtils.success("Location %s requested.", name)); @@ -481,18 +473,12 @@ public void requestLocation(NetworkUser u) { u.player.closeInventory(); } - public void refresh() { - - this.clearGui(); - createGui(); - } - - // Override delete method to make sure selectCounty is also deleted. + // Override the delete method to make sure selectSubcategory is also deleted. @Override public void delete() { super.delete(); - // If selectCounty exists, delete it. + // If selectSubcategory exists, delete it. if (selectSubcategory != null) { selectSubcategory.delete(); selectSubcategory = null; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java index 37ada39f..124a931b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/SelectSubcategory.java @@ -1,6 +1,7 @@ package net.bteuk.network.gui.navigation; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.AddLocationType; @@ -11,47 +12,41 @@ import java.util.List; -public class SelectSubcategory extends Gui { +public class SelectSubcategory extends NetworkRefreshableGui { - private final Network instance; private final AddLocation addLocation; private int page = 1; - public SelectSubcategory(Network instance, AddLocation addLocation) { - super(45, Component.text("Select Subcategory", NamedTextColor.AQUA, TextDecoration.BOLD)); + public SelectSubcategory(GuiProvider provider, AddLocation addLocation) { + super(provider, 45, Component.text("Select Subcategory", NamedTextColor.AQUA, TextDecoration.BOLD)); - this.instance = instance; this.addLocation = addLocation; - createGui(); } - private void createGui() { + protected void createGui() { - // Iterate through subcatories, starting with 'None'. - List subcategories = instance.getGlobalSQL().getStringList("SELECT name FROM " + - "location_subcategory WHERE category='" + addLocation.getCategory() + "' ORDER BY name ASC;"); + // Iterate through the subcategories, starting with 'None'. + List subcategories = provider.globalSQL() + .getStringList("SELECT name FROM " + "location_subcategory WHERE category='" + addLocation.getCategory() + "' ORDER BY name ASC;"); subcategories.addFirst("None"); - // If page > 1 set number of iterations that must be skipped. + // If page > 1 set the number of iterations that must be skipped. int skip = (page - 1) * 21; // Slot count. int slot = 10; - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of subcategories.")), - (NetworkUser u) -> - - { - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of subcategories.")), (NetworkUser u) -> + + { + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } for (String subcategory : subcategories) { @@ -62,9 +57,7 @@ private void createGui() { continue; } - setItem(slot, Utils.createItem(Material.LIME_CONCRETE, 1, - Utils.title(subcategory), - Utils.line("Click to select this subcategory.")), + setItem(slot, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title(subcategory), Utils.line("Click to select this subcategory.")), (NetworkUser u) -> { // Set the county. @@ -75,19 +68,15 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of locations.")), - (NetworkUser u) -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of locations.")), (NetworkUser u) -> - { + { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -104,10 +93,7 @@ private void createGui() { } // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the previous menu.")), - this::returnToAddLocation); + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the previous menu.")), this::returnToAddLocation); } public void refresh() { @@ -121,12 +107,10 @@ private void returnToAddLocation(NetworkUser u) { this.delete(); addLocation.selectSubcategory = null; - // Return to addlocation. + // Return to the addLocation gui. if (addLocation.getType() == AddLocationType.ADD) { - u.mainGui.refresh(); u.mainGui.open(u.player); } else { - u.staffGui.refresh(); u.staffGui.open(u.player); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index 8c3a2200..c7b285fa 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -1,15 +1,19 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; -import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.eventing.listeners.regions.RegionTagListener; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.InviteMembers; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionStatus; +import net.bteuk.network.regions.RegionType; +import net.bteuk.network.regions.RegionUser; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -18,77 +22,61 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import static net.bteuk.network.utils.Constants.SERVER_NAME; +import java.util.Optional; public class RegionInfo extends NetworkRefreshableGui { private final Region region; private final String uuid; - private final GlobalSQL globalSQL; + private final RegionManager regionManager; private RegionTagListener regionTagListener; private boolean actionActive = false; - public RegionInfo(Region region, String uuid) { + public RegionInfo(GuiProvider provider, Region region, String uuid) { - super(27, Component.text("Region " + region.getTag(uuid), NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Region " + provider.regionManager().getTag(region, uuid), NamedTextColor.AQUA, TextDecoration.BOLD)); this.region = region; this.uuid = uuid; - - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.globalSQL = provider.globalSQL(); + this.regionManager = provider.regionManager(); } - private void createGui() { + protected void createGui() { // Region info. // If region has tag set then show both name and tag. - if (region.regionName().equals(region.getTag(uuid))) { - setItem(4, Utils.createItem(Material.BOOK, 1, - Utils.title("Region " + region.regionName()), - Utils.line("Region Owner ") - .append(Component.text(region.ownerName(), NamedTextColor.GRAY)), - Utils.line("Region Members ") - .append(Component.text(region.memberCount(), NamedTextColor.GRAY)))); + if (region.regionName().equals(regionManager.getTag(region, uuid))) { + setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Region " + region.regionName()), + Utils.line("Region Owner ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), + Utils.line("Region Members ").append(Component.text(regionManager.memberCount(region), NamedTextColor.GRAY)))); } else { - setItem(4, Utils.createItem(Material.BOOK, 1, - Utils.title("Region " + region.regionName()), - Utils.line("Region Tag ") - .append(Component.text(region.getTag(uuid), NamedTextColor.GRAY)), - Utils.line("Region Owner ") - .append(Component.text(region.ownerName(), NamedTextColor.GRAY)), - Utils.line("Region Members ") - .append(Component.text(region.memberCount(), NamedTextColor.GRAY)))); + setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Region " + region.regionName()), + Utils.line("Region Tag ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.GRAY)), + Utils.line("Region Owner ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), + Utils.line("Region Members ").append(Component.text(regionManager.memberCount(region), NamedTextColor.GRAY)))); } // Leave Region. - setItem(8, Utils.createItem(Material.RED_CONCRETE, 1, - Utils.title("Leave Region")), - (NetworkUser u) -> { + setItem(8, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Region")), (NetworkUser u) -> { - // Send leave event to server events. - EventManager.createEvent(u.player.getUniqueId().toString(), "network", globalSQL.getString( - "SELECT name FROM server_data WHERE type='EARTH';"), - "region leave " + region.regionName(), - "&aYou have left region &3" + region.getTag(u.player.getUniqueId().toString())); + // Send leave event to server events. + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"), + "region leave " + region.regionName(), "&aYou have left region &3" + regionManager.getTag(region, u.player.getUniqueId().toString())); - // Return to region menu and close inventory. - u.player.closeInventory(); - this.delete(); + // Return to region menu and close inventory. + u.player.closeInventory(); + this.delete(); - u.mainGui = new RegionMenu(u); - }); + u.mainGui = new RegionMenu(provider, u); + }); // Set region tag. - setItem(20, Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title("Set Region Tag"), - Utils.line("Click to give this region a custom name."), - Utils.line("You will be prompted to type a name in chat."), - Utils.line("It can have a maximum of 64 characters.")), + setItem(20, Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Set Region Tag"), Utils.line("Click to give this region a custom name."), + Utils.line("You will be prompted to type a name in chat."), Utils.line("It can have a maximum of 64 characters.")), (NetworkUser u) -> { @@ -100,191 +88,158 @@ private void createGui() { // Create chat listener and send message telling the player. // Listener will automatically close after 1 minute or if a message is sent. - regionTagListener = new RegionTagListener(u.player, region); + regionTagListener = new RegionTagListener(provider, u.player, region); u.player.sendMessage(ChatUtils.success("Write your region tag in chat, the first message counts.")); u.player.closeInventory(); }); - setItem(21, enchant(Utils.createItem(Material.LIGHTNING_ROD, 1, - region.isPinned(uuid) ? Utils.title("Unpin Region") : Utils.title("Pin Region"), - Utils.line("A pinned region will always show"), - Utils.line("at the start of the region menu."))), - user -> { - if (!actionActive) { - actionActive = true; - - try { - region.setPinned(uuid, !region.isPinned(uuid)); - } finally { - this.refresh(); - } - } - }); + setItem(21, enchant(Utils.createItem(Material.LIGHTNING_ROD, 1, regionManager.isPinned(region, uuid) ? Utils.title("Unpin Region") : Utils.title("Pin Region"), + Utils.line("A pinned region will always show"), Utils.line("at the start of the region menu."))), (NetworkUser user) -> { + if (!actionActive) { + actionActive = true; + + try { + regionManager.setPinned(region, uuid, !regionManager.isPinned(region, uuid)); + } finally { + this.refresh(); + } + } + }); // Teleport to region. - setItem(23, Utils.createItem(Material.ENDER_PEARL, 1, - Utils.title("Teleport to Region"), - Utils.line("Teleports you to the region at the"), - Utils.line("current set location."), - Utils.line("You can edit the location by clicking on the"), - Utils.line("'Set Location' button while standing in the region.")), - (NetworkUser u) -> { + setItem(23, + Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Region"), Utils.line("Teleports you to the region at the"), Utils.line("current set location."), + Utils.line("You can edit the location by clicking on the"), Utils.line("'Set Location' button while standing in the region.")), (NetworkUser u) -> { // If the player is on the earth server get the coordinate. - if (SERVER_NAME.equals(globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"))) { + if (provider.constants().serverName().equals(globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"))) { // Close inventory. u.player.closeInventory(); // Set current location for /back - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); + provider.back().setPreviousCoordinate(u.player.getUniqueId().toString(), LocationAdapter.adapt(u.player.getLocation())); - Location l = globalSQL.getLocation(region.getCoordinateID(uuid)); + Location l = globalSQL.getLocation(regionManager.getCoordinateID(region, uuid)); u.player.teleport(l); - u.player.sendMessage(ChatUtils.success("Teleported to region ") - .append(Component.text(region.getTag(uuid), NamedTextColor.DARK_AQUA))); + u.player.sendMessage(ChatUtils.success("Teleported to region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA))); } else { // Create teleport region event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport region " + region.regionName(), u.player.getLocation()); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport region " + region.regionName(), + LocationAdapter.adapt(u.player.getLocation())); // Switch server. - SwitchServer.switchServer(u.player, globalSQL.getString("SELECT name FROM server_data WHERE " + - "type='EARTH'")); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), globalSQL.getString("SELECT name FROM server_data WHERE " + "type='EARTH'")); } }); // Set teleport location. - setItem(24, Utils.createItem(Material.ENDER_EYE, 1, - Utils.title("Set Location"), - Utils.line("Sets the teleport location of this region"), - Utils.line("to you current location."), - Utils.line("You must be standing in the region"), - Utils.line("for this to work.")), - (NetworkUser u) -> { - - u.player.closeInventory(); - - // Check if the player is in the correct region. - if (u.inRegion) { - if (u.region.equals(region)) { - - // Update the previous coordinate. - int coordinateID = region.getCoordinateID(uuid); - globalSQL.updateCoordinate(coordinateID, u.player.getLocation()); - - // Create coordinate id for location of player and set that as the new coordinate id. - region.setCoordinateID(uuid, coordinateID); - u.player.sendMessage(ChatUtils.success("Set teleport location for region ") - .append(Component.text(region.getTag(uuid), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" at your current location."))); - } else { - u.player.sendMessage(ChatUtils.error("You are not standing in the correct region.")); - } - } else { - u.player.sendMessage(ChatUtils.error("You are not standing in a region.")); - } - }); + setItem(24, Utils.createItem(Material.ENDER_EYE, 1, Utils.title("Set Location"), Utils.line("Sets the teleport location of this region"), + Utils.line("to you current location."), Utils.line("You must be standing in the region"), Utils.line("for this to work.")), (NetworkUser u) -> { + + u.player.closeInventory(); + + // Check if the player is in the correct region. + Optional optionalRegionUser = regionManager.getUserByPlayer(u.player); + if (optionalRegionUser.isPresent() && optionalRegionUser.get().hasTrackedRegion()) { + RegionUser regionUser = optionalRegionUser.get(); + if (regionUser.getTrackedRegion().equals(region)) { + + // Update the previous coordinate. + int coordinateID = regionManager.getCoordinateID(region, uuid); + globalSQL.updateCoordinate(coordinateID, u.player.getLocation()); + + // Create coordinate id for location of player and set that as the new coordinate id. + regionManager.setCoordinateID(region, uuid, coordinateID); + u.player.sendMessage(ChatUtils.success("Set teleport location for region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" at your current location."))); + } else { + u.player.sendMessage(ChatUtils.error("You are not standing in the correct region.")); + } + } else { + u.player.sendMessage(ChatUtils.error("You are not standing in a region.")); + } + }); // Owner only settings. - if (region.isOwner(uuid)) { + if (regionManager.isOwner(region, uuid)) { // If region is private, make public button, if public make private button. - if (region.status() == RegionStatus.PUBLIC) { - setItem(0, Utils.createItem(Material.IRON_TRAPDOOR, 1, - Utils.title("Make Private"), - Utils.line("New members will need your approval to join the region.")), + if (regionManager.status(region) == RegionStatus.PUBLIC) { + setItem(0, Utils.createItem(Material.IRON_TRAPDOOR, 1, Utils.title("Make Private"), Utils.line("New members will need your approval to join the region.")), (NetworkUser u) -> { // Set the region as private and refresh gui. - region.setDefault(); + regionManager.setDefault(region); - u.player.sendMessage(ChatUtils.success("Region ") - .append(Component.text(region.getTag(uuid), NamedTextColor.DARK_AQUA)) + u.player.sendMessage(ChatUtils.success("Region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" is now private."))); this.refresh(); }); } else { - setItem(0, Utils.createItem(Material.OAK_TRAPDOOR, 1, - Utils.title("Make Public"), - Utils.line("New members can join the region without approval.")), + setItem(0, Utils.createItem(Material.OAK_TRAPDOOR, 1, Utils.title("Make Public"), Utils.line("New members can join the region without approval.")), (NetworkUser u) -> { // Set the region as public and refresh gui. - region.setPublic(); + regionManager.setPublic(region); // Approve any active region requests for this region. // Make sure this is done on the correct server. // Create teleport region event. - if (region.hasRequests()) { - globalSQL.update( - "INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','network'," + - globalSQL.getString( - "SELECT name FROM server_data WHERE type='EARTH';") + - "'region request accept " - + region.regionName() + "');"); + if (regionManager.hasRequests(region)) { + globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','network'," + globalSQL.getString( + "SELECT name FROM server_data WHERE type='EARTH';") + "'region request accept " + region.regionName() + "');"); } - u.player.sendMessage(ChatUtils.success("Region ") - .append(Component.text(region.getTag(uuid), NamedTextColor.DARK_AQUA)) + u.player.sendMessage(ChatUtils.success("Region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" is now public."))); this.refresh(); }); } // Invite member. - setItem(9, Utils.createItem(Material.OAK_BOAT, 1, - Utils.title("Invite Members"), - Utils.line("Invite a new member to your region."), - Utils.line("You can only invite online users.")), - (NetworkUser u) -> { + setItem(9, Utils.createItem(Material.OAK_BOAT, 1, Utils.title("Invite Members"), Utils.line("Invite a new member to your region."), + Utils.line("You can only invite online users.")), (NetworkUser u) -> { - // Open the invite member menu. - this.delete(); + // Open the invite member menu. + this.delete(); - u.mainGui = new InviteMembers(region, RegionType.REGION); - u.mainGui.open(u.player); - }); + u.mainGui = new InviteMembers(provider, region, RegionType.REGION); + u.mainGui.open(u.player); + }); // Manage members. - setItem(18, Utils.createItem(Material.PLAYER_HEAD, 1, - Utils.title("Region Members"), - Utils.line("Manage the members in your region.")), - (NetworkUser u) -> { + setItem(18, Utils.createItem(Material.PLAYER_HEAD, 1, Utils.title("Region Members"), Utils.line("Manage the members in your region.")), (NetworkUser u) -> { - // Open the invite member menu. - this.delete(); + // Open the invite member menu. + this.delete(); - u.mainGui = new RegionMembers(region); - u.mainGui.open(u.player); - }); + u.mainGui = new RegionMembers(provider, region); + u.mainGui.open(u.player); + }); } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the region menu.")), - (NetworkUser u) -> { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the region menu.")), (NetworkUser u) -> { - // Delete this gui. - this.delete(); + // Delete this gui. + this.delete(); - // Switch to plot info. - u.mainGui = new RegionMenu(u); - u.mainGui.open(u.player); - }); + // Switch to plot info. + u.mainGui = new RegionMenu(provider, u); + u.mainGui.open(u.player); + }); } + @Override public void refresh() { - - this.clearGui(); - createGui(); + super.refresh(); actionActive = false; } private ItemStack enchant(ItemStack itemStack) { - if (region.isPinned(uuid)) { + if (regionManager.isPinned(region, uuid)) { Utils.enchant(itemStack); } return itemStack; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java index 9f97a0e2..95c69ee1 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMembers.java @@ -1,13 +1,16 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; +import net.bteuk.network.core.Time; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.Time; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -16,16 +19,17 @@ import java.util.ArrayList; -public class RegionMembers extends Gui { +public class RegionMembers extends NetworkRefreshableGui { private final Region region; private final GlobalSQL globalSQL; + private final RegionManager regionManager; private int page; private boolean transfer; - public RegionMembers(Region region) { + public RegionMembers(GuiProvider provider, Region region) { - super(45, Component.text("Region Members", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Region Members", NamedTextColor.AQUA, TextDecoration.BOLD)); this.region = region; @@ -33,15 +37,14 @@ public RegionMembers(Region region) { transfer = false; - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.globalSQL = provider.globalSQL(); + this.regionManager = provider.regionManager(); } - private void createGui() { + protected void createGui() { // Get all members of the region. - ArrayList region_members = region.getMembers(); + ArrayList region_members = regionManager.getMembers(region); // Slot count. int slot = 10; @@ -49,14 +52,11 @@ private void createGui() { // Skip count. int skip = 21 * (page - 1); - // Which from kick member to transfer owner. + // Switch from kick member mode to transfer owner mode. if (transfer) { - setItem(8, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, - Utils.title("Switch Mode"), - Utils.line("Converts gui to kick members."), - Utils.line("Clicking on a player head"), - Utils.line("will kick them from the region.")), + setItem(8, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Switch Mode"), Utils.line("Converts gui to kick members."), + Utils.line("Clicking on a player head"), Utils.line("will kick them from the region.")), (NetworkUser u) -> { @@ -65,11 +65,8 @@ private void createGui() { }); } else { - setItem(8, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, - Utils.title("Switch Mode"), - Utils.line("Converts gui to transfer ownership."), - Utils.line("Clicking on a player head will"), - Utils.line("make them the owner of the region.")), + setItem(8, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Switch Mode"), Utils.line("Converts gui to transfer ownership."), + Utils.line("Clicking on a player head will"), Utils.line("make them the owner of the region.")), (NetworkUser u) -> { @@ -78,46 +75,39 @@ private void createGui() { }); } - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of region members.")), - (NetworkUser u) -> + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), (NetworkUser u) -> - { + { - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all online players. for (String uuid : region_members) { // If uuid is yours, skip. - if (uuid.equals(region.getOwner())) { + if (uuid.equals(regionManager.getOwner(region))) { continue; } // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of region members.")), - (NetworkUser u) -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), (NetworkUser u) -> - { + { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -133,66 +123,55 @@ private void createGui() { if (transfer) { setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Make " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " the region " + - "owner."), - Utils.line("Most recently in this region at " + Time.getDateTime(region.lastActive(uuid))), - Utils.line("You will be demoted to region member.")), - (NetworkUser u) -> - - { - - // Make the previous owner a member. - region.makeMember(); - - // Give the new player ownership. - region.makeOwner(uuid); - - // Update any requests to take into account the new region owner. - region.updateRequests(); - - // Send message to user. - u.player.sendMessage(ChatUtils.success("Transferred ownership of the region to ") - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE " + - "uuid ='" + region.getOwner() + "';"), NamedTextColor.DARK_AQUA))); - - // Send message to new owner. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), - uuid, "server", - ChatUtils.success("You are now the owner of region %s.", region.getTag(uuid)), - true); - Network.getInstance().getChat().sendSocketMessage(directMessage); - - // Return to region info. - this.delete(); - u.mainGui = null; - - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); + Utils.title("Make " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " the region " + "owner."), + Utils.line("Most recently in this region at " + Time.getDateTime(regionManager.lastActive(region, uuid))), + Utils.line("You will be demoted to region member.")), (NetworkUser u) -> + + { + + // Make the previous owner a member. + regionManager.makeMember(region); + + // Give the new player ownership. + regionManager.makeOwner(region, uuid); + + // Update any requests to take into account the new region owner. + regionManager.updateRequests(region); + + // Send message to user. + u.player.sendMessage(ChatUtils.success("Transferred ownership of the region to ") + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE " + "uuid ='" + regionManager.getOwner(region) + "';"), + NamedTextColor.DARK_AQUA))); + + // Send message to new owner. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.success("You are now the owner of region %s.", regionManager.getTag(region, uuid)), true); + provider.chatAPI().sendDirectMessage(directMessage); + + // Return to region info. + this.delete(); + u.mainGui = null; + + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); } else { setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Kick " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from the " + - "region."), - Utils.line("Most recently in this region at: ") - .append(Component.text(Time.getDateTime(region.lastActive(uuid))))), - (NetworkUser u) -> - - { - // Remove them from the region. - region.leaveRegion(uuid, ChatUtils.error("You have been kicked from region %s", - region.getTag(uuid))); - - // Send message to user. - u.player.sendMessage(ChatUtils.success("Kicked %s from the region", globalSQL.getString( - "SELECT name FROM player_data WHERE uuid ='" + uuid + "';"))); - - // Refresh the gui. - // Delay this action so the user can be kicked, even if on another server. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), this::refresh, 20L); - }); + Utils.title("Kick " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from the " + "region."), + Utils.line("Most recently in this region at: ").append(Component.text(Time.getDateTime(regionManager.lastActive(region, uuid))))), (NetworkUser u) -> + + { + // Remove them from the region. + regionManager.leaveRegion(region, uuid, ChatUtils.error("You have been kicked from region %s", regionManager.getTag(region, uuid))); + + // Send message to user. + u.player.sendMessage(ChatUtils.success("Kicked %s from the region", globalSQL.getString("SELECT name FROM player_data WHERE uuid ='" + uuid + "';"))); + + // Refresh the gui. + // Delay this action so the user can be kicked, even if on another server. + Bukkit.getScheduler().runTaskLater(provider.instance(), this::refresh, 20L); + }); } // Increase slot accordingly. @@ -206,27 +185,18 @@ private void createGui() { } // Return to plot info menu. - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to the menu of region ") - .append(Component.text(region.getTag(region.getOwner())))), - (NetworkUser u) -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), + Utils.line("Return to the menu of region ").append(Component.text(regionManager.getTag(region, regionManager.getOwner(region))))), (NetworkUser u) -> - { - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch back to plot info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); - } + { - public void refresh() { + // Delete this gui. + this.delete(); + u.mainGui = null; - this.clearGui(); - createGui(); + // Switch back to plot info. + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java index c270e5e4..6804ea75 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionMenu.java @@ -1,9 +1,12 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; import net.bteuk.network.gui.BuildGui; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionMember; +import net.bteuk.network.regions.RegionStatus; +import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -25,21 +28,17 @@ public class RegionMenu extends NetworkRefreshableGui { public RegionMenu(GuiProvider provider, NetworkUser user) { - super(45, Component.text("Region Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Region Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; page = 1; - regionSQL = Network.getInstance().regionSQL; - - createGui(); + this.regionSQL = provider.regionSQL(); } private static ItemStack getGuiItem(RegionMember regionMember, RegionStatus regionStatus) { - return Utils.createItem(getMaterial(regionMember, regionStatus), 1, - Utils.title("Region " + regionMember.getTag()), - getLines(regionMember, regionStatus)); + return Utils.createItem(getMaterial(regionMember, regionStatus), 1, Utils.title("Region " + regionMember.getTag()), getLines(regionMember, regionStatus)); } private static Material getMaterial(RegionMember regionMember, RegionStatus regionStatus) { @@ -54,8 +53,7 @@ private static Material getMaterial(RegionMember regionMember, RegionStatus regi private static Component[] getLines(RegionMember regionMember, RegionStatus regionStatus) { List lines = new ArrayList<>(); - lines.add(regionMember.isOwner() ? Utils.line("You are the owner of this region.") : Utils.line("You are a " + - "member of this region.")); + lines.add(regionMember.isOwner() ? Utils.line("You are the owner of this region.") : Utils.line("You are a " + "member of this region.")); lines.add(Utils.line("Click to open the menu of this region.")); if (regionStatus == RegionStatus.INACTIVE) { lines.add(Utils.line("This region is currently inactive.")); @@ -67,7 +65,7 @@ private static Component[] getLines(RegionMember regionMember, RegionStatus regi return lines.toArray(new Component[0]); } - private void createGui() { + protected void createGui() { // Get regions you are owner or member of. List regionMembers = regionSQL.getRegionMembers(user.player.getUniqueId().toString()); @@ -80,18 +78,15 @@ private void createGui() { // If page is greater than 1 add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of regions.")), - (NetworkUser u) -> + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of regions.")), (NetworkUser u) -> - { + { - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Make a button for each plot. @@ -106,39 +101,34 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of regions.")), - (NetworkUser u) -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of regions.")), (NetworkUser u) -> - { + { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + updatePlayerInventory(u.player); + }); // Stop iterating. break; } - Region region = Network.getInstance().getRegionManager().getRegion(regionMember.region()); - RegionStatus status = region.status(); + Region region = provider.regionManager().getRegion(regionMember.region()); + RegionStatus status = provider.regionManager().status(region); - setItem(slot, getGuiItem(regionMember, status), - (NetworkUser u) -> { + setItem(slot, getGuiItem(regionMember, status), (NetworkUser u) -> { - // Delete this gui. - this.delete(); + // Delete this gui. + this.delete(); - // Switch to region info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }); + // Switch to region info. + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }); - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -149,19 +139,16 @@ private void createGui() { } // Check if you have any requests for regions you own. - if (regionSQL.hasRow("SELECT region FROM region_requests WHERE owner='" + user.player.getUniqueId() + "' AND " + - "owner_accept=0;")) { + if (regionSQL.hasRow("SELECT region FROM region_requests WHERE owner='" + user.player.getUniqueId() + "' AND " + "owner_accept=0;")) { - setItem(39, Utils.createItem(Material.LIME_STAINED_GLASS_PANE, 1, - Utils.title("Review Region Requests"), - Utils.line("View all region join requests for"), + setItem(39, Utils.createItem(Material.LIME_STAINED_GLASS_PANE, 1, Utils.title("Review Region Requests"), Utils.line("View all region join requests for"), Utils.line("regions that you are the owner of.")), (NetworkUser u) -> { // Delete this gui and switch to review region requests. this.delete(); - u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); + u.mainGui = new ReviewRegionRequests(provider, false, u.player.getUniqueId().toString()); u.mainGui.open(u.player); }); } @@ -169,39 +156,27 @@ private void createGui() { // Check if the player has any active region requests. if (regionSQL.hasRow("SELECT region FROM region_requests WHERE uuid='" + user.player.getUniqueId() + "';")) { - setItem(40, Utils.createItem(Material.ORANGE_STAINED_GLASS, 1, - Utils.title("Region Requests"), - Utils.line("View active regions requests"), - Utils.line("that you have made that have"), - Utils.line("not yet been accepted.")), + setItem(40, Utils.createItem(Material.ORANGE_STAINED_GLASS, 1, Utils.title("Region Requests"), Utils.line("View active regions requests"), + Utils.line("that you have made that have"), Utils.line("not yet been accepted.")), (NetworkUser u) -> { // Delete this gui and switch to region request menu. this.delete(); - u.mainGui = new RegionRequestMenu(u); + u.mainGui = new RegionRequestMenu(provider, u); u.mainGui.open(u.player); }); } // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the building menu.")), - (NetworkUser u) -> { - - // Delete this gui. - this.delete(); - - // Switch to plot info. - u.mainGui = new BuildGui(u); - u.mainGui.open(u.player); - }); - } + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the building menu.")), (NetworkUser u) -> { - public void refresh() { + // Delete this gui. + this.delete(); - this.clearGui(); - createGui(); + // Switch to plot info. + u.mainGui = new BuildGui(provider, u); + u.mainGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java index 30592047..b8833ce8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionRequestMenu.java @@ -1,8 +1,9 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.RegionSQL; +import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -15,7 +16,7 @@ /** * Lists all region requests made by this player. */ -public class RegionRequestMenu extends Gui { +public class RegionRequestMenu extends NetworkRefreshableGui { private final RegionSQL regionSQL; private final NetworkUser u; @@ -27,23 +28,20 @@ public class RegionRequestMenu extends Gui { * @param u {@link NetworkUser} for whom the gui should be created. * This parameter is needed to find the region requests that the player has. */ - public RegionRequestMenu(NetworkUser u) { - - super(45, Component.text("Region Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); + public RegionRequestMenu(GuiProvider provider, NetworkUser u) { + super(provider, 45, Component.text("Region Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); page = 1; this.u = u; - regionSQL = Network.getInstance().regionSQL; - - createGui(); + this.regionSQL = provider.regionSQL(); } /** * Populates the gui with content. */ - private void createGui() { + protected void createGui() { // Get all regions with uuid. ArrayList requests = @@ -107,7 +105,7 @@ private void createGui() { (regionSQL.hasRow("SELECT region FROM region_requests WHERE region='" + requests.get( i) + "' AND uuid='" + u.player.getUniqueId() + "' AND staff_accept=0;")) ? "a reviewer" - : Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + + : provider.globalSQL().getString("SELECT name FROM " + "player_data WHERE uuid='" + regionSQL.getString( "SELECT owner FROM region_requests WHERE region='" + requests.get( @@ -129,7 +127,7 @@ private void createGui() { .append(Component.text(requests.get(finalI), NamedTextColor.DARK_AQUA))); }); - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -148,14 +146,8 @@ private void createGui() { this.delete(); // Switch to region menu. - u.mainGui = new RegionMenu(u); + u.mainGui = new RegionMenu(provider, u); u.mainGui.open(u.player); }); } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index 6ac1ed39..ca540f12 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -1,14 +1,15 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; -import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.Request; +import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.sql.RegionSQL; -import net.bteuk.network.utils.SwitchServer; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Request; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -16,185 +17,151 @@ import org.bukkit.Location; import org.bukkit.Material; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - -public class ReviewRegionRequest extends Gui { +public class ReviewRegionRequest extends NetworkRefreshableGui { private final RegionSQL regionSQL; private final Request request; private final boolean staff; - public ReviewRegionRequest(Request request, boolean staff) { - - super(27, Component.text("Review Region Request", NamedTextColor.AQUA, TextDecoration.BOLD)); + public ReviewRegionRequest(GuiProvider provider, Request request, boolean staff) { - regionSQL = Network.getInstance().regionSQL; + super(provider, 27, Component.text("Review Region Request", NamedTextColor.AQUA, TextDecoration.BOLD)); + this.regionSQL = provider.regionSQL(); this.request = request; this.staff = staff; - - createGui(); } - private void createGui() { + protected void createGui() { - setItem(4, Utils.createItem(Material.BOOK, 1, - Utils.title("Region " + request.region), - Utils.line("Requested by ") - .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "player_data WHERE uuid='" + - request.uuid + "';"), NamedTextColor.GRAY)))); + setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Region " + request.region), Utils.line("Requested by ") + .append(Component.text(provider.globalSQL().getString("SELECT name FROM " + "player_data WHERE uuid='" + request.uuid + "';"), NamedTextColor.GRAY)))); - setItem(11, Utils.createItem(Material.LIME_CONCRETE, 1, - Utils.title("Accept Request"), - Utils.line("The user will be able to build in this region.")), - (NetworkUser u) -> + setItem(11, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Request"), Utils.line("The user will be able to build in this region.")), (NetworkUser u) -> { - { + // Create event to accept request. + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", + provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), + "region request accept " + request.region + " " + request.uuid); - // Create event to accept request. - EventManager.createEvent(u.player.getUniqueId().toString(), "network", - Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE " + - "type='EARTH';"), - "region request accept " + request.region + " " + request.uuid); + // Return to the request menu. + this.delete(); - // Return to request menu. - this.delete(); + if (staff) { - if (staff) { + u.staffGui = null; - u.staffGui = null; + // Delay opening to make sure request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.staffGui = new ReviewRegionRequests(provider, true, u.player.getUniqueId().toString()); + u.staffGui.open(u.player); + }, 20L); + } else { - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u.player); - }, 20L); - } else { + u.mainGui = null; - u.mainGui = null; + // Delay opening to make sure request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.mainGui = new ReviewRegionRequests(provider, false, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }, 20L); + } + }); - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }, 20L); - } - }); + setItem(15, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Deny Request"), Utils.line("The user will not be able to build in this region.")), (NetworkUser u) -> - setItem(15, Utils.createItem(Material.RED_CONCRETE, 1, - Utils.title("Deny Request"), - Utils.line("The user will not be able to build in this region.")), - (NetworkUser u) -> - - { + { - // Create event to deny request. - EventManager.createEvent(u.player.getUniqueId().toString(), "network", - Network.getInstance().getGlobalSQL().getString("SELECT name FROM server_data WHERE " + - "type='EARTH';"), - "region request deny " + request.region + " " + request.uuid); + // Create event to deny request. + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", + provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), + "region request deny " + request.region + " " + request.uuid); - // Return to request menu. - this.delete(); + // Return to the request menu. + this.delete(); - if (staff) { + if (staff) { - u.staffGui = null; + u.staffGui = null; - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u.player); - }, 20L); - } else { + // Delay opening to make sure request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.staffGui = new ReviewRegionRequests(provider, true, u.player.getUniqueId().toString()); + u.staffGui.open(u.player); + }, 20L); + } else { - u.mainGui = null; + u.mainGui = null; - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }, 20L); - } - }); + // Delay opening to make sure request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.mainGui = new ReviewRegionRequests(provider, false, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }, 20L); + } + }); - setItem(22, Utils.createItem(Material.ENDER_PEARL, 1, - Utils.title("Teleport to Region"), - Utils.line("Teleport to the location where the request was made.")), + setItem(22, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title("Teleport to Region"), Utils.line("Teleport to the location where the request was made.")), (NetworkUser u) -> { - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); + GlobalSQL globalSQL = provider.globalSQL(); // Get coordinate. - Location l = globalSQL.getLocation(regionSQL.getInt("SELECT coordinate_id FROM region_requests " + - "WHERE region='" + request.region + "' AND uuid='" + request.uuid + "';")); + Location l = globalSQL.getLocation( + regionSQL.getInt("SELECT coordinate_id FROM region_requests " + "WHERE region='" + request.region + "' AND uuid='" + request.uuid + "';")); // If the player is on the earth server get the coordinate. - if (SERVER_NAME.equals(globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"))) { + if (provider.constants().serverName().equals(globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"))) { // Close inventory. u.player.closeInventory(); // Set current location for /back - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); + provider.back().setPreviousCoordinate(u.player.getUniqueId().toString(), LocationAdapter.adapt(u.player.getLocation())); // Teleport player. u.player.teleport(l); - u.player.sendMessage(ChatUtils.success("Teleported to region ") - .append(Component.text(request.region, NamedTextColor.DARK_AQUA))); + u.player.sendMessage(ChatUtils.success("Teleported to region ").append(Component.text(request.region, NamedTextColor.DARK_AQUA))); } else { // Create teleport event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport " + - EARTH_WORLD + " " + l.getX() + " " + l.getZ() + " " + - l.getYaw() + " " + l.getPitch(), u.player.getLocation()); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", + "teleport " + provider.constants().earthWorld() + " " + l.getX() + " " + l.getZ() + " " + l.getYaw() + " " + l.getPitch(), + LocationAdapter.adapt(u.player.getLocation())); // Switch server. - SwitchServer.switchServer(u.player, globalSQL.getString("SELECT name FROM server_data WHERE " + - "type='EARTH'")); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), globalSQL.getString("SELECT name FROM server_data WHERE " + "type='EARTH'")); } }); - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Previous Page"), - Utils.line("Open the region request menu.")), - (NetworkUser u) -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the region request menu.")), (NetworkUser u) -> - { + { - // Return to request menu. - this.delete(); + // Return to the request menu. + this.delete(); - if (staff) { + if (staff) { - u.staffGui = null; + u.staffGui = null; - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u.player); - }, 20L); - } else { - - u.mainGui = null; - - // Delay opening to make sure request was dealt with. - Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - u.mainGui = new ReviewRegionRequests(false, u.player.getUniqueId().toString()); - u.mainGui.open(u.player); - }, 20L); - } - }); - } + // Delay opening to make sure the request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.staffGui = new ReviewRegionRequests(provider, true, u.player.getUniqueId().toString()); + u.staffGui.open(u.player); + }, 20L); + } else { - public void refresh() { + u.mainGui = null; - this.clearGui(); - createGui(); + // Delay opening to make sure the request was dealt with. + Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { + u.mainGui = new ReviewRegionRequests(provider, false, u.player.getUniqueId().toString()); + u.mainGui.open(u.player); + }, 20L); + } + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java index e2f299a4..67440a50 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequests.java @@ -1,10 +1,12 @@ package net.bteuk.network.gui.regions; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.staff.StaffGui; -import net.bteuk.network.sql.RegionSQL; +import net.bteuk.network.regions.Request; +import net.bteuk.network.regions.sql.RegionSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Request; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -12,7 +14,7 @@ import java.util.ArrayList; -public class ReviewRegionRequests extends Gui { +public class ReviewRegionRequests extends NetworkRefreshableGui { private final RegionSQL regionSQL; private final boolean staff; @@ -25,29 +27,26 @@ public class ReviewRegionRequests extends Gui { * @param staff if it should be for staff requests * @param uuid the player to create the menu for */ - public ReviewRegionRequests(boolean staff, String uuid) { + public ReviewRegionRequests(GuiProvider provider, boolean staff, String uuid) { - super(45, Component.text("Review Region Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Review Region Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); page = 1; - regionSQL = Network.getInstance().regionSQL; + this.regionSQL = provider.regionSQL(); this.staff = staff; this.uuid = uuid; - - createGui(); } - private void createGui() { + protected void createGui() { // Get all regions with uuid. ArrayList requests; if (staff) { requests = regionSQL.getRequestList("SELECT region,uuid FROM region_requests WHERE staff_accept=0;"); } else { - requests = regionSQL.getRequestList("SELECT region,uuid FROM region_requests WHERE owner_accept=0 AND " + - "owner='" + uuid + "';"); + requests = regionSQL.getRequestList("SELECT region,uuid FROM region_requests WHERE owner_accept=0 AND " + "owner='" + uuid + "';"); } // Slot count. @@ -56,14 +55,9 @@ private void createGui() { // Skip count. int skip = 21 * (page - 1); - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of region requests.")), (NetworkUser u) -> - - { - + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region requests.")), (NetworkUser u) -> { // Update the gui. page--; this.refresh(); @@ -83,9 +77,7 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of regions requests.")), (NetworkUser u) -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of regions requests.")), (NetworkUser u) -> { @@ -100,33 +92,25 @@ private void createGui() { } int finalI = i; - setItem(slot, Utils.createItem(Material.LIME_CONCRETE, 1, - Utils.title("Region " + requests.get(i).region), - Utils.line("Requested by ") - .append(Component.text(Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "player_data WHERE uuid='" + requests.get(i).uuid + "';"), NamedTextColor.GRAY)), + setItem(slot, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Region " + requests.get(i).region), Utils.line("Requested by ") + .append(Component.text(provider.globalSQL().getString("SELECT name FROM " + "player_data WHERE uuid='" + requests.get(i).uuid + "';"), + NamedTextColor.GRAY)), Utils.line("Click to open the menu for this request.")), (NetworkUser u) -> { // Delete this gui. this.delete(); if (staff) { - - u.staffGui = null; - - // Switch to region request. - u.staffGui = new ReviewRegionRequest(requests.get(finalI), true); + // Switch to the region request. + u.staffGui = new ReviewRegionRequest(provider, requests.get(finalI), true); u.staffGui.open(u.player); } else { - - u.mainGui = null; - - // Switch to region request. - u.mainGui = new ReviewRegionRequest(requests.get(finalI), false); + // Switch to the region request. + u.mainGui = new ReviewRegionRequest(provider, requests.get(finalI), false); u.mainGui.open(u.player); } }); - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -139,42 +123,30 @@ private void createGui() { // Return if (staff) { - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the staff menu.")), (NetworkUser u) -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the staff menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - u.staffGui = null; - // Switch to staff menu. - u.staffGui = new StaffGui(u); + // Switch to the staff menu. + u.staffGui = new StaffGui(provider, u); u.staffGui.open(u.player); }); } else { - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the region menu.")), (NetworkUser u) -> + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the region menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); - u.mainGui = null; - // Switch to staff menu. - u.mainGui = new RegionMenu(u); + // Switch to the region menu. + u.mainGui = new RegionMenu(provider, u); u.mainGui.open(u.player); }); } } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java index 570a1f32..24f6726c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/KickMembers.java @@ -1,10 +1,13 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -12,29 +15,29 @@ import java.util.ArrayList; -public class KickMembers extends Gui { +public class KickMembers extends NetworkRefreshableGui { private final Region region; private final GlobalSQL globalSQL; + private final RegionManager regionManager; private int page; - public KickMembers(Region region) { + public KickMembers(GuiProvider provider, Region region) { - super(45, Component.text("Kick Member", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Kick Member", NamedTextColor.AQUA, TextDecoration.BOLD)); this.region = region; + this.regionManager = provider.regionManager(); page = 1; - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.globalSQL = provider.globalSQL(); } - private void createGui() { + protected void createGui() { // Get all members of the region. - ArrayList region_members = region.getMembers(); + ArrayList region_members = regionManager.getMembers(region); // Slot count. int slot = 10; @@ -42,20 +45,15 @@ private void createGui() { // Skip count. int skip = 21 * (page - 1); - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of region members.")), - (NetworkUser u) -> - - { + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), (NetworkUser u) -> { - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all online players. @@ -64,19 +62,13 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of region members.")), - (NetworkUser u) -> - - { + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), (NetworkUser u) -> { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -89,20 +81,15 @@ private void createGui() { } // Add player to gui. - setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Kick " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from the region.")), - (NetworkUser u) -> - - { + setItem(slot, + Utils.createPlayerSkull(uuid, 1, Utils.title("Kick " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " from the region.")), + (NetworkUser u) -> { // Remove them from the region. - region.leaveRegion(uuid, ChatUtils.error("You have been kicked from region %s", - region.getTag(uuid))); + regionManager.leaveRegion(region, uuid, ChatUtils.error("You have been kicked from region %s", regionManager.getTag(region, uuid))); // Send message to user. u.player.sendMessage(ChatUtils.success("Kicked ") - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid " + - "='" + uuid + "';"), NamedTextColor.DARK_AQUA)) + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid " + "='" + uuid + "';"), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" from the region"))); // Refresh the gui. @@ -120,27 +107,18 @@ private void createGui() { } // Return to plot info menu. - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to manage region ") - .append(Component.text(region.regionName(), NamedTextColor.GRAY))), - (NetworkUser u) -> - - { - - // Delete this gui. - this.delete(); - u.staffGui = null; + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), + Utils.line("Return to manage region ").append(Component.text(region.regionName(), NamedTextColor.GRAY))), (NetworkUser u) -> - // Switch back to plot info. - u.staffGui = new ManageRegion(u, region); - u.staffGui.open(u.player); - }); - } + { - public void refresh() { + // Delete this gui. + this.delete(); + u.staffGui = null; - this.clearGui(); - createGui(); + // Switch back to plot info. + u.staffGui = new ManageRegion(provider, u, region); + u.staffGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java index 9bf1860c..aa507f6f 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/LocationRequests.java @@ -1,7 +1,9 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.navigation.AddLocation; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.AddLocationType; import net.bteuk.network.utils.enums.Category; @@ -12,54 +14,42 @@ import java.util.ArrayList; -public class LocationRequests extends Gui { +public class LocationRequests extends NetworkRefreshableGui { - public LocationRequests() { - - super(27, Component.text("Location Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); - - createGui(); + public LocationRequests(GuiProvider provider) { + super(provider, 27, Component.text("Location Requests", NamedTextColor.AQUA, TextDecoration.BOLD)); } - private void createGui() { + protected void createGui() { // Get all locationRequests. - ArrayList locations = Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM " + - "location_requests;"); + ArrayList locations = provider.globalSQL().getStringList("SELECT location FROM " + "location_requests;"); // This gui only supports 7 requests due to limited space allocated. - // However since a large volume of requests is not expected at any point, this should be sufficient. - // If the number does exceed 7 then they will just not show up until previous have been cleared. + // However, since a large volume of requests is not expected at any point, this should be sufficient. + // If the number does exceed 7, then they will just not show up until previous have been cleared. int slot = 10; for (String location : locations) { - setItem(slot, Utils.createItem(Material.ORANGE_CONCRETE, 1, - Utils.title(location), - Utils.line("Click to review this location request.")), - (NetworkUser u) -> { - - // Opens location request. - this.delete(); - u.staffGui = null; - - int coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM " + - "location_requests WHERE location='" + location + "';"); - Category category = Category.valueOf(Network.getInstance().getGlobalSQL().getString("SELECT " + - "category FROM location_requests WHERE location='" + location + "';")); - - int subcategory_id = Network.getInstance().getGlobalSQL().getInt("SELECT subcategory FROM " + - "location_requests WHERE location='" + location + "';"); - String subcategory = null; - if (subcategory_id != 0) { - subcategory = Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "location_subcategory WHERE id=" + subcategory_id + ";"); - } - - u.staffGui = new AddLocation(AddLocationType.REVIEW, location, coordinate_id, category, - subcategory); - u.staffGui.open(u.player); - }); + setItem(slot, Utils.createItem(Material.ORANGE_CONCRETE, 1, Utils.title(location), Utils.line("Click to review this location request.")), (NetworkUser u) -> { + + // Opens location request. + this.delete(); + u.staffGui = null; + + int coordinate_id = provider.globalSQL().getInt("SELECT coordinate FROM " + "location_requests WHERE location='" + location + "';"); + Category category = Category.valueOf(provider.globalSQL().getString("SELECT " + "category FROM location_requests WHERE location='" + location + "';")); + + int subcategory_id = provider.globalSQL().getInt("SELECT subcategory FROM " + "location_requests WHERE location='" + location + "';"); + String subcategory = null; + if (subcategory_id != 0) { + subcategory = provider.globalSQL().getString("SELECT name FROM " + "location_subcategory WHERE id=" + subcategory_id + ";"); + } + + u.staffGui = new AddLocation(provider, AddLocationType.REVIEW, location, coordinate_id, category, subcategory); + u.staffGui.open(u.player); + }); slot++; @@ -69,26 +59,17 @@ private void createGui() { } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the staff menu.")), - (NetworkUser u) -> - - { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the staff menu.")), (NetworkUser u) -> - // Delete this gui. - this.delete(); - u.staffGui = null; - - // Switch to staff menu. - u.staffGui = new StaffGui(u); - u.staffGui.open(u.player); - }); - } + { - public void refresh() { + // Delete this gui. + this.delete(); + u.staffGui = null; - this.clearGui(); - createGui(); + // Switch to staff menu. + u.staffGui = new StaffGui(provider, u); + u.staffGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java index ac6f0181..5c76c2be 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ManageRegion.java @@ -1,73 +1,63 @@ package net.bteuk.network.gui.staff; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionStatus; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.RegionStatus; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class ManageRegion extends Gui { +public class ManageRegion extends NetworkRefreshableGui { private final Region region; private final NetworkUser user; + private final RegionManager regionManager; - public ManageRegion(NetworkUser user, Region region) { - - super(9, Component.text("Manage Region", NamedTextColor.AQUA, TextDecoration.BOLD)); + public ManageRegion(GuiProvider provider, NetworkUser user, Region region) { + super(provider, 9, Component.text("Manage Region", NamedTextColor.AQUA, TextDecoration.BOLD)); this.region = region; this.user = user; - - createGui(); + this.regionManager = provider.regionManager(); } - private void createGui() { + protected void createGui() { - setItem(0, Utils.createItem(Material.ENCHANTED_BOOK, 1, - Utils.title("Region " + region.regionName()), - Utils.line("Current owner: ") - .append(Component.text(region.ownerName(), NamedTextColor.GRAY)), - Utils.line("Number of members: ") - .append(Component.text(region.memberCount(), NamedTextColor.GRAY)), - Utils.line("Region status: ") - .append(Component.text(region.status().label, NamedTextColor.GRAY)))); + setItem(0, Utils.createItem(Material.ENCHANTED_BOOK, 1, Utils.title("Region " + region.regionName()), + Utils.line("Current owner: ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), + Utils.line("Number of members: ").append(Component.text(regionManager.memberCount(region), NamedTextColor.GRAY)), + Utils.line("Region status: ").append(Component.text(regionManager.status(region).label, NamedTextColor.GRAY)))); - // Set public if status is default or inactive. - // Set private if status is public. + // Set public if the status is default or inactive. + // Set private if the status is public. if (user.player.hasPermission("uknet.regions.manage.public")) { - if (region.status() == RegionStatus.DEFAULT || region.status() == RegionStatus.INACTIVE) { + if (regionManager.status(region) == RegionStatus.DEFAULT || regionManager.status(region) == RegionStatus.INACTIVE) { - setItem(2, Utils.createItem(Material.OAK_DOOR, 1, - Utils.title("Make region public"), - Utils.line("A public region allows members"), - Utils.line("to join without needing"), - Utils.line("the owner to accept it.")), + setItem(2, Utils.createItem(Material.OAK_DOOR, 1, Utils.title("Make region public"), Utils.line("A public region allows members"), + Utils.line("to join without needing"), Utils.line("the owner to accept it.")), (NetworkUser u) -> { - region.setPublic(); - u.player.sendMessage(ChatUtils.success("Set region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + regionManager.setPublic(region); + u.player.sendMessage(ChatUtils.success("Set region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" to public."))); this.refresh(); }); - } else if (region.status() == RegionStatus.PUBLIC) { + } else if (regionManager.status(region) == RegionStatus.PUBLIC) { - setItem(2, Utils.createItem(Material.IRON_DOOR, 1, - Utils.title("Make region private"), - Utils.line("The default region setting,"), - Utils.line("joining requires the owner"), - Utils.line("to accept the request.")), + setItem(2, Utils.createItem(Material.IRON_DOOR, 1, Utils.title("Make region private"), Utils.line("The default region setting,"), + Utils.line("joining requires the owner"), Utils.line("to accept the request.")), (NetworkUser u) -> { - region.setDefault(); - u.player.sendMessage(ChatUtils.success("Set region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + regionManager.setDefault(region); + u.player.sendMessage(ChatUtils.success("Set region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" to default."))); this.refresh(); }); @@ -76,90 +66,73 @@ private void createGui() { // Transfer ownership if status is default or public, must have at least 1 member. if (user.player.hasPermission("uknet.regions.manage.owner")) { - if (region.hasMember()) { + if (regionManager.hasMember(region)) { // Slot 5 - setItem(5, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, - Utils.title("Transfer Ownership"), - Utils.line("Open the transfer ownership menu."), - Utils.line("Allows you to make a member"), - Utils.line("the new region owner.")), + setItem(5, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Transfer Ownership"), Utils.line("Open the transfer ownership menu."), + Utils.line("Allows you to make a member"), Utils.line("the new region owner.")), (NetworkUser u) -> { // Close this menu. this.delete(); - u.staffGui = null; - // Open transfer owner menu. - u.staffGui = new TransferOwner(region); + // Open the transfer owner menu. + u.staffGui = new TransferOwner(provider, region); u.staffGui.open(u.player); }); } } - // Kick members, must have owner and/or members. + // Kick members; must have an owner and/or members. if (user.player.hasPermission("uknet.regions.manage.kick")) { - if (region.hasOwner() || region.hasMember()) { + if (regionManager.hasOwner(region) || regionManager.hasMember(region)) { // Slot 6 - setItem(6, Utils.createItem(Material.BARRIER, 1, - Utils.title("Kick Members"), - Utils.line("Remove any current members,"), - Utils.line("or the owner from the region.")), + setItem(6, Utils.createItem(Material.BARRIER, 1, Utils.title("Kick Members"), Utils.line("Remove any current members,"), + Utils.line("or the owner from the regionManager.")), (NetworkUser u) -> { - (NetworkUser u) -> { - - // Close this menu. - this.delete(); - u.staffGui = null; + // Close this menu. + this.delete(); - // Open transfer owner menu. - u.staffGui = new KickMembers(region); - u.staffGui.open(u.player); - }); + // Open the transfer owner menu. + u.staffGui = new KickMembers(provider, region); + u.staffGui.open(u.player); + }); } } - // Set region locked if region is default, public, open or inactive. - // Set region unlocked if region is locked. + // Set region locked if the region is default, public, open or inactive. + // Set region unlocked if the region is locked. if (user.player.hasPermission("uknet.regions.manage.lock")) { - if (region.status() == RegionStatus.DEFAULT || region.status() == RegionStatus.PUBLIC || region.status() == RegionStatus.OPEN || region.status() == RegionStatus.INACTIVE) { + if (regionManager.status(region) == RegionStatus.DEFAULT || regionManager.status(region) == RegionStatus.PUBLIC || regionManager.status( + region) == RegionStatus.OPEN || regionManager.status(region) == RegionStatus.INACTIVE) { - setItem(4, Utils.createItem(Material.IRON_TRAPDOOR, 1, - Utils.title("Lock Region"), - Utils.line("Locking a region stops anyone"), - Utils.line("from joining or building in the"), - Utils.line("region, any existing members"), - Utils.line("will be kicked")), + setItem(4, Utils.createItem(Material.IRON_TRAPDOOR, 1, Utils.title("Lock Region"), Utils.line("Locking a region stops anyone"), + Utils.line("from joining or building in the"), Utils.line("region, any existing members"), Utils.line("will be kicked")), (NetworkUser u) -> { - // If region is currently open, remove jrbuilder group. - if (region.status() == RegionStatus.OPEN) { - region.setDefault("jrbuilder"); + // If the region is currently open, remove the jrbuilder group. + if (regionManager.status(region) == RegionStatus.OPEN) { + regionManager.setDefault(region, "jrbuilder"); } - region.setLocked(); - u.player.sendMessage(ChatUtils.success("Set Region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + regionManager.setLocked(region); + u.player.sendMessage(ChatUtils.success("Set Region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" to locked."))); this.refresh(); }); - } else if (region.status() == RegionStatus.LOCKED) { + } else if (regionManager.status(region) == RegionStatus.LOCKED) { - setItem(4, Utils.createItem(Material.OAK_TRAPDOOR, 1, - Utils.title("Unlock Region"), - Utils.line("The default region setting,"), - Utils.line("people will be able to join"), - Utils.line("and build in the region again.")), + setItem(4, Utils.createItem(Material.OAK_TRAPDOOR, 1, Utils.title("Unlock Region"), Utils.line("The default region setting,"), + Utils.line("people will be able to join"), Utils.line("and build in the region again.")), (NetworkUser u) -> { - region.setDefault(); - u.player.sendMessage(ChatUtils.success("Set region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + regionManager.setDefault(region); + u.player.sendMessage(ChatUtils.success("Set region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" to default."))); this.refresh(); }); @@ -169,59 +142,41 @@ private void createGui() { // Set region open if status is default, public or inactive. // Set region default if status is open. if (user.player.hasPermission("uknet.regions.manage.open")) { - if (region.status() == RegionStatus.DEFAULT || region.status() == RegionStatus.PUBLIC || region.status() == RegionStatus.INACTIVE) { + if (regionManager.status(region) == RegionStatus.DEFAULT || regionManager.status(region) == RegionStatus.PUBLIC || regionManager.status( + region) == RegionStatus.INACTIVE) { - setItem(3, Utils.createItem(Material.OAK_FENCE_GATE, 1, - Utils.title("Make region open"), - Utils.line("An open region allows all"), - Utils.line("Jr.Builder+ to build without"), - Utils.line("needing to join the region."), - Utils.line("Any existing members will be kicked.")), + setItem(3, Utils.createItem(Material.OAK_FENCE_GATE, 1, Utils.title("Make region open"), Utils.line("An open region allows all"), + Utils.line("Jr.Builder+ to build without"), Utils.line("needing to join the regionManager."), Utils.line("Any existing members will be kicked.")), (NetworkUser u) -> { - region.setOpen(); - u.player.sendMessage(ChatUtils.success("Set region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" to open."))); + regionManager.setOpen(region); + u.player.sendMessage( + ChatUtils.success("Set region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)).append(ChatUtils.success(" to open."))); this.refresh(); }); - } else if (region.status() == RegionStatus.OPEN) { + } else if (regionManager.status(region) == RegionStatus.OPEN) { - setItem(3, Utils.createItem(Material.OAK_FENCE, 1, - Utils.title("Make region closed"), - Utils.line("The default region setting,"), - Utils.line("people will again be required"), - Utils.line("to join the region to build.")), + setItem(3, Utils.createItem(Material.OAK_FENCE, 1, Utils.title("Make region closed"), Utils.line("The default region setting,"), + Utils.line("people will again be required"), Utils.line("to join the region to build.")), (NetworkUser u) -> { - region.setDefault("jrbuilder"); - u.player.sendMessage(ChatUtils.success("Set region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + regionManager.setDefault(region, "jrbuilder"); + u.player.sendMessage(ChatUtils.success("Set region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" to default."))); this.refresh(); }); } } - setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Previous Page"), - Utils.line("Open the staff menu.")), - (NetworkUser u) -> - - { - - // Return to request menu. - this.delete(); - u.staffGui = null; - - u.staffGui = new StaffGui(u); - u.staffGui.open(u.player); - }); - } + setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the staff menu.")), (NetworkUser u) -> + { - public void refresh() { + // Return to the staff menu. + this.delete(); + u.staffGui = null; - this.clearGui(); - createGui(); + u.staffGui = new StaffGui(provider, u); + u.staffGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java index aac5f0fe..d279f35c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java @@ -2,10 +2,12 @@ import lombok.Getter; import lombok.Setter; -import net.bteuk.network.Network; +import net.bteuk.network.core.Time; import net.bteuk.network.eventing.listeners.staff.ModerationReasonListener; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Time; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.ModerationType; import net.kyori.adventure.text.Component; @@ -17,7 +19,7 @@ import static net.bteuk.network.utils.enums.ModerationType.BAN; -public class ModerationActionGui extends Gui { +public class ModerationActionGui extends NetworkRefreshableGui { @Getter private final ModerationType type; @@ -32,19 +34,16 @@ public class ModerationActionGui extends Gui { private int months = 0; private int years = 0; - public ModerationActionGui(ModerationType type, String uuid) { - - super(9, Component.text(type.label + " Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + public ModerationActionGui(GuiProvider provider, ModerationType type, String uuid) { + super(provider, 9, Component.text(type.label + " Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.type = type; this.uuid = uuid; - name = Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';"); - - createGui(); + name = provider.globalSQL().getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';"); } - private void createGui() { + protected void createGui() { // Unregister the listener if it has not been already. if (reasonListener != null) { @@ -57,37 +56,38 @@ private void createGui() { case KICK -> // Kick - setItem(0, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Kick " + name), Utils.line("Kick the player with the specified reason.")), (NetworkUser u) -> { + setItem(0, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Kick " + name), Utils.line("Kick the player with the specified reason.")), + (NetworkUser u) -> { - // If a reason has been set, kick the user, if they're still online. - if (Network.getInstance().isOnlineOnNetwork(uuid)) { - if (reason != null) { + // If a reason has been set, kick the user, if they're still online. + if (provider.instance().isOnlineOnNetwork(uuid)) { + if (reason != null) { - // Kick the user. - u.player.sendMessage(Network.getInstance().getKick().kickPlayer(name, uuid, reason)); + // Kick the user. + u.player.sendMessage(provider.moderation().kickPlayer(name, uuid, reason)); - // Close inventory and clear gui (this means it'll open as a staff menu next - // time). - this.delete(); - u.staffGui = null; + // Close inventory and clear gui (this means it'll open as a staff menu next + // time). + this.delete(); + u.staffGui = null; - u.player.closeInventory(); - } else { + u.player.closeInventory(); + } else { - u.player.sendMessage(ChatUtils.error("You must provide a reason to kick someone.")); - u.player.closeInventory(); - } - } else { + u.player.sendMessage(ChatUtils.error("You must provide a reason to kick someone.")); + u.player.closeInventory(); + } + } else { - u.player.sendMessage(Component.text(name, NamedTextColor.DARK_RED).append(ChatUtils.error(" is no longer online."))); + u.player.sendMessage(Component.text(name, NamedTextColor.DARK_RED).append(ChatUtils.error(" is no longer online."))); - // Close inventory and clear gui (this means it'll open as a staff menu next time). - this.delete(); - u.staffGui = null; + // Close inventory and clear gui (this means it'll open as a staff menu next time). + this.delete(); + u.staffGui = null; - u.player.closeInventory(); - } - }); + u.player.closeInventory(); + } + }); case BAN, MUTE -> { @@ -97,7 +97,7 @@ private void createGui() { hours = (hours == 24) ? 0 : hours + 1; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); + updatePlayerInventory(u.player); }); setItem(4, Utils.createItem((days == 0) ? Material.BARRIER : Material.CLOCK, (days == 0) ? 1 : days, Utils.title("Days"), @@ -105,7 +105,7 @@ private void createGui() { days = (days == 30) ? 0 : days + 1; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); + updatePlayerInventory(u.player); }); setItem(5, Utils.createItem((months == 0) ? Material.BARRIER : Material.CLOCK, (months == 0) ? 1 : months, Utils.title("Months"), @@ -113,7 +113,7 @@ private void createGui() { months = (months == 12) ? 0 : months + 1; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); + updatePlayerInventory(u.player); }); setItem(6, Utils.createItem((years == 0) ? Material.BARRIER : Material.CLOCK, (years == 0) ? 1 : years, Utils.title("Years"), @@ -121,7 +121,7 @@ private void createGui() { years = (years == 5) ? 0 : years + 1; this.refresh(); - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); + updatePlayerInventory(u.player); }); // Ban/Mute @@ -140,11 +140,11 @@ private void createGui() { if (type == BAN) { // Ban the user. - u.player.sendMessage(Network.getInstance().getBan().banPlayer(name, uuid, end_time, reason)); + u.player.sendMessage(provider.moderation().banPlayer(name, uuid, end_time, reason)); } else { // Mute the user. - u.player.sendMessage(Network.getInstance().getMute().mutePlayer(name, uuid, end_time, reason)); + u.player.sendMessage(provider.moderation().mutePlayer(name, uuid, end_time, reason)); } // Close inventory and clear gui (this means it'll open as a staff menu next time). @@ -169,9 +169,7 @@ private void createGui() { // Set reason setItem(2, Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Reason"), Utils.line("Click to write the reason in chat."), Utils.line("Your first chat message will be set as reason."), Utils.line("If you don't type anything within 1 minute"), - Utils.line("the action gets " + "cancelled.")), (NetworkUser u) -> - - { + Utils.line("the action gets " + "cancelled.")), (NetworkUser u) -> { // Prompt the user for a reason. reasonListener = new ModerationReasonListener(u, this); @@ -180,21 +178,12 @@ private void createGui() { u.player.sendMessage(ChatUtils.success("Please write the reason in chat, the first message counts" + ".")); }); - // Return to select user menu. - setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the select user menu.")), (NetworkUser u) -> - - { + setItem(8, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the select user menu.")), (NetworkUser u) -> { - // Return to request menu. + // Return to the select user menu. this.delete(); - u.staffGui = new SelectUser(type); + u.staffGui = new SelectUser(provider, type); u.staffGui.open(u.player); }); } - - public void refresh() { - - this.clearGui(); - createGui(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java index 66711aa6..09658d70 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java @@ -1,5 +1,7 @@ package net.bteuk.network.gui.staff; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.ModerationType; @@ -8,96 +10,69 @@ import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -public class ModerationGui extends Gui { +public class ModerationGui extends NetworkRefreshableGui { - public ModerationGui() { - - super(27, Component.text("Moderation Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); - - createGui(); + public ModerationGui(GuiProvider provider) { + super(provider, 27, Component.text("Moderation Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); } - private void createGui() { + protected void createGui() { // Ban - setItem(10, Utils.createCustomSkullWithFallback( - "30506c52de360dfaec1b84998ba060fa6ce12be818fc13edc5db7a7921a35d7e", Material.REDSTONE_BLOCK, 1, - Utils.title("Ban"), - Utils.line("Click to select an online user to ban.")), - (NetworkUser u) -> { + setItem(10, Utils.createCustomSkullWithFallback("30506c52de360dfaec1b84998ba060fa6ce12be818fc13edc5db7a7921a35d7e", Material.REDSTONE_BLOCK, 1, Utils.title("Ban"), + Utils.line("Click to select an online user to ban.")), (NetworkUser u) -> { - if (u.hasPermission("uknet.ban")) { - openSelectUser(u, ModerationType.BAN); - } - }); + if (u.hasPermission("uknet.ban")) { + openSelectUser(u, ModerationType.BAN); + } + }); // Unban - setItem(15, Utils.createCustomSkullWithFallback( - "c2abe43288a6c8cd76d0228f39112d2520c289d7c15c6aafe0c532ad9f5db9ad", Material.REDSTONE_BLOCK, 1, - Utils.title("Unban"), - Utils.line("Click to select a banned user to unban.")), - (NetworkUser u) -> { + setItem(15, Utils.createCustomSkullWithFallback("c2abe43288a6c8cd76d0228f39112d2520c289d7c15c6aafe0c532ad9f5db9ad", Material.REDSTONE_BLOCK, 1, Utils.title("Unban"), + Utils.line("Click to select a banned user to unban.")), (NetworkUser u) -> { - if (u.hasPermission("uknet.ban")) { - openSelectUser(u, ModerationType.UNBAN); - } - }); + if (u.hasPermission("uknet.ban")) { + openSelectUser(u, ModerationType.UNBAN); + } + }); // Mute - setItem(11, Utils.createCustomSkullWithFallback( - "4f130f485c3f7697f320ddc1128cd3f17cdbd3791764f7a7bb95cf252738588", Material.REDSTONE_BLOCK, 1, - Utils.title("Mute"), - Utils.line("Click to select an online user to mute.")), - (NetworkUser u) -> { + setItem(11, Utils.createCustomSkullWithFallback("4f130f485c3f7697f320ddc1128cd3f17cdbd3791764f7a7bb95cf252738588", Material.REDSTONE_BLOCK, 1, Utils.title("Mute"), + Utils.line("Click to select an online user to mute.")), (NetworkUser u) -> { - if (u.hasPermission("uknet.mute")) { - openSelectUser(u, ModerationType.MUTE); - } - }); + if (u.hasPermission("uknet.mute")) { + openSelectUser(u, ModerationType.MUTE); + } + }); // Unmute - setItem(16, Utils.createCustomSkullWithFallback( - "f81422e8ddc0d3109aa657b89b0b0eb1d25cb3bc8d54dc6c99c3c9c081440254", Material.REDSTONE_BLOCK, 1, - Utils.title("Unmute"), - Utils.line("Click to select a muted user to unmute.")), - (NetworkUser u) -> { + setItem(16, Utils.createCustomSkullWithFallback("f81422e8ddc0d3109aa657b89b0b0eb1d25cb3bc8d54dc6c99c3c9c081440254", Material.REDSTONE_BLOCK, 1, Utils.title("Unmute"), + Utils.line("Click to select a muted user to unmute.")), (NetworkUser u) -> { - if (u.hasPermission("uknet.mute")) { - openSelectUser(u, ModerationType.UNMUTE); - } - }); + if (u.hasPermission("uknet.mute")) { + openSelectUser(u, ModerationType.UNMUTE); + } + }); // Kick - setItem(13, Utils.createCustomSkullWithFallback( - "5ae0e486db4ec49ff1b52cfeceda4c3f36fde23c835ea3ccfcaac935e49b5f10", Material.REDSTONE_BLOCK, 1, - Utils.title("Kick"), - Utils.line("Click to select an online user to kick.")), - (NetworkUser u) -> { - - if (u.hasPermission("uknet.kick")) { - openSelectUser(u, ModerationType.KICK); - } - }); - - // Return to moderation menu. - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Previous Page"), - Utils.line("Open the staff menu.")), - (NetworkUser u) -> - - { - - // Return to request menu. - this.delete(); - u.staffGui = new StaffGui(u); - u.staffGui.open(u.player); - }); - } + setItem(13, Utils.createCustomSkullWithFallback("5ae0e486db4ec49ff1b52cfeceda4c3f36fde23c835ea3ccfcaac935e49b5f10", Material.REDSTONE_BLOCK, 1, Utils.title("Kick"), + Utils.line("Click to select an online user to kick.")), (NetworkUser u) -> { + + if (u.hasPermission("uknet.kick")) { + openSelectUser(u, ModerationType.KICK); + } + }); + + // Return to the staff menu. + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the staff menu.")), (NetworkUser u) -> - public void refresh() { + { - this.clearGui(); - createGui(); + // Return to the staff menu. + this.delete(); + u.staffGui = new StaffGui(provider, u); + u.staffGui.open(u.player); + }); } private void openSelectUser(NetworkUser u, ModerationType type) { @@ -105,7 +80,7 @@ private void openSelectUser(NetworkUser u, ModerationType type) { // Switch to the select user menu. this.delete(); - u.staffGui = new SelectUser(type); + u.staffGui = new SelectUser(provider, type); u.staffGui.open(u.player); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java index 7b0d62e2..7c382997 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java @@ -1,9 +1,11 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.Network; +import net.bteuk.network.core.Time; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.Time; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.ModerationType; import net.kyori.adventure.text.Component; @@ -15,51 +17,40 @@ import java.util.Locale; import static net.bteuk.network.utils.enums.ModerationType.UNBAN; -import static net.bteuk.network.utils.enums.ModerationType.UNMUTE; -public class SelectUser extends Gui { +public class SelectUser extends NetworkRefreshableGui { - List users; + private List users; - ModerationType type; + private final ModerationType type; - int page; + private int page; - GlobalSQL globalSQL; + private final GlobalSQL globalSQL; - public SelectUser(ModerationType type) { + public SelectUser(GuiProvider provider, ModerationType type) { - super(45, Component.text("Select User for " + type.label, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Select User for " + type.label, NamedTextColor.AQUA, TextDecoration.BOLD)); this.type = type; - - globalSQL = Network.getInstance().getGlobalSQL(); + this.globalSQL = provider.globalSQL(); // Select all the players to show in the menu depending on the ModerationType. switch (type) { case BAN, MUTE, KICK -> - // Get online users. - users = Network.getInstance().getOnlineUsers().stream().map(OnlineUser::getUuid).toList(); - + users = provider.instance().getOnlineUsers().stream().map(OnlineUser::getUuid).toList(); case UNBAN -> - // Get banned users. - users = globalSQL.getStringList( - "SELECT uuid FROM moderation WHERE end_time>" + Time.currentTime() + " AND type='ban'"); - + users = globalSQL.getStringList("SELECT uuid FROM moderation WHERE end_time>" + Time.currentTime() + " AND type='ban'"); case UNMUTE -> - // Get muted users. - users = globalSQL.getStringList( - "SELECT uuid FROM moderation WHERE end_time>" + Time.currentTime() + " AND type='mute'"); + users = globalSQL.getStringList("SELECT uuid FROM moderation WHERE end_time>" + Time.currentTime() + " AND type='mute'"); } - - createGui(); } - private void createGui() { + protected void createGui() { // Slot count. int slot = 10; @@ -67,20 +58,15 @@ private void createGui() { // Skip count. int skip = 21 * (page - 1); - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of regions.")), - (NetworkUser u) -> - - { - - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of regions.")), (NetworkUser u) -> { + + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Make a button for each user. @@ -95,19 +81,13 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of users.")), - (NetworkUser u) -> - - { + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of users.")), (NetworkUser u) -> { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -123,23 +103,19 @@ private void createGui() { switch (type) { case BAN, MUTE, KICK -> // Ban/mute/kick the player. - setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.RED_CONCRETE, 1, - Utils.title(type.label + " " + name), - Utils.line("Opens the " + type.label.toLowerCase(Locale.ROOT) + " menu to set" + - " the parameters.")), - (NetworkUser u) -> + setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.RED_CONCRETE, 1, Utils.title(type.label + " " + name), + Utils.line("Opens the " + type.label.toLowerCase(Locale.ROOT) + " menu to set" + " the parameters.")), (NetworkUser u) -> - { + { - // Open the kick menu. - this.delete(); - u.staffGui = new ModerationActionGui(type, uuid); - u.staffGui.open(u.player); - }); + // Open the kick menu. + this.delete(); + u.staffGui = new ModerationActionGui(provider, type, uuid); + u.staffGui.open(u.player); + }); case UNBAN, UNMUTE -> // Unban/unmute the player. - setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.LIME_CONCRETE, 1, - Utils.title(type.label + " " + name), + setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.LIME_CONCRETE, 1, Utils.title(type.label + " " + name), Utils.line(type.label + " the player immediately.")), (NetworkUser u) -> { @@ -147,14 +123,11 @@ private void createGui() { u.player.closeInventory(); if (type == UNBAN) { - // Unban the player. - u.player.sendMessage(Network.getInstance().getUnban().unbanPlayer(name, uuid)); - } else if (type == UNMUTE) { - + u.player.sendMessage(provider.moderation().unbanPlayer(name, uuid)); + } else { // Unmute the player. - u.player.sendMessage(Network.getInstance().getUnmute().unmutePlayer(name, - uuid)); + u.player.sendMessage(provider.moderation().unmutePlayer(name, uuid)); } // Delete the gui and remove it from the user. @@ -163,7 +136,7 @@ private void createGui() { }); } - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -173,25 +146,14 @@ private void createGui() { } } - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Previous Page"), - Utils.line("Open the moderation menu.")), - (NetworkUser u) -> - - { - - // Return to request menu. - this.delete(); - u.staffGui = null; - - u.staffGui = new ModerationGui(); - u.staffGui.open(u.player); - }); - } + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Previous Page"), Utils.line("Open the moderation menu.")), (NetworkUser u) -> { - public void refresh() { + // Return to the moderation menu. + this.delete(); + u.staffGui = null; - this.clearGui(); - createGui(); + u.staffGui = new ModerationGui(provider); + u.staffGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index 761f1ba4..f8897886 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -1,11 +1,13 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.regions.ReviewRegionRequests; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.RegionUser; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.plotsystem.SubmittedPlot; import net.kyori.adventure.text.Component; @@ -15,303 +17,259 @@ import java.util.Comparator; import java.util.List; +import java.util.Optional; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - -public class StaffGui extends Gui { +public class StaffGui extends NetworkRefreshableGui { private final NetworkUser user; + private final Constants constants; - public StaffGui(NetworkUser user) { + public StaffGui(GuiProvider provider, NetworkUser user) { - super(27, Component.text("Staff Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Staff Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.user = user; - - createGui(); + this.constants = provider.constants(); } - private void createGui() { - - // Check if any location requests exist. - // To make sure the string makes grammatical sense we check if the number is 1, in this case we change 'are' - // to 'is'. - int lRequestCount = Network.getInstance().getGlobalSQL().getInt("SELECT COUNT(location) FROM " + - "location_requests"); - Component lRequestString; - if (lRequestCount == 1) { - lRequestString = Utils.line("There is currently ") - .append(Component.text(1, NamedTextColor.GRAY)) - .append(Utils.line(" location request.")); - } else { - lRequestString = Utils.line("There are currently ") - .append(Component.text(lRequestCount, NamedTextColor.GRAY)) - .append(Utils.line(" location requests.")); - } - - // Create item. - setItem(25, Utils.createItem(Material.ENDER_CHEST, 1, - Utils.title("Location Requests"), - Utils.line("Opens a menu to view all location requests for navigation."), - lRequestString), - (NetworkUser u) -> { - - // Check if the user has the relevant permissions. - if (Network.getInstance().getGlobalSQL() - .getInt("SELECT COUNT(location) FROM location_requests") > 0) { - if (u.player.hasPermission("uknet.navigation.review")) { - - // Open the LocationRequest gui. - this.delete(); - u.staffGui = null; + protected void createGui() { + + if (constants.warpsEnabled()) { + // Check if any location requests exist. + // To make sure the string makes grammatical sense, we check if the number is 1, in this case we change 'are' + // to 'is'. + int lRequestCount = provider.globalSQL().getInt("SELECT COUNT(location) FROM " + "location_requests"); + Component lRequestString; + if (lRequestCount == 1) { + lRequestString = Utils.line("There is currently ").append(Component.text(1, NamedTextColor.GRAY)).append(Utils.line(" location request.")); + } else { + lRequestString = Utils.line("There are currently ").append(Component.text(lRequestCount, NamedTextColor.GRAY)).append(Utils.line(" location requests.")); + } + + // Create item. + setItem(25, Utils.createItem(Material.ENDER_CHEST, 1, Utils.title("Location Requests"), Utils.line("Opens a menu to view all location requests for navigation."), + lRequestString), (NetworkUser u) -> { + + // Check if the user has the relevant permissions. + if (provider.globalSQL().getInt("SELECT COUNT(location) FROM location_requests") > 0) { + if (u.player.hasPermission("uknet.navigation.review")) { + + // Open the LocationRequest gui. + this.delete(); + u.staffGui = null; - u.staffGui = new LocationRequests(); - u.staffGui.open(u.player); - } else { - u.player.sendMessage(ChatUtils.error("You must be a reviewer to review location requests" + - ".")); - } + u.staffGui = new LocationRequests(provider); + u.staffGui.open(u.player); } else { - u.player.sendMessage(ChatUtils.error("There are currently no location requests.")); + u.player.sendMessage(ChatUtils.error("You must be a reviewer to review location requests" + ".")); } - }); + } else { + u.player.sendMessage(ChatUtils.error("There are currently no location requests.")); + } + }); + } + if (constants.regionsEnabled()) { /* - Click to open menu to edit region details. + Click to open the menu to edit region details. Event team: Make any region open or public. Moderators: - Remove people from regions, or transfer ownership. + Remove people from regions or transfer ownership. Lock regions. */ - // If player is in a region show manage region, else show no region. - if (user.inRegion) { + // If the player is in a region, show manage region, else show no region. + Optional optionalRegionUser = provider.regionManager().getUserByPlayer(user.player); + if (optionalRegionUser.isPresent() && optionalRegionUser.get().hasTrackedRegion()) { + RegionUser regionUser = optionalRegionUser.get(); - setItem(3, Utils.createItem(Material.ANVIL, 1, - Utils.title("Manage Region " + user.region.regionName()), - Utils.line("Opens a menu to manage details of the region you are currently in.")), - (NetworkUser u) -> + setItem(3, Utils.createItem(Material.ANVIL, 1, Utils.title("Manage Region " + regionUser.getTrackedRegion().regionName()), + Utils.line("Opens a menu to manage details of the region you are currently in.")), (NetworkUser u) -> - { + { - // Check if the user has the relevant permissions. - if (u.player.hasPermission("uknet.regions.manage")) { + // Check if the user has the relevant permissions. + if (u.player.hasPermission("uknet.regions.manage")) { - if (u.inRegion) { - // Open manage region menu - this.delete(); - u.staffGui = new ManageRegion(u, u.region); - u.staffGui.open(u.player); - } + if (regionUser.hasTrackedRegion()) { + // Open manage region menu + this.delete(); + u.staffGui = new ManageRegion(provider, u, regionUser.getTrackedRegion()); + u.staffGui.open(u.player); } + } - // Check if the user is in a region. - - // Manage Region Menu. - - }); - } else { - - setItem(3, Utils.createItem(Material.STRUCTURE_VOID, 1, - Utils.title("No Region"), - Utils.line("You are currently not standing in a valid region."), - Utils.line("This is likely due to being in a lobby."))); - } - - // Click to open menu to deal with region join requests. - // Can only click on this if requests exist and player is a reviewer. - // Check if any location requests exist. - // To make sure the string makes grammatical sense we check if the number is 1, in this case we change 'are' - // to 'is'. - int rRequestCount = Network.getInstance().regionSQL.getInt("SELECT COUNT(region) FROM region_requests WHERE " + - "staff_accept=0"); - Component rRequestString; - if (rRequestCount == 1) { - rRequestString = Utils.line("There is currently ") - .append(Component.text(1, NamedTextColor.GRAY)) - .append(Utils.line(" region join request by Jr.Builders.")); - } else { - rRequestString = Utils.line("There are currently ") - .append(Component.text(rRequestCount, NamedTextColor.GRAY)) - .append(Utils.line(" region join requests by Jr.Builders.")); - } - - setItem(19, Utils.createItem(Material.CHEST_MINECART, 1, - Utils.title("Review Region Requests"), - Utils.line("Opens a menu to review active region join requests by Jr.Builders."), - rRequestString), - (NetworkUser u) -> { + // Check if the user is in a region. - if (Network.getInstance().regionSQL.hasRow("SELECT region FROM region_requests WHERE " + - "staff_accept=0;")) { - if (u.player.hasPermission("uknet.regions.request")) { + // Manage Region Menu. - // Open region request menu. - this.delete(); - u.staffGui = null; + }); + } else { + + setItem(3, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("No Region"), Utils.line("You are currently not standing in a valid region."), + Utils.line("This is likely due to being in a lobby."))); + } + + // Click to open menu to deal with region join requests. + // Can only click on this if requests exist and player is a reviewer. + // Check if any location requests exist. + // To make sure the string makes grammatical sense we check if the number is 1, in this case we change 'are' + // to 'is'. + int rRequestCount = provider.regionSQL().getInt("SELECT COUNT(region) FROM region_requests WHERE " + "staff_accept=0"); + Component rRequestString; + if (rRequestCount == 1) { + rRequestString = Utils.line("There is currently ").append(Component.text(1, NamedTextColor.GRAY)).append(Utils.line(" region join request by Jr.Builders.")); + } else { + rRequestString = Utils.line("There are currently ").append(Component.text(rRequestCount, NamedTextColor.GRAY)) + .append(Utils.line(" region join requests by Jr.Builders.")); + } + + setItem(19, Utils.createItem(Material.CHEST_MINECART, 1, Utils.title("Review Region Requests"), + Utils.line("Opens a menu to review active region join requests by Jr.Builders."), rRequestString), (NetworkUser u) -> { + + if (provider.regionSQL().hasRow("SELECT region FROM region_requests WHERE " + "staff_accept=0;")) { + if (u.player.hasPermission("uknet.regions.request")) { + + // Open region request menu. + this.delete(); + u.staffGui = null; - u.staffGui = new ReviewRegionRequests(true, u.player.getUniqueId().toString()); - u.staffGui.open(u.player); - } else { - u.player.sendMessage(ChatUtils.error("You must be a reviewer to review region requests.")); - } + u.staffGui = new ReviewRegionRequests(provider, true, u.player.getUniqueId().toString()); + u.staffGui.open(u.player); } else { - u.player.sendMessage(ChatUtils.error("There are currently no region requests.")); + u.player.sendMessage(ChatUtils.error("You must be a reviewer to review region requests.")); } - }); - - // Click to review plot. - // Show review plot button in gui. - boolean isArchitect = user.hasPermission("group.architect"); - boolean isReviewer = user.hasPermission("group.reviewer"); - int reviewCount = - Network.getInstance().getPlotSQL().getReviewablePlotCount(user.player.getUniqueId().toString(), - isArchitect, isReviewer); - Component plotReviewMessage; - - if (reviewCount == 1) { - plotReviewMessage = Utils.line("There is currently ") - .append(Component.text("1", NamedTextColor.GRAY)) - .append(Utils.line(" submitted plot.")); - } else { - plotReviewMessage = Utils.line("There are currently ") - .append(Component.text(reviewCount, NamedTextColor.GRAY)) - .append(Utils.line(" submitted plots.")); + } else { + u.player.sendMessage(ChatUtils.error("There are currently no region requests.")); + } + }); } - setItem(21, Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title("Review Plot"), - Utils.line("Click to review a submitted plot."), - plotReviewMessage), - (NetworkUser u) -> { - - // Get arraylist of submitted plots. - // Order them by submit time, so the oldest submissions are reviewed first. - List nPlots = Network.getInstance().getPlotSQL().getReviewablePlots(u.player.getUniqueId().toString(), isArchitect, isReviewer); - nPlots.sort(Comparator.comparingLong(SubmittedPlot::submitTime)); - - // Check if there is a plot available to review, - // that you are not already the owner or member of. - if (!nPlots.isEmpty()) { - - int plotID = nPlots.getFirst().id(); - - // Get server of plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + - "location_data WHERE name='" + - Network.getInstance().getPlotSQL().getString("SELECT location FROM plot_data WHERE " + - "id=" + plotID + ";") + "';"); - - // If they are not in the same server as the plot teleport them to that server and start the - // reviewing process. - if (server.equals(SERVER_NAME)) { - u.player.closeInventory(); - EventManager.createEvent(u.getUuid(), "plotsystem", SERVER_NAME, "review plot " + plotID); + if (constants.plotSystemEnabled()) { + // Click to review a plot. + // Show the review plot button in gui. + boolean isArchitect = user.hasPermission("group.architect"); + boolean isReviewer = user.hasPermission("group.reviewer"); + int reviewCount = provider.plotSQL().getReviewablePlotCount(user.player.getUniqueId().toString(), isArchitect, isReviewer); + Component plotReviewMessage; + + if (reviewCount == 1) { + plotReviewMessage = Utils.line("There is currently ").append(Component.text("1", NamedTextColor.GRAY)).append(Utils.line(" submitted plot.")); + } else { + plotReviewMessage = Utils.line("There are currently ").append(Component.text(reviewCount, NamedTextColor.GRAY)).append(Utils.line(" submitted plots.")); + } + + setItem(21, Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Review Plot"), Utils.line("Click to review a submitted plot."), plotReviewMessage), + (NetworkUser u) -> { + + // Get an arraylist of submitted plots. + // Order them by submitted time, so the oldest submissions are reviewed first. + List nPlots = provider.plotSQL().getReviewablePlots(u.player.getUniqueId().toString(), isArchitect, isReviewer); + nPlots.sort(Comparator.comparingLong(SubmittedPlot::submitTime)); + + // Check if there is a plot available to review + // that you are not already the owner or member of. + if (!nPlots.isEmpty()) { + + int plotID = nPlots.getFirst().id(); + + // Get the server of the plot. + String server = provider.plotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + provider.plotSQL() + .getString("SELECT location FROM plot_data WHERE " + "id=" + plotID + ";") + "';"); + + // If they are not in the same server as the plot, teleport them to that server and start the + // reviewing process. + if (server.equals(constants.serverName())) { + u.player.closeInventory(); + provider.eventAPI().createEvent(u.getUuid(), "plotsystem", constants.serverName(), "review plot " + plotID); + } else { + // Player is not on the current server. + // Set the server join event. + provider.eventAPI().createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); + + // Teleport them to the server. + u.player.closeInventory(); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); + } } else { - // Player is not on the current server. - // Set the server join event. - EventManager.createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); - - // Teleport them to the server. - u.player.closeInventory(); - SwitchServer.switchServer(u.player, server); + u.player.sendMessage(ChatUtils.error("There are currently no submitted plots that you can " + "review..")); } - } else { - u.player.sendMessage(ChatUtils.error("There are currently no submitted plots that you can " + - "review..")); - } - }); + }); - int verifyCount = - Network.getInstance().getPlotSQL().getVerifiablePlotCount(user.player.getUniqueId().toString(), isReviewer); - Component plotVerifyMessage; - - if (verifyCount == 1) { - plotVerifyMessage = Utils.line("There is currently ") - .append(Component.text("1", NamedTextColor.GRAY)) - .append(Utils.line(" plot awaiting verification.")); - } else { - plotVerifyMessage = Utils.line("There are currently ") - .append(Component.text(verifyCount, NamedTextColor.GRAY)) - .append(Utils.line(" plots awaiting verification.")); - } - setItem(23, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title("Verify Plot"), - Utils.line("Click to verify a reviewed plot."), - plotVerifyMessage), - (NetworkUser u) -> + int verifyCount = provider.plotSQL().getVerifiablePlotCount(user.player.getUniqueId().toString(), isReviewer); + Component plotVerifyMessage; - { + if (verifyCount == 1) { + plotVerifyMessage = Utils.line("There is currently ").append(Component.text("1", NamedTextColor.GRAY)).append(Utils.line(" plot awaiting verification.")); + } else { + plotVerifyMessage = Utils.line("There are currently ").append(Component.text(verifyCount, NamedTextColor.GRAY)).append(Utils.line(" plots awaiting verification.")); + } + setItem(23, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title("Verify Plot"), Utils.line("Click to verify a reviewed plot."), plotVerifyMessage), + (NetworkUser u) -> - // Get arraylist of reviewed plots. - // Order them by submit time, so the oldest submissions are verified first. - List nPlots = - Network.getInstance().getPlotSQL().getVerifiablePlots(u.player.getUniqueId().toString(), - isReviewer); - - // Check if there is a plot available to review, - // that you are not already the owner or member of. - if (!nPlots.isEmpty()) { - - int plotID = nPlots.getFirst(); - - // Get server of plot. - String server = Network.getInstance().getPlotSQL().getString("SELECT server FROM " + - "location_data WHERE name='" + - Network.getInstance().getPlotSQL().getString("SELECT location FROM plot_data WHERE " + - "id=" + plotID + ";") + "';"); - - // If they are not in the same server as the plot teleport them to that server and start the - // reviewing process. - if (server.equals(SERVER_NAME)) { - u.player.closeInventory(); - EventManager.createEvent(u.getUuid(), "plotsystem", SERVER_NAME, "verify plot " + plotID); - } else { - // Player is not on the current server. - // Set the server join event. - EventManager.createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); + { - // Teleport them to the server. - u.player.closeInventory(); - SwitchServer.switchServer(u.player, server); + // Get an arraylist of reviewed plots. + // Order them by submitted time, so the oldest submissions are verified first. + List nPlots = provider.plotSQL().getVerifiablePlots(u.player.getUniqueId().toString(), isReviewer); + + // Check if there is a plot available to review, + // that you are not already the owner or member of. + if (!nPlots.isEmpty()) { + + int plotID = nPlots.getFirst(); + + // Get server of plot. + String server = provider.plotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + provider.plotSQL() + .getString("SELECT location FROM plot_data WHERE " + "id=" + plotID + ";") + "';"); + + // If they are not in the same server as the plot teleport them to that server and start the + // reviewing process. + if (server.equals(constants.serverName())) { + u.player.closeInventory(); + provider.eventAPI().createEvent(u.getUuid(), "plotsystem", constants.serverName(), "verify plot " + plotID); + } else { + // Player is not on the current server. + // Set the server join event. + provider.eventAPI().createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); + + // Teleport them to the server. + u.player.closeInventory(); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); + } + } else { + u.player.sendMessage(ChatUtils.error("There are currently no submitted plots that you can review..")); } - } else { - u.player.sendMessage(ChatUtils.error("There are currently no submitted plots that you can review..")); - } - }); + }); + } - // Click to open moderation menu. - setItem(5, Utils.createItem(Material.REDSTONE_BLOCK, 1, - Utils.title("Moderation Menu"), - Utils.line("Opens the moderation menu to deal with wrongdoers.")), - (NetworkUser u) -> + if (constants.moderationEnabled()) { - { - - // Check if the NetworkUser has any of the following permissions. - if (u.hasAnyPermission("uknet.ban", "uknet.mute", "uknet.kick")) { + // Click to open moderation menu. + setItem(5, Utils.createItem(Material.REDSTONE_BLOCK, 1, Utils.title("Moderation Menu"), Utils.line("Opens the moderation menu to deal with wrongdoers.")), + (NetworkUser u) -> - this.delete(); + { - u.staffGui = new ModerationGui(); - u.staffGui.open(u.player); - } else { + // Check if the NetworkUser has any of the following permissions. + if (u.hasAnyPermission("uknet.ban", "uknet.mute", "uknet.kick")) { - u.player.sendMessage(ChatUtils.error("You do not have permission to access the Moderation Menu.")); - // Don't close the inventory as the player could have just miss-clicked, the chat should - // still be visible either way. - // Staff users should also be aware if they have this permission beforehand. + this.delete(); - } - }); - } + u.staffGui = new ModerationGui(provider); + u.staffGui.open(u.player); + } else { - public void refresh() { + u.player.sendMessage(ChatUtils.error("You do not have permission to access the Moderation Menu.")); + // Don't close the inventory as the player could have just miss-clicked, the chat should + // still be visible either way. + // Staff users should also be aware if they have this permission beforehand. - this.clearGui(); - createGui(); + } + }); + } } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java index ac0c17aa..5172ae9e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/TransferOwner.java @@ -1,10 +1,13 @@ package net.bteuk.network.gui.staff; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Region; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -12,29 +15,29 @@ import java.util.ArrayList; -public class TransferOwner extends Gui { +public class TransferOwner extends NetworkRefreshableGui { private final Region region; private final GlobalSQL globalSQL; + private final RegionManager regionManager; private int page; - public TransferOwner(Region region) { + public TransferOwner(GuiProvider provider, Region region) { - super(45, Component.text("Transfer Ownership", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 45, Component.text("Transfer Ownership", NamedTextColor.AQUA, TextDecoration.BOLD)); this.region = region; page = 1; - globalSQL = Network.getInstance().getGlobalSQL(); - - createGui(); + this.globalSQL = provider.globalSQL(); + this.regionManager = provider.regionManager(); } - private void createGui() { + protected void createGui() { // Get all members of the region. - ArrayList region_members = region.getMembers(); + ArrayList region_members = regionManager.getMembers(region); // Slot count. int slot = 10; @@ -44,18 +47,15 @@ private void createGui() { // If page is greater than 1 add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of region members.")), - (NetworkUser u) -> + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of region members.")), (NetworkUser u) -> - { + { - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all online players. @@ -64,19 +64,15 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of region members.")), - (NetworkUser u) -> + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of region members.")), (NetworkUser u) -> - { + { - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; @@ -89,32 +85,30 @@ private void createGui() { } // Add player to gui. - setItem(slot, Utils.createPlayerSkull(uuid, 1, - Utils.title("Make " + globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " the region owner."), - Utils.line("The previous owner will be demoted to a member.")), - (NetworkUser u) -> + setItem(slot, + Utils.createPlayerSkull(uuid, 1, Utils.title("Make " + globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "';") + " the region owner."), + Utils.line("The previous owner will be demoted to a member.")), (NetworkUser u) -> { // Make the previous owner a member. - region.makeMember(); + regionManager.makeMember(region); // Give the new player ownership. - region.makeOwner(uuid); + regionManager.makeOwner(region, uuid); // Update any requests to take into account the new region owner. - region.updateRequests(); + regionManager.updateRequests(region); - // Send message to user. + // Send a message to user. u.player.sendMessage(ChatUtils.success("Transferred ownership of the region to ") - .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid " + - "='" + region.getOwner() + "';"), NamedTextColor.DARK_AQUA))); + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid " + "='" + regionManager.getOwner(region) + "';"), + NamedTextColor.DARK_AQUA))); // Refresh the gui. this.refresh(); }); - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { // Increase row, basically add 3. slot += 3; @@ -124,28 +118,16 @@ private void createGui() { } } - // Return to plot info menu. - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Return to manage region ") - .append(Component.text(region.regionName(), NamedTextColor.GRAY))), - (NetworkUser u) -> - - { - - // Delete this gui. - this.delete(); - u.staffGui = null; - - // Switch back to plot info. - u.staffGui = new ManageRegion(u, region); - u.staffGui.open(u.player); - }); - } + // Return to the manage region menu. + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), + Utils.line("Return to manage region ").append(Component.text(region.regionName(), NamedTextColor.GRAY))), (NetworkUser u) -> { - public void refresh() { + // Delete this gui. + this.delete(); - this.clearGui(); - createGui(); + // Switch back to plot info. + u.staffGui = new ManageRegion(provider, u, region); + u.staffGui.open(u.player); + }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index d48c2be3..5848e88d 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -289,4 +289,106 @@ public long getDuration(String formattedInput) throws DurationFormatException { return time; } } + + public Component kickPlayer(String name, String uuid, String reason) { + kick(uuid, reason); + return (ChatUtils.success("Kicked ") + .append(Component.text(name, NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" for reason: ")) + .append(Component.text(reason, NamedTextColor.DARK_AQUA))); + } + + /** + * Ban the player and return the feedback so the executor can be notified of success/failure. + * + * @param name Name of the player to ban. + * @param uuid Uuid of the player to ban. + * @param end_time Time for the ban to end in milliseconds. + * @param reason Reason for banning the player. + * @return The Component to display to the executor. + */ + public Component banPlayer(String name, String uuid, long end_time, String reason) { + try { + ban(uuid, end_time, reason); + } catch (NotBannedException e) { + return ChatUtils.error("An error occurred while banning this player, please contact an admin for support."); + } + + return ChatUtils.success("Banned ") + .append(Component.text(name, NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" until ")) + .append(Component.text(Time.getDateTime(end_time), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" for reason: ")) + .append(Component.text(reason, NamedTextColor.DARK_AQUA)); + } + + /** + * Mute the player and return the feedback so the executor can be notified of success/failure. + * + * @param name Name of the player to mute. + * @param uuid Uuid of the player to mute. + * @param end_time Time for the mute to end in milliseconds. + * @param reason Reason for muting the player. + * @return The Component to display to the executor. + */ + public Component mutePlayer(String name, String uuid, long end_time, String reason) { + try { + mute(uuid, end_time, reason); + } catch (NotMutedException e) { + return ChatUtils.error("An error occurred while muting this player, please contact an admin for support."); + } + + return ChatUtils.success("Muted ") + .append(Component.text(name, NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" until ")) + .append(Component.text(Time.getDateTime(end_time), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" for reason: ")) + .append(Component.text(reason, NamedTextColor.DARK_AQUA)); + } + + /** + * Unban the player and return the feedback so the executor can be notified of success/failure. + * + * @param name Name of the banned player. + * @param uuid Uuid of the banned player. + * @return The Component to display to the executor. + */ + public Component unbanPlayer(String name, String uuid) { + + // Check if the player is currently banned. + if (isBanned(uuid)) { + + // Unban the player. + unban(uuid); + + // Send feedback. + return (ChatUtils.success("Unbanned ") + .append(Component.text(name, NamedTextColor.DARK_AQUA))); + } else { + return (ChatUtils.error(name + " is not currently banned.")); + } + } + + /** + * Unmute the player and return the feedback so the executor can be notified of success/failure. + * + * @param name Name of the muted player. + * @param uuid Uuid of the muted player. + * @return The Component to display to the executor. + */ + public Component unmutePlayer(String name, String uuid) { + + // Check if the player is currently muted. + if (isMuted(uuid)) { + + // Unmute the player. + unmute(uuid); + + // Send feedback. + return (ChatUtils.success("Unmuted ") + .append(Component.text(name, NamedTextColor.DARK_AQUA))); + } else { + return (ChatUtils.error(name + " is not currently muted.")); + } + } } From fdd81ed7adbcd7dd6ade3583980abcf480f9e8b3 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 29 Aug 2025 20:30:19 +0200 Subject: [PATCH 15/96] Finished migrating the gui's. --- .../net/bteuk/network/core/Constants.java | 2 +- .../java/net/bteuk/network/CustomChat.java | 8 +- .../main/java/net/bteuk/network/Network.java | 12 +- .../net/bteuk/network/commands/Navigator.java | 22 +- .../network/commands/navigation/Teleport.java | 2 +- .../network/eventing/listeners/Connect.java | 7 +- .../FeatureGeometryEditorListener.java | 62 ++-- .../FeaturePropertiesBookListener.java | 31 +- .../java/net/bteuk/network/gui/BuildGui.java | 2 +- .../net/bteuk/network/gui/InviteMembers.java | 2 +- .../net/bteuk/network/gui/NavigatorGui.java | 6 +- .../network/gui/NetworkRefreshableGui.java | 5 + .../network/gui/navigation/AddLocation.java | 10 +- .../network/gui/navigation/ExploreGui.java | 98 +++---- .../network/gui/navigation/LocationMenu.java | 242 ++++++--------- .../network/gui/plotsystem/CloseConfirm.java | 2 +- .../network/gui/plotsystem/DeleteConfirm.java | 2 +- .../gui/progressmap/ColourPickerGUI.java | 24 +- .../gui/progressmap/FeaturePageGUI.java | 63 ++-- .../gui/progressmap/LocalFeatureListGUI.java | 14 +- .../gui/tutorials/AbstractTutorialsGui.java | 91 ++++++ .../tutorials/LessonContinueConfirmer.java | 41 +-- .../network/gui/tutorials/LessonsMenu.java | 93 ++---- .../tutorials/RecommendedTutorialsGui.java | 51 +--- .../tutorials/RecommendedTutorialsMenu.java | 102 +++---- .../gui/tutorials/TutorialLibraryGui.java | 123 ++------ .../network/gui/tutorials/TutorialsGui.java | 276 +++++------------- .../net/bteuk/network/utils/LightsOut.java | 36 +-- .../bteuk/network/utils/NetworkConfig.java | 5 +- 29 files changed, 540 insertions(+), 894 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/gui/tutorials/AbstractTutorialsGui.java diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index a61f11fb..cbcd7d11 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -9,5 +9,5 @@ public record Constants(String serverName, ServerType serverType, boolean standa boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, - int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey) { + int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial) { } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index 6be35d90..4c5dec02 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -256,8 +256,8 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { // Find the user. instance.getUsers().stream() - .filter(user -> user.player.getUniqueId().toString().equals(discordLinking.getUuid())) - .forEach(user -> { + .filter((NetworkUser user) -> user.player.getUniqueId().toString().equals(discordLinking.getUuid())) + .forEach((NetworkUser user) -> { // Link account. instance.getGlobalSQL() @@ -284,8 +284,8 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { private void handleUserUpdate(UserUpdate userUpdate) { // If the user is online check if anything needs updating. - instance.getUsers().stream().filter(user -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) - .findFirst().ifPresent(user -> { + instance.getUsers().stream().filter((NetworkUser user) -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) + .findFirst().ifPresent((NetworkUser user) -> { if (userUpdate.getTabPlayer() != null && !userUpdate.getTabPlayer().getPrimaryGroup() .equals(user.getPrimaryRole().getId())) { // Update the primary role. diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index ad2b2079..82ccb375 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -162,7 +162,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { private Tpll tpll; // Tutorials DB connection - @Getter private DBConnection tutorialsDBConnection; private PlotAPI plotAPI; @@ -322,7 +321,7 @@ public void enablePlugin() { // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roles, globalSQL); + Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager); Moderation moderation = new Moderation(this, eventManager); @@ -472,11 +471,12 @@ public void enablePlugin() { commandManager.registerCommand(new Me()); - Navigator navigator = new Navigator(this, networkGuiManager, constants, lobby, back, eventManager, serverAPI, nightvision); + Navigator navigator = new Navigator(this, networkGuiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventManager, serverAPI, + nightvision, roles, tutorialsDBConnection, chat, moderation); commandManager.registerCommand(navigator); new PlayerInteract(this, navigator); - // Register command pre-process to make sure network versions of commands run and not that of another plugin. + // Register the command pre-process to make sure network versions of commands run and not that of another plugin. new CommandPreProcess(this, constants, afk, connect, serverAPI); commandManager.enableCommands(); @@ -560,11 +560,11 @@ public void onDisable() { // Get user from player. public NetworkUser getUser(Player p) { - return networkUsers.stream().filter(user -> user.player.equals(p)).findFirst().orElse(null); + return networkUsers.stream().filter((NetworkUser user) -> user.player.equals(p)).findFirst().orElse(null); } public Optional getNetworkUserByUuid(String uuid) { - return networkUsers.stream().filter(user -> user.player.getUniqueId().toString().equals(uuid)).findFirst(); + return networkUsers.stream().filter((NetworkUser user) -> user.player.getUniqueId().toString().equals(uuid)).findFirst(); } // Get users. diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index 01195aff..f7f0cf9c 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -4,7 +4,9 @@ import lombok.extern.java.Log; import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; +import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.core.Constants; @@ -15,9 +17,16 @@ import net.bteuk.network.gui.tutorials.TutorialsGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.lobby.Lobby; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.sql.RegionSQL; +import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Roles; +import net.bteuk.network.utils.staff.Moderation; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import teachingtutorials.utils.DBConnection; import java.util.List; @@ -31,13 +40,16 @@ public class Navigator extends AbstractCommand { private final Constants constants; private final NavigatorGui navigator; - public Navigator(Network instance, GuiManager guiManager, Constants constants, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision) { + public Navigator(Network instance, GuiManager guiManager, Constants constants, GlobalSQL globalSQL, RegionSQL regionSQL, RegionManager regionManager, PlotSQL plotSQL, + PlotAPI plotAPI, Lobby lobby, Back back, EventAPI eventAPI, ServerAPI serverAPI, Nightvision nightvision, Roles roles, + DBConnection tutorialsDBConnection, ChatAPI chatAPI, Moderation moderation) { this.instance = instance; this.constants = constants; - this.provider = new GuiProvider(instance, guiManager, constants, ...); + this.provider = new GuiProvider(instance, guiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventAPI, serverAPI, nightvision, this, + roles, tutorialsDBConnection, chatAPI, moderation); - navigator = new NavigatorGui(provider); + this.navigator = new NavigatorGui(provider); } public void openNavigator(NetworkUser u) { @@ -93,7 +105,7 @@ private void openExplore(NetworkUser u) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new ExploreGui(u); + u.mainGui = new ExploreGui(provider, u); u.mainGui.open(u.player); } else { openNavigator(u); @@ -114,7 +126,7 @@ private void openTutorials(NetworkUser u) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new TutorialsGui(u); + u.mainGui = new TutorialsGui(provider, u); u.mainGui.open(u.player); } else { openNavigator(u); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java index 93cbe25b..81ae0fe3 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java @@ -71,7 +71,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) instance.getNetworkUserByUuid(onlineUser.getUuid()); NetworkLocation currentLocation = LocationAdapter.adapt(player.getLocation()); - optionalNetworkUser.ifPresentOrElse(user -> { + optionalNetworkUser.ifPresentOrElse((NetworkUser user) -> { // Set the current location for /back back.setPreviousCoordinate(player.getUniqueId().toString(), currentLocation); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 2b613c35..572a946d 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -2,6 +2,7 @@ import lombok.Setter; import lombok.extern.java.Log; +import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; @@ -46,17 +47,19 @@ public class Connect implements Listener { private final TabManager tabManager; private final Roles roles; private final GlobalSQL globalSQL; + private final GuiManager guiManager; @Setter private boolean blockLeaveEvent; - public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL) { + public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL, GuiManager guiManager) { this.instance = instance; this.constants = constants; this.tabManager = tabManager; this.roles = roles; this.globalSQL = globalSQL; + this.guiManager = guiManager; this.blockLeaveEvent = false; @@ -190,7 +193,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { UUID playerUUID = user.player.getUniqueId(); // If they are currently in an inventory, remove them from the list of open inventories. - Gui.openInventories.remove(playerUUID); + guiManager.closeGui(playerUUID); // Delete any guis that may exist. if (user.mainGui != null) { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java index 52a8c2f0..abeb929e 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java @@ -1,7 +1,8 @@ package net.bteuk.network.eventing.listeners.progressmap; import me.bteuk.progressmapper.GeometryEditor; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.gui.progressmap.FeaturePageGUI; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; @@ -14,11 +15,9 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -public class FeatureGeometryEditorListener extends Gui implements Listener { - private final Network plugin; +public class FeatureGeometryEditorListener extends NetworkRefreshableGui implements Listener { private final FeaturePageGUI featurePageGUI; private final NetworkUser user; private final ItemStack blazeRod; @@ -26,47 +25,38 @@ public class FeatureGeometryEditorListener extends Gui implements Listener { private final GeometryEditor geometryEditor; private int iTaskID; - public FeatureGeometryEditorListener(Network plugin, FeaturePageGUI featurePageGUI, GeometryEditor geometryEditor - , NetworkUser user, ItemStack blazeRod) { - super(geometryEditor.getGUI()); - this.plugin = plugin; + public FeatureGeometryEditorListener(GuiProvider provider, FeaturePageGUI featurePageGUI, GeometryEditor geometryEditor, NetworkUser user, ItemStack blazeRod) { + super(provider, geometryEditor.getGUI()); this.featurePageGUI = featurePageGUI; this.geometryEditor = geometryEditor; this.user = user; this.blazeRod = blazeRod; } + protected void createGui() { + setItemsFromInventory(geometryEditor.getGUI()); + setActions(); + } + private void setActions() { - setAction(2, (NetworkUser u) -> - { - selectionCancel(); - }); - - setAction(6, (NetworkUser u) -> - { - selectionConfirm(); - }); + setAction(2, (NetworkUser u) -> selectionCancel()); + + setAction(6, (NetworkUser u) -> selectionConfirm()); } public void register() { // Registers the selection listener - Bukkit.getServer().getPluginManager().registerEvents(this, plugin); + Bukkit.getServer().getPluginManager().registerEvents(this, provider.instance()); // Sets up the outline view entity spawn schedule - this.iTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> - { - geometryEditor.updateView(); - }, 20L, 20L); + this.iTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(provider.instance(), geometryEditor::updateView, 20L, 20L); } @EventHandler(priority = EventPriority.LOWEST) public void BlockHitWithBlazeRodEvent(PlayerInteractEvent e) { - if (!e.hasBlock()) - return; - if (!e.getPlayer().getUniqueId().equals(this.user.player.getUniqueId())) - return; - if (!e.getMaterial().equals(Material.BLAZE_ROD)) - return; + if (!e.hasBlock()) return; + if (!e.getPlayer().getUniqueId().equals(this.user.player.getUniqueId())) return; + if (!e.getMaterial().equals(Material.BLAZE_ROD)) return; e.setCancelled(true); @@ -74,6 +64,7 @@ public void BlockHitWithBlazeRodEvent(PlayerInteractEvent e) { Block clickedBlock = e.getClickedBlock(); // Now we can determine the plugin action + if (clickedBlock == null) return; if (e.getAction().isLeftClick()) { geometryEditor.leftClick(clickedBlock.getX(), clickedBlock.getZ()); user.player.sendMessage(Component.text("Area restarted", NamedTextColor.AQUA)); @@ -93,7 +84,7 @@ public void selectionConfirm() { // Reopen the feature menu featurePageGUI.refresh(); // Refresh will redo the GUI item texts user.mainGui = featurePageGUI; - user.mainGui.open(user); + user.mainGui.open(user.player); // Unregisters the selection listener and cancels the outline view unregister(); @@ -110,7 +101,7 @@ public void selectionCancel() { // Reopen the feature menu featurePageGUI.refresh(); // Refresh will redo the GUI item texts user.mainGui = featurePageGUI; - user.mainGui.open(user); + user.mainGui.open(user.player); // Unregisters the selection listener and cancels the outline view unregister(); @@ -126,15 +117,4 @@ private void unregister() { // Removes the blaze rod blazeRod.setAmount(0); } - - @Override - public void refresh() { - // Refresh icons - this.clearGui(); - Inventory inventory = geometryEditor.getGUI(); - this.getInventory().setContents(inventory.getContents()); - - // Refresh actions - setActions(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java index 9c3af9fb..ea701f69 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java @@ -5,6 +5,7 @@ import net.bteuk.network.gui.progressmap.FeaturePageGUI; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.TextComponent; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; @@ -13,66 +14,58 @@ import org.bukkit.inventory.meta.BookMeta; public class FeaturePropertiesBookListener implements Listener { - private final Network plugin; private final NetworkUser user; private final FeaturePageGUI featurePageGUI; private final Field fieldType; private String szRelevantTitle; - public FeaturePropertiesBookListener(Network plugin, FeaturePageGUI featurePageGUI, Field fieldType, - NetworkUser user) { - this.plugin = plugin; + public FeaturePropertiesBookListener(FeaturePageGUI featurePageGUI, Field fieldType, NetworkUser user) { this.featurePageGUI = featurePageGUI; this.fieldType = fieldType; this.user = user; switch (fieldType) { case Title: - this.szRelevantTitle = - ((BookMeta) (featurePageGUI.getFeatureMenu().getTitleBook().getItemMeta())).getTitle(); + this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getTitleBook().getItemMeta())).getTitle(); break; case Description: - this.szRelevantTitle = - ((BookMeta) (featurePageGUI.getFeatureMenu().getDescriptionBook().getItemMeta())).getTitle(); + this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getDescriptionBook().getItemMeta())).getTitle(); break; case Media_url: - this.szRelevantTitle = - ((BookMeta) (featurePageGUI.getFeatureMenu().getMedialURLBook().getItemMeta())).getTitle(); + this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getMedialURLBook().getItemMeta())).getTitle(); break; } } - public void register() { - Bukkit.getServer().getPluginManager().registerEvents(this, plugin); + public void register(Network instance) { + Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @EventHandler public void BookCloseEvent(PlayerEditBookEvent e) { // Check the player - if (!e.getPlayer().equals(user.player)) - return; + if (!e.getPlayer().equals(user.player)) return; // We can't actually also check the book because the event doesn't give that // We can only check the title - if (!e.getNewBookMeta().getTitle().equalsIgnoreCase(szRelevantTitle)) - return; + if (!StringUtils.equalsIgnoreCase(e.getNewBookMeta().getTitle(), szRelevantTitle)) return; // Extracts the new content from the book String szNewContent = ((TextComponent) e.getNewBookMeta().page(1).asComponent()).content(); - // Edits the Feature's details in feature menu + // Edits the Feature's details in the feature menu featurePageGUI.getFeatureMenu().fieldEdit(fieldType, szNewContent); // Reopen the feature menu featurePageGUI.refresh(); // Refresh will redo the GUI item texts based on the values edited in the line above user.mainGui = featurePageGUI; - user.mainGui.open(user); + user.mainGui.open(user.player); // Unregisters this listener unregister(); // Do I actually want this? Surely I want the book to be re-editable - No. No need really, // makes it more confusing for the player - // If they just click the item to get a single use book and then the book closes then that's a lot simpler + // If they just click the item to get a single use book and then the book closes, then that's a lot simpler // Removes the book user.player.getInventory().getItemInMainHand().setAmount(0); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index afdc955c..0be8672c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -398,7 +398,7 @@ protected void createGui() { } else { this.delete(); // Switch to the local features menu - u.mainGui = new LocalFeatureListGUI(provider, localFeatures); + u.mainGui = new LocalFeatureListGUI(provider, localFeatures, localFeatures.getGUI()); u.mainGui.open(u.player); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java index 1e7061fa..6f0cc494 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java @@ -153,7 +153,7 @@ protected void createGui() { u.mainGui = null; // Switch back to plot info. - u.mainGui = new RegionInfo(region, u.player.getUniqueId().toString()); + u.mainGui = new RegionInfo(provider, region, u.player.getUniqueId().toString()); u.mainGui.open(u.player); }); } else if (regionType == RegionType.PLOT) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index b050e840..5147e71e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -46,7 +46,7 @@ public NavigatorGui(GuiProvider provider) { // Click Action if (constants.warpsEnabled()) { - u.mainGui = new ExploreGui(u); + u.mainGui = new ExploreGui(provider, u); u.mainGui.open(u.player); } else { u.player.closeInventory(); @@ -63,7 +63,7 @@ public NavigatorGui(GuiProvider provider) { } else if (constants.tutorials()) { if (globalSQL.hasRow("SELECT name FROM server_data WHERE " + "type='TUTORIAL' AND online=1;")) { - u.mainGui = new TutorialsGui(u); + u.mainGui = new TutorialsGui(provider, u); u.mainGui.open(u.player); } else { u.player.closeInventory(); @@ -107,7 +107,7 @@ public NavigatorGui(GuiProvider provider) { setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), (NetworkUser u) -> { if (u.lightsOut == null) { - u.lightsOut = new LightsOut(u); + u.lightsOut = new LightsOut(provider, u); u.lightsOut.open(u.player); } else { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java index 3ad719c2..ef4e19cd 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkRefreshableGui.java @@ -2,6 +2,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; public abstract class NetworkRefreshableGui extends NetworkGui implements RefreshableGui { @@ -9,6 +10,10 @@ public NetworkRefreshableGui(GuiProvider provider, int inventorySize, Component super(provider, inventorySize, inventoryName); } + public NetworkRefreshableGui(GuiProvider provider, Inventory inventory) { + super(provider, inventory); + } + protected abstract void createGui(); /** diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index 4fc3c6a0..ef65c715 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -49,7 +49,7 @@ public class AddLocation extends NetworkRefreshableGui { private String subcategory = "None"; private int coordinate_id; private LocationNameListener locationNameListener; - private GlobalSQL globalSQL; + private final GlobalSQL globalSQL; public AddLocation(GuiProvider provider, AddLocationType type) { super(provider, 27, Component.text(type.label + " Location", NamedTextColor.AQUA, TextDecoration.BOLD)); @@ -59,6 +59,7 @@ public AddLocation(GuiProvider provider, AddLocationType type) { this.back = provider.back(); this.eventAPI = provider.eventAPI(); this.serverAPI = provider.serverAPI(); + this.globalSQL = provider.globalSQL(); } // This is used when location details need to be updated. @@ -84,6 +85,7 @@ public AddLocation(GuiProvider provider, AddLocationType type, String name, int this.back = provider.back(); this.eventAPI = provider.eventAPI(); this.serverAPI = provider.serverAPI(); + this.globalSQL = provider.globalSQL(); } protected void createGui() { @@ -336,7 +338,7 @@ protected void createGui() { this.delete(); // Switch to the navigation menu. - u.mainGui = new ExploreGui(u); + u.mainGui = new ExploreGui(provider, u); u.mainGui.open(u.player); }); } else if (type == AddLocationType.REVIEW) { @@ -384,7 +386,7 @@ private void addLocation(NetworkUser u) { this.delete(); u.mainGui = null; - u.mainGui = new ExploreGui(u); + u.mainGui = new ExploreGui(provider, u); u.player.closeInventory(); } @@ -469,7 +471,7 @@ public void requestLocation(NetworkUser u) { this.delete(); u.mainGui = null; - u.mainGui = new ExploreGui(u); + u.mainGui = new ExploreGui(provider, u); u.player.closeInventory(); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java index 22b05f9b..6d509e27 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java @@ -1,7 +1,7 @@ package net.bteuk.network.gui.navigation; -import net.bteuk.network.Network; import net.bteuk.network.eventing.listeners.navigation.LocationSearch; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -13,34 +13,27 @@ import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Material; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - public class ExploreGui extends NetworkRefreshableGui { private final NetworkUser u; - public ExploreGui(NetworkUser u) { - - super(27, Component.text("Exploration Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + public ExploreGui(GuiProvider provider, NetworkUser u) { + super(provider, 27, Component.text("Exploration Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); this.u = u; - - createGui(); } - private void createGui() { + protected void createGui() { // If the player has the correct permission allow them to request a location. if (u.player.hasPermission("uknet.navigation.request")) { - - setItem(18, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Add Location"), - Utils.line("Request a new location to add"), Utils.line("to the exploration menu.")), (NetworkUser u) -> { + setItem(18, Utils.createItem(Material.MAGENTA_GLAZED_TERRACOTTA, 1, Utils.title("Add Location"), Utils.line("Request a new location to add"), + Utils.line("to the exploration menu.")), (NetworkUser u) -> { this.delete(); - u.mainGui = null; // Switch to the location add menu. - u.mainGui = new AddLocation(AddLocationType.ADD); + u.mainGui = new AddLocation(provider, AddLocationType.ADD); u.mainGui.open(u.player); }); } @@ -63,88 +56,65 @@ private void createGui() { */ // England - setItem(2, Utils.createCustomSkullWithFallback("bee5c850afbb7d8843265a146211ac9c615f733dcc5a8e2190e5c247dea32", - Material.ORANGE_CONCRETE_POWDER, 1, Utils.title("England"), Utils.line("Click to pick from"), - Utils.line("locations in England.")), (NetworkUser u) -> openLocation("England", u, Category.ENGLAND)); + setItem(2, Utils.createCustomSkullWithFallback("bee5c850afbb7d8843265a146211ac9c615f733dcc5a8e2190e5c247dea32", Material.ORANGE_CONCRETE_POWDER, 1, Utils.title("England"), + Utils.line("Click to pick from"), Utils.line("locations in England.")), (NetworkUser u) -> openLocation("England", u, Category.ENGLAND)); // Scotland - setItem(3, - Utils.createCustomSkullWithFallback("dadc377816389c3c87c65dcacac1d8f880b54334d7c23ea22f099e2c4eab1ff9", - Material.LIGHT_BLUE_CONCRETE_POWDER, 1, Utils.title("Scotland"), - Utils.line("Click to pick from"), Utils.line("locations in Scotland.")), + setItem(3, Utils.createCustomSkullWithFallback("dadc377816389c3c87c65dcacac1d8f880b54334d7c23ea22f099e2c4eab1ff9", Material.LIGHT_BLUE_CONCRETE_POWDER, 1, + Utils.title("Scotland"), Utils.line("Click to pick from"), Utils.line("locations in Scotland.")), (NetworkUser u) -> openLocation("Scotland", u, Category.SCOTLAND)); // Wales - setItem(4, - Utils.createCustomSkullWithFallback("8140ad08f7ee1c73bf75660614595c7392caba5529211a9adbe3b5639cb6ad41", - Material.RED_CONCRETE_POWDER, 1, Utils.title("Wales"), Utils.line("Click to pick from"), - Utils.line("locations in Wales.")), (NetworkUser u) -> openLocation("Wales", u, Category.WALES)); + setItem(4, Utils.createCustomSkullWithFallback("8140ad08f7ee1c73bf75660614595c7392caba5529211a9adbe3b5639cb6ad41", Material.RED_CONCRETE_POWDER, 1, Utils.title("Wales"), + Utils.line("Click to pick from"), Utils.line("locations in Wales.")), (NetworkUser u) -> openLocation("Wales", u, Category.WALES)); // Northern Ireland - setItem(5, - Utils.createCustomSkullWithFallback("c00ae311a5c7082e76450ecafcbbbc07dcdc484600ac0bf8d91f27e0a65b7e32", - Material.LIME_CONCRETE_POWDER, 1, Utils.title("Northern Ireland"), - Utils.line("Click to pick from"), Utils.line("locations in Norther " + "Ireland.")), + setItem(5, Utils.createCustomSkullWithFallback("c00ae311a5c7082e76450ecafcbbbc07dcdc484600ac0bf8d91f27e0a65b7e32", Material.LIME_CONCRETE_POWDER, 1, + Utils.title("Northern Ireland"), Utils.line("Click to pick from"), Utils.line("locations in Norther " + "Ireland.")), (NetworkUser u) -> openLocation("Northern Ireland", u, Category.NORTHERN_IRELAND)); // Other - setItem(6, - Utils.createCustomSkullWithFallback("c439d7f9c67f32dcbb86b7010b1e14b60de96776a35f61cee982660aacf5264b", - Material.YELLOW_CONCRETE_POWDER, 1, Utils.title("Other"), - Utils.line("Click to pick from locations"), - Utils.line("not in the 4 " + "countries of the UK.")), - (NetworkUser u) -> openLocation("Other", u, Category.OTHER)); + setItem(6, Utils.createCustomSkullWithFallback("c439d7f9c67f32dcbb86b7010b1e14b60de96776a35f61cee982660aacf5264b", Material.YELLOW_CONCRETE_POWDER, 1, Utils.title("Other"), + Utils.line("Click to pick from locations"), Utils.line("not in the 4 " + "countries of the UK.")), (NetworkUser u) -> openLocation("Other", u, Category.OTHER)); // Suggested Locations // Gets all locations which have suggested=1 in database. - setItem(21, Utils.createItem(Material.GOLD_BLOCK, 1, Utils.title("Suggested Locations"), - Utils.line("Click " + "to" + " view locations"), Utils.line("that are recommended to view.")), - (NetworkUser u) -> openLocation("Suggested" + " " + "Locations", u, Category.SUGGESTED)); + setItem(21, Utils.createItem(Material.GOLD_BLOCK, 1, Utils.title("Suggested Locations"), Utils.line("Click " + "to" + " view locations"), + Utils.line("that are recommended to view.")), (NetworkUser u) -> openLocation("Suggested" + " " + "Locations", u, Category.SUGGESTED)); // Nearby Locations (radius set in config under navigation_radius) - setItem(22, Utils.createItem(Material.COMPASS, 1, Utils.title("Nearby Locations"), - Utils.line("Click to view " + "locations"), - Utils.line("in a " + CONFIG.getInt("navigation_radius") + "km radius.")), - (NetworkUser u) -> openLocation("Nearby Locations", u, Category.NEARBY)); + setItem(22, Utils.createItem(Material.COMPASS, 1, Utils.title("Nearby Locations"), Utils.line("Click to view " + "locations"), + Utils.line("in a " + provider.constants().navigationRadius() + "km radius.")), (NetworkUser u) -> openLocation("Nearby Locations", u, Category.NEARBY)); // Find Locations - setItem(23, Utils.createItem(Material.OAK_SIGN, 1, Utils.title("Find Locations"), - Utils.line("Click to " + "search" + " for locations"), Utils.line("based on chat input.")), (NetworkUser u) -> { - u.player.sendMessage(ChatUtils.success("Type a word or phrase in chat to search for locations.")); - new LocationSearch(u); - u.player.closeInventory(); - }); + setItem(23, + Utils.createItem(Material.OAK_SIGN, 1, Utils.title("Find Locations"), Utils.line("Click to " + "search" + " for locations"), Utils.line("based on chat input.")), + (NetworkUser u) -> { + u.player.sendMessage(ChatUtils.success("Type a word or phrase in chat to search for locations.")); + new LocationSearch(u); + u.player.closeInventory(); + }); // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), - Utils.line("Open the navigator " + "main menu.")), (NetworkUser u) -> { + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator " + "main menu.")), (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; - // Switch to navigation menu. - Network.getInstance().navigatorGui.open(u.player); + // Switch to the navigation menu. + provider.navigator().openMainMenu(u); }); } - public void refresh() { - - this.clearGui(); - createGui(); - } - private void openLocation(String name, NetworkUser u, Category category) { - - LocationMenu gui = new LocationMenu(name, u, category, Category.EXPLORE); + LocationMenu gui = new LocationMenu(provider, name, u, category, Category.EXPLORE); if (gui.isEmpty()) { - gui.delete(); - u.player.sendMessage(ChatUtils.error("No locations added to the menu in ") - .append(Component.text(name, NamedTextColor.DARK_RED))); + u.player.sendMessage(ChatUtils.error("No locations added to the menu in ").append(Component.text(name, NamedTextColor.DARK_RED))); } else { - // Switch to location menu. + // Switch to the location menu. this.delete(); u.mainGui = gui; u.mainGui.open(u.player); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java index 005dd886..2fdeff78 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java @@ -1,11 +1,13 @@ package net.bteuk.network.gui.navigation; -import net.bteuk.network.Network; -import net.bteuk.network.commands.navigation.Back; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.Category; import net.kyori.adventure.text.Component; @@ -22,20 +24,17 @@ import java.util.LinkedHashSet; import java.util.Map; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - -public class LocationMenu extends Gui { +public class LocationMenu extends NetworkRefreshableGui { private final Category category; private final Category returnMenu; private final String[] extraInfo; + private final GlobalSQL globalSQL; + private final PlotSQL plotSQL; private Map locations; private int page = 1; private Location l = null; - private int radius; - /** * Create a new location menu. * @@ -45,52 +44,43 @@ public class LocationMenu extends Gui { * @param returnMenu (Optional) return menu * @param extraInfo (Optional) extra info, for example the search term, subcategory, or just a list of locations. */ - public LocationMenu(String title, NetworkUser u, Category category, Category returnMenu, String... extraInfo) { - super(45, Component.text(title, NamedTextColor.AQUA, TextDecoration.BOLD)); + public LocationMenu(GuiProvider provider, String title, NetworkUser u, Category category, Category returnMenu, String... extraInfo) { + super(provider, 45, Component.text(title, NamedTextColor.AQUA, TextDecoration.BOLD)); this.category = category; this.returnMenu = returnMenu; this.extraInfo = extraInfo; + this.globalSQL = provider.globalSQL(); + this.plotSQL = provider.plotSQL(); + // If the category is nearby get the player location. if (category == Category.NEARBY) { l = u.getLocationWithCoordinateTransform(); - radius = CONFIG.getInt("navigation_radius"); } - createLocationMenu(); - } - - /** - * Generic location menu method that shares functions from other constructors. - */ - private void createLocationMenu() { this.locations = getLocations(); - createGui(); } - private void createGui() { + protected void createGui() { - // If page > 1 set number of iterations that must be skipped. + // If page > 1 set the number of iterations that must be skipped. int skip = (page - 1) * 21; // Slot count. int slot = 10; - // If page is greater than 1 add a previous page button. + // If the page is greater than 1, add a previous page button. if (page > 1) { - setItem(18, Utils.createItem(Material.ARROW, 1, - Utils.title("Previous Page"), - Utils.line("Open the previous page of locations.")), - (NetworkUser u) -> - - { - - // Update the gui. - page--; - this.refresh(); - this.updatePlayerInventory(u.player); - }); + setItem(18, Utils.createItem(Material.ARROW, 1, Utils.title("Previous Page"), Utils.line("Open the previous page of locations.")), (NetworkUser u) -> + + { + + // Update the gui. + page--; + this.refresh(); + this.updatePlayerInventory(u.player); + }); } // Iterate through all locations @@ -105,105 +95,80 @@ private void createGui() { // If the slot is greater than the number that fit in a page, create a new page. if (slot > 34) { - setItem(26, Utils.createItem(Material.ARROW, 1, - Utils.title("Next Page"), - Utils.line("Open the next page of locations.")), - (NetworkUser u) -> - - { - - // Update the gui. - page++; - this.refresh(); - u.player.getOpenInventory().getTopInventory() - .setContents(this.getInventory().getContents()); - }); + setItem(26, Utils.createItem(Material.ARROW, 1, Utils.title("Next Page"), Utils.line("Open the next page of locations.")), (NetworkUser u) -> { + // Update the gui. + page++; + this.refresh(); + this.updatePlayerInventory(u.player); + }); // Stop iterating. break; } if (location.getValue()) { - // Create subcategory button. - setItem(slot, Utils.createItem(Material.GREEN_SHULKER_BOX, 1, - Utils.title(location.getKey()), - Utils.line("Click to open the menu for"), - Utils.line("for this subcategory.")), - (NetworkUser u) -> { - u.mainGui = new LocationMenu(location.getKey(), u, Category.SUBCATEGORY, category, - location.getKey()); - - // Switch to location menu. - this.delete(); - u.mainGui.open(u.player); - }); + // Create the subcategory button. + setItem(slot, Utils.createItem(Material.GREEN_SHULKER_BOX, 1, Utils.title(location.getKey()), Utils.line("Click to open the menu for"), + Utils.line("for this subcategory.")), (NetworkUser u) -> { + u.mainGui = new LocationMenu(provider, location.getKey(), u, Category.SUBCATEGORY, category, location.getKey()); + + // Switch to the location menu. + this.delete(); + u.mainGui.open(u.player); + }); } else { // Create location teleport button. - setItem(slot, Utils.createItem(Material.ENDER_PEARL, 1, - Utils.title(location.getKey()), - Utils.line("Click to teleport here.")), + setItem(slot, Utils.createItem(Material.ENDER_PEARL, 1, Utils.title(location.getKey()), Utils.line("Click to teleport here.")), (NetworkUser u) -> { // Get the coordinate id. - int coordinate_id = Network.getInstance().getGlobalSQL().getInt("SELECT coordinate FROM " + - "location_data WHERE location='" + location.getKey() + "';"); + int coordinate_id = globalSQL.getInt("SELECT coordinate FROM " + "location_data WHERE location='" + location.getKey() + "';"); // Get the server of the location. - String server = Network.getInstance().getGlobalSQL().getString("SELECT server FROM " + - "coordinates WHERE id=" + coordinate_id + ";"); + String server = globalSQL.getString("SELECT server FROM " + "coordinates WHERE id=" + coordinate_id + ";"); // If the plot is on the current server teleport them directly. // Else teleport them to the correct server and them teleport them to the plot. - if (server.equals(SERVER_NAME)) { + if (server.equals(provider.constants().serverName())) { // Close inventory. u.player.closeInventory(); // Get location from coordinate id. - Location l = Network.getInstance().getGlobalSQL().getLocation(coordinate_id); + Location l = globalSQL.getLocation(coordinate_id); - String worldName = Network.getInstance().getGlobalSQL().getString("SELECT world FROM " + - "coordinates WHERE id=" + coordinate_id + ";"); + String worldName = globalSQL.getString("SELECT world FROM " + "coordinates WHERE id=" + coordinate_id + ";"); // Check if world is in plotsystem. - if (Network.getInstance().getPlotSQL().hasRow("SELECT name FROM location_data WHERE " + - "name='" + worldName + "';")) { + if (plotSQL.hasRow("SELECT name FROM location_data WHERE " + "name='" + worldName + "';")) { // Add coordinate transformation. - l = new Location( - Bukkit.getWorld(worldName), - l.getX() + Network.getInstance().getPlotSQL().getInt("SELECT xTransform " + - "FROM location_data WHERE name='" + worldName + "';"), - l.getY(), - l.getZ() + Network.getInstance().getPlotSQL().getInt("SELECT zTransform " + - "FROM location_data WHERE name='" + worldName + "';"), - l.getYaw(), - l.getPitch() - ); + l = new Location(Bukkit.getWorld(worldName), + l.getX() + plotSQL.getInt("SELECT xTransform " + "FROM location_data WHERE name='" + worldName + "';"), l.getY(), + l.getZ() + plotSQL.getInt("SELECT zTransform " + "FROM location_data WHERE name='" + worldName + "';"), l.getYaw(), l.getPitch()); } - // Set current location for /back - Back.setPreviousCoordinate(u.player.getUniqueId().toString(), u.player.getLocation()); + // Set the current location for /back + provider.back().setPreviousCoordinate(u.player.getUniqueId().toString(), LocationAdapter.adapt(u.player.getLocation())); u.player.teleport(l); - u.player.sendMessage(ChatUtils.success("Teleported to ") - .append(Component.text(location.getKey(), NamedTextColor.DARK_AQUA))); + u.player.sendMessage(ChatUtils.success("Teleported to ").append(Component.text(location.getKey(), NamedTextColor.DARK_AQUA))); } else { // Create teleport event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport location " + location.getKey(), u.player.getLocation()); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport location " + location.getKey(), + LocationAdapter.adapt(u.player.getLocation())); // Switch server. - SwitchServer.switchServer(u.player, server); + provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } }); } - // Increase slot accordingly. + // Increase the slot accordingly. if (slot % 9 == 7) { - // Increase row, basically add 3. + // Increase row, add 3. slot += 3; } else { // Increase value by 1. @@ -213,31 +178,25 @@ private void createGui() { // Return (optional) if (returnMenu != null) { - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the previous menu.")), - (NetworkUser u) -> { - // Delete this gui. - this.delete(); - - // Switch to navigation menu. - Gui returnGui = getReturnGui(u); - if (returnGui != null) { - if (!returnGui.isDeleteOnClose()) { - u.mainGui = returnGui; - } - returnGui.open(u.player); - } else { - u.player.sendMessage(ChatUtils.error("An error occurred, please contact an admin.")); - u.player.closeInventory(); - } - }); + setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the previous menu.")), (NetworkUser u) -> { + // Delete this gui. + this.delete(); + + // Switch to navigation menu. + NetworkRefreshableGui returnGui = getReturnGui(u); + if (returnGui != null) { + returnGui.open(u.player); + } else { + u.player.sendMessage(ChatUtils.error("An error occurred, please contact an admin.")); + u.player.closeInventory(); + } + }); } } + @Override public void refresh() { - - this.clearGui(); + this.clear(); // Refresh the location list. locations = getLocations(); @@ -266,27 +225,21 @@ private Map getLocations() { // Main categories (can include subcategories. case ENGLAND, SCOTLAND, WALES, NORTHERN_IRELAND, OTHER -> { - Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM location_subcategory WHERE " + - "category='" + category + "' ORDER BY name ASC;") + globalSQL.getStringList("SELECT name FROM location_subcategory WHERE " + "category='" + category + "' ORDER BY name ASC;") .forEach(name -> locations.put(name, true)); - Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM location_data WHERE " + - "category='" + category + "' AND subcategory is null ORDER BY location ASC;") + globalSQL.getStringList("SELECT location FROM location_data WHERE " + "category='" + category + "' AND subcategory is null ORDER BY location ASC;") .forEach(name -> locations.put(name, false)); } // Subcategory, can only include locations. case SUBCATEGORY -> { // Get the subcategory id from the name. - int id = Network.getInstance().getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE " + - "name='" + extraInfo[0] + "';"); - Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM location_data WHERE " + - "subcategory=" + id + " ORDER BY location ASC;") - .forEach(name -> locations.put(name, false)); + int id = globalSQL.getInt("SELECT id FROM location_subcategory WHERE " + "name='" + extraInfo[0] + "';"); + globalSQL.getStringList("SELECT location FROM location_data WHERE " + "subcategory=" + id + " ORDER BY location ASC;").forEach(name -> locations.put(name, false)); } // Suggested locations can only include locations. - case SUGGESTED -> Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM location_data WHERE " + - "suggested=1 ORDER BY location ASC;") - .forEach(name -> locations.put(name, false)); + case SUGGESTED -> + globalSQL.getStringList("SELECT location FROM location_data WHERE " + "suggested=1 ORDER BY location ASC;").forEach(name -> locations.put(name, false)); // Nearby locations can only include locations and are found based on the player's current location. case NEARBY -> getNearbyLocations().forEach(name -> locations.put(name, false)); @@ -306,15 +259,11 @@ private Map getLocations() { } private LinkedHashSet getNearbyLocations() { - return new LinkedHashSet<>(Network.getInstance().getGlobalSQL().getStringList("SELECT location_data.location " + - "FROM location_data INNER JOIN coordinates ON location_data.coordinate=coordinates.id " + - "WHERE ((((coordinates.x/1000)-" + (l.getX() / 1000) + ")*((coordinates.x/1000)-" + (l.getX() / 1000) + ")) + " + - "(((coordinates.z/1000)-" + (l.getZ() / 1000) + ")*((coordinates.z/1000)-" + (l.getZ() / 1000) + ")))" + - " < " + - (radius * radius) + - " ORDER BY ((((coordinates.x/1000)-" + (l.getX() / 1000) + ")*((coordinates.x/1000)-" + (l.getX() / 1000) + ")) + " + - "(((coordinates.z/1000)-" + (l.getZ() / 1000) + ")*((coordinates.z/1000)-" + (l.getZ() / 1000) + ")))" + - " ASC;")); + return new LinkedHashSet<>(globalSQL.getStringList( + "SELECT location_data.location " + "FROM location_data INNER JOIN coordinates ON location_data.coordinate=coordinates.id " + "WHERE ((((coordinates.x/1000)-" + (l.getX() / 1000) + ")*((coordinates.x/1000)-" + (l.getX() / 1000) + ")) + " + "(((coordinates.z/1000)-" + (l.getZ() / 1000) + ")*((coordinates.z/1000)-" + (l.getZ() / 1000) + ")))" + " < " + (provider.constants() + .navigationRadius() * provider.constants() + .navigationRadius()) + " ORDER BY ((((coordinates.x/1000)-" + (l.getX() / 1000) + ")*((coordinates.x/1000)-" + (l.getX() / 1000) + ")) + " + "((" + + "(coordinates.z/1000)-" + (l.getZ() / 1000) + ")*((coordinates.z/1000)-" + (l.getZ() / 1000) + ")))" + " ASC;")); } private LinkedHashSet searchLocations() { @@ -322,14 +271,11 @@ private LinkedHashSet searchLocations() { // The search query is the first argument of the extra info. // Search for locations that include the phrase. - ArrayList locations = Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM " + - "location_data WHERE location LIKE '%" + extraInfo[0] + "%';"); + ArrayList locations = globalSQL.getStringList("SELECT location FROM " + "location_data WHERE location LIKE '%" + extraInfo[0] + "%';"); // Also search for any categories or subcategories. - locations.addAll(Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM location_data WHERE" + - " category LIKE '%" + extraInfo[0] + "%';")); - locations.addAll(Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM location_data WHERE" + - " subcategory LIKE '%" + extraInfo[0] + "%';")); + locations.addAll(globalSQL.getStringList("SELECT location FROM location_data WHERE" + " category LIKE '%" + extraInfo[0] + "%';")); + locations.addAll(globalSQL.getStringList("SELECT location FROM location_data WHERE" + " subcategory LIKE '%" + extraInfo[0] + "%';")); locations.sort(Comparator.naturalOrder()); @@ -337,23 +283,23 @@ private LinkedHashSet searchLocations() { } // Function to get the gui for the return button. - private Gui getReturnGui(NetworkUser u) { + private NetworkRefreshableGui getReturnGui(NetworkUser u) { if (returnMenu == Category.EXPLORE) { - return new ExploreGui(u); + return new ExploreGui(provider, u); } else if (returnMenu == Category.TEMPORARY) { - // If the returnMenu is temporary it implies that a subcategory was opened from a temporary menu. + // If the returnMenu is temporary, it implies that a subcategory was opened from a temporary menu. // In this case the locations to add to the menu will in the extra info, excluding the first value, which // is the subcategory. if (extraInfo.length > 1) { - LocationMenu gui = new LocationMenu("Map", u, Category.TEMPORARY, null, Arrays.copyOfRange(extraInfo, - 1, extraInfo.length)); + LocationMenu gui = new LocationMenu(provider, "Map", u, Category.TEMPORARY, null, Arrays.copyOfRange(extraInfo, 1, extraInfo.length)); gui.setDeleteOnClose(true); + u.mainGui = gui; return gui; } else { return null; } } else { - return new LocationMenu(returnMenu.getLabel(), u, returnMenu, Category.EXPLORE); + return new LocationMenu(provider, returnMenu.getLabel(), u, returnMenu, Category.EXPLORE); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java index 0b3e00fc..387f7dc2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java @@ -32,7 +32,7 @@ protected void createGui() { this.delete(); u.mainGui = null; - u.mainGui = new ZoneMenu(u); + u.mainGui = new ZoneMenu(provider, u); u.player.closeInventory(); // Add server event to delete plot or zone. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java index 3632e3af..f6a672fd 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java @@ -52,7 +52,7 @@ protected void createGui() { "delete plot " + id); } else if (regionType == RegionType.ZONE) { - u.mainGui = new ZoneMenu(u); + u.mainGui = new ZoneMenu(provider, u); u.player.closeInventory(); u.sendMessage(ChatUtils.success("Deleting zone %s...", String.valueOf(id))); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java index 0de4b0be..ec30c0f7 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java @@ -1,17 +1,22 @@ package net.bteuk.network.gui.progressmap; import me.bteuk.progressmapper.guis.ColourPicker; -import org.bukkit.inventory.Inventory; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.utils.NetworkUser; -public class ColourPickerGUI extends Gui { +public class ColourPickerGUI extends NetworkRefreshableGui { private final ColourPicker colourPicker; private final FeaturePageGUI parentFeatureMenu; - public ColourPickerGUI(ColourPicker colourPicker, FeaturePageGUI parentFeatureMenu) { - super(colourPicker.getGUI()); + public ColourPickerGUI(GuiProvider provider, ColourPicker colourPicker, FeaturePageGUI parentFeatureMenu) { + super(provider, colourPicker.getGUI()); this.colourPicker = colourPicker; this.parentFeatureMenu = parentFeatureMenu; + } + protected void createGui() { + setItemsFromInventory(colourPicker.getGUI()); setActions(); } @@ -179,15 +184,4 @@ private void setActions() { u.mainGui.open(u.player); }); } - - @Override - public void refresh() { - // Refresh icons - this.clearGui(); // Clears actions as well - Inventory inventory = colourPicker.getGUI(); - this.getInventory().setContents(inventory.getContents()); - - // Refresh actions - setActions(); - } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java index 527402b6..c34b854a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java @@ -6,7 +6,7 @@ import net.bteuk.network.eventing.listeners.progressmap.FeatureGeometryEditorListener; import net.bteuk.network.eventing.listeners.progressmap.FeaturePropertiesBookListener; import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkGui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -15,12 +15,11 @@ import net.kyori.adventure.text.format.Style; import org.bukkit.Material; import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; // The page for editing a feature // Should we have two different ones for edit and create (and then a shared parent) or just have both within one? -public class FeaturePageGUI extends NetworkGui { +public class FeaturePageGUI extends NetworkRefreshableGui { @Getter private final FeatureMenu featureMenu; private final LocalFeatureListGUI parentLocalFeatureListGUI; @@ -32,18 +31,19 @@ public FeaturePageGUI(GuiProvider provider, FeatureMenu featureMenu, LocalFeatur setActions(); } + protected void createGui() { + setItemsFromInventory(featureMenu.getGUI()); + setActions(); + } + private void setActions() { // Slots here are 0 indexed // Title edit - setAction(0, (NetworkUser u) -> { - openFieldEditor(u, featureMenu.getTitleBook(), Field.Title); - }); + setAction(0, (NetworkUser u) -> openFieldEditor(u, featureMenu.getTitleBook(), Field.Title)); // Description edit - setAction(2, (NetworkUser u) -> { - openFieldEditor(u, featureMenu.getDescriptionBook(), Field.Description); - }); + setAction(2, (NetworkUser u) -> openFieldEditor(u, featureMenu.getDescriptionBook(), Field.Description)); // Fill/stroke edit setAction(4, (NetworkUser u) -> { @@ -52,27 +52,24 @@ private void setActions() { // u.mainGui = null; - NO. u.mainGui here refers to this gui, so we never want to make it null because it // makes this gui null - // Switch to colour picker menu. - u.mainGui = new ColourPickerGUI(featureMenu.getColourPicker(), this); + // Switch to the colour picker menu. + u.mainGui = new ColourPickerGUI(provider, featureMenu.getColourPicker(), this); u.mainGui.open(u.player); }); // Media_url edit - setAction(6, (NetworkUser u) -> { - openFieldEditor(u, featureMenu.getMedialURLBook(), Field.Media_url); - }); + setAction(6, (NetworkUser u) -> openFieldEditor(u, featureMenu.getMedialURLBook(), Field.Media_url)); // Geometry setAction(8, (NetworkUser u) -> { // Gives the blaze rod ItemStack blazeRod = ItemStack.of(Material.BLAZE_ROD, 1); Utils.giveItem(u.player, blazeRod, "Area selection tool"); - u.player.sendMessage(Component.text("Use the blaze rod like a WorldEdit wand to make a selection. When " + - "you have made your selection, reopen the nether star menu and click confirm selection", + u.player.sendMessage(Component.text( + "Use the blaze rod like a WorldEdit wand to make a selection. When " + "you have made your selection, reopen the nether star menu and click confirm selection", Style.style(NamedTextColor.AQUA))); - FeatureGeometryEditorListener geometryListener = new FeatureGeometryEditorListener(plugin, this, - featureMenu.getGeometryEditor(), u, blazeRod); + FeatureGeometryEditorListener geometryListener = new FeatureGeometryEditorListener(provider, this, featureMenu.getGeometryEditor(), u, blazeRod); geometryListener.register(); u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); u.mainGui = geometryListener; @@ -80,17 +77,18 @@ private void setActions() { // Send update setAction(22, (NetworkUser u) -> { - if (featureMenu.isNew()) featureMenu.sendAppend(plugin.getConfig().getString("ProgressMap.MapHubAPIKey")); - else featureMenu.sendUpdate(plugin.getConfig().getString("ProgressMap.MapHubAPIKey")); - + if (featureMenu.isNew()) { + featureMenu.sendAppend(provider.constants().mapHubAPIKey()); + } else { + featureMenu.sendUpdate(provider.constants().mapHubAPIKey()); + } u.player.sendMessage(ChatUtils.success("The progress map has been updated !")); // Return to the local feature list // Delete this gui. this.delete(); - u.mainGui = null; - // Switch to feature list menu. + // Switch to the feature list menu. parentLocalFeatureListGUI.refresh(); u.mainGui = parentLocalFeatureListGUI; u.mainGui.open(u.player); @@ -102,7 +100,7 @@ private void setActions() { this.delete(); u.mainGui = null; - // Switch to feature list menu. + // Switch to the feature list menu. parentLocalFeatureListGUI.refresh(); u.mainGui = parentLocalFeatureListGUI; u.mainGui.open(u.player); @@ -113,7 +111,7 @@ private void openFieldEditor(NetworkUser u, ItemStack book, Field fieldType) { // this.delete(); // u.mainGui = null; - // Need a book menu sort of thing, and then when that detects a closure it updates the values in the gson and + // Need a book menu sort of thing, and then, when that detects a closure, it updates the values in the gson and // then refreshes // u.player.openBook(book); @@ -136,18 +134,7 @@ private void openFieldEditor(NetworkUser u, ItemStack book, Field fieldType) { u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); // Sets up the book listener and registers it - FeaturePropertiesBookListener bookListener = new FeaturePropertiesBookListener(plugin, this, fieldType, u); - bookListener.register(); - } - - @Override - public void refresh() { - // Refresh icons - this.clearGui(); - Inventory inventory = featureMenu.getGUI(); - this.getInventory().setContents(inventory.getContents()); - - // Refresh actions - setActions(); + FeaturePropertiesBookListener bookListener = new FeaturePropertiesBookListener(this, fieldType, u); + bookListener.register(provider.instance()); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java index afa798d3..5036061a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java @@ -12,12 +12,14 @@ public class LocalFeatureListGUI extends NetworkGui { // Contains all of the relevant information for each feature in the list private final LocalFeaturesMenu features; - public LocalFeatureListGUI(GuiProvider provider, LocalFeaturesMenu features) { - // Need a list of things created really. I think this has to be before this one is created. This then holds - // all of the Features + private final int inventorySize; + + public LocalFeatureListGUI(GuiProvider provider, LocalFeaturesMenu features, Inventory guiInventory) { + // Need a list of things created really. I think this has to be before this one is created. This then holds all the Features // Each feature would have a feature menu (not a feature page) - super(provider, features.getGUI()); + super(provider, guiInventory); this.features = features; + this.inventorySize = guiInventory.getSize(); setActions(); } @@ -36,13 +38,13 @@ private void setActions() { } // Back button - setAction(getInventory().getSize() - 1, (NetworkUser u) -> { + setAction(inventorySize - 1, (NetworkUser u) -> { // Delete this gui. this.delete(); u.mainGui = null; // Switch to plot info. - u.mainGui = new BuildGui(u); + u.mainGui = new BuildGui(provider, u); u.mainGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/AbstractTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/AbstractTutorialsGui.java new file mode 100644 index 00000000..3ab91d59 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/AbstractTutorialsGui.java @@ -0,0 +1,91 @@ +package net.bteuk.network.gui.tutorials; + +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; +import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Utils; +import net.kyori.adventure.text.Component; +import org.bukkit.inventory.Inventory; +import teachingtutorials.guis.Event; +import teachingtutorials.guis.EventType; +import teachingtutorials.tutorialobjects.LessonObject; +import teachingtutorials.tutorialobjects.Location; +import teachingtutorials.tutorialobjects.Tutorial; + +import java.util.logging.Logger; + +public abstract class AbstractTutorialsGui extends NetworkRefreshableGui { + + public AbstractTutorialsGui(GuiProvider provider, int inventorySize, Component inventoryName) { + super(provider, inventorySize, inventoryName); + } + + public AbstractTutorialsGui(GuiProvider provider, Inventory inventory) { + super(provider, inventory); + } + + void switchServer(NetworkUser user) { + provider.serverAPI().switchServer(PlayerAdapter.adapt(user.player), provider.globalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); + user.player.closeInventory(); + } + + /** + * Handles the logic when a player wishes to start a specific tutorial + * + * @param lessons A list of unfinished lessons for the given player + * @param user A reference to the user who wishes to start a specific tutorial + * @param parentGui A reference to the parent gui which to return back + * @param tutorialToStart A reference to the Tutorial that the player wishes to start + * @param locationToStart A reference to the Location that a player wishes to start, if specified + */ + void startTutorial(LessonObject[] lessons, NetworkUser user, NetworkGui parentGui, Tutorial tutorialToStart, Location locationToStart, Logger log) { + // Check whether the player already has a current lesson for this tutorial + boolean bLessonFound = false; + for (LessonObject lesson : lessons) { + if (tutorialToStart.getTutorialID() == lesson.getTutorialID()) { + // Open confirmation menu + // If location matters then check that + if (locationToStart != null) { + if (locationToStart.getLocationID() == lesson.getLocation().getLocationID()) { + bLessonFound = true; + + user.mainGui = new LessonContinueConfirmer(provider, user, parentGui, lesson, "You have a lesson at this location already"); + user.mainGui.open(user.player); + + // Break, let the other menu take over + break; + } + } else { + bLessonFound = true; + // If not then open confirmation menu + user.mainGui = new LessonContinueConfirmer(provider, user, parentGui, lesson, "You have a lesson for this tutorial already"); + user.mainGui.open(user.player); + + // Break, let the other menu take over + break; + } + } + } + + // If the player doesn't have a current lesson for this tutorial, then create a new one + if (!bLessonFound) { + if (locationToStart == null) { + // Switch to the tutorial. + if (Event.addEvent(EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), provider.tutorialsDBConnection(), log)) { + switchServer(user); + } else { + user.sendMessage(Utils.error("A problem occurred, please let staff know")); + } + } else { + // Switch to the tutorial. + if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), provider.tutorialsDBConnection(), log)) { + switchServer(user); + } else { + user.sendMessage(Utils.error("A problem occurred, please let staff know")); + } + } + } + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java index c267e44b..2ad017a3 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java @@ -2,9 +2,7 @@ import lombok.extern.java.Log; import net.bteuk.minecraft.gui.Gui; -import net.bteuk.network.Network; import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; @@ -14,11 +12,7 @@ import teachingtutorials.tutorialobjects.LessonObject; @Log -public class LessonContinueConfirmer extends NetworkGui { - /** - * A reference to the instance of the Network plugin - */ - private final Network plugin; +public class LessonContinueConfirmer extends AbstractTutorialsGui { /** * The user whom this menu is for @@ -41,26 +35,23 @@ public class LessonContinueConfirmer extends NetworkGui { private final Gui parentGui; /** - * @param plugin A reference to the instance of the TeachingTutorials plugin + * @param provider Provider of gui dependencies * @param user The user whom this menu is for * @param lessonToContinue The Lesson which is to be restarted or resumed * @param szMessage The message to display to the user */ - public LessonContinueConfirmer(GuiProvider provider, Network plugin, NetworkUser user, Gui parentGui, LessonObject lessonToContinue, String szMessage) { + public LessonContinueConfirmer(GuiProvider provider, NetworkUser user, Gui parentGui, LessonObject lessonToContinue, String szMessage) { super(provider, 27, Utils.title("Resume or continue lesson?")); - this.plugin = plugin; this.parentGui = parentGui; this.user = user; this.lessonToContinue = lessonToContinue; this.szMessage = szMessage; - - addItems(); } /** * Adds the icons and actions to the menu */ - private void addItems() { + protected void createGui() { // Info super.setItem(4, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.line(szMessage))); @@ -70,8 +61,8 @@ private void addItems() { Utils.title("Restart the lesson")), (NetworkUser u) -> { // Switch to the tutorial. if (Event.addEvent(EventType.RESTART_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), - plugin.getTutorialsDBConnection(), log)) { - TutorialsGui.switchServer(user); + provider.tutorialsDBConnection(), log)) { + switchServer(user); } else { user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); } @@ -82,22 +73,22 @@ private void addItems() { Utils.title("Resume the lesson")); super.setItem(16 - 1, resumeCompulsory, (NetworkUser u) -> { - // Switch to the tutorial. - if (Event.addEvent(EventType.CONTINUE_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), - plugin.getTutorialsDBConnection(), log)) { - TutorialsGui.switchServer(user); - } else { - user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); - } + // Switch to the tutorial. + if (Event.addEvent(EventType.CONTINUE_LESSON, user.player.getUniqueId(), lessonToContinue.getLessonID(), + provider.tutorialsDBConnection(), log)) { + switchServer(user); + } else { + user.sendMessage(net.bteuk.network.utils.Utils.error("A problem occurred, please let staff know")); + } }); // Back button ItemStack back = Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back")); super.setItem(26, back, (NetworkUser u) -> { - user.mainGui = parentGui; - user.mainGui.open(user.player); - delete(); + user.mainGui = parentGui; + user.mainGui.open(user.player); + delete(); }); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java index 42c087ae..40e6e7fa 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java @@ -1,17 +1,15 @@ package net.bteuk.network.gui.tutorials; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; +import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import teachingtutorials.tutorialobjects.LessonObject; -public class LessonsMenu extends Gui { - /** - * A reference to the instance of the Network plugin - */ - private final Network plugin; +public class LessonsMenu extends NetworkRefreshableGui { /** * The user whom this menu is for @@ -21,7 +19,7 @@ public class LessonsMenu extends Gui { /** * A reference to the parent Gui */ - private final Gui parentGui; + private final NetworkGui parentGui; /** * The list of lessons to display in this menu @@ -38,20 +36,17 @@ public class LessonsMenu extends Gui { */ private int iPage; - public LessonsMenu(Network plugin, NetworkUser user, Gui parentGui, LessonObject[] lessons) { - super(54, Utils.title("Your Lessons")); - this.plugin = plugin; + public LessonsMenu(GuiProvider provider, NetworkUser user, NetworkGui parentGui, LessonObject[] lessons) { + super(provider, 54, Utils.title("Your Lessons")); this.user = user; this.parentGui = parentGui; this.lessons = lessons; this.iPages = ((lessons.length - 1) / 36) + 1; this.iPage = 1; - - addItems(); } - private void addItems() { + protected void createGui() { // We need a page system // 4 lines of options // Blank line @@ -62,8 +57,7 @@ private void addItems() { // Indicates that there are no unfinished lessons if (lessons.length == 0) { - ItemStack noTutorials = Utils.createItem(Material.BARRIER, 1, - Utils.title("You have no unfinished lessons!")); + ItemStack noTutorials = Utils.createItem(Material.BARRIER, 1, Utils.title("You have no unfinished lessons!")); setItem(5 - 1, noTutorials); } @@ -73,72 +67,45 @@ private void addItems() { for (int i = iStart; i < iMax; i++) { int finalI = i; - ItemStack lesson = Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title(lessons[i].getTutorial().getTutorialName()), + ItemStack lesson = Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title(lessons[i].getTutorial().getTutorialName()), Utils.line(lessons[i].getLocation().getLocationName())); - super.setItem(i - iStart, lesson, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = new LessonContinueConfirmer(plugin, user, LessonsMenu.this, lessons[finalI], "Do you want to restart or resume?"); - user.mainGui.open(user); - } + super.setItem(i - iStart, lesson, (NetworkUser u) -> { + user.mainGui = new LessonContinueConfirmer(provider, user, LessonsMenu.this, lessons[finalI], "Do you want to restart or resume?"); + user.mainGui.open(user.player); }); } // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); - super.setItem(45, pageBack, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - LessonsMenu.this.iPage--; - refresh(); - user.mainGui = LessonsMenu.this; - user.mainGui.open(user); - } + super.setItem(45, pageBack, (NetworkUser u) -> { + LessonsMenu.this.iPage--; + refresh(); + user.mainGui = LessonsMenu.this; + user.mainGui.open(user.player); }); } // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); - super.setItem(53, pageBack, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - LessonsMenu.this.iPage++; - refresh(); - user.mainGui = LessonsMenu.this; - user.mainGui.open(user); - } + super.setItem(53, pageBack, (NetworkUser u) -> { + LessonsMenu.this.iPage++; + refresh(); + user.mainGui = LessonsMenu.this; + user.mainGui.open(user.player); }); } // Back button - ItemStack back = Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Back")); - super.setItem(49, back, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = parentGui; - user.mainGui.open(user); - delete(); - } + ItemStack back = Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back")); + super.setItem(49, back, (NetworkUser u) -> { + user.mainGui = parentGui; + user.mainGui.open(user.player); + delete(); }); } - - /** - * Refresh the gui. - * This usually involves clearing the content and recreating it. - */ - @Override - public void refresh() { - super.clearGui(); - - this.addItems(); - } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index 755cbd0b..a2afc04a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -2,27 +2,21 @@ import lombok.extern.java.Log; import net.bteuk.minecraft.gui.Gui; -import net.bteuk.network.Network; import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.TutorialRecommendation; import net.bteuk.network.utils.Utils; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import teachingtutorials.guis.Event; -import teachingtutorials.guis.EventType; import teachingtutorials.tutorialobjects.LessonObject; -import teachingtutorials.tutorialobjects.Location; import teachingtutorials.tutorialobjects.Tutorial; import teachingtutorials.utils.DBConnection; import java.util.UUID; @Log -public class RecommendedTutorialsGui extends NetworkRefreshableGui { +public class RecommendedTutorialsGui extends AbstractTutorialsGui { private final Gui parentGui; private final int iPlotID; @@ -129,8 +123,8 @@ protected void createGui() { super.setItem(i - iStart, recommendationIcon, (NetworkUser u) -> { if (!bStaffView && ownerUUID != null) { DBConnection dbConnection = provider.tutorialsDBConnection(); - startTutorial(provider.instance(), LessonObject.getUnfinishedLessonsOfPlayer(ownerUUID, dbConnection, log), user, RecommendedTutorialsGui.this, - Tutorial.fetchByTutorialID(tutorialRecommendation.getTutorialID(), dbConnection, log), null); + startTutorial(LessonObject.getUnfinishedLessonsOfPlayer(ownerUUID, dbConnection, log), user, this, + Tutorial.fetchByTutorialID(tutorialRecommendation.getTutorialID(), dbConnection, log), null, log); } }); } @@ -151,45 +145,6 @@ protected void createGui() { } } - public void startTutorial(Network plugin, LessonObject[] lessons, NetworkUser user, Gui parentGui, Tutorial tutorialToStart, Location locationToStart) { - boolean bLessonFound = false; - - for (LessonObject lesson : lessons) { - if (tutorialToStart.getTutorialID() == lesson.getTutorialID()) { - if (locationToStart == null) { - bLessonFound = true; - LessonContinueConfirmer confirmer = new LessonContinueConfirmer(provider, plugin, user, parentGui, lesson, "You have a lesson for this tutorial already"); - confirmer.open(user.player); - break; - } - - if (locationToStart.getLocationID() == lesson.getLocation().getLocationID()) { - bLessonFound = true; - LessonContinueConfirmer confirmer = new LessonContinueConfirmer(provider, plugin, user, parentGui, lesson, "You have a lesson at this location already"); - confirmer.open(user.player); - break; - } - } - } - - if (!bLessonFound) { - if (locationToStart == null) { - if (Event.addEvent(EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), provider.tutorialsDBConnection(), log)) { - provider.serverAPI().switchServer(PlayerAdapter.adapt(user.player), provider.globalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); - user.player.closeInventory(); - } else { - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } - } else if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), provider.tutorialsDBConnection(), log)) { - provider.serverAPI().switchServer(PlayerAdapter.adapt(user.player), provider.globalSQL().getString("SELECT name FROM server_data WHERE type='TUTORIAL';")); - user.player.closeInventory(); - } else { - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } - } - - } - @Override public void refresh() { clear(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java index 2e1d778f..21a06a50 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java @@ -1,6 +1,9 @@ package net.bteuk.network.gui.tutorials; +import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; +import net.bteuk.network.gui.NetworkGui; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import org.bukkit.Material; @@ -10,7 +13,8 @@ import teachingtutorials.tutorialobjects.Tutorial; import teachingtutorials.tutorialobjects.TutorialRecommendation; -public class RecommendedTutorialsMenu extends Gui { +@Log +public class RecommendedTutorialsMenu extends AbstractTutorialsGui { /** * A reference to the instance of the Network plugin */ @@ -24,7 +28,7 @@ public class RecommendedTutorialsMenu extends Gui { /** * A reference to the parent Gui */ - private final Gui parentGui; + private final NetworkGui parentGui; /** * The list of tutorial recommendations which this menu is displaying @@ -41,36 +45,30 @@ public class RecommendedTutorialsMenu extends Gui { */ private int iPage; - public RecommendedTutorialsMenu(Network plugin, TutorialsGui mainMenu, NetworkUser user, TutorialRecommendation[] tutorialRecommendations) { - super(54, Utils.title("Recommended Tutorials")); - this.plugin = plugin; + public RecommendedTutorialsMenu(GuiProvider provider, TutorialsGui mainMenu, NetworkUser user, TutorialRecommendation[] tutorialRecommendations) { + super(provider, 54, Utils.title("Recommended Tutorials")); + this.plugin = provider.instance(); this.parentGui = mainMenu; this.user = user; this.tutorialRecommendations = tutorialRecommendations; this.iPages = ((tutorialRecommendations.length - 1) / 36) + 1; - - addItems(); } - public void addItems() { + protected void createGui() { // Reset page this.iPage = 1; // Back button - setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back to Main Menu")), new guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = parentGui; - user.mainGui.open(user); - delete(); - } + setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back to Main Menu")), (NetworkUser u) -> { + user.mainGui = parentGui; + user.mainGui.open(user.player); + delete(); }); // Indicates that there are no tutorial recommendations if (tutorialRecommendations.length == 0) { - ItemStack noTutorials = Utils.createItem(Material.BARRIER, 1, - Utils.title("You have no tutorial recommendations!")); + ItemStack noTutorials = Utils.createItem(Material.BARRIER, 1, Utils.title("You have no tutorial recommendations!")); setItem(5 - 1, noTutorials); } @@ -79,75 +77,43 @@ public void click(NetworkUser u) { int iMax = Math.min((iPage + 3) * 9, tutorialRecommendations.length); for (int i = iStart; i < iMax; i++) { // Fetches the tutorial - Tutorial tutorial = Tutorial.fetchByTutorialID(tutorialRecommendations[i].getTutorialID(), plugin.getTutorialsDBConnection(), plugin.getLogger()); - if (tutorial == null) - continue; - if (!tutorial.isInUse()) - continue; + Tutorial tutorial = Tutorial.fetchByTutorialID(tutorialRecommendations[i].getTutorialID(), provider.tutorialsDBConnection(), plugin.getLogger()); + if (tutorial == null) continue; + if (!tutorial.isInUse()) continue; final Location location; if (tutorialRecommendations[i].getLocationID() > 0) - location = Location.getLocationByLocationID(plugin.getTutorialsDBConnection(), plugin.getLogger(), tutorialRecommendations[i].getLocationID()); - else - location = null; + location = Location.getLocationByLocationID(provider.tutorialsDBConnection(), plugin.getLogger(), tutorialRecommendations[i].getLocationID()); + else location = null; - ItemStack lesson = Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title(tutorial.getTutorialName()), + ItemStack lesson = Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title(tutorial.getTutorialName()), Utils.line("Recommended by " + tutorialRecommendations[i].getRecommenderName())); - super.setItem(i - iStart, lesson, new guiAction() { - @Override - public void click(NetworkUser u) { - TutorialLibraryGui.startTutorial(plugin, - LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), plugin.getTutorialsDBConnection(), plugin.getLogger()), - user, RecommendedTutorialsMenu.this, tutorial, location); - } - }); + super.setItem(i - iStart, lesson, + (NetworkUser u) -> startTutorial(LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), provider.tutorialsDBConnection(), plugin.getLogger()), + user, this, tutorial, location, log)); } // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); - super.setItem(45, pageBack, new guiAction() { - @Override - public void click(NetworkUser u) { - iPage--; - refresh(); - user.mainGui = RecommendedTutorialsMenu.this; - user.mainGui.open(user); - } + super.setItem(45, pageBack, (NetworkUser u) -> { + iPage--; + refresh(); + updatePlayerInventory(u.player); }); } // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", - Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); - super.setItem(53, pageBack, new guiAction() { - @Override - public void click(NetworkUser u) { - iPage++; - refresh(); - user.mainGui = RecommendedTutorialsMenu.this; - user.mainGui.open(user); - } + super.setItem(53, pageBack, (NetworkUser u) -> { + iPage++; + refresh(); + updatePlayerInventory(u.player); }); } - } - - /** - * Refresh the gui. - * This usually involves clearing the content and recreating it. - */ - @Override - public void refresh() { - this.clearGui(); - - this.addItems(); - } - } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java index c7b869e3..449ff35f 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialLibraryGui.java @@ -1,6 +1,7 @@ package net.bteuk.network.gui.tutorials; -import net.bteuk.network.Network; +import lombok.extern.java.Log; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -9,17 +10,11 @@ import org.bukkit.Material; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import teachingtutorials.guis.Event; -import teachingtutorials.guis.EventType; import teachingtutorials.tutorialobjects.LessonObject; -import teachingtutorials.tutorialobjects.Location; import teachingtutorials.tutorialobjects.Tutorial; -import static net.bteuk.network.utils.Constants.LOGGER; - -public class TutorialLibraryGui extends Gui { - - private final Network plugin; +@Log +public class TutorialLibraryGui extends AbstractTutorialsGui { private final NetworkUser user; @@ -32,18 +27,13 @@ public class TutorialLibraryGui extends Gui { private static final Component inventoryName = Utils.title("Library"); - public TutorialLibraryGui(Network plugin, NetworkUser user, Tutorial[] inUseTutorials, LessonObject[] userCurrentLessons) { + public TutorialLibraryGui(GuiProvider provider, NetworkUser user, LessonObject[] userCurrentLessons) { // Initialises the Gui with the menu icons already set - super(getGUI(inUseTutorials)); + super(provider, getGUI(Tutorial.getInUseTutorialsWithLocations(provider.tutorialsDBConnection(), log))); - this.plugin = plugin; this.user = user; - this.inUseTutorials = inUseTutorials; this.lessons = userCurrentLessons; - - // Sets the actions of the menu - setActions(); } /** @@ -52,7 +42,7 @@ public TutorialLibraryGui(Network plugin, NetworkUser user, Tutorial[] inUseTuto * @param tutorials A list of all in-use tutorials * @return An inventory of icons */ - public static Inventory getGUI(Tutorial[] tutorials) { + private static Inventory getGUI(Tutorial[] tutorials) { // Declare variables int i; int iTutorials; @@ -82,8 +72,7 @@ public static Inventory getGUI(Tutorial[] tutorials) { // Indicates that there are no tutorials in the system if (iTutorials == 0) { - ItemStack noTutorials = teachingtutorials.utils.Utils.createItem(Material.BARRIER, 1, - Utils.title("There are no tutorials available to play currently"), + ItemStack noTutorials = teachingtutorials.utils.Utils.createItem(Material.BARRIER, 1, Utils.title("There are no tutorials available to play currently"), Utils.line("Ask a server admin to get some created")); inventory.setItem(5 - 1, noTutorials); } @@ -92,8 +81,7 @@ public static Inventory getGUI(Tutorial[] tutorials) { // Inv slot 0 = the first one ItemStack tutorial; for (i = 0; i < iTutorials; i++) { - tutorial = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, - Utils.title(tutorials[i].getTutorialName()).decoration(TextDecoration.BOLD, true), + tutorial = teachingtutorials.utils.Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title(tutorials[i].getTutorialName()).decoration(TextDecoration.BOLD, true), Utils.line("Tutor - " + Bukkit.getOfflinePlayer(tutorials[i].getUUIDOfAuthor()).getName())); inventory.setItem(i, tutorial); } @@ -130,98 +118,27 @@ private void setActions() { iRows = iDiv + 2; // Adds back button - setAction((iRows * 9) - 1, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - delete(); - u.mainGui = new TutorialsGui(user); - u.mainGui.open(u.player); - } + setAction((iRows * 9) - 1, (NetworkUser u) -> { + delete(); + u.mainGui = new TutorialsGui(provider, user); + u.mainGui.open(u.player); }); // Inv slot 0 = the first one // Adds the actions of each slot for (i = 0; i < inUseTutorials.length; i++) { int iSlot = i; - setAction(iSlot, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - startTutorial(plugin, lessons, user, TutorialLibraryGui.this, inUseTutorials[iSlot], null); - } - }); - } - } - - /** - * Handles the logic when a player wishes to start a specific tutorial - * - * @param plugin A reference to the instance of the TeachingTutorials plugin - * @param lessons A list of unfinished lessons for the given player - * @param user A reference to the user who wishes to start a specific tutorial - * @param parentGui A reference to the parent gui which to return back - * @param tutorialToStart A reference to the Tutorial that the player wishes to start - * @param locationToStart A reference to the Location that a player wishes to start, if specified - * @return - */ - public static void startTutorial(Network plugin, LessonObject[] lessons, NetworkUser user, Gui parentGui, Tutorial tutorialToStart, Location locationToStart) { - // Check whether the player already has a current lesson for this tutorial - boolean bLessonFound = false; - for (LessonObject lesson : lessons) { - if (tutorialToStart.getTutorialID() == lesson.getTutorialID()) { - // Open confirmation menu - // If location matters then check that - if (locationToStart != null) { - if (locationToStart.getLocationID() == lesson.getLocation().getLocationID()) { - bLessonFound = true; - - user.mainGui = new LessonContinueConfirmer(plugin, user, parentGui, lesson, "You have a lesson at this location already"); - user.mainGui.open(user); - - // Break, let the other menu take over - break; - } - } else { - bLessonFound = true; - // If not then open confirmation menu - user.mainGui = new LessonContinueConfirmer(plugin, user, parentGui, lesson, "You have a lesson for this tutorial already"); - user.mainGui.open(user); - - // Break, let the other menu take over - break; - } - } - } - - // If player doesn't have current lesson for this tutorial then create a new one - if (!bLessonFound) { - if (locationToStart == null) { - // Switch to the tutorial. - if (Event.addEvent(EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - TutorialsGui.switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } else { - // Switch to the tutorial. - if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - TutorialsGui.switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } + setAction(iSlot, (NetworkUser u) -> startTutorial(lessons, user, TutorialLibraryGui.this, inUseTutorials[iSlot], null, log)); } } @Override - public void refresh() { - // Refresh List of available tutorials - this.inUseTutorials = - Tutorial.getInUseTutorialsWithLocations(Network.getInstance().getTutorialsDBConnection(), LOGGER); - - // Refresh icons - this.clearGui(); - Inventory inventory = TutorialLibraryGui.getGUI(this.inUseTutorials); - this.getInventory().setContents(inventory.getContents()); + protected void createGui() { + // Refresh the list of available tutorials + this.inUseTutorials = Tutorial.getInUseTutorialsWithLocations(provider.tutorialsDBConnection(), log); + + Inventory inventory = getGUI(this.inUseTutorials); + setItemsFromInventory(inventory); // Refresh actions setActions(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java index 258b28de..44491573 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java @@ -1,11 +1,10 @@ package net.bteuk.network.gui.tutorials; +import lombok.extern.java.Log; import net.bteuk.network.Network; -import net.bteuk.network.gui.NetworkRefreshableGui; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Role; -import net.bteuk.network.utils.Roles; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -15,18 +14,15 @@ import teachingtutorials.guis.Event; import teachingtutorials.guis.EventType; import teachingtutorials.tutorialobjects.LessonObject; -import teachingtutorials.tutorialobjects.Location; import teachingtutorials.tutorialobjects.Tutorial; import teachingtutorials.tutorialobjects.TutorialRecommendation; import teachingtutorials.tutorialplaythrough.Lesson; import teachingtutorials.utils.User; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; +@Log +public class TutorialsGui extends AbstractTutorialsGui { -public class TutorialsGui extends NetworkRefreshableGui { - - private final Network plugin = Network.getInstance(); + private final Network plugin; private final NetworkUser user; @@ -35,11 +31,6 @@ public class TutorialsGui extends NetworkRefreshableGui { */ private final User tutorialsUser; - /** - * Gets the compulsory tutorial setting - */ - private final boolean bCompulsoryTutorialEnabled = CONFIG.getBoolean("tutorials.compulsory_tutorial"); - /** * The Tutorial of the compulsory tutorial. Null if no compulsory tutorial is set */ @@ -55,52 +46,42 @@ public class TutorialsGui extends NetworkRefreshableGui { */ private Tutorial nextTutorial; - Role applicant = Roles.getRoleById("applicant"); + private final Role applicant; - public TutorialsGui(NetworkUser user) { + public TutorialsGui(GuiProvider provider, NetworkUser user) { - super(27, Component.text("Tutorials Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Tutorials Menu", NamedTextColor.AQUA, TextDecoration.BOLD)); + this.plugin = provider.instance(); this.user = user; + this.applicant = provider.roles().getRoleById("applicant"); // Gets the information about the Tutorials User tutorialsUser = new User(this.user.player); - tutorialsUser.fetchDetailsByUUID(Network.getInstance().getTutorialsDBConnection(), LOGGER); - tutorialsUser.calculateRatings(Network.getInstance().getTutorialsDBConnection()); - - fetchInformation(); - - createGui(); + tutorialsUser.fetchDetailsByUUID(provider.tutorialsDBConnection(), log); + tutorialsUser.calculateRatings(provider.tutorialsDBConnection()); } private void fetchInformation() { // Get compulsory tutorial - Tutorial[] compulsoryTutorials = Tutorial.fetchAll(true, true, null, plugin.getTutorialsDBConnection(), plugin.getLogger()); - if (compulsoryTutorials.length == 0) - compulsoryTutorial = null; - else - compulsoryTutorial = compulsoryTutorials[0]; + Tutorial[] compulsoryTutorials = Tutorial.fetchAll(true, true, null, provider.tutorialsDBConnection(), plugin.getLogger()); + if (compulsoryTutorials.length == 0) compulsoryTutorial = null; + else compulsoryTutorial = compulsoryTutorials[0]; // Get the current unfinished lessons of the player - currentLessons = LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), plugin.getTutorialsDBConnection(), plugin.getLogger()); + currentLessons = LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), provider.tutorialsDBConnection(), plugin.getLogger()); // Get the next tutorial for this player - nextTutorial = Lesson.decideTutorial(tutorialsUser, plugin.getTutorialsDBConnection(), plugin.getLogger()); - } - - protected static void switchServer(NetworkUser user) { - SwitchServer.switchServer(user.player, Network.getInstance().getGlobalSQL().getString("SELECT name FROM " + - "server_data WHERE type='TUTORIAL';")); - user.player.closeInventory(); + nextTutorial = Lesson.decideTutorial(tutorialsUser, provider.tutorialsDBConnection(), plugin.getLogger()); } /** * Creates the icons and actions for this menu */ - private void createGui() { + protected void createGui() { // Checks the system has the compulsory tutorial feature enabled and the user hasn't completed the compulsory tutorial - if (bCompulsoryTutorialEnabled && compulsoryTutorial != null && !tutorialsUser.bHasCompletedCompulsory) { + if (provider.constants().compulsoryTutorial() && compulsoryTutorial != null && !tutorialsUser.bHasCompletedCompulsory) { // Check if they have started the compulsory LessonObject compulsoryLesson = null; for (LessonObject lesson : currentLessons) { @@ -110,57 +91,39 @@ private void createGui() { } } - if (compulsoryLesson == null) - compulsoryNeverStarted(); - else - compulsoryNotFinished(compulsoryLesson); + if (compulsoryLesson == null) compulsoryNeverStarted(); + else compulsoryNotFinished(compulsoryLesson); } else - // User has not completed compulsory tutorial or doesn't need to + // User has not completed the compulsory tutorial or doesn't need to compulsoryFinished(); // Admin and creator menu if (user.player.hasPermission("TeachingTutorials.Admin") || user.player.hasPermission("TeachingTutorials.Creator")) { // Admin and creator menu - super.setItem(19 - 1, teachingtutorials.utils.Utils.createItem(Material.LECTERN, 1, - Utils.title("Admin Menu"), Utils.line("Teleport to the tutorials server")), user -> - { - switchServer(user); - }); + super.setItem(19 - 1, teachingtutorials.utils.Utils.createItem(Material.LECTERN, 1, Utils.title("Admin Menu"), Utils.line("Teleport to the tutorials server")), + this::switchServer); } // Return - setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the navigator main menu.")), - user -> + setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), (NetworkUser user) -> { - { + // Delete this gui. + this.delete(); + user.mainGui = null; - // Delete this gui. - this.delete(); - user.mainGui = null; - - // Switch to navigation menu. - Network.getInstance().navigatorGui.open(user); - }); + // Switch to the navigation menu. + provider.navigator().openMainMenu(user); + }); } /** * Adds the menu items for if the compulsory tutorial has never been started */ private void compulsoryNeverStarted() { - ItemStack beginCompulsory = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, - Utils.title("Begin the Starter Tutorial"), - Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : - applicant.getColouredRoleName()) - .append(Utils.line("rank!"))); - - super.setItem(14 - 1, beginCompulsory, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - startTutorial(compulsoryTutorial, null); - } - }); + ItemStack beginCompulsory = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, Utils.title("Begin the Starter Tutorial"), + Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : applicant.getColouredRoleName()).append(Utils.line("rank!"))); + + super.setItem(14 - 1, beginCompulsory, (NetworkUser u) -> startTutorial(currentLessons, u, this, compulsoryTutorial, null, log)); } @@ -171,41 +134,23 @@ public void click(NetworkUser u) { */ private void compulsoryNotFinished(LessonObject compulsoryLesson) { // Restart compulsory - ItemStack restartCompulsory = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, - Utils.title("Restart the Starter Tutorial"), - Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : - applicant.getColouredRoleName()) - .append(Utils.line("rank!"))); - - super.setItem(12 - 1, restartCompulsory, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - // Switch to the tutorial. - if (Event.addEvent(EventType.RESTART_LESSON, user.player.getUniqueId(), compulsoryLesson.getLessonID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } + ItemStack restartCompulsory = teachingtutorials.utils.Utils.createItem(Material.BOOK, 1, Utils.title("Restart the Starter Tutorial"), + Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : applicant.getColouredRoleName()).append(Utils.line("rank!"))); + + super.setItem(12 - 1, restartCompulsory, (NetworkUser u) -> { + // Switch to the tutorial. + if (Event.addEvent(EventType.RESTART_LESSON, user.player.getUniqueId(), compulsoryLesson.getLessonID(), provider.tutorialsDBConnection(), log)) switchServer(user); + else user.sendMessage(Utils.error("A problem occurred, please let staff know")); }); // Resume compulsory - ItemStack resumeCompulsory = teachingtutorials.utils.Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title("Resume the Starter Tutorial"), - Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : - applicant.getColouredRoleName()) - .append(Utils.line("rank!"))); - - super.setItem(16 - 1, resumeCompulsory, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - // Switch to the tutorial. - if (Event.addEvent(EventType.CONTINUE_LESSON, user.player.getUniqueId(), compulsoryLesson.getLessonID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } + ItemStack resumeCompulsory = teachingtutorials.utils.Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Resume the Starter Tutorial"), + Utils.line("Gain the ").append(applicant == null ? Utils.line("Applicant") : applicant.getColouredRoleName()).append(Utils.line("rank!"))); + + super.setItem(16 - 1, resumeCompulsory, (NetworkUser u) -> { + // Switch to the tutorial. + if (Event.addEvent(EventType.CONTINUE_LESSON, user.player.getUniqueId(), compulsoryLesson.getLessonID(), provider.tutorialsDBConnection(), log)) switchServer(user); + else user.sendMessage(Utils.error("A problem occurred, please let staff know")); }); } @@ -214,127 +159,48 @@ public void click(NetworkUser u) { */ private void compulsoryFinished() { // Compulsory tutorial - ItemStack compulsory = teachingtutorials.utils.Utils.createItem(Material.JUNGLE_DOOR, 1, - Utils.title("Redo the Starter Tutorial"), + ItemStack compulsory = teachingtutorials.utils.Utils.createItem(Material.JUNGLE_DOOR, 1, Utils.title("Redo the Starter Tutorial"), Utils.line("Refresh your essential knowledge")); - super.setItem(9, compulsory, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - startTutorial(compulsoryTutorial, null); - } - }); + super.setItem(9, compulsory, (NetworkUser u) -> startTutorial(currentLessons, u, this, compulsoryTutorial, null, log)); //---------- Library Option ---------- - ItemStack tutorialLibrary = teachingtutorials.utils.Utils.createItem(Material.BOOKSHELF, 1, - Utils.title("Tutorial Library"), + ItemStack tutorialLibrary = teachingtutorials.utils.Utils.createItem(Material.BOOKSHELF, 1, Utils.title("Tutorial Library"), Utils.line("Browse all of our available tutorials")); - super.setItem(11, tutorialLibrary, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = new TutorialLibraryGui(plugin, user, Tutorial.getInUseTutorialsWithLocations(plugin.getTutorialsDBConnection(), plugin.getLogger()), - LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), plugin.getTutorialsDBConnection(), plugin.getLogger())); - user.mainGui.open(user); - delete(); - } + super.setItem(11, tutorialLibrary, (NetworkUser u) -> { + user.mainGui = new TutorialLibraryGui(provider, user, + LessonObject.getUnfinishedLessonsOfPlayer(user.player.getUniqueId(), provider.tutorialsDBConnection(), plugin.getLogger())); + user.mainGui.open(user.player); + delete(); }); // Current lessons - ItemStack currentLessons = teachingtutorials.utils.Utils.createItem(Material.WRITABLE_BOOK, 1, - Utils.title("Current Lessons"), - Utils.line("View your unfinished lessons")); - super.setItem(13, currentLessons, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = new LessonsMenu(plugin, user, TutorialsGui.this, TutorialsGui.this.currentLessons); - user.mainGui.open(user); - } + ItemStack currentLessons = teachingtutorials.utils.Utils.createItem(Material.WRITABLE_BOOK, 1, Utils.title("Current Lessons"), Utils.line("View your unfinished lessons")); + super.setItem(13, currentLessons, (NetworkUser u) -> { + user.mainGui = new LessonsMenu(provider, user, this, TutorialsGui.this.currentLessons); + user.mainGui.open(user.player); }); // Tutorial recommendations - super.setItem(15, Utils.createItem(Material.CHEST, 1, Utils.title("Recommended Tutorials")), - new guiAction() { - @Override - public void click(NetworkUser u) { - user.mainGui = new RecommendedTutorialsMenu(plugin, TutorialsGui.this, user, - TutorialRecommendation.fetchTutorialRecommendationsForPlayer(plugin.getTutorialsDBConnection(), plugin.getLogger(), user.player.getUniqueId())); - user.mainGui.open(user); - } - }); + super.setItem(15, Utils.createItem(Material.CHEST, 1, Utils.title("Recommended Tutorials")), (NetworkUser u) -> { + user.mainGui = new RecommendedTutorialsMenu(provider, this, user, + TutorialRecommendation.fetchTutorialRecommendationsForPlayer(provider.tutorialsDBConnection(), plugin.getLogger(), user.player.getUniqueId())); + user.mainGui.open(user.player); + }); // Continue learning/next tutorial - ItemStack continueLearning = teachingtutorials.utils.Utils.createItem(Material.END_CRYSTAL, 1, - Utils.title("Start a new Tutorial:"), + ItemStack continueLearning = teachingtutorials.utils.Utils.createItem(Material.END_CRYSTAL, 1, Utils.title("Start a new Tutorial:"), Utils.line(nextTutorial.getTutorialName())); - if (nextTutorial != null) - super.setItem(17, continueLearning, new Gui.guiAction() { - @Override - public void click(NetworkUser u) { - startTutorial(nextTutorial, null); - } - }); - } - - /** - * Handles the logic when a player wishes to start a tutorial - * - * @param tutorialToStart A reference to the Tutorial that the player wishes to start - * @return - */ - public void startTutorial(Tutorial tutorialToStart, Location locationToStart) { - // Check whether the player already has a current lesson for this tutorial - boolean bLessonFound = false; - for (LessonObject lesson : currentLessons) { - if (tutorialToStart.getTutorialID() == lesson.getTutorialID()) { - // Open confirmation menu - // If location matters then check that - if (locationToStart != null) { - if (locationToStart.getLocationID() == lesson.getLocation().getLocationID()) { - bLessonFound = true; - - user.mainGui = new LessonContinueConfirmer(plugin, user, this, lesson, "You have a lesson at this location already"); - user.mainGui.open(user); - - // Break, let the other menu take over - break; - } - } else { - bLessonFound = true; - // If not then open confirmation menu - user.mainGui = new LessonContinueConfirmer(plugin, user, this, lesson, "You have a lesson for this tutorial already"); - user.mainGui.open(user); - - // Break, let the other menu take over - break; - } - } - } - - // If player doesn't have current lesson for this tutorial then create a new one - if (!bLessonFound) { - if (locationToStart == null) { - // Switch to the tutorial. - if (Event.addEvent(EventType.START_TUTORIAL, user.player.getUniqueId(), tutorialToStart.getTutorialID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } else { - // Switch to the tutorial. - if (Event.addEvent(EventType.START_LOCATION, user.player.getUniqueId(), locationToStart.getLocationID(), - Network.getInstance().getTutorialsDBConnection(), LOGGER)) - switchServer(user); - else - user.sendMessage(Utils.error("A problem occurred, please let staff know")); - } + if (nextTutorial != null) { + super.setItem(17, continueLearning, (NetworkUser u) -> startTutorial(this.currentLessons, u, this, nextTutorial, null, log)); } } + @Override public void refresh() { - - this.clearGui(); + this.clear(); fetchInformation(); createGui(); } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java index 3e910a32..cf3089be 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java @@ -1,5 +1,7 @@ package net.bteuk.network.utils; +import net.bteuk.network.core.Time; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.lib.utils.ChatUtils; import net.kyori.adventure.text.Component; @@ -20,15 +22,14 @@ public class LightsOut extends NetworkRefreshableGui { private final long startTime; private boolean[][] game; - public LightsOut(NetworkUser u) { + public LightsOut(GuiProvider provider, NetworkUser u) { - super(54, Component.text("Lights Out", NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 54, Component.text("Lights Out", NamedTextColor.AQUA, TextDecoration.BOLD)); this.u = u; startTime = Time.currentTime(); initialize(); - setItems(); } public void initialize() { @@ -57,14 +58,12 @@ public void endGame() { this.delete(); u.player.sendMessage(ChatUtils.success("Congratulations, you beat Lights Out!")); - u.player.sendMessage(ChatUtils.success("You took ") - .append(Component.text(Time.minutes(timeDiff), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(" " + Time.minuteString(timeDiff) + " and ")) - .append(Component.text(Time.seconds(timeDiff), NamedTextColor.DARK_AQUA)) + u.player.sendMessage(ChatUtils.success("You took ").append(Component.text(Time.minutes(timeDiff), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(" " + Time.minuteString(timeDiff) + " and ")).append(Component.text(Time.seconds(timeDiff), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" " + Time.secondString(timeDiff) + "."))); } - public void setItems() { + public void createGui() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 6; j++) { @@ -75,19 +74,17 @@ public void setItems() { if (game[i][j]) { // Light is on. - setItem(i + j * 9, Utils.createItem(Material.SEA_LANTERN, 1, Component.empty()), - (NetworkUser u) -> invertLights(finalI, finalJ)); + setItem(i + j * 9, Utils.createItem(Material.SEA_LANTERN, 1, Component.empty()), (NetworkUser u) -> invertLights(finalI, finalJ)); } else { // Light is off. - setItem(i + j * 9, Utils.createItem(Material.REDSTONE_LAMP, 1, Component.empty()), - (NetworkUser u) -> invertLights(finalI, finalJ)); + setItem(i + j * 9, Utils.createItem(Material.REDSTONE_LAMP, 1, Component.empty()), (NetworkUser u) -> invertLights(finalI, finalJ)); } } } } - public void invertLights(int i, int j) { + private void invertLights(int i, int j) { // Invert this slot and the adjacent slots. game[i][j] = !game[i][j]; @@ -114,19 +111,18 @@ public void invertLights(int i, int j) { public void refresh() { - // Check if solution is complete. - // If it is then stop end the game. + // Check if the solution is complete. + // If it is, then stop and end the game. if (Arrays.deepEquals(game, new boolean[9][6])) { - endGame(); } else { // Change items. - clearGui(); - setItems(); + clear(); + createGui(); - // Set contents of inventory. - u.player.getOpenInventory().getTopInventory().setContents(getInventory().getContents()); + // Set the contents of inventory. + updatePlayerInventory(u.player); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 401e640b..e607a650 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -126,6 +126,7 @@ public net.bteuk.network.core.Constants getConstants() { boolean tips = config.getBoolean("chat.tips.enabled"); boolean tutorials = config.getBoolean("tutorials.enabled"); + boolean compulsoryTutorial = config.getBoolean("tutorials.compulsory_tutorial"); boolean llEnabled = config.getBoolean("ll_enabled"); @@ -183,10 +184,12 @@ public net.bteuk.network.core.Constants getConstants() { int progressMapID = config.getInt("ProgressMap.ProgressMapID"); String mapHubAPIKey = config.getString("ProgressMap.MapHubAPIKey"); + int navigationRadius = config.getInt("navigation_radius", 200); + log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, - chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey); + chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey, navigationRadius, compulsoryTutorial); } } \ No newline at end of file From 154b287a4f3c4a237674083c5ec70a2b4781a58c Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 30 Aug 2025 16:27:30 +0200 Subject: [PATCH 16/96] Fix remaining compiler errors, commented out code that is unused/broken. --- Core/pom.xml | 1 - .../net/bteuk/network/core/Constants.java | 5 +- .../bteuk/network/core/sql/DatabaseInit.java | 46 --- .../java/net/bteuk/network/api/TimerAPI.java | 2 + Plugin/pom.xml | 26 +- .../main/java/net/bteuk/network/Network.java | 126 +++--- .../main/java/net/bteuk/network/Timers.java | 42 +- .../bteuk/network/api/impl/TimerAPIImpl.java | 8 + .../java/net/bteuk/network/commands/Msg.java | 2 +- .../net/bteuk/network/commands/Navigator.java | 2 + .../net/bteuk/network/commands/Phead.java | 11 +- .../java/net/bteuk/network/commands/Plot.java | 46 +-- .../bteuk/network/commands/PmuteAction.java | 2 +- .../network/commands/PromotionAction.java | 2 +- .../bteuk/network/commands/give/GiveItem.java | 2 +- .../network/commands/navigation/BTEUK.java | 44 +-- .../network/commands/navigation/Delhome.java | 2 +- .../network/commands/navigation/Home.java | 2 +- .../commands/navigation/Navigation.java | 11 +- .../network/commands/navigation/Server.java | 2 +- .../network/commands/navigation/Teleport.java | 8 +- .../network/commands/navigation/Tpll.java | 187 ++++----- .../network/commands/navigation/Warp.java | 2 +- .../bteuk/network/commands/staff/Staff.java | 32 +- .../commands/tabcompleters/HomeSelector.java | 10 +- .../LocationAndSubcategorySelector.java | 14 +- .../tabcompleters/LocationSelector.java | 18 +- .../tabcompleters/NavigationTabCompleter.java | 12 +- .../tabcompleters/PlayerSelector.java | 17 +- .../tabcompleters/ServerSelector.java | 21 +- .../listeners/ClickableItemListener.java | 6 +- .../network/eventing/listeners/Connect.java | 18 +- .../eventing/listeners/PlayerInteract.java | 14 +- .../navigation/LocationNameListener.java | 24 +- .../listeners/navigation/LocationSearch.java | 14 +- .../FeatureGeometryEditorListener.java | 240 +++++------ .../FeaturePropertiesBookListener.java | 154 ++++---- .../staff/ModerationReasonListener.java | 11 +- .../java/net/bteuk/network/gui/BuildGui.java | 36 +- .../network/gui/navigation/AddLocation.java | 4 +- .../network/gui/navigation/ExploreGui.java | 12 +- .../gui/plotsystem/DeniedPlotFeedback.java | 2 +- .../network/gui/plotsystem/PlotInfo.java | 2 +- .../gui/plotsystem/VerificationInfo.java | 4 +- .../gui/progressmap/ColourPickerGUI.java | 374 +++++++++--------- .../gui/progressmap/FeaturePageGUI.java | 280 ++++++------- .../gui/progressmap/LocalFeatureListGUI.java | 140 +++---- .../gui/staff/ModerationActionGui.java | 2 +- .../network/gui/staff/ModerationGui.java | 10 +- .../bteuk/network/gui/staff/SelectUser.java | 4 +- .../network/gui/tutorials/LessonsMenu.java | 4 +- .../gui/tutorials/RecommendationAddGui.java | 8 +- .../tutorials/RecommendedTutorialsGui.java | 8 +- .../tutorials/RecommendedTutorialsMenu.java | 4 +- .../java/net/bteuk/network/lobby/Lobby.java | 67 ++-- .../java/net/bteuk/network/lobby/Map.java | 170 ++++---- .../net/bteuk/network/lobby/MapCommand.java | 24 +- .../java/net/bteuk/network/lobby/Portal.java | 9 +- .../net/bteuk/network/lobby/VoidTeleport.java | 4 +- .../java/net/bteuk/network/sql/PlotSQL.java | 6 +- .../java/net/bteuk/network/utils/Coins.java | 72 ++-- .../bteuk/network/utils/NetworkConfig.java | 15 +- .../net/bteuk/network/utils/NetworkUser.java | 25 +- .../java/net/bteuk/network/utils/Points.java | 214 +++++----- .../net/bteuk/network/utils/Statistics.java | 13 +- .../net/bteuk/network/utils/SwitchServer.java | 20 +- .../network/utils/TutorialRecommendation.java | 22 +- .../java/net/bteuk/network/utils/Utils.java | 52 +-- .../utils/plotsystem/ReviewFeedback.java | 44 ++- .../network/utils/progression/Level.java | 212 +++++----- .../TextEditorBookListener.java | 28 +- .../utils/worldguard/WorldguardManager.java | 2 +- .../utils/worldguard/WorldguardMembers.java | 4 +- .../worldguard/WorldguardPlotsystem.java | 92 +---- .../utils/worldguard/WorldguardRegions.java | 2 +- .../utils/worldguard/WorldguardUtils.java | 2 +- .../network/utils/progression/LevelTest.java | 46 --- .../network/utils/staff/ModerationTest.java | 47 --- .../bteuk/network/regions/RegionManager.java | 295 +++++--------- .../net/bteuk/network/regions/RegionUser.java | 39 +- pom.xml | 35 ++ 81 files changed, 1692 insertions(+), 1949 deletions(-) delete mode 100644 Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java delete mode 100644 Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java delete mode 100644 Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java diff --git a/Core/pom.xml b/Core/pom.xml index 692e378b..faf74e5c 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -30,7 +30,6 @@ mysql-connector-j 8.4.0 - \ No newline at end of file diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index cbcd7d11..63469b19 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -1,5 +1,7 @@ package net.bteuk.network.core; +import net.bteuk.network.api.entity.NetworkLocation; + import java.util.List; public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, @@ -9,5 +11,6 @@ public record Constants(String serverName, ServerType serverType, boolean standa boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, - int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial) { + int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial, int afkTime, boolean mapEnabled, + String mapServer, NetworkLocation mapLocation, NetworkLocation spawnLocation) { } \ No newline at end of file diff --git a/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java b/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java deleted file mode 100644 index 64df4bb6..00000000 --- a/Core/src/main/java/net/bteuk/network/core/sql/DatabaseInit.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.bteuk.network.core.sql; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.Properties; - -public class DatabaseInit { - - // Creates the mysql connection. - public DataSource mysqlSetup(String database, String host, int port, String username, String password) throws SQLException { - - HikariConfig cfg = new HikariConfig(); - - cfg.setJdbcUrl("jdbc:mysql://" + host + ":" + port + "/" + database - + "?rewriteBatchedStatements=true" - + "&allowPublicKeyRetrieval=true" - + "&useSSL=false" - + "&cachePrepStmts=true" - + "&prepStmtCacheSize=256" - + "&prepStmtCacheSqlLimit=2048" - + "&connectTimeout=10000" - + "&socketTimeout=30000" - + "&connectionTimeZone=UTC"); - - cfg.setUsername(username); - cfg.setPassword(password); - - cfg.setMaximumPoolSize(20); - cfg.setMinimumIdle(2); - cfg.setConnectionTimeout(15000); - cfg.setIdleTimeout(300000); - cfg.setMaxLifetime(1800000); - cfg.setKeepaliveTime(300000); - cfg.setPoolName("NetworkHikariPool"); - - Properties dsProps = new Properties(); - dsProps.setProperty("useUnicode", "true"); - dsProps.setProperty("characterEncoding", "utf8"); - cfg.setDataSourceProperties(dsProps); - - return new HikariDataSource(cfg); - } -} diff --git a/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java b/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java index 614d63c9..99b80154 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/TimerAPI.java @@ -27,4 +27,6 @@ default int registerTimer(Runnable runnable, long intervalMillis) { * @return the timer id */ int registerTimer(Runnable runnable, long intervalMillis, long delay); + + void cancelTimer(int timerId); } diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 7d5f9533..89f7a91a 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -25,15 +25,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compiler.version} - - ${java.version} - ${java.version} - - org.apache.maven.plugins maven-shade-plugin @@ -138,6 +129,11 @@ Minecraft + + com.github.BTEUK.Proxy + database + + io.papermc.paper @@ -175,8 +171,6 @@ org.projectlombok lombok - 1.18.34 - provided io.papermc @@ -212,11 +206,11 @@ - - com.github.BTEUK - ProgressMapper - 231624865f - + + + + + com.github.BTEUK NetworkLib diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 82ccb375..1ff82580 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -67,7 +67,6 @@ import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import net.bteuk.network.core.Time; -import net.bteuk.network.core.sql.DatabaseInit; import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.eventing.events.InviteEvent; import net.bteuk.network.eventing.events.KickEvent; @@ -78,7 +77,6 @@ import net.bteuk.network.eventing.listeners.NetworkTeleportListener; import net.bteuk.network.eventing.listeners.PlayerInteract; import net.bteuk.network.eventing.listeners.PreJoinServer; -import net.bteuk.network.gui.NavigatorGui; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.OnlineUserAdd; import net.bteuk.network.lib.dto.OnlineUserRemove; @@ -101,6 +99,7 @@ import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.staff.Moderation; import net.bteuk.network.utils.worldguard.WorldGuard; +import net.bteuk.proxy.database.DatabaseInit; import net.bteuk.teachingtutorials.services.PromotionService; import net.buildtheearth.terraminusminus.TerraConfig; import org.bukkit.Material; @@ -127,9 +126,9 @@ public final class Network extends JavaPlugin implements NetworkAPI { // If the server can shut down. public boolean allowShutdown; - // Guis - public NavigatorGui navigatorGui; - public ItemStack navigatorItem; + + @Getter + private ItemStack navigatorItem; public RegionSQL regionSQL; // Movement listeners. public NetworkMoveListener moveListener; @@ -218,22 +217,27 @@ public void onEnable() { String password = networkConfig.getConfig().getString("password"); // Global Database - String global_database = networkConfig.getConfig().getString("database.global"); - DataSource global_dataSource = init.mysqlSetup(global_database, host, port, username, password); - globalSQL = new GlobalSQL(global_dataSource, constants); + String globalDatabase = networkConfig.getConfig().getString("database.global"); + DataSource globalDataSource = init.mysqlSetup(globalDatabase, host, port, username, password); + globalSQL = new GlobalSQL(globalDataSource, constants); // Region Database + String regionDatabase = networkConfig.getConfig().getString("database.region"); + DataSource regionDataSource = init.mysqlSetup(regionDatabase, host, port, username, password); if (constants.regionsEnabled()) { - String region_database = networkConfig.getConfig().getString("database.region"); - DataSource region_dataSource = init.mysqlSetup(region_database, host, port, username, password); - regionSQL = new RegionSQL(region_dataSource); + regionSQL = new RegionSQL(regionDataSource); } // Plot Database + String plotDatabase = networkConfig.getConfig().getString("database.plot"); + DataSource plotDataSource = init.mysqlSetup(plotDatabase, host, port, username, password); if (constants.plotSystemEnabled()) { - String plot_database = networkConfig.getConfig().getString("database.plot"); - DataSource plot_dataSource = init.mysqlSetup(plot_database, host, port, username, password); - plotSQL = new PlotSQL(plot_dataSource); + plotSQL = new PlotSQL(plotDataSource); + } + + // Init and update the schemas if standalone, since there is no proxy to do it. + if (constants.standalone()) { + init.initializeSchemas(globalDataSource, plotDataSource, regionDataSource); } } catch (SQLException | RuntimeException e) { getLogger().severe("Failed to connect to the database, please check that you have set the config values " + "correctly."); @@ -304,7 +308,7 @@ public void enablePlugin() { Roles roles = new Roles(this, plotSQL); if (!constants.standalone()) { - serverAPI = new SwitchServer(constants); + serverAPI = new SwitchServer(this, constants); } if (constants.plotSystemEnabled()) { @@ -319,9 +323,11 @@ public void enablePlugin() { Afk afk = new Afk(this, chat); commandManager.registerCommand(afk); + Nightvision nightvision = new Nightvision(this); + // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager); + Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventManager, regionManager); Moderation moderation = new Moderation(this, eventManager); @@ -349,37 +355,9 @@ public void enablePlugin() { timerAPI = new TimerAPIImpl(this); // Set up the lobby, most features are only enabled in the lobby server. - Lobby lobby = new Lobby(this); - // Create the rules book. - lobby.loadRules(); - if (!constants.standalone()) { - if (constants.serverType() == ServerType.LOBBY) { - - // Set spawn location and enable auto-spawn teleport when falling in the void. - lobby.setSpawn(); - lobby.enableVoidTeleport(); - - lobby.reloadPortals(); - - // Set the rules lectern. - lobby.setLectern(); - } - - // Set up the map. - lobby.reloadMap(); - } + Lobby lobby = new Lobby(this, constants, serverAPI, eventManager); // Enable commands - if (constants.tpllEnabled()) { - TerraConfig.reducedConsoleMessages = true; - tpll = new Tpll(this, constants.tpllRequiresPermission()); - commandManager.registerCommand(tpll); - } - - if (constants.ll()) { - commandManager.registerCommand(new Where(plotSQL, constants)); - } - if (constants.moderationEnabled()) { commandManager.registerCommand(new Kick(this, moderation)); commandManager.registerCommand(new Mute(this, moderation)); @@ -394,10 +372,14 @@ public void enablePlugin() { commandManager.registerCommand(new Teleport(this, back, eventManager, serverAPI, constants)); commandManager.registerCommand(new TpToggle(this)); - if (constants.warpsEnabled()) { - new Warp(this, constants, plotAPI, back, eventManager, serverAPI); - new Warps(this); - new Navigation(this); + if (constants.tpllEnabled()) { + TerraConfig.reducedConsoleMessages = true; + tpll = new Tpll(this, constants.tpllRequiresPermission(), regionManager, constants, plotSQL, eventManager, serverAPI, back, globalSQL); + commandManager.registerCommand(tpll); + } + + if (constants.ll()) { + commandManager.registerCommand(new Where(plotSQL, constants)); } if (!constants.standalone()) { @@ -413,13 +395,6 @@ public void enablePlugin() { commandManager.registerCommand(new Homes(this)); } - if (constants.plotSystemEnabled()) { - commandManager.registerCommand(new Plot(this, eventManager, plotSQL)); - commandManager.registerCommand(new Zone(plotSQL, eventManager)); - } - - commandManager.registerCommand(new Staff(this, constants, globalSQL, chat)); - /* * Utility commands. */ @@ -429,7 +404,6 @@ public void enablePlugin() { commandManager.registerCommand(new Focus(this, constants)); } - Nightvision nightvision = new Nightvision(this); commandManager.registerCommand(nightvision); commandManager.registerCommand(new Speed()); commandManager.registerCommand(new Help(constants, roles)); @@ -439,7 +413,7 @@ public void enablePlugin() { commandManager.registerCommand(new GiveLight(this)); commandManager.registerCommand(new GiveBarrier(this)); commandManager.registerCommand(new Gamemode(constants)); - commandManager.registerCommand(new Phead(globalSQL)); + commandManager.registerCommand(new Phead(this, globalSQL)); if (constants.skullsEnabled()) { commandManager.registerCommand(new Hdb()); } @@ -476,9 +450,42 @@ public void enablePlugin() { commandManager.registerCommand(navigator); new PlayerInteract(this, navigator); + if (constants.warpsEnabled()) { + new Warp(this, constants, plotAPI, back, eventManager, serverAPI); + new Warps(this); + new Navigation(this, navigator.getProvider()); + } + + if (constants.plotSystemEnabled()) { + commandManager.registerCommand(new Plot(navigator.getProvider())); + commandManager.registerCommand(new Zone(plotSQL, eventManager)); + } + + commandManager.registerCommand(new Staff(navigator.getProvider())); + // Register the command pre-process to make sure network versions of commands run and not that of another plugin. new CommandPreProcess(this, constants, afk, connect, serverAPI); + // Create the rules-book. + lobby.setGuiProvider(navigator.getProvider()); + lobby.loadRules(); + if (!constants.standalone()) { + if (constants.serverType() == ServerType.LOBBY) { + + // Set spawn-location and enable auto-spawn teleport when falling in the void. + lobby.setSpawn(); + lobby.enableVoidTeleport(); + + lobby.reloadPortals(); + + // Set the rules-lectern. + lobby.setLectern(); + } + + // Set up the map. + lobby.reloadMap(commandManager); + } + commandManager.enableCommands(); // Enable tips. @@ -510,6 +517,9 @@ public void enablePlugin() { eventManager.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); eventManager.registerEvent("kick", new KickEvent()); + // Start the Network timers. + new Timers(this, globalSQL, eventManager, constants, afk); + // Let the Proxy know that the server is enabled. chat.sendSocketMessage(new ServerStartup(constants.serverName())); diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 849b8cb5..539aa6d2 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -7,13 +7,10 @@ import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - @Log public class Timers { @@ -21,8 +18,7 @@ public class Timers { private final Network instance; // Users private final ArrayList users; - // Timers - private final ArrayList timers; + // SQL private final GlobalSQL globalSQL; @@ -48,8 +44,6 @@ public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager, this.globalSQL = globalSQL; - this.timers = new ArrayList<>(); - this.eventManager = eventManager; events = new ArrayList<>(); @@ -58,18 +52,18 @@ public Timers(Network instance, GlobalSQL globalSQL, EventManager eventManager, this.afk = afk; // Minutes * 60 seconds * 1000 milliseconds - afkTime = CONFIG.getInt("afk") * 60L * 1000L; + afkTime = constants.afkTime() * 60L * 1000L; + + startTimers(); } public void startTimers() { - // 1 tick timer. - timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { + // 1-tick timer (50ms) + instance.getTimerAPI().registerTimer(() -> { // Check for new server_events. - // TODO: Make this asynchronous. - if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "' AND type='network" + - "';")) { + if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "' AND type='network" + "';")) { // If events are not empty, skip this iteration. // Additionally, isBusy needs to be false, implying that the server is not still running a previous @@ -98,10 +92,10 @@ public void startTimers() { isBusy = false; } } - }, 0L, 1L)); + }, 50L); - // 1-second timer. - timers.add(instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, () -> { + // 1-second timer (1000ms) + instance.getTimerAPI().registerTimer(() -> { // Get current time. long time = Time.currentTime(); @@ -113,9 +107,9 @@ public void startTimers() { slot9 = user.player.getInventory().getItem(8); if (slot9 == null) { - user.player.getInventory().setItem(8, instance.navigatorItem); - } else if (!(slot9.equals(instance.navigatorItem))) { - user.player.getInventory().setItem(8, instance.navigatorItem); + user.player.getInventory().setItem(8, instance.getNavigatorItem()); + } else if (!(slot9.equals(instance.getNavigatorItem()))) { + user.player.getInventory().setItem(8, instance.getNavigatorItem()); } } @@ -129,14 +123,6 @@ public void startTimers() { afk.updateAfkStatus(user, true); } } - }, 0L, 20L)); - } - - public void close() { - - // Cancel all timers. - for (int timer : timers) { - Bukkit.getScheduler().cancelTask(timer); - } + }, 1000L); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java index a4a9c3ec..7fa3671d 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java @@ -25,6 +25,14 @@ public int registerTimer(Runnable runnable, long intervalMillis, long delay) { return id; } + @Override + public void cancelTimer(int timerId) { + if (timers.containsKey(timerId)) { + instance.getServer().getScheduler().cancelTask(timerId); + timers.remove(timerId); + } + } + @Override public void shutdown() { timers.forEach((id, runnable) -> instance.getServer().getScheduler().cancelTask(id)); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java index d67d35b4..c6e35e5d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java @@ -25,7 +25,7 @@ public class Msg extends AbstractCommand { public Msg(Network instance, String commandName) { this.instance = instance; this.commandName = commandName; - setTabCompleter(new PlayerSelector()); + setTabCompleter(new PlayerSelector(instance)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index f7f0cf9c..fd7ea622 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.Getter; import lombok.extern.java.Log; import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; @@ -35,6 +36,7 @@ @Log public class Navigator extends AbstractCommand { + @Getter private final GuiProvider provider; private final Network instance; private final Constants constants; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Phead.java b/Plugin/src/main/java/net/bteuk/network/commands/Phead.java index 3f2f0739..22267000 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Phead.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Phead.java @@ -1,6 +1,7 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; import net.bteuk.network.api.SQLAPI; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.utils.ChatUtils; @@ -13,12 +14,14 @@ public class Phead extends AbstractCommand { - private SQLAPI globalSQL; + private final Network instance; + private final SQLAPI globalSQL; // Constructor to enable the command. - public Phead(SQLAPI globalSQL) { + public Phead(Network instance, SQLAPI globalSQL) { + this.instance = instance; this.globalSQL = globalSQL; - setTabCompleter(new PlayerSelector(false)); + setTabCompleter(new PlayerSelector(instance, false)); } @Override @@ -49,7 +52,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) String name = globalSQL.getString("SELECT name FROM player_data WHERE name='" + args[0] + "';"); // Give item to player. - Utils.giveItem(player, Utils.createPlayerSkull(uuid, 1, Component.text(name + "'s head", NamedTextColor.GOLD).decoration(TextDecoration.ITALIC, false)), + Utils.giveItem(instance, player, Utils.createPlayerSkull(uuid, 1, Component.text(name + "'s head", NamedTextColor.GOLD).decoration(TextDecoration.ITALIC, false)), name + "'s head"); } else { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index c5c19ebf..0367cb31 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -2,13 +2,11 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; -import net.bteuk.network.Network; -import net.bteuk.network.api.EventAPI; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.plotsystem.PlotInfo; import net.bteuk.network.gui.plotsystem.PlotMenu; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.PlotStatus; @@ -22,14 +20,10 @@ @Log public class Plot extends AbstractCommand { - private final Network instance; - private final EventAPI eventAPI; - private final PlotSQL plotSQL; + private final GuiProvider provider; - public Plot(Network instance, EventAPI eventAPI, PlotSQL plotSQL) { - this.instance = instance; - this.eventAPI = eventAPI; - this.plotSQL = plotSQL; + public Plot(GuiProvider guiProvider) { + this.provider = guiProvider; setTabCompleter(new FixedArgSelector(Arrays.asList("info", "join"), 0)); } @@ -69,7 +63,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) private void menu(Player p) { // Get the user. - NetworkUser u = instance.getUser(p); + NetworkUser u = provider.instance().getUser(p); if (u == null) { p.sendMessage(ChatUtils.error("An error occurred, please rejoin!")); log.severe("No user exists for player " + p.getName()); @@ -79,7 +73,7 @@ private void menu(Player p) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new PlotMenu(u); + u.mainGui = new PlotMenu(provider, u); u.mainGui.open(u.player); } @@ -89,13 +83,13 @@ private void info(Player p, int plot) { return; } // Check if the plot exists and is not deleted. - PlotStatus status = PlotStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_data WHERE id=" + plot + ";")); + PlotStatus status = PlotStatus.fromDatabaseValue(provider.plotSQL().getString("SELECT status FROM plot_data WHERE id=" + plot + ";")); if (status == null || status == PlotStatus.DELETED) { p.sendMessage(ChatUtils.error("This plot does not exist.")); return; } // Get the user. - NetworkUser u = instance.getUser(p); + NetworkUser u = provider.instance().getUser(p); if (u == null) { p.sendMessage(ChatUtils.error("An error occurred, please rejoin!")); log.severe("No user exists for player " + p.getName()); @@ -105,7 +99,7 @@ private void info(Player p, int plot) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new PlotInfo(u, plot); + u.mainGui = new PlotInfo(provider, u, plot); u.mainGui.open(u.player); } @@ -116,15 +110,15 @@ private void join(Player p, int plot) { } // Check if they have an invitation for this plot. - if (plotSQL.hasRow("SELECT id FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';")) { + if (provider.plotSQL().hasRow("SELECT id FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';")) { // Add server event to join plot. - eventAPI.createEvent(p.getUniqueId().toString(), "plotsystem", - plotSQL.getString("SELECT server FROM " + "location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + plot + ";") + "';"), + provider.eventAPI().createEvent(p.getUniqueId().toString(), "plotsystem", + provider.plotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + provider.plotSQL().getString("SELECT location FROM plot_data WHERE id=" + plot + ";") + "';"), "join plot " + plot); // Remove invite. - plotSQL.update("DELETE FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';"); + provider.plotSQL().update("DELETE FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';"); } else { p.sendMessage(ChatUtils.error("You have not been invited to join this plot.")); } @@ -138,30 +132,30 @@ private void feedback(Player player, int plot) { // Check if the player is the owner of a member of the plot. // Then open the latest feedback. // And set their Main gui to the plot info of this plot. - if (!plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plot + " AND uuid='" + player.getUniqueId() + "';")) { + if (!provider.plotSQL().hasRow("SELECT id FROM plot_members WHERE id=" + plot + " AND uuid='" + player.getUniqueId() + "';")) { player.sendMessage(ChatUtils.error("You are no longer the owner or a member of this plot.")); return; } // Find the latest attempt. - String uuid = plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plot + " AND is_owner=1;"); - int latestAttempt = plotSQL.getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); + String uuid = provider.plotSQL().getString("SELECT uuid FROM plot_members WHERE id=" + plot + " AND is_owner=1;"); + int latestAttempt = provider.plotSQL().getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); if (latestAttempt == 0) { player.sendMessage(Utils.error("There is no feedback available for this plot.")); return; } - NetworkUser user = instance.getUser(player); + NetworkUser user = provider.instance().getUser(player); if (user != null) { - user.mainGui = new PlotInfo(user, plot); + user.mainGui = new PlotInfo(provider, user, plot); } // Create book. - int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plot + " AND uuid='" + uuid + "' " + "AND attempt=" + latestAttempt + ";"); + int reviewId = provider.plotSQL().getInt("SELECT id FROM plot_review WHERE plot_id=" + plot + " AND uuid='" + uuid + "' " + "AND attempt=" + latestAttempt + ";"); // Open the book. - player.openBook(ReviewFeedback.createFeedbackBook(reviewId)); + player.openBook(ReviewFeedback.createFeedbackBook(provider.globalSQL(), provider.plotSQL(), reviewId)); } private void error(Player p) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java index cfb7586b..535fb36e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java @@ -20,7 +20,7 @@ public abstract class PmuteAction extends AbstractCommand { protected PmuteAction(Network instance, Component error) { this.instance = instance; this.error = error; - setTabCompleter(new PlayerSelector()); + setTabCompleter(new PlayerSelector(instance)); } public void onCommand(CommandSourceStack stack, String[] args, boolean mute) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java index b81eda1e..3eda7722 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java @@ -31,7 +31,7 @@ protected PromotionAction(Network instance, Roles roles, CustomChat customChat, this.roles = roles; this.error = error; this.chat = customChat; - setTabCompleter(new MultiArgSelector(List.of(new PlayerSelector(false), + setTabCompleter(new MultiArgSelector(List.of(new PlayerSelector(instance, false), new FixedArgSelector(roles.getRoles().stream().map(Role::getId).collect(Collectors.toList()), 1)))); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java index 779b2886..046367f6 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/give/GiveItem.java @@ -46,6 +46,6 @@ public void onCommand(CommandSourceStack stack, String permission, ItemStack ite } // Add debug stick to inventory. - Utils.giveItem(player, item, itemName); + Utils.giveItem(instance, player, item, itemName); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java index f9feae87..1476c0e6 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/BTEUK.java @@ -1,22 +1,22 @@ -package net.bteuk.network.commands.navigation; - -import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.utils.SwitchServer; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class BTEUK extends AbstractCommand { - - @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { - - // Check if the sender is a player. - Player player = getPlayer(stack); - if (player == null) { - return; - } - - SwitchServer.switchToExternalServer(player); - } -} +// package net.bteuk.network.commands.navigation; +// +// import io.papermc.paper.command.brigadier.CommandSourceStack; +// import net.bteuk.network.commands.AbstractCommand; +// import net.bteuk.network.utils.SwitchServer; +// import org.bukkit.entity.Player; +// import org.jetbrains.annotations.NotNull; +// +// public class BTEUK extends AbstractCommand { +// +// @Override +// public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { +// +// // Check if the sender is a player. +// Player player = getPlayer(stack); +// if (player == null) { +// return; +// } +// +// SwitchServer.switchToExternalServer(player); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java index a68d8178..9dd4783e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Delhome.java @@ -22,7 +22,7 @@ public Delhome(Network instance) { this.globalSQL = instance.getGlobalSQL(); // Set tab completer. - setTabCompleter(new HomeSelector()); + setTabCompleter(new HomeSelector(globalSQL)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java index 29e3d56a..0f88fa6a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java @@ -36,7 +36,7 @@ public Home(Network instance, Constants constants, EventAPI eventAPI, ServerAPI this.serverAPI = serverAPI; // Set tab completer. - setTabCompleter(new HomeSelector()); + setTabCompleter(new HomeSelector(globalSQL)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java index e1585fd5..cfd53f94 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Navigation.java @@ -5,6 +5,7 @@ import net.bteuk.network.Network; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.NavigationTabCompleter; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.navigation.AddLocation; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; @@ -28,11 +29,13 @@ public class Navigation extends AbstractCommand { private final Network instance; private final GlobalSQL globalSQL; + private final GuiProvider provider; - public Navigation(Network instance) { + public Navigation(Network instance, GuiProvider provider) { this.instance = instance; this.globalSQL = instance.getGlobalSQL(); - setTabCompleter(new NavigationTabCompleter()); + this.provider = provider; + setTabCompleter(new NavigationTabCompleter(globalSQL)); } @Override @@ -87,7 +90,7 @@ private void addLocation(NetworkUser u) { if (u.mainGui != null) { u.mainGui.delete(); } - u.mainGui = new AddLocation(AddLocationType.ADD); + u.mainGui = new AddLocation(provider, AddLocationType.ADD); u.mainGui.open(u.player); } else { u.sendMessage(ChatUtils.error("You do not have permission to use this command.")); @@ -144,7 +147,7 @@ private void updateLocation(NetworkUser u, String[] args) { } int coordinate_id = globalSQL.getInt("SELECT coordinate FROM location_data WHERE " + "location='" + location + "';"); - u.staffGui = new AddLocation(AddLocationType.UPDATE, location, coordinate_id, category, subcategory); + u.staffGui = new AddLocation(provider, AddLocationType.UPDATE, location, coordinate_id, category, subcategory); u.staffGui.open(u.player); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java index 267c7b1d..27ef9581 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Server.java @@ -30,7 +30,7 @@ public Server(SQLAPI globalSQL, Constants constants, ServerAPI serverAPI) { this.globalSQL = globalSQL; this.constants = constants; this.serverAPI = serverAPI; - setTabCompleter(new ServerSelector()); + setTabCompleter(new ServerSelector(globalSQL, constants)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java index 81ae0fe3..c290f02c 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java @@ -36,7 +36,7 @@ public Teleport(Network instance, Back back, EventAPI eventAPI, ServerAPI server this.serverAPI = serverAPI; this.globalSQL = instance.getGlobalSQL(); this.constants = constants; - setTabCompleter(new PlayerSelector()); + setTabCompleter(new PlayerSelector(instance)); } @Override @@ -67,8 +67,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // If the player is on your server teleport. // Else switch server and add teleport join event. - Optional optionalNetworkUser = - instance.getNetworkUserByUuid(onlineUser.getUuid()); + Optional optionalNetworkUser = instance.getNetworkUserByUuid(onlineUser.getUuid()); NetworkLocation currentLocation = LocationAdapter.adapt(player.getLocation()); optionalNetworkUser.ifPresentOrElse((NetworkUser user) -> { @@ -79,8 +78,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) player.sendMessage(ChatUtils.success("Teleported to %s", onlineUser.getName())); }, () -> { if (!constants.standalone()) { - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + - "player " + onlineUser.getUuid(), currentLocation); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + "player " + onlineUser.getUuid(), currentLocation); serverAPI.switchServer(PlayerAdapter.adapt(player), onlineUser.getServer()); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java index bbaade0b..2450d97b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java @@ -3,17 +3,21 @@ import io.papermc.lib.PaperLib; import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.Region; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Statistics; -import net.bteuk.network.utils.SwitchServer; -import net.bteuk.network.utils.Time; import net.bteuk.network.utils.TpllFormat; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.regions.Region; -import net.bteuk.network.utils.regions.RegionManager; import net.buildtheearth.terraminusminus.dataset.IScalarDataset; import net.buildtheearth.terraminusminus.generator.EarthGeneratorPipelines; import net.buildtheearth.terraminusminus.generator.EarthGeneratorSettings; @@ -34,26 +38,31 @@ import java.util.List; import java.util.concurrent.CompletableFuture; -import static net.bteuk.network.utils.Constants.EARTH_WORLD; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - public class Tpll extends AbstractCommand { - public static final EarthGeneratorSettings bteGeneratorSettings = - EarthGeneratorSettings.parse(EarthGeneratorSettings.BTE_DEFAULT_SETTINGS); + public static final EarthGeneratorSettings bteGeneratorSettings = EarthGeneratorSettings.parse(EarthGeneratorSettings.BTE_DEFAULT_SETTINGS); private static final DecimalFormat DECIMAL_FORMATTER = new DecimalFormat("##.#####"); - private static final boolean regionsEnabled = CONFIG.getBoolean("regions_enabled"); private static final Component USAGE = ChatUtils.error("/tpll [altitude]"); - private final boolean requires_permission; + private final Network instance; + private final boolean requiresPermission; private final RegionManager regionManager; + private final Constants constants; private final PlotSQL plotSQL; - - public Tpll(Network instance, boolean requires_permission) { - this.requires_permission = requires_permission; - - regionManager = instance.getRegionManager(); - plotSQL = instance.getPlotSQL(); + private final EventAPI eventAPI; + private final ServerAPI serverAPI; + private final Back back; + private final GlobalSQL globalSQL; + + public Tpll(Network instance, boolean requiresPermission, RegionManager regionManager, Constants constants, PlotSQL plotSQL, EventAPI eventAPI, ServerAPI serverAPI, Back back, GlobalSQL globalSQL) { + this.instance = instance; + this.requiresPermission = requiresPermission; + this.regionManager = regionManager; + this.constants = constants; + this.plotSQL = plotSQL; + this.eventAPI = eventAPI; + this.serverAPI = serverAPI; + this.back = back; + this.globalSQL = globalSQL; } /** @@ -68,16 +77,13 @@ public static TpllFormat getUsableTpllFormat(String[] args) { format.setCoordinates(CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(args).trim())); if (format.getCoordinates() == null) { - LatLng possiblePlayerCoords = - CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(selectArray(args))); + LatLng possiblePlayerCoords = CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(selectArray(args))); if (possiblePlayerCoords != null) { format.setCoordinates(possiblePlayerCoords); } } - LatLng possibleHeightCoords = - CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(inverseSelectArray(args, - args.length - 1))); + LatLng possibleHeightCoords = CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(inverseSelectArray(args, args.length - 1))); if (possibleHeightCoords != null) { format.setCoordinates(possibleHeightCoords); try { @@ -86,9 +92,7 @@ public static TpllFormat getUsableTpllFormat(String[] args) { } } - LatLng possibleHeightNameCoords = - CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(inverseSelectArray(selectArray(args), - selectArray(args).length - 1))); + LatLng possibleHeightNameCoords = CoordinateParseUtils.parseVerbatimCoordinates(getRawArguments(inverseSelectArray(selectArray(args), selectArray(args).length - 1))); if (possibleHeightNameCoords != null) { format.setCoordinates(possibleHeightNameCoords); try { @@ -107,21 +111,18 @@ public static TpllFormat getUsableTpllFormat(String[] args) { * @param l the location of the tpll * @return {@link Location} the location with potential coordinate transform */ - public static Location applyCoordinateTransformIfPlotSystem(Region region, Location l) { + public Location applyCoordinateTransformIfPlotSystem(Region region, Location l) { // Regions must be enabled to use the plot system. - if (regionsEnabled) { + if (constants.regionsEnabled()) { // Check if the region is on a plot server. - if (region.isPlot()) { - String location = Network.getInstance().getPlotSQL().getString("SELECT location FROM regions WHERE " + - "region='" + region.regionName() + "';"); + if (regionManager.isPlot(region)) { + String location = plotSQL.getString("SELECT location FROM regions WHERE " + "region='" + region.regionName() + "';"); // Get the coordinate transformations. - int xTransform = Network.getInstance().getPlotSQL().getInt("SELECT xTransform FROM location_data " + - "WHERE name='" + location + "';"); - int zTransform = Network.getInstance().getPlotSQL().getInt("SELECT zTransform FROM location_data " + - "WHERE name='" + location + "';"); + int xTransform = plotSQL.getInt("SELECT xTransform FROM location_data " + "WHERE name='" + location + "';"); + int zTransform = plotSQL.getInt("SELECT zTransform FROM location_data " + "WHERE name='" + location + "';"); Location newLocation = l.clone(); newLocation.setX(l.getX() + xTransform); @@ -176,7 +177,7 @@ private static String getRawArguments(String[] args) { } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. // Only players can use /tpll. @@ -186,7 +187,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } // Check if permission is required. - if (requires_permission) { + if (requiresPermission) { if (!player.hasPermission("uknet.navigation.tpll")) { player.sendMessage(NO_PERMISSION); return; @@ -215,38 +216,42 @@ public void tpll(Player p, String[] args, boolean fromEvent) { double[] proj; try { - proj = bteGeneratorSettings.projection().fromGeo(format.getCoordinates().getLng(), - format.getCoordinates().getLat()); + proj = bteGeneratorSettings.projection().fromGeo(format.getCoordinates().getLng(), format.getCoordinates().getLat()); } catch (Exception e) { p.sendMessage(USAGE); return; } // Get location and region. - Location l = new Location(p.getWorld(), proj[0], 1, proj[1], p.getLocation().getYaw(), - p.getLocation().getPitch()); + Location l = new Location(p.getWorld(), proj[0], 1, proj[1], p.getLocation().getYaw(), p.getLocation().getPitch()); + Region region = null; - if (regionsEnabled) { - region = regionManager.getRegion(l); - } + if (constants.regionsEnabled()) { + region = regionManager.getRegion(proj[0], proj[1]); - // Check if the player is allowed to teleport here. - if (!canTeleportHere(p, region)) { - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you must be at least " + - "Jr.Builder to load new terrain.")); - } + // Check if the player is allowed to teleport here. + if (!canTeleportHere(p, region)) { + p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you must be at least " + "Jr.Builder to load new terrain.")); + } - // Check the server of the location. - // Switch if necessary. - if (switchServerIfNecessary(p, region, args)) { - p.sendMessage(ChatUtils.success("The location is on another server, switching servers...")); - return; + if (!constants.standalone()) { + // Check the server of the location. + // Switch if necessary. + if (switchServerIfNecessary(p, region, args)) { + p.sendMessage(ChatUtils.success("The location is on another server, switching servers...")); + return; + } + } } // If the region is in the plot system, apply the coordinate transform. - l = applyCoordinateTransformIfPlotSystem(region, l); + if (constants.plotSystemEnabled()) { + l = applyCoordinateTransformIfPlotSystem(region, l); + } // Set the correct world. - setWorldOfRegion(region, l); + if (constants.regionsEnabled()) { + setWorldOfRegion(region, l); + } // Check if the chunk has already been generated. // If not warn the player that it needs to be generated. @@ -266,7 +271,7 @@ public void tpll(Player p, String[] args, boolean fromEvent) { * @return whether the player can teleport here */ private boolean canTeleportHere(Player p, Region region) { - return !regionsEnabled || region.inDatabase() || p.hasPermission("group.jrbuilder"); + return regionManager.inDatabase(region) || p.hasPermission("uknet.regions.generate"); } /** @@ -276,20 +281,17 @@ private boolean canTeleportHere(Player p, Region region) { * @return whether the player is switching server */ private boolean switchServerIfNecessary(Player p, Region region, String[] args) { - if (regionsEnabled) { - - // Check if the server of the region equals the current server, else teleport them with a teleport event - // for tpll. - if (!region.getServer().equals(SERVER_NAME)) { + // Check if the server of the region equals the current server, else teleport them with a teleport event + // for tpll. + String server = regionManager.getServer(region); + if (!server.equals(constants.serverName())) { - // Create teleport event. - EventManager.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport tpll " - + String.join(" ", args), p.getLocation()); + // Create teleport event. + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport tpll " + String.join(" ", args), LocationAdapter.adapt(p.getLocation())); - // Switch server. - SwitchServer.switchServer(p, region.getServer()); - return true; - } + // Switch server. + serverAPI.switchServer(PlayerAdapter.adapt(p), server); + return true; } return false; } @@ -301,18 +303,12 @@ private boolean switchServerIfNecessary(Player p, Region region, String[] args) * @param l the location of the tpll */ private void setWorldOfRegion(Region region, Location l) { - - // Regions must be enabled to get the world,else return the current world. - if (regionsEnabled) { - - // Check if the region is on the plot server. - if (region.isPlot()) { - String location = - plotSQL.getString("SELECT location FROM regions WHERE region='" + region.regionName() + "';"); - l.setWorld(Bukkit.getWorld(location)); - } else { - l.setWorld(Bukkit.getWorld(EARTH_WORLD)); - } + // Check if the region is on the plot server. + if (regionManager.isPlot(region)) { + String location = plotSQL.getString("SELECT location FROM regions WHERE region='" + region.regionName() + "';"); + l.setWorld(Bukkit.getWorld(location)); + } else { + l.setWorld(Bukkit.getWorld(constants.earthWorld())); } } @@ -332,10 +328,8 @@ private CompletableFuture getAltitude(Player p, TpllFormat format, Locat // If the altitude was not specified, get it from the data. if (Double.isNaN(format.getAltitude())) { try { - altFuture = new GeneratorDatasets(bteGeneratorSettings) - .getCustom(EarthGeneratorPipelines.KEY_DATASET_HEIGHTS) - .getAsync(format.getCoordinates().getLng(), format.getCoordinates().getLat()) - .thenApply(a -> a + 1.0d); + altFuture = new GeneratorDatasets(bteGeneratorSettings).getCustom(EarthGeneratorPipelines.KEY_DATASET_HEIGHTS) + .getAsync(format.getCoordinates().getLng(), format.getCoordinates().getLat()).thenApply(a -> a + 1.0d); } catch (OutOfProjectionBoundsException e) { // out of bounds, notify user p.sendMessage(ChatUtils.error("These coordinates are out of the projection bounds.")); return null; @@ -347,8 +341,7 @@ private CompletableFuture getAltitude(Player p, TpllFormat format, Locat // If the altitude was not specified, get it from the data. if (Double.isNaN(format.getAltitude())) { - altFuture = CompletableFuture.completedFuture((double) Utils.getHighestYAt(l.getWorld(), - l.getBlockX(), l.getBlockZ())); + altFuture = CompletableFuture.completedFuture((double) Utils.getHighestYAt(constants, l.getWorld(), l.getBlockX(), l.getBlockZ())); } else { altFuture = CompletableFuture.completedFuture(format.getAltitude()); } @@ -365,34 +358,28 @@ private CompletableFuture getAltitude(Player p, TpllFormat format, Locat * @param l the location to teleport to * @param fromEvent whether the command was executed from an event */ - private void teleport(Player p, CompletableFuture altFuture, TpllFormat format, Location l, - boolean fromEvent) { - altFuture.thenAccept(s -> Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + private void teleport(Player p, CompletableFuture altFuture, TpllFormat format, Location l, boolean fromEvent) { + altFuture.thenAccept(s -> Bukkit.getScheduler().runTask(instance, () -> { // If the tpll is from an event, don't save the previous coordinate, since that was already done when // creating the event. if (!fromEvent) { // Set current location for /back - Back.setPreviousCoordinate(p.getUniqueId().toString(), p.getLocation()); + back.setPreviousCoordinate(p.getUniqueId().toString(), LocationAdapter.adapt(p.getLocation())); } // Set the altitude l.setY(s); // Add tpll to statistics. - Statistics.addTpll(p.getUniqueId().toString(), Time.getDate(Time.currentTime())); + Statistics.addTpll(globalSQL, p.getUniqueId().toString(), Time.getDate(Time.currentTime())); // Teleport player. PaperLib.teleportAsync(p, l); - p.sendMessage( - ChatUtils.success("Teleported to ") - .append(Component.text(DECIMAL_FORMATTER.format(format.getCoordinates().getLat()), - NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", ")) - .append(Component.text(DECIMAL_FORMATTER.format(format.getCoordinates().getLng()), - NamedTextColor.DARK_AQUA))); + p.sendMessage(ChatUtils.success("Teleported to ").append(Component.text(DECIMAL_FORMATTER.format(format.getCoordinates().getLat()), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", ")).append(Component.text(DECIMAL_FORMATTER.format(format.getCoordinates().getLng()), NamedTextColor.DARK_AQUA))); })); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java index 088ed0ef..944805a5 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java @@ -38,7 +38,7 @@ public Warp(Network instance, Constants constants, PlotAPI plotAPI, Back back, E this.eventAPI = eventAPI; this.serverAPI = serverAPI; this.globalSQL = instance.getGlobalSQL(); - setTabCompleter(new LocationSelector()); + setTabCompleter(new LocationSelector(globalSQL)); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index 697139a1..28190619 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -3,13 +3,10 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; import net.bteuk.network.CustomChat; -import net.bteuk.network.Network; -import net.bteuk.network.api.ChatAPI; import net.bteuk.network.commands.AbstractCommand; -import net.bteuk.network.core.Constants; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.staff.StaffGui; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; @@ -23,16 +20,10 @@ @Log public class Staff extends AbstractCommand { - private final Network instance; - private final Constants constants; - private final GlobalSQL globalSQL; - private final ChatAPI chatAPI; + private final GuiProvider guiProvider; - public Staff(Network instance, Constants constants, GlobalSQL globalSQL, ChatAPI chatAPI) { - this.instance = instance; - this.constants = constants; - this.globalSQL = globalSQL; - this.chatAPI = chatAPI; + public Staff(GuiProvider guiProvider) { + this.guiProvider = guiProvider; } public void openStaffMenu(NetworkUser u) { @@ -42,12 +33,9 @@ public void openStaffMenu(NetworkUser u) { // If no gui exists open the staff menu. if (u.staffGui != null) { - - u.staffGui.refresh(); u.staffGui.open(u.player); } else { - - u.staffGui = new StaffGui(u); + u.staffGui = new StaffGui(guiProvider, u); u.staffGui.open(u.player); } } @@ -61,7 +49,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - NetworkUser u = instance.getUser(p); + NetworkUser u = guiProvider.instance().getUser(p); // Check if user is member of staff. // Architects can open the menu but not use the staff chat. @@ -80,8 +68,8 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } // If the first arg is chat, switch the player to and from staff chat if enabled. - if (!constants.standalone()) { - if (args.length > 0 && constants.staffChat()) { + if (!guiProvider.constants().standalone()) { + if (args.length > 0 && guiProvider.constants().staffChat()) { if (args[0].equalsIgnoreCase("chat")) { String channel = GLOBAL.getChannelName(); if (u.getChatChannel().equals(STAFF.getChannelName())) { @@ -93,11 +81,11 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } // Set channel. u.setChatChannel(channel); - globalSQL.update("UPDATE player_data SET chat_channel='" + channel + "' " + "WHERE uuid='" + p.getUniqueId() + "';"); + guiProvider.globalSQL().update("UPDATE player_data SET chat_channel='" + channel + "' " + "WHERE uuid='" + p.getUniqueId() + "';"); } else { // Send a message in staff-chat, by temporarily setting the player's channel to staff. u.setChatChannel(STAFF.getChannelName()); - chatAPI.sendChatMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); + guiProvider.chatAPI().sendChatMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); u.setChatChannel(GLOBAL.getChannelName()); } return; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java index b3402ba9..0020c7f7 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/HomeSelector.java @@ -1,6 +1,6 @@ package net.bteuk.network.commands.tabcompleters; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -10,10 +10,16 @@ public class HomeSelector extends AbstractTabCompleter { + private final SQLAPI globalSQL; + + public HomeSelector(SQLAPI globalSQL) { + this.globalSQL = globalSQL; + } + @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { List homes = - Network.getInstance().getGlobalSQL().getStringList( + globalSQL.getStringList( "SELECT name FROM home WHERE uuid='" + ((Player) sender).getUniqueId() + "' AND name IS NOT " + "NULL;"); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java index 51a978fb..224f7903 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationAndSubcategorySelector.java @@ -1,14 +1,15 @@ package net.bteuk.network.commands.tabcompleters; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collection; +import java.util.List; public class LocationAndSubcategorySelector extends AbstractTabCompleter { + private final SQLAPI globalSQL; private final int argIndex; /** @@ -16,18 +17,19 @@ public class LocationAndSubcategorySelector extends AbstractTabCompleter { * * @param argIndex the index for which the tab completer should be. */ - public LocationAndSubcategorySelector(int argIndex) { + public LocationAndSubcategorySelector(SQLAPI globalSQL, int argIndex) { + this.globalSQL = globalSQL; this.argIndex = argIndex; } @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { - // Get array of locations. - ArrayList locations = Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM " + + // Get an array of locations. + List locations = globalSQL.getStringList("SELECT location FROM " + "location_data;"); // Add subcategories. - locations.addAll(Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM location_subcategory")); + locations.addAll(globalSQL.getStringList("SELECT name FROM location_subcategory")); return onTabCompleteArg(args, locations, argIndex); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java index 0a5816c1..784161e9 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/LocationSelector.java @@ -1,6 +1,6 @@ package net.bteuk.network.commands.tabcompleters; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -10,13 +10,19 @@ public class LocationSelector extends AbstractTabCompleter { - public static List locationSelectorOnArg(String[] args, int argIndexStart) { - // Get array of locations. - List locations = Network.getInstance().getGlobalSQL().getStringList("SELECT location FROM " + + private final SQLAPI globalSQL; + + public LocationSelector(SQLAPI globalSQL) { + this.globalSQL = globalSQL; + } + + public static List locationSelectorOnArg(SQLAPI globalSQL, String[] args, int argIndexStart) { + // Get an array of locations. + List locations = globalSQL.getStringList("SELECT location FROM " + "location_data;"); // It is possible that the location has multiple words, so the tab completer should work for later words. - // This is done by returning a list of partial location names including only the part of the location name that is yet to be written. + // This is done by returning a list of partial location names, including only the part of the location name that is yet to be written. int word = args.length - argIndexStart; int argIndex = argIndexStart; if (word > 1) { @@ -30,6 +36,6 @@ public static List locationSelectorOnArg(String[] args, int argIndexStar @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { - return locationSelectorOnArg(args, 0); + return locationSelectorOnArg(globalSQL, args, 0); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java index 4cae21ef..88f710fb 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/NavigationTabCompleter.java @@ -1,6 +1,6 @@ package net.bteuk.network.commands.tabcompleters; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.utils.enums.Category; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -12,6 +12,12 @@ public class NavigationTabCompleter extends AbstractTabCompleter { + private final SQLAPI globalSQL; + + public NavigationTabCompleter(SQLAPI globalSQL) { + this.globalSQL = globalSQL; + } + @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { Collection result = new ArrayList<>(); @@ -19,7 +25,7 @@ public class NavigationTabCompleter extends AbstractTabCompleter { switch (args[0].toUpperCase()) { // If arg[0] is remove, update or suggested, then use locations as arg[1] selector. - case "UPDATE", "REMOVE", "SUGGESTED" -> result.addAll(LocationSelector.locationSelectorOnArg(args, 1)); + case "UPDATE", "REMOVE", "SUGGESTED" -> result.addAll(LocationSelector.locationSelectorOnArg(globalSQL, args, 1)); // If arg[0] is subcategory then the selector depends on the next argument. case "SUBCATEGORY" -> { @@ -30,7 +36,7 @@ public class NavigationTabCompleter extends AbstractTabCompleter { Arrays.stream(Category.values()).filter(Category::isSelectable).map(Category::toString) .collect(Collectors.toList()), 2)); } else if (args.length > 1 && args[1].equalsIgnoreCase("remove")) { - result.addAll(onTabCompleteArg(args, Network.getInstance().getGlobalSQL().getStringList( + result.addAll(onTabCompleteArg(args, globalSQL.getStringList( "SELECT name FROM location_subcategory"), 2)); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java index c5db6069..a0f3131b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/PlayerSelector.java @@ -15,28 +15,29 @@ */ public class PlayerSelector extends AbstractTabCompleter { + private final Network instance; private final int argIndex; private final boolean excludeSelf; - public PlayerSelector() { - this(0, true); + public PlayerSelector(Network instance) { + this(instance, 0, true); } - public PlayerSelector(boolean excludeSelf) { - this(0, excludeSelf); + public PlayerSelector(Network instance, boolean excludeSelf) { + this(instance, 0, excludeSelf); } - public PlayerSelector(int argIndex, boolean excludeSelf) { + public PlayerSelector(Network instance, int argIndex, boolean excludeSelf) { + this.instance = instance; this.argIndex = argIndex; this.excludeSelf = excludeSelf; } @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { - // Get array of online players, excluding yourself. - List names = - Network.getInstance().getOnlineUsers().stream().map(OnlineUser::getName).collect(Collectors.toList()); + // Get an array of online players, excluding yourself. + List names = instance.getOnlineUsers().stream().map(OnlineUser::getName).collect(Collectors.toList()); if (excludeSelf && (sender instanceof Player p)) { names.remove(p.getName()); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java index b0e02402..e43bac4d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ServerSelector.java @@ -1,21 +1,28 @@ package net.bteuk.network.commands.tabcompleters; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; +import net.bteuk.network.core.Constants; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collection; - -import static net.bteuk.network.utils.Constants.SERVER_NAME; +import java.util.List; public class ServerSelector extends AbstractTabCompleter { + private final SQLAPI globalSQL; + private final Constants constants; + + public ServerSelector(SQLAPI globalSQL, Constants constants) { + this.globalSQL = globalSQL; + this.constants = constants; + } + @Override public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { - // Get array of online players, excluding yourself. - ArrayList servers = Network.getInstance().getGlobalSQL().getStringList("SELECT name FROM server_data " + - "WHERE server<>'" + SERVER_NAME + ";"); + // Get an array of servers, excluding the current server. + List servers = globalSQL.getStringList("SELECT name FROM server_data " + + "WHERE server<>'" + constants.serverName() + ";"); return onTabCompleteArg(args, servers, 0); } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java index 2a023fa7..fef0cc7b 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ClickableItemListener.java @@ -1,5 +1,6 @@ package net.bteuk.network.eventing.listeners; +import lombok.extern.java.Log; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -16,12 +17,11 @@ import org.bukkit.event.player.PlayerSwapHandItemsEvent; import org.bukkit.inventory.ItemStack; -import static net.bteuk.network.utils.Constants.LOGGER; - /** * Listener class that implements a generic clickable item in the inventory of the player. * It can not be (re)moved from the inventory at any point in time. */ +@Log public class ClickableItemListener implements Listener { private final Network instance; @@ -47,7 +47,7 @@ public void unregister() { private NetworkUser getUserIfExists(Player p) { NetworkUser u = instance.getUser(p); if (u == null) { - LOGGER.severe("User " + p.getName() + " can not be found!"); + log.severe("User " + p.getName() + " can not be found!"); p.sendMessage(ChatUtils.error("User can not be found, please relog!")); } return u; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 572a946d..c216742c 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -6,8 +6,10 @@ import net.bteuk.network.Network; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; +import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; +import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.OnlineUserAdd; import net.bteuk.network.lib.dto.OnlineUserRemove; @@ -16,6 +18,8 @@ import net.bteuk.network.lib.dto.UserConnectRequest; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; +import net.bteuk.network.regions.RegionManager; +import net.bteuk.network.regions.RegionUser; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; @@ -48,11 +52,14 @@ public class Connect implements Listener { private final Roles roles; private final GlobalSQL globalSQL; private final GuiManager guiManager; + private final Nightvision nightvision; + private final EventManager eventManager; + private final RegionManager regionManager; @Setter private boolean blockLeaveEvent; - public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL, GuiManager guiManager) { + public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL, GuiManager guiManager, Nightvision nightvision, EventManager eventManager, RegionManager regionManager) { this.instance = instance; this.constants = constants; @@ -60,6 +67,9 @@ public Connect(Network instance, Constants constants, TabManager tabManager, Rol this.roles = roles; this.globalSQL = globalSQL; this.guiManager = guiManager; + this.nightvision = nightvision; + this.eventManager = eventManager; + this.regionManager = regionManager; this.blockLeaveEvent = false; @@ -86,7 +96,8 @@ public void handleUserConnectReply(UserConnectReply reply) { } log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", player.getName())); - NetworkUser user = new NetworkUser(player, reply, instance, constants, roles); + RegionUser regionUser = regionManager.getUserByPlayer(player).orElseThrow(); + NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); instance.addUser(user); // Hide this player for all players in focus mode. @@ -139,7 +150,8 @@ public void joinServerEvent(PlayerJoinEvent joinEvent) { UserConnectReply reply = new UserConnectReply(player.getUniqueId().toString(), navigatorEnabled, teleportEnabled, nightVisionEnabled, chatChannel, tipsEnabled, components, false); - NetworkUser user = new NetworkUser(player, reply, instance, constants, roles); + RegionUser regionUser = regionManager.getUserByPlayer(player).orElseThrow(); + NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); OnlineUserAdd onlineUserAdd = new OnlineUserAdd(); onlineUserAdd.setUser(new OnlineUser(player.getUniqueId().toString(), player.getName(), constants.serverName())); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java index 57c55e30..d65664ff 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/PlayerInteract.java @@ -41,7 +41,7 @@ public void onPlayerInteract(PlayerInteractEvent e) { } if (e.getItem() != null) { - if (e.getItem().equals(instance.navigatorItem)) { + if (e.getItem().equals(instance.getNavigatorItem())) { e.setCancelled(true); // Open navigator. navigator.openNavigator(u); @@ -67,7 +67,7 @@ public void onClick(InventoryClickEvent e) { } // If item is navigator then open it. - if (e.getCurrentItem().equals(instance.navigatorItem)) { + if (e.getCurrentItem().equals(instance.getNavigatorItem())) { e.setCancelled(true); // If item is not in slot 8, delete it. @@ -88,28 +88,28 @@ public void onClick(InventoryClickEvent e) { */ @EventHandler public void swapHands(PlayerSwapHandItemsEvent e) { - if (e.getOffHandItem().equals(instance.navigatorItem)) { + if (e.getOffHandItem().equals(instance.getNavigatorItem())) { e.setCancelled(true); } } @EventHandler public void dropItem(PlayerDropItemEvent e) { - if (e.getItemDrop().getItemStack().equals(instance.navigatorItem)) { + if (e.getItemDrop().getItemStack().equals(instance.getNavigatorItem())) { e.setCancelled(true); } } @EventHandler public void dragItem(InventoryMoveItemEvent e) { - if (e.getItem().equals(instance.navigatorItem)) { + if (e.getItem().equals(instance.getNavigatorItem())) { e.setCancelled(true); } } @EventHandler public void dragItem(InventoryDragEvent e) { - if (e.getOldCursor().equals(instance.navigatorItem)) { + if (e.getOldCursor().equals(instance.getNavigatorItem())) { e.setCancelled(true); } @@ -117,7 +117,7 @@ public void dragItem(InventoryDragEvent e) { return; } - if (e.getCursor().equals(instance.navigatorItem)) { + if (e.getCursor().equals(instance.getNavigatorItem())) { e.setCancelled(true); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java index e72c981b..7395d9ce 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationNameListener.java @@ -18,28 +18,30 @@ public class LocationNameListener implements Listener { + private final Network instance; private final AddLocation gui; private final Player p; private final BukkitTask task; - public LocationNameListener(Player p, AddLocation gui) { + public LocationNameListener(Network instance, Player p, AddLocation gui) { + this.instance = instance; - Bukkit.getServer().getPluginManager().registerEvents(this, Network.getInstance()); + Bukkit.getServer().getPluginManager().registerEvents(this, instance); this.p = p; this.gui = gui; - // Start timer to automatically close the listener. - task = Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { - // Send message to player telling them it's been timer out. + // Start the timer to automatically close the listener. + task = Bukkit.getScheduler().runTaskLater(instance, () -> { + // Send a message to player telling them it's been timer out. if (p != null) { p.sendMessage(ChatUtils.error("'Set Location Name' cancelled.")); // If AddLocation gui still exists, reopen it. - // Also check if player is actually still online. + // Also check if the player is actually still online. if (p.isOnline()) { - NetworkUser u = Network.getInstance().getUser(p); + NetworkUser u = instance.getUser(p); // Open staff gui if it's update or review. if (gui.getType() == AddLocationType.ADD) { if (Objects.requireNonNull(u).mainGui != null) { @@ -85,12 +87,11 @@ public void ChatEvent(AsyncChatEvent e) { unregister(); // If AddLocation gui still exists, reopen it. - NetworkUser u = Network.getInstance().getUser(p); + NetworkUser u = instance.getUser(p); if (gui.getType() == AddLocationType.ADD) { if (Objects.requireNonNull(u).mainGui != null) { if (u.mainGui instanceof AddLocation) { - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { - u.mainGui.refresh(); + Bukkit.getScheduler().runTask(instance, () -> { u.mainGui.open(u.player); }); } @@ -98,8 +99,7 @@ public void ChatEvent(AsyncChatEvent e) { } else { if (Objects.requireNonNull(u).staffGui != null) { if (u.staffGui instanceof AddLocation) { - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { - u.staffGui.refresh(); + Bukkit.getScheduler().runTask(instance, () -> { u.staffGui.open(u.player); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java index 848e12ee..c6d89a04 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/navigation/LocationSearch.java @@ -1,7 +1,7 @@ package net.bteuk.network.eventing.listeners.navigation; import io.papermc.paper.event.player.AsyncChatEvent; -import net.bteuk.network.Network; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.navigation.LocationMenu; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -14,18 +14,20 @@ public class LocationSearch implements Listener { + private final GuiProvider provider; private final NetworkUser u; private final BukkitTask task; - public LocationSearch(NetworkUser u) { + public LocationSearch(GuiProvider provider, NetworkUser u) { - Bukkit.getServer().getPluginManager().registerEvents(this, Network.getInstance()); + Bukkit.getServer().getPluginManager().registerEvents(this, provider.instance()); + this.provider = provider; this.u = u; // Start timer to automatically close the listener. - task = Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { + task = Bukkit.getScheduler().runTaskLater(provider.instance(), () -> { // Send message to player telling them it's been timer out. if (u.player != null) { u.player.sendMessage(ChatUtils.error("'Find Location' cancelled.")); @@ -48,7 +50,7 @@ public void ChatEvent(AsyncChatEvent e) { } else { LocationMenu gui = - new LocationMenu("Search: " + PlainTextComponentSerializer.plainText().serialize(e.message()) + new LocationMenu(provider, "Search: " + PlainTextComponentSerializer.plainText().serialize(e.message()) , u, Category.SEARCH, Category.EXPLORE, PlainTextComponentSerializer.plainText().serialize(e.message())); @@ -59,7 +61,7 @@ public void ChatEvent(AsyncChatEvent e) { u.player.sendMessage(ChatUtils.error("No locations have been found.")); } else { // Open the location menu with these locations. - Bukkit.getScheduler().runTask(Network.getInstance(), () -> { + Bukkit.getScheduler().runTask(provider.instance(), () -> { u.mainGui.delete(); u.mainGui = gui; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java index abeb929e..c5d414f4 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeatureGeometryEditorListener.java @@ -1,120 +1,120 @@ -package net.bteuk.network.eventing.listeners.progressmap; - -import me.bteuk.progressmapper.GeometryEditor; -import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkRefreshableGui; -import net.bteuk.network.gui.progressmap.FeaturePageGUI; -import net.bteuk.network.utils.NetworkUser; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; - -public class FeatureGeometryEditorListener extends NetworkRefreshableGui implements Listener { - private final FeaturePageGUI featurePageGUI; - private final NetworkUser user; - private final ItemStack blazeRod; - // Used for controlling editions to the geometry of the feature, also has access to the feature itself - private final GeometryEditor geometryEditor; - private int iTaskID; - - public FeatureGeometryEditorListener(GuiProvider provider, FeaturePageGUI featurePageGUI, GeometryEditor geometryEditor, NetworkUser user, ItemStack blazeRod) { - super(provider, geometryEditor.getGUI()); - this.featurePageGUI = featurePageGUI; - this.geometryEditor = geometryEditor; - this.user = user; - this.blazeRod = blazeRod; - } - - protected void createGui() { - setItemsFromInventory(geometryEditor.getGUI()); - setActions(); - } - - private void setActions() { - setAction(2, (NetworkUser u) -> selectionCancel()); - - setAction(6, (NetworkUser u) -> selectionConfirm()); - } - - public void register() { - // Registers the selection listener - Bukkit.getServer().getPluginManager().registerEvents(this, provider.instance()); - - // Sets up the outline view entity spawn schedule - this.iTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(provider.instance(), geometryEditor::updateView, 20L, 20L); - } - - @EventHandler(priority = EventPriority.LOWEST) - public void BlockHitWithBlazeRodEvent(PlayerInteractEvent e) { - if (!e.hasBlock()) return; - if (!e.getPlayer().getUniqueId().equals(this.user.player.getUniqueId())) return; - if (!e.getMaterial().equals(Material.BLAZE_ROD)) return; - - e.setCancelled(true); - - // Stores the clicked block in a local variable - Block clickedBlock = e.getClickedBlock(); - - // Now we can determine the plugin action - if (clickedBlock == null) return; - if (e.getAction().isLeftClick()) { - geometryEditor.leftClick(clickedBlock.getX(), clickedBlock.getZ()); - user.player.sendMessage(Component.text("Area restarted", NamedTextColor.AQUA)); - } else if (e.getAction().isRightClick()) { - geometryEditor.rightClick(clickedBlock.getX(), clickedBlock.getZ()); - user.player.sendMessage(Component.text("Corner added to shape", NamedTextColor.AQUA)); - } - } - - public void selectionConfirm() { - // Saves the Feature's geometry - geometryEditor.confirmGeometry(); - - // Deletes this gui - this.delete(); - - // Reopen the feature menu - featurePageGUI.refresh(); // Refresh will redo the GUI item texts - user.mainGui = featurePageGUI; - user.mainGui.open(user.player); - - // Unregisters the selection listener and cancels the outline view - unregister(); - } - - public void selectionCancel() { - // Deletes this gui - this.delete(); - - // Reset the mc blocks of the area selection to be that of the current area on the progress map (or more - // accurately as saved locally in the feature object) - geometryEditor.convertFeatureGeometryIntoBlockCoordinates(); - - // Reopen the feature menu - featurePageGUI.refresh(); // Refresh will redo the GUI item texts - user.mainGui = featurePageGUI; - user.mainGui.open(user.player); - - // Unregisters the selection listener and cancels the outline view - unregister(); - } - - private void unregister() { - // Unregisters the selection listener - HandlerList.unregisterAll(this); - - // Cancels the outline view - Bukkit.getScheduler().cancelTask(iTaskID); - - // Removes the blaze rod - blazeRod.setAmount(0); - } -} +// package net.bteuk.network.eventing.listeners.progressmap; +// +// import me.bteuk.progressmapper.GeometryEditor; +// import net.bteuk.network.gui.GuiProvider; +// import net.bteuk.network.gui.NetworkRefreshableGui; +// import net.bteuk.network.gui.progressmap.FeaturePageGUI; +// import net.bteuk.network.utils.NetworkUser; +// import net.kyori.adventure.text.Component; +// import net.kyori.adventure.text.format.NamedTextColor; +// import org.bukkit.Bukkit; +// import org.bukkit.Material; +// import org.bukkit.block.Block; +// import org.bukkit.event.EventHandler; +// import org.bukkit.event.EventPriority; +// import org.bukkit.event.HandlerList; +// import org.bukkit.event.Listener; +// import org.bukkit.event.player.PlayerInteractEvent; +// import org.bukkit.inventory.ItemStack; +// +// public class FeatureGeometryEditorListener extends NetworkRefreshableGui implements Listener { +// private final FeaturePageGUI featurePageGUI; +// private final NetworkUser user; +// private final ItemStack blazeRod; +// // Used for controlling editions to the geometry of the feature, also has access to the feature itself +// private final GeometryEditor geometryEditor; +// private int iTaskID; +// +// public FeatureGeometryEditorListener(GuiProvider provider, FeaturePageGUI featurePageGUI, GeometryEditor geometryEditor, NetworkUser user, ItemStack blazeRod) { +// super(provider, geometryEditor.getGUI()); +// this.featurePageGUI = featurePageGUI; +// this.geometryEditor = geometryEditor; +// this.user = user; +// this.blazeRod = blazeRod; +// } +// +// protected void createGui() { +// setItemsFromInventory(geometryEditor.getGUI()); +// setActions(); +// } +// +// private void setActions() { +// setAction(2, (NetworkUser u) -> selectionCancel()); +// +// setAction(6, (NetworkUser u) -> selectionConfirm()); +// } +// +// public void register() { +// // Registers the selection listener +// Bukkit.getServer().getPluginManager().registerEvents(this, provider.instance()); +// +// // Sets up the outline view entity spawn schedule +// this.iTaskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(provider.instance(), geometryEditor::updateView, 20L, 20L); +// } +// +// @EventHandler(priority = EventPriority.LOWEST) +// public void BlockHitWithBlazeRodEvent(PlayerInteractEvent e) { +// if (!e.hasBlock()) return; +// if (!e.getPlayer().getUniqueId().equals(this.user.player.getUniqueId())) return; +// if (!e.getMaterial().equals(Material.BLAZE_ROD)) return; +// +// e.setCancelled(true); +// +// // Stores the clicked block in a local variable +// Block clickedBlock = e.getClickedBlock(); +// +// // Now we can determine the plugin action +// if (clickedBlock == null) return; +// if (e.getAction().isLeftClick()) { +// geometryEditor.leftClick(clickedBlock.getX(), clickedBlock.getZ()); +// user.player.sendMessage(Component.text("Area restarted", NamedTextColor.AQUA)); +// } else if (e.getAction().isRightClick()) { +// geometryEditor.rightClick(clickedBlock.getX(), clickedBlock.getZ()); +// user.player.sendMessage(Component.text("Corner added to shape", NamedTextColor.AQUA)); +// } +// } +// +// public void selectionConfirm() { +// // Saves the Feature's geometry +// geometryEditor.confirmGeometry(); +// +// // Deletes this gui +// this.delete(); +// +// // Reopen the feature menu +// featurePageGUI.refresh(); // Refresh will redo the GUI item texts +// user.mainGui = featurePageGUI; +// user.mainGui.open(user.player); +// +// // Unregisters the selection listener and cancels the outline view +// unregister(); +// } +// +// public void selectionCancel() { +// // Deletes this gui +// this.delete(); +// +// // Reset the mc blocks of the area selection to be that of the current area on the progress map (or more +// // accurately as saved locally in the feature object) +// geometryEditor.convertFeatureGeometryIntoBlockCoordinates(); +// +// // Reopen the feature menu +// featurePageGUI.refresh(); // Refresh will redo the GUI item texts +// user.mainGui = featurePageGUI; +// user.mainGui.open(user.player); +// +// // Unregisters the selection listener and cancels the outline view +// unregister(); +// } +// +// private void unregister() { +// // Unregisters the selection listener +// HandlerList.unregisterAll(this); +// +// // Cancels the outline view +// Bukkit.getScheduler().cancelTask(iTaskID); +// +// // Removes the blaze rod +// blazeRod.setAmount(0); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java index ea701f69..2cf17e36 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/progressmap/FeaturePropertiesBookListener.java @@ -1,77 +1,77 @@ -package net.bteuk.network.eventing.listeners.progressmap; - -import me.bteuk.progressmapper.guis.Field; -import net.bteuk.network.Network; -import net.bteuk.network.gui.progressmap.FeaturePageGUI; -import net.bteuk.network.utils.NetworkUser; -import net.kyori.adventure.text.TextComponent; -import org.apache.commons.lang3.StringUtils; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerEditBookEvent; -import org.bukkit.inventory.meta.BookMeta; - -public class FeaturePropertiesBookListener implements Listener { - private final NetworkUser user; - private final FeaturePageGUI featurePageGUI; - private final Field fieldType; - - private String szRelevantTitle; - - public FeaturePropertiesBookListener(FeaturePageGUI featurePageGUI, Field fieldType, NetworkUser user) { - this.featurePageGUI = featurePageGUI; - this.fieldType = fieldType; - this.user = user; - - switch (fieldType) { - case Title: - this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getTitleBook().getItemMeta())).getTitle(); - break; - case Description: - this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getDescriptionBook().getItemMeta())).getTitle(); - break; - case Media_url: - this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getMedialURLBook().getItemMeta())).getTitle(); - break; - } - } - - public void register(Network instance) { - Bukkit.getServer().getPluginManager().registerEvents(this, instance); - } - - @EventHandler - public void BookCloseEvent(PlayerEditBookEvent e) { - // Check the player - if (!e.getPlayer().equals(user.player)) return; - - // We can't actually also check the book because the event doesn't give that - // We can only check the title - if (!StringUtils.equalsIgnoreCase(e.getNewBookMeta().getTitle(), szRelevantTitle)) return; - - // Extracts the new content from the book - String szNewContent = ((TextComponent) e.getNewBookMeta().page(1).asComponent()).content(); - - // Edits the Feature's details in the feature menu - featurePageGUI.getFeatureMenu().fieldEdit(fieldType, szNewContent); - - // Reopen the feature menu - featurePageGUI.refresh(); // Refresh will redo the GUI item texts based on the values edited in the line above - user.mainGui = featurePageGUI; - user.mainGui.open(user.player); - - // Unregisters this listener - unregister(); // Do I actually want this? Surely I want the book to be re-editable - No. No need really, - // makes it more confusing for the player - // If they just click the item to get a single use book and then the book closes, then that's a lot simpler - - // Removes the book - user.player.getInventory().getItemInMainHand().setAmount(0); - } - - private void unregister() { - HandlerList.unregisterAll(this); - } -} +// package net.bteuk.network.eventing.listeners.progressmap; +// +// import me.bteuk.progressmapper.guis.Field; +// import net.bteuk.network.Network; +// import net.bteuk.network.gui.progressmap.FeaturePageGUI; +// import net.bteuk.network.utils.NetworkUser; +// import net.kyori.adventure.text.TextComponent; +// import org.apache.commons.lang3.StringUtils; +// import org.bukkit.Bukkit; +// import org.bukkit.event.EventHandler; +// import org.bukkit.event.HandlerList; +// import org.bukkit.event.Listener; +// import org.bukkit.event.player.PlayerEditBookEvent; +// import org.bukkit.inventory.meta.BookMeta; +// +// public class FeaturePropertiesBookListener implements Listener { +// private final NetworkUser user; +// private final FeaturePageGUI featurePageGUI; +// private final Field fieldType; +// +// private String szRelevantTitle; +// +// public FeaturePropertiesBookListener(FeaturePageGUI featurePageGUI, Field fieldType, NetworkUser user) { +// this.featurePageGUI = featurePageGUI; +// this.fieldType = fieldType; +// this.user = user; +// +// switch (fieldType) { +// case Title: +// this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getTitleBook().getItemMeta())).getTitle(); +// break; +// case Description: +// this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getDescriptionBook().getItemMeta())).getTitle(); +// break; +// case Media_url: +// this.szRelevantTitle = ((BookMeta) (featurePageGUI.getFeatureMenu().getMedialURLBook().getItemMeta())).getTitle(); +// break; +// } +// } +// +// public void register(Network instance) { +// Bukkit.getServer().getPluginManager().registerEvents(this, instance); +// } +// +// @EventHandler +// public void BookCloseEvent(PlayerEditBookEvent e) { +// // Check the player +// if (!e.getPlayer().equals(user.player)) return; +// +// // We can't actually also check the book because the event doesn't give that +// // We can only check the title +// if (!StringUtils.equalsIgnoreCase(e.getNewBookMeta().getTitle(), szRelevantTitle)) return; +// +// // Extracts the new content from the book +// String szNewContent = ((TextComponent) e.getNewBookMeta().page(1).asComponent()).content(); +// +// // Edits the Feature's details in the feature menu +// featurePageGUI.getFeatureMenu().fieldEdit(fieldType, szNewContent); +// +// // Reopen the feature menu +// featurePageGUI.refresh(); // Refresh will redo the GUI item texts based on the values edited in the line above +// user.mainGui = featurePageGUI; +// user.mainGui.open(user.player); +// +// // Unregisters this listener +// unregister(); // Do I actually want this? Surely I want the book to be re-editable - No. No need really, +// // makes it more confusing for the player +// // If they just click the item to get a single use book and then the book closes, then that's a lot simpler +// +// // Removes the book +// user.player.getInventory().getItemInMainHand().setAmount(0); +// } +// +// private void unregister() { +// HandlerList.unregisterAll(this); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java index a0656696..cb8771b3 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/staff/ModerationReasonListener.java @@ -18,21 +18,22 @@ public class ModerationReasonListener implements Listener { + private final Network instance; private final NetworkUser u; private final ModerationActionGui gui; @Getter private final BukkitTask task; - public ModerationReasonListener(NetworkUser u, ModerationActionGui gui) { - + public ModerationReasonListener(Network instance, NetworkUser u, ModerationActionGui gui) { + this.instance = instance; this.u = u; this.gui = gui; - Bukkit.getServer().getPluginManager().registerEvents(this, Network.getInstance()); + Bukkit.getServer().getPluginManager().registerEvents(this, instance); // Start timer to automatically close the listener. - task = Bukkit.getScheduler().runTaskLater(Network.getInstance(), () -> { + task = Bukkit.getScheduler().runTaskLater(instance, () -> { // Send message to player telling them it's been timer out. if (u.player != null) { u.player.sendMessage(ChatUtils.error("'Set " + gui.getType().label.toLowerCase(Locale.ROOT) + " " + @@ -66,7 +67,7 @@ public void ChatEvent(AsyncChatEvent e) { // This also cancels the task and unregisters the listener. gui.refresh(); - Bukkit.getScheduler().runTask(Network.getInstance(), () -> gui.open(u.player)); + Bukkit.getScheduler().runTask(instance, () -> gui.open(u.player)); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 0be8672c..1850aae2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -1,6 +1,5 @@ package net.bteuk.network.gui; -import me.bteuk.progressmapper.guis.LocalFeaturesMenu; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; @@ -12,7 +11,6 @@ import net.bteuk.network.gui.plotsystem.PlotServerLocations; import net.bteuk.network.gui.plotsystem.PlotsystemLocations; import net.bteuk.network.gui.plotsystem.ZoneMenu; -import net.bteuk.network.gui.progressmap.LocalFeatureListGUI; import net.bteuk.network.gui.regions.RegionInfo; import net.bteuk.network.gui.regions.RegionMenu; import net.bteuk.network.lib.utils.ChatUtils; @@ -386,23 +384,23 @@ protected void createGui() { u.mainGui.open(u.player); }); - if (constants.progressMap() && user.player.hasPermission("uknet.progressmap.edit")) { - // Progress map edit menu - setItem(0, Utils.createItem(Material.MAP, 1, Utils.title("Progress Map"), Utils.line("Edit or add areas to the progress map")), (NetworkUser u) -> { - - LocalFeaturesMenu localFeatures = new LocalFeaturesMenu(constants.progressMapID(), constants.mapHubAPIKey(), u.player); - - // Check to see if the location could be established - if (localFeatures.getPlayerCoordinates() == null) { - u.player.sendMessage(ChatUtils.error("Could not locate you")); - } else { - this.delete(); - // Switch to the local features menu - u.mainGui = new LocalFeatureListGUI(provider, localFeatures, localFeatures.getGUI()); - u.mainGui.open(u.player); - } - }); - } + // if (constants.progressMap() && user.player.hasPermission("uknet.progressmap.edit")) { + // // Progress map edit menu + // setItem(0, Utils.createItem(Material.MAP, 1, Utils.title("Progress Map"), Utils.line("Edit or add areas to the progress map")), (NetworkUser u) -> { + // + // LocalFeaturesMenu localFeatures = new LocalFeaturesMenu(constants.progressMapID(), constants.mapHubAPIKey(), u.player); + // + // // Check to see if the location could be established + // if (localFeatures.getPlayerCoordinates() == null) { + // u.player.sendMessage(ChatUtils.error("Could not locate you")); + // } else { + // this.delete(); + // // Switch to the local features menu + // u.mainGui = new LocalFeatureListGUI(provider, localFeatures, localFeatures.getGUI()); + // u.mainGui.open(u.player); + // } + // }); + // } // Return setItem(26, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), Utils.line("Open the navigator main menu.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index ef65c715..17af0a5b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -100,7 +100,7 @@ protected void createGui() { locationNameListener.unregister(); } - locationNameListener = new LocationNameListener(u.player, this); + locationNameListener = new LocationNameListener(provider.instance(), u.player, this); u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + "counts. You can include spaces in the name.")); u.player.closeInventory(); }); @@ -114,7 +114,7 @@ protected void createGui() { locationNameListener.unregister(); } - locationNameListener = new LocationNameListener(u.player, this); + locationNameListener = new LocationNameListener(provider.instance(), u.player, this); u.player.sendMessage(ChatUtils.success("Write the location name in chat, the first message " + "counts. You can include spaces in the name.")); u.player.closeInventory(); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java index 6d509e27..4f6744ac 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/ExploreGui.java @@ -56,25 +56,25 @@ protected void createGui() { */ // England - setItem(2, Utils.createCustomSkullWithFallback("bee5c850afbb7d8843265a146211ac9c615f733dcc5a8e2190e5c247dea32", Material.ORANGE_CONCRETE_POWDER, 1, Utils.title("England"), + setItem(2, Utils.createCustomSkullWithFallback(provider.instance(), "bee5c850afbb7d8843265a146211ac9c615f733dcc5a8e2190e5c247dea32", Material.ORANGE_CONCRETE_POWDER, 1, Utils.title("England"), Utils.line("Click to pick from"), Utils.line("locations in England.")), (NetworkUser u) -> openLocation("England", u, Category.ENGLAND)); // Scotland - setItem(3, Utils.createCustomSkullWithFallback("dadc377816389c3c87c65dcacac1d8f880b54334d7c23ea22f099e2c4eab1ff9", Material.LIGHT_BLUE_CONCRETE_POWDER, 1, + setItem(3, Utils.createCustomSkullWithFallback(provider.instance(), "dadc377816389c3c87c65dcacac1d8f880b54334d7c23ea22f099e2c4eab1ff9", Material.LIGHT_BLUE_CONCRETE_POWDER, 1, Utils.title("Scotland"), Utils.line("Click to pick from"), Utils.line("locations in Scotland.")), (NetworkUser u) -> openLocation("Scotland", u, Category.SCOTLAND)); // Wales - setItem(4, Utils.createCustomSkullWithFallback("8140ad08f7ee1c73bf75660614595c7392caba5529211a9adbe3b5639cb6ad41", Material.RED_CONCRETE_POWDER, 1, Utils.title("Wales"), + setItem(4, Utils.createCustomSkullWithFallback(provider.instance(), "8140ad08f7ee1c73bf75660614595c7392caba5529211a9adbe3b5639cb6ad41", Material.RED_CONCRETE_POWDER, 1, Utils.title("Wales"), Utils.line("Click to pick from"), Utils.line("locations in Wales.")), (NetworkUser u) -> openLocation("Wales", u, Category.WALES)); // Northern Ireland - setItem(5, Utils.createCustomSkullWithFallback("c00ae311a5c7082e76450ecafcbbbc07dcdc484600ac0bf8d91f27e0a65b7e32", Material.LIME_CONCRETE_POWDER, 1, + setItem(5, Utils.createCustomSkullWithFallback(provider.instance(), "c00ae311a5c7082e76450ecafcbbbc07dcdc484600ac0bf8d91f27e0a65b7e32", Material.LIME_CONCRETE_POWDER, 1, Utils.title("Northern Ireland"), Utils.line("Click to pick from"), Utils.line("locations in Norther " + "Ireland.")), (NetworkUser u) -> openLocation("Northern Ireland", u, Category.NORTHERN_IRELAND)); // Other - setItem(6, Utils.createCustomSkullWithFallback("c439d7f9c67f32dcbb86b7010b1e14b60de96776a35f61cee982660aacf5264b", Material.YELLOW_CONCRETE_POWDER, 1, Utils.title("Other"), + setItem(6, Utils.createCustomSkullWithFallback(provider.instance(), "c439d7f9c67f32dcbb86b7010b1e14b60de96776a35f61cee982660aacf5264b", Material.YELLOW_CONCRETE_POWDER, 1, Utils.title("Other"), Utils.line("Click to pick from locations"), Utils.line("not in the 4 " + "countries of the UK.")), (NetworkUser u) -> openLocation("Other", u, Category.OTHER)); // Suggested Locations @@ -91,7 +91,7 @@ protected void createGui() { Utils.createItem(Material.OAK_SIGN, 1, Utils.title("Find Locations"), Utils.line("Click to " + "search" + " for locations"), Utils.line("based on chat input.")), (NetworkUser u) -> { u.player.sendMessage(ChatUtils.success("Type a word or phrase in chat to search for locations.")); - new LocationSearch(u); + new LocationSearch(provider, u); u.player.closeInventory(); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java index d883b79a..f6d786bc 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java @@ -66,7 +66,7 @@ protected void createGui() { int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotID + " AND " + "uuid='" + uuid + "' AND attempt=" + finalI + ";"); // Open the book. - u.player.openBook(ReviewFeedback.createFeedbackBook(reviewId)); + u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotSQL, reviewId)); }); // Increase the slot accordingly. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index bb480041..7424f7bd 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -295,7 +295,7 @@ public void createGui() { "SELECT id FROM plot_review WHERE uuid='" + u.getUuid() + "' " + "AND plot_id=" + plotID + " AND accepted=1 AND completed=1;"); // Open the feedback book. - u.player.openBook(ReviewFeedback.createFeedbackBook(reviewId)); + u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotSQL, reviewId)); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 7584bc18..21fa8bd6 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -107,7 +107,7 @@ protected void createGui() { Utils.line("altered by the verifier.")), (NetworkUser u) -> { // Open the feedback book. - u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(verificationId, true)); + u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotSQL, verificationId, true)); }); // If the selection or feedback was changed show the before and after books. @@ -118,7 +118,7 @@ protected void createGui() { Utils.line("altered by the verifier.")), (NetworkUser u) -> { // Open the feedback book. - u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(verificationId, false)); + u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotSQL, verificationId, false)); }); // Teleport to the plot. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java index ec30c0f7..6b2ab7f8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/ColourPickerGUI.java @@ -1,187 +1,187 @@ -package net.bteuk.network.gui.progressmap; - -import me.bteuk.progressmapper.guis.ColourPicker; -import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkRefreshableGui; -import net.bteuk.network.utils.NetworkUser; - -public class ColourPickerGUI extends NetworkRefreshableGui { - private final ColourPicker colourPicker; - private final FeaturePageGUI parentFeatureMenu; - - public ColourPickerGUI(GuiProvider provider, ColourPicker colourPicker, FeaturePageGUI parentFeatureMenu) { - super(provider, colourPicker.getGUI()); - this.colourPicker = colourPicker; - this.parentFeatureMenu = parentFeatureMenu; - } - - protected void createGui() { - setItemsFromInventory(colourPicker.getGUI()); - setActions(); - } - - private void setActions() { - // Slots here are 0 indexed - - //---------------------------------------------------- - //----------- Top Row - Predefined colours ----------- - //---------------------------------------------------- - - // Default 1 - setAction(0, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Dark_Red); - refresh(); - }); - - // Default 2 - setAction(1, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Red); - refresh(); - }); - - // Default 3 - setAction(2, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Dark_Orange); - refresh(); - }); - - // Default 4 - setAction(3, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Orange); - refresh(); - }); - - // Default 5 - setAction(4, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Light_Orange); - refresh(); - }); - - // Default 6 - setAction(5, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Yellow); - refresh(); - }); - - // Default 7 - setAction(6, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Bright_Yellow); - refresh(); - }); - - // Default 8 - setAction(7, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Sick_Green); - refresh(); - }); - - // Default 9 - setAction(8, (NetworkUser u) -> { - colourPicker.updateColour(ColourPicker.Complete_Green); - refresh(); - }); - - //----------------------------------------------------- - //---------------- Line 2 - Red Editor ---------------- - //----------------------------------------------------- - - // Lower red 16 - setAction(11, (NetworkUser u) -> { - colourPicker.lowerRed16(); - refresh(); - }); - - // Lower red 1 - setAction(12, (NetworkUser u) -> { - colourPicker.lowerRed1(); - refresh(); - }); - - // Raise red 1 - setAction(14, (NetworkUser u) -> { - colourPicker.raiseRed1(); - refresh(); - }); - - // Raise red 16 - setAction(15, (NetworkUser u) -> { - colourPicker.raiseRed16(); - refresh(); - }); - - //----------------------------------------------------- - //--------------- Line 3 - Green Editor --------------- - //----------------------------------------------------- - - // Lower green 16 - setAction(20, (NetworkUser u) -> { - colourPicker.lowerGreen16(); - refresh(); - }); - - // Lower green 1 - setAction(21, (NetworkUser u) -> { - colourPicker.lowerGreen1(); - refresh(); - }); - - // Raise green 1 - setAction(23, (NetworkUser u) -> { - colourPicker.raiseGreen1(); - refresh(); - }); - - // Raise green 16 - setAction(24, (NetworkUser u) -> { - colourPicker.raiseGreen16(); - refresh(); - }); - - //---------------------------------------------------- - //--------------- Line 4 - Blue Editor --------------- - //---------------------------------------------------- - - // Lower blue 16 - setAction(29, (NetworkUser u) -> { - colourPicker.lowerBlue16(); - refresh(); - }); - - // Lower blue 1 - setAction(30, (NetworkUser u) -> { - colourPicker.lowerBlue1(); - refresh(); - }); - - // Raise blue 1 - setAction(32, (NetworkUser u) -> { - colourPicker.raiseBlue1(); - refresh(); - }); - - // Raise blue 16 - setAction(33, (NetworkUser u) -> { - colourPicker.raiseBlue16(); - refresh(); - }); - - //----------------------------------------------------- - //-------------- Line 5 - Colour display -------------- - //----------------------------------------------------- - - // Return/confirm - setAction(40, (NetworkUser u) -> { - // Saves the selected colour to the feature - colourPicker.confirmColour(); - - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to feature list menu. - parentFeatureMenu.refresh(); - u.mainGui = parentFeatureMenu; - u.mainGui.open(u.player); - }); - } -} +// package net.bteuk.network.gui.progressmap; +// +// import me.bteuk.progressmapper.guis.ColourPicker; +// import net.bteuk.network.gui.GuiProvider; +// import net.bteuk.network.gui.NetworkRefreshableGui; +// import net.bteuk.network.utils.NetworkUser; +// +// public class ColourPickerGUI extends NetworkRefreshableGui { +// private final ColourPicker colourPicker; +// private final FeaturePageGUI parentFeatureMenu; +// +// public ColourPickerGUI(GuiProvider provider, ColourPicker colourPicker, FeaturePageGUI parentFeatureMenu) { +// super(provider, colourPicker.getGUI()); +// this.colourPicker = colourPicker; +// this.parentFeatureMenu = parentFeatureMenu; +// } +// +// protected void createGui() { +// setItemsFromInventory(colourPicker.getGUI()); +// setActions(); +// } +// +// private void setActions() { +// // Slots here are 0 indexed +// +// //---------------------------------------------------- +// //----------- Top Row - Predefined colours ----------- +// //---------------------------------------------------- +// +// // Default 1 +// setAction(0, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Dark_Red); +// refresh(); +// }); +// +// // Default 2 +// setAction(1, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Red); +// refresh(); +// }); +// +// // Default 3 +// setAction(2, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Dark_Orange); +// refresh(); +// }); +// +// // Default 4 +// setAction(3, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Orange); +// refresh(); +// }); +// +// // Default 5 +// setAction(4, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Light_Orange); +// refresh(); +// }); +// +// // Default 6 +// setAction(5, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Yellow); +// refresh(); +// }); +// +// // Default 7 +// setAction(6, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Bright_Yellow); +// refresh(); +// }); +// +// // Default 8 +// setAction(7, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Sick_Green); +// refresh(); +// }); +// +// // Default 9 +// setAction(8, (NetworkUser u) -> { +// colourPicker.updateColour(ColourPicker.Complete_Green); +// refresh(); +// }); +// +// //----------------------------------------------------- +// //---------------- Line 2 - Red Editor ---------------- +// //----------------------------------------------------- +// +// // Lower red 16 +// setAction(11, (NetworkUser u) -> { +// colourPicker.lowerRed16(); +// refresh(); +// }); +// +// // Lower red 1 +// setAction(12, (NetworkUser u) -> { +// colourPicker.lowerRed1(); +// refresh(); +// }); +// +// // Raise red 1 +// setAction(14, (NetworkUser u) -> { +// colourPicker.raiseRed1(); +// refresh(); +// }); +// +// // Raise red 16 +// setAction(15, (NetworkUser u) -> { +// colourPicker.raiseRed16(); +// refresh(); +// }); +// +// //----------------------------------------------------- +// //--------------- Line 3 - Green Editor --------------- +// //----------------------------------------------------- +// +// // Lower green 16 +// setAction(20, (NetworkUser u) -> { +// colourPicker.lowerGreen16(); +// refresh(); +// }); +// +// // Lower green 1 +// setAction(21, (NetworkUser u) -> { +// colourPicker.lowerGreen1(); +// refresh(); +// }); +// +// // Raise green 1 +// setAction(23, (NetworkUser u) -> { +// colourPicker.raiseGreen1(); +// refresh(); +// }); +// +// // Raise green 16 +// setAction(24, (NetworkUser u) -> { +// colourPicker.raiseGreen16(); +// refresh(); +// }); +// +// //---------------------------------------------------- +// //--------------- Line 4 - Blue Editor --------------- +// //---------------------------------------------------- +// +// // Lower blue 16 +// setAction(29, (NetworkUser u) -> { +// colourPicker.lowerBlue16(); +// refresh(); +// }); +// +// // Lower blue 1 +// setAction(30, (NetworkUser u) -> { +// colourPicker.lowerBlue1(); +// refresh(); +// }); +// +// // Raise blue 1 +// setAction(32, (NetworkUser u) -> { +// colourPicker.raiseBlue1(); +// refresh(); +// }); +// +// // Raise blue 16 +// setAction(33, (NetworkUser u) -> { +// colourPicker.raiseBlue16(); +// refresh(); +// }); +// +// //----------------------------------------------------- +// //-------------- Line 5 - Colour display -------------- +// //----------------------------------------------------- +// +// // Return/confirm +// setAction(40, (NetworkUser u) -> { +// // Saves the selected colour to the feature +// colourPicker.confirmColour(); +// +// // Delete this gui. +// this.delete(); +// u.mainGui = null; +// +// // Switch to feature list menu. +// parentFeatureMenu.refresh(); +// u.mainGui = parentFeatureMenu; +// u.mainGui.open(u.player); +// }); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java index c34b854a..4398b957 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/FeaturePageGUI.java @@ -1,140 +1,140 @@ -package net.bteuk.network.gui.progressmap; - -import lombok.Getter; -import me.bteuk.progressmapper.guis.FeatureMenu; -import me.bteuk.progressmapper.guis.Field; -import net.bteuk.network.eventing.listeners.progressmap.FeatureGeometryEditorListener; -import net.bteuk.network.eventing.listeners.progressmap.FeaturePropertiesBookListener; -import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkRefreshableGui; -import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Utils; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.Style; -import org.bukkit.Material; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.inventory.ItemStack; - -// The page for editing a feature -// Should we have two different ones for edit and create (and then a shared parent) or just have both within one? -public class FeaturePageGUI extends NetworkRefreshableGui { - @Getter - private final FeatureMenu featureMenu; - private final LocalFeatureListGUI parentLocalFeatureListGUI; - - public FeaturePageGUI(GuiProvider provider, FeatureMenu featureMenu, LocalFeatureListGUI parentLocalFeatureListGUI) { - super(provider, featureMenu.getGUI()); - this.featureMenu = featureMenu; - this.parentLocalFeatureListGUI = parentLocalFeatureListGUI; - setActions(); - } - - protected void createGui() { - setItemsFromInventory(featureMenu.getGUI()); - setActions(); - } - - private void setActions() { - // Slots here are 0 indexed - - // Title edit - setAction(0, (NetworkUser u) -> openFieldEditor(u, featureMenu.getTitleBook(), Field.Title)); - - // Description edit - setAction(2, (NetworkUser u) -> openFieldEditor(u, featureMenu.getDescriptionBook(), Field.Description)); - - // Fill/stroke edit - setAction(4, (NetworkUser u) -> { - // Delete this gui. - // this.delete(); - NO. I do not want to do this - // u.mainGui = null; - NO. u.mainGui here refers to this gui, so we never want to make it null because it - // makes this gui null - - // Switch to the colour picker menu. - u.mainGui = new ColourPickerGUI(provider, featureMenu.getColourPicker(), this); - u.mainGui.open(u.player); - }); - - // Media_url edit - setAction(6, (NetworkUser u) -> openFieldEditor(u, featureMenu.getMedialURLBook(), Field.Media_url)); - - // Geometry - setAction(8, (NetworkUser u) -> { - // Gives the blaze rod - ItemStack blazeRod = ItemStack.of(Material.BLAZE_ROD, 1); - Utils.giveItem(u.player, blazeRod, "Area selection tool"); - u.player.sendMessage(Component.text( - "Use the blaze rod like a WorldEdit wand to make a selection. When " + "you have made your selection, reopen the nether star menu and click confirm selection", - Style.style(NamedTextColor.AQUA))); - - FeatureGeometryEditorListener geometryListener = new FeatureGeometryEditorListener(provider, this, featureMenu.getGeometryEditor(), u, blazeRod); - geometryListener.register(); - u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); - u.mainGui = geometryListener; - }); - - // Send update - setAction(22, (NetworkUser u) -> { - if (featureMenu.isNew()) { - featureMenu.sendAppend(provider.constants().mapHubAPIKey()); - } else { - featureMenu.sendUpdate(provider.constants().mapHubAPIKey()); - } - u.player.sendMessage(ChatUtils.success("The progress map has been updated !")); - - // Return to the local feature list - // Delete this gui. - this.delete(); - - // Switch to the feature list menu. - parentLocalFeatureListGUI.refresh(); - u.mainGui = parentLocalFeatureListGUI; - u.mainGui.open(u.player); - }); - - // Return - setAction(26, (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to the feature list menu. - parentLocalFeatureListGUI.refresh(); - u.mainGui = parentLocalFeatureListGUI; - u.mainGui.open(u.player); - }); - } - - private void openFieldEditor(NetworkUser u, ItemStack book, Field fieldType) { - // this.delete(); - // u.mainGui = null; - - // Need a book menu sort of thing, and then, when that detects a closure, it updates the values in the gson and - // then refreshes - // u.player.openBook(book); - - switch (fieldType) { - case Title: - Utils.giveItem(u.player, book, "Title editor book"); - u.player.sendMessage(ChatUtils.success("Use the title editor book to change the title")); - break; - case Description: - Utils.giveItem(u.player, book, "Description editor book"); - u.player.sendMessage(ChatUtils.success("Use the description editor book to change the description")); - break; - case Media_url: - Utils.giveItem(u.player, book, "Media url editor book"); - u.player.sendMessage(ChatUtils.success("Use the media url editor book to change the media url")); - break; - } - - // Closes the current inventory - u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); - - // Sets up the book listener and registers it - FeaturePropertiesBookListener bookListener = new FeaturePropertiesBookListener(this, fieldType, u); - bookListener.register(provider.instance()); - } -} +// package net.bteuk.network.gui.progressmap; +// +// import lombok.Getter; +// import me.bteuk.progressmapper.guis.FeatureMenu; +// import me.bteuk.progressmapper.guis.Field; +// import net.bteuk.network.eventing.listeners.progressmap.FeatureGeometryEditorListener; +// import net.bteuk.network.eventing.listeners.progressmap.FeaturePropertiesBookListener; +// import net.bteuk.network.gui.GuiProvider; +// import net.bteuk.network.gui.NetworkRefreshableGui; +// import net.bteuk.network.lib.utils.ChatUtils; +// import net.bteuk.network.utils.NetworkUser; +// import net.bteuk.network.utils.Utils; +// import net.kyori.adventure.text.Component; +// import net.kyori.adventure.text.format.NamedTextColor; +// import net.kyori.adventure.text.format.Style; +// import org.bukkit.Material; +// import org.bukkit.event.inventory.InventoryCloseEvent; +// import org.bukkit.inventory.ItemStack; +// +// // The page for editing a feature +// // Should we have two different ones for edit and create (and then a shared parent) or just have both within one? +// public class FeaturePageGUI extends NetworkRefreshableGui { +// @Getter +// private final FeatureMenu featureMenu; +// private final LocalFeatureListGUI parentLocalFeatureListGUI; +// +// public FeaturePageGUI(GuiProvider provider, FeatureMenu featureMenu, LocalFeatureListGUI parentLocalFeatureListGUI) { +// super(provider, featureMenu.getGUI()); +// this.featureMenu = featureMenu; +// this.parentLocalFeatureListGUI = parentLocalFeatureListGUI; +// setActions(); +// } +// +// protected void createGui() { +// setItemsFromInventory(featureMenu.getGUI()); +// setActions(); +// } +// +// private void setActions() { +// // Slots here are 0 indexed +// +// // Title edit +// setAction(0, (NetworkUser u) -> openFieldEditor(u, featureMenu.getTitleBook(), Field.Title)); +// +// // Description edit +// setAction(2, (NetworkUser u) -> openFieldEditor(u, featureMenu.getDescriptionBook(), Field.Description)); +// +// // Fill/stroke edit +// setAction(4, (NetworkUser u) -> { +// // Delete this gui. +// // this.delete(); - NO. I do not want to do this +// // u.mainGui = null; - NO. u.mainGui here refers to this gui, so we never want to make it null because it +// // makes this gui null +// +// // Switch to the colour picker menu. +// u.mainGui = new ColourPickerGUI(provider, featureMenu.getColourPicker(), this); +// u.mainGui.open(u.player); +// }); +// +// // Media_url edit +// setAction(6, (NetworkUser u) -> openFieldEditor(u, featureMenu.getMedialURLBook(), Field.Media_url)); +// +// // Geometry +// setAction(8, (NetworkUser u) -> { +// // Gives the blaze rod +// ItemStack blazeRod = ItemStack.of(Material.BLAZE_ROD, 1); +// Utils.giveItem(u.player, blazeRod, "Area selection tool"); +// u.player.sendMessage(Component.text( +// "Use the blaze rod like a WorldEdit wand to make a selection. When " + "you have made your selection, reopen the nether star menu and click confirm selection", +// Style.style(NamedTextColor.AQUA))); +// +// FeatureGeometryEditorListener geometryListener = new FeatureGeometryEditorListener(provider, this, featureMenu.getGeometryEditor(), u, blazeRod); +// geometryListener.register(); +// u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); +// u.mainGui = geometryListener; +// }); +// +// // Send update +// setAction(22, (NetworkUser u) -> { +// if (featureMenu.isNew()) { +// featureMenu.sendAppend(provider.constants().mapHubAPIKey()); +// } else { +// featureMenu.sendUpdate(provider.constants().mapHubAPIKey()); +// } +// u.player.sendMessage(ChatUtils.success("The progress map has been updated !")); +// +// // Return to the local feature list +// // Delete this gui. +// this.delete(); +// +// // Switch to the feature list menu. +// parentLocalFeatureListGUI.refresh(); +// u.mainGui = parentLocalFeatureListGUI; +// u.mainGui.open(u.player); +// }); +// +// // Return +// setAction(26, (NetworkUser u) -> { +// // Delete this gui. +// this.delete(); +// u.mainGui = null; +// +// // Switch to the feature list menu. +// parentLocalFeatureListGUI.refresh(); +// u.mainGui = parentLocalFeatureListGUI; +// u.mainGui.open(u.player); +// }); +// } +// +// private void openFieldEditor(NetworkUser u, ItemStack book, Field fieldType) { +// // this.delete(); +// // u.mainGui = null; +// +// // Need a book menu sort of thing, and then, when that detects a closure, it updates the values in the gson and +// // then refreshes +// // u.player.openBook(book); +// +// switch (fieldType) { +// case Title: +// Utils.giveItem(u.player, book, "Title editor book"); +// u.player.sendMessage(ChatUtils.success("Use the title editor book to change the title")); +// break; +// case Description: +// Utils.giveItem(u.player, book, "Description editor book"); +// u.player.sendMessage(ChatUtils.success("Use the description editor book to change the description")); +// break; +// case Media_url: +// Utils.giveItem(u.player, book, "Media url editor book"); +// u.player.sendMessage(ChatUtils.success("Use the media url editor book to change the media url")); +// break; +// } +// +// // Closes the current inventory +// u.player.closeInventory(InventoryCloseEvent.Reason.PLUGIN); +// +// // Sets up the book listener and registers it +// FeaturePropertiesBookListener bookListener = new FeaturePropertiesBookListener(this, fieldType, u); +// bookListener.register(provider.instance()); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java index 5036061a..82ca90e8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/progressmap/LocalFeatureListGUI.java @@ -1,70 +1,70 @@ -package net.bteuk.network.gui.progressmap; - -import me.bteuk.progressmapper.guis.LocalFeaturesMenu; -import net.bteuk.network.gui.BuildGui; -import net.bteuk.network.gui.GuiProvider; -import net.bteuk.network.gui.NetworkGui; -import net.bteuk.network.utils.NetworkUser; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; - -public class LocalFeatureListGUI extends NetworkGui { - // Contains all of the relevant information for each feature in the list - private final LocalFeaturesMenu features; - - private final int inventorySize; - - public LocalFeatureListGUI(GuiProvider provider, LocalFeaturesMenu features, Inventory guiInventory) { - // Need a list of things created really. I think this has to be before this one is created. This then holds all the Features - // Each feature would have a feature menu (not a feature page) - super(provider, guiInventory); - this.features = features; - this.inventorySize = guiInventory.getSize(); - setActions(); - } - - private void setActions() { - int i, iFeatures; - iFeatures = features.getNumFeatures(); - - // Creates all the actions - for (i = 0; i < iFeatures; i++) { - final int iFinalSlot = i; - setAction(i, (NetworkUser u) -> { - // When a feature is clicked on it needs to open a FeaturePageGUI - u.mainGui = new FeaturePageGUI(provider, features.getFeatureMenu(iFinalSlot), this); - u.mainGui.open(u.player); - }); - } - - // Back button - setAction(inventorySize - 1, (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; - - // Switch to plot info. - u.mainGui = new BuildGui(provider, u); - u.mainGui.open(u.player); - }); - } - - @Override - public void open(Player player) { - this.refresh(); - super.open(player); - } - - public void refresh() { - // Reloads the features (with a blank one at the end) - features.loadFeatures(provider.constants().mapHubAPIKey()); - - // Refresh icons - this.clear(); - Inventory inventory = features.getGUI(); - this.setItemsFromInventory(inventory); - - // Refresh actions - setActions(); - } -} +// package net.bteuk.network.gui.progressmap; +// +// import me.bteuk.progressmapper.guis.LocalFeaturesMenu; +// import net.bteuk.network.gui.BuildGui; +// import net.bteuk.network.gui.GuiProvider; +// import net.bteuk.network.gui.NetworkGui; +// import net.bteuk.network.utils.NetworkUser; +// import org.bukkit.entity.Player; +// import org.bukkit.inventory.Inventory; +// +// public class LocalFeatureListGUI extends NetworkGui { +// // Contains all of the relevant information for each feature in the list +// private final LocalFeaturesMenu features; +// +// private final int inventorySize; +// +// public LocalFeatureListGUI(GuiProvider provider, LocalFeaturesMenu features, Inventory guiInventory) { +// // Need a list of things created really. I think this has to be before this one is created. This then holds all the Features +// // Each feature would have a feature menu (not a feature page) +// super(provider, guiInventory); +// this.features = features; +// this.inventorySize = guiInventory.getSize(); +// setActions(); +// } +// +// private void setActions() { +// int i, iFeatures; +// iFeatures = features.getNumFeatures(); +// +// // Creates all the actions +// for (i = 0; i < iFeatures; i++) { +// final int iFinalSlot = i; +// setAction(i, (NetworkUser u) -> { +// // When a feature is clicked on it needs to open a FeaturePageGUI +// u.mainGui = new FeaturePageGUI(provider, features.getFeatureMenu(iFinalSlot), this); +// u.mainGui.open(u.player); +// }); +// } +// +// // Back button +// setAction(inventorySize - 1, (NetworkUser u) -> { +// // Delete this gui. +// this.delete(); +// u.mainGui = null; +// +// // Switch to plot info. +// u.mainGui = new BuildGui(provider, u); +// u.mainGui.open(u.player); +// }); +// } +// +// @Override +// public void open(Player player) { +// this.refresh(); +// super.open(player); +// } +// +// public void refresh() { +// // Reloads the features (with a blank one at the end) +// features.loadFeatures(provider.constants().mapHubAPIKey()); +// +// // Refresh icons +// this.clear(); +// Inventory inventory = features.getGUI(); +// this.setItemsFromInventory(inventory); +// +// // Refresh actions +// setActions(); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java index d279f35c..fb7bce20 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationActionGui.java @@ -172,7 +172,7 @@ protected void createGui() { Utils.line("the action gets " + "cancelled.")), (NetworkUser u) -> { // Prompt the user for a reason. - reasonListener = new ModerationReasonListener(u, this); + reasonListener = new ModerationReasonListener(provider.instance(), u, this); u.player.closeInventory(); u.player.sendMessage(ChatUtils.success("Please write the reason in chat, the first message counts" + ".")); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java index 09658d70..c0cd6be8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/ModerationGui.java @@ -19,7 +19,7 @@ public ModerationGui(GuiProvider provider) { protected void createGui() { // Ban - setItem(10, Utils.createCustomSkullWithFallback("30506c52de360dfaec1b84998ba060fa6ce12be818fc13edc5db7a7921a35d7e", Material.REDSTONE_BLOCK, 1, Utils.title("Ban"), + setItem(10, Utils.createCustomSkullWithFallback(provider.instance(), "30506c52de360dfaec1b84998ba060fa6ce12be818fc13edc5db7a7921a35d7e", Material.REDSTONE_BLOCK, 1, Utils.title("Ban"), Utils.line("Click to select an online user to ban.")), (NetworkUser u) -> { if (u.hasPermission("uknet.ban")) { @@ -28,7 +28,7 @@ protected void createGui() { }); // Unban - setItem(15, Utils.createCustomSkullWithFallback("c2abe43288a6c8cd76d0228f39112d2520c289d7c15c6aafe0c532ad9f5db9ad", Material.REDSTONE_BLOCK, 1, Utils.title("Unban"), + setItem(15, Utils.createCustomSkullWithFallback(provider.instance(), "c2abe43288a6c8cd76d0228f39112d2520c289d7c15c6aafe0c532ad9f5db9ad", Material.REDSTONE_BLOCK, 1, Utils.title("Unban"), Utils.line("Click to select a banned user to unban.")), (NetworkUser u) -> { if (u.hasPermission("uknet.ban")) { @@ -37,7 +37,7 @@ protected void createGui() { }); // Mute - setItem(11, Utils.createCustomSkullWithFallback("4f130f485c3f7697f320ddc1128cd3f17cdbd3791764f7a7bb95cf252738588", Material.REDSTONE_BLOCK, 1, Utils.title("Mute"), + setItem(11, Utils.createCustomSkullWithFallback(provider.instance(), "4f130f485c3f7697f320ddc1128cd3f17cdbd3791764f7a7bb95cf252738588", Material.REDSTONE_BLOCK, 1, Utils.title("Mute"), Utils.line("Click to select an online user to mute.")), (NetworkUser u) -> { if (u.hasPermission("uknet.mute")) { @@ -46,7 +46,7 @@ protected void createGui() { }); // Unmute - setItem(16, Utils.createCustomSkullWithFallback("f81422e8ddc0d3109aa657b89b0b0eb1d25cb3bc8d54dc6c99c3c9c081440254", Material.REDSTONE_BLOCK, 1, Utils.title("Unmute"), + setItem(16, Utils.createCustomSkullWithFallback(provider.instance(), "f81422e8ddc0d3109aa657b89b0b0eb1d25cb3bc8d54dc6c99c3c9c081440254", Material.REDSTONE_BLOCK, 1, Utils.title("Unmute"), Utils.line("Click to select a muted user to unmute.")), (NetworkUser u) -> { if (u.hasPermission("uknet.mute")) { @@ -55,7 +55,7 @@ protected void createGui() { }); // Kick - setItem(13, Utils.createCustomSkullWithFallback("5ae0e486db4ec49ff1b52cfeceda4c3f36fde23c835ea3ccfcaac935e49b5f10", Material.REDSTONE_BLOCK, 1, Utils.title("Kick"), + setItem(13, Utils.createCustomSkullWithFallback(provider.instance(), "5ae0e486db4ec49ff1b52cfeceda4c3f36fde23c835ea3ccfcaac935e49b5f10", Material.REDSTONE_BLOCK, 1, Utils.title("Kick"), Utils.line("Click to select an online user to kick.")), (NetworkUser u) -> { if (u.hasPermission("uknet.kick")) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java index 7c382997..6adeaab9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/SelectUser.java @@ -103,7 +103,7 @@ protected void createGui() { switch (type) { case BAN, MUTE, KICK -> // Ban/mute/kick the player. - setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.RED_CONCRETE, 1, Utils.title(type.label + " " + name), + setItem(slot, Utils.createCustomSkullWithFallback(provider.instance(), player_skin, Material.RED_CONCRETE, 1, Utils.title(type.label + " " + name), Utils.line("Opens the " + type.label.toLowerCase(Locale.ROOT) + " menu to set" + " the parameters.")), (NetworkUser u) -> { @@ -115,7 +115,7 @@ protected void createGui() { }); case UNBAN, UNMUTE -> // Unban/unmute the player. - setItem(slot, Utils.createCustomSkullWithFallback(player_skin, Material.LIME_CONCRETE, 1, Utils.title(type.label + " " + name), + setItem(slot, Utils.createCustomSkullWithFallback(provider.instance(), player_skin, Material.LIME_CONCRETE, 1, Utils.title(type.label + " " + name), Utils.line(type.label + " the player immediately.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java index 40e6e7fa..ca9b16bd 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonsMenu.java @@ -78,7 +78,7 @@ protected void createGui() { // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); super.setItem(45, pageBack, (NetworkUser u) -> { LessonsMenu.this.iPage--; @@ -90,7 +90,7 @@ protected void createGui() { // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); super.setItem(53, pageBack, (NetworkUser u) -> { LessonsMenu.this.iPage++; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java index d7117483..9976cbca 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java @@ -134,8 +134,8 @@ protected void createGui() { ((TextComponent) ((BookMeta) reasonEditor.getBook().getItemMeta()).page(1)).content()); // Adds recommendation to the plot system DB - net.bteuk.network.utils.TutorialRecommendation tutorialRecommendation = new net.bteuk.network.utils.TutorialRecommendation(iRecommendationID, iPlotID); - tutorialRecommendation.addTutorialRecommendationToDB(); + net.bteuk.network.utils.TutorialRecommendation tutorialRecommendation = new net.bteuk.network.utils.TutorialRecommendation(provider.tutorialsDBConnection(), iRecommendationID, iPlotID); + tutorialRecommendation.addTutorialRecommendationToDB(provider.plotSQL()); // Go back to the recommended tutorials list. u.player.closeInventory(); @@ -163,7 +163,7 @@ protected void createGui() { // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); super.setItem(46, pageBack, (NetworkUser u) -> { @@ -175,7 +175,7 @@ protected void createGui() { // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); super.setItem(52, pageBack, (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index a2afc04a..55fe20ab 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -49,7 +49,7 @@ public RecommendedTutorialsGui(GuiProvider provider, Gui parentGui, int iPlotID, this.bStaffView = bStaffView; // Fetches the tutorial recommendations for this plot - tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(iPlotID); + tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(provider.tutorialsDBConnection(), iPlotID); this.iPages = ((tutorialRecommendations.length - 1) / 45) + 1; this.iPage = 1; @@ -75,7 +75,7 @@ protected void createGui() { // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); setItem(47, pageBack, (NetworkUser u) -> { iPage--; @@ -86,7 +86,7 @@ protected void createGui() { // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); super.setItem(51, pageBack, (NetworkUser u) -> { iPage++; @@ -150,7 +150,7 @@ public void refresh() { clear(); // Fetches the tutorial recommendations for this plot - tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(iPlotID); + tutorialRecommendations = provider.plotSQL().fetchTutorialRecommendationsForPlot(provider.tutorialsDBConnection(), iPlotID); this.iPages = ((tutorialRecommendations.length - 1) / 45) + 1; this.iPage = 1; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java index 21a06a50..749a2eb3 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java @@ -96,7 +96,7 @@ protected void createGui() { // Page back if (iPage > 1) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "4eff72715e6032e90f50a38f4892529493c9f555b9af0d5e77a6fa5cddff3cd2", Material.ACACIA_BOAT, 1, Utils.title("Page back")); super.setItem(45, pageBack, (NetworkUser u) -> { iPage--; @@ -107,7 +107,7 @@ protected void createGui() { // Page forwards if (iPage < iPages) { - ItemStack pageBack = Utils.createCustomSkullWithFallback("a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, + ItemStack pageBack = Utils.createCustomSkullWithFallback(provider.instance(), "a7ba2aa14ae5b0b65573dc4971d3524e92a61dd779e4412e4642adabc2e56c44", Material.ACACIA_BOAT, 1, Utils.title("Page forwards")); super.setItem(53, pageBack, (NetworkUser u) -> { iPage++; diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java index 910f572a..d955c0b0 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java @@ -12,7 +12,14 @@ */ import lombok.Getter; +import lombok.Setter; +import lombok.extern.java.Log; +import net.bteuk.network.CommandManager; import net.bteuk.network.Network; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; @@ -31,11 +38,16 @@ import java.util.Objects; import java.util.Set; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - +@Log public class Lobby { private final Network instance; + private final Constants constants; + private final ServerAPI serverAPI; + private final EventManager eventManager; + + @Setter + private GuiProvider guiProvider; private final ArrayList portals; @Getter @@ -44,9 +56,12 @@ public class Lobby { private Book rulesBook; private Map map; - public Lobby(Network instance) { + public Lobby(Network instance, Constants constants, ServerAPI serverAPI, EventManager eventManager) { this.instance = instance; + this.constants = constants; + this.serverAPI = serverAPI; + this.eventManager = eventManager; portals = new ArrayList<>(); } @@ -57,7 +72,7 @@ public void reloadPortals() { // Clear the portals arrayList and stop the portals from running. if (portalTask != 0) { - Bukkit.getScheduler().cancelTask(portalTask); + instance.getTimerAPI().cancelTimer(portalTask); } portals.clear(); @@ -85,8 +100,7 @@ private void loadPortals() { return; } - Set portalNames = - Objects.requireNonNull(portalsConfig.getConfigurationSection("portals")).getKeys(false); + Set portalNames = Objects.requireNonNull(portalsConfig.getConfigurationSection("portals")).getKeys(false); // Create the portal from the config. for (String portalName : portalNames) { @@ -94,19 +108,12 @@ private void loadPortals() { // Create new portal with given values from config. try { - portals.add(new Portal( - portalsConfig.getInt("portals." + portalName + ".min.x"), - portalsConfig.getInt("portals." + portalName + ".min.y"), - portalsConfig.getInt("portals." + portalName + ".min.z"), - portalsConfig.getInt("portals." + portalName + ".max.x"), - portalsConfig.getInt("portals." + portalName + ".max.y"), - portalsConfig.getInt("portals." + portalName + ".max.z"), - Objects.requireNonNull(portalsConfig.getString("portals." + portalName + ".executes")).split( - ",") - )); + portals.add(new Portal(eventManager, portalsConfig.getInt("portals." + portalName + ".min.x"), portalsConfig.getInt("portals." + portalName + ".min.y"), + portalsConfig.getInt("portals." + portalName + ".min.z"), portalsConfig.getInt("portals." + portalName + ".max.x"), + portalsConfig.getInt("portals." + portalName + ".max.y"), portalsConfig.getInt("portals." + portalName + ".max.z"), + Objects.requireNonNull(portalsConfig.getString("portals." + portalName + ".executes")).split(","))); } catch (Exception e) { - Network.getInstance().getLogger().warning("Portal " + portalName + " configured incorrectly, please " + - "check the portals.yml file."); + log.warning("Portal " + portalName + " configured incorrectly, please " + "check the portals.yml file."); } } @@ -118,7 +125,7 @@ private void loadPortals() { // Events will run each second in order of how they are in the portals.yml file. private void runPortals() { - portalTask = Bukkit.getScheduler().scheduleSyncRepeatingTask(Network.getInstance(), () -> { + portalTask = instance.getTimerAPI().registerTimer(() -> { // Check if any players are in the area of the portal. for (NetworkUser user : instance.getUsers()) { @@ -147,7 +154,7 @@ private void runPortals() { user.wasInPortal = false; } } - }, 0L, 1L); + }, 1L); } // Load the rules. @@ -215,8 +222,7 @@ public void setLectern() { return; } - Location l = new Location(world, rulesConfig.getInt("location.x"), - rulesConfig.getInt("location.y"), rulesConfig.getInt("location.z")); + Location l = new Location(world, rulesConfig.getInt("location.x"), rulesConfig.getInt("location.y"), rulesConfig.getInt("location.z")); // Check if plot is lectern. if (!(world.getType(l) == Material.LECTERN)) { @@ -234,29 +240,26 @@ private void runLeaderboards() { /** * Reloads the map, this will be run when the plugin is enabled. - * As well as when the map is manually reloaded using /lobby reload map - * Map config is stored in map.yml as it is only necessary for a lobby server. + * As well as when the map is manually reloaded using /lobby reload map. */ - public void reloadMap() { + public void reloadMap(CommandManager commandManager) { if (map == null) { - map = new Map(instance); + map = new Map(instance, constants, serverAPI, eventManager, guiProvider); } map.reload(); - map.registerMapCommand(); + map.registerMapCommand(commandManager); } public void setSpawn() { try { - spawn = new Location(Bukkit.getWorld(Objects.requireNonNull(CONFIG.getString("spawn.world"))), - CONFIG.getDouble("spawn.x"), CONFIG.getDouble("spawn.y"), - CONFIG.getDouble("spawn.z"), (float) CONFIG.getDouble("spawn.yaw"), (float) CONFIG.getDouble( - "spawn.pitch")); + spawn = new Location(Bukkit.getWorld(Objects.requireNonNull(constants.spawnLocation().world())), constants.spawnLocation().x(), constants.spawnLocation().y(), + constants.spawnLocation().z(), constants.spawnLocation().yaw(), constants.spawnLocation().pitch()); } catch (Exception e) { instance.getLogger().warning("Spawn location could not be set!"); // Set default spawn. - spawn = new Location(Bukkit.getWorlds().get(0), 0.0, 65.0, 0.0, 0, 0); + spawn = new Location(Bukkit.getWorlds().getFirst(), 0.0, 65.0, 0.0, 0, 0); } } diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java index e44b9cb8..c5e2d2ce 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java @@ -2,23 +2,25 @@ import eu.decentsoftware.holograms.api.holograms.Hologram; import io.papermc.lib.PaperLib; -import io.papermc.paper.command.brigadier.Commands; -import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; -import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; +import lombok.extern.java.Log; +import net.bteuk.network.CommandManager; import net.bteuk.network.Network; -import net.bteuk.network.eventing.events.EventManager; +import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.navigation.LocationMenu; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.papercore.LocationAdapter; +import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.utils.Holograms; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.SwitchServer; import net.bteuk.network.utils.enums.Category; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import java.sql.SQLException; import java.util.ArrayList; @@ -27,16 +29,13 @@ import java.util.List; import java.util.Objects; -import static net.bteuk.network.utils.Constants.LOGGER; -import static net.bteuk.network.utils.Constants.SERVER_NAME; -import static net.bteuk.network.utils.NetworkConfig.CONFIG; - /** * This class manages the ingame map in the lobby. * When a player enters the map area they will have an item in the 5th slot of their hotbar. * Clicking on the item will list all nearby locations (radius of 50km) to the players position. * Locations will be sorted by distance to the player. */ +@Log public class Map extends AbstractReloadableComponent { private static final String AQUA = "&b&l"; @@ -44,6 +43,10 @@ public class Map extends AbstractReloadableComponent { private static final String GOLD = "&6&l"; private final Network instance; + private final Constants constants; + private final ServerAPI serverAPI; + private final EventAPI eventAPI; + private final GuiProvider guiProvider; /** * The server that has the physical map. @@ -53,7 +56,6 @@ public class Map extends AbstractReloadableComponent { /** * Coordinates of the map. */ - private String mapWorld; private Location mapLocation; /** @@ -65,8 +67,12 @@ public class Map extends AbstractReloadableComponent { private HologramClickEvent hologramClickEvent; - public Map(Network instance) { + public Map(Network instance, Constants constants, ServerAPI serverAPI, EventAPI eventAPI, GuiProvider guiProvider) { this.instance = instance; + this.constants = constants; + this.serverAPI = serverAPI; + this.eventAPI = eventAPI; + this.guiProvider = guiProvider; } private static List appendColour(List lines, boolean subcategory) { @@ -88,40 +94,37 @@ private static List appendColour(List lines, boolean subcategory @Override public void load() { if (isEnabled()) { - LOGGER.warning("An attempt was made to load the Map while it is already enabled."); + log.warning("An attempt was made to load the Map while it is already enabled."); return; } // Check if the map is enabled. - if (!CONFIG.getBoolean("map.enabled")) { + if (!constants.mapEnabled()) { setEnabled(false); return; } // Get the server of the map, this is important in deciding which features to enable. - server = CONFIG.getString("map.server"); - if (server == null || !instance.getGlobalSQL().hasRow("SELECT * FROM server_data WHERE name='" + server + "';" - )) { + server = constants.mapServer(); + if (server == null || !instance.getGlobalSQL().hasRow("SELECT * FROM server_data WHERE name='" + server + "';")) { setEnabled(false); - LOGGER.warning("The map has been enabled without a valid server, disabling the map."); + log.warning("The map has been enabled without a valid server, disabling the map."); return; } // Set the location of the map. // If the map is on this server the world must exist. // Set the coordinates of the location first, the server is not relevant for this part. - mapLocation = new Location(null, CONFIG.getDouble("map.location.x", 0), CONFIG.getDouble("map.location.y", 0), - CONFIG.getDouble("map.location.z", 0), (float) CONFIG.getDouble("map.location.yaw", 0), - (float) CONFIG.getDouble("map.location.pitch", 0)); - mapWorld = CONFIG.getString("map.location.world"); - if (Objects.equals(SERVER_NAME, server)) { - if (mapWorld == null || Bukkit.getWorld(mapWorld) == null) { + mapLocation = new Location(null, constants.mapLocation().x(), constants.mapLocation().y(), constants.mapLocation().z(), constants.mapLocation().yaw(), + constants.mapLocation().pitch()); + if (Objects.equals(constants.serverName(), server)) { + if (constants.mapLocation().world() == null || Bukkit.getWorld(constants.mapLocation().world()) == null) { setEnabled(false); - LOGGER.warning("The map world does not exist on this server, disabling the map."); + log.warning("The map world does not exist on this server, disabling the map."); return; } // Set the world, the coordinates have already been set. - mapLocation.setWorld(Bukkit.getWorld(mapWorld)); + mapLocation.setWorld(Bukkit.getWorld(constants.mapLocation().world())); // Register the hologram click event. hologramClickEvent = new HologramClickEvent(instance, this); @@ -137,13 +140,9 @@ public void load() { setEnabled(true); } - public void registerMapCommand() { + public void registerMapCommand(CommandManager manager) { // Enable the map command. - LifecycleEventManager manager = instance.getLifecycleManager(); - manager.registerEventHandler(LifecycleEvents.COMMANDS, event -> { - final Commands commands = event.registrar(); - commands.register("map", "Map command.", new MapCommand(this, server)); - }); + manager.registerCommand(new MapCommand(this, server, constants, guiProvider.globalSQL())); } /** @@ -169,18 +168,16 @@ public HologramClickAction getHologramClickAction(Hologram hologram) { protected void teleport(Player p) { // If the map is on this server teleport the player directly, else switch server first. - if (Objects.equals(SERVER_NAME, server)) { + if (Objects.equals(constants.serverName(), server)) { PaperLib.teleportAsync(p, mapLocation); } else { // Create teleport event. - EventManager.createTeleportEvent(true, p.getUniqueId().toString(), "network", String.format("teleport %s " + - "%f %f %f %f %f", - mapWorld, mapLocation.getX(), mapLocation.getY(), mapLocation.getZ(), - mapLocation.getYaw(), mapLocation.getPitch()), - "&aTeleporting to the map.", p.getLocation()); + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", + String.format("teleport %s " + "%f %f %f %f %f", constants.mapLocation().world(), mapLocation.getX(), mapLocation.getY(), mapLocation.getZ(), + mapLocation.getYaw(), mapLocation.getPitch()), "&aTeleporting to the map.", LocationAdapter.adapt(p.getLocation())); // Switch server. - SwitchServer.switchServer(p, server); + serverAPI.switchServer(PlayerAdapter.adapt(p), server); } } @@ -200,41 +197,31 @@ protected Component addMarker(Location l, String marker) { // Check of the name is valid. if (instance.getGlobalSQL().hasRow("SELECT location FROM location_data WHERE location='" + marker + "';")) { // Check if marker does not already exist. - if (instance.getGlobalSQL().hasRow("SELECT location FROM location_marker WHERE location='" + marker + "';" - )) { - return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" already exists on the" + - " map.")); + if (instance.getGlobalSQL().hasRow("SELECT location FROM location_marker WHERE location='" + marker + "';")) { + return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" already exists on the" + " map.")); } // Create coordinate id. int coordinate_id = instance.getGlobalSQL().addCoordinate(marker_location); // Add marker. - instance.getGlobalSQL().update("INSERT INTO location_marker(location,coordinate_id) VALUES('" + marker + - "'," + coordinate_id + ");"); + instance.getGlobalSQL().update("INSERT INTO location_marker(location,coordinate_id) VALUES('" + marker + "'," + coordinate_id + ");"); reload(); - return ChatUtils.success("Added marker for location ").append(Component.text(marker, - NamedTextColor.DARK_AQUA)); + return ChatUtils.success("Added marker for location ").append(Component.text(marker, NamedTextColor.DARK_AQUA)); } else { // Get the subcategory id. - int subcategory_id = - instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + marker + "';"); + int subcategory_id = instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + marker + "';"); if (subcategory_id == 0) { - return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" is not a valid " + - "location or subcategory name.")); + return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" is not a valid " + "location or subcategory name.")); } // Check if marker does not already exist. - if (instance.getGlobalSQL() - .hasRow("SELECT subcategory FROM location_marker WHERE subcategory='" + subcategory_id + "';")) { - return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" already exists on the" + - " map.")); + if (instance.getGlobalSQL().hasRow("SELECT subcategory FROM location_marker WHERE subcategory='" + subcategory_id + "';")) { + return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" already exists on the" + " map.")); } // Create coordinate id. int coordinate_id = instance.getGlobalSQL().addCoordinate(marker_location); // Add marker. - instance.getGlobalSQL() - .update("INSERT INTO location_marker(subcategory,coordinate_id) VALUES('" + subcategory_id + "'," + coordinate_id + ");"); + instance.getGlobalSQL().update("INSERT INTO location_marker(subcategory,coordinate_id) VALUES('" + subcategory_id + "'," + coordinate_id + ");"); reload(); - return ChatUtils.success("Added marker for subcategory ").append(Component.text(marker, - NamedTextColor.DARK_AQUA)); + return ChatUtils.success("Added marker for subcategory ").append(Component.text(marker, NamedTextColor.DARK_AQUA)); } } @@ -242,31 +229,25 @@ protected Component removeMarker(String marker) { // Check if the marker is a valid location. if (instance.getGlobalSQL().hasRow("SELECT location FROM location_marker WHERE location='" + marker + "';")) { // Remove coordinate id. - int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE " + - "location='" + marker + "';"); + int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE " + "location='" + marker + "';"); // Remove marker of location. instance.getGlobalSQL().update("DELETE FROM location_marker WHERE location='" + marker + "';"); instance.getGlobalSQL().update("DELETE FROM coordinates WHERE id=" + coordinate_id); reload(); - return ChatUtils.success("Removed marker for location ").append(Component.text(marker, - NamedTextColor.DARK_AQUA)); + return ChatUtils.success("Removed marker for location ").append(Component.text(marker, NamedTextColor.DARK_AQUA)); } else { // Else check if it's a valid subcategory. - int subcategory_id = - instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + marker + "';"); + int subcategory_id = instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + marker + "';"); if (subcategory_id == 0) { - return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" is not a valid marker" + - ".")); + return Component.text(marker, NamedTextColor.DARK_RED).append(ChatUtils.error(" is not a valid marker" + ".")); } // Remove coordinate id. - int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE " + - "subcategory=" + subcategory_id + ";"); + int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE " + "subcategory=" + subcategory_id + ";"); // Remove marker of location. instance.getGlobalSQL().update("DELETE FROM location_marker WHERE subcategory=" + subcategory_id + ";"); instance.getGlobalSQL().update("DELETE FROM coordinates WHERE id=" + coordinate_id); reload(); - return ChatUtils.success("Removed marker for subcategory ").append(Component.text(marker, - NamedTextColor.DARK_AQUA)); + return ChatUtils.success("Removed marker for subcategory ").append(Component.text(marker, NamedTextColor.DARK_AQUA)); } } @@ -280,14 +261,11 @@ private void loadMarkers() throws SQLException { markers.forEach(id -> { // Get the name - String location = - instance.getGlobalSQL().getString("SELECT location FROM location_marker WHERE id=" + id + ";"); - int coordinate_id = - instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE id=" + id + ";"); + String location = instance.getGlobalSQL().getString("SELECT location FROM location_marker WHERE id=" + id + ";"); + int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate_id FROM location_marker WHERE id=" + id + ";"); if (location == null) { // Load subcategory. - int subcategory_id = instance.getGlobalSQL().getInt("SELECT subcategory FROM location_marker WHERE " + - "id=" + id + ";"); + int subcategory_id = instance.getGlobalSQL().getInt("SELECT subcategory FROM location_marker WHERE " + "id=" + id + ";"); loadSubcategoryMarker(subcategory_id, coordinate_id); } else { loadLocationMarker(location, coordinate_id); @@ -300,8 +278,7 @@ private void loadLocationMarker(String name, int coordinate_id) { Hologram hologram = createMarker(name, coordinate_id, false); if (hologram == null) { - LOGGER.warning(String.format("Hologram %s was not created due to an error, a hologram with this name " + - "probably already exists.", name)); + log.warning(String.format("Hologram %s was not created due to an error, a hologram with this name " + "probably already exists.", name)); return; } @@ -313,26 +290,22 @@ private void loadLocationMarker(String name, int coordinate_id) { private void loadSubcategoryMarker(int subcategory_id, int coordinate_id) { // Get subcategory name. - String subcategory = - instance.getGlobalSQL() - .getString("SELECT name FROM location_subcategory WHERE id=" + subcategory_id + ";"); + String subcategory = instance.getGlobalSQL().getString("SELECT name FROM location_subcategory WHERE id=" + subcategory_id + ";"); if (subcategory == null) { - LOGGER.warning(String.format("Subcategory with id %d does not exist!", subcategory_id)); + log.warning(String.format("Subcategory with id %d does not exist!", subcategory_id)); return; } Hologram hologram = createMarker(subcategory, coordinate_id, true); if (hologram == null) { - LOGGER.warning(String.format("Hologram %s was not created due to an error, a hologram with this name " + - "probably already exists.", subcategory)); + log.warning(String.format("Hologram %s was not created due to an error, a hologram with this name " + "probably already exists.", subcategory)); return; } // Create the click action. - HologramClickAction clickAction = (NetworkUser u) -> Bukkit.getScheduler().runTask(instance, () -> openSubcategoryMenu(u, - subcategory)); + HologramClickAction clickAction = (NetworkUser u) -> Bukkit.getScheduler().runTask(instance, () -> openSubcategoryMenu(u, subcategory)); holograms.put(hologram, clickAction); } @@ -342,7 +315,7 @@ private Hologram createMarker(String name, int coordinate_id, boolean subcategor // Create a hologram for the location. if (l.getWorld() == null) { - LOGGER.warning(String.format("Unable to create hologram %s, world can not be found.", name)); + log.warning(String.format("Unable to create hologram %s, world can not be found.", name)); return null; } return Holograms.createHologram(name, l, appendColour(Arrays.asList(name, "↓"), subcategory)); @@ -350,13 +323,10 @@ private Hologram createMarker(String name, int coordinate_id, boolean subcategor private void teleportToLocation(NetworkUser u, String location) { // Get coordinate id. - int coordinate_id = - instance.getGlobalSQL().getInt("SELECT coordinate FROM location_data WHERE location='" + location + - "';"); + int coordinate_id = instance.getGlobalSQL().getInt("SELECT coordinate FROM location_data WHERE location='" + location + "';"); // Get the server. - String server = - instance.getGlobalSQL().getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); + String server = instance.getGlobalSQL().getString("SELECT server FROM coordinates WHERE id=" + coordinate_id + ";"); if (server == null) { u.sendMessage(ChatUtils.error("An error occurred, please contact a server administrator.")); @@ -364,16 +334,14 @@ private void teleportToLocation(NetworkUser u, String location) { } // Create teleport event. - EventManager.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport location " + location, u.player.getLocation()); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport location " + location, LocationAdapter.adapt(u.player.getLocation())); - SwitchServer.switchServer(u.player, server); + serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } private void openSubcategoryMenu(NetworkUser u, String subcategory) { // Get the subcategory id. - int id = instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + - "';"); + int id = instance.getGlobalSQL().getInt("SELECT id FROM location_subcategory WHERE name='" + subcategory + "';"); if (id == 0) { u.sendMessage(ChatUtils.error("An error occurred, please contact a server administrator.")); @@ -381,12 +349,10 @@ private void openSubcategoryMenu(NetworkUser u, String subcategory) { } // Get all locations for the subcategory. - List locations = instance.getGlobalSQL().getStringList("SELECT location FROM location_data WHERE " + - "subcategory=" + id + ";"); + List locations = instance.getGlobalSQL().getStringList("SELECT location FROM location_data WHERE " + "subcategory=" + id + ";"); // Create temporary location menu. - LocationMenu menu = new LocationMenu(subcategory, u, Category.TEMPORARY, null, - locations.toArray(String[]::new)); + LocationMenu menu = new LocationMenu(guiProvider, subcategory, u, Category.TEMPORARY, null, locations.toArray(String[]::new)); menu.setDeleteOnClose(true); // Open the menu. diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java b/Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java index cfbf5256..6b23d5df 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/MapCommand.java @@ -3,7 +3,9 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.commands.AbstractCommand; import net.bteuk.network.commands.tabcompleters.LocationAndSubcategorySelector; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -11,8 +13,6 @@ import java.util.Arrays; import java.util.Objects; -import static net.bteuk.network.utils.Constants.SERVER_NAME; - /** * Map command class, adds commands to teleport to the map. * For players with the relevant permission allows them to add markers to the map. @@ -22,15 +22,17 @@ public class MapCommand extends AbstractCommand { private static final Component INVALID_USAGE = ChatUtils.error("/map [add/remove] [warp/subcategory]"); private final Map map; private final String server; + private final Constants constants; - protected MapCommand(Map map, String server) { + protected MapCommand(Map map, String server, Constants constants, GlobalSQL globalSQL) { this.map = map; this.server = server; - setTabCompleter(new LocationAndSubcategorySelector(1)); + this.constants = constants; + setTabCompleter(new LocationAndSubcategorySelector(globalSQL, 1)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { if (!map.isEnabled()) { stack.getSender().sendMessage(ChatUtils.error("The map is not enabled.")); @@ -56,7 +58,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { return; } - if (Objects.equals(server, SERVER_NAME)) { + if (Objects.equals(server, constants.serverName())) { switch (args[0]) { case "add" -> player.sendMessage(map.addMarker(player.getLocation(), String.join(" ", Arrays.copyOfRange(args, 1, args.length)))); @@ -68,4 +70,14 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { player.sendMessage(ChatUtils.error("Map markers can only be added/removed in the same server as the map.")); } } + + @Override + public String getLabel() { + return "map"; + } + + @Override + public String getDescription() { + return "Map command."; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Portal.java b/Plugin/src/main/java/net/bteuk/network/lobby/Portal.java index 171af8c6..7fa9e6bc 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Portal.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Portal.java @@ -1,15 +1,17 @@ package net.bteuk.network.lobby; -import net.bteuk.network.Network; +import net.bteuk.network.eventing.events.EventManager; import org.bukkit.Location; import org.bukkit.entity.Player; public class Portal { + private final EventManager eventManager; private final double x1, y1, z1, x2, y2, z2; private final String[] events; - public Portal(int x1, int y1, int z1, int x2, int y2, int z2, String[] events) { + public Portal(EventManager eventManager, int x1, int y1, int z1, int x2, int y2, int z2, String[] events) { + this.eventManager = eventManager; // Check if the min/max area configured correctly. // Else which them out. @@ -56,8 +58,7 @@ public void event(Player p) { // Send command by using chat. p.chat(event); } else { - Network.getInstance().getTimers().getEventManager().event(p.getUniqueId().toString(), - event.split(" "), null); + eventManager.event(p.getUniqueId().toString(), event.split(" "), null); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java b/Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java index 1d19125b..b7ef812c 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/VoidTeleport.java @@ -18,8 +18,8 @@ public VoidTeleport(Network instance, Lobby lobby) { @EventHandler public void onPlayerMove(PlayerMoveEvent e) { if (e.getTo().getY() < 0) { - // Teleport to spawnpoint. - e.getPlayer().teleport(lobby.spawn); + // Teleport to the spawn-point. + e.getPlayer().teleport(lobby.getSpawn()); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index c54dea51..21a1ebe7 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -6,6 +6,7 @@ import net.bteuk.network.lib.utils.Reviewing; import net.bteuk.network.utils.TutorialRecommendation; import net.bteuk.network.utils.plotsystem.SubmittedPlot; +import teachingtutorials.utils.DBConnection; import javax.sql.DataSource; import java.sql.Connection; @@ -425,10 +426,11 @@ public boolean saveBook(int id, int page, String contents) { /** * Fetches a list of tutorial recommendations for a given plot * + * @param tutorialsDBConnection Database connection for tutorials * @param iPlotID The ID of the plot to fetch the recommended tutorials of * @return A list of tutorial recommendations */ - public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(int iPlotID) { + public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(DBConnection tutorialsDBConnection, int iPlotID) { // SQL objects String sql; ResultSet resultSet; @@ -449,7 +451,7 @@ public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(int iPlotID) resultSet = statement.executeQuery(); for (int i = 0; i < iCount; i++) { resultSet.next(); - recommendations[i] = new TutorialRecommendation(resultSet.getInt("recommendation_id"), iPlotID); + recommendations[i] = new TutorialRecommendation(tutorialsDBConnection, resultSet.getInt("recommendation_id"), iPlotID); } } catch (SQLException e) { log.warning("Error fetching tutorial recommendations for plot " + iPlotID + ": " + e.getLocalizedMessage()); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Coins.java b/Plugin/src/main/java/net/bteuk/network/utils/Coins.java index aca5eb43..d73f22e2 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Coins.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Coins.java @@ -1,36 +1,36 @@ -package net.bteuk.network.utils; - -/* - -This class deals with all things related to coins. -Coins is the arbitrary term use to represent the ingame currency. -This currency will have a different name for players -The currency will be earned by building and will be purchasable with real money in the future. - - */ - -import net.bteuk.network.Network; - -public class Coins { - - // Add coins to a specific player. - public void addCoins(String uuid, int coins) { - - Network.getInstance().getGlobalSQL() - .update("UPDATE coins SET coins=coins+" + coins + " WHERE uuid='" + uuid + "';"); - } - - // Remove coins from a specific player. - public void removeCoins(String uuid, int coins) { - - Network.getInstance().getGlobalSQL() - .update("UPDATE coins SET coins=coins-" + coins + " WHERE uuid='" + uuid + "';"); - } - - // Check if the player has at least this many coins. - public boolean hasEnoughCoins(String uuid, int minimum) { - - return (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM coins WHERE uuid='" + uuid + "' AND " + - "coins>=" + minimum + ";")); - } -} +// package net.bteuk.network.utils; +// +// /* +// +// This class deals with all things related to coins. +// Coins is the arbitrary term use to represent the ingame currency. +// This currency will have a different name for players +// The currency will be earned by building and will be purchasable with real money in the future. +// +// */ +// +// import net.bteuk.network.Network; +// +// public class Coins { +// +// // Add coins to a specific player. +// public void addCoins(String uuid, int coins) { +// +// Network.getInstance().getGlobalSQL() +// .update("UPDATE coins SET coins=coins+" + coins + " WHERE uuid='" + uuid + "';"); +// } +// +// // Remove coins from a specific player. +// public void removeCoins(String uuid, int coins) { +// +// Network.getInstance().getGlobalSQL() +// .update("UPDATE coins SET coins=coins-" + coins + " WHERE uuid='" + uuid + "';"); +// } +// +// // Check if the player has at least this many coins. +// public boolean hasEnoughCoins(String uuid, int minimum) { +// +// return (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM coins WHERE uuid='" + uuid + "' AND " + +// "coins>=" + minimum + ";")); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index e607a650..5c995920 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import org.apache.logging.log4j.util.Strings; @@ -186,10 +187,22 @@ public net.bteuk.network.core.Constants getConstants() { int navigationRadius = config.getInt("navigation_radius", 200); + int afkTime = config.getInt("afk", 5); + + boolean mapEnabled = config.getBoolean("map.enabled"); + String mapServer = config.getString("map.server"); + NetworkLocation mapLocation = new NetworkLocation(config.getString("map.location.world"), config.getDouble("map.location.x", 0), config.getDouble("map.location.y", 0), + config.getDouble("map.location.z", 0), (float) config.getDouble("map.location.yaw", 0), + (float) config.getDouble("map.location.pitch", 0)); + + NetworkLocation spawnLocation = new NetworkLocation(config.getString("spawn.world"), config.getDouble("spawn.x"), config.getDouble("spawn.y"), + config.getDouble("spawn.z"), (float) config.getDouble("spawn.yaw"), (float) config.getDouble("spawn.pitch")); + log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, - chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey, navigationRadius, compulsoryTutorial); + chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey, navigationRadius, + compulsoryTutorial, afkTime, mapEnabled, mapServer, mapLocation, spawnLocation); } } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 4c819c47..932a631b 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -8,10 +8,12 @@ import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; +import net.bteuk.network.eventing.events.EventManager; import net.bteuk.network.lib.dto.FocusEvent; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.regions.RegionUser; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -97,12 +99,15 @@ public class NetworkUser { @Getter private boolean focusEnabled; - public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles) { + private final RegionUser regionUser; + + public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles, Nightvision nightvision, EventManager eventManager, RegionUser regionUser) { this.instance = instance; this.constants = constants; this.player = player; + this.regionUser = regionUser; navigatorEnabled = reply.isNavigatorEnabled(); teleportEnabled = reply.isTeleportEnabled(); @@ -135,21 +140,21 @@ public NetworkUser(Player player, UserConnectReply reply, Network instance, Cons ItemStack slot8 = player.getInventory().getItem(8); if (slot8 != null) { - if (slot8.equals(instance.navigatorItem)) { + if (slot8.equals(instance.getNavigatorItem())) { player.getInventory().setItem(8, null); } } } - runEvents(); + runEvents(eventManager); // Give the player nightvision if enabled or remove it if disabled. if (nightvisionEnabled) { - Nightvision.giveNightvision(player); + nightvision.giveNightvision(player); } else { - Nightvision.removeNightvision(player); + nightvision.removeNightvision(player); } // If focus mode is enabled hide other players. @@ -192,7 +197,7 @@ public UserDisconnect createDisconnectEvent() { ); } - private void runEvents() { + private void runEvents(EventManager eventManager) { // Check if the player has any join events, if try run them. // Delay by 1 second for all plugins to run their join events. @@ -220,8 +225,7 @@ private void runEvents() { " type='network';"); // Send the event to the event handler. - // TODO: Timers - instance.getTimers().getEventManager().event(player.getUniqueId().toString(), aEvent, message); + eventManager.event(player.getUniqueId().toString(), aEvent, message); } }, 20L); } @@ -262,13 +266,12 @@ public void sendMessage(Component message) { player.sendMessage(message); } - // TODO: Use regionUser instance to determine coordinate transformation. public Location getLocationWithCoordinateTransform() { return new Location( player.getWorld(), - player.getLocation().getX() + dx, + player.getLocation().getX() + regionUser.getDeltaX(), player.getLocation().getY(), - player.getLocation().getZ() + dz, + player.getLocation().getZ() + regionUser.getDeltaZ(), player.getLocation().getYaw(), player.getLocation().getPitch() ); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Points.java b/Plugin/src/main/java/net/bteuk/network/utils/Points.java index f73fd159..05e2fc73 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Points.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Points.java @@ -1,107 +1,107 @@ -package net.bteuk.network.utils; - -import net.bteuk.network.Network; -import net.bteuk.network.sql.GlobalSQL; -import net.bteuk.network.utils.enums.PointsType; - -import java.util.ArrayList; - -public class Points { - - public static void addPoints(String uuid, int points, PointsType type) { - - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - - if (type == PointsType.POINTS) { - - // If the player has points for today, add them. - // Else create new value. - if (globalSQL.hasRow("SELECT uuid FROM points_info WHERE uuid='" + uuid + - "' AND type='POINTS' AND on_date=DATE " + Time.getDate(Time.currentTime()) + ";")) { - - globalSQL.update("UPDATE points_info SET points=points+" + points + - " WHERE uuid='" + uuid + "' AND type='POINTS' AND on_date=DATE " + Time.getDate( - Time.currentTime()) + ";"); - } else { - - globalSQL.update("INSERT INTO points_info(uuid,type,on_date,points) VALUES('" + - uuid + "','POINTS',DATE " + Time.getDate(Time.currentTime()) + "," + points + ");"); - } - - // Add to total points. - globalSQL.update("UPDATE points_data SET points=points+" + points + " WHERE uuid='" + uuid + "';"); - - // Update weekly points. - long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 7); - int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + - "' AND type='POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); - globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); - } else if (type == PointsType.BUILDING_POINTS) { - - // If the player has building points for today, add them. - // Else create new value. - if (globalSQL.hasRow("SELECT uuid FROM points_info WHERE uuid='" + uuid + - "' AND type='BUILDING_POINTS' AND on_date=DATE " + Time.getDate(Time.currentTime()) + ";")) { - - globalSQL.update("UPDATE points_info SET points=points+" + points + - " WHERE uuid='" + uuid + "' AND type='BUILDING_POINTS' AND on_date=DATE " + Time.getDate( - Time.currentTime()) + ";"); - } else { - - globalSQL.update("INSERT INTO points_info(uuid,type,on_date,points) VALUES('" + - uuid + "','BUILDING_POINTS',DATE " + Time.getDate(Time.currentTime()) + "," + points + ");"); - } - - // Add to total building points. - globalSQL.update( - "UPDATE points_data SET building_points=building_points+" + points + " WHERE uuid='" + uuid + "';"); - - // Update monthly building points. - long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 30); - int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + - "' AND type='BUILDING_POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); - globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); - } - } - - public static void updateWeekly() { - - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - - // Get all users. - ArrayList uuids = globalSQL.getStringList("SELECT uuid FROM points_data;"); - - // Update weekly points. - long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 7); - for (String uuid : uuids) { - - int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + - "' AND type='POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); - globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); - } - - // Clear all data from before 7 days ago. - globalSQL.update("DELETE FROM points_info WHERE type='POINTS' AND on_date >= DATE " + Time.getDate(time) + ";"); - } - - public static void updateMonthly() { - - GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); - - // Get all users. - ArrayList uuids = globalSQL.getStringList("SELECT uuid FROM points_data;"); - - // Update monthly building points. - long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 30); - for (String uuid : uuids) { - - int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + - "' AND type='BUILDING_POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); - globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); - } - - // Clear all data from before 30 days ago. - globalSQL.update( - "DELETE FROM points_info WHERE type='BUILDING_POINTS' AND on_date >= DATE " + Time.getDate(time) + ";"); - } -} +// package net.bteuk.network.utils; +// +// import net.bteuk.network.Network; +// import net.bteuk.network.sql.GlobalSQL; +// import net.bteuk.network.utils.enums.PointsType; +// +// import java.util.ArrayList; +// +// public class Points { +// +// public static void addPoints(String uuid, int points, PointsType type) { +// +// GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); +// +// if (type == PointsType.POINTS) { +// +// // If the player has points for today, add them. +// // Else create new value. +// if (globalSQL.hasRow("SELECT uuid FROM points_info WHERE uuid='" + uuid + +// "' AND type='POINTS' AND on_date=DATE " + Time.getDate(Time.currentTime()) + ";")) { +// +// globalSQL.update("UPDATE points_info SET points=points+" + points + +// " WHERE uuid='" + uuid + "' AND type='POINTS' AND on_date=DATE " + Time.getDate( +// Time.currentTime()) + ";"); +// } else { +// +// globalSQL.update("INSERT INTO points_info(uuid,type,on_date,points) VALUES('" + +// uuid + "','POINTS',DATE " + Time.getDate(Time.currentTime()) + "," + points + ");"); +// } +// +// // Add to total points. +// globalSQL.update("UPDATE points_data SET points=points+" + points + " WHERE uuid='" + uuid + "';"); +// +// // Update weekly points. +// long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 7); +// int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + +// "' AND type='POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); +// globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); +// } else if (type == PointsType.BUILDING_POINTS) { +// +// // If the player has building points for today, add them. +// // Else create new value. +// if (globalSQL.hasRow("SELECT uuid FROM points_info WHERE uuid='" + uuid + +// "' AND type='BUILDING_POINTS' AND on_date=DATE " + Time.getDate(Time.currentTime()) + ";")) { +// +// globalSQL.update("UPDATE points_info SET points=points+" + points + +// " WHERE uuid='" + uuid + "' AND type='BUILDING_POINTS' AND on_date=DATE " + Time.getDate( +// Time.currentTime()) + ";"); +// } else { +// +// globalSQL.update("INSERT INTO points_info(uuid,type,on_date,points) VALUES('" + +// uuid + "','BUILDING_POINTS',DATE " + Time.getDate(Time.currentTime()) + "," + points + ");"); +// } +// +// // Add to total building points. +// globalSQL.update( +// "UPDATE points_data SET building_points=building_points+" + points + " WHERE uuid='" + uuid + "';"); +// +// // Update monthly building points. +// long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 30); +// int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + +// "' AND type='BUILDING_POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); +// globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); +// } +// } +// +// public static void updateWeekly() { +// +// GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); +// +// // Get all users. +// ArrayList uuids = globalSQL.getStringList("SELECT uuid FROM points_data;"); +// +// // Update weekly points. +// long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 7); +// for (String uuid : uuids) { +// +// int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + +// "' AND type='POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); +// globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); +// } +// +// // Clear all data from before 7 days ago. +// globalSQL.update("DELETE FROM points_info WHERE type='POINTS' AND on_date >= DATE " + Time.getDate(time) + ";"); +// } +// +// public static void updateMonthly() { +// +// GlobalSQL globalSQL = Network.getInstance().getGlobalSQL(); +// +// // Get all users. +// ArrayList uuids = globalSQL.getStringList("SELECT uuid FROM points_data;"); +// +// // Update monthly building points. +// long time = Time.currentTime() - (1000L * 60 * 60 * 24 * 30); +// for (String uuid : uuids) { +// +// int wPoints = globalSQL.getInt("SELECT SUM(points) FROM points_info WHERE uuid='" + uuid + +// "' AND type='BUILDING_POINTS' AND on_date < DATE " + Time.getDate(time) + ";"); +// globalSQL.update("UPDATE points_data SET points_weekly=" + wPoints + " WHERE uuid='" + uuid + "';"); +// } +// +// // Clear all data from before 30 days ago. +// globalSQL.update( +// "DELETE FROM points_info WHERE type='BUILDING_POINTS' AND on_date >= DATE " + Time.getDate(time) + ";"); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Statistics.java b/Plugin/src/main/java/net/bteuk/network/utils/Statistics.java index ff0f85b7..f53af38d 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Statistics.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Statistics.java @@ -6,19 +6,16 @@ */ -import net.bteuk.network.Network; +import net.bteuk.network.sql.GlobalSQL; public class Statistics { // Add tpll to statistics. - public static void addTpll(String uuid, String date) { + public static void addTpll(GlobalSQL globalSQL, String uuid, String date) { // If date doesn't exist, create it. - if (Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM statistics WHERE uuid='" + uuid + "' AND " + - "on_date='" + date + "';")) { - Network.getInstance().getGlobalSQL().update("UPDATE statistics SET tpll=tpll+1 WHERE uuid='" + uuid + "' " + - "AND on_date='" + date + "';"); + if (globalSQL.hasRow("SELECT uuid FROM statistics WHERE uuid='" + uuid + "' AND " + "on_date='" + date + "';")) { + globalSQL.update("UPDATE statistics SET tpll=tpll+1 WHERE uuid='" + uuid + "' " + "AND on_date='" + date + "';"); } else { - Network.getInstance().getGlobalSQL() - .update("INSERT INTO statistics(uuid,on_date,tpll) VALUES('" + uuid + "','" + date + "',1);"); + globalSQL.update("INSERT INTO statistics(uuid,on_date,tpll) VALUES('" + uuid + "','" + date + "',1);"); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 59fd8a5a..40f0e9af 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -19,15 +19,17 @@ @Log public class SwitchServer implements ServerAPI { + private final Network instance; private final Constants constants; - public SwitchServer(Constants constants) { + public SwitchServer(Network instance, Constants constants) { + this.instance = instance; this.constants = constants; } public void switchServer(NetworkPlayer player, String server) { - Optional user = Network.getInstance().getNetworkUserByUuid(player.getUuidAsString()); + Optional user = instance.getNetworkUserByUuid(player.getUuidAsString()); // If u is null, cancel. if (user.isEmpty()) { @@ -39,28 +41,28 @@ public void switchServer(NetworkPlayer player, String server) { // If the server is null, cancel and notify the player. if (server == null) { player.sendMessage(ChatUtils.error("An error occurred, server does not exist.")); - Network.getInstance().getLogger().warning("Player attempting to switch to non-existing server."); + instance.getLogger().warning("Player attempting to switch to non-existing server."); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + + instance.getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; } // Check if the server exists and is online. - if (!Network.getInstance().getGlobalSQL().hasRow("SELECT name FROM server_data WHERE name='" + server + "';")) { + if (!instance.getGlobalSQL().hasRow("SELECT name FROM server_data WHERE name='" + server + "';")) { player.sendMessage(ChatUtils.error("The server " + server + " does not exist.")); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + + instance.getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; - } else if (Network.getInstance().getGlobalSQL() + } else if (instance.getGlobalSQL() .hasRow("SELECT online FROM server_data WHERE name='" + server + "' AND online=0;")) { player.sendMessage(ChatUtils.error("The server " + server + " is currently offline.")); // Remove any join events that the player may have. - Network.getInstance().getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + + instance.getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUuidAsString() + "';"); return; } @@ -72,7 +74,7 @@ public void switchServer(NetworkPlayer player, String server) { UserDisconnect userDisconnect = user.get().createDisconnectEvent(); SwitchServerEvent switchServerEvent = new SwitchServerEvent(player.getUuidAsString(), server, constants.serverName(), userDisconnect); - Network.getInstance().getChat().sendSocketMessage(switchServerEvent); + instance.getChat().sendSocketMessage(switchServerEvent); } public static void switchToExternalServer(Player player) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java b/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java index c6b30bf2..3670bd9e 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/TutorialRecommendation.java @@ -1,33 +1,33 @@ package net.bteuk.network.utils; -import net.bteuk.network.Network; +import lombok.Getter; +import lombok.extern.java.Log; +import net.bteuk.network.sql.PlotSQL; +import teachingtutorials.utils.DBConnection; /** * Represents a tutorial recommendation */ +@Log public class TutorialRecommendation { private final int iRecommendationID; private final int iPlotID; + @Getter private final teachingtutorials.tutorialobjects.TutorialRecommendation linkedTutorialRecommendation; - public TutorialRecommendation(int iRecommendationID, int iPlotID) { + public TutorialRecommendation(DBConnection dbConnection, int iRecommendationID, int iPlotID) { this.iRecommendationID = iRecommendationID; this.iPlotID = iPlotID; - this.linkedTutorialRecommendation = teachingtutorials.tutorialobjects.TutorialRecommendation.fetchTutorialRecommendationByID( - Network.getInstance().getTutorialsDBConnection(), Constants.LOGGER, iRecommendationID); - } - - public teachingtutorials.tutorialobjects.TutorialRecommendation getLinkedTutorialRecommendation() { - return linkedTutorialRecommendation; + this.linkedTutorialRecommendation = teachingtutorials.tutorialobjects.TutorialRecommendation.fetchTutorialRecommendationByID(dbConnection, log, iRecommendationID); } /** - * Adds this tutorials recommendation to the plots database + * Adds this tutorial recommendation to the plot database */ - public void addTutorialRecommendationToDB() { + public void addTutorialRecommendationToDB(PlotSQL plotSQL) { String sql = "INSERT INTO tutorial_recommendations (`plot_id`, `recommendation_id`) VALUES (" + this.iPlotID + ", " + this.iRecommendationID + ")"; - Network.getInstance().getPlotSQL().update(sql); + plotSQL.update(sql); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Utils.java b/Plugin/src/main/java/net/bteuk/network/utils/Utils.java index 97428910..bc25a73a 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Utils.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Utils.java @@ -2,6 +2,7 @@ import com.destroystokyo.paper.profile.PlayerProfile; import net.bteuk.network.Network; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -29,16 +30,12 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.bteuk.network.utils.Constants.MAX_Y; -import static net.bteuk.network.utils.Constants.MIN_Y; - public class Utils { private static final Pattern PATTERN = Pattern.compile("%s"); public static Component title(String message) { - return Component.text(message, NamedTextColor.AQUA, TextDecoration.BOLD).decoration(TextDecoration.ITALIC, - false); + return Component.text(message, NamedTextColor.AQUA, TextDecoration.BOLD).decoration(TextDecoration.ITALIC, false); } public static Component line(String message) { @@ -81,8 +78,7 @@ public static Component success(String message, String... vars) { return varMessage(NamedTextColor.GREEN, NamedTextColor.DARK_AQUA, message, vars); } - private static Component varMessage(NamedTextColor textColour, NamedTextColor varColour, String message, - String... vars) { + private static Component varMessage(NamedTextColor textColour, NamedTextColor varColour, String message, String... vars) { Component component = Component.empty(); // Find the number of vars needed. int lastIdx = 0; @@ -107,9 +103,7 @@ private static Component varMessage(NamedTextColor textColour, NamedTextColor va } private static Component colouredText(NamedTextColor colour, String message) { - return Component.text(message, colour) - .decoration(TextDecoration.ITALIC, false) - .decoration(TextDecoration.BOLD, false); + return Component.text(message, colour).decoration(TextDecoration.ITALIC, false).decoration(TextDecoration.BOLD, false); } /** @@ -119,8 +113,7 @@ private static Component colouredText(NamedTextColor colour, String message) { * @return Component of the tip with the prefix */ public static Component tip(String tip) { - return Component.text("[TIP] ", TextColor.color(0x346beb)) - .append(Utils.line(tip)); + return Component.text("[TIP] ", TextColor.color(0x346beb)).append(Utils.line(tip)); } public static ItemStack createItem(Material material, int amount, Component displayName, Component... loreString) { @@ -137,8 +130,7 @@ public static ItemStack createItem(Material material, int amount, Component disp return item; } - public static ItemStack createCustomSkullWithFallback(String texture, Material fallback, int amount, - Component displayName, Component... loreString) { + public static ItemStack createCustomSkullWithFallback(Network instance, String texture, Material fallback, int amount, Component displayName, Component... loreString) { ItemStack item; @@ -154,7 +146,7 @@ public static ItemStack createCustomSkullWithFallback(String texture, Material f SkullMeta meta = (SkullMeta) item.getItemMeta(); // Create playerprofile. - PlayerProfile profile = Network.getInstance().getServer().createProfile(UUID.randomUUID()); + PlayerProfile profile = instance.getServer().createProfile(UUID.randomUUID()); PlayerTextures textures = profile.getTextures(); textures.setSkin(url); @@ -199,8 +191,7 @@ public static ItemStack createPlayerSkull(String uuid, int amount, Component dis return item; } - public static ItemStack createPlayerSkull(PlayerProfile profile, int amount, Component displayName, - Component... loreString) { + public static ItemStack createPlayerSkull(PlayerProfile profile, int amount, Component displayName, Component... loreString) { ItemStack item; @@ -217,8 +208,7 @@ public static ItemStack createPlayerSkull(PlayerProfile profile, int amount, Com return item; } - public static ItemStack createPotion(Material material, PotionEffectType effect, int amount, - Component displayName, Component... loreString) { + public static ItemStack createPotion(Material material, PotionEffectType effect, int amount, Component displayName, Component... loreString) { ItemStack item; @@ -236,9 +226,9 @@ public static ItemStack createPotion(Material material, PotionEffectType effect, return item; } - public static int getHighestYAt(World w, int x, int z) { + public static int getHighestYAt(Constants constants, World w, int x, int z) { - for (int i = (MAX_Y - 1); i >= MIN_Y; i--) { + for (int i = (constants.maxY() - 1); i >= constants.minY(); i--) { if (w.getBlockAt(x, i, z).getType() != Material.AIR) { return i + 1; } @@ -256,14 +246,13 @@ public static int getHighestYAt(World w, int x, int z) { * If the main hand has an item swap the current item to an empty slot in the inventory. * If no empty slots are available overwrite it. */ - public static void giveItem(Player p, ItemStack item, String name) { + public static void giveItem(Network instance, Player p, ItemStack item, String name) { ItemStack currentItem = p.getInventory().getItemInMainHand(); int emptySlot = getEmptyHotbarSlot(p); - boolean hasNavigator = - (p.getInventory().getHeldItemSlot() == 8 && currentItem.equals(Network.getInstance().navigator)); + boolean hasNavigator = (p.getInventory().getHeldItemSlot() == 8 && currentItem.equals(instance.getNavigatorItem())); boolean hasItemAlready = p.getInventory().containsAtLeast(item, 1); // If we already have the item switch to current slot. @@ -276,32 +265,27 @@ public static void giveItem(Player p, ItemStack item, String name) { p.getInventory().setItem(slot, p.getInventory().getItem(7)); p.getInventory().setItem(7, item); - p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" to slot 8")))); + p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to slot 8")))); } else { p.getInventory().setItem(slot, p.getInventory().getItemInMainHand()); p.getInventory().setItemInMainHand(item); - p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" to main hand.")))); + p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to main hand.")))); } } else if (emptySlot >= 0) { // The current slot is empty. This also implies no navigator, and thus the item does not yet exist in the // inventory. // Set item to empty slot. p.getInventory().setItem(emptySlot, item); - p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" to slot " + (emptySlot + 1))))); + p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to slot " + (emptySlot + 1))))); } else if (hasNavigator) { // Player has no empty slots and is holding the navigator, set to item to slot 7. p.getInventory().setItem(7, item); - p.sendMessage(ChatUtils.success("Set ") - .append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to slot 8")))); + p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to slot 8")))); } else { // Set item in current slot. p.getInventory().setItemInMainHand(item); - p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA) - .append(ChatUtils.success(" to main hand.")))); + p.sendMessage(ChatUtils.success("Set ").append(Component.text(name, NamedTextColor.DARK_AQUA).append(ChatUtils.success(" to main hand.")))); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java index 9c55613e..5e11e0df 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java @@ -1,6 +1,6 @@ package net.bteuk.network.utils.plotsystem; -import net.bteuk.network.Network; +import net.bteuk.network.api.SQLAPI; import net.bteuk.network.lib.utils.ChatUtils; import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; @@ -30,10 +30,12 @@ private ReviewFeedback() { /** * Create the feedback book for a plot review. * + * @param globalSQL access to the global database + * @param plotSQL access to the plot database * @param reviewId the id of the plot review * @return the feedback book for the plot review */ - public static Book createFeedbackBook(int reviewId) { + public static Book createFeedbackBook(SQLAPI globalSQL, SQLAPI plotSQL, int reviewId) { Component firstPage = Component.empty(); @@ -44,8 +46,8 @@ public static Book createFeedbackBook(int reviewId) { .appendNewline().appendNewline()); // Reviewer - String reviewer = Network.getInstance().getGlobalSQL().getString("SELECT name FROM player_data WHERE uuid='" + - Network.getInstance().getPlotSQL() + String reviewer = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + + plotSQL .getString("SELECT reviewer FROM plot_review WHERE id=" + reviewId + ";") + "';"); firstPage = firstPage.append(Component.text(String.format("Reviewer: %s", reviewer), @@ -54,7 +56,7 @@ public static Book createFeedbackBook(int reviewId) { List pages = new ArrayList<>(); // Add each category that has a selection. - Map reviewCategoryFeedback = getReviewCategoryFeedback(reviewId); + Map reviewCategoryFeedback = getReviewCategoryFeedback(globalSQL, plotSQL, reviewId); for (ReviewCategory category : ReviewCategory.values()) { ReviewCategoryFeedback categoryFeedback = reviewCategoryFeedback.get(category); if (categoryFeedback == null) { @@ -62,7 +64,7 @@ public static Book createFeedbackBook(int reviewId) { } firstPage = firstPage.appendNewline(); // Add the category to the book. - firstPage = firstPage.append(addCategoryToFeedbackBook(categoryFeedback, pages)); + firstPage = firstPage.append(addCategoryToFeedbackBook(plotSQL, categoryFeedback, pages)); } // Insert the first page of the book at the start. @@ -78,7 +80,7 @@ public static Book createFeedbackBook(int reviewId) { * @param old true if the before view should be created * @return the feedback book for the plot verification */ - public static Book createVerificationFeedbackBook(int verificationId, boolean old) { + public static Book createVerificationFeedbackBook(SQLAPI plotSQL, int verificationId, boolean old) { Component firstPage = Component.empty(); @@ -92,7 +94,7 @@ public static Book createVerificationFeedbackBook(int verificationId, boolean ol // Add each category that has a selection. Map verificationCategoryFeedback = - getVerificationCategoryFeedback(verificationId, old); + getVerificationCategoryFeedback(plotSQL, verificationId, old); for (ReviewCategory category : ReviewCategory.values()) { ReviewCategoryFeedback categoryFeedback = verificationCategoryFeedback.get(category); if (categoryFeedback == null) { @@ -100,7 +102,7 @@ public static Book createVerificationFeedbackBook(int verificationId, boolean ol } firstPage = firstPage.appendNewline(); // Add the category to the book. - firstPage = firstPage.append(addCategoryToFeedbackBook(categoryFeedback, pages)); + firstPage = firstPage.append(addCategoryToFeedbackBook(plotSQL, categoryFeedback, pages)); } // Insert the first page of the book at the start. @@ -109,20 +111,20 @@ public static Book createVerificationFeedbackBook(int verificationId, boolean ol return Book.book(REVIEW_BOOK_TITLE, Component.empty(), pages); } - private static Map getReviewCategoryFeedback(int reviewId) { + private static Map getReviewCategoryFeedback(SQLAPI globalSQL, SQLAPI plotSQL, int reviewId) { Map reviewCategoryFeedbackMap = new HashMap<>(); // Get the feedback for the review. - List reviewCategories = Network.getInstance().getPlotSQL().getStringList("SELECT category FROM " + + List reviewCategories = plotSQL.getStringList("SELECT category FROM " + "plot_category_feedback WHERE review_id=" + reviewId + ";"); for (String category : reviewCategories) { reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( ReviewCategory.valueOf(category), - ReviewSelection.valueOf(Network.getInstance().getPlotSQL().getString("SELECT selection FROM " + + ReviewSelection.valueOf(plotSQL.getString("SELECT selection FROM " + "plot_category_feedback WHERE review_id=" + reviewId + " AND category='" + category + "';" )), - Network.getInstance().getPlotSQL().getInt("SELECT book_id FROM plot_category_feedback WHERE " + + plotSQL.getInt("SELECT book_id FROM plot_category_feedback WHERE " + "review_id=" + reviewId + " AND category='" + category + "';") )); } @@ -130,31 +132,31 @@ private static Map getReviewCategoryFeed return reviewCategoryFeedbackMap; } - private static Map getVerificationCategoryFeedback(int verificationId, + private static Map getVerificationCategoryFeedback(SQLAPI plotSQL, int verificationId, boolean old) { Map reviewCategoryFeedbackMap = new HashMap<>(); // Get the feedback for the review. - List verificationCategories = Network.getInstance().getPlotSQL().getStringList("SELECT category FROM " + + List verificationCategories = plotSQL.getStringList("SELECT category FROM " + "plot_verification_category WHERE verification_id=" + verificationId + ";"); for (String category : verificationCategories) { if (old) { reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( ReviewCategory.valueOf(category), - ReviewSelection.valueOf(Network.getInstance().getPlotSQL().getString("SELECT selection_old " + + ReviewSelection.valueOf(plotSQL.getString("SELECT selection_old " + "FROM plot_verification_category WHERE verification_id=" + verificationId + " AND " + "category='" + category + "';")), - Network.getInstance().getPlotSQL().getInt("SELECT book_id_old FROM plot_verification_category" + + plotSQL.getInt("SELECT book_id_old FROM plot_verification_category" + " WHERE verification_id=" + verificationId + " AND category='" + category + "';") )); } else { reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( ReviewCategory.valueOf(category), - ReviewSelection.valueOf(Network.getInstance().getPlotSQL().getString("SELECT selection_new " + + ReviewSelection.valueOf(plotSQL.getString("SELECT selection_new " + "FROM plot_verification_category WHERE verification_id=" + verificationId + " AND " + "category='" + category + "';")), - Network.getInstance().getPlotSQL().getInt("SELECT book_id_new FROM plot_verification_category" + + plotSQL.getInt("SELECT book_id_new FROM plot_verification_category" + " WHERE verification_id=" + verificationId + " AND category='" + category + "';") )); } @@ -164,7 +166,7 @@ private static Map getVerificationCatego } @NotNull - private static Component addCategoryToFeedbackBook(ReviewCategoryFeedback categoryFeedback, List pages) { + private static Component addCategoryToFeedbackBook(SQLAPI plotSQL, ReviewCategoryFeedback categoryFeedback, List pages) { Component line = Component.empty(); Component category = Component.text(categoryFeedback.category().getDisplayName(), @@ -172,7 +174,7 @@ private static Component addCategoryToFeedbackBook(ReviewCategoryFeedback catego // Add the feedback to the book if it exists. if (categoryFeedback.bookId() != 0) { - ArrayList sPages = Network.getInstance().getPlotSQL().getStringList("SELECT contents FROM " + + List sPages = plotSQL.getStringList("SELECT contents FROM " + "book_data WHERE id=" + categoryFeedback.bookId() + " ORDER BY page ASC;"); category = category.clickEvent(getGotoFeedbackClickEvent(pages.size() + 2)) diff --git a/Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java b/Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java index ec3688fd..5f5d3e41 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/progression/Level.java @@ -1,106 +1,106 @@ -package net.bteuk.network.utils.progression; - -import net.bteuk.network.Network; - -public class Level { - - protected static void addPlayerIfNotExists(String season, String uuid) { - - if (!Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM progression WHERE uuid='" + uuid + "' AND " + - "season='" + season + "';")) { - Network.getInstance().getGlobalSQL().update("INSERT INTO progression(season,uuid) VALUES('" + season + - "','" + uuid + "');"); - } - } - - /** - * Get the next exp threshold to reach the given level. - * - * @param level the level to get the threshold for - * @return the exp required to reach the level - */ - protected static int getThreshold(int level) { - - return (int) Math.round(50 * Math.log((2d * level) / 3d) + level); - } - - /** - * Check whether the next level has been reached. - * - * @param currentLevel the current level - * @param exp the current exp - * @return whether the next level has been reached - */ - public static boolean reachedNextLevel(int currentLevel, int exp) { - - return (exp >= getThreshold(currentLevel + 1)); - } - - /** - * Get the leftover exp after reaching the next level. - * - * @param level the level that has been reached - * @param currentExp the current amount of exp - * @return the amount of exp left after leveling up - */ - public static int getLeftoverExp(int level, int currentExp) { - - return (currentExp - getThreshold(level)); - } - - /** - * Get the level of the player from the database. - * - * @param season the season to get the level for - * @param uuid the uuid of the player - * @return the current level - */ - public static int getLevel(String season, String uuid) { - - return Network.getInstance().getGlobalSQL().getInt("SELECT lvl FROM progression WHERE uuid='" + uuid + "' AND" + - " season='" + season + "';"); - } - - /** - * Get the exp of the player from the database. - * - * @param season the season to get the exp for - * @param uuid the uuid of the player - * @return the current exp - */ - public static int getExp(String season, String uuid) { - - return Network.getInstance().getGlobalSQL().getInt("SELECT exp FROM progression WHERE uuid='" + uuid + "' AND" + - " season='" + season + "';"); - } - - /** - * Set the level of the player in the database. - * - * @param season the season to set the level for - * @param uuid the uuid of the player - * @param level the level to set - * @return whether the action was successful - */ - public static boolean setLevel(String season, String uuid, int level) { - - return Network.getInstance().getGlobalSQL() - .update("UPDATE progression SET lvl=" + level + " WHERE uuid='" + uuid + "' AND season='" + season + - "';"); - } - - /** - * Set the exp of the player in the database. - * - * @param season the season to set the exp for - * @param uuid the uuid of the player - * @param exp the level to set - * @return whether the action was successful - */ - public static boolean setExp(String season, String uuid, int exp) { - - return Network.getInstance().getGlobalSQL() - .update("UPDATE progression SET exp=" + exp + " WHERE uuid='" + uuid + "' AND season='" + season + - "';"); - } -} +// package net.bteuk.network.utils.progression; +// +// import net.bteuk.network.Network; +// +// public class Level { +// +// protected static void addPlayerIfNotExists(String season, String uuid) { +// +// if (!Network.getInstance().getGlobalSQL().hasRow("SELECT uuid FROM progression WHERE uuid='" + uuid + "' AND " + +// "season='" + season + "';")) { +// Network.getInstance().getGlobalSQL().update("INSERT INTO progression(season,uuid) VALUES('" + season + +// "','" + uuid + "');"); +// } +// } +// +// /** +// * Get the next exp threshold to reach the given level. +// * +// * @param level the level to get the threshold for +// * @return the exp required to reach the level +// */ +// protected static int getThreshold(int level) { +// +// return (int) Math.round(50 * Math.log((2d * level) / 3d) + level); +// } +// +// /** +// * Check whether the next level has been reached. +// * +// * @param currentLevel the current level +// * @param exp the current exp +// * @return whether the next level has been reached +// */ +// public static boolean reachedNextLevel(int currentLevel, int exp) { +// +// return (exp >= getThreshold(currentLevel + 1)); +// } +// +// /** +// * Get the leftover exp after reaching the next level. +// * +// * @param level the level that has been reached +// * @param currentExp the current amount of exp +// * @return the amount of exp left after leveling up +// */ +// public static int getLeftoverExp(int level, int currentExp) { +// +// return (currentExp - getThreshold(level)); +// } +// +// /** +// * Get the level of the player from the database. +// * +// * @param season the season to get the level for +// * @param uuid the uuid of the player +// * @return the current level +// */ +// public static int getLevel(String season, String uuid) { +// +// return Network.getInstance().getGlobalSQL().getInt("SELECT lvl FROM progression WHERE uuid='" + uuid + "' AND" + +// " season='" + season + "';"); +// } +// +// /** +// * Get the exp of the player from the database. +// * +// * @param season the season to get the exp for +// * @param uuid the uuid of the player +// * @return the current exp +// */ +// public static int getExp(String season, String uuid) { +// +// return Network.getInstance().getGlobalSQL().getInt("SELECT exp FROM progression WHERE uuid='" + uuid + "' AND" + +// " season='" + season + "';"); +// } +// +// /** +// * Set the level of the player in the database. +// * +// * @param season the season to set the level for +// * @param uuid the uuid of the player +// * @param level the level to set +// * @return whether the action was successful +// */ +// public static boolean setLevel(String season, String uuid, int level) { +// +// return Network.getInstance().getGlobalSQL() +// .update("UPDATE progression SET lvl=" + level + " WHERE uuid='" + uuid + "' AND season='" + season + +// "';"); +// } +// +// /** +// * Set the exp of the player in the database. +// * +// * @param season the season to set the exp for +// * @param uuid the uuid of the player +// * @param exp the level to set +// * @return whether the action was successful +// */ +// public static boolean setExp(String season, String uuid, int exp) { +// +// return Network.getInstance().getGlobalSQL() +// .update("UPDATE progression SET exp=" + exp + " WHERE uuid='" + uuid + "' AND season='" + season + +// "';"); +// } +// } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java index 2a67d9dc..fb9ebf2a 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java @@ -2,6 +2,7 @@ import lombok.Getter; import net.bteuk.minecraft.gui.Gui; +import net.bteuk.network.Network; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; @@ -21,7 +22,6 @@ import org.bukkit.event.player.PlayerEditBookEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; -import org.bukkit.plugin.java.JavaPlugin; import java.util.List; import java.util.logging.Level; @@ -33,7 +33,7 @@ public class TextEditorBookListener implements Listener { /** * A reference to the instance of the plugin */ - private final JavaPlugin plugin; + private final Network instance; /** * A reference to the interface object which defines the intended behaviour on book close @@ -59,14 +59,14 @@ public class TextEditorBookListener implements Listener { /** * Constructs the object, gets the book ready * - * @param plugin A reference to the instance of the plugin + * @param instance A reference to the instance of the plugin * @param user A reference to the User * @param szBookTitle The intended title for the book * @param bookCloseAction The action to perform on book close */ - public TextEditorBookListener(JavaPlugin plugin, NetworkUser user, Gui parentGUI, String szBookTitle, BookCloseAction bookCloseAction, String... initialValue) { - this.plugin = plugin; + public TextEditorBookListener(Network instance, NetworkUser user, Gui parentGUI, String szBookTitle, BookCloseAction bookCloseAction, String... initialValue) { + this.instance = instance; this.bookCloseAction = bookCloseAction; this.user = user; this.parentGUI = parentGUI; @@ -105,10 +105,10 @@ public void startEdit(String szBookName) { } } - if (!bPlayerHasItem) Utils.giveItem(user.player, this.book, szBookName); + if (!bPlayerHasItem) Utils.giveItem(instance, user.player, this.book, szBookName); // Registers the book close listener - Bukkit.getServer().getPluginManager().registerEvents(this, plugin); + Bukkit.getServer().getPluginManager().registerEvents(this, instance); } /** @@ -116,7 +116,7 @@ public void startEdit(String szBookName) { */ public void unregister() { HandlerList.unregisterAll(this); - plugin.getLogger().log(Level.INFO, "Unregistering book listener"); + instance.getLogger().log(Level.INFO, "Unregistering book listener"); } /** @@ -163,7 +163,7 @@ public void BookCloseEvent(PlayerEditBookEvent event) { @EventHandler public void bookDestroyed(ItemDespawnEvent event) { if (event.getEntity().getItemStack().equals(this.book)) { - plugin.getLogger().log(Level.INFO, "Book destroyed"); + instance.getLogger().log(Level.INFO, "Book destroyed"); unregister(); } } @@ -171,19 +171,19 @@ public void bookDestroyed(ItemDespawnEvent event) { @EventHandler public void bookTouched(InventoryClickEvent event) { if (event.getCurrentItem() != null) if (event.getCurrentItem().equals(this.book)) { - plugin.getLogger().log(Level.INFO, "Book touched, cancelling"); + instance.getLogger().log(Level.INFO, "Book touched, cancelling"); event.setCancelled(true); // Closing the inv will cancel the copying/dragging process. We then want to reopen. user.player.closeInventory(); - Bukkit.getScheduler().runTaskLater(plugin, () -> parentGUI.open(user.player), 1); + Bukkit.getScheduler().runTaskLater(instance, () -> parentGUI.open(user.player), 1); } } @EventHandler public void bookDragged(InventoryDragEvent event) { if (event.getOldCursor().equals(this.book)) { - plugin.getLogger().log(Level.INFO, "Book dragged, cancelling"); + instance.getLogger().log(Level.INFO, "Book dragged, cancelling"); event.setCancelled(true); } } @@ -191,7 +191,7 @@ public void bookDragged(InventoryDragEvent event) { @EventHandler public void bookMoved(InventoryMoveItemEvent event) { if (event.getItem().equals(this.book)) { - plugin.getLogger().log(Level.INFO, "Book moved, cancelling"); + instance.getLogger().log(Level.INFO, "Book moved, cancelling"); event.setCancelled(true); } } @@ -199,7 +199,7 @@ public void bookMoved(InventoryMoveItemEvent event) { @EventHandler public void bookDropped(PlayerDropItemEvent event) { if (event.getItemDrop().getItemStack().equals(this.book)) { - plugin.getLogger().log(Level.INFO, "Book dropped, cancelling"); + instance.getLogger().log(Level.INFO, "Book dropped, cancelling"); event.setCancelled(true); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java index b6df35ab..a0f71ee5 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardManager.java @@ -7,7 +7,7 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.RegionContainer; import lombok.extern.java.Log; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.exceptions.RegionManagerNotFoundException; import org.bukkit.World; import org.bukkit.entity.Player; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java index ef12ddf7..0c2ee450 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardMembers.java @@ -4,8 +4,8 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.managers.storage.StorageException; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionNotFoundException; +import net.bteuk.network.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.exceptions.RegionNotFoundException; import org.bukkit.World; import org.bukkit.entity.Player; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java index b1592152..de647e1b 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardPlotsystem.java @@ -3,8 +3,12 @@ import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.core.Constants; +import net.bteuk.network.core.math.Point; +import net.bteuk.network.exceptions.RegionManagerNotFoundException; import net.bteuk.network.exceptions.RegionNotFoundException; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.utils.Utils; import org.bukkit.Location; import org.bukkit.World; @@ -16,6 +20,14 @@ */ public class WorldguardPlotsystem { + private final PlotAPI plotAPI; + private final Constants constants; + + public WorldguardPlotsystem(PlotAPI plotAPI, Constants constants) { + this.plotAPI = plotAPI; + this.constants = constants; + } + /** * Get the points of a specific plot or zone as if it was located in the save world. * This is done by getting the points in the world where the plot or zone is and then applying the negative @@ -24,7 +36,7 @@ public class WorldguardPlotsystem { * @param regionName the name of the plot or zone * @param world the name of the world where the plot or zone exists, NOT the world of the save world */ - public static List getPointsTransformedToSaveWorld(String regionName, + public List getPointsTransformedToSaveWorld(String regionName, World world) throws RegionNotFoundException, RegionManagerNotFoundException { @@ -32,10 +44,8 @@ public static List getPointsTransformedToSaveWorld(String regionNa List newVector = new ArrayList<>(); // Get the negative coordinate transform. - PlotSQL plotSQL = Network.getInstance().getPlotSQL(); - - int xTransform = -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + world.getName() + "';"); - int zTransform = -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + world.getName() + "';"); + int xTransform = -plotAPI.getXTransform(world.getName()); + int zTransform = -plotAPI.getZTransform(world.getName()); // Apply to transform to each coordinate. vector.forEach(bv -> newVector.add(BlockVector2.at(bv.x() + xTransform, bv.z() + zTransform))); @@ -52,7 +62,7 @@ public static List getPointsTransformedToSaveWorld(String regionNa * @throws RegionNotFoundException if the region can not be found * @throws RegionManagerNotFoundException if no region manager exists for this world */ - public static Location getCurrentLocation(String regionName, World world) throws RegionNotFoundException, + public Location getCurrentLocation(String regionName, World world) throws RegionNotFoundException, RegionManagerNotFoundException { // Get the region manager. @@ -65,72 +75,8 @@ public static Location getCurrentLocation(String regionName, World world) throws throw new RegionNotFoundException("Region " + regionName + " does not exist!"); } - BlockVector2 bv = Point.getAveragePoint(region.getPoints()); + double[] averagePoint = Point.getAveragePoint(region.getPoints().stream().map(blockVector2 -> new double[]{blockVector2.x(), blockVector2.z()}).toList()); - return (new Location(world, bv.x(), Utils.getHighestYAt(world, bv.x(), bv.z()), bv.z())); + return (new Location(world, averagePoint[0], Utils.getHighestYAt(constants, world, (int) averagePoint[0], (int) averagePoint[1]), averagePoint[1])); } - -// /** -// * Get the location of the centre of a region in the save world. -// * @param regionName the region to get the location of -// * @param world the world in which the region is -// * @return the {@link Location} of the centre of the region -// * @throws RegionNotFoundException if the region can not be found -// * @throws RegionManagerNotFoundException if no region manager exists for this world -// */ -// public static Location getBeforeLocation(String regionName, World world) throws WorldNotFoundException, -// RegionNotFoundException, RegionManagerNotFoundException { -// -// //Get instance of plugin and config -// PlotSystem instance = PlotSystem.getInstance(); -// FileConfiguration config = instance.getConfig(); -// -// //Get worlds from config -// String save_world = config.getString("save_world"); -// if (save_world == null) { -// -// throw new WorldNotFoundException("Save World is not defined in config, plot delete event has therefore -// failed!"); -// -// } -// -// World saveWorld = Bukkit.getServer().getWorld(save_world); -// -// //Get worldguard instance -// WorldGuard wg = WorldGuard.getInstance(); -// -// //Get worldguard region data -// RegionContainer container = wg.getPlatform().getRegionContainer(); -// RegionManager buildRegions = container.get(BukkitAdapter.adapt(buildWorld)); -// -// if (buildRegions == null) { -// -// throw new RegionManagerNotFoundException("RegionManager for world " + buildWorld.getName() + " is null!"); -// -// } -// -// ProtectedPolygonalRegion region = (ProtectedPolygonalRegion) buildRegions.getRegion(regionName); -// -// if (region == null) { -// -// throw new RegionNotFoundException("Region " + regionName + " does not exist!"); -// -// } -// -// BlockVector2 bv = Point.getAveragePoint(region.getPoints()); -// -// //To get the actual location we need to take the negative coordinate transform of the plot. -// PlotSQL plotSQL = PlotSystem.getInstance().plotSQL; -// -// int xTransform = -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + buildWorld.getName() -// + "';"); -// int zTransform = -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + buildWorld.getName() -// + "';"); -// -// BlockVector2 bv2 = BlockVector2.at(bv.getX() + xTransform, bv.getZ() + zTransform); -// -// return (new Location(saveWorld, bv2.getX(), Utils.getHighestYAt(saveWorld, bv2.getX(), bv2.getZ()), bv2 -// .getZ())); -// -// } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java index d37954bf..f301bbf8 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardRegions.java @@ -6,7 +6,7 @@ import com.sk89q.worldguard.protection.managers.storage.StorageException; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; +import net.bteuk.network.exceptions.RegionManagerNotFoundException; import org.bukkit.World; public class WorldguardRegions { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java index 9d25fc24..6a41f4c1 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/worldguard/WorldguardUtils.java @@ -6,8 +6,8 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import net.bteuk.network.exceptions.RegionManagerNotFoundException; import net.bteuk.network.exceptions.RegionNotFoundException; -import net.bteuk.network.minecraft.worldguard.exceptions.RegionManagerNotFoundException; import org.bukkit.World; import org.bukkit.block.Block; diff --git a/Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java b/Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java deleted file mode 100644 index d723d9e7..00000000 --- a/Plugin/src/test/java/net/bteuk/network/utils/progression/LevelTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.bteuk.network.utils.progression; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static net.bteuk.network.utils.progression.Level.getLeftoverExp; -import static net.bteuk.network.utils.progression.Level.getThreshold; -import static net.bteuk.network.utils.progression.Level.reachedNextLevel; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class LevelTest { - - @BeforeEach - void init() { - - } - - @Test - void testGetThreshold() { - - assertEquals(16, getThreshold(2)); - assertEquals(38, getThreshold(3)); - assertEquals(65, getThreshold(5)); - assertEquals(105, getThreshold(10)); - assertEquals(166, getThreshold(25)); - } - - @Test - void testReachedNextLevel() { - - assertTrue(reachedNextLevel(1, 20)); - assertTrue(reachedNextLevel(4, 65)); - - assertFalse(reachedNextLevel(4, 64)); - assertFalse(reachedNextLevel(10, 100)); - } - - @Test - void testGetLeftoverExp() { - - assertEquals(4, getLeftoverExp(2, 20)); - assertEquals(0, getLeftoverExp(5, 65)); - } -} \ No newline at end of file diff --git a/Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java b/Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java deleted file mode 100644 index 6413c4cc..00000000 --- a/Plugin/src/test/java/net/bteuk/network/utils/staff/ModerationTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.bteuk.network.utils.staff; - -import net.bteuk.network.exceptions.DurationFormatException; -import org.junit.jupiter.api.Test; - -import static net.bteuk.network.utils.staff.Moderation.getDuration; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class ModerationTest { - - @Test - void checkDurationStringFormatting() throws DurationFormatException { - - // Check each value separately. - assertEquals(1000L * 60 * 60 * 24 * 365 * 2, getDuration("2y")); - assertEquals(1000L * 60 * 60 * 24 * 30 * 3, getDuration("3m")); - assertEquals(1000L * 60 * 60 * 24 * 7, getDuration("7d")); - assertEquals(1000L * 60 * 60 * 14, getDuration("14h")); - - // Test a few combinations to make sure multiple values can be parsed in the same string. - assertEquals(1000L * 60 * 60 * (3 + 5 * 24), getDuration("5d3h")); - assertEquals(1000L * 60 * 60 * 24 * (30 * 3 + 365 * 5), getDuration("5y3m")); - assertEquals(1000L * 60 * 60 * (3 + 5 * 24 * 365), getDuration("5y3h")); - assertEquals(1000L * 60 * 60 * (15 + 24 * (5 + 30 * 3 + 365 * 7)), getDuration("7y3m5d15h")); - - // Test some wrong inputs. - assertThrows(DurationFormatException.class, - () -> getDuration("test")); - assertThrows(DurationFormatException.class, - () -> getDuration("1y5m2t")); - assertThrows(DurationFormatException.class, - () -> getDuration("q")); - assertThrows(DurationFormatException.class, - () -> getDuration("xy")); - assertThrows(DurationFormatException.class, - () -> getDuration("dum")); - assertThrows(DurationFormatException.class, - () -> getDuration("bad")); - assertThrows(DurationFormatException.class, - () -> getDuration("oh")); - - // Check for null. - assertThrows(NullPointerException.class, - () -> getDuration(null)); - } -} \ No newline at end of file diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index 8c3fd673..647bc904 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -51,8 +51,8 @@ public class RegionManager { private final Constants constants; private final Set users = new HashSet<>(); - public RegionManager(RegionSQL regionSQL, NetworkAPI networkAPI, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, - Constants constants, JavaPlugin plugin, ServerAPI serverAPI) { + public RegionManager(RegionSQL regionSQL, NetworkAPI networkAPI, CoordinateAPI coordinateAPI, EventAPI eventAPI, WorldGuardAPI worldGuard, Constants constants, + JavaPlugin plugin, ServerAPI serverAPI) { regions = new HashMap<>(); this.regionSQL = regionSQL; @@ -64,7 +64,7 @@ public RegionManager(RegionSQL regionSQL, NetworkAPI networkAPI, CoordinateAPI c this.worldGuard = worldGuard; this.constants = constants; - new ServerJoinListener(plugin, player -> users.add(new RegionUser(player))); + new ServerJoinListener(plugin, player -> users.add(new RegionUser(player, constants, this, plotAPI))); new ServerQuitListener(plugin, player -> getUserByPlayer(player).ifPresent(users::remove)); new RegionMoveListener(plugin, this, plotAPI, constants, globalSQL, eventAPI, serverAPI); new RegionTeleportListener(plugin, this, constants, plotAPI); @@ -131,8 +131,7 @@ private Region findRegion(int x, int z) { // Get the tag of the region for a specific player, or name if no tag is set. public String getTag(Region region, String uuid) { if (hasTag(region, uuid)) { - return regionSQL.getString( - "SELECT tag FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + return regionSQL.getString("SELECT tag FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } else { return region.regionName(); } @@ -140,34 +139,27 @@ public String getTag(Region region, String uuid) { // Set the tag of the region for a specific player. public void setTag(Region region, String uuid, String tag) { - regionSQL.update("UPDATE region_members SET tag='" + tag.replace("'", "\\'") + "' WHERE" + - " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET tag='" + tag.replace("'", "\\'") + "' WHERE" + " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Return whether the region has a tag for the specified uuid. private boolean hasTag(Region region, String uuid) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND tag " + - "IS NOT NULL;")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND tag " + "IS NOT NULL;")); } // Return whether the player has this region pinned. public boolean isPinned(Region region, String uuid) { - return regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + - "pinned=1;"); + return regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + "pinned=1;"); } // Set the region to (un)pinned for a specific player. public void setPinned(Region region, String uuid, boolean pin) { - regionSQL.update("UPDATE region_members SET pinned=" + (pin ? "1" : "0") + " WHERE " + - "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET pinned=" + (pin ? "1" : "0") + " WHERE " + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Get the server of the region. public String getServer(Region region) { - if (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + - "status='plot'")) { + if (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + "status='plot'")) { return (plotAPI.getRegionServer("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); } else { return (globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); @@ -176,23 +168,17 @@ public String getServer(Region region) { // Return whether the uuid is the uuid of the region owner. public boolean isOwner(Region region, String uuid) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + - "is_owner=1;")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + "is_owner=1;")); } // Return whether the uuid is the uuid of a region member. public boolean isMember(Region region, String uuid) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + - "is_owner=0;")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "' AND " + "is_owner=0;")); } // Return the region status. public RegionStatus status(Region region) { - String status = - regionSQL.getString("SELECT status FROM regions WHERE region='" + region.regionName() + - "';"); + String status = regionSQL.getString("SELECT status FROM regions WHERE region='" + region.regionName() + "';"); if (status == null) { return RegionStatus.DEFAULT; } else { @@ -202,26 +188,22 @@ public RegionStatus status(Region region) { // Return whether the region is claimable. public boolean isClaimable(Region region) { - return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + - "AND (status='default' OR status='public' OR status='inactive');")); + return (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + "AND (status='default' OR status='public' OR status='inactive');")); } // Return whether the region has been claimed in the past. public boolean wasClaimed(Region region) { - return (regionSQL.hasRow( - "SELECT region FROM region_logs WHERE region='" + region.regionName() + "' AND is_owner=1;")); + return (regionSQL.hasRow("SELECT region FROM region_logs WHERE region='" + region.regionName() + "' AND is_owner=1;")); } // Set the region as inactive. public void setInactive(Region region) { - regionSQL.update("UPDATE regions SET status='inactive' WHERE region='" + region.regionName() + - "';"); + regionSQL.update("UPDATE regions SET status='inactive' WHERE region='" + region.regionName() + "';"); } // Check if the region is in the plot system. public boolean isPlot(Region region) { - return regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + - "AND status='plot';"); + return regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' " + "AND status='plot';"); } // Set the region to be for plots. @@ -233,18 +215,14 @@ public void setPlot(Region region, ChatAPI chat) { // Send message to user. // Is sent before actual removal so we can read the region tag. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", - getTag(region, uuid)), - true); + ChatUtils.error("You have been kicked from region %s, it has been moved to the plot system.", getTag(region, uuid)), true); chat.sendDirectMessage(directMessage); // Leave region in database. - regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "';"); + regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "';"); // Close log of player in region. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Leave region in worldGuard. worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); @@ -257,8 +235,7 @@ public void setPlot(Region region, ChatAPI chat) { // Return whether the region has an owner. public boolean hasOwner(Region region) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); } // Return whether the region has an owner. @@ -269,27 +246,23 @@ public boolean hasActiveOwner(Region region) { // Return whether the region has a member. public boolean hasMember(Region region) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); } // Return whether the region has an active member. public boolean hasActiveMember(Region region, long time) { - return (regionSQL.hasRow( - "SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 AND last_enter>=" + time + ";")); + return (regionSQL.hasRow("SELECT region FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 AND last_enter>=" + time + ";")); } // Return the number of members, if any. public int memberCount(Region region) { - return (regionSQL.getInt( - "SELECT COUNT(uuid) FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); + return (regionSQL.getInt("SELECT COUNT(uuid) FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0;")); } // Return the uuid of the region owner, if exists. public String getOwner(Region region) { if (hasOwner(region)) { - return (regionSQL.getString( - "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); + return (regionSQL.getString("SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=1;")); } else { return "null"; } @@ -306,34 +279,28 @@ public String ownerName(Region region) { // Return string array of member uuids. public ArrayList getMembers(Region region) { - return regionSQL.getStringList( - "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "';"); + return regionSQL.getStringList("SELECT uuid FROM region_members WHERE region='" + region.regionName() + "';"); } // Get the coordinate id for the location the player has set. public int getCoordinateID(Region region, String uuid) { - return regionSQL.getInt( - "SELECT coordinate_id FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + return regionSQL.getInt("SELECT coordinate_id FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Set the coordinate id for the location of the specified player. public void setCoordinateID(Region region, String uuid, int id) { - regionSQL.update( - "UPDATE region_members SET coordinate_id=" + id + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET coordinate_id=" + id + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Set the last enter time for the region. public void setLastEnter(Region region, String uuid) { - regionSQL.update("UPDATE region_members SET last_enter=" + Time.currentTime() + " WHERE" + - " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET last_enter=" + Time.currentTime() + " WHERE" + " region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Get the most recent member to enter the region. public String getRecentMember(Region region) { if (hasMember(region)) { - return regionSQL.getString( - "SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 ORDER BY " + - "last_enter DESC;"); + return regionSQL.getString("SELECT uuid FROM region_members WHERE region='" + region.regionName() + "' AND is_owner=0 ORDER BY " + "last_enter DESC;"); } else { return null; } @@ -341,15 +308,13 @@ public String getRecentMember(Region region) { // Set the region to default. public void setDefault(Region region) { - regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + - "';"); + regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + "';"); } // Set the region to default. public void setDefault(Region region, String removeRole) { worldGuard.removeGroup(region.regionName(), removeRole, constants.earthWorld()); - regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + - "';"); + regionSQL.update("UPDATE regions SET status='default' WHERE region='" + region.regionName() + "';"); } // Set the region to public. @@ -387,8 +352,7 @@ public boolean inDatabase(Region region) { public void addToDatabase(Region region) { // Check if it's not already in the database. if (!inDatabase(region)) { - regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + - "'default');"); + regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + "'default');"); createWorldGuardRegion(region); } @@ -398,8 +362,7 @@ public void addToDatabase(Region region) { public void addToPlotsystem(Region region) { // Check if it's not already in the database. if (!inDatabase(region)) { - regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + - "'plot');"); + regionSQL.update("INSERT INTO regions(region,status) VALUES('" + region.regionName() + "'," + "'plot');"); createWorldGuardRegion(region); } @@ -407,51 +370,42 @@ public void addToPlotsystem(Region region) { private void createWorldGuardRegion(Region region) { // Create region in worldguard. - worldGuard.createRegion(region.regionName(), Integer.parseInt(region.regionName().split(",")[0]) * 512, - Integer.parseInt(region.regionName().split(",")[1]) * 512, - Integer.parseInt(region.regionName().split(",")[0]) * 512 + 511, - Integer.parseInt(region.regionName().split(",")[1]) * 512 + 511, - constants.earthWorld()); + worldGuard.createRegion(region.regionName(), Integer.parseInt(region.regionName().split(",")[0]) * 512, Integer.parseInt(region.regionName().split(",")[1]) * 512, + Integer.parseInt(region.regionName().split(",")[0]) * 512 + 511, Integer.parseInt(region.regionName().split(",")[1]) * 512 + 511, constants.earthWorld()); } // Check if this region has any requests. public boolean hasRequests(Region region) { - return regionSQL.hasRow( - "SELECT region FROM region_requests WHERE region='" + region.regionName() + "';"); + return regionSQL.hasRow("SELECT region FROM region_requests WHERE region='" + region.regionName() + "';"); } // Check if the player has already requested to join this region. public boolean hasRequest(Region region, String uuid) { - return regionSQL.hasRow( - "SELECT region FROM region_requests WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + return regionSQL.hasRow("SELECT region FROM region_requests WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Check if the specified player has been invited to this region. public boolean hasInvite(Region region, String uuid) { - return regionSQL.hasRow( - "SELECT region FROM region_invites WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + return regionSQL.hasRow("SELECT region FROM region_invites WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Remove a region invite. public void removeInvite(Region region, String uuid) { - regionSQL.update("DELETE FROM region_invites WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "';"); + regionSQL.update("DELETE FROM region_invites WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "';"); } // Accept any requests for this region. public void acceptRequests(Region region) { // Get all requests for this region by uuid. - ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_requests " + - "WHERE region='" + region.regionName() + "';"); + ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_requests " + "WHERE region='" + region.regionName() + "';"); int coordinate_id; // Add all users to the region. for (String uuid : uuids) { // Get coordinate id from request. - coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + - "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Join region. joinRegion(region, uuid, coordinate_id); @@ -465,28 +419,24 @@ public void acceptRequests(Region region) { public void acceptRequest(Region region, String uuid) { // Get the coordinate id for the request. - int coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + - "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + int coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Add them to the region. joinRegion(region, uuid, coordinate_id); // Delete request. - regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "'; "); + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "'; "); } // Deny a request for a specific user. public void denyRequest(Region region, String uuid) { // Delete the request. - regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "';"); + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "';"); // Send message to user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("Your request to join region %s has been denied.", region.regionName()), - true); + ChatUtils.success("Your request to join region %s has been denied.", region.regionName()), true); chat.sendDirectMessage(directMessage); } @@ -494,8 +444,7 @@ public void denyRequest(Region region, String uuid) { public void cancelRequest(Region region, Player player) { // Delete request. - regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + - "uuid='" + player.getUniqueId() + "'; "); + regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + "uuid='" + player.getUniqueId() + "'; "); // Send message to player. player.sendMessage(ChatUtils.success("Cancelled region join request.")); @@ -519,36 +468,32 @@ public void requestRegion(Region region, Player player, boolean staffRequest) { // Staff request // Create request. - regionSQL.update("INSERT INTO region_requests(region,uuid,owner,staff_accept," + - "coordinate_id) VALUES ('" + region.regionName() + "','" + - player.getUniqueId() + "','" + getOwner(region) + "',0," + coordinate + ");"); + regionSQL.update( + "INSERT INTO region_requests(region,uuid,owner,staff_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( + region) + "',0," + coordinate + ");"); // Send message to player. - player.sendMessage(ChatUtils.success("Requested to join region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(", awaiting staff review."))); ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", - ChatUtils.success("A region join request has been submitted by %s for region %s", - player.getName(), region.regionName())); + ChatUtils.success("A region join request has been submitted by %s for region %s", player.getName(), region.regionName())); chat.sendChatMessage(chatMessage); } else { // Owner request // Create request. - regionSQL.update("INSERT INTO region_requests(region,uuid,owner,owner_accept," + - "coordinate_id) VALUES ('" + region.regionName() + "','" + - player.getUniqueId() + "','" + getOwner(region) + "',0," + coordinate + ");"); + regionSQL.update( + "INSERT INTO region_requests(region,uuid,owner,owner_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( + region) + "',0," + coordinate + ");"); // Send message to player. - player.sendMessage(ChatUtils.success("Requested to join region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(", awaiting owner review."))); // Send the owner a message. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", - ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), - false); + ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), false); chat.sendDirectMessage(directMessage); } } @@ -563,20 +508,16 @@ public void joinRegion(Region region, Player player) { int coordinateID = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); // Join region as member. - regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + - "VALUES('" + region.regionName() + "','" + - player.getUniqueId() + "'," + Time.currentTime() + "," + coordinateID + ");"); + regionSQL.update( + "INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + "VALUES('" + region.regionName() + "','" + player.getUniqueId() + "'," + Time.currentTime() + "," + coordinateID + ");"); // Start log of player in region. - regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + - player.getUniqueId() + "'," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + player.getUniqueId() + "'," + Time.currentTime() + ");"); // Join region in worldGuard. worldGuard.addMember(region.regionName(), player.getUniqueId().toString(), player.getWorld().getName()); - player.sendMessage(ChatUtils.success("You have joined the region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + player.sendMessage(ChatUtils.success("You have joined the region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" as a member."))); } else { @@ -586,22 +527,16 @@ public void joinRegion(Region region, Player player) { String owner = getOwner(region); // Demote owner in database. - regionSQL.update( - "UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); // Close log for owner. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + - "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); // Open log for previous owner as member. - regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + - owner + "'," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + owner + "'," + Time.currentTime() + ");"); DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", - ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", - getTag(region, owner)), - true); + ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(region, owner)), true); chat.sendDirectMessage(directMessage); // Set region to default, since it would've been set to inactive previously. @@ -612,20 +547,17 @@ public void joinRegion(Region region, Player player) { int coordinateID = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); // Join region as owner. - regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + - "coordinate_id) VALUES('" + region.regionName() + "','" + - player.getUniqueId() + "',1," + Time.currentTime() + "," + coordinateID + ");"); + regionSQL.update( + "INSERT INTO region_members(region,uuid,is_owner,last_enter," + "coordinate_id) VALUES('" + region.regionName() + "','" + player.getUniqueId() + "',1," + Time.currentTime() + "," + coordinateID + ");"); // Start log of player in region. - regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + region.regionName() + "','" + - player.getUniqueId() + "',1," + Time.currentTime() + ");"); + regionSQL.update( + "INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + "('" + region.regionName() + "','" + player.getUniqueId() + "',1," + Time.currentTime() + ");"); // Join region in worldGuard. worldGuard.addMember(region.regionName(), player.getUniqueId().toString(), player.getWorld().getName()); - player.sendMessage(ChatUtils.success("You have joined the region ") - .append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + player.sendMessage(ChatUtils.success("You have joined the region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) .append(ChatUtils.success(" as the owner."))); } } @@ -637,22 +569,18 @@ public void joinRegion(Region region, String uuid, int coordinateID) { if (hasOwner(region)) { // Join region as member. - regionSQL.update("INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + - "VALUES('" + region.regionName() + "','" + - uuid + "'," + Time.currentTime() + "," + coordinateID + ");"); + regionSQL.update( + "INSERT INTO region_members(region,uuid,last_enter,coordinate_id) " + "VALUES('" + region.regionName() + "','" + uuid + "'," + Time.currentTime() + "," + coordinateID + ");"); // Start log of player in region. - regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + - uuid + "'," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + uuid + "'," + Time.currentTime() + ");"); // Join region in worldGuard. worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); // Send message to user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("You have joined the region %s as a member.", region.regionName()), - true); + ChatUtils.success("You have joined the region %s as a member.", region.regionName()), true); chat.sendDirectMessage(directMessage); } else { @@ -662,41 +590,31 @@ public void joinRegion(Region region, String uuid, int coordinateID) { String owner = getOwner(region); // Demote owner in database. - regionSQL.update( - "UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); // Close log for owner. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + - "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " " + "WHERE region='" + region.regionName() + "' AND uuid='" + owner + "';"); // Open log for previous owner as member. - regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + - owner + "'," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + owner + "'," + Time.currentTime() + ");"); DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), owner, "server", - ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", - getTag(region, owner)), - true); + ChatUtils.success("You have been demoted to a member in region %s due to inactivity.", getTag(region, owner)), true); chat.sendDirectMessage(directMessage); } // Join region as owner. - regionSQL.update("INSERT INTO region_members(region,uuid,is_owner,last_enter," + - "coordinate_id) VALUES('" + region.regionName() + "','" + - uuid + "',1," + Time.currentTime() + "," + coordinateID + ");"); + regionSQL.update( + "INSERT INTO region_members(region,uuid,is_owner,last_enter," + "coordinate_id) VALUES('" + region.regionName() + "','" + uuid + "',1," + Time.currentTime() + "," + coordinateID + ");"); // Start log of player in region. - regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + region.regionName() + "','" + - uuid + "',1," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + "('" + region.regionName() + "','" + uuid + "',1," + Time.currentTime() + ");"); // Join region in worldGuard. worldGuard.addMember(region.regionName(), uuid, constants.earthWorld()); DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - ChatUtils.success("You have joined the region %s as the owner.", region.regionName()), - true); + ChatUtils.success("You have joined the region %s as the owner.", region.regionName()), true); chat.sendDirectMessage(directMessage); } } @@ -710,25 +628,20 @@ public void leaveRegion(Region region, String uuid, Component message) { // Send message to user. // Is sent before actual removal so we can read the region tag. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", - message, true); + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", message, true); chat.sendDirectMessage(directMessage); // Leave region in database. - regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + - "uuid='" + uuid + "';"); + regionSQL.update("DELETE FROM region_members WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "';"); // Close log of player in region. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Leave region in worldGuard. worldGuard.removeMember(region.regionName(), uuid, constants.earthWorld()); } else { - eventAPI.createEvent(uuid, "network", globalSQL.getString("SELECT name " + - "FROM server_data WHERE type='EARTH';"), - "region leave " + region.regionName(), message); + eventAPI.createEvent(uuid, "network", globalSQL.getString("SELECT name " + "FROM server_data WHERE type='EARTH';"), "region leave " + region.regionName(), message); } } @@ -739,17 +652,13 @@ public void makeMember(Region region) { String uuid = getOwner(region); // Close log of player as owner. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Open log of player as member. - regionSQL.update( - "INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + - uuid + "'," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,start_time) VALUES('" + region.regionName() + "','" + uuid + "'," + Time.currentTime() + ");"); // Update region member to set as member. - regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + - "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET is_owner=0 WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); } // Make a member the owner of the region. @@ -759,17 +668,13 @@ public void makeOwner(Region region, String uuid) { if (isMember(region, uuid)) { // Close log of player as member. - regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() - + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_logs SET end_time=" + Time.currentTime() + " WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // Open log of player as owner. - regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + - "('" + region.regionName() + "','" + - uuid + "',1," + Time.currentTime() + ");"); + regionSQL.update("INSERT INTO region_logs(region,uuid,is_owner,start_time) VALUES" + "('" + region.regionName() + "','" + uuid + "',1," + Time.currentTime() + ");"); // Update region member to set as owner. - regionSQL.update( - "UPDATE region_members SET is_owner=1 WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); + regionSQL.update("UPDATE region_members SET is_owner=1 WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';"); // If the region is currently set as inactive and the new owner isn't, set it to default. if (status(region) == RegionStatus.INACTIVE && hasActiveOwner(region)) { @@ -785,8 +690,7 @@ public void updateRequests(Region region) { // If there is an owner, update the owner row in the request. if (hasOwner(region)) { - regionSQL.update("UPDATE region_requests SET owner='" + getOwner(region) + "' WHERE " + - "region='" + region.regionName() + "';"); + regionSQL.update("UPDATE region_requests SET owner='" + getOwner(region) + "' WHERE " + "region='" + region.regionName() + "';"); } else { acceptRequests(region); @@ -800,20 +704,17 @@ public void removeMembers(Region region, String message, boolean success) { if (hasOwner(region) || hasMember(region)) { // Get all members. - ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_members " + - "WHERE region='" + region.regionName() + "';"); + ArrayList uuids = regionSQL.getStringList("SELECT uuid FROM region_members " + "WHERE region='" + region.regionName() + "';"); for (String uuid : uuids) { - leaveRegion(region, uuid, success ? ChatUtils.success(message, getTag(region, uuid)) : ChatUtils.error(message, - getTag(region, uuid))); + leaveRegion(region, uuid, success ? ChatUtils.success(message, getTag(region, uuid)) : ChatUtils.error(message, getTag(region, uuid))); } } } // Get time that a region member was last in this region. public long lastActive(Region region, String uuid) { - return (regionSQL.getLong( - "SELECT last_enter FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';")); + return (regionSQL.getLong("SELECT last_enter FROM region_members WHERE region='" + region.regionName() + "' AND uuid='" + uuid + "';")); } // Check if the player can build in this region. @@ -827,10 +728,8 @@ private void registerInactivityTimer(TimerAPI timerAPI) { // Check for inactive owners. // If the region has members, then make the most recently active member the new owner, // If the region has no members, then set it inactive. - List inactive_owners = regionSQL.getInactives("SELECT rm.region,rm.uuid FROM region_members AS rm" + - " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - constants.regionInactivity()) + " AND r" + - ".status <> " + - "'inactive';"); + List inactive_owners = regionSQL.getInactives( + "SELECT rm.region,rm.uuid FROM region_members AS rm" + " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - constants.regionInactivity()) + " AND r" + ".status <> " + "'inactive';"); long currentTime = Time.currentTime(); for (Inactivity inactive : inactive_owners) { diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java index e165bd12..c5d756a6 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -2,8 +2,13 @@ import lombok.Getter; import lombok.Setter; +import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.core.Constants; import org.bukkit.entity.Player; +import static net.bteuk.network.core.ServerType.EARTH; +import static net.bteuk.network.core.ServerType.PLOT; + public class RegionUser { @Getter @@ -24,30 +29,24 @@ public class RegionUser { @Setter int deltaZ; - public RegionUser(Player player) { + public RegionUser(Player player, Constants constants, RegionManager regionManager, PlotAPI plotAPI) { this.player = player; - // TODO: Copied from NetworkUser, implement this. // Check if the player is in a region. - if (constants.regionsEnabled()) { - if (SERVER_TYPE == EARTH) { - // Check if they are in the earth world. - if (player.getWorld().getName().equals(EARTH_WORLD)) { - region = instance.getRegionManager().getRegion(player.getLocation()); - // Add region to database if not exists. - region.addToDatabase(); - inRegion = true; - } - } else if (SERVER_TYPE == PLOT) { - // Check if the player is in a buildable plot world and apply coordinate transform if true. - if (instance.getPlotSQL() - .hasRow("SELECT name FROM location_data WHERE name='" + player.getLocation().getWorld() - .getName() + "';")) { - updateCoordinateTransform(instance.getPlotSQL(), player.getLocation()); + if (constants.serverType() == EARTH) { + // Check if they are in the earth world. + if (player.getWorld().getName().equals(constants.earthWorld())) { + trackedRegion = regionManager.getRegion(player.getLocation().getX(), player.getLocation().getZ()); + // Add the region to the database if not exists. + regionManager.addToDatabase(trackedRegion); + } + } else if (constants.serverType() == PLOT) { + // Check if the player is in a buildable plot world and apply coordinate transform if true. + if (plotAPI.hasLocation(player.getLocation().getWorld().getName())) { + this.deltaX = -plotAPI.getXTransform(player.getLocation().getWorld().getName()); + this.deltaZ = -plotAPI.getZTransform(player.getLocation().getWorld().getName()); - region = instance.getRegionManager().getRegion(player.getLocation(), dx, dz); - inRegion = true; - } + trackedRegion = regionManager.getRegion(player.getLocation().getX(), player.getLocation().getZ(), deltaX, deltaZ); } } } diff --git a/pom.xml b/pom.xml index d678e6c4..0b498e27 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,10 @@ 1.21.8-R0.1-SNAPSHOT + c75ba196a4 5958727df9 + + 1.18.34 @@ -91,12 +94,44 @@ ${bteuk.lib.version} + + com.github.BTEUK.Proxy + database + ${bteuk.proxy.version} + + io.papermc.paper paper-api ${paper.api.version} provided + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + From 3643672c253aa94a8bfac8afa86b472331e6b728 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 30 Aug 2025 18:09:41 +0200 Subject: [PATCH 17/96] Update version, regions only use plotAPI if plot system is enabled. --- Core/pom.xml | 2 +- .../java/net/bteuk/network/core/Constants.java | 15 +++++++-------- Network-API/pom.xml | 4 ++-- PaperCore/pom.xml | 2 +- Plugin/pom.xml | 8 ++++---- .../src/main/java/net/bteuk/network/Network.java | 6 +++--- .../net/bteuk/network/utils/NetworkConfig.java | 2 +- Regions/pom.xml | 2 +- .../net/bteuk/network/regions/RegionManager.java | 8 ++++++-- .../net/bteuk/network/regions/RegionUser.java | 2 +- .../regions/listener/RegionMoveListener.java | 2 +- pom.xml | 6 +----- 12 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Core/pom.xml b/Core/pom.xml index faf74e5c..0ddb8c62 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.7.3 + 1.8.0 net.bteuk.network diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index 63469b19..71e62c51 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -5,12 +5,11 @@ import java.util.List; public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, - boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, - boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, - boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, List sidebarContent, boolean motdEnabled, String motdContent, - boolean plotSystemEnabled, - boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, - String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, - int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial, int afkTime, boolean mapEnabled, - String mapServer, NetworkLocation mapLocation, NetworkLocation spawnLocation) { + boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, + boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, + List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, + boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, + int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, int regionStaffRequestRadius, int progressMapID, + String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial, int afkTime, boolean mapEnabled, String mapServer, NetworkLocation mapLocation, + NetworkLocation spawnLocation) { } \ No newline at end of file diff --git a/Network-API/pom.xml b/Network-API/pom.xml index f0a4dd2c..8e51412b 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -6,14 +6,14 @@ net.bteuk Network - 1.7.3 + 1.8.0 net.bteuk.network api Network API API for the Network plugin - 1.7.3 + 1.8.0 diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index e397060a..82b01da0 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.7.3 + 1.8.0 net.bteuk.network diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 89f7a91a..0078d189 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.7.3 + 1.8.0 net.bteuk.network @@ -36,6 +36,7 @@ shade + ${project.parent.artifactId}-${project.version} true @@ -110,7 +111,6 @@ - net.bteuk.network api @@ -149,9 +149,9 @@ provided - com.comphenix.protocol + net.dmulloy2 ProtocolLib - 5.3.0 + 5.4.0 provided diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 1ff82580..17b4a961 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -297,6 +297,9 @@ public void enablePlugin() { networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); + // Set up the timer api + timerAPI = new TimerAPIImpl(this); + GuiManager networkGuiManager = new GuiManager(); CommandManager commandManager = new CommandManager(this); @@ -351,9 +354,6 @@ public void enablePlugin() { moveListener = new NetworkMoveListener(this, afk); teleportListener = new NetworkTeleportListener(this); - // Setup Timers - timerAPI = new TimerAPIImpl(this); - // Set up the lobby, most features are only enabled in the lobby server. Lobby lobby = new Lobby(this, constants, serverAPI, eventManager); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 5c995920..d9f06550 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -157,7 +157,7 @@ public net.bteuk.network.core.Constants getConstants() { String earthWorld = config.getString("regions.earth_world", "earth"); - boolean plotSystemEnabled = config.getBoolean("plot_system.enabled"); + boolean plotSystemEnabled = config.getBoolean("plot_system_enabled"); boolean moderationEnabled = config.getBoolean("staff.moderation.enabled"); diff --git a/Regions/pom.xml b/Regions/pom.xml index 524b95d0..aa37921f 100644 --- a/Regions/pom.xml +++ b/Regions/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.7.3 + 1.8.0 net.bteuk.network diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index 647bc904..f4de4a5d 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -57,7 +57,11 @@ public RegionManager(RegionSQL regionSQL, NetworkAPI networkAPI, CoordinateAPI c this.regionSQL = regionSQL; this.globalSQL = networkAPI.getGlobalSQL(); - this.plotAPI = networkAPI.getPlotAPI(); + if (constants.plotSystemEnabled()) { + this.plotAPI = networkAPI.getPlotAPI(); + } else { + this.plotAPI = null; + } this.chat = networkAPI.getChat(); this.coordinateAPI = coordinateAPI; this.eventAPI = eventAPI; @@ -159,7 +163,7 @@ public void setPinned(Region region, String uuid, boolean pin) { // Get the server of the region. public String getServer(Region region) { - if (regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + "status='plot'")) { + if (constants.plotSystemEnabled() && regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + "status='plot'")) { return (plotAPI.getRegionServer("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); } else { return (globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java index c5d756a6..c224f7cc 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -40,7 +40,7 @@ public RegionUser(Player player, Constants constants, RegionManager regionManage // Add the region to the database if not exists. regionManager.addToDatabase(trackedRegion); } - } else if (constants.serverType() == PLOT) { + } else if (constants.plotSystemEnabled() && constants.serverType() == PLOT) { // Check if the player is in a buildable plot world and apply coordinate transform if true. if (plotAPI.hasLocation(player.getLocation().getWorld().getName())) { this.deltaX = -plotAPI.getXTransform(player.getLocation().getWorld().getName()); diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index ebb7ff47..5efeccff 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -103,7 +103,7 @@ private void switchServer(RegionUser regionUser, Region region, Location newLoca String world = constants.earthWorld(); int xTransform = regionUser.getDeltaX(); int zTransform = regionUser.getDeltaZ(); - if (regionManager.status(region) == RegionStatus.PLOT) { + if (constants.plotSystemEnabled() && regionManager.status(region) == RegionStatus.PLOT) { // Get server and world of the region. String location = plotAPI.getRegionLocation(region.regionName()); diff --git a/pom.xml b/pom.xml index 0b498e27..d4ae53b3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.bteuk Network - 1.7.3 + 1.8.0 pom Network @@ -54,10 +54,6 @@ OpenCollab Snapshots https://repo.opencollab.dev/snapshot/
- - dmulloy2-repo - https://repo.dmulloy2.net/repository/public/ - codemc-repo https://repo.codemc.io/repository/maven-public/ From 536e1b65d84c5f9a198f9193feae61eb920aee93 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 30 Aug 2025 20:15:53 +0200 Subject: [PATCH 18/96] Fixing issues. --- Plugin/pom.xml | 10 +++++----- .../src/main/java/net/bteuk/network/Network.java | 15 ++++++++------- .../main/java/net/bteuk/network/commands/Afk.java | 11 ++++++++--- Plugin/src/main/resources/paper-plugin.yml | 4 ++++ .../net/bteuk/network/regions/RegionManager.java | 2 +- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 0078d189..dbfd801f 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -145,7 +145,7 @@ com.sk89q.worldguard worldguard-bukkit - 7.0.12 + 7.0.14 provided @@ -157,7 +157,7 @@ com.github.decentsoftware-eu decentholograms - 2.8.11 + 2.9.7 provided @@ -181,7 +181,7 @@ org.apache.commons commons-lang3 - 3.17.0 + 3.18.0 commons-io @@ -191,7 +191,7 @@ com.github.BTEUK terraminusminus - 41d3843a79 + 56b147b3b6 com.fasterxml.jackson.core @@ -202,7 +202,7 @@ com.google.guava guava - 33.3.1-jre + 33.4.8-jre diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 17b4a961..5027d45e 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -323,11 +323,17 @@ public void enablePlugin() { tab = new TabManager(this, constants, roles); } - Afk afk = new Afk(this, chat); + Afk afk = new Afk(this); commandManager.registerCommand(afk); Nightvision nightvision = new Nightvision(this); + // Create the region manager if enabled. + if (constants.regionsEnabled()) { + regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); + commandManager.registerCommand(new RegionCommand(regionManager, eventManager)); + } + // Setup connect, this handles all connections to the server. // Listener and manager of server connections. Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventManager, regionManager); @@ -336,6 +342,7 @@ public void enablePlugin() { // Enables chat, both global chat and normal chat are handled through it. chat = new CustomChat(this, constants, afk, globalSQL, connect, moderation, tab, roles); + afk.registerChat(chat); // Create the navigator. navigatorItem = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the navigator.")); @@ -345,12 +352,6 @@ public void enablePlugin() { new GuiListener(networkGuiManager).register(this); - // Create the region manager if enabled. - if (constants.regionsEnabled()) { - regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); - commandManager.registerCommand(new RegionCommand(regionManager, eventManager)); - } - moveListener = new NetworkMoveListener(this, afk); teleportListener = new NetworkTeleportListener(this); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index 37b430b4..f5054d3c 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -16,11 +16,16 @@ public class Afk extends AbstractCommand { private final Network instance; - private final CustomChat chat; + private CustomChat chat; - public Afk(Network instance, CustomChat chat) { + public Afk(Network instance) { this.instance = instance; - this.chat = chat; + } + + public void registerChat(CustomChat chat) { + if (this.chat == null) { + this.chat = chat; + } } public void updateAfkStatus(NetworkUser user, boolean afk) { diff --git a/Plugin/src/main/resources/paper-plugin.yml b/Plugin/src/main/resources/paper-plugin.yml index c8b4e261..ce67b7d5 100644 --- a/Plugin/src/main/resources/paper-plugin.yml +++ b/Plugin/src/main/resources/paper-plugin.yml @@ -24,4 +24,8 @@ dependencies: TeachingTutorials: load: AFTER required: false + join-classpath: true + Terraplusminus: + load: BEFORE + required: false join-classpath: true \ No newline at end of file diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index f4de4a5d..1f817097 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -164,7 +164,7 @@ public void setPinned(Region region, String uuid, boolean pin) { // Get the server of the region. public String getServer(Region region) { if (constants.plotSystemEnabled() && regionSQL.hasRow("SELECT region FROM regions WHERE region='" + region.regionName() + "' AND " + "status='plot'")) { - return (plotAPI.getRegionServer("SELECT server FROM regions WHERE region='" + region.regionName() + "';")); + return (plotAPI.getRegionServer(region.regionName())); } else { return (globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';")); } From 84133c3a81c3e1069100daadd1e1088bfee95be0 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 7 Sep 2025 11:53:00 +0200 Subject: [PATCH 19/96] Making sure region related functions are only used if enabled in config. --- .../src/main/java/net/bteuk/network/Network.java | 14 +++----------- .../building_companion/BuildingCompanion.java | 4 ++-- .../bteuk/network/commands/navigation/Tpll.java | 7 +++++-- .../bteuk/network/eventing/listeners/Connect.java | 10 ++++++++-- .../java/net/bteuk/network/utils/NetworkUser.java | 4 ++-- .../texteditorbooks/TextEditorBookListener.java | 10 +++++----- Plugin/src/main/resources/config.yml | 6 +++--- .../regions/listener/RegionTeleportListener.java | 3 +-- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 5027d45e..2f84be57 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -515,7 +515,9 @@ public void enablePlugin() { // Register all the events. eventManager.registerEvent("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); eventManager.registerEvent("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, eventManager, tpll, lobby)); - eventManager.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); + if (constants.regionsEnabled()) { + eventManager.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); + } eventManager.registerEvent("kick", new KickEvent()); // Start the Network timers. @@ -618,16 +620,6 @@ public Optional getOnlineUserByNameIgnoreCase(String name) { return onlineUsers.stream().filter(onlineUser -> onlineUser.getName().equalsIgnoreCase(name)).findFirst(); } - // Check if a user is on this server. - public boolean hasPlayer(String uuid) { - for (NetworkUser u : getUsers()) { - if (u.player.getUniqueId().toString().equals(uuid)) { - return true; - } - } - return false; - } - public PlotAPI getPlotAPI() { if (plotAPI == null) { throw new IllegalStateException("The plot system is not enabled"); diff --git a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java index b1de69c3..b6666166 100644 --- a/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java +++ b/Plugin/src/main/java/net/bteuk/network/building_companion/BuildingCompanion.java @@ -274,13 +274,13 @@ private void drawTempOutlinesTaskWithFeedback(int[][] corners) { * * @param outline the {@link SavedOutline} outline * @param block the block to draw the outline with - * @param permanent should the outline be a real block, or temporary + * @param permanent should the outline be a real block, or a temporary block? * @return whether the player has permission to build here, else don't draw the outline */ private boolean drawOutlines(SavedOutline outline, BlockData block, boolean permanent) { ProtectedRegion wgRegion = null; if (constants.serverType() == ServerType.PLOT) { - // Get region at first corner. If no region is found return false. + // Get the region in the first corner. If no region is found, return false. try { wgRegion = WorldguardUtils.getRegionAt(world, BlockVector3.at(outline.corners()[0][0], 1, outline.corners()[0][1])); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java index 2450d97b..419b931d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java @@ -53,7 +53,8 @@ public class Tpll extends AbstractCommand { private final Back back; private final GlobalSQL globalSQL; - public Tpll(Network instance, boolean requiresPermission, RegionManager regionManager, Constants constants, PlotSQL plotSQL, EventAPI eventAPI, ServerAPI serverAPI, Back back, GlobalSQL globalSQL) { + public Tpll(Network instance, boolean requiresPermission, RegionManager regionManager, Constants constants, PlotSQL plotSQL, EventAPI eventAPI, ServerAPI serverAPI, Back back, + GlobalSQL globalSQL) { this.instance = instance; this.requiresPermission = requiresPermission; this.regionManager = regionManager; @@ -230,7 +231,9 @@ public void tpll(Player p, String[] args, boolean fromEvent) { // Check if the player is allowed to teleport here. if (!canTeleportHere(p, region)) { - p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, you must be at least " + "Jr.Builder to load new terrain.")); + p.sendMessage(ChatUtils.error("The terrain for this region has not been generated, " + + "you do not have permission to load new terrain.")); + return; } if (!constants.standalone()) { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index c216742c..17c176ba 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -96,7 +96,10 @@ public void handleUserConnectReply(UserConnectReply reply) { } log.info(String.format("User connect reply received from the proxy, creating NetworkUser for %s", player.getName())); - RegionUser regionUser = regionManager.getUserByPlayer(player).orElseThrow(); + RegionUser regionUser = null; + if (constants.regionsEnabled()) { + regionUser = regionManager.getUserByPlayer(player).orElse(null); + } NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); instance.addUser(user); @@ -150,7 +153,10 @@ public void joinServerEvent(PlayerJoinEvent joinEvent) { UserConnectReply reply = new UserConnectReply(player.getUniqueId().toString(), navigatorEnabled, teleportEnabled, nightVisionEnabled, chatChannel, tipsEnabled, components, false); - RegionUser regionUser = regionManager.getUserByPlayer(player).orElseThrow(); + RegionUser regionUser = null; + if (constants.regionsEnabled()) { + regionUser = regionManager.getUserByPlayer(player).orElse(null); + } NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); OnlineUserAdd onlineUserAdd = new OnlineUserAdd(); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 932a631b..4819d4fe 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -269,9 +269,9 @@ public void sendMessage(Component message) { public Location getLocationWithCoordinateTransform() { return new Location( player.getWorld(), - player.getLocation().getX() + regionUser.getDeltaX(), + player.getLocation().getX() + (constants.regionsEnabled() ? regionUser.getDeltaX() : 0), player.getLocation().getY(), - player.getLocation().getZ() + regionUser.getDeltaZ(), + player.getLocation().getZ() + (constants.regionsEnabled() ? regionUser.getDeltaZ() : 0), player.getLocation().getYaw(), player.getLocation().getPitch() ); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java index fb9ebf2a..f9c6f08f 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java @@ -99,7 +99,7 @@ public void startEdit(String szBookName) { boolean bPlayerHasItem = false; for (int i = 0; i < 9; i++) { - if (user.player.getInventory().getItem(i) != null) if (user.player.getInventory().getItem(i).equals(this.book)) { + if (this.book.equals(user.player.getInventory().getItem(i))) { bPlayerHasItem = true; user.player.getInventory().setHeldItemSlot(i); } @@ -137,18 +137,18 @@ public void BookCloseEvent(PlayerEditBookEvent event) { } // Extracts the new content from the book - String szNewContent = ""; + StringBuilder szNewContent = new StringBuilder(); List pages = event.getNewBookMeta().pages(); if (!pages.isEmpty()) { for (Component page : pages) { - szNewContent = szNewContent + ((TextComponent) page).content() + " "; + szNewContent.append(((TextComponent) page).content()).append(" "); } // Removes the end space, the space after the last page is added in the loop but then needs to be removed - szNewContent = szNewContent.substring(0, szNewContent.length() - 1); + szNewContent = new StringBuilder(szNewContent.substring(0, szNewContent.length() - 1)); } // Performs the predefined instructions upon book close - boolean bSaveAnswers = bookCloseAction.runBookClose(event.getPreviousBookMeta(), event.getNewBookMeta(), this, szNewContent); + boolean bSaveAnswers = bookCloseAction.runBookClose(event.getPreviousBookMeta(), event.getNewBookMeta(), this, szNewContent.toString()); if (bSaveAnswers) { // Saves the instructions in the book diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 508d6d72..dd2970fc 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -23,7 +23,7 @@ server_name: server_name server_type: EARTH standalone: false -# Lobby info, only necessary if server type is LOBBY. +# Lobby info, only necessary if the server type is LOBBY. spawn: world: Lobby x: 1000.5 @@ -167,8 +167,8 @@ sidebar: # Sends a message to the player on joining motd: enabled: false - # Use MiniMessage format to define the text. (https://webui.advntr.dev/). Use %player% as player name placeholder + # Use MiniMessage format to define the text. (https://webui.advntr.dev/). Use %player% as the player name placeholder text: "" -# Whether the skulls plugin is used as head database. +# Whether the skulls plugin is used as the head database. skulls_plugin_enabled: true \ No newline at end of file diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java index d9dc3fcb..c014987a 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java @@ -35,7 +35,6 @@ public RegionTeleportListener(JavaPlugin instance, RegionManager regionManager, this.plotAPI = plotAPI; } - @Deprecated @EventHandler public void onPlayerTeleport(PlayerTeleportEvent e) { @@ -60,7 +59,7 @@ private Region getRegion(RegionUser regionUser, Location location) { // Get region. region = regionManager.getRegion(location.getX(), location.getZ()); } - } else if (constants.serverType() == PLOT) { + } else if (constants.plotSystemEnabled() && constants.serverType() == PLOT) { // Check if the player is teleporting to a buildable world in the plot system. if (plotAPI.hasLocation(location.getWorld().getName())) { From d2e9fa112efb48af68eb6ea0a1fb677bbbe45ee8 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 27 Sep 2025 17:07:21 +0200 Subject: [PATCH 20/96] Bug fixes: - When teleporting the region switch didn't activate due to an inverted if-statement. - Region inactivity was not working correctly due to a invalid config reference. - Certain gui's would break when switching server failed (for example if the server is offline), the gui is now always closed when switching server, even on fail. --- Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java | 2 +- .../src/main/java/net/bteuk/network/gui/NavigatorGui.java | 1 + .../net/bteuk/network/gui/navigation/AddLocation.java | 1 + .../net/bteuk/network/gui/navigation/LocationMenu.java | 2 ++ .../java/net/bteuk/network/gui/plotsystem/PlotInfo.java | 8 ++++++-- .../bteuk/network/gui/plotsystem/PlotServerLocations.java | 2 +- .../bteuk/network/gui/plotsystem/PlotsystemLocations.java | 2 +- .../bteuk/network/gui/plotsystem/VerificationInfo.java | 2 ++ .../java/net/bteuk/network/gui/plotsystem/ZoneInfo.java | 1 + .../java/net/bteuk/network/gui/regions/RegionInfo.java | 1 + .../bteuk/network/gui/regions/ReviewRegionRequest.java | 1 + .../main/java/net/bteuk/network/utils/NetworkConfig.java | 6 +++--- .../java/net/bteuk/network/regions/RegionManager.java | 2 +- .../network/regions/listener/AbstractMoveListener.java | 2 +- .../network/regions/listener/RegionTeleportListener.java | 2 +- 15 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 1850aae2..61973c7e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -116,12 +116,12 @@ protected void createGui() { eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); } else { + u.player.closeInventory(); // Set the server join event. eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); // Teleport them to another server. - u.player.closeInventory(); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 5147e71e..06d02d54 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -136,6 +136,7 @@ public NavigatorGui(GuiProvider provider) { } else { // Set teleport event to go to spawn. + u.player.closeInventory(); eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport spawn", location); serverAPI.switchServer(PlayerAdapter.adapt(u.player), globalSQL.getString("SELECT " + "name FROM server_data WHERE type='LOBBY';")); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index 17af0a5b..d85c4536 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -183,6 +183,7 @@ protected void createGui() { u.player.teleport(l); } else { // Create teleport event and switch server. + u.player.closeInventory(); eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport " + "location_request " + name, LocationAdapter.adapt(u.player.getLocation())); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java index 2fdeff78..0e5c509d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java @@ -156,6 +156,8 @@ protected void createGui() { u.player.sendMessage(ChatUtils.success("Teleported to ").append(Component.text(location.getKey(), NamedTextColor.DARK_AQUA))); } else { + u.player.closeInventory(); + // Create teleport event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport location " + location.getKey(), LocationAdapter.adapt(u.player.getLocation())); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 7424f7bd..23714a50 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -128,6 +128,8 @@ public void createGui() { if (server.equals(constants.serverName())) { eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); } else { + u.player.closeInventory(); + // Set the server join event. eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); @@ -346,12 +348,13 @@ public void createGui() { u.player.closeInventory(); eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "review plot " + plotID); } else { + u.player.closeInventory(); + // Player is not on the current server. // Set the server join event. eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); // Teleport them to the server. - u.player.closeInventory(); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } } else { @@ -373,12 +376,13 @@ public void createGui() { u.player.closeInventory(); eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "verify plot " + plotID); } else { + u.player.closeInventory(); + // Player is not on the current server. // Set the server join event. eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); // Teleport them to the server. - u.player.closeInventory(); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } } else { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java index 86839cb5..0c6a9c2c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java @@ -230,12 +230,12 @@ protected void createGui() { provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); } else { + u.player.closeInventory(); // Set the server join event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); // Teleport them to another server. - this.delete(); provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java index c3e0a598..71916948 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java @@ -97,7 +97,7 @@ protected void createGui() { "location_data WHERE name='" + name + "';"), location); // Teleport them to another server. - this.delete(); + u.player.closeInventory(); provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 21fa8bd6..36a0b09a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -140,6 +140,8 @@ protected void createGui() { provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotId, location); } else { + u.player.closeInventory(); + // Set the server join event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotId, location); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index ea0ac57d..d8cdd45b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -70,6 +70,7 @@ public void createGui() { provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); } else { + u.player.closeInventory(); // Set the server join event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index c7b285fa..717b657e 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -124,6 +124,7 @@ protected void createGui() { u.player.teleport(l); u.player.sendMessage(ChatUtils.success("Teleported to region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA))); } else { + u.player.closeInventory(); // Create teleport region event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport region " + region.regionName(), diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index ca540f12..ef8ddd2b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -125,6 +125,7 @@ protected void createGui() { u.player.teleport(l); u.player.sendMessage(ChatUtils.success("Teleported to region ").append(Component.text(request.region, NamedTextColor.DARK_AQUA))); } else { + u.player.closeInventory(); // Create teleport event. provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index d9f06550..51b96d0f 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -114,7 +114,7 @@ public net.bteuk.network.core.Constants getConstants() { boolean regionsEnabled = config.getBoolean("regions.enabled"); // days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds - long regionInactivity = config.getInt("region.inactivity_days") * 24L * 60L * 60L * 1000L; + long regionInactivity = config.getInt("regions.inactivity_days") * 24L * 60L * 60L * 1000L; boolean tpllEnabled = config.getBoolean("tpll.enabled"); boolean tpllRequiredPermission = config.getBoolean("tpll.requires_permission"); @@ -179,8 +179,8 @@ public net.bteuk.network.core.Constants getConstants() { int tipsFrequency = config.getInt("chat.tips.frequency"); - boolean regionStaffRequestAlways = config.getBoolean("region.staff_request.always"); - int regionStaffRequestRadius = config.getInt("region.staff_request.radius", 0); + boolean regionStaffRequestAlways = config.getBoolean("regions.staff_request.always"); + int regionStaffRequestRadius = config.getInt("regions.staff_request.radius", 0); int progressMapID = config.getInt("ProgressMap.ProgressMapID"); String mapHubAPIKey = config.getString("ProgressMap.MapHubAPIKey"); diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index 1f817097..8a2db526 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -733,7 +733,7 @@ private void registerInactivityTimer(TimerAPI timerAPI) { // If the region has members, then make the most recently active member the new owner, // If the region has no members, then set it inactive. List inactive_owners = regionSQL.getInactives( - "SELECT rm.region,rm.uuid FROM region_members AS rm" + " INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - constants.regionInactivity()) + " AND r" + ".status <> " + "'inactive';"); + "SELECT rm.region,rm.uuid FROM region_members AS rm INNER JOIN regions AS r ON rm.region=r.region WHERE rm.is_owner=1 AND rm.last_enter<" + (Time.currentTime() - constants.regionInactivity()) + " AND r.status <> " + "'inactive';"); long currentTime = Time.currentTime(); for (Inactivity inactive : inactive_owners) { diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java index f615a6de..ee9ac311 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java @@ -42,7 +42,7 @@ protected boolean switchRegion(RegionUser regionUser, Region newRegion) { // Add the region to the database if not exists. regionManager.addToDatabase(newRegion); - // If the player is the region owner update last enter and send the message. + // If the player is the region owner update the last enter time and send the message. if (regionManager.isOwner(newRegion, regionUser.getPlayer().getUniqueId().toString())) { sendRegionOwnerEnterMessage(regionUser, newRegion); diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java index c014987a..e6c385cd 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java @@ -47,7 +47,7 @@ public void onPlayerTeleport(PlayerTeleportEvent e) { Region newRegion = getRegion(regionUser, e.getTo()); - if (Objects.equals(newRegion, regionUser.getTrackedRegion())) { + if (!Objects.equals(newRegion, regionUser.getTrackedRegion())) { e.setCancelled(switchRegion(regionUser, newRegion)); } } From acb9218a1bca3a9dfb126493ada5653ce289c2d4 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 20 Oct 2025 21:03:16 +0200 Subject: [PATCH 21/96] Bug fixes: order of initialisation, took SocketHandler out of CustomChat. --- PaperCore/pom.xml | 3 - .../java/net/bteuk/network/CustomChat.java | 48 ++++------------ .../main/java/net/bteuk/network/Network.java | 19 ++++--- .../net/bteuk/network/SocketHandlerImpl.java | 55 +++++++++++++++++++ pom.xml | 2 +- 5 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index 82b01da0..35a0fed2 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -17,14 +17,11 @@ net.bteuk.network api - ${project.version} io.papermc.paper paper-api - 1.21.1-R0.1-SNAPSHOT - provided \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index 4c5dec02..8e3c8500 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -6,19 +6,12 @@ import net.bteuk.network.commands.Afk; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; -import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.exceptions.NotMutedException; import net.bteuk.network.lib.dto.AbstractTransferObject; -import net.bteuk.network.lib.dto.AddTeamEvent; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.DiscordLinking; import net.bteuk.network.lib.dto.DiscordRole; -import net.bteuk.network.lib.dto.OnlineUserAdd; -import net.bteuk.network.lib.dto.OnlineUserRemove; -import net.bteuk.network.lib.dto.OnlineUsersReply; -import net.bteuk.network.lib.dto.UserConnectReply; -import net.bteuk.network.lib.dto.UserRemove; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.socket.InputSocket; @@ -41,7 +34,7 @@ import static net.bteuk.network.lib.enums.ChatChannels.STAFF; @Log -public class CustomChat implements Listener, SocketHandler, ChatAPI { +public class CustomChat implements Listener, ChatAPI { private static final String AFK = "%s is now afk"; private static final String NOT_AFK = "%s is no longer afk"; @@ -50,20 +43,18 @@ public class CustomChat implements Listener, SocketHandler, ChatAPI { private final Constants constants; private final Afk afk; private final GlobalSQL globalSQL; - private final Connect connect; private final Moderation moderation; - private final TabManager tabManager; private final Roles roles; - public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Connect connect, Moderation moderation, TabManager tabManager, Roles roles) { + private InputSocket inputSocket; + + public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Moderation moderation, Roles roles) { this.instance = instance; this.constants = constants; this.afk = afk; this.globalSQL = globalSQL; - this.connect = connect; this.moderation = moderation; - this.tabManager = tabManager; this.roles = roles; instance.getServer().getPluginManager().registerEvents(this, instance); @@ -78,14 +69,17 @@ public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL glob log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); } else { // Create the input socket. - InputSocket inputSocket = new InputSocket(inputSocketPort); - inputSocket.start(this); + inputSocket = new InputSocket(inputSocketPort); } } log.info("Successfully enabled Chat!"); } + public void registerSocketHandler(SocketHandler socketHandler) { + inputSocket.start(socketHandler); + } + public static ChatMessage getChatMessage(Component component, NetworkUser u) { ChatMessage chatMessage = new ChatMessage(); @@ -193,25 +187,7 @@ public void sendSocketMessage(AbstractTransferObject chatMessage) { } } - @Override - public AbstractTransferObject handle(AbstractTransferObject abstractTransferObject) { - switch (abstractTransferObject) { - case DirectMessage directMessage -> handleDirectMessage(directMessage); - case DiscordLinking discordLinking -> handleDiscordLinking(discordLinking); - case AddTeamEvent addTeamEvent -> tabManager.handle(addTeamEvent); - case UserConnectReply userConnectReply -> connect.handleUserConnectReply(userConnectReply); - case UserRemove userRemove -> connect.handleUserRemove(userRemove); - case UserUpdate userUpdate -> handleUserUpdate(userUpdate); - case OnlineUsersReply onlineUsersReply -> instance.handleOnlineUsersReply(onlineUsersReply); - case OnlineUserAdd onlineUserAdd -> instance.handleOnlineUserAdd(onlineUserAdd); - case OnlineUserRemove onlineUserRemove -> instance.handleOnlineUserRemove(onlineUserRemove); - default -> log.warning(String.format("Socket object has an unrecognised type %s", - abstractTransferObject.getClass().getTypeName())); - } - return null; - } - - private void handleDirectMessage(DirectMessage message) { + public void handleDirectMessage(DirectMessage message) { // Send the message if the player is on this server. instance.getServer().getOnlinePlayers().stream() .filter(player -> player.getUniqueId().toString().equals(message.getRecipient())) @@ -236,7 +212,7 @@ private void handleDirectMessage(DirectMessage message) { }); } - private void handleDiscordLinking(DiscordLinking discordLinking) { + public void handleDiscordLinking(DiscordLinking discordLinking) { if (discordLinking.isUnlink() && discordLinking.getDiscordId() != -1) { // Unlink, this is only used if the user is no longer in the discord server. @@ -282,7 +258,7 @@ private void handleDiscordLinking(DiscordLinking discordLinking) { }); } - private void handleUserUpdate(UserUpdate userUpdate) { + public void handleUserUpdate(UserUpdate userUpdate) { // If the user is online check if anything needs updating. instance.getUsers().stream().filter((NetworkUser user) -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) .findFirst().ifPresent((NetworkUser user) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 2f84be57..e47e36ab 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -328,6 +328,12 @@ public void enablePlugin() { Nightvision nightvision = new Nightvision(this); + Moderation moderation = new Moderation(this, eventManager); + + // Enables chat, both global chat and normal chat are handled through it. + chat = new CustomChat(this, constants, afk, globalSQL, moderation, roles); + afk.registerChat(chat); + // Create the region manager if enabled. if (constants.regionsEnabled()) { regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); @@ -337,12 +343,7 @@ public void enablePlugin() { // Setup connect, this handles all connections to the server. // Listener and manager of server connections. Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventManager, regionManager); - - Moderation moderation = new Moderation(this, eventManager); - - // Enables chat, both global chat and normal chat are handled through it. - chat = new CustomChat(this, constants, afk, globalSQL, connect, moderation, tab, roles); - afk.registerChat(chat); + new SocketHandlerImpl(this, chat, tab, connect); // Create the navigator. navigatorItem = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the navigator.")); @@ -452,9 +453,9 @@ public void enablePlugin() { new PlayerInteract(this, navigator); if (constants.warpsEnabled()) { - new Warp(this, constants, plotAPI, back, eventManager, serverAPI); - new Warps(this); - new Navigation(this, navigator.getProvider()); + commandManager.registerCommand(new Warp(this, constants, plotAPI, back, eventManager, serverAPI)); + commandManager.registerCommand(new Warps(this)); + commandManager.registerCommand(new Navigation(this, navigator.getProvider())); } if (constants.plotSystemEnabled()) { diff --git a/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java b/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java new file mode 100644 index 00000000..147fe55d --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java @@ -0,0 +1,55 @@ +package net.bteuk.network; + +import lombok.extern.java.Log; +import net.bteuk.network.eventing.listeners.Connect; +import net.bteuk.network.lib.dto.AbstractTransferObject; +import net.bteuk.network.lib.dto.AddTeamEvent; +import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.dto.DiscordLinking; +import net.bteuk.network.lib.dto.OnlineUserAdd; +import net.bteuk.network.lib.dto.OnlineUserRemove; +import net.bteuk.network.lib.dto.OnlineUsersReply; +import net.bteuk.network.lib.dto.UserConnectReply; +import net.bteuk.network.lib.dto.UserRemove; +import net.bteuk.network.lib.dto.UserUpdate; +import net.bteuk.network.lib.socket.SocketHandler; + +@Log +public class SocketHandlerImpl implements SocketHandler { + + private final Network instance; + + private final CustomChat chat; + + private final TabManager tabManager; + + private final Connect connect; + + public SocketHandlerImpl(Network instance, CustomChat chat, TabManager tabManager, Connect connect) { + this.instance = instance; + this.chat = chat; + this.tabManager = tabManager; + this.connect = connect; + + // Register the socket handler. + chat.registerSocketHandler(this); + } + + @Override + public AbstractTransferObject handle(AbstractTransferObject abstractTransferObject) { + switch (abstractTransferObject) { + case DirectMessage directMessage -> chat.handleDirectMessage(directMessage); + case DiscordLinking discordLinking -> chat.handleDiscordLinking(discordLinking); + case AddTeamEvent addTeamEvent -> tabManager.handle(addTeamEvent); + case UserConnectReply userConnectReply -> connect.handleUserConnectReply(userConnectReply); + case UserRemove userRemove -> connect.handleUserRemove(userRemove); + case UserUpdate userUpdate -> chat.handleUserUpdate(userUpdate); + case OnlineUsersReply onlineUsersReply -> instance.handleOnlineUsersReply(onlineUsersReply); + case OnlineUserAdd onlineUserAdd -> instance.handleOnlineUserAdd(onlineUserAdd); + case OnlineUserRemove onlineUserRemove -> instance.handleOnlineUserRemove(onlineUserRemove); + default -> log.warning(String.format("Socket object has an unrecognised type %s", + abstractTransferObject.getClass().getTypeName())); + } + return null; + } +} diff --git a/pom.xml b/pom.xml index d4ae53b3..4798bc50 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 1.21.8-R0.1-SNAPSHOT - c75ba196a4 + d3134be6b5 5958727df9 1.18.34 From 650ce86c7c282158a167a5e1777e43826b44a982 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 20 Oct 2025 21:35:33 +0200 Subject: [PATCH 22/96] Update t-- to 1.21.4 release version, no longer requiring custom bteuk fork. --- Plugin/pom.xml | 12 +++--------- pom.xml | 14 +++++--------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Plugin/pom.xml b/Plugin/pom.xml index dbfd801f..807bfaf8 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -189,15 +189,9 @@ 2.17.0 - com.github.BTEUK - terraminusminus - 56b147b3b6 - - - com.fasterxml.jackson.core - jackson-databind - - + net.buildtheearth.terraminusminus + terraminusminus-core + 2.0.0-1.21.4 com.google.guava diff --git a/pom.xml b/pom.xml index 4798bc50..eb328621 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,11 @@ papermc-repo https://repo.papermc.io/repository/maven-public/ + + smyler-releases + Smyler's maven repository + https://maven.smyler.net/releases + sonatype https://oss.sonatype.org/content/groups/public/ @@ -46,18 +51,9 @@ sk89q-repo https://maven.enginehub.org/repo/ - - DaPorkchop_ - https://maven.daporkchop.net/ - - - OpenCollab Snapshots - https://repo.opencollab.dev/snapshot/ - codemc-repo https://repo.codemc.io/repository/maven-public/ - default
From 66609067abbc0becd2c9b1631db3a5a2912858a0 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 20 Oct 2025 22:00:55 +0200 Subject: [PATCH 23/96] Add registerEvent to the EventAPI to allow other plugins to use the events system. --- Network-API/pom.xml | 1 - .../src/main/java/net/bteuk/network/api/EventAPI.java | 9 +++++++++ .../main/java/net/bteuk/network/api/entity}/Event.java | 2 +- Plugin/pom.xml | 1 - Plugin/src/main/java/net/bteuk/network/Timers.java | 2 +- .../net/bteuk/network/eventing/events/EventManager.java | 2 +- .../net/bteuk/network/eventing/events/InviteEvent.java | 2 +- .../net/bteuk/network/eventing/events/KickEvent.java | 2 +- .../net/bteuk/network/eventing/events/TeleportEvent.java | 2 +- .../src/main/java/net/bteuk/network/sql/GlobalSQL.java | 8 ++++---- .../main/java/net/bteuk/network/regions/RegionEvent.java | 2 +- pom.xml | 7 +++++++ 12 files changed, 27 insertions(+), 13 deletions(-) rename {Core/src/main/java/net/bteuk/network/core => Network-API/src/main/java/net/bteuk/network/api/entity}/Event.java (91%) diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 8e51412b..f2bbf82b 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -26,7 +26,6 @@ com.github.BTEUK NetworkLib - a781b6371c diff --git a/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java index 3d7fac9f..b3f95a1a 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java @@ -1,10 +1,19 @@ package net.bteuk.network.api; +import net.bteuk.network.api.entity.Event; import net.bteuk.network.api.entity.NetworkLocation; import net.kyori.adventure.text.Component; public interface EventAPI { + /** + * Registers an {@link Event} to the Event manager. + * + * @param name the name of the event + * @param event the event + */ + void registerEvent(String name, Event event); + void createJoinEvent(String uuid, String type, String event); void createJoinEvent(String uuid, String type, String event, String message); diff --git a/Core/src/main/java/net/bteuk/network/core/Event.java b/Network-API/src/main/java/net/bteuk/network/api/entity/Event.java similarity index 91% rename from Core/src/main/java/net/bteuk/network/core/Event.java rename to Network-API/src/main/java/net/bteuk/network/api/entity/Event.java index 35d87d1b..43aed067 100644 --- a/Core/src/main/java/net/bteuk/network/core/Event.java +++ b/Network-API/src/main/java/net/bteuk/network/api/entity/Event.java @@ -1,4 +1,4 @@ -package net.bteuk.network.core; +package net.bteuk.network.api.entity; /** * Abstract class for events. diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 807bfaf8..118dd93a 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -208,7 +208,6 @@ com.github.BTEUK NetworkLib - a781b6371c com.github.BTEUK diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 539aa6d2..bf0e19da 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -73,7 +73,7 @@ public void startTimers() { isBusy = true; // Get events for this server. - events = globalSQL.getEvents(constants.serverName(), "network", events); + events = globalSQL.getEvents(constants.serverName(), events); for (String[] event : events) { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index 5a5ea02f..7bd40c91 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -2,10 +2,10 @@ import lombok.extern.java.Log; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.entity.Event; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.commands.navigation.Back; import net.bteuk.network.core.Constants; -import net.bteuk.network.core.Event; import net.bteuk.network.sql.GlobalSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java index 57bfca00..8f1d4ee5 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/InviteEvent.java @@ -2,7 +2,7 @@ import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.SQLAPI; -import net.bteuk.network.core.Event; +import net.bteuk.network.api.entity.Event; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.Region; import net.bteuk.network.regions.RegionManager; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java index 4cac1204..b7469c70 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/KickEvent.java @@ -1,7 +1,7 @@ package net.bteuk.network.eventing.events; import lombok.extern.java.Log; -import net.bteuk.network.core.Event; +import net.bteuk.network.api.entity.Event; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java index 60dc504d..1241f866 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java @@ -5,9 +5,9 @@ import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.ServerAPI; +import net.bteuk.network.api.entity.Event; import net.bteuk.network.commands.navigation.Tpll; import net.bteuk.network.core.Constants; -import net.bteuk.network.core.Event; import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.lobby.Lobby; diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 7c77d7f9..5da34834 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -30,13 +30,13 @@ public GlobalSQL(DataSource datasource, Constants constants) { this.constants = constants; } - // Get a hashmap of all events for this server for the Network plugin. - public ArrayList getEvents(String serverName, String type, ArrayList list) { + // Get a hashmap of all events for this server. + public ArrayList getEvents(String serverName, ArrayList list) { // Try and get all events for this server. try ( Connection conn = conn(); - PreparedStatement statement = conn.prepareStatement("SELECT uuid,event,message FROM server_events " + "WHERE server='" + serverName + "' AND type='" + type + "';"); + PreparedStatement statement = conn.prepareStatement("SELECT uuid,event,message FROM server_events " + "WHERE server='" + serverName + "';"); ResultSet results = statement.executeQuery() ) { @@ -52,7 +52,7 @@ public ArrayList getEvents(String serverName, String type, ArrayListd3134be6b5 5958727df9 + a781b6371c 1.18.34 @@ -86,6 +87,12 @@ ${bteuk.lib.version} + + com.github.BTEUK + NetworkLib + ${bteuk.networklib.version} + + com.github.BTEUK.Proxy database From e23f8e687aac44ccec27347f3784c8cb442dd24c Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 21 Oct 2025 20:13:34 +0200 Subject: [PATCH 24/96] PlotAPI expansion and publish javadocs. --- Network-API/pom.xml | 24 +++++++++++++++++++ .../net/bteuk/network/api/NetworkAPI.java | 2 ++ .../java/net/bteuk/network/api/PlotAPI.java | 10 ++++++++ .../main/java/net/bteuk/network/Network.java | 4 ++++ .../bteuk/network/api/impl/PlotAPIImpl.java | 22 +++++++++++++++++ 5 files changed, 62 insertions(+) diff --git a/Network-API/pom.xml b/Network-API/pom.xml index f2bbf82b..177bee82 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -29,4 +29,28 @@ + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + false + none + UTF-8 + + + + attach-javadocs + + jar + + + + + + + + \ No newline at end of file diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 42c49a46..0ed38b59 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -12,6 +12,8 @@ public interface NetworkAPI { TimerAPI getTimerAPI(); + boolean isTutorialsEnabled(); + /** * Register a shutdown hook to run on server shutdown. * diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index d272f18d..52c72891 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -94,4 +94,14 @@ public interface PlotAPI { String getPlotOwner(int plotID); String getZoneOwner(int zoneID); + + boolean isPlotOwner(int plotID, String uuid); + + boolean isPlotMember(int plotID, String uuid); + + boolean isPlotClaimed(int plotID); + + int getNumberOfPlots(String uuid); + + } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index e47e36ab..20274e6f 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -628,6 +628,10 @@ public PlotAPI getPlotAPI() { return plotAPI; } + public boolean isTutorialsEnabled() { + return constants.tutorials(); + } + @Override public void registerShutdownHook(ShutdownHook hook) { shutdownHooks.add(hook); diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index eeaf0a27..65f3d2f2 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -216,4 +216,26 @@ public String getPlotOwner(int plotID) { public String getZoneOwner(int zoneID) { return plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND is_owner=1;"); } + + @Override + public boolean isPlotOwner(int plotID, String uuid) { + return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotID + " AND uuid='" + uuid + "' AND is_owner=1;"); + } + + @Override + public boolean isPlotMember(int plotID, String uuid) { + return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotID + " AND uuid='" + uuid + "' AND is_owner=0;"); + + } + + @Override + public boolean isPlotClaimed(int plotID) { + return plotSQL.hasRow("SELECT id FROM plot_data WHERE id=" + plotID + " AND status='claimed';"); + } + + @Override + public int getNumberOfPlots(String uuid) { + return plotSQL.getInt("SELECT count(id) FROM plot_members WHERE uuid='" + uuid + "';"); + } + } From e48dac83e8c1f0bb653b8ca3155cc440afaf26c1 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 21 Oct 2025 20:28:54 +0200 Subject: [PATCH 25/96] Move some plotsystem stuff to API to make is accessible. --- .../net/bteuk/network/api/NetworkAPI.java | 2 ++ .../api}/plotsystem/ReviewCategory.java | 2 +- .../plotsystem/ReviewCategoryFeedback.java | 2 +- .../api}/plotsystem/ReviewFeedback.java | 2 +- .../api}/plotsystem/ReviewSelection.java | 2 +- .../api}/plotsystem/SubmittedPlot.java | 2 +- .../main/java/net/bteuk/network/Timers.java | 2 +- .../java/net/bteuk/network/commands/Plot.java | 2 +- .../gui/plotsystem/DeniedPlotFeedback.java | 2 +- .../network/gui/plotsystem/PlotInfo.java | 2 +- .../gui/plotsystem/VerificationInfo.java | 2 +- .../net/bteuk/network/gui/staff/StaffGui.java | 2 +- .../java/net/bteuk/network/sql/PlotSQL.java | 2 +- .../net/bteuk/network/utils/NetworkUser.java | 19 ++++++------------- 14 files changed, 20 insertions(+), 25 deletions(-) rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api}/plotsystem/ReviewCategory.java (91%) rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api}/plotsystem/ReviewCategoryFeedback.java (70%) rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api}/plotsystem/ReviewFeedback.java (99%) rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api}/plotsystem/ReviewSelection.java (96%) rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api}/plotsystem/SubmittedPlot.java (56%) diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 0ed38b59..d65658d7 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -12,6 +12,8 @@ public interface NetworkAPI { TimerAPI getTimerAPI(); + EventAPI getEventAPI(); + boolean isTutorialsEnabled(); /** diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategory.java similarity index 91% rename from Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategory.java index fb53e250..3777b6cc 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategory.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategory.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.plotsystem; +package net.bteuk.network.api.plotsystem; import lombok.Getter; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategoryFeedback.java similarity index 70% rename from Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategoryFeedback.java index dc126b29..dbe9fca1 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewCategoryFeedback.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewCategoryFeedback.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.plotsystem; +package net.bteuk.network.api.plotsystem; public record ReviewCategoryFeedback(ReviewCategory category, ReviewSelection selection, int bookId) { } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java similarity index 99% rename from Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java index 5e11e0df..f94efc41 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewFeedback.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.plotsystem; +package net.bteuk.network.api.plotsystem; import net.bteuk.network.api.SQLAPI; import net.bteuk.network.lib.utils.ChatUtils; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewSelection.java similarity index 96% rename from Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewSelection.java index 9f4813b8..56c88872 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/ReviewSelection.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewSelection.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.plotsystem; +package net.bteuk.network.api.plotsystem; import lombok.Getter; import net.kyori.adventure.text.Component; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedPlot.java similarity index 56% rename from Plugin/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedPlot.java index a00317cc..ae8e3434 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/plotsystem/SubmittedPlot.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedPlot.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.plotsystem; +package net.bteuk.network.api.plotsystem; public record SubmittedPlot(int id, long submitTime) { } diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index bf0e19da..43478fcc 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -63,7 +63,7 @@ public void startTimers() { instance.getTimerAPI().registerTimer(() -> { // Check for new server_events. - if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "' AND type='network" + "';")) { + if (globalSQL.hasRow("SELECT uuid FROM server_events WHERE server='" + constants.serverName() + "';")) { // If events are not empty, skip this iteration. // Additionally, isBusy needs to be false, implying that the server is not still running a previous diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index 0367cb31..7fac0b92 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; +import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.plotsystem.PlotInfo; @@ -10,7 +11,6 @@ import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.PlotStatus; -import net.bteuk.network.utils.plotsystem.ReviewFeedback; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java index f6d786bc..516e45f2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java @@ -1,12 +1,12 @@ package net.bteuk.network.gui.plotsystem; +import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 23714a50..737897da 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -4,6 +4,7 @@ import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import net.bteuk.network.gui.GuiProvider; @@ -21,7 +22,6 @@ import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.enums.PlotStatus; import net.bteuk.network.utils.enums.SubmittedStatus; -import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.buildtheearth.terraminusminus.generator.EarthGeneratorSettings; import net.buildtheearth.terraminusminus.projection.OutOfProjectionBoundsException; import net.kyori.adventure.text.Component; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 36a0b09a..61bd0ae2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -1,6 +1,7 @@ package net.bteuk.network.gui.plotsystem; import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; import net.bteuk.network.papercore.LocationAdapter; @@ -9,7 +10,6 @@ import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.plotsystem.ReviewFeedback; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index f8897886..4451ac41 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -1,5 +1,6 @@ package net.bteuk.network.gui.staff; +import net.bteuk.network.api.plotsystem.SubmittedPlot; import net.bteuk.network.core.Constants; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; @@ -9,7 +10,6 @@ import net.bteuk.network.regions.RegionUser; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.plotsystem.SubmittedPlot; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index 21a1ebe7..4f9b5fba 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -1,11 +1,11 @@ package net.bteuk.network.sql; import lombok.extern.java.Log; +import net.bteuk.network.api.plotsystem.SubmittedPlot; import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.enums.PlotDifficulties; import net.bteuk.network.lib.utils.Reviewing; import net.bteuk.network.utils.TutorialRecommendation; -import net.bteuk.network.utils.plotsystem.SubmittedPlot; import teachingtutorials.utils.DBConnection; import javax.sql.DataSource; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 4819d4fe..78f076df 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -101,7 +101,8 @@ public class NetworkUser { private final RegionUser regionUser; - public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles, Nightvision nightvision, EventManager eventManager, RegionUser regionUser) { + public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles, Nightvision nightvision, EventManager eventManager, + RegionUser regionUser) { this.instance = instance; this.constants = constants; @@ -202,27 +203,19 @@ private void runEvents(EventManager eventManager) { // Check if the player has any join events, if try run them. // Delay by 1 second for all plugins to run their join events. Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> { - if (instance.getGlobalSQL().hasRow("SELECT uuid FROM join_events WHERE uuid='" + player.getUniqueId() + - "' AND type='network';")) { + if (instance.getGlobalSQL().hasRow("SELECT uuid FROM join_events WHERE uuid='" + player.getUniqueId() + ";")) { // Get the event from the database. - String event = - instance.getGlobalSQL().getString( - "SELECT event FROM join_events WHERE uuid='" + player.getUniqueId() + "' AND " + - "type='network'"); + String event = instance.getGlobalSQL().getString("SELECT event FROM join_events WHERE uuid='" + player.getUniqueId() + "';"); // Get message. - String message = - instance.getGlobalSQL().getString( - "SELECT message FROM join_events WHERE uuid='" + player.getUniqueId() + "' AND " + - "type='network'"); + String message = instance.getGlobalSQL().getString("SELECT message FROM join_events WHERE uuid='" + player.getUniqueId() + "';"); // Split the event by word. String[] aEvent = event.split(" "); // Clear the events. - instance.getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUniqueId() + "' AND" + - " type='network';"); + instance.getGlobalSQL().update("DELETE FROM join_events WHERE uuid='" + player.getUniqueId() + "';"); // Send the event to the event handler. eventManager.event(player.getUniqueId().toString(), aEvent, message); From be2de40fcbf0cd03eac3e9e6152443a915105600 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 21 Oct 2025 20:35:15 +0200 Subject: [PATCH 26/96] Network impl of getEventAPI --- .../main/java/net/bteuk/network/Network.java | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 20274e6f..4ace037c 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -169,6 +169,9 @@ public final class Network extends JavaPlugin implements NetworkAPI { private ServerAPI serverAPI; + @Getter + private EventManager eventAPI; + private final List shutdownHooks = new ArrayList<>(); @Override @@ -305,7 +308,7 @@ public void enablePlugin() { CommandManager commandManager = new CommandManager(this); CoordinateAPI coordinateAPI = new CoordinateAPIImpl(globalSQL); - EventManager eventManager = new EventManager(globalSQL, constants); + this.eventAPI = new EventManager(globalSQL, constants); WorldGuardAPI worldGuardAPI = new WorldGuard(); Roles roles = new Roles(this, plotSQL); @@ -328,7 +331,7 @@ public void enablePlugin() { Nightvision nightvision = new Nightvision(this); - Moderation moderation = new Moderation(this, eventManager); + Moderation moderation = new Moderation(this, eventAPI); // Enables chat, both global chat and normal chat are handled through it. chat = new CustomChat(this, constants, afk, globalSQL, moderation, roles); @@ -336,13 +339,13 @@ public void enablePlugin() { // Create the region manager if enabled. if (constants.regionsEnabled()) { - regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventManager, worldGuardAPI, constants, this, serverAPI); - commandManager.registerCommand(new RegionCommand(regionManager, eventManager)); + regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventAPI, worldGuardAPI, constants, this, serverAPI); + commandManager.registerCommand(new RegionCommand(regionManager, eventAPI)); } // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventManager, regionManager); + Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); new SocketHandlerImpl(this, chat, tab, connect); // Create the navigator. @@ -357,7 +360,7 @@ public void enablePlugin() { teleportListener = new NetworkTeleportListener(this); // Set up the lobby, most features are only enabled in the lobby server. - Lobby lobby = new Lobby(this, constants, serverAPI, eventManager); + Lobby lobby = new Lobby(this, constants, serverAPI, eventAPI); // Enable commands if (constants.moderationEnabled()) { @@ -368,15 +371,15 @@ public void enablePlugin() { commandManager.registerCommand(new Unban(this, moderation)); } - Back back = new Back(this, constants, eventManager, serverAPI); - eventManager.registerBack(back); + Back back = new Back(this, constants, eventAPI, serverAPI); + eventAPI.registerBack(back); commandManager.registerCommand(back); - commandManager.registerCommand(new Teleport(this, back, eventManager, serverAPI, constants)); + commandManager.registerCommand(new Teleport(this, back, eventAPI, serverAPI, constants)); commandManager.registerCommand(new TpToggle(this)); if (constants.tpllEnabled()) { TerraConfig.reducedConsoleMessages = true; - tpll = new Tpll(this, constants.tpllRequiresPermission(), regionManager, constants, plotSQL, eventManager, serverAPI, back, globalSQL); + tpll = new Tpll(this, constants.tpllRequiresPermission(), regionManager, constants, plotSQL, eventAPI, serverAPI, back, globalSQL); commandManager.registerCommand(tpll); } @@ -386,13 +389,13 @@ public void enablePlugin() { if (!constants.standalone()) { commandManager.registerCommand(new LobbyCommand(lobby, constants)); - commandManager.registerCommand(new Spawn(constants, back, lobby, eventManager, serverAPI, globalSQL)); + commandManager.registerCommand(new Spawn(constants, back, lobby, eventAPI, serverAPI, globalSQL)); commandManager.registerCommand(new Server(globalSQL, constants, serverAPI)); } if (constants.homesEnabled()) { commandManager.registerCommand(new Sethome(this)); - commandManager.registerCommand(new Home(this, constants, eventManager, serverAPI)); + commandManager.registerCommand(new Home(this, constants, eventAPI, serverAPI)); commandManager.registerCommand(new Delhome(this)); commandManager.registerCommand(new Homes(this)); } @@ -447,20 +450,20 @@ public void enablePlugin() { commandManager.registerCommand(new Me()); - Navigator navigator = new Navigator(this, networkGuiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventManager, serverAPI, + Navigator navigator = new Navigator(this, networkGuiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventAPI, serverAPI, nightvision, roles, tutorialsDBConnection, chat, moderation); commandManager.registerCommand(navigator); new PlayerInteract(this, navigator); if (constants.warpsEnabled()) { - commandManager.registerCommand(new Warp(this, constants, plotAPI, back, eventManager, serverAPI)); + commandManager.registerCommand(new Warp(this, constants, plotAPI, back, eventAPI, serverAPI)); commandManager.registerCommand(new Warps(this)); commandManager.registerCommand(new Navigation(this, navigator.getProvider())); } if (constants.plotSystemEnabled()) { commandManager.registerCommand(new Plot(navigator.getProvider())); - commandManager.registerCommand(new Zone(plotSQL, eventManager)); + commandManager.registerCommand(new Zone(plotSQL, eventAPI)); } commandManager.registerCommand(new Staff(navigator.getProvider())); @@ -514,15 +517,15 @@ public void enablePlugin() { } // Register all the events. - eventManager.registerEvent("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); - eventManager.registerEvent("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, eventManager, tpll, lobby)); + eventAPI.registerEvent("invite", new InviteEvent(globalSQL, plotAPI, regionManager)); + eventAPI.registerEvent("teleport", new TeleportEvent(globalSQL, plotAPI, regionManager, constants, serverAPI, eventAPI, tpll, lobby)); if (constants.regionsEnabled()) { - eventManager.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); + eventAPI.registerEvent("region", new RegionEvent(regionManager, chat, globalSQL, coordinateAPI)); } - eventManager.registerEvent("kick", new KickEvent()); + eventAPI.registerEvent("kick", new KickEvent()); // Start the Network timers. - new Timers(this, globalSQL, eventManager, constants, afk); + new Timers(this, globalSQL, eventAPI, constants, afk); // Let the Proxy know that the server is enabled. chat.sendSocketMessage(new ServerStartup(constants.serverName())); From 0ad912b154b27ae41626bff6de6d131fee309ab0 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 24 Oct 2025 20:43:48 +0200 Subject: [PATCH 27/96] Expand API for plotsystem. --- Network-API/pom.xml | 27 +--------------- .../net/bteuk/network/api/NetworkAPI.java | 4 +++ .../java/net/bteuk/network/api/PlotAPI.java | 4 +++ .../network/api/plotsystem}/PlotStatus.java | 2 +- .../api/plotsystem}/SubmittedStatus.java | 2 +- .../main/java/net/bteuk/network/Network.java | 8 +++++ .../java/net/bteuk/network/commands/Plot.java | 2 +- .../network/gui/plotsystem/PlotInfo.java | 4 +-- pom.xml | 31 +++++++++++++++++++ 9 files changed, 53 insertions(+), 31 deletions(-) rename {Plugin/src/main/java/net/bteuk/network/utils/enums => Network-API/src/main/java/net/bteuk/network/api/plotsystem}/PlotStatus.java (95%) rename {Plugin/src/main/java/net/bteuk/network/utils/enums => Network-API/src/main/java/net/bteuk/network/api/plotsystem}/SubmittedStatus.java (95%) diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 177bee82..a169f16a 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -28,29 +28,4 @@ NetworkLib - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.6.3 - - false - none - UTF-8 - - - - attach-javadocs - - jar - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index d65658d7..7ec85d72 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -16,6 +16,10 @@ public interface NetworkAPI { boolean isTutorialsEnabled(); + int getMinY(); + + int getMaxY(); + /** * Register a shutdown hook to run on server shutdown. * diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 52c72891..dcd89ce9 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -103,5 +103,9 @@ public interface PlotAPI { int getNumberOfPlots(String uuid); + String getPlotLocation(int plotId); + String getZoneLocation(int zoneId); + + String getLocationServer(String location); } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/PlotStatus.java similarity index 95% rename from Plugin/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/PlotStatus.java index 2ffab5a1..b8406b46 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/enums/PlotStatus.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/PlotStatus.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.enums; +package net.bteuk.network.api.plotsystem; import java.util.Objects; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java similarity index 95% rename from Plugin/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java rename to Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java index ee444624..a8bbb2ef 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/enums/SubmittedStatus.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils.enums; +package net.bteuk.network.api.plotsystem; import java.util.Objects; diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 4ace037c..f4cba6b9 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -635,6 +635,14 @@ public boolean isTutorialsEnabled() { return constants.tutorials(); } + public int getMinY() { + return constants.minY(); + } + + public int getMaxY() { + return constants.maxY(); + } + @Override public void registerShutdownHook(ShutdownHook hook) { shutdownHooks.add(hook); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index 7fac0b92..44a4fa54 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; +import net.bteuk.network.api.plotsystem.PlotStatus; import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.gui.GuiProvider; @@ -10,7 +11,6 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.PlotStatus; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 737897da..1e6e7e64 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -4,7 +4,9 @@ import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; +import net.bteuk.network.api.plotsystem.PlotStatus; import net.bteuk.network.api.plotsystem.ReviewFeedback; +import net.bteuk.network.api.plotsystem.SubmittedStatus; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import net.bteuk.network.gui.GuiProvider; @@ -20,8 +22,6 @@ import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.PlotValues; import net.bteuk.network.utils.Utils; -import net.bteuk.network.utils.enums.PlotStatus; -import net.bteuk.network.utils.enums.SubmittedStatus; import net.buildtheearth.terraminusminus.generator.EarthGeneratorSettings; import net.buildtheearth.terraminusminus.projection.OutOfProjectionBoundsException; import net.kyori.adventure.text.Component; diff --git a/pom.xml b/pom.xml index ce86f258..630213c8 100644 --- a/pom.xml +++ b/pom.xml @@ -131,6 +131,37 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + false + none + UTF-8 + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar-no-fork + + + + From fae3957ca20d89ff8a7106fd881c1dea6e3cd166 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 24 Oct 2025 20:54:17 +0200 Subject: [PATCH 28/96] Fix compiler error. --- .../net/bteuk/network/api/impl/PlotAPIImpl.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 65f3d2f2..8f92bbd0 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -238,4 +238,19 @@ public int getNumberOfPlots(String uuid) { return plotSQL.getInt("SELECT count(id) FROM plot_members WHERE uuid='" + uuid + "';"); } + @Override + public String getPlotLocation(int plotId) { + return ""; + } + + @Override + public String getZoneLocation(int zoneId) { + return ""; + } + + @Override + public String getLocationServer(String location) { + return ""; + } + } From a5af8bda3d3bf35506e254260ad1f4d8ce677aa8 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 25 Oct 2025 13:18:58 +0200 Subject: [PATCH 29/96] More plot system api methods. --- .../java/net/bteuk/network/api/PlotAPI.java | 16 +++++++++ .../bteuk/network/api/impl/PlotAPIImpl.java | 36 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index dcd89ce9..45adaa5c 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -1,5 +1,7 @@ package net.bteuk.network.api; +import net.bteuk.network.api.plotsystem.PlotStatus; + import java.util.List; public interface PlotAPI { @@ -108,4 +110,18 @@ public interface PlotAPI { String getZoneLocation(int zoneId); String getLocationServer(String location); + + PlotStatus getPlotStatus(int plotId); + + int getPlotDifficulty(int plotId); + + int getPlotSize(int plotId); + + boolean isPlotUnclaimed(int plotId); + + boolean createPlotOwner(int plotId, String uuid); + + boolean hasPlotOwnerOrMember(int plotId); + + boolean isZonePublic(int zoneId); } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 8f92bbd0..79354a96 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -1,6 +1,7 @@ package net.bteuk.network.api.impl; import net.bteuk.network.api.PlotAPI; +import net.bteuk.network.api.plotsystem.PlotStatus; import net.bteuk.network.sql.PlotSQL; import java.util.List; @@ -253,4 +254,39 @@ public String getLocationServer(String location) { return ""; } + @Override + public PlotStatus getPlotStatus(int plotId) { + return null; + } + + @Override + public int getPlotDifficulty(int plotId) { + return 0; + } + + @Override + public int getPlotSize(int plotId) { + return 0; + } + + @Override + public boolean isPlotUnclaimed(int plotId) { + return plotSQL.hasRow("SELECT id FROM plot_data WHERE id=" + plotId + " AND status='unclaimed';"); + } + + @Override + public boolean createPlotOwner(int plotId, String uuid) { + return false; + } + + @Override + public boolean hasPlotOwnerOrMember(int plotId) { + return false; + } + + @Override + public boolean isZonePublic(int zoneId) { + return false; + } + } From cd774e4cd1de4dab6addc76687d1a52eb3236203 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 27 Oct 2025 21:57:27 +0100 Subject: [PATCH 30/96] More plot system api methods. --- .../java/net/bteuk/network/api/CoordinateAPI.java | 2 ++ .../java/net/bteuk/network/api/NetworkAPI.java | 2 ++ .../main/java/net/bteuk/network/api/PlotAPI.java | 14 ++++++++++++++ .../src/main/java/net/bteuk/network/Network.java | 5 ++++- .../bteuk/network/api/impl/CoordinateAPIImpl.java | 5 +++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java index b9d2fc3a..5283fff8 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java @@ -7,4 +7,6 @@ public interface CoordinateAPI { int addCoordinate(NetworkLocation location); int copyCoordinate(int coordinateID); + + void updateCoordinate(int coordinateID, NetworkLocation location); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 7ec85d72..af4b3ecd 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -14,6 +14,8 @@ public interface NetworkAPI { EventAPI getEventAPI(); + CoordinateAPI getCoordinateAPI(); + boolean isTutorialsEnabled(); int getMinY(); diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 45adaa5c..9ee74e22 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -124,4 +124,18 @@ public interface PlotAPI { boolean hasPlotOwnerOrMember(int plotId); boolean isZonePublic(int zoneId); + + int getPlotCoordinate(int plotId); + + boolean isZoneOwner(String uuid); + + int getNumberOfZones(); + + boolean plotExists(int plotId); + + List getBookPages(int bookId); + + void updatePlotCategoryFeedback(int reviewId, String category, String selection, int bookId); + + int getHighestBookId(); } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index f4cba6b9..7cdaa389 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -174,6 +174,9 @@ public final class Network extends JavaPlugin implements NetworkAPI { private final List shutdownHooks = new ArrayList<>(); + @Getter + private CoordinateAPI coordinateAPI; + @Override public void onEnable() { @@ -307,7 +310,7 @@ public void enablePlugin() { CommandManager commandManager = new CommandManager(this); - CoordinateAPI coordinateAPI = new CoordinateAPIImpl(globalSQL); + this.coordinateAPI = new CoordinateAPIImpl(globalSQL); this.eventAPI = new EventManager(globalSQL, constants); WorldGuardAPI worldGuardAPI = new WorldGuard(); diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java index 460123a9..ba2bf464 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java @@ -31,4 +31,9 @@ public int copyCoordinate(int coordinateID) { } return -1; } + + @Override + public void updateCoordinate(int coordinateID, NetworkLocation location) { + globalSQL.updateCoordinate(coordinateID, location); + } } From 653ed8c7050878a23d7a4413a8a3b5ab3f9c94e0 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 27 Oct 2025 22:01:46 +0100 Subject: [PATCH 31/96] Impl --- .../bteuk/network/api/impl/PlotAPIImpl.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 79354a96..8feba2d7 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -289,4 +289,39 @@ public boolean isZonePublic(int zoneId) { return false; } + @Override + public int getPlotCoordinate(int plotId) { + return 0; + } + + @Override + public boolean isZoneOwner(String uuid) { + return false; + } + + @Override + public int getNumberOfZones() { + return 0; + } + + @Override + public boolean plotExists(int plotId) { + return false; + } + + @Override + public List getBookPages(int bookId) { + return List.of(); + } + + @Override + public void updatePlotCategoryFeedback(int reviewId, String category, String selection, int bookId) { + + } + + @Override + public int getHighestBookId() { + return 0; + } + } From faa7ec07b297f10bd25f43271deb59629ed64cd7 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 27 Oct 2025 22:29:44 +0100 Subject: [PATCH 32/96] Removed type column from events. --- .../java/net/bteuk/network/api/EventAPI.java | 24 +++----- .../java/net/bteuk/network/api/PlotAPI.java | 2 + .../bteuk/network/api/impl/PlotAPIImpl.java | 5 ++ .../network/commands/navigation/Back.java | 2 +- .../network/commands/navigation/Home.java | 2 +- .../network/eventing/events/EventManager.java | 59 ++++++++----------- .../network/gui/plotsystem/PlotInfo.java | 8 +-- .../gui/plotsystem/PlotsystemLocations.java | 4 +- .../network/gui/plotsystem/ZoneInfo.java | 2 +- .../bteuk/network/gui/regions/RegionInfo.java | 6 +- .../java/net/bteuk/network/lobby/Map.java | 2 +- .../bteuk/network/utils/staff/Moderation.java | 2 +- .../bteuk/network/regions/RegionManager.java | 2 +- 13 files changed, 57 insertions(+), 63 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java index b3f95a1a..2f00397b 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/EventAPI.java @@ -14,50 +14,44 @@ public interface EventAPI { */ void registerEvent(String name, Event event); - void createJoinEvent(String uuid, String type, String event); + void createJoinEvent(String uuid, String event); - void createJoinEvent(String uuid, String type, String event, String message); + void createJoinEvent(String uuid, String event, String message); - void createJoinEvent(String uuid, String type, String event, Component message); + void createJoinEvent(String uuid, String event, Component message); /** * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format */ - void createEvent(String uuid, String type, String server, String event); + void createEvent(String uuid, String server, String event); /** * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format * @param message message to be sent to the player on success */ - void createEvent(String uuid, String type, String server, String event, String message); + void createEvent(String uuid, String server, String event, String message); /** * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format * @param message message to be sent to the player on success */ - void createEvent(String uuid, String type, String server, String event, Component message); + void createEvent(String uuid, String server, String event, Component message); - void createTeleportEvent(boolean join, String uuid, String type, String event, NetworkLocation previousLocation); + void createTeleportEvent(boolean join, String uuid, String event, NetworkLocation previousLocation); - void createTeleportEvent(boolean join, String uuid, String type, String event, String message, NetworkLocation previousLocation); + void createTeleportEvent(boolean join, String uuid, String event, String message, NetworkLocation previousLocation); - void createTeleportEvent(boolean join, String uuid, String type, String event, Component message, NetworkLocation previousLocation); + void createTeleportEvent(boolean join, String uuid, String event, Component message, NetworkLocation previousLocation); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 9ee74e22..647d28f7 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -127,6 +127,8 @@ public interface PlotAPI { int getPlotCoordinate(int plotId); + void updatePlotCoordinate(int plotId, int coordinateId); + boolean isZoneOwner(String uuid); int getNumberOfZones(); diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 8feba2d7..072d6976 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -294,6 +294,11 @@ public int getPlotCoordinate(int plotId) { return 0; } + @Override + public void updatePlotCoordinate(int plotId, int coordinateId) { + + } + @Override public boolean isZoneOwner(String uuid) { return false; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java index b40009fe..9ae226fc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Back.java @@ -66,7 +66,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Teleport the player to the correct server with a join event to teleport to the coordinate id. // Create teleport event for location of coordinate id - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "teleport " + globalSQL.getString("SELECT world FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( "SELECT x FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( "SELECT y FROM coordinates WHERE id=" + coordinateID + ";") + " " + globalSQL.getDouble( diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java index 0f88fa6a..2c23afca 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Home.java @@ -102,7 +102,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } else if (!constants.standalone()) { // Switch server with join event. - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport coordinateID " + coordinateId, "&aTeleported to your default home.", + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "teleport coordinateID " + coordinateId, "&aTeleported to your default home.", LocationAdapter.adapt(player.getLocation())); // Switch server. diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index 7bd40c91..e16093af 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -37,38 +37,36 @@ public void registerEvent(String name, Event event) { events.put(name, event); } - public void createJoinEvent(String uuid, String type, String event) { + public void createJoinEvent(String uuid, String event) { globalSQL.update( - "INSERT INTO join_events(uuid,type,event) " + "VALUES('" + uuid + "','" + type + "','" + event + "') " + "ON DUPLICATE KEY UPDATE type='" + type + "', event='" + event + "';"); + "INSERT INTO join_events(uuid,event) " + "VALUES('" + uuid + "','" + event + "') " + "ON DUPLICATE KEY UPDATE event='" + event + "';"); } - public void createJoinEvent(String uuid, String type, String event, String message) { + public void createJoinEvent(String uuid, String event, String message) { globalSQL.update( - "INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE " + - "type='" + type + "', event='" + event + "', message='" + message + "';"); + "INSERT INTO join_events(uuid,event,message) " + "VALUES('" + uuid + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE event='" + event + + "', message='" + message + "';"); } - public void createJoinEvent(String uuid, String type, String event, Component message) { + public void createJoinEvent(String uuid, String event, Component message) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); globalSQL.update( - "INSERT INTO join_events(uuid,type,event,message) " + "VALUES('" + uuid + "','" + type + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE " + - "type='" + type + "', event='" + event + "', message='" + messageString + "';"); + "INSERT INTO join_events(uuid,event,message) " + "VALUES('" + uuid + "','" + event + "','" + message + "') " + "ON DUPLICATE KEY " + "UPDATE event='" + event + + "', message='" + messageString + "';"); } /** * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format */ - public void createEvent(String uuid, String type, String server, String event) { + public void createEvent(String uuid, String server, String event) { if (uuid == null) { - globalSQL.update("INSERT INTO server_events(type,server,event) " + "VALUES('" + type + "','" + server + "','" + event + "');"); + globalSQL.update("INSERT INTO server_events(server,event) " + "VALUES('" + server + "','" + event + "');"); } else { - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "');"); + globalSQL.update("INSERT INTO server_events(uuid,server,event) " + "VALUES('" + uuid + "','" + server + "','" + event + "');"); } } @@ -76,18 +74,16 @@ public void createEvent(String uuid, String type, String server, String event) { * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format * @param message message to be sent to the player on success */ - public void createEvent(String uuid, String type, String server, String event, String message) { + public void createEvent(String uuid, String server, String event, String message) { if (uuid == null) { - globalSQL.update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + message + "');"); + globalSQL.update("INSERT INTO server_events(server,event,message) " + "VALUES('" + server + "','" + event + "','" + message + "');"); } else { globalSQL.update( - "INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + message + "');"); + "INSERT INTO server_events(uuid,server,event,message) " + "VALUES('" + uuid + "','" + server + "','" + event + "','" + message + "');"); } } @@ -95,57 +91,54 @@ public void createEvent(String uuid, String type, String server, String event, S * Creates an event with the following input parameters: * * @param uuid the uuid of the player to which the event should apply - * @param type the type of event, this means the plugin which should run this event (network, plotsystem or a - * custom implementation) * @param server the server name where the event should occur * @param event the event arguments in String format * @param message message to be sent to the player on success */ - public void createEvent(String uuid, String type, String server, String event, Component message) { + public void createEvent(String uuid, String server, String event, Component message) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); if (uuid == null) { - globalSQL.update("INSERT INTO server_events(type,server,event,message) " + "VALUES('" + type + "','" + server + "','" + event + "','" + messageString + "');"); + globalSQL.update("INSERT INTO server_events(server,event,message) " + "VALUES('" + server + "','" + event + "','" + messageString + "');"); } else { globalSQL.update( - "INSERT INTO server_events(uuid,type,server,event,message) " + "VALUES('" + uuid + "','" + type + "','" + server + "','" + event + "','" + messageString + - "');"); + "INSERT INTO server_events(uuid,server,event,message) " + "VALUES('" + uuid + "','" + server + "','" + event + "','" + messageString + "');"); } } - public void createTeleportEvent(boolean join, String uuid, String type, String event, NetworkLocation previousLocation) { + public void createTeleportEvent(boolean join, String uuid, String event, NetworkLocation previousLocation) { back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { - createJoinEvent(uuid, type, event); + createJoinEvent(uuid, event); } else { - createEvent(uuid, type, constants.serverName(), event); + createEvent(uuid, constants.serverName(), event); } } - public void createTeleportEvent(boolean join, String uuid, String type, String event, String message, NetworkLocation previousLocation) { + public void createTeleportEvent(boolean join, String uuid, String event, String message, NetworkLocation previousLocation) { back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { - createJoinEvent(uuid, type, event, message); + createJoinEvent(uuid, event, message); } else { - createEvent(uuid, type, constants.serverName(), event, message); + createEvent(uuid, constants.serverName(), event, message); } } - public void createTeleportEvent(boolean join, String uuid, String type, String event, Component message, NetworkLocation previousLocation) { + public void createTeleportEvent(boolean join, String uuid, String event, Component message, NetworkLocation previousLocation) { String messageString = PlainTextComponentSerializer.plainText().serialize(message); back.setPreviousCoordinate(uuid, previousLocation); // Create event if (join) { - createJoinEvent(uuid, type, event, messageString); + createJoinEvent(uuid, event, messageString); } else { - createEvent(uuid, type, constants.serverName(), event, messageString); + createEvent(uuid, constants.serverName(), event, messageString); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 1e6e7e64..5fa1ec02 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -217,7 +217,7 @@ public void createGui() { u.player.closeInventory(); // Add server event to submit plot. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + plotSQL.getString( "SELECT server FROM location_data WHERE name='" + plotSQL.getString( "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','submit plot " + plotID + "');"); }); @@ -231,7 +231,7 @@ public void createGui() { u.player.closeInventory(); // Add server event to retract plot submission. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + plotSQL.getString( "SELECT server FROM location_data WHERE name='" + plotSQL.getString( "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','retract plot " + plotID + "');"); }); @@ -267,7 +267,7 @@ public void createGui() { }, 20L); // Add server event to leave plot. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + plotSQL.getString( "SELECT server FROM location_data WHERE name='" + plotSQL.getString( "SELECT location FROM plot_data WHERE id=" + plotID + ";") + "';") + "','leave plot " + plotID + "');"); }); @@ -553,7 +553,7 @@ private void teleportToPlotOutsidePlotsystem(NetworkUser user, int plotID) { boolean switchServer = constants.serverType() != ServerType.EARTH; - eventAPI.createTeleportEvent(switchServer, user.player.getUniqueId().toString(), "network", + eventAPI.createTeleportEvent(switchServer, user.player.getUniqueId().toString(), "teleport " + constants.earthWorld() + " " + x + " " + z + " " + user.player.getLocation().getYaw() + " " + user.player.getLocation().getPitch(), PlainTextComponentSerializer.plainText().serialize(teleportMessage), LocationAdapter.adapt(user.player.getLocation())); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java index 71916948..fdf5e117 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java @@ -82,7 +82,7 @@ protected void createGui() { double y = Objects.requireNonNull(world).getHighestBlockYAt((int) x, (int) z); y++; - provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "network", + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "teleport " + name + " " + x + " " + y + " " + z + " " + u.player.getLocation().getYaw() + " " + u.player.getLocation().getPitch(), "&aTeleported to location &3" + plotSQL.getString("SELECT alias FROM " + @@ -90,7 +90,7 @@ protected void createGui() { } else { // Set the server join event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport " + name + " " + x + " " + z + " " + u.player.getLocation().getYaw() + " " + u.player.getLocation().getPitch(), "&aTeleported to location &3" + plotSQL.getString("SELECT alias FROM " + diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index d8cdd45b..817f7c73 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -182,7 +182,7 @@ public void createGui() { }, 20L); // Add server event to leave plot. - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','plotsystem','" + plotSQL.getString( + globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + plotSQL.getString( "SELECT server FROM location_data WHERE name='" + plotSQL.getString( "SELECT location FROM zones WHERE id=" + zoneID + ";") + "';") + "','leave zone " + zoneID + "');"); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index 717b657e..2f198025 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -64,7 +64,7 @@ protected void createGui() { setItem(8, Utils.createItem(Material.RED_CONCRETE, 1, Utils.title("Leave Region")), (NetworkUser u) -> { // Send leave event to server events. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"), + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), globalSQL.getString("SELECT name FROM server_data WHERE type='EARTH';"), "region leave " + region.regionName(), "&aYou have left region &3" + regionManager.getTag(region, u.player.getUniqueId().toString())); // Return to region menu and close inventory. @@ -189,8 +189,8 @@ protected void createGui() { // Make sure this is done on the correct server. // Create teleport region event. if (regionManager.hasRequests(region)) { - globalSQL.update("INSERT INTO server_events(uuid,type,server,event) VALUES('" + u.player.getUniqueId() + "','network'," + globalSQL.getString( - "SELECT name FROM server_data WHERE type='EARTH';") + "'region request accept " + region.regionName() + "');"); + globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + globalSQL.getString( + "SELECT name FROM server_data WHERE type='EARTH';") + "','region request accept " + region.regionName() + "');"); } u.player.sendMessage(ChatUtils.success("Region ").append(Component.text(regionManager.getTag(region, uuid), NamedTextColor.DARK_AQUA)) diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java index c5e2d2ce..8ed7bcaf 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java @@ -172,7 +172,7 @@ protected void teleport(Player p) { PaperLib.teleportAsync(p, mapLocation); } else { // Create teleport event. - eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), String.format("teleport %s " + "%f %f %f %f %f", constants.mapLocation().world(), mapLocation.getX(), mapLocation.getY(), mapLocation.getZ(), mapLocation.getYaw(), mapLocation.getPitch()), "&aTeleporting to the map.", LocationAdapter.adapt(p.getLocation())); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index 5848e88d..f7e90a90 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -96,7 +96,7 @@ public void unmute(String uuid) { // Kick the player. public void kick(String uuid, String reason) { // Kick them with the reason, if online. - instance.getOnlineUserByUuid(uuid).ifPresent(onlineUser -> eventAPI.createEvent(uuid, "network", onlineUser.getServer(), "kick", reason)); + instance.getOnlineUserByUuid(uuid).ifPresent(onlineUser -> eventAPI.createEvent(uuid, onlineUser.getServer(), "kick", reason)); } /** diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index 8a2db526..b6218681 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -645,7 +645,7 @@ public void leaveRegion(Region region, String uuid, Component message) { worldGuard.removeMember(region.regionName(), uuid, constants.earthWorld()); } else { - eventAPI.createEvent(uuid, "network", globalSQL.getString("SELECT name " + "FROM server_data WHERE type='EARTH';"), "region leave " + region.regionName(), message); + eventAPI.createEvent(uuid, globalSQL.getString("SELECT name " + "FROM server_data WHERE type='EARTH';"), "region leave " + region.regionName(), message); } } From f9d942623febb7f6b32642b2110939213fc89444 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 1 Nov 2025 17:01:37 +0100 Subject: [PATCH 33/96] More api methods. --- .../java/net/bteuk/network/api/CoordinateAPI.java | 6 ++++++ .../main/java/net/bteuk/network/api/PlotAPI.java | 6 ++++++ .../bteuk/network/api/impl/CoordinateAPIImpl.java | 15 +++++++++++++++ .../net/bteuk/network/api/impl/PlotAPIImpl.java | 15 +++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java index 5283fff8..c37c0a94 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/CoordinateAPI.java @@ -9,4 +9,10 @@ public interface CoordinateAPI { int copyCoordinate(int coordinateID); void updateCoordinate(int coordinateID, NetworkLocation location); + + double getX(int coordinateID); + + double getZ(int coordinateID); + + NetworkLocation getLocation(int coordinateID); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 647d28f7..a18cabb3 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -29,6 +29,8 @@ public interface PlotAPI { boolean setLocationAlias(String locationName, String alias); + String getLocationAlias(String locationName); + boolean setPlotDifficulty(int plotId, int difficulty); boolean clearZoneMembers(int zoneId); @@ -140,4 +142,8 @@ public interface PlotAPI { void updatePlotCategoryFeedback(int reviewId, String category, String selection, int bookId); int getHighestBookId(); + + int getLocationCoordMin(String location); + + int getLocationCoordMax(String location); } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java index ba2bf464..db082475 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java @@ -36,4 +36,19 @@ public int copyCoordinate(int coordinateID) { public void updateCoordinate(int coordinateID, NetworkLocation location) { globalSQL.updateCoordinate(coordinateID, location); } + + @Override + public double getX(int coordinateID) { + return 0; + } + + @Override + public double getZ(int coordinateID) { + return 0; + } + + @Override + public NetworkLocation getLocation(int coordinateID) { + return null; + } } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 072d6976..4c43d50f 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -47,6 +47,11 @@ public boolean setLocationAlias(String locationName, String alias) { return false; } + @Override + public String getLocationAlias(String locationName) { + return ""; + } + @Override public boolean setPlotDifficulty(int plotId, int difficulty) { return false; @@ -329,4 +334,14 @@ public int getHighestBookId() { return 0; } + @Override + public int getLocationCoordMin(String location) { + return 0; + } + + @Override + public int getLocationCoordMax(String location) { + return 0; + } + } From 4cb0a3c1f35270d7bc0e96eff95a22b4528cdd90 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 1 Nov 2025 17:53:06 +0100 Subject: [PATCH 34/96] Expand plotAPI added implementation for all plot api methods. --- .../java/net/bteuk/network/api/PlotAPI.java | 10 ++ .../bteuk/network/api/impl/PlotAPIImpl.java | 105 +++++++++++------- .../java/net/bteuk/network/sql/PlotSQL.java | 60 +++++++++- 3 files changed, 134 insertions(+), 41 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index a18cabb3..43e2685e 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -23,6 +23,8 @@ public interface PlotAPI { */ List getActivePlots(String serverName); + List getActivePlotsForLocation(String location); + boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform); boolean createPlotRegion(String regionName, String server, String locationName); @@ -146,4 +148,12 @@ public interface PlotAPI { int getLocationCoordMin(String location); int getLocationCoordMax(String location); + + List getLocationRegions(String location); + + boolean locationExists(String location); + + void deleteLocation(String location); + + void deleteRegionsForLocation(String location); } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 4c43d50f..29af0f70 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -2,6 +2,7 @@ import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.plotsystem.PlotStatus; +import net.bteuk.network.core.Time; import net.bteuk.network.sql.PlotSQL; import java.util.List; @@ -32,89 +33,93 @@ public List getActivePlots(String serverName) { } @Override - public boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform) { + public List getActivePlotsForLocation(String location) { + return plotSQL.getIntList("SELECT pd.id FROM plot_data AS pd WHERE pd.location='" + location + "' AND pd.status IN ('unclaimed','claimed','submitted');"); + } - return false; + @Override + public boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int zTransform) { + return plotSQL.createLocation(locationName, alias, server, coordMin, coordMax, xTransform, zTransform); } @Override public boolean createPlotRegion(String regionName, String server, String locationName) { - return false; + return plotSQL.createRegion(regionName, server, locationName); } @Override public boolean setLocationAlias(String locationName, String alias) { - return false; + return plotSQL.updateLocationAlias(locationName, alias); } @Override public String getLocationAlias(String locationName) { - return ""; + return plotSQL.getString("SELECT alias FROM location_data WHERE name='" + locationName + "';"); } @Override public boolean setPlotDifficulty(int plotId, int difficulty) { - return false; + return plotSQL.update("UPDATE plot_data SET difficulty=" + difficulty + " WHERE id=" + plotId + ";"); } @Override public boolean clearZoneMembers(int zoneId) { - return false; + return plotSQL.update("DELETE FROM zone_members WHERE id=" + zoneId + ";"); } @Override public boolean setPlotStatus(int plotId, String status) { - return false; + return plotSQL.update("UPDATE plot_data SET status='" + status + "' WHERE id=" + plotId + ";"); } @Override public boolean setZoneStatus(int zoneId, String status) { - return false; + return plotSQL.update("UPDATE zones SET status='" + status + "' WHERE id=" + zoneId + ";"); } @Override public boolean clearPlotMembers(int plotId) { - return false; + return plotSQL.update("DELETE FROM plot_members WHERE id=" + plotId + ";"); } @Override public boolean setPlotSubmissionStatus(int plotId, String status) { - return false; + return plotSQL.update("UPDATE plot_submission SET status='" + status + "' WHERE plot_id=" + plotId + ";"); } @Override public boolean removePlotSubmission(int plotId) { - return false; + return plotSQL.update("DELETE FROM plot_submission WHERE plot_id=" + plotId + ";"); } @Override public boolean createPlotMember(int plotId, String uuid) { - return false; + return plotSQL.update("INSERT INTO plot_members(id, uuid, is_owner) VALUES(" + plotId + ", '" + uuid + "', 0);"); } @Override public boolean removePlotMember(int plotId, String uuid) { - return false; + return plotSQL.update("DELETE FROM plot_members WHERE id=" + plotId + " AND uuid='" + uuid + "';"); } @Override public boolean createZoneOwner(int zoneId, String uuid) { - return false; + return plotSQL.update("INSERT INTO zone_members(id, uuid, is_owner) VALUES(" + zoneId + ", '" + uuid + "', 1);"); } @Override public boolean createZoneMember(int zoneId, String uuid) { - return false; + return plotSQL.update("INSERT INTO zone_members(id, uuid, is_owner) VALUES(" + zoneId + ", '" + uuid + "', 0);"); } @Override public boolean removeZoneMember(int zoneId, String uuid) { - return false; + return plotSQL.update("DELETE FROM zone_members WHERE id=" + zoneId + " AND uuid='" + uuid + "';"); } @Override public boolean setPlotLastEnter(int plotId, String uuid) { - return false; + return plotSQL.update("UPDATE plot_members SET last_enter='" + Time.currentTime() + "' WHERE id=" + plotId + " AND uuid='" + uuid + "';"); } @Override @@ -129,17 +134,17 @@ public boolean saveBook(int bookId, int page, String content) { @Override public boolean setPlotInactivityNotice(int plotId, String uuid) { - return false; + return plotSQL.update("UPDATE plot_members SET inactivity_notice=1 WHERE id=" + plotId + " AND uuid='" + uuid + "';"); } @Override public boolean createPlotCorner(int plotId, int cornerIndex, int x, int z) { - return false; + return plotSQL.update("INSERT INTO plot_corners(id, corner, x, z) VALUES(" + plotId + ", " + cornerIndex + ", " + x + ", " + z + ");"); } @Override public boolean createZoneCorner(int zoneId, int cornerIndex, int x, int z) { - return false; + return plotSQL.update("INSERT INTO zone_corners(id, corner, x, z) VALUES(" + zoneId + ", " + cornerIndex + ", " + x + ", " + z + ");"); } @Override @@ -246,32 +251,32 @@ public int getNumberOfPlots(String uuid) { @Override public String getPlotLocation(int plotId) { - return ""; + return plotSQL.getString("SELECT location FROM plot_data WHERE id=" + plotId + ";"); } @Override public String getZoneLocation(int zoneId) { - return ""; + return plotSQL.getString("SELECT location FROM zones WHERE id=" + zoneId + ";"); } @Override public String getLocationServer(String location) { - return ""; + return plotSQL.getString("SELECT server FROM location_data WHERE name='" + location + "';"); } @Override public PlotStatus getPlotStatus(int plotId) { - return null; + return PlotStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_data WHERE id=" + plotId + ";")); } @Override public int getPlotDifficulty(int plotId) { - return 0; + return plotSQL.getInt("SELECT difficulty FROM plot_data WHERE id=" + plotId + ";"); } @Override public int getPlotSize(int plotId) { - return 0; + return plotSQL.getInt("SELECT size FROM plot_data WHERE id=" + plotId + ";"); } @Override @@ -281,67 +286,87 @@ public boolean isPlotUnclaimed(int plotId) { @Override public boolean createPlotOwner(int plotId, String uuid) { - return false; + return plotSQL.update("INSERT INTO plot_members(id, uuid, is_owner, last_enter) VALUES(" + plotId + ", '" + uuid + "', 1, " + Time.currentTime() + ");"); } @Override public boolean hasPlotOwnerOrMember(int plotId) { - return false; + return plotSQL.hasRow("SELECT 1 FROM plot_members WHERE id=" + plotId + ";"); } @Override public boolean isZonePublic(int zoneId) { - return false; + return plotSQL.hasRow("SELECT 1 FROM zones WHERE id=" + zoneId + " AND is_public=1;"); } @Override public int getPlotCoordinate(int plotId) { - return 0; + return plotSQL.getInt("SELECT coordinate_id FROM plot_data WHERE id=" + plotId + ";"); } @Override public void updatePlotCoordinate(int plotId, int coordinateId) { - + plotSQL.update("UPDATE plot_data SET coordinate_id=" + coordinateId + " WHERE id=" + plotId + ";"); } @Override public boolean isZoneOwner(String uuid) { - return false; + return plotSQL.hasRow("SELECT 1 FROM zone_members WHERE uuid='" + uuid + "' AND is_owner=1;"); } @Override public int getNumberOfZones() { - return 0; + return plotSQL.getInt("SELECT count(id) FROM zones;"); } @Override public boolean plotExists(int plotId) { - return false; + return plotSQL.hasRow("SELECT 1 FROM plot_data WHERE id=" + plotId + ";"); } @Override public List getBookPages(int bookId) { - return List.of(); + return plotSQL.getStringList("SELECT contents FROM book_data WHERE id=" + bookId + " ORDER BY page ASC;"); } @Override public void updatePlotCategoryFeedback(int reviewId, String category, String selection, int bookId) { - + plotSQL.update("UPDATE plot_category_feedback SET category='" + category + "', selection='" + selection + "', book_id=" + bookId + " WHERE review_id=" + reviewId + ";"); } @Override public int getHighestBookId() { - return 0; + return plotSQL.getInt("SELECT MAX(id) FROM book_data;"); } @Override public int getLocationCoordMin(String location) { - return 0; + return plotSQL.getInt("SELECT coordMin FROM location_data WHERE name='" + location + "';"); } @Override public int getLocationCoordMax(String location) { - return 0; + return plotSQL.getInt("SELECT coordMax FROM location_data WHERE name='" + location + "';"); + } + + @Override + public List getLocationRegions(String location) { + return plotSQL.getStringList("SELECT region FROM regions WHERE location='" + location + "';"); + } + + @Override + public boolean locationExists(String location) { + return plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + location + "';"); + } + + @Override + public void deleteLocation(String location) { + plotSQL.update("DELETE FROM location_data WHERE name='" + location + "';"); + } + + @Override + public void deleteRegionsForLocation(String location) { + plotSQL.update("DELETE FROM regions WHERE location='" + location + "';"); } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index 4f9b5fba..1f4b546b 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -427,7 +427,7 @@ public boolean saveBook(int id, int page, String contents) { * Fetches a list of tutorial recommendations for a given plot * * @param tutorialsDBConnection Database connection for tutorials - * @param iPlotID The ID of the plot to fetch the recommended tutorials of + * @param iPlotID The ID of the plot to fetch the recommended tutorials of * @return A list of tutorial recommendations */ public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(DBConnection tutorialsDBConnection, int iPlotID) { @@ -460,4 +460,62 @@ public TutorialRecommendation[] fetchTutorialRecommendationsForPlot(DBConnection return recommendations; } + + public boolean createLocation(String locationName, String alias, String server, int coordMin, int coordMax, int xTransform, int yTransform) { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement( + "INSERT INTO location_data" + "(name, alias, server, coordMin, coordMax, xTransform, zTransform) VALUES(?, ?, ?, ?, ?, ?, ?);") + ) { + + statement.setString(1, locationName); + statement.setString(2, alias); + statement.setString(3, server); + statement.setInt(4, coordMin); + statement.setInt(5, coordMax); + statement.setInt(6, xTransform); + statement.setInt(7, yTransform); + statement.executeUpdate(); + return true; + + } catch (SQLException sql) { + log.severe("An error occurred while creating a location: " + sql); + return false; + } + } + + public boolean createRegion(String regionName, String server, String locationName) { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement("INSERT INTO regions" + "(region, server, location) VALUES(?, ?, ?);") + ) { + + statement.setString(1, regionName); + statement.setString(2, server); + statement.setString(3, locationName); + statement.executeUpdate(); + return true; + + } catch (SQLException sql) { + log.severe("An error occurred while creating a region: " + sql); + return false; + } + } + + public boolean updateLocationAlias(String location, String alias) { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement("UPDATE location_data SET alias=? WHERE name=?;") + ) { + + statement.setString(1, alias); + statement.setString(2, location); + statement.executeUpdate(); + return true; + + } catch (SQLException sql) { + log.severe("An error occurred while updating a location alias: " + sql); + return false; + } + } } From 66ae8e9052993264a1663231bf3d9a299c290369 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 2 Nov 2025 15:40:43 +0100 Subject: [PATCH 35/96] More API --- .../main/java/net/bteuk/network/api/ChatAPI.java | 3 +++ .../main/java/net/bteuk/network/api/PlotAPI.java | 5 +++++ .../main/java/net/bteuk/network/CustomChat.java | 8 ++++++++ .../src/main/java/net/bteuk/network/Network.java | 2 +- .../net/bteuk/network/api/impl/PlotAPIImpl.java | 16 +++++++++++++++- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java index d09248cf..bf65ff06 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java @@ -2,6 +2,7 @@ import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.dto.PlotMessage; public interface ChatAPI { @@ -9,4 +10,6 @@ public interface ChatAPI { void sendDirectMessage(DirectMessage directMessage); + void sendPlotMessage(PlotMessage plotMessage); + } diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 43e2685e..e422201a 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -1,6 +1,7 @@ package net.bteuk.network.api; import net.bteuk.network.api.plotsystem.PlotStatus; +import net.bteuk.network.api.plotsystem.SubmittedStatus; import java.util.List; @@ -45,6 +46,8 @@ public interface PlotAPI { boolean setPlotSubmissionStatus(int plotId, String status); + SubmittedStatus getPlotSubmissionStatus(int plotId); + boolean removePlotSubmission(int plotId); boolean createPlotMember(int plotId, String uuid); @@ -156,4 +159,6 @@ public interface PlotAPI { void deleteLocation(String location); void deleteRegionsForLocation(String location); + + void updateLastSubmit(String uuid, long time); } diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index 8e3c8500..a0dac179 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -12,6 +12,7 @@ import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.DiscordLinking; import net.bteuk.network.lib.dto.DiscordRole; +import net.bteuk.network.lib.dto.PlotMessage; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.socket.InputSocket; @@ -312,4 +313,11 @@ public void sendDirectMessage(DirectMessage message) { sendSocketMessage(message); } } + + @Override + public void sendPlotMessage(PlotMessage message) { + if (!constants.standalone()) { + sendSocketMessage(message); + } + } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 7cdaa389..1ab36c81 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -321,7 +321,7 @@ public void enablePlugin() { } if (constants.plotSystemEnabled()) { - plotAPI = new PlotAPIImpl(plotSQL); + plotAPI = new PlotAPIImpl(plotSQL, globalSQL); } // Enable tab. diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 29af0f70..e2e6b576 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -2,7 +2,9 @@ import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.plotsystem.PlotStatus; +import net.bteuk.network.api.plotsystem.SubmittedStatus; import net.bteuk.network.core.Time; +import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import java.util.List; @@ -11,8 +13,11 @@ public class PlotAPIImpl implements PlotAPI { private final PlotSQL plotSQL; - public PlotAPIImpl(PlotSQL plotSQL) { + private final GlobalSQL globalSQL; + + public PlotAPIImpl(PlotSQL plotSQL, GlobalSQL globalSQL) { this.plotSQL = plotSQL; + this.globalSQL = globalSQL; } @Override @@ -87,6 +92,11 @@ public boolean setPlotSubmissionStatus(int plotId, String status) { return plotSQL.update("UPDATE plot_submission SET status='" + status + "' WHERE plot_id=" + plotId + ";"); } + @Override + public SubmittedStatus getPlotSubmissionStatus(int plotId) { + return SubmittedStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_submission WHERE id=" + plotId + ";")); + } + @Override public boolean removePlotSubmission(int plotId) { return plotSQL.update("DELETE FROM plot_submission WHERE plot_id=" + plotId + ";"); @@ -369,4 +379,8 @@ public void deleteRegionsForLocation(String location) { plotSQL.update("DELETE FROM regions WHERE location='" + location + "';"); } + @Override + public void updateLastSubmit(String uuid, long time) { + globalSQL.update("UPDATE player_data SET last_submit=" + time + " WHERE uuid='" + uuid + "';"); + } } From 9cc10b002f458bd72ee63d88b5b554c3fc253d7c Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 2 Nov 2025 16:08:26 +0100 Subject: [PATCH 36/96] Some more API and fixed plotsystem events. --- .../java/net/bteuk/network/api/NetworkAPI.java | 2 ++ .../main/java/net/bteuk/network/api/SQLAPI.java | 2 ++ .../main/java/net/bteuk/network/CustomChat.java | 2 +- .../src/main/java/net/bteuk/network/Network.java | 1 + .../main/java/net/bteuk/network/commands/Plot.java | 8 +++++--- .../main/java/net/bteuk/network/commands/Zone.java | 2 +- .../main/java/net/bteuk/network/gui/BuildGui.java | 6 +++--- .../bteuk/network/gui/plotsystem/CloseConfirm.java | 2 +- .../network/gui/plotsystem/DeleteConfirm.java | 4 ++-- .../net/bteuk/network/gui/plotsystem/PlotInfo.java | 14 +++++++------- .../gui/plotsystem/PlotServerLocations.java | 4 ++-- .../network/gui/plotsystem/PlotsystemMembers.java | 4 ++-- .../network/gui/plotsystem/VerificationInfo.java | 8 +++----- .../net/bteuk/network/gui/plotsystem/ZoneInfo.java | 4 ++-- .../net/bteuk/network/gui/plotsystem/ZoneMenu.java | 3 +-- .../java/net/bteuk/network/gui/staff/StaffGui.java | 6 +++--- 16 files changed, 38 insertions(+), 34 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index af4b3ecd..feb0308e 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -16,6 +16,8 @@ public interface NetworkAPI { CoordinateAPI getCoordinateAPI(); + ServerAPI getServerAPI(); + boolean isTutorialsEnabled(); int getMinY(); diff --git a/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java index 9f7c9707..cf7160b4 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/SQLAPI.java @@ -8,6 +8,8 @@ public interface SQLAPI { int getInt(String sql); + long getLong(String sql); + String getString(String sql); List getStringList(String sql); diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index a0dac179..c44ebb38 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -316,7 +316,7 @@ public void sendDirectMessage(DirectMessage message) { @Override public void sendPlotMessage(PlotMessage message) { - if (!constants.standalone()) { + if (!constants.standalone() && constants.plotSystemEnabled()) { sendSocketMessage(message); } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 1ab36c81..c2bc0c40 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -167,6 +167,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { private Constants constants; + @Getter private ServerAPI serverAPI; @Getter diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index 44a4fa54..3b95f6b0 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -113,8 +113,9 @@ private void join(Player p, int plot) { if (provider.plotSQL().hasRow("SELECT id FROM plot_invites WHERE id=" + plot + " AND uuid='" + p.getUniqueId() + "';")) { // Add server event to join plot. - provider.eventAPI().createEvent(p.getUniqueId().toString(), "plotsystem", - provider.plotSQL().getString("SELECT server FROM " + "location_data WHERE name='" + provider.plotSQL().getString("SELECT location FROM plot_data WHERE id=" + plot + ";") + "';"), + provider.eventAPI().createEvent(p.getUniqueId().toString(), provider.plotSQL() + .getString("SELECT server FROM " + "location_data WHERE name='" + provider.plotSQL().getString("SELECT location FROM plot_data WHERE id=" + plot + ";" + ) + "';"), "join plot " + plot); // Remove invite. @@ -139,7 +140,8 @@ private void feedback(Player player, int plot) { // Find the latest attempt. String uuid = provider.plotSQL().getString("SELECT uuid FROM plot_members WHERE id=" + plot + " AND is_owner=1;"); - int latestAttempt = provider.plotSQL().getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); + int latestAttempt = provider.plotSQL() + .getInt("SELECT MAX(attempt) FROM plot_review WHERE plot_id=" + plot + " AND " + "uuid='" + uuid + "' AND accepted=0 AND completed=1;"); if (latestAttempt == 0) { player.sendMessage(Utils.error("There is no feedback available for this plot.")); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Zone.java b/Plugin/src/main/java/net/bteuk/network/commands/Zone.java index 98500e8d..68755a7f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Zone.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Zone.java @@ -52,7 +52,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) if (plotSQL.hasRow("SELECT id FROM zone_invites WHERE id=" + zoneID + " AND uuid='" + player.getUniqueId() + "';")) { // Add server event to join the plot. - eventAPI.createEvent(player.getUniqueId().toString(), "plotsystem", + eventAPI.createEvent(player.getUniqueId().toString(), plotSQL.getString("SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + zoneID + ";") + "';"), "join zone " + zoneID); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index 61973c7e..a71905be 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -114,12 +114,12 @@ protected void createGui() { // Set current location for /back back.setPreviousCoordinate(u.player.getUniqueId().toString(), location); - eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); + eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystemteleport plot " + id, location); } else { u.player.closeInventory(); // Set the server join event. - eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, location); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystemteleport plot " + id, location); // Teleport them to another server. serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); @@ -183,7 +183,7 @@ protected void createGui() { // Set the claim event. u.player.closeInventory(); - eventAPI.createEvent(u.player.getUniqueId().toString(), "plotsystem", constants.serverName(), "claim plot"); + eventAPI.createEvent(u.player.getUniqueId().toString(), constants.serverName(), "claim plot"); }); } else if (constants.regionsEnabled()) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java index 387f7dc2..96a6521c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/CloseConfirm.java @@ -36,7 +36,7 @@ protected void createGui() { u.player.closeInventory(); // Add server event to delete plot or zone. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), "close zone" + " " + id); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java index f6a672fd..7acf96be 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeleteConfirm.java @@ -47,7 +47,7 @@ protected void createGui() { u.sendMessage(ChatUtils.success("Deleting plot %s...", String.valueOf(id))); // Add server event to delete plot or zone. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", plotSQL.getString( + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), plotSQL.getString( "SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";") + "';"), "delete plot " + id); } else if (regionType == RegionType.ZONE) { @@ -57,7 +57,7 @@ protected void createGui() { u.sendMessage(ChatUtils.success("Deleting zone %s...", String.valueOf(id))); // Add server event to delete plot or zone. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), "delete" + " zone " + id); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 5fa1ec02..49bd7c52 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -126,12 +126,12 @@ public void createGui() { // Else teleport them to the correct server and then teleport them to the plot. NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); if (server.equals(constants.serverName())) { - eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); + eventAPI.createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystemteleport plot " + plotID, location); } else { u.player.closeInventory(); // Set the server join event. - eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + plotID, location); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystemteleport plot " + plotID, location); // Teleport them to another server. serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); @@ -180,7 +180,7 @@ public void createGui() { if (plotInfoType == PLOT_INFO_TYPE.CLAIMED_OWNER || plotInfoType == PLOT_INFO_TYPE.CLAIMED_MEMBER) { setItem(18, Utils.createItem(Material.ORANGE_STAINED_GLASS, 1, Utils.title("Toggle Outlines"), Utils.line("Enable/disable the outlines"), Utils.line("for this plot."), Utils.line("Rejoining the server"), Utils.line("will reset this to enabled.")), (NetworkUser u) -> { - eventAPI.createEvent(u.player.getUniqueId().toString(), "plotsystem", constants.serverName(), "outlines toggle " + plotID); + eventAPI.createEvent(u.player.getUniqueId().toString(), constants.serverName(), "outlines toggle " + plotID); u.player.closeInventory(); }); } @@ -346,13 +346,13 @@ public void createGui() { // the reviewing process. if (server.equals(constants.serverName())) { u.player.closeInventory(); - eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "review plot " + plotID); + eventAPI.createEvent(u.getUuid(), constants.serverName(), "review plot " + plotID); } else { u.player.closeInventory(); // Player is not on the current server. // Set the server join event. - eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); + eventAPI.createJoinEvent(u.getUuid(), "review plot " + plotID); // Teleport them to the server. serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); @@ -374,13 +374,13 @@ public void createGui() { // the reviewing process. if (server.equals(constants.serverName())) { u.player.closeInventory(); - eventAPI.createEvent(u.getUuid(), "plotsystem", constants.serverName(), "verify plot " + plotID); + eventAPI.createEvent(u.getUuid(), constants.serverName(), "verify plot " + plotID); } else { u.player.closeInventory(); // Player is not on the current server. // Set the server join event. - eventAPI.createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); + eventAPI.createJoinEvent(u.getUuid(), "verify plot " + plotID); // Teleport them to the server. serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java index 0c6a9c2c..fadece5c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotServerLocations.java @@ -228,12 +228,12 @@ protected void createGui() { u.player.closeInventory(); - provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystemteleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); } else { u.player.closeInventory(); // Set the server join event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystemteleport plot " + id, LocationAdapter.adapt(u.player.getLocation())); // Teleport them to another server. provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java index 6baffd10..7702582b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java @@ -114,7 +114,7 @@ protected void createGui() { if (plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { // Kick the member from the plot. - provider.eventAPI().createEvent(uuid, "plotsystem", plotSQL.getString( + provider.eventAPI().createEvent(uuid, plotSQL.getString( "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";" ) + "';"), "kick plot " + id); @@ -134,7 +134,7 @@ protected void createGui() { if (plotSQL.hasRow("SELECT id FROM zone_members WHERE id=" + id + " AND uuid='" + uuid + "';")) { // Kick the member from the plot. - provider.eventAPI().createEvent(uuid, "plotsystem", plotSQL.getString( + provider.eventAPI().createEvent(uuid, plotSQL.getString( "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), "kick zone " + id); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 61bd0ae2..0f522d62 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -25,7 +25,7 @@ public class VerificationInfo extends NetworkRefreshableGui { public VerificationInfo(GuiProvider provider, int verificationId) { // Create the menu. - super(provider,27, Component.text("Verification " + verificationId, NamedTextColor.AQUA, TextDecoration.BOLD)); + super(provider, 27, Component.text("Verification " + verificationId, NamedTextColor.AQUA, TextDecoration.BOLD)); this.verificationId = verificationId; @@ -137,14 +137,12 @@ protected void createGui() { // Else teleport them to the correct server and them teleport them to the plot. NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); if (server.equals(provider.constants().serverName())) { - provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + plotId, location); + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystemteleport plot " + plotId, location); } else { u.player.closeInventory(); // Set the server join event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", - "teleport plot " + plotId, location); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystemteleport plot " + plotId, location); // Teleport them to another server. provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index 817f7c73..d206ac05 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -68,12 +68,12 @@ public void createGui() { NetworkLocation location = LocationAdapter.adapt(u.player.getLocation()); if (server.equals(provider.constants().serverName())) { - provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); + provider.eventAPI().createTeleportEvent(false, u.player.getUniqueId().toString(), "plotsystemteleport zone " + zoneID, location); } else { u.player.closeInventory(); // Set the server join event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystem", "teleport zone " + zoneID, location); + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "plotsystemteleport zone " + zoneID, location); // Teleport them to another server. provider.serverAPI().switchServer(PlayerAdapter.adapt(u.player), server); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java index 91ad8a30..6b5de52b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneMenu.java @@ -83,8 +83,7 @@ protected void createGui() { (NetworkUser u) -> { // Add server event to join zone. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "plotsystem", - plotSQL.getString("SELECT server FROM location_data WHERE name='" + + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), plotSQL.getString("SELECT server FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + zones.get( finalI) + ";") + "';"), "join zone " + zones.get(finalI)); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index 4451ac41..8341b81d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -188,7 +188,7 @@ protected void createGui() { } else { // Player is not on the current server. // Set the server join event. - provider.eventAPI().createJoinEvent(u.getUuid(), "plotsystem", "review plot " + plotID); + provider.eventAPI().createJoinEvent(u.getUuid(), "review plot " + plotID); // Teleport them to the server. u.player.closeInventory(); @@ -230,11 +230,11 @@ protected void createGui() { // reviewing process. if (server.equals(constants.serverName())) { u.player.closeInventory(); - provider.eventAPI().createEvent(u.getUuid(), "plotsystem", constants.serverName(), "verify plot " + plotID); + provider.eventAPI().createEvent(u.getUuid(), constants.serverName(), "verify plot " + plotID); } else { // Player is not on the current server. // Set the server join event. - provider.eventAPI().createJoinEvent(u.getUuid(), "plotsystem", "verify plot " + plotID); + provider.eventAPI().createJoinEvent(u.getUuid(), "verify plot " + plotID); // Teleport them to the server. u.player.closeInventory(); From 0031bb73b490aa39889e2faf4a22bc07d32941a9 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 12 Nov 2025 21:22:11 +0100 Subject: [PATCH 37/96] Some more plot api methods. --- .../java/net/bteuk/network/api/PlotAPI.java | 12 ++++++--- .../api/plotsystem/SubmittedStatus.java | 11 +++++--- .../bteuk/network/api/impl/PlotAPIImpl.java | 26 +++++++++++++------ .../java/net/bteuk/network/sql/PlotSQL.java | 21 +++++++++++++++ 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index e422201a..2efd8396 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -100,15 +100,15 @@ public interface PlotAPI { boolean hasLocation(String location); - String getPlotOwner(int plotID); + String getPlotOwner(int plotId); String getZoneOwner(int zoneID); - boolean isPlotOwner(int plotID, String uuid); + boolean isPlotOwner(int plotId, String uuid); - boolean isPlotMember(int plotID, String uuid); + boolean isPlotMember(int plotId, String uuid); - boolean isPlotClaimed(int plotID); + boolean isPlotClaimed(int plotId); int getNumberOfPlots(String uuid); @@ -161,4 +161,8 @@ public interface PlotAPI { void deleteRegionsForLocation(String location); void updateLastSubmit(String uuid, long time); + + long getLastSubmit(String uuid); + + void createPlotSubmission(int plotId); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java index a8bbb2ef..04fd10f0 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/SubmittedStatus.java @@ -1,20 +1,23 @@ package net.bteuk.network.api.plotsystem; +import lombok.Getter; + import java.util.Objects; /** * Enum for the status of a submitted plot as defined in the database. */ +@Getter public enum SubmittedStatus { SUBMITTED("submitted"), UNDER_REVIEW("under review"), AWAITING_VERIFICATION("awaiting verification"), UNDER_VERIFICATION("under verification"); - public final String database_value; + private final String databaseValue; - SubmittedStatus(String database_value) { - this.database_value = database_value; + SubmittedStatus(String databaseValue) { + this.databaseValue = databaseValue; } /** @@ -25,7 +28,7 @@ public enum SubmittedStatus { */ public static SubmittedStatus fromDatabaseValue(String value) { for (SubmittedStatus status : SubmittedStatus.values()) { - if (Objects.equals(status.database_value, value)) { + if (Objects.equals(status.databaseValue, value)) { return status; } } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index e2e6b576..dc116316 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -229,8 +229,8 @@ public boolean hasLocation(String location) { } @Override - public String getPlotOwner(int plotID) { - return plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plotID + " AND is_owner=1;"); + public String getPlotOwner(int plotId) { + return plotSQL.getString("SELECT uuid FROM plot_members WHERE id=" + plotId + " AND is_owner=1;"); } @Override @@ -239,19 +239,19 @@ public String getZoneOwner(int zoneID) { } @Override - public boolean isPlotOwner(int plotID, String uuid) { - return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotID + " AND uuid='" + uuid + "' AND is_owner=1;"); + public boolean isPlotOwner(int plotId, String uuid) { + return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotId + " AND uuid='" + uuid + "' AND is_owner=1;"); } @Override - public boolean isPlotMember(int plotID, String uuid) { - return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotID + " AND uuid='" + uuid + "' AND is_owner=0;"); + public boolean isPlotMember(int plotId, String uuid) { + return plotSQL.hasRow("SELECT id FROM plot_members WHERE id=" + plotId + " AND uuid='" + uuid + "' AND is_owner=0;"); } @Override - public boolean isPlotClaimed(int plotID) { - return plotSQL.hasRow("SELECT id FROM plot_data WHERE id=" + plotID + " AND status='claimed';"); + public boolean isPlotClaimed(int plotId) { + return plotSQL.hasRow("SELECT id FROM plot_data WHERE id=" + plotId + " AND status='claimed';"); } @Override @@ -383,4 +383,14 @@ public void deleteRegionsForLocation(String location) { public void updateLastSubmit(String uuid, long time) { globalSQL.update("UPDATE player_data SET last_submit=" + time + " WHERE uuid='" + uuid + "';"); } + + @Override + public long getLastSubmit(String uuid) { + return globalSQL.getLong("SELECT last_submit FROM player_data WHERE uuid='" + uuid + "';"); + } + + @Override + public void createPlotSubmission(int plotId) { + plotSQL.createPlotSubmission(plotId); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java index 1f4b546b..f644f0a1 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/PlotSQL.java @@ -2,6 +2,8 @@ import lombok.extern.java.Log; import net.bteuk.network.api.plotsystem.SubmittedPlot; +import net.bteuk.network.api.plotsystem.SubmittedStatus; +import net.bteuk.network.core.Time; import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.enums.PlotDifficulties; import net.bteuk.network.lib.utils.Reviewing; @@ -518,4 +520,23 @@ public boolean updateLocationAlias(String location, String alias) { return false; } } + + public boolean createPlotSubmission(int plotId) { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement("INSERT INTO plot_submission(plot_id,submit_time,status,last_query) VALUES(?, ?, ?, ?);") + ) { + + statement.setInt(1, plotId); + statement.setLong(2, Time.currentTime()); + statement.setString(3, SubmittedStatus.SUBMITTED.getDatabaseValue()); + statement.setLong(4, Time.currentTime()); + statement.executeUpdate(); + return true; + + } catch (SQLException sql) { + log.severe("An error occurred while creating a location: " + sql); + return false; + } + } } From a195adc3bf2cd0b591f4f6c179a2fa0302211f24 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 10:12:31 +0100 Subject: [PATCH 38/96] Only use PlotAPI in api, not PlotSQL. --- .../java/net/bteuk/network/api/PlotAPI.java | 26 ++++ .../api/plotsystem/ReviewFeedback.java | 72 ++++------- .../bteuk/network/api/impl/PlotAPIImpl.java | 114 ++++++++++++++++++ .../gui/plotsystem/PlotsystemMembers.java | 4 +- 4 files changed, 167 insertions(+), 49 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 2efd8396..621d2339 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -1,6 +1,8 @@ package net.bteuk.network.api; import net.bteuk.network.api.plotsystem.PlotStatus; +import net.bteuk.network.api.plotsystem.ReviewCategory; +import net.bteuk.network.api.plotsystem.ReviewSelection; import net.bteuk.network.api.plotsystem.SubmittedStatus; import java.util.List; @@ -165,4 +167,28 @@ public interface PlotAPI { long getLastSubmit(String uuid); void createPlotSubmission(int plotId); + + int getDeniedPlotCount(int plotId, String uuid); + + String getPlotReviewer(int plotId, String uuid, int attempt); + + String getPlotReviewer(int reviewId); + + int getReviewId(int plotId, String uuid, int attempt); + + List getReviewCategories(int reviewId); + + ReviewSelection getReviewSelection(int reviewId, ReviewCategory category); + + int getReviewBookId(int reviewId, ReviewCategory category); + + List getVerificationCategories(int verificationId); + + ReviewSelection getVerificationSelectionOld(int verificationId, ReviewCategory category); + + int getVerificationBookIdOld(int verificationId, ReviewCategory category); + + ReviewSelection getVerificationSelectionNew(int verificationId, ReviewCategory category); + + int getVerificationBookIdNew(int verificationId, ReviewCategory category); } diff --git a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java index f94efc41..2f378c02 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java @@ -1,5 +1,6 @@ package net.bteuk.network.api.plotsystem; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.SQLAPI; import net.bteuk.network.lib.utils.ChatUtils; import net.kyori.adventure.inventory.Book; @@ -31,11 +32,11 @@ private ReviewFeedback() { * Create the feedback book for a plot review. * * @param globalSQL access to the global database - * @param plotSQL access to the plot database - * @param reviewId the id of the plot review + * @param plotAPI plot API + * @param reviewId the id of the plot review * @return the feedback book for the plot review */ - public static Book createFeedbackBook(SQLAPI globalSQL, SQLAPI plotSQL, int reviewId) { + public static Book createFeedbackBook(SQLAPI globalSQL, PlotAPI plotAPI, int reviewId) { Component firstPage = Component.empty(); @@ -46,17 +47,14 @@ public static Book createFeedbackBook(SQLAPI globalSQL, SQLAPI plotSQL, int revi .appendNewline().appendNewline()); // Reviewer - String reviewer = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + - plotSQL - .getString("SELECT reviewer FROM plot_review WHERE id=" + reviewId + ";") - + "';"); + String reviewer = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + plotAPI.getPlotReviewer(reviewId)); firstPage = firstPage.append(Component.text(String.format("Reviewer: %s", reviewer), NamedTextColor.DARK_GRAY)).appendNewline(); List pages = new ArrayList<>(); // Add each category that has a selection. - Map reviewCategoryFeedback = getReviewCategoryFeedback(globalSQL, plotSQL, reviewId); + Map reviewCategoryFeedback = getReviewCategoryFeedback(plotAPI, reviewId); for (ReviewCategory category : ReviewCategory.values()) { ReviewCategoryFeedback categoryFeedback = reviewCategoryFeedback.get(category); if (categoryFeedback == null) { @@ -64,7 +62,7 @@ public static Book createFeedbackBook(SQLAPI globalSQL, SQLAPI plotSQL, int revi } firstPage = firstPage.appendNewline(); // Add the category to the book. - firstPage = firstPage.append(addCategoryToFeedbackBook(plotSQL, categoryFeedback, pages)); + firstPage = firstPage.append(addCategoryToFeedbackBook(plotAPI, categoryFeedback, pages)); } // Insert the first page of the book at the start. @@ -80,7 +78,7 @@ public static Book createFeedbackBook(SQLAPI globalSQL, SQLAPI plotSQL, int revi * @param old true if the before view should be created * @return the feedback book for the plot verification */ - public static Book createVerificationFeedbackBook(SQLAPI plotSQL, int verificationId, boolean old) { + public static Book createVerificationFeedbackBook(PlotAPI plotAPI, int verificationId, boolean old) { Component firstPage = Component.empty(); @@ -94,7 +92,7 @@ public static Book createVerificationFeedbackBook(SQLAPI plotSQL, int verificati // Add each category that has a selection. Map verificationCategoryFeedback = - getVerificationCategoryFeedback(plotSQL, verificationId, old); + getVerificationCategoryFeedback(plotAPI, verificationId, old); for (ReviewCategory category : ReviewCategory.values()) { ReviewCategoryFeedback categoryFeedback = verificationCategoryFeedback.get(category); if (categoryFeedback == null) { @@ -102,7 +100,7 @@ public static Book createVerificationFeedbackBook(SQLAPI plotSQL, int verificati } firstPage = firstPage.appendNewline(); // Add the category to the book. - firstPage = firstPage.append(addCategoryToFeedbackBook(plotSQL, categoryFeedback, pages)); + firstPage = firstPage.append(addCategoryToFeedbackBook(plotAPI, categoryFeedback, pages)); } // Insert the first page of the book at the start. @@ -111,54 +109,35 @@ public static Book createVerificationFeedbackBook(SQLAPI plotSQL, int verificati return Book.book(REVIEW_BOOK_TITLE, Component.empty(), pages); } - private static Map getReviewCategoryFeedback(SQLAPI globalSQL, SQLAPI plotSQL, int reviewId) { + private static Map getReviewCategoryFeedback(PlotAPI plotAPI, int reviewId) { Map reviewCategoryFeedbackMap = new HashMap<>(); // Get the feedback for the review. - List reviewCategories = plotSQL.getStringList("SELECT category FROM " + - "plot_category_feedback WHERE review_id=" + reviewId + ";"); - for (String category : reviewCategories) { - reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( - ReviewCategory.valueOf(category), - ReviewSelection.valueOf(plotSQL.getString("SELECT selection FROM " + - "plot_category_feedback WHERE review_id=" + reviewId + " AND category='" + category + "';" - )), - plotSQL.getInt("SELECT book_id FROM plot_category_feedback WHERE " + - "review_id=" + reviewId + " AND category='" + category + "';") - )); + List reviewCategories = plotAPI.getReviewCategories(reviewId); + for (ReviewCategory category : reviewCategories) { + reviewCategoryFeedbackMap.put(category, + new ReviewCategoryFeedback(category, plotAPI.getReviewSelection(reviewId, category), plotAPI.getReviewBookId(reviewId, category))); } return reviewCategoryFeedbackMap; } - private static Map getVerificationCategoryFeedback(SQLAPI plotSQL, int verificationId, + private static Map getVerificationCategoryFeedback(PlotAPI plotAPI, int verificationId, boolean old) { Map reviewCategoryFeedbackMap = new HashMap<>(); // Get the feedback for the review. - List verificationCategories = plotSQL.getStringList("SELECT category FROM " + - "plot_verification_category WHERE verification_id=" + verificationId + ";"); - for (String category : verificationCategories) { + List verificationCategories = plotAPI.getVerificationCategories(verificationId); + for (ReviewCategory category : verificationCategories) { if (old) { - reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( - ReviewCategory.valueOf(category), - ReviewSelection.valueOf(plotSQL.getString("SELECT selection_old " + - "FROM plot_verification_category WHERE verification_id=" + verificationId + " AND " + - "category='" + category + "';")), - plotSQL.getInt("SELECT book_id_old FROM plot_verification_category" + - " WHERE verification_id=" + verificationId + " AND category='" + category + "';") - )); + reviewCategoryFeedbackMap.put(category, + new ReviewCategoryFeedback(category, plotAPI.getVerificationSelectionOld(verificationId, category), + plotAPI.getVerificationBookIdOld(verificationId, category))); } else { - reviewCategoryFeedbackMap.put(ReviewCategory.valueOf(category), new ReviewCategoryFeedback( - ReviewCategory.valueOf(category), - ReviewSelection.valueOf(plotSQL.getString("SELECT selection_new " + - "FROM plot_verification_category WHERE verification_id=" + verificationId + " AND " + - "category='" + category + "';")), - plotSQL.getInt("SELECT book_id_new FROM plot_verification_category" + - " WHERE verification_id=" + verificationId + " AND category='" + category + "';") - )); + reviewCategoryFeedbackMap.put(category, new ReviewCategoryFeedback(category, plotAPI.getVerificationSelectionNew(verificationId, category), + plotAPI.getVerificationBookIdNew(verificationId, category))); } } @@ -166,7 +145,7 @@ private static Map getVerificationCatego } @NotNull - private static Component addCategoryToFeedbackBook(SQLAPI plotSQL, ReviewCategoryFeedback categoryFeedback, List pages) { + private static Component addCategoryToFeedbackBook(PlotAPI plotAPI, ReviewCategoryFeedback categoryFeedback, List pages) { Component line = Component.empty(); Component category = Component.text(categoryFeedback.category().getDisplayName(), @@ -174,8 +153,7 @@ private static Component addCategoryToFeedbackBook(SQLAPI plotSQL, ReviewCategor // Add the feedback to the book if it exists. if (categoryFeedback.bookId() != 0) { - List sPages = plotSQL.getStringList("SELECT contents FROM " + - "book_data WHERE id=" + categoryFeedback.bookId() + " ORDER BY page ASC;"); + List sPages = plotAPI.getBookPages(categoryFeedback.bookId()); category = category.clickEvent(getGotoFeedbackClickEvent(pages.size() + 2)) .hoverEvent(HoverEvent.showText(Component.text(String.format("Click to go view %s feedback.", diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index dc116316..5595cfbd 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -2,11 +2,14 @@ import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.plotsystem.PlotStatus; +import net.bteuk.network.api.plotsystem.ReviewCategory; +import net.bteuk.network.api.plotsystem.ReviewSelection; import net.bteuk.network.api.plotsystem.SubmittedStatus; import net.bteuk.network.core.Time; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; +import java.util.ArrayList; import java.util.List; public class PlotAPIImpl implements PlotAPI { @@ -393,4 +396,115 @@ public long getLastSubmit(String uuid) { public void createPlotSubmission(int plotId) { plotSQL.createPlotSubmission(plotId); } + + @Override + public int getDeniedPlotCount(int plotId, String uuid) { + return plotSQL.getInt("SELECT COUNT(attempt) FROM plot_review WHERE plot_id=" + plotId + " AND uuid='" + uuid + "' AND completed=1 AND accepted=0;"); + } + + @Override + public String getPlotReviewer(int plotId, String uuid, int attempt) { + return plotSQL.getString("SELECT reviewer FROM plot_review WHERE plot_id=" + plotId + " AND uuid='" + uuid + "' AND attempt=" + attempt + ";"); + } + + @Override + public String getPlotReviewer(int reviewId) { + return plotSQL.getString("SELECT reviewer FROM plot_review WHERE review_id=" + reviewId + ";"); + } + + @Override + public int getReviewId(int plotId, String uuid, int attempt) { + return plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotId + " AND uuid='" + uuid + "' AND attempt=" + attempt + ";"); + } + + @Override + public List getReviewCategories(int reviewId) { + List reviewCategories = new ArrayList<>(); + + List categories = plotSQL.getStringList("SELECT category FROM plot_category_feedback WHERE review_id=" + reviewId + ";"); + + for (String category : categories) { + try { + reviewCategories.add(ReviewCategory.valueOf(category)); + } catch (IllegalArgumentException e) { + // Ignore, don't add the category to the list since it is no longer a valid category. + } + } + + return reviewCategories; + } + + @Override + public ReviewSelection getReviewSelection(int reviewId, ReviewCategory category) { + String selection = plotSQL.getString("SELECT selection FROM plot_category_feedback WHERE review_id=" + reviewId + " AND category='" + category + "';"); + ReviewSelection reviewSelection; + + try { + reviewSelection = ReviewSelection.valueOf(selection); + } catch (IllegalArgumentException e) { + reviewSelection = ReviewSelection.NONE; + } + + return reviewSelection; + } + + @Override + public int getReviewBookId(int reviewId, ReviewCategory category) { + return plotSQL.getInt("SELECT book_id FROM plot_category_feedback WHERE review_id=" + reviewId + " AND category='" + category + "';"); + } + + @Override + public List getVerificationCategories(int verificationId) { + List verificationCategories = new ArrayList<>(); + + List categories = plotSQL.getStringList("SELECT category FROM plot_verification_category WHERE verification_id=" + verificationId + ";"); + + for (String category : categories) { + try { + verificationCategories.add(ReviewCategory.valueOf(category)); + } catch (IllegalArgumentException e) { + // Ignore, don't add the category to the list since it is no longer a valid category. + } + } + + return verificationCategories; + } + + @Override + public ReviewSelection getVerificationSelectionOld(int verificationId, ReviewCategory category) { + String selection = plotSQL.getString("SELECT selection_old FROM plot_verification_category WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + ReviewSelection reviewSelection; + + try { + reviewSelection = ReviewSelection.valueOf(selection); + } catch (IllegalArgumentException e) { + reviewSelection = ReviewSelection.NONE; + } + + return reviewSelection; + } + + @Override + public int getVerificationBookIdOld(int verificationId, ReviewCategory category) { + return plotSQL.getInt("SELECT book_id_old FROM plot_category_feedback WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + } + + @Override + public ReviewSelection getVerificationSelectionNew(int verificationId, ReviewCategory category) { + String selection = plotSQL.getString("SELECT selection_new FROM plot_verification_category WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + ReviewSelection reviewSelection; + + try { + reviewSelection = ReviewSelection.valueOf(selection); + } catch (IllegalArgumentException e) { + reviewSelection = ReviewSelection.NONE; + } + + return reviewSelection; + } + + @Override + public int getVerificationBookIdNew(int verificationId, ReviewCategory category) { + return plotSQL.getInt("SELECT book_id_new FROM plot_category_feedback WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java index 7702582b..8386dd04 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemMembers.java @@ -117,7 +117,7 @@ protected void createGui() { provider.eventAPI().createEvent(uuid, plotSQL.getString( "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM plot_data WHERE id=" + id + ";" ) + "';"), - "kick plot " + id); + "plotsystemkick plot " + id); // Return to the previous menu, since otherwise the gui won't have updated. this.delete(); @@ -136,7 +136,7 @@ protected void createGui() { // Kick the member from the plot. provider.eventAPI().createEvent(uuid, plotSQL.getString( "SELECT server " + "FROM location_data WHERE name='" + plotSQL.getString("SELECT location FROM zones WHERE id=" + id + ";") + "';"), - "kick zone " + id); + "plotsystemkick zone " + id); // Return to the previous menu, since otherwise the gui won't have updated. this.delete(); From 209469c57c6c109f31ecf94311efe8952ef4c237 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 10:22:10 +0100 Subject: [PATCH 39/96] Fix compiler errors. --- Plugin/src/main/java/net/bteuk/network/commands/Plot.java | 2 +- .../bteuk/network/gui/plotsystem/DeniedPlotFeedback.java | 5 ++++- .../java/net/bteuk/network/gui/plotsystem/PlotInfo.java | 5 ++++- .../net/bteuk/network/gui/plotsystem/VerificationInfo.java | 7 +++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java index 3b95f6b0..9987607b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Plot.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Plot.java @@ -157,7 +157,7 @@ private void feedback(Player player, int plot) { int reviewId = provider.plotSQL().getInt("SELECT id FROM plot_review WHERE plot_id=" + plot + " AND uuid='" + uuid + "' " + "AND attempt=" + latestAttempt + ";"); // Open the book. - player.openBook(ReviewFeedback.createFeedbackBook(provider.globalSQL(), provider.plotSQL(), reviewId)); + player.openBook(ReviewFeedback.createFeedbackBook(provider.globalSQL(), provider.plotAPI(), reviewId)); } private void error(Player p) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java index 516e45f2..b2e52c59 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/DeniedPlotFeedback.java @@ -1,5 +1,6 @@ package net.bteuk.network.gui.plotsystem; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.gui.NetworkRefreshableGui; @@ -14,6 +15,7 @@ public class DeniedPlotFeedback extends NetworkRefreshableGui { + private final PlotAPI plotAPI; private final PlotSQL plotSQL; private final GlobalSQL globalSQL; @@ -24,6 +26,7 @@ public DeniedPlotFeedback(GuiProvider provider, int plotID) { super(provider, 45, Component.text("Plot " + plotID + " feedback", NamedTextColor.AQUA, TextDecoration.BOLD)); this.plotID = plotID; + this.plotAPI = provider.plotAPI(); this.plotSQL = provider.plotSQL(); this.globalSQL = provider.globalSQL(); } @@ -66,7 +69,7 @@ protected void createGui() { int reviewId = plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotID + " AND " + "uuid='" + uuid + "' AND attempt=" + finalI + ";"); // Open the book. - u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotSQL, reviewId)); + u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotAPI, reviewId)); }); // Increase the slot accordingly. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java index 49bd7c52..73122c79 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotInfo.java @@ -2,6 +2,7 @@ import lombok.Setter; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.api.plotsystem.PlotStatus; @@ -40,6 +41,7 @@ public class PlotInfo extends NetworkRefreshableGui { private final int plotID; private final NetworkUser user; + private final PlotAPI plotAPI; private final PlotSQL plotSQL; private final GlobalSQL globalSQL; private final Constants constants; @@ -58,6 +60,7 @@ public PlotInfo(GuiProvider provider, NetworkUser user, int plotID) { this.user = user; this.plotID = plotID; + this.plotAPI = provider.plotAPI(); this.plotSQL = provider.plotSQL(); this.globalSQL = provider.globalSQL(); this.constants = provider.constants(); @@ -297,7 +300,7 @@ public void createGui() { "SELECT id FROM plot_review WHERE uuid='" + u.getUuid() + "' " + "AND plot_id=" + plotID + " AND accepted=1 AND completed=1;"); // Open the feedback book. - u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotSQL, reviewId)); + u.player.openBook(ReviewFeedback.createFeedbackBook(globalSQL, plotAPI, reviewId)); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java index 0f522d62..7f235485 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationInfo.java @@ -1,5 +1,6 @@ package net.bteuk.network.gui.plotsystem; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.api.plotsystem.ReviewFeedback; import net.bteuk.network.gui.GuiProvider; @@ -19,6 +20,7 @@ public class VerificationInfo extends NetworkRefreshableGui { private final int verificationId; + private final PlotAPI plotAPI; private final PlotSQL plotSQL; private final GlobalSQL globalSQL; @@ -29,6 +31,7 @@ public VerificationInfo(GuiProvider provider, int verificationId) { this.verificationId = verificationId; + this.plotAPI = provider.plotAPI(); this.plotSQL = provider.plotSQL(); this.globalSQL = provider.globalSQL(); } @@ -107,7 +110,7 @@ protected void createGui() { Utils.line("altered by the verifier.")), (NetworkUser u) -> { // Open the feedback book. - u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotSQL, verificationId, true)); + u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotAPI, verificationId, true)); }); // If the selection or feedback was changed show the before and after books. @@ -118,7 +121,7 @@ protected void createGui() { Utils.line("altered by the verifier.")), (NetworkUser u) -> { // Open the feedback book. - u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotSQL, verificationId, false)); + u.player.openBook(ReviewFeedback.createVerificationFeedbackBook(plotAPI, verificationId, false)); }); // Teleport to the plot. From 96f5dcec269757c37d517d2ce56ed6293c94d553 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 10:45:33 +0100 Subject: [PATCH 40/96] RoleAPI for the plotsystem. --- .../net/bteuk/network/api/NetworkAPI.java | 2 ++ .../java/net/bteuk/network/api/RoleApi.java | 22 ++++++++++++++ .../net/bteuk/network/api/entity}/Role.java | 2 +- .../java/net/bteuk/network/CustomChat.java | 2 +- .../main/java/net/bteuk/network/Network.java | 24 ++++++++------- .../java/net/bteuk/network/TabManager.java | 2 +- .../net/bteuk/network/commands/Discord.java | 2 +- .../java/net/bteuk/network/commands/Help.java | 2 +- .../network/commands/PromotionAction.java | 4 +-- .../network/gui/tutorials/TutorialsGui.java | 2 +- .../services/NetworkPromotionService.java | 6 ++-- .../net/bteuk/network/utils/NetworkUser.java | 1 + .../java/net/bteuk/network/utils/Roles.java | 29 ++++++++++++++----- 13 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 Network-API/src/main/java/net/bteuk/network/api/RoleApi.java rename {Plugin/src/main/java/net/bteuk/network/utils => Network-API/src/main/java/net/bteuk/network/api/entity}/Role.java (95%) diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index feb0308e..c836b56e 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -18,6 +18,8 @@ public interface NetworkAPI { ServerAPI getServerAPI(); + RoleApi getRoleAPI(); + boolean isTutorialsEnabled(); int getMinY(); diff --git a/Network-API/src/main/java/net/bteuk/network/api/RoleApi.java b/Network-API/src/main/java/net/bteuk/network/api/RoleApi.java new file mode 100644 index 00000000..2bad2ca5 --- /dev/null +++ b/Network-API/src/main/java/net/bteuk/network/api/RoleApi.java @@ -0,0 +1,22 @@ +package net.bteuk.network.api; + +import net.bteuk.network.api.entity.Role; +import net.kyori.adventure.text.Component; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public interface RoleApi { + + Set getRoles(); + + /** + * Get the builder role for a potentially offline player. + * + * @param uuid the uuid of the player + * @return a {@link CompletableFuture} with a String + */ + CompletableFuture getBuilderRole(String uuid); + + CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, boolean announce); +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Role.java b/Network-API/src/main/java/net/bteuk/network/api/entity/Role.java similarity index 95% rename from Plugin/src/main/java/net/bteuk/network/utils/Role.java rename to Network-API/src/main/java/net/bteuk/network/api/entity/Role.java index 22b2262d..585b45af 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Role.java +++ b/Network-API/src/main/java/net/bteuk/network/api/entity/Role.java @@ -1,4 +1,4 @@ -package net.bteuk.network.utils; +package net.bteuk.network.api.entity; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index c44ebb38..0baf9a3a 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -3,6 +3,7 @@ import io.papermc.paper.event.player.AsyncChatEvent; import lombok.extern.java.Log; import net.bteuk.network.api.ChatAPI; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.Afk; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; @@ -21,7 +22,6 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index c2bc0c40..59289882 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -177,6 +177,9 @@ public final class Network extends JavaPlugin implements NetworkAPI { @Getter private CoordinateAPI coordinateAPI; + + @Getter + private Roles roleAPI; @Override public void onEnable() { @@ -315,7 +318,7 @@ public void enablePlugin() { this.eventAPI = new EventManager(globalSQL, constants); WorldGuardAPI worldGuardAPI = new WorldGuard(); - Roles roles = new Roles(this, plotSQL); + roleAPI = new Roles(this, plotSQL); if (!constants.standalone()) { serverAPI = new SwitchServer(this, constants); @@ -327,7 +330,7 @@ public void enablePlugin() { // Enable tab. if (!constants.standalone()) { - tab = new TabManager(this, constants, roles); + tab = new TabManager(this, constants, roleAPI); } Afk afk = new Afk(this); @@ -338,8 +341,9 @@ public void enablePlugin() { Moderation moderation = new Moderation(this, eventAPI); // Enables chat, both global chat and normal chat are handled through it. - chat = new CustomChat(this, constants, afk, globalSQL, moderation, roles); + chat = new CustomChat(this, constants, afk, globalSQL, moderation, roleAPI); afk.registerChat(chat); + roleAPI.registerChat(chat); // Create the region manager if enabled. if (constants.regionsEnabled()) { @@ -349,7 +353,7 @@ public void enablePlugin() { // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roles, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); + Connect connect = new Connect(this, constants, tab, roleAPI, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); new SocketHandlerImpl(this, chat, tab, connect); // Create the navigator. @@ -409,13 +413,13 @@ public void enablePlugin() { */ commandManager.registerCommand(new Buildings(this, constants)); if (!constants.standalone()) { - commandManager.registerCommand(new Discord(this, chat, roles, constants)); + commandManager.registerCommand(new Discord(this, chat, roleAPI, constants)); commandManager.registerCommand(new Focus(this, constants)); } commandManager.registerCommand(nightvision); commandManager.registerCommand(new Speed()); - commandManager.registerCommand(new Help(constants, roles)); + commandManager.registerCommand(new Help(constants, roleAPI)); commandManager.registerCommand(new Rules(lobby)); commandManager.registerCommand(new Clear()); commandManager.registerCommand(new GiveDebugStick(this)); @@ -449,13 +453,13 @@ public void enablePlugin() { commandManager.registerCommand(new Reply(chat)); } - commandManager.registerCommand(new Promote(this, roles, chat)); - commandManager.registerCommand(new Demote(this, roles, chat)); + commandManager.registerCommand(new Promote(this, roleAPI, chat)); + commandManager.registerCommand(new Demote(this, roleAPI, chat)); commandManager.registerCommand(new Me()); Navigator navigator = new Navigator(this, networkGuiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventAPI, serverAPI, - nightvision, roles, tutorialsDBConnection, chat, moderation); + nightvision, roleAPI, tutorialsDBConnection, chat, moderation); commandManager.registerCommand(navigator); new PlayerInteract(this, navigator); @@ -512,7 +516,7 @@ public void enablePlugin() { if (constants.tutorials()) { try { Class.forName("net.bteuk.teachingtutorials.services.PromotionService"); - PromotionService promotionService = new NetworkPromotionService(roles, chat); + PromotionService promotionService = new NetworkPromotionService(roleAPI, chat); this.getServer().getServicesManager().register(PromotionService.class, promotionService, this, ServicePriority.High); log.info("Registered Network Promotion Service"); } catch (ClassNotFoundException e) { diff --git a/Plugin/src/main/java/net/bteuk/network/TabManager.java b/Plugin/src/main/java/net/bteuk/network/TabManager.java index be8062f6..f16c0647 100644 --- a/Plugin/src/main/java/net/bteuk/network/TabManager.java +++ b/Plugin/src/main/java/net/bteuk/network/TabManager.java @@ -10,11 +10,11 @@ import com.comphenix.protocol.events.PacketListener; import com.comphenix.protocol.wrappers.PlayerInfoData; import lombok.extern.java.Log; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.api.entity.ShutdownHook; import net.bteuk.network.core.Constants; import net.bteuk.network.lib.dto.AddTeamEvent; import net.bteuk.network.lib.dto.TabPlayer; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java index ff7d1fa9..87d513df 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; @@ -11,7 +12,6 @@ import net.bteuk.network.lib.dto.DiscordRole; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Help.java b/Plugin/src/main/java/net/bteuk/network/commands/Help.java index 6c1fb213..724b03b1 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Help.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Help.java @@ -1,10 +1,10 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java index 3eda7722..34e0b48f 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PromotionAction.java @@ -2,10 +2,10 @@ import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.commands.tabcompleters.MultiArgSelector; import net.bteuk.network.commands.tabcompleters.PlayerSelector; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; @@ -51,7 +51,7 @@ public void onCommand(CommandSender sender, String[] args, boolean demote) { return; } - CompletableFuture resultFuture = roles.alterRole(uuid, name, args[1], demote, false, chat); + CompletableFuture resultFuture = roles.alterRole(uuid, name, args[1], demote, false); Executors.newSingleThreadExecutor().submit(() -> resultFuture.thenAcceptAsync(sender::sendMessage).join()); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java index 44491573..702fa400 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java @@ -2,9 +2,9 @@ import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Role; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java b/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java index ae80773b..006fb1f0 100644 --- a/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java +++ b/Plugin/src/main/java/net/bteuk/network/services/NetworkPromotionService.java @@ -1,7 +1,7 @@ package net.bteuk.network.services; import net.bteuk.network.CustomChat; -import net.bteuk.network.utils.Role; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.utils.Roles; import net.bteuk.teachingtutorials.services.PromotionService; import org.bukkit.entity.Player; @@ -22,8 +22,8 @@ public void promote(Player player) { Role currentRole = roles.builderRole(player); if (currentRole != null && currentRole.getId().equals("default")) { - roles.alterRole(player.getUniqueId().toString(), player.getName(), "applicant", false, true, chat).join(); - roles.alterRole(player.getUniqueId().toString(), player.getName(), "default", false, true, chat).join(); + roles.alterRole(player.getUniqueId().toString(), player.getName(), "applicant", false, true).join(); + roles.alterRole(player.getUniqueId().toString(), player.getName(), "default", false, true).join(); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 78f076df..01816971 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -4,6 +4,7 @@ import lombok.Setter; import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index c62e4a2f..1f8a94cf 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -3,6 +3,8 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.api.RoleApi; +import net.bteuk.network.api.entity.Role; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.DiscordRole; @@ -31,7 +33,7 @@ import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; @Log -public final class Roles { +public final class Roles implements RoleApi { private static final Component PROMOTION_TEMPLATE = Component.text(" has been promoted to "); private static final Component PROMOTION_SELF = Component.text("You have been promoted to "); @@ -42,12 +44,20 @@ public final class Roles { private final Network instance; private final PlotSQL plotSQL; + private CustomChat customChat; public Roles(Network instance, PlotSQL plotSQL) { this.instance = instance; this.plotSQL = plotSQL; } + public void registerChat(CustomChat customChat) { + if (this.customChat == null) { + this.customChat = customChat; + } + } + + @Override public Set getRoles() { if (ROLES == null) { loadRoles(); @@ -93,7 +103,8 @@ public Role builderRole(Player p) { * @param uuid the uuid of the player * @return a {@link CompletableFuture} with a String */ - public static CompletableFuture builderRole(String uuid) { + @Override + public CompletableFuture getBuilderRole(String uuid) { return CompletableFuture.supplyAsync(() -> { CompletableFuture isReviewer = Permissions.hasGroup(uuid, "reviewer"); CompletableFuture isArchitect = Permissions.hasGroup(uuid, "architect"); @@ -172,7 +183,11 @@ private void loadRoles() { * @return {@link CompletableFuture} completableFuture with {@link Component} message. */ public CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, - boolean announce, CustomChat customChat) { + boolean announce) { + + if (customChat == null) { + throw new IllegalStateException("CustomChat is not initialized."); + } // Get the configured group. Role role = getRoleById(roleId); @@ -223,11 +238,11 @@ public CompletableFuture alterRole(String uuid, String name, String r customChat.sendSocketMessage(discordRole); if (announce && !remove) { - sendPromotionChatMessage(name, role, customChat); + sendPromotionChatMessage(name, role); } if (!remove) { - sendPromotionDirectMessage(uuid, role, customChat); + sendPromotionDirectMessage(uuid, role); } if (remove) { @@ -238,7 +253,7 @@ public CompletableFuture alterRole(String uuid, String name, String r }); } - private void sendPromotionChatMessage(String name, Role role, CustomChat customChat) { + private void sendPromotionChatMessage(String name, Role role) { Component message = Component.text(name) .append(PROMOTION_TEMPLATE) .append(role.getColouredRoleName()) @@ -246,7 +261,7 @@ private void sendPromotionChatMessage(String name, Role role, CustomChat customC customChat.sendChatMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); } - private void sendPromotionDirectMessage(String uuid, Role role, CustomChat customChat) { + private void sendPromotionDirectMessage(String uuid, Role role) { Component message = PROMOTION_SELF .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); From 0e7609f021ccbddba783f45d9d2e63fa2e5c3ea5 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 10:48:11 +0100 Subject: [PATCH 41/96] Send discord message in ChatAPI --- .../src/main/java/net/bteuk/network/api/ChatAPI.java | 3 +++ Plugin/src/main/java/net/bteuk/network/CustomChat.java | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java index bf65ff06..3a969e1d 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/ChatAPI.java @@ -2,6 +2,7 @@ import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.dto.DiscordDirectMessage; import net.bteuk.network.lib.dto.PlotMessage; public interface ChatAPI { @@ -12,4 +13,6 @@ public interface ChatAPI { void sendPlotMessage(PlotMessage plotMessage); + void sendDiscordDirectMessage(DiscordDirectMessage discordDirectMessage); + } diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index 0baf9a3a..d29aed3d 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -11,6 +11,7 @@ import net.bteuk.network.lib.dto.AbstractTransferObject; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.lib.dto.DiscordDirectMessage; import net.bteuk.network.lib.dto.DiscordLinking; import net.bteuk.network.lib.dto.DiscordRole; import net.bteuk.network.lib.dto.PlotMessage; @@ -314,6 +315,12 @@ public void sendDirectMessage(DirectMessage message) { } } + public void sendDiscordDirectMessage(DiscordDirectMessage message) { + if (!constants.standalone()) { + sendSocketMessage(message); + } + } + @Override public void sendPlotMessage(PlotMessage message) { if (!constants.standalone() && constants.plotSystemEnabled()) { From b2bca83c86c8a4f8429651d224132dc76091d1cb Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 10:49:29 +0100 Subject: [PATCH 42/96] Naming convention API --- .../src/main/java/net/bteuk/network/api/NetworkAPI.java | 2 +- .../java/net/bteuk/network/api/{RoleApi.java => RoleAPI.java} | 2 +- Plugin/src/main/java/net/bteuk/network/utils/Roles.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename Network-API/src/main/java/net/bteuk/network/api/{RoleApi.java => RoleAPI.java} (95%) diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index c836b56e..05a6ca97 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -18,7 +18,7 @@ public interface NetworkAPI { ServerAPI getServerAPI(); - RoleApi getRoleAPI(); + RoleAPI getRoleAPI(); boolean isTutorialsEnabled(); diff --git a/Network-API/src/main/java/net/bteuk/network/api/RoleApi.java b/Network-API/src/main/java/net/bteuk/network/api/RoleAPI.java similarity index 95% rename from Network-API/src/main/java/net/bteuk/network/api/RoleApi.java rename to Network-API/src/main/java/net/bteuk/network/api/RoleAPI.java index 2bad2ca5..953cb0ca 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/RoleApi.java +++ b/Network-API/src/main/java/net/bteuk/network/api/RoleAPI.java @@ -6,7 +6,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; -public interface RoleApi { +public interface RoleAPI { Set getRoles(); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 1f8a94cf..9180b163 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -3,7 +3,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; -import net.bteuk.network.api.RoleApi; +import net.bteuk.network.api.RoleAPI; import net.bteuk.network.api.entity.Role; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; @@ -33,7 +33,7 @@ import static net.bteuk.network.lib.enums.ChatChannels.GLOBAL; @Log -public final class Roles implements RoleApi { +public final class Roles implements RoleAPI { private static final Component PROMOTION_TEMPLATE = Component.text(" has been promoted to "); private static final Component PROMOTION_SELF = Component.text("You have been promoted to "); From 99dfad6f058c140850bcddd76f8439b29ef9b226 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 11:02:08 +0100 Subject: [PATCH 43/96] More PlotAPI methods for verification. --- .../java/net/bteuk/network/api/PlotAPI.java | 8 ++++++++ .../bteuk/network/api/impl/PlotAPIImpl.java | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 621d2339..021a610d 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -176,6 +176,8 @@ public interface PlotAPI { int getReviewId(int plotId, String uuid, int attempt); + int getActiveReviewId(int plotId); + List getReviewCategories(int reviewId); ReviewSelection getReviewSelection(int reviewId, ReviewCategory category); @@ -191,4 +193,10 @@ public interface PlotAPI { ReviewSelection getVerificationSelectionNew(int verificationId, ReviewCategory category); int getVerificationBookIdNew(int verificationId, ReviewCategory category); + + void completeReview(int reviewId, boolean accepted); + + void updateReviewerReputation(String uuid, double reputation); + + boolean getReviewOutcome(int reviewId); } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 5595cfbd..1101b0fa 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -417,6 +417,11 @@ public int getReviewId(int plotId, String uuid, int attempt) { return plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotId + " AND uuid='" + uuid + "' AND attempt=" + attempt + ";"); } + @Override + public int getActiveReviewId(int plotId) { + return plotSQL.getInt("SELECT id FROM plot_review WHERE plot_id=" + plotId + " AND completed=0;"); + } + @Override public List getReviewCategories(int reviewId) { List reviewCategories = new ArrayList<>(); @@ -507,4 +512,19 @@ public ReviewSelection getVerificationSelectionNew(int verificationId, ReviewCat public int getVerificationBookIdNew(int verificationId, ReviewCategory category) { return plotSQL.getInt("SELECT book_id_new FROM plot_category_feedback WHERE verification_id=" + verificationId + " AND category='" + category + "';"); } + + @Override + public void completeReview(int reviewId, boolean accepted) { + plotSQL.update("UPDATE plot_review SET accepted=" + accepted + ", completed=1 WHERE id=" + reviewId + ";"); + } + + @Override + public void updateReviewerReputation(String uuid, double reputation) { + plotSQL.update("UPDATE reviewers SET reputation=" + reputation + " WHERE uuid='" + uuid + "';"); + } + + @Override + public boolean getReviewOutcome(int reviewId) { + return plotSQL.getBoolean("SELECT accepted FROM plot_review WHERE id=" + reviewId + ";"); + } } From 0c82879524e4e908a600552b3c313162ef6dad48 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 15 Nov 2025 11:55:15 +0100 Subject: [PATCH 44/96] PlotAPI methods for inactivity. --- .../java/net/bteuk/network/api/PlotAPI.java | 6 ++++++ .../bteuk/network/api/impl/PlotAPIImpl.java | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index 021a610d..f4f9a09e 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -199,4 +199,10 @@ public interface PlotAPI { void updateReviewerReputation(String uuid, double reputation); boolean getReviewOutcome(int reviewId); + + List getClaimedPlotsLastEnteredBetweenWithoutInactivityNoticeForServer(long timeMin, long timeMax, String server); + + List getInactivePlotsForServer(long inactivityTime, String server); + + List getExpiredZonesForServer(long expiryTime, String server); } diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 1101b0fa..fc02a01d 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -527,4 +527,25 @@ public void updateReviewerReputation(String uuid, double reputation) { public boolean getReviewOutcome(int reviewId) { return plotSQL.getBoolean("SELECT accepted FROM plot_review WHERE id=" + reviewId + ";"); } + + @Override + public List getClaimedPlotsLastEnteredBetweenWithoutInactivityNoticeForServer(long timeMin, long timeMax, String server) { + return plotSQL.getIntList("SELECT pm.id FROM plot_members AS pm INNER JOIN plot_data AS pd ON pd.id=pm.id " + + "WHERE pm.is_owner=1 AND pm.last_enter>=" + timeMin + " AND pm.last_enter<" + timeMax + " AND pd.status='claimed' AND pm.inactivity_notice=0 AND pd" + + ".location IN (" + + "SELECT ld.name FROM location_data AS ld WHERE ld.server='" + server + "');"); + } + + @Override + public List getInactivePlotsForServer(long inactivityTime, String server) { + return plotSQL.getIntList("SELECT pm.id FROM plot_members AS pm INNER JOIN plot_data AS pd ON pd.id=pm.id " + + "WHERE pm.is_owner=1 AND pm.last_enter<" + inactivityTime + " AND pd.status='claimed' AND pd.location IN (" + + "SELECT ld.name FROM location_data AS ld WHERE ld.server='" + server + "');"); + } + + @Override + public List getExpiredZonesForServer(long expiryTime, String server) { + return plotSQL.getIntList("SELECT z.id FROM zones AS z WHERE z.status='open' AND z.expiration<" + expiryTime + " AND z.location IN (" + + "SELECT ld.name FROM location_data AS ld WHERE ld.server='" + server + "');"); + } } From dc37a50ac89b7c3292848c0c4dc608b38d6b62a4 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 30 Nov 2025 15:09:33 +0100 Subject: [PATCH 45/96] Small fixes and gui improvements. --- .../bteuk/network/api/impl/CoordinateAPIImpl.java | 12 ++++++++++++ .../net/bteuk/network/gui/plotsystem/ZoneInfo.java | 2 -- .../network/gui/tutorials/RecommendationAddGui.java | 3 +-- .../gui/tutorials/RecommendedTutorialsGui.java | 1 - .../gui/tutorials/RecommendedTutorialsMenu.java | 2 +- .../java/net/bteuk/network/utils/NetworkUser.java | 2 +- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java index db082475..112bd531 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/CoordinateAPIImpl.java @@ -39,16 +39,28 @@ public void updateCoordinate(int coordinateID, NetworkLocation location) { @Override public double getX(int coordinateID) { + Coordinate coordinate = globalSQL.getCoordinate(coordinateID); + if (coordinate != null) { + return coordinate.getX(); + } return 0; } @Override public double getZ(int coordinateID) { + Coordinate coordinate = globalSQL.getCoordinate(coordinateID); + if (coordinate != null) { + return coordinate.getZ(); + } return 0; } @Override public NetworkLocation getLocation(int coordinateID) { + Coordinate coordinate = globalSQL.getCoordinate(coordinateID); + if (coordinate != null) { + return new NetworkLocation(coordinate.getWorld(), coordinate.getX(), coordinate.getY(), coordinate.getZ(), coordinate.getYaw(), coordinate.getPitch()); + } return null; } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index d206ac05..c01bbf64 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -89,7 +89,6 @@ public void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Switch back to plot menu. u.mainGui = new DeleteConfirm(provider, zoneID, RegionType.ZONE); @@ -102,7 +101,6 @@ public void createGui() { // Delete this gui. this.delete(); - u.mainGui = null; // Open close confirm menu. u.mainGui = new CloseConfirm(provider, zoneID); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java index 9976cbca..c0be9b5d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendationAddGui.java @@ -102,9 +102,8 @@ protected void createGui() { (NetworkUser u) -> { // Go back to the review gui. - u.player.closeInventory(); + this.delete(); parentGui.open(u.player); - delete(); } ); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index 55fe20ab..41d5a4b3 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -63,7 +63,6 @@ protected void createGui() { (NetworkUser u) -> { // Go back to the review gui. - u.player.closeInventory(); parentGui.open(u.player); }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java index 749a2eb3..93cbef98 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsMenu.java @@ -61,9 +61,9 @@ protected void createGui() { // Back button setItem(53, Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Back to Main Menu")), (NetworkUser u) -> { + this.delete(); user.mainGui = parentGui; user.mainGui.open(user.player); - delete(); }); // Indicates that there are no tutorial recommendations diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 01816971..c24a1370 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -204,7 +204,7 @@ private void runEvents(EventManager eventManager) { // Check if the player has any join events, if try run them. // Delay by 1 second for all plugins to run their join events. Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> { - if (instance.getGlobalSQL().hasRow("SELECT uuid FROM join_events WHERE uuid='" + player.getUniqueId() + ";")) { + if (instance.getGlobalSQL().hasRow("SELECT uuid FROM join_events WHERE uuid='" + player.getUniqueId() + "';")) { // Get the event from the database. String event = instance.getGlobalSQL().getString("SELECT event FROM join_events WHERE uuid='" + player.getUniqueId() + "';"); From 7542ab2d0152e0d9041a98979d226f2af770fbf6 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 30 Nov 2025 20:03:11 +0100 Subject: [PATCH 46/96] Region menu button should still show in the plotsystem. --- Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index a71905be..a2798d14 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -366,7 +366,9 @@ protected void createGui() { setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("No Region"), Utils.line("You are currently not standing in a valid region."), Utils.line("This is likely due to being in a lobby."))); } + } + if (constants.regionsEnabled()) { // Region menu. setItem(24, Utils.createItem(Material.ORANGE_SHULKER_BOX, 1, Utils.title("Region Menu"), Utils.line("View all regions you can build in.")), (NetworkUser u) -> { this.delete(); From 82ce283a62a08d0670ac52ded175c1155668cc32 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 9 Dec 2025 18:57:29 +0100 Subject: [PATCH 47/96] Fix sql query bug. --- .../src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index fc02a01d..553f7d65 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -97,7 +97,7 @@ public boolean setPlotSubmissionStatus(int plotId, String status) { @Override public SubmittedStatus getPlotSubmissionStatus(int plotId) { - return SubmittedStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_submission WHERE id=" + plotId + ";")); + return SubmittedStatus.fromDatabaseValue(plotSQL.getString("SELECT status FROM plot_submission WHERE plot_id=" + plotId + ";")); } @Override From d38e47f6b68714a06cccf2417278f18f09d83c23 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 9 Dec 2025 19:32:47 +0100 Subject: [PATCH 48/96] Fixed some events still using the old format. --- .../java/net/bteuk/network/commands/RegionCommand.java | 2 +- .../net/bteuk/network/commands/navigation/Spawn.java | 2 +- .../net/bteuk/network/commands/navigation/Teleport.java | 2 +- .../java/net/bteuk/network/commands/navigation/Tpll.java | 2 +- .../java/net/bteuk/network/commands/navigation/Warp.java | 3 +-- .../net/bteuk/network/eventing/events/TeleportEvent.java | 2 +- .../main/java/net/bteuk/network/gui/InviteMembers.java | 6 +++--- .../main/java/net/bteuk/network/gui/NavigatorGui.java | 2 +- .../net/bteuk/network/gui/navigation/AddLocation.java | 2 +- .../net/bteuk/network/gui/navigation/LocationMenu.java | 2 +- .../java/net/bteuk/network/gui/regions/RegionInfo.java | 2 +- .../bteuk/network/gui/regions/ReviewRegionRequest.java | 9 +++------ Plugin/src/main/java/net/bteuk/network/lobby/Map.java | 2 +- .../network/regions/listener/RegionMoveListener.java | 2 +- 14 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java index 6c27f92d..b0063dca 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java @@ -52,7 +52,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Check if the player has permission, else notify the player accordingly. if (player.hasPermission("uknet.regions.join")) { // Add server event to join the region. - eventAPI.createEvent(player.getUniqueId().toString(), "network", regionManager.getServer(region), "region join " + region.regionName()); + eventAPI.createEvent(player.getUniqueId().toString(), regionManager.getServer(region), "region join " + region.regionName()); } else { // Send error. player.sendMessage(ChatUtils.error("You do not have permission to join regions.")); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java index 4194c118..98ef2bff 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Spawn.java @@ -57,7 +57,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } else { // Set teleport event to go to spawn. - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport spawn", location); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "teleport spawn", location); serverAPI.switchServer(PlayerAdapter.adapt(player), globalSQL.getString("SELECT name FROM " + "server_data WHERE type='LOBBY';")); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java index c290f02c..188afdbd 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java @@ -78,7 +78,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) player.sendMessage(ChatUtils.success("Teleported to %s", onlineUser.getName())); }, () -> { if (!constants.standalone()) { - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", "teleport " + "player " + onlineUser.getUuid(), currentLocation); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "teleport " + "player " + onlineUser.getUuid(), currentLocation); serverAPI.switchServer(PlayerAdapter.adapt(player), onlineUser.getServer()); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java index 419b931d..a857a162 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Tpll.java @@ -290,7 +290,7 @@ private boolean switchServerIfNecessary(Player p, Region region, String[] args) if (!server.equals(constants.serverName())) { // Create teleport event. - eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport tpll " + String.join(" ", args), LocationAdapter.adapt(p.getLocation())); + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "teleport tpll " + String.join(" ", args), LocationAdapter.adapt(p.getLocation())); // Switch server. serverAPI.switchServer(PlayerAdapter.adapt(p), server); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java index 944805a5..ea0ae2ec 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Warp.java @@ -97,8 +97,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) player.sendMessage(ChatUtils.success("Teleported to ") .append(Component.text(location, NamedTextColor.DARK_AQUA))); } else { - eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "network", - "teleport location " + location, currentLocation); + eventAPI.createTeleportEvent(true, player.getUniqueId().toString(), "teleport location " + location, currentLocation); serverAPI.switchServer(PlayerAdapter.adapt(player), server); } } else { diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java index 1241f866..aeed4ef5 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java @@ -150,7 +150,7 @@ public void event(String uuid, String[] event, String message) { } else { // Set teleport event to go to spawn. - eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "network", "teleport spawn", LocationAdapter.adapt(p.getLocation())); + eventAPI.createTeleportEvent(true, p.getUniqueId().toString(), "teleport spawn", LocationAdapter.adapt(p.getLocation())); serverAPI.switchServer(PlayerAdapter.adapt(p), globalSQL.getString("SELECT name FROM " + "server_data WHERE type='LOBBY';")); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java index 6f0cc494..fd4f40a2 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/InviteMembers.java @@ -250,7 +250,7 @@ public void invite(NetworkUser u, String uuid) { String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite region " + region.regionName()); + provider.eventAPI().createEvent(uuid, onlineUser.getServer(), "invite region " + region.regionName()); u.player.sendMessage(ChatUtils.success("Invited %s to region %s", name, provider.regionManager().getTag(region, u.player.getUniqueId().toString()))); }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } else if (regionType == RegionType.PLOT) { @@ -264,7 +264,7 @@ public void invite(NetworkUser u, String uuid) { String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite plot " + plotID); + provider.eventAPI().createEvent(uuid, onlineUser.getServer(), "invite plot " + plotID); u.player.sendMessage(ChatUtils.success("Invited %s to your Plot.", name)); }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } else if (regionType == RegionType.ZONE) { @@ -278,7 +278,7 @@ public void invite(NetworkUser u, String uuid) { String name = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + uuid + "'"); provider.instance().getOnlineUserByUuid(uuid).ifPresentOrElse(onlineUser -> { - provider.eventAPI().createEvent(uuid, "network", onlineUser.getServer(), "invite zone " + zoneID); + provider.eventAPI().createEvent(uuid, onlineUser.getServer(), "invite zone " + zoneID); u.player.sendMessage(ChatUtils.success("Invited %s to zone your Zone.", name)); }, () -> u.player.sendMessage(ChatUtils.error("%s is no longer online.", name))); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 06d02d54..62e1771b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -137,7 +137,7 @@ public NavigatorGui(GuiProvider provider) { // Set teleport event to go to spawn. u.player.closeInventory(); - eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport spawn", location); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport spawn", location); serverAPI.switchServer(PlayerAdapter.adapt(u.player), globalSQL.getString("SELECT " + "name FROM server_data WHERE type='LOBBY';")); } }); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java index d85c4536..15c1c17c 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/AddLocation.java @@ -184,7 +184,7 @@ protected void createGui() { } else { // Create teleport event and switch server. u.player.closeInventory(); - eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport " + "location_request " + name, + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport " + "location_request " + name, LocationAdapter.adapt(u.player.getLocation())); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java index 0e5c509d..a4f87bba 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/navigation/LocationMenu.java @@ -159,7 +159,7 @@ protected void createGui() { u.player.closeInventory(); // Create teleport event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport location " + location.getKey(), + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport location " + location.getKey(), LocationAdapter.adapt(u.player.getLocation())); // Switch server. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index 2f198025..666b1908 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -127,7 +127,7 @@ protected void createGui() { u.player.closeInventory(); // Create teleport region event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport region " + region.regionName(), + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport region " + region.regionName(), LocationAdapter.adapt(u.player.getLocation())); // Switch server. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index ef8ddd2b..647729f4 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -40,8 +40,7 @@ protected void createGui() { setItem(11, Utils.createItem(Material.LIME_CONCRETE, 1, Utils.title("Accept Request"), Utils.line("The user will be able to build in this region.")), (NetworkUser u) -> { // Create event to accept request. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", - provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), "region request accept " + request.region + " " + request.uuid); // Return to the request menu. @@ -73,8 +72,7 @@ protected void createGui() { { // Create event to deny request. - provider.eventAPI().createEvent(u.player.getUniqueId().toString(), "network", - provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), + provider.eventAPI().createEvent(u.player.getUniqueId().toString(), provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), "region request deny " + request.region + " " + request.uuid); // Return to the request menu. @@ -128,8 +126,7 @@ protected void createGui() { u.player.closeInventory(); // Create teleport event. - provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "network", - "teleport " + provider.constants().earthWorld() + " " + l.getX() + " " + l.getZ() + " " + l.getYaw() + " " + l.getPitch(), + provider.eventAPI().createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport " + provider.constants().earthWorld() + " " + l.getX() + " " + l.getZ() + " " + l.getYaw() + " " + l.getPitch(), LocationAdapter.adapt(u.player.getLocation())); // Switch server. diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java index 8ed7bcaf..36b9646c 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Map.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Map.java @@ -334,7 +334,7 @@ private void teleportToLocation(NetworkUser u, String location) { } // Create teleport event. - eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "network", "teleport location " + location, LocationAdapter.adapt(u.player.getLocation())); + eventAPI.createTeleportEvent(true, u.player.getUniqueId().toString(), "teleport location " + location, LocationAdapter.adapt(u.player.getLocation())); serverAPI.switchServer(PlayerAdapter.adapt(u.player), server); } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index 5efeccff..0a14ac12 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -114,7 +114,7 @@ private void switchServer(RegionUser regionUser, Region region, Location newLoca } // Set join event to teleport there. - eventAPI.createJoinEvent(regionUser.getPlayer().getUniqueId().toString(), "network", + eventAPI.createJoinEvent(regionUser.getPlayer().getUniqueId().toString(), "teleport " + world + " " + " " + (newLocation.getX() + xTransform) + " " + (newLocation.getZ() + zTransform) + " " + newLocation.getYaw() + " " + newLocation.getPitch()); // Switch server. From 68692b8930d57020341a28912949a23128b5afe9 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 10 Dec 2025 20:57:41 +0100 Subject: [PATCH 49/96] Fixed tips and lobby portal timer interval. --- Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java | 2 +- Plugin/src/main/java/net/bteuk/network/utils/Tips.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java index d955c0b0..e1571a00 100644 --- a/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java +++ b/Plugin/src/main/java/net/bteuk/network/lobby/Lobby.java @@ -154,7 +154,7 @@ private void runPortals() { user.wasInPortal = false; } } - }, 1L); + }, 50L); } // Load the rules. diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Tips.java b/Plugin/src/main/java/net/bteuk/network/utils/Tips.java index 60b237c4..f2ad7680 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Tips.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Tips.java @@ -79,7 +79,7 @@ public Tips(Network instance, Constants constants) { if (!tipsMap.isEmpty()) { // Get interval. - long frequency = constants.tipsFrequency() * 60L * 20L; + long frequency = constants.tipsFrequency() * 60L * 1000L; instance.getTimerAPI().registerTimer(() -> { From b5a2c63096ee6e11fe982946ec651387dcc81626 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Thu, 11 Dec 2025 18:45:02 +0100 Subject: [PATCH 50/96] Fixed issue with review button in staff menu not working and issue with zone count check when creating a zone. --- .../src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 2 +- Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 553f7d65..9483e901 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -329,7 +329,7 @@ public boolean isZoneOwner(String uuid) { @Override public int getNumberOfZones() { - return plotSQL.getInt("SELECT count(id) FROM zones;"); + return plotSQL.getInt("SELECT count(id) FROM zones WHERE status='open';"); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index 8341b81d..29bdd105 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -184,7 +184,7 @@ protected void createGui() { // reviewing process. if (server.equals(constants.serverName())) { u.player.closeInventory(); - provider.eventAPI().createEvent(u.getUuid(), "plotsystem", constants.serverName(), "review plot " + plotID); + provider.eventAPI().createEvent(u.getUuid(), constants.serverName(), "review plot " + plotID); } else { // Player is not on the current server. // Set the server join event. From 0fce99024509a659fcc283a438b55883d8a6f08d Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Thu, 11 Dec 2025 19:07:06 +0100 Subject: [PATCH 51/96] When teleporting to a player check if they are online, so if they have just disconnected/switched server the teleport will not be attempted. --- .../net/bteuk/network/commands/navigation/Teleport.java | 7 +++++++ .../net/bteuk/network/eventing/events/TeleportEvent.java | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java index 188afdbd..0ee5100e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/navigation/Teleport.java @@ -71,6 +71,13 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) NetworkLocation currentLocation = LocationAdapter.adapt(player.getLocation()); optionalNetworkUser.ifPresentOrElse((NetworkUser user) -> { + + // Check that the player is still online, when switching server, the player could temporarily not be available. + if (!user.player.isConnected()) { + player.sendMessage(ChatUtils.error("%s is currently not available, they may have disconnected.", onlineUser.getName())); + return; + } + // Set the current location for /back back.setPreviousCoordinate(player.getUniqueId().toString(), currentLocation); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java index aeed4ef5..f7fab05f 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java @@ -72,6 +72,12 @@ public void event(String uuid, String[] event, String message) { Player player = Bukkit.getPlayer(UUID.fromString(event[2])); if (player != null) { + // Check that the player is still online, when switching server, the player could temporarily not be available. + if (!player.isConnected()) { + player.sendMessage(ChatUtils.error("%s is currently not available, they may have disconnected.", player.getName())); + return; + } + p.teleport(player.getLocation()); p.sendMessage(ChatUtils.success("Teleported to ") .append(Component.text(globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_AQUA))); From 1c7147aad00bb7063fca2db610e7ee3b0db57567 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 14 Dec 2025 11:42:57 +0100 Subject: [PATCH 52/96] Fix SQL query to get plot reviewer. --- .../src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 2 +- .../main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 9483e901..f2260ba9 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -409,7 +409,7 @@ public String getPlotReviewer(int plotId, String uuid, int attempt) { @Override public String getPlotReviewer(int reviewId) { - return plotSQL.getString("SELECT reviewer FROM plot_review WHERE review_id=" + reviewId + ";"); + return plotSQL.getString("SELECT reviewer FROM plot_review WHERE id=" + reviewId + ";"); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index c01bbf64..30662109 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -44,7 +44,7 @@ public ZoneInfo(GuiProvider provider, NetworkUser user, int zoneID, String uuid) public void createGui() { setItem(4, Utils.createItem(Material.BOOK, 1, Utils.title("Zone " + zoneID), Utils.line("Zone Owner: ").append(Component.text(globalSQL.getString( - "SELECT name FROM player_data WHERE uuid='" + plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND " + "is_owner=1;") + + "SELECT name FROM player_data WHERE uuid='" + plotSQL.getString("SELECT uuid FROM zone_members WHERE id=" + zoneID + " AND is_owner=1;") + "';"), NamedTextColor.GRAY)), Utils.line("Zone Members: ") .append(Component.text(plotSQL.getInt("SELECT COUNT(uuid) FROM zone_members WHERE id=" + zoneID + " AND is_owner=0;"), NamedTextColor.GRAY)), From c9f74402f1a1c4fc31d21150c9dc25cf49dc39f4 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Wed, 17 Dec 2025 19:33:08 +0100 Subject: [PATCH 53/96] Fix SQL query for feedback book reviewer. --- .../java/net/bteuk/network/api/plotsystem/ReviewFeedback.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java index 2f378c02..c062eeaa 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java +++ b/Network-API/src/main/java/net/bteuk/network/api/plotsystem/ReviewFeedback.java @@ -47,7 +47,7 @@ public static Book createFeedbackBook(SQLAPI globalSQL, PlotAPI plotAPI, int rev .appendNewline().appendNewline()); // Reviewer - String reviewer = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + plotAPI.getPlotReviewer(reviewId)); + String reviewer = globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + plotAPI.getPlotReviewer(reviewId) + "';"); firstPage = firstPage.append(Component.text(String.format("Reviewer: %s", reviewer), NamedTextColor.DARK_GRAY)).appendNewline(); From ec92fc80d44021cf90f99a6d926867321e927a60 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Thu, 18 Dec 2025 21:59:14 +0100 Subject: [PATCH 54/96] Make timer delay in milliseconds instead of ticks. --- .../src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java | 3 ++- Plugin/src/main/java/net/bteuk/network/utils/Tips.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java index 7fa3671d..51dbd9d9 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/TimerAPIImpl.java @@ -20,7 +20,8 @@ public TimerAPIImpl(Network instance) { @Override public int registerTimer(Runnable runnable, long intervalMillis, long delay) { long serverTickInterval = Math.round(intervalMillis / 50.0); - int id = instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, runnable, delay, serverTickInterval); + long serverTickDelay = Math.round(delay / 50.0); + int id = instance.getServer().getScheduler().scheduleSyncRepeatingTask(instance, runnable, serverTickDelay, serverTickInterval); timers.put(id, runnable); return id; } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Tips.java b/Plugin/src/main/java/net/bteuk/network/utils/Tips.java index f2ad7680..fc0bdb76 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Tips.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Tips.java @@ -101,7 +101,7 @@ public Tips(Network instance, Constants constants) { // Increment the counter on all TipsLists tipsMap.values().forEach(TipsList::increment); - }, frequency, 2400L); + }, frequency, 60000L); log.info("Enabled tips timer!"); } From 8952f4ca0993091efad38b9758d330edfe553a31 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 19 Dec 2025 22:14:31 +0100 Subject: [PATCH 55/96] Also update the display name on the player. --- Plugin/src/main/java/net/bteuk/network/CustomChat.java | 1 + .../net/bteuk/network/eventing/listeners/Connect.java | 10 +++++++++- .../main/java/net/bteuk/network/utils/NetworkUser.java | 7 +++++++ pom.xml | 4 ++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index d29aed3d..ec5d31ec 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -274,6 +274,7 @@ public void handleUserUpdate(UserUpdate userUpdate) { user.setPrimaryRole(primaryRole); } } + user.updateDisplayName(userUpdate.getDisplayName()); }); } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 17c176ba..7d127bb3 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -147,12 +147,20 @@ public void joinServerEvent(PlayerJoinEvent joinEvent) { boolean nightVisionEnabled = globalSQL.getBoolean("SELECT nightvision_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); String chatChannel = globalSQL.getString("SELECT chat_channel FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); boolean tipsEnabled = globalSQL.getBoolean("SELECT tips_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + String displayName = globalSQL.getString("SELECT display_name FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); + Component displayNameComponent; + if (displayName != null) { + displayNameComponent = GsonComponentSerializer.gson().deserialize(displayName); + } else { + displayNameComponent = Component.text(player.getName()); + } + List messages = globalSQL.getOfflineMessages(player.getUniqueId().toString()); List components = new ArrayList<>(); messages.forEach(message -> components.add(GsonComponentSerializer.gson().deserialize(message))); UserConnectReply reply = new UserConnectReply(player.getUniqueId().toString(), navigatorEnabled, teleportEnabled, nightVisionEnabled, chatChannel, tipsEnabled, - components, false); + components, false, displayNameComponent); RegionUser regionUser = null; if (constants.regionsEnabled()) { regionUser = regionManager.getUserByPlayer(player).orElse(null); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index c24a1370..b2e27727 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -163,6 +163,9 @@ public NetworkUser(Player player, UserConnectReply reply, Network instance, Cons if (focusEnabled) { hidePlayers(); } + + // Set the display name. + player.displayName(reply.getDisplayName()); } /** @@ -284,6 +287,10 @@ public void toggleFocus() { } } + public void updateDisplayName(Component displayName) { + player.displayName(displayName); + } + private void setFocusEnabled(boolean enabled) { focusEnabled = enabled; if (focusEnabled) { diff --git a/pom.xml b/pom.xml index 630213c8..be7fd31a 100644 --- a/pom.xml +++ b/pom.xml @@ -23,9 +23,9 @@ 1.21.8-R0.1-SNAPSHOT - d3134be6b5 + e14b531c08 5958727df9 - a781b6371c + 24c3fc82f5 1.18.34 From fca33ec0b7901d085ff76f88f9b29b2dac034c96 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 19 Dec 2025 22:48:22 +0100 Subject: [PATCH 56/96] /nick to change displayname (except in direct messages) --- .../java/net/bteuk/network/CustomChat.java | 8 +- .../main/java/net/bteuk/network/Network.java | 2 + .../network/commands/AbstractCommand.java | 2 +- .../java/net/bteuk/network/commands/Nick.java | 100 ++++++++++++++++++ 4 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/commands/Nick.java diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index ec5d31ec..f3591d2b 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -114,7 +114,7 @@ private static Component playerMessageFormat(NetworkUser user, Component message Role userRole = user.getPrimaryRole(); return userRole.getColouredPrefix() // The prefix based on the role. .append(Component.space()) - .append(ChatUtils.line(user.player.getName())) // Player name in white without formatting. + .append(user.player.displayName()) // Player name in white without formatting. .append(Component.space()) .append(Component.text(">", NamedTextColor.GRAY).decorate(TextDecoration.BOLD)) // Arrow between the // player and message in bold. @@ -261,7 +261,7 @@ public void handleDiscordLinking(DiscordLinking discordLinking) { } public void handleUserUpdate(UserUpdate userUpdate) { - // If the user is online check if anything needs updating. + // If the user is online, check if anything needs updating. instance.getUsers().stream().filter((NetworkUser user) -> user.player.getUniqueId().toString().equals(userUpdate.getUuid())) .findFirst().ifPresent((NetworkUser user) -> { if (userUpdate.getTabPlayer() != null && !userUpdate.getTabPlayer().getPrimaryGroup() @@ -274,7 +274,9 @@ public void handleUserUpdate(UserUpdate userUpdate) { user.setPrimaryRole(primaryRole); } } - user.updateDisplayName(userUpdate.getDisplayName()); + if (userUpdate.getDisplayName() != null) { + user.updateDisplayName(userUpdate.getDisplayName()); + } }); } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 59289882..0d8faa5c 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -26,6 +26,7 @@ import net.bteuk.network.commands.Me; import net.bteuk.network.commands.Msg; import net.bteuk.network.commands.Navigator; +import net.bteuk.network.commands.Nick; import net.bteuk.network.commands.Nightvision; import net.bteuk.network.commands.Phead; import net.bteuk.network.commands.Plot; @@ -451,6 +452,7 @@ public void enablePlugin() { commandManager.registerCommand(Msg.of(this, "tell")); commandManager.registerCommand(new Reply(chat)); + commandManager.registerCommand(new Nick(this, chat)); } commandManager.registerCommand(new Promote(this, roleAPI, chat)); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java index 43b7dc1a..1761d178 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/AbstractCommand.java @@ -66,7 +66,7 @@ protected Player getPlayer(CommandSourceStack stack) { /** * Checks whether the sender has permission, if the sender is not a {@link Player} then this will always return * true. - * If the player doesn't have the permission send a no permission message. + * If the player doesn't have the permission, send a no permission message. * * @param sender the command sender * @param permission the permission to check diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java new file mode 100644 index 00000000..b12a47dd --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -0,0 +1,100 @@ +package net.bteuk.network.commands; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; +import net.bteuk.network.Network; +import net.bteuk.network.lib.dto.UserUpdate; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.utils.NetworkUser; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +@Log +public class Nick extends AbstractCommand { + + private static final PlainTextComponentSerializer PLAIN_SERIALIZER = PlainTextComponentSerializer.plainText(); + private static final LegacyComponentSerializer COLOUR_SERIALIZER = LegacyComponentSerializer.builder().hexColors().character('&').build(); + + private final Network instance; + + private final CustomChat chat; + + public Nick(Network instance, CustomChat chat) { + this.instance = instance; + this.chat = chat; + } + + @Override + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { + // Check if the sender is a player. + Player player = getPlayer(stack); + if (player == null) { + return; + } + + if (!hasPermission(player, "network.nick")) { + return; + } + + NetworkUser user = instance.getUser(player); + + // If the user is null, cancel. + if (user == null) { + log.severe("User " + player.getName() + " can not be found!"); + player.sendMessage(ChatUtils.error("User can not be found, please relog!")); + return; + } + + if (args.length == 0) { + player.sendMessage(ChatUtils.error("Usage: %s (Supports &colours or &#RRGGBB)", "/nick ")); + player.sendMessage(ChatUtils.error("Example: %s", "/nick &6My &#FF00FFName")); + return; + } else if ("reset".equalsIgnoreCase(args[0])) { + Component defaultName = Component.text(player.getName()); + updateDisplayName(player, defaultName); + player.sendMessage(ChatUtils.success("Reset display name.")); + return; + + } + + String rawName = String.join(" ", args); + Component displayName = COLOUR_SERIALIZER.deserialize(rawName); + + // Optional: Check visible length (strip colors) + String stripped = PLAIN_SERIALIZER.serialize(displayName); + if (stripped.length() > 16) { + player.sendMessage(ChatUtils.error("Your nickname must be not exceed 16 characters.")); + return; + } + + updateDisplayName(player, displayName); + } + + private void updateDisplayName(Player player, Component displayName) { + UserUpdate userUpdateEvent = new UserUpdate(); + userUpdateEvent.setUuid(player.getUniqueId().toString()); + userUpdateEvent.setDisplayName(displayName); + chat.sendSocketMessage(userUpdateEvent); + } + + @Override + public String getLabel() { + return "nick"; + } + + @Override + public String getDescription() { + return "Updates your display name. Supports & colors and &#RRGGBB hex colors."; + } + + @Override + public List getAliases() { + return List.of("nickname"); + } +} From af91051448f8cc1d14907c15aa410c4cf01d9f8a Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 19 Dec 2025 23:26:29 +0100 Subject: [PATCH 57/96] Default displayname always white, added tabcompleter for reset. --- Plugin/src/main/java/net/bteuk/network/commands/Nick.java | 8 +++++--- .../net/bteuk/network/eventing/listeners/Connect.java | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java index b12a47dd..6f645c32 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -13,6 +14,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; @Log @@ -28,6 +30,7 @@ public class Nick extends AbstractCommand { public Nick(Network instance, CustomChat chat) { this.instance = instance; this.chat = chat; + setTabCompleter(new FixedArgSelector(Collections.singletonList("reset"), 0)); } @Override @@ -38,7 +41,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - if (!hasPermission(player, "network.nick")) { + if (!hasPermission(player, "uknet.nick")) { return; } @@ -56,9 +59,8 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) player.sendMessage(ChatUtils.error("Example: %s", "/nick &6My &#FF00FFName")); return; } else if ("reset".equalsIgnoreCase(args[0])) { - Component defaultName = Component.text(player.getName()); + Component defaultName = ChatUtils.line(player.getName()); updateDisplayName(player, defaultName); - player.sendMessage(ChatUtils.success("Reset display name.")); return; } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 7d127bb3..07e38b8f 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -18,6 +18,7 @@ import net.bteuk.network.lib.dto.UserConnectRequest; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; +import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.RegionUser; import net.bteuk.network.sql.GlobalSQL; @@ -152,7 +153,7 @@ public void joinServerEvent(PlayerJoinEvent joinEvent) { if (displayName != null) { displayNameComponent = GsonComponentSerializer.gson().deserialize(displayName); } else { - displayNameComponent = Component.text(player.getName()); + displayNameComponent = ChatUtils.line(player.getName()); } List messages = globalSQL.getOfflineMessages(player.getUniqueId().toString()); From af220106ea2019f89af0c1b798381c1d17a514e1 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Fri, 19 Dec 2025 23:47:46 +0100 Subject: [PATCH 58/96] Add /nick reset for mods to reset the nickname of another player. --- .../java/net/bteuk/network/commands/Nick.java | 28 ++++++++++++++----- .../ConditionalPlayerSelector.java | 28 +++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java index 6f645c32..1b76cbb0 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -4,7 +4,10 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.commands.tabcompleters.ConditionalPlayerSelector; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; +import net.bteuk.network.commands.tabcompleters.MultiArgSelector; +import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; @@ -16,6 +19,7 @@ import java.util.Collections; import java.util.List; +import java.util.Optional; @Log public class Nick extends AbstractCommand { @@ -30,7 +34,8 @@ public class Nick extends AbstractCommand { public Nick(Network instance, CustomChat chat) { this.instance = instance; this.chat = chat; - setTabCompleter(new FixedArgSelector(Collections.singletonList("reset"), 0)); + setTabCompleter(new MultiArgSelector(List.of(new FixedArgSelector(Collections.singletonList("reset"), 0), + new ConditionalPlayerSelector(instance, 1, args -> args != null && args.length > 0 && "reset".equalsIgnoreCase(args[0]))))); } @Override @@ -58,11 +63,20 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) player.sendMessage(ChatUtils.error("Usage: %s (Supports &colours or &#RRGGBB)", "/nick ")); player.sendMessage(ChatUtils.error("Example: %s", "/nick &6My &#FF00FFName")); return; - } else if ("reset".equalsIgnoreCase(args[0])) { + } else if ("reset".equalsIgnoreCase(args[0]) && args.length == 1) { Component defaultName = ChatUtils.line(player.getName()); - updateDisplayName(player, defaultName); + updateDisplayName(player.getUniqueId().toString(), defaultName); return; - + } else if ("reset".equalsIgnoreCase(args[0]) && args.length > 1 && player.hasPermission("uknet.nick.reset.others")) { + // Get the player. + Optional onlineUser = instance.getOnlineUserByNameIgnoreCase(args[1]); + if (onlineUser.isPresent()) { + updateDisplayName(onlineUser.get().getUuid(), ChatUtils.line(onlineUser.get().getName())); + player.sendMessage(ChatUtils.success("Reset " + args[1] + "'s nickname.")); + } else { + player.sendMessage(ChatUtils.error("Player " + args[1] + " is not online!")); + return; + } } String rawName = String.join(" ", args); @@ -75,12 +89,12 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - updateDisplayName(player, displayName); + updateDisplayName(player.getUniqueId().toString(), displayName); } - private void updateDisplayName(Player player, Component displayName) { + private void updateDisplayName(String uuid, Component displayName) { UserUpdate userUpdateEvent = new UserUpdate(); - userUpdateEvent.setUuid(player.getUniqueId().toString()); + userUpdateEvent.setUuid(uuid); userUpdateEvent.setDisplayName(displayName); chat.sendSocketMessage(userUpdateEvent); } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java new file mode 100644 index 00000000..2b30b76a --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java @@ -0,0 +1,28 @@ +package net.bteuk.network.commands.tabcompleters; + +import net.bteuk.network.Network; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Collections; +import java.util.function.Predicate; + +public class ConditionalPlayerSelector extends PlayerSelector { + + private final Predicate condition; + + public ConditionalPlayerSelector(Network instance, int argIndex, Predicate predicate) { + super(instance, argIndex, false); + this.condition = predicate; + } + + @Override + public @NotNull Collection onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { + if (condition.test(args)) { + return super.onTabComplete(sender, args); + } else { + return Collections.emptyList(); + } + } +} From 2dafaa9aa67cd92cc8fb0af723486f99331afde1 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sun, 21 Dec 2025 16:54:22 +0100 Subject: [PATCH 59/96] Bugfixes and tabcompleter for /nick reset --- Plugin/src/main/java/net/bteuk/network/commands/Nick.java | 6 +++--- .../commands/tabcompleters/ConditionalPlayerSelector.java | 2 +- .../net/bteuk/network/eventing/events/EventManager.java | 1 + .../net/bteuk/network/eventing/events/TeleportEvent.java | 4 ++-- .../bteuk/network/regions/listener/RegionMoveListener.java | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java index 1b76cbb0..d3dfdafc 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -72,11 +72,11 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) Optional onlineUser = instance.getOnlineUserByNameIgnoreCase(args[1]); if (onlineUser.isPresent()) { updateDisplayName(onlineUser.get().getUuid(), ChatUtils.line(onlineUser.get().getName())); - player.sendMessage(ChatUtils.success("Reset " + args[1] + "'s nickname.")); + player.sendMessage(ChatUtils.success("Reset %s nickname.", args[1] + "'s")); } else { - player.sendMessage(ChatUtils.error("Player " + args[1] + " is not online!")); - return; + player.sendMessage(ChatUtils.error("Player %s is not online!", args[1])); } + return; } String rawName = String.join(" ", args); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java index 2b30b76a..257ce9bd 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/tabcompleters/ConditionalPlayerSelector.java @@ -19,7 +19,7 @@ public ConditionalPlayerSelector(Network instance, int argIndex, Predicate onTabComplete(@NotNull CommandSender sender, @NotNull String[] args) { - if (condition.test(args)) { + if (condition.test(args) && sender.hasPermission("uknet.nick.reset.others")) { return super.onTabComplete(sender, args); } else { return Collections.emptyList(); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java index e16093af..1333e4bc 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/EventManager.java @@ -151,6 +151,7 @@ public void createTeleportEvent(boolean join, String uuid, String event, Compone */ @Override public void event(String uuid, String[] event, String message) { + log.info("Event " + event[0] + " triggered by " + uuid + " with arguments " + String.join(", ", event)); Event eventType = events.get(event[0]); if (eventType == null) { log.warning("Event " + event[0] + " is not registered."); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java index f7fab05f..23d391dd 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/events/TeleportEvent.java @@ -80,9 +80,9 @@ public void event(String uuid, String[] event, String message) { p.teleport(player.getLocation()); p.sendMessage(ChatUtils.success("Teleported to ") - .append(Component.text(globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_AQUA))); + .append(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_AQUA))); } else { - p.sendMessage(Component.text(globalSQL.getString("SELECT name FROM " + "player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_RED) + p.sendMessage(Component.text(globalSQL.getString("SELECT name FROM player_data WHERE uuid='" + event[2] + "';"), NamedTextColor.DARK_RED) .append(ChatUtils.error(" is not online."))); } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index 0a14ac12..587620ab 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -115,7 +115,7 @@ private void switchServer(RegionUser regionUser, Region region, Location newLoca // Set join event to teleport there. eventAPI.createJoinEvent(regionUser.getPlayer().getUniqueId().toString(), - "teleport " + world + " " + " " + (newLocation.getX() + xTransform) + " " + (newLocation.getZ() + zTransform) + " " + newLocation.getYaw() + " " + newLocation.getPitch()); + "teleport " + world + " " + (newLocation.getX() + xTransform) + " " + (newLocation.getZ() + zTransform) + " " + newLocation.getYaw() + " " + newLocation.getPitch()); // Switch server. serverAPI.switchServer(PlayerAdapter.adapt(regionUser.getPlayer()), regionManager.getServer(region)); From 4632f80d1753401804f3ac71611750e1b256e966 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 18 Jan 2026 13:56:39 +0000 Subject: [PATCH 60/96] Add provisions to allow more configuration of who can claim regions, and more configuration in terms of the approval requirements. Also adds provisions for a situation where both staff and owner approval are required. --- Core/pom.xml | 2 +- .../net/bteuk/network/core/Constants.java | 2 +- Network-API/pom.xml | 4 +- PaperCore/pom.xml | 2 +- Plugin/pom.xml | 2 +- .../main/java/net/bteuk/network/Network.java | 2 +- .../java/net/bteuk/network/commands/Help.java | 21 ++- .../bteuk/network/commands/RegionCommand.java | 8 +- .../java/net/bteuk/network/gui/BuildGui.java | 158 ++++++++++-------- .../network/gui/plotsystem/ZoneInfo.java | 2 +- .../bteuk/network/gui/regions/RegionInfo.java | 2 +- .../gui/regions/ReviewRegionRequest.java | 8 +- .../net/bteuk/network/gui/staff/StaffGui.java | 6 +- .../bteuk/network/utils/NetworkConfig.java | 6 +- Plugin/src/main/resources/config.yml | 9 +- Regions/pom.xml | 2 +- .../bteuk/network/regions/RegionEvent.java | 22 ++- .../bteuk/network/regions/RegionManager.java | 104 +++++++++--- pom.xml | 2 +- 19 files changed, 235 insertions(+), 129 deletions(-) diff --git a/Core/pom.xml b/Core/pom.xml index 0ddb8c62..d49a931e 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.0 + 1.8.1 net.bteuk.network diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index 71e62c51..b55864c1 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -7,7 +7,7 @@ public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, - List sidebarContent, boolean motdEnabled, String motdContent, boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, + List sidebarContent, boolean motdEnabled, String motdContent, String minrankGeneration, String minrankRegionClaim, String minrankZoneJoin, boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial, int afkTime, boolean mapEnabled, String mapServer, NetworkLocation mapLocation, diff --git a/Network-API/pom.xml b/Network-API/pom.xml index a169f16a..889cbe7d 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -6,14 +6,14 @@ net.bteuk Network - 1.8.0 + 1.8.1 net.bteuk.network api Network API API for the Network plugin - 1.8.0 + 1.8.1 diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index 35a0fed2..56f54b61 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.0 + 1.8.1 net.bteuk.network diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 118dd93a..8b0f8b50 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.0 + 1.8.1 net.bteuk.network diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 0d8faa5c..00da6493 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -349,7 +349,7 @@ public void enablePlugin() { // Create the region manager if enabled. if (constants.regionsEnabled()) { regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventAPI, worldGuardAPI, constants, this, serverAPI); - commandManager.registerCommand(new RegionCommand(regionManager, eventAPI)); + commandManager.registerCommand(new RegionCommand(regionManager, eventAPI, constants)); } // Setup connect, this handles all connections to the server. diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Help.java b/Plugin/src/main/java/net/bteuk/network/commands/Help.java index 724b03b1..a0ae964b 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Help.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Help.java @@ -169,7 +169,7 @@ private void building(Player p) { yield null; } yield builderRole.getColouredRoleName() - .append(ChatUtils.line(" is the first role that has the ability to claim regions freely, " + + .append(ChatUtils.line(" does not require approval for all claims, " + "however in busy areas reviewers will need to review the request. " + "Complete 1 hard plot to be promoted to ")) .append(builder.getColouredRoleName()); @@ -181,9 +181,9 @@ private void building(Player p) { yield null; } yield builderRole.getColouredRoleName() - .append(ChatUtils.line(" is the first role achieved by building, however you must rank up " + - "once more to have access to region claiming. " + - "Complete 1 normal plot to be promoted to ")) + .append(ChatUtils.line(" is the first role which allows you to claim regions across the country, " + + "however, all region requests must be approved by staff.")) + .append(ChatUtils.line("Complete 1 normal plot to be promoted to ")) .append(jrbuilder.getColouredRoleName()); } @@ -261,7 +261,7 @@ private void explore(Player p) { switch (builderRole.getId()) { - case "apprentice", "applicant", "default" -> { + case "applicant", "default" -> { if (constants.tpllEnabled()) { p.sendMessage(Utils.line("\nTo access other areas you can try using ") .append(Component.text("/tpll ", NamedTextColor.GRAY)) @@ -270,6 +270,13 @@ private void explore(Player p) { } } + case "apprentice" -> { + if (constants.tpllEnabled()) { + p.sendMessage(Utils.line("\nTo access other areas you can try using ") + .append(Component.text("/tpll ", NamedTextColor.GRAY))); + } + } + default -> { if (constants.warpsEnabled()) { p.sendMessage(Utils.line("\nYou can request new locations to be added to the navigator, " + @@ -362,9 +369,9 @@ private void regions(Player p) { "We keep track of every player who joins a region, this allows us to trace back any wrongdoers with " + "relative ease.")); - Role jrbuilder = roles.getRoleById("jrbuilder"); + Role apprentice = roles.getRoleById("apprentice"); p.sendMessage(Utils.line("\nTo join a region you must be a ") - .append(jrbuilder.getColouredRoleName()) + .append(apprentice.getColouredRoleName()) .append(Utils.line(" or above, this is both to prevent griefers and to ensure building standards."))); p.sendMessage(Utils.line("\nYou can join a region by clicking on the dark oak door in the build menu. " + diff --git a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java index b0063dca..a4415659 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/RegionCommand.java @@ -1,7 +1,9 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; +import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; +import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.Region; import net.bteuk.network.regions.RegionManager; @@ -14,10 +16,12 @@ public class RegionCommand extends AbstractCommand { private final RegionManager regionManager; private final EventAPI eventAPI; + private final Constants constants; - public RegionCommand(RegionManager regionManager, EventAPI eventAPI) { + public RegionCommand(RegionManager regionManager, EventAPI eventAPI, Constants constants) { this.regionManager = regionManager; this.eventAPI = eventAPI; + this.constants = constants; } @Override @@ -56,7 +60,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } else { // Send error. player.sendMessage(ChatUtils.error("You do not have permission to join regions.")); - player.sendMessage(ChatUtils.error("To join regions you need at least Jr.Builder.")); + player.sendMessage(ChatUtils.error("To join regions you need at least "+constants.minrankRegionClaim() +".")); player.sendMessage(ChatUtils.error("For more information type ").append(Component.text("/help building", NamedTextColor.DARK_RED))); } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java index a2798d14..4802d40d 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/BuildGui.java @@ -150,7 +150,7 @@ protected void createGui() { // Zone menu. setItem(17, Utils.createItem(Material.BARREL, 1, Utils.title("Zone Menu"), Utils.line("View all zones you can build in.")), (NetworkUser u) -> { - // Must be a jr.builder to open this menu. + // Must have zone joining perms to open this menu. if (u.player.hasPermission("uknet.zones.join")) { // Delete this gui. @@ -161,7 +161,7 @@ protected void createGui() { u.mainGui.open(u.player); } else { - u.player.sendMessage(ChatUtils.error("You must be at least a Jr.Builder to join zones.")); + u.player.sendMessage(ChatUtils.error("You must be at least " + constants.minrankZoneJoin() + " to join zones.")); } }); @@ -192,8 +192,8 @@ protected void createGui() { Claimable: - No active owner + - uknet.regions.staff_request.always: Always requires request - uknet.regions.staff_request.bypass: Join region without request. - - staff_request.always: Staff request - Check radius if any nearby region is claimed. - Has active owner - Default (Owner request) @@ -201,7 +201,7 @@ protected void createGui() { */ - // Join region (Jr.Builder+ only) + // Join region (Users with uknet.regions.join only) // If region is claimable. // Check if the player is in a region. Optional optionalRegionUser = regionManager.getUserByPlayer(user.player); @@ -252,101 +252,115 @@ protected void createGui() { // Check if the region is claimable. if (regionManager.isClaimable(region)) { - // If the region has an owner. - if (regionManager.hasActiveOwner(region)) { + boolean hasOwner = regionManager.hasActiveOwner(region); + String owner = (hasOwner) ? regionManager.ownerName(region) : "noone"; + boolean alwaysStaffApproval = user.player.hasPermission("uknet.regions.staff_request.always"); - // Check if the region is public. - if (regionManager.status(region) == RegionStatus.PUBLIC) { + // If the region has an owner. + if (hasOwner) { + if (alwaysStaffApproval) setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), - Utils.line("The region is owned by ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), - Utils.line("The region is public, so they don't need to accept your " + "request.")), (NetworkUser u) -> { + Utils.line("The region is owned by ").append(Component.text(owner, NamedTextColor.GRAY)), + Utils.line("They must accept the request for you to join."), + Utils.line("You must also receive staff approval to join this region.")), (NetworkUser u) -> { + regionManager.requestRegion(region, u.player, RegionManager.RequestType.BOTH); + u.player.closeInventory(); + }); + // Check if the region is public. + else if (regionManager.status(region) == RegionStatus.PUBLIC) + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), + Utils.line("The region is owned by ").append(Component.text(owner, NamedTextColor.GRAY)), + Utils.line("The region is public, so they don't need to accept your request.")), (NetworkUser u) -> { regionManager.joinRegion(region, u.player); u.player.closeInventory(); }); - } else { + else // Join requires owner to approve request. setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to request to join the region you are standing in."), - Utils.line("The region is owned by ").append(Component.text(regionManager.ownerName(region), NamedTextColor.GRAY)), + Utils.line("The region is owned by ").append(Component.text(owner, NamedTextColor.GRAY)), Utils.line("They must accept the request for you to join.")), (NetworkUser u) -> { - regionManager.requestRegion(region, u.player, false); + regionManager.requestRegion(region, u.player, RegionManager.RequestType.OWNER); u.player.closeInventory(); }); - } - } else - - // Join region. - setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), - Utils.line("The region currently has no active owner."), Utils.line("Joining the region will make you the region owner.")), (NetworkUser u) -> { - - // If the player does not have the bypass permission. - // Check if any nearby regions are claimed by someone else. - // If true then the region needs to be checked by a staff member. - if (!u.player.hasPermission("uknet.regions.staff_request.bypass")) { - - // If staff approval is always required do that or if the region was - // previously claimed. - if (constants.regionStaffRequestAlways() || regionManager.wasClaimed(region)) { - regionManager.requestRegion(region, u.player, true); - u.player.closeInventory(); - } else { - - // Get region coords. - int x = Integer.parseInt(region.regionName().split(",")[0]); - int z = Integer.parseInt(region.regionName().split(",")[1]); - - // Get the radius. - int radius = constants.regionStaffRequestRadius(); - - // For zero radius, skip. - if (radius != 0) { - - // Subtract the config radius value. - x -= radius; - z -= radius; - - // Iterate through all regions in the radius. - for (int i = x; i <= x + radius * 2; i++) { - for (int j = z; j <= z + radius * 2; j++) { - - String regionName = i + "," + j; - - // If the region exists, check if it has an owner that is - // not the player. - if (regionManager.exists(regionName)) { - Region regionInRadius = regionManager.getRegion(regionName); - if (regionManager.hasOwner(regionInRadius)) { - if (!regionManager.getOwner(regionInRadius).equals(u.player.getUniqueId().toString())) { - // Staff approval is required. - regionManager.requestRegion(region, u.player, true); - u.player.closeInventory(); - return; - } + } else { // No Owner + + boolean staffApproval = alwaysStaffApproval; + // If not automatic staff approval, and the player does not have the bypass permission + // Check if the region was previously claimed or staff request is always required + // Check if any nearby regions are claimed by someone else. + // If true then the region needs to be checked by a staff member. + if (!staffApproval && !user.player.hasPermission("uknet.regions.staff_request.bypass")) { + + staffApproval = constants.regionStaffRequestAlways() || regionManager.wasClaimed(region); + + //If still not requiring staff approval, check the neighbour regions + if (!staffApproval) { + + // Get region coords. + int x = Integer.parseInt(region.regionName().split(",")[0]); + int z = Integer.parseInt(region.regionName().split(",")[1]); + + // Get the radius. + int radius = constants.regionStaffRequestRadius(); + + // For zero radius, skip. + if (radius != 0) { + + // Subtract the config radius value. + x -= radius; + z -= radius; + + // Iterate through all regions in the radius. + for (int i = x; (i <= x + radius * 2) && !staffApproval; i++) { + for (int j = z; (j <= z + radius * 2) && !staffApproval ; j++) { + + String regionName = i + "," + j; + + // If the region exists, check if it has an owner that is + // not the player. + if (regionManager.exists(regionName)) { + Region regionInRadius = regionManager.getRegion(regionName); + if (regionManager.hasOwner(regionInRadius)) { + if (!regionManager.getOwner(regionInRadius).equals(user.player.getUniqueId().toString())) { + // Staff approval is required. + staffApproval = true; } } } } } - - regionManager.joinRegion(region, u.player); - u.player.closeInventory(); } - } else { + } + } + + if (staffApproval) + // Join region. + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), + Utils.line("The region currently has no active owner."), Utils.line("Joining the region will make you the region owner."), + Utils.line("You will require staff approval to join this region.")), (NetworkUser u) -> { + regionManager.requestRegion(region, u.player, RegionManager.RequestType.STAFF); + u.player.closeInventory(); + }); + else + + setItem(4, Utils.createItem(Material.DARK_OAK_DOOR, 1, Utils.title("Join Region"), Utils.line("Click to join the region you are standing in."), + Utils.line("The region currently has no active owner."), Utils.line("Joining the region will make you the region owner.")), (NetworkUser u) -> { regionManager.joinRegion(region, u.player); u.player.closeInventory(); - } - }); + }); + } } else { // If the region is open. if (regionManager.status(region) == RegionStatus.OPEN) { setItem(4, Utils.createItem(Material.SPYGLASS, 1, Utils.title("Open Region"), Utils.line("This region is open to all Jr.Builder+."), - Utils.line("You can build here without claiming."))); + Utils.line("They can build here without claiming."))); } else { // This region is not claimable. @@ -356,9 +370,9 @@ protected void createGui() { } } else { - // Can't claim since you don't have jr.builder. + // Can't claim since you don't have regions.join. setItem(4, Utils.createItem(Material.STRUCTURE_VOID, 1, Utils.title("Unable to Join Region"), Utils.line("To be able to join a region you"), - Utils.line("must gain at least Jr.Builder or above."), + Utils.line("must gain at least " + constants.minrankRegionClaim() + " or above."), Utils.line("For more information type ").append(Component.text("/help building", NamedTextColor.GRAY)))); } } else { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java index 30662109..19d5cb67 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/ZoneInfo.java @@ -147,7 +147,7 @@ public void createGui() { }); } else { - setItem(18, Utils.createItem(Material.IRON_DOOR, 1, Utils.title("Set Public"), Utils.line("Public zones allow Jr.Builder+"), + setItem(18, Utils.createItem(Material.IRON_DOOR, 1, Utils.title("Set Public"), Utils.line("Public zones allow "+ provider.constants().minrankZoneJoin()+"+"), Utils.line("to join the zone without invitation.")), (NetworkUser u) -> { // Set zone to private and refresh this gui. diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java index 666b1908..3c9c44f9 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/RegionInfo.java @@ -187,7 +187,7 @@ protected void createGui() { // Approve any active region requests for this region. // Make sure this is done on the correct server. - // Create teleport region event. + // Create accept region event. if (regionManager.hasRequests(region)) { globalSQL.update("INSERT INTO server_events(uuid,server,event) VALUES('" + u.player.getUniqueId() + "','" + globalSQL.getString( "SELECT name FROM server_data WHERE type='EARTH';") + "','region request accept " + region.regionName() + "');"); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java index 647729f4..783e480b 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/regions/ReviewRegionRequest.java @@ -5,6 +5,7 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.papercore.LocationAdapter; import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.Request; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.sql.GlobalSQL; @@ -22,6 +23,7 @@ public class ReviewRegionRequest extends NetworkRefreshableGui { private final RegionSQL regionSQL; private final Request request; private final boolean staff; + private final RegionManager.RequestType requestType; public ReviewRegionRequest(GuiProvider provider, Request request, boolean staff) { @@ -30,6 +32,10 @@ public ReviewRegionRequest(GuiProvider provider, Request request, boolean staff) this.regionSQL = provider.regionSQL(); this.request = request; this.staff = staff; + if (staff) + requestType = RegionManager.RequestType.STAFF; + else + requestType = RegionManager.RequestType.OWNER; } protected void createGui() { @@ -41,7 +47,7 @@ protected void createGui() { // Create event to accept request. provider.eventAPI().createEvent(u.player.getUniqueId().toString(), provider.globalSQL().getString("SELECT name FROM server_data WHERE " + "type='EARTH';"), - "region request accept " + request.region + " " + request.uuid); + "region request accept " + request.region + " " + request.uuid +" " + requestType.name().toLowerCase()); // Return to the request menu. this.delete(); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java index 29bdd105..f7539daf 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/staff/StaffGui.java @@ -121,14 +121,14 @@ protected void createGui() { int rRequestCount = provider.regionSQL().getInt("SELECT COUNT(region) FROM region_requests WHERE " + "staff_accept=0"); Component rRequestString; if (rRequestCount == 1) { - rRequestString = Utils.line("There is currently ").append(Component.text(1, NamedTextColor.GRAY)).append(Utils.line(" region join request by Jr.Builders.")); + rRequestString = Utils.line("There is currently ").append(Component.text(1, NamedTextColor.GRAY)).append(Utils.line(" region join request.")); } else { rRequestString = Utils.line("There are currently ").append(Component.text(rRequestCount, NamedTextColor.GRAY)) - .append(Utils.line(" region join requests by Jr.Builders.")); + .append(Utils.line(" region join requests.")); } setItem(19, Utils.createItem(Material.CHEST_MINECART, 1, Utils.title("Review Region Requests"), - Utils.line("Opens a menu to review active region join requests by Jr.Builders."), rRequestString), (NetworkUser u) -> { + Utils.line("Opens a menu to review active region join requests."), rRequestString), (NetworkUser u) -> { if (provider.regionSQL().hasRow("SELECT region FROM region_requests WHERE " + "staff_accept=0;")) { if (u.player.hasPermission("uknet.regions.request")) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 51b96d0f..0383e013 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -157,6 +157,10 @@ public net.bteuk.network.core.Constants getConstants() { String earthWorld = config.getString("regions.earth_world", "earth"); + String minrankGeneration = config.getString("minrank_generation", "Jr.Builder"); + String minrankRegionClaim = config.getString("minrank_regionclaim", "Jr.Builder"); + String minrankZoneJoin = config.getString("minrank_zonejoin", "Jr.Builder"); + boolean plotSystemEnabled = config.getBoolean("plot_system_enabled"); boolean moderationEnabled = config.getBoolean("staff.moderation.enabled"); @@ -201,7 +205,7 @@ public net.bteuk.network.core.Constants getConstants() { log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, + motdText, minrankGeneration, minrankRegionClaim, minrankZoneJoin, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey, navigationRadius, compulsoryTutorial, afkTime, mapEnabled, mapServer, mapLocation, spawnLocation); } diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index dd2970fc..73a9e1d4 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Config version; do not update this manually as it could break the config. -version: 1.8.0 +version: 1.8.1 # MySQL is mandatory for this plugin. # Login information @@ -171,4 +171,9 @@ motd: text: "" # Whether the skulls plugin is used as the head database. -skulls_plugin_enabled: true \ No newline at end of file +skulls_plugin_enabled: true + +minrank_generation: Jr.Builder +minrank_regionclaim: Jr.Builder +minrank_zonejoin: Jr.Builder +minrank_publicjoin: Jr.Builder \ No newline at end of file diff --git a/Regions/pom.xml b/Regions/pom.xml index aa37921f..b7df6375 100644 --- a/Regions/pom.xml +++ b/Regions/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.0 + 1.8.1 net.bteuk.network diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java index 68012777..0861cecf 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionEvent.java @@ -58,17 +58,33 @@ public void event(String uuid, String[] event, String eMessage) { case "request" -> { if (event[2].equals("accept")) { + // 'region', request, accept/deny, region, uuid, owner/staff + + region = regionManager.getRegion(event[3]); + // If length is 4, then no user is specified; this implies that it should accept all requests for // the region, rather than a specific request. - region = regionManager.getRegion(event[3]); if (event.length == 4) { regionManager.acceptRequests(region); } else { + RegionManager.RequestType requestType; + + // The 6th argument specifies whether this is staff or owner approval + if (event[5].equals("owner")) + requestType = RegionManager.RequestType.OWNER; + else if (event[5].equals("staff")) + requestType = RegionManager.RequestType.STAFF; + else + { + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", + ChatUtils.error("An error occurred - the request type was malformatted: "+event[5]), true); + chatAPI.sendDirectMessage(directMessage); + return; + } // The 5th argument specifies the uuid of the player who created the request. - - regionManager.acceptRequest(region, event[4]); + regionManager.acceptRequest(region, event[4], requestType); // Send feedback to the user who accepted the request. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java index b6218681..5f6ec5f5 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionManager.java @@ -420,8 +420,32 @@ public void acceptRequests(Region region) { } // Accept a request for a specific user. - public void acceptRequest(Region region, String uuid) { + public void acceptRequest(Region region, String uuid, RequestType type) { + switch (type) { + case BOTH -> + { confirmRequest(region, uuid); } + case STAFF -> { + // Updates the DB with staff accept set to 1 + regionSQL.update("UPDATE region_requests SET staff_accept = 1 WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "'; "); + // Checks whether both approvals are now complete and if so, adds the players + checkRequestAndMigrate(region, uuid); + } + case OWNER -> { + // Updates the DB with owner accept set to 1 + regionSQL.update("UPDATE region_requests SET owner_accept = 1 WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "'; "); + // Checks whether both approvals are now complete and if so, adds the players + checkRequestAndMigrate(region, uuid); + } + } + } + + private void checkRequestAndMigrate(Region region, String uuid) { + if (regionSQL.getBoolean("Select staff_accept & owner_accept from region_requests where region = '" + region.regionName() + "' AND " + "uuid='" + uuid + "'; ")) + confirmRequest(region, uuid); + } + private void confirmRequest(Region region, String uuid) + { // Get the coordinate id for the request. int coordinate_id = regionSQL.getInt("SELECT coordinate_id FROM region_requests WHERE " + "region='" + region.regionName() + "' AND uuid='" + uuid + "';"); @@ -432,6 +456,7 @@ public void acceptRequest(Region region, String uuid) { regionSQL.update("DELETE FROM region_requests WHERE region='" + region.regionName() + "' AND " + "uuid='" + uuid + "'; "); } + // Deny a request for a specific user. public void denyRequest(Region region, String uuid) { @@ -456,7 +481,7 @@ public void cancelRequest(Region region, Player player) { // Join region with owner or staff request. // If staff request is true then it requires a staff request else it's an owner request. - public void requestRegion(Region region, Player player, boolean staffRequest) { + public void requestRegion(Region region, Player player, RequestType requestType) { // Check if you don't already have a request for this region. if (hasRequest(region, player.getUniqueId().toString())) { @@ -468,37 +493,57 @@ public void requestRegion(Region region, Player player, boolean staffRequest) { // Get coordinate of player. int coordinate = coordinateAPI.addCoordinate(LocationAdapter.adapt(player.getLocation())); - if (staffRequest) { - // Staff request - // Create request. - regionSQL.update( - "INSERT INTO region_requests(region,uuid,owner,staff_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( - region) + "',0," + coordinate + ");"); + switch (requestType) + { + case BOTH -> { + // Owner request - // Send message to player. - player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", awaiting staff review."))); + // Create request. + regionSQL.update( + "INSERT INTO region_requests(region,uuid,owner,owner_accept,staff_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( + region) + "',0,0," + coordinate + ");"); - ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", - ChatUtils.success("A region join request has been submitted by %s for region %s", player.getName(), region.regionName())); - chat.sendChatMessage(chatMessage); - } else { - // Owner request + // Send message to player. + player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", awaiting owner and staff review."))); - // Create request. - regionSQL.update( - "INSERT INTO region_requests(region,uuid,owner,owner_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( - region) + "',0," + coordinate + ");"); + // Send the owner a message. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", + ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), false); + chat.sendDirectMessage(directMessage); + } + case OWNER -> { + // Owner request - // Send message to player. - player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) - .append(ChatUtils.success(", awaiting owner review."))); + // Create request. + regionSQL.update( + "INSERT INTO region_requests(region,uuid,owner,owner_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( + region) + "',0," + coordinate + ");"); - // Send the owner a message. - DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", - ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), false); - chat.sendDirectMessage(directMessage); + // Send message to player. + player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", awaiting owner review."))); + + // Send the owner a message. + DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), getOwner(region), "server", + ChatUtils.success("%s has requested to join region %s.", player.getName(), getTag(region, getOwner(region))), false); + chat.sendDirectMessage(directMessage); + } + case STAFF -> { + // Create request. + regionSQL.update( + "INSERT INTO region_requests(region,uuid,owner,staff_accept," + "coordinate_id) VALUES ('" + region.regionName() + "','" + player.getUniqueId() + "','" + getOwner( + region) + "',0," + coordinate + ");"); + + // Send message to player. + player.sendMessage(ChatUtils.success("Requested to join region ").append(Component.text(region.regionName(), NamedTextColor.DARK_AQUA)) + .append(ChatUtils.success(", awaiting staff review."))); + + ChatMessage chatMessage = new ChatMessage(ChatChannels.REVIEWER.getChannelName(), "server", + ChatUtils.success("A region join request has been submitted by %s for region %s", player.getName(), region.regionName())); + chat.sendChatMessage(chatMessage); + } } } @@ -761,4 +806,9 @@ private void registerInactivityTimer(TimerAPI timerAPI) { } }, 60_000L); } + + public enum RequestType + { + STAFF, OWNER, BOTH + } } diff --git a/pom.xml b/pom.xml index be7fd31a..0ccf97f7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.bteuk Network - 1.8.0 + 1.8.1 pom Network From 2634579c95e8ea8096e294aee138418eb307ce51 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 19 Jan 2026 20:17:25 +0100 Subject: [PATCH 61/96] Bugfix with updating feedback while verifying a plot. --- .../src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index f2260ba9..12b3fdbe 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -344,7 +344,7 @@ public List getBookPages(int bookId) { @Override public void updatePlotCategoryFeedback(int reviewId, String category, String selection, int bookId) { - plotSQL.update("UPDATE plot_category_feedback SET category='" + category + "', selection='" + selection + "', book_id=" + bookId + " WHERE review_id=" + reviewId + ";"); + plotSQL.update("UPDATE plot_category_feedback SET selection='" + selection + "', book_id=" + bookId + " WHERE review_id=" + reviewId + " AND category='" + category + "';"); } @Override From 61ac8e9bb0847d3f80c699b1043025aac6a6df68 Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 19 Jan 2026 22:07:07 +0000 Subject: [PATCH 62/96] Socket Handler changes to fix bugs in standalone mode. Moves socket setup into the socket handler, created a static instance of the handler which can be accessed throughout and modified all SendSocketMessages to go through a new method in the SocketHandlerImpl, which always checks whether the socket handler is initialised before sending. --- Core/pom.xml | 2 +- Network-API/pom.xml | 2 +- PaperCore/pom.xml | 2 +- Plugin/pom.xml | 2 +- .../java/net/bteuk/network/CustomChat.java | 39 ++------- .../main/java/net/bteuk/network/Network.java | 30 ++++--- .../net/bteuk/network/SocketHandlerImpl.java | 83 +++++++++++++++++-- .../java/net/bteuk/network/commands/Afk.java | 3 +- .../net/bteuk/network/commands/Discord.java | 11 ++- .../java/net/bteuk/network/commands/Msg.java | 5 +- .../java/net/bteuk/network/commands/Nick.java | 8 +- .../bteuk/network/commands/PmuteAction.java | 3 +- .../net/bteuk/network/commands/Reply.java | 8 +- .../eventing/listeners/CommandPreProcess.java | 3 +- .../network/eventing/listeners/Connect.java | 7 +- .../net/bteuk/network/utils/NetworkUser.java | 3 +- .../java/net/bteuk/network/utils/Roles.java | 5 +- .../net/bteuk/network/utils/SwitchServer.java | 3 +- .../bteuk/network/utils/staff/Moderation.java | 7 +- Regions/pom.xml | 2 +- pom.xml | 2 +- 21 files changed, 143 insertions(+), 87 deletions(-) diff --git a/Core/pom.xml b/Core/pom.xml index d49a931e..ef08b77f 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 net.bteuk.network diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 889cbe7d..588ec6fd 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -13,7 +13,7 @@ api Network API API for the Network plugin - 1.8.1 + 1.8.2 diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index 56f54b61..cafcc6b6 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 net.bteuk.network diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 8b0f8b50..7a09a7ba 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 net.bteuk.network diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index f3591d2b..8f9f8678 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -41,15 +41,12 @@ public class CustomChat implements Listener, ChatAPI { private static final String AFK = "%s is now afk"; private static final String NOT_AFK = "%s is no longer afk"; private final Network instance; - private OutputSocket outputSocket; private final Constants constants; private final Afk afk; private final GlobalSQL globalSQL; private final Moderation moderation; private final Roles roles; - private InputSocket inputSocket; - public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Moderation moderation, Roles roles) { this.instance = instance; @@ -61,27 +58,9 @@ public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL glob instance.getServer().getPluginManager().registerEvents(this, instance); - // Set up the output socket. - if (!constants.standalone()) { - outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); - - // Register input socket for receiving messages from the proxy. - int inputSocketPort = constants.chatSocketInputPort(); - if (inputSocketPort == 0) { - log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); - } else { - // Create the input socket. - inputSocket = new InputSocket(inputSocketPort); - } - } - log.info("Successfully enabled Chat!"); } - public void registerSocketHandler(SocketHandler socketHandler) { - inputSocket.start(socketHandler); - } - public static ChatMessage getChatMessage(Component component, NetworkUser u) { ChatMessage chatMessage = new ChatMessage(); @@ -179,13 +158,7 @@ public void onPlayerChatEvent(AsyncChatEvent e) { afk.updateAfkStatus(user, false); } ChatMessage chatMessage = getChatMessage(e.message(), user); - sendSocketMessage(chatMessage); - } - } - - public void sendSocketMessage(AbstractTransferObject chatMessage) { - if (!constants.standalone()) { - outputSocket.sendSocketMessage(chatMessage); + sendChatMessage(chatMessage); } } @@ -254,7 +227,7 @@ public void handleDiscordLinking(DiscordLinking discordLinking) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), true); - outputSocket.sendSocketMessage(discordRole); + SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); user.sendMessage(ChatUtils.success("Your discord has been linked!")); }); @@ -303,7 +276,7 @@ public void sendChatMessage(ChatMessage message) { if (constants.standalone() && message.getChannel().equals(ChatChannels.GLOBAL.getChannelName())) { instance.getServer().broadcast(message.getComponent()); } else { - sendSocketMessage(message); + SocketHandlerImpl.sendSocketMessageIfOnline(message); } } @@ -314,20 +287,20 @@ public void sendDirectMessage(DirectMessage message) { instance.getServer().getOnlinePlayers().stream().filter(player -> player.getUniqueId().toString().equals(message.getRecipient())).findFirst() .ifPresentOrElse(player -> player.sendMessage(message.getComponent()), () -> globalSQL.insertMessage(message)); } else { - sendSocketMessage(message); + SocketHandlerImpl.sendSocketMessageIfOnline(message); } } public void sendDiscordDirectMessage(DiscordDirectMessage message) { if (!constants.standalone()) { - sendSocketMessage(message); + SocketHandlerImpl.sendSocketMessageIfOnline(message); } } @Override public void sendPlotMessage(PlotMessage message) { if (!constants.standalone() && constants.plotSystemEnabled()) { - sendSocketMessage(message); + SocketHandlerImpl.sendSocketMessageIfOnline(message); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 00da6493..f110e966 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -341,21 +341,30 @@ public void enablePlugin() { Moderation moderation = new Moderation(this, eventAPI); - // Enables chat, both global chat and normal chat are handled through it. - chat = new CustomChat(this, constants, afk, globalSQL, moderation, roleAPI); - afk.registerChat(chat); - roleAPI.registerChat(chat); - // Create the region manager if enabled. if (constants.regionsEnabled()) { regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventAPI, worldGuardAPI, constants, this, serverAPI); commandManager.registerCommand(new RegionCommand(regionManager, eventAPI, constants)); } + // Set up socket listening - used for sending messages cross-server on multi-server setups + SocketHandlerImpl socketHandler = null; + if (!constants.standalone()) { + socketHandler = new SocketHandlerImpl(this, constants); + } + // Setup connect, this handles all connections to the server. // Listener and manager of server connections. Connect connect = new Connect(this, constants, tab, roleAPI, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); - new SocketHandlerImpl(this, chat, tab, connect); + + // Enables chat, both global chat and normal chat are handled through it. + chat = new CustomChat(this, constants, afk, globalSQL, moderation, roleAPI); + afk.registerChat(chat); + roleAPI.registerChat(chat); + + if (!constants.standalone()) { + socketHandler.addComponents(chat, tab, connect); + } // Create the navigator. navigatorItem = Utils.createItem(Material.NETHER_STAR, 1, Utils.title("Navigator"), Utils.line("Click to open the navigator.")); @@ -414,7 +423,7 @@ public void enablePlugin() { */ commandManager.registerCommand(new Buildings(this, constants)); if (!constants.standalone()) { - commandManager.registerCommand(new Discord(this, chat, roleAPI, constants)); + commandManager.registerCommand(new Discord(this, roleAPI, constants)); commandManager.registerCommand(new Focus(this, constants)); } @@ -451,8 +460,8 @@ public void enablePlugin() { commandManager.registerCommand(Msg.of(this, "w")); commandManager.registerCommand(Msg.of(this, "tell")); - commandManager.registerCommand(new Reply(chat)); - commandManager.registerCommand(new Nick(this, chat)); + commandManager.registerCommand(new Reply()); + commandManager.registerCommand(new Nick(this)); } commandManager.registerCommand(new Promote(this, roleAPI, chat)); @@ -538,7 +547,8 @@ public void enablePlugin() { new Timers(this, globalSQL, eventAPI, constants, afk); // Let the Proxy know that the server is enabled. - chat.sendSocketMessage(new ServerStartup(constants.serverName())); + if (!constants.standalone()) + socketHandler.sendSocketMessage(new ServerStartup(constants.serverName())); // Register the API as a service. getServer().getServicesManager().register(NetworkAPI.class, this, this, ServicePriority.Normal); diff --git a/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java b/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java index 147fe55d..8ddf07f7 100644 --- a/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java @@ -1,6 +1,7 @@ package net.bteuk.network; import lombok.extern.java.Log; +import net.bteuk.network.core.Constants; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.lib.dto.AbstractTransferObject; import net.bteuk.network.lib.dto.AddTeamEvent; @@ -12,6 +13,8 @@ import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserRemove; import net.bteuk.network.lib.dto.UserUpdate; +import net.bteuk.network.lib.socket.InputSocket; +import net.bteuk.network.lib.socket.OutputSocket; import net.bteuk.network.lib.socket.SocketHandler; @Log @@ -19,22 +22,88 @@ public class SocketHandlerImpl implements SocketHandler { private final Network instance; - private final CustomChat chat; + private CustomChat chat; - private final TabManager tabManager; + private TabManager tabManager; - private final Connect connect; + private Connect connect; - public SocketHandlerImpl(Network instance, CustomChat chat, TabManager tabManager, Connect connect) { + private OutputSocket outputSocket; + private InputSocket inputSocket; + + private static SocketHandlerImpl socketHandler; + + /** + * + * @param message + * @return Whether the socket message was sent + */ + public static boolean sendSocketMessageIfOnline(AbstractTransferObject message) + { + if (socketHandler != null) { + socketHandler.sendSocketMessage(message); + return true; + } + else + return false; + } + + public SocketHandlerImpl(Network instance, CustomChat chat, TabManager tabManager, Connect connect, Constants constants) { this.instance = instance; this.chat = chat; this.tabManager = tabManager; this.connect = connect; + // Set up the output socket. + outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); + + // Register input socket for receiving messages from the proxy. + int inputSocketPort = constants.chatSocketInputPort(); + if (inputSocketPort == 0) { + log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); + } else { + // Create the input socket. + inputSocket = new InputSocket(inputSocketPort); + } + + // Register the socket handler. + registerSocketHandler(this); + + socketHandler = this; + } + + public SocketHandlerImpl(Network instance, Constants constants) { + this.instance = instance; + + // Set up the output socket. + outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); + + // Register input socket for receiving messages from the proxy. + int inputSocketPort = constants.chatSocketInputPort(); + if (inputSocketPort == 0) { + log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); + } else { + // Create the input socket. + inputSocket = new InputSocket(inputSocketPort); + } + // Register the socket handler. - chat.registerSocketHandler(this); + registerSocketHandler(this); + + socketHandler = this; + } + + public void addComponents(CustomChat chat, TabManager tabManager, Connect connect) { + this.chat = chat; + this.tabManager = tabManager; + this.connect = connect; + } + + public void sendSocketMessage(AbstractTransferObject message) { + outputSocket.sendSocketMessage(message); } + @Override public AbstractTransferObject handle(AbstractTransferObject abstractTransferObject) { switch (abstractTransferObject) { @@ -52,4 +121,8 @@ public AbstractTransferObject handle(AbstractTransferObject abstractTransferObje } return null; } + + public void registerSocketHandler(SocketHandler socketHandler) { + inputSocket.start(socketHandler); + } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index f5054d3c..a62d944a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; @@ -36,7 +37,7 @@ public void updateAfkStatus(NetworkUser user, boolean afk) { UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(user.player.getUniqueId().toString()); userUpdateEvent.setAfk(afk); - chat.sendSocketMessage(userUpdateEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(userUpdateEvent); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java index 87d513df..ea16e635 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.core.Constants; @@ -25,13 +26,11 @@ public class Discord extends AbstractCommand { private final Network instance; - private final CustomChat chat; private final Roles roles; private final Constants constants; - public Discord(Network instance, CustomChat chat, Roles roles, Constants constants) { + public Discord(Network instance, Roles roles, Constants constants) { this.instance = instance; - this.chat = chat; this.roles = roles; this.constants = constants; setTabCompleter(new FixedArgSelector(Arrays.asList("link", "unlink"), 0)); @@ -75,7 +74,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setToken(token); - chat.sendSocketMessage(discordLinking); + SocketHandlerImpl.sendSocketMessageIfOnline(discordLinking); player.sendMessage(ChatUtils.success("To link your Discord please DM the code %s to the UK Bot within" + " the next 5 minutes.", token)); return; @@ -97,13 +96,13 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), false); - chat.sendSocketMessage(discordRole); + SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); DiscordLinking discordLinking = new DiscordLinking(); discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setDiscordId(user.getDiscordId()); discordLinking.setUnlink(true); - chat.sendSocketMessage(discordLinking); + SocketHandlerImpl.sendSocketMessageIfOnline(discordLinking); user.isLinked = false; player.sendMessage(ChatUtils.success("Unlinked your Discord.")); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java index c6e35e5d..b70eb10a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.dto.PrivateMessage; import net.bteuk.network.lib.enums.ChatChannels; @@ -19,11 +20,9 @@ public class Msg extends AbstractCommand { private static final Component ERROR = ChatUtils.error("/msg [player] "); - private final Network instance; private final String commandName; public Msg(Network instance, String commandName) { - this.instance = instance; this.commandName = commandName; setTabCompleter(new PlayerSelector(instance)); } @@ -46,7 +45,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Send a direct message, the message is created using all other command arguments. String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); PrivateMessage privateMessage = new PrivateMessage(ChatChannels.GLOBAL.getChannelName(), player.getName(), args[0],message, false); - instance.getChat().sendSocketMessage(privateMessage); + SocketHandlerImpl.sendSocketMessageIfOnline(privateMessage); } public static Msg of(Network instance, String label) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java index d3dfdafc..c7437b06 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.ConditionalPlayerSelector; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.commands.tabcompleters.MultiArgSelector; @@ -29,11 +30,8 @@ public class Nick extends AbstractCommand { private final Network instance; - private final CustomChat chat; - - public Nick(Network instance, CustomChat chat) { + public Nick(Network instance) { this.instance = instance; - this.chat = chat; setTabCompleter(new MultiArgSelector(List.of(new FixedArgSelector(Collections.singletonList("reset"), 0), new ConditionalPlayerSelector(instance, 1, args -> args != null && args.length > 0 && "reset".equalsIgnoreCase(args[0]))))); } @@ -96,7 +94,7 @@ private void updateDisplayName(String uuid, Component displayName) { UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(uuid); userUpdateEvent.setDisplayName(displayName); - chat.sendSocketMessage(userUpdateEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(userUpdateEvent); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java index 535fb36e..eadcd0c8 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.dto.MuteEvent; import net.kyori.adventure.text.Component; @@ -46,6 +47,6 @@ public void onCommand(CommandSourceStack stack, String[] args, boolean mute) { MuteEvent muteEvent = new MuteEvent(player.getUniqueId().toString(), uuid, mute); // Feedback will be sent through a direct message to the player by the proxy. - instance.getChat().sendSocketMessage(muteEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(muteEvent); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java index 5ebcddb1..a7352f9a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java @@ -2,6 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.CustomChat; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.lib.dto.ReplyMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; @@ -13,11 +14,6 @@ public class Reply extends AbstractCommand { private static final String ERROR = "/r [message]"; - private final CustomChat chat; - - public Reply(CustomChat chat) { - this.chat = chat; - } public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { @@ -34,7 +30,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } String message = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); ReplyMessage replymessage = new ReplyMessage(ChatChannels.GLOBAL.getChannelName(),player.getName(),message,false); - chat.sendSocketMessage(replymessage); + SocketHandlerImpl.sendSocketMessageIfOnline(replymessage); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index ef0345d1..e0cfc139 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -2,6 +2,7 @@ import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.Afk; import net.bteuk.network.core.Constants; @@ -168,6 +169,6 @@ public void onServerClose(ArrayList users) { users.clear(); // Let the Proxy know the server is closing. - instance.getChat().sendSocketMessage(new ServerShutdown(constants.serverName())); + SocketHandlerImpl.sendSocketMessageIfOnline(new ServerShutdown(constants.serverName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 07e38b8f..38dcbc8f 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -4,6 +4,7 @@ import lombok.extern.java.Log; import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; @@ -197,7 +198,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { UserDisconnect disconnectEvent = new UserDisconnect(); disconnectEvent.setUuid(e.getPlayer().getUniqueId().toString()); disconnectEvent.setServer(constants.serverName()); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(disconnectEvent)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(disconnectEvent)); return; } @@ -239,7 +240,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { } else { // Send a disconnect event to the proxy to handle potential messages. UserDisconnect userDisconnect = user.createDisconnectEvent(); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(userDisconnect)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(userDisconnect)); } } @@ -259,7 +260,7 @@ private void networkJoinEvent(PlayerJoinEvent e) { UserConnectRequest userConnectRequest = new UserConnectRequest(constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer")); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> instance.getChat().sendSocketMessage(userConnectRequest)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(userConnectRequest)); log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", e.getPlayer().getName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index b2e27727..8bd08e68 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -4,6 +4,7 @@ import lombok.Setter; import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.entity.Role; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; @@ -299,7 +300,7 @@ private void setFocusEnabled(boolean enabled) { showPlayers(); } FocusEvent focusEvent = new FocusEvent(player.getUniqueId().toString(), focusEnabled); - instance.getChat().sendSocketMessage(focusEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(focusEvent); } public void hidePlayer(Player playerToHide) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 9180b163..1d963f54 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -3,6 +3,7 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.RoleAPI; import net.bteuk.network.api.entity.Role; import net.bteuk.network.lib.dto.ChatMessage; @@ -225,7 +226,7 @@ public CompletableFuture alterRole(String uuid, String name, String r UserUpdate userUpdate = new UserUpdate(); userUpdate.setUuid(uuid); userUpdate.setTabPlayer(tabPlayer); - customChat.sendSocketMessage(userUpdate); + SocketHandlerImpl.sendSocketMessageIfOnline(userUpdate); // If the new primary role is architect or reviewer, and they were promoted add them to the reviewers // database table. @@ -235,7 +236,7 @@ public CompletableFuture alterRole(String uuid, String name, String r } DiscordRole discordRole = new DiscordRole(uuid, roleId, !remove); - customChat.sendSocketMessage(discordRole); + SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); if (announce && !remove) { sendPromotionChatMessage(name, role); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 40f0e9af..720808ba 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -6,6 +6,7 @@ import com.comphenix.protocol.events.PacketContainer; import lombok.extern.java.Log; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkPlayer; import net.bteuk.network.core.Constants; @@ -74,7 +75,7 @@ public void switchServer(NetworkPlayer player, String server) { UserDisconnect userDisconnect = user.get().createDisconnectEvent(); SwitchServerEvent switchServerEvent = new SwitchServerEvent(player.getUuidAsString(), server, constants.serverName(), userDisconnect); - instance.getChat().sendSocketMessage(switchServerEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(switchServerEvent); } public static void switchToExternalServer(Player player) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index f7e90a90..7aa978e3 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -1,6 +1,7 @@ package net.bteuk.network.utils.staff; import net.bteuk.network.Network; +import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.EventAPI; import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; @@ -65,12 +66,12 @@ public void mute(String uuid, long end_time, String reason) throws NotMutedExcep Component mutedComponent = getMutedComponent(uuid); ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.MUTE, null, uuid, end_time, mutedComponent); - instance.getChat().sendSocketMessage(moderationEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(moderationEvent); // Notify the user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", mutedComponent, true); - instance.getChat().sendSocketMessage(directMessage); + SocketHandlerImpl.sendSocketMessageIfOnline(directMessage); } // Unban the player. @@ -90,7 +91,7 @@ public void unmute(String uuid) { // Update Tab by sending a moderation event. ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.UNMUTE, null, uuid, 0L, null); - instance.getChat().sendSocketMessage(moderationEvent); + SocketHandlerImpl.sendSocketMessageIfOnline(moderationEvent); } // Kick the player. diff --git a/Regions/pom.xml b/Regions/pom.xml index b7df6375..d13ff232 100644 --- a/Regions/pom.xml +++ b/Regions/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 net.bteuk.network diff --git a/pom.xml b/pom.xml index 0ccf97f7..217bb717 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 pom Network From bbed4629bfa63690a7c14f17f5f7694f217497a3 Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 19 Jan 2026 22:08:26 +0000 Subject: [PATCH 63/96] If in standalone mode, now calls to create a new user if not already created. Previously a new user was only created in proxy, so joining the server would break for new users in standalone mode. --- .../network/eventing/listeners/Connect.java | 3 ++ .../java/net/bteuk/network/sql/GlobalSQL.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 38dcbc8f..e8f497ce 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -144,6 +144,9 @@ public void joinServerEvent(PlayerJoinEvent joinEvent) { if (constants.standalone()) { Player player = joinEvent.getPlayer(); + globalSQL.createUser(player.getUniqueId().toString(), player.getName(), + TextureUtils.getTexture(player.getPlayerProfile())); + boolean navigatorEnabled = globalSQL.getBoolean("SELECT navigator FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); boolean teleportEnabled = globalSQL.getBoolean("SELECT teleport_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); boolean nightVisionEnabled = globalSQL.getBoolean("SELECT nightvision_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 5da34834..29e6c216 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -4,6 +4,7 @@ import net.bteuk.network.api.entity.NetworkLocation; import net.bteuk.network.building_counter.Building; import net.bteuk.network.core.Constants; +import net.bteuk.network.core.Time; import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.utils.Coordinate; @@ -288,4 +289,34 @@ public List getOfflineMessages(String uuid) { } return messages; } + + public boolean createUser(String uuid, String name, String playerSkin) { + + int iPlayerThere = getInt("SELECT count(1) FROM player_data WHERE uuid='" + uuid + "'"); + + if (iPlayerThere == 0) + { + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement( + "INSERT INTO player_data(uuid,name,last_online,last_submit,player_skin) VALUES('" + + uuid + "','" + + name + "'," + + Time.currentTime() + "," + + 0 + ",'" + + playerSkin + "');" + ) + ) { + + statement.executeUpdate(); + return true; + + } catch (SQLException e) { + e.printStackTrace(); + return false; + } + } + else + return true; + } } From c6e47f5eb2b454b1009af37b9e75b730c8b9ef5a Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 19 Jan 2026 22:09:25 +0000 Subject: [PATCH 64/96] Now allows for opening of the tutorial gui even if no tutorial server is online, if in standalone mode. --- Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 62e1771b..314de397 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -61,7 +61,7 @@ public NavigatorGui(GuiProvider provider) { u.player.closeInventory(); u.player.sendMessage(ChatUtils.error("You are already in the tutorials server, please use the" + " menu in slot 8.")); } else if (constants.tutorials()) { - if (globalSQL.hasRow("SELECT name FROM server_data WHERE " + "type='TUTORIAL' AND online=1;")) { + if (constants.standalone() || globalSQL.hasRow("SELECT name FROM server_data WHERE " + "type='TUTORIAL' AND online=1;")) { u.mainGui = new TutorialsGui(provider, u); u.mainGui.open(u.player); From f70a0b8f9147bede07c50c78faa66299b2de1b7a Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 19 Jan 2026 22:10:31 +0000 Subject: [PATCH 65/96] Fixes to remove 'starter tutorial redo' and 'next tutorial' options from tutorial menu if they are not available. --- .../network/gui/tutorials/TutorialsGui.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java index 702fa400..fff9da64 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/TutorialsGui.java @@ -158,11 +158,14 @@ private void compulsoryNotFinished(LessonObject compulsoryLesson) { * Adds the menu items for if the compulsory tutorial has been completed, and the main tutorials system is unlocked */ private void compulsoryFinished() { - // Compulsory tutorial - ItemStack compulsory = teachingtutorials.utils.Utils.createItem(Material.JUNGLE_DOOR, 1, Utils.title("Redo the Starter Tutorial"), - Utils.line("Refresh your essential knowledge")); - super.setItem(9, compulsory, (NetworkUser u) -> startTutorial(currentLessons, u, this, compulsoryTutorial, null, log)); + if (compulsoryTutorial != null) + { + // Compulsory tutorial + ItemStack compulsory = teachingtutorials.utils.Utils.createItem(Material.JUNGLE_DOOR, 1, Utils.title("Redo the Starter Tutorial"), + Utils.line("Refresh your essential knowledge")); + super.setItem(9, compulsory, (NetworkUser u) -> startTutorial(currentLessons, u, this, compulsoryTutorial, null, log)); + } //---------- Library Option ---------- ItemStack tutorialLibrary = teachingtutorials.utils.Utils.createItem(Material.BOOKSHELF, 1, Utils.title("Tutorial Library"), @@ -190,10 +193,9 @@ private void compulsoryFinished() { }); // Continue learning/next tutorial - ItemStack continueLearning = teachingtutorials.utils.Utils.createItem(Material.END_CRYSTAL, 1, Utils.title("Start a new Tutorial:"), - Utils.line(nextTutorial.getTutorialName())); - if (nextTutorial != null) { + ItemStack continueLearning = teachingtutorials.utils.Utils.createItem(Material.END_CRYSTAL, 1, Utils.title("Start a new Tutorial:"), + Utils.line(nextTutorial.getTutorialName())); super.setItem(17, continueLearning, (NetworkUser u) -> startTutorial(this.currentLessons, u, this, nextTutorial, null, log)); } } From 5426724d4d06a19e4b11fc435b313d75d1ac8960 Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 19 Jan 2026 22:11:24 +0000 Subject: [PATCH 66/96] Fix to conditional statement so that /st will always open the staff menu regardless of args, and does not display any messages when doing /st. --- .../bteuk/network/commands/staff/Staff.java | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index 28190619..62ee7065 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -51,51 +51,52 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) NetworkUser u = guiProvider.instance().getUser(p); + // If u is null, cancel. + if (u == null) { + log.severe("User " + p.getName() + " can not be found!"); + p.sendMessage(ChatUtils.error("User can not be found, please relog!")); + return; + } + // Check if user is member of staff. // Architects can open the menu but not use the staff chat. if (!(hasPermission(p, "uknet.staff"))) { + // If not staff, but architect, then open menu if (hasPermission(p, "uknet.staff.menu")) { openStaffMenu(u); } + // If not staff and not architect, then return return; } - // If u is null, cancel. - if (u == null) { - log.severe("User " + p.getName() + " can not be found!"); - p.sendMessage(ChatUtils.error("User can not be found, please relog!")); - return; - } - - // If the first arg is chat, switch the player to and from staff chat if enabled. - if (!guiProvider.constants().standalone()) { - if (args.length > 0 && guiProvider.constants().staffChat()) { - if (args[0].equalsIgnoreCase("chat")) { - String channel = GLOBAL.getChannelName(); - if (u.getChatChannel().equals(STAFF.getChannelName())) { - u.player.sendMessage(ChatUtils.success("Disabled staff chat.")); - } else { - // Set the chat channel to staff. - channel = STAFF.getChannelName(); - u.player.sendMessage(ChatUtils.success("Enabled staff chat.")); - } - // Set channel. - u.setChatChannel(channel); - guiProvider.globalSQL().update("UPDATE player_data SET chat_channel='" + channel + "' " + "WHERE uuid='" + p.getUniqueId() + "';"); + // If more than one args, staff chat is enabled, and it is not in standalone, then go to staff chat logic + if ((args.length > 0 && guiProvider.constants().staffChat()) && !guiProvider.constants().standalone()) { + // If the first arg is chat, switch the player to and from staff chat if enabled. + if (args[0].equalsIgnoreCase("chat")) { + String channel = GLOBAL.getChannelName(); + if (u.getChatChannel().equals(STAFF.getChannelName())) { + u.player.sendMessage(ChatUtils.success("Disabled staff chat.")); } else { - // Send a message in staff-chat, by temporarily setting the player's channel to staff. - u.setChatChannel(STAFF.getChannelName()); - guiProvider.chatAPI().sendChatMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); - u.setChatChannel(GLOBAL.getChannelName()); + // Set the chat channel to staff. + channel = STAFF.getChannelName(); + u.player.sendMessage(ChatUtils.success("Enabled staff chat.")); } - return; + // Set channel. + u.setChatChannel(channel); + guiProvider.globalSQL().update("UPDATE player_data SET chat_channel='" + channel + "' " + "WHERE uuid='" + p.getUniqueId() + "';"); } - } else { - u.player.sendMessage(ChatUtils.error("Staff chat is currently not available in standalone mode!")); - } - // If the player has a previous gui, open that. - openStaffMenu(u); + else { + // Send a message in staff-chat, by temporarily setting the player's channel to staff. + u.setChatChannel(STAFF.getChannelName()); + guiProvider.chatAPI().sendChatMessage(CustomChat.getChatMessage(Component.text(String.join(" ", args)), u)); + u.setChatChannel(GLOBAL.getChannelName()); + } + } + // Else, if not staff chat, then open menu + else + // If the player has a previous gui, open that. + openStaffMenu(u); } @Override From e1f169290f497b45af62f48f1def025b0f6e4b8b Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 24 Jan 2026 17:51:45 +0100 Subject: [PATCH 67/96] Set command preprocess priority to low as a workaround for a T+- bug, fixed lights out. --- .../bteuk/network/eventing/listeners/CommandPreProcess.java | 3 ++- Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index ef0345d1..9bba278a 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -14,6 +14,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.server.ServerCommandEvent; @@ -39,7 +40,7 @@ public CommandPreProcess(Network instance, Constants constants, Afk afk, Connect Bukkit.getServer().getPluginManager().registerEvents(this, instance); } - @EventHandler + @EventHandler(priority = EventPriority.LOW) public void onCommandPreProcess(PlayerCommandPreprocessEvent e) { // Reset afk status. diff --git a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java index cf3089be..e3144052 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/LightsOut.java @@ -107,6 +107,7 @@ private void invertLights(int i, int j) { // Refresh the gui. refresh(); + updatePlayerInventory(u.player); } public void refresh() { @@ -116,13 +117,9 @@ public void refresh() { if (Arrays.deepEquals(game, new boolean[9][6])) { endGame(); } else { - // Change items. clear(); createGui(); - - // Set the contents of inventory. - updatePlayerInventory(u.player); } } } From a65c87d7b821e587476c5c43c070209a62706a50 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 25 Jan 2026 11:37:38 +0000 Subject: [PATCH 68/96] Reorder Connect, Chat and RegionManager initialisation to ensure correct dependency order. --- .../main/java/net/bteuk/network/Network.java | 20 +++++++++---------- .../main/java/net/bteuk/network/Timers.java | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index f110e966..398d3655 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -341,27 +341,27 @@ public void enablePlugin() { Moderation moderation = new Moderation(this, eventAPI); - // Create the region manager if enabled. - if (constants.regionsEnabled()) { - regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventAPI, worldGuardAPI, constants, this, serverAPI); - commandManager.registerCommand(new RegionCommand(regionManager, eventAPI, constants)); - } - // Set up socket listening - used for sending messages cross-server on multi-server setups SocketHandlerImpl socketHandler = null; if (!constants.standalone()) { socketHandler = new SocketHandlerImpl(this, constants); } - // Setup connect, this handles all connections to the server. - // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roleAPI, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); - // Enables chat, both global chat and normal chat are handled through it. chat = new CustomChat(this, constants, afk, globalSQL, moderation, roleAPI); afk.registerChat(chat); roleAPI.registerChat(chat); + // Create the region manager if enabled. + if (constants.regionsEnabled()) { + regionManager = new RegionManager(regionSQL, this, coordinateAPI, eventAPI, worldGuardAPI, constants, this, serverAPI); + commandManager.registerCommand(new RegionCommand(regionManager, eventAPI, constants)); + } + + // Setup connect, this handles all connections to the server. + // Listener and manager of server connections. + Connect connect = new Connect(this, constants, tab, roleAPI, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); + if (!constants.standalone()) { socketHandler.addComponents(chat, tab, connect); } diff --git a/Plugin/src/main/java/net/bteuk/network/Timers.java b/Plugin/src/main/java/net/bteuk/network/Timers.java index 43478fcc..bc3567b2 100644 --- a/Plugin/src/main/java/net/bteuk/network/Timers.java +++ b/Plugin/src/main/java/net/bteuk/network/Timers.java @@ -77,6 +77,8 @@ public void startTimers() { for (String[] event : events) { + // [uuid,event,message] + // Deal with events here. log.info("Event: " + event[1]); From b4bd736f85c1dbdffa4f007f17cdda13493a6e37 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 25 Jan 2026 19:39:14 +0000 Subject: [PATCH 69/96] Add standalone getter to NetworkAPI, so that Plotsystem or other plugin knows whether network is in standalone. --- .../src/main/java/net/bteuk/network/api/NetworkAPI.java | 2 ++ Plugin/src/main/java/net/bteuk/network/Network.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java index 05a6ca97..4624d2c5 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/NetworkAPI.java @@ -22,6 +22,8 @@ public interface NetworkAPI { boolean isTutorialsEnabled(); + boolean isStandalone(); + int getMinY(); int getMaxY(); diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 398d3655..406ee9ab 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -655,6 +655,10 @@ public boolean isTutorialsEnabled() { return constants.tutorials(); } + public boolean isStandalone() { + return constants.standalone(); + } + public int getMinY() { return constants.minY(); } From 1f6850a5fa64861f351d36c6984f689624c004b7 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 25 Jan 2026 19:56:16 +0000 Subject: [PATCH 70/96] Fix parent version --- Network-API/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 588ec6fd..30058013 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.1 + 1.8.2 net.bteuk.network From f0f05af0f202faa7736ad7e7c44222e8f4cd73e1 Mon Sep 17 00:00:00 2001 From: George112n Date: Wed, 28 Jan 2026 20:51:34 +0000 Subject: [PATCH 71/96] Remove the duplicate 'locationExists/hasLocation' --- Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java | 2 -- .../main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 5 ----- 2 files changed, 7 deletions(-) diff --git a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java index f4f9a09e..37c10975 100644 --- a/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java +++ b/Network-API/src/main/java/net/bteuk/network/api/PlotAPI.java @@ -156,8 +156,6 @@ public interface PlotAPI { List getLocationRegions(String location); - boolean locationExists(String location); - void deleteLocation(String location); void deleteRegionsForLocation(String location); diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index 12b3fdbe..c85d7ed7 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -367,11 +367,6 @@ public List getLocationRegions(String location) { return plotSQL.getStringList("SELECT region FROM regions WHERE location='" + location + "';"); } - @Override - public boolean locationExists(String location) { - return plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + location + "';"); - } - @Override public void deleteLocation(String location) { plotSQL.update("DELETE FROM location_data WHERE name='" + location + "';"); From b1214f31a5caf248747b79d4d98d00ff257bf9da Mon Sep 17 00:00:00 2001 From: George112n Date: Wed, 28 Jan 2026 20:52:24 +0000 Subject: [PATCH 72/96] Fix for switch server - now serverAPI is enabled to maintain compatibility, but the switch will not go through --- Plugin/src/main/java/net/bteuk/network/Network.java | 4 +--- .../main/java/net/bteuk/network/utils/SwitchServer.java | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 406ee9ab..ff5e1511 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -321,9 +321,7 @@ public void enablePlugin() { roleAPI = new Roles(this, plotSQL); - if (!constants.standalone()) { - serverAPI = new SwitchServer(this, constants); - } + serverAPI = new SwitchServer(this, constants); if (constants.plotSystemEnabled()) { plotAPI = new PlotAPIImpl(plotSQL, globalSQL); diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 720808ba..6deb55f6 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -28,8 +28,16 @@ public SwitchServer(Network instance, Constants constants) { this.constants = constants; } + /** + * Handles a player server switch within the Network. If on standalone, skips everything and returns. + * @param player The player to switch server + * @param server The server to switch the player to + */ public void switchServer(NetworkPlayer player, String server) { + if (constants.standalone()) + return; + Optional user = instance.getNetworkUserByUuid(player.getUuidAsString()); // If u is null, cancel. From be9f903bbc78871be653d58f8cc406af001c5014 Mon Sep 17 00:00:00 2001 From: George112n Date: Wed, 28 Jan 2026 21:23:40 +0000 Subject: [PATCH 73/96] Fix to allow /where in Plot world under single-server plotsystem setup. --- Plugin/src/main/java/net/bteuk/network/Network.java | 2 +- .../main/java/net/bteuk/network/commands/Where.java | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index ff5e1511..0de1774c 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -400,7 +400,7 @@ public void enablePlugin() { } if (constants.ll()) { - commandManager.registerCommand(new Where(plotSQL, constants)); + commandManager.registerCommand(new Where(plotSQL, plotAPI, constants)); } if (!constants.standalone()) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Where.java b/Plugin/src/main/java/net/bteuk/network/commands/Where.java index 3a46ac34..1dffed7c 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Where.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Where.java @@ -2,6 +2,8 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; +import net.bteuk.network.api.NetworkAPI; +import net.bteuk.network.api.PlotAPI; import net.bteuk.network.core.Constants; import net.bteuk.network.core.ServerType; import net.bteuk.network.lib.utils.ChatUtils; @@ -26,10 +28,12 @@ public class Where extends AbstractCommand { private final EarthGeneratorSettings bteGeneratorSettings = EarthGeneratorSettings.parse(EarthGeneratorSettings.BTE_DEFAULT_SETTINGS); private final PlotSQL plotSQL; + private final PlotAPI plotAPI; private final Constants constants; - public Where(PlotSQL plotSQL, Constants constants) { + public Where(PlotSQL plotSQL, PlotAPI plotAPI, Constants constants) { this.plotSQL = plotSQL; + this.plotAPI = plotAPI; this.constants = constants; } @@ -42,7 +46,9 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - if (constants.serverType() != PLOT && !(constants.serverType() == ServerType.EARTH && player.getLocation().getWorld().getName().equals(constants.earthWorld()))) { + boolean bPlotWorld = (constants.serverType() == PLOT || constants.standalone()) && plotAPI.hasLocation(player.getWorld().getName()); + + if (!bPlotWorld && !(constants.serverType() == ServerType.EARTH && player.getWorld().getName().equals(constants.earthWorld()))) { player.sendMessage(ChatUtils.error("This world does not support coordinates.")); return; } @@ -51,7 +57,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) try { int deltaX = 0; int deltaZ = 0; - if (constants.serverType() == PLOT && plotSQL.hasRow("SELECT name FROM location_data WHERE name='" + player.getWorld().getName() + "';")) { + if (bPlotWorld) { // Get negative coordinate transform of new location. deltaX = -plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + player.getWorld().getName() + "';"); deltaZ = -plotSQL.getInt("SELECT zTransform FROM location_data WHERE name='" + player.getWorld().getName() + "';"); From 63682e161bdcd410cff584f8efc45418a2a2e05e Mon Sep 17 00:00:00 2001 From: George112n Date: Thu, 12 Feb 2026 21:33:07 +0000 Subject: [PATCH 74/96] Fix the registering of new region entered, and fix the handling of offsets. --- .../net/bteuk/network/regions/RegionUser.java | 20 +++-- .../listener/AbstractMoveListener.java | 4 +- .../regions/listener/RegionMoveListener.java | 36 ++++++-- .../listener/RegionTeleportListener.java | 83 ++++++++++++++----- 4 files changed, 108 insertions(+), 35 deletions(-) diff --git a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java index c224f7cc..d91aebb7 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java +++ b/Regions/src/main/java/net/bteuk/network/regions/RegionUser.java @@ -2,6 +2,7 @@ import lombok.Getter; import lombok.Setter; +import lombok.extern.java.Log; import net.bteuk.network.api.PlotAPI; import net.bteuk.network.core.Constants; import org.bukkit.entity.Player; @@ -9,6 +10,7 @@ import static net.bteuk.network.core.ServerType.EARTH; import static net.bteuk.network.core.ServerType.PLOT; +@Log public class RegionUser { @Getter @@ -32,15 +34,16 @@ public class RegionUser { public RegionUser(Player player, Constants constants, RegionManager regionManager, PlotAPI plotAPI) { this.player = player; - // Check if the player is in a region. - if (constants.serverType() == EARTH) { - // Check if they are in the earth world. - if (player.getWorld().getName().equals(constants.earthWorld())) { + boolean bOnEarth = (constants.serverType() == EARTH && player.getWorld().getName().equals(constants.earthWorld())); + boolean bOnPlot = constants.plotSystemEnabled() && (constants.serverType() == PLOT || constants.standalone()); + + // Check if they are in the earth world + if (bOnEarth) { trackedRegion = regionManager.getRegion(player.getLocation().getX(), player.getLocation().getZ()); // Add the region to the database if not exists. regionManager.addToDatabase(trackedRegion); - } - } else if (constants.plotSystemEnabled() && constants.serverType() == PLOT) { + + } else if (bOnPlot) { // Check if the player is in a buildable plot world and apply coordinate transform if true. if (plotAPI.hasLocation(player.getLocation().getWorld().getName())) { this.deltaX = -plotAPI.getXTransform(player.getLocation().getWorld().getName()); @@ -49,6 +52,11 @@ public RegionUser(Player player, Constants constants, RegionManager regionManage trackedRegion = regionManager.getRegion(player.getLocation().getX(), player.getLocation().getZ(), deltaX, deltaZ); } } + + if (trackedRegion == null) + log.info(player.getName() +" joined with no tracked region"); + else + log.info(player.getName() +" joined with tracked region: " +trackedRegion.regionName()); } public boolean hasTrackedRegion() { diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java index ee9ac311..046bd206 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/AbstractMoveListener.java @@ -1,5 +1,6 @@ package net.bteuk.network.regions.listener; +import lombok.extern.java.Log; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.Region; import net.bteuk.network.regions.RegionManager; @@ -7,7 +8,7 @@ import net.bteuk.network.regions.RegionUser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; - +@Log public abstract class AbstractMoveListener { protected final RegionManager regionManager; @@ -27,6 +28,7 @@ protected boolean switchRegion(RegionUser regionUser, Region newRegion) { // Implies that the user has left their current region. if (newRegion == null) { + log.info("New region of " +regionUser.getPlayer().getName() +" is null"); // Send default leave message. regionUser.getPlayer().sendActionBar( ChatUtils.success("You have left ") diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java index 587620ab..5f6cfc32 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionMoveListener.java @@ -65,19 +65,45 @@ public void onPlayerMove(PlayerMoveEvent e) { // Get x and z of the region as int rounded down with any necessary coordinate transforms. int x = ((e.getTo().getX() >= 0 ? (int) e.getTo().getX() : ((int) e.getTo().getX()) - 1) + regionUser.getDeltaX()) >> 9; int z = ((e.getTo().getZ() >= 0 ? (int) e.getTo().getZ() : ((int) e.getTo().getZ()) - 1) + regionUser.getDeltaZ()) >> 9; + // These are the 'real' terra coords of the new region, regardless of where the user is // Check if the player has moved to another region. if (!regionUser.getTrackedRegion().equals(x, z)) { + log.info(e.getPlayer().getName() +" is moving across a region border"); + // Get the new region. - Region region = regionManager.getRegion(x, z); + Region newRegion = regionManager.getRegion(x, z); + + // Check if the new region is on this server or not. If it is, check whether it is on the same world. + if (!regionManager.getServer(regionUser.getTrackedRegion()).equals(regionManager.getServer(newRegion))) { - // Check if the new region is on this server or not. - if (!regionManager.getServer(regionUser.getTrackedRegion()).equals(regionManager.getServer(region))) { - switchServer(regionUser, region, e.getTo()); + switchServer(regionUser, newRegion, e.getTo()); e.setCancelled(true); } else { - e.setCancelled(switchRegion(regionUser, region)); + + Location newLocation = e.getTo().clone(); + + // Get true coordinates (as on terra world) + double trueNewX = e.getTo().getX() + regionUser.getDeltaX(); + double trueNewZ = e.getTo().getZ() + regionUser.getDeltaZ(); + + if (regionManager.isPlot(newRegion)) { + // Apply new region shift + String szLocation = plotAPI.getRegionLocation(newRegion.regionName()); + trueNewX = trueNewX + plotAPI.getXTransform(szLocation); + trueNewZ = trueNewZ + plotAPI.getZTransform(szLocation); + + // Apply new region world + newLocation.setWorld(Bukkit.getWorld(plotAPI.getRegionLocation(newRegion.regionName()))); + } else + // Apply earth world + newLocation.setWorld(Bukkit.getWorld(constants.earthWorld())); + + newLocation.setX(trueNewX); + newLocation.setZ(trueNewZ); + e.setTo(newLocation); + e.setCancelled(switchRegion(regionUser, newRegion)); } } } diff --git a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java index e6c385cd..77f75097 100644 --- a/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java +++ b/Regions/src/main/java/net/bteuk/network/regions/listener/RegionTeleportListener.java @@ -10,6 +10,7 @@ import org.bukkit.Location; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.plugin.java.JavaPlugin; @@ -36,44 +37,80 @@ public RegionTeleportListener(JavaPlugin instance, RegionManager regionManager, } @EventHandler - public void onPlayerTeleport(PlayerTeleportEvent e) { + public void onPlayerWorldChange(PlayerChangedWorldEvent e) { + + log.info("Player World Change Detected"); Optional optionalRegionUser = regionManager.getUserByPlayer(e.getPlayer()); if (optionalRegionUser.isEmpty()) { log.severe("Region user is null for player " + e.getPlayer().getName()); return; } + + log.info("Previous player world: " + e.getFrom().getName()); RegionUser regionUser = optionalRegionUser.get(); + log.info("Previous player deltas: ("+regionUser.getDeltaX()+"," +regionUser.getDeltaZ()+")"); + + // Update player delta if standalone + if (constants.standalone()) { - Region newRegion = getRegion(regionUser, e.getTo()); + log.info("Updating player deltas because in standalone"); + String szWorldName = e.getPlayer().getWorld().getName(); + log.info("New world: " +szWorldName); + if (!szWorldName.equals(constants.earthWorld())) { + int deltaX = -plotAPI.getXTransform(szWorldName); + int deltaZ = -plotAPI.getZTransform(szWorldName); - if (!Objects.equals(newRegion, regionUser.getTrackedRegion())) { - e.setCancelled(switchRegion(regionUser, newRegion)); + regionUser.setDeltaX(deltaX); + regionUser.setDeltaZ(deltaZ); + } else { + regionUser.setDeltaX(0); + regionUser.setDeltaZ(0); + } + log.info("New player deltas: ("+regionUser.getDeltaX()+"," +regionUser.getDeltaZ()+")"); } } - private Region getRegion(RegionUser regionUser, Location location) { - Region region = null; - if (constants.serverType() == EARTH) { - if (location.getWorld().getName().equals(constants.earthWorld())) { - // Get region. - region = regionManager.getRegion(location.getX(), location.getZ()); - } - } else if (constants.plotSystemEnabled() && constants.serverType() == PLOT) { - // Check if the player is teleporting to a buildable world in the plot system. - if (plotAPI.hasLocation(location.getWorld().getName())) { + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent e) { - // Get negative coordinate transform of new location. - int deltaX = -plotAPI.getXTransform(location.getWorld().getName()); - int deltaZ = -plotAPI.getZTransform(location.getWorld().getName()); + log.fine("Player Teleport Event detected via " +e.getCause().name()+". Attempting region switch"); - regionUser.setDeltaX(deltaX); - regionUser.setDeltaZ(deltaZ); + Optional optionalRegionUser = regionManager.getUserByPlayer(e.getPlayer()); + if (optionalRegionUser.isEmpty()) { + log.severe("Region user is null for player " + e.getPlayer().getName()); + return; + } + RegionUser regionUser = optionalRegionUser.get(); - // Get the region with coordinate transformation. - region = regionManager.getRegion(location.getX() + deltaX, location.getZ() + deltaZ); - } + // If plot world, get transformation + String szNewWorld = e.getTo().getWorld().getName(); + int addX = 0; + int addZ = 0; + if (plotAPI.hasLocation(szNewWorld)) { + addX = -plotAPI.getXTransform(szNewWorld); + addZ = -plotAPI.getZTransform(szNewWorld); } - return region; + + // Get x and z of the region as int rounded down. + int terraX = ((e.getTo().getX() >= 0 ? (int) e.getTo().getX() : ((int) e.getTo().getX()) - 1) +addX) >> 9; + int terraZ = ((e.getTo().getZ() >= 0 ? (int) e.getTo().getZ() : ((int) e.getTo().getZ()) - 1) +addZ)>> 9; + + if (!regionUser.hasTrackedRegion()) { + log.fine(e.getPlayer().getName() + " does not have a current tracked region, attempting a fix"); + } + else if (!regionUser.getTrackedRegion().equals(terraX, terraZ)) { + log.fine(e.getPlayer().getName() + " is teleporting across a region border"); + } + + // Get the new region. + Region newRegion = regionManager.getRegion(terraX, terraZ); + + if (newRegion == null) + log.info("New region of " +regionUser.getPlayer().getName() +" is null"); + else + log.info("New region is of " +regionUser.getPlayer().getName() +" is " +newRegion.regionName()); + + e.setCancelled(switchRegion(regionUser, newRegion)); } } From a5e4a07008bf7c81d48049f56a665afc122a58c6 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Sat, 21 Feb 2026 11:39:55 +0100 Subject: [PATCH 75/96] Fix return button in verified review menu not showing if you have never had a plot verified. --- .../net/bteuk/network/gui/NetworkGui.java | 10 ++++++++ .../gui/plotsystem/PlotsystemLocations.java | 4 ++-- .../gui/plotsystem/VerificationMenu.java | 23 ++++++++----------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java index 63da41c2..dc36e21a 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java @@ -3,7 +3,9 @@ import net.bteuk.minecraft.gui.Gui; import net.bteuk.minecraft.gui.GuiAction; import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -12,14 +14,18 @@ public abstract class NetworkGui extends Gui { protected final GuiProvider provider; + private final int inventorySize; + public NetworkGui(GuiProvider provider, int inventorySize, Component inventoryName) { super(provider.manager(), inventorySize, inventoryName); this.provider = provider; + this.inventorySize = inventorySize; } public NetworkGui(GuiProvider provider, Inventory inventory) { super(provider.manager(), inventory); this.provider = provider; + this.inventorySize = inventory.getSize(); } public void setItem(int slot, ItemStack stack, NetworkGuiAction action) { @@ -30,6 +36,10 @@ public void setAction(int slot, NetworkGuiAction action) { super.setAction(slot, getGuiAction(action)); } + protected void addReturnToLastSlot(NetworkGuiAction action, Component... description) { + setItem((inventorySize - 1), Utils.createItem(Material.SPRUCE_DOOR, 1, Utils.title("Return"), description), action); + } + private GuiAction getGuiAction(NetworkGuiAction action) { return clickEvent -> { if (!(clickEvent.getWhoClicked() instanceof Player player)) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java index fdf5e117..08b509fe 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/PlotsystemLocations.java @@ -55,12 +55,12 @@ protected void createGui() { Utils.line("of this plotsystem location.")), (NetworkUser u) -> { - // Teleport to centre of the plotsystem location. + // Teleport to the centre of the plotsystem location. // Get coordinate ids for min and max. int min = plotSQL.getInt("SELECT coordMin FROM location_data WHERE name='" + name + "';"); int max = plotSQL.getInt("SELECT coordMax FROM location_data WHERE name='" + name + "';"); - // Get middle. + // Get middle points, adding the coordinate transformation. double x = ((globalSQL.getDouble("SELECT x FROM coordinates WHERE id=" + max + ";") + globalSQL.getDouble("SELECT x FROM coordinates WHERE id=" + min + ";")) / 2) + plotSQL.getInt("SELECT xTransform FROM location_data WHERE name='" + name + "';"); diff --git a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java index 00e06e1e..307a3edc 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/plotsystem/VerificationMenu.java @@ -87,20 +87,17 @@ protected void createGui() { // Increase value by 1. slot++; } + } - // Return - setItem(44, Utils.createItem(Material.SPRUCE_DOOR, 1, - Utils.title("Return"), - Utils.line("Open the plot menu.")), - (NetworkUser u) -> { - // Delete this gui. - this.delete(); - u.mainGui = null; + // Return + addReturnToLastSlot((NetworkUser u) -> { + // Delete this gui. + this.delete(); + u.mainGui = null; - // Switch to plot info. - u.mainGui = new PlotMenu(provider, u); - u.mainGui.open(u.player); - }); - } + // Switch to plot info. + u.mainGui = new PlotMenu(provider, u); + u.mainGui.open(u.player); + }, Utils.line("Open the plot menu.")); } } From 646f2cd017118dc0eccfbd7156eeeeed225f86c5 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Mon, 23 Feb 2026 23:39:20 +0100 Subject: [PATCH 76/96] In standalone mode proxy functionality will be handled directly by the Network plugin, allowing standalone mode to use features such as Discord and Tab. Removed the static socket handler. Split the chat listener, sending and other chat features to prevent circular references. No longer needs workarounds for standalone mode for joining. Discord can be used in standalone mode. Tab can be used in standalone mode. Focus can be used in standalone mode. Moderation can be used in standalone mode. Nick can be used in standalone mode. Staff chat can be used in standalone mode. --- Core/pom.xml | 2 +- Network-API/pom.xml | 18 +- PaperCore/pom.xml | 2 +- Plugin/pom.xml | 8 +- .../java/net/bteuk/network/CustomChat.java | 100 ++------- .../main/java/net/bteuk/network/Network.java | 110 +++++----- .../java/net/bteuk/network/TabManager.java | 11 +- .../java/net/bteuk/network/commands/Afk.java | 21 +- .../net/bteuk/network/commands/Discord.java | 16 +- .../net/bteuk/network/commands/Focus.java | 9 +- .../java/net/bteuk/network/commands/Help.java | 6 +- .../java/net/bteuk/network/commands/Msg.java | 12 +- .../java/net/bteuk/network/commands/Nick.java | 9 +- .../net/bteuk/network/commands/Pmute.java | 5 +- .../bteuk/network/commands/PmuteAction.java | 8 +- .../net/bteuk/network/commands/Punmute.java | 5 +- .../net/bteuk/network/commands/Reply.java | 11 +- .../bteuk/network/commands/staff/Staff.java | 3 +- .../eventing/listeners/ChatListener.java | 78 +++++++ .../eventing/listeners/CommandPreProcess.java | 8 +- .../network/eventing/listeners/Connect.java | 79 ++----- .../net/bteuk/network/gui/NavigatorGui.java | 2 +- .../network/proxy/NetworkChatHandler.java | 24 ++ .../proxy/NetworkCoreServerManager.java | 52 +++++ .../bteuk/network/proxy/NetworkPlayer.java | 41 ++++ .../network/proxy/NetworkPlayerManager.java | 23 ++ .../network/proxy/NetworkScheduledTask.java | 50 +++++ .../bteuk/network/proxy/NetworkScheduler.java | 31 +++ .../bteuk/network/proxy/NetworkServer.java | 43 ++++ .../network/proxy/NetworkTabManager.java | 206 ++++++++++++++++++ .../bteuk/network/socket/MessageSender.java | 42 ++++ .../NetworkSocketHandler.java} | 71 +----- .../socket/StandaloneOutputSocket.java | 21 ++ .../net/bteuk/network/utils/NetworkUser.java | 14 +- .../java/net/bteuk/network/utils/Roles.java | 29 +-- .../net/bteuk/network/utils/SwitchServer.java | 8 +- .../bteuk/network/utils/staff/Moderation.java | 13 +- Regions/pom.xml | 2 +- pom.xml | 77 ++++--- 39 files changed, 877 insertions(+), 393 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/eventing/listeners/ChatListener.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkChatHandler.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkCoreServerManager.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayer.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayerManager.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduledTask.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduler.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkServer.java create mode 100644 Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java create mode 100644 Plugin/src/main/java/net/bteuk/network/socket/MessageSender.java rename Plugin/src/main/java/net/bteuk/network/{SocketHandlerImpl.java => socket/NetworkSocketHandler.java} (56%) create mode 100644 Plugin/src/main/java/net/bteuk/network/socket/StandaloneOutputSocket.java diff --git a/Core/pom.xml b/Core/pom.xml index ef08b77f..e85ce41e 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.2 + 1.9.0 net.bteuk.network diff --git a/Network-API/pom.xml b/Network-API/pom.xml index 30058013..d453ebf2 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -6,14 +6,13 @@ net.bteuk Network - 1.8.2 + 1.9.0 net.bteuk.network api Network API API for the Network plugin - 1.8.2 @@ -28,4 +27,17 @@ NetworkLib - \ No newline at end of file + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + + \ No newline at end of file diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index cafcc6b6..4857f1b6 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.2 + 1.9.0 net.bteuk.network diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 7a09a7ba..e823443c 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.2 + 1.9.0 net.bteuk.network @@ -130,7 +130,11 @@ - com.github.BTEUK.Proxy + com.github.BuildtheUK.Proxy + core + + + com.github.BuildtheUK.Proxy database diff --git a/Plugin/src/main/java/net/bteuk/network/CustomChat.java b/Plugin/src/main/java/net/bteuk/network/CustomChat.java index 8f9f8678..476e91af 100644 --- a/Plugin/src/main/java/net/bteuk/network/CustomChat.java +++ b/Plugin/src/main/java/net/bteuk/network/CustomChat.java @@ -1,14 +1,9 @@ package net.bteuk.network; -import io.papermc.paper.event.player.AsyncChatEvent; import lombok.extern.java.Log; import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.entity.Role; -import net.bteuk.network.commands.Afk; import net.bteuk.network.core.Constants; -import net.bteuk.network.core.Time; -import net.bteuk.network.exceptions.NotMutedException; -import net.bteuk.network.lib.dto.AbstractTransferObject; import net.bteuk.network.lib.dto.ChatMessage; import net.bteuk.network.lib.dto.DirectMessage; import net.bteuk.network.lib.dto.DiscordDirectMessage; @@ -17,47 +12,34 @@ import net.bteuk.network.lib.dto.PlotMessage; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.enums.ChatChannels; -import net.bteuk.network.lib.socket.InputSocket; -import net.bteuk.network.lib.socket.OutputSocket; -import net.bteuk.network.lib.socket.SocketHandler; import net.bteuk.network.lib.utils.ChatUtils; -import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; -import net.bteuk.network.utils.staff.Moderation; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; import static net.bteuk.network.lib.enums.ChatChannels.STAFF; @Log -public class CustomChat implements Listener, ChatAPI { +public class CustomChat implements ChatAPI { private static final String AFK = "%s is now afk"; private static final String NOT_AFK = "%s is no longer afk"; private final Network instance; + private final MessageSender messageSender; private final Constants constants; - private final Afk afk; - private final GlobalSQL globalSQL; - private final Moderation moderation; private final Roles roles; - public CustomChat(Network instance, Constants constants, Afk afk, GlobalSQL globalSQL, Moderation moderation, Roles roles) { + public CustomChat(Network instance, MessageSender messageSender, Constants constants, Roles roles) { this.instance = instance; + this.messageSender = messageSender; this.constants = constants; - this.afk = afk; - this.globalSQL = globalSQL; - this.moderation = moderation; this.roles = roles; - instance.getServer().getPluginManager().registerEvents(this, instance); - log.info("Successfully enabled Chat!"); } @@ -120,48 +102,6 @@ public void onDisable() { instance.getServer().getMessenger().unregisterIncomingPluginChannel(instance, "uknet:network"); } - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerChatEvent(AsyncChatEvent e) { - - // If player is muted cancel. - if (moderation.isMuted(e.getPlayer().getUniqueId().toString())) { - e.setCancelled(true); - try { - - // Send message and end event. - e.getPlayer().sendMessage(moderation.getMutedComponent(e.getPlayer().getUniqueId().toString())); - return; - } catch (NotMutedException ex) { - - // Unset the muted status. - e.setCancelled(false); - } - } - - if (!e.isCancelled()) { - e.setCancelled(true); - // Get user, if staff chat is enabled, send the message to staff chat. - NetworkUser user = instance.getUser(e.getPlayer()); - - // If u is null, cancel. - if (user == null) { - log.severe("User " + e.getPlayer().getName() + " can not be found!"); - e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); - return; - } - - // Reset last movement of player, if they're afk unset that. - user.last_movement = Time.currentTime(); - - if (user.isAfk()) { - user.setAfk(false); - afk.updateAfkStatus(user, false); - } - ChatMessage chatMessage = getChatMessage(e.message(), user); - sendChatMessage(chatMessage); - } - } - public void handleDirectMessage(DirectMessage message) { // Send the message if the player is on this server. instance.getServer().getOnlinePlayers().stream() @@ -227,7 +167,7 @@ public void handleDiscordLinking(DiscordLinking discordLinking) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), true); - SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); + messageSender.sendSocketMessage(discordRole); user.sendMessage(ChatUtils.success("Your discord has been linked!")); }); @@ -269,38 +209,26 @@ public void broadcastAFK(Player p, boolean afk) { } // Send the message - sendChatMessage(chatMessage); + messageSender.sendSocketMessage(chatMessage); } - public void sendChatMessage(ChatMessage message) { - if (constants.standalone() && message.getChannel().equals(ChatChannels.GLOBAL.getChannelName())) { - instance.getServer().broadcast(message.getComponent()); - } else { - SocketHandlerImpl.sendSocketMessageIfOnline(message); - } + @Override + public void sendChatMessage(ChatMessage chatMessage) { + messageSender.sendSocketMessage(chatMessage); } public void sendDirectMessage(DirectMessage message) { - if (constants.standalone()) { - // Try to send the message to the player if they're online. - // Else use the database to store it for when they next connect. - instance.getServer().getOnlinePlayers().stream().filter(player -> player.getUniqueId().toString().equals(message.getRecipient())).findFirst() - .ifPresentOrElse(player -> player.sendMessage(message.getComponent()), () -> globalSQL.insertMessage(message)); - } else { - SocketHandlerImpl.sendSocketMessageIfOnline(message); - } + messageSender.sendSocketMessage(message); } public void sendDiscordDirectMessage(DiscordDirectMessage message) { - if (!constants.standalone()) { - SocketHandlerImpl.sendSocketMessageIfOnline(message); - } + messageSender.sendSocketMessage(message); } @Override public void sendPlotMessage(PlotMessage message) { - if (!constants.standalone() && constants.plotSystemEnabled()) { - SocketHandlerImpl.sendSocketMessageIfOnline(message); + if (constants.plotSystemEnabled()) { + messageSender.sendSocketMessage(message); } } } diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 406ee9ab..93865491 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -86,10 +86,17 @@ import net.bteuk.network.lobby.Lobby; import net.bteuk.network.lobby.LobbyCommand; import net.bteuk.network.logging.BukkitForwardingHandler; +import net.bteuk.network.proxy.NetworkChatHandler; +import net.bteuk.network.proxy.NetworkCoreServerManager; +import net.bteuk.network.proxy.NetworkPlayerManager; +import net.bteuk.network.proxy.NetworkScheduler; +import net.bteuk.network.proxy.NetworkTabManager; import net.bteuk.network.regions.RegionEvent; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.sql.RegionSQL; import net.bteuk.network.services.NetworkPromotionService; +import net.bteuk.network.socket.MessageSender; +import net.bteuk.network.socket.NetworkSocketHandler; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.NetworkConfig; @@ -100,9 +107,11 @@ import net.bteuk.network.utils.Utils; import net.bteuk.network.utils.staff.Moderation; import net.bteuk.network.utils.worldguard.WorldGuard; -import net.bteuk.proxy.database.DatabaseInit; import net.bteuk.teachingtutorials.services.PromotionService; import net.buildtheearth.terraminusminus.TerraConfig; +import org.btuk.proxy.core.ProxyController; +import org.btuk.proxy.core.socket.ProxySocketHandler; +import org.btuk.proxy.database.DatabaseInit; import org.bukkit.Material; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.configuration.serialization.ConfigurationSerialization; @@ -110,6 +119,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.Nullable; import teachingtutorials.utils.DBConnection; import javax.sql.DataSource; @@ -118,6 +128,7 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.function.Consumer; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; @@ -154,8 +165,6 @@ public final class Network extends JavaPlugin implements NetworkAPI { // Timers @Getter private TimerAPIImpl timerAPI; - // Tab - private TabManager tab; // Tpll Command @Getter @@ -178,7 +187,7 @@ public final class Network extends JavaPlugin implements NetworkAPI { @Getter private CoordinateAPI coordinateAPI; - + @Getter private Roles roleAPI; @@ -245,11 +254,6 @@ public void onEnable() { if (constants.plotSystemEnabled()) { plotSQL = new PlotSQL(plotDataSource); } - - // Init and update the schemas if standalone, since there is no proxy to do it. - if (constants.standalone()) { - init.initializeSchemas(globalDataSource, plotDataSource, regionDataSource); - } } catch (SQLException | RuntimeException e) { getLogger().severe("Failed to connect to the database, please check that you have set the config values " + "correctly."); getLogger().severe("Disabling Network"); @@ -304,10 +308,13 @@ public void onEnable() { // Server enabling procedure when the config has been set up. public void enablePlugin() { - // Create user list. + // Create the user lists. networkUsers = new ArrayList<>(); onlineUsers = new HashSet<>(); + // Set up the message sender. + MessageSender messageSender = new MessageSender(constants); + // Set up the timer api timerAPI = new TimerAPIImpl(this); @@ -319,38 +326,26 @@ public void enablePlugin() { this.eventAPI = new EventManager(globalSQL, constants); WorldGuardAPI worldGuardAPI = new WorldGuard(); - roleAPI = new Roles(this, plotSQL); + roleAPI = new Roles(this, plotSQL, messageSender); - if (!constants.standalone()) { - serverAPI = new SwitchServer(this, constants); - } + serverAPI = new SwitchServer(this, constants, messageSender); if (constants.plotSystemEnabled()) { plotAPI = new PlotAPIImpl(plotSQL, globalSQL); } // Enable tab. - if (!constants.standalone()) { - tab = new TabManager(this, constants, roleAPI); - } - - Afk afk = new Afk(this); - commandManager.registerCommand(afk); + TabManager tab = new TabManager(this, constants, roleAPI); Nightvision nightvision = new Nightvision(this); - Moderation moderation = new Moderation(this, eventAPI); - - // Set up socket listening - used for sending messages cross-server on multi-server setups - SocketHandlerImpl socketHandler = null; - if (!constants.standalone()) { - socketHandler = new SocketHandlerImpl(this, constants); - } + Moderation moderation = new Moderation(this, eventAPI, messageSender); // Enables chat, both global chat and normal chat are handled through it. - chat = new CustomChat(this, constants, afk, globalSQL, moderation, roleAPI); - afk.registerChat(chat); - roleAPI.registerChat(chat); + chat = new CustomChat(this, messageSender, constants, roleAPI); + + Afk afk = new Afk(this, messageSender, chat); + commandManager.registerCommand(afk); // Create the region manager if enabled. if (constants.regionsEnabled()) { @@ -360,10 +355,14 @@ public void enablePlugin() { // Setup connect, this handles all connections to the server. // Listener and manager of server connections. - Connect connect = new Connect(this, constants, tab, roleAPI, globalSQL, networkGuiManager, nightvision, eventAPI, regionManager); + Connect connect = new Connect(this, constants, tab, roleAPI, networkGuiManager, nightvision, eventAPI, regionManager, messageSender); - if (!constants.standalone()) { - socketHandler.addComponents(chat, tab, connect); + // Set up socket listening - used for sending messages cross-server on multi-server setups + NetworkSocketHandler socketHandler = new NetworkSocketHandler(this, chat, tab, connect, constants); + + // If running in standalone mode, set up the proxy logic locally. + if (constants.standalone()) { + initStandaloneMode(socketHandler, messageSender); } // Create the navigator. @@ -422,10 +421,8 @@ public void enablePlugin() { * Utility commands. */ commandManager.registerCommand(new Buildings(this, constants)); - if (!constants.standalone()) { - commandManager.registerCommand(new Discord(this, roleAPI, constants)); - commandManager.registerCommand(new Focus(this, constants)); - } + commandManager.registerCommand(new Discord(this, roleAPI, constants, messageSender)); + commandManager.registerCommand(new Focus(this, messageSender)); commandManager.registerCommand(nightvision); commandManager.registerCommand(new Speed()); @@ -452,17 +449,15 @@ public void enablePlugin() { // commands.register("exp", "Test command for adding exp.", new Exp()); commandManager.registerCommand(new BuildingCompanionCommand(this, constants, regionManager)); - if (!constants.standalone()) { - commandManager.registerCommand(new Pmute(this)); - commandManager.registerCommand(new Punmute(this)); + commandManager.registerCommand(new Pmute(this, messageSender)); + commandManager.registerCommand(new Punmute(this, messageSender)); - commandManager.registerCommand(Msg.of(this, "msg")); - commandManager.registerCommand(Msg.of(this, "w")); - commandManager.registerCommand(Msg.of(this, "tell")); + commandManager.registerCommand(Msg.of(this, "msg", messageSender)); + commandManager.registerCommand(Msg.of(this, "w", messageSender)); + commandManager.registerCommand(Msg.of(this, "tell", messageSender)); - commandManager.registerCommand(new Reply()); - commandManager.registerCommand(new Nick(this)); - } + commandManager.registerCommand(new Reply(messageSender)); + commandManager.registerCommand(new Nick(this, messageSender)); commandManager.registerCommand(new Promote(this, roleAPI, chat)); commandManager.registerCommand(new Demote(this, roleAPI, chat)); @@ -488,7 +483,7 @@ public void enablePlugin() { commandManager.registerCommand(new Staff(navigator.getProvider())); // Register the command pre-process to make sure network versions of commands run and not that of another plugin. - new CommandPreProcess(this, constants, afk, connect, serverAPI); + new CommandPreProcess(this, constants, afk, connect, serverAPI, messageSender); // Create the rules-book. lobby.setGuiProvider(navigator.getProvider()); @@ -547,14 +542,29 @@ public void enablePlugin() { new Timers(this, globalSQL, eventAPI, constants, afk); // Let the Proxy know that the server is enabled. - if (!constants.standalone()) - socketHandler.sendSocketMessage(new ServerStartup(constants.serverName())); + messageSender.sendSocketMessage(new ServerStartup(constants.serverName())); // Register the API as a service. getServer().getServicesManager().register(NetworkAPI.class, this, this, ServicePriority.Normal); } + private void initStandaloneMode(NetworkSocketHandler socketHandler, MessageSender messageSender) { + ProxyController proxyController = new ProxyController(getDataFolder()); + + NetworkScheduler scheduler = new NetworkScheduler(this); + NetworkPlayerManager playerManager = new NetworkPlayerManager(this); + NetworkCoreServerManager serverManager = new NetworkCoreServerManager(this); + + NetworkChatHandler chatHandler = new NetworkChatHandler(socketHandler); + NetworkTabManager tabManager = new NetworkTabManager(getServer(), proxyController.getConfig(), proxyController.getCoreUserManager(), chatHandler, scheduler); + + // Set up the local socket handler. + Consumer socketInitializer = messageSender.setupStandaloneOutputSocket(); + + proxyController.start(chatHandler, scheduler, serverManager, playerManager, tabManager, socketInitializer); + } + @Override public void onDisable() { @@ -596,7 +606,7 @@ public void onDisable() { } // Get user from player. - public NetworkUser getUser(Player p) { + public @Nullable NetworkUser getUser(Player p) { return networkUsers.stream().filter((NetworkUser user) -> user.player.equals(p)).findFirst().orElse(null); } diff --git a/Plugin/src/main/java/net/bteuk/network/TabManager.java b/Plugin/src/main/java/net/bteuk/network/TabManager.java index f16c0647..cfe66b17 100644 --- a/Plugin/src/main/java/net/bteuk/network/TabManager.java +++ b/Plugin/src/main/java/net/bteuk/network/TabManager.java @@ -200,10 +200,15 @@ public void onPacketSending(PacketEvent event) { List newInfoList = new ArrayList<>(); infoList.forEach(info -> { + boolean isServerPlayer = instance.getServer().getPlayer(info.getProfileId()) != null; // Create an exact copy, but set 'listed' to false. - newInfoList.add(new PlayerInfoData(info.getProfileId(), info.getLatency(), false, - info.getGameMode(), info.getProfile(), info.getDisplayName(), - info.getRemoteChatSessionData())); + if (isServerPlayer) { + newInfoList.add(new PlayerInfoData(info.getProfileId(), info.getLatency(), false, + info.getGameMode(), info.getProfile(), info.getDisplayName(), + info.getRemoteChatSessionData())); + } else { + newInfoList.add(info); + } }); packet.getPlayerInfoDataLists().write(1, newInfoList); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java index a62d944a..a3819bb7 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Afk.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Afk.java @@ -4,29 +4,28 @@ import lombok.extern.java.Log; import net.bteuk.network.CustomChat; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.core.Time; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; @Log public class Afk extends AbstractCommand { private final Network instance; - private CustomChat chat; + private final MessageSender messageSender; - public Afk(Network instance) { - this.instance = instance; - } + private final CustomChat chat; - public void registerChat(CustomChat chat) { - if (this.chat == null) { - this.chat = chat; - } + public Afk(Network instance, MessageSender messageSender, CustomChat chat) { + this.instance = instance; + this.messageSender = messageSender; + this.chat = chat; } public void updateAfkStatus(NetworkUser user, boolean afk) { @@ -37,11 +36,11 @@ public void updateAfkStatus(NetworkUser user, boolean afk) { UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(user.player.getUniqueId().toString()); userUpdateEvent.setAfk(afk); - SocketHandlerImpl.sendSocketMessageIfOnline(userUpdateEvent); + messageSender.sendSocketMessage(userUpdateEvent); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java index ea16e635..a45724c5 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Discord.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Discord.java @@ -2,9 +2,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; -import net.bteuk.network.CustomChat; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.entity.Role; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.core.Constants; @@ -12,12 +10,14 @@ import net.bteuk.network.lib.dto.DiscordLinking; import net.bteuk.network.lib.dto.DiscordRole; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import java.util.Arrays; import java.util.Objects; @@ -28,16 +28,18 @@ public class Discord extends AbstractCommand { private final Network instance; private final Roles roles; private final Constants constants; + private final MessageSender messageSender; - public Discord(Network instance, Roles roles, Constants constants) { + public Discord(Network instance, Roles roles, Constants constants, MessageSender messageSender) { this.instance = instance; this.roles = roles; this.constants = constants; + this.messageSender = messageSender; setTabCompleter(new FixedArgSelector(Arrays.asList("link", "unlink"), 0)); } @Override - public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { + public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) { // Check if the sender is a player. Player player = getPlayer(stack); @@ -74,7 +76,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setToken(token); - SocketHandlerImpl.sendSocketMessageIfOnline(discordLinking); + messageSender.sendSocketMessage(discordLinking); player.sendMessage(ChatUtils.success("To link your Discord please DM the code %s to the UK Bot within" + " the next 5 minutes.", token)); return; @@ -96,13 +98,13 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) { } DiscordRole discordRole = new DiscordRole(user.player.getUniqueId().toString(), role.getId(), false); - SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); + messageSender.sendSocketMessage(discordRole); DiscordLinking discordLinking = new DiscordLinking(); discordLinking.setUuid(player.getUniqueId().toString()); discordLinking.setDiscordId(user.getDiscordId()); discordLinking.setUnlink(true); - SocketHandlerImpl.sendSocketMessageIfOnline(discordLinking); + messageSender.sendSocketMessage(discordLinking); user.isLinked = false; player.sendMessage(ChatUtils.success("Unlinked your Discord.")); diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Focus.java b/Plugin/src/main/java/net/bteuk/network/commands/Focus.java index d7716364..787ae780 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Focus.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Focus.java @@ -3,8 +3,8 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; import net.bteuk.network.Network; -import net.bteuk.network.core.Constants; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -19,8 +19,11 @@ public class Focus extends AbstractCommand { private final Network instance; - public Focus(Network instance, Constants constants) { + private final MessageSender messageSender; + + public Focus(Network instance, MessageSender messageSender) { this.instance = instance; + this.messageSender = messageSender; } @Override @@ -41,7 +44,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - user.toggleFocus(); + user.toggleFocus(messageSender); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Help.java b/Plugin/src/main/java/net/bteuk/network/commands/Help.java index a0ae964b..f47f530e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Help.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Help.java @@ -397,10 +397,8 @@ private void utils(Player p) { p.sendMessage(Component.text("/nv", NamedTextColor.GRAY) .append(Utils.line(" - Toggle night vision, also removes glitched shadows."))); - if (!constants.standalone()) { - p.sendMessage(Component.text("\n/discord", NamedTextColor.GRAY) - .append(Utils.line(" - Sends you a link to our Discord server."))); - } + p.sendMessage(Component.text("\n/discord", NamedTextColor.GRAY) + .append(Utils.line(" - Sends you a link to our Discord server."))); } private void worldedit(Player p) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java index b70eb10a..c0ceac93 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Msg.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Msg.java @@ -2,11 +2,11 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.dto.PrivateMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -21,9 +21,11 @@ public class Msg extends AbstractCommand { private static final Component ERROR = ChatUtils.error("/msg [player] "); private final String commandName; + private final MessageSender messageSender; - public Msg(Network instance, String commandName) { + public Msg(Network instance, String commandName, MessageSender messageSender) { this.commandName = commandName; + this.messageSender = messageSender; setTabCompleter(new PlayerSelector(instance)); } @@ -45,11 +47,11 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) // Send a direct message, the message is created using all other command arguments. String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); PrivateMessage privateMessage = new PrivateMessage(ChatChannels.GLOBAL.getChannelName(), player.getName(), args[0],message, false); - SocketHandlerImpl.sendSocketMessageIfOnline(privateMessage); + messageSender.sendSocketMessage(privateMessage); } - public static Msg of(Network instance, String label) { - return new Msg(instance, label); + public static Msg of(Network instance, String label, MessageSender messageSender) { + return new Msg(instance, label, messageSender); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java index c7437b06..bccf31b4 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Nick.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Nick.java @@ -2,15 +2,14 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.extern.java.Log; -import net.bteuk.network.CustomChat; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.ConditionalPlayerSelector; import net.bteuk.network.commands.tabcompleters.FixedArgSelector; import net.bteuk.network.commands.tabcompleters.MultiArgSelector; import net.bteuk.network.lib.dto.OnlineUser; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -29,9 +28,11 @@ public class Nick extends AbstractCommand { private static final LegacyComponentSerializer COLOUR_SERIALIZER = LegacyComponentSerializer.builder().hexColors().character('&').build(); private final Network instance; + private final MessageSender messageSender; - public Nick(Network instance) { + public Nick(Network instance, MessageSender messageSender) { this.instance = instance; + this.messageSender = messageSender; setTabCompleter(new MultiArgSelector(List.of(new FixedArgSelector(Collections.singletonList("reset"), 0), new ConditionalPlayerSelector(instance, 1, args -> args != null && args.length > 0 && "reset".equalsIgnoreCase(args[0]))))); } @@ -94,7 +95,7 @@ private void updateDisplayName(String uuid, Component displayName) { UserUpdate userUpdateEvent = new UserUpdate(); userUpdateEvent.setUuid(uuid); userUpdateEvent.setDisplayName(displayName); - SocketHandlerImpl.sendSocketMessageIfOnline(userUpdateEvent); + messageSender.sendSocketMessage(userUpdateEvent); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java index 412aa120..c55372ae 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Pmute.java @@ -3,6 +3,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; @@ -13,8 +14,8 @@ public class Pmute extends PmuteAction { private static final Component ERROR = ChatUtils.error("/pmute [player]"); - public Pmute(Network instance) { - super(instance, ERROR); + public Pmute(Network instance, MessageSender messageSender) { + super(instance, ERROR, messageSender); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java index eadcd0c8..5480c973 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/PmuteAction.java @@ -2,9 +2,9 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.commands.tabcompleters.PlayerSelector; import net.bteuk.network.lib.dto.MuteEvent; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; @@ -17,10 +17,12 @@ public abstract class PmuteAction extends AbstractCommand { private final Component error; private final Network instance; + private final MessageSender messageSender; - protected PmuteAction(Network instance, Component error) { + protected PmuteAction(Network instance, Component error, MessageSender messageSender) { this.instance = instance; this.error = error; + this.messageSender = messageSender; setTabCompleter(new PlayerSelector(instance)); } @@ -47,6 +49,6 @@ public void onCommand(CommandSourceStack stack, String[] args, boolean mute) { MuteEvent muteEvent = new MuteEvent(player.getUniqueId().toString(), uuid, mute); // Feedback will be sent through a direct message to the player by the proxy. - SocketHandlerImpl.sendSocketMessageIfOnline(muteEvent); + messageSender.sendSocketMessage(muteEvent); } } diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java b/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java index 56dda98b..2a2108d6 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Punmute.java @@ -3,6 +3,7 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; @@ -13,8 +14,8 @@ public class Punmute extends PmuteAction { private static final Component ERROR = ChatUtils.error("/punmute [player]"); - public Punmute(Network instance) { - super(instance, ERROR); + public Punmute(Network instance, MessageSender messageSender) { + super(instance, ERROR, messageSender); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java index a7352f9a..51741316 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Reply.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Reply.java @@ -1,11 +1,10 @@ package net.bteuk.network.commands; import io.papermc.paper.command.brigadier.CommandSourceStack; -import net.bteuk.network.CustomChat; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.lib.dto.ReplyMessage; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -15,6 +14,12 @@ public class Reply extends AbstractCommand { private static final String ERROR = "/r [message]"; + private final MessageSender messageSender; + + public Reply(MessageSender messageSender) { + this.messageSender = messageSender; + } + public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) { // Check if the sender is a player. @@ -30,7 +35,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) } String message = String.join(" ", Arrays.copyOfRange(args, 0, args.length)); ReplyMessage replymessage = new ReplyMessage(ChatChannels.GLOBAL.getChannelName(),player.getName(),message,false); - SocketHandlerImpl.sendSocketMessageIfOnline(replymessage); + messageSender.sendSocketMessage(replymessage); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java index 62ee7065..8fc18e2e 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/staff/Staff.java @@ -69,8 +69,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NotNull [] args) return; } - // If more than one args, staff chat is enabled, and it is not in standalone, then go to staff chat logic - if ((args.length > 0 && guiProvider.constants().staffChat()) && !guiProvider.constants().standalone()) { + if ((args.length > 0 && guiProvider.constants().staffChat())) { // If the first arg is chat, switch the player to and from staff chat if enabled. if (args[0].equalsIgnoreCase("chat")) { String channel = GLOBAL.getChannelName(); diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ChatListener.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ChatListener.java new file mode 100644 index 00000000..e1708d8e --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/ChatListener.java @@ -0,0 +1,78 @@ +package net.bteuk.network.eventing.listeners; + +import io.papermc.paper.event.player.AsyncChatEvent; +import lombok.extern.java.Log; +import net.bteuk.network.Network; +import net.bteuk.network.commands.Afk; +import net.bteuk.network.core.Time; +import net.bteuk.network.exceptions.NotMutedException; +import net.bteuk.network.lib.dto.ChatMessage; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; +import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.staff.Moderation; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import static net.bteuk.network.CustomChat.getChatMessage; + +@Log +public class ChatListener implements Listener { + + private final Network instance; + private final Moderation moderation; + private final Afk afk; + private final MessageSender messageSender; + + public ChatListener(Network instance, Moderation moderation, Afk afk, MessageSender messageSender) { + this.instance = instance; + this.moderation = moderation; + this.afk = afk; + this.messageSender = messageSender; + + instance.getServer().getPluginManager().registerEvents(this, instance); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerChatEvent(AsyncChatEvent e) { + + // If player is muted cancel. + if (moderation.isMuted(e.getPlayer().getUniqueId().toString())) { + e.setCancelled(true); + try { + + // Send a message and end an event. + e.getPlayer().sendMessage(moderation.getMutedComponent(e.getPlayer().getUniqueId().toString())); + return; + } catch (NotMutedException ex) { + + // Unset the muted status. + e.setCancelled(false); + } + } + + if (!e.isCancelled()) { + e.setCancelled(true); + // Get user, if staff chat is enabled, send the message to staff chat. + NetworkUser user = instance.getUser(e.getPlayer()); + + // If u is null, cancel. + if (user == null) { + log.severe("User " + e.getPlayer().getName() + " can not be found!"); + e.getPlayer().sendMessage(ChatUtils.error("User can not be found, please relog!")); + return; + } + + // Reset last movement of player, if they're afk unset that. + user.last_movement = Time.currentTime(); + + if (user.isAfk()) { + user.setAfk(false); + afk.updateAfkStatus(user, false); + } + ChatMessage chatMessage = getChatMessage(e.message(), user); + messageSender.sendSocketMessage(chatMessage); + } + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java index 06a0d215..d6e933b9 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/CommandPreProcess.java @@ -2,7 +2,6 @@ import lombok.extern.java.Log; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.commands.Afk; import net.bteuk.network.core.Constants; @@ -10,6 +9,7 @@ import net.bteuk.network.lib.dto.ServerShutdown; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.papercore.PlayerAdapter; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -30,13 +30,15 @@ public class CommandPreProcess implements Listener { private final Afk afk; private final Connect connect; private final ServerAPI serverAPI; + private final MessageSender messageSender; - public CommandPreProcess(Network instance, Constants constants, Afk afk, Connect connect, ServerAPI serverAPI) { + public CommandPreProcess(Network instance, Constants constants, Afk afk, Connect connect, ServerAPI serverAPI, MessageSender messageSender) { this.instance = instance; this.constants = constants; this.afk = afk; this.connect = connect; this.serverAPI = serverAPI; + this.messageSender = messageSender; instance.allowShutdown = false; Bukkit.getServer().getPluginManager().registerEvents(this, instance); } @@ -170,6 +172,6 @@ public void onServerClose(ArrayList users) { users.clear(); // Let the Proxy know the server is closing. - SocketHandlerImpl.sendSocketMessageIfOnline(new ServerShutdown(constants.serverName())); + messageSender.sendSocketMessage(new ServerShutdown(constants.serverName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index e8f497ce..76029d50 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -4,25 +4,20 @@ import lombok.extern.java.Log; import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; import net.bteuk.network.core.Constants; import net.bteuk.network.core.Time; import net.bteuk.network.eventing.events.EventManager; -import net.bteuk.network.lib.dto.OnlineUser; -import net.bteuk.network.lib.dto.OnlineUserAdd; -import net.bteuk.network.lib.dto.OnlineUserRemove; import net.bteuk.network.lib.dto.TabPlayer; import net.bteuk.network.lib.dto.UserConnectReply; import net.bteuk.network.lib.dto.UserConnectRequest; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.dto.UserRemove; -import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.RegionManager; import net.bteuk.network.regions.RegionUser; -import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.TextureUtils; @@ -30,7 +25,6 @@ import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -39,8 +33,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import java.util.ArrayList; -import java.util.List; import java.util.Set; import java.util.UUID; @@ -52,26 +44,27 @@ public class Connect implements Listener { private final Constants constants; private final TabManager tabManager; private final Roles roles; - private final GlobalSQL globalSQL; private final GuiManager guiManager; private final Nightvision nightvision; private final EventManager eventManager; private final RegionManager regionManager; + private final MessageSender messageSender; @Setter private boolean blockLeaveEvent; - public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GlobalSQL globalSQL, GuiManager guiManager, Nightvision nightvision, EventManager eventManager, RegionManager regionManager) { + public Connect(Network instance, Constants constants, TabManager tabManager, Roles roles, GuiManager guiManager, Nightvision nightvision, + EventManager eventManager, RegionManager regionManager, MessageSender messageSender) { this.instance = instance; this.constants = constants; this.tabManager = tabManager; this.roles = roles; - this.globalSQL = globalSQL; this.guiManager = guiManager; this.nightvision = nightvision; this.eventManager = eventManager; this.regionManager = regionManager; + this.messageSender = messageSender; this.blockLeaveEvent = false; @@ -102,7 +95,7 @@ public void handleUserConnectReply(UserConnectReply reply) { if (constants.regionsEnabled()) { regionUser = regionManager.getUserByPlayer(player).orElse(null); } - NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); + NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser, messageSender); instance.addUser(user); // Hide this player for all players in focus mode. @@ -141,53 +134,12 @@ public void handleUserRemove(UserRemove userRemove) { @EventHandler(priority = EventPriority.HIGHEST) public void joinServerEvent(PlayerJoinEvent joinEvent) { - if (constants.standalone()) { - Player player = joinEvent.getPlayer(); - - globalSQL.createUser(player.getUniqueId().toString(), player.getName(), - TextureUtils.getTexture(player.getPlayerProfile())); - - boolean navigatorEnabled = globalSQL.getBoolean("SELECT navigator FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - boolean teleportEnabled = globalSQL.getBoolean("SELECT teleport_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - boolean nightVisionEnabled = globalSQL.getBoolean("SELECT nightvision_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - String chatChannel = globalSQL.getString("SELECT chat_channel FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - boolean tipsEnabled = globalSQL.getBoolean("SELECT tips_enabled FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - String displayName = globalSQL.getString("SELECT display_name FROM player_data WHERE uuid='" + player.getUniqueId() + "'"); - Component displayNameComponent; - if (displayName != null) { - displayNameComponent = GsonComponentSerializer.gson().deserialize(displayName); - } else { - displayNameComponent = ChatUtils.line(player.getName()); - } - - List messages = globalSQL.getOfflineMessages(player.getUniqueId().toString()); - List components = new ArrayList<>(); - messages.forEach(message -> components.add(GsonComponentSerializer.gson().deserialize(message))); - - UserConnectReply reply = new UserConnectReply(player.getUniqueId().toString(), navigatorEnabled, teleportEnabled, nightVisionEnabled, chatChannel, tipsEnabled, - components, false, displayNameComponent); - RegionUser regionUser = null; - if (constants.regionsEnabled()) { - regionUser = regionManager.getUserByPlayer(player).orElse(null); - } - NetworkUser user = new NetworkUser(player, reply, instance, constants, roles, nightvision, eventManager, regionUser); - - OnlineUserAdd onlineUserAdd = new OnlineUserAdd(); - onlineUserAdd.setUser(new OnlineUser(player.getUniqueId().toString(), player.getName(), constants.serverName())); - - instance.addUser(user); - instance.handleOnlineUserAdd(onlineUserAdd); - } else { - networkJoinEvent(joinEvent); - } + networkJoinEvent(joinEvent); } @EventHandler public void leaveServerEvent(PlayerQuitEvent e) { - - if (!constants.standalone()) { - e.quitMessage(null); - } + e.quitMessage(null); if (blockLeaveEvent) { return; @@ -201,7 +153,7 @@ public void leaveServerEvent(PlayerQuitEvent e) { UserDisconnect disconnectEvent = new UserDisconnect(); disconnectEvent.setUuid(e.getPlayer().getUniqueId().toString()); disconnectEvent.setServer(constants.serverName()); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(disconnectEvent)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> messageSender.sendSocketMessage(disconnectEvent)); return; } @@ -237,14 +189,9 @@ public void leaveServerEvent(PlayerQuitEvent e) { user.lightsOut.delete(); } - if (constants.standalone()) { - OnlineUserRemove onlineUserRemove = new OnlineUserRemove(playerUUID.toString()); - instance.handleOnlineUserRemove(onlineUserRemove); - } else { - // Send a disconnect event to the proxy to handle potential messages. - UserDisconnect userDisconnect = user.createDisconnectEvent(); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(userDisconnect)); - } + // Send a disconnect event to the proxy to handle potential messages. + UserDisconnect userDisconnect = user.createDisconnectEvent(); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> messageSender.sendSocketMessage(userDisconnect)); } private void networkJoinEvent(PlayerJoinEvent e) { @@ -263,7 +210,7 @@ private void networkJoinEvent(PlayerJoinEvent e) { UserConnectRequest userConnectRequest = new UserConnectRequest(constants.serverName(), e.getPlayer().getUniqueId().toString(), e.getPlayer().getName(), TextureUtils.getTexture(e.getPlayer().getPlayerProfile()), channels, tabPlayer, e.getPlayer().hasPermission("group.architect"), e.getPlayer().hasPermission("group.reviewer")); - Bukkit.getScheduler().runTaskAsynchronously(instance, () -> SocketHandlerImpl.sendSocketMessageIfOnline(userConnectRequest)); + Bukkit.getScheduler().runTaskAsynchronously(instance, () -> messageSender.sendSocketMessage(userConnectRequest)); log.info(String.format("%s connected to the server, sent request to proxy to add player as NetworkUser", e.getPlayer().getName())); } } diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 314de397..48f5cbc1 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -55,7 +55,7 @@ public NavigatorGui(GuiProvider provider) { }); setItem(6, Utils.createItem(Material.KNOWLEDGE_BOOK, 1, Utils.title("Tutorials"), Utils.line("Click to open the tutorials menu.")), (NetworkUser u) -> { - // Switch to tutorials menu if it's online and enabled. + // Switch to the tutorials menu if it's online and enabled. // If the current server is already tutorials, don't open the gui. if (constants.serverType() == ServerType.TUTORIAL) { u.player.closeInventory(); diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkChatHandler.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkChatHandler.java new file mode 100644 index 00000000..20ac6cab --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkChatHandler.java @@ -0,0 +1,24 @@ +package net.bteuk.network.proxy; + +import net.bteuk.network.lib.dto.AbstractTransferObject; +import net.bteuk.network.socket.NetworkSocketHandler; +import org.btuk.proxy.core.chat.ChatHandler; + +public class NetworkChatHandler implements ChatHandler { + + private final NetworkSocketHandler socketHandler; + + public NetworkChatHandler(NetworkSocketHandler socketHandler) { + this.socketHandler = socketHandler; + } + + @Override + public void handle(AbstractTransferObject abstractTransferObject) { + socketHandler.handle(abstractTransferObject); + } + + @Override + public void handle(AbstractTransferObject abstractTransferObject, String server) { + socketHandler.handle(abstractTransferObject); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkCoreServerManager.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkCoreServerManager.java new file mode 100644 index 00000000..d7774b6c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkCoreServerManager.java @@ -0,0 +1,52 @@ +package net.bteuk.network.proxy; + +import org.btuk.proxy.core.server.CoreServerManager; +import org.btuk.proxy.core.server.Server; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.List; +import java.util.Optional; + +public class NetworkCoreServerManager implements CoreServerManager { + + private final NetworkServer server; + + public NetworkCoreServerManager(JavaPlugin plugin) { + this.server = new NetworkServer(plugin.getServer()); + } + + @Override + public Server createServer(String name) { + return server; + } + + @Override + public Optional getServer(String name) { + return Optional.of(server); + } + + @Override + public List getServers() { + return List.of(server); + } + + @Override + public List getOnlineServers() { + return List.of(server); + } + + @Override + public void addServer(Server server) { + // Do nothing. + } + + @Override + public void removeServer(Server server) { + // Do nothing. + } + + @Override + public void shutdown() { + // Do nothing. + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayer.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayer.java new file mode 100644 index 00000000..e2548a64 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayer.java @@ -0,0 +1,41 @@ +package net.bteuk.network.proxy; + +import net.kyori.adventure.text.Component; +import org.btuk.proxy.core.player.Player; +import org.btuk.proxy.core.server.Server; + +import java.util.UUID; + +public class NetworkPlayer implements Player { + + private final org.bukkit.entity.Player bukkitPlayer; + + public NetworkPlayer(org.bukkit.entity.Player bukkitPlayer) { + this.bukkitPlayer = bukkitPlayer; + } + + @Override + public void connectToServer(Server server) { + // Do nothing, this is only used for standalone servers. + } + + @Override + public UUID getUniqueId() { + return bukkitPlayer.getUniqueId(); + } + + @Override + public boolean hasPermission(String permission) { + return bukkitPlayer.hasPermission(permission); + } + + @Override + public String getUsername() { + return bukkitPlayer.getName(); + } + + @Override + public void sendPlayerListHeaderAndFooter(Component header, Component footer) { + bukkitPlayer.sendPlayerListHeaderAndFooter(header, footer); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayerManager.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayerManager.java new file mode 100644 index 00000000..e396bd7c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkPlayerManager.java @@ -0,0 +1,23 @@ +package net.bteuk.network.proxy; + +import org.btuk.proxy.core.player.Player; +import org.btuk.proxy.core.player.PlayerManager; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class NetworkPlayerManager implements PlayerManager { + + private final JavaPlugin plugin; + + public NetworkPlayerManager(JavaPlugin plugin) { + this.plugin = plugin; + } + + @Override + public List getPlayers() { + return plugin.getServer().getOnlinePlayers().stream().map(NetworkPlayer::new).collect(Collectors.toCollection(ArrayList::new)); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduledTask.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduledTask.java new file mode 100644 index 00000000..041e835c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduledTask.java @@ -0,0 +1,50 @@ +package net.bteuk.network.proxy; + +import org.btuk.proxy.core.scheduler.ScheduledTask; +import org.btuk.proxy.core.scheduler.TaskStatus; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; + +public class NetworkScheduledTask implements ScheduledTask { + + private JavaPlugin plugin; + + private BukkitTask task; + + /** + * Constructor for a scheduled task. + * + * @param plugin the plugin that owns the task + * @param task the task to be scheduled + */ + public NetworkScheduledTask(JavaPlugin plugin, BukkitTask task) { + this.plugin = plugin; + this.task = task; + } + + /** + * Constructor for a repeating task, these are tasks that run repeatedly. + */ + public NetworkScheduledTask() { + // Do nothing. + } + + @Override + public void cancel() { + task.cancel(); + } + + @Override + public TaskStatus getStatus() { + if (task != null && plugin != null) { + if (task.isCancelled()) { + return TaskStatus.CANCELLED; + } else if (plugin.getServer().getScheduler().getPendingTasks().contains(task)) { + return TaskStatus.SCHEDULED; + } + return TaskStatus.FINISHED; + } else { + return TaskStatus.SCHEDULED; + } + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduler.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduler.java new file mode 100644 index 00000000..a64750d0 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkScheduler.java @@ -0,0 +1,31 @@ +package net.bteuk.network.proxy; + +import org.btuk.proxy.core.scheduler.ScheduledTask; +import org.btuk.proxy.core.scheduler.Scheduler; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.concurrent.TimeUnit; + +public class NetworkScheduler implements Scheduler { + + private final JavaPlugin plugin; + + public NetworkScheduler(JavaPlugin plugin) { + this.plugin = plugin; + } + + @Override + public ScheduledTask createDelayedTask(Runnable runnable, long delay, TimeUnit timeUnit) { + return new NetworkScheduledTask(plugin, plugin.getServer().getScheduler().runTaskLater(plugin, runnable, convertToTicks(delay, timeUnit))); + } + + @Override + public ScheduledTask createRepeatingTask(Runnable runnable, long delay, long period, TimeUnit timeUnit) { + plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, runnable, convertToTicks(delay, timeUnit), convertToTicks(period, timeUnit)); + return new NetworkScheduledTask(); + } + + private static long convertToTicks(long time, TimeUnit unit) { + return TimeUnit.MILLISECONDS.convert(time, unit) / 50; + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkServer.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkServer.java new file mode 100644 index 00000000..96a74a39 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkServer.java @@ -0,0 +1,43 @@ +package net.bteuk.network.proxy; + +import net.bteuk.network.core.Time; +import org.btuk.proxy.core.player.Player; +import org.btuk.proxy.core.server.Server; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class NetworkServer implements Server { + + private final org.bukkit.Server bukkitServer; + + public NetworkServer(org.bukkit.Server bukkitServer) { + this.bukkitServer = bukkitServer; + } + + @Override + public List getPlayers() { + return bukkitServer.getOnlinePlayers().stream().map(NetworkPlayer::new).collect(Collectors.toCollection(ArrayList::new)); + } + + @Override + public String getName() { + return bukkitServer.getName(); + } + + @Override + public boolean canPing() { + return true; // The server is always available, else this code is not accessible. + } + + @Override + public void setLastPing(long time) { + // Do nothing. + } + + @Override + public long getLastPing() { + return Time.currentTime(); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java new file mode 100644 index 00000000..1fc20226 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java @@ -0,0 +1,206 @@ +package net.bteuk.network.proxy; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.EnumWrappers; +import com.comphenix.protocol.wrappers.PlayerInfoData; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import net.bteuk.network.lib.dto.TabPlayer; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import org.btuk.proxy.core.chat.ChatHandler; +import org.btuk.proxy.core.config.Config; +import org.btuk.proxy.core.player.Player; +import org.btuk.proxy.core.scheduler.Scheduler; +import org.btuk.proxy.core.tab.AbstractTabManager; +import org.btuk.proxy.core.user.CoreUserManager; +import org.btuk.proxy.core.user.User; +import org.bukkit.Server; +import org.jetbrains.annotations.Nullable; + +import java.nio.charset.StandardCharsets; +import java.util.EnumSet; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +import static com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction.ADD_PLAYER; +import static com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME; +import static com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction.UPDATE_LATENCY; +import static com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction.UPDATE_LISTED; + +public class NetworkTabManager extends AbstractTabManager { + + private final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + private final Server server; + + public NetworkTabManager(Server server, Config config, CoreUserManager coreUserManager, ChatHandler chatHandler, Scheduler scheduler) { + super(config, coreUserManager, chatHandler, scheduler); + this.server = server; + } + + @Override + protected void addPlayerToTabList(Player player, User user, TabPlayer tabPlayer) { + org.bukkit.entity.Player bukkitPlayer = resolveBukkitPlayer(player.getUniqueId().toString()); + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + return; + } + sendPlayerInfoAddOrFullUpdate(bukkitPlayer, List.of(toFakeInfoData(user, tabPlayer))); + } + + @Override + protected void removePlayerFromTabList(Player player, TabPlayer tabPlayer) { + org.bukkit.entity.Player bukkitPlayer = resolveBukkitPlayer(player.getUniqueId().toString()); + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + return; + } + UUID fakeUuid = fakeUuidForRealUuid(tabPlayer.getUuid()); + sendPlayerInfoRemove(bukkitPlayer, List.of(fakeUuid)); + } + + @Override + protected void updatePlayerPing(String name, int ping) { + Optional tabPlayer = tabPlayers.stream().filter(player -> player.getName().equals(name)).findFirst(); + User user = coreUserManager.getUserByName(name); + if (user == null) { + return; + } + List updates = tabPlayer.stream().map(player -> toFakeInfoData(user, player)).toList(); + broadcastPlayerInfoUpdate(updates, EnumSet.of(UPDATE_LATENCY)); + } + + @Override + protected void updatePlayerDisplayName(String name, TabPlayer updated) { + User user = coreUserManager.getUserByName(name); + if (user == null) { + return; + } + List updates = List.of(toFakeInfoData(user, updated)); + broadcastPlayerInfoUpdate(updates, EnumSet.of(UPDATE_DISPLAY_NAME)); + } + + @Override + protected int findPingForPlayer(String uuid) { + org.bukkit.entity.Player bukkitPlayer = server.getPlayer(UUID.fromString(uuid)); + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + return -1; + } else { + return bukkitPlayer.getPing(); + } + } + + @Override + protected void updatePing() { + List all = tabPlayers.stream().map(player -> { + player.setPing(findPingForPlayer(player.getUuid())); + User user = coreUserManager.getUserByUuid(player.getUuid()); + if (user == null) { + return null; + } + return toFakeInfoData(user, player); + }).filter(Objects::nonNull).toList(); + broadcastPlayerInfoUpdate(all, EnumSet.of(UPDATE_LATENCY)); + } + + /** + * Update a specific user in the tablist of another user. + * This can be used specifically when you do a personal mute of a player. + * + * @param user the user to update the tablist for + * @param userToUpdate the user to update in the tablist + */ + @Override + public void updatePlayerInTablistOfPlayer(User user, User userToUpdate) { + org.bukkit.entity.Player bukkitPlayer = resolveBukkitPlayer(user.getUuid()); + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + return; + } + TabPlayer tabPlayer = findTabPlayerByUuid(userToUpdate.getUuid()); + if (tabPlayer == null) { + return; + } + // Update just that one entry in just that one viewer + sendPlayerInfoAddOrFullUpdate(bukkitPlayer, List.of(toFakeInfoData(userToUpdate, tabPlayer))); + } + + /** + * Send the full tablist to a user. + * This is used when a user connects to a server. + * Adjust display names for muted players. + */ + @Override + public void sendTablist(User user) { + org.bukkit.entity.Player bukkitPlayer = resolveBukkitPlayer(user.getUuid()); + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) { + return; + } + List allInfo = tabPlayers.stream().map(player -> { + User tabUser = coreUserManager.getUserByUuid(player.getUuid()); + if (tabUser == null) { + return null; + } + return toFakeInfoData(tabUser, player); + }).filter(Objects::nonNull).toList(); + sendPlayerInfoAddOrFullUpdate(bukkitPlayer, allInfo); + server.sendPlayerListHeaderAndFooter(HEADER, FOOTER); + } + + private void broadcastPlayerInfoUpdate(List infoData, EnumSet actions) { + if (infoData == null || infoData.isEmpty()) return; + + for (org.bukkit.entity.Player viewer : server.getOnlinePlayers()) { + sendPlayerInfoUpdate(viewer, infoData, actions); + } + } + + private void sendPlayerInfoAddOrFullUpdate(org.bukkit.entity.Player player, List infoData) { + sendPlayerInfoUpdate(player, infoData, EnumSet.of(ADD_PLAYER, UPDATE_LISTED, UPDATE_LATENCY, UPDATE_DISPLAY_NAME)); + } + + private void sendPlayerInfoUpdate(org.bukkit.entity.Player viewer, + List infoData, + EnumSet actions) { + PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.PLAYER_INFO); + packet.getPlayerInfoActions().write(0, actions); + packet.getPlayerInfoDataLists().write(1, infoData); + + protocolManager.sendServerPacket(viewer, packet); + } + + private void sendPlayerInfoRemove(org.bukkit.entity.Player viewer, List uuids) { + PacketContainer packet = protocolManager.createPacket(PacketType.Play.Server.PLAYER_INFO_REMOVE); + packet.getUUIDLists().write(0, uuids); + protocolManager.sendServerPacket(viewer, packet); + } + + private PlayerInfoData toFakeInfoData(User user, TabPlayer tabPlayer) { + String realUuid = tabPlayer.getUuid(); + UUID fakeUuid = fakeUuidForRealUuid(realUuid); + + WrappedGameProfile profile = new WrappedGameProfile(fakeUuid, null); + EnumWrappers.NativeGameMode gameMode = EnumWrappers.NativeGameMode.CREATIVE; + + Component displayName = formattedName(user, tabPlayer); + WrappedChatComponent wrappedDisplayName = toWrappedChat(displayName); + + return new PlayerInfoData(fakeUuid, tabPlayer.getPing(), true, gameMode, profile, wrappedDisplayName); + } + + private UUID fakeUuidForRealUuid(String realUuidString) { + return UUID.nameUUIDFromBytes(("network-tab:" + realUuidString).getBytes(StandardCharsets.UTF_8)); + } + + private static WrappedChatComponent toWrappedChat(Component component) { + String json = GsonComponentSerializer.gson().serialize(component); + return WrappedChatComponent.fromJson(json); + } + + private @Nullable org.bukkit.entity.Player resolveBukkitPlayer(String uuid) { + return server.getOnlinePlayers().stream().filter(player -> player.getUniqueId().toString().equals(uuid)).findFirst().orElse(null); + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/socket/MessageSender.java b/Plugin/src/main/java/net/bteuk/network/socket/MessageSender.java new file mode 100644 index 00000000..1ffa03d7 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/socket/MessageSender.java @@ -0,0 +1,42 @@ +package net.bteuk.network.socket; + +import lombok.extern.java.Log; +import net.bteuk.network.core.Constants; +import net.bteuk.network.lib.dto.AbstractTransferObject; +import net.bteuk.network.lib.socket.OutputSocket; +import org.btuk.proxy.core.socket.ProxySocketHandler; + +import java.util.function.Consumer; + +/** + * Sends messages to the proxy. + */ +@Log +public class MessageSender { + + private final boolean isStandalone; + + private OutputSocket outputSocket; + + public MessageSender(Constants constants) { + this.isStandalone = constants.standalone(); + if (!isStandalone) { + outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); + } + } + + public void sendSocketMessage(AbstractTransferObject message) { + if (outputSocket != null) { + outputSocket.sendSocketMessage(message); + } else { + log.severe("Message sent while output socket is not yet initialised."); + } + } + + public Consumer setupStandaloneOutputSocket() { + if (isStandalone) { + return socketHandler -> outputSocket = new StandaloneOutputSocket(socketHandler); + } + return null; + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java b/Plugin/src/main/java/net/bteuk/network/socket/NetworkSocketHandler.java similarity index 56% rename from Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java rename to Plugin/src/main/java/net/bteuk/network/socket/NetworkSocketHandler.java index 8ddf07f7..47484612 100644 --- a/Plugin/src/main/java/net/bteuk/network/SocketHandlerImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/socket/NetworkSocketHandler.java @@ -1,6 +1,9 @@ -package net.bteuk.network; +package net.bteuk.network.socket; import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; +import net.bteuk.network.Network; +import net.bteuk.network.TabManager; import net.bteuk.network.core.Constants; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.lib.dto.AbstractTransferObject; @@ -14,49 +17,27 @@ import net.bteuk.network.lib.dto.UserRemove; import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.socket.InputSocket; -import net.bteuk.network.lib.socket.OutputSocket; import net.bteuk.network.lib.socket.SocketHandler; @Log -public class SocketHandlerImpl implements SocketHandler { +public class NetworkSocketHandler implements SocketHandler { private final Network instance; - private CustomChat chat; + private final CustomChat chat; - private TabManager tabManager; + private final TabManager tabManager; - private Connect connect; + private final Connect connect; - private OutputSocket outputSocket; private InputSocket inputSocket; - private static SocketHandlerImpl socketHandler; - - /** - * - * @param message - * @return Whether the socket message was sent - */ - public static boolean sendSocketMessageIfOnline(AbstractTransferObject message) - { - if (socketHandler != null) { - socketHandler.sendSocketMessage(message); - return true; - } - else - return false; - } - - public SocketHandlerImpl(Network instance, CustomChat chat, TabManager tabManager, Connect connect, Constants constants) { + public NetworkSocketHandler(Network instance, CustomChat chat, TabManager tabManager, Connect connect, Constants constants) { this.instance = instance; this.chat = chat; this.tabManager = tabManager; this.connect = connect; - // Set up the output socket. - outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); - // Register input socket for receiving messages from the proxy. int inputSocketPort = constants.chatSocketInputPort(); if (inputSocketPort == 0) { @@ -68,42 +49,8 @@ public SocketHandlerImpl(Network instance, CustomChat chat, TabManager tabManage // Register the socket handler. registerSocketHandler(this); - - socketHandler = this; } - public SocketHandlerImpl(Network instance, Constants constants) { - this.instance = instance; - - // Set up the output socket. - outputSocket = new OutputSocket(constants.chatSocketOutputIP(), constants.chatSocketOutputPort()); - - // Register input socket for receiving messages from the proxy. - int inputSocketPort = constants.chatSocketInputPort(); - if (inputSocketPort == 0) { - log.severe("Input socket port is not set in config or is set to 0. Please set a valid port!"); - } else { - // Create the input socket. - inputSocket = new InputSocket(inputSocketPort); - } - - // Register the socket handler. - registerSocketHandler(this); - - socketHandler = this; - } - - public void addComponents(CustomChat chat, TabManager tabManager, Connect connect) { - this.chat = chat; - this.tabManager = tabManager; - this.connect = connect; - } - - public void sendSocketMessage(AbstractTransferObject message) { - outputSocket.sendSocketMessage(message); - } - - @Override public AbstractTransferObject handle(AbstractTransferObject abstractTransferObject) { switch (abstractTransferObject) { diff --git a/Plugin/src/main/java/net/bteuk/network/socket/StandaloneOutputSocket.java b/Plugin/src/main/java/net/bteuk/network/socket/StandaloneOutputSocket.java new file mode 100644 index 00000000..5a26632a --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/socket/StandaloneOutputSocket.java @@ -0,0 +1,21 @@ +package net.bteuk.network.socket; + +import net.bteuk.network.lib.dto.AbstractTransferObject; +import net.bteuk.network.lib.socket.OutputSocket; +import net.bteuk.network.lib.socket.SocketHandler; + +public class StandaloneOutputSocket extends OutputSocket { + + private final SocketHandler socketHandler; + + public StandaloneOutputSocket(SocketHandler socketHandler) { + super(null, 0); + this.socketHandler = socketHandler; + } + + @Override + public boolean sendSocketMessage(AbstractTransferObject transferObject) { + socketHandler.handle(transferObject); + return true; + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index 8bd08e68..b10ae1dd 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -4,7 +4,6 @@ import lombok.Setter; import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.entity.Role; import net.bteuk.network.building_companion.BuildingCompanion; import net.bteuk.network.commands.Nightvision; @@ -16,6 +15,7 @@ import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.regions.RegionUser; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -104,7 +104,7 @@ public class NetworkUser { private final RegionUser regionUser; public NetworkUser(Player player, UserConnectReply reply, Network instance, Constants constants, Roles roles, Nightvision nightvision, EventManager eventManager, - RegionUser regionUser) { + RegionUser regionUser, MessageSender messageSender) { this.instance = instance; this.constants = constants; @@ -117,7 +117,7 @@ public NetworkUser(Player player, UserConnectReply reply, Network instance, Cons nightvisionEnabled = reply.isNightvisionEnabled(); chatChannel = reply.getChatChannel(); tipsEnabled = reply.isTipsEnabled(); - setFocusEnabled(reply.isFocusEnabled()); + setFocusEnabled(reply.isFocusEnabled(), messageSender); switching = false; inPortal = false; @@ -279,8 +279,8 @@ public String getUuid() { return player.getUniqueId().toString(); } - public void toggleFocus() { - setFocusEnabled(!isFocusEnabled()); + public void toggleFocus(MessageSender messageSender) { + setFocusEnabled(!isFocusEnabled(), messageSender); if (isFocusEnabled()) { player.sendMessage(ChatUtils.success("Enabled focus mode")); } else { @@ -292,7 +292,7 @@ public void updateDisplayName(Component displayName) { player.displayName(displayName); } - private void setFocusEnabled(boolean enabled) { + private void setFocusEnabled(boolean enabled, MessageSender messageSender) { focusEnabled = enabled; if (focusEnabled) { hidePlayers(); @@ -300,7 +300,7 @@ private void setFocusEnabled(boolean enabled) { showPlayers(); } FocusEvent focusEvent = new FocusEvent(player.getUniqueId().toString(), focusEnabled); - SocketHandlerImpl.sendSocketMessageIfOnline(focusEvent); + messageSender.sendSocketMessage(focusEvent); } public void hidePlayer(Player playerToHide) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java index 1d963f54..eb3924fe 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/Roles.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/Roles.java @@ -1,9 +1,7 @@ package net.bteuk.network.utils; import lombok.extern.java.Log; -import net.bteuk.network.CustomChat; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.RoleAPI; import net.bteuk.network.api.entity.Role; import net.bteuk.network.lib.dto.ChatMessage; @@ -13,6 +11,7 @@ import net.bteuk.network.lib.dto.UserUpdate; import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.bteuk.network.sql.PlotSQL; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; @@ -21,6 +20,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.LinkedHashSet; @@ -45,17 +45,12 @@ public final class Roles implements RoleAPI { private final Network instance; private final PlotSQL plotSQL; - private CustomChat customChat; + private final MessageSender messageSender; - public Roles(Network instance, PlotSQL plotSQL) { + public Roles(Network instance, PlotSQL plotSQL, MessageSender messageSender) { this.instance = instance; this.plotSQL = plotSQL; - } - - public void registerChat(CustomChat customChat) { - if (this.customChat == null) { - this.customChat = customChat; - } + this.messageSender = messageSender; } @Override @@ -66,7 +61,7 @@ public Set getRoles() { return ROLES; } - public Role getRoleById(String roleId) { + public @Nullable Role getRoleById(String roleId) { // Get the configuration if not yet fetches. if (ROLES == null) { loadRoles(); @@ -186,10 +181,6 @@ private void loadRoles() { public CompletableFuture alterRole(String uuid, String name, String roleId, boolean remove, boolean announce) { - if (customChat == null) { - throw new IllegalStateException("CustomChat is not initialized."); - } - // Get the configured group. Role role = getRoleById(roleId); Group group = Permissions.getGroup(roleId); @@ -226,7 +217,7 @@ public CompletableFuture alterRole(String uuid, String name, String r UserUpdate userUpdate = new UserUpdate(); userUpdate.setUuid(uuid); userUpdate.setTabPlayer(tabPlayer); - SocketHandlerImpl.sendSocketMessageIfOnline(userUpdate); + messageSender.sendSocketMessage(userUpdate); // If the new primary role is architect or reviewer, and they were promoted add them to the reviewers // database table. @@ -236,7 +227,7 @@ public CompletableFuture alterRole(String uuid, String name, String r } DiscordRole discordRole = new DiscordRole(uuid, roleId, !remove); - SocketHandlerImpl.sendSocketMessageIfOnline(discordRole); + messageSender.sendSocketMessage(discordRole); if (announce && !remove) { sendPromotionChatMessage(name, role); @@ -259,14 +250,14 @@ private void sendPromotionChatMessage(String name, Role role) { .append(PROMOTION_TEMPLATE) .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - customChat.sendChatMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); + messageSender.sendSocketMessage(new ChatMessage(GLOBAL.getChannelName(), "server", message)); } private void sendPromotionDirectMessage(String uuid, Role role) { Component message = PROMOTION_SELF .append(role.getColouredRoleName()) .decorate(TextDecoration.BOLD); - customChat.sendDirectMessage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid + messageSender.sendSocketMessage(new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid , "server", message, true)); } } diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 720808ba..fc903e23 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -6,13 +6,13 @@ import com.comphenix.protocol.events.PacketContainer; import lombok.extern.java.Log; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkPlayer; import net.bteuk.network.core.Constants; import net.bteuk.network.lib.dto.SwitchServerEvent; import net.bteuk.network.lib.dto.UserDisconnect; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import org.bukkit.entity.Player; import java.util.Optional; @@ -22,10 +22,12 @@ public class SwitchServer implements ServerAPI { private final Network instance; private final Constants constants; + private final MessageSender messageSender; - public SwitchServer(Network instance, Constants constants) { + public SwitchServer(Network instance, Constants constants, MessageSender messageSender) { this.instance = instance; this.constants = constants; + this.messageSender = messageSender; } public void switchServer(NetworkPlayer player, String server) { @@ -75,7 +77,7 @@ public void switchServer(NetworkPlayer player, String server) { UserDisconnect userDisconnect = user.get().createDisconnectEvent(); SwitchServerEvent switchServerEvent = new SwitchServerEvent(player.getUuidAsString(), server, constants.serverName(), userDisconnect); - SocketHandlerImpl.sendSocketMessageIfOnline(switchServerEvent); + messageSender.sendSocketMessage(switchServerEvent); } public static void switchToExternalServer(Player player) { diff --git a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java index 7aa978e3..13739b75 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/staff/Moderation.java @@ -1,7 +1,6 @@ package net.bteuk.network.utils.staff; import net.bteuk.network.Network; -import net.bteuk.network.SocketHandlerImpl; import net.bteuk.network.api.EventAPI; import net.bteuk.network.core.Time; import net.bteuk.network.exceptions.DurationFormatException; @@ -12,6 +11,7 @@ import net.bteuk.network.lib.enums.ChatChannels; import net.bteuk.network.lib.enums.ModerationAction; import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -24,10 +24,13 @@ public class Moderation { private final Network instance; private final EventAPI eventAPI; + + private final MessageSender messageSender; - public Moderation(Network instance, EventAPI eventAPI) { + public Moderation(Network instance, EventAPI eventAPI, MessageSender messageSender) { this.instance = instance; this.eventAPI = eventAPI; + this.messageSender = messageSender; } // Ban the player. @@ -66,12 +69,12 @@ public void mute(String uuid, long end_time, String reason) throws NotMutedExcep Component mutedComponent = getMutedComponent(uuid); ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.MUTE, null, uuid, end_time, mutedComponent); - SocketHandlerImpl.sendSocketMessageIfOnline(moderationEvent); + messageSender.sendSocketMessage(moderationEvent); // Notify the user. DirectMessage directMessage = new DirectMessage(ChatChannels.GLOBAL.getChannelName(), uuid, "server", mutedComponent, true); - SocketHandlerImpl.sendSocketMessageIfOnline(directMessage); + messageSender.sendSocketMessage(directMessage); } // Unban the player. @@ -91,7 +94,7 @@ public void unmute(String uuid) { // Update Tab by sending a moderation event. ModerationEvent moderationEvent = new ModerationEvent(ModerationAction.UNMUTE, null, uuid, 0L, null); - SocketHandlerImpl.sendSocketMessageIfOnline(moderationEvent); + messageSender.sendSocketMessage(moderationEvent); } // Kick the player. diff --git a/Regions/pom.xml b/Regions/pom.xml index d13ff232..50fc9b02 100644 --- a/Regions/pom.xml +++ b/Regions/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.8.2 + 1.9.0 net.bteuk.network diff --git a/pom.xml b/pom.xml index 217bb717..6457ec20 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.bteuk Network - 1.8.2 + 1.9.0 pom Network @@ -23,7 +23,7 @@ 1.21.8-R0.1-SNAPSHOT - e14b531c08 + 9acb823f8d 5958727df9 24c3fc82f5 @@ -94,7 +94,12 @@ - com.github.BTEUK.Proxy + com.github.BuildtheUK.Proxy + core + ${bteuk.proxy.version} + + + com.github.BuildtheUK.Proxy database ${bteuk.proxy.version} @@ -131,37 +136,41 @@ - - org.apache.maven.plugins - maven-javadoc-plugin - 3.6.3 - - false - none - UTF-8 - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.3.1 - - - attach-sources - - jar-no-fork - - - - + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + false + none + UTF-8 + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar-no-fork + + + + + + From d2dc85cc071bfe4553913bbc04230a38be92667e Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 24 Feb 2026 19:49:26 +0100 Subject: [PATCH 77/96] Fix head in tab and enable chat listener. --- .../main/java/net/bteuk/network/Network.java | 5 +++++ .../bteuk/network/proxy/NetworkTabManager.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 93865491..de334ef5 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -72,6 +72,7 @@ import net.bteuk.network.eventing.events.InviteEvent; import net.bteuk.network.eventing.events.KickEvent; import net.bteuk.network.eventing.events.TeleportEvent; +import net.bteuk.network.eventing.listeners.ChatListener; import net.bteuk.network.eventing.listeners.CommandPreProcess; import net.bteuk.network.eventing.listeners.Connect; import net.bteuk.network.eventing.listeners.NetworkMoveListener; @@ -541,6 +542,9 @@ public void enablePlugin() { // Start the Network timers. new Timers(this, globalSQL, eventAPI, constants, afk); + // Register the chat listener. + new ChatListener(this, moderation, afk, messageSender); + // Let the Proxy know that the server is enabled. messageSender.sendSocketMessage(new ServerStartup(constants.serverName())); @@ -550,6 +554,7 @@ public void enablePlugin() { } private void initStandaloneMode(NetworkSocketHandler socketHandler, MessageSender messageSender) { + log.info("Loading Network in standalone mode."); ProxyController proxyController = new ProxyController(getDataFolder()); NetworkScheduler scheduler = new NetworkScheduler(this); diff --git a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java index 1fc20226..79293188 100644 --- a/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java +++ b/Plugin/src/main/java/net/bteuk/network/proxy/NetworkTabManager.java @@ -8,6 +8,7 @@ import com.comphenix.protocol.wrappers.PlayerInfoData; import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.comphenix.protocol.wrappers.WrappedSignedProperty; import net.bteuk.network.lib.dto.TabPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; @@ -22,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import java.nio.charset.StandardCharsets; +import java.util.Collection; import java.util.EnumSet; import java.util.List; import java.util.Objects; @@ -181,8 +183,12 @@ private void sendPlayerInfoRemove(org.bukkit.entity.Player viewer, List uu private PlayerInfoData toFakeInfoData(User user, TabPlayer tabPlayer) { String realUuid = tabPlayer.getUuid(); UUID fakeUuid = fakeUuidForRealUuid(realUuid); + org.bukkit.entity.Player bukkitPlayer = resolveBukkitPlayer(user.getUuid()); WrappedGameProfile profile = new WrappedGameProfile(fakeUuid, null); + getSignedTextures(bukkitPlayer).ifPresent(textures -> { + profile.getProperties().put("textures", textures); + }); EnumWrappers.NativeGameMode gameMode = EnumWrappers.NativeGameMode.CREATIVE; Component displayName = formattedName(user, tabPlayer); @@ -191,6 +197,17 @@ private PlayerInfoData toFakeInfoData(User user, TabPlayer tabPlayer) { return new PlayerInfoData(fakeUuid, tabPlayer.getPing(), true, gameMode, profile, wrappedDisplayName); } + private static Optional getSignedTextures(org.bukkit.entity.Player player) { + WrappedGameProfile profile = WrappedGameProfile.fromPlayer(player); + + Collection textures = profile.getProperties().get("textures"); + if (textures.isEmpty()) { + return Optional.empty(); + } + + return Optional.of(textures.iterator().next()); + } + private UUID fakeUuidForRealUuid(String realUuidString) { return UUID.nameUUIDFromBytes(("network-tab:" + realUuidString).getBytes(StandardCharsets.UTF_8)); } From 220bd2681950997960d7ee793ea6c16ccae15a4f Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 3 Mar 2026 19:07:27 +0100 Subject: [PATCH 78/96] Update dependencies and update jitpack to only build the api module. --- Plugin/pom.xml | 88 +++++++++++-------- .../main/java/net/bteuk/network/Network.java | 4 +- .../java/net/bteuk/network/TabManager.java | 2 +- .../net/bteuk/network/commands/Navigator.java | 2 +- .../network/eventing/listeners/Connect.java | 2 +- .../net/bteuk/network/gui/GuiProvider.java | 2 +- .../net/bteuk/network/gui/NetworkGui.java | 4 +- .../tutorials/LessonContinueConfirmer.java | 2 +- .../tutorials/RecommendedTutorialsGui.java | 2 +- .../net/bteuk/network/utils/NetworkUser.java | 2 +- .../TextEditorBookListener.java | 2 +- jitpack.yml | 2 +- pom.xml | 7 +- 13 files changed, 70 insertions(+), 51 deletions(-) diff --git a/Plugin/pom.xml b/Plugin/pom.xml index e823443c..3bd6e24b 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -15,8 +15,6 @@ Minecraft plugin for the BTEUK Network - UTF-8 - 5.11.2 3.13.0 3.6.0 @@ -37,54 +35,78 @@ ${project.parent.artifactId}-${project.version} + true true + *:* - META-INF/** - AUTHORS + META-INF/MANIFEST.MF + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + META-INF/maven/** + META-INF/NOTICE* + META-INF/LICENSE* LICENSE - README.md - Log4j-events.dtd - Log4j-events.xsd - Log4j-config.xsd - Log4j-levels.xsd - Log4j-charsets.properties - mozilla/public-suffix-list.txt + META-INF/DEPENDENCIES + + META-INF/io.netty.versions.properties + + module-info.class + META-INF/versions/** + - com.github.BTEUK:* + com.github.BTEUK:TeachingTutorials - net/kyori/** - com/google/** - net/daporkchop/lib/binary/** - org/** - com/fasterxml/jackson/** - io/netty/** config.yml + + com/google/gson/** + org/apache/commons/lang3/** + org/apache/commons/io/** + io/netty/** + org/apache/logging/log4j/** javax/annotation/** - LZMA/** - net/buildtheearth/** + com/google/common/** + + com/google/errorprone/annotations/** + com/google/j2objc/annotations/** + it/unimi/dsi/fastutil/** + org/apache/commons/imaging/** + net/daporkchop/lib/** - SCL.lombok/** - plugin.yml - lombok/** - changelog.txt - latestchanges.html - release-timestamp.txt - net/bteuk/teachingtutorials/services/** + - com.github.BTEUK:ProgressMapper + com.github.BTEUK:NetworkLib - me/bteuk/progressmapperbackend/** + com/google/gson/** + net/kyori/** + com/fasterxml/jackson/** + + org/jetbrains/annotations/** + org/intellij/lang/annotations/** + + + + org.apache.commons.lang3 + net.bteuk.network.shaded.commons.lang3 + + + org.apache.commons.io + net.bteuk.network.shaded.commons.io + + @@ -125,7 +147,7 @@ - com.github.BTEUK.BTEUKLib + com.github.BuildtheUK.BTUKLib Minecraft @@ -203,12 +225,6 @@ 33.4.8-jre - - - - - - com.github.BTEUK NetworkLib diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 6b66ef34..7bbf04e0 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -2,8 +2,6 @@ import lombok.Getter; import lombok.extern.java.Log; -import net.bteuk.minecraft.gui.GuiListener; -import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.api.CoordinateAPI; import net.bteuk.network.api.NetworkAPI; import net.bteuk.network.api.PlotAPI; @@ -110,6 +108,8 @@ import net.bteuk.network.utils.worldguard.WorldGuard; import net.bteuk.teachingtutorials.services.PromotionService; import net.buildtheearth.terraminusminus.TerraConfig; +import org.btuk.minecraft.gui.GuiListener; +import org.btuk.minecraft.gui.GuiManager; import org.btuk.proxy.core.ProxyController; import org.btuk.proxy.core.socket.ProxySocketHandler; import org.btuk.proxy.database.DatabaseInit; diff --git a/Plugin/src/main/java/net/bteuk/network/TabManager.java b/Plugin/src/main/java/net/bteuk/network/TabManager.java index cfe66b17..75fa9949 100644 --- a/Plugin/src/main/java/net/bteuk/network/TabManager.java +++ b/Plugin/src/main/java/net/bteuk/network/TabManager.java @@ -201,7 +201,7 @@ public void onPacketSending(PacketEvent event) { infoList.forEach(info -> { boolean isServerPlayer = instance.getServer().getPlayer(info.getProfileId()) != null; - // Create an exact copy, but set 'listed' to false. + // Create an exact copy but set 'listed' to false. if (isServerPlayer) { newInfoList.add(new PlayerInfoData(info.getProfileId(), info.getLatency(), false, info.getGameMode(), info.getProfile(), info.getDisplayName(), diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index fd7ea622..ab68e5ce 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -3,7 +3,6 @@ import io.papermc.paper.command.brigadier.CommandSourceStack; import lombok.Getter; import lombok.extern.java.Log; -import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.EventAPI; @@ -25,6 +24,7 @@ import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.staff.Moderation; +import org.btuk.minecraft.gui.GuiManager; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import teachingtutorials.utils.DBConnection; diff --git a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java index 76029d50..c4db1a67 100644 --- a/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java +++ b/Plugin/src/main/java/net/bteuk/network/eventing/listeners/Connect.java @@ -2,7 +2,6 @@ import lombok.Setter; import lombok.extern.java.Log; -import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; import net.bteuk.network.TabManager; import net.bteuk.network.building_companion.BuildingCompanion; @@ -25,6 +24,7 @@ import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.btuk.minecraft.gui.GuiManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java index 7d584e51..cfe41954 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/GuiProvider.java @@ -1,6 +1,5 @@ package net.bteuk.network.gui; -import net.bteuk.minecraft.gui.GuiManager; import net.bteuk.network.Network; import net.bteuk.network.api.ChatAPI; import net.bteuk.network.api.EventAPI; @@ -17,6 +16,7 @@ import net.bteuk.network.sql.PlotSQL; import net.bteuk.network.utils.Roles; import net.bteuk.network.utils.staff.Moderation; +import org.btuk.minecraft.gui.GuiManager; import teachingtutorials.utils.DBConnection; /** diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java index dc36e21a..d9679e33 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NetworkGui.java @@ -1,10 +1,10 @@ package net.bteuk.network.gui; -import net.bteuk.minecraft.gui.Gui; -import net.bteuk.minecraft.gui.GuiAction; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; +import org.btuk.minecraft.gui.Gui; +import org.btuk.minecraft.gui.GuiAction; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java index 2ad017a3..9f4a1e55 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/LessonContinueConfirmer.java @@ -1,10 +1,10 @@ package net.bteuk.network.gui.tutorials; import lombok.extern.java.Log; -import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; +import org.btuk.minecraft.gui.Gui; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import teachingtutorials.guis.Event; diff --git a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java index 41d5a4b3..80b2e6e8 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/tutorials/RecommendedTutorialsGui.java @@ -1,12 +1,12 @@ package net.bteuk.network.gui.tutorials; import lombok.extern.java.Log; -import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.gui.GuiProvider; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.TutorialRecommendation; import net.bteuk.network.utils.Utils; +import org.btuk.minecraft.gui.Gui; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import teachingtutorials.tutorialobjects.LessonObject; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java index b10ae1dd..91b5b945 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkUser.java @@ -2,7 +2,6 @@ import lombok.Getter; import lombok.Setter; -import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; import net.bteuk.network.api.entity.Role; import net.bteuk.network.building_companion.BuildingCompanion; @@ -17,6 +16,7 @@ import net.bteuk.network.regions.RegionUser; import net.bteuk.network.socket.MessageSender; import net.kyori.adventure.text.Component; +import org.btuk.minecraft.gui.Gui; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java index f9c6f08f..841c9043 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/texteditorbooks/TextEditorBookListener.java @@ -1,13 +1,13 @@ package net.bteuk.network.utils.texteditorbooks; import lombok.Getter; -import net.bteuk.minecraft.gui.Gui; import net.bteuk.network.Network; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.TextDecoration; +import org.btuk.minecraft.gui.Gui; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.event.EventHandler; diff --git a/jitpack.yml b/jitpack.yml index 61ce48fa..5918d79d 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -5,4 +5,4 @@ before_install: - sdk use java 21.0.5-tem - sdk install maven install: - - mvn install -Dmaven.javadoc.skip=true -DskipTests \ No newline at end of file + - mvn install -Dmaven.javadoc.skip=true -DskipTests -pl :api -am \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6457ec20..50ed5d69 100644 --- a/pom.xml +++ b/pom.xml @@ -21,10 +21,13 @@ 21 ${java-version} + UTF-8 + UTF-8 + 1.21.8-R0.1-SNAPSHOT 9acb823f8d - 5958727df9 + main-36b0421e66-1 24c3fc82f5 1.18.34 @@ -82,7 +85,7 @@ - com.github.BTEUK.BTEUKLib + com.github.BuildtheUK.BTUKLib Minecraft ${bteuk.lib.version} From 9569bd79f94726eecbea34a1edbfcd7ff1e16c47 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 3 Mar 2026 19:13:20 +0100 Subject: [PATCH 79/96] Update jitpack to include papercore. --- jitpack.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/jitpack.yml b/jitpack.yml index 5918d79d..f1363329 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,8 +1,4 @@ jdk: - openjdk21 -before_install: - - sdk install java 21.0.5-tem - - sdk use java 21.0.5-tem - - sdk install maven install: - - mvn install -Dmaven.javadoc.skip=true -DskipTests -pl :api -am \ No newline at end of file + - mvn install -Dmaven.javadoc.skip=true -DskipTests -pl :api,:papercore -am \ No newline at end of file From 6e05eb3d9c435080f7926cf679f0c4217d043613 Mon Sep 17 00:00:00 2001 From: LM-Wolfert Date: Tue, 3 Mar 2026 22:44:57 +0100 Subject: [PATCH 80/96] Fix database query in plot api. --- .../src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java | 4 ++-- .../src/main/java/net/bteuk/network/utils/SwitchServer.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java index c85d7ed7..12bc193a 100644 --- a/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java +++ b/Plugin/src/main/java/net/bteuk/network/api/impl/PlotAPIImpl.java @@ -486,7 +486,7 @@ public ReviewSelection getVerificationSelectionOld(int verificationId, ReviewCat @Override public int getVerificationBookIdOld(int verificationId, ReviewCategory category) { - return plotSQL.getInt("SELECT book_id_old FROM plot_category_feedback WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + return plotSQL.getInt("SELECT book_id_old FROM plot_verification_category WHERE verification_id=" + verificationId + " AND category='" + category + "';"); } @Override @@ -505,7 +505,7 @@ public ReviewSelection getVerificationSelectionNew(int verificationId, ReviewCat @Override public int getVerificationBookIdNew(int verificationId, ReviewCategory category) { - return plotSQL.getInt("SELECT book_id_new FROM plot_category_feedback WHERE verification_id=" + verificationId + " AND category='" + category + "';"); + return plotSQL.getInt("SELECT book_id_new FROM plot_verification_category WHERE verification_id=" + verificationId + " AND category='" + category + "';"); } @Override diff --git a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java index 756c7703..b837ad87 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/SwitchServer.java @@ -37,8 +37,9 @@ public SwitchServer(Network instance, Constants constants, MessageSender message */ public void switchServer(NetworkPlayer player, String server) { - if (constants.standalone()) + if (constants.standalone()) { return; + } Optional user = instance.getNetworkUserByUuid(player.getUuidAsString()); From 9b5a723e80ca67c48e78471f68b07055bfecdbe3 Mon Sep 17 00:00:00 2001 From: George112n Date: Mon, 9 Mar 2026 00:21:16 +0000 Subject: [PATCH 81/96] #38 Added Survey feature --- .../net/bteuk/network/core/Constants.java | 5 +- .../main/java/net/bteuk/network/Network.java | 5 + .../net/bteuk/network/commands/Navigator.java | 2 +- .../net/bteuk/network/commands/Survey.java | 94 +++++++ .../net/bteuk/network/gui/NavigatorGui.java | 10 +- .../java/net/bteuk/network/sql/GlobalSQL.java | 79 +++++- .../java/net/bteuk/network/survey/Survey.java | 75 ++++++ .../net/bteuk/network/survey/SurveyBook.java | 251 ++++++++++++++++++ .../bteuk/network/utils/NetworkConfig.java | 9 +- Plugin/src/main/resources/config.yml | 5 +- 10 files changed, 523 insertions(+), 12 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/commands/Survey.java create mode 100644 Plugin/src/main/java/net/bteuk/network/survey/Survey.java create mode 100644 Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java diff --git a/Core/src/main/java/net/bteuk/network/core/Constants.java b/Core/src/main/java/net/bteuk/network/core/Constants.java index b55864c1..d3f773bf 100644 --- a/Core/src/main/java/net/bteuk/network/core/Constants.java +++ b/Core/src/main/java/net/bteuk/network/core/Constants.java @@ -7,9 +7,10 @@ public record Constants(String serverName, ServerType serverType, boolean standalone, boolean regionsEnabled, long regionInactivity, boolean tpllEnabled, boolean tpllRequiresPermission, int maxY, int minY, String earthWorld, boolean staffChat, boolean tips, boolean tutorials, boolean ll, boolean progressMap, boolean progression, boolean announceOveralLevelUps, boolean announceSeasonLevelUps, boolean sidebarEnabled, String sidebarTitle, - List sidebarContent, boolean motdEnabled, String motdContent, String minrankGeneration, String minrankRegionClaim, String minrankZoneJoin, boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, + List sidebarContent, boolean motdEnabled, String motdContent, String minrankGeneration, String minrankRegionClaim, String minrankZoneJoin, + boolean plotSystemEnabled, boolean moderationEnabled, boolean warpsEnabled, boolean homesEnabled, boolean announcePromotions, String discordLink, boolean skullsEnabled, String progressMapLink, String chatSocketOutputIP, int chatSocketOutputPort, int chatSocketInputPort, int tipsFrequency, boolean regionStaffRequestAlways, int regionStaffRequestRadius, int progressMapID, String mapHubAPIKey, int navigationRadius, boolean compulsoryTutorial, int afkTime, boolean mapEnabled, String mapServer, NetworkLocation mapLocation, - NetworkLocation spawnLocation) { + NetworkLocation spawnLocation, boolean UKSurvey) { } \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index 7bbf04e0..d9a7bad4 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -38,6 +38,7 @@ import net.bteuk.network.commands.Reply; import net.bteuk.network.commands.Rules; import net.bteuk.network.commands.Speed; +import net.bteuk.network.commands.Survey; import net.bteuk.network.commands.TipsToggle; import net.bteuk.network.commands.Where; import net.bteuk.network.commands.Zone; @@ -418,6 +419,10 @@ public void enablePlugin() { commandManager.registerCommand(new Homes(this)); } + if (constants.UKSurvey()) { + commandManager.registerCommand(new Survey(this, globalSQL)); + } + /* * Utility commands. */ diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index ab68e5ce..d6f1893d 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -51,7 +51,7 @@ public Navigator(Network instance, GuiManager guiManager, Constants constants, G this.provider = new GuiProvider(instance, guiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventAPI, serverAPI, nightvision, this, roles, tutorialsDBConnection, chatAPI, moderation); - this.navigator = new NavigatorGui(provider); + this.navigator = new NavigatorGui(provider, instance); } public void openNavigator(NetworkUser u) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java new file mode 100644 index 00000000..a883b5df --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -0,0 +1,94 @@ +package net.bteuk.network.commands; + +import io.papermc.paper.command.brigadier.CommandSourceStack; +import lombok.extern.java.Log; +import net.bteuk.network.CustomChat; +import net.bteuk.network.Network; +import net.bteuk.network.core.Time; +import net.bteuk.network.lib.dto.UserUpdate; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.socket.MessageSender; +import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.survey.SurveyBook; +import net.bteuk.network.utils.NetworkUser; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; + +@Log +public class Survey extends AbstractCommand { + + private final Network instance; + private final GlobalSQL globalSQL; + + public Survey(Network instance, GlobalSQL globalSQL) { + this.instance = instance; + this.globalSQL = globalSQL; + } + + @Override + public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) { + + // Check if the sender is a player. + Player player = getPlayer(stack); + if (player == null) { + return; + } + + NetworkUser user = instance.getUser(player); + + // If u is null, cancel. + if (user == null) { + log.severe("User " + player.getName() + " can not be found!"); + player.sendMessage(ChatUtils.error("User can not be found, please relog!")); + return; + } + + if (args.length == 0) { + SurveyBook.openSurvey(instance, user, globalSQL); + } else if (args.length == 1) { + if (args[0].equalsIgnoreCase("save")) { + SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); + if (surveyBook != null) { + surveyBook.saveSurvey(); + surveyBook.unregister(); + } + } + } else if (args.length == 2) { + SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); + if (surveyBook == null) + return; + + SurveyBook.AnswerOption answerOption = SurveyBook.AnswerOption.valueOf(args[0].toUpperCase()); + boolean bYes = args[1].equals("Y"); + switch (answerOption) { + case Q1_BTUK -> surveyBook.getSurvey().setBFoundViaBTUK(bYes); + case Q1_BTE -> surveyBook.getSurvey().setBFoundViaBTE(bYes); + case Q1_BTUKExternal -> surveyBook.getSurvey().setBFoundViaBTUKExternal(bYes); + case Q1_BTEExternal -> surveyBook.getSurvey().setBFoundViaBTEExternal(bYes); + case Q1_Friend -> surveyBook.getSurvey().setBFoundViaFriend(bYes); + case Q2_TikTok -> surveyBook.getSurvey().setBMediumTiktok(bYes); + case Q2_YTShort -> surveyBook.getSurvey().setBMediumYoutubeShorts(bYes); + case Q2_YTLong -> surveyBook.getSurvey().setBMediumYoutubeLongform(bYes); + case Q2_Instagram -> surveyBook.getSurvey().setBMediumInstagram(bYes); + case Q2_Search -> surveyBook.getSurvey().setBSearchEngineBrowsing(bYes); + case Q2_OnlineNews -> surveyBook.getSurvey().setBOnlineNews(bYes); + case Q2_TVNews -> surveyBook.getSurvey().setBTVNews(bYes); + case Q2_Newspaper -> surveyBook.getSurvey().setBPhysicalNewspaper(bYes); + case Q3_TikTok -> surveyBook.getSurvey().setBSocialsTiktok(bYes); + case Q3_YouTube -> surveyBook.getSurvey().setBSocialsYoutubeShorts(bYes); + case Q3_Instagram -> surveyBook.getSurvey().setBSocialsInstagram(bYes); + } + } + } + + @Override + public String getLabel() { + return "survey"; + } + + @Override + public String getDescription() { + return "Complete the UK Survey"; + } +} diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 48f5cbc1..6c659705 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -1,5 +1,6 @@ package net.bteuk.network.gui; +import net.bteuk.network.Network; import net.bteuk.network.api.EventAPI; import net.bteuk.network.api.ServerAPI; import net.bteuk.network.api.entity.NetworkLocation; @@ -14,6 +15,7 @@ import net.bteuk.network.papercore.LocationAdapter; import net.bteuk.network.papercore.PlayerAdapter; import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.survey.SurveyBook; import net.bteuk.network.utils.LightsOut; import net.bteuk.network.utils.NetworkUser; import net.bteuk.network.utils.Utils; @@ -25,7 +27,7 @@ public class NavigatorGui extends NetworkGui { - public NavigatorGui(GuiProvider provider) { + public NavigatorGui(GuiProvider provider, Network network) { super(provider, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); Constants constants = provider.constants(); @@ -104,6 +106,12 @@ public NavigatorGui(GuiProvider provider) { Utils.line("You can also use the command ").append(Component.text("/nightvision", NamedTextColor.GRAY)).append(Utils.line(" or ")) .append(Component.text("/nv", NamedTextColor.GRAY))), nightvision::toggleNightvision); + // Survey + if (constants.UKSurvey()) + setItem(18, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("UK Survey"), Utils.line("Assist us with our PR analysis.")), (NetworkUser u) -> { + SurveyBook.openSurvey(network, u, globalSQL); + }); + setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), (NetworkUser u) -> { if (u.lightsOut == null) { diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 29e6c216..448cd984 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -7,6 +7,7 @@ import net.bteuk.network.core.Time; import net.bteuk.network.core.sql.AbstractSQL; import net.bteuk.network.lib.dto.DirectMessage; +import net.bteuk.network.survey.Survey; import net.bteuk.network.utils.Coordinate; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; @@ -18,8 +19,12 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.sql.Timestamp; +import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.UUID; +import java.util.logging.Level; @Log public class GlobalSQL extends AbstractSQL { @@ -294,8 +299,7 @@ public boolean createUser(String uuid, String name, String playerSkin) { int iPlayerThere = getInt("SELECT count(1) FROM player_data WHERE uuid='" + uuid + "'"); - if (iPlayerThere == 0) - { + if (iPlayerThere == 0) { try ( Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( @@ -315,8 +319,75 @@ public boolean createUser(String uuid, String name, String playerSkin) { e.printStackTrace(); return false; } - } - else + } else return true; } + + public Survey getSurveyOfUser(UUID uuid) { + Survey survey; + try ( + Connection conn = conn(); + PreparedStatement statement = conn.prepareStatement( + "SELECT survey_completed_at, survey_last_edited, found_via_btuk, found_via_bte, found_via_btuk_external, found_via_bte_external,found_via_friend," + + "medium_tiktok, medium_youtube_shorts, medium_youtube_longform, medium_instagram," + + "medium_search_engine_browsing, medium_online_news, medium_tvnews, medium_physical_newspaper," + + "socials_tiktok, socials_youtube_shorts, socials_youtube_longform, socials_instagram FROM survey WHERE player=?;" + ) + ) { + statement.setString(1, uuid.toString()); + ResultSet results = statement.executeQuery(); + + if (results.next()) { + survey = new Survey(results.getTimestamp(1), results.getTimestamp(2), + results.getBoolean(3), results.getBoolean(4), results.getBoolean(5), results.getBoolean(6), results.getBoolean(7), + results.getBoolean(8), results.getBoolean(9), results.getBoolean(10), results.getBoolean(11), + results.getBoolean(12), results.getBoolean(13), results.getBoolean(14), results.getBoolean(15), + results.getBoolean(16), results.getBoolean(17), results.getBoolean(18), results.getBoolean(19)); + return survey; + } else + return null; + + } catch (SQLException e) { + log.log(Level.SEVERE, e.getMessage(), e); + return null; + } + } + + public void saveSurveyOfUser(UUID user, Survey survey) { + try ( + Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( + "UPDATE survey SET survey_completed_at = ifnull(survey_completed_at, NOW()), survey_last_edited=NOW(), found_via_btuk=?, found_via_bte=?, " + + "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + + "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + + "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + + "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? FROM survey WHERE player=?;") + ) { + statement.setTimestamp(1, Timestamp.from(Instant.now())); + statement.setBoolean(2, survey.isBFoundViaBTUK()); + statement.setBoolean(3, survey.isBFoundViaBTE()); + statement.setBoolean(4, survey.isBFoundViaBTUKExternal()); + statement.setBoolean(5, survey.isBFoundViaBTEExternal()); + statement.setBoolean(6, survey.isBFoundViaFriend()); + + statement.setBoolean(7, survey.isBMediumTiktok()); + statement.setBoolean(8, survey.isBMediumYoutubeShorts()); + statement.setBoolean(9, survey.isBMediumYoutubeLongform()); + statement.setBoolean(10, survey.isBMediumInstagram()); + statement.setBoolean(11, survey.isBSearchEngineBrowsing()); + statement.setBoolean(12, survey.isBOnlineNews()); + statement.setBoolean(13, survey.isBTVNews()); + statement.setBoolean(14, survey.isBPhysicalNewspaper()); + + statement.setBoolean(15, survey.isBSocialsTiktok()); + statement.setBoolean(16, survey.isBSocialsYoutubeShorts()); + statement.setBoolean(17, survey.isBSocialsYoutubeLongform()); + statement.setBoolean(18, survey.isBSocialsInstagram()); + + statement.setString(19, user.toString()); + + statement.executeUpdate(); + } catch (SQLException sql) { + log.log(Level.SEVERE, sql.getMessage(), sql); + } + } } diff --git a/Plugin/src/main/java/net/bteuk/network/survey/Survey.java b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java new file mode 100644 index 00000000..14b7cbd2 --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java @@ -0,0 +1,75 @@ +package net.bteuk.network.survey; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.sql.Timestamp; + +/** + * Stores survey answers + */ +@AllArgsConstructor +@NoArgsConstructor +public class Survey { + @Getter + @Setter + Timestamp SurveyCompleted; + @Getter + @Setter + Timestamp SurveyLastEdited; + @Getter + @Setter + boolean bFoundViaBTUK; + @Getter + @Setter + boolean bFoundViaBTE; + @Getter + @Setter + boolean bFoundViaBTUKExternal; + @Getter + @Setter + boolean bFoundViaBTEExternal; + @Getter + @Setter + boolean bFoundViaFriend; + + @Getter + @Setter + boolean bMediumTiktok; + @Getter + @Setter + boolean bMediumYoutubeShorts; + @Getter + @Setter + boolean bMediumYoutubeLongform; + @Getter + @Setter + boolean bMediumInstagram; + @Getter + @Setter + boolean bSearchEngineBrowsing; + @Getter + @Setter + boolean bOnlineNews; + @Getter + @Setter + boolean bTVNews; + @Getter + @Setter + boolean bPhysicalNewspaper; + + @Getter + @Setter + boolean bSocialsTiktok; + @Getter + @Setter + boolean bSocialsYoutubeShorts; + @Getter + @Setter + boolean bSocialsYoutubeLongform; + @Getter + @Setter + boolean bSocialsInstagram; +} diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java new file mode 100644 index 00000000..c9daf00c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -0,0 +1,251 @@ +package net.bteuk.network.survey; + +import lombok.Getter; +import net.bteuk.network.Network; +import net.bteuk.network.lib.utils.ChatUtils; +import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.utils.NetworkUser; +import net.bteuk.network.utils.Utils; +import net.kyori.adventure.inventory.Book; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + +import java.util.HashMap; +import java.util.Objects; +import java.util.UUID; + +public class SurveyBook implements Listener { + private final Network network; + private final NetworkUser user; + private final GlobalSQL globalSQL; + @Getter + private final Survey survey; + // private final ItemStack bookItem; + // private final UUID bookUuid; + private Book book; + + private static final HashMap openSurveys = new HashMap<>(); + + public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { + this.network = network; + this.user = user; + this.globalSQL = globalSQL; + + // Get survey details + Survey existingSurvey = globalSQL.getSurveyOfUser(user.player.getUniqueId()); + this.survey = (existingSurvey == null) ? new Survey() : existingSurvey; + + // Update survey with answers + updateSurveyBook(); + + // //Create book item + // this.bookUuid = UUID.randomUUID(); + // bookItem = new ItemStack(Material.WRITTEN_BOOK); + // BookMeta bookItemMeta = (BookMeta) bookItem; + // bookItemMeta.setAuthor(bookUuid.toString()); + // bookItem.setItemMeta(bookItemMeta); + // + // Utils.giveItem(network, user.player, bookItem, "UK Survey"); + Bukkit.getServer().getPluginManager().registerEvents(this, network); + openSurveys.put(user, this); + } + + /** + * Opens a survey for a user + * + * @param network + * @param user + * @param globalSQL + */ + public static void openSurvey(Network network, NetworkUser user, GlobalSQL globalSQL) { + SurveyBook openSurvey = SurveyBook.getOpenSurvey(user); + if (openSurvey == null) + openSurvey = new SurveyBook(network, user, globalSQL); + openSurvey.open(); + } + + /** + * Open the review book. + */ + private void open() { + user.player.openBook(book); + } + + public void unregister() { + openSurveys.remove(user); + HandlerList.unregisterAll(this); + user.player.teleport(user.player.getLocation().add(0.0001, 0, 0)); + } + + /** + * @param user The user whom to get the open survey of. + * @return The open survey of the given user, or null if the user has no open survey. + */ + public static SurveyBook getOpenSurvey(NetworkUser user) { + return openSurveys.get(user); + } + + /** + * Update book based on survey responses + */ + private void updateSurveyBook() { + + // Page 1 - Which outlet + Component page1 = Component.empty(); + // Question 1 + page1 = page1.append(Component.text("Question 1").decorate(TextDecoration.BOLD)); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = page1.append(Component.text("Prior to joining the server, who did you find out about BTUK (Formerly BTE UK) from?")); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = page1.append(Component.text("Answer on next page !")); + + // Page 2 Question 1 answers + Component page2 = Component.empty(); + page2 = appendOptionYesNo("Build the UK", page2, AnswerOption.Q1_BTUK, survey.bFoundViaBTUK, !survey.bFoundViaBTUK); + page2 = page2.appendNewline(); // Extra line + page2 = appendOptionYesNo("Build The Earth", page2, AnswerOption.Q1_BTE, survey.bFoundViaBTE, !survey.bFoundViaBTE); + page2 = page2.appendNewline(); // Extra line + page2 = appendOptionYesNo("External Media Mentioning Build the UK", page2, AnswerOption.Q1_BTUKExternal, survey.bFoundViaBTUKExternal, !survey.bFoundViaBTUKExternal); + page2 = page2.appendNewline(); // Extra line + page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, AnswerOption.Q1_BTEExternal, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); + page2 = page2.appendNewline(); // Extra line + page2 = appendOptionYesNo("From a Friend", page2, AnswerOption.Q1_Friend, survey.bFoundViaFriend, !survey.bFoundViaFriend); + page2 = page2.appendNewline(); // Extra line + + // Page 3 Question 2 - Which medium + Component page3 = Component.empty(); + // Question 2 + page3 = page3.append(Component.text("Question 2").decorate(TextDecoration.BOLD)); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = page3.append(Component.text("Prior to joining, through which mediums did you hear about Build the UK or Build The Earth?")); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = page3.append(Component.text("Answer on next page !")); + + // Page 4 Question 2 answers + Component page4 = Component.empty(); + page4 = appendOptionYesNo("TikTok", page4, AnswerOption.Q2_TikTok, survey.bMediumTiktok, !survey.bMediumTiktok); + page4 = appendOptionYesNo("YouTube Short", page4, AnswerOption.Q2_YTShort, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); + page4 = appendOptionYesNo("YouTube Longform", page4, AnswerOption.Q2_YTLong, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); + page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_Instagram, survey.bMediumInstagram, !survey.bMediumInstagram); + page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, AnswerOption.Q2_Search, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); + page4 = appendOptionYesNo("Online News", page4, AnswerOption.Q2_OnlineNews, survey.bOnlineNews, !survey.bOnlineNews); + page4 = appendOptionYesNo("TV News", page4, AnswerOption.Q2_TVNews, survey.bTVNews, !survey.bTVNews); + page4 = appendOptionYesNo("Physical Newspaper", page4, AnswerOption.Q2_Newspaper, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); + + // Page 5 Question 3 Which socials + Component page5 = Component.empty(); + page5 = page5.append(Component.text("Question 3").decorate(TextDecoration.BOLD)); + page5 = page5.appendNewline(); + page5 = page5.appendNewline(); + page5 = page5.append(Component.text("What social media platforms do you use regularly?")); + page5 = page5.appendNewline(); + page5 = page5.appendNewline(); + page5 = appendOptionYesNo("TikTok", page5, AnswerOption.Q3_TikTok, survey.bSocialsTiktok, !survey.bSocialsTiktok); + page5 = appendOptionYesNo("YouTube", page5, AnswerOption.Q3_YouTube, survey.bSocialsYoutubeShorts, !survey.bSocialsYoutubeShorts); + page5 = appendOptionYesNo("Instagram", page5, AnswerOption.Q3_Instagram, survey.bSocialsInstagram, !survey.bSocialsInstagram); + page5 = page5.appendNewline(); + page5 = page5.append(Component.text("Save Survey")); + page5 = page5.appendSpace(); + page5 = page5.append(Component.text("[Save]") + .color(TextColor.color(NamedTextColor.GREEN.value())) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey save"))); + + this.book = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page1, page2, page3, page4, page5); + } + + private Component appendOptionYesNo(String optionName, Component component, AnswerOption option, boolean bBoldY, boolean bBoldN) { + component = component.append(Component.text(optionName)); + component = component.appendSpace(); + + //[Y] + component = component.append(Component.text("[")); + Component Y = Component.text("Y").color(TextColor.color(NamedTextColor.GREEN.value())) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " Y")); + if (bBoldY) + component = component.append(Y.decorate(TextDecoration.BOLD)); + else + component = component.append(Y); + component = component.append(Component.text("]")); + component = component.appendSpace(); + //[N] + component = component.append(Component.text("[")); + Component N = Component.text("N").color(TextColor.color(NamedTextColor.RED.value())) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " N")); + if (bBoldN) + component = component.append(N.decorate(TextDecoration.BOLD)); + else + component = component.append(N); + component = component.append(Component.text("]")); + + component = component.appendNewline(); + return component; + } + + public void saveSurvey() { + globalSQL.saveSurveyOfUser(user.player.getUniqueId(), survey); + } + + public enum AnswerOption { + Q1_BTUK, + Q1_BTE, + Q1_BTUKExternal, + Q1_BTEExternal, + Q1_Friend, + Q2_TikTok, + Q2_YTShort, + Q2_YTLong, + Q2_Instagram, + Q2_Search, + Q2_OnlineNews, + Q2_TVNews, + Q2_Newspaper, + Q3_TikTok, + Q3_YouTube, + Q3_Instagram + } + + // @EventHandler + // public void interactEvent(PlayerInteractEvent event) { + // if (!event.getPlayer().getUniqueId().equals(user.player.getUniqueId())) + // return; + // if (event.getItem().getItemMeta() == null) + // return; + // if (event.getItem().getItemMeta() instanceof BookMeta bookMeta) { + // if (bookMeta.getAuthor().equals(this.bookUuid.toString())) { + // this.open(); + // event.setCancelled(true); + // } + // } + // } + // + // @EventHandler + // public void inventoryClickEvent(InventoryClickEvent event) { + // if (!event.getWhoClicked().getUniqueId().equals(user.player.getUniqueId())) + // return; + // if (Objects.requireNonNull(event.getCurrentItem()).getItemMeta() == null) + // return; + // if (event.getCurrentItem().getItemMeta() instanceof BookMeta bookMeta) { + // if (bookMeta.getAuthor().equals(this.bookUuid.toString())) { + // this.open(); + // event.setCancelled(true); + // } + // } + // } + +} diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 0383e013..950906be 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -43,7 +43,7 @@ private String configVersion() { private String latestVersion() { String version = Objects.requireNonNull(config.getDefaults()).getString("version"); // If null return default. - return Objects.requireNonNullElse(version, "1.8.0"); + return Objects.requireNonNullElse(version, "1.9.0"); } // Update config if the version is outdated. @@ -202,11 +202,14 @@ public net.bteuk.network.core.Constants getConstants() { NetworkLocation spawnLocation = new NetworkLocation(config.getString("spawn.world"), config.getDouble("spawn.x"), config.getDouble("spawn.y"), config.getDouble("spawn.z"), (float) config.getDouble("spawn.yaw"), (float) config.getDouble("spawn.pitch")); + boolean UKSurvey = config.getBoolean("UKSurvey_enabled"); + log.info("Loaded constants from config."); return new Constants(serverName, serverType, standalone, regionsEnabled, regionInactivity, tpllEnabled, tpllRequiredPermission, maxY, minY, earthWorld, staffChat, tips, tutorials, llEnabled, progressMap, progression, announceOverallLevelUps, announceSeasonalLevelUps, sidebarEnabled, sidebarTitle, sidebarTextList, motdEnabled, - motdText, minrankGeneration, minrankRegionClaim, minrankZoneJoin, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, skullsEnabled, progressMapLink, chatSocketOutputIP, + motdText, minrankGeneration, minrankRegionClaim, minrankZoneJoin, plotSystemEnabled, moderationEnabled, warpsEnabled, homesEnabled, announcePromotions, discordLink, + skullsEnabled, progressMapLink, chatSocketOutputIP, chatSocketOutputPort, chatSocketInputPort, tipsFrequency, regionStaffRequestAlways, regionStaffRequestRadius, progressMapID, mapHubAPIKey, navigationRadius, - compulsoryTutorial, afkTime, mapEnabled, mapServer, mapLocation, spawnLocation); + compulsoryTutorial, afkTime, mapEnabled, mapServer, mapLocation, spawnLocation, UKSurvey); } } \ No newline at end of file diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 73a9e1d4..68d47c75 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -176,4 +176,7 @@ skulls_plugin_enabled: true minrank_generation: Jr.Builder minrank_regionclaim: Jr.Builder minrank_zonejoin: Jr.Builder -minrank_publicjoin: Jr.Builder \ No newline at end of file +minrank_publicjoin: Jr.Builder + +# Whether the UK Survey is enabled +UKSurvey_enabled: false \ No newline at end of file From c70c800c487d4e5db02ed6fcb0ecce9e023d4e99 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 11:52:51 +0000 Subject: [PATCH 82/96] Add DB insert pathway mechanism for new surveys --- .../java/net/bteuk/network/sql/GlobalSQL.java | 20 ++++++++++++++----- .../java/net/bteuk/network/survey/Survey.java | 3 +++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 448cd984..02453308 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -338,7 +338,7 @@ public Survey getSurveyOfUser(UUID uuid) { ResultSet results = statement.executeQuery(); if (results.next()) { - survey = new Survey(results.getTimestamp(1), results.getTimestamp(2), + survey = new Survey(true, results.getTimestamp(1), results.getTimestamp(2), results.getBoolean(3), results.getBoolean(4), results.getBoolean(5), results.getBoolean(6), results.getBoolean(7), results.getBoolean(8), results.getBoolean(9), results.getBoolean(10), results.getBoolean(11), results.getBoolean(12), results.getBoolean(13), results.getBoolean(14), results.getBoolean(15), @@ -355,13 +355,21 @@ public Survey getSurveyOfUser(UUID uuid) { public void saveSurveyOfUser(UUID user, Survey survey) { try ( - Connection conn = conn(); PreparedStatement statement = conn.prepareStatement( - "UPDATE survey SET survey_completed_at = ifnull(survey_completed_at, NOW()), survey_last_edited=NOW(), found_via_btuk=?, found_via_bte=?, " + + Connection conn = conn(); + PreparedStatement statement = (survey.isExisting()) ? + conn.prepareStatement("UPDATE survey SET survey_completed_at = ifnull(survey_completed_at, NOW()), survey_last_edited=?, found_via_btuk=?, found_via_bte=?, " + "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? FROM survey WHERE player=?;") - ) { + : + conn.prepareStatement("INSERT INTO survey (survey_completed_at, survey_last_edited, found_via_btuk, found_via_bte, " + + "found_via_btuk_external, found_via_bte_external, found_via_friend, " + + "medium_tiktok, medium_youtube_shorts, medium_youtube_longform, medium_instagram, " + + "medium_search_engine_browsing, medium_online_news, medium_tvnews, medium_physical_newspaper, " + + "socials_tiktok, socials_youtube_shorts, socials_youtube_longform, socials_instagram, player" + + "VALUES (NOW()), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);") + ) { statement.setTimestamp(1, Timestamp.from(Instant.now())); statement.setBoolean(2, survey.isBFoundViaBTUK()); statement.setBoolean(3, survey.isBFoundViaBTE()); @@ -385,7 +393,9 @@ public void saveSurveyOfUser(UUID user, Survey survey) { statement.setString(19, user.toString()); - statement.executeUpdate(); + if (statement.executeUpdate() == 1) + survey.setExisting(true); + } catch (SQLException sql) { log.log(Level.SEVERE, sql.getMessage(), sql); } diff --git a/Plugin/src/main/java/net/bteuk/network/survey/Survey.java b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java index 14b7cbd2..6009b831 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java @@ -13,6 +13,9 @@ @AllArgsConstructor @NoArgsConstructor public class Survey { + @Getter @Setter + boolean isExisting; + @Getter @Setter Timestamp SurveyCompleted; From f82895ed2d12ce62121539776fadb1bc748e619c Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 11:53:54 +0000 Subject: [PATCH 83/96] Update plugin version to 1.10.0 --- Core/pom.xml | 2 +- Network-API/pom.xml | 2 +- PaperCore/pom.xml | 2 +- Plugin/pom.xml | 2 +- Regions/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/pom.xml b/Core/pom.xml index e85ce41e..09d18f0b 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 net.bteuk.network diff --git a/Network-API/pom.xml b/Network-API/pom.xml index d453ebf2..7dda623d 100644 --- a/Network-API/pom.xml +++ b/Network-API/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 net.bteuk.network diff --git a/PaperCore/pom.xml b/PaperCore/pom.xml index 4857f1b6..327c5d96 100644 --- a/PaperCore/pom.xml +++ b/PaperCore/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 net.bteuk.network diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 3bd6e24b..10950c92 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 net.bteuk.network diff --git a/Regions/pom.xml b/Regions/pom.xml index 50fc9b02..539f6b42 100644 --- a/Regions/pom.xml +++ b/Regions/pom.xml @@ -6,7 +6,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 net.bteuk.network diff --git a/pom.xml b/pom.xml index 50ed5d69..031d3388 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ net.bteuk Network - 1.9.0 + 1.10.0 pom Network From 39fb2b18a2a97282a59c1cb1b7c3dca288fecab5 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 12:28:00 +0000 Subject: [PATCH 84/96] Update config version to 1.10.0 --- Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java | 2 +- Plugin/src/main/resources/config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java index 950906be..726e5e22 100644 --- a/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java +++ b/Plugin/src/main/java/net/bteuk/network/utils/NetworkConfig.java @@ -43,7 +43,7 @@ private String configVersion() { private String latestVersion() { String version = Objects.requireNonNull(config.getDefaults()).getString("version"); // If null return default. - return Objects.requireNonNullElse(version, "1.9.0"); + return Objects.requireNonNullElse(version, "1.10.0"); } // Update config if the version is outdated. diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml index 68d47c75..eb2351c4 100644 --- a/Plugin/src/main/resources/config.yml +++ b/Plugin/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Config version; do not update this manually as it could break the config. -version: 1.8.1 +version: 1.10.0 # MySQL is mandatory for this plugin. # Login information From 1fff228e0da8b097a4b2e264484e374ee0ef3512 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 14:40:15 +0000 Subject: [PATCH 85/96] Bug fixes and added underline to selection --- .../net/bteuk/network/commands/Survey.java | 31 ++++---- .../java/net/bteuk/network/sql/GlobalSQL.java | 2 +- .../net/bteuk/network/survey/SurveyBook.java | 72 ++++++++++--------- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index a883b5df..4fb5054a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -64,21 +64,24 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) switch (answerOption) { case Q1_BTUK -> surveyBook.getSurvey().setBFoundViaBTUK(bYes); case Q1_BTE -> surveyBook.getSurvey().setBFoundViaBTE(bYes); - case Q1_BTUKExternal -> surveyBook.getSurvey().setBFoundViaBTUKExternal(bYes); - case Q1_BTEExternal -> surveyBook.getSurvey().setBFoundViaBTEExternal(bYes); - case Q1_Friend -> surveyBook.getSurvey().setBFoundViaFriend(bYes); - case Q2_TikTok -> surveyBook.getSurvey().setBMediumTiktok(bYes); - case Q2_YTShort -> surveyBook.getSurvey().setBMediumYoutubeShorts(bYes); - case Q2_YTLong -> surveyBook.getSurvey().setBMediumYoutubeLongform(bYes); - case Q2_Instagram -> surveyBook.getSurvey().setBMediumInstagram(bYes); - case Q2_Search -> surveyBook.getSurvey().setBSearchEngineBrowsing(bYes); - case Q2_OnlineNews -> surveyBook.getSurvey().setBOnlineNews(bYes); - case Q2_TVNews -> surveyBook.getSurvey().setBTVNews(bYes); - case Q2_Newspaper -> surveyBook.getSurvey().setBPhysicalNewspaper(bYes); - case Q3_TikTok -> surveyBook.getSurvey().setBSocialsTiktok(bYes); - case Q3_YouTube -> surveyBook.getSurvey().setBSocialsYoutubeShorts(bYes); - case Q3_Instagram -> surveyBook.getSurvey().setBSocialsInstagram(bYes); + case Q1_BTUK_EXTERNAL -> surveyBook.getSurvey().setBFoundViaBTUKExternal(bYes); + case Q1_BTE_EXTERNAL -> surveyBook.getSurvey().setBFoundViaBTEExternal(bYes); + case Q1_FRIEND -> surveyBook.getSurvey().setBFoundViaFriend(bYes); + case Q2_TIKTOK -> surveyBook.getSurvey().setBMediumTiktok(bYes); + case Q2_YT_SHORT -> surveyBook.getSurvey().setBMediumYoutubeShorts(bYes); + case Q2_YT_LONG -> surveyBook.getSurvey().setBMediumYoutubeLongform(bYes); + case Q2_INSTRAGRAM -> surveyBook.getSurvey().setBMediumInstagram(bYes); + case Q2_SEARCH -> surveyBook.getSurvey().setBSearchEngineBrowsing(bYes); + case Q2_ONLINE_NEWS -> surveyBook.getSurvey().setBOnlineNews(bYes); + case Q2_TV_NEWS -> surveyBook.getSurvey().setBTVNews(bYes); + case Q2_NEWSPAPER -> surveyBook.getSurvey().setBPhysicalNewspaper(bYes); + case Q3_TIKTOK -> surveyBook.getSurvey().setBSocialsTiktok(bYes); + case Q3_YOUTUBE_SHORTS -> surveyBook.getSurvey().setBSocialsYoutubeShorts(bYes); + case Q3_YOUTUBE_LONG -> surveyBook.getSurvey().setBSocialsYoutubeLongform(bYes); + case Q3_INSTAGRAM -> surveyBook.getSurvey().setBSocialsInstagram(bYes); } + surveyBook.updateSurveyBook(); + surveyBook.open(); } } diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 02453308..30fe0103 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -357,7 +357,7 @@ public void saveSurveyOfUser(UUID user, Survey survey) { try ( Connection conn = conn(); PreparedStatement statement = (survey.isExisting()) ? - conn.prepareStatement("UPDATE survey SET survey_completed_at = ifnull(survey_completed_at, NOW()), survey_last_edited=?, found_via_btuk=?, found_via_bte=?, " + + conn.prepareStatement("UPDATE survey SET survey_last_edited=?, found_via_btuk=?, found_via_bte=?, " + "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index c9daf00c..77ef9401 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -79,7 +79,7 @@ public static void openSurvey(Network network, NetworkUser user, GlobalSQL globa /** * Open the review book. */ - private void open() { + public void open() { user.player.openBook(book); } @@ -100,7 +100,7 @@ public static SurveyBook getOpenSurvey(NetworkUser user) { /** * Update book based on survey responses */ - private void updateSurveyBook() { + public void updateSurveyBook() { // Page 1 - Which outlet Component page1 = Component.empty(); @@ -119,11 +119,11 @@ private void updateSurveyBook() { page2 = page2.appendNewline(); // Extra line page2 = appendOptionYesNo("Build The Earth", page2, AnswerOption.Q1_BTE, survey.bFoundViaBTE, !survey.bFoundViaBTE); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("External Media Mentioning Build the UK", page2, AnswerOption.Q1_BTUKExternal, survey.bFoundViaBTUKExternal, !survey.bFoundViaBTUKExternal); + page2 = appendOptionYesNo("External Media Mentioning Build the UK", page2, AnswerOption.Q1_BTUK_EXTERNAL, survey.bFoundViaBTUKExternal, !survey.bFoundViaBTUKExternal); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, AnswerOption.Q1_BTEExternal, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); + page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, AnswerOption.Q1_BTE_EXTERNAL, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("From a Friend", page2, AnswerOption.Q1_Friend, survey.bFoundViaFriend, !survey.bFoundViaFriend); + page2 = appendOptionYesNo("From a Friend", page2, AnswerOption.Q1_FRIEND, survey.bFoundViaFriend, !survey.bFoundViaFriend); page2 = page2.appendNewline(); // Extra line // Page 3 Question 2 - Which medium @@ -139,14 +139,14 @@ private void updateSurveyBook() { // Page 4 Question 2 answers Component page4 = Component.empty(); - page4 = appendOptionYesNo("TikTok", page4, AnswerOption.Q2_TikTok, survey.bMediumTiktok, !survey.bMediumTiktok); - page4 = appendOptionYesNo("YouTube Short", page4, AnswerOption.Q2_YTShort, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); - page4 = appendOptionYesNo("YouTube Longform", page4, AnswerOption.Q2_YTLong, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); - page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_Instagram, survey.bMediumInstagram, !survey.bMediumInstagram); - page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, AnswerOption.Q2_Search, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); - page4 = appendOptionYesNo("Online News", page4, AnswerOption.Q2_OnlineNews, survey.bOnlineNews, !survey.bOnlineNews); - page4 = appendOptionYesNo("TV News", page4, AnswerOption.Q2_TVNews, survey.bTVNews, !survey.bTVNews); - page4 = appendOptionYesNo("Physical Newspaper", page4, AnswerOption.Q2_Newspaper, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); + page4 = appendOptionYesNo("TikTok", page4, AnswerOption.Q2_TIKTOK, survey.bMediumTiktok, !survey.bMediumTiktok); + page4 = appendOptionYesNo("YouTube Short", page4, AnswerOption.Q2_YT_SHORT, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); + page4 = appendOptionYesNo("YouTube Longform", page4, AnswerOption.Q2_YT_LONG, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); + page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_INSTRAGRAM, survey.bMediumInstagram, !survey.bMediumInstagram); + page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, AnswerOption.Q2_SEARCH, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); + page4 = appendOptionYesNo("Online News", page4, AnswerOption.Q2_ONLINE_NEWS, survey.bOnlineNews, !survey.bOnlineNews); + page4 = appendOptionYesNo("TV News", page4, AnswerOption.Q2_TV_NEWS, survey.bTVNews, !survey.bTVNews); + page4 = appendOptionYesNo("Physical Newspaper", page4, AnswerOption.Q2_NEWSPAPER, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); // Page 5 Question 3 Which socials Component page5 = Component.empty(); @@ -156,9 +156,10 @@ private void updateSurveyBook() { page5 = page5.append(Component.text("What social media platforms do you use regularly?")); page5 = page5.appendNewline(); page5 = page5.appendNewline(); - page5 = appendOptionYesNo("TikTok", page5, AnswerOption.Q3_TikTok, survey.bSocialsTiktok, !survey.bSocialsTiktok); - page5 = appendOptionYesNo("YouTube", page5, AnswerOption.Q3_YouTube, survey.bSocialsYoutubeShorts, !survey.bSocialsYoutubeShorts); - page5 = appendOptionYesNo("Instagram", page5, AnswerOption.Q3_Instagram, survey.bSocialsInstagram, !survey.bSocialsInstagram); + page5 = appendOptionYesNo("TikTok", page5, AnswerOption.Q3_TIKTOK, survey.bSocialsTiktok, !survey.bSocialsTiktok); + page5 = appendOptionYesNo("YouTube Shorts", page5, AnswerOption.Q3_YOUTUBE_SHORTS, survey.bSocialsYoutubeShorts, !survey.bSocialsYoutubeShorts); + page5 = appendOptionYesNo("YouTube Longform", page5, AnswerOption.Q3_YOUTUBE_LONG, survey.bSocialsYoutubeLongform, !survey.bSocialsYoutubeLongform); + page5 = appendOptionYesNo("Instagram", page5, AnswerOption.Q3_INSTAGRAM, survey.bSocialsInstagram, !survey.bSocialsInstagram); page5 = page5.appendNewline(); page5 = page5.append(Component.text("Save Survey")); page5 = page5.appendSpace(); @@ -169,7 +170,7 @@ private void updateSurveyBook() { this.book = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page1, page2, page3, page4, page5); } - private Component appendOptionYesNo(String optionName, Component component, AnswerOption option, boolean bBoldY, boolean bBoldN) { + private Component appendOptionYesNo(String optionName, Component component, AnswerOption option, boolean bYSelected, boolean bNSelected) { component = component.append(Component.text(optionName)); component = component.appendSpace(); @@ -177,8 +178,8 @@ private Component appendOptionYesNo(String optionName, Component component, Answ component = component.append(Component.text("[")); Component Y = Component.text("Y").color(TextColor.color(NamedTextColor.GREEN.value())) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " Y")); - if (bBoldY) - component = component.append(Y.decorate(TextDecoration.BOLD)); + if (bYSelected) + component = component.append(Y.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED)); else component = component.append(Y); component = component.append(Component.text("]")); @@ -187,8 +188,8 @@ private Component appendOptionYesNo(String optionName, Component component, Answ component = component.append(Component.text("[")); Component N = Component.text("N").color(TextColor.color(NamedTextColor.RED.value())) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " N")); - if (bBoldN) - component = component.append(N.decorate(TextDecoration.BOLD)); + if (bNSelected) + component = component.append(N.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED)); else component = component.append(N); component = component.append(Component.text("]")); @@ -204,20 +205,21 @@ public void saveSurvey() { public enum AnswerOption { Q1_BTUK, Q1_BTE, - Q1_BTUKExternal, - Q1_BTEExternal, - Q1_Friend, - Q2_TikTok, - Q2_YTShort, - Q2_YTLong, - Q2_Instagram, - Q2_Search, - Q2_OnlineNews, - Q2_TVNews, - Q2_Newspaper, - Q3_TikTok, - Q3_YouTube, - Q3_Instagram + Q1_BTUK_EXTERNAL, + Q1_BTE_EXTERNAL, + Q1_FRIEND, + Q2_TIKTOK, + Q2_YT_SHORT, + Q2_YT_LONG, + Q2_INSTRAGRAM, + Q2_SEARCH, + Q2_ONLINE_NEWS, + Q2_TV_NEWS, + Q2_NEWSPAPER, + Q3_TIKTOK, + Q3_YOUTUBE_SHORTS, + Q3_YOUTUBE_LONG, + Q3_INSTAGRAM } // @EventHandler From f98f350ca6c56dd9e03a765d16f22b115ae3eba7 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 15:17:36 +0000 Subject: [PATCH 86/96] SQL bug fixes --- Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 30fe0103..2854fd67 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -361,14 +361,14 @@ public void saveSurveyOfUser(UUID user, Survey survey) { "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + - "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? FROM survey WHERE player=?;") + "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? WHERE player=?;") : conn.prepareStatement("INSERT INTO survey (survey_completed_at, survey_last_edited, found_via_btuk, found_via_bte, " + "found_via_btuk_external, found_via_bte_external, found_via_friend, " + "medium_tiktok, medium_youtube_shorts, medium_youtube_longform, medium_instagram, " + "medium_search_engine_browsing, medium_online_news, medium_tvnews, medium_physical_newspaper, " + - "socials_tiktok, socials_youtube_shorts, socials_youtube_longform, socials_instagram, player" + - "VALUES (NOW()), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);") + "socials_tiktok, socials_youtube_shorts, socials_youtube_longform, socials_instagram, player)" + + "VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);") ) { statement.setTimestamp(1, Timestamp.from(Instant.now())); statement.setBoolean(2, survey.isBFoundViaBTUK()); From 9d6aa09bd547a32ee021a4a35ded5c892e04bf34 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 15:18:36 +0000 Subject: [PATCH 87/96] Remove unneeded components --- .../net/bteuk/network/survey/SurveyBook.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index 77ef9401..ea59d431 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -13,33 +13,21 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BookMeta; import java.util.HashMap; -import java.util.Objects; -import java.util.UUID; public class SurveyBook implements Listener { - private final Network network; private final NetworkUser user; private final GlobalSQL globalSQL; @Getter private final Survey survey; - // private final ItemStack bookItem; - // private final UUID bookUuid; private Book book; private static final HashMap openSurveys = new HashMap<>(); public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { - this.network = network; this.user = user; this.globalSQL = globalSQL; @@ -221,33 +209,4 @@ public enum AnswerOption { Q3_YOUTUBE_LONG, Q3_INSTAGRAM } - - // @EventHandler - // public void interactEvent(PlayerInteractEvent event) { - // if (!event.getPlayer().getUniqueId().equals(user.player.getUniqueId())) - // return; - // if (event.getItem().getItemMeta() == null) - // return; - // if (event.getItem().getItemMeta() instanceof BookMeta bookMeta) { - // if (bookMeta.getAuthor().equals(this.bookUuid.toString())) { - // this.open(); - // event.setCancelled(true); - // } - // } - // } - // - // @EventHandler - // public void inventoryClickEvent(InventoryClickEvent event) { - // if (!event.getWhoClicked().getUniqueId().equals(user.player.getUniqueId())) - // return; - // if (Objects.requireNonNull(event.getCurrentItem()).getItemMeta() == null) - // return; - // if (event.getCurrentItem().getItemMeta() instanceof BookMeta bookMeta) { - // if (bookMeta.getAuthor().equals(this.bookUuid.toString())) { - // this.open(); - // event.setCancelled(true); - // } - // } - // } - } From f803b0f9a4c10a4f4cca482451541f6c433da7ca Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 15:22:31 +0000 Subject: [PATCH 88/96] Remove all listener logic and associated components --- .../net/bteuk/network/commands/Survey.java | 3 +-- .../net/bteuk/network/gui/NavigatorGui.java | 4 +-- .../net/bteuk/network/survey/SurveyBook.java | 25 +++---------------- 3 files changed, 7 insertions(+), 25 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index 4fb5054a..bdc49d89 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -45,13 +45,12 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) } if (args.length == 0) { - SurveyBook.openSurvey(instance, user, globalSQL); + SurveyBook.openSurvey(user, globalSQL); } else if (args.length == 1) { if (args[0].equalsIgnoreCase("save")) { SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); if (surveyBook != null) { surveyBook.saveSurvey(); - surveyBook.unregister(); } } } else if (args.length == 2) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 6c659705..d3fcd206 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -27,7 +27,7 @@ public class NavigatorGui extends NetworkGui { - public NavigatorGui(GuiProvider provider, Network network) { + public NavigatorGui(GuiProvider provider) { super(provider, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); Constants constants = provider.constants(); @@ -109,7 +109,7 @@ public NavigatorGui(GuiProvider provider, Network network) { // Survey if (constants.UKSurvey()) setItem(18, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("UK Survey"), Utils.line("Assist us with our PR analysis.")), (NetworkUser u) -> { - SurveyBook.openSurvey(network, u, globalSQL); + SurveyBook.openSurvey(u, globalSQL); }); setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index ea59d431..d1e66d0a 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -1,24 +1,19 @@ package net.bteuk.network.survey; import lombok.Getter; -import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Utils; import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Bukkit; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; import java.util.HashMap; -public class SurveyBook implements Listener { +public class SurveyBook { private final NetworkUser user; private final GlobalSQL globalSQL; @Getter @@ -27,7 +22,7 @@ public class SurveyBook implements Listener { private static final HashMap openSurveys = new HashMap<>(); - public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { + public SurveyBook(NetworkUser user, GlobalSQL globalSQL) { this.user = user; this.globalSQL = globalSQL; @@ -38,29 +33,19 @@ public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { // Update survey with answers updateSurveyBook(); - // //Create book item - // this.bookUuid = UUID.randomUUID(); - // bookItem = new ItemStack(Material.WRITTEN_BOOK); - // BookMeta bookItemMeta = (BookMeta) bookItem; - // bookItemMeta.setAuthor(bookUuid.toString()); - // bookItem.setItemMeta(bookItemMeta); - // - // Utils.giveItem(network, user.player, bookItem, "UK Survey"); - Bukkit.getServer().getPluginManager().registerEvents(this, network); openSurveys.put(user, this); } /** * Opens a survey for a user * - * @param network * @param user * @param globalSQL */ - public static void openSurvey(Network network, NetworkUser user, GlobalSQL globalSQL) { + public static void openSurvey(NetworkUser user, GlobalSQL globalSQL) { SurveyBook openSurvey = SurveyBook.getOpenSurvey(user); if (openSurvey == null) - openSurvey = new SurveyBook(network, user, globalSQL); + openSurvey = new SurveyBook(user, globalSQL); openSurvey.open(); } @@ -73,8 +58,6 @@ public void open() { public void unregister() { openSurveys.remove(user); - HandlerList.unregisterAll(this); - user.player.teleport(user.player.getLocation().add(0.0001, 0, 0)); } /** From b65b9dd2942cab6b068dc17b7288090eea9178c7 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 15:22:31 +0000 Subject: [PATCH 89/96] Remove all listener logic and associated components --- .../net/bteuk/network/commands/Navigator.java | 2 +- .../net/bteuk/network/commands/Survey.java | 3 +-- .../net/bteuk/network/gui/NavigatorGui.java | 4 +-- .../net/bteuk/network/survey/SurveyBook.java | 25 +++---------------- 4 files changed, 8 insertions(+), 26 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java index d6f1893d..ab68e5ce 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Navigator.java @@ -51,7 +51,7 @@ public Navigator(Network instance, GuiManager guiManager, Constants constants, G this.provider = new GuiProvider(instance, guiManager, constants, globalSQL, regionSQL, regionManager, plotSQL, plotAPI, lobby, back, eventAPI, serverAPI, nightvision, this, roles, tutorialsDBConnection, chatAPI, moderation); - this.navigator = new NavigatorGui(provider, instance); + this.navigator = new NavigatorGui(provider); } public void openNavigator(NetworkUser u) { diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index 4fb5054a..bdc49d89 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -45,13 +45,12 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) } if (args.length == 0) { - SurveyBook.openSurvey(instance, user, globalSQL); + SurveyBook.openSurvey(user, globalSQL); } else if (args.length == 1) { if (args[0].equalsIgnoreCase("save")) { SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); if (surveyBook != null) { surveyBook.saveSurvey(); - surveyBook.unregister(); } } } else if (args.length == 2) { diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index 6c659705..d3fcd206 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -27,7 +27,7 @@ public class NavigatorGui extends NetworkGui { - public NavigatorGui(GuiProvider provider, Network network) { + public NavigatorGui(GuiProvider provider) { super(provider, 27, Component.text("Navigator", NamedTextColor.AQUA, TextDecoration.BOLD)); Constants constants = provider.constants(); @@ -109,7 +109,7 @@ public NavigatorGui(GuiProvider provider, Network network) { // Survey if (constants.UKSurvey()) setItem(18, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("UK Survey"), Utils.line("Assist us with our PR analysis.")), (NetworkUser u) -> { - SurveyBook.openSurvey(network, u, globalSQL); + SurveyBook.openSurvey(u, globalSQL); }); setItem(19, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("Lights Out"), Utils.line("Play a game of Lights Out.")), (NetworkUser u) -> { diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index ea59d431..d1e66d0a 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -1,24 +1,19 @@ package net.bteuk.network.survey; import lombok.Getter; -import net.bteuk.network.Network; import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.sql.GlobalSQL; import net.bteuk.network.utils.NetworkUser; -import net.bteuk.network.utils.Utils; import net.kyori.adventure.inventory.Book; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Bukkit; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; import java.util.HashMap; -public class SurveyBook implements Listener { +public class SurveyBook { private final NetworkUser user; private final GlobalSQL globalSQL; @Getter @@ -27,7 +22,7 @@ public class SurveyBook implements Listener { private static final HashMap openSurveys = new HashMap<>(); - public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { + public SurveyBook(NetworkUser user, GlobalSQL globalSQL) { this.user = user; this.globalSQL = globalSQL; @@ -38,29 +33,19 @@ public SurveyBook(Network network, NetworkUser user, GlobalSQL globalSQL) { // Update survey with answers updateSurveyBook(); - // //Create book item - // this.bookUuid = UUID.randomUUID(); - // bookItem = new ItemStack(Material.WRITTEN_BOOK); - // BookMeta bookItemMeta = (BookMeta) bookItem; - // bookItemMeta.setAuthor(bookUuid.toString()); - // bookItem.setItemMeta(bookItemMeta); - // - // Utils.giveItem(network, user.player, bookItem, "UK Survey"); - Bukkit.getServer().getPluginManager().registerEvents(this, network); openSurveys.put(user, this); } /** * Opens a survey for a user * - * @param network * @param user * @param globalSQL */ - public static void openSurvey(Network network, NetworkUser user, GlobalSQL globalSQL) { + public static void openSurvey(NetworkUser user, GlobalSQL globalSQL) { SurveyBook openSurvey = SurveyBook.getOpenSurvey(user); if (openSurvey == null) - openSurvey = new SurveyBook(network, user, globalSQL); + openSurvey = new SurveyBook(user, globalSQL); openSurvey.open(); } @@ -73,8 +58,6 @@ public void open() { public void unregister() { openSurveys.remove(user); - HandlerList.unregisterAll(this); - user.player.teleport(user.player.getLocation().add(0.0001, 0, 0)); } /** From b3f231f174e4450ff117fd7e7d0ad98bc3f8f83e Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 16:59:19 +0000 Subject: [PATCH 90/96] Implemented a custom page changing mechanism in order to maintain page when clicking options --- .../net/bteuk/network/commands/Survey.java | 10 ++- .../net/bteuk/network/survey/SurveyBook.java | 80 ++++++++++++++++--- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index bdc49d89..7c9f76a1 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -69,7 +69,7 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) case Q2_TIKTOK -> surveyBook.getSurvey().setBMediumTiktok(bYes); case Q2_YT_SHORT -> surveyBook.getSurvey().setBMediumYoutubeShorts(bYes); case Q2_YT_LONG -> surveyBook.getSurvey().setBMediumYoutubeLongform(bYes); - case Q2_INSTRAGRAM -> surveyBook.getSurvey().setBMediumInstagram(bYes); + case Q2_INSTAGRAM -> surveyBook.getSurvey().setBMediumInstagram(bYes); case Q2_SEARCH -> surveyBook.getSurvey().setBSearchEngineBrowsing(bYes); case Q2_ONLINE_NEWS -> surveyBook.getSurvey().setBOnlineNews(bYes); case Q2_TV_NEWS -> surveyBook.getSurvey().setBTVNews(bYes); @@ -78,9 +78,13 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) case Q3_YOUTUBE_SHORTS -> surveyBook.getSurvey().setBSocialsYoutubeShorts(bYes); case Q3_YOUTUBE_LONG -> surveyBook.getSurvey().setBSocialsYoutubeLongform(bYes); case Q3_INSTAGRAM -> surveyBook.getSurvey().setBSocialsInstagram(bYes); + case CHANGE_PAGE -> { + int toPage = Integer.parseInt(args[1]); + surveyBook.changePage(toPage); + } } - surveyBook.updateSurveyBook(); - surveyBook.open(); + surveyBook.updateSurveyBooks(); + surveyBook.openCurrentPage(); } } diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index d1e66d0a..76a45f39 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -18,7 +18,9 @@ public class SurveyBook { private final GlobalSQL globalSQL; @Getter private final Survey survey; - private Book book; + private final Book[] books = new Book[5]; + /** The current open page of the book, zero indexed*/ + private int iCurrentPage; private static final HashMap openSurveys = new HashMap<>(); @@ -30,8 +32,10 @@ public SurveyBook(NetworkUser user, GlobalSQL globalSQL) { Survey existingSurvey = globalSQL.getSurveyOfUser(user.player.getUniqueId()); this.survey = (existingSurvey == null) ? new Survey() : existingSurvey; + iCurrentPage = 0; + // Update survey with answers - updateSurveyBook(); + updateSurveyBooks(); openSurveys.put(user, this); } @@ -46,14 +50,22 @@ public static void openSurvey(NetworkUser user, GlobalSQL globalSQL) { SurveyBook openSurvey = SurveyBook.getOpenSurvey(user); if (openSurvey == null) openSurvey = new SurveyBook(user, globalSQL); - openSurvey.open(); + openSurvey.openCurrentPage(); } /** - * Open the review book. + * Changes the open page dof the survey. + * @param iPage The page to change to, 1 indexed. */ - public void open() { - user.player.openBook(book); + public void changePage(int iPage) { + iCurrentPage = iPage-1; + } + + /** + * Open page iPage of the survey. + */ + public void openCurrentPage() { + user.player.openBook(books[iCurrentPage]); } public void unregister() { @@ -71,7 +83,7 @@ public static SurveyBook getOpenSurvey(NetworkUser user) { /** * Update book based on survey responses */ - public void updateSurveyBook() { + public void updateSurveyBooks() { // Page 1 - Which outlet Component page1 = Component.empty(); @@ -83,6 +95,14 @@ public void updateSurveyBook() { page1 = page1.appendNewline(); page1 = page1.appendNewline(); page1 = page1.append(Component.text("Answer on next page !")); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = page1.appendNewline(); + page1 = appendPageChangeOption(page1, false, true, 1); + + this.books[0] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page1); // Page 2 Question 1 answers Component page2 = Component.empty(); @@ -95,7 +115,9 @@ public void updateSurveyBook() { page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, AnswerOption.Q1_BTE_EXTERNAL, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); page2 = page2.appendNewline(); // Extra line page2 = appendOptionYesNo("From a Friend", page2, AnswerOption.Q1_FRIEND, survey.bFoundViaFriend, !survey.bFoundViaFriend); - page2 = page2.appendNewline(); // Extra line + page2 = appendPageChangeOption(page2, true, true, 2); + + this.books[1] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page2); // Page 3 Question 2 - Which medium Component page3 = Component.empty(); @@ -107,23 +129,33 @@ public void updateSurveyBook() { page3 = page3.appendNewline(); page3 = page3.appendNewline(); page3 = page3.append(Component.text("Answer on next page !")); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = page3.appendNewline(); + page3 = appendPageChangeOption(page3, true, true, 3); + + this.books[2] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page3); // Page 4 Question 2 answers Component page4 = Component.empty(); page4 = appendOptionYesNo("TikTok", page4, AnswerOption.Q2_TIKTOK, survey.bMediumTiktok, !survey.bMediumTiktok); page4 = appendOptionYesNo("YouTube Short", page4, AnswerOption.Q2_YT_SHORT, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); page4 = appendOptionYesNo("YouTube Longform", page4, AnswerOption.Q2_YT_LONG, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); - page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_INSTRAGRAM, survey.bMediumInstagram, !survey.bMediumInstagram); + page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_INSTAGRAM, survey.bMediumInstagram, !survey.bMediumInstagram); page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, AnswerOption.Q2_SEARCH, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); page4 = appendOptionYesNo("Online News", page4, AnswerOption.Q2_ONLINE_NEWS, survey.bOnlineNews, !survey.bOnlineNews); page4 = appendOptionYesNo("TV News", page4, AnswerOption.Q2_TV_NEWS, survey.bTVNews, !survey.bTVNews); page4 = appendOptionYesNo("Physical Newspaper", page4, AnswerOption.Q2_NEWSPAPER, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); + page4 = appendPageChangeOption(page4, true, true, 4); + + this.books[3] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page4); // Page 5 Question 3 Which socials Component page5 = Component.empty(); page5 = page5.append(Component.text("Question 3").decorate(TextDecoration.BOLD)); page5 = page5.appendNewline(); - page5 = page5.appendNewline(); page5 = page5.append(Component.text("What social media platforms do you use regularly?")); page5 = page5.appendNewline(); page5 = page5.appendNewline(); @@ -137,8 +169,10 @@ public void updateSurveyBook() { page5 = page5.append(Component.text("[Save]") .color(TextColor.color(NamedTextColor.GREEN.value())) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey save"))); + page5 = page5.appendNewline(); + page5 = appendPageChangeOption(page5, true, false, 5); - this.book = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page1, page2, page3, page4, page5); + this.books[4] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page5); } private Component appendOptionYesNo(String optionName, Component component, AnswerOption option, boolean bYSelected, boolean bNSelected) { @@ -169,6 +203,25 @@ private Component appendOptionYesNo(String optionName, Component component, Answ return component; } + private Component appendPageChangeOption(Component component, boolean bIncludeBack, boolean bIncludeForwards, int iCurrentPage) { + + if (bIncludeBack) { + component = component.append(Component.text("[Previous]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) + .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage-1)))); + if (bIncludeForwards) { + component = component.append(Component.text(" ")); + component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) + .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage+1)))); + } + } + else if (bIncludeForwards){ + component = component.append(Component.text(" ")); + component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) + .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage+1)))); + } + return component; + } + public void saveSurvey() { globalSQL.saveSurveyOfUser(user.player.getUniqueId(), survey); } @@ -182,7 +235,7 @@ public enum AnswerOption { Q2_TIKTOK, Q2_YT_SHORT, Q2_YT_LONG, - Q2_INSTRAGRAM, + Q2_INSTAGRAM, Q2_SEARCH, Q2_ONLINE_NEWS, Q2_TV_NEWS, @@ -190,6 +243,7 @@ public enum AnswerOption { Q3_TIKTOK, Q3_YOUTUBE_SHORTS, Q3_YOUTUBE_LONG, - Q3_INSTAGRAM + Q3_INSTAGRAM, + CHANGE_PAGE } } From 3e38fcc248d3c2a56dc3098a320ae8035b731927 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 16:59:35 +0000 Subject: [PATCH 91/96] Changed menu item slightly --- Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java index d3fcd206..3d543932 100644 --- a/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java +++ b/Plugin/src/main/java/net/bteuk/network/gui/NavigatorGui.java @@ -108,7 +108,7 @@ public NavigatorGui(GuiProvider provider) { // Survey if (constants.UKSurvey()) - setItem(18, Utils.createItem(Material.REDSTONE_LAMP, 1, Utils.title("UK Survey"), Utils.line("Assist us with our PR analysis.")), (NetworkUser u) -> { + setItem(18, Utils.createItem(Material.PAPER, 1, Utils.title("UK Survey"), Utils.line("Assist us with our PR strategy.")), (NetworkUser u) -> { SurveyBook.openSurvey(u, globalSQL); }); From 131a0bf47e10ca86cb6bf6d73c2c2ad5ae8faa71 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 17:02:59 +0000 Subject: [PATCH 92/96] Reformatting based on code standards --- .../java/net/bteuk/network/sql/GlobalSQL.java | 8 ++++---- .../net/bteuk/network/survey/SurveyBook.java | 16 +++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java index 2854fd67..755f5180 100644 --- a/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java +++ b/Plugin/src/main/java/net/bteuk/network/sql/GlobalSQL.java @@ -358,10 +358,10 @@ public void saveSurveyOfUser(UUID user, Survey survey) { Connection conn = conn(); PreparedStatement statement = (survey.isExisting()) ? conn.prepareStatement("UPDATE survey SET survey_last_edited=?, found_via_btuk=?, found_via_bte=?, " + - "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + - "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + - "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + - "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? WHERE player=?;") + "found_via_btuk_external=?, found_via_bte_external=?, found_via_friend=?," + + "medium_tiktok=?, medium_youtube_shorts=?, medium_youtube_longform=?, medium_instagram=?," + + "medium_search_engine_browsing=?, medium_online_news=?, medium_tvnews=?, medium_physical_newspaper=?," + + "socials_tiktok=?, socials_youtube_shorts=?, socials_youtube_longform=?, socials_instagram=? WHERE player=?;") : conn.prepareStatement("INSERT INTO survey (survey_completed_at, survey_last_edited, found_via_btuk, found_via_bte, " + "found_via_btuk_external, found_via_bte_external, found_via_friend, " + diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index 76a45f39..c390daa5 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -19,7 +19,9 @@ public class SurveyBook { @Getter private final Survey survey; private final Book[] books = new Book[5]; - /** The current open page of the book, zero indexed*/ + /** + * The current open page of the book, zero indexed + */ private int iCurrentPage; private static final HashMap openSurveys = new HashMap<>(); @@ -55,10 +57,11 @@ public static void openSurvey(NetworkUser user, GlobalSQL globalSQL) { /** * Changes the open page dof the survey. + * * @param iPage The page to change to, 1 indexed. */ public void changePage(int iPage) { - iCurrentPage = iPage-1; + iCurrentPage = iPage - 1; } /** @@ -207,17 +210,16 @@ private Component appendPageChangeOption(Component component, boolean bIncludeBa if (bIncludeBack) { component = component.append(Component.text("[Previous]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage-1)))); + .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage - 1)))); if (bIncludeForwards) { component = component.append(Component.text(" ")); component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage+1)))); + .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); } - } - else if (bIncludeForwards){ + } else if (bIncludeForwards) { component = component.append(Component.text(" ")); component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " +AnswerOption.CHANGE_PAGE.name() +" " +(iCurrentPage+1)))); + .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); } return component; } From 60a25a62d354b3461a1cf9f28211fc6cac58c9b3 Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 17:15:06 +0000 Subject: [PATCH 93/96] Say thank you after saving --- Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index c390daa5..3ca77a9c 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -226,6 +226,7 @@ private Component appendPageChangeOption(Component component, boolean bIncludeBa public void saveSurvey() { globalSQL.saveSurveyOfUser(user.player.getUniqueId(), survey); + user.sendMessage(ChatUtils.success("Thank you! Survey has been saved!")); } public enum AnswerOption { From 1f7c7c7c7bbc79276bb526ddc7600ad5789c8abd Mon Sep 17 00:00:00 2001 From: George112n Date: Sun, 15 Mar 2026 19:07:07 +0000 Subject: [PATCH 94/96] Fix building command initialisation again --- Plugin/src/main/java/net/bteuk/network/Network.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/src/main/java/net/bteuk/network/Network.java b/Plugin/src/main/java/net/bteuk/network/Network.java index d9a7bad4..1cc0cba8 100644 --- a/Plugin/src/main/java/net/bteuk/network/Network.java +++ b/Plugin/src/main/java/net/bteuk/network/Network.java @@ -426,7 +426,7 @@ public void enablePlugin() { /* * Utility commands. */ - commandManager.registerCommand(new Buildings(this, constants)); + commandManager.registerCommand(new Buildings(this, plotSQL, constants)); commandManager.registerCommand(new Discord(this, roleAPI, constants, messageSender)); commandManager.registerCommand(new Focus(this, messageSender)); From b6400d6d4cc91c37856fd47dd9ecb350c6910243 Mon Sep 17 00:00:00 2001 From: George112n Date: Wed, 18 Mar 2026 20:42:24 +0000 Subject: [PATCH 95/96] Changes after review --- .../net/bteuk/network/commands/Survey.java | 26 ++++++++--- .../java/net/bteuk/network/survey/Survey.java | 43 ++----------------- .../net/bteuk/network/survey/SurveyBook.java | 33 +++++++------- 3 files changed, 39 insertions(+), 63 deletions(-) diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index 7c9f76a1..5fbefa4a 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -15,6 +15,8 @@ import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; +import java.util.logging.Level; + @Log public class Survey extends AbstractCommand { @@ -46,19 +48,26 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) if (args.length == 0) { SurveyBook.openSurvey(user, globalSQL); - } else if (args.length == 1) { - if (args[0].equalsIgnoreCase("save")) { + } else if (args.length == 1 && args[0].equalsIgnoreCase("save")) { SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); if (surveyBook != null) { surveyBook.saveSurvey(); } - } } else if (args.length == 2) { SurveyBook surveyBook = SurveyBook.getOpenSurvey(user); if (surveyBook == null) return; - SurveyBook.AnswerOption answerOption = SurveyBook.AnswerOption.valueOf(args[0].toUpperCase()); + SurveyBook.AnswerOption answerOption; + + try { + answerOption = SurveyBook.AnswerOption.valueOf(args[0].toUpperCase()); + } + catch (IllegalArgumentException e) { + log.log(Level.WARNING, "Invalid answer option at command survey: " + args[0], e); + return; + } + boolean bYes = args[1].equals("Y"); switch (answerOption) { case Q1_BTUK -> surveyBook.getSurvey().setBFoundViaBTUK(bYes); @@ -79,8 +88,13 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) case Q3_YOUTUBE_LONG -> surveyBook.getSurvey().setBSocialsYoutubeLongform(bYes); case Q3_INSTAGRAM -> surveyBook.getSurvey().setBSocialsInstagram(bYes); case CHANGE_PAGE -> { - int toPage = Integer.parseInt(args[1]); - surveyBook.changePage(toPage); + try { + int toPage = Integer.parseInt(args[1]); + surveyBook.changePage(toPage); + } + catch (NumberFormatException e) { + log.log(Level.WARNING, "Invalid page number: " + args[1], e); + } } } surveyBook.updateSurveyBooks(); diff --git a/Plugin/src/main/java/net/bteuk/network/survey/Survey.java b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java index 6009b831..1551d753 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/Survey.java @@ -12,67 +12,30 @@ */ @AllArgsConstructor @NoArgsConstructor +@Getter +@Setter public class Survey { - @Getter @Setter - boolean isExisting; + private boolean isExisting; - @Getter - @Setter Timestamp SurveyCompleted; - @Getter - @Setter Timestamp SurveyLastEdited; - @Getter - @Setter boolean bFoundViaBTUK; - @Getter - @Setter boolean bFoundViaBTE; - @Getter - @Setter boolean bFoundViaBTUKExternal; - @Getter - @Setter boolean bFoundViaBTEExternal; - @Getter - @Setter boolean bFoundViaFriend; - @Getter - @Setter boolean bMediumTiktok; - @Getter - @Setter boolean bMediumYoutubeShorts; - @Getter - @Setter boolean bMediumYoutubeLongform; - @Getter - @Setter boolean bMediumInstagram; - @Getter - @Setter boolean bSearchEngineBrowsing; - @Getter - @Setter boolean bOnlineNews; - @Getter - @Setter boolean bTVNews; - @Getter - @Setter boolean bPhysicalNewspaper; - @Getter - @Setter boolean bSocialsTiktok; - @Getter - @Setter boolean bSocialsYoutubeShorts; - @Getter - @Setter boolean bSocialsYoutubeLongform; - @Getter - @Setter boolean bSocialsInstagram; } diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index 3ca77a9c..1099baf4 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -44,14 +44,12 @@ public SurveyBook(NetworkUser user, GlobalSQL globalSQL) { /** * Opens a survey for a user - * - * @param user - * @param globalSQL */ public static void openSurvey(NetworkUser user, GlobalSQL globalSQL) { SurveyBook openSurvey = SurveyBook.getOpenSurvey(user); - if (openSurvey == null) + if (openSurvey == null) { openSurvey = new SurveyBook(user, globalSQL); + } openSurvey.openCurrentPage(); } @@ -71,7 +69,9 @@ public void openCurrentPage() { user.player.openBook(books[iCurrentPage]); } - public void unregister() { + public void saveSurvey() { + globalSQL.saveSurveyOfUser(user.player.getUniqueId(), survey); + user.sendMessage(ChatUtils.success("Thank you! Survey has been saved!")); openSurveys.remove(user); } @@ -171,7 +171,7 @@ public void updateSurveyBooks() { page5 = page5.appendSpace(); page5 = page5.append(Component.text("[Save]") .color(TextColor.color(NamedTextColor.GREEN.value())) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey save"))); + .clickEvent(ClickEvent.runCommand("/survey save"))); page5 = page5.appendNewline(); page5 = appendPageChangeOption(page5, true, false, 5); @@ -185,21 +185,25 @@ private Component appendOptionYesNo(String optionName, Component component, Answ //[Y] component = component.append(Component.text("[")); Component Y = Component.text("Y").color(TextColor.color(NamedTextColor.GREEN.value())) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " Y")); - if (bYSelected) + .clickEvent(ClickEvent.runCommand("/survey " + option.name() + " Y")); + if (bYSelected) { component = component.append(Y.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED)); - else + } + else { component = component.append(Y); + } component = component.append(Component.text("]")); component = component.appendSpace(); //[N] component = component.append(Component.text("[")); Component N = Component.text("N").color(TextColor.color(NamedTextColor.RED.value())) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/survey " + option.name() + " N")); - if (bNSelected) + .clickEvent(ClickEvent.runCommand("/survey " + option.name() + " N")); + if (bNSelected) { component = component.append(N.decorate(TextDecoration.BOLD).decorate(TextDecoration.UNDERLINED)); - else + } + else { component = component.append(N); + } component = component.append(Component.text("]")); component = component.appendNewline(); @@ -224,11 +228,6 @@ private Component appendPageChangeOption(Component component, boolean bIncludeBa return component; } - public void saveSurvey() { - globalSQL.saveSurveyOfUser(user.player.getUniqueId(), survey); - user.sendMessage(ChatUtils.success("Thank you! Survey has been saved!")); - } - public enum AnswerOption { Q1_BTUK, Q1_BTE, From a1e35408c423f5e43c1d704cf3cf597c47b53f81 Mon Sep 17 00:00:00 2001 From: George112n Date: Wed, 18 Mar 2026 20:59:30 +0000 Subject: [PATCH 96/96] Move the AnswerOption enum outside of the SurveyBook class --- .../net/bteuk/network/commands/Survey.java | 5 +- .../network/survey/SurveyAnswerOption.java | 22 +++++++ .../net/bteuk/network/survey/SurveyBook.java | 63 +++++++------------ 3 files changed, 46 insertions(+), 44 deletions(-) create mode 100644 Plugin/src/main/java/net/bteuk/network/survey/SurveyAnswerOption.java diff --git a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java index 5fbefa4a..e8122fde 100644 --- a/Plugin/src/main/java/net/bteuk/network/commands/Survey.java +++ b/Plugin/src/main/java/net/bteuk/network/commands/Survey.java @@ -9,6 +9,7 @@ import net.bteuk.network.lib.utils.ChatUtils; import net.bteuk.network.socket.MessageSender; import net.bteuk.network.sql.GlobalSQL; +import net.bteuk.network.survey.SurveyAnswerOption; import net.bteuk.network.survey.SurveyBook; import net.bteuk.network.utils.NetworkUser; import org.bukkit.entity.Player; @@ -58,10 +59,10 @@ public void execute(@NotNull CommandSourceStack stack, String @NonNull [] args) if (surveyBook == null) return; - SurveyBook.AnswerOption answerOption; + SurveyAnswerOption answerOption; try { - answerOption = SurveyBook.AnswerOption.valueOf(args[0].toUpperCase()); + answerOption = SurveyAnswerOption.valueOf(args[0].toUpperCase()); } catch (IllegalArgumentException e) { log.log(Level.WARNING, "Invalid answer option at command survey: " + args[0], e); diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyAnswerOption.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyAnswerOption.java new file mode 100644 index 00000000..7081222c --- /dev/null +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyAnswerOption.java @@ -0,0 +1,22 @@ +package net.bteuk.network.survey; + +public enum SurveyAnswerOption { + Q1_BTUK, + Q1_BTE, + Q1_BTUK_EXTERNAL, + Q1_BTE_EXTERNAL, + Q1_FRIEND, + Q2_TIKTOK, + Q2_YT_SHORT, + Q2_YT_LONG, + Q2_INSTAGRAM, + Q2_SEARCH, + Q2_ONLINE_NEWS, + Q2_TV_NEWS, + Q2_NEWSPAPER, + Q3_TIKTOK, + Q3_YOUTUBE_SHORTS, + Q3_YOUTUBE_LONG, + Q3_INSTAGRAM, + CHANGE_PAGE +} \ No newline at end of file diff --git a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java index 1099baf4..b33cfb99 100644 --- a/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java +++ b/Plugin/src/main/java/net/bteuk/network/survey/SurveyBook.java @@ -109,15 +109,15 @@ public void updateSurveyBooks() { // Page 2 Question 1 answers Component page2 = Component.empty(); - page2 = appendOptionYesNo("Build the UK", page2, AnswerOption.Q1_BTUK, survey.bFoundViaBTUK, !survey.bFoundViaBTUK); + page2 = appendOptionYesNo("Build the UK", page2, SurveyAnswerOption.Q1_BTUK, survey.bFoundViaBTUK, !survey.bFoundViaBTUK); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("Build The Earth", page2, AnswerOption.Q1_BTE, survey.bFoundViaBTE, !survey.bFoundViaBTE); + page2 = appendOptionYesNo("Build The Earth", page2, SurveyAnswerOption.Q1_BTE, survey.bFoundViaBTE, !survey.bFoundViaBTE); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("External Media Mentioning Build the UK", page2, AnswerOption.Q1_BTUK_EXTERNAL, survey.bFoundViaBTUKExternal, !survey.bFoundViaBTUKExternal); + page2 = appendOptionYesNo("External Media Mentioning Build the UK", page2, SurveyAnswerOption.Q1_BTUK_EXTERNAL, survey.bFoundViaBTUKExternal, !survey.bFoundViaBTUKExternal); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, AnswerOption.Q1_BTE_EXTERNAL, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); + page2 = appendOptionYesNo("External Media Mentioning Build The Earth", page2, SurveyAnswerOption.Q1_BTE_EXTERNAL, survey.bFoundViaBTEExternal, !survey.bFoundViaBTEExternal); page2 = page2.appendNewline(); // Extra line - page2 = appendOptionYesNo("From a Friend", page2, AnswerOption.Q1_FRIEND, survey.bFoundViaFriend, !survey.bFoundViaFriend); + page2 = appendOptionYesNo("From a Friend", page2, SurveyAnswerOption.Q1_FRIEND, survey.bFoundViaFriend, !survey.bFoundViaFriend); page2 = appendPageChangeOption(page2, true, true, 2); this.books[1] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page2); @@ -143,14 +143,14 @@ public void updateSurveyBooks() { // Page 4 Question 2 answers Component page4 = Component.empty(); - page4 = appendOptionYesNo("TikTok", page4, AnswerOption.Q2_TIKTOK, survey.bMediumTiktok, !survey.bMediumTiktok); - page4 = appendOptionYesNo("YouTube Short", page4, AnswerOption.Q2_YT_SHORT, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); - page4 = appendOptionYesNo("YouTube Longform", page4, AnswerOption.Q2_YT_LONG, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); - page4 = appendOptionYesNo("YouTube Instagram", page4, AnswerOption.Q2_INSTAGRAM, survey.bMediumInstagram, !survey.bMediumInstagram); - page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, AnswerOption.Q2_SEARCH, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); - page4 = appendOptionYesNo("Online News", page4, AnswerOption.Q2_ONLINE_NEWS, survey.bOnlineNews, !survey.bOnlineNews); - page4 = appendOptionYesNo("TV News", page4, AnswerOption.Q2_TV_NEWS, survey.bTVNews, !survey.bTVNews); - page4 = appendOptionYesNo("Physical Newspaper", page4, AnswerOption.Q2_NEWSPAPER, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); + page4 = appendOptionYesNo("TikTok", page4, SurveyAnswerOption.Q2_TIKTOK, survey.bMediumTiktok, !survey.bMediumTiktok); + page4 = appendOptionYesNo("YouTube Short", page4, SurveyAnswerOption.Q2_YT_SHORT, survey.bMediumYoutubeShorts, !survey.bMediumYoutubeShorts); + page4 = appendOptionYesNo("YouTube Longform", page4, SurveyAnswerOption.Q2_YT_LONG, survey.bMediumYoutubeLongform, !survey.bMediumYoutubeLongform); + page4 = appendOptionYesNo("YouTube Instagram", page4, SurveyAnswerOption.Q2_INSTAGRAM, survey.bMediumInstagram, !survey.bMediumInstagram); + page4 = appendOptionYesNo("YouTube Search Engine - Browsing", page4, SurveyAnswerOption.Q2_SEARCH, survey.bSearchEngineBrowsing, !survey.bSearchEngineBrowsing); + page4 = appendOptionYesNo("Online News", page4, SurveyAnswerOption.Q2_ONLINE_NEWS, survey.bOnlineNews, !survey.bOnlineNews); + page4 = appendOptionYesNo("TV News", page4, SurveyAnswerOption.Q2_TV_NEWS, survey.bTVNews, !survey.bTVNews); + page4 = appendOptionYesNo("Physical Newspaper", page4, SurveyAnswerOption.Q2_NEWSPAPER, survey.bPhysicalNewspaper, !survey.bPhysicalNewspaper); page4 = appendPageChangeOption(page4, true, true, 4); this.books[3] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page4); @@ -162,10 +162,10 @@ public void updateSurveyBooks() { page5 = page5.append(Component.text("What social media platforms do you use regularly?")); page5 = page5.appendNewline(); page5 = page5.appendNewline(); - page5 = appendOptionYesNo("TikTok", page5, AnswerOption.Q3_TIKTOK, survey.bSocialsTiktok, !survey.bSocialsTiktok); - page5 = appendOptionYesNo("YouTube Shorts", page5, AnswerOption.Q3_YOUTUBE_SHORTS, survey.bSocialsYoutubeShorts, !survey.bSocialsYoutubeShorts); - page5 = appendOptionYesNo("YouTube Longform", page5, AnswerOption.Q3_YOUTUBE_LONG, survey.bSocialsYoutubeLongform, !survey.bSocialsYoutubeLongform); - page5 = appendOptionYesNo("Instagram", page5, AnswerOption.Q3_INSTAGRAM, survey.bSocialsInstagram, !survey.bSocialsInstagram); + page5 = appendOptionYesNo("TikTok", page5, SurveyAnswerOption.Q3_TIKTOK, survey.bSocialsTiktok, !survey.bSocialsTiktok); + page5 = appendOptionYesNo("YouTube Shorts", page5, SurveyAnswerOption.Q3_YOUTUBE_SHORTS, survey.bSocialsYoutubeShorts, !survey.bSocialsYoutubeShorts); + page5 = appendOptionYesNo("YouTube Longform", page5, SurveyAnswerOption.Q3_YOUTUBE_LONG, survey.bSocialsYoutubeLongform, !survey.bSocialsYoutubeLongform); + page5 = appendOptionYesNo("Instagram", page5, SurveyAnswerOption.Q3_INSTAGRAM, survey.bSocialsInstagram, !survey.bSocialsInstagram); page5 = page5.appendNewline(); page5 = page5.append(Component.text("Save Survey")); page5 = page5.appendSpace(); @@ -178,7 +178,7 @@ public void updateSurveyBooks() { this.books[4] = Book.book(Component.text(""), ChatUtils.line(user.player.getName()), page5); } - private Component appendOptionYesNo(String optionName, Component component, AnswerOption option, boolean bYSelected, boolean bNSelected) { + private Component appendOptionYesNo(String optionName, Component component, SurveyAnswerOption option, boolean bYSelected, boolean bNSelected) { component = component.append(Component.text(optionName)); component = component.appendSpace(); @@ -214,38 +214,17 @@ private Component appendPageChangeOption(Component component, boolean bIncludeBa if (bIncludeBack) { component = component.append(Component.text("[Previous]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage - 1)))); + .clickEvent(ClickEvent.runCommand("/survey " + SurveyAnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage - 1)))); if (bIncludeForwards) { component = component.append(Component.text(" ")); component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); + .clickEvent(ClickEvent.runCommand("/survey " + SurveyAnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); } } else if (bIncludeForwards) { component = component.append(Component.text(" ")); component = component.append(Component.text("[Next]").color(TextColor.color(NamedTextColor.LIGHT_PURPLE.value())) - .clickEvent(ClickEvent.runCommand("/survey " + AnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); + .clickEvent(ClickEvent.runCommand("/survey " + SurveyAnswerOption.CHANGE_PAGE.name() + " " + (iCurrentPage + 1)))); } return component; } - - public enum AnswerOption { - Q1_BTUK, - Q1_BTE, - Q1_BTUK_EXTERNAL, - Q1_BTE_EXTERNAL, - Q1_FRIEND, - Q2_TIKTOK, - Q2_YT_SHORT, - Q2_YT_LONG, - Q2_INSTAGRAM, - Q2_SEARCH, - Q2_ONLINE_NEWS, - Q2_TV_NEWS, - Q2_NEWSPAPER, - Q3_TIKTOK, - Q3_YOUTUBE_SHORTS, - Q3_YOUTUBE_LONG, - Q3_INSTAGRAM, - CHANGE_PAGE - } }