From f3c08658bd98301220c060250ed4af150853e13c Mon Sep 17 00:00:00 2001 From: Xiao-MoMi <70987828+Xiao-MoMi@users.noreply.github.com> Date: Wed, 29 Mar 2023 01:37:51 +0800 Subject: [PATCH] 2.2.0-temp --- build.gradle | 63 +-- .../customnameplates/CustomNameplates.java | 212 ++++--- .../api/CustomNameplatesAPI.java | 67 +++ ...eeConfig.java => BungeeConfigManager.java} | 6 +- .../bungeecord/BungeeEventListener.java | 7 +- .../{Main.java => NameplatesBungeeCord.java} | 26 +- .../commands/AbstractMainCommand.java | 82 +++ .../commands/AbstractSubCommand.java | 192 ++----- .../commands/BubblesCommand.java | 54 +- .../commands/NameplateCommand.java | 54 +- .../commands/subcmd/AboutCommand.java | 44 ++ .../commands/subcmd/BubblesEquipCommand.java | 60 +- .../subcmd/BubblesForceEquipCommand.java | 68 +-- .../subcmd/BubblesForceUnequipCommand.java | 61 +- .../commands/subcmd/BubblesListCommand.java | 54 +- .../subcmd/BubblesUnequipCommand.java | 49 +- .../commands/subcmd/ForcePreviewCommand.java | 115 ++-- .../commands/subcmd/HelpCommand.java | 69 ++- .../subcmd/NameplatesEquipCommand.java | 69 +-- .../subcmd/NameplatesForceEquipCommand.java | 75 +-- .../subcmd/NameplatesForceUnequipCommand.java | 61 +- .../subcmd/NameplatesListCommand.java | 52 +- .../subcmd/NameplatesUnequipCommand.java | 48 +- .../commands/subcmd/PreviewCommand.java | 62 ++- .../commands/subcmd/ReloadCommand.java | 44 +- .../data/DataStorageInterface.java | 11 + .../{objects => }/data/FileStorageImpl.java | 40 +- .../data/MySQLStorageImpl.java | 113 ++++ .../{objects => }/data/PlayerData.java | 40 +- .../{objects => }/data/SqlConnection.java | 69 ++- .../{objects => }/data/SqlConstants.java | 2 +- .../customnameplates/data/StorageType.java | 6 + .../helper/LibraryLoader.java | 19 +- .../customnameplates/helper/Log.java | 10 +- .../helper/VersionHelper.java | 114 +++- .../hook/NameplatePlaceholders.java | 118 ---- .../hook/OffsetPlaceholders.java | 56 -- .../listener/AbstractChatListener.java | 13 + ...atListener.java => AsyncChatListener.java} | 20 +- .../listener/EntityTagListener.java | 2 +- ...pleListener.java => JoinQuitListener.java} | 5 +- .../listener/ProxyDataListener.java | 47 -- .../listener/TrChatListener.java | 17 +- .../listener/VentureChatListener.java | 14 +- .../packet/EntityDestroyListener.java | 4 +- .../listener/packet/EntityLookListener.java | 4 +- .../listener/packet/EntityMountListener.java | 39 -- .../listener/packet/EntityMoveListener.java | 4 +- .../listener/packet/EntitySpawnListener.java | 4 +- .../packet/EntityTeleportListener.java | 4 +- .../manager/ActionBarManager.java | 114 ++-- .../manager/BackgroundManager.java | 145 +++++ .../manager/BossBarManager.java | 108 ++-- .../manager/ChatBubblesManager.java | 384 ++++++++----- .../manager/ConfigManager.java | 126 +++-- .../customnameplates/manager/DataManager.java | 162 ++++-- .../customnameplates/manager/FontManager.java | 181 ++++++ .../manager/ImageManager.java | 83 +++ .../manager/MessageManager.java | 10 +- .../manager/NameplateManager.java | 332 +++++++---- .../manager/PlaceholderManager.java | 196 +++++-- .../manager/ResourceManager.java | 521 ++++++------------ .../customnameplates/manager/TeamManager.java | 125 +++-- .../manager/WidthManager.java | 48 -- .../object/ConditionalText.java | 22 + .../DynamicText.java} | 28 +- .../{objects => object}/Function.java | 5 +- .../{objects => object}/SimpleChar.java | 4 +- .../customnameplates/object/StaticText.java | 4 + .../actionbar/ActionBarConfig.java | 26 +- .../object/actionbar/ActionBarSender.java | 51 ++ .../object/actionbar/ActionBarTask.java | 40 ++ .../object/armorstand/ArmorStandManager.java | 176 ++++++ .../object/armorstand/FakeArmorStand.java | 269 +++++++++ .../object/background/BackGroundConfig.java | 28 + .../bossbar/BossBarConfig.java | 27 +- .../object/bossbar/BossBarSender.java | 139 +++++ .../object/bossbar/BossBarTask.java | 55 ++ .../{objects => object}/bossbar/Overlay.java | 3 +- .../bubble}/BBPacketsHandle.java | 31 +- .../bubble/BubbleConfig.java} | 26 +- .../{hook => object/emoji}/ImageParser.java | 2 +- .../emoji/ItemsAdderImpl.java} | 4 +- .../emoji/OraxenImpl.java} | 6 +- .../font/ASCIIWidth.java} | 14 +- .../object/font/OffsetFont.java | 68 +++ .../font/UnicodeWidth.java} | 14 +- .../object/nameplate/NameplateConfig.java | 26 + .../object/nameplate/NameplatesTeam.java | 108 ++++ .../nameplate/mode/AbstractNameplateTag.java | 57 ++ .../object/nameplate/mode/DisplayMode.java | 6 + .../nameplate}/mode/EntityTag.java | 76 +-- .../nameplate}/mode/PacketsHandler.java | 26 +- .../armorstand/ArmorStandPacketsHandler.java} | 42 +- .../mode/armorstand/ArmorStandTag.java} | 58 +- .../mode/armorstand}/VehicleChecker.java | 21 +- .../object/nameplate/mode/team/TeamTag.java | 43 ++ .../object/requirements/BiomeImpl.java | 30 + .../object/requirements/CustomPapiImpl.java | 78 +++ .../object/requirements/DateImpl.java | 14 + .../requirements/PermissionImpl.java} | 4 +- .../requirements/PlayerCondition.java | 16 +- .../requirements/Requirement.java | 2 +- .../requirements/TimeImpl.java} | 6 +- .../requirements/WeatherImpl.java} | 32 +- .../requirements/WorldImpl.java} | 11 +- .../requirements/YPosImpl.java} | 6 +- .../requirements/papi/ExpressionAnd.java | 8 +- .../requirements/papi/ExpressionOr.java | 8 +- .../requirements/papi/PapiEquals.java | 9 +- .../requirements/papi/PapiGreater.java | 11 +- .../requirements/papi/PapiNoLarger.java | 11 +- .../requirements/papi/PapiNoLess.java | 11 +- .../requirements/papi/PapiNotEquals.java | 9 +- .../requirements/papi/PapiRequirement.java | 6 +- .../requirements/papi/PapiSmaller.java | 11 +- .../object/team/TeamNameInterface.java | 12 + .../team/TeamPacketInterface.java | 3 +- .../object/team/name/PlayerNameTeamImpl.java | 105 ++++ .../object/team/name/TABBungeeCordImpl.java | 92 ++++ .../team/name/TABImpl.java} | 20 +- .../object/team/packet/TeamInfoImpl.java | 85 +++ .../team/packet/TeamVisibilityImpl.java | 78 +++ .../customnameplates/objects/StaticText.java | 12 - .../objects/actionbar/ActionBarTask.java | 94 ---- .../objects/background/BackGround.java | 80 --- .../objects/bossbar/BossBarSender.java | 182 ------ .../objects/bossbar/TimerTaskP.java | 78 --- .../objects/data/DataStorageInterface.java | 12 - .../objects/data/MySQLStorageImpl.java | 140 ----- .../objects/font/FontChar.java | 54 -- .../objects/font/FontOffset.java | 182 ------ .../objects/font/FontUtil.java | 47 -- .../objects/nameplates/ArmorStand.java | 48 -- .../objects/nameplates/ArmorStandManager.java | 154 ------ .../objects/nameplates/BubbleConfig.java | 57 -- .../objects/nameplates/FakeArmorStand.java | 299 ---------- .../objects/nameplates/NameplateConfig.java | 51 -- .../objects/nameplates/NameplateMode.java | 59 -- .../objects/nameplates/NameplatesTeam.java | 157 ------ .../nameplates/mode/rd/RdPacketsHandler.java | 116 ---- .../objects/nameplates/mode/rd/RidingTag.java | 64 --- .../objects/nameplates/mode/tm/TeamTag.java | 73 --- .../objects/requirements/Biome.java | 38 -- .../objects/requirements/CustomPapi.java | 135 ----- .../objects/team/SimpleTeam.java | 16 - .../objects/team/SimpleTeamVisibility.java | 75 --- .../objects/team/TABbcHook.java | 50 -- .../objects/team/TeamNameInterface.java | 9 - .../objects/team/TeamPrefixSuffix.java | 88 --- .../BackGroundText.java | 12 +- .../placeholders/ConditionalTexts.java | 29 + .../placeholders/DescentText.java | 4 + .../placeholders/NameplatePlaceholders.java | 212 +++++++ .../NameplateText.java | 9 +- .../placeholders/VanillaHud.java | 4 + .../customnameplates/utils/AdventureUtil.java | 164 ------ .../utils/AdventureUtils.java | 123 +++++ .../customnameplates/utils/ConfigUtil.java | 94 ---- .../customnameplates/utils/ConfigUtils.java | 94 ++++ .../utils/{HoloUtil.java => HoloUtils.java} | 65 +-- .../utils/TeamManagePacketUtil.java | 69 --- src/main/resources/MODULES.yml | 10 - .../shaders/core/rendertype_text.fsh | 0 .../shaders/core/rendertype_text.json | 0 .../shaders/core/rendertype_text.vsh | 0 .../core/rendertype_text_see_through.fsh | 0 .../core/rendertype_text_see_through.json | 0 .../core/rendertype_text_see_through.vsh | 0 src/main/resources/actionbar.yml | 34 -- src/main/resources/bossbar.yml | 75 --- src/main/resources/bubble.yml | 37 -- src/main/resources/char-width.yml | 8 - src/main/resources/config.yml | 106 ++-- src/main/resources/configs/actionbar.yml | 21 + src/main/resources/configs/bossbar.yml | 31 ++ src/main/resources/configs/bubble.yml | 45 ++ .../resources/configs/custom-placeholders.yml | 122 ++++ src/main/resources/configs/image-width.yml | 0 src/main/resources/configs/nameplate.yml | 38 ++ .../{ => contents}/backgrounds/b0.png | Bin .../{ => contents}/backgrounds/b1.png | Bin .../{ => contents}/backgrounds/b128.png | Bin .../{ => contents}/backgrounds/b16.png | Bin .../{ => contents}/backgrounds/b2.png | Bin .../{ => contents}/backgrounds/b32.png | Bin .../{ => contents}/backgrounds/b4.png | Bin .../{ => contents}/backgrounds/b64.png | Bin .../{ => contents}/backgrounds/b8.png | Bin .../{ => contents}/backgrounds/bedrock_1.yml | 4 +- .../{ => contents}/backgrounds/bedrock_2.yml | 0 .../{ => contents}/backgrounds/bedrock_3.yml | 0 .../resources/{ => contents}/bubbles/chat.yml | 7 +- .../{ => contents}/bubbles/chat_left.png | Bin .../{ => contents}/bubbles/chat_middle.png | Bin .../{ => contents}/bubbles/chat_right.png | Bin .../{ => contents}/bubbles/chat_tail.png | Bin src/main/resources/contents/images/bell.png | Bin 0 -> 210 bytes src/main/resources/contents/images/bell.yml | 4 + src/main/resources/contents/images/bubble.png | Bin 0 -> 177 bytes src/main/resources/contents/images/bubble.yml | 4 + src/main/resources/contents/images/clock.png | Bin 0 -> 214 bytes src/main/resources/contents/images/clock.yml | 4 + src/main/resources/contents/images/coin.png | Bin 0 -> 211 bytes src/main/resources/contents/images/coin.yml | 4 + .../resources/contents/images/compass.png | Bin 0 -> 209 bytes .../resources/contents/images/compass.yml | 4 + .../resources/contents/images/stamina_0.png | Bin 0 -> 178 bytes .../resources/contents/images/stamina_0.yml | 4 + .../resources/contents/images/stamina_1.png | Bin 0 -> 230 bytes .../resources/contents/images/stamina_1.yml | 4 + .../resources/contents/images/stamina_2.png | Bin 0 -> 301 bytes .../resources/contents/images/stamina_2.yml | 4 + .../resources/contents/images/weather.png | Bin 0 -> 179 bytes .../resources/contents/images/weather.yml | 4 + .../{ => contents}/nameplates/cat.yml | 0 .../{ => contents}/nameplates/cat_left.png | Bin .../{ => contents}/nameplates/cat_middle.png | Bin .../{ => contents}/nameplates/cat_right.png | Bin .../{ => contents}/nameplates/cheems.yml | 0 .../{ => contents}/nameplates/cheems_left.png | Bin .../nameplates/cheems_middle.png | Bin .../nameplates/cheems_right.png | Bin .../{ => contents}/nameplates/egg.yml | 0 .../{ => contents}/nameplates/egg_left.png | Bin .../{ => contents}/nameplates/egg_middle.png | Bin .../{ => contents}/nameplates/egg_right.png | Bin .../{ => contents}/nameplates/halloween.yml | 0 .../nameplates/halloween_left.png | Bin .../nameplates/halloween_middle.png | Bin .../nameplates/halloween_right.png | Bin .../{ => contents}/nameplates/hutao.yml | 0 .../{ => contents}/nameplates/hutao_left.png | Bin .../nameplates/hutao_middle.png | Bin .../{ => contents}/nameplates/hutao_right.png | Bin .../{ => contents}/nameplates/rabbit.yml | 0 .../{ => contents}/nameplates/rabbit_left.png | Bin .../nameplates/rabbit_middle.png | Bin .../nameplates/rabbit_right.png | Bin .../{ => contents}/nameplates/starsky.yml | 0 .../nameplates/starsky_left.png | Bin .../nameplates/starsky_middle.png | Bin .../nameplates/starsky_right.png | Bin .../{ => contents}/nameplates/trident.yml | 0 .../nameplates/trident_left.png | Bin .../nameplates/trident_middle.png | Bin .../nameplates/trident_right.png | Bin .../{ => contents}/nameplates/wither.yml | 0 .../{ => contents}/nameplates/wither_left.png | Bin .../nameplates/wither_middle.png | Bin .../nameplates/wither_right.png | Bin .../{ => contents}/nameplates/xmas.yml | 0 .../{ => contents}/nameplates/xmas_left.png | Bin .../{ => contents}/nameplates/xmas_middle.png | Bin .../{ => contents}/nameplates/xmas_right.png | Bin src/main/resources/custom-papi.yml | 39 -- src/main/resources/database.yml | 2 +- src/main/resources/messages/cn.yml | 2 +- src/main/resources/nameplate.yml | 86 --- src/main/resources/plugin.yml | 3 + 260 files changed, 5566 insertions(+), 5576 deletions(-) create mode 100644 src/main/java/net/momirealms/customnameplates/api/CustomNameplatesAPI.java rename src/main/java/net/momirealms/customnameplates/bungeecord/{BungeeConfig.java => BungeeConfigManager.java} (87%) rename src/main/java/net/momirealms/customnameplates/bungeecord/{Main.java => NameplatesBungeeCord.java} (58%) create mode 100644 src/main/java/net/momirealms/customnameplates/commands/AbstractMainCommand.java create mode 100644 src/main/java/net/momirealms/customnameplates/commands/subcmd/AboutCommand.java create mode 100644 src/main/java/net/momirealms/customnameplates/data/DataStorageInterface.java rename src/main/java/net/momirealms/customnameplates/{objects => }/data/FileStorageImpl.java (51%) create mode 100644 src/main/java/net/momirealms/customnameplates/data/MySQLStorageImpl.java rename src/main/java/net/momirealms/customnameplates/{objects => }/data/PlayerData.java (50%) rename src/main/java/net/momirealms/customnameplates/{objects => }/data/SqlConnection.java (63%) rename src/main/java/net/momirealms/customnameplates/{objects => }/data/SqlConstants.java (91%) create mode 100644 src/main/java/net/momirealms/customnameplates/data/StorageType.java delete mode 100644 src/main/java/net/momirealms/customnameplates/hook/NameplatePlaceholders.java delete mode 100644 src/main/java/net/momirealms/customnameplates/hook/OffsetPlaceholders.java create mode 100644 src/main/java/net/momirealms/customnameplates/listener/AbstractChatListener.java rename src/main/java/net/momirealms/customnameplates/listener/{ChatListener.java => AsyncChatListener.java} (64%) rename src/main/java/net/momirealms/customnameplates/listener/{SimpleListener.java => JoinQuitListener.java} (89%) delete mode 100644 src/main/java/net/momirealms/customnameplates/listener/ProxyDataListener.java delete mode 100644 src/main/java/net/momirealms/customnameplates/listener/packet/EntityMountListener.java create mode 100644 src/main/java/net/momirealms/customnameplates/manager/BackgroundManager.java create mode 100644 src/main/java/net/momirealms/customnameplates/manager/FontManager.java create mode 100644 src/main/java/net/momirealms/customnameplates/manager/ImageManager.java delete mode 100644 src/main/java/net/momirealms/customnameplates/manager/WidthManager.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/ConditionalText.java rename src/main/java/net/momirealms/customnameplates/{objects/TextCache.java => object/DynamicText.java} (71%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/Function.java (91%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/SimpleChar.java (92%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/StaticText.java rename src/main/java/net/momirealms/customnameplates/{objects => object}/actionbar/ActionBarConfig.java (62%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarSender.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarTask.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/background/BackGroundConfig.java rename src/main/java/net/momirealms/customnameplates/{objects => object}/bossbar/BossBarConfig.java (65%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarSender.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarTask.java rename src/main/java/net/momirealms/customnameplates/{objects => object}/bossbar/Overlay.java (93%) rename src/main/java/net/momirealms/customnameplates/{objects/nameplates/mode/bubbles => object/bubble}/BBPacketsHandle.java (72%) rename src/main/java/net/momirealms/customnameplates/{commands/SubCommand.java => object/bubble/BubbleConfig.java} (61%) rename src/main/java/net/momirealms/customnameplates/{hook => object/emoji}/ImageParser.java (93%) rename src/main/java/net/momirealms/customnameplates/{hook/IAImageHook.java => object/emoji/ItemsAdderImpl.java} (90%) rename src/main/java/net/momirealms/customnameplates/{hook/OXImageHook.java => object/emoji/OraxenImpl.java} (91%) rename src/main/java/net/momirealms/customnameplates/{objects/font/FontWidthNormal.java => object/font/ASCIIWidth.java} (90%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/font/OffsetFont.java rename src/main/java/net/momirealms/customnameplates/{objects/font/FontWidthThin.java => object/font/UnicodeWidth.java} (90%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/NameplateConfig.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java rename src/main/java/net/momirealms/customnameplates/{objects/nameplates => object/nameplate}/mode/EntityTag.java (54%) rename src/main/java/net/momirealms/customnameplates/{objects/nameplates => object/nameplate}/mode/PacketsHandler.java (66%) rename src/main/java/net/momirealms/customnameplates/{objects/nameplates/mode/tp/TpPacketsHandler.java => object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java} (59%) rename src/main/java/net/momirealms/customnameplates/{objects/nameplates/mode/tp/TeleportingTag.java => object/nameplate/mode/armorstand/ArmorStandTag.java} (53%) rename src/main/java/net/momirealms/customnameplates/{objects/nameplates/mode/tp => object/nameplate/mode/armorstand}/VehicleChecker.java (77%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/requirements/BiomeImpl.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/requirements/CustomPapiImpl.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/requirements/DateImpl.java rename src/main/java/net/momirealms/customnameplates/{objects/requirements/Permission.java => object/requirements/PermissionImpl.java} (87%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/PlayerCondition.java (71%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/Requirement.java (92%) rename src/main/java/net/momirealms/customnameplates/{objects/requirements/Time.java => object/requirements/TimeImpl.java} (85%) rename src/main/java/net/momirealms/customnameplates/{objects/requirements/Weather.java => object/requirements/WeatherImpl.java} (57%) rename src/main/java/net/momirealms/customnameplates/{objects/requirements/World.java => object/requirements/WorldImpl.java} (73%) rename src/main/java/net/momirealms/customnameplates/{objects/requirements/YPos.java => object/requirements/YPosImpl.java} (85%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/ExpressionAnd.java (79%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/ExpressionOr.java (79%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiEquals.java (74%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiGreater.java (68%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiNoLarger.java (68%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiNoLess.java (68%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiNotEquals.java (74%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiRequirement.java (81%) rename src/main/java/net/momirealms/customnameplates/{objects => object}/requirements/papi/PapiSmaller.java (68%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/team/TeamNameInterface.java rename src/main/java/net/momirealms/customnameplates/{objects => object}/team/TeamPacketInterface.java (93%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/team/name/PlayerNameTeamImpl.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/team/name/TABBungeeCordImpl.java rename src/main/java/net/momirealms/customnameplates/{objects/team/TABTeamHook.java => object/team/name/TABImpl.java} (76%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/team/packet/TeamInfoImpl.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/team/packet/TeamVisibilityImpl.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/StaticText.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarTask.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/background/BackGround.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarSender.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/bossbar/TimerTaskP.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/data/DataStorageInterface.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/data/MySQLStorageImpl.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/font/FontChar.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/font/FontOffset.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/font/FontUtil.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStand.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStandManager.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/BubbleConfig.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/FakeArmorStand.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateConfig.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateMode.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplatesTeam.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RdPacketsHandler.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RidingTag.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tm/TeamTag.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/requirements/Biome.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/requirements/CustomPapi.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeam.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeamVisibility.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/team/TABbcHook.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/team/TeamNameInterface.java delete mode 100644 src/main/java/net/momirealms/customnameplates/objects/team/TeamPrefixSuffix.java rename src/main/java/net/momirealms/customnameplates/{objects/background => placeholders}/BackGroundText.java (73%) create mode 100644 src/main/java/net/momirealms/customnameplates/placeholders/ConditionalTexts.java create mode 100644 src/main/java/net/momirealms/customnameplates/placeholders/DescentText.java create mode 100644 src/main/java/net/momirealms/customnameplates/placeholders/NameplatePlaceholders.java rename src/main/java/net/momirealms/customnameplates/{objects/nameplates => placeholders}/NameplateText.java (80%) create mode 100644 src/main/java/net/momirealms/customnameplates/placeholders/VanillaHud.java delete mode 100644 src/main/java/net/momirealms/customnameplates/utils/AdventureUtil.java create mode 100644 src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java delete mode 100644 src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java create mode 100644 src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java rename src/main/java/net/momirealms/customnameplates/utils/{HoloUtil.java => HoloUtils.java} (67%) delete mode 100644 src/main/java/net/momirealms/customnameplates/utils/TeamManagePacketUtil.java delete mode 100644 src/main/resources/MODULES.yml rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text.fsh (100%) rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text.json (100%) rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text.vsh (100%) rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text_see_through.fsh (100%) rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text_see_through.json (100%) rename src/main/resources/ResourcePack/{ => assets}/minecraft/shaders/core/rendertype_text_see_through.vsh (100%) delete mode 100644 src/main/resources/actionbar.yml delete mode 100644 src/main/resources/bossbar.yml delete mode 100644 src/main/resources/bubble.yml delete mode 100644 src/main/resources/char-width.yml create mode 100644 src/main/resources/configs/actionbar.yml create mode 100644 src/main/resources/configs/bossbar.yml create mode 100644 src/main/resources/configs/bubble.yml create mode 100644 src/main/resources/configs/custom-placeholders.yml create mode 100644 src/main/resources/configs/image-width.yml create mode 100644 src/main/resources/configs/nameplate.yml rename src/main/resources/{ => contents}/backgrounds/b0.png (100%) rename src/main/resources/{ => contents}/backgrounds/b1.png (100%) rename src/main/resources/{ => contents}/backgrounds/b128.png (100%) rename src/main/resources/{ => contents}/backgrounds/b16.png (100%) rename src/main/resources/{ => contents}/backgrounds/b2.png (100%) rename src/main/resources/{ => contents}/backgrounds/b32.png (100%) rename src/main/resources/{ => contents}/backgrounds/b4.png (100%) rename src/main/resources/{ => contents}/backgrounds/b64.png (100%) rename src/main/resources/{ => contents}/backgrounds/b8.png (100%) rename src/main/resources/{ => contents}/backgrounds/bedrock_1.yml (86%) rename src/main/resources/{ => contents}/backgrounds/bedrock_2.yml (100%) rename src/main/resources/{ => contents}/backgrounds/bedrock_3.yml (100%) rename src/main/resources/{ => contents}/bubbles/chat.yml (76%) rename src/main/resources/{ => contents}/bubbles/chat_left.png (100%) rename src/main/resources/{ => contents}/bubbles/chat_middle.png (100%) rename src/main/resources/{ => contents}/bubbles/chat_right.png (100%) rename src/main/resources/{ => contents}/bubbles/chat_tail.png (100%) create mode 100644 src/main/resources/contents/images/bell.png create mode 100644 src/main/resources/contents/images/bell.yml create mode 100644 src/main/resources/contents/images/bubble.png create mode 100644 src/main/resources/contents/images/bubble.yml create mode 100644 src/main/resources/contents/images/clock.png create mode 100644 src/main/resources/contents/images/clock.yml create mode 100644 src/main/resources/contents/images/coin.png create mode 100644 src/main/resources/contents/images/coin.yml create mode 100644 src/main/resources/contents/images/compass.png create mode 100644 src/main/resources/contents/images/compass.yml create mode 100644 src/main/resources/contents/images/stamina_0.png create mode 100644 src/main/resources/contents/images/stamina_0.yml create mode 100644 src/main/resources/contents/images/stamina_1.png create mode 100644 src/main/resources/contents/images/stamina_1.yml create mode 100644 src/main/resources/contents/images/stamina_2.png create mode 100644 src/main/resources/contents/images/stamina_2.yml create mode 100644 src/main/resources/contents/images/weather.png create mode 100644 src/main/resources/contents/images/weather.yml rename src/main/resources/{ => contents}/nameplates/cat.yml (100%) rename src/main/resources/{ => contents}/nameplates/cat_left.png (100%) rename src/main/resources/{ => contents}/nameplates/cat_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/cat_right.png (100%) rename src/main/resources/{ => contents}/nameplates/cheems.yml (100%) rename src/main/resources/{ => contents}/nameplates/cheems_left.png (100%) rename src/main/resources/{ => contents}/nameplates/cheems_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/cheems_right.png (100%) rename src/main/resources/{ => contents}/nameplates/egg.yml (100%) rename src/main/resources/{ => contents}/nameplates/egg_left.png (100%) rename src/main/resources/{ => contents}/nameplates/egg_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/egg_right.png (100%) rename src/main/resources/{ => contents}/nameplates/halloween.yml (100%) rename src/main/resources/{ => contents}/nameplates/halloween_left.png (100%) rename src/main/resources/{ => contents}/nameplates/halloween_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/halloween_right.png (100%) rename src/main/resources/{ => contents}/nameplates/hutao.yml (100%) rename src/main/resources/{ => contents}/nameplates/hutao_left.png (100%) rename src/main/resources/{ => contents}/nameplates/hutao_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/hutao_right.png (100%) rename src/main/resources/{ => contents}/nameplates/rabbit.yml (100%) rename src/main/resources/{ => contents}/nameplates/rabbit_left.png (100%) rename src/main/resources/{ => contents}/nameplates/rabbit_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/rabbit_right.png (100%) rename src/main/resources/{ => contents}/nameplates/starsky.yml (100%) rename src/main/resources/{ => contents}/nameplates/starsky_left.png (100%) rename src/main/resources/{ => contents}/nameplates/starsky_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/starsky_right.png (100%) rename src/main/resources/{ => contents}/nameplates/trident.yml (100%) rename src/main/resources/{ => contents}/nameplates/trident_left.png (100%) rename src/main/resources/{ => contents}/nameplates/trident_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/trident_right.png (100%) rename src/main/resources/{ => contents}/nameplates/wither.yml (100%) rename src/main/resources/{ => contents}/nameplates/wither_left.png (100%) rename src/main/resources/{ => contents}/nameplates/wither_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/wither_right.png (100%) rename src/main/resources/{ => contents}/nameplates/xmas.yml (100%) rename src/main/resources/{ => contents}/nameplates/xmas_left.png (100%) rename src/main/resources/{ => contents}/nameplates/xmas_middle.png (100%) rename src/main/resources/{ => contents}/nameplates/xmas_right.png (100%) delete mode 100644 src/main/resources/custom-papi.yml delete mode 100644 src/main/resources/nameplate.yml diff --git a/build.gradle b/build.gradle index 0b4d58a..4e4f19b 100644 --- a/build.gradle +++ b/build.gradle @@ -4,55 +4,34 @@ plugins { } group = 'net.momirealms' -version = '2.1.7.2.2' +version = '2.2.0' repositories { mavenCentral() - maven { - name = 'papermc-repo' - url = 'https://papermc.io/repo/repository/maven-public/' - } - maven { - name = 'sonatype' - url = 'https://oss.sonatype.org/content/groups/public/' - } - maven { - name = "sonatype-oss-snapshots1" - url = "https://s01.oss.sonatype.org/content/repositories/snapshots/" - } - maven { - name = "dmulloy2-repo" - url = "https://repo.dmulloy2.net/repository/public/" - } - maven { - name = "clip-repo" - url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' - } - maven { - name = "jitpack" - url = 'https://jitpack.io' - } - maven { - name = "codecrafter47-repo" - url = 'https://nexus.codecrafter47.de/content/repositories/public/' - } + maven {name = "aliyun-repo"; url = "https://maven.aliyun.com/repository/public/"} + maven {name = 'papermc-repo'; url = 'https://papermc.io/repo/repository/maven-public/'} + maven {name = 'sonatype'; url = 'https://oss.sonatype.org/content/groups/public/'} + maven {name = "sonatype-oss-snapshots1"; url = "https://s01.oss.sonatype.org/content/repositories/snapshots/"} + maven {name = "dmulloy2-repo"; url = "https://repo.dmulloy2.net/repository/public/"} + maven {name = "clip-repo"; url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/'} + maven {name = "jitpack"; url = 'https://jitpack.io'} + maven {name = "codecrafter47-repo"; url = 'https://nexus.codecrafter47.de/content/repositories/public/'} } dependencies { compileOnly fileTree(dir:'libs',includes:['*.jar']) - compileOnly 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT' - compileOnly 'me.clip:placeholderapi:2.11.1' - compileOnly 'com.zaxxer:HikariCP:5.0.1' - compileOnly 'commons-io:commons-io:2.11.0' - compileOnly 'dev.dejvokep:boosted-yaml:1.3' - compileOnly 'net.md-5:bungeecord-api:1.19-R0.1-SNAPSHOT' - compileOnly 'codecrafter47.bungeetablistplus:bungeetablistplus-api-bungee:3.5.2' - compileOnly 'com.github.LoneDev6:api-itemsadder:3.2.3c' - implementation('net.kyori:adventure-api:4.12.0') - implementation('net.kyori:adventure-platform-bukkit:4.2.0') - implementation('net.kyori:adventure-text-minimessage:4.12.0') - implementation('net.kyori:adventure-text-serializer-gson:4.12.0') - implementation("org.bstats:bstats-bukkit:3.0.0") + compileOnly ('io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT') + compileOnly ('me.clip:placeholderapi:2.11.3') + compileOnly ('com.zaxxer:HikariCP:5.0.1') + compileOnly ('commons-io:commons-io:2.11.0') + compileOnly ('dev.dejvokep:boosted-yaml:1.3') + compileOnly ('net.md-5:bungeecord-api:1.19-R0.1-SNAPSHOT') + compileOnly ('com.github.LoneDev6:api-itemsadder:3.2.3c') + implementation ('net.kyori:adventure-api:4.13.0') + implementation ('net.kyori:adventure-platform-bukkit:4.3.0') + implementation ('net.kyori:adventure-text-minimessage:4.13.0') + implementation ('net.kyori:adventure-text-serializer-gson:4.13.0') + implementation ("org.bstats:bstats-bukkit:3.0.1") } def targetJavaVersion = 16 diff --git a/src/main/java/net/momirealms/customnameplates/CustomNameplates.java b/src/main/java/net/momirealms/customnameplates/CustomNameplates.java index 9332b85..491ea04 100644 --- a/src/main/java/net/momirealms/customnameplates/CustomNameplates.java +++ b/src/main/java/net/momirealms/customnameplates/CustomNameplates.java @@ -22,23 +22,25 @@ import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.BubblesCommand; import net.momirealms.customnameplates.commands.NameplateCommand; import net.momirealms.customnameplates.helper.LibraryLoader; import net.momirealms.customnameplates.helper.VersionHelper; import net.momirealms.customnameplates.manager.*; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; +import org.bukkit.command.PluginCommand; import org.bukkit.plugin.java.JavaPlugin; +import java.util.TimeZone; + public final class CustomNameplates extends JavaPlugin { - public static CustomNameplates plugin; - public static BukkitAudiences adventure; - public static ProtocolManager protocolManager; - + private static CustomNameplates plugin; + private static BukkitAudiences adventure; + private static ProtocolManager protocolManager; private ResourceManager resourceManager; private BossBarManager bossBarManager; private ActionBarManager actionBarManager; @@ -48,83 +50,137 @@ public final class CustomNameplates extends JavaPlugin { private DataManager dataManager; private ConfigManager configManager; private MessageManager messageManager; - private WidthManager widthManager; + private FontManager fontManager; private VersionHelper versionHelper; + private TeamManager teamManager; + private BackgroundManager backgroundManager; + private ImageManager imageManager; + private CustomNameplatesAPI customNameplatesAPI; @Override public void onLoad(){ plugin = this; - LibraryLoader.load("commons-io","commons-io","2.11.0","https://repo.maven.apache.org/maven2/"); - LibraryLoader.load("com.zaxxer","HikariCP","5.0.1","https://repo.maven.apache.org/maven2/"); - LibraryLoader.load("dev.dejvokep","boosted-yaml","1.3","https://repo.maven.apache.org/maven2/"); - LibraryLoader.load("org.mariadb.jdbc","mariadb-java-client","3.0.6","https://repo.maven.apache.org/maven2/"); + loadLibs(); } @Override public void onEnable() { adventure = BukkitAudiences.create(this); protocolManager = ProtocolLibrary.getProtocolManager(); - - //Don't delete this - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - - AdventureUtil.consoleMessage("[CustomNameplates] Running on " + Bukkit.getVersion()); - - this.placeholderManager = new PlaceholderManager(); - this.actionBarManager = new ActionBarManager(); - this.bossBarManager = new BossBarManager(); - this.resourceManager = new ResourceManager(); - this.dataManager = new DataManager(); - this.nameplateManager = new NameplateManager(); + AdventureUtils.consoleMessage("[CustomNameplates] Running on " + Bukkit.getVersion()); + this.fix(); this.configManager = new ConfigManager(); this.messageManager = new MessageManager(); - this.widthManager = new WidthManager(); - this.chatBubblesManager = new ChatBubblesManager(); - this.versionHelper = new VersionHelper(); - - ConfigUtil.reloadConfigs(); - - NameplateCommand nameplateCommand = new NameplateCommand(); - Bukkit.getPluginCommand("customnameplates").setExecutor(nameplateCommand); - Bukkit.getPluginCommand("customnameplates").setTabCompleter(nameplateCommand); - - BubblesCommand bubblesCommand = new BubblesCommand(); - Bukkit.getPluginCommand("bubbles").setExecutor(bubblesCommand); - Bukkit.getPluginCommand("bubbles").setTabCompleter(bubblesCommand); - - AdventureUtil.consoleMessage("[CustomNameplates] Plugin Enabled!"); - - new Metrics(this, 16649); + this.teamManager = new TeamManager(this); + this.placeholderManager = new PlaceholderManager(this); + this.actionBarManager = new ActionBarManager(this); + this.bossBarManager = new BossBarManager(this); + this.resourceManager = new ResourceManager(this); + this.dataManager = new DataManager(this); + this.nameplateManager = new NameplateManager(this); + this.backgroundManager = new BackgroundManager(this); + this.fontManager = new FontManager(this); + this.imageManager = new ImageManager(this); + this.chatBubblesManager = new ChatBubblesManager(this); + this.versionHelper = new VersionHelper(this); + this.customNameplatesAPI = new CustomNameplatesAPI(this); + this.customNameplatesAPI.init(); + this.registerCommands(); + this.reload(); + AdventureUtils.consoleMessage("[CustomNameplates] Plugin Enabled!"); + if (ConfigManager.enableBStats) new Metrics(this, 16649); + if (ConfigManager.checkUpdate) this.versionHelper.checkUpdate(); } @Override public void onDisable() { - if (actionBarManager != null) { - actionBarManager.unload(); + if (actionBarManager != null) actionBarManager.unload(); + if (nameplateManager != null) nameplateManager.unload(); + if (bossBarManager != null) bossBarManager.unload(); + if (chatBubblesManager != null) chatBubblesManager.unload(); + if (placeholderManager != null) placeholderManager.unload(); + if (fontManager != null) fontManager.unload(); + if (teamManager != null) teamManager.unload(); + if (imageManager != null) imageManager.unload(); + if (backgroundManager != null) backgroundManager.unload(); + if (dataManager != null) dataManager.disable(); + if (adventure != null) adventure.close(); + } + + private void loadLibs() { + TimeZone timeZone = TimeZone.getDefault(); + String libRepo = timeZone.getID().startsWith("Asia") ? "https://maven.aliyun.com/repository/public/" : "https://repo.maven.apache.org/maven2/"; + LibraryLoader.load("commons-io","commons-io","2.11.0", libRepo); + LibraryLoader.load("com.zaxxer","HikariCP","5.0.1", libRepo); + LibraryLoader.load("dev.dejvokep","boosted-yaml","1.3", libRepo); + LibraryLoader.load("org.mariadb.jdbc","mariadb-java-client","3.1.2", libRepo); + } + + private void registerCommands() { + NameplateCommand nameplateCommand = new NameplateCommand(); + PluginCommand main = Bukkit.getPluginCommand("customnameplates"); + if (main != null) { + main.setExecutor(nameplateCommand); + main.setTabCompleter(nameplateCommand); } - if (nameplateManager != null) { - nameplateManager.unload(); - } - if (bossBarManager != null) { - bossBarManager.unload(); - } - if (chatBubblesManager != null) { - chatBubblesManager.unload(); - } - if (placeholderManager != null) { - placeholderManager.unload(); - } - if (widthManager != null) { - widthManager.unload(); - } - if (dataManager != null) { - dataManager.disable(); - } - if (adventure != null) { - adventure.close(); + BubblesCommand bubblesCommand = new BubblesCommand(); + PluginCommand bubble = Bukkit.getPluginCommand("bubbles"); + if (bubble != null) { + bubble.setExecutor(bubblesCommand); + bubble.setTabCompleter(bubblesCommand); } } + private void fix() { + //Don't delete this, a temp fix for a certain version of ProtocolLib + new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + } + + public void reload() { + configManager.unload(); + messageManager.unload(); + bossBarManager.unload(); + actionBarManager.unload(); + placeholderManager.unload(); + nameplateManager.unload(); + teamManager.unload(); + chatBubblesManager.unload(); + imageManager.unload(); + fontManager.unload(); + backgroundManager.unload(); + dataManager.unload(); + + configManager.load(); + messageManager.load(); + dataManager.load(); + // image manager must before font manager + imageManager.load(); + fontManager.load(); + // team manager must before nameplates manager + teamManager.load(); + nameplateManager.load(); + + chatBubblesManager.load(); + backgroundManager.load(); + bossBarManager.load(); + actionBarManager.load(); + placeholderManager.load(); + + resourceManager.generateResourcePack(); + } + + public static CustomNameplates getInstance() { + return plugin; + } + + public static BukkitAudiences getAdventure() { + return adventure; + } + + public static ProtocolManager getProtocolManager() { + return protocolManager; + } + public ResourceManager getResourceManager() { return this.resourceManager; } @@ -149,23 +205,31 @@ public final class CustomNameplates extends JavaPlugin { return nameplateManager; } - public ConfigManager getConfigManager() { - return configManager; - } - - public MessageManager getMessageManager() { - return messageManager; - } - public ChatBubblesManager getChatBubblesManager() { return chatBubblesManager; } - public WidthManager getWidthManager() { - return widthManager; - } - public VersionHelper getVersionHelper() { return versionHelper; } + + public FontManager getFontManager() { + return fontManager; + } + + public TeamManager getTeamManager() { + return teamManager; + } + + public BackgroundManager getBackgroundManager() { + return backgroundManager; + } + + public ImageManager getImageManager() { + return imageManager; + } + + public CustomNameplatesAPI getAPI() { + return customNameplatesAPI; + } } diff --git a/src/main/java/net/momirealms/customnameplates/api/CustomNameplatesAPI.java b/src/main/java/net/momirealms/customnameplates/api/CustomNameplatesAPI.java new file mode 100644 index 0000000..8832dfe --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/api/CustomNameplatesAPI.java @@ -0,0 +1,67 @@ +package net.momirealms.customnameplates.api; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class CustomNameplatesAPI { + + private static CustomNameplatesAPI api; + private final CustomNameplates plugin; + + public CustomNameplatesAPI(CustomNameplates plugin) { + this.plugin = plugin; + } + + public void init() { + api = this; + } + + public static CustomNameplatesAPI getAPI() { + return api; + } + + public boolean doesNameplateExist(String nameplate) { + return plugin.getNameplateManager().existNameplate(nameplate); + } + + public boolean doesBubbleExist(String bubble) { + return plugin.getChatBubblesManager().existBubble(bubble); + } + + public void equipNameplate(Player player, String nameplate) { + plugin.getDataManager().equipNameplate(player, nameplate); + updateAndSave(player); + } + + private void updateAndSave(Player player) { + NameplatesTeam nameplatesTeam = plugin.getTeamManager().getNameplateTeam(player.getUniqueId()); + if (nameplatesTeam != null) { + nameplatesTeam.update(true); + plugin.getTeamManager().sendUpdateToAll(player, true); + } + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.getDataManager().saveData(player); + }); + } + + public void equipBubble(Player player, String bubble) { + plugin.getDataManager().equipBubble(player, bubble); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.getDataManager().saveData(player); + }); + } + + public void unEquipNameplate(Player player) { + plugin.getDataManager().equipNameplate(player, "none"); + updateAndSave(player); + } + + public void unEquipBubble(Player player) { + plugin.getDataManager().equipBubble(player, "none"); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + plugin.getDataManager().saveData(player); + }); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfig.java b/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfigManager.java similarity index 87% rename from src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfig.java rename to src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfigManager.java index e528cd1..2337881 100644 --- a/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfig.java +++ b/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeConfigManager.java @@ -17,11 +17,11 @@ package net.momirealms.customnameplates.bungeecord; -public class BungeeConfig { +public class BungeeConfigManager { - private final Main plugin; + private final NameplatesBungeeCord plugin; - public BungeeConfig(Main plugin) { + public BungeeConfigManager(NameplatesBungeeCord plugin) { this.plugin = plugin; } diff --git a/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeEventListener.java b/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeEventListener.java index 549d2af..6d9ba2f 100644 --- a/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeEventListener.java +++ b/src/main/java/net/momirealms/customnameplates/bungeecord/BungeeEventListener.java @@ -25,19 +25,19 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.PluginMessageEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; -import net.momirealms.customnameplates.objects.team.TABTeamHook; import java.util.Objects; public class BungeeEventListener implements Listener { - private final Main plugin; + private final NameplatesBungeeCord plugin; - public BungeeEventListener (Main plugin) { + public BungeeEventListener (NameplatesBungeeCord plugin) { this.plugin = plugin; } @EventHandler + @SuppressWarnings("UnstableApiUsage") public void onReceived(PluginMessageEvent event) { String channel = event.getTag(); if (event.isCancelled() || !Objects.equals("customnameplates:cnp", channel)) { @@ -47,6 +47,7 @@ public class BungeeEventListener implements Listener { parseMessage(dataInput); } + @SuppressWarnings("UnstableApiUsage") private void parseMessage(ByteArrayDataInput dataInput) { String playerName = dataInput.readUTF(); String teamName = playerName; diff --git a/src/main/java/net/momirealms/customnameplates/bungeecord/Main.java b/src/main/java/net/momirealms/customnameplates/bungeecord/NameplatesBungeeCord.java similarity index 58% rename from src/main/java/net/momirealms/customnameplates/bungeecord/Main.java rename to src/main/java/net/momirealms/customnameplates/bungeecord/NameplatesBungeeCord.java index 3f1dd4f..de66765 100644 --- a/src/main/java/net/momirealms/customnameplates/bungeecord/Main.java +++ b/src/main/java/net/momirealms/customnameplates/bungeecord/NameplatesBungeeCord.java @@ -19,27 +19,33 @@ package net.momirealms.customnameplates.bungeecord; import net.md_5.bungee.api.plugin.Plugin; -public class Main extends Plugin { +public class NameplatesBungeeCord extends Plugin { - public static Main bungeePlugin; - - private BungeeConfig bungeeConfig; + public static NameplatesBungeeCord bungeePlugin; + private BungeeEventListener bungeeEventListener; + private BungeeConfigManager bungeeConfigManager; @Override public void onEnable() { bungeePlugin = this; + this.bungeeEventListener = new BungeeEventListener(this); this.getProxy().registerChannel("customnameplates:cnp"); - this.getProxy().getPluginManager().registerListener(this, new BungeeEventListener(this)); - this.bungeeConfig = new BungeeConfig(this); - this.bungeeConfig.load(); + this.getProxy().getPluginManager().registerListener(this, bungeeEventListener); + this.bungeeConfigManager = new BungeeConfigManager(this); + this.bungeeConfigManager.load(); } @Override public void onDisable() { - + this.getProxy().unregisterChannel("customnameplates:cnp"); + this.getProxy().getPluginManager().unregisterListener(bungeeEventListener); } - public BungeeConfig getBungeeConfig() { - return bungeeConfig; + public BungeeConfigManager getBungeeConfig() { + return bungeeConfigManager; + } + + public static NameplatesBungeeCord getPlugin() { + return bungeePlugin; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/AbstractMainCommand.java b/src/main/java/net/momirealms/customnameplates/commands/AbstractMainCommand.java new file mode 100644 index 0000000..ee4b00f --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/commands/AbstractMainCommand.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.commands; + +import net.momirealms.customnameplates.manager.MessageManager; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public abstract class AbstractMainCommand implements TabExecutor { + + protected final Map subCommandMap; + protected String name; + + public AbstractMainCommand(String name) { + this.name = name; + this.subCommandMap = new ConcurrentHashMap<>(); + } + + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + List argList = Arrays.asList(args); + if (argList.size() < 1) { + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.nonArgs); + return true; + } + AbstractSubCommand subCommand = subCommandMap.get(argList.get(0)); + if (subCommand != null) { + if (!sender.hasPermission(name + "." + subCommand.getSubCommand())) { + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.noPerm); + return true; + } + return subCommand.onCommand(sender, argList.subList(1, argList.size())); + } + else { + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.unavailableArgs); + return true; + } + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + List argList = Arrays.asList(args); + if (argList.size() <= 1) { + List returnList = new ArrayList<>(subCommandMap.keySet()); + returnList.removeIf(str -> !str.startsWith(args[0]) || !sender.hasPermission(name + "." + str)); + return returnList; + } + AbstractSubCommand subCommand = subCommandMap.get(argList.get(0)); + if (subCommand != null) + return subCommand.onTabComplete(sender, argList.subList(1, argList.size())); + else + return Collections.singletonList(""); + } + + public void regSubCommand(AbstractSubCommand executor) { + subCommandMap.put(executor.getSubCommand(), executor); + } + + public Map getSubCommandMap() { + return subCommandMap; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/commands/AbstractSubCommand.java b/src/main/java/net/momirealms/customnameplates/commands/AbstractSubCommand.java index 8de2e57..4fac69c 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/AbstractSubCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/AbstractSubCommand.java @@ -18,48 +18,43 @@ package net.momirealms.customnameplates.commands; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.ResourceManager; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import net.momirealms.customnameplates.objects.nameplates.mode.EntityTag; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionAttachmentInfo; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; -public abstract class AbstractSubCommand implements SubCommand { +public abstract class AbstractSubCommand { private final String command; - private Map subCommandMap; - protected HashMap coolDown = new HashMap<>(); + private Map subCommandMap; - public AbstractSubCommand(String command, Map subCommandMap) { + public AbstractSubCommand(String command) { this.command = command; - this.subCommandMap = subCommandMap; } - @Override public boolean onCommand(CommandSender sender, List args) { if (subCommandMap == null || args.size() < 1) { return true; } - SubCommand subCommand = subCommandMap.get(args.get(0)); + AbstractSubCommand subCommand = subCommandMap.get(args.get(0)); if (subCommand == null) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.unavailableArgs); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.unavailableArgs); } else { subCommand.onCommand(sender, args.subList(1, args.size())); } return true; } - @Override public List onTabComplete(CommandSender sender, List args) { if (subCommandMap == null) return Collections.singletonList(""); @@ -68,160 +63,79 @@ public abstract class AbstractSubCommand implements SubCommand { returnList.removeIf(str -> !str.startsWith(args.get(0))); return returnList; } - SubCommand subCmd = subCommandMap.get(args.get(0)); + AbstractSubCommand subCmd = subCommandMap.get(args.get(0)); if (subCmd != null) return subCommandMap.get(args.get(0)).onTabComplete(sender, args.subList(1, args.size())); return Collections.singletonList(""); } - @Override public String getSubCommand() { return command; } - @Override - public Map getSubCommands() { + public Map getSubCommands() { return Collections.unmodifiableMap(subCommandMap); } - @Override - public void regSubCommand(SubCommand command) { + public void regSubCommand(AbstractSubCommand command) { if (subCommandMap == null) { subCommandMap = new ConcurrentHashMap<>(); } subCommandMap.put(command.getSubCommand(), command); } - protected List availableNameplates(CommandSender sender){ - List availableNameplates = new ArrayList<>(); - if (sender instanceof Player player){ - getAvailableNameplates(player, availableNameplates); - } - return availableNameplates; + protected List online_players() { + return Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).collect(Collectors.toList()); } - protected List availableBubbles(CommandSender sender){ - List availableBubbles = new ArrayList<>(); - if (sender instanceof Player player){ - getAvailableBubbles(player, availableBubbles); - } - return availableBubbles; + protected List allNameplates() { + return new ArrayList<>(CustomNameplates.getInstance().getNameplateManager().getNameplateConfigMap().keySet()); } - protected List online_players(){ - List online = new ArrayList<>(); - Bukkit.getOnlinePlayers().forEach((player -> online.add(player.getName()))); - return online; + protected List allBubbles() { + return new ArrayList<>(CustomNameplates.getInstance().getChatBubblesManager().getBubbleConfigMap().keySet()); } - protected List nameplates(){ - return new ArrayList<>(ResourceManager.NAMEPLATES.keySet()); - } - - protected List bubbles(){ - return new ArrayList<>(ResourceManager.BUBBLES.keySet()); - } - - protected void unequipNameplate(Player player) { - CustomNameplates.plugin.getDataManager().getPlayerData(player).equipNameplate("none"); - CustomNameplates.plugin.getDataManager().saveData(player); - NameplatesTeam nameplatesTeam = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); - if (nameplatesTeam != null) nameplatesTeam.updateNameplates(); - CustomNameplates.plugin.getNameplateManager().getTeamManager().sendUpdateToAll(player, true); - } - - protected void showPlayerArmorStandTags(Player player) { - EntityTag entityTag = (EntityTag) CustomNameplates.plugin.getNameplateManager().getNameplateMode(); - ArmorStandManager asm = entityTag.getArmorStandManager(player); - asm.spawn(player); - for (int i = 0; i < NameplateManager.preview * 20; i++) { - Bukkit.getScheduler().runTaskLater(CustomNameplates.plugin, ()-> { - asm.teleport(player); - },i); - } - Bukkit.getScheduler().runTaskLater(CustomNameplates.plugin, ()-> { - asm.destroy(player); - },NameplateManager.preview * 20); - } - - protected void getAvailableNameplates(Player player, List availableNameplates) { - for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { - String permission = info.getPermission().toLowerCase(); - if (permission.startsWith("nameplates.equip.")) { - permission = permission.substring(17); - if (ResourceManager.NAMEPLATES.get(permission) != null) { - availableNameplates.add(permission); - } + protected boolean notExist(CommandSender commandSender, String type, String value) { + if (type.equals("nameplate")) { + if (!CustomNameplatesAPI.getAPI().doesNameplateExist(value)) { + AdventureUtils.sendMessage(commandSender, MessageManager.prefix + MessageManager.np_not_exist); + return true; + } + } else if (type.equals("bubble")) { + if (!CustomNameplatesAPI.getAPI().doesBubbleExist(value)) { + AdventureUtils.sendMessage(commandSender, MessageManager.prefix + MessageManager.bb_not_exist); + return true; } } + return false; } - protected void getAvailableBubbles(Player player, List availableBubbles) { - for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { - String permission = info.getPermission().toLowerCase(); - if (permission.startsWith("bubbles.equip.")) { - permission = permission.substring(14); - if (ResourceManager.BUBBLES.get(permission) != null) { - availableBubbles.add(permission); - } - } + protected boolean noConsoleExecute(CommandSender commandSender) { + if (!(commandSender instanceof Player)) { + AdventureUtils.consoleMessage(MessageManager.prefix + MessageManager.no_console); + return true; } + return false; } - protected int color2decimal(ChatColor color){ - switch (String.valueOf(color.getChar())){ - case "0" -> { - return 0; - } - case "c" -> { - return 16733525; - } - case "6" -> { - return 16755200; - } - case "4" -> { - return 11141120; - } - case "e" -> { - return 16777045; - } - case "2" -> { - return 43520; - } - case "a" -> { - return 5635925; - } - case "b" -> { - return 5636095; - } - case "3" -> { - return 43690; - } - case "1" -> { - return 170; - } - case "9" -> { - return 5592575; - } - case "d" -> { - return 16733695; - } - case "5" -> { - return 11141290; - } - case "8" -> { - return 5592405; - } - case "7" -> { - return 11184810; - } - default -> { - return 16777215; - } + protected boolean lackArgs(CommandSender commandSender, int required, int current) { + if (required > current) { + AdventureUtils.sendMessage(commandSender, MessageManager.prefix + MessageManager.lackArgs); + return true; } + return false; } - public void setSubCommandMap(Map subCommandMap) { - this.subCommandMap = subCommandMap; + protected boolean playerNotOnline(CommandSender commandSender, String player) { + if (Bukkit.getPlayer(player) == null) { + AdventureUtils.sendMessage(commandSender, MessageManager.prefix + MessageManager.not_online.replace("{Player}", player)); + return true; + } + return false; + } + + protected List filterStartingWith(List list, String prefix) { + return list.stream().filter(s -> s.startsWith(prefix)).collect(Collectors.toList()); } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/BubblesCommand.java b/src/main/java/net/momirealms/customnameplates/commands/BubblesCommand.java index a459bde..7677150 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/BubblesCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/BubblesCommand.java @@ -18,41 +18,14 @@ package net.momirealms.customnameplates.commands; import net.momirealms.customnameplates.commands.subcmd.*; -import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.jetbrains.annotations.NotNull; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class BubblesCommand implements TabExecutor { - - private final Map subCommandMap; +public class BubblesCommand extends AbstractMainCommand { public BubblesCommand() { - subCommandMap = new ConcurrentHashMap<>(); + super("bubbles"); regDefaultSubCommands(); } - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - List argList = Arrays.asList(args); - if (argList.size() < 1) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.nonArgs); - return true; - } - SubCommand subCommand = subCommandMap.get(argList.get(0)); - if (subCommand != null) - return subCommand.onCommand(sender, argList.subList(1, argList.size())); - else { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.unavailableArgs); - return true; - } - } - private void regDefaultSubCommands() { regSubCommand(BubblesEquipCommand.INSTANCE); regSubCommand(BubblesUnequipCommand.INSTANCE); @@ -60,27 +33,4 @@ public class BubblesCommand implements TabExecutor { regSubCommand(BubblesForceUnequipCommand.INSTANCE); regSubCommand(BubblesListCommand.INSTANCE); } - - public void regSubCommand(SubCommand executor) { - subCommandMap.put(executor.getSubCommand(), executor); - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - List argList = Arrays.asList(args); - if (argList.size() <= 1) { - List returnList = new ArrayList<>(subCommandMap.keySet()); - returnList.removeIf(str -> !str.startsWith(args[0]) || !sender.hasPermission("bubbles." + str)); - return returnList; - } - SubCommand subCommand = subCommandMap.get(argList.get(0)); - if (subCommand != null) - return subCommand.onTabComplete(sender, argList.subList(1, argList.size())); - else - return Collections.singletonList(""); - } - - public Map getSubCommandMap() { - return subCommandMap; - } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/NameplateCommand.java b/src/main/java/net/momirealms/customnameplates/commands/NameplateCommand.java index fca1ec1..0dfe335 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/NameplateCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/NameplateCommand.java @@ -18,41 +18,15 @@ package net.momirealms.customnameplates.commands; import net.momirealms.customnameplates.commands.subcmd.*; -import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; -import org.jetbrains.annotations.NotNull; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +public class NameplateCommand extends AbstractMainCommand { -public class NameplateCommand implements TabExecutor { - - private final Map subCommandMap; public NameplateCommand() { - subCommandMap = new ConcurrentHashMap<>(); + super("nameplates"); regDefaultSubCommands(); } - @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - List argList = Arrays.asList(args); - if (argList.size() < 1) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.nonArgs); - return true; - } - SubCommand subCommand = subCommandMap.get(argList.get(0)); - if (subCommand != null) - return subCommand.onCommand(sender, argList.subList(1, argList.size())); - else { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.unavailableArgs); - return true; - } - } - private void regDefaultSubCommands() { regSubCommand(ReloadCommand.INSTANCE); regSubCommand(NameplatesEquipCommand.INSTANCE); @@ -63,28 +37,6 @@ public class NameplateCommand implements TabExecutor { regSubCommand(ForcePreviewCommand.INSTANCE); regSubCommand(NameplatesListCommand.INSTANCE); regSubCommand(HelpCommand.INSTANCE); - } - - public void regSubCommand(SubCommand executor) { - subCommandMap.put(executor.getSubCommand(), executor); - } - - @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - List argList = Arrays.asList(args); - if (argList.size() <= 1) { - List returnList = new ArrayList<>(subCommandMap.keySet()); - returnList.removeIf(str -> !str.startsWith(args[0]) || !sender.hasPermission("nameplates." + str)); - return returnList; - } - SubCommand subCommand = subCommandMap.get(argList.get(0)); - if (subCommand != null) - return subCommand.onTabComplete(sender, argList.subList(1, argList.size())); - else - return Collections.singletonList(""); - } - - public Map getSubCommandMap() { - return subCommandMap; + regSubCommand(AboutCommand.INSTANCE); } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/AboutCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/AboutCommand.java new file mode 100644 index 0000000..40da538 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/AboutCommand.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.commands.subcmd; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.commands.AbstractSubCommand; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.command.CommandSender; + +import java.util.List; + +public class AboutCommand extends AbstractSubCommand { + + public static final AboutCommand INSTANCE = new AboutCommand(); + + public AboutCommand() { + super("about"); + } + + @Override + public boolean onCommand(CommandSender sender, List args) { + AdventureUtils.sendMessage(sender, "<#3CB371>⚓ CustomNameplates - <#98FB98>" + CustomNameplates.getInstance().getVersionHelper().getPluginVersion()); + AdventureUtils.sendMessage(sender, "<#7FFFAA>A plugin that provides adjustable images for texts"); + AdventureUtils.sendMessage(sender, "<#DA70D6>\uD83E\uDDEA Author: <#FFC0CB>XiaoMoMi"); + AdventureUtils.sendMessage(sender, "<#FF7F50>\uD83D\uDD25 Contributors: <#FFA07A>TopOrigin"); + AdventureUtils.sendMessage(sender, "<#FFD700>⭐ Document <#A9A9A9>| <#FAFAD2>⛏ Github <#A9A9A9>| <#48D1CC>\uD83D\uDD14 Polymart"); + return true; + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesEquipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesEquipCommand.java index 6e88e78..4a3db6c 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesEquipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesEquipCommand.java @@ -1,62 +1,58 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class BubblesEquipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new BubblesEquipCommand(); + public static final AbstractSubCommand INSTANCE = new BubblesEquipCommand(); public BubblesEquipCommand() { - super("equip", null); + super("equip"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); + if (noConsoleExecute(sender) || lackArgs(sender, 1, args.size()) || notExist(sender, "bubble", args.get(0))) return true; - } - if (args.size() < 1) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.lackArgs); - return true; - } - - if (CustomNameplates.plugin.getResourceManager().getBubbleConfig(args.get(0)) == null) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.bb_not_exist); - return true; - } - if (!sender.hasPermission("bubbles.equip." + args.get(0))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.bb_notAvailable); + AdventureUtils.playerMessage((Player) sender, MessageManager.prefix + MessageManager.bb_notAvailable); return true; } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).setBubbles(args.get(0)); - CustomNameplates.plugin.getDataManager().saveData(player); - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.bb_equip.replace("{Bubble}", CustomNameplates.plugin.getResourceManager().getBubbleConfig(args.get(0)).name())); - }); - + CustomNameplatesAPI.getAPI().equipBubble((Player) sender, args.get(0)); + AdventureUtils.playerMessage((Player) sender, MessageManager.prefix + MessageManager.bb_equip.replace("{Bubble}", CustomNameplates.getInstance().getChatBubblesManager().getBubbleConfig(args.get(0)).display_name())); return true; } @Override public List onTabComplete(CommandSender sender, List args) { - List arrayList = new ArrayList<>(); - for (String bubble : availableBubbles(sender)) { - if (bubble.startsWith(args.get(0))) - arrayList.add(bubble); + if (args.size() == 1 && sender instanceof Player player) { + return filterStartingWith(CustomNameplates.getInstance().getChatBubblesManager().getAvailableBubbles(player), args.get(0)); } - return arrayList; + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceEquipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceEquipCommand.java index e0d5de7..3dc108f 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceEquipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceEquipCommand.java @@ -1,74 +1,60 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class BubblesForceEquipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new BubblesForceEquipCommand(); + public static final AbstractSubCommand INSTANCE = new BubblesForceEquipCommand(); public BubblesForceEquipCommand() { - super("forceequip", null); + super("forceequip"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (args.size() < 2){ - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.lackArgs); + if (lackArgs(sender, 2, args.size()) || playerNotOnline(sender, args.get(0)) || notExist(sender, "bubble", args.get(1))) return true; - } - if (!sender.hasPermission("bubbles.forceequip")) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } Player player = Bukkit.getPlayer(args.get(0)); - if (player == null) { - return true; - } - - if (CustomNameplates.plugin.getResourceManager().getBubbleConfig(args.get(1)) == null){ - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.bb_not_exist); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).setBubbles(args.get(0)); - CustomNameplates.plugin.getDataManager().saveData(player); - - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.bb_force_equip.replace("{Bubble}", CustomNameplates.plugin.getResourceManager().getBubbleConfig(args.get(1)).name()).replace("{Player}", args.get(0))); - }); - + CustomNameplatesAPI.getAPI().equipBubble(player, args.get(1)); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.bb_force_equip.replace("{Bubble}", CustomNameplates.getInstance().getChatBubblesManager().getBubbleConfig(args.get(1)).display_name()).replace("{Player}", args.get(0))); return true; } @Override public List onTabComplete(CommandSender sender, List args) { if (args.size() == 1) { - List arrayList = new ArrayList<>(); - for (String player : online_players()) { - if (player.startsWith(args.get(0))) - arrayList.add(player); - } - return arrayList; + return filterStartingWith(online_players(), args.get(0)); } if (args.size() == 2) { - List arrayList = new ArrayList<>(); - for (String bubble : bubbles()) { - if (bubble.startsWith(args.get(1))) - arrayList.add(bubble); - } - return arrayList; + return filterStartingWith(allBubbles(), args.get(1)); } - return super.onTabComplete(sender, args); + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceUnequipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceUnequipCommand.java index e157ddd..75319af 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceUnequipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesForceUnequipCommand.java @@ -1,64 +1,55 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; -import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class BubblesForceUnequipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new BubblesForceUnequipCommand(); + public static final AbstractSubCommand INSTANCE = new BubblesForceUnequipCommand(); public BubblesForceUnequipCommand() { - super("forceunequip", null); + super("forceunequip"); } - @Override public boolean onCommand(CommandSender sender, List args) { - - if (!sender.hasPermission("bubbles.forceunequip")) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); + if (lackArgs(sender, 1, args.size()) || playerNotOnline(sender, args.get(0))) return true; - } - - if (args.size() < 1){ - AdventureUtil.sendMessage(sender,MessageManager.prefix + MessageManager.lackArgs); - return true; - } - Player player = Bukkit.getPlayer(args.get(0)); - if (player == null) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.not_online.replace("{Player}",args.get(0))); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).setBubbles("none"); - CustomNameplates.plugin.getDataManager().saveData(player); - AdventureUtil.sendMessage(sender,MessageManager.prefix + MessageManager.bb_force_unEquip.replace("{Player}", args.get(0))); - }); - + CustomNameplatesAPI.getAPI().unEquipBubble(player); + AdventureUtils.sendMessage(sender,MessageManager.prefix + MessageManager.bb_force_unEquip.replace("{Player}", args.get(0))); return true; } @Override public List onTabComplete(CommandSender sender, List args) { if (args.size() == 1) { - List arrayList = new ArrayList<>(); - for (String player : online_players()) { - if (player.startsWith(args.get(0))) - arrayList.add(player); - } - return arrayList; + return filterStartingWith(online_players(), args.get(0)); } - return super.onTabComplete(sender, args); + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesListCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesListCommand.java index c73c364..319072b 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesListCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesListCommand.java @@ -1,48 +1,54 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; +import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; public class BubblesListCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new BubblesListCommand(); + public static final AbstractSubCommand INSTANCE = new BubblesListCommand(); public BubblesListCommand() { - super("list", null); + super("list"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender.hasPermission("bubbles.list"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); - return true; - } - - List availableBubbles = new ArrayList<>(); - getAvailableBubbles(player, availableBubbles); + if (noConsoleExecute(sender)) return true; + Player player = (Player) sender; + List availableBubbles = CustomNameplates.getInstance().getChatBubblesManager().getAvailableBubbles(player); if (availableBubbles.size() != 0) { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < availableBubbles.size(); i++) { - if (i != availableBubbles.size() - 1) stringBuilder.append(availableBubbles.get(i)).append(","); - else stringBuilder.append(availableBubbles.get(i)); + StringJoiner stringJoiner = new StringJoiner(", "); + for (String availableBubble : availableBubbles) { + stringJoiner.add(availableBubble); } - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.bb_available.replace("{Bubbles}", stringBuilder.toString())); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.bb_available.replace("{Bubbles}", stringJoiner.toString())); } else { - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.bb_haveNone); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.bb_haveNone); } return true; } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesUnequipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesUnequipCommand.java index cf39a1a..7723aa7 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesUnequipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/BubblesUnequipCommand.java @@ -1,11 +1,26 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; -import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -13,30 +28,18 @@ import java.util.List; public class BubblesUnequipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new BubblesUnequipCommand(); + public static final AbstractSubCommand INSTANCE = new BubblesUnequipCommand(); public BubblesUnequipCommand() { - super("unequip", null); + super("unequip"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); - return true; - } - if (!(sender.hasPermission("bubbles.unequip"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).setBubbles("none"); - CustomNameplates.plugin.getDataManager().saveData(player); - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.bb_unEquip); - }); - + if (noConsoleExecute(sender)) return true; + Player player = (Player) sender; + CustomNameplatesAPI.getAPI().unEquipBubble(player); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.bb_unEquip); return true; } -} +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/ForcePreviewCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/ForcePreviewCommand.java index 166e306..ebc14c0 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/ForcePreviewCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/ForcePreviewCommand.java @@ -1,78 +1,83 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; +import me.clip.placeholderapi.PlaceholderAPI; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; -import net.momirealms.customnameplates.manager.ConfigManager; import net.momirealms.customnameplates.manager.MessageManager; import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.objects.nameplates.NameplateConfig; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.HoloUtil; +import net.momirealms.customnameplates.object.nameplate.NameplateConfig; +import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.HoloUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class ForcePreviewCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new ForcePreviewCommand(); + public static final AbstractSubCommand INSTANCE = new ForcePreviewCommand(); public ForcePreviewCommand() { - super("forcepreview", null); + super("forcepreview"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!sender.hasPermission("nameplates.forcepreview")) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (args.size() < 1) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.lackArgs); - return true; - } - + if (lackArgs(sender, 1, args.size()) || playerNotOnline(sender, args.get(0))) return true; Player player = Bukkit.getPlayer(args.get(0)); - if (player == null) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.not_online.replace("{Player}",args.get(0))); - return true; - } - - long time = System.currentTimeMillis(); - if (time - (coolDown.getOrDefault(player, time - NameplateManager.preview * 1050)) < NameplateManager.preview * 1050) { - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.coolDown); - return true; - } - coolDown.put(player, time); - - if (NameplateManager.mode.equalsIgnoreCase("team")) { - if (args.size() < 2) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.lackArgs); + assert player != null; + NameplateManager nameplateManager = CustomNameplates.getInstance().getNameplateManager(); + if (nameplateManager.getMode() == DisplayMode.TEAM) { + String nameplate = args.size() >= 2 ? args.get(1) : nameplateManager.getEquippedNameplate(player); + NameplateConfig nameplateConfig = nameplateManager.getNameplateConfig(nameplate); + if (nameplateConfig == null) { + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.np_not_exist); return true; } - NameplateConfig nameplateConfig = CustomNameplates.plugin.getResourceManager().getNameplateConfig(args.get(1)); - if (nameplateConfig == null){ - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.np_not_exist); - return true; - } - String playerPrefix = NameplateManager.hidePrefix ? "" : AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, NameplateManager.player_prefix)); - String playerSuffix = NameplateManager.hideSuffix ? "" : AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, NameplateManager.player_suffix)); - Component prefix = Component.text(CustomNameplates.plugin.getNameplateManager().makeCustomNameplate(MiniMessage.miniMessage().stripTags(playerPrefix), args.get(0), MiniMessage.miniMessage().stripTags(playerSuffix), nameplateConfig)).font(ConfigManager.key).append(MiniMessage.miniMessage().deserialize(playerPrefix)); - Component suffix = MiniMessage.miniMessage().deserialize(playerSuffix).append(Component.text(CustomNameplates.plugin.getNameplateManager().getSuffixChar(MiniMessage.miniMessage().stripTags(playerPrefix) + args.get(0) + MiniMessage.miniMessage().stripTags(playerSuffix))).font(ConfigManager.key)); - Component full = prefix.append(Component.text(player.getName()).color(TextColor.color(color2decimal(nameplateConfig.color()))).font(Key.key("default")).append(suffix)); - HoloUtil.showHolo(full, player, (int) NameplateManager.preview); + String playerPrefix = AdventureUtils.replaceLegacy(PlaceholderAPI.setPlaceholders(player, nameplateManager.getPrefix())); + String playerSuffix = AdventureUtils.replaceLegacy(PlaceholderAPI.setPlaceholders(player, nameplateManager.getSuffix())); + String prefixImage = nameplateManager.getNameplatePrefix( + AdventureUtils.stripAllTags(playerPrefix), + player.getName(), + AdventureUtils.stripAllTags(playerSuffix), + nameplateConfig + ); + String suffixImage = nameplateManager.getNameplateSuffix(AdventureUtils.stripAllTags(playerPrefix) + player.getName() + AdventureUtils.stripAllTags(playerSuffix)); + Component holoComponent = MiniMessage.miniMessage().deserialize(prefixImage) + .append(Component.text(player.getName()).color(TextColor.color(AdventureUtils.colorToDecimal(nameplateConfig.color()))).font(Key.key("minecraft:default")) + .append(MiniMessage.miniMessage().deserialize(suffixImage))); + HoloUtils.showHolo(holoComponent, player, (int) nameplateManager.getPreview_time()); } else { - showPlayerArmorStandTags(player); + if (!nameplateManager.showPlayerArmorStandTags(player)) { + + } + else { + + } } return true; @@ -81,21 +86,11 @@ public class ForcePreviewCommand extends AbstractSubCommand { @Override public List onTabComplete(CommandSender sender, List args) { if (args.size() == 1) { - List arrayList = new ArrayList<>(); - for (String player : online_players()) { - if (player.startsWith(args.get(0))) - arrayList.add(player); - } - return arrayList; + return filterStartingWith(online_players(), args.get(0)); } - if (args.size() == 2 && NameplateManager.mode.equalsIgnoreCase("team")) { - List arrayList = new ArrayList<>(); - for (String string : nameplates()) { - if (string.startsWith(args.get(1))) - arrayList.add(string); - } - return arrayList; + if (args.size() == 2 && CustomNameplates.getInstance().getNameplateManager().getMode() == DisplayMode.TEAM) { + return filterStartingWith(allNameplates(), args.get(1)); } - return super.onTabComplete(sender, args); + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/HelpCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/HelpCommand.java index e4d4c55..a5d71e5 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/HelpCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/HelpCommand.java @@ -1,47 +1,58 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import java.util.List; public class HelpCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new HelpCommand(); + public static final AbstractSubCommand INSTANCE = new HelpCommand(); public HelpCommand() { - super("help", null); + super("help"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (sender instanceof Player player) { - if (player.hasPermission("nameplates.help")){ - AdventureUtil.playerMessage(player,"/nameplates help - show the command list"); - AdventureUtil.playerMessage(player,"/nameplates reload - reload the configuration"); - AdventureUtil.playerMessage(player,"/nameplates equip - equip a specified nameplate"); - AdventureUtil.playerMessage(player,"/nameplates forceequip - force a player to equip a specified nameplate"); - AdventureUtil.playerMessage(player,"/nameplates unequip - unequip your nameplate"); - AdventureUtil.playerMessage(player,"/nameplates forceunequip - force unequip a player's nameplate"); - AdventureUtil.playerMessage(player,"/nameplates preview - preview your nameplate"); - AdventureUtil.playerMessage(player,"/nameplates forcepreview - force a player to preview a nameplate"); - AdventureUtil.playerMessage(player,"/nameplates list - list your available nameplates"); - } - } - else { - AdventureUtil.consoleMessage("/nameplates help - show the command list"); - AdventureUtil.consoleMessage("/nameplates reload - reload the configuration"); - AdventureUtil.consoleMessage("/nameplates equip - equip a specified nameplate"); - AdventureUtil.consoleMessage("/nameplates forceequip - force a player to equip a specified nameplate"); - AdventureUtil.consoleMessage("/nameplates unequip - unequip your nameplate"); - AdventureUtil.consoleMessage("/nameplates forceunequip - force unequip a player's nameplate"); - AdventureUtil.consoleMessage("/nameplates preview - preview your nameplate"); - AdventureUtil.consoleMessage("/nameplates forcepreview - force a player to preview a nameplate"); - AdventureUtil.consoleMessage("/nameplates list - list your available nameplates"); - } + AdventureUtils.sendMessage(sender, "<#3CB371>Command usage:"); + AdventureUtils.sendMessage(sender, " ├─<#FFFACD> "); + AdventureUtils.sendMessage(sender, " └─<#FFFACD><#E1FFFF>[Optional Augument]"); + AdventureUtils.sendMessage(sender, "<#3CB371>/nameplates"); + AdventureUtils.sendMessage(sender, " ├─help"); + AdventureUtils.sendMessage(sender, " ├─about"); + AdventureUtils.sendMessage(sender, " ├─reload <#87CEFA>Reload the plugin"); + AdventureUtils.sendMessage(sender, " ├─list <#87CEFA>Show a list of available nameplates"); + AdventureUtils.sendMessage(sender, " ├─equip <#FFFACD><#87CEFA>Equip a nameplate"); + AdventureUtils.sendMessage(sender, " ├─forceequip <#FFFACD> <#87CEFA>Force a player to equip a nameplate"); + AdventureUtils.sendMessage(sender, " ├─unequip <#87CEFA>Unequip the current nameplate"); + AdventureUtils.sendMessage(sender, " ├─forceunequip <#FFFACD> <#87CEFA>Force a player to unequip his nameplate"); + AdventureUtils.sendMessage(sender, " ├─preview <#87CEFA>Preview your current nameplate"); + AdventureUtils.sendMessage(sender, " └─forcepreview <#87CEFA>Force a player to preview the nameplate"); + AdventureUtils.sendMessage(sender, "<#3CB371>/bubbles"); + AdventureUtils.sendMessage(sender, " ├─list <#87CEFA>Show a list of available bubbles"); + AdventureUtils.sendMessage(sender, " ├─equip <#FFFACD><#87CEFA>Equip a bubble"); + AdventureUtils.sendMessage(sender, " ├─forceequip <#FFFACD> <#87CEFA>Force a player to equip a bubble"); + AdventureUtils.sendMessage(sender, " ├─unequip <#87CEFA>Unequip the current bubble"); + AdventureUtils.sendMessage(sender, " └─forceunequip <#FFFACD> <#87CEFA>Force a player to unequip his bubble"); return true; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesEquipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesEquipCommand.java index fa919cb..1406796 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesEquipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesEquipCommand.java @@ -1,67 +1,58 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class NameplatesEquipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new NameplatesEquipCommand(); + public static final AbstractSubCommand INSTANCE = new NameplatesEquipCommand(); public NameplatesEquipCommand() { - super("equip", null); + super("equip"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); + if (noConsoleExecute(sender) || lackArgs(sender, 1, args.size()) || notExist(sender, "nameplate", args.get(0))) return true; + if (!sender.hasPermission("nameplates.equip." + args.get(0))) { + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.np_notAvailable); return true; } - if (args.size() < 1) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.lackArgs); - return true; - } - - if (sender.hasPermission("nameplates.equip." + args.get(0))) { - - if (CustomNameplates.plugin.getResourceManager().getNameplateConfig(args.get(0)) == null) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.np_not_exist); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).equipNameplate(args.get(0)); - CustomNameplates.plugin.getDataManager().saveData(player); - NameplatesTeam nameplatesTeam = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); - if (nameplatesTeam != null) nameplatesTeam.updateNameplates(); - CustomNameplates.plugin.getNameplateManager().getTeamManager().sendUpdateToAll(player, true); - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.np_equip.replace("{Nameplate}", CustomNameplates.plugin.getResourceManager().getNameplateConfig(args.get(0)).name())); - }); - - } - else { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.np_notAvailable); - } + Player player = (Player) sender; + CustomNameplatesAPI.getAPI().equipNameplate(player, args.get(0)); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.np_equip.replace("{Nameplate}", CustomNameplates.getInstance().getNameplateManager().getNameplateConfig(args.get(0)).display_name())); return true; } @Override public List onTabComplete(CommandSender sender, List args) { - List arrayList = new ArrayList<>(); - for (String cmd : availableNameplates(sender)) { - if (cmd.startsWith(args.get(0))) - arrayList.add(cmd); + if (args.size() == 1 && sender instanceof Player player) { + return filterStartingWith(CustomNameplates.getInstance().getNameplateManager().getAvailableNameplates(player), args.get(0)); } - return arrayList; + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceEquipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceEquipCommand.java index f20b874..81406f3 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceEquipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceEquipCommand.java @@ -1,79 +1,58 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class NameplatesForceEquipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new NameplatesForceEquipCommand(); + public static final AbstractSubCommand INSTANCE = new NameplatesForceEquipCommand(); public NameplatesForceEquipCommand() { - super("forceequip", null); + super("forceequip"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender.hasPermission("nameplates.forceequip"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (args.size() < 2){ - AdventureUtil.sendMessage(sender,MessageManager.prefix + MessageManager.lackArgs); - return true; - } - + if (lackArgs(sender, 2, args.size()) || playerNotOnline(sender, args.get(0)) || notExist(sender, "nameplate", args.get(1))) return true; Player player = Bukkit.getPlayer(args.get(0)); - if (player == null) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.not_online.replace("{Player}",args.get(0))); - return true; - } - if (CustomNameplates.plugin.getResourceManager().getNameplateConfig(args.get(1)) == null){ - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.np_not_exist); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - CustomNameplates.plugin.getDataManager().getPlayerData(player).equipNameplate(args.get(1)); - CustomNameplates.plugin.getDataManager().saveData(player); - NameplatesTeam nameplatesTeam = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); - if (nameplatesTeam != null) nameplatesTeam.updateNameplates(); - CustomNameplates.plugin.getNameplateManager().getTeamManager().sendUpdateToAll(player, true); - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.np_force_equip.replace("{Nameplate}", CustomNameplates.plugin.getResourceManager().getNameplateConfig(args.get(1)).name()).replace("{Player}", args.get(0))); - }); - + CustomNameplatesAPI.getAPI().equipNameplate(player, args.get(1)); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.np_force_equip.replace("{Nameplate}", CustomNameplates.getInstance().getNameplateManager().getNameplateConfig(args.get(1)).display_name()).replace("{Player}", args.get(0))); return true; } @Override public List onTabComplete(CommandSender sender, List args) { if (args.size() == 1) { - List arrayList = new ArrayList<>(); - for (String player : online_players()) { - if (player.startsWith(args.get(0))) - arrayList.add(player); - } - return arrayList; + return filterStartingWith(online_players(), args.get(0)); } if (args.size() == 2) { - List arrayList = new ArrayList<>(); - for (String nameplate : nameplates()) { - if (nameplate.startsWith(args.get(1))) - arrayList.add(nameplate); - } - return arrayList; + return filterStartingWith(allNameplates(), args.get(1)); } - return super.onTabComplete(sender, args); + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceUnequipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceUnequipCommand.java index 34abc46..0c8554b 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceUnequipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesForceUnequipCommand.java @@ -1,62 +1,55 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; -import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; public class NameplatesForceUnequipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new NameplatesForceUnequipCommand(); + public static final AbstractSubCommand INSTANCE = new NameplatesForceUnequipCommand(); public NameplatesForceUnequipCommand() { - super("forceunequip", null); + super("forceunequip"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender.hasPermission("nameplates.forceunequip"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (args.size() < 1){ - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.lackArgs); - return true; - } - + if (lackArgs(sender, 1, args.size()) || playerNotOnline(sender, args.get(0))) + return true; Player player = Bukkit.getPlayer(args.get(0)); - if (player == null) { - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.not_online.replace("{Player}",args.get(0))); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - super.unequipNameplate(player); - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.np_force_unEquip.replace("{Player}", args.get(0))); - }); - + CustomNameplatesAPI.getAPI().unEquipNameplate(player); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.np_force_unEquip.replace("{Player}", args.get(0))); return true; } @Override public List onTabComplete(CommandSender sender, List args) { if (args.size() == 1) { - List arrayList = new ArrayList<>(); - for (String player : online_players()) { - if (player.startsWith(args.get(0))) - arrayList.add(player); - } - return arrayList; + return filterStartingWith(online_players(), args.get(0)); } - return super.onTabComplete(sender, args); + return null; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesListCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesListCommand.java index 9071d79..1970d52 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesListCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesListCommand.java @@ -1,46 +1,54 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; +import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; public class NameplatesListCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new NameplatesListCommand(); + public static final AbstractSubCommand INSTANCE = new NameplatesListCommand(); public NameplatesListCommand() { - super("list", null); + super("list"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (!(sender.hasPermission("nameplates.list"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); - return true; - } - - List availableNameplates = new ArrayList<>(); - getAvailableNameplates(player, availableNameplates); + if (noConsoleExecute(sender)) return true; + Player player = (Player) sender; + List availableNameplates = CustomNameplates.getInstance().getNameplateManager().getAvailableNameplates(player); if (availableNameplates.size() != 0) { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < availableNameplates.size(); i++) { - if (i != availableNameplates.size() - 1) stringBuilder.append(availableNameplates.get(i)).append(","); - else stringBuilder.append(availableNameplates.get(i)); + StringJoiner stringJoiner = new StringJoiner(", "); + for (String availableNameplate : availableNameplates) { + stringJoiner.add(availableNameplate); } - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.np_available.replace("{Nameplates}", stringBuilder.toString())); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.np_available.replace("{Nameplates}", stringJoiner.toString())); } else { - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.np_haveNone); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.np_haveNone); } return true; } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesUnequipCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesUnequipCommand.java index 41d28d3..f6da358 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesUnequipCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/NameplatesUnequipCommand.java @@ -1,11 +1,26 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; -import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -13,29 +28,18 @@ import java.util.List; public class NameplatesUnequipCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new NameplatesUnequipCommand(); + public static final AbstractSubCommand INSTANCE = new NameplatesUnequipCommand(); public NameplatesUnequipCommand() { - super("unequip", null); + super("unequip"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender.hasPermission("nameplates.unequip"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); - return true; - } - - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - super.unequipNameplate(player); - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.np_unEquip); - }); - return super.onCommand(sender, args); + if (noConsoleExecute(sender)) return true; + Player player = (Player) sender; + CustomNameplatesAPI.getAPI().unEquipNameplate(player); + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.np_unEquip); + return true; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/PreviewCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/PreviewCommand.java index 581ce35..acecde2 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/PreviewCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/PreviewCommand.java @@ -1,3 +1,20 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; import net.kyori.adventure.key.Key; @@ -5,12 +22,12 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.HoloUtil; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.HoloUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -18,40 +35,29 @@ import java.util.List; public class PreviewCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new PreviewCommand(); + public static final AbstractSubCommand INSTANCE = new PreviewCommand(); public PreviewCommand() { - super("preview", null); + super("preview"); } @Override public boolean onCommand(CommandSender sender, List args) { - if (!(sender instanceof Player player)) { - AdventureUtil.consoleMessage(MessageManager.prefix + MessageManager.no_console); - return true; - } - if (!(sender.hasPermission("nameplates.preview"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - long time = System.currentTimeMillis(); - if (time - (coolDown.getOrDefault(player, time - NameplateManager.preview * 1050)) < NameplateManager.preview * 1050) { - AdventureUtil.playerMessage(player, MessageManager.prefix + MessageManager.coolDown); - return true; - } - coolDown.put(player, time); - - AdventureUtil.playerMessage(player, MessageManager.prefix +MessageManager.preview); - if (NameplateManager.mode.equalsIgnoreCase("team")) { - NameplatesTeam team = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); + if (noConsoleExecute(sender)) return true; + Player player = (Player) sender; + NameplateManager nameplateManager = CustomNameplates.getInstance().getNameplateManager(); + if (nameplateManager.getMode() == DisplayMode.TEAM) { + NameplatesTeam team = CustomNameplates.getInstance().getTeamManager().getNameplateTeam(player.getUniqueId()); if (team != null) { - Component full = team.getPrefix().append(Component.text(player.getName()).color(TextColor.color(color2decimal(team.getColor()))).font(Key.key("default")).append(team.getSuffix())); - HoloUtil.showHolo(full, player, (int) NameplateManager.preview); + Component full = team.getNameplatePrefixComponent() + .append(Component.text(player.getName()).color(TextColor.color(AdventureUtils.colorToDecimal(team.getColor()))).font(Key.key("minecraft:default")) + .append(team.getNameplateSuffixComponent())); + HoloUtils.showHolo(full, player, (int) nameplateManager.getPreview_time()); } } else { - showPlayerArmorStandTags(player); + nameplateManager.showPlayerArmorStandTags(player); } + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.preview); return true; } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/subcmd/ReloadCommand.java b/src/main/java/net/momirealms/customnameplates/commands/subcmd/ReloadCommand.java index 598d529..34c008d 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/subcmd/ReloadCommand.java +++ b/src/main/java/net/momirealms/customnameplates/commands/subcmd/ReloadCommand.java @@ -1,37 +1,43 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customnameplates.commands.subcmd; +import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.commands.AbstractSubCommand; -import net.momirealms.customnameplates.commands.SubCommand; import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import java.util.List; public class ReloadCommand extends AbstractSubCommand { - public static final SubCommand INSTANCE = new ReloadCommand(); + public static final AbstractSubCommand INSTANCE = new ReloadCommand(); private ReloadCommand() { - super("reload", null); + super("reload"); } @Override public boolean onCommand(CommandSender sender, List args) { - - if (!(sender.hasPermission("nameplates.reload"))) { - AdventureUtil.playerMessage((Player) sender, MessageManager.prefix + MessageManager.noPerm); - return true; - } - - if (args.size() < 1) { - long time1 = System.currentTimeMillis(); - ConfigUtil.reloadConfigs(); - AdventureUtil.sendMessage(sender, MessageManager.prefix + MessageManager.reload.replace("{time}", String.valueOf(System.currentTimeMillis() - time1))); - return true; - } - return super.onCommand(sender, args); + long time1 = System.currentTimeMillis(); + CustomNameplates.getInstance().reload(); + AdventureUtils.sendMessage(sender, MessageManager.prefix + MessageManager.reload.replace("{time}", String.valueOf(System.currentTimeMillis() - time1))); + return true; } } diff --git a/src/main/java/net/momirealms/customnameplates/data/DataStorageInterface.java b/src/main/java/net/momirealms/customnameplates/data/DataStorageInterface.java new file mode 100644 index 0000000..f4795f3 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/data/DataStorageInterface.java @@ -0,0 +1,11 @@ +package net.momirealms.customnameplates.data; + +import java.util.UUID; + +public interface DataStorageInterface { + void initialize(); + void disable(); + PlayerData loadData(UUID uuid); + void saveData(PlayerData playerData); + StorageType getStorageType(); +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/FileStorageImpl.java b/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java similarity index 51% rename from src/main/java/net/momirealms/customnameplates/objects/data/FileStorageImpl.java rename to src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java index dd0aaec..3829169 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/data/FileStorageImpl.java +++ b/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java @@ -15,36 +15,41 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.data; +package net.momirealms.customnameplates.data; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.utils.ConfigUtil; -import org.bukkit.OfflinePlayer; +import net.momirealms.customnameplates.manager.ConfigManager; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; +import java.util.UUID; public class FileStorageImpl implements DataStorageInterface { + private final CustomNameplates plugin; + + public FileStorageImpl(CustomNameplates plugin) { + this.plugin = plugin; + } + @Override public void initialize() { - + //empty } @Override public void disable() { - + //empty } @Override - public PlayerData loadData(OfflinePlayer player) { - YamlConfiguration data = ConfigUtil.readData(new File(CustomNameplates.plugin.getDataFolder(), "player_data" + File.separator + player.getUniqueId() + ".yml")); - String bubbles = data.getString("bubbles", ChatBubblesManager.defaultBubble); - String nameplate = data.getString("nameplate", NameplateManager.defaultNameplate); - PlayerData playerData = new PlayerData(player, nameplate, bubbles); + public PlayerData loadData(UUID uuid) { + YamlConfiguration data = ConfigUtils.readData(new File(plugin.getDataFolder(), "player_data" + File.separator + uuid + ".yml")); + String bubbles = data.getString("bubbles", ConfigManager.enableBubbles ? plugin.getChatBubblesManager().getDefaultBubble() : "none"); + String nameplate = data.getString("nameplate", ConfigManager.enableNameplates ? plugin.getNameplateManager().getDefault_nameplate() : "none"); + PlayerData playerData = new PlayerData(uuid, nameplate, bubbles); saveData(playerData); return playerData; } @@ -52,13 +57,18 @@ public class FileStorageImpl implements DataStorageInterface { @Override public void saveData(PlayerData playerData) { YamlConfiguration data = new YamlConfiguration(); - data.set("bubbles", playerData.getBubbles()); - data.set("nameplate", playerData.getEquippedNameplate()); + data.set("bubbles", playerData.getBubble()); + data.set("nameplate", playerData.getNameplate()); try { - data.save(new File(CustomNameplates.plugin.getDataFolder(), "player_data" + File.separator + playerData.getPlayer().getUniqueId() + ".yml")); + data.save(new File(plugin.getDataFolder(), "player_data" + File.separator + playerData.getUuid() + ".yml")); } catch (IOException e) { e.printStackTrace(); } } + + @Override + public StorageType getStorageType() { + return StorageType.YAML; + } } diff --git a/src/main/java/net/momirealms/customnameplates/data/MySQLStorageImpl.java b/src/main/java/net/momirealms/customnameplates/data/MySQLStorageImpl.java new file mode 100644 index 0000000..b150c79 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/data/MySQLStorageImpl.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.data; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.ConfigManager; +import net.momirealms.customnameplates.utils.AdventureUtils; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +public class MySQLStorageImpl implements DataStorageInterface { + + private final SqlConnection sqlConnection; + private final CustomNameplates plugin; + + public MySQLStorageImpl(CustomNameplates plugin) { + this.plugin = plugin; + this.sqlConnection = new SqlConnection(this); + } + + @Override + public void initialize() { + sqlConnection.createNewHikariConfiguration(); + createTableIfNotExist(sqlConnection.getTable()); + } + + @Override + public void disable() { + sqlConnection.close(); + } + + @Override + public PlayerData loadData(UUID uuid) { + PlayerData playerData = null; + String sql = String.format(SqlConstants.SQL_SELECT_BY_UUID, sqlConnection.getTable()); + try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, uuid.toString()); + ResultSet rs = statement.executeQuery(); + if (rs.next()) { + String nameplate = rs.getString(2); + String bubbles = rs.getString(3); + playerData = new PlayerData(uuid, nameplate, bubbles); + } + else { + playerData = new PlayerData(uuid, + ConfigManager.enableNameplates ? plugin.getNameplateManager().getDefault_nameplate() : "none", + ConfigManager.enableBubbles ? plugin.getChatBubblesManager().getDefaultBubble() : "none"); + insertData(uuid, playerData.getNameplate(), playerData.getBubble()); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return playerData; + } + + @Override + public void saveData(PlayerData playerData) { + String sql = String.format(SqlConstants.SQL_UPDATE_BY_UUID, sqlConnection.getTable()); + try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, playerData.getNameplate()); + statement.setString(2, playerData.getBubble()); + statement.setString(3, playerData.getUuid().toString()); + statement.executeUpdate(); + } catch (SQLException ex) { + AdventureUtils.consoleMessage("[CustomNameplates] Failed to update data for " + playerData.getUuid()); + } + } + + @Override + public StorageType getStorageType() { + return StorageType.SQL; + } + + private void createTableIfNotExist(String table) { + String sql = String.format(SqlConstants.SQL_CREATE_TABLE, table); + try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { + statement.executeUpdate(); + } catch (SQLException ex) { + AdventureUtils.consoleMessage("[CustomNameplates] Failed to create table"); + } + } + + private void insertData(UUID uuid, String nameplate, String bubbles) { + String sql = String.format(SqlConstants.SQL_INSERT, sqlConnection.getTable()); + try (Connection connection = sqlConnection.getConnectionAndCheck(); PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, uuid.toString()); + statement.setString(2, nameplate); + statement.setString(3, bubbles); + statement.executeUpdate(); + } catch (SQLException ex) { + AdventureUtils.consoleMessage("[CustomNameplates] Failed to insert data for " + uuid); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/PlayerData.java b/src/main/java/net/momirealms/customnameplates/data/PlayerData.java similarity index 50% rename from src/main/java/net/momirealms/customnameplates/objects/data/PlayerData.java rename to src/main/java/net/momirealms/customnameplates/data/PlayerData.java index cc79cf1..5d1f156 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/data/PlayerData.java +++ b/src/main/java/net/momirealms/customnameplates/data/PlayerData.java @@ -15,38 +15,40 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.data; +package net.momirealms.customnameplates.data; -import org.bukkit.OfflinePlayer; +import java.util.UUID; public class PlayerData { - private String equipped; - private String bubbles; - private final OfflinePlayer player; - public PlayerData(OfflinePlayer player, String equipped, String bubbles) { - this.equipped = equipped; - this.bubbles = bubbles; - this.player = player; + public static PlayerData EMPTY = new PlayerData(UUID.randomUUID(), "none", "none"); + private final UUID uuid; + private String nameplate; + private String bubble; + + public PlayerData(UUID uuid, String nameplate, String bubble) { + this.nameplate = nameplate; + this.bubble = bubble; + this.uuid = uuid; } - public String getEquippedNameplate() { - return this.equipped; + public String getNameplate() { + return this.nameplate; } - public void equipNameplate(String nameplate) { - this.equipped = nameplate.toLowerCase(); + public void setNameplate(String nameplate) { + this.nameplate = nameplate; } - public String getBubbles() { - return bubbles; + public String getBubble() { + return bubble; } - public void setBubbles(String bubbles) { - this.bubbles = bubbles; + public void setBubble(String bubble) { + this.bubble = bubble; } - public OfflinePlayer getPlayer() { - return player; + public UUID getUuid() { + return uuid; } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/SqlConnection.java b/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java similarity index 63% rename from src/main/java/net/momirealms/customnameplates/objects/data/SqlConnection.java rename to src/main/java/net/momirealms/customnameplates/data/SqlConnection.java index 4a781aa..2c097ef 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/data/SqlConnection.java +++ b/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.data; +package net.momirealms.customnameplates.data; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.pool.HikariPool; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import java.sql.Connection; @@ -32,11 +33,16 @@ public class SqlConnection { private boolean secondTry = false; private boolean firstTry = false; private HikariDataSource hikariDataSource; - private String table_name; + private String table; + private final MySQLStorageImpl mySQLStorage; + + public SqlConnection(MySQLStorageImpl mySQLStorage) { + this.mySQLStorage = mySQLStorage; + } public void createNewHikariConfiguration() { - - YamlConfiguration config = ConfigUtil.getConfig("database.yml"); + ConfigUtils.update("database.yml"); + YamlConfiguration config = ConfigUtils.getConfig("database.yml"); String storageMode = config.getString("data-storage-method", "MySQL"); HikariConfig hikariConfig = new HikariConfig(); @@ -45,7 +51,7 @@ public class SqlConnection { hikariConfig.setDriverClassName("org.mariadb.jdbc.Driver"); sql = "mariadb"; } - table_name = config.getString(storageMode + ".table"); + table = config.getString(storageMode + ".table"); hikariConfig.setPoolName("[CustomNameplates]"); hikariConfig.setJdbcUrl(String.format("jdbc:%s://%s/%s", sql, config.getString(storageMode + ".host") + ":" + config.getString(storageMode + ".port"), config.getString(storageMode + ".database"))); hikariConfig.setUsername(config.getString(storageMode + ".user")); @@ -53,32 +59,39 @@ public class SqlConnection { hikariConfig.setMaximumPoolSize(config.getInt(storageMode + ".Pool-Settings.maximum-pool-size")); hikariConfig.setMinimumIdle(config.getInt(storageMode + ".Pool-Settings.minimum-idle")); hikariConfig.setMaxLifetime(config.getInt(storageMode + ".Pool-Settings.maximum-lifetime")); - hikariConfig.setConnectionTimeout(5000); - for (String property : config.getConfigurationSection(storageMode + ".properties").getKeys(false)) { - hikariConfig.addDataSourceProperty(property, config.getString(storageMode + ".properties." + property)); - } - if (hikariConfig.getMinimumIdle() < hikariConfig.getMaximumPoolSize()) { - hikariConfig.setIdleTimeout(config.getInt(storageMode + ".Pool-Settings.idle-timeout")); - } else { - hikariConfig.setIdleTimeout(0); + hikariConfig.setConnectionTimeout(3000); + hikariConfig.setIdleTimeout(hikariConfig.getMinimumIdle() < hikariConfig.getMaximumPoolSize() ? config.getInt(storageMode + ".Pool-Settings.idle-timeout") : 0); + ConfigurationSection section = config.getConfigurationSection(storageMode + ".properties"); + if (section != null) { + for (String property : section.getKeys(false)) { + hikariConfig.addDataSourceProperty(property, config.getString(storageMode + ".properties." + property)); + } } try { hikariDataSource = new HikariDataSource(hikariConfig); } catch (HikariPool.PoolInitializationException e) { - AdventureUtil.consoleMessage("[CustomNameplates] Failed to create sql connection"); + AdventureUtils.consoleMessage("[CustomNameplates] Failed to create sql connection"); } - AdventureUtil.consoleMessage("[CustomNameplates] Storage Mode: " + storageMode); } public boolean setGlobalConnection() { - createNewHikariConfiguration(); - if (secondTry) { - AdventureUtil.consoleMessage("[CustomNameplates] Successfully reconnect to SQL!"); - } else { - secondTry = true; + try { + createNewHikariConfiguration(); + Connection connection = getConnection(); + connection.close(); + if (secondTry) { + AdventureUtils.consoleMessage("[CustomNameplates] Successfully reconnect to SQL!"); + } else { + secondTry = true; + } + return true; + } catch (SQLException e) { + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to connect to SQL!"); + e.printStackTrace(); + close(); + return false; } - return true; } public Connection getConnection() throws SQLException { @@ -101,10 +114,6 @@ public class SqlConnection { } } - public String getTable_name() { - return table_name; - } - public Connection getConnectionAndCheck() { if (!canConnect()) { return null; @@ -118,11 +127,15 @@ public class SqlConnection { return getConnectionAndCheck(); } else { firstTry = true; - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to connect to SQL!"); + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to connect to SQL!"); close(); e.printStackTrace(); return null; } } } + + public String getTable() { + return table; + } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/SqlConstants.java b/src/main/java/net/momirealms/customnameplates/data/SqlConstants.java similarity index 91% rename from src/main/java/net/momirealms/customnameplates/objects/data/SqlConstants.java rename to src/main/java/net/momirealms/customnameplates/data/SqlConstants.java index 6a238e7..ef1ca35 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/data/SqlConstants.java +++ b/src/main/java/net/momirealms/customnameplates/data/SqlConstants.java @@ -1,4 +1,4 @@ -package net.momirealms.customnameplates.objects.data; +package net.momirealms.customnameplates.data; public class SqlConstants { diff --git a/src/main/java/net/momirealms/customnameplates/data/StorageType.java b/src/main/java/net/momirealms/customnameplates/data/StorageType.java new file mode 100644 index 0000000..e878d16 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/data/StorageType.java @@ -0,0 +1,6 @@ +package net.momirealms.customnameplates.data; + +public enum StorageType { + SQL, + YAML +} diff --git a/src/main/java/net/momirealms/customnameplates/helper/LibraryLoader.java b/src/main/java/net/momirealms/customnameplates/helper/LibraryLoader.java index 9e95676..d974f59 100644 --- a/src/main/java/net/momirealms/customnameplates/helper/LibraryLoader.java +++ b/src/main/java/net/momirealms/customnameplates/helper/LibraryLoader.java @@ -37,6 +37,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Files; import java.util.Objects; +import java.util.StringJoiner; /** * Resolves {@link MavenLibrary} annotations for a class, and loads the dependency @@ -46,7 +47,7 @@ import java.util.Objects; public final class LibraryLoader { @SuppressWarnings("Guava") - private static final Supplier URL_INJECTOR = Suppliers.memoize(() -> URLClassLoaderAccess.create((URLClassLoader) CustomNameplates.plugin.getClass().getClassLoader())); + private static final Supplier URL_INJECTOR = Suppliers.memoize(() -> URLClassLoaderAccess.create((URLClassLoader) CustomNameplates.getInstance().getClass().getClassLoader())); /** * Resolves all {@link MavenLibrary} annotations on the given object. @@ -64,10 +65,6 @@ public final class LibraryLoader { */ public static void loadAll(Class clazz) { MavenLibrary[] libs = clazz.getDeclaredAnnotationsByType(MavenLibrary.class); - if (libs == null) { - return; - } - for (MavenLibrary lib : libs) { load(lib.groupId(), lib.artifactId(), lib.version(), lib.repo().url()); } @@ -78,7 +75,7 @@ public final class LibraryLoader { } public static void load(Dependency d) { - //Log.info(String.format("Loading dependency %s:%s:%s from %s", d.getGroupId(), d.getArtifactId(), d.getVersion(), d.getRepoUrl())); + //Log.info(String.startFormat("Loading dependency %s:%s:%s from %s", d.getGroupId(), d.getArtifactId(), d.getVersion(), d.getRepoUrl())); String name = d.getArtifactId() + "-" + d.getVersion(); File saveLocation = new File(getLibFolder(d), name + ".jar"); @@ -110,17 +107,17 @@ public final class LibraryLoader { } private static File getLibFolder(Dependency dependency) { - File pluginDataFolder = CustomNameplates.plugin.getDataFolder(); + File pluginDataFolder = CustomNameplates.getInstance().getDataFolder(); File serverDir = pluginDataFolder.getParentFile().getParentFile(); File helperDir = new File(serverDir, "libraries"); String[] split = StringUtils.split(dependency.getGroupId(), "."); File jarDir; - if (split.length > 1){ - jarDir = new File(helperDir, split[0] + File.separator + split[1] + File.separator + dependency.artifactId + File.separator + dependency.version ); - }else { - jarDir = new File(helperDir, dependency.getGroupId() + File.separator + dependency.artifactId + File.separator + dependency.version ); + StringJoiner stringJoiner = new StringJoiner(File.separator); + for (String str : split) { + stringJoiner.add(str); } + jarDir = new File(helperDir, stringJoiner + File.separator + dependency.artifactId + File.separator + dependency.version); jarDir.mkdirs(); return jarDir; } diff --git a/src/main/java/net/momirealms/customnameplates/helper/Log.java b/src/main/java/net/momirealms/customnameplates/helper/Log.java index 630843d..8210388 100644 --- a/src/main/java/net/momirealms/customnameplates/helper/Log.java +++ b/src/main/java/net/momirealms/customnameplates/helper/Log.java @@ -37,23 +37,23 @@ import java.util.logging.Level; public final class Log { public static void info(@Nonnull String s) { - CustomNameplates.plugin.getLogger().info(s); + CustomNameplates.getInstance().getLogger().info(s); } public static void warn(@Nonnull String s) { - CustomNameplates.plugin.getLogger().warning(s); + CustomNameplates.getInstance().getLogger().warning(s); } public static void severe(@Nonnull String s) { - CustomNameplates.plugin.getLogger().severe(s); + CustomNameplates.getInstance().getLogger().severe(s); } public static void warn(@Nonnull String s, Throwable t) { - CustomNameplates.plugin.getLogger().log(Level.WARNING, s, t); + CustomNameplates.getInstance().getLogger().log(Level.WARNING, s, t); } public static void severe(@Nonnull String s, Throwable t) { - CustomNameplates.plugin.getLogger().log(Level.SEVERE, s, t); + CustomNameplates.getInstance().getLogger().log(Level.SEVERE, s, t); } private Log() { diff --git a/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java b/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java index 53a9c12..43713f6 100644 --- a/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java +++ b/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java @@ -1,16 +1,33 @@ package net.momirealms.customnameplates.helper; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.ConfigManager; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.Bukkit; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; + public class VersionHelper { private boolean isNewerThan1_19_R2; - private String version; + private String serverVersion; + private final CustomNameplates plugin; + private final String pluginVersion; + private boolean isLatest; + + public VersionHelper(CustomNameplates plugin) { + this.plugin = plugin; + this.pluginVersion = plugin.getDescription().getVersion(); + } public boolean isVersionNewerThan1_19_R2() { - if (version == null) { - version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; - String[] split = version.split("_"); + if (serverVersion == null) { + this.serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + String[] split = serverVersion.split("_"); int main_ver = Integer.parseInt(split[1]); if (main_ver >= 20) isNewerThan1_19_R2 = true; else if (main_ver == 19) isNewerThan1_19_R2 = Integer.parseInt(split[2].substring(1)) >= 2; @@ -18,4 +35,93 @@ public class VersionHelper { } return isNewerThan1_19_R2; } + + public void checkUpdate() { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + try { + URL url = new URL("https://api.polymart.org/v1/getResourceInfoSimple/?resource_id=2543&key=version"); + URLConnection conn = url.openConnection(); + conn.setConnectTimeout(10000); + conn.setReadTimeout(60000); + InputStream inputStream = conn.getInputStream(); + String newest = new BufferedReader(new InputStreamReader(inputStream)).readLine(); + String current = plugin.getDescription().getVersion(); + inputStream.close(); + isLatest = !compareVer(newest, current); + if (isLatest) { + AdventureUtils.consoleMessage(ConfigManager.lang.equalsIgnoreCase("cn") ? "[CustomNameplates] 当前已是最新版本" : "[CustomNameplates] You are using the latest version."); + return; + } + + if (ConfigManager.lang.equalsIgnoreCase("cn")) { + AdventureUtils.consoleMessage("[CustomNameplates] 当前版本: " + current); + AdventureUtils.consoleMessage("[CustomNameplates] 最新版本: " + newest); + AdventureUtils.consoleMessage("[CustomNameplates] 请到 售后群https://polymart.org/resource/customnameplates.2543 获取最新版本."); + } + else { + AdventureUtils.consoleMessage("[CustomNameplates] Current version: " + current); + AdventureUtils.consoleMessage("[CustomNameplates] Latest version: " + newest); + AdventureUtils.consoleMessage("[CustomNameplates] Update is available: https://polymart.org/resource/customnameplates.2543"); + } + } catch (Exception exception) { + Log.warn("Error occurred when checking update"); + } + }); + } + + private boolean compareVer(String newV, String currentV) { + if (newV == null || currentV == null || newV.isEmpty() || currentV.isEmpty()) { + return false; + } + String[] newVS = newV.split("\\."); + String[] currentVS = currentV.split("\\."); + int maxL = Math.min(newVS.length, currentVS.length); + for (int i = 0; i < maxL; i++) { + try { + String[] newPart = newVS[i].split("-"); + String[] currentPart = currentVS[i].split("-"); + int newNum = Integer.parseInt(newPart[0]); + int currentNum = Integer.parseInt(currentPart[0]); + if (newNum > currentNum) { + return true; + } else if (newNum < currentNum) { + return false; + } else if (newPart.length > 1 && currentPart.length > 1) { + String[] newHotfix = newPart[1].split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); + String[] currentHotfix = currentPart[1].split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)"); + // hotfix2 & hotfix + if (newHotfix.length == 2 && currentHotfix.length == 1) return true; + // hotfix3 & hotfix2 + else if (newHotfix.length > 1 && currentHotfix.length > 1) { + int newHotfixNum = Integer.parseInt(newHotfix[1]); + int currentHotfixNum = Integer.parseInt(currentHotfix[1]); + if (newHotfixNum > currentHotfixNum) { + return true; + } else if (newHotfixNum < currentHotfixNum) { + return false; + } else { + return newHotfix[0].compareTo(currentHotfix[0]) > 0; + } + } + } else if (newPart.length > 1) { + return true; + } else if (currentPart.length > 1) { + return false; + } + } + catch (NumberFormatException ignored) { + return false; + } + } + // if common parts are the same, the longer is newer + return newVS.length > currentVS.length; + } + + public String getPluginVersion() { + return pluginVersion; + } + + public boolean isLatest() { + return isLatest; + } } diff --git a/src/main/java/net/momirealms/customnameplates/hook/NameplatePlaceholders.java b/src/main/java/net/momirealms/customnameplates/hook/NameplatePlaceholders.java deleted file mode 100644 index b4edd4f..0000000 --- a/src/main/java/net/momirealms/customnameplates/hook/NameplatePlaceholders.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.hook; - -import me.clip.placeholderapi.PlaceholderAPI; -import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.MessageManager; -import net.momirealms.customnameplates.manager.PlaceholderManager; -import net.momirealms.customnameplates.manager.ResourceManager; -import net.momirealms.customnameplates.objects.StaticText; -import net.momirealms.customnameplates.objects.background.BackGround; -import net.momirealms.customnameplates.objects.background.BackGroundText; -import net.momirealms.customnameplates.objects.font.FontUtil; -import net.momirealms.customnameplates.objects.nameplates.NameplateConfig; -import net.momirealms.customnameplates.objects.nameplates.NameplateText; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class NameplatePlaceholders extends PlaceholderExpansion { - - private final PlaceholderManager placeholderManager; - - public NameplatePlaceholders(PlaceholderManager placeholderManager) { - this.placeholderManager = placeholderManager; - } - - @Override - public @NotNull String getIdentifier() { - return "nameplates"; - } - - @Override - public @NotNull String getAuthor() { - return "XiaoMoMi"; - } - - @Override - public @NotNull String getVersion() { - return "1.2"; - } - - @Override - public boolean persist() { - return true; - } - - @Override - public String onPlaceholderRequest(Player player, String params) { - if (params.equals("equipped")){ - String nameplate = CustomNameplates.plugin.getDataManager().getPlayerData(player).getEquippedNameplate(); - if (!nameplate.equals("none")) return ResourceManager.NAMEPLATES.get(nameplate).name(); - return MessageManager.noNameplate; - } - if (params.equals("prefix")){ - NameplatesTeam nameplatesTeam = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); - if (nameplatesTeam != null) return nameplatesTeam.getPrefixText(); - return ""; - } - if (params.equals("suffix")){ - NameplatesTeam nameplatesTeam = CustomNameplates.plugin.getNameplateManager().getTeamManager().getNameplatesTeam(player); - if (nameplatesTeam != null) return nameplatesTeam.getSuffixText(); - return ""; - } - if (params.startsWith("bg_")){ - String bg = params.substring(3); - BackGroundText backGroundText = placeholderManager.getPapiBG().get(bg);; - if (backGroundText == null) return ""; - BackGround backGround = ResourceManager.BACKGROUNDS.get(backGroundText.getBackground()); - if (backGround == null) return ""; - String text = PlaceholderAPI.setPlaceholders(player, backGroundText.getText()); - return backGround.getBackGround(FontUtil.getTotalWidth(text)); - } - if (params.startsWith("static_")){ - String staticKey = params.substring(7); - StaticText staticText = placeholderManager.getPapiST().get(staticKey); - if (staticText == null) return ""; - String text = PlaceholderAPI.setPlaceholders(player, staticText.getText()); - int offset = staticText.getStaticValue() - FontUtil.getTotalWidth(text); - return FontUtil.getOffset(offset); - } - if (params.startsWith("npp_")){ - String np = params.substring(4); - NameplateText nameplateText = placeholderManager.getPapiNP().get(np); - if (nameplateText == null) return ""; - NameplateConfig nameplateConfig = ResourceManager.NAMEPLATES.get(nameplateText.getNameplate()); - if (nameplateConfig == null) return ""; - String text = placeholderManager.parsePlaceholders(player, nameplateText.getText()); - return CustomNameplates.plugin.getNameplateManager().makeCustomNameplate("", text,"", nameplateConfig); - } - if (params.startsWith("nps_")){ - String np = params.substring(4); - NameplateText nameplateText = placeholderManager.getPapiNP().get(np); - if (nameplateText == null) return ""; - NameplateConfig nameplateConfig = ResourceManager.NAMEPLATES.get(nameplateText.getNameplate()); - if (nameplateConfig == null) return ""; - String text = placeholderManager.parsePlaceholders(player, nameplateText.getText()); - return CustomNameplates.plugin.getNameplateManager().getSuffixChar(text); - } - return null; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/hook/OffsetPlaceholders.java b/src/main/java/net/momirealms/customnameplates/hook/OffsetPlaceholders.java deleted file mode 100644 index 8c36d30..0000000 --- a/src/main/java/net/momirealms/customnameplates/hook/OffsetPlaceholders.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.hook; - -import me.clip.placeholderapi.expansion.PlaceholderExpansion; -import net.momirealms.customnameplates.objects.font.FontUtil; -import org.bukkit.OfflinePlayer; -import org.jetbrains.annotations.NotNull; - -public class OffsetPlaceholders extends PlaceholderExpansion { - - @Override - public @NotNull String getIdentifier() { - return "offset"; - } - - @Override - public @NotNull String getAuthor() { - return "XiaoMoMi"; - } - - @Override - public @NotNull String getVersion() { - return "1.0"; - } - - @Override - public boolean persist() { - return true; - } - - @Override - public String onRequest(OfflinePlayer player, @NotNull String params) { - try { - int offset = Integer.parseInt(params); - return FontUtil.getOffset(offset); - } catch (NumberFormatException ignored) { - return ""; - } - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/listener/AbstractChatListener.java b/src/main/java/net/momirealms/customnameplates/listener/AbstractChatListener.java new file mode 100644 index 0000000..44c6a2e --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/listener/AbstractChatListener.java @@ -0,0 +1,13 @@ +package net.momirealms.customnameplates.listener; + +import net.momirealms.customnameplates.manager.ChatBubblesManager; +import org.bukkit.event.Listener; + +public abstract class AbstractChatListener implements Listener { + + protected ChatBubblesManager chatBubblesManager; + + public AbstractChatListener(ChatBubblesManager chatBubblesManager) { + this.chatBubblesManager = chatBubblesManager; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/listener/ChatListener.java b/src/main/java/net/momirealms/customnameplates/listener/AsyncChatListener.java similarity index 64% rename from src/main/java/net/momirealms/customnameplates/listener/ChatListener.java rename to src/main/java/net/momirealms/customnameplates/listener/AsyncChatListener.java index 014be12..152d172 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/ChatListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/AsyncChatListener.java @@ -17,29 +17,21 @@ package net.momirealms.customnameplates.listener; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.manager.ChatBubblesManager; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; -public class ChatListener implements Listener { +public class AsyncChatListener extends AbstractChatListener { - private final ChatBubblesManager chatBubblesManager; - - public ChatListener(ChatBubblesManager chatBubblesManager) { - this.chatBubblesManager = chatBubblesManager; + public AsyncChatListener(ChatBubblesManager chatBubblesManager) { + super(chatBubblesManager); } @EventHandler public void onChat(AsyncPlayerChatEvent event) { - if (!event.isCancelled()) { - Bukkit.getScheduler().runTask(CustomNameplates.plugin, () -> { - chatBubblesManager.onChat(event.getPlayer(), ChatColor.stripColor(event.getMessage())); - }); - } + if (event.isCancelled()) return; + Bukkit.getScheduler().runTask(CustomNameplates.getInstance(), () -> chatBubblesManager.onChat(event.getPlayer(), event.getMessage())); } -} +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java b/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java index a8f2b0a..cfa4bd6 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java @@ -17,7 +17,7 @@ package net.momirealms.customnameplates.listener; -import net.momirealms.customnameplates.objects.nameplates.mode.EntityTag; +import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerRespawnEvent; diff --git a/src/main/java/net/momirealms/customnameplates/listener/SimpleListener.java b/src/main/java/net/momirealms/customnameplates/listener/JoinQuitListener.java similarity index 89% rename from src/main/java/net/momirealms/customnameplates/listener/SimpleListener.java rename to src/main/java/net/momirealms/customnameplates/listener/JoinQuitListener.java index 66abd83..c24ebd9 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/SimpleListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/JoinQuitListener.java @@ -17,13 +17,13 @@ package net.momirealms.customnameplates.listener; -import net.momirealms.customnameplates.objects.Function; +import net.momirealms.customnameplates.object.Function; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -public record SimpleListener(Function function) implements Listener { +public record JoinQuitListener(Function function) implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { @@ -34,5 +34,4 @@ public record SimpleListener(Function function) implements Listener { public void onQuit(PlayerQuitEvent event) { function.onQuit(event.getPlayer()); } - } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/listener/ProxyDataListener.java b/src/main/java/net/momirealms/customnameplates/listener/ProxyDataListener.java deleted file mode 100644 index b934b66..0000000 --- a/src/main/java/net/momirealms/customnameplates/listener/ProxyDataListener.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.listener; - -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteStreams; -import net.momirealms.customnameplates.objects.team.TABbcHook; -import org.bukkit.entity.Player; -import org.bukkit.plugin.messaging.PluginMessageListener; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -public class ProxyDataListener implements PluginMessageListener { - - private final TABbcHook taBbcHook; - - public ProxyDataListener(TABbcHook taBbcHook) { - this.taBbcHook = taBbcHook; - } - - @Override - public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) { - if (!Objects.equals("customnameplates:cnp", channel)) { - return; - } - ByteArrayDataInput dataInput = ByteStreams.newDataInput(message); - String playerName = dataInput.readUTF(); - String teamName = dataInput.readUTF(); - taBbcHook.addPlayerToCache(playerName, teamName); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/listener/TrChatListener.java b/src/main/java/net/momirealms/customnameplates/listener/TrChatListener.java index e3d6a9f..e10c1e6 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/TrChatListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/TrChatListener.java @@ -21,22 +21,21 @@ import me.arasple.mc.trchat.api.event.TrChatEvent; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.manager.ChatBubblesManager; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -public record TrChatListener(ChatBubblesManager chatBubblesManager) implements Listener { +public class TrChatListener extends AbstractChatListener { + + public TrChatListener(ChatBubblesManager chatBubblesManager) { + super(chatBubblesManager); + } @EventHandler public void onTrChat(TrChatEvent event) { - if (event.isCancelled()) return; - if (!event.getForward()) return; + if (event.isCancelled() || !event.getForward()) return; String channelName = event.getChannel().getId(); - for (String channel : ChatBubblesManager.channels) { + for (String channel : chatBubblesManager.getChannels()) { if (channelName.equals(channel)) return; } - Bukkit.getScheduler().runTask(CustomNameplates.plugin, () -> { - chatBubblesManager.onChat(event.getSession().getPlayer(), ChatColor.stripColor(event.getMessage())); - }); + Bukkit.getScheduler().runTask(CustomNameplates.getInstance(), () -> chatBubblesManager.onChat(event.getSession().getPlayer(), event.getMessage())); } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/listener/VentureChatListener.java b/src/main/java/net/momirealms/customnameplates/listener/VentureChatListener.java index bf586e0..29a1d46 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/VentureChatListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/VentureChatListener.java @@ -4,26 +4,20 @@ import mineverse.Aust1n46.chat.api.events.VentureChatEvent; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.manager.ChatBubblesManager; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -public class VentureChatListener implements Listener { - - private final ChatBubblesManager chatBubblesManager; +public class VentureChatListener extends AbstractChatListener { public VentureChatListener(ChatBubblesManager chatBubblesManager) { - this.chatBubblesManager = chatBubblesManager; + super(chatBubblesManager); } @EventHandler public void onVentureChat(VentureChatEvent event) { String channelName = event.getChannel().getName(); - for (String channel : ChatBubblesManager.channels) { + for (String channel : chatBubblesManager.getChannels()) { if (channelName.equals(channel)) return; } - Bukkit.getScheduler().runTask(CustomNameplates.plugin, () -> { - chatBubblesManager.onChat(event.getMineverseChatPlayer().getPlayer(), ChatColor.stripColor(event.getChat()).substring(1)); - }); + Bukkit.getScheduler().runTask(CustomNameplates.getInstance(), () -> chatBubblesManager.onChat(event.getMineverseChatPlayer().getPlayer(), event.getChat().substring(1))); } } diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java index 6f19849..8045a45 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java @@ -23,14 +23,14 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; public class EntityDestroyListener extends PacketAdapter { private final PacketsHandler handler; public EntityDestroyListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_DESTROY); + super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_DESTROY); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java index 00438a8..475cf13 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java @@ -23,14 +23,14 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; public class EntityLookListener extends PacketAdapter { private final PacketsHandler handler; public EntityLookListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); + super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMountListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMountListener.java deleted file mode 100644 index d5118ee..0000000 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMountListener.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.listener.packet; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.ListenerPriority; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketEvent; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; - -public class EntityMountListener extends PacketAdapter { - - private final PacketsHandler handler; - - public EntityMountListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.MOUNT); - this.handler = handler; - } - - public void onPacketSending(PacketEvent event) { - handler.onEntityMount(event.getPacket()); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java index d6a934a..20a6676 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java @@ -23,14 +23,14 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; public class EntityMoveListener extends PacketAdapter { private final PacketsHandler handler; public EntityMoveListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.NORMAL, PacketType.Play.Server.REL_ENTITY_MOVE); + super(CustomNameplates.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.REL_ENTITY_MOVE); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java index c33eacb..c8f8c03 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java @@ -22,14 +22,14 @@ import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; public class EntitySpawnListener extends PacketAdapter { private final PacketsHandler handler; public EntitySpawnListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.NAMED_ENTITY_SPAWN); + super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.NAMED_ENTITY_SPAWN); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java index 4edf0c7..2df3cea 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java @@ -23,14 +23,14 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; public class EntityTeleportListener extends PacketAdapter { private final PacketsHandler handler; public EntityTeleportListener(PacketsHandler handler) { - super(CustomNameplates.plugin, ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_TELEPORT); + super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_TELEPORT); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/manager/ActionBarManager.java b/src/main/java/net/momirealms/customnameplates/manager/ActionBarManager.java index 2b0cea0..d77e0bc 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ActionBarManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ActionBarManager.java @@ -17,83 +17,81 @@ package net.momirealms.customnameplates.manager; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.actionbar.ActionBarConfig; -import net.momirealms.customnameplates.objects.actionbar.ActionBarTask; -import net.momirealms.customnameplates.objects.requirements.*; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.listener.JoinQuitListener; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.actionbar.ActionBarConfig; +import net.momirealms.customnameplates.object.actionbar.ActionBarTask; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; +import java.io.File; +import java.util.LinkedHashMap; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class ActionBarManager extends Function { - private final HashSet tasks; - public HashMap actionBars; + private final LinkedHashMap actionBarConfigMap; + private final ConcurrentHashMap actionBarTaskMap; + private final JoinQuitListener joinQuitListener; + private final CustomNameplates plugin; - public ActionBarManager() { - this.tasks = new HashSet<>(); - this.actionBars = new HashMap<>(); + public ActionBarManager(CustomNameplates plugin) { + this.plugin = plugin; + this.actionBarConfigMap = new LinkedHashMap<>(); + this.actionBarTaskMap = new ConcurrentHashMap<>(); + this.joinQuitListener = new JoinQuitListener(this); } @Override public void load() { - if (!ConfigUtil.isModuleEnabled("actionbar")) return; - loadConfig(); - for (ActionBarConfig config : actionBars.values()) { - tasks.add(new ActionBarTask(config)); + if (!ConfigManager.enableActionBar) return; + this.loadConfig(); + Bukkit.getPluginManager().registerEvents(joinQuitListener, plugin); + for (Player player : Bukkit.getOnlinePlayers()) { + onJoin(player); } } @Override public void unload() { - for (ActionBarTask task : tasks) { - task.stop(); + for (ActionBarTask actionBarTask : actionBarTaskMap.values()) { + actionBarTask.stop(); } - tasks.clear(); + actionBarConfigMap.clear(); + HandlerList.unregisterAll(joinQuitListener); + } + + @Override + public void onJoin(Player player) { + ActionBarTask actionBarTask = new ActionBarTask(player, actionBarConfigMap.values().toArray(new ActionBarConfig[0])); + actionBarTaskMap.put(player.getUniqueId(), actionBarTask); + actionBarTask.start(); + } + + @Override + public void onQuit(Player player) { + ActionBarTask actionBarTask = actionBarTaskMap.remove(player.getUniqueId()); + if (actionBarTask != null) actionBarTask.stop(); } private void loadConfig() { - actionBars.clear(); - YamlConfiguration config = ConfigUtil.getConfig("actionbar.yml"); - if (config.contains("actionbar")) { - for (String key : config.getConfigurationSection("actionbar").getKeys(false)) { - String[] texts; - String text = config.getString("actionbar." + key + ".text"); - if (text != null) { - texts = new String[]{text}; - } - else { - List strings = config.getStringList("actionbar." + key + ".dynamic-text"); - texts = strings.toArray(new String[0]); - } - List requirements = new ArrayList<>(); - if (config.contains("actionbar." + key + ".conditions")){ - config.getConfigurationSection("actionbar." + key + ".conditions").getKeys(false).forEach(requirement -> { - switch (requirement){ - case "weather" -> requirements.add(new Weather(config.getStringList("actionbar." + key + ".conditions.weather"))); - case "ypos" -> requirements.add(new YPos(config.getStringList("actionbar." + key + ".conditions.ypos"))); - case "world" -> requirements.add(new World(config.getStringList("actionbar." + key + ".conditions.world"))); - case "biome" -> requirements.add(new Biome(config.getStringList("actionbar." + key + ".conditions.biome"))); - case "permission" -> requirements.add(new Permission(config.getString("actionbar." + key + ".conditions.permission"))); - case "time" -> requirements.add(new Time(config.getStringList("actionbar." + key + ".conditions.time"))); - case "papi-condition" -> requirements.add(new CustomPapi(config.getConfigurationSection("actionbar." + key + ".conditions.papi-condition").getValues(false))); - } - }); - } - ActionBarConfig actionBarConfig = new ActionBarConfig( - config.getInt("actionbar." + key + ".refresh-rate", 5) - 1, - config.getInt("actionbar." + key + ".switch-interval", 15) * 20, - texts, - requirements - ); - actionBars.put(key, actionBarConfig); - } - AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + actionBars.size() + " actionbars"); + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "actionbar.yml"); + for (String key : config.getKeys(false)) { + ConfigurationSection actionBarSection = config.getConfigurationSection(key); + if (actionBarSection == null) continue; + actionBarConfigMap.put(key, new ActionBarConfig( + actionBarSection.getInt("switch-interval", 15) * 20, + actionBarSection.getString("text") == null ? actionBarSection.getStringList("dynamic-text").toArray(new String[0]) : new String[]{actionBarSection.getString("text")}, + ConfigUtils.getRequirements(actionBarSection.getConfigurationSection("conditions")) + )); } + AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + actionBarConfigMap.size() + " actionbars"); } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/BackgroundManager.java b/src/main/java/net/momirealms/customnameplates/manager/BackgroundManager.java new file mode 100644 index 0000000..fdb5fc8 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/manager/BackgroundManager.java @@ -0,0 +1,145 @@ +package net.momirealms.customnameplates.manager; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.background.BackGroundConfig; +import net.momirealms.customnameplates.object.font.OffsetFont; +import net.momirealms.customnameplates.placeholders.BackGroundText; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.HashMap; + +public class BackgroundManager extends Function { + + private final CustomNameplates plugin; + private final HashMap backGroundConfigMap; + + public BackgroundManager(CustomNameplates plugin) { + this.plugin = plugin; + this.backGroundConfigMap = new HashMap<>(); + } + + @Override + public void load() { + if (!ConfigManager.enableBackground) return; + loadConfig(); + } + + @Override + public void unload() { + this.backGroundConfigMap.clear(); + } + + private void loadConfig() { + File bg_file = new File(plugin.getDataFolder(),"contents" + File.separator + "backgrounds"); + if (!bg_file.exists() && bg_file.mkdirs()) { + saveDefaultBackgrounds(); + } + File[] bg_config_files = bg_file.listFiles(file -> file.getName().endsWith(".yml")); + if (bg_config_files == null) return; + for (File bg_config_file : bg_config_files) { + String key = bg_config_file.getName().substring(0, bg_config_file.getName().length() - 4); + YamlConfiguration config = YamlConfiguration.loadConfiguration(bg_config_file); + char oStart = ConfigManager.start_char; + char o1 = (char) (oStart + '\u0001'); char o2 = (char) (o1 + '\u0001'); + char o4 = (char) (o2 + '\u0001'); char o8 = (char) (o4 + '\u0001'); + char o16 = (char) (o8 + '\u0001'); char o32 = (char) (o16 + '\u0001'); + char o64 = (char) (o32 + '\u0001'); char o128 = (char) (o64 + '\u0001'); + char oEnd = (char) (o128 + '\u0001'); ConfigManager.start_char = (char) (oEnd + '\u0001'); + int height = config.getInt("middle.height", 14); + int ascent = config.getInt("middle.ascent", 8); + SimpleChar startChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"),1 ,oStart, config.getString("left.image") + ".png"); + SimpleChar offset_1 = new SimpleChar(height, ascent,1, o1, config.getString("middle.1") + ".png"); + SimpleChar offset_2 = new SimpleChar(height, ascent,1, o2, config.getString("middle.2") + ".png"); + SimpleChar offset_4 = new SimpleChar(height, ascent,1, o4, config.getString("middle.4") + ".png"); + SimpleChar offset_8 = new SimpleChar(height, ascent,1, o8, config.getString("middle.8") + ".png"); + SimpleChar offset_16 = new SimpleChar(height, ascent,1, o16, config.getString("middle.16") + ".png"); + SimpleChar offset_32 = new SimpleChar(height, ascent,1, o32, config.getString("middle.32") + ".png"); + SimpleChar offset_64 = new SimpleChar(height, ascent,1, o64, config.getString("middle.64") + ".png"); + SimpleChar offset_128 = new SimpleChar(height, ascent,1, o128, config.getString("middle.128") + ".png"); + SimpleChar endChar = new SimpleChar(config.getInt("right.height"),config.getInt("right.ascent"),1, oEnd, config.getString("right.image") + ".png"); + backGroundConfigMap.put(key, new BackGroundConfig(startChar, offset_1, + offset_2, offset_4, + offset_8, offset_16, + offset_32, offset_64, + offset_128, endChar, + config.getInt("left-margin", 1), config.getInt("right-margin", 1))) + ; + } + AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + backGroundConfigMap.size() + " backgrounds"); + } + + public HashMap getBackGroundConfigMap() { + return backGroundConfigMap; + } + + public String getBackGroundImage(BackGroundText backGroundText, String text) { + BackGroundConfig backGroundConfig = backGroundConfigMap.get(backGroundText.background()); + if (backGroundConfig == null) return backGroundText.background() + " NOT FOUND"; + return getBackGroundImage(backGroundConfig, text); + } + + public String getBackGroundImage(BackGroundConfig backGroundConfig, String text) { + int n = plugin.getFontManager().getTotalWidth(text); + String offset = plugin.getFontManager().getShortestNegChars(n + backGroundConfig.right_margin() + 2); + n = n + backGroundConfig.left_margin() + backGroundConfig.right_margin() + 2; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(backGroundConfig.left().getChars()); + while (n >= 128) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_128().getChars()); + n -= 128; + } + if (n - 64 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_64().getChars()); + n -= 64; + } + if (n - 32 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_32().getChars()); + n -= 32; + } + if (n - 16 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_16().getChars()); + n -= 16; + } + if (n - 8 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_8().getChars()); + n -= 8; + } + if (n - 4 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_4().getChars()); + n -= 4; + } + if (n - 2 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_2().getChars()); + n -= 2; + } + if (n - 1 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.offset_1().getChars()); + } + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + stringBuilder.append(backGroundConfig.right().getChars()).append(offset); + return stringBuilder.toString(); + } + + private void saveDefaultBackgrounds() { + String[] bg_list = new String[]{"b0", "b1", "b2", "b4", "b8", "b16","b32","b64","b128"}; + for (String bg : bg_list) { + plugin.saveResource("contents" + File.separator + "backgrounds" + File.separator + bg + ".png", false); + } + String[] config_list = new String[]{"bedrock_1", "bedrock_2", "bedrock_3"}; + for (String config : config_list) { + plugin.saveResource("contents" + File.separator + "backgrounds" + File.separator + config + ".yml", false); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java b/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java index 871e4e4..80d750f 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java @@ -18,102 +18,84 @@ package net.momirealms.customnameplates.manager; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.SimpleListener; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.bossbar.BossBarConfig; -import net.momirealms.customnameplates.objects.bossbar.Overlay; -import net.momirealms.customnameplates.objects.bossbar.TimerTaskP; -import net.momirealms.customnameplates.objects.requirements.*; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.listener.JoinQuitListener; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.bossbar.BossBarConfig; +import net.momirealms.customnameplates.object.bossbar.BossBarTask; +import net.momirealms.customnameplates.object.bossbar.Overlay; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; import org.bukkit.boss.BarColor; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import java.util.*; +import java.io.File; +import java.util.LinkedHashMap; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class BossBarManager extends Function { - private final SimpleListener simpleListener; private final LinkedHashMap bossBars; - private final HashMap taskCache; + private final ConcurrentHashMap bossBarTaskMap; + private final JoinQuitListener joinQuitListener; + private final CustomNameplates plugin; - public BossBarManager() { - this.simpleListener = new SimpleListener(this); - this.taskCache = new HashMap<>(); + public BossBarManager(CustomNameplates plugin) { + this.plugin = plugin; + this.joinQuitListener = new JoinQuitListener(this); + this.bossBarTaskMap = new ConcurrentHashMap<>(); this.bossBars = new LinkedHashMap<>(); } @Override public void load() { - if (!ConfigUtil.isModuleEnabled("bossbar")) return; - loadConfig(); + if (!ConfigManager.enableBossBar) return; + this.loadConfig(); + Bukkit.getPluginManager().registerEvents(joinQuitListener, plugin); for (Player player : Bukkit.getOnlinePlayers()) { - taskCache.put(player, new TimerTaskP(player)); + onJoin(player); } - Bukkit.getPluginManager().registerEvents(simpleListener, CustomNameplates.plugin); } @Override public void unload() { - for (TimerTaskP timerTask : taskCache.values()) { - timerTask.stopTimer(); + for (BossBarTask bossBarTask : bossBarTaskMap.values()) { + bossBarTask.stop(); } - taskCache.clear(); - HandlerList.unregisterAll(simpleListener); + bossBarTaskMap.clear(); + HandlerList.unregisterAll(joinQuitListener); } public void onJoin(Player player) { - taskCache.put(player, new TimerTaskP(player)); + BossBarTask bossBarTask = new BossBarTask(player, bossBars.values().toArray(new BossBarConfig[0])); + bossBarTaskMap.put(player.getUniqueId(), bossBarTask); + bossBarTask.start(); } public void onQuit(Player player) { - TimerTaskP timerTask = taskCache.remove(player); - if (timerTask != null){ - timerTask.stopTimer(); - } + BossBarTask bossBarTask = bossBarTaskMap.remove(player.getUniqueId()); + if (bossBarTask != null) bossBarTask.stop(); } private void loadConfig() { bossBars.clear(); - YamlConfiguration config = ConfigUtil.getConfig("bossbar.yml"); - config.getConfigurationSection("bossbar").getKeys(false).forEach(key -> { - String[] texts; - String text = config.getString("bossbar." + key + ".text"); - if (text != null) { - texts = new String[]{text}; - } - else { - List strings = config.getStringList("bossbar." + key + ".dynamic-text"); - texts = strings.toArray(new String[0]); - } - List requirements = new ArrayList<>(); - if (config.contains("bossbar." + key + ".conditions")){ - config.getConfigurationSection("bossbar." + key + ".conditions").getKeys(false).forEach(requirement -> { - switch (requirement){ - case "weather" -> requirements.add(new Weather(config.getStringList("bossbar." + key + ".conditions.weather"))); - case "ypos" -> requirements.add(new YPos(config.getStringList("bossbar." + key + ".conditions.ypos"))); - case "world" -> requirements.add(new World(config.getStringList("bossbar." + key + ".conditions.world"))); - case "biome" -> requirements.add(new Biome(config.getStringList("bossbar." + key + ".conditions.biome"))); - case "permission" -> requirements.add(new Permission(config.getString("bossbar." + key + ".conditions.permission"))); - case "time" -> requirements.add(new Time(config.getStringList("bossbar." + key + ".conditions.time"))); - case "papi-condition" -> requirements.add(new CustomPapi(config.getConfigurationSection("bossbar." + key + ".conditions.papi-condition").getValues(false))); - } - }); - } - BossBarConfig bossBarConfig = new BossBarConfig( - texts, - Overlay.valueOf(config.getString("bossbar."+key+".overlay","progress").toUpperCase()), - BarColor.valueOf(config.getString("bossbar."+key+".color","white").toUpperCase()), - config.getInt("bossbar." + key + ".refresh-rate", 15) - 1, - config.getInt("bossbar." + key + ".switch-interval", 5) * 20, - requirements - ); - bossBars.put(key, bossBarConfig); - }); - AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + bossBars.size() + " bossbars"); + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "bossbar.yml"); + for (String key : config.getKeys(false)) { + ConfigurationSection bossBarSection = config.getConfigurationSection(key); + if (bossBarSection == null) continue; + bossBars.put(key, new BossBarConfig( + bossBarSection.getString("text") == null ? bossBarSection.getStringList("dynamic-text").toArray(new String[0]) : new String[]{bossBarSection.getString("text")}, + Overlay.valueOf(bossBarSection.getString("overlay","progress").toUpperCase()), + BarColor.valueOf(bossBarSection.getString("color","white").toUpperCase()), + bossBarSection.getInt("switch-interval", 5) * 20, + ConfigUtils.getRequirements(bossBarSection.getConfigurationSection("conditions")) + )); + } + AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + bossBars.size() + " bossbars"); } public LinkedHashMap getBossBars() { diff --git a/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java b/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java index b416f58..48e2023 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java @@ -17,193 +17,321 @@ package net.momirealms.customnameplates.manager; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; +import me.clip.placeholderapi.PlaceholderAPI; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.api.events.BubblesEvent; -import net.momirealms.customnameplates.hook.IAImageHook; -import net.momirealms.customnameplates.hook.ImageParser; -import net.momirealms.customnameplates.hook.OXImageHook; -import net.momirealms.customnameplates.listener.ChatListener; +import net.momirealms.customnameplates.listener.AbstractChatListener; +import net.momirealms.customnameplates.listener.AsyncChatListener; import net.momirealms.customnameplates.listener.TrChatListener; import net.momirealms.customnameplates.listener.VentureChatListener; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.BubbleConfig; -import net.momirealms.customnameplates.objects.nameplates.FakeArmorStand; -import net.momirealms.customnameplates.objects.nameplates.mode.EntityTag; -import net.momirealms.customnameplates.objects.nameplates.mode.bubbles.BBPacketsHandle; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; +import net.momirealms.customnameplates.object.armorstand.FakeArmorStand; +import net.momirealms.customnameplates.object.bubble.BBPacketsHandle; +import net.momirealms.customnameplates.object.bubble.BubbleConfig; +import net.momirealms.customnameplates.object.emoji.ImageParser; +import net.momirealms.customnameplates.object.emoji.ItemsAdderImpl; +import net.momirealms.customnameplates.object.emoji.OraxenImpl; +import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.PluginManager; +import org.jetbrains.annotations.Nullable; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class ChatBubblesManager extends EntityTag { - private final BBPacketsHandle packetsHandle; - private ChatListener chatListener; - private TrChatListener trChatListener; - private VentureChatListener ventureChatListener; + private AbstractChatListener chatListener; private ImageParser imageParser; - public static String defaultBubble; - public static String defaultFormat; - public static String prefix; - public static String suffix; - public static double lineSpace; - public static double yOffset; - public static int stayTime; - public static int coolDown; - public static int maxChar; - public static String[] channels; + private String defaultBubble; + private String defaultStartFormat; + private String defaultEndFormat; + private String prefix; + private String suffix; + private double lineSpace; + private double yOffset; + private int stayTime; + private int coolDown; + private int maxCharLength; + private int lengthPerLine; + private String[] channels; + private final ConcurrentHashMap coolDownMap; + private final HashMap bubbleConfigMap; + private final CustomNameplates plugin; - private final HashMap coolDownCache = new HashMap<>(); + public ChatBubblesManager(CustomNameplates plugin) { + super(plugin); + this.plugin = plugin; + this.bubbleConfigMap = new HashMap<>(); + this.coolDownMap = new ConcurrentHashMap<>(); + super.handler = new BBPacketsHandle(this); + } - public ChatBubblesManager() { - super(null); - this.packetsHandle = new BBPacketsHandle(this); + @Override + public void loadToAllPlayers() { + for (Player all : Bukkit.getOnlinePlayers()) { + createArmorStandManager(all); + for (Player player : Bukkit.getOnlinePlayers()) + spawnArmorStands(player, all); + } } @Override public void load() { - ConfigUtil.update("bubble.yml"); - YamlConfiguration config = ConfigUtil.getConfig("bubble.yml"); - defaultBubble = config.getString("bubble.default-bubbles", "none"); - - if (!ConfigUtil.isModuleEnabled("bubbles")) return; - - prefix = config.getString("bubble.text-prefix", ""); - suffix = config.getString("bubble.text-suffix", ""); - lineSpace = config.getDouble("bubble.line-spacing"); - defaultFormat = config.getString("bubble.default-format", ""); - yOffset = config.getDouble("bubble.bottom-line-Y-offset"); - stayTime = config.getInt("bubble.stay-time", 5); - coolDown = config.getInt("bubble.cool-down", 1) * 1000; - maxChar = config.getInt("bubble.max-char-length", 35); - channels = config.getStringList("blacklist-channels").toArray(new String[0]); - - this.packetsHandle.load(); - - if (ConfigManager.trChat_Hook) { - this.trChatListener = new TrChatListener(this); - Bukkit.getPluginManager().registerEvents(trChatListener, CustomNameplates.plugin); - } - else if (ConfigManager.ventureChat_Hook) { - this.ventureChatListener = new VentureChatListener(this); - Bukkit.getPluginManager().registerEvents(ventureChatListener, CustomNameplates.plugin); - } - else { - this.chatListener = new ChatListener(this); - Bukkit.getPluginManager().registerEvents(chatListener, CustomNameplates.plugin); - } - - if (Bukkit.getPluginManager().getPlugin("Oraxen") != null) { - this.imageParser = new OXImageHook(); - } - if (Bukkit.getPluginManager().getPlugin("ItemsAdder") != null) { - this.imageParser = new IAImageHook(); - } - - for (Player all : Bukkit.getOnlinePlayers()) { - armorStandManagerMap.put(all, new ArmorStandManager(all)); - for (Player player : Bukkit.getOnlinePlayers()) - spawnArmorStands(player, all, false); - } + if (!ConfigManager.enableBubbles) return; + super.load(); + this.loadConfig(); + this.loadBubbles(); + this.registerListener(); + this.registerImageParser(); } @Override public void unload() { super.unload(); - this.packetsHandle.unload(); this.imageParser = null; - if (chatListener != null) { - HandlerList.unregisterAll(chatListener); - chatListener = null; + this.bubbleConfigMap.clear(); + this.coolDownMap.clear(); + if (chatListener != null) HandlerList.unregisterAll(chatListener); + } + + private void loadConfig() { + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "bubble.yml"); + defaultBubble = config.getString("default-bubbles", "none"); + prefix = config.getString("text-prefix", ""); + suffix = config.getString("text-suffix", ""); + lineSpace = config.getDouble("line-spacing"); + defaultStartFormat = config.getString("default-startFormat.start", ""); + defaultEndFormat = config.getString("default-startFormat.end", ""); + yOffset = config.getDouble("bottom-line-Y-offset"); + stayTime = config.getInt("stay-time", 5); + coolDown = (int) (config.getDouble("cool-down", 1) * 1000); + maxCharLength = config.getInt("max-character-length", 100); + channels = config.getStringList("blacklist-channels").toArray(new String[0]); + lengthPerLine = config.getInt("characters-per-line", 30); + } + + private void registerImageParser() { + PluginManager pluginManager = Bukkit.getPluginManager(); + if (pluginManager.isPluginEnabled("Oraxen")) { + this.imageParser = new OraxenImpl(); } - if (trChatListener != null) { - HandlerList.unregisterAll(trChatListener); - trChatListener = null; - } - if (ventureChatListener != null) { - HandlerList.unregisterAll(ventureChatListener); - ventureChatListener = null; + else if (pluginManager.isPluginEnabled("ItemsAdder")) { + this.imageParser = new ItemsAdderImpl(); } } - public ArmorStandManager getArmorStandManager(Player player) { - return armorStandManagerMap.get(player); + private void registerListener() { + PluginManager pluginManager = Bukkit.getPluginManager(); + if (ConfigManager.trChat_Hook) { + this.chatListener = new TrChatListener(this); + } else if (ConfigManager.ventureChat_Hook) { + this.chatListener = new VentureChatListener(this); + } else { + this.chatListener = new AsyncChatListener(this); + } + pluginManager.registerEvents(chatListener, plugin); + } + + private void loadBubbles() { + File bb_file = new File(plugin.getDataFolder(), "contents" + File.separator + "bubbles"); + if (!bb_file.exists() && bb_file.mkdirs()) { + saveDefaultBubbles(); + } + File[] bb_config_files = bb_file.listFiles(file -> file.getName().endsWith(".yml")); + if (bb_config_files == null) return; + for (File bb_config_file : bb_config_files) { + char left = ConfigManager.start_char; + char middle; + char right; + char tail; + ConfigManager.start_char = (char) ((tail = (char)((right = (char)((middle = (char)(ConfigManager.start_char + '\u0001')) + '\u0001')) + '\u0001')) + '\u0001'); + String key = bb_config_file.getName().substring(0, bb_config_file.getName().length() - 4); + YamlConfiguration config = YamlConfiguration.loadConfiguration(bb_config_file); + if (!config.contains("display-display_name")) config.set("display-display_name", key); + if (!config.contains("text-format.start")) config.set("text-format.start", ""); + if (!config.contains("text-format.end")) config.set("text-format.end", ""); + if (!config.contains("left.image")) config.set("left.image", key + "_left"); + if (!config.contains("left.height")) config.set("left.height", 16); + if (!config.contains("left.width")) config.set("left.width", 16); + if (!config.contains("left.ascent")) config.set("left.ascent", 12); + if (!config.contains("middle.image")) config.set("middle.image", key + "_middle"); + if (!config.contains("middle.height")) config.set("middle.height", 16); + if (!config.contains("middle.width")) config.set("middle.width", 16); + if (!config.contains("middle.ascent")) config.set("middle.ascent", 12); + if (!config.contains("right.image")) config.set("right.image", key + "_right"); + if (!config.contains("right.height")) config.set("right.height", 16); + if (!config.contains("right.width")) config.set("right.width", 16); + if (!config.contains("right.ascent")) config.set("right.ascent", 12); + if (!config.contains("tail.image")) config.set("tail.image", key + "_tail"); + if (!config.contains("tail.height")) config.set("tail.height", 16); + if (!config.contains("tail.width")) config.set("tail.width", 16); + if (!config.contains("tail.ascent")) config.set("tail.ascent", 12); + try { + config.save(bb_config_file); + } + catch (IOException ignored) { + } + SimpleChar leftChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"), config.getInt("left.width"), left, config.getString("left.image") + ".png"); + SimpleChar middleChar = new SimpleChar(config.getInt("middle.height"), config.getInt("middle.ascent"), config.getInt("middle.width"), middle, config.getString("middle.image") + ".png"); + SimpleChar rightChar = new SimpleChar(config.getInt("right.height"), config.getInt("right.ascent"), config.getInt("right.width"), right, config.getString("right.image") + ".png"); + SimpleChar tailChar = new SimpleChar(config.getInt("tail.height"), config.getInt("tail.ascent"), config.getInt("tail.width"), tail, config.getString("tail.image") + ".png"); + bubbleConfigMap.put(key, + new BubbleConfig( + config.getString("text-format.start"), config.getString("text-format.end"), + config.getString("display-display_name"), + leftChar, middleChar, + rightChar, tailChar + ) + ); + } } @Override public void onJoin(Player player) { super.onJoin(player); - } - - @Override - public void addDefaultText(ArmorStandManager asm) { - //empty + super.createArmorStandManager(player); } @Override public void onQuit(Player player) { super.onQuit(player); - coolDownCache.remove(player); + coolDownMap.remove(player); + } + + private boolean isCoolDown(Player player, int lines) { + long time = System.currentTimeMillis(); + if (time - (coolDownMap.getOrDefault(player, time - (long) coolDown * lines)) < (long) coolDown * lines) return true; + coolDownMap.put(player, time); + return false; } public void onChat(Player player, String text) { - if (player.getGameMode() == GameMode.SPECTATOR || !player.hasPermission("bubbles.use")) return; - long time = System.currentTimeMillis(); - if (time - (coolDownCache.getOrDefault(player, time - coolDown)) < coolDown) return; - coolDownCache.put(player, time); - - String bubbles = CustomNameplates.plugin.getDataManager().getPlayerData(player).getBubbles(); - if (imageParser != null) text = imageParser.parse(player, text); - - BubblesEvent bubblesEvent = new BubblesEvent(player, bubbles, text); + String bubble = plugin.getDataManager().getEquippedBubble(player); + BubblesEvent bubblesEvent = new BubblesEvent(player, bubble, text); Bukkit.getPluginManager().callEvent(bubblesEvent); if (bubblesEvent.isCancelled()) { return; } - text = AdventureUtil.replaceLegacy(bubblesEvent.getText()); + bubble = bubblesEvent.getBubble(); + BubbleConfig bubbleConfig = getBubble(bubble); + String miniText = AdventureUtils.replaceLegacy(bubblesEvent.getText()); + String stripped_text = MiniMessage.miniMessage().stripTags(miniText); + if (stripped_text.length() > maxCharLength) return; + String[] split = splitString(stripped_text, lengthPerLine); + if (isCoolDown(player, split.length)) return; + for (int i = 0; i < split.length; i++) { + int finalI = i; + String finalBubble = bubble; + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> sendBubble(player, split[finalI], bubbleConfig, finalBubble), (long) i * coolDown / 50); + } + } - BubbleConfig bubbleConfig = ResourceManager.BUBBLES.get(bubblesEvent.getBubble()); - WrappedChatComponent wrappedChatComponent; - - if (bubbleConfig == null || bubblesEvent.getBubble().equals("none")) { - text = MiniMessage.miniMessage().stripTags(text); - text = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, ChatBubblesManager.prefix) + ChatBubblesManager.defaultFormat + text + CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, ChatBubblesManager.suffix); - if (text.length() > ChatBubblesManager.maxChar) return; - wrappedChatComponent = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(text))); + private void sendBubble(Player player, String text, BubbleConfig bubbleConfig, String key) { + String json; + if (bubbleConfig == null || key.equals("none")) { + text = defaultStartFormat + PlaceholderAPI.setPlaceholders(player, prefix) + text + PlaceholderAPI.setPlaceholders(player, suffix) + defaultEndFormat; + json = GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(imageParser != null ? imageParser.parse(player, text) : text)); } else { - text = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, ChatBubblesManager.prefix) + bubbleConfig.format() + text + CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, ChatBubblesManager.suffix); - String stripped = MiniMessage.miniMessage().stripTags(text); - if (stripped.length() > ChatBubblesManager.maxChar) return; - - String bubble = CustomNameplates.plugin.getNameplateManager().makeCustomBubble("", stripped, "", bubbleConfig); - String suffix = CustomNameplates.plugin.getNameplateManager().getSuffixChar(stripped); - Component armorStand_Name = Component.text(bubble).font(ConfigManager.key) - .append(MiniMessage.miniMessage().deserialize(text).font(Key.key("minecraft:default"))) - .append(Component.text(suffix).font(ConfigManager.key)); - wrappedChatComponent = WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(armorStand_Name)); + String parsedPrefix = PlaceholderAPI.setPlaceholders(player, prefix); + String parsedSuffix = PlaceholderAPI.setPlaceholders(player, suffix); + String strippedPrefix = AdventureUtils.stripAllTags(parsedPrefix); + String strippedSuffix = AdventureUtils.stripAllTags(parsedSuffix); + String bubbleImage = plugin.getNameplateManager().makeCustomBubble(strippedPrefix, text, strippedSuffix, bubbleConfig); + String suffixImage = plugin.getNameplateManager().getNameplateSuffix(strippedPrefix + text + strippedSuffix); + String finalStr = ConfigManager.surroundWithFont(bubbleImage) + bubbleConfig.startFormat() + parsedPrefix + text + parsedSuffix + bubbleConfig.endFormat() + ConfigManager.surroundWithFont(suffixImage); + json = GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(finalStr)); } ArmorStandManager asm = getArmorStandManager(player); - if (asm == null) return; - asm.ascent(); - String name = UUID.randomUUID().toString(); - FakeArmorStand fakeArmorStand = new FakeArmorStand(asm, player, wrappedChatComponent); - asm.addArmorStand(name, fakeArmorStand); - asm.countdown(name, fakeArmorStand); + if (asm != null) { + asm.addBubble(UUID.randomUUID(), new FakeArmorStand(asm, player, json, yOffset), stayTime, lineSpace); + } + } + + private String[] splitString(String str, int len) { + int size = (int) Math.ceil((double) str.length() / (double) len); + String[] result = new String[size]; + int index = 0; + for (int i = 0; i < str.length(); i += len) { + if (i + len > str.length()) { + result[index++] = str.substring(i); + } else { + result[index++] = str.substring(i, i + len); + } + } + return result; + } + + @Override + public void arrangeRefreshTask() { + + } + + @Nullable + public BubbleConfig getBubble(String bubble) { + return bubbleConfigMap.get(bubble); + } + + public ArrayList getAvailableBubbles(Player player) { + ArrayList availableBubbles = new ArrayList<>(); + for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { + String permission = info.getPermission().toLowerCase(); + if (permission.startsWith("bubbles.equip.")) { + permission = permission.substring(14); + if (bubbleConfigMap.get(permission) != null) { + availableBubbles.add(permission); + } + } + } + return availableBubbles; + } + + private void saveDefaultBubbles() { + String[] png_list = new String[]{"chat"}; + String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", "_tail.png", ".yml"}; + for (String name : png_list) { + for (String part : part_list) { + plugin.saveResource("contents" + File.separator + "bubbles" + File.separatorChar + name + part, false); + } + } + } + + public String getDefaultBubble() { + return defaultBubble; + } + + public String[] getChannels() { + return channels; + } + + public HashMap getBubbleConfigMap() { + return bubbleConfigMap; + } + + public boolean existBubble(String bubble) { + return bubbleConfigMap.containsKey(bubble); + } + + public BubbleConfig getBubbleConfig(String bubble) { + return bubbleConfigMap.get(bubble); } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/ConfigManager.java b/src/main/java/net/momirealms/customnameplates/manager/ConfigManager.java index aa073c5..41e0a04 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ConfigManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ConfigManager.java @@ -1,75 +1,101 @@ package net.momirealms.customnameplates.manager; import net.kyori.adventure.key.Key; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; -import java.util.List; - public class ConfigManager extends Function { public static String namespace; - public static String fontName; - public static String start_char; - public static String lang; - public static String np_folder_path; - public static String bg_folder_path; - public static String ss_folder_path; - public static String bb_folder_path; public static String font; + public static String lang; + public static String nameplates_folder_path; + public static String backgrounds_folder_path; + public static String space_split_folder_path; + public static String bubbles_folder_path; + public static String images_folder_path; public static boolean itemsAdderHook; public static boolean thin_font; public static boolean tab_hook; public static boolean tab_BC_hook; public static boolean oraxenHook; - public static boolean extract; public static boolean trChat_Hook; public static boolean ventureChat_Hook; - public static List offsets; - public static char start; - public static Key key; + public static boolean extract; + public static char start_char; + public static boolean checkUpdate; + public static boolean enableBStats; + public static boolean enableNameplates; + public static boolean enableBossBar; + public static boolean enableActionBar; + public static boolean enableBubbles; + public static boolean enableBackground; + public static boolean enableImages; - public ConfigManager() { - load(); + @Override + public void load(){ + ConfigUtils.update("config.yml"); + YamlConfiguration config = ConfigUtils.getConfig("config.yml"); + lang = config.getString("lang"); + enableBStats = config.getBoolean("config.metrics", true); + checkUpdate = config.getBoolean("update-checker", true); + loadModules(config); + loadIntegrations(config); + loadResourcePack(config); } - public void load(){ - ConfigUtil.update("config.yml"); - YamlConfiguration config = ConfigUtil.getConfig("config.yml"); - lang = config.getString("config.lang"); - namespace = config.getString("config.namespace"); - font = config.getString("config.font"); - fontName = namespace + ":" + font; - start_char = config.getString("config.start-char"); - assert start_char != null; - start = start_char.charAt(0); - np_folder_path = config.getString("config.nameplate-folder-path","font\\nameplates\\"); - bb_folder_path = config.getString("config.bubble-folder-path","font\\bubbles\\"); - bg_folder_path = config.getString("config.background-folder-path","font\\backgrounds\\"); - ss_folder_path = config.getString("config.space-split-folder-path","font\\"); - key = Key.key(fontName); - thin_font = config.getBoolean("config.use-thin-font",false); - itemsAdderHook = config.getBoolean("config.integrations.ItemsAdder",false); - if (itemsAdderHook && Bukkit.getPluginManager().getPlugin("ItemsAdder") == null) itemsAdderHook = false; - tab_hook = config.getBoolean("config.integrations.TAB",false); - tab_BC_hook = config.getBoolean("config.integrations.TAB-BC",false); - oraxenHook = config.getBoolean("config.integrations.Oraxen",false); - if (oraxenHook && Bukkit.getPluginManager().getPlugin("Oraxen") == null) oraxenHook = false; - trChat_Hook = config.getBoolean("config.integrations.TrChat",false); - ventureChat_Hook = config.getBoolean("config.integrations.VentureChat",false); - offsets = config.getIntegerList("config.ascii-y-offset.offset"); - extract = config.getBoolean("config.extract-shader",true); - - if (tab_hook && Bukkit.getPluginManager().getPlugin("TAB") == null) { - tab_hook = false; + private void loadIntegrations(ConfigurationSection config) { + ConfigurationSection section = config.getConfigurationSection("integrations"); + if (section != null) { + tab_hook = section.getBoolean("TAB",false) && Bukkit.getPluginManager().isPluginEnabled("TAB"); + tab_BC_hook = section.getBoolean("TAB-BC",false); + trChat_Hook = section.getBoolean("TrChat",false) && Bukkit.getPluginManager().isPluginEnabled("TrChat"); + itemsAdderHook = section.getBoolean("ItemsAdder",false) && Bukkit.getPluginManager().isPluginEnabled("ItemsAdder"); + oraxenHook = section.getBoolean("Oraxen",false) && Bukkit.getPluginManager().isPluginEnabled("Oraxen"); + ventureChat_Hook = section.getBoolean("VentureChat",false) && Bukkit.getPluginManager().isPluginEnabled("VentureChat"); } + } - if (trChat_Hook && CustomNameplates.plugin.getServer().getPluginManager().getPlugin("TrChat") == null){ - CustomNameplates.plugin.getLogger().warning("Failed to initialize TrChat!"); - trChat_Hook = false; + private void loadResourcePack(ConfigurationSection config) { + ConfigurationSection section = config.getConfigurationSection("resource-pack"); + if (section != null) { + namespace = section.getString("namespace", "nameplates"); + font = section.getString("font", "default"); + start_char = section.getString("config.left-char", "뀁").charAt(0); + nameplates_folder_path = section.getString("image-path.nameplates","font\\nameplates\\"); + bubbles_folder_path = section.getString("image-path.bubbles","font\\bubbles\\"); + backgrounds_folder_path = section.getString("image-path.backgrounds","font\\backgrounds\\"); + space_split_folder_path = section.getString("image-path.space-split","font\\base\\"); + images_folder_path = section.getString("image-path.images","font\\images\\"); + thin_font = section.getBoolean("use-thin-font",false); + extract = section.getBoolean("extract-shader",true); } } + + private void loadModules(ConfigurationSection config) { + ConfigurationSection section = config.getConfigurationSection("modules"); + if (section != null) { + enableNameplates = section.getBoolean("nameplates"); + enableBossBar = section.getBoolean("bossbars"); + enableActionBar = section.getBoolean("actionbars"); + enableBubbles = section.getBoolean("bubbles"); + enableBackground = section.getBoolean("backgrounds"); + enableImages = section.getBoolean("images"); + } + } + + public static String getMiniMessageFontTag() { + return ""; + } + + public static String getFontTagCloser() { + return ""; + } + + public static String surroundWithFont(String text) { + return getMiniMessageFontTag() + text + getFontTagCloser(); + } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/DataManager.java b/src/main/java/net/momirealms/customnameplates/manager/DataManager.java index 5baaf37..0bd7259 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/DataManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/DataManager.java @@ -1,81 +1,149 @@ package net.momirealms.customnameplates.manager; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.SimpleListener; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.data.DataStorageInterface; -import net.momirealms.customnameplates.objects.data.FileStorageImpl; -import net.momirealms.customnameplates.objects.data.MySQLStorageImpl; -import net.momirealms.customnameplates.objects.data.PlayerData; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.data.*; +import net.momirealms.customnameplates.listener.JoinQuitListener; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class DataManager extends Function { - private final ConcurrentHashMap playerDataCache; - private final SimpleListener simpleListener; - private final DataStorageInterface dataStorageInterface; + private final CustomNameplates plugin; + private DataStorageInterface dataStorageInterface; + private final JoinQuitListener joinQuitListener; + private StorageType storageType; + private final ConcurrentHashMap playerDataMap; + private final ConcurrentHashMap triedTimes; - public DataManager() { - this.playerDataCache = new ConcurrentHashMap<>(); - this.simpleListener = new SimpleListener(this); - ConfigUtil.update("database.yml"); - YamlConfiguration config = ConfigUtil.getConfig("database.yml"); - if (config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML")) { - this.dataStorageInterface = new FileStorageImpl(); - AdventureUtil.consoleMessage("[CustomNameplates] Storage Mode: YAML"); - } else this.dataStorageInterface = new MySQLStorageImpl(); - this.dataStorageInterface.initialize(); - } - - @NotNull - public PlayerData getPlayerData(OfflinePlayer player) { - PlayerData playerData = playerDataCache.get(player.getUniqueId()); - if (playerData != null) { - return playerData; - } - return new PlayerData(player, NameplateManager.defaultNameplate, ChatBubblesManager.defaultBubble); + public DataManager(CustomNameplates plugin) { + this.plugin = plugin; + this.playerDataMap = new ConcurrentHashMap<>(); + this.joinQuitListener = new JoinQuitListener(this); + this.triedTimes = new ConcurrentHashMap<>(); } @Override public void load() { - Bukkit.getPluginManager().registerEvents(simpleListener, CustomNameplates.plugin); + if (loadStorageMode()) this.dataStorageInterface.initialize(); + Bukkit.getPluginManager().registerEvents(joinQuitListener, plugin); } @Override public void unload() { - HandlerList.unregisterAll(simpleListener); + YamlConfiguration config = ConfigUtils.getConfig("database.yml"); + StorageType st = config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML") ? StorageType.YAML : StorageType.SQL; + if (this.dataStorageInterface != null && dataStorageInterface.getStorageType() != st) this.dataStorageInterface.disable(); + HandlerList.unregisterAll(joinQuitListener); } + @Override public void disable() { - unload(); - this.playerDataCache.clear(); - this.dataStorageInterface.disable(); + if (this.dataStorageInterface != null) { + this.dataStorageInterface.disable(); + } } @Override public void onJoin(Player player) { - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - PlayerData playerData = dataStorageInterface.loadData(player); - if (playerData == null) return; - playerDataCache.put(player.getUniqueId(), playerData); - //wait - if (ConfigUtil.isModuleEnabled("nameplate")) { - CustomNameplates.plugin.getNameplateManager().getTeamManager().createTeam(player); - } - }); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> readData(player.getUniqueId())); + } + + public void readData(UUID uuid) { + Player player = Bukkit.getPlayer(uuid); + if (player == null || !player.isOnline() || !checkTriedTimes(uuid)) return; + PlayerData playerData = this.dataStorageInterface.loadData(uuid); + if (playerData == null) { + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> readData(uuid), 20); + } + else { + playerDataMap.put(uuid, playerData); + plugin.getTeamManager().getTeamNameInterface().onJoin(player); + plugin.getTeamManager().createTeam(uuid); + } + } + + @Override + public void onQuit(Player player) { + PlayerData playerData = playerDataMap.remove(player.getUniqueId()); + if (playerData != null) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> this.dataStorageInterface.saveData(playerData)); + } + plugin.getTeamManager().onQuit(player); + triedTimes.remove(player.getUniqueId()); } public void saveData(Player player) { - this.dataStorageInterface.saveData(getPlayerData(player)); + PlayerData playerData = playerDataMap.get(player.getUniqueId()); + if (playerData != null) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> this.dataStorageInterface.saveData(playerData)); + } + } + + public DataStorageInterface getDataStorageInterface() { + return dataStorageInterface; + } + + private boolean loadStorageMode() { + YamlConfiguration config = ConfigUtils.getConfig("database.yml"); + if (config.getString("data-storage-method","YAML").equalsIgnoreCase("YAML")) { + if (storageType != StorageType.YAML) { + this.dataStorageInterface = new FileStorageImpl(plugin); + this.storageType = StorageType.YAML; + return true; + } + } else { + if (storageType != StorageType.SQL) { + this.dataStorageInterface = new MySQLStorageImpl(plugin); + this.storageType = StorageType.SQL; + return true; + } + } + return false; + } + + public String getEquippedNameplate(Player player) { + return Optional.ofNullable(playerDataMap.get(player.getUniqueId())).orElse(PlayerData.EMPTY).getNameplate(); + } + + public String getEquippedBubble(Player player) { + return Optional.ofNullable(playerDataMap.get(player.getUniqueId())).orElse(PlayerData.EMPTY).getBubble(); + } + + public void equipNameplate(Player player, String nameplate) { + PlayerData playerData = playerDataMap.get(player.getUniqueId()); + if (playerData != null) { + playerData.setNameplate(nameplate); + } + } + + public void equipBubble(Player player, String bubble) { + PlayerData playerData = playerDataMap.get(player.getUniqueId()); + if (playerData != null) { + playerData.setBubble(bubble); + } + } + + protected boolean checkTriedTimes(UUID uuid) { + Integer previous = triedTimes.get(uuid); + if (previous == null) { + triedTimes.put(uuid, 1); + return true; + } + else if (previous > 2) { + triedTimes.remove(uuid); + return false; + } + else { + triedTimes.put(uuid, previous + 1); + return true; + } } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/FontManager.java b/src/main/java/net/momirealms/customnameplates/manager/FontManager.java new file mode 100644 index 0000000..feecb5b --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/manager/FontManager.java @@ -0,0 +1,181 @@ +package net.momirealms.customnameplates.manager; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.font.ASCIIWidth; +import net.momirealms.customnameplates.object.font.OffsetFont; +import net.momirealms.customnameplates.object.font.UnicodeWidth; +import net.momirealms.customnameplates.utils.ConfigUtils; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.HashMap; +import java.util.Objects; + +public class FontManager extends Function { + + private final CustomNameplates plugin; + private final HashMap customImageWidth; + + public FontManager(CustomNameplates plugin) { + this.plugin = plugin; + this.customImageWidth = new HashMap<>(); + } + + @Override + public void load() { + this.loadASCIIWidth(); + this.loadCustomWidth(); + } + + @Override + public void unload() { + customImageWidth.clear(); + } + + private void loadASCIIWidth() { + if (ConfigManager.thin_font) + for (int i = 0; i < UnicodeWidth.values().length; i++) + customImageWidth.put(UnicodeWidth.values()[i].getCharacter(), UnicodeWidth.values()[i].getWidth()); + else + for (int i = 0; i < ASCIIWidth.values().length; i++) + customImageWidth.put(ASCIIWidth.values()[i].getCharacter(), ASCIIWidth.values()[i].getWidth()); + } + + private void loadCustomWidth() { + for (SimpleChar simpleChar : plugin.getImageManager().getCharacterMap().values()) { + customImageWidth.put(simpleChar.getChars(), simpleChar.getWidth()); + } + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "image-width.yml"); + for (String image : config.getKeys(false)) { + customImageWidth.put(image.charAt(0), config.getInt(image, 8)); + } + } + + public int getCharWidth(char c) { + return Objects.requireNonNullElse(customImageWidth.get(c), 8); + } + + public int getTotalWidth(String text) { + int length = text.length(); + int n = 0; + for (int i = 0; i < length; i++) { + n += getCharWidth(text.charAt(i)); + } + return n + length; + } + + public String getOffset(int offset) { + if (offset >= 0) { + return getShortestPosChars(offset); + } + else { + return getShortestNegChars(-offset); + } + } + + public String getShortestNegChars(int n) { + StringBuilder stringBuilder = new StringBuilder(); + while (n >= 128) { + stringBuilder.append(OffsetFont.NEG_128.getCharacter()); + n -= 128; + } + if (n - 64 >= 0) { + stringBuilder.append(OffsetFont.NEG_64.getCharacter()); + n -= 64; + } + if (n - 32 >= 0) { + stringBuilder.append(OffsetFont.NEG_32.getCharacter()); + n -= 32; + } + if (n - 16 >= 0) { + stringBuilder.append(OffsetFont.NEG_16.getCharacter()); + n -= 16; + } + if (n - 8 >= 0) { + stringBuilder.append(OffsetFont.NEG_8.getCharacter()); + n -= 8; + } + if (n - 7 >= 0) { + stringBuilder.append(OffsetFont.NEG_7.getCharacter()); + n -= 7; + } + if (n - 6 >= 0) { + stringBuilder.append(OffsetFont.NEG_6.getCharacter()); + n -= 6; + } + if (n - 5 >= 0) { + stringBuilder.append(OffsetFont.NEG_5.getCharacter()); + n -= 5; + } + if (n - 4 >= 0) { + stringBuilder.append(OffsetFont.NEG_4.getCharacter()); + n -= 4; + } + if (n - 3 >= 0) { + stringBuilder.append(OffsetFont.NEG_3.getCharacter()); + n -= 3; + } + if (n - 2 >= 0) { + stringBuilder.append(OffsetFont.NEG_2.getCharacter()); + n -= 2; + } + if (n - 1 >= 0) { + stringBuilder.append(OffsetFont.NEG_1.getCharacter()); + } + return stringBuilder.toString(); + } + + public String getShortestPosChars(int n) { + StringBuilder stringBuilder = new StringBuilder(); + while (n >= 128) { + stringBuilder.append(OffsetFont.POS_128.getCharacter()); + n -= 128; + } + if (n - 64 >= 0) { + stringBuilder.append(OffsetFont.POS_64.getCharacter()); + n -= 64; + } + if (n - 32 >= 0) { + stringBuilder.append(OffsetFont.POS_32.getCharacter()); + n -= 32; + } + if (n - 16 >= 0) { + stringBuilder.append(OffsetFont.POS_16.getCharacter()); + n -= 16; + } + if (n - 8 >= 0) { + stringBuilder.append(OffsetFont.POS_8.getCharacter()); + n -= 8; + } + if (n - 7 >= 0) { + stringBuilder.append(OffsetFont.POS_7.getCharacter()); + n -= 7; + } + if (n - 6 >= 0) { + stringBuilder.append(OffsetFont.POS_6.getCharacter()); + n -= 6; + } + if (n - 5 >= 0) { + stringBuilder.append(OffsetFont.POS_5.getCharacter()); + n -= 5; + } + if (n - 4 >= 0) { + stringBuilder.append(OffsetFont.POS_4.getCharacter()); + n -= 4; + } + if (n - 3 >= 0) { + stringBuilder.append(OffsetFont.POS_3.getCharacter()); + n -= 3; + } + if (n - 2 >= 0) { + stringBuilder.append(OffsetFont.POS_2.getCharacter()); + n -= 2; + } + if (n - 1 >= 0) { + stringBuilder.append(OffsetFont.POS_1.getCharacter()); + } + return stringBuilder.toString(); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/manager/ImageManager.java b/src/main/java/net/momirealms/customnameplates/manager/ImageManager.java new file mode 100644 index 0000000..0613135 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/manager/ImageManager.java @@ -0,0 +1,83 @@ +package net.momirealms.customnameplates.manager; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.nameplate.NameplateConfig; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Objects; + +public class ImageManager extends Function { + + private final HashMap characterMap; + private final CustomNameplates plugin; + + public ImageManager(CustomNameplates plugin) { + this.plugin = plugin; + this.characterMap = new HashMap<>(); + } + + @Override + public void load() { + if (!ConfigManager.enableImages) return; + loadImages(); + } + + @Override + public void unload() { + characterMap.clear(); + } + + private void loadImages() { + File img_file = new File(plugin.getDataFolder(), "contents" + File.separator + "images"); + if (!img_file.exists() && img_file.mkdirs()) { + saveDefaultImages(); + } + File[] image_config_files = img_file.listFiles(file -> file.getName().endsWith(".yml")); + if (image_config_files == null) return; + for (File image_config_file : image_config_files) { + char img = ConfigManager.start_char; + ConfigManager.start_char = (char) (img + '\u0001'); + String key = image_config_file.getName().substring(0, image_config_file.getName().length() - 4); + YamlConfiguration config = YamlConfiguration.loadConfiguration(image_config_file); + if (!config.contains("height")) config.set("height", 10); + if (!config.contains("ascent")) config.set("ascent", 8); + if (!config.contains("width")) config.set("width", 10); + if (!config.contains("image")) config.set("image", key); + try { + config.save(image_config_file); + } catch (IOException e) { + e.printStackTrace(); + } + SimpleChar simpleChar = new SimpleChar(config.getInt("height"), config.getInt("ascent"), config.getInt("width"), img, config.getString("image") + ".png"); + characterMap.put(key, simpleChar); + } + AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + characterMap.size() + " images"); + } + + private void saveDefaultImages() { + String[] png_list = new String[]{"bell", "bubble", "clock", "coin", "compass", "weather", "stamina_0", "stamina_1", "stamina_2"}; + String[] part_list = new String[]{".png", ".yml"}; + for (String name : png_list) { + for (String part : part_list) { + plugin.saveResource("contents" + File.separator + "images" + File.separator + name + part, false); + } + } + } + + @Nullable + public SimpleChar getImage(String key) { + return characterMap.get(key); + } + + public HashMap getCharacterMap() { + return characterMap; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/manager/MessageManager.java b/src/main/java/net/momirealms/customnameplates/manager/MessageManager.java index f61538a..29bd415 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/MessageManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/MessageManager.java @@ -1,7 +1,7 @@ package net.momirealms.customnameplates.manager; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; @@ -19,7 +19,6 @@ public class MessageManager extends Function { public static String generate; public static String noNameplate; public static String generateDone; - public static String np_equip; public static String np_unEquip; public static String np_force_equip; @@ -28,7 +27,6 @@ public class MessageManager extends Function { public static String np_notAvailable; public static String np_available; public static String np_haveNone; - public static String bb_equip; public static String bb_unEquip; public static String bb_force_equip; @@ -42,7 +40,7 @@ public class MessageManager extends Function { @Override public void load(){ - YamlConfiguration config = ConfigUtil.getConfig("messages" + File.separator + ConfigManager.lang +".yml"); + YamlConfiguration config = ConfigUtils.getConfig("messages" + File.separator + ConfigManager.lang +".yml"); noPerm = config.getString("messages.no-perm"); prefix = config.getString("messages.prefix"); lackArgs = config.getString("messages.lack-args"); @@ -56,7 +54,6 @@ public class MessageManager extends Function { no_console = config.getString("messages.no-console"); nonArgs = config.getString("messages.none-args"); unavailableArgs = config.getString("messages.invalid-args"); - np_equip = config.getString("messages.equip-nameplates"); np_unEquip = config.getString("messages.unequip-nameplates"); np_force_equip = config.getString("messages.force-equip-nameplates"); @@ -65,7 +62,6 @@ public class MessageManager extends Function { np_notAvailable = config.getString("messages.not-available-nameplates"); np_available = config.getString("messages.available-nameplates"); np_haveNone = config.getString("messages.have-no-nameplates"); - bb_equip = config.getString("messages.equip-bubbles"); bb_unEquip = config.getString("messages.unequip-bubbles"); bb_force_equip = config.getString("messages.force-equip-bubbles"); diff --git a/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java b/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java index 5b89f9c..4a29e78 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java @@ -1,119 +1,176 @@ package net.momirealms.customnameplates.manager; -import codecrafter47.bungeetablistplus.config.MainConfig; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.SimpleChar; -import net.momirealms.customnameplates.objects.font.FontOffset; -import net.momirealms.customnameplates.objects.font.FontUtil; -import net.momirealms.customnameplates.objects.nameplates.BubbleConfig; -import net.momirealms.customnameplates.objects.nameplates.NameplateConfig; -import net.momirealms.customnameplates.objects.nameplates.NameplateMode; -import net.momirealms.customnameplates.objects.nameplates.mode.rd.RidingTag; -import net.momirealms.customnameplates.objects.nameplates.mode.tm.TeamTag; -import net.momirealms.customnameplates.objects.nameplates.mode.tp.TeleportingTag; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; +import net.momirealms.customnameplates.object.bubble.BubbleConfig; +import net.momirealms.customnameplates.object.font.OffsetFont; +import net.momirealms.customnameplates.object.nameplate.NameplateConfig; +import net.momirealms.customnameplates.object.nameplate.mode.AbstractNameplateTag; +import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; +import net.momirealms.customnameplates.object.nameplate.mode.team.TeamTag; +import net.momirealms.customnameplates.object.nameplate.mode.armorstand.ArmorStandTag; +import net.momirealms.customnameplates.object.requirements.Requirement; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachmentInfo; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.List; +import java.io.File; +import java.io.IOException; +import java.util.*; public class NameplateManager extends Function { - public static String defaultNameplate; - public static String player_prefix; - public static String player_suffix; - public static String player_name; - public static long preview; - public static boolean update; - public static int refresh; - public static String mode; - public static boolean hidePrefix; - public static boolean hideSuffix; - public static boolean tryHook; - public static boolean removeTag; - public static boolean smallSize; - public static boolean fakeTeam; - private final HashMap textMap = new HashMap<>(); - private NameplateMode nameplateMode; - private final TeamManager teamManager; + private String default_nameplate; + private String player_prefix; + private String player_suffix; + private String player_name_papi; + private long preview_time; + private DisplayMode mode; + private boolean fakeTeam; + private final HashMap contentMap; + private final HashMap nameplateConfigMap; + private final CustomNameplates plugin; + private AbstractNameplateTag nameplateTag; + protected HashMap previewCoolDown = new HashMap<>(); - public NameplateManager() { - this.teamManager = new TeamManager(); + public NameplateManager(CustomNameplates plugin) { + this.plugin = plugin; + this.nameplateConfigMap = new HashMap<>(); + this.contentMap = new HashMap<>(); } @Override public void load() { - YamlConfiguration config = ConfigUtil.getConfig("nameplate.yml"); - defaultNameplate = config.getString("nameplate.default-nameplate"); - - if (!ConfigUtil.isModuleEnabled("nameplate")) return; - - player_name = config.getString("nameplate.player-name", "%player_name%"); - preview = config.getLong("nameplate.preview-duration"); - mode = config.getString("nameplate.mode","team"); - update = config.getBoolean("nameplate.update.enable",true); - fakeTeam = config.getBoolean("nameplate.create-fake-team",true); - refresh = config.getInt("nameplate.update.ticks",20); - player_prefix = config.getString("nameplate.prefix",""); - player_suffix = config.getString("nameplate.suffix",""); - hidePrefix = config.getBoolean("nameplate.team.hide-prefix-when-equipped",true); - hideSuffix = config.getBoolean("nameplate.team.hide-suffix-when-equipped",true); - - if (ConfigManager.tab_hook || ConfigManager.tab_BC_hook) fakeTeam = true; - teamManager.load(); - - if (mode.equalsIgnoreCase("team")) { - removeTag = false; - nameplateMode = new TeamTag(teamManager); - } - else if (mode.equalsIgnoreCase("riding")) { - tryHook = config.getBoolean("nameplate.riding.try-to-hook-cosmetics-plugin", false); - List texts = config.getStringList("nameplate.riding.text"); - textMap.clear(); - for (String text : texts) { - textMap.put(text, -0.1); - } - smallSize = config.getBoolean("nameplate.riding.small-height", true); - removeTag = config.getBoolean("nameplate.riding.remove-nametag"); - nameplateMode = new RidingTag(teamManager); - } - else if (mode.equalsIgnoreCase("teleporting")) { - removeTag = config.getBoolean("nameplate.teleporting.remove-nametag"); - smallSize = config.getBoolean("nameplate.teleporting.small-height", true); - textMap.clear(); - for (String key : config.getConfigurationSection("nameplate.teleporting.text").getKeys(false)) { - textMap.put(config.getString("nameplate.teleporting.text." + key + ".content"), config.getDouble("nameplate.teleporting.text." + key + ".offset")); - } - nameplateMode = new TeleportingTag(teamManager); - } - nameplateMode.load(); + if (!ConfigManager.enableNameplates) return; + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "nameplate.yml"); + loadConfig(config); + loadNameplates(); + loadMode(config); } @Override public void unload() { - if (nameplateMode != null) nameplateMode.unload(); - teamManager.unload(); + if (this.nameplateTag != null) { + this.nameplateTag.unload(); + this.nameplateTag = null; + } + this.contentMap.clear(); + this.nameplateConfigMap.clear(); } - public HashMap getTextMap() { - return textMap; + private void loadConfig(ConfigurationSection config) { + this.default_nameplate = config.getString("default-nameplate", "none"); + this.player_name_papi = config.getString("player-display_name", "%player_name%"); + this.preview_time = config.getLong("preview-duration", 5); + this.fakeTeam = config.getBoolean("create-fake-team",true); + this.player_prefix = config.getString("prefix",""); + this.player_suffix = config.getString("suffix",""); } - public TeamManager getTeamManager() { - return teamManager; + private void loadNameplates() { + File np_file = new File(plugin.getDataFolder(), "contents" + File.separator + "nameplates"); + if (!np_file.exists() && np_file.mkdirs()) { + saveDefaultNameplates(); + } + File[] np_config_files = np_file.listFiles(file -> file.getName().endsWith(".yml")); + if (np_config_files == null) return; + nameplateConfigMap.put("none", NameplateConfig.EMPTY); + for (File np_config_file : np_config_files) { + char left = ConfigManager.start_char; + char middle; + char right; + ConfigManager.start_char = (char) ((right = (char) ((middle = (char) (ConfigManager.start_char + '\u0001')) + '\u0001')) + '\u0001'); + String key = np_config_file.getName().substring(0, np_config_file.getName().length() - 4); + YamlConfiguration config = YamlConfiguration.loadConfiguration(np_config_file); + if (!config.contains("display-display_name")) config.set("display-display_name", key); + if (!config.contains("display_name-color")) config.set("display_name-color", "white"); + if (!config.contains("left.image")) config.set("left.image", key + "_left"); + if (!config.contains("left.height")) config.set("left.height", 16); + if (!config.contains("left.ascent")) config.set("left.ascent", 12); + if (!config.contains("left.width")) config.set("left.width", 16); + if (!config.contains("middle.image")) config.set("middle.image", key + "_middle"); + if (!config.contains("middle.height")) config.set("middle.height", 16); + if (!config.contains("middle.ascent")) config.set("middle.ascent", 12); + if (!config.contains("middle.width")) config.set("middle.width", 16); + if (!config.contains("right.image")) config.set("right.image", key + "_right"); + if (!config.contains("right.height")) config.set("right.height", 16); + if (!config.contains("right.ascent")) config.set("right.ascent", 12); + if (!config.contains("right.width")) config.set("right.width", 16); + try { + config.save(np_config_file); + } catch (IOException e) { + e.printStackTrace(); + } + SimpleChar leftChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"), config.getInt("left.width"), left, config.getString("left.image") + ".png"); + SimpleChar middleChar = new SimpleChar(config.getInt("middle.height"), config.getInt("middle.ascent"), config.getInt("middle.width"), middle, config.getString("middle.image") + ".png"); + SimpleChar rightChar = new SimpleChar(config.getInt("right.height"), config.getInt("right.ascent"), config.getInt("right.width"), right, config.getString("right.image") + ".png"); + ChatColor color = ChatColor.valueOf(Objects.requireNonNull(config.getString("color", "WHITE")).toUpperCase()); + nameplateConfigMap.put(key, new NameplateConfig(color, config.getString("display-display_name"), leftChar, middleChar, rightChar)); + } + AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + (nameplateConfigMap.size() -1) + " nameplates"); } + private void saveDefaultNameplates() { + String[] png_list = new String[]{"cat", "egg", "cheems", "wither", "xmas", "halloween", "hutao", "starsky", "trident", "rabbit"}; + String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", ".yml"}; + for (String name : png_list) { + for (String part : part_list) { + plugin.saveResource("contents" + File.separator + "nameplates" + File.separator + name + part, false); + } + } + } - public String makeCustomNameplate(String prefix, String name, String suffix, NameplateConfig nameplate) { - int totalWidth = FontUtil.getTotalWidth(ChatColor.stripColor(prefix + name + suffix)); + private void loadMode(ConfigurationSection config) { + this.mode = DisplayMode.valueOf(config.getString("mode","Team").toUpperCase()); + if (mode == DisplayMode.TEAM) { + this.nameplateTag = new TeamTag(plugin); + } + else if (mode == DisplayMode.ARMOR_STAND) { + this.nameplateTag = new ArmorStandTag(plugin); + ConfigurationSection armorStandSection = config.getConfigurationSection("armor_stand"); + if (armorStandSection != null) { + for (String key :armorStandSection.getKeys(false)) { + String text = armorStandSection.getString(key + ".text"); + double offset = armorStandSection.getDouble(key + ".vertical-offset"); + Requirement[] requirements = ConfigUtils.getRequirements(armorStandSection.getConfigurationSection(key + ".conditions")); + contentMap.put(new ConditionalText(requirements, text), offset); + } + } + } + plugin.getTeamManager().setTeamPacketInterface(); + if (this.nameplateTag != null) { + this.nameplateTag.load(); + } + } + + public HashMap getContentMap() { + return contentMap; + } + + public String getNameplatePrefix(String parsed, String nameplate) { + NameplateConfig nameplateConfig = nameplateConfigMap.get(nameplate); + if (nameplateConfig == null) return nameplate + " NOT FOUND"; + return getNameplatePrefix("", parsed, "", nameplateConfig); + } + + public String getNameplatePrefix(String prefix, String name, String suffix, NameplateConfig nameplate) { + int totalWidth = plugin.getFontManager().getTotalWidth(prefix + name + suffix); char middle = nameplate.middle().getChars(); - char neg_1 = FontOffset.NEG_1.getCharacter(); + char neg_1 = OffsetFont.NEG_1.getCharacter(); int offset_2 = nameplate.right().getWidth() - nameplate.middle().getWidth(); int left_offset = totalWidth + (nameplate.left().getWidth() + nameplate.right().getWidth())/2 + 1; StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(FontOffset.getShortestNegChars(totalWidth % 2 == 0 ? left_offset : left_offset + 1 )); + stringBuilder.append(plugin.getFontManager().getShortestNegChars(totalWidth % 2 == 0 ? left_offset : left_offset + 1 )); stringBuilder.append(nameplate.left().getChars()).append(neg_1); int mid_amount = (totalWidth + 1 + offset_2) / (nameplate.middle().getWidth()); if (mid_amount == 0) { @@ -127,20 +184,20 @@ public class NameplateManager extends Function { return getString(totalWidth, middle, neg_1, offset_2, left_offset, stringBuilder, nameplate.right(), nameplate.middle()); } - public String getSuffixChar(String name) { - int totalWidth = FontUtil.getTotalWidth(ChatColor.stripColor(name)); - return FontOffset.getShortestNegChars(totalWidth + totalWidth % 2 + 1); + public String getNameplateSuffix(String text) { + int totalWidth = plugin.getFontManager().getTotalWidth(text); + return plugin.getFontManager().getShortestNegChars(totalWidth + totalWidth % 2 + 1); } public String makeCustomBubble(String prefix, String name, String suffix, BubbleConfig bubble) { - int totalWidth = FontUtil.getTotalWidth(ChatColor.stripColor(prefix + name + suffix)); + int totalWidth = plugin.getFontManager().getTotalWidth(ChatColor.stripColor(prefix + name + suffix)); char middle = bubble.middle().getChars(); char tail = bubble.tail().getChars(); - char neg_1 = FontOffset.NEG_1.getCharacter(); + char neg_1 = OffsetFont.NEG_1.getCharacter(); int offset = bubble.middle().getWidth() - bubble.tail().getWidth(); int left_offset = totalWidth + bubble.left().getWidth() + 1; StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(FontOffset.getShortestNegChars(totalWidth % 2 == 0 ? left_offset - offset : left_offset + 1 - offset)); + stringBuilder.append(plugin.getFontManager().getShortestNegChars(totalWidth % 2 == 0 ? left_offset - offset : left_offset + 1 - offset)); stringBuilder.append(bubble.left().getChars()).append(neg_1); int mid_amount = (totalWidth + 1 - bubble.tail().getWidth()) / (bubble.middle().getWidth()); if (mid_amount == 0) { @@ -161,14 +218,95 @@ public class NameplateManager extends Function { @NotNull protected String getString(int totalWidth, char middle, char neg_1, int offset, int left_offset, StringBuilder stringBuilder, SimpleChar right, SimpleChar middle2) { - stringBuilder.append(FontOffset.getShortestNegChars(right.getWidth() - ((totalWidth + 1 + offset) % middle2.getWidth() + (totalWidth % 2 == 0 ? 0 : -1)))); + stringBuilder.append(plugin.getFontManager().getShortestNegChars(right.getWidth() - ((totalWidth + 1 + offset) % middle2.getWidth() + (totalWidth % 2 == 0 ? 0 : -1)))); stringBuilder.append(middle).append(neg_1); stringBuilder.append(right.getChars()).append(neg_1); - stringBuilder.append(FontOffset.getShortestNegChars(left_offset - 1)); + stringBuilder.append(plugin.getFontManager().getShortestNegChars(left_offset - 1)); return stringBuilder.toString(); } - public NameplateMode getNameplateMode() { - return nameplateMode; + public List getAvailableNameplates(Player player) { + List nameplates = new ArrayList<>(); + for (PermissionAttachmentInfo info : player.getEffectivePermissions()) { + String permission = info.getPermission().toLowerCase(); + if (permission.startsWith("nameplates.equip.")) { + permission = permission.substring(17); + if (nameplateConfigMap.get(permission) != null) { + nameplates.add(permission); + } + } + } + return nameplates; + } + + // return false if in cool down + public boolean showPlayerArmorStandTags(Player player) { + long time = System.currentTimeMillis(); + if (time - (previewCoolDown.getOrDefault(player.getUniqueId(), time - this.getPreview_time() * 1050)) < this.getPreview_time() * 1050) { + AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.coolDown); + return false; + } + previewCoolDown.put(player.getUniqueId(), time); + + EntityTag entityTag = (EntityTag) this.getNameplateTag(); + ArmorStandManager asm = entityTag.getArmorStandManager(player); + asm.spawn(player); + for (int i = 0; i < this.getPreview_time() * 20; i++) { + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), ()-> { + asm.teleport(player); + },i); + } + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), ()-> { + asm.destroy(player); + },this.getPreview_time() * 20); + return true; + } + + public boolean existNameplate(String nameplate) { + return nameplateConfigMap.containsKey(nameplate); + } + + public AbstractNameplateTag getNameplateTag() { + return nameplateTag; + } + + public HashMap getNameplateConfigMap() { + return nameplateConfigMap; + } + + public boolean isFakeTeam() { + return fakeTeam; + } + + public DisplayMode getMode() { + return mode; + } + + public String getEquippedNameplate(Player player) { + return plugin.getDataManager().getEquippedNameplate(player); + } + + public String getDefault_nameplate() { + return default_nameplate; + } + + public String getPrefix() { + return player_prefix; + } + + public String getSuffix() { + return player_suffix; + } + + public NameplateConfig getNameplateConfig(String nameplate) { + return nameplateConfigMap.get(nameplate); + } + + public String getPlayer_name_papi() { + return player_name_papi; + } + + public long getPreview_time() { + return preview_time; } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java b/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java index 8ebcc4c..423863c 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java @@ -18,92 +18,188 @@ package net.momirealms.customnameplates.manager; import me.clip.placeholderapi.PlaceholderAPI; -import net.momirealms.customnameplates.hook.NameplatePlaceholders; -import net.momirealms.customnameplates.hook.OffsetPlaceholders; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.StaticText; -import net.momirealms.customnameplates.objects.background.BackGroundText; -import net.momirealms.customnameplates.objects.nameplates.NameplateText; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.StaticText; +import net.momirealms.customnameplates.object.font.OffsetFont; +import net.momirealms.customnameplates.placeholders.*; +import net.momirealms.customnameplates.utils.AdventureUtils; +import net.momirealms.customnameplates.utils.ConfigUtils; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.io.File; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PlaceholderManager extends Function { private final NameplatePlaceholders nameplatePlaceholders; - private final OffsetPlaceholders offsetPlaceholders; + private final Pattern placeholderPattern = Pattern.compile("%([^%]*)%"); + private final HashSet descent_fonts; + private final HashMap nameplateTextMap; + private final HashMap backGroundTextMap; + private final HashMap stringStaticTextMap; + private final HashMap descentTextMap; + private final HashMap conditionalTextsMap; + private final HashMap vanillaHudMap; - private final HashMap papiBG; - private final HashMap papiNP; - private final HashMap papiST; - - public PlaceholderManager() { - this.papiBG = new HashMap<>(); - this.papiNP = new HashMap<>(); - this.papiST = new HashMap<>(); - this.nameplatePlaceholders = new NameplatePlaceholders(this); - this.offsetPlaceholders = new OffsetPlaceholders(); + public PlaceholderManager(CustomNameplates plugin) { + this.nameplatePlaceholders = new NameplatePlaceholders(plugin, this); + this.descent_fonts = new HashSet<>(); + this.nameplateTextMap = new HashMap<>(); + this.backGroundTextMap = new HashMap<>(); + this.stringStaticTextMap = new HashMap<>(); + this.descentTextMap = new HashMap<>(); + this.conditionalTextsMap = new HashMap<>(); + this.vanillaHudMap = new HashMap<>(); } @Override public void load() { - loadPapi(); this.nameplatePlaceholders.register(); - this.offsetPlaceholders.register(); + this.loadConfig(); } @Override public void unload() { this.nameplatePlaceholders.unregister(); - this.offsetPlaceholders.unregister(); + this.descent_fonts.clear(); + this.nameplateTextMap.clear(); + this.backGroundTextMap.clear(); + this.stringStaticTextMap.clear(); + this.descentTextMap.clear(); + this.conditionalTextsMap.clear(); + this.vanillaHudMap.clear(); } - public String parsePlaceholders(Player player, String papi) { - if (papi == null || papi.equals("")) return ""; - return PlaceholderAPI.setPlaceholders(player, papi); + private void loadConfig() { + YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "custom-placeholders.yml"); + + ConfigurationSection nameplateSection = config.getConfigurationSection("nameplate-text"); + if (nameplateSection != null && ConfigManager.enableNameplates) { + loadNameplateText(nameplateSection); + } + + ConfigurationSection backgroundSection = config.getConfigurationSection("background-text"); + if (backgroundSection != null && ConfigManager.enableBackground) { + loadBackgroundText(backgroundSection); + } + + ConfigurationSection staticTextSection = config.getConfigurationSection("static-text"); + if (staticTextSection != null) { + loadStaticText(staticTextSection); + } + + ConfigurationSection descentSection = config.getConfigurationSection("descent-text"); + if (descentSection != null) { + loadDescentText(descentSection); + } + + ConfigurationSection conditionalSection = config.getConfigurationSection("conditional-text"); + if (conditionalSection != null) { + loadConditionalText(conditionalSection); + } + + ConfigurationSection vanillaHudSection = config.getConfigurationSection("vanilla-hud"); + if (vanillaHudSection != null) { + loadVanillaHud(vanillaHudSection); + } } - private final Pattern placeholderPattern = Pattern.compile("%([^%]*)%"); + private void loadVanillaHud(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + vanillaHudMap.put(key, new VanillaHud( + PlaceholderAPI.setPlaceholders(null, section.getString(key + ".images.empty", "")) + ConfigManager.surroundWithFont(String.valueOf(OffsetFont.NEG_2.getCharacter())), + PlaceholderAPI.setPlaceholders(null, section.getString(key + ".images.half", "")) + ConfigManager.surroundWithFont(String.valueOf(OffsetFont.NEG_2.getCharacter())), + PlaceholderAPI.setPlaceholders(null, section.getString(key + ".images.full", "")) + ConfigManager.surroundWithFont(String.valueOf(OffsetFont.NEG_2.getCharacter())), + section.getString(key + ".placeholder.value"), + section.getString(key + ".placeholder.max-value") + )); + } + } + + private void loadConditionalText(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + ConfigurationSection innerSection = section.getConfigurationSection(key); + if (innerSection != null) { + ArrayList conditionalTexts = new ArrayList<>(); + for (String priority : innerSection.getKeys(false)) { + ConditionalText conditionalText = new ConditionalText( + ConfigUtils.getRequirements(innerSection.getConfigurationSection(priority + ".conditions")), + innerSection.getString(priority + ".text") + ); + conditionalTexts.add(conditionalText); + } + conditionalTextsMap.put(key, new ConditionalTexts(conditionalTexts.toArray(new ConditionalText[0]))); + } + } + } + + private void loadDescentText(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + descent_fonts.add(8 - section.getInt(key + ".descent")); + descentTextMap.put(key, new DescentText(section.getString(key + ".text"), 8 - section.getInt(key + ".descent"))); + } + } + + private void loadStaticText(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + stringStaticTextMap.put(key, new StaticText(section.getString(key + ".text"), section.getInt(key + ".value"), section.getString(key + ".position", "left").equalsIgnoreCase("left"))); + } + } + + private void loadNameplateText(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + nameplateTextMap.put(key, new NameplateText(section.getString(key + ".text"), section.getString(key + ".nameplate"))); + } + } + + private void loadBackgroundText(ConfigurationSection section) { + for (String key : section.getKeys(false)) { + backGroundTextMap.put(key, new BackGroundText( + section.getString(key + ".text"), + section.getString(key + ".background"), + section.getBoolean(key + ".remove-shadow", true) + ) + ); + } + } public List detectPlaceholders(String text){ - if (text == null || !text.contains("%")) return Collections.emptyList(); List placeholders = new ArrayList<>(); Matcher matcher = placeholderPattern.matcher(text); while (matcher.find()) placeholders.add(matcher.group()); return placeholders; } - public void loadPapi() { - papiBG.clear(); - papiNP.clear(); - papiST.clear(); - YamlConfiguration papiInfo = ConfigUtil.getConfig("custom-papi.yml"); - papiInfo.getConfigurationSection("papi").getKeys(false).forEach(key -> { - if (papiInfo.contains("papi." + key + ".background")) - papiBG.put(key, new BackGroundText(papiInfo.getString("papi." + key + ".text"), papiInfo.getString("papi." + key + ".background"))); - if (papiInfo.contains("papi." + key + ".nameplate")) - papiNP.put(key, new NameplateText(papiInfo.getString("papi." + key + ".text"), papiInfo.getString("papi." + key + ".nameplate"))); - if (papiInfo.contains("papi." + key + ".static")) - papiST.put(key, new StaticText(papiInfo.getString("papi." + key + ".text"), papiInfo.getInt("papi." + key + ".static"))); - }); + public ConditionalTexts getConditionalTexts(String key) { + return conditionalTextsMap.get(key); } - public HashMap getPapiBG() { - return papiBG; + public BackGroundText getBackgroundText(String key) { + return backGroundTextMap.get(key); } - public HashMap getPapiNP() { - return papiNP; + public NameplateText getNameplateText(String key) { + return nameplateTextMap.get(key); } - public HashMap getPapiST() { - return papiST; + public StaticText getStaticText(String key) { + return stringStaticTextMap.get(key); + } + + public DescentText getDescentText(String key) { + return descentTextMap.get(key); + } + + public VanillaHud getVanillaHud(String key) { + return vanillaHudMap.get(key); + } + + public HashSet getDescent_fonts() { + return descent_fonts; } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java b/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java index 5fb9428..c60f606 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java @@ -21,390 +21,228 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.SimpleChar; -import net.momirealms.customnameplates.objects.background.BackGround; -import net.momirealms.customnameplates.objects.font.FontOffset; -import net.momirealms.customnameplates.objects.nameplates.BubbleConfig; -import net.momirealms.customnameplates.objects.nameplates.NameplateConfig; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.background.BackGroundConfig; +import net.momirealms.customnameplates.object.bubble.BubbleConfig; +import net.momirealms.customnameplates.object.font.OffsetFont; +import net.momirealms.customnameplates.object.nameplate.NameplateConfig; +import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; public class ResourceManager { - public static HashMap NAMEPLATES; - public static HashMap BUBBLES; - public static HashMap BACKGROUNDS; + private final CustomNameplates plugin; + + public ResourceManager(CustomNameplates plugin) { + this.plugin = plugin; + } public void generateResourcePack() { - File gd_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "ResourcePack"); - deleteDirectory(gd_file); - File font_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "ResourcePack" + File.separatorChar + ConfigManager.namespace + File.separatorChar + "font"); - File textures_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "ResourcePack" + File.separatorChar + ConfigManager.namespace + File.separatorChar + "textures"); - if (!font_file.mkdirs() || !textures_file.mkdirs()) { - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to generate resource pack folders..."); + File resourcePack_folder = new File(plugin.getDataFolder() + File.separator + "ResourcePack"); + this.deleteDirectory(resourcePack_folder); + File font_folder = new File(plugin.getDataFolder(), "ResourcePack" + File.separator + "assets" + File.separator + ConfigManager.namespace + File.separatorChar + "font"); + File textures_folder = new File(plugin.getDataFolder(), "ResourcePack" + File.separator+ "assets" + File.separator + ConfigManager.namespace + File.separatorChar + "textures"); + if (!font_folder.mkdirs() || !textures_folder.mkdirs()) { + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to generate resource pack folders..."); return; } - saveSplit(textures_file.getPath()); - JsonObject jsonObject_default = new JsonObject(); - JsonArray jsonArray_default = new JsonArray(); - jsonObject_default.add("providers", jsonArray_default); - getOffsetFontEnums().forEach(jsonArray_default::add); - loadNameplates(jsonArray_default, textures_file); - loadBubbles(jsonArray_default, textures_file); - loadBackgrounds(jsonArray_default, textures_file); - extractShaders(); - saveOffsets(); + JsonObject fontJsonObject = new JsonObject(); + JsonArray fontJsonArray = new JsonArray(); + fontJsonObject.add("providers", fontJsonArray); + this.getOffsetFontEnums().forEach(fontJsonArray::add); + this.loadNameplates(fontJsonArray, textures_folder); + this.loadBubbles(fontJsonArray, textures_folder); + this.loadBackgrounds(fontJsonArray, textures_folder); + this.loadImages(fontJsonArray, textures_folder); + this.extractShaders(); + this.saveOffsets(); + this.saveSplit(textures_folder.getPath()); try (FileWriter fileWriter = new FileWriter( - CustomNameplates.plugin.getDataFolder() + + plugin.getDataFolder() + File.separator + "ResourcePack" + + File.separator + "assets" + File.separator + ConfigManager.namespace + File.separator + "font" + - File.separator + ConfigManager.font + ".json")) + File.separator + ConfigManager.font + ".json") + ) { - fileWriter.write(jsonObject_default.toString().replace("\\\\", "\\")); + fileWriter.write(fontJsonObject.toString().replace("\\\\", "\\")); } catch (IOException e) { - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to generate font json..."); + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to generate font json file."); } - if (NAMEPLATES != null) AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + (NAMEPLATES.size() -1) + " nameplates"); - if (BUBBLES != null) AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + BUBBLES.size() + " bubbles"); - if (BACKGROUNDS != null) AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + BACKGROUNDS.size() + " backgrounds"); - hookCopy(gd_file); + this.hookCopy(resourcePack_folder); } - private void loadNameplates(JsonArray jsonArray_default, File textures_file) { - if (!ConfigUtil.isModuleEnabled("nameplate")) return; - File np_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "nameplates"); - if (!np_file.exists()) { - if (!np_file.mkdir()) return; - saveDefaultNameplates(); - } - File[] np_config_files = np_file.listFiles(file -> file.getName().endsWith(".yml")); - if (np_config_files == null) return; - Arrays.sort(np_config_files); - NAMEPLATES = new HashMap<>(); - NAMEPLATES.put("none", NameplateConfig.EMPTY); - for (File np_config_file : np_config_files) { - char left = ConfigManager.start; - char middle; - char right; - ConfigManager.start = (char) ((right = (char) ((middle = (char) (ConfigManager.start + '\u0001')) + '\u0001')) + '\u0001'); + private void loadImages(JsonArray jsonArray, File textures_file) { + if (!ConfigManager.enableImages) return; + for (SimpleChar simpleChar : plugin.getImageManager().getCharacterMap().values()) { + JsonObject jo_np = new JsonObject(); + jo_np.add("type", new JsonPrimitive("bitmap")); + jo_np.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.images_folder_path.replaceAll("\\\\", "/") + simpleChar.getFile())); + addCharToArray(jsonArray, simpleChar, jo_np); try { - String key = np_config_file.getName().substring(0, np_config_file.getName().length() - 4); - YamlConfiguration config = YamlConfiguration.loadConfiguration(np_config_file); - if (!config.contains("display-name")) config.set("display-name", key); - if (!config.contains("name-color")) config.set("name-color", "white"); - if (!config.contains("left.image")) config.set("left.image", key + "_left"); - if (!config.contains("left.height")) config.set("left.height", 16); - if (!config.contains("left.ascent")) config.set("left.ascent", 12); - if (!config.contains("left.width")) config.set("left.width", 16); - if (!config.contains("middle.image")) config.set("middle.image", key + "_middle"); - if (!config.contains("middle.height")) config.set("middle.height", 16); - if (!config.contains("middle.ascent")) config.set("middle.ascent", 12); - if (!config.contains("middle.width")) config.set("middle.width", 16); - if (!config.contains("right.image")) config.set("right.image", key + "_right"); - if (!config.contains("right.height")) config.set("right.height", 16); - if (!config.contains("right.ascent")) config.set("right.ascent", 12); - if (!config.contains("right.width")) config.set("right.width", 16); - SimpleChar leftChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"), config.getInt("left.width"), left, config.getString("left.image") + ".png"); - SimpleChar middleChar = new SimpleChar(config.getInt("middle.height"), config.getInt("middle.ascent"), config.getInt("middle.width"), middle, config.getString("middle.image") + ".png"); - SimpleChar rightChar = new SimpleChar(config.getInt("right.height"), config.getInt("right.ascent"), config.getInt("right.width"), right, config.getString("right.image") + ".png"); - ChatColor color = ChatColor.valueOf(Objects.requireNonNull(config.getString("color", "WHITE")).toUpperCase()); - config.save(np_config_file); - NameplateConfig nameplateConfig = new NameplateConfig(color, config.getString("display-name"), leftChar, middleChar, rightChar); - NAMEPLATES.put(key, nameplateConfig); - SimpleChar[] simpleChars = new SimpleChar[]{leftChar, middleChar, rightChar}; - for (SimpleChar simpleChar : simpleChars) { - JsonObject jo_np = new JsonObject(); - jo_np.add("type", new JsonPrimitive("bitmap")); - jo_np.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.np_folder_path.replaceAll("\\\\", "/") + simpleChar.getFile())); - jo_np.add("ascent", new JsonPrimitive(simpleChar.getAscent())); - jo_np.add("height", new JsonPrimitive(simpleChar.getHeight())); - JsonArray ja_simple = new JsonArray(); - ja_simple.add(native2ascii(simpleChar.getChars())); - jo_np.add("chars", ja_simple); - jsonArray_default.add(jo_np); - try { - FileUtils.copyFile(new File(np_config_file.getParent() + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.np_folder_path, "\\", File.separator) + simpleChar.getFile())); - } catch (IOException e) { - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy nameplate " + key + " png files to resource pack..."); - } - } - } catch (Exception e) { - e.printStackTrace(); + FileUtils.copyFile(new File(plugin.getDataFolder(), "contents" + File.separator + "images" + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.images_folder_path, "\\", File.separator) + simpleChar.getFile())); + } catch (IOException e) { + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy images to resource pack."); } } } - private void loadBubbles(JsonArray jsonArray_default, File textures_file) { - if (!ConfigUtil.isModuleEnabled("bubbles")) return; - File bb_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "bubbles"); - if (!bb_file.exists()) { - if (!bb_file.mkdir()) return; - saveDefaultBubbles(); - } - BUBBLES = new HashMap<>(); - File[] bb_config_files = bb_file.listFiles(file -> file.getName().endsWith(".yml")); - if (bb_config_files == null) return; - Arrays.sort(bb_config_files); - for (File bb_config_file : bb_config_files) { - char left = ConfigManager.start; - char middle; - char right; - char tail; - ConfigManager.start = (char) ((tail = (char)((right = (char)((middle = (char)(ConfigManager.start + '\u0001')) + '\u0001')) + '\u0001')) + '\u0001'); - try { - String key = bb_config_file.getName().substring(0, bb_config_file.getName().length() - 4); - YamlConfiguration config = YamlConfiguration.loadConfiguration(bb_config_file); - if (!config.contains("display-name")) config.set("display-name", key); - if (!config.contains("text-format")) config.set("text-format", ""); - if (!config.contains("left.image")) config.set("left.image", key + "_left"); - if (!config.contains("left.height")) config.set("left.height", 16); - if (!config.contains("left.width")) config.set("left.width", 16); - if (!config.contains("left.ascent")) config.set("left.ascent", 12); - if (!config.contains("middle.image")) config.set("middle.image", key + "_middle"); - if (!config.contains("middle.height")) config.set("middle.height", 16); - if (!config.contains("middle.width")) config.set("middle.width", 16); - if (!config.contains("middle.ascent")) config.set("middle.ascent", 12); - if (!config.contains("right.image")) config.set("right.image", key + "_right"); - if (!config.contains("right.height")) config.set("right.height", 16); - if (!config.contains("right.width")) config.set("right.width", 16); - if (!config.contains("right.ascent")) config.set("right.ascent", 12); - if (!config.contains("tail.image")) config.set("tail.image", key + "_tail"); - if (!config.contains("tail.height")) config.set("tail.height", 16); - if (!config.contains("tail.width")) config.set("tail.width", 16); - if (!config.contains("tail.ascent")) config.set("tail.ascent", 12); - SimpleChar leftChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"), config.getInt("left.width"), left, config.getString("left.image") + ".png"); - SimpleChar middleChar = new SimpleChar(config.getInt("middle.height"), config.getInt("middle.ascent"), config.getInt("middle.width"), middle, config.getString("middle.image") + ".png"); - SimpleChar rightChar = new SimpleChar(config.getInt("right.height"), config.getInt("right.ascent"), config.getInt("right.width"), right, config.getString("right.image") + ".png"); - SimpleChar tailChar = new SimpleChar(config.getInt("tail.height"), config.getInt("tail.ascent"), config.getInt("tail.width"), tail, config.getString("tail.image") + ".png"); - config.save(bb_config_file); - BubbleConfig bubbleConfig = new BubbleConfig(config.getString("text-format"), config.getString("display-name"), - leftChar, middleChar, - rightChar, tailChar); - BUBBLES.put(key, bubbleConfig); - SimpleChar[] simpleChars = new SimpleChar[]{leftChar, middleChar, rightChar, tailChar}; - for (SimpleChar simpleChar : simpleChars) { - JsonObject jo_bb = new JsonObject(); - jo_bb.add("type", new JsonPrimitive("bitmap")); - jo_bb.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.bb_folder_path.replaceAll("\\\\","/") + simpleChar.getFile())); - jo_bb.add("ascent", new JsonPrimitive(simpleChar.getAscent())); - jo_bb.add("height", new JsonPrimitive(simpleChar.getHeight())); - JsonArray ja_simple = new JsonArray(); - ja_simple.add(native2ascii(simpleChar.getChars())); - jo_bb.add("chars", ja_simple); - jsonArray_default.add(jo_bb); - try { - FileUtils.copyFile(new File(bb_config_file.getParent() + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.bb_folder_path, "\\", File.separator) + simpleChar.getFile())); - } - catch (IOException e){ - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy bubble " + key + " png files to resource pack..."); - } + private void loadNameplates(JsonArray jsonArray, File textures_file) { + if (!ConfigManager.enableNameplates) return; + for (NameplateConfig nameplateConfig : plugin.getNameplateManager().getNameplateConfigMap().values()) { + if (nameplateConfig == NameplateConfig.EMPTY) continue; + for (SimpleChar simpleChar : new SimpleChar[]{nameplateConfig.left(), nameplateConfig.middle(), nameplateConfig.right()}) { + JsonObject jo_np = new JsonObject(); + jo_np.add("type", new JsonPrimitive("bitmap")); + jo_np.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.nameplates_folder_path.replaceAll("\\\\", "/") + simpleChar.getFile())); + addCharToArray(jsonArray, simpleChar, jo_np); + try { + FileUtils.copyFile(new File(plugin.getDataFolder(), "contents" + File.separator + "nameplates" + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.nameplates_folder_path, "\\", File.separator) + simpleChar.getFile())); + } catch (IOException e) { + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy nameplates to resource pack."); } } - catch (Exception e) { - e.printStackTrace(); - } } } - private void loadBackgrounds(JsonArray jsonArray_default, File textures_file) { - if (!ConfigUtil.isModuleEnabled("background")) return; - File bg_file = new File(CustomNameplates.plugin.getDataFolder() + File.separator + "backgrounds"); - if (!bg_file.exists()) { - if (!bg_file.mkdir()) { - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to create resources folder..."); - return; - } - saveDefaultBackgrounds(); - } - BACKGROUNDS = new HashMap<>(); - File[] bg_config_files = bg_file.listFiles(file -> file.getName().endsWith(".yml")); - if (bg_config_files == null) return; - Arrays.sort(bg_config_files); - for (File bg_config_file : bg_config_files) { - try { - String key = bg_config_file.getName().substring(0, bg_config_file.getName().length() - 4); - YamlConfiguration config = YamlConfiguration.loadConfiguration(bg_config_file); - char oStart = ConfigManager.start; - char o1 = (char) (oStart + '\u0001'); - char o2 = (char) (o1 + '\u0001'); - char o4 = (char) (o2 + '\u0001'); - char o8 = (char) (o4 + '\u0001'); - char o16 = (char) (o8 + '\u0001'); - char o32 = (char) (o16 + '\u0001'); - char o64 = (char) (o32 + '\u0001'); - char o128 = (char) (o64 + '\u0001'); - char oEnd = (char) (o128 + '\u0001'); - ConfigManager.start = (char) (oEnd + '\u0001'); - int height = config.getInt("middle.height", 14); - int ascent = config.getInt("middle.ascent", 8); - SimpleChar startChar = new SimpleChar(config.getInt("left.height"), config.getInt("left.ascent"),1 ,oStart, config.getString("left.image") + ".png"); - SimpleChar offset_1 = new SimpleChar(height, ascent,1, o1, config.getString("middle.1") + ".png"); - SimpleChar offset_2 = new SimpleChar(height, ascent,1, o2, config.getString("middle.2") + ".png"); - SimpleChar offset_4 = new SimpleChar(height, ascent,1, o4, config.getString("middle.4") + ".png"); - SimpleChar offset_8 = new SimpleChar(height, ascent,1, o8, config.getString("middle.8") + ".png"); - SimpleChar offset_16 = new SimpleChar(height, ascent,1, o16, config.getString("middle.16") + ".png"); - SimpleChar offset_32 = new SimpleChar(height, ascent,1, o32, config.getString("middle.32") + ".png"); - SimpleChar offset_64 = new SimpleChar(height, ascent,1, o64, config.getString("middle.64") + ".png"); - SimpleChar offset_128 = new SimpleChar(height, ascent,1, o128, config.getString("middle.128") + ".png"); - SimpleChar endChar = new SimpleChar(config.getInt("right.height"),config.getInt("right.ascent"),1, oEnd, config.getString("right.image") + ".png"); - BackGround backGround = new BackGround(startChar, offset_1, - offset_2, offset_4, - offset_8, offset_16, - offset_32, offset_64, - offset_128, endChar, - config.getInt("start-width", 1), config.getInt("end-width", 1)); - BACKGROUNDS.put(key, backGround); - SimpleChar[] simpleChars = new SimpleChar[]{startChar, offset_1, - offset_2, offset_4, - offset_8, offset_16, - offset_32, offset_64, - offset_128, endChar}; - for (SimpleChar simpleChar : simpleChars) { - JsonObject jo_bg = new JsonObject(); - jo_bg.add("type", new JsonPrimitive("bitmap")); - jo_bg.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.bg_folder_path.replaceAll("\\\\","/") + simpleChar.getFile())); - jo_bg.add("ascent", new JsonPrimitive(simpleChar.getAscent())); - jo_bg.add("height", new JsonPrimitive(simpleChar.getHeight())); - JsonArray ja_simple = new JsonArray(); - ja_simple.add(native2ascii(simpleChar.getChars())); - jo_bg.add("chars", ja_simple); - jsonArray_default.add(jo_bg); - try { - FileUtils.copyFile(new File(bg_config_file.getParent() + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.bg_folder_path, "\\", File.separator) + simpleChar.getFile())); - } - catch (IOException e){ - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy background " + key + " png files to resource pack..."); - } + private void loadBubbles(JsonArray jsonArray, File textures_file) { + if (!ConfigManager.enableBubbles) return; + for (BubbleConfig bubbleConfig : plugin.getChatBubblesManager().getBubbleConfigMap().values()) { + SimpleChar[] simpleChars = new SimpleChar[]{bubbleConfig.left(), bubbleConfig.middle(), bubbleConfig.right(), bubbleConfig.tail()}; + for (SimpleChar simpleChar : simpleChars) { + JsonObject jo_bb = new JsonObject(); + jo_bb.add("type", new JsonPrimitive("bitmap")); + jo_bb.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.bubbles_folder_path.replaceAll("\\\\","/") + simpleChar.getFile())); + addCharToArray(jsonArray, simpleChar, jo_bb); + try { + FileUtils.copyFile(new File(plugin.getDataFolder(),"contents" + File.separator + "bubbles" + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separator + StringUtils.replace(ConfigManager.bubbles_folder_path, "\\", File.separator) + simpleChar.getFile())); + } + catch (IOException e){ + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy bubbles to resource pack."); } } - catch (Exception e) { - e.printStackTrace(); + } + } + + private void loadBackgrounds(JsonArray jsonArray, File textures_file) { + if (!ConfigManager.enableBackground) return; + for (BackGroundConfig backGroundConfig : plugin.getBackgroundManager().getBackGroundConfigMap().values()) { + for (SimpleChar simpleChar : new SimpleChar[]{ + backGroundConfig.left(), backGroundConfig.offset_1(), + backGroundConfig.offset_2(), backGroundConfig.offset_4(), + backGroundConfig.offset_8(), backGroundConfig.offset_16(), + backGroundConfig.offset_32(), backGroundConfig.offset_64(), + backGroundConfig.offset_128(), backGroundConfig.right()}) { + JsonObject jo_bg = new JsonObject(); + jo_bg.add("type", new JsonPrimitive("bitmap")); + jo_bg.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.backgrounds_folder_path.replaceAll("\\\\","/") + simpleChar.getFile())); + addCharToArray(jsonArray, simpleChar, jo_bg); + try { + FileUtils.copyFile(new File(plugin.getDataFolder(), "contents" + File.separator + "backgrounds" + File.separator + simpleChar.getFile()), new File(textures_file.getPath() + File.separatorChar + StringUtils.replace(ConfigManager.backgrounds_folder_path, "\\", File.separator) + simpleChar.getFile())); + } + catch (IOException e){ + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy backgrounds to resource pack."); + } } } } + private void addCharToArray(JsonArray jsonArray, SimpleChar simpleChar, JsonObject jsonObject) { + jsonObject.add("ascent", new JsonPrimitive(simpleChar.getAscent())); + jsonObject.add("height", new JsonPrimitive(simpleChar.getHeight())); + JsonArray ja_simple = new JsonArray(); + ja_simple.add(native2ascii(simpleChar.getChars())); + jsonObject.add("chars", ja_simple); + jsonArray.add(jsonObject); + } + private void extractShaders() { if (ConfigManager.extract) { - String path = "ResourcePack" + File.separator + "minecraft" + File.separator + "shaders" + File.separator + "core" + File.separator; - CustomNameplates.plugin.saveResource(path + "rendertype_text.fsh", true); - CustomNameplates.plugin.saveResource(path + "rendertype_text.json", true); - CustomNameplates.plugin.saveResource(path + "rendertype_text.vsh", true); - CustomNameplates.plugin.saveResource(path + "rendertype_text_see_through.fsh", true); - CustomNameplates.plugin.saveResource(path + "rendertype_text_see_through.json", true); - CustomNameplates.plugin.saveResource(path + "rendertype_text_see_through.vsh", true); + String path = "ResourcePack" + File.separator + "assets" + File.separator + "minecraft" + File.separator + "shaders" + File.separator + "core" + File.separator; + plugin.saveResource(path + "rendertype_text.fsh", true); + plugin.saveResource(path + "rendertype_text.json", true); + plugin.saveResource(path + "rendertype_text.vsh", true); } } private void saveOffsets() { - if (ConfigManager.offsets.size() != 0){ - for (int offset : ConfigManager.offsets) { - JsonObject jsonObject_offset = new JsonObject(); - JsonArray jsonArray_offset = new JsonArray(); - jsonObject_offset.add("providers", jsonArray_offset); - JsonObject jo_providers = new JsonObject(); - jo_providers.add("type", new JsonPrimitive("space")); - JsonObject jo_space = new JsonObject(); - jo_space.add(" ", new JsonPrimitive(4)); - jo_space.add("\\u200c", new JsonPrimitive(0)); - jo_providers.add("advances", jo_space); - jsonArray_offset.add(jo_providers); - JsonObject jo_ascii = new JsonObject(); - jo_ascii.add("type", new JsonPrimitive("bitmap")); - jo_ascii.add("file", new JsonPrimitive("minecraft:font/ascii.png")); - jo_ascii.add("ascent", new JsonPrimitive(offset)); - jo_ascii.add("height", new JsonPrimitive(8)); - JsonArray ja_ascii = new JsonArray(); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); - ja_ascii.add("\\u0020\\u0021\\u0022\\u0023\\u0024\\u0025\\u0026\\u0027\\u0028\\u0029\\u002a\\u002b\\u002c\\u002d\\u002e\\u002f"); - ja_ascii.add("\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u003a\\u003b\\u003c\\u003d\\u003e\\u003f"); - ja_ascii.add("\\u0040\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f"); - ja_ascii.add("\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u005b\\u005c\\u005d\\u005e\\u005f"); - ja_ascii.add("\\u0060\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f"); - ja_ascii.add("\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u007b\\u007c\\u007d\\u007e\\u0000"); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00a3\\u0000\\u0000\\u0192"); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00aa\\u00ba\\u0000\\u0000\\u00ac\\u0000\\u0000\\u0000\\u00ab\\u00bb"); - ja_ascii.add("\\u2591\\u2592\\u2593\\u2502\\u2524\\u2561\\u2562\\u2556\\u2555\\u2563\\u2551\\u2557\\u255d\\u255c\\u255b\\u2510"); - ja_ascii.add("\\u2514\\u2534\\u252c\\u251c\\u2500\\u253c\\u255e\\u255f\\u255a\\u2554\\u2569\\u2566\\u2560\\u2550\\u256c\\u2567"); - ja_ascii.add("\\u2568\\u2564\\u2565\\u2559\\u2558\\u2552\\u2553\\u256b\\u256a\\u2518\\u250c\\u2588\\u2584\\u258c\\u2590\\u2580"); - ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u2205\\u2208\\u0000"); - ja_ascii.add("\\u2261\\u00b1\\u2265\\u2264\\u2320\\u2321\\u00f7\\u2248\\u00b0\\u2219\\u0000\\u221a\\u207f\\u00b2\\u25a0\\u0000"); - jo_ascii.add("chars", ja_ascii); - jsonArray_offset.add(jo_ascii); - try (FileWriter fileWriter = new FileWriter( - CustomNameplates.plugin.getDataFolder() + - File.separator + "ResourcePack" + - File.separator + ConfigManager.namespace + - File.separator + "font" + - File.separator + "offset_" + offset + ".json")) { - fileWriter.write(jsonObject_offset.toString().replace("\\\\", "\\")); - } - catch (IOException e) { - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to generate offset font json..."); - } + for (int ascent : plugin.getPlaceholderManager().getDescent_fonts()) { + JsonObject jsonObject_offset = new JsonObject(); + JsonArray jsonArray_offset = new JsonArray(); + jsonObject_offset.add("providers", jsonArray_offset); + JsonObject jo_providers = new JsonObject(); + jo_providers.add("type", new JsonPrimitive("space")); + JsonObject jo_space = new JsonObject(); + jo_space.add(" ", new JsonPrimitive(4)); + jo_space.add("\\u200c", new JsonPrimitive(0)); + jo_providers.add("advances", jo_space); + jsonArray_offset.add(jo_providers); + JsonObject jo_ascii = new JsonObject(); + jo_ascii.add("type", new JsonPrimitive("bitmap")); + jo_ascii.add("file", new JsonPrimitive("minecraft:font/ascii.png")); + jo_ascii.add("ascent", new JsonPrimitive(ascent)); + jo_ascii.add("height", new JsonPrimitive(8)); + JsonArray ja_ascii = new JsonArray(); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); + ja_ascii.add("\\u0020\\u0021\\u0022\\u0023\\u0024\\u0025\\u0026\\u0027\\u0028\\u0029\\u002a\\u002b\\u002c\\u002d\\u002e\\u002f"); + ja_ascii.add("\\u0030\\u0031\\u0032\\u0033\\u0034\\u0035\\u0036\\u0037\\u0038\\u0039\\u003a\\u003b\\u003c\\u003d\\u003e\\u003f"); + ja_ascii.add("\\u0040\\u0041\\u0042\\u0043\\u0044\\u0045\\u0046\\u0047\\u0048\\u0049\\u004a\\u004b\\u004c\\u004d\\u004e\\u004f"); + ja_ascii.add("\\u0050\\u0051\\u0052\\u0053\\u0054\\u0055\\u0056\\u0057\\u0058\\u0059\\u005a\\u005b\\u005c\\u005d\\u005e\\u005f"); + ja_ascii.add("\\u0060\\u0061\\u0062\\u0063\\u0064\\u0065\\u0066\\u0067\\u0068\\u0069\\u006a\\u006b\\u006c\\u006d\\u006e\\u006f"); + ja_ascii.add("\\u0070\\u0071\\u0072\\u0073\\u0074\\u0075\\u0076\\u0077\\u0078\\u0079\\u007a\\u007b\\u007c\\u007d\\u007e\\u0000"); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000"); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00a3\\u0000\\u0000\\u0192"); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00aa\\u00ba\\u0000\\u0000\\u00ac\\u0000\\u0000\\u0000\\u00ab\\u00bb"); + ja_ascii.add("\\u2591\\u2592\\u2593\\u2502\\u2524\\u2561\\u2562\\u2556\\u2555\\u2563\\u2551\\u2557\\u255d\\u255c\\u255b\\u2510"); + ja_ascii.add("\\u2514\\u2534\\u252c\\u251c\\u2500\\u253c\\u255e\\u255f\\u255a\\u2554\\u2569\\u2566\\u2560\\u2550\\u256c\\u2567"); + ja_ascii.add("\\u2568\\u2564\\u2565\\u2559\\u2558\\u2552\\u2553\\u256b\\u256a\\u2518\\u250c\\u2588\\u2584\\u258c\\u2590\\u2580"); + ja_ascii.add("\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u2205\\u2208\\u0000"); + ja_ascii.add("\\u2261\\u00b1\\u2265\\u2264\\u2320\\u2321\\u00f7\\u2248\\u00b0\\u2219\\u0000\\u221a\\u207f\\u00b2\\u25a0\\u0000"); + jo_ascii.add("chars", ja_ascii); + jsonArray_offset.add(jo_ascii); + try (FileWriter fileWriter = new FileWriter( + plugin.getDataFolder() + + File.separator + "ResourcePack" + + File.separator + "assets" + + File.separator + ConfigManager.namespace + + File.separator + "font" + + File.separator + "ascent_" + ascent + ".json")) { + fileWriter.write(jsonObject_offset.toString().replace("\\\\", "\\")); } - } - } - - private void saveDefaultNameplates() { - String[] png_list = new String[]{"cat", "egg", "cheems", "wither", "xmas", "halloween", "hutao", "starsky", "trident", "rabbit"}; - String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", ".yml"}; - for (String name : png_list) { - for (String part : part_list) { - CustomNameplates.plugin.saveResource("nameplates" + File.separatorChar + name + part, false); + catch (IOException e) { + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to generate offset font json."); } } } - private void saveDefaultBubbles() { - String[] png_list = new String[]{"chat"}; - String[] part_list = new String[]{"_left.png", "_middle.png", "_right.png", "_tail.png", ".yml"}; - for (String name : png_list) { - for (String part : part_list) { - CustomNameplates.plugin.saveResource("bubbles" + File.separatorChar + name + part, false); - } - } - } - - private void saveDefaultBackgrounds() { - String[] bg_list = new String[]{"b0", "b1", "b2", "b4", "b8", "b16","b32","b64","b128"}; - for (String bg : bg_list) { - CustomNameplates.plugin.saveResource("backgrounds" + File.separatorChar + bg + ".png", false); - } - String[] config_list = new String[]{"bedrock_1", "bedrock_2", "bedrock_3"}; - for (String config : config_list) { - CustomNameplates.plugin.saveResource("backgrounds" + File.separatorChar + config + ".yml", false); - } - } - private void deleteDirectory(File file){ - if(file.exists()){ + if (file.exists()) { try{ FileUtils.deleteDirectory(file); } catch (IOException e){ e.printStackTrace(); - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to delete generated folder..." ); + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to delete the generated folder..." ); } } } private List getOffsetFontEnums() { ArrayList list = new ArrayList<>(); - for (FontOffset offsetFont : FontOffset.values()) { + for (OffsetFont offsetFont : OffsetFont.values()) { list.add(this.getOffsetFontChar(offsetFont.getHeight(), offsetFont.getCharacter())); } return list; @@ -413,7 +251,7 @@ public class ResourceManager { private JsonObject getOffsetFontChar(int height, char character) { JsonObject jsonObject = new JsonObject(); jsonObject.add("type", new JsonPrimitive("bitmap")); - jsonObject.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.ss_folder_path.replaceAll("\\\\","/") + "space_split.png")); + jsonObject.add("file", new JsonPrimitive(ConfigManager.namespace + ":" + ConfigManager.space_split_folder_path.replaceAll("\\\\","/") + "space_split.png")); jsonObject.add("ascent", new JsonPrimitive(-5000)); jsonObject.add("height", new JsonPrimitive(height)); final JsonArray jsonArray = new JsonArray(); @@ -434,46 +272,37 @@ public class ResourceManager { return Character.toString(ch); } - private void saveSplit(String path) { - try{ - CustomNameplates.plugin.saveResource("space_split.png", false); - FileUtils.copyFile(new File(CustomNameplates.plugin.getDataFolder(),"space_split.png"), new File(path + File.separator + StringUtils.replace(ConfigManager.ss_folder_path, "\\", File.separator) + "space_split.png")); - new File(CustomNameplates.plugin.getDataFolder(),"space_split.png").delete(); - }catch (IOException e){ - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy space_split.png to resource pack..."); + private void saveSplit(String texture_folder_path) { + try { + plugin.saveResource("space_split.png", false); + FileUtils.copyFile(new File(plugin.getDataFolder(),"space_split.png"), new File(texture_folder_path + File.separator + StringUtils.replace(ConfigManager.space_split_folder_path, "\\", File.separator) + "space_split.png")); + File file = new File(plugin.getDataFolder(),"space_split.png"); + if (file.exists()) { + file.delete(); + } + } catch (IOException e){ + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy space_split.png to resource pack..."); } } - private void hookCopy(File generated) { + private void hookCopy(File resourcePack_folder) { if (ConfigManager.itemsAdderHook){ try { - FileUtils.copyDirectory(generated, new File(Bukkit.getPluginManager().getPlugin("ItemsAdder").getDataFolder() + File.separator + "contents" + File.separator + "nameplates" + File.separator + "resourcepack" + File.separator + "assets") ); + FileUtils.copyDirectory(resourcePack_folder, new File(Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("ItemsAdder")).getDataFolder() + File.separator + "contents" + File.separator + "contents/nameplates" + File.separator + "resourcepack") ); } catch (IOException e){ e.printStackTrace(); - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy files to ItemsAdder..."); + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy files to ItemsAdder..."); } } if (ConfigManager.oraxenHook){ try { - FileUtils.copyDirectory(new File(generated, File.separator + ConfigManager.namespace), new File(Bukkit.getPluginManager().getPlugin("Oraxen").getDataFolder() + File.separator + "pack"+ File.separator + "assets" + File.separator + ConfigManager.namespace)); + FileUtils.copyDirectory(new File(resourcePack_folder, "assets"), new File(Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("Oraxen")).getDataFolder() + File.separator + "pack" + File.separator + "assets")); } catch (IOException e){ e.printStackTrace(); - AdventureUtil.consoleMessage("[CustomNameplates] Error! Failed to copy files to Oraxen..."); + AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy files to Oraxen..."); } } } - - public NameplateConfig getNameplateConfig(String nameplate) { - return NAMEPLATES.get(nameplate); - } - - public BubbleConfig getBubbleConfig(String bubble) { - return BUBBLES.get(bubble); - } - - public BackGround getBackground(String background) { - return BACKGROUNDS.get(background); - } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java b/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java index 356688c..f96d31e 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java @@ -18,52 +18,77 @@ package net.momirealms.customnameplates.manager; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import net.momirealms.customnameplates.objects.team.*; -import net.momirealms.customnameplates.utils.TeamManagePacketUtil; +import net.momirealms.customnameplates.listener.JoinQuitListener; +import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.object.team.TeamNameInterface; +import net.momirealms.customnameplates.object.team.TeamPacketInterface; +import net.momirealms.customnameplates.object.team.name.PlayerNameTeamImpl; +import net.momirealms.customnameplates.object.team.name.TABBungeeCordImpl; +import net.momirealms.customnameplates.object.team.name.TABImpl; +import net.momirealms.customnameplates.object.team.packet.TeamInfoImpl; +import net.momirealms.customnameplates.object.team.packet.TeamVisibilityImpl; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; import org.jetbrains.annotations.Nullable; -import java.util.Map; +import java.util.HashMap; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class TeamManager extends Function { - private final ConcurrentHashMap teams ; + private final ConcurrentHashMap teams ; private TeamPacketInterface teamPacketInterface; private TeamNameInterface teamNameInterface; - private final TeamManagePacketUtil teamManagePacketUtil; + private final JoinQuitListener joinQuitListener; + private final CustomNameplates plugin; + private final ConcurrentHashMap triedTimes; - public TeamManager() { - teams = new ConcurrentHashMap<>(); - this.teamManagePacketUtil = new TeamManagePacketUtil(this); + public TeamManager(CustomNameplates plugin) { + this.plugin = plugin; + this.teams = new ConcurrentHashMap<>(); + this.joinQuitListener = new JoinQuitListener(this); + this.triedTimes = new ConcurrentHashMap<>(); } @Override public void load() { - if (NameplateManager.mode.equalsIgnoreCase("Team")) { - teamPacketInterface = new TeamPrefixSuffix(this); - } - if (NameplateManager.mode.equalsIgnoreCase("Teleporting") || NameplateManager.mode.equalsIgnoreCase("Riding")) { - teamPacketInterface = new SimpleTeamVisibility(this); - } - + Bukkit.getPluginManager().registerEvents(joinQuitListener, plugin); if (ConfigManager.tab_BC_hook) { - teamNameInterface = new TABbcHook(); - } - else if (ConfigManager.tab_hook) { - teamNameInterface = new TABTeamHook(); - } - else { - teamNameInterface = new SimpleTeam(); + teamNameInterface = new TABBungeeCordImpl(); + } else if (ConfigManager.tab_hook) { + teamNameInterface = new TABImpl(); + } else { + teamNameInterface = new PlayerNameTeamImpl(this); } + teamNameInterface.load(); } @Override public void unload() { - if (teamNameInterface != null) teamNameInterface.unload(); + HandlerList.unregisterAll(joinQuitListener); + if (teamNameInterface != null) { + teamNameInterface.unload(); + } + teamPacketInterface = null; + } + + @Override + public void onQuit(Player player) { + this.removePlayerFromTeamCache(player); + teamNameInterface.onQuit(player); + triedTimes.remove(player.getUniqueId()); + } + + public void setTeamPacketInterface() { + if (plugin.getNameplateManager().getMode() == DisplayMode.TEAM) { + teamPacketInterface = new TeamInfoImpl(this); + } else if (plugin.getNameplateManager().getMode() == DisplayMode.ARMOR_STAND) { + teamPacketInterface = new TeamVisibilityImpl(this); + } } public void sendUpdateToOne(Player player) { @@ -74,39 +99,55 @@ public class TeamManager extends Function { if (teamPacketInterface != null) teamPacketInterface.sendUpdateToAll(player, force); } - public void createTeam(Player player) { - String teamName = getTeamName(player); + public void createTeam(UUID uuid) { + Player player = Bukkit.getPlayer(uuid); + if (player == null || !player.isOnline() || !checkTriedTimes(player.getUniqueId())) return; + String teamName = getCurrentTeamName(player); if (teamName != null) { - if (!teams.containsKey(teamName)) teams.put(teamName, new NameplatesTeam(player, this)); - teamPacketInterface.sendUpdateToAll(player, false); + if (!teams.containsKey(uuid)) teams.put(uuid, new NameplatesTeam(plugin.getNameplateManager(), player, teamName)); + teamPacketInterface.sendUpdateToAll(player, true); teamPacketInterface.sendUpdateToOne(player); } + // wait for bc else { - if (player == null || !player.isOnline()) return; - Bukkit.getScheduler().runTaskLater(CustomNameplates.plugin, () -> { - createTeam(player); - },20); + Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.getInstance(), () -> createTeam(uuid),10); } } - public Map getTeams() { - return teams; + @Nullable + public NameplatesTeam getNameplateTeam(UUID uuid) { + return teams.get(uuid); } - public String getTeamName(Player player) { + public String getCurrentTeamName(Player player) { return teamNameInterface.getTeamName(player); } public void removePlayerFromTeamCache(Player player) { - teams.remove(getTeamName(player)); + teams.remove(player.getUniqueId()); } - @Nullable - public NameplatesTeam getNameplatesTeam(Player player) { - return teams.get(getTeamName(player)); + public boolean isFakeTeam() { + return plugin.getNameplateManager().isFakeTeam(); } - public TeamManagePacketUtil getTeamManagePacketUtil() { - return teamManagePacketUtil; + protected boolean checkTriedTimes(UUID uuid) { + Integer previous = triedTimes.get(uuid); + if (previous == null) { + triedTimes.put(uuid, 1); + return true; + } + else if (previous > 4) { + triedTimes.remove(uuid); + return false; + } + else { + triedTimes.put(uuid, previous + 1); + return true; + } + } + + public TeamNameInterface getTeamNameInterface() { + return teamNameInterface; } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/WidthManager.java b/src/main/java/net/momirealms/customnameplates/manager/WidthManager.java deleted file mode 100644 index 4fe6de4..0000000 --- a/src/main/java/net/momirealms/customnameplates/manager/WidthManager.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.momirealms.customnameplates.manager; - -import net.momirealms.customnameplates.objects.Function; -import net.momirealms.customnameplates.objects.font.FontOffset; -import net.momirealms.customnameplates.objects.font.FontWidthNormal; -import net.momirealms.customnameplates.objects.font.FontWidthThin; -import net.momirealms.customnameplates.utils.AdventureUtil; -import net.momirealms.customnameplates.utils.ConfigUtil; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.util.HashMap; - -public class WidthManager extends Function { - - public static HashMap fontWidth = new HashMap<>(); - - @Override - public void load() { - loadWidth(); - } - - @Override - public void unload() { - super.unload(); - } - - public void loadWidth() { - fontWidth.clear(); - YamlConfiguration config = ConfigUtil.getConfig("char-width.yml"); - for (String key : config.getKeys(false)) { - if (key.length() == 1) { - fontWidth.put(key.charAt(0), config.getInt(key)); - } - else { - AdventureUtil.consoleMessage("[CustomNameplates] " + key + " in custom char-width.yml is in wrong format or not supported"); - } - } - AdventureUtil.consoleMessage("[CustomNameplates] Loaded " + fontWidth.size() + " custom char-width"); - if (ConfigManager.thin_font) - for (int i = 0; i < FontWidthThin.values().length; i++) - fontWidth.put(FontWidthThin.values()[i].getCharacter(), FontWidthThin.values()[i].getLength()); - else - for (int i = 0; i < FontWidthNormal.values().length; i++) - fontWidth.put(FontWidthNormal.values()[i].getCharacter(), FontWidthNormal.values()[i].getLength()); - for (int i = 0; i < FontOffset.values().length; i++) - fontWidth.put(FontOffset.values()[i].getCharacter(), FontOffset.values()[i].getSpace() - 1); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java b/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java new file mode 100644 index 0000000..e335390 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java @@ -0,0 +1,22 @@ +package net.momirealms.customnameplates.object; + +import net.momirealms.customnameplates.object.requirements.Requirement; + +public class ConditionalText { + + private final Requirement[] requirements; + private final String text; + + public ConditionalText(Requirement[] requirements, String text) { + this.requirements = requirements; + this.text = text; + } + + public Requirement[] getRequirements() { + return requirements; + } + + public String getText() { + return text; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/TextCache.java b/src/main/java/net/momirealms/customnameplates/object/DynamicText.java similarity index 71% rename from src/main/java/net/momirealms/customnameplates/objects/TextCache.java rename to src/main/java/net/momirealms/customnameplates/object/DynamicText.java index 53c016e..02fd4c5 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/TextCache.java +++ b/src/main/java/net/momirealms/customnameplates/object/DynamicText.java @@ -15,28 +15,32 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects; +package net.momirealms.customnameplates.object; +import me.clip.placeholderapi.PlaceholderAPI; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.utils.AdventureUtils; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -public class TextCache { +public class DynamicText { private final Player owner; private String originalValue; private String latestValue; private String[] ownerPlaceholders; - public TextCache(Player owner, String rawValue) { + public DynamicText(Player owner, String rawValue) { this.owner = owner; analyze(rawValue); } private void analyze(String value) { - List placeholdersOwner = new ArrayList<>(CustomNameplates.plugin.getPlaceholderManager().detectPlaceholders(value)); + List placeholdersOwner = new ArrayList<>(CustomNameplates.getInstance().getPlaceholderManager().detectPlaceholders(value)); String origin = value; for (String placeholder : placeholdersOwner) { origin = origin.replace(placeholder, "%s"); @@ -51,16 +55,24 @@ public class TextCache { return latestValue; } + public String getLatestJson() { + return GsonComponentSerializer.gson().serialize(getLatestComponent()); + } + + public Component getLatestComponent() { + return AdventureUtils.getComponentFromMiniMessage(latestValue); + } + public boolean update() { if (ownerPlaceholders.length == 0) return false; String string; if ("%s".equals(originalValue)) { - string = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(owner, ownerPlaceholders[0]); + string = PlaceholderAPI.setPlaceholders(owner, ownerPlaceholders[0]); } else { Object[] values = new String[ownerPlaceholders.length]; for (int i = 0; i < ownerPlaceholders.length; i++) { - values[i] = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(owner, ownerPlaceholders[i]); + values[i] = PlaceholderAPI.setPlaceholders(owner, ownerPlaceholders[i]); } string = String.format(originalValue, values); } @@ -70,8 +82,4 @@ public class TextCache { } return false; } - - public String getLatestText() { - return latestValue; - } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/Function.java b/src/main/java/net/momirealms/customnameplates/object/Function.java similarity index 91% rename from src/main/java/net/momirealms/customnameplates/objects/Function.java rename to src/main/java/net/momirealms/customnameplates/object/Function.java index 3a06aa8..8b0061b 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/Function.java +++ b/src/main/java/net/momirealms/customnameplates/object/Function.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects; +package net.momirealms.customnameplates.object; import org.bukkit.entity.Player; @@ -27,6 +27,9 @@ public abstract class Function { public void unload() { } + public void disable() { + } + public void onJoin(Player player) { } diff --git a/src/main/java/net/momirealms/customnameplates/objects/SimpleChar.java b/src/main/java/net/momirealms/customnameplates/object/SimpleChar.java similarity index 92% rename from src/main/java/net/momirealms/customnameplates/objects/SimpleChar.java rename to src/main/java/net/momirealms/customnameplates/object/SimpleChar.java index 185b13f..06df893 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/SimpleChar.java +++ b/src/main/java/net/momirealms/customnameplates/object/SimpleChar.java @@ -15,11 +15,11 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects; +package net.momirealms.customnameplates.object; public class SimpleChar { - public static SimpleChar none = new SimpleChar(16, 12, 16,'默', "none.png"); + public static SimpleChar NONE = new SimpleChar(16, 12, 16,'默', "none.png"); private final int height; private final int ascent; diff --git a/src/main/java/net/momirealms/customnameplates/object/StaticText.java b/src/main/java/net/momirealms/customnameplates/object/StaticText.java new file mode 100644 index 0000000..a8c6d4e --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/StaticText.java @@ -0,0 +1,4 @@ +package net.momirealms.customnameplates.object; + +public record StaticText(String text, int value, boolean left) { +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarConfig.java b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarConfig.java similarity index 62% rename from src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarConfig.java rename to src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarConfig.java index 0d56e39..ddcdb3b 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarConfig.java +++ b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarConfig.java @@ -15,35 +15,27 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.actionbar; +package net.momirealms.customnameplates.object.actionbar; -import net.momirealms.customnameplates.objects.requirements.Requirement; - -import java.util.List; +import net.momirealms.customnameplates.object.requirements.Requirement; public class ActionBarConfig { - private final int rate; private final int interval; - private final String[] text; - private final List conditions; + private final String[] texts; + private final Requirement[] conditions; - public ActionBarConfig(int rate, int interval, String[] text, List conditions) { - this.rate = rate; - this.text = text; + public ActionBarConfig(int interval, String[] texts, Requirement[] conditions) { + this.texts = texts; this.conditions = conditions; this.interval = interval; } - public int getRate() { - return rate; + public String[] getTexts() { + return texts; } - public String[] getText() { - return text; - } - - public List getConditions() { + public Requirement[] getConditions() { return conditions; } diff --git a/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarSender.java b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarSender.java new file mode 100644 index 0000000..440461b --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarSender.java @@ -0,0 +1,51 @@ +package net.momirealms.customnameplates.object.actionbar; + +import net.momirealms.customnameplates.object.DynamicText; +import net.momirealms.customnameplates.object.requirements.PlayerCondition; +import net.momirealms.customnameplates.object.requirements.Requirement; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.entity.Player; + +public class ActionBarSender { + + private final Player player; + private final int switch_interval; + private int timer; + private int current_text_id; + private final DynamicText[] dynamicTexts; + private final Requirement[] requirements; + + public ActionBarSender(int switch_interval, String[] texts, Requirement[] requirements, Player player) { + this.player = player; + this.switch_interval = switch_interval; + this.requirements = requirements; + this.dynamicTexts = new DynamicText[texts.length]; + for (int i = 0; i < texts.length; i++) { + dynamicTexts[i] = new DynamicText(player, texts[i]); + } + this.current_text_id = 0; + } + + public boolean canSend() { + PlayerCondition playerCondition = new PlayerCondition(player); + for (Requirement requirement : requirements) { + if (!requirement.isConditionMet(playerCondition)) { + return false; + } + } + return true; + } + + public void send() { + timer++; + if (timer >= switch_interval) { + timer = 0; + current_text_id++; + if (current_text_id >= dynamicTexts.length) { + current_text_id = 0; + } + } + dynamicTexts[current_text_id].update(); + AdventureUtils.playerActionbar(player, dynamicTexts[current_text_id].getLatestValue()); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarTask.java b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarTask.java new file mode 100644 index 0000000..896f5c1 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/actionbar/ActionBarTask.java @@ -0,0 +1,40 @@ +package net.momirealms.customnameplates.object.actionbar; + +import net.momirealms.customnameplates.CustomNameplates; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; + +public class ActionBarTask { + + private BukkitTask timerTask; + private final ActionBarSender[] actionBarSenders; + + public ActionBarTask(Player player, ActionBarConfig[] configs) { + this.actionBarSenders = new ActionBarSender[configs.length]; + for (int i = 0; i < configs.length; i++) { + ActionBarConfig actionBarConfig = configs[i]; + this.actionBarSenders[i] = new ActionBarSender( + actionBarConfig.getInterval(), + actionBarConfig.getTexts(), + actionBarConfig.getConditions(), + player + ); + } + } + + public void stop() { + if (this.timerTask != null && !this.timerTask.isCancelled()) this.timerTask.cancel(); + } + + public void start() { + this.timerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (ActionBarSender actionBarSender : actionBarSenders) { + if (actionBarSender.canSend()) { + actionBarSender.send(); + return; + } + } + }, 1, 1); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java b/src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java new file mode 100644 index 0000000..8743dda --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.armorstand; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.DynamicText; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; + +public class ArmorStandManager { + + private final ConcurrentHashMap armorStands = new ConcurrentHashMap<>(); + private FakeArmorStand[] armorStandArray; + private final Vector nearbyPlayers; + private Player[] nearbyPlayerArray ; + private final Player owner; + + public ArmorStandManager(Player owner) { + this.owner = owner; + this.nearbyPlayers = new Vector<>(); + this.armorStandArray = new FakeArmorStand[0]; + this.nearbyPlayerArray = new Player[0]; + } + + public void initNameplateArmorStands() { + Set> entries = CustomNameplates.getInstance().getNameplateManager().getContentMap().entrySet(); + for (Map.Entry entry : entries) { + addArmorStand(UUID.randomUUID(), new FakeArmorStand( + this, + owner, + new DynamicText(owner, entry.getKey().getText()), + entry.getValue(), + entry.getKey().getRequirements() + )); + } + } + + public void addArmorStand(UUID uuid, FakeArmorStand fakeArmorStand) { + this.armorStands.put(uuid, fakeArmorStand); + this.armorStandArray = armorStands.values().toArray(new FakeArmorStand[0]); + for (Player p : nearbyPlayerArray) fakeArmorStand.spawn(p); + } + + public Player[] getNearbyPlayers(){ + return nearbyPlayerArray; + } + + public boolean isNearby(Player viewer) { + return nearbyPlayers.contains(viewer); + } + + public void spawn(Player viewer) { + nearbyPlayers.add(viewer); + nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]); + for (FakeArmorStand fakeArmorStand : armorStandArray) + if (fakeArmorStand.canShow()) + fakeArmorStand.spawn(viewer); + } + + public void refresh(boolean force) { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + fakeArmorStand.refresh(); + boolean canShow = fakeArmorStand.canShow(); + if (!canShow) { + if (fakeArmorStand.isShown()) { + fakeArmorStand.destroy(); + } + } + else { + if (fakeArmorStand.isShown()) { + if (fakeArmorStand.getDynamicText().update() || force) + fakeArmorStand.refresh(); + } + else { + fakeArmorStand.spawn(); + } + } + } + } + + public void destroy() { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + fakeArmorStand.destroy(); + } + nearbyPlayers.clear(); + nearbyPlayerArray = new Player[0]; + } + + public void teleport(Player viewer) { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + if (fakeArmorStand.isShown()) + fakeArmorStand.teleport(viewer); + } + } + + public void teleport() { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + if (fakeArmorStand.isShown()) + fakeArmorStand.teleport(); + } + } + + public void setSneak(boolean sneaking, boolean respawn) { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + if (fakeArmorStand.isShown()) + fakeArmorStand.setSneak(sneaking, respawn); + } + } + + public void respawn() { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + if (fakeArmorStand.isShown()) + for (Player viewer : nearbyPlayerArray) + fakeArmorStand.respawn(viewer); + } + } + + public void destroy(Player viewer) { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + fakeArmorStand.destroy(viewer); + } + unregisterPlayer(viewer); + } + + public void unregisterPlayer(Player viewer) { + if (nearbyPlayers.remove(viewer)) { + nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]); + } + } + + public void removeArmorStand(UUID uuid) { + FakeArmorStand fakeArmorStand = armorStands.remove(uuid); + if (fakeArmorStand != null) { + fakeArmorStand.destroy(); + armorStandArray = armorStands.values().toArray(new FakeArmorStand[0]); + } + } + + public void addBubble(UUID uuid, FakeArmorStand fakeArmorStand, int stayTime, double lineSpace) { + ascent(lineSpace); + addArmorStand(uuid, fakeArmorStand); + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), () -> removeArmorStand(uuid), stayTime * 20L); + } + + public void ascent(double lineSpace) { + for (FakeArmorStand fakeArmorStand : armorStandArray) { + fakeArmorStand.setOffset(fakeArmorStand.getOffset() + lineSpace); + fakeArmorStand.teleport(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java b/src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java new file mode 100644 index 0000000..9ef96bd --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java @@ -0,0 +1,269 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.armorstand; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedDataValue; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.google.common.collect.Lists; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.DynamicText; +import net.momirealms.customnameplates.object.requirements.PlayerCondition; +import net.momirealms.customnameplates.object.requirements.Requirement; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Pose; + +import java.util.*; + +public class FakeArmorStand { + + private final ArmorStandManager asm; + private final Player owner; + private double yOffset; + private final int entityId; + private final UUID uuid = UUID.randomUUID(); + private boolean sneaking; + private DynamicText dynamicText; + private String textJson; + private final Requirement[] requirements; + private boolean isShown; + + // nameplate + public FakeArmorStand(ArmorStandManager asm, Player owner, DynamicText text, double yOffset, Requirement[] requirements) { + this.asm = asm; + this.entityId = new Random().nextInt(Integer.MAX_VALUE); + this.owner = owner; + this.yOffset = yOffset; + this.dynamicText = text; + this.sneaking = owner.isSneaking(); + this.requirements = requirements; + this.isShown = false; + this.textJson = dynamicText.getLatestJson(); + } + + // bubble + public FakeArmorStand(ArmorStandManager asm, Player owner, String textJson, double yOffset) { + this.asm = asm; + this.entityId = new Random().nextInt(Integer.MAX_VALUE); + this.owner = owner; + this.yOffset = yOffset; + this.textJson = textJson; + this.sneaking = owner.isSneaking(); + this.requirements = null; + this.isShown = true; + } + + public boolean canShow() { + if (requirements == null) return true; + for (Requirement requirement : requirements) { + if (!requirement.isConditionMet(new PlayerCondition(owner))) { + return false; + } + } + return true; + } + + // dynamicText would not be null because bubbles would not be updated + public void refresh() { + textJson = dynamicText.getLatestJson(); + updateMetadata(); + } + + public double getOffset() { + return yOffset; + } + + public void setOffset(double offset) { + if (yOffset == offset) return; + yOffset = offset; + for (Player all : asm.getNearbyPlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(all, getTeleportPacket()); + } + } + + public void spawn(Player viewer) { + for (PacketContainer packet : getSpawnPackets()) { + CustomNameplates.getProtocolManager().sendServerPacket(viewer, packet); + } + } + + public void spawn() { + for (Player all : asm.getNearbyPlayers()) { + spawn(all); + } + isShown = true; + } + + public void destroy() { + PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); + destroyPacket.getIntLists().write(0, List.of(entityId)); + for (Player all : asm.getNearbyPlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(all, destroyPacket); + } + isShown = false; + } + + public void destroy(Player viewer) { + PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); + destroyPacket.getIntLists().write(0, List.of(entityId)); + CustomNameplates.getProtocolManager().sendServerPacket(viewer, destroyPacket); + } + + public void teleport() { + PacketContainer packet = getTeleportPacket(); + for (Player all : asm.getNearbyPlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(all, packet); + } + } + + public void teleport(Player viewer) { + if (!asm.isNearby(viewer) && viewer != owner) { + asm.spawn(viewer); + } else { + CustomNameplates.getProtocolManager().sendServerPacket(viewer, getTeleportPacket()); + } + } + + public void setSneak(boolean isSneaking, boolean respawn) { + this.sneaking = isSneaking; + if (respawn) { + for (Player viewer : asm.getNearbyPlayers()) { + respawn(viewer); + } + } + else { + refresh(); + } + } + + public int getEntityId() { + return entityId; + } + + public void respawn(Player viewer) { + destroy(viewer); + spawn(viewer); + } + + public PacketContainer getTeleportPacket() { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); + packet.getIntegers().write(0, entityId); + Location location = getArmorStandLocation(); + packet.getDoubles().write(0, location.getX()); + packet.getDoubles().write(1, location.getY()); + packet.getDoubles().write(2, location.getZ()); + return packet; + } + + public void updateMetadata() { + PacketContainer metaPacket = getMetaPacket(); + for (Player viewer : asm.getNearbyPlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(viewer, metaPacket); + } + } + + protected PacketContainer getMetaPacket() { + PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); + metaPacket.getIntegers().write(0, entityId); + if (CustomNameplates.getInstance().getVersionHelper().isVersionNewerThan1_19_R2()) { + WrappedDataWatcher wrappedDataWatcher = createDataWatcher(textJson); + List wrappedDataValueList = Lists.newArrayList(); + wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> wrappedDataValueList.add(new WrappedDataValue(entry.getWatcherObject().getIndex(), entry.getWatcherObject().getSerializer(), entry.getRawValue()))); + metaPacket.getDataValueCollectionModifier().write(0, wrappedDataValueList); + } else { + metaPacket.getWatchableCollectionModifier().write(0, createDataWatcher(textJson).getWatchableObjects()); + } + return metaPacket; + } + + public Location getArmorStandLocation() { + double x = owner.getLocation().getX(); + double y = getY() + yOffset; + double z = owner.getLocation().getZ(); + if (!owner.isSleeping()) { + if (sneaking) y += 1.5; + else y += 1.8; + } + else y += 0.2; + return new Location(null, x, y, z); + } + + protected double getY() { + Entity vehicle = owner.getVehicle(); + if (vehicle != null) { + if (vehicle.getType() == EntityType.HORSE) { + return vehicle.getLocation().getY() + 0.85; + } + if (vehicle.getType() == EntityType.DONKEY) { + return vehicle.getLocation().getY() + 0.525; + } + if (vehicle.getType() == EntityType.PIG) { + return vehicle.getLocation().getY() + 0.325; + } + if (vehicle.getType() == EntityType.STRIDER) { + return vehicle.getLocation().getY() + 1.15; + } + } + if (owner.getPose() == Pose.SWIMMING || owner.isGliding()) { + return owner.getLocation().getY() - 1.22; + } + return owner.getLocation().getY(); + } + + public WrappedDataWatcher createDataWatcher(String json) { + WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); + WrappedDataWatcher.Serializer serializer1 = WrappedDataWatcher.Registry.get(Boolean.class); + WrappedDataWatcher.Serializer serializer2 = WrappedDataWatcher.Registry.get(Byte.class); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(WrappedChatComponent.fromJson(json).getHandle())); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer1), true); + byte flag = 0x20; // invisibility + if (sneaking) flag += (byte) 0x02; + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, serializer2), flag); + // small size + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, serializer2), (byte) 0x01); + // visible text + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer1), true); + return wrappedDataWatcher; + } + + public PacketContainer[] getSpawnPackets() { + PacketContainer entityPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); + entityPacket.getModifier().write(0, entityId); + entityPacket.getModifier().write(1, uuid); + entityPacket.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); + Location location = getArmorStandLocation(); + entityPacket.getDoubles().write(0, location.getX()); + entityPacket.getDoubles().write(1, location.getY()); + entityPacket.getDoubles().write(2, location.getZ()); + PacketContainer metaPacket = getMetaPacket(); + return new PacketContainer[] {entityPacket, metaPacket}; + } + + public boolean isShown() { + return isShown; + } + + public DynamicText getDynamicText() { + return dynamicText; + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/background/BackGroundConfig.java b/src/main/java/net/momirealms/customnameplates/object/background/BackGroundConfig.java new file mode 100644 index 0000000..ba8e568 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/background/BackGroundConfig.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.background; + +import net.momirealms.customnameplates.object.SimpleChar; + +public record BackGroundConfig(SimpleChar left, SimpleChar offset_1, + SimpleChar offset_2, SimpleChar offset_4, + SimpleChar offset_8, SimpleChar offset_16, + SimpleChar offset_32, SimpleChar offset_64, + SimpleChar offset_128, SimpleChar right, + int left_margin, int right_margin) { +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarConfig.java b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarConfig.java similarity index 65% rename from src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarConfig.java rename to src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarConfig.java index 3561b96..844cc0b 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarConfig.java +++ b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarConfig.java @@ -15,34 +15,29 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.bossbar; +package net.momirealms.customnameplates.object.bossbar; -import net.momirealms.customnameplates.objects.requirements.Requirement; +import net.momirealms.customnameplates.object.requirements.Requirement; import org.bukkit.boss.BarColor; -import org.jetbrains.annotations.NotNull; - -import java.util.List; public class BossBarConfig { - private final String[] text; + private final String[] texts; private final int interval; private final Overlay overlay; private final BarColor color; - private final int rate; - private final List conditions; + private final Requirement[] conditions; - public BossBarConfig(String[] text, Overlay overlay, BarColor color, int rate, int interval, @NotNull List conditions) { - this.text = text; + public BossBarConfig(String[] texts, Overlay overlay, BarColor color, int interval, Requirement[] conditions) { + this.texts = texts; this.overlay = overlay; this.color = color; - this.rate = rate; this.interval = interval; this.conditions = conditions; } - public String[] getText() { - return text; + public String[] getTexts() { + return texts; } public int getInterval() { @@ -57,11 +52,7 @@ public class BossBarConfig { return color; } - public int getRate() { - return rate; - } - - public List getConditions() { + public Requirement[] getConditions() { return conditions; } } diff --git a/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarSender.java b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarSender.java new file mode 100644 index 0000000..1c9da39 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarSender.java @@ -0,0 +1,139 @@ +package net.momirealms.customnameplates.object.bossbar; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.InternalStructure; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.utility.MinecraftReflection; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.DynamicText; +import net.momirealms.customnameplates.object.requirements.PlayerCondition; +import net.momirealms.customnameplates.object.requirements.Requirement; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.boss.BarColor; +import org.bukkit.entity.Player; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.UUID; + +public class BossBarSender { + + private final Player player; + private final int switch_interval; + private int timer; + private int current_text_id; + private final DynamicText[] dynamicTexts; + private final Requirement[] requirements; + private final UUID uuid; + private boolean force; + private boolean isShown; + private final Overlay overlay; + private final BarColor barColor; + + public BossBarSender(int switch_interval, String[] texts, Requirement[] requirements, Overlay overlay, BarColor barColor,Player player) { + this.player = player; + this.switch_interval = switch_interval; + this.overlay = overlay; + this.barColor = barColor; + this.uuid = UUID.randomUUID(); + this.requirements = requirements; + this.dynamicTexts = new DynamicText[texts.length]; + for (int i = 0; i < texts.length; i++) { + dynamicTexts[i] = new DynamicText(player, texts[i]); + } + this.current_text_id = 0; + } + + public boolean isShown() { + return isShown; + } + + public boolean canSend() { + for (Requirement requirement : requirements) { + if (!requirement.isConditionMet(new PlayerCondition(player))) { + return false; + } + } + return true; + } + + public void hide() { + this.sendRemovePacket(); + this.isShown = false; + } + + public void show() { + CustomNameplates.getProtocolManager().sendServerPacket(player, getCreatePacket()); + this.isShown = true; + } + + public void update() { + timer++; + if (timer > switch_interval) { + timer = 0; + current_text_id++; + if (current_text_id >= dynamicTexts.length) { + current_text_id = 0; + } + force = true; + } + if (dynamicTexts[current_text_id].update() || force) { + force = false; + CustomNameplates.getProtocolManager().sendServerPacket(player, getUpdatePacket()); + } + } + + private PacketContainer getCreatePacket() { + dynamicTexts[current_text_id].update(); + PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); + packet.getModifier().write(0, uuid); + InternalStructure internalStructure = packet.getStructures().read(1); + internalStructure.getChatComponents().write(0, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(AdventureUtils.replaceLegacy(dynamicTexts[current_text_id].getLatestValue()))))); + internalStructure.getFloat().write(0,1F); + internalStructure.getEnumModifier(BarColor.class, 2).write(0, barColor); + internalStructure.getEnumModifier(Overlay.class, 3).write(0, overlay); + internalStructure.getModifier().write(4, false); + internalStructure.getModifier().write(5, false); + internalStructure.getModifier().write(6, false); + return packet; + } + + private PacketContainer getUpdatePacket() { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); + packet.getModifier().write(0, uuid); + try { + Method sMethod = MinecraftReflection.getChatSerializerClass().getMethod("a", String.class); + sMethod.setAccessible(true); + Object chatComponent = sMethod.invoke(null, GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(AdventureUtils.replaceLegacy(dynamicTexts[current_text_id].getLatestValue())))); + Class packetBossClass = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutBoss$e"); + Constructor packetConstructor = packetBossClass.getDeclaredConstructor(MinecraftReflection.getIChatBaseComponentClass()); + packetConstructor.setAccessible(true); + Object updatePacket = packetConstructor.newInstance(chatComponent); + packet.getModifier().write(1, updatePacket); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | ClassNotFoundException | InstantiationException e) { + throw new RuntimeException(e); + } + return packet; + } + + private void sendRemovePacket() { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); + packet.getModifier().write(0, uuid); + try { + Class bar = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutBoss"); + Field remove = bar.getDeclaredField("f"); + remove.setAccessible(true); + packet.getModifier().write(1, remove.get(null)); + CustomNameplates.getProtocolManager().sendServerPacket(player, packet); + } catch (ClassNotFoundException e){ + AdventureUtils.consoleMessage("[CustomNameplates] Failed to remove boss bar for " + player.getName()); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarTask.java b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarTask.java new file mode 100644 index 0000000..72aa0fc --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/bossbar/BossBarTask.java @@ -0,0 +1,55 @@ +package net.momirealms.customnameplates.object.bossbar; + +import net.momirealms.customnameplates.CustomNameplates; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; + +public class BossBarTask { + + private BukkitTask timerTask; + private final BossBarSender[] bossBarSenders; + + public BossBarTask(Player player, BossBarConfig[] configs) { + this.bossBarSenders = new BossBarSender[configs.length]; + for (int i = 0; i < configs.length; i++) { + BossBarConfig bossBarConfig = configs[i]; + this.bossBarSenders[i] = new BossBarSender( + bossBarConfig.getInterval(), + bossBarConfig.getTexts(), + bossBarConfig.getConditions(), + bossBarConfig.getOverlay(), + bossBarConfig.getColor(), + player + ); + } + } + + public void stop() { + if (this.timerTask != null && !this.timerTask.isCancelled()) this.timerTask.cancel(); + for (BossBarSender bossBarSender : bossBarSenders) { + bossBarSender.hide(); + } + } + + public void start() { + this.timerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (BossBarSender bossBarSender : bossBarSenders) { + if (!bossBarSender.canSend()) { + if (bossBarSender.isShown()) { + bossBarSender.hide(); + return; + } + } + else { + if (bossBarSender.isShown()) { + bossBarSender.update(); + } + else { + bossBarSender.show(); + } + } + } + }, 1, 1); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/bossbar/Overlay.java b/src/main/java/net/momirealms/customnameplates/object/bossbar/Overlay.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/objects/bossbar/Overlay.java rename to src/main/java/net/momirealms/customnameplates/object/bossbar/Overlay.java index 9af2c26..99cf7c0 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/bossbar/Overlay.java +++ b/src/main/java/net/momirealms/customnameplates/object/bossbar/Overlay.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.bossbar; +package net.momirealms.customnameplates.object.bossbar; public enum Overlay { @@ -24,5 +24,4 @@ public enum Overlay { NOTCHED_12, NOTCHED_20, PROGRESS - } diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/bubbles/BBPacketsHandle.java b/src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java similarity index 72% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/bubbles/BBPacketsHandle.java rename to src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java index 47f2d51..5e7a05f 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/bubbles/BBPacketsHandle.java +++ b/src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode.bubbles; +package net.momirealms.customnameplates.object.bubble; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.packet.*; import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; import org.bukkit.entity.Player; import java.util.List; @@ -35,7 +35,7 @@ public class BBPacketsHandle extends PacketsHandler { private final EntityLookListener entityLookListener; public BBPacketsHandle(ChatBubblesManager chatBubblesManager) { - super(chatBubblesManager); + super(); this.chatBubblesManager = chatBubblesManager; this.entityDestroyListener = new EntityDestroyListener(this); this.entityMoveListener = new EntityMoveListener(this); @@ -47,21 +47,21 @@ public class BBPacketsHandle extends PacketsHandler { @Override public void load() { super.load(); - CustomNameplates.protocolManager.addPacketListener(entityDestroyListener); - CustomNameplates.protocolManager.addPacketListener(entityMoveListener); - CustomNameplates.protocolManager.addPacketListener(entitySpawnListener); - CustomNameplates.protocolManager.addPacketListener(entityTeleportListener); - CustomNameplates.protocolManager.addPacketListener(entityLookListener); + CustomNameplates.getProtocolManager().addPacketListener(entityDestroyListener); + CustomNameplates.getProtocolManager().addPacketListener(entityMoveListener); + CustomNameplates.getProtocolManager().addPacketListener(entitySpawnListener); + CustomNameplates.getProtocolManager().addPacketListener(entityTeleportListener); + CustomNameplates.getProtocolManager().addPacketListener(entityLookListener); } @Override public void unload() { super.unload(); - CustomNameplates.protocolManager.removePacketListener(entityDestroyListener); - CustomNameplates.protocolManager.removePacketListener(entityMoveListener); - CustomNameplates.protocolManager.removePacketListener(entitySpawnListener); - CustomNameplates.protocolManager.removePacketListener(entityTeleportListener); - CustomNameplates.protocolManager.removePacketListener(entityLookListener); + CustomNameplates.getProtocolManager().removePacketListener(entityDestroyListener); + CustomNameplates.getProtocolManager().removePacketListener(entityMoveListener); + CustomNameplates.getProtocolManager().removePacketListener(entitySpawnListener); + CustomNameplates.getProtocolManager().removePacketListener(entityTeleportListener); + CustomNameplates.getProtocolManager().removePacketListener(entityLookListener); } @Override @@ -94,9 +94,4 @@ public class BBPacketsHandle extends PacketsHandler { chatBubblesManager.getArmorStandManager(deSpawnedPlayer).destroy(receiver); } } - - @Override - public Player getPlayerFromMap(int entityID) { - return entityIdMap.get(entityID); - } } diff --git a/src/main/java/net/momirealms/customnameplates/commands/SubCommand.java b/src/main/java/net/momirealms/customnameplates/object/bubble/BubbleConfig.java similarity index 61% rename from src/main/java/net/momirealms/customnameplates/commands/SubCommand.java rename to src/main/java/net/momirealms/customnameplates/object/bubble/BubbleConfig.java index 785ab69..cd1d23d 100644 --- a/src/main/java/net/momirealms/customnameplates/commands/SubCommand.java +++ b/src/main/java/net/momirealms/customnameplates/object/bubble/BubbleConfig.java @@ -15,23 +15,15 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.commands; +package net.momirealms.customnameplates.object.bubble; -import org.bukkit.command.CommandSender; - -import java.util.List; -import java.util.Map; - -public interface SubCommand { - - boolean onCommand(CommandSender sender, List args); - - List onTabComplete(CommandSender sender, List args); - - String getSubCommand(); - - Map getSubCommands(); - - void regSubCommand(SubCommand subCommand); +import net.momirealms.customnameplates.object.SimpleChar; +public record BubbleConfig(String startFormat, + String endFormat, + String display_name, + SimpleChar left, + SimpleChar middle, + SimpleChar right, + SimpleChar tail) { } diff --git a/src/main/java/net/momirealms/customnameplates/hook/ImageParser.java b/src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/hook/ImageParser.java rename to src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java index 95de548..edf26a8 100644 --- a/src/main/java/net/momirealms/customnameplates/hook/ImageParser.java +++ b/src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.hook; +package net.momirealms.customnameplates.object.emoji; import org.bukkit.entity.Player; diff --git a/src/main/java/net/momirealms/customnameplates/hook/IAImageHook.java b/src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java similarity index 90% rename from src/main/java/net/momirealms/customnameplates/hook/IAImageHook.java rename to src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java index e8336a6..746869a 100644 --- a/src/main/java/net/momirealms/customnameplates/hook/IAImageHook.java +++ b/src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.hook; +package net.momirealms.customnameplates.object.emoji; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import org.bukkit.entity.Player; -public class IAImageHook implements ImageParser{ +public class ItemsAdderImpl implements ImageParser{ @Override public String parse(Player player, String text) { diff --git a/src/main/java/net/momirealms/customnameplates/hook/OXImageHook.java b/src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java similarity index 91% rename from src/main/java/net/momirealms/customnameplates/hook/OXImageHook.java rename to src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java index d5ef567..a2b693a 100644 --- a/src/main/java/net/momirealms/customnameplates/hook/OXImageHook.java +++ b/src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.hook; +package net.momirealms.customnameplates.object.emoji; import io.th0rgal.oraxen.OraxenPlugin; import io.th0rgal.oraxen.font.FontManager; @@ -24,11 +24,11 @@ import org.bukkit.entity.Player; import java.util.Map; -public class OXImageHook implements ImageParser{ +public class OraxenImpl implements ImageParser{ private final FontManager fontManager; - public OXImageHook() { + public OraxenImpl() { this.fontManager = OraxenPlugin.get().getFontManager(); } diff --git a/src/main/java/net/momirealms/customnameplates/objects/font/FontWidthNormal.java b/src/main/java/net/momirealms/customnameplates/object/font/ASCIIWidth.java similarity index 90% rename from src/main/java/net/momirealms/customnameplates/objects/font/FontWidthNormal.java rename to src/main/java/net/momirealms/customnameplates/object/font/ASCIIWidth.java index fd9f1ab..4ac3cc8 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/font/FontWidthNormal.java +++ b/src/main/java/net/momirealms/customnameplates/object/font/ASCIIWidth.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.font; +package net.momirealms.customnameplates.object.font; -public enum FontWidthNormal { +public enum ASCIIWidth { A('A', 5), a('a', 5), B('B', 5), b('b', 5), C('C', 5), c('c', 5), D('D', 5), d('d', 5), @@ -47,18 +47,18 @@ public enum FontWidthNormal { IN_BETWEEN(' ', 3), DEFAULT('默', 8); private final char character; - private final int length; + private final int width; - FontWidthNormal(char character, int length) { + ASCIIWidth(char character, int width) { this.character = character; - this.length = length; + this.width = width; } public char getCharacter() { return this.character; } - public int getLength() { - return this.length; + public int getWidth() { + return this.width; } } diff --git a/src/main/java/net/momirealms/customnameplates/object/font/OffsetFont.java b/src/main/java/net/momirealms/customnameplates/object/font/OffsetFont.java new file mode 100644 index 0000000..5be59bf --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/font/OffsetFont.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.font; + +public enum OffsetFont { + + NEG_1('\uf801', -1, -3), + NEG_2('\uf802', -2, -4), + NEG_3('\uf803', -3, -5), + NEG_4('\uf804', -4, -6), + NEG_5('\uf805', -5, -7), + NEG_6('\uf806', -6, -8), + NEG_7('\uf807', -7, -9), + NEG_8('\uf808', -8, -10), + NEG_16('\uf809', -16, -18), + NEG_32('\uf80a', -32, -34), + NEG_64('\uf80b', -64, -66), + NEG_128('\uf80c', -128, -130), + POS_1('\uf811', 1, -1), + POS_2('\uf812', 2, 1), + POS_3('\uf813', 3, 2), + POS_4('\uf814', 4, 3), + POS_5('\uf815', 5, 4), + POS_6('\uf816', 6, 5), + POS_7('\uf817', 7, 6), + POS_8('\uf818', 8, 7), + POS_16('\uf819', 16, 15), + POS_32('\uf81a', 32, 31), + POS_64('\uf81b', 64, 63), + POS_128('\uf81c', 128, 127); + + private final char character; + private final int space; + private final int height; + + OffsetFont(char character, int space, int height) { + this.character = character; + this.space = space; + this.height = height; + } + + public char getCharacter() { + return this.character; + } + + public int getSpace() { + return this.space; + } + + public int getHeight() { + return this.height; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/font/FontWidthThin.java b/src/main/java/net/momirealms/customnameplates/object/font/UnicodeWidth.java similarity index 90% rename from src/main/java/net/momirealms/customnameplates/objects/font/FontWidthThin.java rename to src/main/java/net/momirealms/customnameplates/object/font/UnicodeWidth.java index 5440885..6bbe64e 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/font/FontWidthThin.java +++ b/src/main/java/net/momirealms/customnameplates/object/font/UnicodeWidth.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.font; +package net.momirealms.customnameplates.object.font; -public enum FontWidthThin { +public enum UnicodeWidth { A('A', 3), a('a', 3), B('B', 3), b('b', 3), C('C', 3), c('c', 3), D('D', 3), d('d', 3), @@ -47,18 +47,18 @@ public enum FontWidthThin { IN_BETWEEN(' ', 3), DEFAULT('默', 8); private final char character; - private final int length; + private final int width; - FontWidthThin(char character, int length) { + UnicodeWidth(char character, int width) { this.character = character; - this.length = length; + this.width = width; } public char getCharacter() { return this.character; } - public int getLength() { - return this.length; + public int getWidth() { + return this.width; } } diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplateConfig.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplateConfig.java new file mode 100644 index 0000000..9682c12 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplateConfig.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.nameplate; + +import net.momirealms.customnameplates.object.SimpleChar; +import org.bukkit.ChatColor; + +public record NameplateConfig(ChatColor color, String display_name, SimpleChar left, SimpleChar middle, SimpleChar right) { + + public static NameplateConfig EMPTY = new NameplateConfig(ChatColor.WHITE, "none", SimpleChar.NONE, SimpleChar.NONE, SimpleChar.NONE); +} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java new file mode 100644 index 0000000..cee8408 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.nameplate; + +import me.clip.placeholderapi.PlaceholderAPI; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.momirealms.customnameplates.manager.ConfigManager; +import net.momirealms.customnameplates.manager.NameplateManager; +import net.momirealms.customnameplates.object.DynamicText; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +public class NameplatesTeam { + + private final NameplateManager nameplateManager; + private final Player player; + private ChatColor color; + private final DynamicText prefix; + private final DynamicText suffix; + private String nameplate_prefix; + private String nameplate_suffix; + private String nameplate; + private final String team_name; + + public NameplatesTeam(NameplateManager nameplateManager, Player player, String team_name) { + this.nameplateManager = nameplateManager; + this.team_name = team_name; + this.player = player; + this.prefix = new DynamicText(player, nameplateManager.getPrefix()); + this.suffix = new DynamicText(player, nameplateManager.getSuffix()); + update(true); + } + + public boolean update(boolean force) { + String newNameplate = nameplateManager.getEquippedNameplate(player); + NameplateConfig nameplateConfig = nameplateManager.getNameplateConfig(newNameplate); + boolean updated = prefix.update() || suffix.update() || force || !newNameplate.equals(nameplate); + if (newNameplate.equals("none") || nameplateConfig == null) { + this.color = ChatColor.WHITE; + this.nameplate = "none"; + if (updated) { + nameplate = newNameplate; + nameplate_prefix = prefix.getLatestValue(); + nameplate_suffix = suffix.getLatestValue(); + } + } + else { + this.color = nameplateConfig.color(); + String name = PlaceholderAPI.setPlaceholders(player, nameplateManager.getPlayer_name_papi()); + if (updated) { + nameplate = newNameplate; + this.nameplate_prefix = ConfigManager.surroundWithFont(nameplateManager.getNameplatePrefix( + AdventureUtils.stripAllTags(prefix.getLatestValue()), + name, + AdventureUtils.stripAllTags(suffix.getLatestValue()), + nameplateConfig + )) + prefix.getLatestValue(); + this.nameplate_suffix = ConfigManager.surroundWithFont(nameplateManager.getNameplateSuffix( + AdventureUtils.stripAllTags(prefix.getLatestValue()) + + name + + AdventureUtils.stripAllTags(suffix.getLatestValue()) + )) + suffix.getLatestValue(); + } + } + return updated; + } + + public String getTeam_name() { + return team_name; + } + + public ChatColor getColor() { + return this.color; + } + + public String getNameplatePrefixText() { + return nameplate_prefix; + } + + public String getNameplateSuffixText() { + return nameplate_suffix; + } + + public Component getNameplatePrefixComponent() { + return MiniMessage.miniMessage().deserialize(nameplate_prefix); + } + + public Component getNameplateSuffixComponent() { + return MiniMessage.miniMessage().deserialize(nameplate_suffix); + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java new file mode 100644 index 0000000..f11be04 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java @@ -0,0 +1,57 @@ +package net.momirealms.customnameplates.object.nameplate.mode; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.listener.JoinQuitListener; +import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.Function; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.scheduler.BukkitTask; + +public abstract class AbstractNameplateTag extends Function { + + protected BukkitTask refreshTask; + protected CustomNameplates plugin; + protected JoinQuitListener joinQuitListener; + + public AbstractNameplateTag(CustomNameplates plugin) { + this.plugin = plugin; + this.joinQuitListener = new JoinQuitListener(this); + } + + @Override + public void load() { + loadToAllPlayers(); + arrangeRefreshTask(); + Bukkit.getPluginManager().registerEvents(joinQuitListener, plugin); + } + + @Override + public void unload() { + if (refreshTask != null) refreshTask.cancel(); + HandlerList.unregisterAll(joinQuitListener); + } + + @Override + public void onJoin(Player player) { + + } + + @Override + public void onQuit(Player player) { + + } + + public void arrangeRefreshTask() { + //child + } + + public void loadToAllPlayers() { + TeamManager teamManager = plugin.getTeamManager(); + for (Player player : Bukkit.getOnlinePlayers()) { + teamManager.sendUpdateToAll(player, true); + teamManager.sendUpdateToOne(player); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java new file mode 100644 index 0000000..dd23690 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java @@ -0,0 +1,6 @@ +package net.momirealms.customnameplates.object.nameplate.mode; + +public enum DisplayMode { + TEAM, + ARMOR_STAND +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/EntityTag.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java similarity index 54% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/EntityTag.java rename to src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java index 67fc338..8577b4a 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/EntityTag.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java @@ -15,14 +15,11 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode; +package net.momirealms.customnameplates.object.nameplate.mode; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.EntityTagListener; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.NameplateMode; +import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -31,54 +28,56 @@ import org.bukkit.event.HandlerList; import java.util.concurrent.ConcurrentHashMap; -public abstract class EntityTag extends NameplateMode { +public abstract class EntityTag extends AbstractNameplateTag { protected final ConcurrentHashMap armorStandManagerMap = new ConcurrentHashMap<>(); - protected EntityTagListener listener; + protected EntityTagListener entityTagListener; + protected PacketsHandler handler; - protected EntityTag(TeamManager teamManager) { - super(teamManager); - this.listener = new EntityTagListener(this); + protected EntityTag(CustomNameplates plugin) { + super(plugin); + this.entityTagListener = new EntityTagListener(this); } @Override public void load(){ super.load(); - Bukkit.getPluginManager().registerEvents(listener, CustomNameplates.plugin); + handler.load(); + Bukkit.getPluginManager().registerEvents(entityTagListener, CustomNameplates.getInstance()); } @Override public void unload(){ super.unload(); + handler.unload(); for (ArmorStandManager asm : armorStandManagerMap.values()) { asm.destroy(); } armorStandManagerMap.clear(); - HandlerList.unregisterAll(listener); + HandlerList.unregisterAll(entityTagListener); } @Override public void onJoin(Player player) { - super.onJoin(player); - ArmorStandManager asm = new ArmorStandManager(player); - addDefaultText(asm); - armorStandManagerMap.put(player, asm); - for (Player viewer : Bukkit.getOnlinePlayers()) { - spawnArmorStands(viewer, player, false); - spawnArmorStands(player, viewer, false); - } + handler.onJoin(player); } @Override public void onQuit(Player player) { - super.onQuit(player); + handler.onQuit(player); ArmorStandManager asm = armorStandManagerMap.remove(player); if (asm != null) { asm.destroy(); } } + public ArmorStandManager createArmorStandManager(Player player) { + ArmorStandManager asm = new ArmorStandManager(player); + armorStandManagerMap.put(player, asm); + return asm; + } + public void onSneak(Player player, boolean isSneaking) { //child } @@ -87,49 +86,20 @@ public abstract class EntityTag extends NameplateMode { //child } - public void addDefaultText(ArmorStandManager asm) { - asm.addDefault(); - } - @Override public void arrangeRefreshTask() { - if (NameplateManager.update) { - refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.plugin, () -> { - for (ArmorStandManager asm : armorStandManagerMap.values()) { - asm.refresh(false); - } - }, 20, NameplateManager.refresh); - } - else { - Bukkit.getScheduler().runTaskLaterAsynchronously(CustomNameplates.plugin, () -> { - for (ArmorStandManager asm : armorStandManagerMap.values()) { - asm.refresh(false); - } - }, 20); - } + } public ArmorStandManager getArmorStandManager(Player player) { return armorStandManagerMap.get(player); } - public void refresh(Player refreshed, boolean force) { - getArmorStandManager(refreshed).refresh(force); - } - - protected void spawnArmorStands(Player viewer, Player target, boolean ride) { - if (target == viewer) return; - if (target.getGameMode() == GameMode.SPECTATOR) return; - if (viewer.getWorld() != target.getWorld()) return; + protected void spawnArmorStands(Player viewer, Player target) { + if (target == viewer || target.getGameMode() == GameMode.SPECTATOR || viewer.getWorld() != target.getWorld()) return; if (getDistance(target, viewer) < 48 && viewer.canSee(target)) { ArmorStandManager asm = getArmorStandManager(target); asm.spawn(viewer); - if (ride) { - //just for a delay - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, () -> { - asm.mount(viewer); - }); - } } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/PacketsHandler.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java similarity index 66% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/PacketsHandler.java rename to src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java index 5fe71a7..39610ab 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/PacketsHandler.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java @@ -15,34 +15,22 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode; +package net.momirealms.customnameplates.object.nameplate.mode; import com.comphenix.protocol.events.PacketContainer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.SimpleListener; -import net.momirealms.customnameplates.objects.Function; +import net.momirealms.customnameplates.object.Function; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; import java.util.List; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public abstract class PacketsHandler extends Function { - protected Map entityIdMap = new ConcurrentHashMap<>(); - private final SimpleListener simpleListener; - private final EntityTag entityTag; - - protected PacketsHandler(EntityTag entityTag) { - this.entityTag = entityTag; - this.simpleListener = new SimpleListener(this); - } + protected ConcurrentHashMap entityIdMap = new ConcurrentHashMap<>(); @Override public void load() { - Bukkit.getPluginManager().registerEvents(simpleListener, CustomNameplates.plugin); for (Player player : Bukkit.getOnlinePlayers()) { entityIdMap.put(player.getEntityId(), player); } @@ -50,17 +38,16 @@ public abstract class PacketsHandler extends Function { @Override public void unload() { - HandlerList.unregisterAll(simpleListener); entityIdMap.clear(); } + @Override public void onJoin(Player player) { entityIdMap.put(player.getEntityId(), player); - entityTag.onJoin(player); } + @Override public void onQuit(Player player) { - entityTag.onQuit(player); entityIdMap.remove(player.getEntityId()); } @@ -76,9 +63,6 @@ public abstract class PacketsHandler extends Function { public void onEntityDestroy(Player receiver, int entity) { } - public void onEntityMount(PacketContainer packet) { - } - public Player getPlayerFromMap(int entityID) { return entityIdMap.get(entityID); } diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TpPacketsHandler.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java similarity index 59% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TpPacketsHandler.java rename to src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java index cbb0dd2..b6e8c5f 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TpPacketsHandler.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java @@ -15,18 +15,18 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode.tp; +package net.momirealms.customnameplates.object.nameplate.mode.armorstand; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.packet.*; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; +import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; import org.bukkit.entity.Player; import java.util.List; -public class TpPacketsHandler extends PacketsHandler { +public class ArmorStandPacketsHandler extends PacketsHandler { - private final TeleportingTag teleportingTag; + private final ArmorStandTag armorStandTag; private EntityDestroyListener entityDestroyListener; private EntityMoveListener entityMoveListener; @@ -34,9 +34,9 @@ public class TpPacketsHandler extends PacketsHandler { private EntityTeleportListener entityTeleportListener; private EntityLookListener entityLookListener; - protected TpPacketsHandler(TeleportingTag teleportingTag) { - super(teleportingTag); - this.teleportingTag = teleportingTag; + protected ArmorStandPacketsHandler(ArmorStandTag armorStandTag) { + super(); + this.armorStandTag = armorStandTag; } @Override @@ -47,28 +47,28 @@ public class TpPacketsHandler extends PacketsHandler { this.entitySpawnListener = new EntitySpawnListener(this); this.entityTeleportListener = new EntityTeleportListener(this); this.entityLookListener = new EntityLookListener(this); - CustomNameplates.protocolManager.addPacketListener(entityDestroyListener); - CustomNameplates.protocolManager.addPacketListener(entityMoveListener); - CustomNameplates.protocolManager.addPacketListener(entitySpawnListener); - CustomNameplates.protocolManager.addPacketListener(entityTeleportListener); - CustomNameplates.protocolManager.addPacketListener(entityLookListener); + CustomNameplates.getProtocolManager().addPacketListener(entityDestroyListener); + CustomNameplates.getProtocolManager().addPacketListener(entityMoveListener); + CustomNameplates.getProtocolManager().addPacketListener(entitySpawnListener); + CustomNameplates.getProtocolManager().addPacketListener(entityTeleportListener); + CustomNameplates.getProtocolManager().addPacketListener(entityLookListener); } @Override public void unload() { super.unload(); - CustomNameplates.protocolManager.removePacketListener(entityDestroyListener); - CustomNameplates.protocolManager.removePacketListener(entityMoveListener); - CustomNameplates.protocolManager.removePacketListener(entitySpawnListener); - CustomNameplates.protocolManager.removePacketListener(entityTeleportListener); - CustomNameplates.protocolManager.removePacketListener(entityLookListener); + CustomNameplates.getProtocolManager().removePacketListener(entityDestroyListener); + CustomNameplates.getProtocolManager().removePacketListener(entityMoveListener); + CustomNameplates.getProtocolManager().removePacketListener(entitySpawnListener); + CustomNameplates.getProtocolManager().removePacketListener(entityTeleportListener); + CustomNameplates.getProtocolManager().removePacketListener(entityLookListener); } @Override public void onEntityMove(Player receiver, int entityId) { - Player mover = getPlayerFromMap(entityId); + Player mover = super.getPlayerFromMap(entityId); if (mover != null) { - teleportingTag.getArmorStandManager(mover).teleport(receiver); + armorStandTag.getArmorStandManager(mover).teleport(receiver); } } @@ -76,7 +76,7 @@ public class TpPacketsHandler extends PacketsHandler { public void onEntitySpawn(Player receiver, int entityId) { Player spawnedPlayer = super.getPlayerFromMap(entityId); if (spawnedPlayer != null) { - teleportingTag.getArmorStandManager(spawnedPlayer).spawn(receiver); + armorStandTag.getArmorStandManager(spawnedPlayer).spawn(receiver); } } @@ -91,7 +91,7 @@ public class TpPacketsHandler extends PacketsHandler { public void onEntityDestroy(Player receiver, int entity) { Player deSpawnedPlayer = super.getPlayerFromMap(entity); if (deSpawnedPlayer != null) { - teleportingTag.getArmorStandManager(deSpawnedPlayer).destroy(receiver); + armorStandTag.getArmorStandManager(deSpawnedPlayer).destroy(receiver); } } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TeleportingTag.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java similarity index 53% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TeleportingTag.java rename to src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java index a4f2fd0..0a07884 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/TeleportingTag.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java @@ -15,34 +15,31 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode.tp; +package net.momirealms.customnameplates.object.nameplate.mode.armorstand; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.mode.EntityTag; +import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; +import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; -public class TeleportingTag extends EntityTag { +public class ArmorStandTag extends EntityTag { - private VehicleChecker vehicleChecker; - private TpPacketsHandler handler; - private BukkitTask vehicleTask; + private final VehicleChecker vehicleChecker; + private BukkitTask vehicleCheckTask; - public TeleportingTag(TeamManager teamManager) { - super(teamManager); + public ArmorStandTag(CustomNameplates plugin) { + super(plugin); + super.handler = new ArmorStandPacketsHandler(this); + this.vehicleChecker = new VehicleChecker(this); } @Override public void load() { super.load(); - this.handler = new TpPacketsHandler(this); - this.handler.load(); - this.vehicleChecker = new VehicleChecker(this); this.vehicleChecker.load(); - this.vehicleTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.plugin, () -> { + this.vehicleCheckTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { for (Player player : Bukkit.getOnlinePlayers()) { this.vehicleChecker.refresh(player); } @@ -52,24 +49,41 @@ public class TeleportingTag extends EntityTag { @Override public void unload() { super.unload(); - this.handler.unload(); this.vehicleChecker.unload(); - this.vehicleTask.cancel(); + this.vehicleCheckTask.cancel(); + } + + @Override + public void onJoin(Player player) { + super.onJoin(player); + ArmorStandManager asm = createArmorStandManager(player); + asm.initNameplateArmorStands(); + for (Player viewer : Bukkit.getOnlinePlayers()) { + spawnArmorStands(viewer, player); + spawnArmorStands(player, viewer); + } } @Override public void loadToAllPlayers() { + super.loadToAllPlayers(); for (Player all : Bukkit.getOnlinePlayers()) { - ArmorStandManager asm = new ArmorStandManager(all); - asm.addDefault(); - armorStandManagerMap.put(all, asm); - teamManager.sendUpdateToOne(all); - teamManager.sendUpdateToAll(all, true); + ArmorStandManager asm = createArmorStandManager(all); + asm.initNameplateArmorStands(); for (Player player : Bukkit.getOnlinePlayers()) - spawnArmorStands(player, all, false); + spawnArmorStands(player, all); } } + @Override + public void arrangeRefreshTask() { + refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (ArmorStandManager asm : armorStandManagerMap.values()) { + asm.refresh(false); + } + }, 1, 1); + } + @Override public void onSneak(Player player, boolean isSneaking) { getArmorStandManager(player).setSneak(isSneaking, true); diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/VehicleChecker.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java similarity index 77% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/VehicleChecker.java rename to src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java index 92cd002..8255a2c 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tp/VehicleChecker.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java @@ -15,28 +15,27 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates.mode.tp; +package net.momirealms.customnameplates.object.nameplate.mode.armorstand; import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.Function; +import net.momirealms.customnameplates.object.Function; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; -import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; public class VehicleChecker extends Function { private final ConcurrentHashMap playersOnVehicle; - private final TeleportingTag teleportingTag; + private final ArmorStandTag armorStandTag; private BukkitTask task; - public VehicleChecker(TeleportingTag teleportingTag) { - this.teleportingTag = teleportingTag; + public VehicleChecker(ArmorStandTag armorStandTag) { + this.armorStandTag = armorStandTag; this.playersOnVehicle = new ConcurrentHashMap<>(); } @@ -48,10 +47,10 @@ public class VehicleChecker extends Function { playersOnVehicle.put(all, vehicle); } } - this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.plugin, () -> { + this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { for (Player inVehicle : playersOnVehicle.keySet()) { - if (!inVehicle.isOnline() || teleportingTag.getArmorStandManager(inVehicle) == null) continue; - teleportingTag.getArmorStandManager(inVehicle).teleport(); + if (!inVehicle.isOnline() || armorStandTag.getArmorStandManager(inVehicle) == null) continue; + armorStandTag.getArmorStandManager(inVehicle).teleport(); } }, 1, 1); } @@ -74,11 +73,11 @@ public class VehicleChecker extends Function { public void refresh(Player player) { Entity vehicle = player.getVehicle(); if (playersOnVehicle.containsKey(player) && vehicle == null) { - teleportingTag.getArmorStandManager(player).teleport(); + armorStandTag.getArmorStandManager(player).teleport(); playersOnVehicle.remove(player); } if (!playersOnVehicle.containsKey(player) && vehicle != null) { - teleportingTag.getArmorStandManager(player).respawn(); + armorStandTag.getArmorStandManager(player).respawn(); playersOnVehicle.put(player, vehicle); } } diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java new file mode 100644 index 0000000..4dc3036 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.nameplate.mode.team; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.nameplate.mode.AbstractNameplateTag; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class TeamTag extends AbstractNameplateTag { + + private final TeamManager teamManager; + + public TeamTag(CustomNameplates plugin) { + super(plugin); + this.teamManager = plugin.getTeamManager(); + } + + @Override + public void arrangeRefreshTask() { + refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + teamManager.sendUpdateToAll(player, false); + } + }, 1, 1); + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/requirements/BiomeImpl.java b/src/main/java/net/momirealms/customnameplates/object/requirements/BiomeImpl.java new file mode 100644 index 0000000..80bfded --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/BiomeImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.requirements; + +import net.momirealms.biomeapi.BiomeAPI; + +import java.util.HashSet; + +public record BiomeImpl(HashSet biomes) implements Requirement { + + @Override + public boolean isConditionMet(PlayerCondition playerCondition) { + return biomes.contains(BiomeAPI.getBiome(playerCondition.getPlayer().getLocation())); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/requirements/CustomPapiImpl.java b/src/main/java/net/momirealms/customnameplates/object/requirements/CustomPapiImpl.java new file mode 100644 index 0000000..fe77eec --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/CustomPapiImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.requirements; + +import net.momirealms.customnameplates.object.requirements.papi.*; +import org.bukkit.configuration.MemorySection; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +public class CustomPapiImpl implements Requirement { + + public static HashSet allPapi = new HashSet<>(); + private final List papiRequirement; + + public CustomPapiImpl(Map expressions){ + papiRequirement = getRequirements(expressions); + } + + @Override + public boolean isConditionMet(PlayerCondition condition) { + for (PapiRequirement requirement : papiRequirement) { + if (!requirement.isMet(condition.getPapiMap(), condition.getPlayer())) { + return false; + } + } + return true; + } + + private List getRequirements(Map map) { + List papiRequirements = new ArrayList<>(); + map.keySet().forEach(key -> { + if (key.startsWith("&&")) { + if (map.get(key) instanceof MemorySection map2) { + papiRequirements.add(new ExpressionAnd(getRequirements(map2.getValues(false)))); + } + } else if (key.startsWith("||")) { + if (map.get(key) instanceof MemorySection map2) { + papiRequirements.add(new ExpressionOr(getRequirements(map2.getValues(false)))); + } + } else { + if (map.get(key) instanceof MemorySection map2) { + String type = map2.getString("type"); + String papi = map2.getString("papi"); + String value = map2.getString("value"); + if (value == null || papi == null || type == null) return; + allPapi.add(papi); + switch (type){ + case "==" -> papiRequirements.add(new PapiEquals(papi, value)); + case "!=" -> papiRequirements.add(new PapiNotEquals(papi, value)); + case ">=" -> papiRequirements.add(new PapiNoLess(papi, value)); + case "<=" -> papiRequirements.add(new PapiNoLarger(papi, value)); + case "<" -> papiRequirements.add(new PapiSmaller(papi, value)); + case ">" -> papiRequirements.add(new PapiGreater(papi, value)); + } + } + } + }); + return papiRequirements; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/requirements/DateImpl.java b/src/main/java/net/momirealms/customnameplates/object/requirements/DateImpl.java new file mode 100644 index 0000000..aa2037d --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/DateImpl.java @@ -0,0 +1,14 @@ +package net.momirealms.customnameplates.object.requirements; + +import java.util.Calendar; +import java.util.HashSet; + +public record DateImpl(HashSet dates) implements Requirement { + + @Override + public boolean isConditionMet(PlayerCondition playerCondition) { + Calendar calendar = Calendar.getInstance(); + String current = calendar.get(Calendar.MONTH) + "/" + calendar.get(Calendar.DATE); + return dates.contains(current); + } +} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/Permission.java b/src/main/java/net/momirealms/customnameplates/object/requirements/PermissionImpl.java similarity index 87% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/Permission.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/PermissionImpl.java index adee2a7..9a5e0db 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/Permission.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/PermissionImpl.java @@ -15,9 +15,9 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; -public record Permission(String permission) implements Requirement { +public record PermissionImpl(String permission) implements Requirement { public String getPermission() { return this.permission; diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/PlayerCondition.java b/src/main/java/net/momirealms/customnameplates/object/requirements/PlayerCondition.java similarity index 71% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/PlayerCondition.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/PlayerCondition.java index 719edaa..4870f54 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/PlayerCondition.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/PlayerCondition.java @@ -15,37 +15,29 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; +import me.clip.placeholderapi.PlaceholderAPI; import net.momirealms.customnameplates.CustomNameplates; -import org.bukkit.Location; import org.bukkit.entity.Player; import java.util.HashMap; public class PlayerCondition { - private final Location location; private final Player player; private final HashMap papiMap; - public PlayerCondition(Location location, Player player) { - this.location = location; + public PlayerCondition(Player player) { this.player = player; this.papiMap = new HashMap<>(); - CustomPapi.allPapi.forEach(papi -> { - this.papiMap.put(papi, CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, papi)); - }); + CustomPapiImpl.allPapi.forEach(papi -> this.papiMap.put(papi, PlaceholderAPI.setPlaceholders(player, papi))); } public HashMap getPapiMap() { return papiMap; } - public Location getLocation() { - return location; - } - public Player getPlayer() { return player; } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/Requirement.java b/src/main/java/net/momirealms/customnameplates/object/requirements/Requirement.java similarity index 92% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/Requirement.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/Requirement.java index fd4db5f..f59398a 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/Requirement.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/Requirement.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; public interface Requirement { boolean isConditionMet(PlayerCondition playerCondition); diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/Time.java b/src/main/java/net/momirealms/customnameplates/object/requirements/TimeImpl.java similarity index 85% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/Time.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/TimeImpl.java index 2d0d514..645e96f 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/Time.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/TimeImpl.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; import org.apache.commons.lang.StringUtils; import java.util.List; -public record Time(List times) implements Requirement{ +public record TimeImpl(List times) implements Requirement{ public List getTimes() { return this.times; @@ -29,7 +29,7 @@ public record Time(List times) implements Requirement{ @Override public boolean isConditionMet(PlayerCondition playerCondition) { - long time = playerCondition.getLocation().getWorld().getTime(); + long time = playerCondition.getPlayer().getWorld().getTime(); for (String range : times) { String[] timeMinMax = StringUtils.split(range, "~"); if (time > Long.parseLong(timeMinMax[0]) && time < Long.parseLong(timeMinMax[1])) { diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/Weather.java b/src/main/java/net/momirealms/customnameplates/object/requirements/WeatherImpl.java similarity index 57% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/Weather.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/WeatherImpl.java index 8ec8d67..c4b1ecf 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/Weather.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/WeatherImpl.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; import org.bukkit.World; import java.util.List; -public record Weather(List weathers) implements Requirement { +public record WeatherImpl(List weathers) implements Requirement { public List getWeathers() { return this.weathers; @@ -29,22 +29,20 @@ public record Weather(List weathers) implements Requirement { @Override public boolean isConditionMet(PlayerCondition playerCondition) { - World world = playerCondition.getLocation().getWorld(); - if (world != null) { - String currentWeather; - if (world.isThundering()) { - currentWeather = "thunder"; - } else if (world.isClearWeather()) { - currentWeather = "clear"; - } else { - currentWeather = "rain"; + World world = playerCondition.getPlayer().getWorld(); + String currentWeather; + if (world.isThundering()) { + if (world.isClearWeather()) currentWeather = "thunder"; + else currentWeather = "rainstorm"; + } else if (world.isClearWeather()) { + currentWeather = "clear"; + } else { + currentWeather = "rain"; + } + for (String weather : weathers) { + if (weather.equalsIgnoreCase(currentWeather)) { + return true; } - for (String weather : weathers) { - if (weather.equalsIgnoreCase(currentWeather)) { - return true; - } - } - return false; } return false; } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/World.java b/src/main/java/net/momirealms/customnameplates/object/requirements/WorldImpl.java similarity index 73% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/World.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/WorldImpl.java index 5055ee4..0493857 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/World.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/WorldImpl.java @@ -15,11 +15,11 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; import java.util.List; -public record World(List worlds) implements Requirement { +public record WorldImpl(List worlds) implements Requirement { public List getWorlds() { return this.worlds; @@ -27,10 +27,7 @@ public record World(List worlds) implements Requirement { @Override public boolean isConditionMet(PlayerCondition playerCondition) { - org.bukkit.World world = playerCondition.getLocation().getWorld(); - if (world != null) { - return worlds.contains(world.getName()); - } - return false; + org.bukkit.World world = playerCondition.getPlayer().getWorld(); + return worlds.contains(world.getName()); } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/YPos.java b/src/main/java/net/momirealms/customnameplates/object/requirements/YPosImpl.java similarity index 85% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/YPos.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/YPosImpl.java index fb2d147..97af0e7 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/YPos.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/YPosImpl.java @@ -15,13 +15,13 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements; +package net.momirealms.customnameplates.object.requirements; import org.apache.commons.lang.StringUtils; import java.util.List; -public record YPos(List yPos) implements Requirement { +public record YPosImpl(List yPos) implements Requirement { public List getYPos() { return this.yPos; @@ -29,7 +29,7 @@ public record YPos(List yPos) implements Requirement { @Override public boolean isConditionMet(PlayerCondition playerCondition) { - int y = (int) playerCondition.getLocation().getY(); + int y = (int) playerCondition.getPlayer().getLocation().getY(); for (String range : yPos) { String[] yMinMax = StringUtils.split(range, "~"); if (y > Integer.parseInt(yMinMax[0]) && y < Integer.parseInt(yMinMax[1])) { diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionAnd.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionAnd.java similarity index 79% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionAnd.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionAnd.java index e0a10c3..f631d66 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionAnd.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionAnd.java @@ -15,7 +15,9 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import org.bukkit.entity.Player; import java.util.HashMap; import java.util.List; @@ -23,9 +25,9 @@ import java.util.List; public record ExpressionAnd(List requirements) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { for (PapiRequirement requirement : requirements) { - if (!requirement.isMet(papiMap)) return false; + if (!requirement.isMet(papiMap, player)) return false; } return true; } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionOr.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionOr.java similarity index 79% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionOr.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionOr.java index d362fbf..bb2b884 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/ExpressionOr.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/ExpressionOr.java @@ -15,7 +15,9 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import org.bukkit.entity.Player; import java.util.HashMap; import java.util.List; @@ -23,9 +25,9 @@ import java.util.List; public record ExpressionOr(List requirements) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { for (PapiRequirement requirement : requirements) { - if (requirement.isMet(papiMap)) return true; + if (requirement.isMet(papiMap, player)) return true; } return false; } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiEquals.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiEquals.java similarity index 74% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiEquals.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiEquals.java index 63edd95..63ff1a2 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiEquals.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiEquals.java @@ -15,7 +15,10 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; import java.util.Objects; @@ -23,8 +26,8 @@ import java.util.Objects; public record PapiEquals(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { String value = papiMap.get(papi); - return Objects.equals(value, requirement); + return Objects.equals(value, PlaceholderAPI.setPlaceholders(player, requirement)); } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiGreater.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiGreater.java similarity index 68% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiGreater.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiGreater.java index 19dc793..e161636 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiGreater.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiGreater.java @@ -15,15 +15,18 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; -public record PapiGreater(String papi, double requirement) implements PapiRequirement{ +public record PapiGreater(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { double value = Double.parseDouble(papiMap.get(papi)); - return value > requirement; + return value > Double.parseDouble(PlaceholderAPI.setPlaceholders(player, requirement)); } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLarger.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLarger.java similarity index 68% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLarger.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLarger.java index f822d72..ebb88fe 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLarger.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLarger.java @@ -15,15 +15,18 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; -public record PapiNoLarger(String papi, double requirement) implements PapiRequirement{ +public record PapiNoLarger(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { double value = Double.parseDouble(papiMap.get(papi)); - return value <= requirement; + return value <= Double.parseDouble(PlaceholderAPI.setPlaceholders(player, requirement)); } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLess.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLess.java similarity index 68% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLess.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLess.java index 1420d21..304d0d6 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNoLess.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNoLess.java @@ -15,15 +15,18 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; -public record PapiNoLess(String papi, double requirement) implements PapiRequirement{ +public record PapiNoLess(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { double value = Double.parseDouble(papiMap.get(papi)); - return value >= requirement; + return value >= Double.parseDouble(PlaceholderAPI.setPlaceholders(player, requirement)); } } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNotEquals.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNotEquals.java similarity index 74% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNotEquals.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNotEquals.java index 9fcee0b..6df0ce4 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiNotEquals.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiNotEquals.java @@ -15,7 +15,10 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; import java.util.Objects; @@ -23,8 +26,8 @@ import java.util.Objects; public record PapiNotEquals(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { String value = papiMap.get(papi); - return !Objects.equals(value, requirement); + return !Objects.equals(value, PlaceholderAPI.setPlaceholders(player, requirement)); } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiRequirement.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiRequirement.java similarity index 81% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiRequirement.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiRequirement.java index 821d57f..ab693c3 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiRequirement.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiRequirement.java @@ -15,10 +15,12 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import org.bukkit.entity.Player; import java.util.HashMap; public interface PapiRequirement { - boolean isMet(HashMap papiMap); + boolean isMet(HashMap papiMap, Player player); } diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiSmaller.java b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiSmaller.java similarity index 68% rename from src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiSmaller.java rename to src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiSmaller.java index 5333630..75c66e1 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/papi/PapiSmaller.java +++ b/src/main/java/net/momirealms/customnameplates/object/requirements/papi/PapiSmaller.java @@ -15,15 +15,18 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.requirements.papi; +package net.momirealms.customnameplates.object.requirements.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; import java.util.HashMap; -public record PapiSmaller(String papi, double requirement) implements PapiRequirement{ +public record PapiSmaller(String papi, String requirement) implements PapiRequirement{ @Override - public boolean isMet(HashMap papiMap) { + public boolean isMet(HashMap papiMap, Player player) { double value = Double.parseDouble(papiMap.get(papi)); - return value < requirement; + return value < Double.parseDouble(PlaceholderAPI.setPlaceholders(player, requirement)); } } diff --git a/src/main/java/net/momirealms/customnameplates/object/team/TeamNameInterface.java b/src/main/java/net/momirealms/customnameplates/object/team/TeamNameInterface.java new file mode 100644 index 0000000..4ac44e7 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/team/TeamNameInterface.java @@ -0,0 +1,12 @@ +package net.momirealms.customnameplates.object.team; + +import org.bukkit.entity.Player; + +public interface TeamNameInterface { + + String getTeamName(Player player); + void onJoin(Player player); + void onQuit(Player player); + void unload(); + void load(); +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/TeamPacketInterface.java b/src/main/java/net/momirealms/customnameplates/object/team/TeamPacketInterface.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/objects/team/TeamPacketInterface.java rename to src/main/java/net/momirealms/customnameplates/object/team/TeamPacketInterface.java index fe56b6f..4e1bc07 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/team/TeamPacketInterface.java +++ b/src/main/java/net/momirealms/customnameplates/object/team/TeamPacketInterface.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.team; +package net.momirealms.customnameplates.object.team; import org.bukkit.entity.Player; @@ -23,5 +23,4 @@ public interface TeamPacketInterface { void sendUpdateToOne(Player player); void sendUpdateToAll(Player player, boolean force); - } diff --git a/src/main/java/net/momirealms/customnameplates/object/team/name/PlayerNameTeamImpl.java b/src/main/java/net/momirealms/customnameplates/object/team/name/PlayerNameTeamImpl.java new file mode 100644 index 0000000..f77558b --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/team/name/PlayerNameTeamImpl.java @@ -0,0 +1,105 @@ +package net.momirealms.customnameplates.object.team.name; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.InternalStructure; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.utility.MinecraftReflection; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.team.TeamNameInterface; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.util.Collections; +import java.util.Optional; + +public class PlayerNameTeamImpl implements TeamNameInterface { + + private final TeamManager teamManager; + + public PlayerNameTeamImpl(TeamManager teamManager) { + this.teamManager = teamManager; + } + + @Override + public String getTeamName(Player player) { + return player.getName(); + } + + @Override + public void onJoin(Player player) { + if (teamManager.isFakeTeam()) { + createFakeTeamToAll(player); + } + else { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + Team team = scoreboard.getTeam(player.getName()); + if (team == null) { + team = scoreboard.registerNewTeam(player.getName()); + } + team.addEntry(player.getName()); + } + } + + @Override + public void onQuit(Player player) { + if (teamManager.isFakeTeam()) { + destroyTeamToAll(player); + } + else { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); + Team team = scoreboard.getTeam(player.getName()); + if (team != null) team.unregister(); + } + } + + @Override + public void unload() { + for (Player player : Bukkit.getOnlinePlayers()) { + destroyTeamToAll(player); + } + } + + @Override + public void load() { + for (Player player : Bukkit.getOnlinePlayers()) { + createFakeTeamToAll(player); + } + } + + // Send fake team packets + public void createFakeTeamToAll(Player joinPlayer) { + PacketContainer packetToAll = getPlayerTeamCreatePacket(joinPlayer); + for (Player all : Bukkit.getOnlinePlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(joinPlayer, getPlayerTeamCreatePacket(all)); + if (joinPlayer != all) CustomNameplates.getProtocolManager().sendServerPacket(all, packetToAll); + } + } + + // Get team create packet + private PacketContainer getPlayerTeamCreatePacket(Player joinPlayer) { + PacketContainer packetToAll = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + packetToAll.getIntegers().write(0,0); + packetToAll.getStrings().write(0, joinPlayer.getName()); + packetToAll.getModifier().write(2, Collections.singletonList(joinPlayer.getName())); + Optional optionalInternalStructure = packetToAll.getOptionalStructures().read(0); + if (optionalInternalStructure.isPresent()) { + InternalStructure internalStructure = optionalInternalStructure.get(); + internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE); + } + return packetToAll; + } + + // Get team destroy packet + public void destroyTeamToAll(Player quitPlayer) { + PacketContainer packetToAll = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + packetToAll.getIntegers().write(0,1); + packetToAll.getStrings().write(0, quitPlayer.getName()); + for (Player all : Bukkit.getOnlinePlayers()) { + CustomNameplates.getProtocolManager().sendServerPacket(all, packetToAll); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/team/name/TABBungeeCordImpl.java b/src/main/java/net/momirealms/customnameplates/object/team/name/TABBungeeCordImpl.java new file mode 100644 index 0000000..579f028 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/team/name/TABBungeeCordImpl.java @@ -0,0 +1,92 @@ +package net.momirealms.customnameplates.object.team.name; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.team.TeamNameInterface; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +public class TABBungeeCordImpl implements TeamNameInterface { + + private final ConcurrentHashMap teamNameMap; + private final ProxyDataListener proxyDataListener; + + public TABBungeeCordImpl() { + this.teamNameMap = new ConcurrentHashMap<>(); + this.proxyDataListener = new ProxyDataListener(this); + } + + @Override + public void load() { + Bukkit.getServer().getMessenger().registerOutgoingPluginChannel(CustomNameplates.getInstance(), "customnameplates:cnp"); + Bukkit.getServer().getMessenger().registerIncomingPluginChannel(CustomNameplates.getInstance(), "customnameplates:cnp", proxyDataListener); + } + + @Override + public void unload() { + this.teamNameMap.clear(); + Bukkit.getServer().getMessenger().unregisterIncomingPluginChannel(CustomNameplates.getInstance(), "customnameplates:cnp"); + Bukkit.getServer().getMessenger().unregisterOutgoingPluginChannel(CustomNameplates.getInstance(), "customnameplates:cnp"); + } + + @Override + public String getTeamName(Player player) { + String teamName = teamNameMap.get(player.getName()); + if (teamName == null) { + sendRequest(player); + return player.getName(); + } + else { + return teamName; + } + } + + @Override + public void onJoin(Player player) { + sendRequest(player); + } + + @Override + public void onQuit(Player player) { + teamNameMap.remove(player.getName()); + } + + @SuppressWarnings("UnstableApiUsage") + private void sendRequest(Player player) { + ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); + dataOutput.writeUTF(player.getName()); + player.sendPluginMessage(CustomNameplates.getInstance(), "customnameplates:cnp", dataOutput.toByteArray()); + } + + public void addPlayerToCache(String playerName, String teamName) { + teamNameMap.put(playerName, teamName); + } + + public static class ProxyDataListener implements PluginMessageListener { + + private final TABBungeeCordImpl TABBungeeCordImpl; + + public ProxyDataListener(TABBungeeCordImpl TABBungeeCordImpl) { + this.TABBungeeCordImpl = TABBungeeCordImpl; + } + + @Override + @SuppressWarnings("UnstableApiUsage") + public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) { + if (!Objects.equals("customnameplates:cnp", channel)) { + return; + } + ByteArrayDataInput dataInput = ByteStreams.newDataInput(message); + String playerName = dataInput.readUTF(); + String teamName = dataInput.readUTF(); + TABBungeeCordImpl.addPlayerToCache(playerName, teamName); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/TABTeamHook.java b/src/main/java/net/momirealms/customnameplates/object/team/name/TABImpl.java similarity index 76% rename from src/main/java/net/momirealms/customnameplates/objects/team/TABTeamHook.java rename to src/main/java/net/momirealms/customnameplates/object/team/name/TABImpl.java index 4838356..f292ce3 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/team/TABTeamHook.java +++ b/src/main/java/net/momirealms/customnameplates/object/team/name/TABImpl.java @@ -15,13 +15,14 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.team; +package net.momirealms.customnameplates.object.team.name; import me.neznamy.tab.api.TabPlayer; import me.neznamy.tab.shared.TAB; +import net.momirealms.customnameplates.object.team.TeamNameInterface; import org.bukkit.entity.Player; -public class TABTeamHook implements TeamNameInterface { +public class TABImpl implements TeamNameInterface { @Override public String getTeamName(Player player) { @@ -31,8 +32,23 @@ public class TABTeamHook implements TeamNameInterface { return teamName == null ? player.getName() : teamName; } + @Override + public void onJoin(Player player) { + + } + + @Override + public void onQuit(Player player) { + + } + @Override public void unload() { } + + @Override + public void load() { + + } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamInfoImpl.java b/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamInfoImpl.java new file mode 100644 index 0000000..d3734f0 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamInfoImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.team.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.InternalStructure; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.utility.MinecraftReflection; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import net.momirealms.customnameplates.object.team.TeamPacketInterface; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.Optional; + +public class TeamInfoImpl implements TeamPacketInterface { + + private final TeamManager teamManager; + + public TeamInfoImpl(TeamManager teamManager) { + this.teamManager = teamManager; + } + + // this method would only be used when a player join the server + @Override + public void sendUpdateToOne(Player player) { + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + if (player == otherPlayer) continue; + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + NameplatesTeam nameplatesTeam = teamManager.getNameplateTeam(otherPlayer.getUniqueId()); + if (nameplatesTeam == null) continue; + packet.getStrings().write(0, nameplatesTeam.getTeam_name()); + //update + packet.getIntegers().write(0,2); + sendPacket(player, packet, nameplatesTeam); + } + } + + // this method would be used when joining the server, refresh task, equip new nameplate + @Override + public void sendUpdateToAll(Player player, boolean force) { + NameplatesTeam nameplatesTeam = teamManager.getNameplateTeam(player.getUniqueId()); + if (nameplatesTeam != null && nameplatesTeam.update(force)) { + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + packet.getStrings().write(0, nameplatesTeam.getTeam_name()); + //update + packet.getIntegers().write(0,2); + sendPacket(otherPlayer, packet, nameplatesTeam); + } + } + } + + private void sendPacket(Player player, PacketContainer packet, NameplatesTeam nameplatesTeam) { + Optional optionalInternalStructure = packet.getOptionalStructures().read(0); + if (optionalInternalStructure.isPresent()) { + InternalStructure internalStructure = optionalInternalStructure.get(); + internalStructure.getStrings().write(0, "always"); + internalStructure.getChatComponents().write(1, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(nameplatesTeam.getNameplatePrefixComponent()))); + internalStructure.getChatComponents().write(2, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(nameplatesTeam.getNameplateSuffixComponent()))); + internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, nameplatesTeam.getColor()); + CustomNameplates.getProtocolManager().sendServerPacket(player, packet); + } + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamVisibilityImpl.java b/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamVisibilityImpl.java new file mode 100644 index 0000000..d5ebb83 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/team/packet/TeamVisibilityImpl.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.object.team.packet; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.InternalStructure; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.utility.MinecraftReflection; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import net.momirealms.customnameplates.object.team.TeamPacketInterface; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.Optional; + +public class TeamVisibilityImpl implements TeamPacketInterface { + + private final TeamManager teamManager; + + public TeamVisibilityImpl(TeamManager teamManager) { + this.teamManager = teamManager; + } + + // this method would only be used when a player join the server + @Override + public void sendUpdateToOne(Player player) { + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + if (player == otherPlayer) continue; + NameplatesTeam nameplatesTeam = teamManager.getNameplateTeam(otherPlayer.getUniqueId()); + if (nameplatesTeam != null) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + packet.getIntegers().write(0,2); + packet.getStrings().write(0, nameplatesTeam.getTeam_name()); + Optional optionalInternalStructure = packet.getOptionalStructures().read(0); + optionalInternalStructure.ifPresent(internalStructure -> sendPackets(player, packet, internalStructure)); + } + } + } + + // this method would only be used when a player join the server + @Override + public void sendUpdateToAll(Player player, boolean force) { + NameplatesTeam nameplatesTeam = teamManager.getNameplateTeam(player.getUniqueId()); + if (nameplatesTeam != null) { + for (Player otherPlayer : Bukkit.getOnlinePlayers()) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); + packet.getStrings().write(0, nameplatesTeam.getTeam_name()); + packet.getIntegers().write(0,2); + Optional optionalInternalStructure = packet.getOptionalStructures().read(0); + optionalInternalStructure.ifPresent(internalStructure -> sendPackets(otherPlayer, packet, internalStructure)); + } + } + } + + private void sendPackets(Player player, PacketContainer packet, InternalStructure internalStructure) { + internalStructure.getStrings().write(0, "never"); + internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE); + CustomNameplates.getProtocolManager().sendServerPacket(player, packet); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/StaticText.java b/src/main/java/net/momirealms/customnameplates/objects/StaticText.java deleted file mode 100644 index c72573e..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/StaticText.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.momirealms.customnameplates.objects; - -public record StaticText(String text, int value) { - - public String getText() { - return text; - } - - public int getStaticValue() { - return value; - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarTask.java b/src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarTask.java deleted file mode 100644 index da2ddb4..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/actionbar/ActionBarTask.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.actionbar; - -import me.clip.placeholderapi.PlaceholderAPI; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.requirements.PlayerCondition; -import net.momirealms.customnameplates.objects.requirements.Requirement; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -public class ActionBarTask { - - private final ActionBarConfig config; - private int timer_1; - private int timer_2; - private int counter; - private String text; - private final int size; - private BukkitTask task; - - public ActionBarTask(ActionBarConfig config) { - this.config = config; - size = config.getText().length; - text = config.getText()[0]; - start(); - } - - public void setText(int position) { - this.text = config.getText()[position]; - } - - private void start() { - - this.task = new BukkitRunnable() { - @Override - public void run() { - if (size != 1) { - timer_2++; - if (timer_2 > config.getInterval()) { - timer_2 = 0; - counter++; - if (counter == size) { - counter = 0; - } - setText(counter); - } - } - if (timer_1 < config.getRate()){ - timer_1++; - } - else { - outer: - for (Player player : Bukkit.getOnlinePlayers()) { - - PlayerCondition condition = new PlayerCondition(player.getLocation(), player); - - for (Requirement requirement : config.getConditions()) { - if (!requirement.isConditionMet(condition)) { - continue outer; - } - } - - AdventureUtil.playerActionbar(player, AdventureUtil.replaceLegacy(PlaceholderAPI.setPlaceholders(player, text))); - } - } - } - }.runTaskTimerAsynchronously(CustomNameplates.plugin, 1, 1); - } - - public void stop() { - if (this.task != null) { - task.cancel(); - } - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/background/BackGround.java b/src/main/java/net/momirealms/customnameplates/objects/background/BackGround.java deleted file mode 100644 index ffca79e..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/background/BackGround.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.background; - -import net.momirealms.customnameplates.objects.SimpleChar; -import net.momirealms.customnameplates.objects.font.FontOffset; - -public record BackGround(SimpleChar start, SimpleChar offset_1, - SimpleChar offset_2, SimpleChar offset_4, - SimpleChar offset_8, SimpleChar offset_16, - SimpleChar offset_32, SimpleChar offset_64, - SimpleChar offset_128, SimpleChar end, - int start_width, int end_width) { - - public String getBackGround(int n) { - - String offset = FontOffset.getShortestNegChars(n + end_width + 2); - n = n + start_width + end_width + 2; - StringBuilder stringBuilder = new StringBuilder(); - - stringBuilder.append(start.getChars()); - while (n >= 128) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_128.getChars()); - n -= 128; - } - if (n - 64 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_64.getChars()); - n -= 64; - } - if (n - 32 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_32.getChars()); - n -= 32; - } - if (n - 16 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_16.getChars()); - n -= 16; - } - if (n - 8 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_8.getChars()); - n -= 8; - } - if (n - 4 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_4.getChars()); - n -= 4; - } - if (n - 2 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_2.getChars()); - n -= 2; - } - if (n - 1 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(offset_1.getChars()); - } - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - stringBuilder.append(end.getChars()).append(offset); - return stringBuilder.toString(); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarSender.java b/src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarSender.java deleted file mode 100644 index ce76a21..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/bossbar/BossBarSender.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.bossbar; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.InternalStructure; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.utility.MinecraftReflection; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.TextCache; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; -import org.bukkit.boss.BarColor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.UUID; - -public class BossBarSender { - - private final Player player; - private int timer_1; - private int timer_2; - private int timer_3; - private int counter; - private final int size; - private final TextCache[] texts; - private TextCache text; - private BukkitTask bukkitTask; - private final UUID uuid; - private boolean force; - private final BossBarConfig config; - private boolean isShown; - - public void setText(int position) { - this.text = texts[position]; - this.force = true; - } - - public BossBarSender(Player player, BossBarConfig config){ - String[] str = config.getText(); - this.size = str.length; - texts = new TextCache[str.length]; - for (int i = 0; i < str.length; i++) { - texts[i] = new TextCache(player, str[i]); - } - text = texts[0]; - this.player = player; - this.uuid = UUID.randomUUID(); - this.config = config; - this.isShown = false; - this.timer_3 = config.getRate(); - } - - public boolean canConditionCheck() { - timer_3++; - if (timer_3 > config.getRate()) { - timer_3 = 0; - return true; - } - return false; - } - - public void show() { - this.isShown = true; - - CustomNameplates.protocolManager.sendServerPacket(player, getPacket()); - - this.bukkitTask = new BukkitRunnable() { - @Override - public void run() { - if (size != 1) { - timer_2++; - if (timer_2 > config.getInterval()) { - timer_2 = 0; - counter++; - if (counter == size) { - counter = 0; - } - setText(counter); - } - } - if (timer_1 < config.getRate()) { - timer_1++; - } - else { - timer_1 = 0; - if (text.update() || force) { - force = false; - CustomNameplates.protocolManager.sendServerPacket(player, getUpdatePacket()); - } - } - } - }.runTaskTimerAsynchronously(CustomNameplates.plugin, 0,1); - } - - private PacketContainer getPacket() { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); - packet.getModifier().write(0, uuid); - InternalStructure internalStructure = packet.getStructures().read(1); - internalStructure.getChatComponents().write(0, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.getLatestValue()))))); - internalStructure.getFloat().write(0,1F); - internalStructure.getEnumModifier(BarColor.class, 2).write(0, config.getColor()); - internalStructure.getEnumModifier(Overlay.class, 3).write(0, config.getOverlay()); - internalStructure.getModifier().write(4, false); - internalStructure.getModifier().write(5, false); - internalStructure.getModifier().write(6, false); - return packet; - } - - private PacketContainer getUpdatePacket() { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); - packet.getModifier().write(0, uuid); - try { - Method sMethod = MinecraftReflection.getChatSerializerClass().getMethod("a", String.class); - sMethod.setAccessible(true); - Object chatComponent = sMethod.invoke(null, GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text.getLatestValue())))); - Class packetBossClass = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutBoss$e"); - Constructor packetConstructor = packetBossClass.getDeclaredConstructor(MinecraftReflection.getIChatBaseComponentClass()); - packetConstructor.setAccessible(true); - Object updatePacket = packetConstructor.newInstance(chatComponent); - packet.getModifier().write(1, updatePacket); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | ClassNotFoundException | - InstantiationException e) { - throw new RuntimeException(e); - } - return packet; - } - - public void hide() { - if (bukkitTask != null) bukkitTask.cancel(); - remove(); - this.isShown = false; - } - - private void remove() { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.BOSS); - packet.getModifier().write(0, uuid); - try { - Class bar = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutBoss"); - Field remove = bar.getDeclaredField("f"); - remove.setAccessible(true); - packet.getModifier().write(1, remove.get(null)); - CustomNameplates.protocolManager.sendServerPacket(player, packet); - } catch (ClassNotFoundException e){ - AdventureUtil.consoleMessage("[CustomNameplates] Failed to remove bossbar for " + player.getName()); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - public boolean getStatus() { - return this.isShown; - } - - public BossBarConfig getConfig() { - return config; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/bossbar/TimerTaskP.java b/src/main/java/net/momirealms/customnameplates/objects/bossbar/TimerTaskP.java deleted file mode 100644 index 658db7c..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/bossbar/TimerTaskP.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.bossbar; - -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.objects.requirements.PlayerCondition; -import net.momirealms.customnameplates.objects.requirements.Requirement; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.util.ArrayList; -import java.util.List; - -public class TimerTaskP { - - private final List bossBarCache = new ArrayList<>(); - - private final BukkitTask conditionTask; - - public TimerTaskP(Player player){ - - for (BossBarConfig config : CustomNameplates.plugin.getBossBarManager().getBossBars().values()) { - BossBarSender bossBarSender = new BossBarSender(player, config); - bossBarCache.add(bossBarSender); - } - - this.conditionTask = new BukkitRunnable() { - @Override - public void run() { - - PlayerCondition playerCondition = new PlayerCondition(player.getLocation(), player); - - outer: - for (BossBarSender bossBarSender : bossBarCache) { - if (bossBarSender.canConditionCheck()) { - for (Requirement requirement : bossBarSender.getConfig().getConditions()) { - if (!requirement.isConditionMet(playerCondition)) { - if (bossBarSender.getStatus()) { - bossBarSender.hide(); - } - continue outer; - } - } - if (!bossBarSender.getStatus()) { - bossBarSender.show(); - } - } - } - } - }.runTaskTimerAsynchronously(CustomNameplates.plugin, 0, 1); - } - - public void stopTimer() { - if (this.conditionTask != null) { - this.conditionTask.cancel(); - } - for (BossBarSender bossBarSender : bossBarCache) { - bossBarSender.hide(); - } - bossBarCache.clear(); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/DataStorageInterface.java b/src/main/java/net/momirealms/customnameplates/objects/data/DataStorageInterface.java deleted file mode 100644 index 5dd7640..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/data/DataStorageInterface.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.momirealms.customnameplates.objects.data; - -import org.bukkit.OfflinePlayer; - -public interface DataStorageInterface { - - void initialize(); - void disable(); - PlayerData loadData(OfflinePlayer player); - void saveData(PlayerData playerData); - -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/data/MySQLStorageImpl.java b/src/main/java/net/momirealms/customnameplates/objects/data/MySQLStorageImpl.java deleted file mode 100644 index 828d12b..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/data/MySQLStorageImpl.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.data; - -import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.OfflinePlayer; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.UUID; - -public class MySQLStorageImpl implements DataStorageInterface { - - public static SqlConnection sqlConnection = new SqlConnection(); - - @Override - public void initialize() { - sqlConnection.createNewHikariConfiguration(); - createTableIfNotExist(sqlConnection.getTable_name()); - } - - @Override - public void disable() { - sqlConnection.close(); - } - - @Override - public PlayerData loadData(OfflinePlayer player) { - PlayerData playerData = null; - try { - Connection connection = sqlConnection.getConnectionAndCheck(); - if (connection == null) return new PlayerData(player, NameplateManager.defaultNameplate, ChatBubblesManager.defaultBubble); - String sql = String.format(SqlConstants.SQL_SELECT_BY_UUID, sqlConnection.getTable_name()); - PreparedStatement statement = connection.prepareStatement(sql); - statement.setString(1, player.getUniqueId().toString()); - ResultSet rs = statement.executeQuery(); - if (rs.next()) { - String nameplate = rs.getString(2); - String bubbles = rs.getString(3); - playerData = new PlayerData(player, nameplate, bubbles); - } - else { - playerData = new PlayerData(player, NameplateManager.defaultNameplate, ChatBubblesManager.defaultBubble); - } - connection.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - return playerData; - } - - @Override - public void saveData(PlayerData playerData) { - UUID uuid = playerData.getPlayer().getUniqueId(); - if (exists(uuid)) { - updateData(uuid, playerData.getEquippedNameplate(), playerData.getBubbles()); - } - else { - insertData(uuid, playerData.getEquippedNameplate(), playerData.getBubbles()); - } - } - - private void createTableIfNotExist(String table) { - String sql = String.format(SqlConstants.SQL_CREATE_TABLE, table); - try { - Connection connection = sqlConnection.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql); - statement.executeUpdate(); - connection.close(); - } catch (SQLException ex) { - AdventureUtil.consoleMessage("[CustomNameplates] Failed to create table"); - } - } - - private void insertData(UUID uuid, String nameplate, String bubbles) { - String sql = String.format(SqlConstants.SQL_INSERT, sqlConnection.getTable_name()); - try { - Connection connection = sqlConnection.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql); - statement.setString(1, uuid.toString()); - statement.setString(2, nameplate); - statement.setString(3, bubbles); - statement.executeUpdate(); - connection.close(); - } catch (SQLException ex) { - AdventureUtil.consoleMessage("[CustomNameplates] Failed to insert data for " + uuid); - } - } - - private void updateData(UUID uuid, String nameplate, String bubbles) { - String sql = String.format(SqlConstants.SQL_UPDATE_BY_UUID, sqlConnection.getTable_name()); - try { - Connection connection = sqlConnection.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql); - statement.setString(1, nameplate); - statement.setString(2, bubbles); - statement.setString(3, uuid.toString()); - statement.executeUpdate(); - connection.close(); - } catch (SQLException ex) { - AdventureUtil.consoleMessage("[CustomNameplates] Failed to update data for " + uuid); - } - } - - public boolean exists(UUID uuid) { - String sql = String.format(SqlConstants.SQL_SELECT_BY_UUID, sqlConnection.getTable_name()); - boolean exist; - try { - Connection connection = sqlConnection.getConnection(); - PreparedStatement statement = connection.prepareStatement(sql); - statement.setString(1, uuid.toString()); - ResultSet rs = statement.executeQuery(); - exist = rs.next(); - connection.close(); - } catch (SQLException ex) { - AdventureUtil.consoleMessage("[CustomNameplates] Failed to select data for " + uuid); - return false; - } - return exist; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/font/FontChar.java b/src/main/java/net/momirealms/customnameplates/objects/font/FontChar.java deleted file mode 100644 index 05ea320..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/font/FontChar.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.font; - -public record FontChar(char left, char middle, char right) { - - public char getLeft() { - return this.left; - } - - public char getMiddle() { - return this.middle; - } - - public char getRight() { - return this.right; - } - - @Override - public boolean equals(Object o) { - if (o == this) return true; - if (!(o instanceof FontChar fontInfo)) return false; - return this.getLeft() == fontInfo.getLeft() && this.getMiddle() == fontInfo.getMiddle() && this.getRight() == fontInfo.getRight(); - } - - @Override - public int hashCode() { - return ((59 + this.getLeft()) * 59 + this.getMiddle()) * 59 + this.getRight(); - } - - @Override - public String toString() { - return "FontChar{" + - "left=" + left + - ", middle=" + middle + - ", right=" + right + - '}'; - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/font/FontOffset.java b/src/main/java/net/momirealms/customnameplates/objects/font/FontOffset.java deleted file mode 100644 index 07c8756..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/font/FontOffset.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.font; - -public enum FontOffset { - - /* - 实际向左移的距离是height(尺寸)-2 - */ - NEG_1('\uf801', -1, -3), - NEG_2('\uf802', -2, -4), - NEG_3('\uf803', -3, -5), - NEG_4('\uf804', -4, -6), - NEG_5('\uf805', -5, -7), - NEG_6('\uf806', -6, -8), - NEG_7('\uf807', -7, -9), - NEG_8('\uf808', -8, -10), - NEG_16('\uf809', -16, -18), - NEG_32('\uf80a', -32, -34), - NEG_64('\uf80b', -64, -66), - NEG_128('\uf80c', -128, -130), - - POS_1('\uf811', 1, -1), - POS_2('\uf812', 2, 1), - POS_3('\uf813', 3, 2), - POS_4('\uf814', 4, 3), - POS_5('\uf815', 5, 4), - POS_6('\uf816', 6, 5), - POS_7('\uf817', 7, 6), - POS_8('\uf818', 8, 7), - POS_16('\uf819', 16, 15), - POS_32('\uf81a', 32, 31), - POS_64('\uf81b', 64, 63), - POS_128('\uf81c', 128, 127); - - private final char character; - private final int space; - private final int height; - - FontOffset(char character, int space, int height) { - this.character = character; - this.space = space; - this.height = height; - } - - /* - 获取最短的负空格字符 - */ - public static String getShortestNegChars(int n) { - StringBuilder stringBuilder = new StringBuilder(); - while (n >= 128) { - stringBuilder.append(FontOffset.NEG_128.getCharacter()); - n -= 128; - } - if (n - 64 >= 0) { - stringBuilder.append(FontOffset.NEG_64.getCharacter()); - n -= 64; - } - if (n - 32 >= 0) { - stringBuilder.append(FontOffset.NEG_32.getCharacter()); - n -= 32; - } - if (n - 16 >= 0) { - stringBuilder.append(FontOffset.NEG_16.getCharacter()); - n -= 16; - } - if (n - 8 >= 0) { - stringBuilder.append(FontOffset.NEG_8.getCharacter()); - n -= 8; - } - if (n - 7 >= 0) { - stringBuilder.append(FontOffset.NEG_7.getCharacter()); - n -= 7; - } - if (n - 6 >= 0) { - stringBuilder.append(FontOffset.NEG_6.getCharacter()); - n -= 6; - } - if (n - 5 >= 0) { - stringBuilder.append(FontOffset.NEG_5.getCharacter()); - n -= 5; - } - if (n - 4 >= 0) { - stringBuilder.append(FontOffset.NEG_4.getCharacter()); - n -= 4; - } - if (n - 3 >= 0) { - stringBuilder.append(FontOffset.NEG_3.getCharacter()); - n -= 3; - } - if (n - 2 >= 0) { - stringBuilder.append(FontOffset.NEG_2.getCharacter()); - n -= 2; - } - if (n - 1 >= 0) { - stringBuilder.append(FontOffset.NEG_1.getCharacter()); - } - return stringBuilder.toString(); - } - - /* - 获取最短的正空格字符 - */ - public static String getShortestPosChars(int n) { - StringBuilder stringBuilder = new StringBuilder(); - while (n >= 128) { - stringBuilder.append(FontOffset.POS_128.getCharacter()); - n -= 128; - } - if (n - 64 >= 0) { - stringBuilder.append(FontOffset.POS_64.getCharacter()); - n -= 64; - } - if (n - 32 >= 0) { - stringBuilder.append(FontOffset.POS_32.getCharacter()); - n -= 32; - } - if (n - 16 >= 0) { - stringBuilder.append(FontOffset.POS_16.getCharacter()); - n -= 16; - } - if (n - 8 >= 0) { - stringBuilder.append(FontOffset.POS_8.getCharacter()); - n -= 8; - } - if (n - 7 >= 0) { - stringBuilder.append(FontOffset.POS_7.getCharacter()); - n -= 7; - } - if (n - 6 >= 0) { - stringBuilder.append(FontOffset.POS_6.getCharacter()); - n -= 6; - } - if (n - 5 >= 0) { - stringBuilder.append(FontOffset.POS_5.getCharacter()); - n -= 5; - } - if (n - 4 >= 0) { - stringBuilder.append(FontOffset.POS_4.getCharacter()); - n -= 4; - } - if (n - 3 >= 0) { - stringBuilder.append(FontOffset.POS_3.getCharacter()); - n -= 3; - } - if (n - 2 >= 0) { - stringBuilder.append(FontOffset.POS_2.getCharacter()); - n -= 2; - } - if (n - 1 >= 0) { - stringBuilder.append(FontOffset.POS_1.getCharacter()); - } - return stringBuilder.toString(); - } - - public char getCharacter() { - return this.character; - } - - public int getSpace() { - return this.space; - } - - public int getHeight() { - return this.height; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/font/FontUtil.java b/src/main/java/net/momirealms/customnameplates/objects/font/FontUtil.java deleted file mode 100644 index 36fc345..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/font/FontUtil.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.font; - -import net.momirealms.customnameplates.manager.WidthManager; - -import java.util.Objects; - -public class FontUtil { - - public static int getInfo(char c) { - return Objects.requireNonNullElse(WidthManager.fontWidth.get(c), 8); - } - - public static int getTotalWidth(String s) { - int length = s.length(); - int n = 0; - for (int i = 0; i < length; i++) { - n += getInfo(s.charAt(i)); - } - return n + length; - } - - public static String getOffset(int offset) { - if (offset >= 0) { - return FontOffset.getShortestPosChars(offset); - } - else { - return FontOffset.getShortestNegChars(-offset); - } - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStand.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStand.java deleted file mode 100644 index 5a466ec..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStand.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import net.momirealms.customnameplates.objects.TextCache; -import org.bukkit.entity.Player; - -public interface ArmorStand { - - void setOffset(double var1); - - double getOffset(); - - TextCache getText(); - - void teleport(); - - void teleport(Player player); - - void setSneak(boolean isSneaking, boolean respawn); - - void destroy(); - - void destroy(Player player); - - void refresh(); - - int getEntityId(); - - void spawn(Player player); - - void respawn(Player player); -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStandManager.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStandManager.java deleted file mode 100644 index 7135e30..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/ArmorStandManager.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.objects.TextCache; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -public class ArmorStandManager { - - private final Map armorStands = new ConcurrentHashMap<>(); - private ArmorStand[] armorStandArray = new ArmorStand[0]; - private final List nearbyPlayers = new ArrayList<>(); - private Player[] nearbyPlayerArray = new Player[0]; - private final Player owner; - - public ArmorStandManager(Player owner) { - this.owner = owner; - } - - public void addDefault() { - Set> entries = CustomNameplates.plugin.getNameplateManager().getTextMap().entrySet(); - entries.forEach(map -> addArmorStand(map.getKey(), new FakeArmorStand(this, owner, new TextCache(owner, map.getKey()), map.getValue()))); - } - - public void addArmorStand(String name, ArmorStand as) { - armorStands.put(name, as); - armorStandArray = armorStands.values().toArray(new ArmorStand[0]); - for (Player p : nearbyPlayerArray) as.spawn(p); - } - - public void mount(Player receiver) { - CustomNameplates.protocolManager.sendServerPacket(receiver, getMountPacket(getArmorStandIDs())); - } - - private PacketContainer getMountPacket(int[] passengers) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT); - packet.getIntegers().write(0, owner.getEntityId()); - packet.getIntegerArrays().write(0, passengers); - return packet; - } - - public Player[] getNearbyPlayers(){ - return nearbyPlayerArray; - } - - public boolean isNearby(Player viewer) { - return nearbyPlayers.contains(viewer); - } - - public void spawn(Player viewer) { - nearbyPlayers.add(viewer); - nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]); - for (ArmorStand a : armorStandArray) a.spawn(viewer); - } - - public void refresh(boolean force) { - for (ArmorStand as : armorStandArray) { - if (as.getText().update() || force) { - as.refresh(); - } - } - } - - public void ascent() { - for (ArmorStand a : armorStandArray) { - a.setOffset(a.getOffset() + ChatBubblesManager.lineSpace); - a.teleport(); - } - } - - public void destroy() { - for (ArmorStand a : armorStandArray) a.destroy(); - nearbyPlayers.clear(); - nearbyPlayerArray = new Player[0]; - } - - public void teleport(Player viewer) { - for (ArmorStand a : armorStandArray) a.teleport(viewer); - } - - public void teleport() { - for (ArmorStand a : armorStandArray) a.teleport(); - } - - public void setSneak(boolean sneaking, boolean respawn) { - for (ArmorStand a : armorStandArray) a.setSneak(sneaking, respawn); - } - - public void respawn() { - for (ArmorStand a : armorStandArray) { - for (Player viewer : nearbyPlayerArray) { - a.respawn(viewer); - } - } - } - - public void destroy(Player viewer) { - for (ArmorStand a : armorStandArray) a.destroy(viewer); - unregisterPlayer(viewer); - } - - public void unregisterPlayer(Player viewer) { - if (nearbyPlayers.remove(viewer)) nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]); - } - - public int[] getArmorStandIDs() { - int[] passengers = new int[armorStandArray.length]; - for (int i = 0; i < armorStandArray.length; i++) { - passengers[i] = armorStandArray[i].getEntityId(); - } - return passengers; - } - - public void countdown(String random, ArmorStand as) { - new BukkitRunnable() { - @Override - public void run() { - as.destroy(); - armorStands.remove(random); - armorStandArray = armorStands.values().toArray(new ArmorStand[0]); - } - }.runTaskLater(CustomNameplates.plugin, ChatBubblesManager.stayTime * 20L); - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/BubbleConfig.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/BubbleConfig.java deleted file mode 100644 index b7c79ef..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/BubbleConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import net.momirealms.customnameplates.objects.SimpleChar; - -public record BubbleConfig(String format, String name, - SimpleChar left, - SimpleChar middle, - SimpleChar right, - SimpleChar tail) { - - @Override - public String format() { - return format; - } - - @Override - public String name() { - return name; - } - - @Override - public SimpleChar tail() { - return tail; - } - - @Override - public SimpleChar left() { - return left; - } - - @Override - public SimpleChar middle() { - return middle; - } - - @Override - public SimpleChar right() { - return right; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/FakeArmorStand.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/FakeArmorStand.java deleted file mode 100644 index 72c8b78..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/FakeArmorStand.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.comphenix.protocol.wrappers.WrappedDataValue; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.google.common.collect.Lists; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.objects.TextCache; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.Pose; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -public class FakeArmorStand implements ArmorStand { - - private static int idCounter = 1145141919; - - private final ArmorStandManager asm; - private final Player owner; - private double yOffset; - private final int entityId = idCounter++; - private final UUID uuid = UUID.randomUUID(); - private boolean sneaking; - private TextCache text; - private final PacketContainer destroyPacket; - private WrappedChatComponent wrappedChatComponent; - private int counter; - - public FakeArmorStand(ArmorStandManager asm, Player owner, TextCache text, double yOffset) { - this.asm = asm; - this.owner = owner; - this.yOffset = yOffset; - this.text = text; - this.counter = 0; - sneaking = owner.isSneaking(); - destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); - destroyPacket.getIntLists().write(0, List.of(entityId)); - } - - public FakeArmorStand(ArmorStandManager asm, Player owner, WrappedChatComponent wrappedChatComponent) { - this.asm = asm; - this.owner = owner; - this.yOffset = ChatBubblesManager.yOffset; - this.wrappedChatComponent = wrappedChatComponent; - sneaking = owner.isSneaking(); - destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); - destroyPacket.getIntLists().write(0, List.of(entityId)); - } - - @Override - public void refresh() { - updateMetadata(); - } - - @Override - public double getOffset() { - return yOffset; - } - - @Override - public TextCache getText() { - return text; - } - - @Override - public void setOffset(double offset) { - if (yOffset == offset) return; - yOffset = offset; - for (Player all : asm.getNearbyPlayers()) { - CustomNameplates.protocolManager.sendServerPacket(all, getTeleportPacket()); - } - } - - @Override - public void spawn(Player viewer) { - for (PacketContainer packet : getSpawnPackets()) { - CustomNameplates.protocolManager.sendServerPacket(viewer, packet); - } - } - - @Override - public void destroy() { - for (Player all : asm.getNearbyPlayers()) { - CustomNameplates.protocolManager.sendServerPacket(all, destroyPacket); - } - } - - - @Override - public void destroy(Player viewer) { - CustomNameplates.protocolManager.sendServerPacket(viewer, destroyPacket); - } - - @Override - public void teleport() { - PacketContainer packet = getTeleportPacket(); - for (Player all : asm.getNearbyPlayers()) { - CustomNameplates.protocolManager.sendServerPacket(all, packet); - } - } - - @Override - public void teleport(Player viewer) { - if (!asm.isNearby(viewer) && viewer != owner) { - asm.spawn(viewer); - } else { - CustomNameplates.protocolManager.sendServerPacket(viewer, getTeleportPacket()); - } - } - - @Override - public void setSneak(boolean isSneaking, boolean respawn) { - this.sneaking = isSneaking; - if (respawn) { - for (Player viewer : asm.getNearbyPlayers()) { - respawn(viewer); - } - } - else { - refresh(); - } - } - - @Override - public int getEntityId() { - return entityId; - } - - @Override - public void respawn(Player viewer) { - destroy(viewer); - spawn(viewer); - } - - //传送包 - public PacketContainer getTeleportPacket() { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); - packet.getIntegers().write(0, entityId); - Location location = getArmorStandLocation(); - packet.getDoubles().write(0, location.getX()); - packet.getDoubles().write(1, location.getY()); - packet.getDoubles().write(2, location.getZ()); - return packet; - } - - //更新盔甲架信息 - public void updateMetadata() { - for (Player viewer : asm.getNearbyPlayers()) { - PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - metaPacket.getIntegers().write(0, entityId); - if (CustomNameplates.plugin.getVersionHelper().isVersionNewerThan1_19_R2()) { - WrappedDataWatcher wrappedDataWatcher = createDataWatcher(getText().getLatestText(), true); - List wrappedDataValueList = Lists.newArrayList(); - wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> { - final WrappedDataWatcher.WrappedDataWatcherObject dataWatcherObject = entry.getWatcherObject(); - wrappedDataValueList.add(new WrappedDataValue(dataWatcherObject.getIndex(), dataWatcherObject.getSerializer(), entry.getRawValue())); - }); - metaPacket.getDataValueCollectionModifier().write(0, wrappedDataValueList); - } else { - metaPacket.getWatchableCollectionModifier().write(0, createDataWatcher(getText().getLatestText(), true).getWatchableObjects()); - } - CustomNameplates.protocolManager.sendServerPacket(viewer, metaPacket); - } - } - - //获取盔甲架的位置 - public Location getArmorStandLocation() { - double x = owner.getLocation().getX(); - double y = getY() + yOffset; - double z = owner.getLocation().getZ(); - if (!owner.isSleeping()) { - if (sneaking) y += 1.5; - else y += 1.8; - } - else y += 0.2; - return new Location(null, x, y, z); - } - - //获取玩家Y坐标 - protected double getY() { - Entity vehicle = owner.getVehicle(); - if (vehicle != null) { - if (vehicle.getType() == EntityType.HORSE) { - return vehicle.getLocation().getY() + 0.85; - } - if (vehicle.getType() == EntityType.DONKEY) { - return vehicle.getLocation().getY() + 0.525; - } - if (vehicle.getType() == EntityType.PIG) { - return vehicle.getLocation().getY() + 0.325; - } - if (vehicle.getType() == EntityType.STRIDER) { - return vehicle.getLocation().getY() + 1.15; - } - } - if (owner.getPose() == Pose.SWIMMING || owner.isGliding()) { - return owner.getLocation().getY() - 1.22; - } - return owner.getLocation().getY(); - } - - //创建实体信息包 - public WrappedDataWatcher createDataWatcher(String text, boolean dynamic) { - - WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); - WrappedDataWatcher.Serializer serializer1 = WrappedDataWatcher.Registry.get(Boolean.class); - WrappedDataWatcher.Serializer serializer2 = WrappedDataWatcher.Registry.get(Byte.class); - //设置名称 - if (dynamic) { - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(text)))).getHandle())); - } - else { - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(wrappedChatComponent)); - } - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer1), true); - byte flag = 0x20; //隐身 - if (sneaking) flag += (byte) 0x02; - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, serializer2), flag); - if (NameplateManager.smallSize) { - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, serializer2), (byte) 0x01); - } - //设置名字可见 - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, serializer1), true); - return wrappedDataWatcher; - } - - //创建生成包 - public PacketContainer[] getSpawnPackets() { - - PacketContainer entityPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); - entityPacket.getModifier().write(0, entityId); - entityPacket.getModifier().write(1, uuid); - entityPacket.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); - Location location = getArmorStandLocation(); - entityPacket.getDoubles().write(0, location.getX()); - entityPacket.getDoubles().write(1, location.getY()); - entityPacket.getDoubles().write(2, location.getZ()); - - PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - metaPacket.getIntegers().write(0, entityId); - if (this.wrappedChatComponent == null) { - if (CustomNameplates.plugin.getVersionHelper().isVersionNewerThan1_19_R2()) { - WrappedDataWatcher wrappedDataWatcher = createDataWatcher(getText().getLatestText(), true); - List wrappedDataValueList = Lists.newArrayList(); - wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> { - final WrappedDataWatcher.WrappedDataWatcherObject dataWatcherObject = entry.getWatcherObject(); - wrappedDataValueList.add(new WrappedDataValue(dataWatcherObject.getIndex(), dataWatcherObject.getSerializer(), entry.getRawValue())); - }); - metaPacket.getDataValueCollectionModifier().write(0, wrappedDataValueList); - } else { - metaPacket.getWatchableCollectionModifier().write(0, createDataWatcher(getText().getLatestText(), true).getWatchableObjects()); - } - } - else { - if (CustomNameplates.plugin.getVersionHelper().isVersionNewerThan1_19_R2()) { - WrappedDataWatcher wrappedDataWatcher = createDataWatcher("", false); - List wrappedDataValueList = Lists.newArrayList(); - wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> { - final WrappedDataWatcher.WrappedDataWatcherObject dataWatcherObject = entry.getWatcherObject(); - wrappedDataValueList.add(new WrappedDataValue(dataWatcherObject.getIndex(), dataWatcherObject.getSerializer(), entry.getRawValue())); - }); - metaPacket.getDataValueCollectionModifier().write(0, wrappedDataValueList); - } else { - metaPacket.getWatchableCollectionModifier().write(0, createDataWatcher("", false).getWatchableObjects()); - } - } - return new PacketContainer[] {entityPacket, metaPacket}; - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateConfig.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateConfig.java deleted file mode 100644 index 6c897e5..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import net.momirealms.customnameplates.objects.SimpleChar; -import org.bukkit.ChatColor; - -public record NameplateConfig(ChatColor color, String name, SimpleChar left, SimpleChar middle, SimpleChar right) { - - public static NameplateConfig EMPTY = new NameplateConfig(ChatColor.WHITE, "none", SimpleChar.none, SimpleChar.none, SimpleChar.none); - - @Override - public ChatColor color() { - return color; - } - - @Override - public String name() { - return name; - } - - @Override - public SimpleChar left() { - return left; - } - - @Override - public SimpleChar middle() { - return middle; - } - - @Override - public SimpleChar right() { - return right; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateMode.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateMode.java deleted file mode 100644 index 2871d10..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateMode.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.momirealms.customnameplates.objects.nameplates; - -import net.momirealms.customnameplates.manager.ConfigManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.Function; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitTask; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -public abstract class NameplateMode extends Function { - - protected BukkitTask refreshTask; - protected TeamManager teamManager; - - public NameplateMode(TeamManager teamManager) { - this.teamManager = teamManager; - } - - @Override - public void load() { - loadToAllPlayers(); - arrangeRefreshTask(); - } - - @Override - public void unload() { - if (refreshTask != null) refreshTask.cancel(); - } - - public void onJoin(Player player) { - - } - - public void onQuit(Player player) { - if (teamManager != null) { - teamManager.removePlayerFromTeamCache(player); - if (NameplateManager.fakeTeam) { - if (ConfigManager.tab_BC_hook || ConfigManager.tab_hook) return; - teamManager.getTeamManagePacketUtil().destroyTeamToAll(player); - } - else { - Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); - Team team = scoreboard.getTeam(player.getName()); - if (team != null) team.unregister(); - } - } - } - - public void arrangeRefreshTask() { - //empty - } - - public void loadToAllPlayers() { - //empty - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplatesTeam.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplatesTeam.java deleted file mode 100644 index 1a9d926..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplatesTeam.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.ConfigManager; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.utils.AdventureUtil; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -public class NameplatesTeam { - - private final Player player; - private Component prefix; - private Component suffix; - private String prefixText; - private String suffixText; - private ChatColor color; - private String dynamic; - - public NameplatesTeam(Player player, TeamManager teamManager) { - - this.color = ChatColor.WHITE; - this.player = player; - - updateNameplates(); - - if (!ConfigManager.tab_hook && !ConfigManager.tab_BC_hook) { - if (NameplateManager.fakeTeam) { - teamManager.getTeamManagePacketUtil().createTeamToAll(player); - } - else { - Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); - Team teamTemp = scoreboard.getTeam(player.getName()); - if (teamTemp == null) { - teamTemp = scoreboard.registerNewTeam(player.getName()); - } - teamTemp.addEntry(player.getName()); - } - } - } - - public void updateNameplates() { - - String nameplate = CustomNameplates.plugin.getDataManager().getPlayerData(this.player).getEquippedNameplate(); - - if (nameplate.equals("none")) { - this.prefix = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_prefix))); - this.suffix = MiniMessage.miniMessage().deserialize(AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_suffix))); - - this.prefixText = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_prefix); - this.suffixText = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_suffix); - - this.color = ChatColor.WHITE; - return; - } - - NameplateConfig nameplateConfig = CustomNameplates.plugin.getResourceManager().getNameplateConfig(nameplate); - - if (nameplateConfig == null){ - this.prefix = Component.text(""); - this.suffix = Component.text(""); - this.prefixText = ""; - this.suffixText = ""; - this.color = ChatColor.WHITE; - CustomNameplates.plugin.getDataManager().getPlayerData(player).equipNameplate("none"); - return; - } - - String playerPrefix; - String playerSuffix; - - if (!NameplateManager.hidePrefix) playerPrefix = AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_prefix)); - else playerPrefix = ""; - if (!NameplateManager.hideSuffix) playerSuffix = AdventureUtil.replaceLegacy(CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(this.player, NameplateManager.player_suffix)); - else playerSuffix = ""; - - this.dynamic = playerPrefix + playerSuffix; - - String name; - if (NameplateManager.player_name.equals("%player_name%")) { - name = this.player.getName(); - } - else { - name = CustomNameplates.plugin.getPlaceholderManager().parsePlaceholders(player, NameplateManager.player_name); - } - - this.prefixText = CustomNameplates.plugin.getNameplateManager().makeCustomNameplate( - MiniMessage.miniMessage().stripTags(playerPrefix), - name, - MiniMessage.miniMessage().stripTags(playerSuffix), - nameplateConfig - ); - - this.suffixText = CustomNameplates.plugin.getNameplateManager().getSuffixChar( - MiniMessage.miniMessage().stripTags(playerPrefix) + - name + - MiniMessage.miniMessage().stripTags(playerSuffix) - ); - - this.prefix = Component.text(this.prefixText) - .font(ConfigManager.key) - .append(MiniMessage.miniMessage().deserialize(playerPrefix)); - - this.suffix = MiniMessage.miniMessage().deserialize(playerSuffix) - .append(Component.text(this.suffixText) - .font(ConfigManager.key)); - - this.color = nameplateConfig.color(); - } - - public Component getPrefix() { - return this.prefix; - } - - public Component getSuffix() { - return this.suffix; - } - - public ChatColor getColor() { - return this.color; - } - - public String getPrefixText() { - return prefixText; - } - - public String getSuffixText() { - return suffixText; - } - - public String getDynamic() { - return dynamic; - } -} \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RdPacketsHandler.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RdPacketsHandler.java deleted file mode 100644 index ebafc28..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RdPacketsHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates.mode.rd; - -import com.comphenix.protocol.events.PacketContainer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.packet.EntityDestroyListener; -import net.momirealms.customnameplates.listener.packet.EntityMountListener; -import net.momirealms.customnameplates.listener.packet.EntitySpawnListener; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.mode.PacketsHandler; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.util.List; - -public class RdPacketsHandler extends PacketsHandler { - - private final RidingTag ridingTag; - - private final EntityDestroyListener entityDestroyListener; - private final EntitySpawnListener entitySpawnListener; - private final EntityMountListener entityMountListener; - - protected RdPacketsHandler(RidingTag ridingTag) { - super(ridingTag); - this.ridingTag = ridingTag; - this.entityDestroyListener = new EntityDestroyListener(this); - this.entitySpawnListener = new EntitySpawnListener(this); - if (NameplateManager.tryHook) { - this.entityMountListener = new EntityMountListener(this); - } else entityMountListener = null; - } - - @Override - public void load() { - super.load(); - CustomNameplates.protocolManager.addPacketListener(entityDestroyListener); - CustomNameplates.protocolManager.addPacketListener(entitySpawnListener); - if (entityMountListener != null) { - CustomNameplates.protocolManager.addPacketListener(entityMountListener); - } - } - - @Override - public void unload() { - super.unload(); - CustomNameplates.protocolManager.removePacketListener(entityDestroyListener); - CustomNameplates.protocolManager.removePacketListener(entitySpawnListener); - if (entityMountListener != null) { - CustomNameplates.protocolManager.removePacketListener(entityMountListener); - } - } - - @Override - public void onEntitySpawn(Player receiver, int entityId) { - Player spawnedPlayer = super.getPlayerFromMap(entityId); - if (spawnedPlayer != null) { - ArmorStandManager asm = ridingTag.getArmorStandManager(spawnedPlayer); - asm.spawn(receiver); - Bukkit.getScheduler().runTaskAsynchronously(CustomNameplates.plugin, ()-> asm.mount(receiver)); - } - } - - @Override - public void onEntityDestroy(Player receiver, List entities) { - for (int entity : entities) { - onEntityDestroy(receiver, entity); - } - } - - @Override - public void onEntityDestroy(Player receiver, int entity) { - Player deSpawnedPlayer = super.getPlayerFromMap(entity); - if (deSpawnedPlayer != null) { - ridingTag.getArmorStandManager(deSpawnedPlayer).destroy(receiver); - } - } - - @Override - public void onEntityMount(PacketContainer packet) { - Player player = super.getPlayerFromMap(packet.getIntegers().read(0)); - if (player == null) return; - int[] ids = ridingTag.getArmorStandManager(player).getArmorStandIDs(); - if (ids != null) { - int[] old = packet.getIntegerArrays().read(0); - int[] idArray = new int[ids.length + old.length]; - int i = 0; - while (i < ids.length) { - idArray[i] = ids[i]; - i ++; - } - while (i < ids.length + old.length) { - idArray[i] = old[i - ids.length]; - i ++; - } - packet.getModifier().write(1, idArray); - } - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RidingTag.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RidingTag.java deleted file mode 100644 index f86fa55..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/rd/RidingTag.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates.mode.rd; - -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.nameplates.ArmorStandManager; -import net.momirealms.customnameplates.objects.nameplates.mode.EntityTag; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -public class RidingTag extends EntityTag { - - private final RdPacketsHandler handler; - - public RidingTag(TeamManager teamManager) { - super(teamManager); - this.handler = new RdPacketsHandler(this); - } - - @Override - public void load() { - super.load(); - this.handler.load(); - } - - @Override - public void unload() { - super.unload(); - this.handler.unload(); - } - - @Override - public void loadToAllPlayers() { - for (Player all : Bukkit.getOnlinePlayers()) { - ArmorStandManager asm = new ArmorStandManager(all); - asm.addDefault(); - armorStandManagerMap.put(all, asm); - teamManager.sendUpdateToOne(all); - teamManager.sendUpdateToAll(all, true); - for (Player player : Bukkit.getOnlinePlayers()) - spawnArmorStands(player, all, true); - } - } - - @Override - public void onSneak(Player player, boolean isSneaking) { - getArmorStandManager(player).setSneak(isSneaking, false); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tm/TeamTag.java b/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tm/TeamTag.java deleted file mode 100644 index 8ea2d6d..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/mode/tm/TeamTag.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.nameplates.mode.tm; - -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.SimpleListener; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.nameplates.NameplateMode; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; - -public class TeamTag extends NameplateMode { - - private final SimpleListener listener; - - public TeamTag(TeamManager teamManager) { - super(teamManager); - this.listener = new SimpleListener(this); - } - - @Override - public void load() { - super.load(); - Bukkit.getPluginManager().registerEvents(listener, CustomNameplates.plugin); - } - - @Override - public void loadToAllPlayers() { - for (Player player : Bukkit.getOnlinePlayers()) { - teamManager.sendUpdateToAll(player, true); - teamManager.sendUpdateToOne(player); - } - } - - @Override - public void arrangeRefreshTask() { - if (!NameplateManager.update) return; - refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.plugin, () -> { - for (Player player : Bukkit.getOnlinePlayers()) { - String teamName = teamManager.getTeamName(player); - NameplatesTeam nameplatesTeam = teamManager.getTeams().get(teamName); - if (nameplatesTeam != null) { - nameplatesTeam.updateNameplates(); - teamManager.sendUpdateToAll(player, false); - } - } - }, 20, NameplateManager.refresh); - } - - @Override - public void unload() { - super.unload(); - HandlerList.unregisterAll(listener); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/Biome.java b/src/main/java/net/momirealms/customnameplates/objects/requirements/Biome.java deleted file mode 100644 index a9bcedc..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/Biome.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.requirements; - -import java.util.List; - -public record Biome(List biomes) implements Requirement { - - public List getBiomes() { - return this.biomes; - } - - @Override - public boolean isConditionMet(PlayerCondition playerCondition) { - String currentBiome = playerCondition.getLocation().getBlock().getBiome().getKey().toString(); - for (String biome : biomes) { - if (currentBiome.equalsIgnoreCase(biome)) { - return true; - } - } - return false; - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/requirements/CustomPapi.java b/src/main/java/net/momirealms/customnameplates/objects/requirements/CustomPapi.java deleted file mode 100644 index fbcba0d..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/requirements/CustomPapi.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.requirements; - -import net.momirealms.customnameplates.objects.requirements.papi.*; -import org.bukkit.configuration.MemorySection; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -public class CustomPapi implements Requirement { - - public static HashSet allPapi = new HashSet<>(); - - private PapiRequirement papiRequirement; - - public CustomPapi(Map expressions){ - expressions.keySet().forEach(key -> { - if (key.startsWith("&&")){ - List papiRequirements = new ArrayList<>(); - if (expressions.get(key) instanceof MemorySection map2){ - addAndRequirements(papiRequirements, map2.getValues(false)); - } - papiRequirement = new ExpressionAnd(papiRequirements); - } - else if (key.startsWith("||")){ - List papiRequirements = new ArrayList<>(); - if (expressions.get(key) instanceof MemorySection map2){ - addOrRequirements(papiRequirements, map2.getValues(false)); - } - papiRequirement = new ExpressionOr(papiRequirements); - } - else { - if (expressions.get(key) instanceof MemorySection map){ - String type = map.getString("type"); - String papi = map.getString("papi"); - String value = map.getString("value"); - allPapi.add(papi); - switch (type){ - case "==" -> papiRequirement = new PapiEquals(papi, value); - case "!=" -> papiRequirement = new PapiNotEquals(papi, value); - case ">=" -> papiRequirement = new PapiNoLess(papi, Double.parseDouble(value)); - case "<=" -> papiRequirement = new PapiNoLarger(papi, Double.parseDouble(value)); - case "<" -> papiRequirement = new PapiSmaller(papi, Double.parseDouble(value)); - case ">" -> papiRequirement = new PapiGreater(papi, Double.parseDouble(value)); - } - } - } - }); - } - - @Override - public boolean isConditionMet(PlayerCondition playerCondition) { - return papiRequirement.isMet(playerCondition.getPapiMap()); - } - - private void addAndRequirements(List requirements, Map map){ - List andRequirements = new ArrayList<>(); - map.keySet().forEach(key -> { - if (key.startsWith("&&")){ - if (map.get(key) instanceof MemorySection map2){ - addAndRequirements(andRequirements, map2.getValues(false)); - } - }else if (key.startsWith("||")){ - if (map.get(key) instanceof MemorySection map2){ - addOrRequirements(andRequirements, map2.getValues(false)); - } - }else { - if (map.get(key) instanceof MemorySection map2){ - String type = map2.getString("type"); - String papi = map2.getString("papi"); - String value = map2.getString("value"); - allPapi.add(papi); - switch (type){ - case "==" -> andRequirements.add(new PapiEquals(papi, value)); - case "!=" -> andRequirements.add(new PapiNotEquals(papi, value)); - case ">=" -> andRequirements.add(new PapiNoLess(papi, Double.parseDouble(value))); - case "<=" -> andRequirements.add(new PapiNoLarger(papi, Double.parseDouble(value))); - case "<" -> andRequirements.add(new PapiSmaller(papi, Double.parseDouble(value))); - case ">" -> andRequirements.add(new PapiGreater(papi, Double.parseDouble(value))); - } - } - } - }); - requirements.add(new ExpressionAnd(andRequirements)); - } - - private void addOrRequirements(List requirements, Map map){ - List orRequirements = new ArrayList<>(); - map.keySet().forEach(key -> { - if (key.startsWith("&&")){ - if (map.get(key) instanceof MemorySection map2){ - addAndRequirements(orRequirements, map2.getValues(false)); - } - }else if (key.startsWith("||")){ - if (map.get(key) instanceof MemorySection map2){ - addOrRequirements(orRequirements, map2.getValues(false)); - } - }else { - if (map.get(key) instanceof MemorySection map2){ - String type = map2.getString("type"); - String papi = map2.getString("papi"); - String value = map2.getString("value"); - allPapi.add(papi); - switch (type){ - case "==" -> orRequirements.add(new PapiEquals(papi, value)); - case "!=" -> orRequirements.add(new PapiNotEquals(papi, value)); - case ">=" -> orRequirements.add(new PapiNoLess(papi, Double.parseDouble(value))); - case "<=" -> orRequirements.add(new PapiNoLarger(papi, Double.parseDouble(value))); - case "<" -> orRequirements.add(new PapiSmaller(papi, Double.parseDouble(value))); - case ">" -> orRequirements.add(new PapiGreater(papi, Double.parseDouble(value))); - } - } - } - }); - requirements.add(new ExpressionOr(orRequirements)); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeam.java b/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeam.java deleted file mode 100644 index 8768eaf..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeam.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.momirealms.customnameplates.objects.team; - -import org.bukkit.entity.Player; - -public class SimpleTeam implements TeamNameInterface { - - @Override - public String getTeamName(Player player) { - return player.getName(); - } - - @Override - public void unload() { - - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeamVisibility.java b/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeamVisibility.java deleted file mode 100644 index a8c371c..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/team/SimpleTeamVisibility.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.team; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.InternalStructure; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.utility.MinecraftReflection; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.NameplateManager; -import net.momirealms.customnameplates.manager.TeamManager; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -import java.lang.reflect.InvocationTargetException; -import java.util.Optional; - -public class SimpleTeamVisibility implements TeamPacketInterface { - - private final TeamManager teamManager; - - public SimpleTeamVisibility(TeamManager teamManager) { - this.teamManager = teamManager; - } - - @Override - public void sendUpdateToOne(Player player) { - for (Player otherPlayer : Bukkit.getOnlinePlayers()) { - if (player == otherPlayer) continue; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packet.getIntegers().write(0,2); - String teamName = teamManager.getTeamName(otherPlayer); - packet.getStrings().write(0, teamName); - InternalStructure internalStructure = packet.getOptionalStructures().read(0).get(); - sendPackets(player, packet, internalStructure); - } - } - - @Override - public void sendUpdateToAll(Player player, boolean force) { - String teamName = teamManager.getTeamName(player); - for (Player otherPlayer : Bukkit.getOnlinePlayers()) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packet.getStrings().write(0, teamName); - packet.getIntegers().write(0,2); - Optional optional = packet.getOptionalStructures().read(0); - if (optional.isEmpty()) continue; - InternalStructure internalStructure = optional.get(); - sendPackets(otherPlayer, packet, internalStructure); - } - } - - private void sendPackets(Player player, PacketContainer packet, InternalStructure internalStructure) { - if (NameplateManager.removeTag) internalStructure.getStrings().write(0, "never"); - else internalStructure.getStrings().write(0, "always"); - internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE); - CustomNameplates.protocolManager.sendServerPacket(player, packet); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/TABbcHook.java b/src/main/java/net/momirealms/customnameplates/objects/team/TABbcHook.java deleted file mode 100644 index 6c0e2ab..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/team/TABbcHook.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.momirealms.customnameplates.objects.team; - -import com.google.common.io.ByteArrayDataOutput; -import com.google.common.io.ByteStreams; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.ProxyDataListener; -import org.bukkit.entity.Player; - -import java.util.HashMap; - -public class TABbcHook implements TeamNameInterface { - - private final HashMap teamNames; - - public TABbcHook() { - this.teamNames = new HashMap<>(); - ProxyDataListener proxyDataListener = new ProxyDataListener(this); - CustomNameplates.plugin.getServer().getMessenger().registerOutgoingPluginChannel(CustomNameplates.plugin, "customnameplates:cnp"); - CustomNameplates.plugin.getServer().getMessenger().registerIncomingPluginChannel(CustomNameplates.plugin, "customnameplates:cnp", proxyDataListener); - } - - @Override - public void unload() { - this.teamNames.clear(); - CustomNameplates.plugin.getServer().getMessenger().unregisterIncomingPluginChannel(CustomNameplates.plugin, "customnameplates:cnp"); - CustomNameplates.plugin.getServer().getMessenger().unregisterOutgoingPluginChannel(CustomNameplates.plugin, "customnameplates:cnp"); - } - - @Override - public String getTeamName(Player player) { - String teamName = teamNames.get(player.getName()); - if (teamName == null) { - sendRequest(player); - return player.getName(); - } - else { - return teamName; - } - } - - private void sendRequest(Player player) { - ByteArrayDataOutput dataOutput = ByteStreams.newDataOutput(); - dataOutput.writeUTF(player.getName()); - player.sendPluginMessage(CustomNameplates.plugin, "customnameplates:cnp", dataOutput.toByteArray()); - } - - public void addPlayerToCache(String playerName, String teamName) { - teamNames.put(playerName, teamName); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/TeamNameInterface.java b/src/main/java/net/momirealms/customnameplates/objects/team/TeamNameInterface.java deleted file mode 100644 index 7082c92..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/team/TeamNameInterface.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.momirealms.customnameplates.objects.team; - -import org.bukkit.entity.Player; - -public interface TeamNameInterface { - - String getTeamName(Player player); - void unload(); -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/team/TeamPrefixSuffix.java b/src/main/java/net/momirealms/customnameplates/objects/team/TeamPrefixSuffix.java deleted file mode 100644 index 0e409d8..0000000 --- a/src/main/java/net/momirealms/customnameplates/objects/team/TeamPrefixSuffix.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.objects.team; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.InternalStructure; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.utility.MinecraftReflection; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.objects.nameplates.NameplatesTeam; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Optional; - -public class TeamPrefixSuffix implements TeamPacketInterface { - - private final HashMap teamInfoCache = new HashMap<>(); - - private final TeamManager teamManager; - - public TeamPrefixSuffix(TeamManager teamManager) { - this.teamManager = teamManager; - } - - public void sendUpdateToOne(Player player) { - for (Player otherPlayer : Bukkit.getOnlinePlayers()) { - if (player == otherPlayer) continue; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packet.getIntegers().write(0,2); - String teamName = teamManager.getTeamName(otherPlayer); - packet.getStrings().write(0, teamName); - NameplatesTeam nameplatesTeam = teamManager.getTeams().get(teamName); - if (nameplatesTeam == null) continue; - InternalStructure internalStructure = packet.getOptionalStructures().read(0).get(); - sendPacket(player, packet, nameplatesTeam, internalStructure); - } - } - public void sendUpdateToAll(Player player, boolean force) { - String teamName = teamManager.getTeamName(player); - NameplatesTeam nameplatesTeam = teamManager.getTeams().get(teamName); - if (nameplatesTeam == null) return; - String newInfo = nameplatesTeam.getDynamic(); - String oldInfo = teamInfoCache.get(player); - if (newInfo != null && newInfo.equals(oldInfo) && !force) { - return; - } - teamInfoCache.put(player, newInfo); - for (Player otherPlayer : Bukkit.getOnlinePlayers()) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packet.getStrings().write(0, teamName); - packet.getIntegers().write(0,2); - Optional optional = packet.getOptionalStructures().read(0); - if (optional.isEmpty()) return; - InternalStructure internalStructure = optional.get(); - sendPacket(otherPlayer, packet, nameplatesTeam, internalStructure); - } - } - - private void sendPacket(Player player, PacketContainer packet, NameplatesTeam nameplatesTeam, InternalStructure internalStructure) { - internalStructure.getStrings().write(0, "always"); - internalStructure.getChatComponents().write(1, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(nameplatesTeam.getPrefix()))); - internalStructure.getChatComponents().write(2, WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(nameplatesTeam.getSuffix()))); - internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, nameplatesTeam.getColor()); - CustomNameplates.protocolManager.sendServerPacket(player, packet); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/objects/background/BackGroundText.java b/src/main/java/net/momirealms/customnameplates/placeholders/BackGroundText.java similarity index 73% rename from src/main/java/net/momirealms/customnameplates/objects/background/BackGroundText.java rename to src/main/java/net/momirealms/customnameplates/placeholders/BackGroundText.java index fe02de3..6cc9b8e 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/background/BackGroundText.java +++ b/src/main/java/net/momirealms/customnameplates/placeholders/BackGroundText.java @@ -15,15 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.background; +package net.momirealms.customnameplates.placeholders; -public record BackGroundText(String text, String background) { - - public String getText() { - return text; - } - - public String getBackground() { - return background; - } +public record BackGroundText(String text, String background, boolean remove_shadow) { } diff --git a/src/main/java/net/momirealms/customnameplates/placeholders/ConditionalTexts.java b/src/main/java/net/momirealms/customnameplates/placeholders/ConditionalTexts.java new file mode 100644 index 0000000..09c4596 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/placeholders/ConditionalTexts.java @@ -0,0 +1,29 @@ +package net.momirealms.customnameplates.placeholders; + +import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.requirements.PlayerCondition; +import net.momirealms.customnameplates.object.requirements.Requirement; +import org.bukkit.entity.Player; + +public class ConditionalTexts { + + private final ConditionalText[] conditionalTexts; + + public ConditionalTexts(ConditionalText[] conditionalTexts) { + this.conditionalTexts = conditionalTexts; + } + + public String getValue(Player player) { + PlayerCondition playerCondition = new PlayerCondition(player); + outer: + for (ConditionalText conditionalText : conditionalTexts) { + for (Requirement requirement : conditionalText.getRequirements()) { + if (!requirement.isConditionMet(playerCondition)) { + continue outer; + } + } + return conditionalText.getText(); + } + return ""; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/placeholders/DescentText.java b/src/main/java/net/momirealms/customnameplates/placeholders/DescentText.java new file mode 100644 index 0000000..287a24d --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/placeholders/DescentText.java @@ -0,0 +1,4 @@ +package net.momirealms.customnameplates.placeholders; + +public record DescentText(String text, int ascent) { +} diff --git a/src/main/java/net/momirealms/customnameplates/placeholders/NameplatePlaceholders.java b/src/main/java/net/momirealms/customnameplates/placeholders/NameplatePlaceholders.java new file mode 100644 index 0000000..ab845fb --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/placeholders/NameplatePlaceholders.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.placeholders; + +import me.clip.placeholderapi.PlaceholderAPI; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.manager.ConfigManager; +import net.momirealms.customnameplates.manager.PlaceholderManager; +import net.momirealms.customnameplates.object.SimpleChar; +import net.momirealms.customnameplates.object.StaticText; +import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; +import net.momirealms.customnameplates.utils.AdventureUtils; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class NameplatePlaceholders extends PlaceholderExpansion { + + private final PlaceholderManager placeholderManager; + private final CustomNameplates plugin; + + public NameplatePlaceholders(CustomNameplates plugin, PlaceholderManager placeholderManager) { + this.placeholderManager = placeholderManager; + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "nameplates"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "2.2"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public String onPlaceholderRequest(Player player, String params) { + String[] mainParam = params.split("_", 2); + switch (mainParam[0]) { + case "prefix" -> { + return getPrefix(player); + } + case "suffix" -> { + return getSuffix(player); + } + case "equipped" -> { + return getEquipped(mainParam[1], player); + } + case "static" -> { + return getStatic(mainParam[1], player); + } + case "background" -> { + return getBackground(mainParam[1], player); + } + case "nameplate" -> { + return getNameplateText(mainParam[1], player); + } + case "conditional" -> { + return getConditional(mainParam[1], player); + } + case "descent" -> { + return getDescent(mainParam[1], player); + } + case "vanilla" -> { + return getVanilla(mainParam[1], player); + } + case "image" -> { + return getImage(mainParam[1]); + } + case "offset" -> { + return getOffset(mainParam[1]); + } + case "time" -> { + return getTime(player); + } + case "checkupdate" -> { + return String.valueOf(!plugin.getVersionHelper().isLatest()); + } + } + return null; + } + + private String getOffset(String s) { + return ConfigManager.surroundWithFont(plugin.getFontManager().getOffset(Integer.parseInt(s))); + } + + private String getNameplateText(String param, Player player) { + NameplateText nameplateText = placeholderManager.getNameplateText(param); + if (nameplateText == null) return param + " NOT FOUND"; + String parsed = PlaceholderAPI.setPlaceholders(player, nameplateText.text()); + return plugin.getNameplateManager().getNameplatePrefix(parsed, nameplateText.nameplate()); + } + + private String getEquipped(String param, Player player) { + if (param.equals("nameplate")) { + return plugin.getDataManager().getEquippedNameplate(player); + } + else if (param.equals("bubble")) { + return plugin.getDataManager().getEquippedBubble(player); + } + return "null"; + } + + private String getTime(Player player) { + World world = player.getWorld(); + long time = world.getTime(); + String ap; + if (time >= 6000 && time < 18000) ap = " PM"; + else ap = " AM"; + int hours = (int) (time / 1000); + int minutes = (int) ((time - hours * 1000 ) * 0.06); + hours += 6; + if (hours >= 24) hours -= 24; + if (hours >= 12) hours -= 12; + if (minutes < 10) return hours + ":0" + minutes + ap; + else return hours + ":" + minutes + ap; + } + + private String getImage(String param) { + SimpleChar simpleChar = plugin.getImageManager().getImage(param); + if (simpleChar == null) return param + " NOT FOUND"; + return ConfigManager.surroundWithFont(String.valueOf(simpleChar.getChars())); + } + + private String getPrefix(Player player) { + NameplatesTeam nameplatesTeam = plugin.getTeamManager().getNameplateTeam(player.getUniqueId()); + if (nameplatesTeam != null) return nameplatesTeam.getNameplatePrefixText(); + return ""; + } + + private String getSuffix(Player player) { + NameplatesTeam nameplatesTeam = plugin.getTeamManager().getNameplateTeam(player.getUniqueId()); + if (nameplatesTeam != null) return nameplatesTeam.getNameplateSuffixText(); + return ""; + } + + private String getStatic(String param, Player player) { + StaticText staticText = placeholderManager.getStaticText(param); + if (staticText == null) return param + " NOT FOUND"; + String parsed = PlaceholderAPI.setPlaceholders(player, staticText.text()); + int parsedWidth = plugin.getFontManager().getTotalWidth(AdventureUtils.stripAllTags(parsed)); + if (staticText.left()) { + return parsed + ConfigManager.surroundWithFont(plugin.getFontManager().getOffset(staticText.value() - parsedWidth)); + } + else { + return ConfigManager.surroundWithFont(plugin.getFontManager().getOffset(staticText.value() - parsedWidth)) + parsed; + + } + } + + private String getBackground(String param, Player player) { + BackGroundText backGroundText = placeholderManager.getBackgroundText(param); + if (backGroundText == null) return param + " NOT FOUND"; + String parsed = PlaceholderAPI.setPlaceholders(player, backGroundText.text()); + String background = plugin.getBackgroundManager().getBackGroundImage(backGroundText, AdventureUtils.stripAllTags(parsed)); + if (backGroundText.remove_shadow()) background = "<#FFFEFD>" + background + ""; + return ConfigManager.surroundWithFont(background) + parsed; + } + + private String getConditional(String param, Player player) { + ConditionalTexts conditionalTexts = placeholderManager.getConditionalTexts(param); + if (conditionalTexts == null) return param + " NOT FOUND"; + String value = conditionalTexts.getValue(player); + return PlaceholderAPI.setPlaceholders(player, value); + } + + private String getDescent(String param, Player player) { + DescentText descentText = placeholderManager.getDescentText(param); + if (descentText == null) return param + " NOT FOUND"; + String parsed = PlaceholderAPI.setPlaceholders(player, descentText.text()); + return "" + parsed + ""; + } + + private String getVanilla(String param, Player player) { + VanillaHud vanillaHud = placeholderManager.getVanillaHud(param); + if (vanillaHud == null) return param + " NOT FOUND"; + double current = Double.parseDouble(PlaceholderAPI.setPlaceholders(player, vanillaHud.papi())); + double max = Double.parseDouble(PlaceholderAPI.setPlaceholders(player, vanillaHud.max())); + int point = (int) ((current / max) * 20); + int full_amount = point / 2; + int half_amount = point % 2; + int empty_amount = 10 - full_amount - half_amount; + return "<#FFFEFD>" + vanillaHud.empty().repeat(empty_amount) + vanillaHud.half().repeat(half_amount) + vanillaHud.full().repeat(full_amount) + ""; + } +} diff --git a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateText.java b/src/main/java/net/momirealms/customnameplates/placeholders/NameplateText.java similarity index 80% rename from src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateText.java rename to src/main/java/net/momirealms/customnameplates/placeholders/NameplateText.java index fb49d95..bb701a4 100644 --- a/src/main/java/net/momirealms/customnameplates/objects/nameplates/NameplateText.java +++ b/src/main/java/net/momirealms/customnameplates/placeholders/NameplateText.java @@ -15,15 +15,8 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.objects.nameplates; +package net.momirealms.customnameplates.placeholders; public record NameplateText(String text, String nameplate) { - public String getText() { - return text; - } - - public String getNameplate() { - return nameplate; - } } diff --git a/src/main/java/net/momirealms/customnameplates/placeholders/VanillaHud.java b/src/main/java/net/momirealms/customnameplates/placeholders/VanillaHud.java new file mode 100644 index 0000000..77fbbba --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/placeholders/VanillaHud.java @@ -0,0 +1,4 @@ +package net.momirealms.customnameplates.placeholders; + +public record VanillaHud(String empty, String half, String full, String papi, String max) { +} diff --git a/src/main/java/net/momirealms/customnameplates/utils/AdventureUtil.java b/src/main/java/net/momirealms/customnameplates/utils/AdventureUtil.java deleted file mode 100644 index 4a719fb..0000000 --- a/src/main/java/net/momirealms/customnameplates/utils/AdventureUtil.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.utils; - -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import net.momirealms.customnameplates.CustomNameplates; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class AdventureUtil { - - public static void sendMessage(CommandSender sender, String s) { - if (sender instanceof Player player) playerMessage(player, s); - else consoleMessage(s); - } - - public static void consoleMessage(String s) { - Audience au = CustomNameplates.adventure.sender(Bukkit.getConsoleSender()); - MiniMessage mm = MiniMessage.miniMessage(); - Component parsed = mm.deserialize(replaceLegacy(s)); - au.sendMessage(parsed); - } - - public static void playerMessage(Player player, String s){ - Audience au = CustomNameplates.adventure.player(player); - MiniMessage mm = MiniMessage.miniMessage(); - Component parsed = mm.deserialize(replaceLegacy(s)); - au.sendMessage(parsed); - } - - public static void playerActionbar(Player player, String s) { - Audience au = CustomNameplates.adventure.player(player); - MiniMessage mm = MiniMessage.miniMessage(); - au.sendActionBar(mm.deserialize(replaceLegacy(s))); - } - - public static String replaceLegacy(String s) { - if (!(s.contains("&") || s.contains("§"))) return s; - StringBuilder stringBuilder = new StringBuilder(); - char[] chars = s.replaceAll("&","§").toCharArray(); - for (int i = 0; i < chars.length; i++) { - if (chars[i] == '§') { - if (i + 1 < chars.length) { - switch (chars[i+1]){ - case '0' -> { - i++; - stringBuilder.append(""); - } - case '1' -> { - i++; - stringBuilder.append(""); - } - case '2' -> { - i++; - stringBuilder.append(""); - } - case '3' -> { - i++; - stringBuilder.append(""); - } - case '4' -> { - i++; - stringBuilder.append(""); - } - case '5' -> { - i++; - stringBuilder.append(""); - } - case '6' -> { - i++; - stringBuilder.append(""); - } - case '7' -> { - i++; - stringBuilder.append(""); - } - case '8' -> { - i++; - stringBuilder.append(""); - } - case '9' -> { - i++; - stringBuilder.append(""); - } - case 'a' -> { - i++; - stringBuilder.append(""); - } - case 'b' -> { - i++; - stringBuilder.append(""); - } - case 'c' -> { - i++; - stringBuilder.append(""); - } - case 'd' -> { - i++; - stringBuilder.append(""); - } - case 'e' -> { - i++; - stringBuilder.append(""); - } - case 'f' -> { - i++; - stringBuilder.append(""); - } - case 'r' -> { - i++; - stringBuilder.append(""); - } - case 'l' -> { - i++; - stringBuilder.append(""); - } - case 'm' -> { - i++; - stringBuilder.append(""); - } - case 'o' -> { - i++; - stringBuilder.append(""); - } - case 'n' -> { - i++; - stringBuilder.append(""); - } - case 'x' -> { - stringBuilder.append("<#").append(chars[i+3]).append(chars[i+5]).append(chars[i+7]).append(chars[i+9]).append(chars[i+11]).append(chars[i+13]).append(">"); - i += 13; - } - case 'k' -> { - i++; - stringBuilder.append(""); - } - } - } - } - else { - stringBuilder.append(chars[i]); - } - } - return stringBuilder.toString(); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java b/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java new file mode 100644 index 0000000..eec5da5 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.utils; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.momirealms.customnameplates.CustomNameplates; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AdventureUtils { + + public static Component getComponentFromMiniMessage(String text) { + return MiniMessage.miniMessage().deserialize(replaceLegacy(text)); + } + + public static void sendMessage(CommandSender sender, String s) { + if (s == null) return; + if (sender instanceof Player player) playerMessage(player, s); + else consoleMessage(s); + } + + public static void consoleMessage(String s) { + if (s == null) return; + Audience au = CustomNameplates.getAdventure().sender(Bukkit.getConsoleSender()); + au.sendMessage(getComponentFromMiniMessage(s)); + } + + public static void playerMessage(Player player, String s) { + if (s == null) return; + Audience au = CustomNameplates.getAdventure().player(player); + au.sendMessage(getComponentFromMiniMessage(s)); + } + + public static void playerActionbar(Player player, String s) { + if (s == null) return; + Audience au = CustomNameplates.getAdventure().player(player); + au.sendActionBar(getComponentFromMiniMessage(s)); + } + + public static String replaceLegacy(String str) { + StringBuilder stringBuilder = new StringBuilder(); + char[] chars = str.replace("&","§").toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (chars[i] == '§') { + if (i + 1 < chars.length) { + switch (chars[i+1]) { + case '0' -> {i++;stringBuilder.append("");} + case '1' -> {i++;stringBuilder.append("");} + case '2' -> {i++;stringBuilder.append("");} + case '3' -> {i++;stringBuilder.append("");} + case '4' -> {i++;stringBuilder.append("");} + case '5' -> {i++;stringBuilder.append("");} + case '6' -> {i++;stringBuilder.append("");} + case '7' -> {i++;stringBuilder.append("");} + case '8' -> {i++;stringBuilder.append("");} + case '9' -> {i++;stringBuilder.append("");} + case 'a' -> {i++;stringBuilder.append("");} + case 'b' -> {i++;stringBuilder.append("");} + case 'c' -> {i++;stringBuilder.append("");} + case 'd' -> {i++;stringBuilder.append("");} + case 'e' -> {i++;stringBuilder.append("");} + case 'f' -> {i++;stringBuilder.append("");} + case 'r' -> {i++;stringBuilder.append("");} + case 'l' -> {i++;stringBuilder.append("");} + case 'm' -> {i++;stringBuilder.append("");} + case 'o' -> {i++;stringBuilder.append("");} + case 'n' -> {i++;stringBuilder.append("");} + case 'k' -> {i++;stringBuilder.append("");} + case 'x' -> {stringBuilder.append("<#").append(chars[i+3]).append(chars[i+5]).append(chars[i+7]).append(chars[i+9]).append(chars[i+11]).append(chars[i+13]).append(">");i += 13;} + } + } + } + else { + stringBuilder.append(chars[i]); + } + } + return stringBuilder.toString(); + } + + public static int colorToDecimal(ChatColor color){ + switch (String.valueOf(color.getChar())){ + case "0" -> {return 0;} + case "c" -> {return 16733525;} + case "6" -> {return 16755200;} + case "4" -> {return 11141120;} + case "e" -> {return 16777045;} + case "2" -> {return 43520;} + case "a" -> {return 5635925;} + case "b" -> {return 5636095;} + case "3" -> {return 43690;} + case "1" -> {return 170;} + case "9" -> {return 5592575;} + case "d" -> {return 16733695;} + case "5" -> {return 11141290;} + case "8" -> {return 5592405;} + case "7" -> {return 11184810;} + default -> {return 16777215;} + } + } + + public static String stripAllTags(String text) { + return MiniMessage.miniMessage().stripTags(replaceLegacy(text)); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java deleted file mode 100644 index 2eff1df..0000000 --- a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.utils; - -import dev.dejvokep.boostedyaml.YamlDocument; -import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; -import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; -import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; -import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; -import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.helper.Log; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.io.IOException; - -public class ConfigUtil { - - private static YamlConfiguration module; - - public static void load() { - module = getConfig("MODULES.yml"); - } - - public static boolean isModuleEnabled(String moduleName) { - return module.getBoolean(moduleName, false); - } - - public static void update(String fileName){ - try { - YamlDocument.create(new File(CustomNameplates.plugin.getDataFolder(), fileName), CustomNameplates.plugin.getResource(fileName), GeneralSettings.DEFAULT, LoaderSettings.builder().setAutoUpdate(true).build(), DumperSettings.DEFAULT, UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version")).build()); - } catch (IOException e){ - Log.warn(e.getMessage()); - } - } - - public static YamlConfiguration getConfig(String configName) { - File file = new File(CustomNameplates.plugin.getDataFolder(), configName); - if (!file.exists()) CustomNameplates.plugin.saveResource(configName, false); - return YamlConfiguration.loadConfiguration(file); - } - - public static YamlConfiguration readData(File file) { - if (!file.exists()) { - try { - file.getParentFile().mkdirs(); - file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - AdventureUtil.consoleMessage("[CustomNameplates] Failed to generate data files!"); - } - } - return YamlConfiguration.loadConfiguration(file); - } - - public static void reloadConfigs() { - load(); - CustomNameplates.plugin.getConfigManager().unload(); - CustomNameplates.plugin.getConfigManager().load(); - CustomNameplates.plugin.getMessageManager().unload(); - CustomNameplates.plugin.getMessageManager().load(); - CustomNameplates.plugin.getBossBarManager().unload(); - CustomNameplates.plugin.getBossBarManager().load(); - CustomNameplates.plugin.getActionBarManager().unload(); - CustomNameplates.plugin.getActionBarManager().load(); - CustomNameplates.plugin.getPlaceholderManager().unload(); - CustomNameplates.plugin.getPlaceholderManager().load(); - CustomNameplates.plugin.getNameplateManager().unload(); - CustomNameplates.plugin.getNameplateManager().load(); - CustomNameplates.plugin.getChatBubblesManager().unload(); - CustomNameplates.plugin.getChatBubblesManager().load(); - CustomNameplates.plugin.getWidthManager().unload(); - CustomNameplates.plugin.getWidthManager().load(); - CustomNameplates.plugin.getDataManager().unload(); - CustomNameplates.plugin.getDataManager().load(); - CustomNameplates.plugin.getResourceManager().generateResourcePack(); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java new file mode 100644 index 0000000..f471031 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customnameplates.utils; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.helper.Log; +import net.momirealms.customnameplates.object.requirements.*; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; + +public class ConfigUtils { + + public static void update(String file_name){ + try { + YamlDocument.create( + new File(CustomNameplates.getInstance().getDataFolder(), file_name), + Objects.requireNonNull(CustomNameplates.getInstance().getResource(file_name)), + GeneralSettings.DEFAULT, + LoaderSettings.builder().setAutoUpdate(true).build(), + DumperSettings.DEFAULT, + UpdaterSettings.builder().setVersioning(new BasicVersioning("config-version") + ).build()); + } catch (IOException e){ + Log.warn(e.getMessage()); + } + } + + public static YamlConfiguration getConfig(String config_name) { + File file = new File(CustomNameplates.getInstance().getDataFolder(), config_name); + if (!file.exists()) CustomNameplates.getInstance().saveResource(config_name, false); + return YamlConfiguration.loadConfiguration(file); + } + + public static YamlConfiguration readData(File file) { + if (!file.exists()) { + try { + if (!file.getParentFile().mkdirs() || !file.createNewFile()) { + AdventureUtils.consoleMessage("[CustomNameplates] Failed to generate data files!"); + } + } catch (IOException e) { + e.printStackTrace(); + AdventureUtils.consoleMessage("[CustomNameplates] Failed to generate data files!"); + } + } + return YamlConfiguration.loadConfiguration(file); + } + + public static Requirement[] getRequirements(ConfigurationSection section) { + List requirements = new ArrayList<>(); + if (section != null) { + for (String type : section.getKeys(false)) { + switch (type) { + case "biome" -> requirements.add(new BiomeImpl(new HashSet<>(section.getStringList(type)))); + case "weather" -> requirements.add(new WeatherImpl(section.getStringList(type))); + case "ypos" -> requirements.add(new YPosImpl(section.getStringList(type))); + case "world" -> requirements.add(new WorldImpl(section.getStringList(type))); + case "permission" -> requirements.add(new PermissionImpl(section.getString(type))); + case "time" -> requirements.add(new TimeImpl(section.getStringList(type))); + case "date" -> requirements.add(new DateImpl(new HashSet<>(section.getStringList(type)))); + case "papi-condition" -> requirements.add(new CustomPapiImpl(Objects.requireNonNull(section.getConfigurationSection(type)).getValues(false))); + } + } + } + return requirements.toArray(new Requirement[0]); + } +} diff --git a/src/main/java/net/momirealms/customnameplates/utils/HoloUtil.java b/src/main/java/net/momirealms/customnameplates/utils/HoloUtils.java similarity index 67% rename from src/main/java/net/momirealms/customnameplates/utils/HoloUtil.java rename to src/main/java/net/momirealms/customnameplates/utils/HoloUtils.java index 813460f..cb3d350 100644 --- a/src/main/java/net/momirealms/customnameplates/utils/HoloUtil.java +++ b/src/main/java/net/momirealms/customnameplates/utils/HoloUtils.java @@ -32,28 +32,23 @@ import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import java.lang.reflect.InvocationTargetException; import java.util.*; -public class HoloUtil { - - public static HashMap cache = new HashMap<>(); +public class HoloUtils { public static void showHolo(Component component, Player player, int duration){ - if (cache.get(player) != null){ - removeHolo(player, cache.get(player)); - } - - PacketContainer packet1 = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); + PacketContainer spawnPacket = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); int id = new Random().nextInt(1000000000); - packet1.getModifier().write(0, id); - packet1.getModifier().write(1, UUID.randomUUID()); - packet1.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); + spawnPacket.getModifier().write(0, id); + spawnPacket.getModifier().write(1, UUID.randomUUID()); + spawnPacket.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); Location location = player.getLocation(); - packet1.getDoubles().write(0, location.getX()); - packet1.getDoubles().write(1, location.getY()+0.8); - packet1.getDoubles().write(2, location.getZ()); + spawnPacket.getDoubles().write(0, location.getX()); + spawnPacket.getDoubles().write(1, location.getY()+0.8); + spawnPacket.getDoubles().write(2, location.getZ()); PacketContainer packet2 = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); @@ -69,7 +64,7 @@ public class HoloUtil { wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, serializer2), mask2); packet2.getModifier().write(0,id); - if (CustomNameplates.plugin.getVersionHelper().isVersionNewerThan1_19_R2()) { + if (CustomNameplates.getInstance().getVersionHelper().isVersionNewerThan1_19_R2()) { List wrappedDataValueList = Lists.newArrayList(); wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> { final WrappedDataWatcher.WrappedDataWatcherObject dataWatcherObject = entry.getWatcherObject(); @@ -79,54 +74,36 @@ public class HoloUtil { } else { packet2.getWatchableCollectionModifier().write(0, wrappedDataWatcher.getWatchableObjects()); } - cache.put(player, id); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet1); - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet2); - } - catch (Exception e) { - AdventureUtil.consoleMessage("[CustomNameplates] 无法为玩家 "+ player.getName()+" 展示悬浮信息!"); - e.printStackTrace(); - } + + ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket); + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet2); + for (int i = 1; i < duration * 20 - 1; i++){ - Bukkit.getScheduler().runTaskLater(CustomNameplates.plugin, ()->{ - updatePlace(player, id); + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), ()->{ + updatePosition(player, id); }, i); } - Bukkit.getScheduler().runTaskLater(CustomNameplates.plugin, ()->{ + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), ()->{ removeHolo(player, id); - cache.remove(player); }, duration * 20L); } - public static void updatePlace(Player player, int entityId){ + public static void updatePosition(Player player, int entityId){ PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); packet.getIntegers().write(0, entityId); Location location = player.getLocation(); packet.getDoubles().write(0, location.getX()); packet.getDoubles().write(1, location.getY()+0.8); packet.getDoubles().write(2, location.getZ()); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } - catch (Exception e) { - AdventureUtil.consoleMessage("[CustomNameplates] 无法为玩家 "+ player.getName()+" 更新悬浮信息!"); - e.printStackTrace(); - } + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); } - public static void removeHolo(Player player, int entityId){ + public static void removeHolo(Player player, int entityId) { PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); packet.getIntLists().write(0, List.of(entityId)); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } - catch (Exception e) { - AdventureUtil.consoleMessage("[CustomNameplates] 无法为玩家 "+ player.getName()+" 移除悬浮信息!"); - e.printStackTrace(); - } + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); } } diff --git a/src/main/java/net/momirealms/customnameplates/utils/TeamManagePacketUtil.java b/src/main/java/net/momirealms/customnameplates/utils/TeamManagePacketUtil.java deleted file mode 100644 index cbe10bb..0000000 --- a/src/main/java/net/momirealms/customnameplates/utils/TeamManagePacketUtil.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) <2022> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.momirealms.customnameplates.utils; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.InternalStructure; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.utility.MinecraftReflection; -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.manager.TeamManager; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.world.WorldLoadEvent; - -import java.lang.reflect.InvocationTargetException; -import java.util.Collections; - -public class TeamManagePacketUtil { - - private final TeamManager teamManager; - - public TeamManagePacketUtil(TeamManager teamManager) { - this.teamManager = teamManager; - } - - public void createTeamToAll(Player joinPlayer) { - PacketContainer packetToAll = getPlayerTeamPacket(joinPlayer); - for (Player all : Bukkit.getOnlinePlayers()) { - getPlayerTeamPacket(all); - CustomNameplates.protocolManager.sendServerPacket(joinPlayer, getPlayerTeamPacket(all)); - if (joinPlayer != all) CustomNameplates.protocolManager.sendServerPacket(all, packetToAll); - } - } - - private PacketContainer getPlayerTeamPacket(Player joinPlayer) { - PacketContainer packetToAll = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packetToAll.getIntegers().write(0,0); - packetToAll.getStrings().write(0, joinPlayer.getName()); - packetToAll.getModifier().write(2, Collections.singletonList(joinPlayer.getName())); - InternalStructure internalStructure = packetToAll.getOptionalStructures().read(0).get(); - internalStructure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0,ChatColor.WHITE); - return packetToAll; - } - - public void destroyTeamToAll(Player quitPlayer) { - PacketContainer packetToAll = new PacketContainer(PacketType.Play.Server.SCOREBOARD_TEAM); - packetToAll.getIntegers().write(0,1); - packetToAll.getStrings().write(0, quitPlayer.getName()); - for (Player all : Bukkit.getOnlinePlayers()) { - CustomNameplates.protocolManager.sendServerPacket(all, packetToAll); - } - } -} diff --git a/src/main/resources/MODULES.yml b/src/main/resources/MODULES.yml deleted file mode 100644 index 5185b81..0000000 --- a/src/main/resources/MODULES.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Do not change -config-version: '7' - -#You should reload your resource pack when toggle these three modules -nameplate: true -background: true -bubbles: true - -bossbar: true -actionbar: true diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.fsh b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.fsh similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.fsh rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.fsh diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.json b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.json similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.json rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.json diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.vsh b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.vsh similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text.vsh rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text.vsh diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.fsh b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.fsh similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.fsh rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.fsh diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.json b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.json similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.json rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.json diff --git a/src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.vsh b/src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.vsh similarity index 100% rename from src/main/resources/ResourcePack/minecraft/shaders/core/rendertype_text_see_through.vsh rename to src/main/resources/ResourcePack/assets/minecraft/shaders/core/rendertype_text_see_through.vsh diff --git a/src/main/resources/actionbar.yml b/src/main/resources/actionbar.yml deleted file mode 100644 index dff1bd8..0000000 --- a/src/main/resources/actionbar.yml +++ /dev/null @@ -1,34 +0,0 @@ -# Please use MiniMessage format: https://docs.adventure.kyori.net/minimessage/format.html -actionbar: - high: - text: '%nameplates_bg_health%%player_health_rounded% Health %nameplates_bg_food%<#F0E68C>%player_food_level% Hunger' - refresh-rate: 5 - conditions: - papi-condition: - condition_1: - type: '>=' - papi: '%player_health_rounded%' - value: 12 - mid: - text: '%nameplates_bg_health%%player_health_rounded% Health %nameplates_bg_food%<#F0E68C>%player_food_level% Hunger' - refresh-rate: 5 - conditions: - papi-condition: - '&&': - condition_1: - type: '<' - papi: '%player_health_rounded%' - value: 12 - condition_2: - type: '>=' - papi: '%player_health_rounded%' - value: 5 - low: - text: '%nameplates_bg_health%%player_health_rounded% Health %nameplates_bg_food%<#F0E68C>%player_food_level% Hunger' - refresh-rate: 5 - conditions: - papi-condition: - condition_1: - type: '<' - papi: '%player_health_rounded%' - value: 5 \ No newline at end of file diff --git a/src/main/resources/bossbar.yml b/src/main/resources/bossbar.yml deleted file mode 100644 index 08de993..0000000 --- a/src/main/resources/bossbar.yml +++ /dev/null @@ -1,75 +0,0 @@ -bossbar: - # Please use MiniMessage format: https://docs.adventure.kyori.net/minimessage/format.html - # Dynamic Boss Bar - example_1: - color: YELLOW - overlay: PROGRESS - dynamic-text: - - '%nameplates_bg_pos%You are now at: %player_x%, %player_y%, %player_z%' - - '%nameplates_bg_player%Hello! %player_name%' - # seconds - switch-interval: 15 - # ticks - refresh-rate: 5 - - - # Basic Boss Bar - example_2: - text: '%nameplates_bg_text%Thanks for your purchase!' - refresh-rate: 5 - color: YELLOW - overlay: PROGRESS - conditions: - permission: 'nameplates.admin' - - -# Available conditions & Examples -# -# #Biome -# biome: -# - minecraft:plains -# - minecraft:taiga -# -# #Y coordinate -# ypos: -# - 50~100 -# - 150~200 -# -# #World weather -# weather: -# - rain -# - clear -# - thunder -# -# #Player permission -# permission: 'customfishing.rainbowfish' -# -# #Specified world -# world: -# - world -# -# #Game Time Range -# time: -# - 0~12000 -# -# Requires PlaceholderAPI -# Create complex condition as you want -# "||" means one of the conditions is true, it would be true -# "&&" means all the conditions must be true to be true -# available types "==" "!=" ">" "<" ">=" "<=" -# -# papi-condition: -# '||': -# condition_1: -# type: '==' -# papi: '%player_world%' -# value: world -# '&&': -# condition_1: -# type: '>=' -# papi: '%player_health%' -# value: 5 -# condition_2: -# type: '<' -# papi: '%player_health%' -# value: 15 \ No newline at end of file diff --git a/src/main/resources/bubble.yml b/src/main/resources/bubble.yml deleted file mode 100644 index 19edbea..0000000 --- a/src/main/resources/bubble.yml +++ /dev/null @@ -1,37 +0,0 @@ -# Do not change -config-version: '9' - -# Currently supported chat plugins: TrChat -blacklist-channels: - - Private - - Staff - -bubble: - - # Player's default chatting bubbles - default-bubbles: 'chat' - - # Text format when no bubbles equipped - default-format: '' - - # Add additional prefix and suffix to the text - # Placeholders can be used here - text-prefix: '' - text-suffix: '' - - # Space between two lines of text - line-spacing: 0.5 - - # This decides where the bottom line is - bottom-line-Y-offset: -1.5 - - # Seconds - # This decides how long will the chat hologram remains - stay-time: 5 - - # Plugin would ignore player's chat message when its length is over a certain value - max-char-length: 35 - - # Cool Down (seconds) - # Plugin would ignore player's chat message when it is still in cool down - cool-down: 1 \ No newline at end of file diff --git a/src/main/resources/char-width.yml b/src/main/resources/char-width.yml deleted file mode 100644 index 6a3cceb..0000000 --- a/src/main/resources/char-width.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Font is processed by client -# Server side doesn't know the width of you custom font -# So you can tell the plugin each character's width here -# You can use command /papi parse player %placeholder% to get the unicode in the console - -# unicode -♥: 5 -뀈: 8 \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7b6a97d..488198d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,65 +1,63 @@ # Do not change -config-version: '14' +config-version: '15' -config: - # Language - # en/cn/es - lang: en +# bStats +metrics: true - # Should the plugin hook into other plugins - integrations: - # When enabled, the plugin will automatically place the resource pack - # folder into the resource pack generated by ItemsAdder/Oraxen. - ItemsAdder: false - Oraxen: false - # When enabled, the plugin will hook into TAB's team management - # require a restart to apply this - TAB: false - # When enabled, plugin will receive team data from TAB on proxy server - # You need to install CustomNameplates on BungeeCord too, otherwise you might be kicked from the server if you enabled "create-fake-team" in nameplate.yml - TAB-BC: false - # TrChat - TrChat: false - # VentureChat - VentureChat: false +# check update +update-checker: true +# Language +# en/cn/es +lang: en + +# Modules +modules: + nameplates: true + backgrounds: true + bubbles: true + bossbars: true + actionbars: true + images: true + +# Should the plugin hook into other plugins +integrations: + # When enabled, the plugin will automatically place the resource pack + # folder into the resource pack generated by ItemsAdder/Oraxen. + # 启用后,插件会自动将生成的资源包发送到IA或者oraxen插件文件夹内 + ItemsAdder: false + Oraxen: false + # When enabled, the plugin will hook into TAB's team management + # require a restart to apply this + # 启用后,插件会使用TAB插件的队伍管理系统 + TAB: false + # When enabled, plugin will receive team data from TAB on BungeeCord + # You need to install CustomNameplates on BungeeCord too, otherwise you might be kicked from the server if you enabled "create-fake-team" in nameplate.yml + # 启用后,插件会从BungeeCord端接收TAB的队伍信息 + TAB-BC: false + # TrChat channels + # TrChat频道 + TrChat: false + # VentureChat channels + # VentureChat频道 + VentureChat: false + +resource-pack: + # extract the shader + extract-shader: true # Your namespace - # If you don't know how font works, don't change this - # Never use minecraft:default, or you will get no support namespace: "nameplates" - # Font Name - # If you don't know how font works, don't change this font: "default" - - # Another ascii font with y offset - ascii-y-offset: - enable: true - offset: - - 3 - - 5 - - -11 - - -24 - # Customize the folder where png files should be generated. # This is useful for those who want to keep their resource pack structure in order. - nameplate-folder-path: 'font\nameplates\' - background-folder-path: 'font\backgrounds\' - bubble-folder-path: 'font\bubbles\' - space-split-folder-path: 'font\' - - # The initial character of all nameplates. - # 뀁 is the first character of Korean \ub001. - # You can specify any Unicode Character as you want. - start-char: '뀁' - + image-path: + nameplates: 'font\nameplates\' + backgrounds: 'font\backgrounds\' + images: 'font\images\' + bubbles: 'font\bubbles\' + space-split: 'font\base\' + # The initial character of a font + initial-char: '뀁' # Thin-font support - use-thin-font: false - - # For ItemsAdder users: - # You need to override assets/minecraft/shaders/core/rendertype_text.xxx in the generated pack to apply this shader - # For Oraxen users: - # extract the shaders to Oraxen/pack/shaders/core - # - #The shader identify text by colors. You need to add to the text you want to apply this shader - extract-shader: true \ No newline at end of file + thin-font: false \ No newline at end of file diff --git a/src/main/resources/configs/actionbar.yml b/src/main/resources/configs/actionbar.yml new file mode 100644 index 0000000..b815f69 --- /dev/null +++ b/src/main/resources/configs/actionbar.yml @@ -0,0 +1,21 @@ +actionbar_1: + text: '%nameplates_offset_94% %nameplates_vanilla_stamina_hud% %nameplates_offset_-183%%nameplates_static_money_hud%' + conditions: + papi-condition: + '&&': + condition_1: + type: '==' + papi: '%player_remaining_air%' + value: 300 + condition_2: + type: '==' + papi: '%player_gamemode%' + value: 'SURVIVAL' +actionbar_2: + text: '%nameplates_static_money_hud%' + conditions: + papi-condition: + condition_1: + type: '!=' + papi: '%player_remaining_air%' + value: 300 \ No newline at end of file diff --git a/src/main/resources/configs/bossbar.yml b/src/main/resources/configs/bossbar.yml new file mode 100644 index 0000000..f76fb19 --- /dev/null +++ b/src/main/resources/configs/bossbar.yml @@ -0,0 +1,31 @@ +basic_info_hud: + color: YELLOW + overlay: PROGRESS + dynamic-text: + - '%nameplates_background_weather% %nameplates_background_position%' + - '%nameplates_background_time%' + #- '%nameplates_conditional_region%' + switch-interval: 15 + conditions: + permission: bossbar.show + +update_info: + color: YELLOW + overlay: PROGRESS + text: '%nameplates_background_update%' + switch-interval: 15 + conditions: + permission: customnameplates.admin + papi-condition: + condition_1: + type: '==' + papi: '%nameplates_checkupdate%' + value: 'true' + +halloween: + color: YELLOW + overlay: PROGRESS + text: '%nameplates_nameplate_halloween%' + conditions: + date: + - 10/31 \ No newline at end of file diff --git a/src/main/resources/configs/bubble.yml b/src/main/resources/configs/bubble.yml new file mode 100644 index 0000000..42895c6 --- /dev/null +++ b/src/main/resources/configs/bubble.yml @@ -0,0 +1,45 @@ +# blacklist channels +# 黑名单聊天频道 +blacklist-channels: + - Private + - Staff + +# Player's default chatting bubbles +# 玩家默认聊天气泡 +default-bubbles: 'none' + +# Text startFormat when no bubbles equipped +# 无气泡时的默认聊天格式 +default-format: + start: '' + end: '' + +# Add additional prefix and suffix to the text +# 文字的前缀与后缀 +text-prefix: '' +text-suffix: '' + +# Space between two bubbles +# 两行气泡之间的间距 +line-spacing: 0.5 + +# This decides where the bottom line is +# 第一行气泡的起始位置 +bottom-line-Y-offset: -0.35 + +# Seconds +# This decides how long will the chat hologram remains +# 气泡的停留时间 +stay-time: 8 + +# Plugin would send another line of bubble if the text's length exceeds a certain value +# 换行所需的字符数 +characters-per-line: 30 + +# Plugin would ignore player's chat message when its length is over a certain value +# 单次最大文字长度 +max-character-length: 100 + +# Cool Down +# 发送冷却 +cool-down: 1 \ No newline at end of file diff --git a/src/main/resources/configs/custom-placeholders.yml b/src/main/resources/configs/custom-placeholders.yml new file mode 100644 index 0000000..e0b5117 --- /dev/null +++ b/src/main/resources/configs/custom-placeholders.yml @@ -0,0 +1,122 @@ +# %nameplates_conditional_{0}% +conditional-text: + region: + priority_1: + text: '%nameplates_background_region%' + conditions: + papi-condition: + condition_1: + type: '!=' + papi: '%worldguard_region%' + value: "" + priority_2: + text: '' + weather: + priority_1: + text: 'Sun' + conditions: + weather: + - clear + priority_2: + text: 'Rain' + conditions: + weather: + - rain + priority_3: + text: 'Thunder' + conditions: + weather: + - thunder + priority_4: + text: 'Rainstorm' + conditions: + weather: + - rainstorm + prefix: + priority_1: + text: '%nameplates_background_prefix% ' + conditions: + papi-condition: + condition_1: + type: '!=' + papi: '%vault_prefix%' + value: "" + priority_2: + text: '' + +# %nameplates_nameplate_{0}% +nameplate-text: + halloween: + nameplate: halloween + text: 'Today is Halloween! Trick or treat!' + +# %nameplates_background_{0}% +background-text: + prefix: + background: bedrock_1 + text: '%vault_prefix% %nameplates_descent_player%' + remove-shadow: true + position: + background: bedrock_1 + text: '<#FFFEFD>%nameplates_image_compass% %nameplates_descent_position%' + remove-shadow: true + time: + background: bedrock_1 + text: '<#FFFEFD>%nameplates_image_clock% %nameplates_descent_time%' + remove-shadow: true + weather: + background: bedrock_1 + text: '<#FFFEFD>%nameplates_image_weather% %nameplates_descent_weather%' + remove-shadow: true + region: + background: bedrock_1 + text: '<#FFFEFD>%nameplates_image_compass% %nameplates_descent_region%' + remove-shadow: true + update: + background: bedrock_2 + text: '<#FFFEFD>%nameplates_image_bell% %nameplates_descent_update%' + remove-shadow: true +# %nameplates_static_{0}% +static-text: + money_hud: + # left/right + position: right + text: '<#FFFEFD>%nameplates_image_coin% %nameplates_descent_money%' + value: 180 + +# Only ASCII characters are allowed here +# %nameplates_descent_{0}% +descent-text: + player: + text: "%player_name%" + descent: 5 + position: + text: "Your Position: %player_x%, %player_y%, %player_z%" + descent: 5 + time: + text: "Time: %nameplates_time%" + descent: 5 + weather: + text: "Weather: %nameplates_conditional_weather%" + descent: 5 + region: + text: "Region: %worldguard_region%" + descent: 5 + update: + text: "A new version of CustomNameplates is available!" + descent: 3 + money: + text: "%vault_eco_balance%" + descent: 12 + +# %nameplates_vanilla_{0}% +vanilla-hud: + stamina_hud: + images: + empty: "%nameplates_image_stamina_0%" + half: "%nameplates_image_stamina_1%" + full: "%nameplates_image_stamina_2%" + placeholder: + # value/max-value can be placeholders + value: '1.1' + max-value: '2' \ No newline at end of file diff --git a/src/main/resources/configs/image-width.yml b/src/main/resources/configs/image-width.yml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/configs/nameplate.yml b/src/main/resources/configs/nameplate.yml new file mode 100644 index 0000000..d5b1ce7 --- /dev/null +++ b/src/main/resources/configs/nameplate.yml @@ -0,0 +1,38 @@ +# mode: Team / Armor_Stand +mode: Team + +# Disable this when you are running a BungeeCord server +# You can also install BungeeTabListPlus or TAB on BungeeCord side to fix +create-fake-team: true + +# This decides what %nameplates_prefix/suffix% would return +player-name: '%player_name%' + +# The duration (in seconds) that the nameplate preview will last for. +preview-duration: 5 + +# If your nameplate's text is static, disable refresh for better performance +refresh: true + +# The default nameplate. +# "none" represents no default nameplate. +default-nameplate: 'none' + +# Prefix & Suffix +# Rejoin the server to apply the changes +prefix: '' +suffix: '' + +armor_stand: + text_1: + text: '%nameplates_prefix%%player_name%%nameplates_suffix%' + vertical-offset: -1 + text_2: + text: '%vault_prefix%' + vertical-offset: -0.7 + conditions: + papi-condition: + condition_1: + type: '!=' + papi: '%vault_prefix%' + value: '' \ No newline at end of file diff --git a/src/main/resources/backgrounds/b0.png b/src/main/resources/contents/backgrounds/b0.png similarity index 100% rename from src/main/resources/backgrounds/b0.png rename to src/main/resources/contents/backgrounds/b0.png diff --git a/src/main/resources/backgrounds/b1.png b/src/main/resources/contents/backgrounds/b1.png similarity index 100% rename from src/main/resources/backgrounds/b1.png rename to src/main/resources/contents/backgrounds/b1.png diff --git a/src/main/resources/backgrounds/b128.png b/src/main/resources/contents/backgrounds/b128.png similarity index 100% rename from src/main/resources/backgrounds/b128.png rename to src/main/resources/contents/backgrounds/b128.png diff --git a/src/main/resources/backgrounds/b16.png b/src/main/resources/contents/backgrounds/b16.png similarity index 100% rename from src/main/resources/backgrounds/b16.png rename to src/main/resources/contents/backgrounds/b16.png diff --git a/src/main/resources/backgrounds/b2.png b/src/main/resources/contents/backgrounds/b2.png similarity index 100% rename from src/main/resources/backgrounds/b2.png rename to src/main/resources/contents/backgrounds/b2.png diff --git a/src/main/resources/backgrounds/b32.png b/src/main/resources/contents/backgrounds/b32.png similarity index 100% rename from src/main/resources/backgrounds/b32.png rename to src/main/resources/contents/backgrounds/b32.png diff --git a/src/main/resources/backgrounds/b4.png b/src/main/resources/contents/backgrounds/b4.png similarity index 100% rename from src/main/resources/backgrounds/b4.png rename to src/main/resources/contents/backgrounds/b4.png diff --git a/src/main/resources/backgrounds/b64.png b/src/main/resources/contents/backgrounds/b64.png similarity index 100% rename from src/main/resources/backgrounds/b64.png rename to src/main/resources/contents/backgrounds/b64.png diff --git a/src/main/resources/backgrounds/b8.png b/src/main/resources/contents/backgrounds/b8.png similarity index 100% rename from src/main/resources/backgrounds/b8.png rename to src/main/resources/contents/backgrounds/b8.png diff --git a/src/main/resources/backgrounds/bedrock_1.yml b/src/main/resources/contents/backgrounds/bedrock_1.yml similarity index 86% rename from src/main/resources/backgrounds/bedrock_1.yml rename to src/main/resources/contents/backgrounds/bedrock_1.yml index ad7979c..3b518ab 100644 --- a/src/main/resources/backgrounds/bedrock_1.yml +++ b/src/main/resources/contents/backgrounds/bedrock_1.yml @@ -1,5 +1,5 @@ -start-width: 1 -end-width: 1 +left-margin: 1 +right-margin: 1 left: image: b0 diff --git a/src/main/resources/backgrounds/bedrock_2.yml b/src/main/resources/contents/backgrounds/bedrock_2.yml similarity index 100% rename from src/main/resources/backgrounds/bedrock_2.yml rename to src/main/resources/contents/backgrounds/bedrock_2.yml diff --git a/src/main/resources/backgrounds/bedrock_3.yml b/src/main/resources/contents/backgrounds/bedrock_3.yml similarity index 100% rename from src/main/resources/backgrounds/bedrock_3.yml rename to src/main/resources/contents/backgrounds/bedrock_3.yml diff --git a/src/main/resources/bubbles/chat.yml b/src/main/resources/contents/bubbles/chat.yml similarity index 76% rename from src/main/resources/bubbles/chat.yml rename to src/main/resources/contents/bubbles/chat.yml index 17d62ba..91b6506 100644 --- a/src/main/resources/bubbles/chat.yml +++ b/src/main/resources/contents/bubbles/chat.yml @@ -1,5 +1,8 @@ -text-format: -display-name: Default Chat Bubbles +text-format: + start: '' + end: '' +display-name: Chat Bubbles + left: image: chat_left height: 13 diff --git a/src/main/resources/bubbles/chat_left.png b/src/main/resources/contents/bubbles/chat_left.png similarity index 100% rename from src/main/resources/bubbles/chat_left.png rename to src/main/resources/contents/bubbles/chat_left.png diff --git a/src/main/resources/bubbles/chat_middle.png b/src/main/resources/contents/bubbles/chat_middle.png similarity index 100% rename from src/main/resources/bubbles/chat_middle.png rename to src/main/resources/contents/bubbles/chat_middle.png diff --git a/src/main/resources/bubbles/chat_right.png b/src/main/resources/contents/bubbles/chat_right.png similarity index 100% rename from src/main/resources/bubbles/chat_right.png rename to src/main/resources/contents/bubbles/chat_right.png diff --git a/src/main/resources/bubbles/chat_tail.png b/src/main/resources/contents/bubbles/chat_tail.png similarity index 100% rename from src/main/resources/bubbles/chat_tail.png rename to src/main/resources/contents/bubbles/chat_tail.png diff --git a/src/main/resources/contents/images/bell.png b/src/main/resources/contents/images/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..54ff717ba45723f7393ae493e12ef34c0043eea0 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3C5N2Uv@%?1}>{y5^{)z4*}Q$iB}CWKFM literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/bell.yml b/src/main/resources/contents/images/bell.yml new file mode 100644 index 0000000..de05b65 --- /dev/null +++ b/src/main/resources/contents/images/bell.yml @@ -0,0 +1,4 @@ +image: bell +height: 10 +ascent: 7 +width: 10 diff --git a/src/main/resources/contents/images/bubble.png b/src/main/resources/contents/images/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..d09b6aab0b8447ef5cb8517744faecdf6dfaf58b GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3Cb;V!d(*TcKha>O|%CvWAKVPs?AoxtGp T_QbZkK&=d(u6{1-oD!M!1Jr1110e|KFB- z@eh#2SrX(I4CI0VL$H5^5Kz#@)5S5Q;#SOALm>u54(E$6m`?un-y_JC{^x2o$AlZ6 z0*ebP0l+XkK DjCobq literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/clock.yml b/src/main/resources/contents/images/clock.yml new file mode 100644 index 0000000..d4e8383 --- /dev/null +++ b/src/main/resources/contents/images/clock.yml @@ -0,0 +1,4 @@ +image: clock +height: 10 +ascent: 5 +width: 10 diff --git a/src/main/resources/contents/images/coin.png b/src/main/resources/contents/images/coin.png new file mode 100644 index 0000000000000000000000000000000000000000..9d162cbc986913c7c75e6c98bf05ab0219f3cc19 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3ClFzskr5G){&3Fki#iZWcj`S$NtVzd;Dr6!__MGIgz2y zC-iV0-k@s3Q~G#5r@c+9VxR5--g{5KKjJcA(0#*j&eA1f70@6CPgg&ebxsLQ01%u| A{{R30 literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/coin.yml b/src/main/resources/contents/images/coin.yml new file mode 100644 index 0000000..76b4404 --- /dev/null +++ b/src/main/resources/contents/images/coin.yml @@ -0,0 +1,4 @@ +image: coin +height: 10 +ascent: -1 +width: 10 diff --git a/src/main/resources/contents/images/compass.png b/src/main/resources/contents/images/compass.png new file mode 100644 index 0000000000000000000000000000000000000000..2046679971f52388fc15d19e5c4f3e4c43d30265 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3CeZ`ydU}37KFgLZ1IqmW|6f-BMh=k0 zQ4-`A4CI0U!@cIckw7tPPZ!6Kid!*f9r+j(IG7JEn)2`eaWR`2JC<{DGOSeNTxB{n yVd>_xcl2iOd7`S+bbrcTx8Snp$?uN}CNRWpW<2dSm+dIf7zR&QKbLh*2~7ZB6HFTb literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/compass.yml b/src/main/resources/contents/images/compass.yml new file mode 100644 index 0000000..35f1f51 --- /dev/null +++ b/src/main/resources/contents/images/compass.yml @@ -0,0 +1,4 @@ +image: compass +height: 10 +ascent: 5 +width: 10 diff --git a/src/main/resources/contents/images/stamina_0.png b/src/main/resources/contents/images/stamina_0.png new file mode 100644 index 0000000000000000000000000000000000000000..58ceda8f316cf271bf3c8ce38ead26e01cda5f60 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*A&x0(?STQ&LiZ%>V!YujIOU7RX{Q3Gxg6|DWOdDPBh)*TB=o zF{I*_&*_7_3=SMjjyL{w+bPbHkyl^AWX`dABi|aIZTI+!Zoa!*!@J6-f{BNL=Q%?- U%b8pAfqEG{UHx3vIVCg!0C7k-IsgCw literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/stamina_0.yml b/src/main/resources/contents/images/stamina_0.yml new file mode 100644 index 0000000..799ba3e --- /dev/null +++ b/src/main/resources/contents/images/stamina_0.yml @@ -0,0 +1,4 @@ +image: stamina_0 +height: 9 +ascent: -15 +width: 9 diff --git a/src/main/resources/contents/images/stamina_1.png b/src/main/resources/contents/images/stamina_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a648273e9d6d2d82f2edd140a72c84072926f1 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xv;urWT!C~-O3MGwlm35d{r|D?|Cee1KUDpHm-qjD+5fNe z{=ZHA|Gwz|*O~wS|JV5&vjwP{uO!GX7|2Bc2G;|3P5@;rJY5_^DsHLtaPl!2a2&c( z`|1CCzQ|rrMYjnCSC%AbMy!*HX3jjn^!VJMx$m~5*B@>u{*(NHMS{UOhw($n`+4#} PGZ;Kw{an^LB{Ts5h@54f literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/stamina_1.yml b/src/main/resources/contents/images/stamina_1.yml new file mode 100644 index 0000000..3cc8403 --- /dev/null +++ b/src/main/resources/contents/images/stamina_1.yml @@ -0,0 +1,4 @@ +image: stamina_1 +height: 9 +ascent: -15 +width: 9 diff --git a/src/main/resources/contents/images/stamina_2.png b/src/main/resources/contents/images/stamina_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc2968ae7c48c22dd24bc5d8168e37c7d5b51b6 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XLIQk3T!Hleuk-%@I`IGJrvE>;{{Oz@|F7Nuf9?JMq3Zwl z75_iA{{KAb|JRxSzs~*tF7N-ZL;ruQ|Nm{_|L<%5e{B5!``G`VJN~~-{r|q~|Cee1 z|D5>$zUcq||LZr0-vOE{QxfDC4CLYh4C0#}T?eXj_jGX#skoIiVOkmkbEd+SC+W%0 zQdo*yX1K6MR5mE_ywP!L65_d}5Xlyor^h$JO2I!uMu+W4P?CTcvpn+*ej|S=76v9B Zh7Iv7OJBaJa{(I3;OXk;vd$@?2>?1Emo)$Y literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/stamina_2.yml b/src/main/resources/contents/images/stamina_2.yml new file mode 100644 index 0000000..27dd24a --- /dev/null +++ b/src/main/resources/contents/images/stamina_2.yml @@ -0,0 +1,4 @@ +image: stamina_2 +height: 9 +ascent: -15 +width: 9 diff --git a/src/main/resources/contents/images/weather.png b/src/main/resources/contents/images/weather.png new file mode 100644 index 0000000000000000000000000000000000000000..f55e78a72ae722a06a61405349a03a1b226e4305 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3C)!YK16j-^L4LtNvFoRJ9f4d!PZ!6K zid!)~j$8~5986dL+gHhE>3cp=Sk&~!?%_0^YZKM~T4dgidbF+TgU*5{oCXXc!VCdt T)22lNH8Xg+`njxgN@xNAzY9D( literal 0 HcmV?d00001 diff --git a/src/main/resources/contents/images/weather.yml b/src/main/resources/contents/images/weather.yml new file mode 100644 index 0000000..8d2eed7 --- /dev/null +++ b/src/main/resources/contents/images/weather.yml @@ -0,0 +1,4 @@ +image: weather +height: 10 +ascent: 5 +width: 10 diff --git a/src/main/resources/nameplates/cat.yml b/src/main/resources/contents/nameplates/cat.yml similarity index 100% rename from src/main/resources/nameplates/cat.yml rename to src/main/resources/contents/nameplates/cat.yml diff --git a/src/main/resources/nameplates/cat_left.png b/src/main/resources/contents/nameplates/cat_left.png similarity index 100% rename from src/main/resources/nameplates/cat_left.png rename to src/main/resources/contents/nameplates/cat_left.png diff --git a/src/main/resources/nameplates/cat_middle.png b/src/main/resources/contents/nameplates/cat_middle.png similarity index 100% rename from src/main/resources/nameplates/cat_middle.png rename to src/main/resources/contents/nameplates/cat_middle.png diff --git a/src/main/resources/nameplates/cat_right.png b/src/main/resources/contents/nameplates/cat_right.png similarity index 100% rename from src/main/resources/nameplates/cat_right.png rename to src/main/resources/contents/nameplates/cat_right.png diff --git a/src/main/resources/nameplates/cheems.yml b/src/main/resources/contents/nameplates/cheems.yml similarity index 100% rename from src/main/resources/nameplates/cheems.yml rename to src/main/resources/contents/nameplates/cheems.yml diff --git a/src/main/resources/nameplates/cheems_left.png b/src/main/resources/contents/nameplates/cheems_left.png similarity index 100% rename from src/main/resources/nameplates/cheems_left.png rename to src/main/resources/contents/nameplates/cheems_left.png diff --git a/src/main/resources/nameplates/cheems_middle.png b/src/main/resources/contents/nameplates/cheems_middle.png similarity index 100% rename from src/main/resources/nameplates/cheems_middle.png rename to src/main/resources/contents/nameplates/cheems_middle.png diff --git a/src/main/resources/nameplates/cheems_right.png b/src/main/resources/contents/nameplates/cheems_right.png similarity index 100% rename from src/main/resources/nameplates/cheems_right.png rename to src/main/resources/contents/nameplates/cheems_right.png diff --git a/src/main/resources/nameplates/egg.yml b/src/main/resources/contents/nameplates/egg.yml similarity index 100% rename from src/main/resources/nameplates/egg.yml rename to src/main/resources/contents/nameplates/egg.yml diff --git a/src/main/resources/nameplates/egg_left.png b/src/main/resources/contents/nameplates/egg_left.png similarity index 100% rename from src/main/resources/nameplates/egg_left.png rename to src/main/resources/contents/nameplates/egg_left.png diff --git a/src/main/resources/nameplates/egg_middle.png b/src/main/resources/contents/nameplates/egg_middle.png similarity index 100% rename from src/main/resources/nameplates/egg_middle.png rename to src/main/resources/contents/nameplates/egg_middle.png diff --git a/src/main/resources/nameplates/egg_right.png b/src/main/resources/contents/nameplates/egg_right.png similarity index 100% rename from src/main/resources/nameplates/egg_right.png rename to src/main/resources/contents/nameplates/egg_right.png diff --git a/src/main/resources/nameplates/halloween.yml b/src/main/resources/contents/nameplates/halloween.yml similarity index 100% rename from src/main/resources/nameplates/halloween.yml rename to src/main/resources/contents/nameplates/halloween.yml diff --git a/src/main/resources/nameplates/halloween_left.png b/src/main/resources/contents/nameplates/halloween_left.png similarity index 100% rename from src/main/resources/nameplates/halloween_left.png rename to src/main/resources/contents/nameplates/halloween_left.png diff --git a/src/main/resources/nameplates/halloween_middle.png b/src/main/resources/contents/nameplates/halloween_middle.png similarity index 100% rename from src/main/resources/nameplates/halloween_middle.png rename to src/main/resources/contents/nameplates/halloween_middle.png diff --git a/src/main/resources/nameplates/halloween_right.png b/src/main/resources/contents/nameplates/halloween_right.png similarity index 100% rename from src/main/resources/nameplates/halloween_right.png rename to src/main/resources/contents/nameplates/halloween_right.png diff --git a/src/main/resources/nameplates/hutao.yml b/src/main/resources/contents/nameplates/hutao.yml similarity index 100% rename from src/main/resources/nameplates/hutao.yml rename to src/main/resources/contents/nameplates/hutao.yml diff --git a/src/main/resources/nameplates/hutao_left.png b/src/main/resources/contents/nameplates/hutao_left.png similarity index 100% rename from src/main/resources/nameplates/hutao_left.png rename to src/main/resources/contents/nameplates/hutao_left.png diff --git a/src/main/resources/nameplates/hutao_middle.png b/src/main/resources/contents/nameplates/hutao_middle.png similarity index 100% rename from src/main/resources/nameplates/hutao_middle.png rename to src/main/resources/contents/nameplates/hutao_middle.png diff --git a/src/main/resources/nameplates/hutao_right.png b/src/main/resources/contents/nameplates/hutao_right.png similarity index 100% rename from src/main/resources/nameplates/hutao_right.png rename to src/main/resources/contents/nameplates/hutao_right.png diff --git a/src/main/resources/nameplates/rabbit.yml b/src/main/resources/contents/nameplates/rabbit.yml similarity index 100% rename from src/main/resources/nameplates/rabbit.yml rename to src/main/resources/contents/nameplates/rabbit.yml diff --git a/src/main/resources/nameplates/rabbit_left.png b/src/main/resources/contents/nameplates/rabbit_left.png similarity index 100% rename from src/main/resources/nameplates/rabbit_left.png rename to src/main/resources/contents/nameplates/rabbit_left.png diff --git a/src/main/resources/nameplates/rabbit_middle.png b/src/main/resources/contents/nameplates/rabbit_middle.png similarity index 100% rename from src/main/resources/nameplates/rabbit_middle.png rename to src/main/resources/contents/nameplates/rabbit_middle.png diff --git a/src/main/resources/nameplates/rabbit_right.png b/src/main/resources/contents/nameplates/rabbit_right.png similarity index 100% rename from src/main/resources/nameplates/rabbit_right.png rename to src/main/resources/contents/nameplates/rabbit_right.png diff --git a/src/main/resources/nameplates/starsky.yml b/src/main/resources/contents/nameplates/starsky.yml similarity index 100% rename from src/main/resources/nameplates/starsky.yml rename to src/main/resources/contents/nameplates/starsky.yml diff --git a/src/main/resources/nameplates/starsky_left.png b/src/main/resources/contents/nameplates/starsky_left.png similarity index 100% rename from src/main/resources/nameplates/starsky_left.png rename to src/main/resources/contents/nameplates/starsky_left.png diff --git a/src/main/resources/nameplates/starsky_middle.png b/src/main/resources/contents/nameplates/starsky_middle.png similarity index 100% rename from src/main/resources/nameplates/starsky_middle.png rename to src/main/resources/contents/nameplates/starsky_middle.png diff --git a/src/main/resources/nameplates/starsky_right.png b/src/main/resources/contents/nameplates/starsky_right.png similarity index 100% rename from src/main/resources/nameplates/starsky_right.png rename to src/main/resources/contents/nameplates/starsky_right.png diff --git a/src/main/resources/nameplates/trident.yml b/src/main/resources/contents/nameplates/trident.yml similarity index 100% rename from src/main/resources/nameplates/trident.yml rename to src/main/resources/contents/nameplates/trident.yml diff --git a/src/main/resources/nameplates/trident_left.png b/src/main/resources/contents/nameplates/trident_left.png similarity index 100% rename from src/main/resources/nameplates/trident_left.png rename to src/main/resources/contents/nameplates/trident_left.png diff --git a/src/main/resources/nameplates/trident_middle.png b/src/main/resources/contents/nameplates/trident_middle.png similarity index 100% rename from src/main/resources/nameplates/trident_middle.png rename to src/main/resources/contents/nameplates/trident_middle.png diff --git a/src/main/resources/nameplates/trident_right.png b/src/main/resources/contents/nameplates/trident_right.png similarity index 100% rename from src/main/resources/nameplates/trident_right.png rename to src/main/resources/contents/nameplates/trident_right.png diff --git a/src/main/resources/nameplates/wither.yml b/src/main/resources/contents/nameplates/wither.yml similarity index 100% rename from src/main/resources/nameplates/wither.yml rename to src/main/resources/contents/nameplates/wither.yml diff --git a/src/main/resources/nameplates/wither_left.png b/src/main/resources/contents/nameplates/wither_left.png similarity index 100% rename from src/main/resources/nameplates/wither_left.png rename to src/main/resources/contents/nameplates/wither_left.png diff --git a/src/main/resources/nameplates/wither_middle.png b/src/main/resources/contents/nameplates/wither_middle.png similarity index 100% rename from src/main/resources/nameplates/wither_middle.png rename to src/main/resources/contents/nameplates/wither_middle.png diff --git a/src/main/resources/nameplates/wither_right.png b/src/main/resources/contents/nameplates/wither_right.png similarity index 100% rename from src/main/resources/nameplates/wither_right.png rename to src/main/resources/contents/nameplates/wither_right.png diff --git a/src/main/resources/nameplates/xmas.yml b/src/main/resources/contents/nameplates/xmas.yml similarity index 100% rename from src/main/resources/nameplates/xmas.yml rename to src/main/resources/contents/nameplates/xmas.yml diff --git a/src/main/resources/nameplates/xmas_left.png b/src/main/resources/contents/nameplates/xmas_left.png similarity index 100% rename from src/main/resources/nameplates/xmas_left.png rename to src/main/resources/contents/nameplates/xmas_left.png diff --git a/src/main/resources/nameplates/xmas_middle.png b/src/main/resources/contents/nameplates/xmas_middle.png similarity index 100% rename from src/main/resources/nameplates/xmas_middle.png rename to src/main/resources/contents/nameplates/xmas_middle.png diff --git a/src/main/resources/nameplates/xmas_right.png b/src/main/resources/contents/nameplates/xmas_right.png similarity index 100% rename from src/main/resources/nameplates/xmas_right.png rename to src/main/resources/contents/nameplates/xmas_right.png diff --git a/src/main/resources/custom-papi.yml b/src/main/resources/custom-papi.yml deleted file mode 100644 index 78387e1..0000000 --- a/src/main/resources/custom-papi.yml +++ /dev/null @@ -1,39 +0,0 @@ -# %nameplates_bg_xx% BackGround -# %nameplates_static_% -# %nameplates_npp_xx% NamePlatePrefix -# %nameplates_nps_xx% NamePlateSuffix - -papi: - #This papi will not return text with background - #It will only return the background - #So you need to do something like this in your bossbar/actionbar plugin: - #%nameplates_bg_player%Hello! %player_name% - player: - text: 'Hello! %player_name%' - background: bedrock_1 - pos: - text: 'You are now at: %player_x%, %player_y%, %player_z%' - background: bedrock_1 - text: - text: 'Thanks for your purchase!' - background: bedrock_2 - health: - text: '%player_health_rounded% Health' - background: bedrock_3 - food: - text: '%player_food_level% Hunger' - background: bedrock_3 - - money: - text: '%xconomy_balance%' - # If the text's total width is 40, this papi would return offset characters with width 145 - # You can use the offset characters by using %nameplates_static_money%%xconomy_balance% - static: 185 - - #This papi will not return text with nameplate - #It will only return the nameplate - #So you need to do something like this in your bossbar/actionbar plugin: - #%nameplates_npp_halloween%%player_name% Trick or Treat!%nameplates_nps_halloween% - halloween: - text: '%player_name% Trick or Treat!' - nameplate: halloween \ No newline at end of file diff --git a/src/main/resources/database.yml b/src/main/resources/database.yml index 268c209..41b073a 100644 --- a/src/main/resources/database.yml +++ b/src/main/resources/database.yml @@ -1,4 +1,4 @@ -config-version: '8' +config-version: '15' # YAML/MySQL/MariaDB # 存储模式 diff --git a/src/main/resources/messages/cn.yml b/src/main/resources/messages/cn.yml index 4586d1f..894ab2d 100644 --- a/src/main/resources/messages/cn.yml +++ b/src/main/resources/messages/cn.yml @@ -27,6 +27,6 @@ messages: available-bubbles: '可用聊天气泡: {Bubbles}' force-equip-bubbles: '成功使用聊天气泡 {Bubbles}' force-unequip-bubbles: '你移除了 {Player} 的聊天气泡' - not-exist-bubbles: '这个聊天气泡不存在!' + not-exist-bubbles: '那个聊天气泡不存在!' not-available-bubbles: '你还未拥有这个气泡!' have-no-bubbles: '你还没有拥有任何气泡.' diff --git a/src/main/resources/nameplate.yml b/src/main/resources/nameplate.yml deleted file mode 100644 index 2aa4cef..0000000 --- a/src/main/resources/nameplate.yml +++ /dev/null @@ -1,86 +0,0 @@ -# Do not change -config-version: '8' - -nameplate: - # mode: Team / Riding / Teleporting - # ============================== Team ================================== - # Team is based on vanilla team mechanic - # But only supports one line - # ============================= Riding ================================= - # Plugin would summon fake armor stands packets riding the player - # to provide additional tag lines for players - # ========================== Teleporting =============================== - # Plugin would summon fake armor stands packets teleporting the player - # to provide additional tag lines for players - mode: Team - - # When you meet problems of players getting kicked with proxy server you should disable this - # Or installing BungeeTabListPlus / TAB on the proxy server would fix - create-fake-team: true - - # This decides what %nameplates_prefix/suffix% would return - # This only works on Riding / Teleporting mode - # Don't change this if you are using Team mode - player-name: '%player_name%' - - update: - # Nameplates will be updated every x ticks - # If your nameplate content is static, it's better to disable updating for better performance - enable: true - ticks: 20 - - # The duration (in seconds) that the nameplate preview will last for. - preview-duration: 5 - - # The default nameplate. - # "none" represents no default nameplate. - default-nameplate: 'none' - - # Placeholder based prefix and suffix system. When enabled, it is recommended - # to use PlaceholderAPI to be able to use this feature to the fullest extent. - # keep it empty if you don't want to enable this feature. - # Please use MiniMessage format: https://docs.adventure.kyori.net/minimessage/format.html - prefix: 'Hello! ' - suffix: ' %player_health_rounded%♥' - - # These options only work when using mode Team - team: - # should prefix/suffix be hidden when player is equipping a nameplate - hide-prefix-when-equipped: true - hide-suffix-when-equipped: true - - # These options only work when using mode Riding - riding: - # If you are having trouble with plugin conflict - # Set this to "true" might help (let other plugin handle armor stand mounting) (requires a restart) - # MagicCosmetics is tested, and it proves to work well - try-to-hook-cosmetics-plugin: false - # Make player's original name-tag invisible - # If you have another plugin that is using team please disable team management in that plugin or make player's name invisible in that plugin - remove-nametag: true - # If armor stand is the normal height, more lines can be displayed but texts would go obviously abnormal when you look at it in a certain angle - small-size: true - # nameplates content - text: - - '%nameplates_prefix%%player_name%%nameplates_suffix%' - - '%nameplates_bg_health%%player_health_rounded% Health %nameplates_bg_food%<#F0E68C>%player_food_level% Hunger' - - 'Multiple lines are supported!' - - # These options only work when using mode Teleporting - teleporting: - # Make player's original name-tag invisible - # If you have another plugin that is using team please disable team management in that plugin or make player's name invisible in that plugin - remove-nametag: true - # Small height armor stand - small-size: true - # nameplates content - text: - text_1: - content: '%nameplates_prefix%%player_name%%nameplates_suffix%' - offset: -1 - text_2: - content: '%nameplates_bg_health%%player_health_rounded% Health %nameplates_bg_food%<#F0E68C>%player_food_level% Hunger' - offset: 0 - text_3: - content: 'Multiple lines are supported!' - offset: 0 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 82415dc..2cf3325 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -32,6 +32,7 @@ permissions: nameplates.unequip: true nameplates.preview: true nameplates.list: true + nameplates.about: true nameplates.reload: default: op @@ -41,6 +42,8 @@ permissions: default: op nameplates.help: default: op + nameplates.about: + default: op nameplates.unequip: default: true nameplates.preview: