From 1066c65067b39c8136b0c06e25b47cd5d261e10e Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Fri, 16 Jun 2023 16:51:26 +0800 Subject: [PATCH] 2.2.1.0 --- build.gradle | 4 +- libs/BiomeAPI.jar | Bin 9255 -> 10488 bytes libs/MagicCosmetics-2.3.7-API.jar | Bin 0 -> 174575 bytes .../command/subcmd/ForcePreviewCommand.java | 4 +- .../command/subcmd/PreviewCommand.java | 4 +- .../data/FileStorageImpl.java | 3 +- .../customnameplates/data/SqlConnection.java | 1 - .../helper/VersionHelper.java | 9 ++ .../listener/EntityTagListener.java | 8 +- .../compatibility/MagicCosmeticsListener.java | 31 +++-- .../packet/EntityDestroyListener.java | 6 +- .../listener/packet/EntityLookListener.java | 6 +- .../listener/packet/EntityMoveListener.java | 6 +- .../listener/packet/EntitySpawnListener.java | 6 +- .../packet/EntityTeleportListener.java | 6 +- .../manager/BossBarManager.java | 5 +- .../manager/ChatBubblesManager.java | 106 ++++++++-------- .../customnameplates/manager/DataManager.java | 2 +- .../customnameplates/manager/FontManager.java | 7 +- .../manager/NameplateManager.java | 69 +++++------ .../manager/PlaceholderManager.java | 31 +++-- .../manager/ResourceManager.java | 43 +++++-- .../customnameplates/manager/TeamManager.java | 4 +- .../object/ConditionalText.java | 3 +- .../{nameplate/mode => }/DisplayMode.java | 2 +- .../AbstractPacketsHandler.java} | 4 +- .../AbstractTextCarrier.java} | 23 ++-- .../object/carrier/DisableNameplate.java | 26 ++++ .../object/carrier/NamedEntity.java | 37 ++++++ .../NamedEntityCarrier.java} | 75 +++++++---- .../NamedEntityImpl.java} | 89 ++++++++++---- .../NamedEntityManager.java} | 116 +++++++++--------- .../NamedEntityPacketsHandler.java} | 26 ++-- .../TeamInfoCarrier.java} | 10 +- .../object/carrier/TextDisplayMeta.java | 7 ++ .../VehicleChecker.java | 30 +++-- .../object/{emoji => img}/ImageParser.java | 2 +- .../ItemsAdderImageImpl.java} | 4 +- .../OraxenImageImpl.java} | 6 +- .../object/nameplate/NameplatesTeam.java | 10 +- .../nameplate/mode/DisableNameplate.java | 41 ------- .../armorstand/ArmorStandPacketsHandler.java | 97 --------------- .../mode/armorstand/ArmorStandTag.java | 99 --------------- .../object/placeholders/BackGroundText.java | 1 + .../object/placeholders/DescentText.java | 1 + .../placeholders/NameplatePlaceholders.java | 34 +++-- .../object/{ => placeholders}/StaticText.java | 2 +- .../object/placeholders/VanillaHud.java | 3 +- .../utils/AdventureUtils.java | 3 +- .../customnameplates/utils/ConfigUtils.java | 21 ++++ src/main/resources/configs/bubble.yml | 18 ++- .../resources/configs/custom-placeholders.yml | 1 + src/main/resources/configs/nameplate.yml | 24 +++- src/main/resources/templates/default.json | 5 - 54 files changed, 581 insertions(+), 600 deletions(-) create mode 100644 libs/MagicCosmetics-2.3.7-API.jar rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode => }/DisplayMode.java (92%) rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode/PacketsHandler.java => carrier/AbstractPacketsHandler.java} (93%) rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode/AbstractNameplateTag.java => carrier/AbstractTextCarrier.java} (82%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/carrier/DisableNameplate.java create mode 100644 src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntity.java rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode/EntityTag.java => carrier/NamedEntityCarrier.java} (54%) rename src/main/java/net/momirealms/customnameplates/object/{armorstand/FakeArmorStand.java => carrier/NamedEntityImpl.java} (74%) rename src/main/java/net/momirealms/customnameplates/object/{armorstand/ArmorStandManager.java => carrier/NamedEntityManager.java} (52%) rename src/main/java/net/momirealms/customnameplates/object/{bubble/BBPacketsHandle.java => carrier/NamedEntityPacketsHandler.java} (77%) rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode/team/TeamTag.java => carrier/TeamInfoCarrier.java} (82%) create mode 100644 src/main/java/net/momirealms/customnameplates/object/carrier/TextDisplayMeta.java rename src/main/java/net/momirealms/customnameplates/object/{nameplate/mode/armorstand => carrier}/VehicleChecker.java (65%) rename src/main/java/net/momirealms/customnameplates/object/{emoji => img}/ImageParser.java (93%) rename src/main/java/net/momirealms/customnameplates/object/{emoji/ItemsAdderImpl.java => img/ItemsAdderImageImpl.java} (89%) rename src/main/java/net/momirealms/customnameplates/object/{emoji/OraxenImpl.java => img/OraxenImageImpl.java} (90%) delete mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisableNameplate.java delete mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java delete mode 100644 src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java rename src/main/java/net/momirealms/customnameplates/object/{ => placeholders}/StaticText.java (93%) diff --git a/build.gradle b/build.gradle index b588c3d..26260bf 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'net.momirealms' -version = '2.2.0.8' +version = '2.2.1.0' repositories { maven {name = "aliyun-repo"; url = "https://maven.aliyun.com/repository/public/"} @@ -62,7 +62,7 @@ processResources { shadowJar { relocate ('net.kyori', 'net.momirealms.customnameplates.libs.net.kyori') relocate ('org.bstats', 'net.momirealms.customnameplates.libs.org.bstats') - relocate ('net.momirealms', 'net.momirealms.customnameplates.libs.net.momirealms') + relocate ('net.momirealms.biomeapi', 'net.momirealms.customnameplates.libs.net.momirealms.biomeapi') } tasks.register("delete", Delete).get().delete("build/libs/"+project.name+"-"+project.version+".jar") diff --git a/libs/BiomeAPI.jar b/libs/BiomeAPI.jar index a0a1f7496ef0f07480233b93f8c945d97860be17..00c06717792bd9929cb8177b8d3784f4a8d57471 100644 GIT binary patch delta 2601 zcmZuz2{_bS8=o=Ou@^FpWyV(ab!3UTxYjAlFk>%rF(P|Nn2c$XT+!bauI1XwMHI3x zxz|{}&`o3(vQv>#Bs6z)zx#dne$RK#^PKnm-}m>P_x#`IIlt#uZS&bl&=CXSgn~f4 zyrA0!BUyqS&znPZ6Er6RcihuV-M>LXxd;E&t|uOtZchugK`1H+a5y2K%MW89H&VPnH;v7_O;`?sEsKdbHYE9Ii}UN7>7 z25z}m`*_|B(JqSq;7+GSJSqRMOnX~#t@w27`b}2J)rtO34w3{*xSuV(GS1XLrzpYR zkoR-q`vj!4{YGe*apfj3bPs)w-`GjTpe@>k`{Hqfn?hg3HmAa5;c zvN#gn9&Xnk1PKhsmmZAwTjz)p0vV##R0MVV%amMVaMZ!??@Bkrb0vfM+p_9IJzLMd zmY1Y8$&Tj|X6dY?#bY$J^#@JCO+C+MUb3z%YSJ1@4IKx@scsR!ZTKPy-SsDDYzlY_ z!cL~4vM8iwlx1QlHf&tVd7?b4J!QEt%_tfhJYM9u7#c-wN8_}UQiqoU-uS~W6#97j zU>ceJSJ9gyL|{aCb99Q(b3;Mdz5uW1P=I7Q>e&~_KUF=hpq?430?o{|QB4~K@V1Y| ze?l;kU6?zCBTt(a*IFmm$obIkjK`*al|6Htx?c}l6$^Z(m|&n-Ki|}vp?e{tG8q z8x@s-7|Z?6BtkQM{{y+4}kw29372oNazj8QvZc%~fxtNGN*f=h!{nbe*a=+zsJ+frt}^yg&KxxWVLeii3ykPvkE>B>Z91Ok2#D z1Et6Sqihpf#5~3@|`nM0BmgK6~G=kMoA;wSQEKh*-q9HA#pCo5(=fc<=y zUdlo1H{sh6Kizvu;Ca_QXV}%4Eb~jau`1WzN=6z!U>&Ns6<++YMfi>42IB?hXB}%x zU9H&5RFS<**e4m-#}Le}Dg2mWTAOdikC)f_1uT}1oz3+%owas2CrHD&d^;|B@=)G!P+VWcLI5Cg*TB4|m3mGV1vuZ1$w*BXuvL!9b2gRce7u zf;sU8YfQ*A$ajwSovxH$W#(7Ga`oB+(!WGoJyckp4` zd#$OLz04`gb4oudC+kSZ2|7V*(yYn0m3#rOt~u6Qm2Z4A5oG4w(XwMQDDrP6(rK(F}xz&_C4( zFpIE4u%UPmdvF{s>>>51VXq>fbu(`+pixdn%@G6U5QF?Fc@7g6ifwRZU=Tf402oEWIr{k7 zC@r9bhe!B-!`gCi@DR`-rwt^@iOK%ERsX*hrx^Pb3k17+_*wL`mIv$$C9$>GKQDxq zWP{X!<6=+%BQJ2+VZcKk&S56?%`GJf1?t&ucEf=#w)=a;H@B=5RKgL%#eMi|!tBXp L%RDZH!>>O8`uU4W delta 1471 zcmY+Edo}ED1je9@0irjLE z9JO*8hFnTVt;W!j+&N0D)P~&F>~C~Vd-i$Hd7t=Y9V8tk{<^rR*$0qyzw9 zFhH#5<#Z{E7?7@K1%{V0(_?pUxw3s=3>@j#mxUcms2p};8U%oGGyqVbLNo!2RF`IF zW{id4obfN7(w~OcTySYDi92gA;c{z76UCfhm5}EDI4z6mZ&~O-_q49>)`FhMw5)zI z9yhl0UNkoYLEV-@-4xrGXU5NrSIX$z3&GuaJIOp4vM|VR{_x8}SF;aa%T{F*L%L}# zwZB0=A~a$G$Kd(R|LomWf$y$dwQgef;6JP9ar&&p8)6I38#}GY`x;7{C^AkxzU$3( z37@TV)};TzbEFNiy0!Z@E^8ZU6}XyKbvm5B)rUb3@Ga znA`r%zVGYn>vBt1FX+g=4DEQWKW9^tGk!!$se_?f@aigSmR03FfNB@+JQhb{k4#xk zBu$pbco}vExp|cPe0`#ai00_{3|xtrPWLFMw=4(6q(->C5a(HynT*z`R|>Z8kY0|b zp}UsI6nt)P@UChJ?5DemJ#7`Lg@NAeD9TZ~)BVQw9FF8^P6hLd z#{LhZb8_9?VZQOqHZ-JttjCF18v$@ljLyr1V9;qzDZYTo*ap)gM?Tt)bfG(;LA2P|x|Lnr9JQ_r#Y7}+k151Kv8 z@tYVv*)VA{(&qMzq4kk>Lql16H1k~4&34(TqWj`1f{151nR*YmOPM8oQ;+=f&CP0q zEWRL`_lEKyuOzE9t0X+pW$y+io3-GziN=n!$qCLECEYhDLKRisnlw9A6mYBE%%CWh zoQ$L4PG{>KVL!15g%VPeQhby7!!-UOZ1URfMt#tBrdL=HAjGLfaO?}G${8tMstMZK z$-$9Y#knNaLGH=uDT3Teh6gs5?PcATf%#l)ZGl^n%$S{i2=|FvWe&^D4DFa<)4xbMf`y_$fnZ& z2M}bfevI^^2T>!i5x+Zl-ww>1XrdqzURlP@QVf9yzf(^1_P9C$;VlYjLSv|H5RHNr z^$O)v2na_sEFXZRuxR{N74W?Z4znI!JjjDgC<+Ky$*mmQJ$N)s#3thW@hv$^2A1g% zcMp~Xf0Q+5EU2r7Ng0g+0R10bi4FoBoJfP@G!#UGfT$V-M4#f8#34#RYz?evE>H?A b_Y)uw5?#U0617cKC=IVDBmiWqh;IJ^++=8z diff --git a/libs/MagicCosmetics-2.3.7-API.jar b/libs/MagicCosmetics-2.3.7-API.jar new file mode 100644 index 0000000000000000000000000000000000000000..f13e6cba65c9722bcb9ca2770c4985014db0dd12 GIT binary patch literal 174575 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

Ee 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

~!$Px|;4A^F1*J7cybR1` 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 literal 0 HcmV?d00001 diff --git a/src/main/java/net/momirealms/customnameplates/command/subcmd/ForcePreviewCommand.java b/src/main/java/net/momirealms/customnameplates/command/subcmd/ForcePreviewCommand.java index 3754d78..32f8010 100644 --- a/src/main/java/net/momirealms/customnameplates/command/subcmd/ForcePreviewCommand.java +++ b/src/main/java/net/momirealms/customnameplates/command/subcmd/ForcePreviewCommand.java @@ -27,7 +27,7 @@ import net.momirealms.customnameplates.command.AbstractSubCommand; import net.momirealms.customnameplates.manager.MessageManager; import net.momirealms.customnameplates.manager.NameplateManager; import net.momirealms.customnameplates.object.nameplate.NameplateConfig; -import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.utils.AdventureUtils; import net.momirealms.customnameplates.utils.ArmorStandUtils; import org.bukkit.Bukkit; @@ -70,7 +70,7 @@ public class ForcePreviewCommand extends AbstractSubCommand { .append(Component.text(player.getName()).color(TextColor.color(AdventureUtils.colorToDecimal(nameplateConfig.color()))).font(Key.key("minecraft:default")) .append(MiniMessage.miniMessage().deserialize(suffixImage))); ArmorStandUtils.preview(holoComponent, player, (int) nameplateManager.getPreview_time()); - } else if (nameplateManager.getMode() == DisplayMode.ARMOR_STAND) { + } else if (nameplateManager.getMode() == DisplayMode.ARMOR_STAND || nameplateManager.getMode() == DisplayMode.TEXT_DISPLAY) { nameplateManager.showPlayerArmorStandTags(player, nameplate); } else { AdventureUtils.sendMessage(sender, MessageManager.prefix + "Nameplate is disabled."); diff --git a/src/main/java/net/momirealms/customnameplates/command/subcmd/PreviewCommand.java b/src/main/java/net/momirealms/customnameplates/command/subcmd/PreviewCommand.java index ac45137..300b95b 100644 --- a/src/main/java/net/momirealms/customnameplates/command/subcmd/PreviewCommand.java +++ b/src/main/java/net/momirealms/customnameplates/command/subcmd/PreviewCommand.java @@ -25,7 +25,7 @@ import net.momirealms.customnameplates.command.AbstractSubCommand; import net.momirealms.customnameplates.manager.MessageManager; import net.momirealms.customnameplates.manager.NameplateManager; import net.momirealms.customnameplates.object.nameplate.NameplatesTeam; -import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.utils.AdventureUtils; import net.momirealms.customnameplates.utils.ArmorStandUtils; import org.bukkit.command.CommandSender; @@ -57,7 +57,7 @@ public class PreviewCommand extends AbstractSubCommand { .append(team.getNameplateSuffixComponent())); ArmorStandUtils.preview(full, player, (int) nameplateManager.getPreview_time()); } - } else if (nameplateManager.getMode() == DisplayMode.ARMOR_STAND) { + } else if (nameplateManager.getMode() == DisplayMode.ARMOR_STAND || nameplateManager.getMode() == DisplayMode.TEXT_DISPLAY) { nameplateManager.showPlayerArmorStandTags(player); } else { AdventureUtils.playerMessage(player, MessageManager.prefix + "Nameplate is disabled."); diff --git a/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java b/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java index 3829169..24f106b 100644 --- a/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java +++ b/src/main/java/net/momirealms/customnameplates/data/FileStorageImpl.java @@ -61,8 +61,7 @@ public class FileStorageImpl implements DataStorageInterface { data.set("nameplate", playerData.getNameplate()); try { data.save(new File(plugin.getDataFolder(), "player_data" + File.separator + playerData.getUuid() + ".yml")); - } - catch (IOException e) { + } catch (IOException e) { e.printStackTrace(); } } diff --git a/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java b/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java index c5e3a62..11f1c30 100644 --- a/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java +++ b/src/main/java/net/momirealms/customnameplates/data/SqlConnection.java @@ -82,7 +82,6 @@ public class SqlConnection { hikariConfig.addDataSourceProperty(property, config.getString(storageMode + ".properties." + property)); } } - try { hikariDataSource = new HikariDataSource(hikariConfig); } catch (HikariPool.PoolInitializationException e) { diff --git a/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java b/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java index 4298f1d..ea1ee31 100644 --- a/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java +++ b/src/main/java/net/momirealms/customnameplates/helper/VersionHelper.java @@ -33,6 +33,7 @@ public class VersionHelper { private boolean isNewerThan1_19_R2; private boolean isNewerThan1_19; + private boolean isNewerThan1_20; private String serverVersion; private final CustomNameplates plugin; private final String pluginVersion; @@ -55,6 +56,7 @@ public class VersionHelper { else if (main_ver == 19) isNewerThan1_19_R2 = Integer.parseInt(split[2].substring(1)) >= 2; else isNewerThan1_19_R2 = false; isNewerThan1_19 = main_ver >= 19; + isNewerThan1_20 = main_ver >= 20; } } @@ -66,6 +68,10 @@ public class VersionHelper { return isNewerThan1_19; } + public boolean isVersionNewerThan1_20() { + return isNewerThan1_20; + } + public void checkUpdate() { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { try { @@ -102,6 +108,9 @@ public class VersionHelper { private int getPack_format(String version) { switch (version) { + case "v1_20_R1" -> { + return 15; + } case "v1_19_R3" -> { return 13; } diff --git a/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java b/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java index cfa4bd6..0e73c5d 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/EntityTagListener.java @@ -17,21 +17,21 @@ package net.momirealms.customnameplates.listener; -import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; +import net.momirealms.customnameplates.object.carrier.NamedEntityCarrier; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; -public record EntityTagListener(EntityTag entityTag) implements Listener { +public record EntityTagListener(NamedEntityCarrier namedEntityCarrier) implements Listener { @EventHandler public void onSneak(PlayerToggleSneakEvent event) { - entityTag.onSneak(event.getPlayer(), event.isSneaking()); + namedEntityCarrier.onSneak(event.getPlayer(), event.isSneaking()); } @EventHandler public void onRespawn(PlayerRespawnEvent event) { - entityTag.onRespawn(event.getPlayer()); + namedEntityCarrier.onRespawn(event.getPlayer()); } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/listener/compatibility/MagicCosmeticsListener.java b/src/main/java/net/momirealms/customnameplates/listener/compatibility/MagicCosmeticsListener.java index 53b1fb4..37b474c 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/compatibility/MagicCosmeticsListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/compatibility/MagicCosmeticsListener.java @@ -2,23 +2,23 @@ package net.momirealms.customnameplates.listener.compatibility; import com.francobm.magicosmetics.api.Cosmetic; import com.francobm.magicosmetics.api.CosmeticType; -import com.francobm.magicosmetics.api.MagicAPI; import com.francobm.magicosmetics.cache.cosmetics.Hat; import com.francobm.magicosmetics.events.CosmeticChangeEquipEvent; import com.francobm.magicosmetics.events.CosmeticEquipEvent; import com.francobm.magicosmetics.events.CosmeticUnEquipEvent; -import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; -import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; +import com.francobm.magicosmetics.events.PlayerDataLoadEvent; +import net.momirealms.customnameplates.object.carrier.NamedEntityManager; +import net.momirealms.customnameplates.object.carrier.NamedEntityCarrier; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; public class MagicCosmeticsListener implements Listener { - private final EntityTag entityTag; + private final NamedEntityCarrier namedEntityCarrier; - public MagicCosmeticsListener(EntityTag entityTag) { - this.entityTag = entityTag; + public MagicCosmeticsListener(NamedEntityCarrier namedEntityCarrier) { + this.namedEntityCarrier = namedEntityCarrier; } @EventHandler @@ -26,7 +26,7 @@ public class MagicCosmeticsListener implements Listener { final Cosmetic cosmetic = event.getNewCosmetic(); final Player player = event.getPlayer(); if (cosmetic instanceof Hat hat) { - ArmorStandManager asm = entityTag.getArmorStandManager(player); + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player); if (asm != null) { asm.setHatOffset(hat.getOffSetY()); } @@ -38,7 +38,7 @@ public class MagicCosmeticsListener implements Listener { final Cosmetic cosmetic = event.getCosmetic(); final Player player = event.getPlayer(); if (cosmetic instanceof Hat hat) { - ArmorStandManager asm = entityTag.getArmorStandManager(player); + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player); if (asm != null) { asm.setHatOffset(hat.getOffSetY()); } @@ -49,15 +49,22 @@ public class MagicCosmeticsListener implements Listener { public void onUnEquip(CosmeticUnEquipEvent event) { final Player player = event.getPlayer(); if (event.getCosmeticType() == CosmeticType.HAT) { - ArmorStandManager asm = entityTag.getArmorStandManager(player); + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player); if (asm != null) { asm.setHatOffset(0); } } } - //TODO Lack an event - public void onJoin(Player player) { - + @EventHandler + public void onDataLoaded(PlayerDataLoadEvent event) { + for (Cosmetic cosmetic : event.getEquippedCosmetics()) { + if (cosmetic instanceof Hat hat) { + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(event.getPlayerData().getOfflinePlayer().getPlayer()); + if (asm != null) { + asm.setHatOffset(hat.getOffSetY()); + } + } + } } } 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 8045a45..9936175 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityDestroyListener.java @@ -23,13 +23,13 @@ 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.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; public class EntityDestroyListener extends PacketAdapter { - private final PacketsHandler handler; + private final AbstractPacketsHandler handler; - public EntityDestroyListener(PacketsHandler handler) { + public EntityDestroyListener(AbstractPacketsHandler handler) { 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 475cf13..7414f41 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityLookListener.java @@ -23,13 +23,13 @@ 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.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; public class EntityLookListener extends PacketAdapter { - private final PacketsHandler handler; + private final AbstractPacketsHandler handler; - public EntityLookListener(PacketsHandler handler) { + public EntityLookListener(AbstractPacketsHandler handler) { 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/EntityMoveListener.java b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java index 20a6676..dcfa780 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityMoveListener.java @@ -23,13 +23,13 @@ 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.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; public class EntityMoveListener extends PacketAdapter { - private final PacketsHandler handler; + private final AbstractPacketsHandler handler; - public EntityMoveListener(PacketsHandler handler) { + public EntityMoveListener(AbstractPacketsHandler handler) { 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 c8f8c03..9d9aec8 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntitySpawnListener.java @@ -22,13 +22,13 @@ 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.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; public class EntitySpawnListener extends PacketAdapter { - private final PacketsHandler handler; + private final AbstractPacketsHandler handler; - public EntitySpawnListener(PacketsHandler handler) { + public EntitySpawnListener(AbstractPacketsHandler handler) { 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 2df3cea..6a6d7ea 100644 --- a/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java +++ b/src/main/java/net/momirealms/customnameplates/listener/packet/EntityTeleportListener.java @@ -23,13 +23,13 @@ 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.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; public class EntityTeleportListener extends PacketAdapter { - private final PacketsHandler handler; + private final AbstractPacketsHandler handler; - public EntityTeleportListener(PacketsHandler handler) { + public EntityTeleportListener(AbstractPacketsHandler handler) { super(CustomNameplates.getInstance(), ListenerPriority.HIGHEST, PacketType.Play.Server.ENTITY_TELEPORT); this.handler = handler; } diff --git a/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java b/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java index 80d750f..d92636e 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/BossBarManager.java @@ -34,6 +34,7 @@ import org.bukkit.event.HandlerList; import java.io.File; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -89,8 +90,8 @@ public class BossBarManager extends Function { 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()), + Overlay.valueOf(bossBarSection.getString("overlay","progress").toUpperCase(Locale.ENGLISH)), + BarColor.valueOf(bossBarSection.getString("color","white").toUpperCase(Locale.ENGLISH)), bossBarSection.getInt("switch-interval", 5) * 20, ConfigUtils.getRequirements(bossBarSection.getConfigurationSection("conditions")) )); diff --git a/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java b/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java index 9ba3058..782bf17 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ChatBubblesManager.java @@ -22,20 +22,19 @@ 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.listener.AbstractChatListener; -import net.momirealms.customnameplates.listener.AsyncChatListener; -import net.momirealms.customnameplates.listener.TrChatListener; -import net.momirealms.customnameplates.listener.VentureChatListener; +import net.momirealms.customnameplates.listener.*; +import net.momirealms.customnameplates.object.DisplayMode; +import net.momirealms.customnameplates.object.Function; 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.carrier.NamedEntityManager; +import net.momirealms.customnameplates.object.carrier.NamedEntityImpl; 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.carrier.TextDisplayMeta; +import net.momirealms.customnameplates.object.img.ImageParser; +import net.momirealms.customnameplates.object.img.ItemsAdderImageImpl; +import net.momirealms.customnameplates.object.img.OraxenImageImpl; import net.momirealms.customnameplates.object.font.OffsetFont; -import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; +import net.momirealms.customnameplates.object.carrier.NamedEntityCarrier; import net.momirealms.customnameplates.utils.AdventureUtils; import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; @@ -51,13 +50,19 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.Locale; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -public class ChatBubblesManager extends EntityTag { +public class ChatBubblesManager extends Function { private AbstractChatListener chatListener; private ImageParser imageParser; + private final ConcurrentHashMap coolDownMap; + private final HashMap bubbleConfigMap; + private final CustomNameplates plugin; + private NamedEntityCarrier namedEntityCarrier; + private final JoinQuitListener joinQuitListener; private String defaultBubble; private String defaultStartFormat; private String defaultEndFormat; @@ -70,25 +75,13 @@ public class ChatBubblesManager extends EntityTag { private int maxCharLength; private int lengthPerLine; private String[] channels; - private final ConcurrentHashMap coolDownMap; - private final HashMap bubbleConfigMap; - private final CustomNameplates plugin; + private TextDisplayMeta textDisplayMeta; public ChatBubblesManager(CustomNameplates plugin) { - super(plugin); this.plugin = plugin; this.bubbleConfigMap = new HashMap<>(); this.coolDownMap = new ConcurrentHashMap<>(); - super.handler = new BBPacketsHandle(this); - } - - @Override - public void loadToAllPlayers() { - for (Player all : Bukkit.getOnlinePlayers()) { - createArmorStandManager(all); - for (Player player : Bukkit.getOnlinePlayers()) - spawnArmorStands(player, all); - } + this.joinQuitListener = new JoinQuitListener(this); } @Override @@ -99,6 +92,7 @@ public class ChatBubblesManager extends EntityTag { this.loadBubbles(); this.registerListener(); this.registerImageParser(); + this.namedEntityCarrier.load(); } @Override @@ -108,31 +102,35 @@ public class ChatBubblesManager extends EntityTag { this.bubbleConfigMap.clear(); this.coolDownMap.clear(); if (chatListener != null) HandlerList.unregisterAll(chatListener); + if (joinQuitListener != null) HandlerList.unregisterAll(joinQuitListener); + if (namedEntityCarrier != null) namedEntityCarrier.unload(); } private void loadConfig() { YamlConfiguration config = ConfigUtils.getConfig("configs" + File.separator + "bubble.yml"); - defaultBubble = config.getString("default-bubbles", "none"); + DisplayMode displayMode = DisplayMode.valueOf(config.getString("mode", "ARMOR_STAND").toUpperCase(Locale.ENGLISH)); + defaultBubble = config.getString("default-bubbles", "chat"); prefix = config.getString("text-prefix", ""); suffix = config.getString("text-suffix", ""); lineSpace = config.getDouble("line-spacing"); defaultStartFormat = config.getString("default-format.start", ""); defaultEndFormat = config.getString("default-format.end", ""); - yOffset = config.getDouble("bottom-line-Y-offset"); + yOffset = config.getDouble("bottom-line-Y-offset") + (displayMode == DisplayMode.TEXT_DISPLAY ? 1.2 : 0); 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); + textDisplayMeta = ConfigUtils.getTextDisplayMeta(config.getConfigurationSection("text-display-options")); + namedEntityCarrier = new NamedEntityCarrier(plugin, displayMode, new HashMap<>()); } private void registerImageParser() { PluginManager pluginManager = Bukkit.getPluginManager(); if (pluginManager.isPluginEnabled("Oraxen")) { - this.imageParser = new OraxenImpl(); - } - else if (pluginManager.isPluginEnabled("ItemsAdder")) { - this.imageParser = new ItemsAdderImpl(); + this.imageParser = new OraxenImageImpl(); + } else if (pluginManager.isPluginEnabled("ItemsAdder")) { + this.imageParser = new ItemsAdderImageImpl(); } } @@ -146,6 +144,7 @@ public class ChatBubblesManager extends EntityTag { this.chatListener = new AsyncChatListener(this); } pluginManager.registerEvents(chatListener, plugin); + pluginManager.registerEvents(joinQuitListener, plugin); } private void loadBubbles() { @@ -202,21 +201,11 @@ public class ChatBubblesManager extends EntityTag { } } - @Override - public void onJoin(Player player) { - super.onJoin(player); - } - @Override public void onQuit(Player player) { - super.onQuit(player); coolDownMap.remove(player); } - public void init(Player player) { - createArmorStandManager(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; @@ -232,14 +221,12 @@ public class ChatBubblesManager extends EntityTag { int mid_amount; if (totalWidth - 1 <= bubble.tail().getWidth() ) { mid_amount = -1; - } - else { + } else { mid_amount = (totalWidth - 1 - bubble.tail().getWidth()) / (bubble.middle().getWidth()); } if (mid_amount == -1) { stringBuilder.append(bubble.tail().getChars()).append(OffsetFont.NEG_1.getCharacter()); - } - else if (mid_amount == 0) { + } else if (mid_amount == 0) { stringBuilder.append(bubble.tail().getChars()).append(OffsetFont.NEG_1.getCharacter()); stringBuilder.append( plugin.getFontManager().getShortestNegChars( @@ -247,8 +234,7 @@ public class ChatBubblesManager extends EntityTag { ) ); stringBuilder.append(bubble.middle().getChars()).append(OffsetFont.NEG_1.getCharacter()); - } - else { + } else { stringBuilder.append(bubble.middle().getChars()).append(OffsetFont.NEG_1.getCharacter()); for (int i = 0; i < mid_amount; i++) { if (i == mid_amount / 2) stringBuilder.append(bubble.tail().getChars()).append(OffsetFont.NEG_1.getCharacter()); @@ -295,8 +281,7 @@ public class ChatBubblesManager extends EntityTag { 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 { + } else { String parsedPrefix = PlaceholderAPI.setPlaceholders(player, prefix); String parsedSuffix = PlaceholderAPI.setPlaceholders(player, suffix); String strippedPrefix = AdventureUtils.stripAllTags(parsedPrefix); @@ -307,10 +292,22 @@ public class ChatBubblesManager extends EntityTag { String finalStr = ConfigManager.surroundWithFont(bubbleImage) + bubbleConfig.startFormat() + parsedPrefix + text + parsedSuffix + bubbleConfig.endFormat() + ConfigManager.surroundWithFont(suffixImage); json = GsonComponentSerializer.gson().serialize(MiniMessage.miniMessage().deserialize(finalStr)); } + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player); - ArmorStandManager asm = getArmorStandManager(player); if (asm != null) { - asm.addBubble(UUID.randomUUID(), new FakeArmorStand(asm, player, json, yOffset), stayTime, lineSpace); + double offset = yOffset; + DisplayMode nameplateMode = plugin.getNameplateManager().getMode(); + if (nameplateMode == DisplayMode.ARMOR_STAND || nameplateMode == DisplayMode.TEXT_DISPLAY) { + NamedEntityCarrier carrier = (NamedEntityCarrier) plugin.getNameplateManager().getTextCarrier(); + NamedEntityManager nem = carrier.getNamedEntityManager(player); + if (nem != null) { + offset += nem.getHighestTextHeight(); + } + } + UUID uuid = UUID.randomUUID(); + asm.ascent(lineSpace); + asm.addNamedEntity(uuid, new NamedEntityImpl(asm, player, json, offset, textDisplayMeta)); + Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), () -> asm.removeArmorStand(uuid), stayTime * 20L); } } @@ -328,11 +325,6 @@ public class ChatBubblesManager extends EntityTag { return result; } - @Override - public void arrangeRefreshTask() { - - } - @Nullable public BubbleConfig getBubble(String bubble) { return bubbleConfigMap.get(bubble); diff --git a/src/main/java/net/momirealms/customnameplates/manager/DataManager.java b/src/main/java/net/momirealms/customnameplates/manager/DataManager.java index 17869c7..6ef8c36 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/DataManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/DataManager.java @@ -21,7 +21,7 @@ import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.data.*; import net.momirealms.customnameplates.listener.JoinQuitListener; import net.momirealms.customnameplates.object.Function; -import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.utils.ConfigUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/net/momirealms/customnameplates/manager/FontManager.java b/src/main/java/net/momirealms/customnameplates/manager/FontManager.java index 6abf2a3..48c7f6d 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/FontManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/FontManager.java @@ -94,11 +94,8 @@ public class FontManager extends Function { saveResource("unicodes" + File.separator + "unicode_page_" + String.format("%02x", i) + ".png"); } } - File template_file = new File(plugin.getDataFolder(), "templates"); - if (!template_file.exists()) { - plugin.saveResource("templates" + File.separator + "default.json", false); - plugin.saveResource("templates" + File.separator + "unicode.json", false); - } + plugin.saveResource("templates" + File.separator + "default.json", true); + plugin.saveResource("templates" + File.separator + "unicode.json", true); } public String getSuffixStringWithFont(String text) { diff --git a/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java b/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java index 633fbae..9832317 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/NameplateManager.java @@ -22,15 +22,10 @@ import net.momirealms.customnameplates.api.CustomNameplatesAPI; 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.carrier.*; 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.DisableNameplate; -import net.momirealms.customnameplates.object.nameplate.mode.DisplayMode; -import net.momirealms.customnameplates.object.nameplate.mode.EntityTag; -import net.momirealms.customnameplates.object.nameplate.mode.armorstand.ArmorStandTag; -import net.momirealms.customnameplates.object.nameplate.mode.team.TeamTag; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.object.requirements.Requirement; import net.momirealms.customnameplates.utils.AdventureUtils; import net.momirealms.customnameplates.utils.ConfigUtils; @@ -54,16 +49,14 @@ public class NameplateManager extends Function { 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; + private AbstractTextCarrier textCarrier; protected HashMap previewCoolDown = new HashMap<>(); public NameplateManager(CustomNameplates plugin) { this.plugin = plugin; this.nameplateConfigMap = new HashMap<>(); - this.contentMap = new HashMap<>(); } @Override @@ -77,11 +70,10 @@ public class NameplateManager extends Function { @Override public void unload() { - if (this.nameplateTag != null) { - this.nameplateTag.unload(); - this.nameplateTag = null; + if (this.textCarrier != null) { + this.textCarrier.unload(); + this.textCarrier = null; } - this.contentMap.clear(); this.nameplateConfigMap.clear(); } @@ -130,7 +122,7 @@ public class NameplateManager extends Function { 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()); + ChatColor color = ChatColor.valueOf(Objects.requireNonNull(config.getString("color", "WHITE")).toUpperCase(Locale.ENGLISH)); nameplateConfigMap.put(key, new NameplateConfig(color, config.getString("display-name"), leftChar, middleChar, rightChar)); } AdventureUtils.consoleMessage("[CustomNameplates] Loaded " + nameplateConfigMap.size() + " nameplates"); @@ -147,36 +139,43 @@ public class NameplateManager extends Function { } private void loadMode(ConfigurationSection config) { - this.mode = DisplayMode.valueOf(config.getString("mode","Team").toUpperCase()); + this.mode = DisplayMode.valueOf(config.getString("mode","Team").toUpperCase(Locale.ENGLISH)); if (mode == DisplayMode.TEAM) { - this.nameplateTag = new TeamTag(plugin); - } - else if (mode == DisplayMode.ARMOR_STAND) { - this.nameplateTag = new ArmorStandTag(plugin); + this.textCarrier = new TeamInfoCarrier(plugin); + } else if (mode == DisplayMode.ARMOR_STAND) { + HashMap contentMap = new HashMap<>(); ConfigurationSection armorStandSection = config.getConfigurationSection("armor_stand"); if (armorStandSection != null) { - for (String key :armorStandSection.getKeys(false)) { + 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); + contentMap.put(new ConditionalText(requirements, text, null), offset); } } + this.textCarrier = new NamedEntityCarrier(plugin, mode, contentMap); } else if (mode == DisplayMode.TEXT_DISPLAY) { - + HashMap contentMap = new HashMap<>(); + ConfigurationSection textDisplaySection = config.getConfigurationSection("text_display"); + if (textDisplaySection != null) { + for (String key :textDisplaySection.getKeys(false)) { + String text = textDisplaySection.getString(key + ".text"); + double offset = textDisplaySection.getDouble(key + ".vertical-offset") + 1.2; + Requirement[] requirements = ConfigUtils.getRequirements(textDisplaySection.getConfigurationSection(key + ".conditions")); + TextDisplayMeta textDisplayMeta = ConfigUtils.getTextDisplayMeta(textDisplaySection.getConfigurationSection("options")); + contentMap.put(new ConditionalText(requirements, text, textDisplayMeta), offset); + } + } + this.textCarrier = new NamedEntityCarrier(plugin, mode, contentMap); } else if (mode == DisplayMode.DISABLE) { - this.nameplateTag = new DisableNameplate(plugin); + this.textCarrier = new DisableNameplate(plugin); } plugin.getTeamManager().setTeamPacketInterface(); - if (this.nameplateTag != null) { - this.nameplateTag.load(); + if (this.textCarrier != null) { + this.textCarrier.load(); } } - public HashMap getContentMap() { - return contentMap; - } - public String getNameplatePrefixWithFont(String text, NameplateConfig nameplate) { return ConfigManager.surroundWithFont(getNameplatePrefix(text, nameplate)); } @@ -230,8 +229,8 @@ public class NameplateManager extends Function { } public void showPlayerArmorStandTags(Player player) { - EntityTag entityTag = (EntityTag) this.getNameplateTag(); - ArmorStandManager asm = entityTag.getArmorStandManager(player); + NamedEntityCarrier namedEntityCarrier = (NamedEntityCarrier) this.getTextCarrier(); + NamedEntityManager asm = namedEntityCarrier.getNamedEntityManager(player); asm.spawn(player); for (int i = 0; i < this.getPreview_time() * 20; i++) { Bukkit.getScheduler().runTaskLater(CustomNameplates.getInstance(), ()-> { @@ -260,8 +259,8 @@ public class NameplateManager extends Function { return nameplateConfigMap.containsKey(nameplate); } - public AbstractNameplateTag getNameplateTag() { - return nameplateTag; + public AbstractTextCarrier getTextCarrier() { + return textCarrier; } public HashMap getNameplateConfigMap() { @@ -296,7 +295,7 @@ public class NameplateManager extends Function { return nameplateConfigMap.get(nameplate); } - public String getPlayer_name_papi() { + public String getPlayerNamePapi() { return player_name_papi; } diff --git a/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java b/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java index c852561..96fe7d0 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/PlaceholderManager.java @@ -21,7 +21,7 @@ import me.clip.placeholderapi.PlaceholderAPI; 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.placeholders.StaticText; import net.momirealms.customnameplates.object.font.OffsetFont; import net.momirealms.customnameplates.object.placeholders.*; import net.momirealms.customnameplates.utils.ConfigUtils; @@ -29,10 +29,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,8 +46,10 @@ public class PlaceholderManager extends Function { private final HashMap descentUnicodeMap; private final HashMap conditionalTextsMap; private final HashMap vanillaHudMap; + private CustomNameplates plugin; public PlaceholderManager(CustomNameplates plugin) { + this.plugin = plugin; this.nameplatePlaceholders = new NameplatePlaceholders(plugin, this); this.descent_fonts = new HashSet<>(); this.descent_unicode_fonts = new HashSet<>(); @@ -106,11 +105,6 @@ public class PlaceholderManager extends Function { loadDescentText(descentSection); } - ConfigurationSection descentUnicodeSection = config.getConfigurationSection("descent-unicode"); - if (descentUnicodeSection != null) { - loadDescentUnicode(descentUnicodeSection); - } - ConfigurationSection conditionalSection = config.getConfigurationSection("conditional-text"); if (conditionalSection != null) { loadConditionalText(conditionalSection); @@ -120,6 +114,15 @@ public class PlaceholderManager extends Function { if (vanillaHudSection != null) { loadVanillaHud(vanillaHudSection); } + + if (plugin.getVersionHelper().isVersionNewerThan1_20()) { + return; + } + + ConfigurationSection descentUnicodeSection = config.getConfigurationSection("descent-unicode"); + if (descentUnicodeSection != null) { + loadDescentUnicode(descentUnicodeSection); + } } private void loadVanillaHud(ConfigurationSection section) { @@ -129,7 +132,8 @@ public class PlaceholderManager extends Function { 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") + section.getString(key + ".placeholder.max-value"), + section.getBoolean(key + ".reverse", true) )); } } @@ -142,7 +146,8 @@ public class PlaceholderManager extends Function { for (String priority : innerSection.getKeys(false)) { ConditionalText conditionalText = new ConditionalText( ConfigUtils.getRequirements(innerSection.getConfigurationSection(priority + ".conditions")), - innerSection.getString(priority + ".text") + innerSection.getString(priority + ".text"), + null ); conditionalTexts.add(conditionalText); } @@ -167,7 +172,7 @@ public class PlaceholderManager extends Function { private void loadStaticText(ConfigurationSection section) { for (String key : section.getKeys(false)) { - stringStaticTextMap.put(key, new StaticText(section.getString(key + ".text"), section.getInt(key + ".value"), StaticText.StaticState.valueOf(section.getString(key + ".position", "left").toUpperCase()))); + stringStaticTextMap.put(key, new StaticText(section.getString(key + ".text"), section.getInt(key + ".value"), StaticText.StaticState.valueOf(section.getString(key + ".position", "left").toUpperCase(Locale.ENGLISH)))); } } diff --git a/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java b/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java index c1f9d0b..fcce739 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/ResourceManager.java @@ -17,9 +17,8 @@ package net.momirealms.customnameplates.manager; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; +import com.google.gson.*; +import com.google.gson.stream.JsonReader; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.object.SimpleChar; import net.momirealms.customnameplates.object.background.BackGroundConfig; @@ -147,8 +146,7 @@ public class ResourceManager { 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 + ConfigManager.backgrounds_folder_path.replace("\\", File.separator) + simpleChar.getFile())); - } - catch (IOException e){ + } catch (IOException e){ AdventureUtils.consoleMessage("[CustomNameplates] Error! Failed to copy backgrounds to resource pack."); } } @@ -210,17 +208,40 @@ public class ResourceManager { } catch (IOException e) { e.printStackTrace(); } + File outPut = new File(plugin.getDataFolder(), + "ResourcePack" + + File.separator + "assets" + + File.separator + ConfigManager.namespace + + File.separator + "font" + + File.separator + "ascent_" + ascent + ".json"); try (BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(new File(plugin.getDataFolder(), - "ResourcePack" + - File.separator + "assets" + - File.separator + ConfigManager.namespace + - File.separator + "font" + - File.separator + "ascent_" + ascent + ".json")), StandardCharsets.UTF_8))) { + new OutputStreamWriter(new FileOutputStream(outPut), StandardCharsets.UTF_8))) { writer.write(sb.toString().replace("\\\\", "\\").replace("%ascent%", String.valueOf(ascent))); } catch (IOException e) { e.printStackTrace(); } + if (!plugin.getVersionHelper().isVersionNewerThan1_20()) { + try { + JsonElement jsonElement = JsonParser.parseReader(new JsonReader(new FileReader(outPut))); + if (jsonElement.isJsonObject()) { + JsonObject jsonObject = new JsonObject(); + jsonObject.add("type", new JsonPrimitive("legacy_unicode")); + jsonObject.add("sizes", new JsonPrimitive("minecraft:font/glyph_sizes.bin")); + jsonObject.add("template", new JsonPrimitive("minecraft:font/unicode_page_%s.png")); + jsonElement.getAsJsonObject().getAsJsonArray("providers").add(jsonObject); + } + try (FileWriter fileWriter = new FileWriter(outPut)) + { + fileWriter.write(jsonElement.toString().replace("\\\\", "\\")); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + if (plugin.getVersionHelper().isVersionNewerThan1_20()) { + AdventureUtils.consoleMessage("[CustomNameplates] For the moment decent unicode is not available on 1.20"); + return; } for (int ascent : plugin.getPlaceholderManager().getDescent_unicode_fonts()) { String line; diff --git a/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java b/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java index 7f4bf14..7acc075 100644 --- a/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java +++ b/src/main/java/net/momirealms/customnameplates/manager/TeamManager.java @@ -21,7 +21,7 @@ import net.momirealms.customnameplates.CustomNameplates; 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.DisplayMode; import net.momirealms.customnameplates.object.team.TeamNameInterface; import net.momirealms.customnameplates.object.team.TeamPacketInterface; import net.momirealms.customnameplates.object.team.name.PlayerNameTeamImpl; @@ -85,7 +85,7 @@ public class TeamManager extends Function { public void setTeamPacketInterface() { if (plugin.getNameplateManager().getMode() == DisplayMode.TEAM) { teamPacketInterface = new TeamInfoImpl(this); - } else if (plugin.getNameplateManager().getMode() == DisplayMode.ARMOR_STAND) { + } else if (plugin.getNameplateManager().getMode() == DisplayMode.ARMOR_STAND || plugin.getNameplateManager().getMode() == DisplayMode.TEXT_DISPLAY) { teamPacketInterface = new TeamVisibilityImpl(this); } } diff --git a/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java b/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java index 7852ea4..b2c3d2d 100644 --- a/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java +++ b/src/main/java/net/momirealms/customnameplates/object/ConditionalText.java @@ -17,8 +17,9 @@ package net.momirealms.customnameplates.object; +import net.momirealms.customnameplates.object.carrier.TextDisplayMeta; import net.momirealms.customnameplates.object.requirements.Requirement; -public record ConditionalText(Requirement[] requirements, String text) { +public record ConditionalText(Requirement[] requirements, String text, TextDisplayMeta textDisplayMeta) { } diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java b/src/main/java/net/momirealms/customnameplates/object/DisplayMode.java similarity index 92% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java rename to src/main/java/net/momirealms/customnameplates/object/DisplayMode.java index 3d34c42..954d01b 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisplayMode.java +++ b/src/main/java/net/momirealms/customnameplates/object/DisplayMode.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode; +package net.momirealms.customnameplates.object; public enum DisplayMode { TEAM, diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java b/src/main/java/net/momirealms/customnameplates/object/carrier/AbstractPacketsHandler.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/AbstractPacketsHandler.java index fb34e28..08ba6b7 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/PacketsHandler.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/AbstractPacketsHandler.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.object.Function; import org.bukkit.Bukkit; @@ -24,7 +24,7 @@ import org.bukkit.entity.Player; import java.util.List; import java.util.concurrent.ConcurrentHashMap; -public abstract class PacketsHandler extends Function { +public abstract class AbstractPacketsHandler extends Function { protected ConcurrentHashMap entityIdMap = new ConcurrentHashMap<>(); diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java b/src/main/java/net/momirealms/customnameplates/object/carrier/AbstractTextCarrier.java similarity index 82% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/AbstractTextCarrier.java index 5087f0e..12be371 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/AbstractNameplateTag.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/AbstractTextCarrier.java @@ -15,24 +15,27 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.JoinQuitListener; import net.momirealms.customnameplates.manager.TeamManager; +import net.momirealms.customnameplates.object.DisplayMode; 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 { +public abstract class AbstractTextCarrier extends Function { protected BukkitTask refreshTask; protected CustomNameplates plugin; protected JoinQuitListener joinQuitListener; + protected DisplayMode displayMode; - public AbstractNameplateTag(CustomNameplates plugin) { + public AbstractTextCarrier(CustomNameplates plugin, DisplayMode displayMode) { + this.displayMode = displayMode; this.plugin = plugin; this.joinQuitListener = new JoinQuitListener(this); } @@ -50,16 +53,6 @@ public abstract class AbstractNameplateTag extends Function { HandlerList.unregisterAll(joinQuitListener); } - @Override - public void onJoin(Player player) { - - } - - @Override - public void onQuit(Player player) { - - } - public void arrangeRefreshTask() { //child } @@ -71,4 +64,8 @@ public abstract class AbstractNameplateTag extends Function { teamManager.sendUpdateToOne(player); } } + + public DisplayMode getDisplayMode() { + return displayMode; + } } diff --git a/src/main/java/net/momirealms/customnameplates/object/carrier/DisableNameplate.java b/src/main/java/net/momirealms/customnameplates/object/carrier/DisableNameplate.java new file mode 100644 index 0000000..95b2fdf --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/DisableNameplate.java @@ -0,0 +1,26 @@ +package net.momirealms.customnameplates.object.carrier; + +import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.DisplayMode; + +public class DisableNameplate extends AbstractTextCarrier { + + public DisableNameplate(CustomNameplates plugin) { + super(plugin, DisplayMode.DISABLE); + } + + @Override + public void load() { + + } + + @Override + public void unload() { + + } + + @Override + public void loadToAllPlayers() { + + } +} diff --git a/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntity.java b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntity.java new file mode 100644 index 0000000..1f01b56 --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntity.java @@ -0,0 +1,37 @@ +package net.momirealms.customnameplates.object.carrier; + +import net.momirealms.customnameplates.object.DynamicText; +import org.bukkit.entity.Player; + +public interface NamedEntity { + + void refresh(); + + boolean canShow(); + + boolean isShown(); + + void destroy(); + + void destroy(Player viewer); + + void spawn(); + + void spawn(Player viewer); + + void teleport(); + + void teleport(Player viewer); + + void setSneak(boolean sneaking, boolean respawn); + + void respawn(Player viewer); + + double getOffset(); + + void setOffset(double v); + + DynamicText getDynamicText(); + + int getEntityId(); +} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityCarrier.java similarity index 54% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityCarrier.java index b981744..2a4c37c 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/EntityTag.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityCarrier.java @@ -15,31 +15,38 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.EntityTagListener; import net.momirealms.customnameplates.listener.compatibility.MagicCosmeticsListener; -import net.momirealms.customnameplates.object.armorstand.ArmorStandManager; +import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.DisplayMode; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; -public abstract class EntityTag extends AbstractNameplateTag { - - protected final ConcurrentHashMap armorStandManagerMap = new ConcurrentHashMap<>(); +public class NamedEntityCarrier extends AbstractTextCarrier { + protected final ConcurrentHashMap namedEntityManagerMap = new ConcurrentHashMap<>(); protected EntityTagListener entityTagListener; - protected PacketsHandler handler; + protected AbstractPacketsHandler handler; protected MagicCosmeticsListener magicCosmeticsListener; + private final VehicleChecker vehicleChecker; + private final HashMap persistentText; - protected EntityTag(CustomNameplates plugin) { - super(plugin); + public NamedEntityCarrier(CustomNameplates plugin, DisplayMode displayMode, @NotNull HashMap persistentText) { + super(plugin, displayMode); + this.vehicleChecker = new VehicleChecker(this); this.entityTagListener = new EntityTagListener(this); + this.persistentText = persistentText; + this.handler = new NamedEntityPacketsHandler(this); if (Bukkit.getPluginManager().getPlugin("MagicCosmetics") != null) { this.magicCosmeticsListener = new MagicCosmeticsListener(this); } @@ -49,6 +56,7 @@ public abstract class EntityTag extends AbstractNameplateTag { public void load(){ super.load(); handler.load(); + this.vehicleChecker.load(); Bukkit.getPluginManager().registerEvents(entityTagListener, CustomNameplates.getInstance()); if (magicCosmeticsListener != null) Bukkit.getPluginManager().registerEvents(magicCosmeticsListener, CustomNameplates.getInstance()); } @@ -57,60 +65,75 @@ public abstract class EntityTag extends AbstractNameplateTag { public void unload(){ super.unload(); handler.unload(); - for (ArmorStandManager asm : armorStandManagerMap.values()) { + for (NamedEntityManager asm : namedEntityManagerMap.values()) { asm.destroy(); } - armorStandManagerMap.clear(); + namedEntityManagerMap.clear(); HandlerList.unregisterAll(entityTagListener); + this.vehicleChecker.unload(); if (magicCosmeticsListener != null) HandlerList.unregisterAll(magicCosmeticsListener); } @Override public void onJoin(Player player) { handler.onJoin(player); - init(player); + createNamedEntityManager(player); + for (Player viewer : Bukkit.getOnlinePlayers()) { + spawnNamedEntity(viewer, player); + spawnNamedEntity(player, viewer); + } } @Override public void onQuit(Player player) { handler.onQuit(player); - ArmorStandManager asm = armorStandManagerMap.remove(player); + NamedEntityManager asm = namedEntityManagerMap.remove(player); if (asm != null) { asm.destroy(); } } - public void init(Player player) { - + @Override + public void loadToAllPlayers() { + super.loadToAllPlayers(); + for (Player all : Bukkit.getOnlinePlayers()) { + createNamedEntityManager(all); + for (Player player : Bukkit.getOnlinePlayers()) + spawnNamedEntity(player, all); + } } - public ArmorStandManager createArmorStandManager(Player player) { - ArmorStandManager asm = new ArmorStandManager(player); - armorStandManagerMap.put(player, asm); + public NamedEntityManager createNamedEntityManager(Player player) { + NamedEntityManager asm = new NamedEntityManager(this, player); + namedEntityManagerMap.put(player, asm); return asm; } public void onSneak(Player player, boolean isSneaking) { - //child + getNamedEntityManager(player).setSneak(isSneaking, true); } public void onRespawn(Player player) { - //child + getNamedEntityManager(player).teleport(); } @Override public void arrangeRefreshTask() { - + refreshTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (NamedEntityManager asm : namedEntityManagerMap.values()) { + asm.refresh(false); + } + }, 1, 1); } - public ArmorStandManager getArmorStandManager(Player player) { - return armorStandManagerMap.get(player); + public NamedEntityManager getNamedEntityManager(Player player) { + return namedEntityManagerMap.get(player); } - protected void spawnArmorStands(Player viewer, Player target) { + protected void spawnNamedEntity(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); + NamedEntityManager asm = getNamedEntityManager(target); asm.spawn(viewer); } } @@ -120,4 +143,8 @@ public abstract class EntityTag extends AbstractNameplateTag { Location loc2 = player2.getLocation(); return Math.sqrt(Math.pow(loc1.getX()-loc2.getX(), 2) + Math.pow(loc1.getZ()-loc2.getZ(), 2)); } + + public HashMap getPersistentText() { + return persistentText; + } } diff --git a/src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityImpl.java similarity index 74% rename from src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityImpl.java index 59fd5b3..3ad9b5c 100644 --- a/src/main/java/net/momirealms/customnameplates/object/armorstand/FakeArmorStand.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.armorstand; +package net.momirealms.customnameplates.object.carrier; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; @@ -23,7 +23,10 @@ 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.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.customnameplates.CustomNameplates; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.object.DynamicText; import net.momirealms.customnameplates.object.requirements.Requirement; import org.bukkit.Location; @@ -31,12 +34,14 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Pose; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; -public class FakeArmorStand { +public class NamedEntityImpl implements NamedEntity { - private final ArmorStandManager asm; + private final NamedEntityManager asm; private final Player owner; private double yOffset; private final int entityId; @@ -46,9 +51,10 @@ public class FakeArmorStand { private String textJson; private final Requirement[] requirements; private boolean isShown; + private final TextDisplayMeta textDisplayMeta; - // nameplate - public FakeArmorStand(ArmorStandManager asm, Player owner, DynamicText text, double yOffset, Requirement[] requirements) { + //dynamic value + public NamedEntityImpl(NamedEntityManager asm, Player owner, DynamicText text, double yOffset, @NotNull Requirement[] requirements, @Nullable TextDisplayMeta textDisplayMeta) { this.asm = asm; this.entityId = new Random().nextInt(Integer.MAX_VALUE); this.owner = owner; @@ -58,10 +64,11 @@ public class FakeArmorStand { this.requirements = requirements; this.isShown = false; this.textJson = dynamicText.getLatestJson(); + this.textDisplayMeta = textDisplayMeta; } - // bubble - public FakeArmorStand(ArmorStandManager asm, Player owner, String textJson, double yOffset) { + //constant value + public NamedEntityImpl(NamedEntityManager asm, Player owner, String textJson, double yOffset, @Nullable TextDisplayMeta textDisplayMeta) { this.asm = asm; this.entityId = new Random().nextInt(Integer.MAX_VALUE); this.owner = owner; @@ -70,8 +77,10 @@ public class FakeArmorStand { this.sneaking = owner.isSneaking(); this.requirements = null; this.isShown = true; + this.textDisplayMeta = textDisplayMeta; } + @Override public boolean canShow() { if (requirements == null) return true; for (Requirement requirement : requirements) { @@ -82,16 +91,19 @@ public class FakeArmorStand { return true; } - // dynamicText would not be null because bubbles would not be updated + @Override public void refresh() { + if (dynamicText == null) return; textJson = dynamicText.getLatestJson(); updateMetadata(); } + @Override public double getOffset() { return yOffset; } + @Override public void setOffset(double offset) { if (yOffset == offset) return; yOffset = offset; @@ -100,12 +112,14 @@ public class FakeArmorStand { } } + @Override public void spawn(Player viewer) { for (PacketContainer packet : getSpawnPackets()) { CustomNameplates.getProtocolManager().sendServerPacket(viewer, packet); } } + @Override public void spawn() { for (Player all : asm.getNearbyPlayers()) { spawn(all); @@ -113,6 +127,7 @@ public class FakeArmorStand { isShown = true; } + @Override public void destroy() { PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); destroyPacket.getIntLists().write(0, List.of(entityId)); @@ -122,12 +137,14 @@ public class FakeArmorStand { isShown = false; } + @Override 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); } + @Override public void teleport() { PacketContainer packet = getTeleportPacket(); for (Player all : asm.getNearbyPlayers()) { @@ -135,6 +152,7 @@ public class FakeArmorStand { } } + @Override public void teleport(Player viewer) { if (!asm.isNearby(viewer) && viewer != owner) { asm.spawn(viewer); @@ -143,6 +161,7 @@ public class FakeArmorStand { } } + @Override public void setSneak(boolean isSneaking, boolean respawn) { this.sneaking = isSneaking; if (respawn) { @@ -155,10 +174,22 @@ public class FakeArmorStand { } } + @Override + public boolean isShown() { + return isShown; + } + + @Override + public DynamicText getDynamicText() { + return dynamicText; + } + + @Override public int getEntityId() { return entityId; } + @Override public void respawn(Player viewer) { destroy(viewer); spawn(viewer); @@ -167,7 +198,7 @@ public class FakeArmorStand { public PacketContainer getTeleportPacket() { PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); packet.getIntegers().write(0, entityId); - Location location = getArmorStandLocation(); + Location location = getEntityLocation(); packet.getDoubles().write(0, location.getX()); packet.getDoubles().write(1, location.getY()); packet.getDoubles().write(2, location.getZ()); @@ -185,17 +216,19 @@ public class FakeArmorStand { 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); + WrappedDataWatcher wrappedDataWatcher = + asm.getDisplayMode() == DisplayMode.ARMOR_STAND ? + createArmorStandDataWatcher(textJson) : createTextDisplayDataWatcher(textJson, textDisplayMeta); 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()); + metaPacket.getWatchableCollectionModifier().write(0, createArmorStandDataWatcher(textJson).getWatchableObjects()); } return metaPacket; } - public Location getArmorStandLocation() { + private Location getEntityLocation() { double x = owner.getLocation().getX(); double y = getY() + yOffset; double z = owner.getLocation().getZ(); @@ -208,7 +241,7 @@ public class FakeArmorStand { return new Location(null, x, y, z); } - protected double getY() { + private double getY() { Entity vehicle = owner.getVehicle(); if (vehicle != null) { if (vehicle.getType() == EntityType.HORSE) { @@ -230,7 +263,7 @@ public class FakeArmorStand { return owner.getLocation().getY(); } - public WrappedDataWatcher createDataWatcher(String json) { + private WrappedDataWatcher createArmorStandDataWatcher(String json) { WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); WrappedDataWatcher.Serializer serializer1 = WrappedDataWatcher.Registry.get(Boolean.class); WrappedDataWatcher.Serializer serializer2 = WrappedDataWatcher.Registry.get(Byte.class); @@ -246,24 +279,30 @@ public class FakeArmorStand { return wrappedDataWatcher; } - public PacketContainer[] getSpawnPackets() { + private WrappedDataWatcher createTextDisplayDataWatcher(String textJson, TextDisplayMeta textDisplayMeta) { + WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(22, WrappedDataWatcher.Registry.getChatComponentSerializer(false)), WrappedChatComponent.fromJson(textJson)); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(24, WrappedDataWatcher.Registry.get(Integer.class)), textDisplayMeta.backgroundColor()); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(14, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 3); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(25, WrappedDataWatcher.Registry.get(Byte.class)), textDisplayMeta.opacity()); + int mask = 0; + if (textDisplayMeta.hasShadow()) mask += 1; + if (textDisplayMeta.isSeeThrough()) mask += 2; + if (textDisplayMeta.useDefaultBackground()) mask += 4; + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(26, WrappedDataWatcher.Registry.get(Byte.class)), (byte) mask); + return wrappedDataWatcher; + } + + private 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.getEntityTypeModifier().write(0, asm.getDisplayMode() == DisplayMode.ARMOR_STAND ? EntityType.ARMOR_STAND : EntityType.TEXT_DISPLAY); + Location location = getEntityLocation(); 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/armorstand/ArmorStandManager.java b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityManager.java similarity index 52% rename from src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityManager.java index a02c024..b5eb50d 100644 --- a/src/main/java/net/momirealms/customnameplates/object/armorstand/ArmorStandManager.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityManager.java @@ -15,53 +15,54 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.armorstand; +package net.momirealms.customnameplates.object.carrier; -import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.object.ConditionalText; +import net.momirealms.customnameplates.object.DisplayMode; import net.momirealms.customnameplates.object.DynamicText; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.Vector; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; -public class ArmorStandManager { +public class NamedEntityManager { - private final ConcurrentHashMap armorStands = new ConcurrentHashMap<>(); - private FakeArmorStand[] armorStandArray; + private final ConcurrentHashMap namedEntities = new ConcurrentHashMap<>(); + private NamedEntity[] namedEntityArray; private final Vector nearbyPlayers; private Player[] nearbyPlayerArray ; private final Player owner; private double hatOffset; + private final NamedEntityCarrier namedEntityCarrier; + private double highestTextHeight; - public ArmorStandManager(Player owner) { + public NamedEntityManager(NamedEntityCarrier namedEntityCarrier, Player owner) { this.owner = owner; this.nearbyPlayers = new Vector<>(); - this.armorStandArray = new FakeArmorStand[0]; + this.namedEntityArray = new NamedEntityImpl[0]; this.nearbyPlayerArray = new Player[0]; + this.namedEntityCarrier = namedEntityCarrier; + this.init(); } - public void initNameplateArmorStands() { - Set> entries = CustomNameplates.getInstance().getNameplateManager().getContentMap().entrySet(); + public void init() { + Set> entries = namedEntityCarrier.getPersistentText().entrySet(); for (Map.Entry entry : entries) { - addArmorStand(UUID.randomUUID(), new FakeArmorStand( + addNamedEntity(UUID.randomUUID(), new NamedEntityImpl( this, owner, new DynamicText(owner, entry.getKey().text()), entry.getValue(), - entry.getKey().requirements() + entry.getKey().requirements(), + entry.getKey().textDisplayMeta() )); } } - 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 void addNamedEntity(UUID uuid, NamedEntity namedEntity) { + this.namedEntities.put(uuid, namedEntity); + this.namedEntityArray = namedEntities.values().toArray(new NamedEntity[0]); + for (Player p : nearbyPlayerArray) namedEntity.spawn(p); } public Player[] getNearbyPlayers(){ @@ -75,72 +76,71 @@ public class ArmorStandManager { public void spawn(Player viewer) { nearbyPlayers.add(viewer); nearbyPlayerArray = nearbyPlayers.toArray(new Player[0]); - for (FakeArmorStand fakeArmorStand : armorStandArray) + for (NamedEntity fakeArmorStand : namedEntityArray) if (fakeArmorStand.canShow()) fakeArmorStand.spawn(viewer); } public void refresh(boolean force) { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - fakeArmorStand.refresh(); + highestTextHeight = -2; + for (NamedEntity fakeArmorStand : namedEntityArray) { boolean canShow = fakeArmorStand.canShow(); if (!canShow) { if (fakeArmorStand.isShown()) { fakeArmorStand.destroy(); } - } - else { + } else { if (fakeArmorStand.isShown()) { - if (fakeArmorStand.getDynamicText().update() || force) + if (fakeArmorStand.getDynamicText() != null && (fakeArmorStand.getDynamicText().update() || force)) fakeArmorStand.refresh(); - } - else { + } else { fakeArmorStand.spawn(); } + highestTextHeight = Math.max(fakeArmorStand.getOffset(), highestTextHeight); } } } public void destroy() { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - fakeArmorStand.destroy(); + for (NamedEntity entity : namedEntityArray) { + entity.destroy(); } nearbyPlayers.clear(); nearbyPlayerArray = new Player[0]; } public void teleport(Player viewer) { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - if (fakeArmorStand.isShown()) - fakeArmorStand.teleport(viewer); + for (NamedEntity entity : namedEntityArray) { + if (entity.isShown()) + entity.teleport(viewer); } } public void teleport() { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - if (fakeArmorStand.isShown()) - fakeArmorStand.teleport(); + for (NamedEntity entity : namedEntityArray) { + if (entity.isShown()) + entity.teleport(); } } public void setSneak(boolean sneaking, boolean respawn) { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - if (fakeArmorStand.isShown()) - fakeArmorStand.setSneak(sneaking, respawn); + for (NamedEntity entity : namedEntityArray) { + if (entity.isShown()) + entity.setSneak(sneaking, respawn); } } public void respawn() { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - if (fakeArmorStand.isShown()) + for (NamedEntity entity : namedEntityArray) { + if (entity.isShown()) for (Player viewer : nearbyPlayerArray) - fakeArmorStand.respawn(viewer); + entity.respawn(viewer); } } public void destroy(Player viewer) { - for (FakeArmorStand fakeArmorStand : armorStandArray) { - fakeArmorStand.destroy(viewer); + for (NamedEntity entity : namedEntityArray) { + entity.destroy(viewer); } unregisterPlayer(viewer); } @@ -152,23 +152,17 @@ public class ArmorStandManager { } public void removeArmorStand(UUID uuid) { - FakeArmorStand fakeArmorStand = armorStands.remove(uuid); - if (fakeArmorStand != null) { - fakeArmorStand.destroy(); - armorStandArray = armorStands.values().toArray(new FakeArmorStand[0]); + NamedEntity entity = namedEntities.remove(uuid); + if (entity != null) { + entity.destroy(); + namedEntityArray = namedEntities.values().toArray(new NamedEntity[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(); + for (NamedEntity entity : namedEntityArray) { + entity.setOffset(entity.getOffset() + lineSpace); + entity.teleport(); } } @@ -180,4 +174,12 @@ public class ArmorStandManager { this.hatOffset = hatOffset; teleport(); } + + public DisplayMode getDisplayMode() { + return namedEntityCarrier.getDisplayMode(); + } + + public double getHighestTextHeight() { + return highestTextHeight; + } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityPacketsHandler.java similarity index 77% rename from src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityPacketsHandler.java index 5e7a05f..172c137 100644 --- a/src/main/java/net/momirealms/customnameplates/object/bubble/BBPacketsHandle.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/NamedEntityPacketsHandler.java @@ -15,28 +15,28 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.bubble; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.listener.packet.*; -import net.momirealms.customnameplates.manager.ChatBubblesManager; -import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; +import net.momirealms.customnameplates.object.carrier.NamedEntityCarrier; +import net.momirealms.customnameplates.object.carrier.AbstractPacketsHandler; import org.bukkit.entity.Player; import java.util.List; -public class BBPacketsHandle extends PacketsHandler { +public class NamedEntityPacketsHandler extends AbstractPacketsHandler { - private final ChatBubblesManager chatBubblesManager; + private final NamedEntityCarrier namedEntityCarrier; private final EntityDestroyListener entityDestroyListener; private final EntityMoveListener entityMoveListener; private final EntitySpawnListener entitySpawnListener; private final EntityTeleportListener entityTeleportListener; private final EntityLookListener entityLookListener; - public BBPacketsHandle(ChatBubblesManager chatBubblesManager) { + public NamedEntityPacketsHandler(NamedEntityCarrier namedEntityCarrier) { super(); - this.chatBubblesManager = chatBubblesManager; + this.namedEntityCarrier = namedEntityCarrier; this.entityDestroyListener = new EntityDestroyListener(this); this.entityMoveListener = new EntityMoveListener(this); this.entitySpawnListener = new EntitySpawnListener(this); @@ -66,17 +66,17 @@ public class BBPacketsHandle extends PacketsHandler { @Override public void onEntityMove(Player receiver, int entityId) { - Player mover = getPlayerFromMap(entityId); + Player mover = super.getPlayerFromMap(entityId); if (mover != null) { - chatBubblesManager.getArmorStandManager(mover).teleport(receiver); + namedEntityCarrier.getNamedEntityManager(mover).teleport(receiver); } } @Override public void onEntitySpawn(Player receiver, int entityId) { - Player spawnedPlayer = getPlayerFromMap(entityId); + Player spawnedPlayer = super.getPlayerFromMap(entityId); if (spawnedPlayer != null) { - chatBubblesManager.getArmorStandManager(spawnedPlayer).spawn(receiver); + namedEntityCarrier.getNamedEntityManager(spawnedPlayer).spawn(receiver); } } @@ -89,9 +89,9 @@ public class BBPacketsHandle extends PacketsHandler { @Override public void onEntityDestroy(Player receiver, int entity) { - Player deSpawnedPlayer = getPlayerFromMap(entity); + Player deSpawnedPlayer = super.getPlayerFromMap(entity); if (deSpawnedPlayer != null) { - chatBubblesManager.getArmorStandManager(deSpawnedPlayer).destroy(receiver); + namedEntityCarrier.getNamedEntityManager(deSpawnedPlayer).destroy(receiver); } } } diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java b/src/main/java/net/momirealms/customnameplates/object/carrier/TeamInfoCarrier.java similarity index 82% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/TeamInfoCarrier.java index 4dc3036..7709668 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/team/TeamTag.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/TeamInfoCarrier.java @@ -15,20 +15,20 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode.team; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.manager.TeamManager; -import net.momirealms.customnameplates.object.nameplate.mode.AbstractNameplateTag; +import net.momirealms.customnameplates.object.DisplayMode; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -public class TeamTag extends AbstractNameplateTag { +public class TeamInfoCarrier extends AbstractTextCarrier { private final TeamManager teamManager; - public TeamTag(CustomNameplates plugin) { - super(plugin); + public TeamInfoCarrier(CustomNameplates plugin) { + super(plugin, DisplayMode.TEAM); this.teamManager = plugin.getTeamManager(); } diff --git a/src/main/java/net/momirealms/customnameplates/object/carrier/TextDisplayMeta.java b/src/main/java/net/momirealms/customnameplates/object/carrier/TextDisplayMeta.java new file mode 100644 index 0000000..e32b1dd --- /dev/null +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/TextDisplayMeta.java @@ -0,0 +1,7 @@ +package net.momirealms.customnameplates.object.carrier; + +public record TextDisplayMeta(boolean hasShadow, boolean isSeeThrough, boolean useDefaultBackground, + int backgroundColor, byte opacity) { + + public static TextDisplayMeta defaultValue = new TextDisplayMeta(false, false, true, 0, (byte) -1); +} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java b/src/main/java/net/momirealms/customnameplates/object/carrier/VehicleChecker.java similarity index 65% rename from src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java rename to src/main/java/net/momirealms/customnameplates/object/carrier/VehicleChecker.java index 8255a2c..7d6316a 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/VehicleChecker.java +++ b/src/main/java/net/momirealms/customnameplates/object/carrier/VehicleChecker.java @@ -15,10 +15,11 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.nameplate.mode.armorstand; +package net.momirealms.customnameplates.object.carrier; import net.momirealms.customnameplates.CustomNameplates; import net.momirealms.customnameplates.object.Function; +import net.momirealms.customnameplates.object.carrier.NamedEntityCarrier; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -30,12 +31,13 @@ public class VehicleChecker extends Function { private final ConcurrentHashMap playersOnVehicle; - private final ArmorStandTag armorStandTag; + private final NamedEntityCarrier namedEntityCarrier; - private BukkitTask task; + private BukkitTask updatePosTask; + private BukkitTask vehicleCheckTask; - public VehicleChecker(ArmorStandTag armorStandTag) { - this.armorStandTag = armorStandTag; + public VehicleChecker(NamedEntityCarrier namedEntityCarrier) { + this.namedEntityCarrier = namedEntityCarrier; this.playersOnVehicle = new ConcurrentHashMap<>(); } @@ -47,17 +49,23 @@ public class VehicleChecker extends Function { playersOnVehicle.put(all, vehicle); } } - this.task = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + this.updatePosTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { for (Player inVehicle : playersOnVehicle.keySet()) { - if (!inVehicle.isOnline() || armorStandTag.getArmorStandManager(inVehicle) == null) continue; - armorStandTag.getArmorStandManager(inVehicle).teleport(); + if (!inVehicle.isOnline() || namedEntityCarrier.getNamedEntityManager(inVehicle) == null) continue; + namedEntityCarrier.getNamedEntityManager(inVehicle).teleport(); } }, 1, 1); + this.vehicleCheckTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { + for (Player player : Bukkit.getOnlinePlayers()) { + this.refresh(player); + } + },20,20); } @Override public void unload() { - this.task.cancel(); + this.updatePosTask.cancel(); + this.vehicleCheckTask.cancel(); playersOnVehicle.clear(); } @@ -73,11 +81,11 @@ public class VehicleChecker extends Function { public void refresh(Player player) { Entity vehicle = player.getVehicle(); if (playersOnVehicle.containsKey(player) && vehicle == null) { - armorStandTag.getArmorStandManager(player).teleport(); + namedEntityCarrier.getNamedEntityManager(player).teleport(); playersOnVehicle.remove(player); } if (!playersOnVehicle.containsKey(player) && vehicle != null) { - armorStandTag.getArmorStandManager(player).respawn(); + namedEntityCarrier.getNamedEntityManager(player).respawn(); playersOnVehicle.put(player, vehicle); } } diff --git a/src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java b/src/main/java/net/momirealms/customnameplates/object/img/ImageParser.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java rename to src/main/java/net/momirealms/customnameplates/object/img/ImageParser.java index edf26a8..9fa8ff8 100644 --- a/src/main/java/net/momirealms/customnameplates/object/emoji/ImageParser.java +++ b/src/main/java/net/momirealms/customnameplates/object/img/ImageParser.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.emoji; +package net.momirealms.customnameplates.object.img; import org.bukkit.entity.Player; diff --git a/src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java b/src/main/java/net/momirealms/customnameplates/object/img/ItemsAdderImageImpl.java similarity index 89% rename from src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java rename to src/main/java/net/momirealms/customnameplates/object/img/ItemsAdderImageImpl.java index 746869a..8674ec9 100644 --- a/src/main/java/net/momirealms/customnameplates/object/emoji/ItemsAdderImpl.java +++ b/src/main/java/net/momirealms/customnameplates/object/img/ItemsAdderImageImpl.java @@ -15,12 +15,12 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.emoji; +package net.momirealms.customnameplates.object.img; import dev.lone.itemsadder.api.FontImages.FontImageWrapper; import org.bukkit.entity.Player; -public class ItemsAdderImpl implements ImageParser{ +public class ItemsAdderImageImpl implements ImageParser{ @Override public String parse(Player player, String text) { diff --git a/src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java b/src/main/java/net/momirealms/customnameplates/object/img/OraxenImageImpl.java similarity index 90% rename from src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java rename to src/main/java/net/momirealms/customnameplates/object/img/OraxenImageImpl.java index a2b693a..701421c 100644 --- a/src/main/java/net/momirealms/customnameplates/object/emoji/OraxenImpl.java +++ b/src/main/java/net/momirealms/customnameplates/object/img/OraxenImageImpl.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object.emoji; +package net.momirealms.customnameplates.object.img; 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 OraxenImpl implements ImageParser{ +public class OraxenImageImpl implements ImageParser{ private final FontManager fontManager; - public OraxenImpl() { + public OraxenImageImpl() { this.fontManager = OraxenPlugin.get().getFontManager(); } diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java index 2b374ac..e907639 100644 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java +++ b/src/main/java/net/momirealms/customnameplates/object/nameplate/NameplatesTeam.java @@ -19,7 +19,6 @@ 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.CustomNameplates; import net.momirealms.customnameplates.manager.NameplateManager; import net.momirealms.customnameplates.object.DynamicText; @@ -60,10 +59,9 @@ public class NameplatesTeam { nameplate_prefix = prefix.getLatestValue(); nameplate_suffix = suffix.getLatestValue(); } - } - else { + } else { this.color = nameplateConfig.color(); - String name = PlaceholderAPI.setPlaceholders(player, nameplateManager.getPlayer_name_papi()); + String name = PlaceholderAPI.setPlaceholders(player, nameplateManager.getPlayerNamePapi()); if (updated) { nameplate = newNameplate; String text = AdventureUtils.stripAllTags(prefix.getLatestValue()) @@ -93,10 +91,10 @@ public class NameplatesTeam { } public Component getNameplatePrefixComponent() { - return MiniMessage.miniMessage().deserialize(nameplate_prefix); + return AdventureUtils.getComponentFromMiniMessage(nameplate_prefix); } public Component getNameplateSuffixComponent() { - return MiniMessage.miniMessage().deserialize(nameplate_suffix); + return AdventureUtils.getComponentFromMiniMessage(nameplate_suffix); } } \ No newline at end of file diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisableNameplate.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisableNameplate.java deleted file mode 100644 index a06c7f2..0000000 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/DisableNameplate.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.momirealms.customnameplates.object.nameplate.mode; - -import net.momirealms.customnameplates.CustomNameplates; -import org.bukkit.entity.Player; - -public class DisableNameplate extends AbstractNameplateTag { - - public DisableNameplate(CustomNameplates plugin) { - super(plugin); - } - - @Override - public void load() { - - } - - @Override - public void unload() { - - } - - @Override - public void onJoin(Player player) { - - } - - @Override - public void onQuit(Player player) { - - } - - @Override - public void arrangeRefreshTask() { - - } - - @Override - public void loadToAllPlayers() { - - } -} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java deleted file mode 100644 index b6e8c5f..0000000 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandPacketsHandler.java +++ /dev/null @@ -1,97 +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.object.nameplate.mode.armorstand; - -import net.momirealms.customnameplates.CustomNameplates; -import net.momirealms.customnameplates.listener.packet.*; -import net.momirealms.customnameplates.object.nameplate.mode.PacketsHandler; -import org.bukkit.entity.Player; - -import java.util.List; - -public class ArmorStandPacketsHandler extends PacketsHandler { - - private final ArmorStandTag armorStandTag; - - private EntityDestroyListener entityDestroyListener; - private EntityMoveListener entityMoveListener; - private EntitySpawnListener entitySpawnListener; - private EntityTeleportListener entityTeleportListener; - private EntityLookListener entityLookListener; - - protected ArmorStandPacketsHandler(ArmorStandTag armorStandTag) { - super(); - this.armorStandTag = armorStandTag; - } - - @Override - public void load() { - super.load(); - this.entityDestroyListener = new EntityDestroyListener(this); - this.entityMoveListener = new EntityMoveListener(this); - this.entitySpawnListener = new EntitySpawnListener(this); - this.entityTeleportListener = new EntityTeleportListener(this); - this.entityLookListener = new EntityLookListener(this); - 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.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 = super.getPlayerFromMap(entityId); - if (mover != null) { - armorStandTag.getArmorStandManager(mover).teleport(receiver); - } - } - - @Override - public void onEntitySpawn(Player receiver, int entityId) { - Player spawnedPlayer = super.getPlayerFromMap(entityId); - if (spawnedPlayer != null) { - armorStandTag.getArmorStandManager(spawnedPlayer).spawn(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) { - armorStandTag.getArmorStandManager(deSpawnedPlayer).destroy(receiver); - } - } -} diff --git a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java b/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java deleted file mode 100644 index 5c24a59..0000000 --- a/src/main/java/net/momirealms/customnameplates/object/nameplate/mode/armorstand/ArmorStandTag.java +++ /dev/null @@ -1,99 +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.object.nameplate.mode.armorstand; - -import net.momirealms.customnameplates.CustomNameplates; -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 ArmorStandTag extends EntityTag { - - private final VehicleChecker vehicleChecker; - private BukkitTask vehicleCheckTask; - - public ArmorStandTag(CustomNameplates plugin) { - super(plugin); - super.handler = new ArmorStandPacketsHandler(this); - this.vehicleChecker = new VehicleChecker(this); - } - - @Override - public void load() { - super.load(); - this.vehicleChecker.load(); - this.vehicleCheckTask = Bukkit.getScheduler().runTaskTimerAsynchronously(CustomNameplates.getInstance(), () -> { - for (Player player : Bukkit.getOnlinePlayers()) { - this.vehicleChecker.refresh(player); - } - },20,20); - } - - @Override - public void unload() { - super.unload(); - this.vehicleChecker.unload(); - this.vehicleCheckTask.cancel(); - } - - @Override - public void onJoin(Player player) { - super.onJoin(player); - for (Player viewer : Bukkit.getOnlinePlayers()) { - spawnArmorStands(viewer, player); - spawnArmorStands(player, viewer); - } - } - - public void init(Player player) { - ArmorStandManager asm = createArmorStandManager(player); - asm.initNameplateArmorStands(); - } - - @Override - public void loadToAllPlayers() { - super.loadToAllPlayers(); - for (Player all : Bukkit.getOnlinePlayers()) { - ArmorStandManager asm = createArmorStandManager(all); - asm.initNameplateArmorStands(); - for (Player player : Bukkit.getOnlinePlayers()) - 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); - } - - @Override - public void onRespawn(Player player) { - getArmorStandManager(player).teleport(); - } -} diff --git a/src/main/java/net/momirealms/customnameplates/object/placeholders/BackGroundText.java b/src/main/java/net/momirealms/customnameplates/object/placeholders/BackGroundText.java index 31d3664..c583a21 100644 --- a/src/main/java/net/momirealms/customnameplates/object/placeholders/BackGroundText.java +++ b/src/main/java/net/momirealms/customnameplates/object/placeholders/BackGroundText.java @@ -18,4 +18,5 @@ package net.momirealms.customnameplates.object.placeholders; public record BackGroundText(String text, String background, boolean remove_shadow) { + } diff --git a/src/main/java/net/momirealms/customnameplates/object/placeholders/DescentText.java b/src/main/java/net/momirealms/customnameplates/object/placeholders/DescentText.java index 9c6bd51..c83c109 100644 --- a/src/main/java/net/momirealms/customnameplates/object/placeholders/DescentText.java +++ b/src/main/java/net/momirealms/customnameplates/object/placeholders/DescentText.java @@ -18,4 +18,5 @@ package net.momirealms.customnameplates.object.placeholders; public record DescentText(String text, int ascent) { + } diff --git a/src/main/java/net/momirealms/customnameplates/object/placeholders/NameplatePlaceholders.java b/src/main/java/net/momirealms/customnameplates/object/placeholders/NameplatePlaceholders.java index 9a2dfd4..4ac2021 100644 --- a/src/main/java/net/momirealms/customnameplates/object/placeholders/NameplatePlaceholders.java +++ b/src/main/java/net/momirealms/customnameplates/object/placeholders/NameplatePlaceholders.java @@ -25,11 +25,9 @@ import net.momirealms.customnameplates.manager.FontManager; import net.momirealms.customnameplates.manager.NameplateManager; import net.momirealms.customnameplates.manager.PlaceholderManager; import net.momirealms.customnameplates.object.SimpleChar; -import net.momirealms.customnameplates.object.StaticText; import net.momirealms.customnameplates.object.nameplate.NameplateConfig; 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; @@ -138,24 +136,18 @@ public class NameplatePlaceholders extends PlaceholderExpansion { private String getEquipped(String param, Player player) { if (param.equals("nameplate")) { return plugin.getDataManager().getEquippedNameplate(player); - } - else if (param.equals("bubble")) { + } 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); + long time = player.getWorld().getTime(); + String ap = time >= 6000 && time < 18000 ? " PM" : " AM"; + int hours = (int) (time / 1000) + 6; int minutes = (int) ((time - hours * 1000 ) * 0.06); - hours += 6; - if (hours >= 24) hours -= 24; - if (hours >= 12) hours -= 12; + while (hours >= 12) hours -= 12; if (minutes < 10) return hours + ":0" + minutes + ap; else return hours + ":" + minutes + ap; } @@ -186,16 +178,15 @@ public class NameplatePlaceholders extends PlaceholderExpansion { int parsedWidth = fontManager.getTotalWidth(AdventureUtils.stripAllTags(parsed)); if (staticText.staticState() == StaticText.StaticState.LEFT) { return parsed + ConfigManager.surroundWithFont(fontManager.getOffset(staticText.value() - parsedWidth)); - } - else if (staticText.staticState() == StaticText.StaticState.RIGHT) { + } else if (staticText.staticState() == StaticText.StaticState.RIGHT) { return ConfigManager.surroundWithFont(fontManager.getOffset(staticText.value() - parsedWidth)) + parsed; - } - else { + } else if (staticText.staticState() == StaticText.StaticState.MIDDLE) { int half = (staticText.value() - parsedWidth) / 2; String left = ConfigManager.surroundWithFont(fontManager.getOffset(half)); String right = ConfigManager.surroundWithFont(fontManager.getOffset(staticText.value() - parsedWidth - half)); return left + parsed + right; } + return ""; } private String getBackground(String param, Player player) { @@ -222,6 +213,9 @@ public class NameplatePlaceholders extends PlaceholderExpansion { } private String getUnicodeDescent(String param, Player player) { + if (plugin.getVersionHelper().isVersionNewerThan1_20()) { + return "Not Available on 1.20"; + } DescentText descentText = placeholderManager.getDescentUnicode(param); if (descentText == null) return param + " NOT FOUND"; String parsed = PlaceholderAPI.setPlaceholders(player, descentText.text()); @@ -237,6 +231,10 @@ public class NameplatePlaceholders extends PlaceholderExpansion { 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) + ""; + if (vanillaHud.reverse()) { + return "<#FFFEFD>" + vanillaHud.empty().repeat(empty_amount) + vanillaHud.half().repeat(half_amount) + vanillaHud.full().repeat(full_amount) + ""; + } else { + return "<#FFFEFD>" + vanillaHud.full().repeat(full_amount) + vanillaHud.half().repeat(half_amount) + vanillaHud.empty().repeat(empty_amount) + ""; + } } } diff --git a/src/main/java/net/momirealms/customnameplates/object/StaticText.java b/src/main/java/net/momirealms/customnameplates/object/placeholders/StaticText.java similarity index 93% rename from src/main/java/net/momirealms/customnameplates/object/StaticText.java rename to src/main/java/net/momirealms/customnameplates/object/placeholders/StaticText.java index c360375..b9c4fac 100644 --- a/src/main/java/net/momirealms/customnameplates/object/StaticText.java +++ b/src/main/java/net/momirealms/customnameplates/object/placeholders/StaticText.java @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package net.momirealms.customnameplates.object; +package net.momirealms.customnameplates.object.placeholders; public record StaticText(String text, int value, StaticState staticState) { diff --git a/src/main/java/net/momirealms/customnameplates/object/placeholders/VanillaHud.java b/src/main/java/net/momirealms/customnameplates/object/placeholders/VanillaHud.java index 0b2c3e7..fe93097 100644 --- a/src/main/java/net/momirealms/customnameplates/object/placeholders/VanillaHud.java +++ b/src/main/java/net/momirealms/customnameplates/object/placeholders/VanillaHud.java @@ -17,5 +17,6 @@ package net.momirealms.customnameplates.object.placeholders; -public record VanillaHud(String empty, String half, String full, String papi, String max) { +public record VanillaHud(String empty, String half, String full, String papi, String max, boolean reverse) { + } diff --git a/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java b/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java index c594971..152773a 100644 --- a/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java +++ b/src/main/java/net/momirealms/customnameplates/utils/AdventureUtils.java @@ -115,8 +115,7 @@ public class AdventureUtils { } else { stringBuilder.append(chars[i]); } - } - else { + } else { stringBuilder.append(chars[i]); } } diff --git a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java index 5b46f0e..479fb95 100644 --- a/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java +++ b/src/main/java/net/momirealms/customnameplates/utils/ConfigUtils.java @@ -25,6 +25,7 @@ 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.carrier.TextDisplayMeta; import net.momirealms.customnameplates.object.requirements.*; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; @@ -92,4 +93,24 @@ public class ConfigUtils { } return requirements.toArray(new Requirement[0]); } + + public static TextDisplayMeta getTextDisplayMeta(ConfigurationSection section) { + if (section == null) return TextDisplayMeta.defaultValue; + return new TextDisplayMeta( + section.getBoolean("has-shadow", false), + section.getBoolean("is-see-through", false), + section.getBoolean("use-default-background-color", false), + ConfigUtils.rgbToDecimal(section.getString("background-color", "0,0,0,128")), + (byte) section.getInt("text-opacity") + ); + } + + public static int rgbToDecimal(String rgba) { + String[] split = rgba.split(","); + int r = Integer.parseInt(split[0]); + int g = Integer.parseInt(split[1]); + int b = Integer.parseInt(split[2]); + int a = Integer.parseInt(split[3]); + return (a << 24) | (r << 16) | (g << 8) | b; + } } diff --git a/src/main/resources/configs/bubble.yml b/src/main/resources/configs/bubble.yml index 42895c6..c754062 100644 --- a/src/main/resources/configs/bubble.yml +++ b/src/main/resources/configs/bubble.yml @@ -1,3 +1,15 @@ +# Armor_Stand / Text_Display (1.19.4+) +mode: Text_Display + +# Text display options +text-display-options: + # RGBA + background-color: 0,0,0,0 + has-shadow: false + is-see-through: false + use-default-background-color: false + text-opacity: -1 + # blacklist channels # 黑名单聊天频道 blacklist-channels: @@ -6,7 +18,7 @@ blacklist-channels: # Player's default chatting bubbles # 玩家默认聊天气泡 -default-bubbles: 'none' +default-bubbles: 'chat' # Text startFormat when no bubbles equipped # 无气泡时的默认聊天格式 @@ -21,11 +33,11 @@ text-suffix: '' # Space between two bubbles # 两行气泡之间的间距 -line-spacing: 0.5 +line-spacing: 0.4 # This decides where the bottom line is # 第一行气泡的起始位置 -bottom-line-Y-offset: -0.35 +bottom-line-Y-offset: 0.4 # Seconds # This decides how long will the chat hologram remains diff --git a/src/main/resources/configs/custom-placeholders.yml b/src/main/resources/configs/custom-placeholders.yml index 28c3062..d8c212f 100644 --- a/src/main/resources/configs/custom-placeholders.yml +++ b/src/main/resources/configs/custom-placeholders.yml @@ -149,6 +149,7 @@ descent-unicode: # %nameplates_vanilla_{0}% vanilla-hud: stamina_hud: + reverse: true images: empty: "%nameplates_image_stamina_0%" half: "%nameplates_image_stamina_1%" diff --git a/src/main/resources/configs/nameplate.yml b/src/main/resources/configs/nameplate.yml index b4a4975..2e2856d 100644 --- a/src/main/resources/configs/nameplate.yml +++ b/src/main/resources/configs/nameplate.yml @@ -1,5 +1,5 @@ -# mode: Team / Armor_Stand / Disable -# 模式 队伍/盔甲架/禁用 +# mode: Team / Armor_Stand / Text_Display(1.19.4+) / Disable +# 模式 队伍/盔甲架/文字/禁用 mode: Team # Disable this if you meet "Team xxx already exists" when you are running a BungeeCord server @@ -32,7 +32,25 @@ suffix: '' armor_stand: text_1: text: '%nameplates_prefix%%player_name%%nameplates_suffix%' - vertical-offset: -0.99 + vertical-offset: -1 + text_2: + text: '%vault_prefix%' + vertical-offset: -0.7 + conditions: + papi-condition: + condition_1: + type: '!=' + papi: '%vault_prefix%' + value: '' + +# Not recommended to use text display because it's not moving as smoothly as armor stand do +# This is caused by the way how client handles the packet which cannot be solved from server side +text_display: + text_1: + text: '%nameplates_prefix%%player_name%%nameplates_suffix%' + vertical-offset: -1 + options: + is-see-through: false text_2: text: '%vault_prefix%' vertical-offset: -0.7 diff --git a/src/main/resources/templates/default.json b/src/main/resources/templates/default.json index ee0aeb4..13fbc68 100644 --- a/src/main/resources/templates/default.json +++ b/src/main/resources/templates/default.json @@ -103,11 +103,6 @@ "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u2205\u2208\u0000", "\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u0000\u221a\u207f\u00b2\u25a0\u0000" ] - }, - { - "type": "legacy_unicode", - "sizes": "minecraft:font/glyph_sizes.bin", - "template": "minecraft:font/unicode_page_%s.png" } ] }