diff --git a/.classpath b/.classpath deleted file mode 100644 index a5d9509..0000000 --- a/.classpath +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 0446c9d..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - Limbo - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 82e28d1..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=ISO-8859-1 -encoding//src/main/resources=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 2f5cc74..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/pom.xml b/pom.xml index 4f79490..07f83fb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.loohp Limbo Limbo - 0.6.2-ALPHA + 0.6.3-ALPHA Standalone Limbo Minecraft Server. https://github.com/LOOHP/Limbo diff --git a/src/main/java/com/loohp/limbo/events/player/PlayerResourcePackStatusEvent.java b/src/main/java/com/loohp/limbo/events/player/PlayerResourcePackStatusEvent.java index 0c41004..91ecb8d 100644 --- a/src/main/java/com/loohp/limbo/events/player/PlayerResourcePackStatusEvent.java +++ b/src/main/java/com/loohp/limbo/events/player/PlayerResourcePackStatusEvent.java @@ -12,6 +12,7 @@ public class PlayerResourcePackStatusEvent extends PlayerEvent { super(player); } + @Override public Player getPlayer() { return player; } diff --git a/src/main/java/com/loohp/limbo/file/ServerProperties.java b/src/main/java/com/loohp/limbo/file/ServerProperties.java index a0cac09..0dcb547 100644 --- a/src/main/java/com/loohp/limbo/file/ServerProperties.java +++ b/src/main/java/com/loohp/limbo/file/ServerProperties.java @@ -50,10 +50,10 @@ public class ServerProperties { private double ticksPerSecond; private boolean handshakeVerbose; - private String resourcePackSHA; + private String resourcePackSHA1; private String resourcePackLink; private boolean resourcePackRequired; - private String resourcePackPrompt; + private String resourcePackPromptJson; private String tabHeader; private String tabFooter; @@ -132,9 +132,9 @@ public class ServerProperties { handshakeVerbose = Boolean.parseBoolean(prop.getProperty("handshake-verbose")); resourcePackLink = prop.getProperty("resource-pack"); - resourcePackSHA = prop.getProperty("resource-pack-sha1"); + resourcePackSHA1 = prop.getProperty("resource-pack-sha1"); resourcePackRequired = Boolean.parseBoolean(prop.getProperty("required-resource-pack")); - resourcePackPrompt = prop.getProperty("resource-pack-prompt"); + resourcePackPromptJson = prop.getProperty("resource-pack-prompt"); tabHeader = prop.getProperty("tab-header"); tabFooter = prop.getProperty("tab-footer"); @@ -263,16 +263,16 @@ public class ServerProperties { return resourcePackLink; } - public String getResourcePackSHA() { - return resourcePackSHA; + public String getResourcePackSHA1() { + return resourcePackSHA1; } public boolean getResourcePackRequired() { return resourcePackRequired; } - public String getResourcePackPrompt() { - return resourcePackPrompt; + public String getResourcePackPromptJson() { + return resourcePackPromptJson; } public String getTabHeader() { diff --git a/src/main/java/com/loohp/limbo/player/Player.java b/src/main/java/com/loohp/limbo/player/Player.java index 6cbc11f..5887273 100644 --- a/src/main/java/com/loohp/limbo/player/Player.java +++ b/src/main/java/com/loohp/limbo/player/Player.java @@ -25,9 +25,12 @@ import com.loohp.limbo.utils.GameMode; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; import net.md_5.bungee.chat.ComponentSerializer; public class Player extends LivingEntity implements CommandSender { + + public static final String CHAT_DEFAULT_FORMAT = "<%name%> %message%"; public final ClientConnection clientConnection; public final PlayerInteractManager playerInteractManager; @@ -201,7 +204,7 @@ public class Player extends LivingEntity implements CommandSender { } public void sendMessage(BaseComponent component, UUID uuid) { - sendMessage(new BaseComponent[] { component }, uuid); + sendMessage(new BaseComponent[] {component}, uuid); } @Override @@ -219,7 +222,7 @@ public class Player extends LivingEntity implements CommandSender { } public void sendMessage(BaseComponent component) { - sendMessage(new BaseComponent[] { component }); + sendMessage(new BaseComponent[] {component}); } @Override @@ -233,7 +236,7 @@ public class Player extends LivingEntity implements CommandSender { } public void disconnect() { - disconnect("Disconnected!"); + disconnect(new TranslatableComponent("multiplayer.disconnect.kicked")); } public void disconnect(String reason) { @@ -250,24 +253,31 @@ public class Player extends LivingEntity implements CommandSender { public void chat(String message) { if (Limbo.getInstance().getServerProperties().isAllowChat()) { - String format = "<%name%> %message%"; - PlayerChatEvent event = (PlayerChatEvent) Limbo.getInstance().getEventsManager().callEvent(new PlayerChatEvent(this, format, message, false)); + PlayerChatEvent event = (PlayerChatEvent) Limbo.getInstance().getEventsManager().callEvent(new PlayerChatEvent(this, CHAT_DEFAULT_FORMAT, message, false)); if (!event.isCancelled() && this.hasPermission("limboserver.chat")) { String chat = event.getFormat().replace("%name%", username).replace("%message%", event.getMessage()); Limbo.getInstance().getConsole().sendMessage(chat); - for (Player each : Limbo.getInstance().getPlayers()) { - each.sendMessage(chat, uuid); + if (event.getFormat().equals(CHAT_DEFAULT_FORMAT)) { + TranslatableComponent translatable = new TranslatableComponent("chat.type.text", username, event.getMessage()); + for (Player each : Limbo.getInstance().getPlayers()) { + each.sendMessage(translatable, uuid); + } + } else { + for (Player each : Limbo.getInstance().getPlayers()) { + each.sendMessage(chat, uuid); + } } } } } + public void setResourcePack(String url, String hash, boolean forced, BaseComponent promptmessage) { + setResourcePack(url, hash, forced, new BaseComponent[] {promptmessage}); + } public void setResourcePack(String url, String hash, boolean forced, BaseComponent[] promptmessage) { try { - PacketPlayOutResourcePackSend packsend = new PacketPlayOutResourcePackSend(url, hash, forced, - (promptmessage != null || !ComponentSerializer.toString(promptmessage).equalsIgnoreCase("")) ? true : false, - ComponentSerializer.toString(promptmessage)); + PacketPlayOutResourcePackSend packsend = new PacketPlayOutResourcePackSend(url, hash, forced, promptmessage != null, promptmessage != null ? promptmessage : null); clientConnection.sendPacket(packsend); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/com/loohp/limbo/server/ClientConnection.java b/src/main/java/com/loohp/limbo/server/ClientConnection.java index c970b81..8a68656 100644 --- a/src/main/java/com/loohp/limbo/server/ClientConnection.java +++ b/src/main/java/com/loohp/limbo/server/ClientConnection.java @@ -47,6 +47,7 @@ import com.loohp.limbo.server.packets.PacketPlayInKeepAlive; import com.loohp.limbo.server.packets.PacketPlayInPosition; import com.loohp.limbo.server.packets.PacketPlayInPositionAndLook; import com.loohp.limbo.server.packets.PacketPlayInResourcePackStatus; +import com.loohp.limbo.server.packets.PacketPlayInResourcePackStatus.EnumResourcePackStatus; import com.loohp.limbo.server.packets.PacketPlayInRotation; import com.loohp.limbo.server.packets.PacketPlayInTabComplete; import com.loohp.limbo.server.packets.PacketPlayOutDeclareCommands; @@ -85,6 +86,7 @@ import com.loohp.limbo.world.World; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; import net.md_5.bungee.chat.ComponentSerializer; public class ClientConnection extends Thread { @@ -422,11 +424,11 @@ public class ClientConnection extends Thread { // RESOURCEPACK CODE ADDED BY GAMERDUCK123 if (properties.getResourcePackLink() != null && !properties.getResourcePackLink().equalsIgnoreCase("")) { - if (properties.getResourcePackSHA() != null && !properties.getResourcePackSHA().equalsIgnoreCase("")) { + if (properties.getResourcePackSHA1() != null && !properties.getResourcePackSHA1().equalsIgnoreCase("")) { //SEND RESOURCEPACK player.setResourcePack(properties.getResourcePackLink(), - properties.getResourcePackSHA(), properties.getResourcePackRequired(), - ComponentSerializer.parse(properties.getResourcePackPrompt())); + properties.getResourcePackSHA1(), properties.getResourcePackRequired(), + ComponentSerializer.parse(properties.getResourcePackPromptJson())); } else { //NO SHA Limbo.getInstance().getConsole().sendMessage("ResourcePacks require SHA1s"); @@ -547,6 +549,9 @@ public class ClientConnection extends Thread { PacketPlayInResourcePackStatus rpcheck = new PacketPlayInResourcePackStatus(input); // Pass on result to the events Limbo.getInstance().getEventsManager().callEvent(new PlayerResourcePackStatusEvent(player, rpcheck.getLoadedValue())); + if (rpcheck.getLoadedValue().equals(EnumResourcePackStatus.DECLINED) && properties.getResourcePackRequired()) { + player.disconnect(new TranslatableComponent("multiplayer.requiredTexturePrompt.disconnect")); + } } else { input.skipBytes(size - DataTypeIO.getVarIntLength(packetId)); } diff --git a/src/main/java/com/loohp/limbo/server/packets/PacketPlayInResourcePackStatus.java b/src/main/java/com/loohp/limbo/server/packets/PacketPlayInResourcePackStatus.java index 1f98a6d..1e5b9d4 100644 --- a/src/main/java/com/loohp/limbo/server/packets/PacketPlayInResourcePackStatus.java +++ b/src/main/java/com/loohp/limbo/server/packets/PacketPlayInResourcePackStatus.java @@ -7,36 +7,40 @@ import com.loohp.limbo.utils.DataTypeIO; public class PacketPlayInResourcePackStatus extends PacketIn { - - public enum EnumResourcePackStatus { + public static enum EnumResourcePackStatus { SUCCESS, DECLINED, FAILED, ACCEPTED; } - private int loaded; + private EnumResourcePackStatus loaded; - public PacketPlayInResourcePackStatus(int loaded) { + public PacketPlayInResourcePackStatus(EnumResourcePackStatus loaded) { this.loaded = loaded; } public PacketPlayInResourcePackStatus(DataInputStream in) throws IOException { - this(DataTypeIO.readVarInt(in)); - } - - public EnumResourcePackStatus getLoadedValue() { - switch (loaded) { - case 0: return EnumResourcePackStatus.SUCCESS; - case 1: return EnumResourcePackStatus.DECLINED; - case 2: return EnumResourcePackStatus.FAILED; - case 3: return EnumResourcePackStatus.ACCEPTED; - default: return EnumResourcePackStatus.FAILED; - } + this(toLoadedValue(DataTypeIO.readVarInt(in))); } - public boolean isLoadedValue(EnumResourcePackStatus status) { - return getLoadedValue() == status; + public EnumResourcePackStatus getLoadedValue() { + return loaded; + } + + private static EnumResourcePackStatus toLoadedValue(int value) { + switch (value) { + case 0: + return EnumResourcePackStatus.SUCCESS; + case 1: + return EnumResourcePackStatus.DECLINED; + case 2: + return EnumResourcePackStatus.FAILED; + case 3: + return EnumResourcePackStatus.ACCEPTED; + default: + return EnumResourcePackStatus.FAILED; + } } } diff --git a/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutResourcePackSend.java b/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutResourcePackSend.java index f0e2bd9..2da6c0e 100644 --- a/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutResourcePackSend.java +++ b/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutResourcePackSend.java @@ -7,19 +7,30 @@ import java.nio.charset.StandardCharsets; import com.loohp.limbo.utils.DataTypeIO; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; + public class PacketPlayOutResourcePackSend extends PacketOut { + public static final int MAX_HASH_LENGTH = 40; + private String url; private String hash; private boolean isForced; private boolean hasPromptMessage; - private String promptMessage; + private BaseComponent[] promptMessage; - public PacketPlayOutResourcePackSend(String url, String hash, boolean isForced, boolean hasPromptMessage, String promptMessage) { + public PacketPlayOutResourcePackSend(String url, String hash, boolean isForced, boolean hasPromptMessage, BaseComponent[] promptMessage) { + if (hash.length() > MAX_HASH_LENGTH) { + throw new IllegalArgumentException("Hash is too long (max " + MAX_HASH_LENGTH + ", was " + hash.length() + ")"); + } this.url = url; this.hash = hash; this.isForced = isForced; this.hasPromptMessage = hasPromptMessage; + if (hasPromptMessage && promptMessage == null) { + throw new IllegalArgumentException("promptMessage cannot be null when hasPromptMessage is true"); + } this.promptMessage = promptMessage; } @@ -39,7 +50,7 @@ public class PacketPlayOutResourcePackSend extends PacketOut { return hasPromptMessage; } - public String getPromptMessage() { + public BaseComponent[] getPromptMessage() { return promptMessage; } @@ -54,7 +65,7 @@ public class PacketPlayOutResourcePackSend extends PacketOut { output.writeBoolean(isForced); output.writeBoolean(hasPromptMessage); if (hasPromptMessage) { - DataTypeIO.writeString(output, promptMessage, StandardCharsets.UTF_8); + DataTypeIO.writeString(output, ComponentSerializer.toString(promptMessage), StandardCharsets.UTF_8); } return buffer.toByteArray(); } diff --git a/src/main/resources/mapping.json b/src/main/resources/mapping.json index b4366a3..8b59b8f 100644 --- a/src/main/resources/mapping.json +++ b/src/main/resources/mapping.json @@ -19,7 +19,8 @@ "0x13": "PacketPlayInRotation", "0x0A": "PacketPlayInPluginMessaging", "0x06": "PacketPlayInTabComplete", - "0x25": "PacketPlayInHeldItemChange" + "0x25": "PacketPlayInHeldItemChange", + "0x21": "PacketPlayInResourcePackStatus" }, "PlayOut": { "PacketPlayOutLogin": "0x26", @@ -44,7 +45,8 @@ "PacketPlayOutSpawnEntity": "0x00", "PacketPlayOutSpawnEntityLiving": "0x02", "PacketPlayOutHeldItemChange": "0x48", - "PacketPlayOutPlayerListHeaderFooter": "0x5E" + "PacketPlayOutPlayerListHeaderFooter": "0x5E", + "PacketPlayOutResourcePackSend": "0x3C" }, "StatusIn": { "0x01": "PacketStatusInPing", diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties index 8d96202..00b36e7 100644 --- a/src/main/resources/server.properties +++ b/src/main/resources/server.properties @@ -59,8 +59,20 @@ motd={"text":"","extra":[{"text":"Limbo Server!","color":"yellow"}]} #Server list version as string version=Limbo! -#Tab-List Header -tab-header={"text":"","extra":[{"text":"Welcome to Limbo!","color":"green"}]} +#Tab-List Header (May be left blank) +tab-header= -#Tab-List Footer -tab-footer={"text":"","extra":[{"text":"Limbo Server by LOOHP","color":"yellow"}]} \ No newline at end of file +#Tab-List Footer (May be left blank) +tab-footer= + +#Server resource pack url (May be left blank) +resource-pack= + +#Server resource pack hash (May be left blank) +resource-pack-sha1= + +#Whether to kick players if they do not accept the server resource pack +required-resource-pack=false + +#JSON formatted text to show when prompting the player to install the resource pack (May be left blank) +resource-pack-prompt={"text":"","extra":[{"text":"Install server resource pack!","color":"yellow"}]} \ No newline at end of file