diff --git a/DynmapCore/src/main/java/org/dynmap/MapManager.java b/DynmapCore/src/main/java/org/dynmap/MapManager.java index 1dd60898..be2b0180 100644 --- a/DynmapCore/src/main/java/org/dynmap/MapManager.java +++ b/DynmapCore/src/main/java/org/dynmap/MapManager.java @@ -77,6 +77,20 @@ public class MapManager { private boolean tpspausefullrenders = false; private boolean tpspausezoomout = false; + // User enter/exit processing + private static final int DEFAULT_ENTEREXIT_PERIOD = 1000; // 1 second + private static final int DEFAULT_TITLE_FADEIN = 10; // 10 ticks = 1/2 second + private static final int DEFAULT_TITLE_STAY = 70; // 70 ticks = 3 1/2 second + private static final int DEFAULT_TITLE_FADEOUT = 20; // 20 ticks = 1 second + private static final boolean DEFAULT_ENTEREXIT_USETITLE = true; + private int enterexitperiod = DEFAULT_ENTEREXIT_PERIOD; // Enter/exit processing period + private int titleFadeIn = DEFAULT_TITLE_FADEIN; + private int titleStay = DEFAULT_TITLE_STAY; + private int titleFadeOut = DEFAULT_TITLE_FADEOUT; + private boolean enterexitUseTitle = DEFAULT_ENTEREXIT_USETITLE; + + private HashMap> entersetstate = new HashMap>(); + private boolean did_start = false; private int zoomout_period = DEFAULT_ZOOMOUT_PERIOD; /* Zoom-out tile processing period, in seconds */ @@ -934,8 +948,20 @@ public class MapManager { scheduleDelayedJob(this, 1000); /* Once per second */ } } - - private HashMap> entersetstate = new HashMap>(); + + private void sendPlayerEnterExit(DynmapPlayer player, EnterExitText txt) { + core.getServer().scheduleServerTask(new Runnable() { + public void run() { + if (enterexitUseTitle) { + player.sendTitleText(txt.title, txt.subtitle, titleFadeIn, titleStay, titleFadeOut); + } + else { + if (txt.title != null) player.sendMessage(txt.title); + if (txt.subtitle != null) player.sendMessage(txt.subtitle); + } + } + }, 0); + } private class DoUserMoveProcessing implements Runnable { public void run() { @@ -954,7 +980,7 @@ public class MapManager { for (EnterExitMarker m : newset) { EnterExitText txt = m.getGreetingText(); if ((txt != null) && ((oldset == null) || (oldset.contains(m) == false))) { - Log.info(String.format("User %s enter: %s - %s", player.getName(), txt.title, txt.subtitle)); + sendPlayerEnterExit(player, txt); } } // See which we just left @@ -962,15 +988,16 @@ public class MapManager { for (EnterExitMarker m : oldset) { EnterExitText txt = m.getFarewellText(); if ((txt != null) && (newset.contains(m) == false)) { - Log.info(String.format("User %s exit: %s - %s", player.getName(), txt.title, txt.subtitle)); + sendPlayerEnterExit(player, txt); } } } newstate.put(puuid, newset); } entersetstate = newstate; // Replace old with new - - scheduleDelayedJob(this, 1000); /* Once per second */ + if (enterexitperiod > 0) { + scheduleDelayedJob(this, enterexitperiod); + } } } @@ -1055,6 +1082,12 @@ public class MapManager { if (tpslimit_fullrenders > 19.5) tpslimit_fullrenders = 19.5; tpslimit_zoomout = configuration.getDouble("zoomout-min-tps", 18.0); if (tpslimit_zoomout > 19.5) tpslimit_zoomout = 19.5; + // Load enter/exit processing settings + enterexitperiod = configuration.getInteger("enterexitperiod", DEFAULT_ENTEREXIT_PERIOD); + titleFadeIn = configuration.getInteger("titleFadeIn", DEFAULT_TITLE_FADEIN); + titleStay = configuration.getInteger("titleStay", DEFAULT_TITLE_STAY); + titleFadeOut = configuration.getInteger("titleFadeOut", DEFAULT_TITLE_FADEOUT); + enterexitUseTitle = configuration.getBoolean("enterexitUseTitle", DEFAULT_ENTEREXIT_USETITLE); // Load the save pending job period savependingperiod = configuration.getInteger("save-pending-period", 900); if ((savependingperiod > 0) && (savependingperiod < 60)) savependingperiod = 60; @@ -1501,7 +1534,11 @@ public class MapManager { scheduleDelayedJob(new DoZoomOutProcessing(), 60000); scheduleDelayedJob(new CheckWorldTimes(), 5000); scheduleDelayedJob(new DoTouchProcessing(), 1000); - scheduleDelayedJob(new DoUserMoveProcessing(), 1000); + // If enabled, start enter/exit processing + if (enterexitperiod > 0) { + Log.info("Starting enter/exit processing"); + scheduleDelayedJob(new DoUserMoveProcessing(), enterexitperiod); + } /* Resume pending jobs */ for(FullWorldRenderState job : active_renders.values()) { scheduleDelayedJob(job, 5000); diff --git a/DynmapCore/src/main/java/org/dynmap/common/DynmapPlayer.java b/DynmapCore/src/main/java/org/dynmap/common/DynmapPlayer.java index 2d5f135c..685920c0 100644 --- a/DynmapCore/src/main/java/org/dynmap/common/DynmapPlayer.java +++ b/DynmapCore/src/main/java/org/dynmap/common/DynmapPlayer.java @@ -94,4 +94,12 @@ public interface DynmapPlayer extends DynmapCommandSender { * Return UUID, or null if not available */ public default UUID getUUID() { return null; } + /** + * Send title and subtitle text (called from server thread) + */ + public default void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + // Fallback if not implemented + if (title != null) this.sendMessage(title);; + if (subtitle != null) this.sendMessage(subtitle); + } } diff --git a/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index 3c660f8d..f6543372 100644 --- a/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/DynmapCore/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -37,6 +37,7 @@ import org.dynmap.hdmap.HDPerspective; import org.dynmap.markers.AreaMarker; import org.dynmap.markers.CircleMarker; import org.dynmap.markers.EnterExitMarker; +import org.dynmap.markers.EnterExitMarker.EnterExitText; import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerAPI; import org.dynmap.markers.MarkerDescription; @@ -828,6 +829,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { private static boolean processAreaArgs(DynmapCommandSender sender, AreaMarker marker, Map parms) { String val = null; + String val2 = null; try { double ytop = marker.getTopY(); double ybottom = marker.getBottomY(); @@ -839,6 +841,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { boolean boost = marker.getBoostFlag(); int minzoom = marker.getMinZoom(); int maxzoom = marker.getMaxZoom(); + EnterExitText greet = marker.getGreetingText(); + EnterExitText farew = marker.getFarewellText(); val = parms.get(ARG_STROKECOLOR); if(val != null) @@ -886,6 +890,22 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { marker.setBoostFlag(boost); marker.setMinZoom(minzoom); marker.setMaxZoom(maxzoom); + // Handle greeting + val = parms.get(ARG_GREETING); + val2 = parms.get(ARG_GREETINGSUB); + if ((val != null) || (val2 != null)) { + String title = (val != null) ? ((val.length() > 0) ? val : null) : ((greet != null) ? greet.title : null); + String subtitle = (val2 != null) ? ((val2.length() > 0) ? val2 : null) : ((greet != null) ? greet.subtitle : null); + marker.setGreetingText(title, subtitle); + } + // Handle farewell + val = parms.get(ARG_FAREWELL); + val2 = parms.get(ARG_FAREWELLSUB); + if ((val != null) || (val2 != null)) { + String title = (val != null) ? ((val.length() > 0) ? val : null) : ((farew != null) ? farew.title : null); + String subtitle = (val2 != null) ? ((val2.length() > 0) ? val2 : null) : ((farew != null) ? farew.subtitle : null); + marker.setFarewellText(title, subtitle); + } } catch (NumberFormatException nfx) { sender.sendMessage("Invalid parameter format: " + val); return false; @@ -1050,6 +1070,11 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { private static final String ARG_WORLD = "world"; private static final String ARG_BOOST = "boost"; private static final String ARG_DESC = "desc"; + private static final String ARG_GREETING = "greeting"; + private static final String ARG_GREETINGSUB = "greetingsub"; + private static final String ARG_FAREWELL = "farewell"; + private static final String ARG_FAREWELLSUB = "farewellsub"; + /* Parse argument strings : handle 'attrib:value' and quoted strings */ private static Map parseArgs(String[] args, DynmapCommandSender snd) { @@ -2196,6 +2221,16 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } if (m.getMaxZoom() >= 0) { msg += ", maxzoom:" + m.getMaxZoom(); + } + EnterExitText t = m.getGreetingText(); + if (t != null) { + if (t.title != null) msg += ", greeting='" + t.title + "'"; + if (t.subtitle != null) msg += ", greetingsub='" + t.subtitle + "'"; + } + t = m.getFarewellText(); + if (t != null) { + if (t.title != null) msg += ", farewell='" + t.title + "'"; + if (t.subtitle != null) msg += ", farewellsub='" + t.subtitle + "'"; } sender.sendMessage(msg); } diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/markers/AreaMarker.java b/DynmapCoreAPI/src/main/java/org/dynmap/markers/AreaMarker.java index dc5213a7..b7d1af27 100644 --- a/DynmapCoreAPI/src/main/java/org/dynmap/markers/AreaMarker.java +++ b/DynmapCoreAPI/src/main/java/org/dynmap/markers/AreaMarker.java @@ -3,7 +3,7 @@ package org.dynmap.markers; /** * This defines the public interface to an area marker object, for use with the MarkerAPI */ -public interface AreaMarker extends MarkerDescription { +public interface AreaMarker extends MarkerDescription, EnterExitMarker { /** * Get top Y coordinate * @return coordinate diff --git a/bukkit-helper-113-2/src/main/java/org/dynmap/bukkit/helper/v113_2/BukkitVersionHelperSpigot113_2.java b/bukkit-helper-113-2/src/main/java/org/dynmap/bukkit/helper/v113_2/BukkitVersionHelperSpigot113_2.java index e06d5712..277430e6 100644 --- a/bukkit-helper-113-2/src/main/java/org/dynmap/bukkit/helper/v113_2/BukkitVersionHelperSpigot113_2.java +++ b/bukkit-helper-113-2/src/main/java/org/dynmap/bukkit/helper/v113_2/BukkitVersionHelperSpigot113_2.java @@ -19,6 +19,7 @@ import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.WorldBorder; +import org.bukkit.entity.Player; import org.dynmap.DynmapChunk; import org.dynmap.Log; import org.dynmap.bukkit.helper.BukkitVersionHelper; @@ -189,5 +190,11 @@ public class BukkitVersionHelperSpigot113_2 extends BukkitVersionHelperCB { } return p; } + // Send title/subtitle to user + public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + if (p != null) { + p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks); + } + } } diff --git a/bukkit-helper-114-1/src/main/java/org/dynmap/bukkit/helper/v114_1/BukkitVersionHelperSpigot114_1.java b/bukkit-helper-114-1/src/main/java/org/dynmap/bukkit/helper/v114_1/BukkitVersionHelperSpigot114_1.java index ba5cd292..4529d919 100644 --- a/bukkit-helper-114-1/src/main/java/org/dynmap/bukkit/helper/v114_1/BukkitVersionHelperSpigot114_1.java +++ b/bukkit-helper-114-1/src/main/java/org/dynmap/bukkit/helper/v114_1/BukkitVersionHelperSpigot114_1.java @@ -10,6 +10,7 @@ import org.bukkit.ChunkSnapshot; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldBorder; +import org.bukkit.entity.Player; import org.dynmap.DynmapChunk; import org.dynmap.Log; import org.dynmap.bukkit.helper.BukkitVersionHelperCB; @@ -201,5 +202,11 @@ public class BukkitVersionHelperSpigot114_1 extends BukkitVersionHelperCB { } return p; } + // Send title/subtitle to user + public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + if (p != null) { + p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks); + } + } } diff --git a/bukkit-helper-115/src/main/java/org/dynmap/bukkit/helper/v115/BukkitVersionHelperSpigot115.java b/bukkit-helper-115/src/main/java/org/dynmap/bukkit/helper/v115/BukkitVersionHelperSpigot115.java index 73650f42..405cbaed 100644 --- a/bukkit-helper-115/src/main/java/org/dynmap/bukkit/helper/v115/BukkitVersionHelperSpigot115.java +++ b/bukkit-helper-115/src/main/java/org/dynmap/bukkit/helper/v115/BukkitVersionHelperSpigot115.java @@ -10,6 +10,7 @@ import org.bukkit.ChunkSnapshot; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldBorder; +import org.bukkit.entity.Player; import org.dynmap.DynmapChunk; import org.dynmap.Log; import org.dynmap.bukkit.helper.BukkitVersionHelperCB; @@ -201,5 +202,11 @@ public class BukkitVersionHelperSpigot115 extends BukkitVersionHelperCB { } return p; } + // Send title/subtitle to user + public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + if (p != null) { + p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks); + } + } } diff --git a/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelper.java b/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelper.java index 1fd7b923..b1df6650 100644 --- a/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelper.java +++ b/bukkit-helper/src/main/java/org/dynmap/bukkit/helper/BukkitVersionHelper.java @@ -201,4 +201,13 @@ public abstract class BukkitVersionHelper { } public abstract String getStateStringByCombinedId(int blkid, int meta); -} + + // Send title/subtitle to user + public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + // Do send message for old implementations + if (p != null) { + if (title != null) p.sendMessage(title); + if (subtitle != null) p.sendMessage(subtitle); + } + } +} \ No newline at end of file diff --git a/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java b/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java index fe1b8d23..f123ad01 100644 --- a/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java +++ b/forge-1.10.2/src/main/java/org/dynmap/forge_1_10_2/DynmapPlugin.java @@ -40,6 +40,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SPacketTitle; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.UserListBans; import net.minecraft.server.management.UserListIPBans; @@ -1341,6 +1342,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + SPacketTitle times = new SPacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + SPacketTitle titlepkt = new SPacketTitle(SPacketTitle.Type.TITLE, new TextComponentString(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + SPacketTitle subtitlepkt = new SPacketTitle(SPacketTitle.Type.SUBTITLE, new TextComponentString(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java b/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java index 5d2dd76f..6690a72d 100644 --- a/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java +++ b/forge-1.11.2/src/main/java/org/dynmap/forge_1_11_2/DynmapPlugin.java @@ -40,6 +40,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SPacketTitle; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.UserListBans; import net.minecraft.server.management.UserListIPBans; @@ -1351,6 +1352,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + SPacketTitle times = new SPacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + SPacketTitle titlepkt = new SPacketTitle(SPacketTitle.Type.TITLE, new TextComponentString(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + SPacketTitle subtitlepkt = new SPacketTitle(SPacketTitle.Type.SUBTITLE, new TextComponentString(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java b/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java index 5942c19b..5d318897 100644 --- a/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java +++ b/forge-1.12.2/src/main/java/org/dynmap/forge_1_12_2/DynmapPlugin.java @@ -41,6 +41,8 @@ import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SPacketTimeUpdate; +import net.minecraft.network.play.server.SPacketTitle; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.UserListBans; import net.minecraft.server.management.UserListIPBans; @@ -1356,6 +1358,27 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + SPacketTitle times = new SPacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + SPacketTitle titlepkt = new SPacketTitle(SPacketTitle.Type.TITLE, new TextComponentString(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + SPacketTitle subtitlepkt = new SPacketTitle(SPacketTitle.Type.SUBTITLE, new TextComponentString(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } + } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java b/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java index 9f524a54..bb17d745 100644 --- a/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java +++ b/forge-1.13.2/src/main/java/org/dynmap/forge_1_13_2/DynmapPlugin.java @@ -39,6 +39,7 @@ import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SPacketTitle; import net.minecraft.particles.IParticleData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.UserListBans; @@ -1296,6 +1297,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + SPacketTitle times = new SPacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + SPacketTitle titlepkt = new SPacketTitle(SPacketTitle.Type.TITLE, new TextComponentString(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + SPacketTitle subtitlepkt = new SPacketTitle(SPacketTitle.Type.SUBTITLE, new TextComponentString(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java b/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java index 8a839119..4eabc80f 100644 --- a/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java +++ b/forge-1.14.4/src/main/java/org/dynmap/forge_1_14_4/DynmapPlugin.java @@ -38,6 +38,7 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.Item; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.ServerPlayNetHandler; +import net.minecraft.network.play.server.STitlePacket; import net.minecraft.particles.IParticleData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.BanList; @@ -1325,6 +1326,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof ServerPlayerEntity) { + ServerPlayerEntity mp = (ServerPlayerEntity) player; + STitlePacket times = new STitlePacket(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + STitlePacket titlepkt = new STitlePacket(STitlePacket.Type.TITLE, new StringTextComponent(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + STitlePacket subtitlepkt = new STitlePacket(STitlePacket.Type.SUBTITLE, new StringTextComponent(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.15.2/src/main/java/org/dynmap/forge_1_15_2/DynmapPlugin.java b/forge-1.15.2/src/main/java/org/dynmap/forge_1_15_2/DynmapPlugin.java index 18b347a8..6e218913 100644 --- a/forge-1.15.2/src/main/java/org/dynmap/forge_1_15_2/DynmapPlugin.java +++ b/forge-1.15.2/src/main/java/org/dynmap/forge_1_15_2/DynmapPlugin.java @@ -38,6 +38,7 @@ import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.Item; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.ServerPlayNetHandler; +import net.minecraft.network.play.server.STitlePacket; import net.minecraft.particles.IParticleData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.BanList; @@ -1325,6 +1326,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof ServerPlayerEntity) { + ServerPlayerEntity mp = (ServerPlayerEntity) player; + STitlePacket times = new STitlePacket(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + STitlePacket titlepkt = new STitlePacket(STitlePacket.Type.TITLE, new StringTextComponent(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + STitlePacket subtitlepkt = new STitlePacket(STitlePacket.Type.SUBTITLE, new StringTextComponent(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java b/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java index 076248be..dbd294e8 100644 --- a/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java +++ b/forge-1.8.9/src/main/java/org/dynmap/forge_1_8_9/DynmapPlugin.java @@ -39,6 +39,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.S45PacketTitle; import net.minecraft.potion.Potion; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.BanList; @@ -1333,6 +1334,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + S45PacketTitle times = new S45PacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.playerNetServerHandler.sendPacket(times); + if (title != null) { + S45PacketTitle titlepkt = new S45PacketTitle(S45PacketTitle.Type.TITLE, new ChatComponentText(title)); + mp.playerNetServerHandler.sendPacket(titlepkt); + } + + if (subtitle != null) { + S45PacketTitle subtitlepkt = new S45PacketTitle(S45PacketTitle.Type.SUBTITLE, new ChatComponentText(subtitle)); + mp.playerNetServerHandler.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java b/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java index be2d42a2..ec562a1a 100644 --- a/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java +++ b/forge-1.9.4/src/main/java/org/dynmap/forge_1_9_4/DynmapPlugin.java @@ -40,6 +40,7 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.SPacketTitle; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.UserListBans; import net.minecraft.server.management.UserListIPBans; @@ -1330,6 +1331,26 @@ public class DynmapPlugin public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP mp = (EntityPlayerMP) player; + SPacketTitle times = new SPacketTitle(fadeInTicks, stayTicks, fadeOutTicks); + mp.connection.sendPacket(times); + if (title != null) { + SPacketTitle titlepkt = new SPacketTitle(SPacketTitle.Type.TITLE, new TextComponentString(title)); + mp.connection.sendPacket(titlepkt); + } + + if (subtitle != null) { + SPacketTitle subtitlepkt = new SPacketTitle(SPacketTitle.Type.SUBTITLE, new TextComponentString(subtitle)); + mp.connection.sendPacket(subtitlepkt); + } + } + } } /* Handler for generic console command sender */ public class ForgeCommandSender implements DynmapCommandSender diff --git a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 4307f67a..fbe5a16e 100644 --- a/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/spigot/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -720,6 +720,15 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { public UUID getUUID() { return uuid; } + /** + * Send title and subtitle text (called from server thread) + */ + @Override + public void sendTitleText(String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) { + if (player != null) { + helper.sendTitleText(player, title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks); + } + } } /* Handler for generic console command sender */ public class BukkitCommandSender implements DynmapCommandSender {