From b25449f89f75a20a69c31f4a0588c2c82b14038b Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Tue, 22 Mar 2022 23:44:07 -0400 Subject: [PATCH] Send 1.8 titles using packets, fixes #1903 --- .../main/java/me/blackvein/quests/Quest.java | 6 +- .../java/me/blackvein/quests/Quester.java | 6 +- .../main/java/me/blackvein/quests/Quests.java | 6 +- .../{particle => nms}/ParticleProvider.java | 6 +- .../ParticleProvider_Bukkit.java | 2 +- .../{particle => nms}/PreBuiltParticle.java | 2 +- .../blackvein/quests/nms/TitleProvider.java | 53 +++++++++ .../quests/nms/TitleProvider_Bukkit.java | 12 ++ .../quests/tasks/NpcEffectThread.java | 2 +- v1_8_R1/pom.xml | 4 +- .../ParticleProvider_v1_8_R1.java | 112 +++++++++--------- .../quests/nms/TitleProvider_v1_8_R1.java | 41 +++++++ v1_8_R2/pom.xml | 4 +- .../ParticleProvider_v1_8_R2.java | 112 +++++++++--------- .../quests/nms/TitleProvider_v1_8_R2.java | 39 ++++++ v1_8_R3/pom.xml | 4 +- .../ParticleProvider_v1_8_R3.java | 112 +++++++++--------- .../quests/nms/TitleProvider_v1_8_R3.java | 39 ++++++ 18 files changed, 377 insertions(+), 185 deletions(-) rename core/src/main/java/me/blackvein/quests/{particle => nms}/ParticleProvider.java (95%) rename core/src/main/java/me/blackvein/quests/{particle => nms}/ParticleProvider_Bukkit.java (98%) rename core/src/main/java/me/blackvein/quests/{particle => nms}/PreBuiltParticle.java (98%) create mode 100644 core/src/main/java/me/blackvein/quests/nms/TitleProvider.java create mode 100644 core/src/main/java/me/blackvein/quests/nms/TitleProvider_Bukkit.java rename v1_8_R1/src/main/java/me/blackvein/quests/{particle => nms}/ParticleProvider_v1_8_R1.java (96%) create mode 100644 v1_8_R1/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R1.java rename v1_8_R2/src/main/java/me/blackvein/quests/{particle => nms}/ParticleProvider_v1_8_R2.java (96%) create mode 100644 v1_8_R2/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R2.java rename v1_8_R3/src/main/java/me/blackvein/quests/{particle => nms}/ParticleProvider_v1_8_R3.java (96%) create mode 100644 v1_8_R3/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R3.java diff --git a/core/src/main/java/me/blackvein/quests/Quest.java b/core/src/main/java/me/blackvein/quests/Quest.java index 53361a23b..692771188 100644 --- a/core/src/main/java/me/blackvein/quests/Quest.java +++ b/core/src/main/java/me/blackvein/quests/Quest.java @@ -31,6 +31,7 @@ import me.blackvein.quests.events.quester.QuesterPostFailQuestEvent; import me.blackvein.quests.events.quester.QuesterPreChangeStageEvent; import me.blackvein.quests.events.quester.QuesterPreCompleteQuestEvent; import me.blackvein.quests.events.quester.QuesterPreFailQuestEvent; +import me.blackvein.quests.nms.TitleProvider; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.quests.BukkitOptions; import me.blackvein.quests.quests.BukkitPlanner; @@ -913,8 +914,9 @@ public class Quest implements IQuest { Lang.send(p, ChatColor.GOLD + Lang.get(p, "questCompleteTitle").replace("", ChatColor.YELLOW + name + ChatColor.GOLD)); if (plugin.getSettings().canShowQuestTitles()) { - p.sendTitle(ChatColor.GOLD + Lang.get(p, "quest") + " " + Lang.get(p, "complete"), - ChatColor.YELLOW + name); + final String title = ChatColor.GOLD + Lang.get(p, "quest") + " " + Lang.get(p, "complete"); + final String subtitle = ChatColor.YELLOW + name; + TitleProvider.sendTitle(p, title, subtitle); } Lang.send(p, ChatColor.GREEN + Lang.get(p, "questRewardsTitle")); if (!issuedReward) { diff --git a/core/src/main/java/me/blackvein/quests/Quester.java b/core/src/main/java/me/blackvein/quests/Quester.java index 9e0e71ed7..82771e43f 100644 --- a/core/src/main/java/me/blackvein/quests/Quester.java +++ b/core/src/main/java/me/blackvein/quests/Quester.java @@ -30,6 +30,7 @@ import me.blackvein.quests.events.quester.QuesterPreOpenGUIEvent; import me.blackvein.quests.events.quester.QuesterPreStartQuestEvent; import me.blackvein.quests.events.quester.QuesterPreUpdateObjectiveEvent; import me.blackvein.quests.item.QuestJournal; +import me.blackvein.quests.nms.TitleProvider; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.quests.BukkitObjective; import me.blackvein.quests.quests.IQuest; @@ -769,8 +770,9 @@ public class Quester implements IQuester { sendMessage(ChatColor.GREEN + accepted); p.sendMessage(""); if (plugin.getSettings().canShowQuestTitles()) { - p.sendTitle(ChatColor.GOLD + Lang.get(p, "quest") + " " + Lang.get(p, "accepted"), - ChatColor.YELLOW + quest.getName()); + final String title = ChatColor.GOLD + Lang.get(p, "quest") + " " + Lang.get(p, "accepted"); + final String subtitle = ChatColor.YELLOW + quest.getName(); + TitleProvider.sendTitle(p, title, subtitle); } } } diff --git a/core/src/main/java/me/blackvein/quests/Quests.java b/core/src/main/java/me/blackvein/quests/Quests.java index dc7c1dc05..2998a602d 100644 --- a/core/src/main/java/me/blackvein/quests/Quests.java +++ b/core/src/main/java/me/blackvein/quests/Quests.java @@ -272,7 +272,7 @@ public class Quests extends JavaPlugin implements QuestsAPI { getServer().getPluginManager().registerEvents(getPartiesListener(), this); } if (hasBungeeEnabled()) { - getServer().getMessenger().registerIncomingPluginChannel(this, "quests:update", bungeeListener); + getServer().getMessenger().registerIncomingPluginChannel(this, "quests:update", getBungeeListener()); } // 11 - Attempt to check for updates @@ -585,6 +585,10 @@ public class Quests extends JavaPlugin implements QuestsAPI { return blockListener; } + public BungeeListener getBungeeListener() { + return bungeeListener; + } + public ItemListener getItemListener() { return itemListener; } diff --git a/core/src/main/java/me/blackvein/quests/particle/ParticleProvider.java b/core/src/main/java/me/blackvein/quests/nms/ParticleProvider.java similarity index 95% rename from core/src/main/java/me/blackvein/quests/particle/ParticleProvider.java rename to core/src/main/java/me/blackvein/quests/nms/ParticleProvider.java index 72213c22a..0ee466203 100644 --- a/core/src/main/java/me/blackvein/quests/particle/ParticleProvider.java +++ b/core/src/main/java/me/blackvein/quests/nms/ParticleProvider.java @@ -10,7 +10,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package me.blackvein.quests.particle; +package me.blackvein.quests.nms; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -24,9 +24,9 @@ public abstract class ParticleProvider { private static ParticleProvider loaded; static { + final String internalsName = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; try { final String packageName = ParticleProvider.class.getPackage().getName(); - final String internalsName = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; if (internalsName.startsWith("v1_8_R")) { loaded = (ParticleProvider) Class.forName(packageName + ".ParticleProvider_" + internalsName) .newInstance(); @@ -35,7 +35,7 @@ public abstract class ParticleProvider { } } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException | ClassCastException exception) { - Bukkit.getLogger().severe("[Quests] Could not find a valid implementation for this server version."); + Bukkit.getLogger().severe("[Quests] No valid particle implementation for version " + internalsName); } } diff --git a/core/src/main/java/me/blackvein/quests/particle/ParticleProvider_Bukkit.java b/core/src/main/java/me/blackvein/quests/nms/ParticleProvider_Bukkit.java similarity index 98% rename from core/src/main/java/me/blackvein/quests/particle/ParticleProvider_Bukkit.java rename to core/src/main/java/me/blackvein/quests/nms/ParticleProvider_Bukkit.java index 1863e3b81..6e0700ce3 100644 --- a/core/src/main/java/me/blackvein/quests/particle/ParticleProvider_Bukkit.java +++ b/core/src/main/java/me/blackvein/quests/nms/ParticleProvider_Bukkit.java @@ -10,7 +10,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package me.blackvein.quests.particle; +package me.blackvein.quests.nms; import org.bukkit.Location; import org.bukkit.Particle; diff --git a/core/src/main/java/me/blackvein/quests/particle/PreBuiltParticle.java b/core/src/main/java/me/blackvein/quests/nms/PreBuiltParticle.java similarity index 98% rename from core/src/main/java/me/blackvein/quests/particle/PreBuiltParticle.java rename to core/src/main/java/me/blackvein/quests/nms/PreBuiltParticle.java index 40bc9f071..9d43ec9f5 100644 --- a/core/src/main/java/me/blackvein/quests/particle/PreBuiltParticle.java +++ b/core/src/main/java/me/blackvein/quests/nms/PreBuiltParticle.java @@ -10,7 +10,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package me.blackvein.quests.particle; +package me.blackvein.quests.nms; import org.bukkit.util.Vector; diff --git a/core/src/main/java/me/blackvein/quests/nms/TitleProvider.java b/core/src/main/java/me/blackvein/quests/nms/TitleProvider.java new file mode 100644 index 000000000..4b860ff06 --- /dev/null +++ b/core/src/main/java/me/blackvein/quests/nms/TitleProvider.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public abstract class TitleProvider { + + private static TitleProvider loaded; + + static { + final String internalsName = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + try { + final String packageName = TitleProvider.class.getPackage().getName(); + if (internalsName.startsWith("v1_8_R")) { + loaded = (TitleProvider) Class.forName(packageName + ".TitleProvider_" + internalsName) + .newInstance(); + } else { + loaded = new TitleProvider_Bukkit(); + } + } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException + | ClassCastException exception) { + Bukkit.getLogger().severe("[Quests] No valid title implementation for version " + internalsName); + } + } + + abstract void sendTitlePacket(Player player, String title, String subtitle); + + /** + * Sends the title to the player. + * + * @param player + * The player to send the title to. + * @param title + * The title. + * @param subtitle + * The subtitle. + */ + public static void sendTitle(final Player player, final String title, final String subtitle) { + loaded.sendTitlePacket(player, title, subtitle); + } +} diff --git a/core/src/main/java/me/blackvein/quests/nms/TitleProvider_Bukkit.java b/core/src/main/java/me/blackvein/quests/nms/TitleProvider_Bukkit.java new file mode 100644 index 000000000..7f1a6a7e8 --- /dev/null +++ b/core/src/main/java/me/blackvein/quests/nms/TitleProvider_Bukkit.java @@ -0,0 +1,12 @@ +package me.blackvein.quests.nms; + +import org.bukkit.entity.Player; + +class TitleProvider_Bukkit extends TitleProvider { + + @SuppressWarnings("deprecation") + @Override + void sendTitlePacket(final Player player, final String title, final String subtitle) { + player.sendTitle(title, subtitle); + } +} diff --git a/core/src/main/java/me/blackvein/quests/tasks/NpcEffectThread.java b/core/src/main/java/me/blackvein/quests/tasks/NpcEffectThread.java index f429fb79a..43f8bb532 100644 --- a/core/src/main/java/me/blackvein/quests/tasks/NpcEffectThread.java +++ b/core/src/main/java/me/blackvein/quests/tasks/NpcEffectThread.java @@ -14,7 +14,7 @@ package me.blackvein.quests.tasks; import me.blackvein.quests.player.IQuester; import me.blackvein.quests.Quests; -import me.blackvein.quests.particle.ParticleProvider; +import me.blackvein.quests.nms.ParticleProvider; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Location; import org.bukkit.entity.Entity; diff --git a/v1_8_R1/pom.xml b/v1_8_R1/pom.xml index 5b5f6f5c7..105214c85 100644 --- a/v1_8_R1/pom.xml +++ b/v1_8_R1/pom.xml @@ -15,8 +15,8 @@ - org.bukkit - craftbukkit + org.spigotmc + spigot 1.8-R0.1-SNAPSHOT provided diff --git a/v1_8_R1/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R1.java b/v1_8_R1/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R1.java similarity index 96% rename from v1_8_R1/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R1.java rename to v1_8_R1/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R1.java index 7493a2258..a463f76ac 100644 --- a/v1_8_R1/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R1.java +++ b/v1_8_R1/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R1.java @@ -1,56 +1,56 @@ -/* - * Copyright (c) 2014 PikaMug and contributors. All rights reserved. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package me.blackvein.quests.particle; - -import net.minecraft.server.v1_8_R1.EnumParticle; -import net.minecraft.server.v1_8_R1.PacketPlayOutWorldParticles; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; - -public class ParticleProvider_v1_8_R1 extends ParticleProvider { - - private static final Map PARTICLES = new HashMap<>(); - - static { - PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); - PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); - PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); - PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); - PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); - PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); - PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); - PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); - PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); - PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); - PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); - PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); - } - - @Override - Map getParticleMap() { - return PARTICLES; - } - - @Override - void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, - final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { - final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, - (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, - speed, count, data); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); - } -} +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.minecraft.server.v1_8_R1.EnumParticle; +import net.minecraft.server.v1_8_R1.PacketPlayOutWorldParticles; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class ParticleProvider_v1_8_R1 extends ParticleProvider { + + private static final Map PARTICLES = new HashMap<>(); + + static { + PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); + PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); + PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); + PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); + PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); + PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); + PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); + PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); + PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); + PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); + PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); + PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); + } + + @Override + Map getParticleMap() { + return PARTICLES; + } + + @Override + void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, + final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { + final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, + (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, + speed, count, data); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + } +} diff --git a/v1_8_R1/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R1.java b/v1_8_R1/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R1.java new file mode 100644 index 000000000..67176b311 --- /dev/null +++ b/v1_8_R1/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R1.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.server.v1_8_R1.ChatSerializer; +import net.minecraft.server.v1_8_R1.EnumTitleAction; +import net.minecraft.server.v1_8_R1.IChatBaseComponent; +import net.minecraft.server.v1_8_R1.PacketPlayOutTitle; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class TitleProvider_v1_8_R1 extends TitleProvider { + + @Override + void sendTitlePacket(final Player player, final String title, final String subtitle) { + final CraftPlayer craft = (CraftPlayer) player; + final String titleString = ComponentSerializer.toString(TextComponent.fromLegacyText(title)); + final String titleSubtitle = ComponentSerializer.toString(TextComponent.fromLegacyText(subtitle)); + + final IChatBaseComponent titleJson = ChatSerializer.a(titleString); + final IChatBaseComponent subtitleJSON = ChatSerializer.a(titleSubtitle); + + final PacketPlayOutTitle titlePacket = new PacketPlayOutTitle(EnumTitleAction.TITLE, titleJson); + final PacketPlayOutTitle subtitlePacket = new PacketPlayOutTitle(EnumTitleAction.SUBTITLE, subtitleJSON); + + craft.getHandle().playerConnection.sendPacket(titlePacket); + craft.getHandle().playerConnection.sendPacket(subtitlePacket); + } +} diff --git a/v1_8_R2/pom.xml b/v1_8_R2/pom.xml index 0bd9d874c..2096f7f82 100644 --- a/v1_8_R2/pom.xml +++ b/v1_8_R2/pom.xml @@ -15,8 +15,8 @@ - org.bukkit - craftbukkit + org.spigotmc + spigot 1.8.3-R0.1-SNAPSHOT provided diff --git a/v1_8_R2/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R2.java b/v1_8_R2/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R2.java similarity index 96% rename from v1_8_R2/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R2.java rename to v1_8_R2/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R2.java index df02f6b14..db31098dc 100644 --- a/v1_8_R2/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R2.java +++ b/v1_8_R2/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R2.java @@ -1,56 +1,56 @@ -/* - * Copyright (c) 2014 PikaMug and contributors. All rights reserved. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package me.blackvein.quests.particle; - -import net.minecraft.server.v1_8_R2.EnumParticle; -import net.minecraft.server.v1_8_R2.PacketPlayOutWorldParticles; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; - -public class ParticleProvider_v1_8_R2 extends ParticleProvider { - - private static final Map PARTICLES = new HashMap<>(); - - static { - PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); - PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); - PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); - PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); - PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); - PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); - PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); - PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); - PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); - PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); - PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); - PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); - } - - @Override - Map getParticleMap() { - return PARTICLES; - } - - @Override - void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, - final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { - final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, - (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, - speed, count, data); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); - } -} +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.minecraft.server.v1_8_R2.EnumParticle; +import net.minecraft.server.v1_8_R2.PacketPlayOutWorldParticles; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class ParticleProvider_v1_8_R2 extends ParticleProvider { + + private static final Map PARTICLES = new HashMap<>(); + + static { + PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); + PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); + PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); + PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); + PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); + PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); + PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); + PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); + PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); + PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); + PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); + PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); + } + + @Override + Map getParticleMap() { + return PARTICLES; + } + + @Override + void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, + final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { + final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, + (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, + speed, count, data); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + } +} diff --git a/v1_8_R2/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R2.java b/v1_8_R2/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R2.java new file mode 100644 index 000000000..0158dd359 --- /dev/null +++ b/v1_8_R2/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R2.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.server.v1_8_R2.IChatBaseComponent; +import net.minecraft.server.v1_8_R2.PacketPlayOutTitle; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class TitleProvider_v1_8_R2 extends TitleProvider { + + @Override + void sendTitlePacket(final Player player, final String title, final String subtitle) { + final CraftPlayer craft = (CraftPlayer) player; + final String titleString = ComponentSerializer.toString(TextComponent.fromLegacyText(title)); + final String subtitleString = ComponentSerializer.toString(TextComponent.fromLegacyText(subtitle)); + + final IChatBaseComponent titleJson = IChatBaseComponent.ChatSerializer.a(titleString); + final IChatBaseComponent subtitleJSON = IChatBaseComponent.ChatSerializer.a(subtitleString); + + final PacketPlayOutTitle titlePacket = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, titleJson); + final PacketPlayOutTitle subtitlePacket = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, subtitleJSON); + + craft.getHandle().playerConnection.sendPacket(titlePacket); + craft.getHandle().playerConnection.sendPacket(subtitlePacket); + } +} diff --git a/v1_8_R3/pom.xml b/v1_8_R3/pom.xml index 4f4cba729..863a93bbc 100644 --- a/v1_8_R3/pom.xml +++ b/v1_8_R3/pom.xml @@ -15,8 +15,8 @@ - org.bukkit - craftbukkit + org.spigotmc + spigot 1.8.8-R0.1-SNAPSHOT provided diff --git a/v1_8_R3/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R3.java b/v1_8_R3/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R3.java similarity index 96% rename from v1_8_R3/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R3.java rename to v1_8_R3/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R3.java index b3d21582a..22a7f6a63 100644 --- a/v1_8_R3/src/main/java/me/blackvein/quests/particle/ParticleProvider_v1_8_R3.java +++ b/v1_8_R3/src/main/java/me/blackvein/quests/nms/ParticleProvider_v1_8_R3.java @@ -1,56 +1,56 @@ -/* - * Copyright (c) 2014 PikaMug and contributors. All rights reserved. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package me.blackvein.quests.particle; - -import net.minecraft.server.v1_8_R3.EnumParticle; -import net.minecraft.server.v1_8_R3.PacketPlayOutWorldParticles; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Map; - -public class ParticleProvider_v1_8_R3 extends ParticleProvider { - - private static final Map PARTICLES = new HashMap<>(); - - static { - PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); - PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); - PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); - PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); - PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); - PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); - PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); - PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); - PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); - PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); - PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); - PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); - } - - @Override - Map getParticleMap() { - return PARTICLES; - } - - @Override - void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, - final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { - final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, - (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, - speed, count, data); - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); - } -} +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.minecraft.server.v1_8_R3.EnumParticle; +import net.minecraft.server.v1_8_R3.PacketPlayOutWorldParticles; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; + +public class ParticleProvider_v1_8_R3 extends ParticleProvider { + + private static final Map PARTICLES = new HashMap<>(); + + static { + PARTICLES.put(PreBuiltParticle.ENCHANT, EnumParticle.ENCHANTMENT_TABLE); + PARTICLES.put(PreBuiltParticle.CRIT, EnumParticle.CRIT); + PARTICLES.put(PreBuiltParticle.SPELL, EnumParticle.SPELL_INSTANT); + PARTICLES.put(PreBuiltParticle.MAGIC_CRIT, EnumParticle.CRIT_MAGIC); + PARTICLES.put(PreBuiltParticle.MOB_SPELL, EnumParticle.SPELL_MOB); + PARTICLES.put(PreBuiltParticle.NOTE, EnumParticle.NOTE); + PARTICLES.put(PreBuiltParticle.PORTAL, EnumParticle.PORTAL); + PARTICLES.put(PreBuiltParticle.DUST, EnumParticle.REDSTONE); + PARTICLES.put(PreBuiltParticle.WITCH, EnumParticle.SPELL_WITCH); + PARTICLES.put(PreBuiltParticle.SNOWBALL, EnumParticle.SNOWBALL); + PARTICLES.put(PreBuiltParticle.SPLASH, EnumParticle.WATER_SPLASH); + PARTICLES.put(PreBuiltParticle.SMOKE, EnumParticle.TOWN_AURA); + } + + @Override + Map getParticleMap() { + return PARTICLES; + } + + @Override + void spawnParticle(final Player player, final Location location, final Object particle, final float offsetX, + final float offsetY, final float offsetZ, final float speed, final int count, final int[] data) { + final PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles((EnumParticle) particle, false, + (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, + speed, count, data); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); + } +} diff --git a/v1_8_R3/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R3.java b/v1_8_R3/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R3.java new file mode 100644 index 000000000..0a4f6b9de --- /dev/null +++ b/v1_8_R3/src/main/java/me/blackvein/quests/nms/TitleProvider_v1_8_R3.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 PikaMug and contributors. All rights reserved. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package me.blackvein.quests.nms; + +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import net.minecraft.server.v1_8_R3.IChatBaseComponent; +import net.minecraft.server.v1_8_R3.PacketPlayOutTitle; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class TitleProvider_v1_8_R3 extends TitleProvider { + + @Override + void sendTitlePacket(final Player player, final String title, final String subtitle) { + final CraftPlayer craft = (CraftPlayer) player; + final String titleString = ComponentSerializer.toString(TextComponent.fromLegacyText(title)); + final String subtitleString = ComponentSerializer.toString(TextComponent.fromLegacyText(subtitle)); + + final IChatBaseComponent titleJson = IChatBaseComponent.ChatSerializer.a(titleString); + final IChatBaseComponent subtitleJSON = IChatBaseComponent.ChatSerializer.a(subtitleString); + + final PacketPlayOutTitle titlePacket = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, titleJson); + final PacketPlayOutTitle subtitlePacket = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, subtitleJSON); + + craft.getHandle().playerConnection.sendPacket(titlePacket); + craft.getHandle().playerConnection.sendPacket(subtitlePacket); + } +}