From 2ae8ba0afc68215d4c702067d13abdd62a774539 Mon Sep 17 00:00:00 2001 From: Mystiflow Date: Fri, 4 Aug 2017 07:10:10 +0100 Subject: [PATCH 1/7] Various scoreboard improvements. (#2204) - Correctly remove objectives that use heart type. - Also sends remove score packets on server switch. - Players are only removed if Team packet mode is 4. --- .../main/java/net/md_5/bungee/api/score/Objective.java | 2 +- proxy/src/main/java/net/md_5/bungee/ServerConnector.java | 8 +++++++- .../java/net/md_5/bungee/connection/DownstreamBridge.java | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/score/Objective.java b/api/src/main/java/net/md_5/bungee/api/score/Objective.java index b1afa57ec4..0dd256467c 100644 --- a/api/src/main/java/net/md_5/bungee/api/score/Objective.java +++ b/api/src/main/java/net/md_5/bungee/api/score/Objective.java @@ -22,5 +22,5 @@ public class Objective /** * Type; integer or hearts */ - private final String type; + private String type; } diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java index 2014b0c492..111ee8b43e 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java @@ -15,6 +15,7 @@ import net.md_5.bungee.api.event.ServerKickEvent; import net.md_5.bungee.api.event.ServerSwitchEvent; import net.md_5.bungee.api.score.Objective; +import net.md_5.bungee.api.score.Score; import net.md_5.bungee.api.score.Scoreboard; import net.md_5.bungee.api.score.Team; import net.md_5.bungee.chat.ComponentSerializer; @@ -37,6 +38,7 @@ import net.md_5.bungee.protocol.packet.PluginMessage; import net.md_5.bungee.protocol.packet.Respawn; import net.md_5.bungee.protocol.packet.ScoreboardObjective; +import net.md_5.bungee.protocol.packet.ScoreboardScore; import net.md_5.bungee.protocol.packet.SetCompression; @RequiredArgsConstructor @@ -209,7 +211,11 @@ public void handle(Login login) throws Exception Scoreboard serverScoreboard = user.getServerSentScoreboard(); for ( Objective objective : serverScoreboard.getObjectives() ) { - user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), "integer", (byte) 1 ) ); // TODO: + user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), objective.getType(), (byte) 1 ) ); + } + for ( Score score : serverScoreboard.getScores() ) + { + user.unsafe().sendPacket( new ScoreboardScore( score.getItemName(), (byte) 1, score.getScoreName(), score.getValue() ) ); } for ( Team team : serverScoreboard.getTeams() ) { diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java index c2dd942ff3..57fe06e5ba 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java @@ -135,6 +135,7 @@ public void handle(ScoreboardObjective objective) throws Exception if ( oldObjective != null ) { oldObjective.setValue( objective.getValue() ); + oldObjective.setType( objective.getType() ); } break; default: @@ -210,7 +211,7 @@ public void handle(net.md_5.bungee.protocol.packet.Team team) throws Exception if ( team.getMode() == 0 || team.getMode() == 3 ) { t.addPlayer( s ); - } else + } else if ( team.getMode() == 4 ) { t.removePlayer( s ); } From da88d5c50263517b4bca8d4aa9bcfcf637876b0b Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 6 Aug 2017 11:18:14 +1000 Subject: [PATCH 2/7] Formatting & dependency updates --- bootstrap/pom.xml | 6 +++--- pom.xml | 4 ++-- proxy/pom.xml | 2 +- proxy/src/main/java/net/md_5/bungee/UserConnection.java | 2 +- proxy/src/main/java/net/md_5/bungee/conf/Configuration.java | 2 +- .../java/net/md_5/bungee/connection/DownstreamBridge.java | 1 - .../java/net/md_5/bungee/connection/InitialHandler.java | 2 +- query/src/main/java/net/md_5/bungee/query/QueryHandler.java | 4 ++-- 8 files changed, 11 insertions(+), 12 deletions(-) diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml index 9c02b3893f..9b5c98f7d5 100644 --- a/bootstrap/pom.xml +++ b/bootstrap/pom.xml @@ -35,7 +35,7 @@ net.sf.jopt-simple jopt-simple - 4.8 + 4.9 compile @@ -46,7 +46,7 @@ org.apache.maven.plugins maven-jar-plugin - 2.4 + 3.0.2 @@ -60,7 +60,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.1 + 3.0.0 package diff --git a/pom.xml b/pom.xml index 6821d75046..28431e5b9e 100644 --- a/pom.xml +++ b/pom.xml @@ -87,8 +87,8 @@ com.google.code.findbugs - findbugs - 3.0.0 + findbugs-annotations + 3.0.1 provided diff --git a/proxy/pom.xml b/proxy/pom.xml index 1eae873302..211f4dedb3 100644 --- a/proxy/pom.xml +++ b/proxy/pom.xml @@ -87,7 +87,7 @@ mysql mysql-connector-java - 5.1.42 + 5.1.43 runtime diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index c45f841278..fb50dabe9e 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -255,7 +255,7 @@ public void connect(ServerInfo info, final Callback callback, final boo if ( getServer() == null && !ch.isClosing() ) { - throw new IllegalStateException("Cancelled ServerConnectEvent with no server or disconnect."); + throw new IllegalStateException( "Cancelled ServerConnectEvent with no server or disconnect." ); } return; } diff --git a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java index 217fe7613e..907246a98a 100644 --- a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java +++ b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java @@ -85,7 +85,7 @@ public void load() throttle = adapter.getInt( "connection_throttle", throttle ); ipForward = adapter.getBoolean( "ip_forward", ipForward ); compressionThreshold = adapter.getInt( "network_compression_threshold", compressionThreshold ); - preventProxyConnections = adapter.getBoolean( "prevent_proxy_connections", preventProxyConnections); + preventProxyConnections = adapter.getBoolean( "prevent_proxy_connections", preventProxyConnections ); disabledCommands = new CaseInsensitiveSet( (Collection) adapter.getList( "disabled_commands", Arrays.asList( "disabledcommandhere" ) ) ); diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java index 57fe06e5ba..4049e815af 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java @@ -1,6 +1,5 @@ package net.md_5.bungee.connection; -import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java index cb140d4a82..baa8dd3663 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java @@ -562,7 +562,7 @@ public void disconnect(BaseComponent reason) @Override public String getName() { - return (name != null ) ? name : ( loginRequest == null ) ? null : loginRequest.getData(); + return ( name != null ) ? name : ( loginRequest == null ) ? null : loginRequest.getData(); } @Override diff --git a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java index 614dd94a3a..79d6886a60 100644 --- a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java +++ b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java @@ -27,7 +27,7 @@ public class QueryHandler extends SimpleChannelInboundHandler private final ListenerInfo listener; /*========================================================================*/ private final Random random = new Random(); - private final Cache sessions = CacheBuilder.newBuilder().expireAfterWrite( 30, TimeUnit.SECONDS).build(); + private final Cache sessions = CacheBuilder.newBuilder().expireAfterWrite( 30, TimeUnit.SECONDS ).build(); private void writeShort(ByteBuf buf, int s) { @@ -124,7 +124,7 @@ protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throw writeString( out, entry.getKey() ); writeString( out, entry.getValue() ); } - out.writeByte( 0x00 ); // Null + out.writeByte( 0x00 ); // Null // Padding writeString( out, "\01player_\00" ); From dbf20957a9cd7c93ee6e08d3f255f49df2066d97 Mon Sep 17 00:00:00 2001 From: Foorack Date: Wed, 9 Aug 2017 16:38:03 +1000 Subject: [PATCH 3/7] Expand API to get all player sent settings --- .../md_5/bungee/api/SkinConfiguration.java | 24 +++++++ .../bungee/api/connection/ProxiedPlayer.java | 64 +++++++++++++++++ .../md_5/bungee/PlayerSkinConfiguration.java | 69 +++++++++++++++++++ .../java/net/md_5/bungee/UserConnection.java | 45 ++++++++++++ 4 files changed, 202 insertions(+) create mode 100644 api/src/main/java/net/md_5/bungee/api/SkinConfiguration.java create mode 100644 proxy/src/main/java/net/md_5/bungee/PlayerSkinConfiguration.java diff --git a/api/src/main/java/net/md_5/bungee/api/SkinConfiguration.java b/api/src/main/java/net/md_5/bungee/api/SkinConfiguration.java new file mode 100644 index 0000000000..28448ef6c3 --- /dev/null +++ b/api/src/main/java/net/md_5/bungee/api/SkinConfiguration.java @@ -0,0 +1,24 @@ +package net.md_5.bungee.api; + +/** + * Represents a player's skin settings. These settings can be changed by the + * player under Skin Configuration in the Options menu. + */ +public interface SkinConfiguration +{ + + boolean hasCape(); + + boolean hasJacket(); + + boolean hasLeftSleeve(); + + boolean hasRightSleeve(); + + boolean hasLeftPants(); + + boolean hasRightPants(); + + boolean hasHat(); + +} diff --git a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java index 375815c446..16cfff8bbe 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/ProxiedPlayer.java @@ -6,6 +6,7 @@ import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.SkinConfiguration; import net.md_5.bungee.api.Title; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.config.ServerInfo; @@ -17,6 +18,34 @@ public interface ProxiedPlayer extends Connection, CommandSender { + /** + * Represents the player's chat state. + */ + public enum ChatMode + { + + /** + * The player will see all chat. + */ + SHOWN, + /** + * The player will only see everything except messages marked as chat. + */ + COMMANDS_ONLY, + /** + * The chat is completely disabled, the player won't see anything. + */ + HIDDEN; + + } + + public enum MainHand + { + + LEFT, + RIGHT; + } + /** * Gets this player's display name. * @@ -142,6 +171,41 @@ public interface ProxiedPlayer extends Connection, CommandSender */ Locale getLocale(); + /** + * Gets this player's view distance. + * + * @return the view distance, or a reasonable default + */ + byte getViewDistance(); + + /** + * Gets this player's chat mode. + * + * @return the chat flags set, or a reasonable default + */ + ChatMode getChatMode(); + + /** + * Gets if this player has chat colors enabled or disabled. + * + * @return if chat colors are enabled + */ + boolean hasChatColors(); + + /** + * Gets this player's skin settings. + * + * @return the players skin setting + */ + SkinConfiguration getSkinParts(); + + /** + * Gets this player's main hand setting. + * + * @return main hand setting + */ + MainHand getMainHand(); + /** * Set the header and footer displayed in the tab player list. * diff --git a/proxy/src/main/java/net/md_5/bungee/PlayerSkinConfiguration.java b/proxy/src/main/java/net/md_5/bungee/PlayerSkinConfiguration.java new file mode 100644 index 0000000000..a5c4e88a3b --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/PlayerSkinConfiguration.java @@ -0,0 +1,69 @@ +package net.md_5.bungee; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import net.md_5.bungee.api.SkinConfiguration; + +/* + * Bitmask, displayed Skin Parts flags: + * + * Bit 0 (0x01 ): Cape enabled + * Bit 1 (0x02): Jacket enabled + * Bit 2 (0x04): Left Sleeve enabled + * Bit 3 (0x08): Right Sleeve enabled + * Bit 4 (0x10): Left Pants Leg enabled + * Bit 5 (0x20): Right Pants Leg enabled + * Bit 6 (0x40): Hat enabled + * The most significant bit (bit 7, 0x80) appears to be unused. + */ +@AllArgsConstructor(access = AccessLevel.PUBLIC) +public class PlayerSkinConfiguration implements SkinConfiguration +{ + + // 127 = 01111111 + static final SkinConfiguration SKIN_SHOW_ALL = new PlayerSkinConfiguration( (byte) 127 ); + // + private final byte bitmask; + + @Override + public boolean hasCape() + { + return ( ( bitmask >> 0 ) & 1 ) == 1; + } + + @Override + public boolean hasJacket() + { + return ( ( bitmask >> 1 ) & 1 ) == 1; + } + + @Override + public boolean hasLeftSleeve() + { + return ( ( bitmask >> 2 ) & 1 ) == 1; + } + + @Override + public boolean hasRightSleeve() + { + return ( ( bitmask >> 3 ) & 1 ) == 1; + } + + @Override + public boolean hasLeftPants() + { + return ( ( bitmask >> 4 ) & 1 ) == 1; + } + + @Override + public boolean hasRightPants() + { + return ( ( bitmask >> 5 ) & 1 ) == 1; + } + + @Override + public boolean hasHat() + { + return ( ( bitmask >> 6 ) & 1 ) == 1; + } +} diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index fb50dabe9e..a21b30c8bd 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -27,6 +27,7 @@ import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.SkinConfiguration; import net.md_5.bungee.api.Title; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; @@ -547,6 +548,50 @@ public Locale getLocale() return ( locale == null && settings != null ) ? locale = Locale.forLanguageTag( settings.getLocale().replaceAll( "_", "-" ) ) : locale; } + @Override + public byte getViewDistance() + { + return ( settings != null ) ? settings.getViewDistance() : 10; + } + + @Override + public ProxiedPlayer.ChatMode getChatMode() + { + if ( settings == null ) + { + return ProxiedPlayer.ChatMode.SHOWN; + } + + switch ( settings.getChatFlags() ) + { + default: + case 0: + return ProxiedPlayer.ChatMode.SHOWN; + case 1: + return ProxiedPlayer.ChatMode.COMMANDS_ONLY; + case 2: + return ProxiedPlayer.ChatMode.HIDDEN; + } + } + + @Override + public boolean hasChatColors() + { + return settings == null || settings.isChatColours(); + } + + @Override + public SkinConfiguration getSkinParts() + { + return ( settings != null ) ? new PlayerSkinConfiguration( settings.getSkinParts() ) : PlayerSkinConfiguration.SKIN_SHOW_ALL; + } + + @Override + public ProxiedPlayer.MainHand getMainHand() + { + return ( settings != null && settings.getMainHand() == 1 ) ? ProxiedPlayer.MainHand.RIGHT : ProxiedPlayer.MainHand.LEFT; + } + @Override public boolean isForgeUser() { From 10395540399a8f51ce6ca5bc36b921f9814f07f8 Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 9 Aug 2017 16:45:53 +1000 Subject: [PATCH 4/7] Update Mojang translations to 1.12.1 --- .../mojang-translations/en_US.properties | 1009 ++++++++++++----- .../api/chat/TranslatableComponentTest.java | 2 - 2 files changed, 718 insertions(+), 293 deletions(-) diff --git a/chat/src/main/resources/mojang-translations/en_US.properties b/chat/src/main/resources/mojang-translations/en_US.properties index 3b2d7cdd67..a5afd07c8f 100644 --- a/chat/src/main/resources/mojang-translations/en_US.properties +++ b/chat/src/main/resources/mojang-translations/en_US.properties @@ -1,7 +1,8 @@ +# (c) 2017 Mojang AB language.name=English language.region=United States -language.code=en_US +language.code=en_us gui.done=Done gui.cancel=Cancel @@ -15,6 +16,10 @@ gui.no=No gui.none=None gui.all=All +gui.recipebook.moreRecipes=Right Click for more +gui.recipebook.toggleRecipes.all=Showing all +gui.recipebook.toggleRecipes.craftable=Showing craftable + translation.test.none=Hello, world! translation.test.complex=Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again! translation.test.escape=%%s %%%s %%%%s %%%%%s @@ -23,7 +28,7 @@ translation.test.invalid2=hi % s translation.test.args=%s %s translation.test.world=world -menu.game=Game menu +menu.game=Game Menu menu.singleplayer=Singleplayer menu.multiplayer=Multiplayer menu.online=Minecraft Realms @@ -60,7 +65,7 @@ selectWorld.newWorld=New World selectWorld.newWorld.copyOf=Copy of %s selectWorld.enterName=World Name selectWorld.resultFolder=Will be saved in: -selectWorld.enterSeed=Seed for the World Generator +selectWorld.enterSeed=Seed for the world generator selectWorld.seedInfo=Leave blank for a random seed selectWorld.cheats=Cheats selectWorld.customizeType=Customize @@ -68,12 +73,15 @@ selectWorld.version=Version: selectWorld.versionUnknown=unknown selectWorld.versionQuestion=Do you really want to load this world? selectWorld.versionWarning=This world was saved in version '%s' and loading it in this version could cause corruption! -selectWorld.versionJoinButton=Use anyway +selectWorld.versionJoinButton=Use Anyway selectWorld.tooltip.fromNewerVersion1=World was saved in a newer version, selectWorld.tooltip.fromNewerVersion2=loading this world could cause problems! selectWorld.tooltip.snapshot1=Don't forget to backup this world selectWorld.tooltip.snapshot2=before you load it in this snapshot. +selectWorld.unable_to_load=Unable to load worlds +selectWorld.load_folder_access=Unable to read or access folder where game worlds are saved! + createWorld.customize.presets=Presets createWorld.customize.presets.title=Select a Preset createWorld.customize.presets.select=Use Preset @@ -85,10 +93,19 @@ createWorld.customize.flat.height=Height createWorld.customize.flat.addLayer=Add Layer createWorld.customize.flat.editLayer=Edit Layer createWorld.customize.flat.removeLayer=Remove Layer -createWorld.customize.flat.layer.top=Top - %d -createWorld.customize.flat.layer=%d -createWorld.customize.flat.layer.bottom=Bottom - %d -createWorld.customize.flat.air=Air +createWorld.customize.flat.layer.top=Top - %s +createWorld.customize.flat.layer=%s +createWorld.customize.flat.layer.bottom=Bottom - %s + +createWorld.customize.preset.classic_flat=Classic Flat +createWorld.customize.preset.tunnelers_dream=Tunnelers' Dream +createWorld.customize.preset.water_world=Water World +createWorld.customize.preset.overworld=Overworld +createWorld.customize.preset.snowy_kingdom=Snowy Kingdom +createWorld.customize.preset.bottomless_pit=Bottomless Pit +createWorld.customize.preset.desert=Desert +createWorld.customize.preset.redstone_ready=Redstone Ready +createWorld.customize.preset.the_void=The Void createWorld.customize.custom.page0=Basic Settings createWorld.customize.custom.page1=Ore Settings @@ -124,6 +141,7 @@ createWorld.customize.custom.useVillages=Villages createWorld.customize.custom.useMineShafts=Mineshafts createWorld.customize.custom.useTemples=Temples createWorld.customize.custom.useMonuments=Ocean Monuments +createWorld.customize.custom.useMansions=Woodland Mansions createWorld.customize.custom.useRavines=Ravines createWorld.customize.custom.useDungeons=Dungeons createWorld.customize.custom.dungeonChance=Dungeon Count @@ -136,12 +154,12 @@ createWorld.customize.custom.fixedBiome=Biome createWorld.customize.custom.biomeSize=Biome Size createWorld.customize.custom.riverSize=River Size -createWorld.customize.custom.size= Spawn Size -createWorld.customize.custom.count= Spawn Tries -createWorld.customize.custom.minHeight= Min. Height -createWorld.customize.custom.maxHeight= Max. Height -createWorld.customize.custom.center= Center Height -createWorld.customize.custom.spread= Spread Height +createWorld.customize.custom.size=Spawn Size +createWorld.customize.custom.count=Spawn Tries +createWorld.customize.custom.minHeight=Min. Height +createWorld.customize.custom.maxHeight=Max. Height +createWorld.customize.custom.center=Center Height +createWorld.customize.custom.spread=Spread Height createWorld.customize.custom.presets.title=Customize World Presets createWorld.customize.custom.presets=Presets @@ -160,6 +178,15 @@ gameMode.spectator=Spectator Mode gameMode.hardcore=Hardcore Mode! gameMode.changed=Your game mode has been updated to %s +spectatorMenu.previous_page=Previous Page +spectatorMenu.next_page=Next Page +spectatorMenu.close=Close Menu +spectatorMenu.teleport=Teleport to Player +spectatorMenu.teleport.prompt=Select a player to teleport to +spectatorMenu.team_teleport=Teleport to Team Member +spectatorMenu.team_teleport.prompt=Select a team to teleport to +spectatorMenu.root.prompt=Press a key to select a command, and again to use it. + selectWorld.gameMode=Game Mode selectWorld.gameMode.survival=Survival selectWorld.gameMode.survival.line1=Search for resources, crafting, gain @@ -202,7 +229,7 @@ selectServer.select=Join Server selectServer.direct=Direct Connect selectServer.edit=Edit selectServer.delete=Delete -selectServer.add=Add server +selectServer.add=Add Server selectServer.defaultName=Minecraft Server selectServer.deleteQuestion=Are you sure you want to remove this server? selectServer.deleteWarning=will be lost forever! (A long time!) @@ -230,19 +257,50 @@ multiplayer.ipinfo=Enter the IP of a server to connect to it: multiplayer.texturePrompt.line1=This server recommends the use of a custom resource pack. multiplayer.texturePrompt.line2=Would you like to download and install it automagically? multiplayer.downloadingTerrain=Loading terrain -multiplayer.downloadingStats=Downloading statistics & achievements... +multiplayer.downloadingStats=Downloading statistics... multiplayer.stopSleeping=Leave Bed multiplayer.player.joined=%s joined the game multiplayer.player.joined.renamed=%s (formerly known as %s) joined the game multiplayer.player.left=%s left the game +multiplayer.status.and_more=... and %s more ... +multiplayer.status.cancelled=Cancelled +multiplayer.status.cannot_connect=Can't connect to server +multiplayer.status.cannot_resolve=Can't resolve hostname +multiplayer.status.client_out_of_date=Client out of date! +multiplayer.status.no_connection=(no connection) +multiplayer.status.old=Old +multiplayer.status.pinging=Pinging... +multiplayer.status.server_out_of_date=Server out of date! +multiplayer.status.unknown=??? +multiplayer.status.unrequested=Received unrequested status +multiplayer.disconnect.authservers_down=Authentication servers are down. Please try again later, sorry! +multiplayer.disconnect.banned=You are banned from this server. +multiplayer.disconnect.duplicate_login=You logged in from another location +multiplayer.disconnect.flying=Flying is not enabled on this server +multiplayer.disconnect.generic=Disconnected +multiplayer.disconnect.idling=You have been idle for too long! +multiplayer.disconnect.illegal_characters=Illegal characters in chat +multiplayer.disconnect.invalid_entity_attacked=Attempting to attack an invalid entity +multiplayer.disconnect.invalid_player_movement=Invalid move player packet received +multiplayer.disconnect.invalid_vehicle_movement=Invalid move vehicle packet received +multiplayer.disconnect.ip_banned=You have been IP banned. +multiplayer.disconnect.kicked=Kicked by an operator. +multiplayer.disconnect.outdated_client=Outdated client! Please use %s +multiplayer.disconnect.outdated_server=Outdated server! I'm still on %s +multiplayer.disconnect.server_shutdown=Server closed +multiplayer.disconnect.slow_login=Took too long to log in +multiplayer.disconnect.unverified_username=Failed to verify username! + chat.cannotSend=Cannot send chat message chat.type.text=<%s> %s +chat.type.text.narrate=%s says %s chat.type.emote=* %s %s chat.type.announcement=[%s] %s chat.type.admin=[%s: %s] -chat.type.achievement=%s has just earned the achievement %s -chat.type.achievement.taken=%s has lost the achievement %s +chat.type.advancement.task=%s has made the advancement %s +chat.type.advancement.challenge=%s has completed the challenge %s +chat.type.advancement.goal=%s has reached the goal %s chat.link.confirm=Are you sure you want to open the following website? chat.link.warning=Never open links from people that you don't trust! chat.copy=Copy to Clipboard @@ -262,13 +320,13 @@ demo.day.6=You have passed your fifth day, use F2 to save a screenshot of your c demo.reminder=The demo time has expired, buy the game to continue or start a new world! demo.remainingTime=Remaining time: %s demo.demoExpired=Demo time's up! -demo.help.movement=Use %1$s, %2$s, %3$s, %4$s and the mouse to move around -demo.help.movementShort=Move by pressing %1$s, %2$s, %3$s, %4$s +demo.help.movement=Use the %1$s, %2$s, %3$s, %4$s keys and the mouse to move around +demo.help.movementShort=Move by pressing the %1$s, %2$s, %3$s, %4$s keys demo.help.movementMouse=Look around using the mouse -demo.help.jump=Jump by pressing %1$s -demo.help.inventory=Use %1$s to open your inventory +demo.help.jump=Jump by pressing the %1$s key +demo.help.inventory=Use the %1$s key to open your inventory demo.help.title=Minecraft Demo Mode -demo.help.fullWrapped=This demo will last 5 ingame days (about 1 hour and 40 minutes of real time). Check the achievements for hints! Have fun! +demo.help.fullWrapped=This demo will last 5 ingame days (about 1 hour and 40 minutes of real time). Check the advancements for hints! Have fun! demo.help.buy=Purchase Now! demo.help.later=Continue Playing! @@ -285,7 +343,7 @@ disconnect.closed=Connection closed disconnect.loginFailed=Failed to login disconnect.loginFailedInfo=Failed to login: %s disconnect.loginFailedInfo.serversUnavailable=The authentication servers are currently down for maintenance. -disconnect.loginFailedInfo.invalidSession=Invalid session (Try restarting your game) +disconnect.loginFailedInfo.invalidSession=Invalid session (Try restarting your game and the launcher) disconnect.quitting=Quitting disconnect.endOfStream=End of stream disconnect.overflow=Buffer overflow @@ -293,7 +351,7 @@ disconnect.spam=Kicked for spamming soundCategory.master=Master Volume soundCategory.music=Music -soundCategory.record=Jukebox/Noteblocks +soundCategory.record=Jukebox/Note Blocks soundCategory.weather=Weather soundCategory.hostile=Hostile Creatures soundCategory.neutral=Friendly Creatures @@ -337,6 +395,8 @@ options.ao.off=OFF options.ao.min=Minimum options.ao.max=Maximum options.anaglyph=3D Anaglyph +options.chunks=%s chunks +options.framerate=%s fps options.framerateLimit=Max Framerate options.framerateLimit.max=Unlimited options.difficulty=Difficulty @@ -348,17 +408,14 @@ options.difficulty.hardcore=Hardcore options.graphics=Graphics options.graphics.fancy=Fancy options.graphics.fast=Fast +options.clouds.fancy=Fancy +options.clouds.fast=Fast options.guiScale=GUI Scale options.guiScale.auto=Auto options.guiScale.small=Small options.guiScale.normal=Normal options.guiScale.large=Large -options.postProcessEnable=Enable Post-Processing options.renderClouds=Clouds -options.postButton=Post-Processing Settings... -options.postVideoTitle=Post-Processing Settings -options.farWarning1=A 64 bit Java installation is recommended -options.farWarning2=for 'Far' render distance (you have 32 bit) options.particles=Particles options.particles.all=All options.particles.decreased=Decreased @@ -388,8 +445,8 @@ options.modelPart.left_pants_leg=Left Pants Leg options.modelPart.right_pants_leg=Right Pants Leg options.snooper=Allow Snooper options.snooper.view=Snooper Settings... -options.snooper.title=Machine Specs Collection -options.snooper.desc=We want to collect information about your machine to help improve Minecraft by knowing what we can support and where the biggest problems are. All of this information is completely anonymous and viewable below. We promise we won't do anything bad with this data, but if you want to opt out then feel free to toggle it off! +options.snooper.title=Feed us data! +options.snooper.desc=We always want to improve Minecraft and, to help us do that, we'd like to collect some information. This lets us know what hardware to support and where the big problems are. It also gives us a sense of the size of our active player base, so we know if we're doing a good job. You can view all the information we collect below. If you want to opt out then you can simply toggle it off! options.resourcepack=Resource Packs... options.fullscreen=Fullscreen options.vsync=Use VSync @@ -405,11 +462,20 @@ options.attack.crosshair=Crosshair options.attack.hotbar=Hotbar options.showSubtitles=Show Subtitles options.realmsNotifications=Realms Notifications -options.autoJump=Auto-jump +options.autoJump=Auto-Jump +options.narrator=Narrator +options.narrator.off=Off +options.narrator.all=Narrates all +options.narrator.chat=Narrates chat +options.narrator.system=Narrates system +options.narrator.notavailable=Not available options.mipmapLevels=Mipmap Levels options.forceUnicodeFont=Force Unicode Font +narrator.toast.disabled=Narrator Disabled +narrator.toast.enabled=Narrator Enabled + difficulty.lock.title=Lock World Difficulty difficulty.lock.question=Are you sure you want to lock the difficulty of this world? This will set this world to always be %1$s, and you will never be able to change that again. @@ -436,6 +502,9 @@ key.attack=Attack/Destroy key.use=Use Item/Place Block key.pickItem=Pick Block key.mouseButton=Button %1$s +key.mouse.left=Left Click +key.mouse.middle=Middle Click +key.mouse.right=Right Click key.command=Open Command key.screenshot=Take Screenshot key.togglePerspective=Toggle Perspective @@ -451,6 +520,9 @@ key.hotbar.6=Hotbar Slot 6 key.hotbar.7=Hotbar Slot 7 key.hotbar.8=Hotbar Slot 8 key.hotbar.9=Hotbar Slot 9 +key.saveToolbarActivator=Save Toolbar Activator +key.loadToolbarActivator=Load Toolbar Activator +key.advancements=Advancements key.categories.movement=Movement key.categories.misc=Miscellaneous @@ -458,8 +530,9 @@ key.categories.multiplayer=Multiplayer key.categories.gameplay=Gameplay key.categories.ui=Game Interface key.categories.inventory=Inventory +key.categories.creative=Creative Mode -resourcePack.openFolder=Open resource pack folder +resourcePack.openFolder=Open Resource Pack Folder resourcePack.title=Select Resource Packs resourcePack.available.title=Available Resource Packs resourcePack.selected.title=Selected Resource Packs @@ -486,6 +559,7 @@ book.generation.3=Tattered merchant.deprecated=Trade something else to unlock! +tile.air.name=Air tile.barrier.name=Barrier tile.stone.stone.name=Stone tile.stone.granite.name=Granite @@ -689,30 +763,30 @@ tile.woolCarpet.yellow.name=Yellow Carpet tile.woolCarpet.lightBlue.name=Light Blue Carpet tile.woolCarpet.magenta.name=Magenta Carpet tile.woolCarpet.orange.name=Orange Carpet -tile.woolCarpet.white.name=Carpet +tile.woolCarpet.white.name=White Carpet tile.ice.name=Ice tile.frostedIce.name=Frosted Ice tile.icePacked.name=Packed Ice tile.cactus.name=Cactus tile.clay.name=Clay -tile.clayHardenedStained.name=Stained Hardened Clay -tile.clayHardenedStained.black.name=Black Hardened Clay -tile.clayHardenedStained.red.name=Red Hardened Clay -tile.clayHardenedStained.green.name=Green Hardened Clay -tile.clayHardenedStained.brown.name=Brown Hardened Clay -tile.clayHardenedStained.blue.name=Blue Hardened Clay -tile.clayHardenedStained.purple.name=Purple Hardened Clay -tile.clayHardenedStained.cyan.name=Cyan Hardened Clay -tile.clayHardenedStained.silver.name=Light Gray Hardened Clay -tile.clayHardenedStained.gray.name=Gray Hardened Clay -tile.clayHardenedStained.pink.name=Pink Hardened Clay -tile.clayHardenedStained.lime.name=Lime Hardened Clay -tile.clayHardenedStained.yellow.name=Yellow Hardened Clay -tile.clayHardenedStained.lightBlue.name=Light Blue Hardened Clay -tile.clayHardenedStained.magenta.name=Magenta Hardened Clay -tile.clayHardenedStained.orange.name=Orange Hardened Clay -tile.clayHardenedStained.white.name=White Hardened Clay -tile.clayHardened.name=Hardened Clay +tile.clayHardenedStained.name=Stained Terracotta +tile.clayHardenedStained.black.name=Black Terracotta +tile.clayHardenedStained.red.name=Red Terracotta +tile.clayHardenedStained.green.name=Green Terracotta +tile.clayHardenedStained.brown.name=Brown Terracotta +tile.clayHardenedStained.blue.name=Blue Terracotta +tile.clayHardenedStained.purple.name=Purple Terracotta +tile.clayHardenedStained.cyan.name=Cyan Terracotta +tile.clayHardenedStained.silver.name=Light Gray Terracotta +tile.clayHardenedStained.gray.name=Gray Terracotta +tile.clayHardenedStained.pink.name=Pink Terracotta +tile.clayHardenedStained.lime.name=Lime Terracotta +tile.clayHardenedStained.yellow.name=Yellow Terracotta +tile.clayHardenedStained.lightBlue.name=Light Blue Terracotta +tile.clayHardenedStained.magenta.name=Magenta Terracotta +tile.clayHardenedStained.orange.name=Orange Terracotta +tile.clayHardenedStained.white.name=White Terracotta +tile.clayHardened.name=Terracotta tile.reeds.name=Sugar cane tile.jukebox.name=Jukebox tile.fence.name=Oak Fence @@ -749,16 +823,16 @@ tile.cloth.yellow.name=Yellow Wool tile.cloth.lightBlue.name=Light Blue Wool tile.cloth.magenta.name=Magenta Wool tile.cloth.orange.name=Orange Wool -tile.cloth.white.name=Wool +tile.cloth.white.name=White Wool tile.oreLapis.name=Lapis Lazuli Ore tile.blockLapis.name=Lapis Lazuli Block tile.dispenser.name=Dispenser tile.dropper.name=Dropper tile.musicBlock.name=Note Block tile.cake.name=Cake -tile.bed.name=Bed tile.bed.occupied=This bed is occupied tile.bed.noSleep=You can only sleep at night +tile.bed.tooFarAway=You may not rest now, the bed is too far away tile.bed.notSafe=You may not rest now, there are monsters nearby tile.bed.notValid=Your home bed was missing or obstructed tile.lockedchest.name=Locked chest @@ -844,6 +918,71 @@ tile.magma.name=Magma Block tile.netherWartBlock.name=Nether Wart Block tile.redNetherBrick.name=Red Nether Brick tile.boneBlock.name=Bone Block +tile.observer.name=Observer +tile.shulkerBoxWhite.name=White Shulker Box +tile.shulkerBoxOrange.name=Orange Shulker Box +tile.shulkerBoxMagenta.name=Magenta Shulker Box +tile.shulkerBoxLightBlue.name=Light Blue Shulker Box +tile.shulkerBoxYellow.name=Yellow Shulker Box +tile.shulkerBoxLime.name=Lime Shulker Box +tile.shulkerBoxPink.name=Pink Shulker Box +tile.shulkerBoxGray.name=Gray Shulker Box +tile.shulkerBoxSilver.name=Light Gray Shulker Box +tile.shulkerBoxCyan.name=Cyan Shulker Box +tile.shulkerBoxPurple.name=Purple Shulker Box +tile.shulkerBoxBlue.name=Blue Shulker Box +tile.shulkerBoxBrown.name=Brown Shulker Box +tile.shulkerBoxGreen.name=Green Shulker Box +tile.shulkerBoxRed.name=Red Shulker Box +tile.shulkerBoxBlack.name=Black Shulker Box +tile.glazedTerracottaWhite.name=White Glazed Terracotta +tile.glazedTerracottaOrange.name=Orange Glazed Terracotta +tile.glazedTerracottaMagenta.name=Magenta Glazed Terracotta +tile.glazedTerracottaLightBlue.name=Light Blue Glazed Terracotta +tile.glazedTerracottaYellow.name=Yellow Glazed Terracotta +tile.glazedTerracottaLime.name=Lime Glazed Terracotta +tile.glazedTerracottaPink.name=Pink Glazed Terracotta +tile.glazedTerracottaGray.name=Gray Glazed Terracotta +tile.glazedTerracottaSilver.name=Light Gray Glazed Terracotta +tile.glazedTerracottaCyan.name=Cyan Glazed Terracotta +tile.glazedTerracottaPurple.name=Purple Glazed Terracotta +tile.glazedTerracottaBlue.name=Blue Glazed Terracotta +tile.glazedTerracottaBrown.name=Brown Glazed Terracotta +tile.glazedTerracottaGreen.name=Green Glazed Terracotta +tile.glazedTerracottaRed.name=Red Glazed Terracotta +tile.glazedTerracottaBlack.name=Black Glazed Terracotta +tile.concrete.black.name=Black Concrete +tile.concrete.red.name=Red Concrete +tile.concrete.green.name=Green Concrete +tile.concrete.brown.name=Brown Concrete +tile.concrete.blue.name=Blue Concrete +tile.concrete.purple.name=Purple Concrete +tile.concrete.cyan.name=Cyan Concrete +tile.concrete.silver.name=Light Gray Concrete +tile.concrete.gray.name=Gray Concrete +tile.concrete.pink.name=Pink Concrete +tile.concrete.lime.name=Lime Concrete +tile.concrete.yellow.name=Yellow Concrete +tile.concrete.lightBlue.name=Light Blue Concrete +tile.concrete.magenta.name=Magenta Concrete +tile.concrete.orange.name=Orange Concrete +tile.concrete.white.name=White Concrete +tile.concretePowder.black.name=Black Concrete Powder +tile.concretePowder.red.name=Red Concrete Powder +tile.concretePowder.green.name=Green Concrete Powder +tile.concretePowder.brown.name=Brown Concrete Powder +tile.concretePowder.blue.name=Blue Concrete Powder +tile.concretePowder.purple.name=Purple Concrete Powder +tile.concretePowder.cyan.name=Cyan Concrete Powder +tile.concretePowder.silver.name=Light Gray Concrete Powder +tile.concretePowder.gray.name=Gray Concrete Powder +tile.concretePowder.pink.name=Pink Concrete Powder +tile.concretePowder.lime.name=Lime Concrete Powder +tile.concretePowder.yellow.name=Yellow Concrete Powder +tile.concretePowder.lightBlue.name=Light Blue Concrete Powder +tile.concretePowder.magenta.name=Magenta Concrete Powder +tile.concretePowder.orange.name=Orange Concrete Powder +tile.concretePowder.white.name=White Concrete Powder tile.structureVoid.name=Structure Void tile.structureBlock.name=Structure Block @@ -1014,7 +1153,22 @@ item.dyePowder.orange.name=Orange Dye item.dyePowder.white.name=Bone Meal item.sugar.name=Sugar item.cake.name=Cake -item.bed.name=Bed +item.bed.black.name=Black Bed +item.bed.red.name=Red Bed +item.bed.green.name=Green Bed +item.bed.brown.name=Brown Bed +item.bed.blue.name=Blue Bed +item.bed.purple.name=Purple Bed +item.bed.cyan.name=Cyan Bed +item.bed.silver.name=Light Gray Bed +item.bed.gray.name=Gray Bed +item.bed.pink.name=Pink Bed +item.bed.lime.name=Lime Bed +item.bed.yellow.name=Yellow Bed +item.bed.lightBlue.name=Light Blue Bed +item.bed.magenta.name=Magenta Bed +item.bed.orange.name=Orange Bed +item.bed.white.name=White Bed item.diode.name=Redstone Repeater item.comparator.name=Redstone Comparator item.map.name=Map @@ -1026,6 +1180,8 @@ item.blazeRod.name=Blaze Rod item.ghastTear.name=Ghast Tear item.netherStalkSeeds.name=Nether Wart item.potion.name=Potion +item.splash_potion.name=Splash Potion +item.lingering_potion.name=Lingering Potion item.end_crystal.name=End Crystal item.goldNugget.name=Gold Nugget item.glassBottle.name=Glass Bottle @@ -1104,6 +1260,10 @@ item.beetroot_seeds.name=Beetroot Seeds item.beetroot_soup.name=Beetroot Soup item.dragon_breath.name=Dragon's Breath item.elytra.name=Elytra +item.totem.name=Totem of Undying +item.shulkerShell.name=Shulker Shell +item.ironNugget.name=Iron Nugget +item.knowledgeBook.name=Knowledge Book container.inventory=Inventory container.hopper=Item Hopper @@ -1113,12 +1273,13 @@ container.dropper=Dropper container.furnace=Furnace container.enchant=Enchant container.enchant.lapis.one=1 Lapis Lazuli -container.enchant.lapis.many=%d Lapis Lazuli +container.enchant.lapis.many=%s Lapis Lazuli container.enchant.level.one=1 Enchantment Level -container.enchant.level.many=%d Enchantment Levels +container.enchant.level.many=%s Enchantment Levels +container.enchant.level.requirement=Level requirement: %s container.enchant.clue=%s . . . ? container.repair=Repair & Name -container.repair.cost=Enchantment Cost: %1$d +container.repair.cost=Enchantment Cost: %1$s container.repair.expensive=Too Expensive! container.creative=Item Selection container.brewing=Brewing Stand @@ -1126,6 +1287,8 @@ container.chest=Chest container.chestDouble=Large Chest container.enderchest=Ender Chest container.beacon=Beacon +container.shulkerBox=Shulker Box +container.shulkerBox.more=and %s more... container.spectatorCantOpen=Unable to open. Loot not generated yet. container.isLocked=%s is locked! @@ -1138,10 +1301,10 @@ structure_block.load_not_found=Structure '%s' is not available structure_block.size_success=Size successfully detected for '%s' structure_block.size_failure=Unable to detect structure size, add corners with matching structure names -structure_block.mode.save=[S] -structure_block.mode.load=[L] -structure_block.mode.data=[D] -structure_block.mode.corner=[C] +structure_block.mode.save=Save +structure_block.mode.load=Load +structure_block.mode.data=Data +structure_block.mode.corner=Corner structure_block.hover.save=Save: %s structure_block.hover.load=Load: %s structure_block.hover.data=Data: %s @@ -1167,6 +1330,15 @@ item.dyed=Dyed item.unbreakable=Unbreakable item.canBreak=Can break: item.canPlace=Can be placed on: +item.color=Color: %s +item.nbt_tags=NBT: %s tag(s) +item.durability=Durability: %s / %s + +filled_map.mansion=Woodland Explorer Map +filled_map.monument=Ocean Explorer Map +filled_map.unknown=Unknown Map +filled_map.level=(Level %s/%s) +filled_map.scale=Scaling at 1:%s entity.Item.name=Item entity.XPOrb.name=Experience Orb @@ -1202,14 +1374,21 @@ entity.Blaze.name=Blaze entity.LavaSlime.name=Magma Cube entity.MushroomCow.name=Mooshroom entity.Villager.name=Villager +entity.ZombieVillager.name=Zombie Villager entity.VillagerGolem.name=Iron Golem entity.SnowMan.name=Snow Golem entity.EnderDragon.name=Ender Dragon entity.WitherBoss.name=Wither entity.Witch.name=Witch entity.Guardian.name=Guardian +entity.ElderGuardian.name=Elder Guardian entity.Shulker.name=Shulker entity.PolarBear.name=Polar Bear +entity.EvocationIllager.name=Evoker +entity.Vex.name=Vex +entity.VindicationIllager.name=Vindicator +entity.Parrot.name=Parrot +entity.IllusionIllager.name=Illusioner entity.Villager.farmer=Farmer entity.Villager.fisherman=Fisherman @@ -1222,6 +1401,8 @@ entity.Villager.weapon=Weapon Smith entity.Villager.tool=Tool Smith entity.Villager.butcher=Butcher entity.Villager.leather=Leatherworker +entity.Villager.nitwit=Nitwit +entity.Villager.cartographer=Cartographer entity.Pig.name=Pig entity.Sheep.name=Sheep @@ -1232,13 +1413,14 @@ entity.Wolf.name=Wolf entity.Ozelot.name=Ocelot entity.Cat.name=Cat entity.Bat.name=Bat -entity.EntityHorse.name=Horse +entity.Horse.name=Horse entity.Donkey.name=Donkey entity.Mule.name=Mule entity.SkeletonHorse.name=Skeleton Horse entity.ZombieHorse.name=Zombie Horse entity.Rabbit.name=Rabbit entity.KillerBunny.name=The Killer Bunny +entity.Llama.name=Llama entity.PrimedTnt.name=Block of TNT entity.FallingSand.name=Falling Block @@ -1270,6 +1452,7 @@ death.attack.lava.player=%1$s tried to swim in lava to escape %2$s death.attack.hotFloor=%1$s discovered floor was lava death.attack.hotFloor.player=%1$s walked into danger zone due to %2$s death.attack.inWall=%1$s suffocated in a wall +death.attack.cramming=%1$s was squished too much death.attack.drown=%1$s drowned death.attack.drown.player=%1$s drowned whilst trying to escape %2$s death.attack.starve=%1$s starved to death @@ -1298,6 +1481,7 @@ death.attack.fall=%1$s hit the ground too hard death.attack.outOfWorld=%1$s fell out of the world death.attack.dragonBreath=%1$s was roasted in dragon breath death.attack.flyIntoWall=%1$s experienced kinetic energy +death.attack.fireworks=%1$s went off with a bang deathScreen.respawn=Respawn deathScreen.spectate=Spectate world @@ -1338,7 +1522,7 @@ effect.luck=Luck effect.unluck=Bad Luck effect.levitation=Levitation -tipped_arrow.effect.empty=Tipped Arrow +tipped_arrow.effect.empty=Uncraftable Tipped Arrow tipped_arrow.effect.water=Tipped Arrow tipped_arrow.effect.mundane=Tipped Arrow tipped_arrow.effect.thick=Tipped Arrow @@ -1433,6 +1617,7 @@ enchantment.damage.undead=Smite enchantment.damage.arthropods=Bane of Arthropods enchantment.knockback=Knockback enchantment.fire=Fire Aspect +enchantment.sweeping=Sweeping Edge enchantment.protect.all=Protection enchantment.protect.fire=Fire Protection enchantment.protect.fall=Feather Falling @@ -1455,6 +1640,8 @@ enchantment.arrowKnockback=Punch enchantment.arrowInfinite=Infinity enchantment.thorns=Thorns enchantment.mending=Mending +enchantment.binding_curse=Curse of Binding +enchantment.vanishing_curse=Curse of Vanishing enchantment.level.1=I enchantment.level.2=II @@ -1467,10 +1654,14 @@ enchantment.level.8=VIII enchantment.level.9=IX enchantment.level.10=X -gui.achievements=Achievements +gui.advancements=Advancements gui.stats=Statistics -stats.tooltip.type.achievement=Achievement +advancements.empty=There doesn't seem to be anything here... +advancements.toast.task=Advancement Made! +advancements.toast.challenge=Challenge Complete! +advancements.toast.goal=Goal Reached! + stats.tooltip.type.statistic=Statistic stat.generalButton=General stat.blocksButton=Blocks @@ -1481,18 +1672,18 @@ stat.used=Times Used stat.mined=Times Mined stat.depleted=Times Depleted stat.crafted=Times Crafted -stat.entityKills=You killed %d %s -stat.entityKilledBy=%s killed you %d time(s) +stat.entityKills=You killed %s %s +stat.entityKilledBy=%s killed you %s time(s) stat.entityKills.none=You have never killed %s stat.entityKilledBy.none=You have never been killed by %s -stat.startGame=Times played -stat.createWorld=Worlds created -stat.loadWorld=Saves loaded -stat.joinMultiplayer=Multiplayer joins -stat.leaveGame=Games quit +stat.startGame=Times Played +stat.createWorld=Worlds Created +stat.loadWorld=Saves Loaded +stat.joinMultiplayer=Multiplayer Joins +stat.leaveGame=Games Quit -stat.playOneMinute=Minutes Played +stat.playOneMinute=Time Played stat.timeSinceDeath=Since Last Death stat.sneakTime=Sneak Time @@ -1536,9 +1727,9 @@ stat.beaconInteraction=Interactions with Beacon stat.dropperInspected=Droppers Searched stat.hopperInspected=Hoppers Searched stat.dispenserInspected=Dispensers Searched -stat.noteblockPlayed=Noteblocks played -stat.noteblockTuned=Noteblocks tuned -stat.flowerPotted=Plants potted +stat.noteblockPlayed=Note Blocks Played +stat.noteblockTuned=Note Blocks Tuned +stat.flowerPotted=Plants Potted stat.trappedChestTriggered=Trapped Chests Triggered stat.enderchestOpened=Ender Chests Opened stat.itemEnchanted=Items Enchanted @@ -1546,6 +1737,7 @@ stat.recordPlayed=Records Played stat.furnaceInteraction=Interactions with Furnace stat.workbenchInteraction=Interactions with Crafting Table stat.chestOpened=Chests Opened +stat.shulkerBoxOpened=Shulker Boxes Opened stat.sleepInBed=Times Slept in a Bed stat.mineBlock=%1$s Mined @@ -1553,121 +1745,51 @@ stat.craftItem=%1$s Crafted stat.useItem=%1$s Used stat.breakItem=%1$s Depleted -achievement.get=Achievement get! - -achievement.taken=Taken! -achievement.unknown=??? - -achievement.requires=Requires '%1$s' -achievement.openInventory=Taking Inventory -achievement.openInventory.desc=Press '%1$s' to open your inventory -achievement.mineWood=Getting Wood -achievement.mineWood.desc=Attack a tree until a block of wood pops out -achievement.buildWorkBench=Benchmarking -achievement.buildWorkBench.desc=Craft a workbench with four blocks of planks -achievement.buildPickaxe=Time to Mine! -achievement.buildPickaxe.desc=Use planks and sticks to make a pickaxe -achievement.buildFurnace=Hot Topic -achievement.buildFurnace.desc=Construct a furnace out of eight cobblestone blocks -achievement.acquireIron=Acquire Hardware -achievement.acquireIron.desc=Smelt an iron ingot -achievement.buildHoe=Time to Farm! -achievement.buildHoe.desc=Use planks and sticks to make a hoe -achievement.makeBread=Bake Bread -achievement.makeBread.desc=Turn wheat into bread -achievement.bakeCake=The Lie -achievement.bakeCake.desc=Wheat, sugar, milk and eggs! -achievement.buildBetterPickaxe=Getting an Upgrade -achievement.buildBetterPickaxe.desc=Construct a better pickaxe -achievement.overpowered=Overpowered -achievement.overpowered.desc=Eat a Notch apple -achievement.cookFish=Delicious Fish -achievement.cookFish.desc=Catch and cook fish! -achievement.onARail=On A Rail -achievement.onARail.desc=Travel by minecart at least 1 km from where you started -achievement.buildSword=Time to Strike! -achievement.buildSword.desc=Use planks and sticks to make a sword -achievement.killEnemy=Monster Hunter -achievement.killEnemy.desc=Attack and destroy a monster -achievement.killCow=Cow Tipper -achievement.killCow.desc=Harvest some leather -achievement.breedCow=Repopulation -achievement.breedCow.desc=Breed two cows with wheat -achievement.flyPig=When Pigs Fly -achievement.flyPig.desc=Fly a pig off a cliff -achievement.snipeSkeleton=Sniper Duel -achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters -achievement.diamonds=DIAMONDS! -achievement.diamonds.desc=Acquire diamonds with your iron tools -achievement.diamondsToYou=Diamonds to you! -achievement.diamondsToYou.desc=Throw diamonds at another player -achievement.portal=We Need to Go Deeper -achievement.portal.desc=Build a portal to the Nether -achievement.ghast=Return to Sender -achievement.ghast.desc=Destroy a Ghast with a fireball -achievement.blazeRod=Into Fire -achievement.blazeRod.desc=Relieve a Blaze of its rod -achievement.potion=Local Brewery -achievement.potion.desc=Brew a potion -achievement.theEnd=The End? -achievement.theEnd.desc=Locate the End -achievement.theEnd2=The End. -achievement.theEnd2.desc=Defeat the Ender Dragon -achievement.spawnWither=The Beginning? -achievement.spawnWither.desc=Spawn the Wither -achievement.killWither=The Beginning. -achievement.killWither.desc=Kill the Wither -achievement.fullBeacon=Beaconator -achievement.fullBeacon.desc=Create a full beacon -achievement.exploreAllBiomes=Adventuring Time -achievement.exploreAllBiomes.desc=Discover all biomes -achievement.enchantments=Enchanter -achievement.enchantments.desc=Use a book, obsidian and diamonds to construct an enchantment table -achievement.overkill=Overkill -achievement.overkill.desc=Deal nine hearts of damage in a single hit -achievement.bookcase=Librarian -achievement.bookcase.desc=Build some bookshelves to improve your enchantment table +recipe.toast.title=New Recipes Unlocked! +recipe.toast.description=Check your recipe book commands.generic.exception=An unknown error occurred while attempting to perform this command commands.generic.permission=You do not have permission to use this command commands.generic.syntax=Invalid command syntax -commands.generic.player.notFound=That player cannot be found -commands.generic.entity.notFound=That entity cannot be found -commands.generic.entity.invalidUuid=The entity UUID provided is in an invalid format +commands.generic.player.notFound=Player '%s' cannot be found +commands.generic.entity.notFound=Entity '%s' cannot be found +commands.generic.selector.notFound=Selector '%s' found nothing +commands.generic.entity.invalidUuid=The entity UUID '%s' is in an invalid format commands.generic.entity.invalidType=Entity type '%s' is invalid commands.generic.notFound=Unknown command. Try /help for a list of commands commands.generic.parameter.invalid='%s' is not a valid parameter commands.generic.num.invalid='%s' is not a valid number commands.generic.boolean.invalid='%s' is not true or false -commands.generic.num.tooSmall=The number you have entered (%d) is too small, it must be at least %d -commands.generic.num.tooBig=The number you have entered (%d) is too big, it must be at most %d -commands.generic.double.tooSmall=The number you have entered (%.2f) is too small, it must be at least %.2f -commands.generic.double.tooBig=The number you have entered (%.2f) is too big, it must be at most %.2f +commands.generic.num.tooSmall=The number you have entered (%s) is too small, it must be at least %s +commands.generic.num.tooBig=The number you have entered (%s) is too big, it must be at most %s +commands.generic.blockstate.invalid='%s' is not a state for block %s commands.generic.usage=Usage: %s +commands.generic.selector_argument=Invalid selector argument: '%s' +commands.generic.player.unspecified=You must specify which player you wish to perform this action on. -commands.setidletimeout.usage=/setidletimeout -commands.setidletimeout.success=Successfully set the idle timeout to %d minutes. +commands.setidletimeout.usage=/setidletimeout +commands.setidletimeout.success=Successfully set the idle timeout to %s minutes. commands.xp.failure.widthdrawXp=Cannot give player negative experience points -commands.xp.success=Given %d experience to %s -commands.xp.success.levels=Given %d levels to %s -commands.xp.success.negative.levels=Taken %d levels from %s +commands.xp.success=Given %s experience to %s +commands.xp.success.levels=Given %s levels to %s +commands.xp.success.negative.levels=Taken %s levels from %s commands.xp.usage=/xp [player] OR /xp L [player] commands.playsound.usage=/playsound [x] [y] [z] [volume] [pitch] [minimumVolume] commands.playsound.success=Played sound '%s' to %s commands.playsound.playerTooFar=Player %s is too far away to hear the sound commands.playsound.unknownSoundSource=Source %s is unknown commands.give.usage=/give [amount] [data] [dataTag] -commands.give.item.notFound=There is no such item with name %d -commands.give.block.notFound=There is no such block with name %d -commands.give.success=Given %s * %d to %s +commands.give.item.notFound=There is no such item with name %s +commands.give.block.notFound=There is no such block with name %s +commands.give.success=Given %s * %s to %s commands.give.tagError=Data tag parsing failed: %s commands.replaceitem.usage=/replaceitem ... commands.replaceitem.entity.usage=/replaceitem entity [amount] [data] [dataTag] commands.replaceitem.block.usage=/replaceitem block [amount] [data] [dataTag] commands.replaceitem.tagError=Data tag parsing failed: %s -commands.replaceitem.noContainer=Block at %d, %d, %d is not a container -commands.replaceitem.failed=Could not replace slot %d with %d * %s -commands.replaceitem.success=Replaced slot %d with %d * %s +commands.replaceitem.noContainer=Block at %s, %s, %s is not a container +commands.replaceitem.failed=Could not replace slot %s with %s * %s +commands.replaceitem.success=Replaced slot %s with %s * %s commands.stats.usage=/stats ... commands.stats.entity.usage=/stats entity ... commands.stats.entity.set.usage=/stats entity set @@ -1675,46 +1797,46 @@ commands.stats.entity.clear.usage=/stats entity clear commands.stats.block.usage=/stats block ... commands.stats.block.set.usage=/stats block set commands.stats.block.clear.usage=/stats block clear -commands.stats.noCompatibleBlock=Block at %d, %d, %d can not track stats +commands.stats.noCompatibleBlock=Block at %s, %s, %s can not track stats commands.stats.failed=Invalid parameters commands.stats.cleared=Cleared %s stats commands.stats.success=Storing %s stats in %s on %s -commands.summon.usage=/summon [x] [y] [z] [dataTag] +commands.summon.usage=/summon [x] [y] [z] [dataTag] commands.summon.success=Object successfully summoned commands.summon.failed=Unable to summon object commands.summon.tagError=Data tag parsing failed: %s commands.summon.outOfWorld=Cannot summon the object out of the world -commands.testforblock.usage=/testforblock [dataValue] [dataTag] -commands.testforblock.failed.tile=The block at %d, %d, %d is %s (expected: %s) -commands.testforblock.failed.data=The block at %d, %d, %d had the data value of %s (expected: %s) -commands.testforblock.failed.nbt=The block at %d, %d, %d did not have the required NBT keys -commands.testforblock.failed.tileEntity=The block at %d, %d, %d is not a block entity and cannot support tag matching -commands.testforblock.success=Successfully found the block at %d, %d, %d +commands.testforblock.usage=/testforblock [dataValue|-1|state|*] [dataTag] +commands.testforblock.failed.tile=The block at %s, %s, %s is %s (expected: %s) +commands.testforblock.failed.data=The block at %s, %s, %s had the data value of %s (expected: %s) +commands.testforblock.failed.nbt=The block at %s, %s, %s did not have the required NBT keys +commands.testforblock.failed.tileEntity=The block at %s, %s, %s is not a block entity and cannot support tag matching +commands.testforblock.success=Successfully found the block at %s, %s, %s commands.testforblock.outOfWorld=Cannot test for block outside of the world -commands.setblock.usage=/setblock [dataValue] [oldBlockHandling] [dataTag] +commands.setblock.usage=/setblock [dataValue|state] [oldBlockHandling] [dataTag] commands.setblock.success=Block placed commands.setblock.failed=Unable to place block commands.setblock.tagError=Data tag parsing failed: %s commands.setblock.outOfWorld=Cannot place block outside of the world commands.setblock.notFound=There is no such block with ID/name %s commands.setblock.noChange=The block couldn't be placed -commands.fill.usage=/fill [dataValue] [oldBlockHandling] [dataTag] +commands.fill.usage=/fill [dataValue|state] [oldBlockHandling] [dataTag] commands.fill.outOfWorld=Cannot place blocks outside of the world commands.fill.tagError=Data tag parsing failed: %s -commands.fill.success=%d blocks filled +commands.fill.success=%s blocks filled commands.fill.failed=No blocks filled -commands.fill.tooManyBlocks=Too many blocks in the specified area (%d > %d) +commands.fill.tooManyBlocks=Too many blocks in the specified area (%s > %s) commands.clone.usage=/clone [maskMode] [cloneMode] commands.clone.outOfWorld=Cannot access blocks outside of the world commands.clone.noOverlap=Source and destination can not overlap -commands.clone.success=%d blocks cloned +commands.clone.success=%s blocks cloned commands.clone.failed=No blocks cloned -commands.clone.tooManyBlocks=Too many blocks in the specified area (%d > %d) +commands.clone.tooManyBlocks=Too many blocks in the specified area (%s > %s) commands.compare.usage=/testforblocks [mode] commands.compare.outOfWorld=Cannot access blocks outside of the world commands.compare.failed=Source and destination are not identical -commands.compare.success=%d blocks compared -commands.compare.tooManyBlocks=Too many blocks in the specified area (%d > %d) +commands.compare.success=%s blocks compared +commands.compare.tooManyBlocks=Too many blocks in the specified area (%s > %s) commands.blockdata.usage=/blockdata commands.blockdata.success=Block data updated to: %s commands.blockdata.tagError=Data tag parsing failed: %s @@ -1727,37 +1849,37 @@ commands.entitydata.tagError=Data tag parsing failed: %s commands.entitydata.noPlayers=%s is a player and cannot be changed commands.entitydata.failed=The data tag did not change: %s commands.effect.usage=/effect [seconds] [amplifier] [hideParticles] OR /effect clear -commands.effect.notFound=There is no such mob effect with ID %d -commands.effect.success=Given %1$s (ID %2$d) * %3$d to %4$s for %5$d seconds +commands.effect.notFound=There is no such mob effect with ID %s +commands.effect.success=Given %1$s (ID %2$s) * %3$s to %4$s for %5$s seconds commands.effect.success.removed=Took %1$s from %2$s commands.effect.success.removed.all=Took all effects from %s commands.effect.failure.notActive=Couldn't take %1$s from %2$s as they do not have the effect commands.effect.failure.notActive.all=Couldn't take any effects from %s as they do not have any commands.enchant.usage=/enchant [level] -commands.enchant.notFound=There is no such enchantment with ID %d +commands.enchant.notFound=There is no such enchantment with ID %s commands.enchant.noItem=The target doesn't hold an item commands.enchant.cantEnchant=The selected enchantment can't be added to the target item commands.enchant.cantCombine=%1$s can't be combined with %2$s commands.enchant.success=Enchanting succeeded commands.particle.usage=/particle [count] [mode] [player] [params] -commands.particle.success=Playing effect %s for %d times +commands.particle.success=Playing effect %s for %s times commands.particle.notFound=Unknown effect name (%s) commands.particle.invalidParam=Invalid param given (%s) commands.clear.usage=/clear [player] [item] [data] [maxCount] [dataTag] -commands.clear.success=Cleared the inventory of %s, removing %d items -commands.clear.testing=%s has %d items that match the criteria +commands.clear.success=Cleared the inventory of %s, removing %s items +commands.clear.testing=%s has %s items that match the criteria commands.clear.failure=Could not clear the inventory of %s, no items to remove commands.clear.tagError=Data tag parsing failed: %s commands.downfall.usage=/toggledownfall commands.downfall.success=Toggled downfall commands.time.usage=/time -commands.time.added=Added %d to the time -commands.time.set=Set the time to %d -commands.time.query=Time is %d +commands.time.added=Added %s to the time +commands.time.set=Set the time to %s +commands.time.query=Time is %s commands.players.usage=/list -commands.players.list=There are %d/%d players online: -commands.banlist.ips=There are %d total banned IP addresses: -commands.banlist.players=There are %d total banned players: +commands.players.list=There are %s/%s players online: +commands.banlist.ips=There are %s total banned IP addresses: +commands.banlist.players=There are %s total banned players: commands.banlist.usage=/banlist [ips|players] commands.kill.usage=/kill [player|entity] commands.kill.successful=Killed %s @@ -1784,7 +1906,7 @@ commands.banip.usage=/ban-ip [reason ...] commands.unbanip.invalid=You have entered an invalid IP address commands.unbanip.success=Unbanned IP address %s commands.unbanip.usage=/pardon-ip
-commands.save.usage=/save-all +commands.save.usage=/save-all [flush] commands.save-on.alreadyOn=Saving is already turned on commands.save-on.usage=/save-on commands.save-off.alreadyOff=Saving is already turned off @@ -1794,6 +1916,8 @@ commands.save.disabled=Turned off world auto-saving commands.save.start=Saving... commands.save.success=Saved the world commands.save.failed=Saving failed: %s +commands.save.flushStart=Flushing all saves... +commands.save.flushEnd=Flushing completed commands.stop.usage=/stop commands.stop.start=Stopping the server commands.tp.usage=/tp [target player] OR /tp [target player] [ ] @@ -1802,7 +1926,7 @@ commands.tp.success.coordinates=Teleported %s to %s, %s, %s commands.tp.notSameDimension=Unable to teleport because players are not in the same dimension commands.teleport.usage=/teleport [ ] commands.teleport.success.coordinates=Teleported %s to %s, %s, %s -commands.whitelist.list=There are %d (out of %d seen) whitelisted players: +commands.whitelist.list=There are %s (out of %s seen) whitelisted players: commands.whitelist.enabled=Turned on the whitelist commands.whitelist.disabled=Turned off the whitelist commands.whitelist.reloaded=Reloaded the whitelist @@ -1813,6 +1937,63 @@ commands.whitelist.remove.success=Removed %s from the whitelist commands.whitelist.remove.failed=Could not remove %s from the whitelist commands.whitelist.remove.usage=/whitelist remove commands.whitelist.usage=/whitelist + +commands.advancement.usage=/advancement +commands.advancement.advancementNotFound=No advancement was found by the name '%1$s' +commands.advancement.criterionNotFound=The advancement '%1$s' does not contain the criterion '%2$s' + +commands.reload.usage=/reload +commands.reload.success=Successfully reloaded loot tables, advancements and functions + +commands.function.usage=/function [if |unless ] +commands.function.unknown=Unknown function '%s' +commands.function.success=Executed %2$s command(s) from function '%1$s' +commands.function.skipped=Skipped execution of function '%1$s' + +commands.advancement.grant.usage=/advancement grant +commands.advancement.grant.only.usage=/advancement grant only [criterion] +commands.advancement.grant.only.failed=Couldn't grant the advancement '%1$s' to %2$s because they already have it +commands.advancement.grant.only.success=Granted the entire advancement '%1$s' to %2$s +commands.advancement.grant.criterion.failed=Couldn't grant the criterion '%3$s' of advancement '%1$s' to %2$s because they already have it +commands.advancement.grant.criterion.success=Granted the criterion '%3$s' of advancement '%1$s' to %2$s +commands.advancement.grant.until.usage=/advancement grant until +commands.advancement.grant.until.failed=Couldn't grant the advancement '%1$s' or its ancestors to %2$s because they already have them all +commands.advancement.grant.until.success=Granted '%1$s' and all ancestors (%3$s total granted) to %2$s +commands.advancement.grant.from.usage=/advancement grant from +commands.advancement.grant.from.failed=Couldn't grant the advancement '%1$s' or its descendants to %2$s because they already have them all +commands.advancement.grant.from.success=Granted '%1$s' and all descendants (%3$s total granted) to %2$s +commands.advancement.grant.through.usage=/advancement grant through +commands.advancement.grant.through.failed=Couldn't grant the advancement '%1$s', its ancestors or its descendants to %2$s because they already have them all +commands.advancement.grant.through.success=Granted '%1$s', all ancestors and all descendants (%3$s total granted) to %2$s +commands.advancement.grant.everything.usage=/advancement grant everything +commands.advancement.grant.everything.failed=Couldn't grant any advancements to %1$s because they already have them all +commands.advancement.grant.everything.success=Granted every advancement (%2$s total granted) to %1$s + +commands.advancement.revoke.usage=/advancement revoke +commands.advancement.revoke.only.usage=/advancement revoke only [criterion] +commands.advancement.revoke.only.failed=Couldn't revoke the advancement '%1$s' from %2$s because they haven't started it +commands.advancement.revoke.only.success=Revoked the entire advancement '%1$s' from %2$s +commands.advancement.revoke.criterion.failed=Couldn't revoke the criterion '%3$s' of advancement '%1$s' from %2$s because they haven't started it +commands.advancement.revoke.criterion.success=Revoked the criterion '%3$s' of advancement '%1$s' from %2$s +commands.advancement.revoke.until.usage=/advancement revoke until +commands.advancement.revoke.until.failed=Couldn't revoke the advancement '%1$s' or its ancestors from %2$s because they haven't started any +commands.advancement.revoke.until.success=Revoked '%1$s' and all ancestors (%3$s total revoked) from %2$s +commands.advancement.revoke.from.usage=/advancement revoke from +commands.advancement.revoke.from.failed=Couldn't revoke the advancement '%1$s' or its descendants from %2$s because they haven't started any +commands.advancement.revoke.from.success=Revoked '%1$s' and all descendants (%3$s total revoked) from %2$s +commands.advancement.revoke.through.usage=/advancement revoke through +commands.advancement.revoke.through.failed=Couldn't revoke the advancement '%1$s', its ancestors or its descendants from %2$s because they haven't started any +commands.advancement.revoke.through.success=Revoked '%1$s', all ancestors and all descendants (%3$s total revoked) from %2$s +commands.advancement.revoke.everything.usage=/advancement revoke everything +commands.advancement.revoke.everything.failed=Couldn't revoke any advancements to %1$s because they haven't started any +commands.advancement.revoke.everything.success=Revoked every advancement (%2$s total revoked) from %1$s + +commands.advancement.test.usage=/advancement test [criterion] +commands.advancement.test.criterion.success=Player %1$s has completed criterion '%3$s' of advancement '%2$s' +commands.advancement.test.criterion.notDone=Player %1$s has not completed criterion '%3$s' of advancement '%2$s' +commands.advancement.test.advancement.success=Player %1$s has completed advancement '%2$s' +commands.advancement.test.advancement.notDone=Player %1$s has not completed advancement '%2$s' + commands.scoreboard.usage=/scoreboard ... commands.scoreboard.noMultiWildcard=Only one user wildcard allowed commands.scoreboard.allMatchesFailed=All matches failed @@ -1827,17 +2008,17 @@ commands.scoreboard.objectives.setdisplay.successSet=Set the display objective i commands.scoreboard.objectives.add.usage=/scoreboard objectives add [display name ...] commands.scoreboard.objectives.add.wrongType=Invalid objective criteria type '%s' commands.scoreboard.objectives.add.alreadyExists=An objective with the name '%s' already exists -commands.scoreboard.objectives.add.tooLong=The name '%s' is too long for an objective, it can be at most %d characters long -commands.scoreboard.objectives.add.displayTooLong=The display name '%s' is too long for an objective, it can be at most %d characters long +commands.scoreboard.objectives.add.tooLong=The name '%s' is too long for an objective, it can be at most %s characters long +commands.scoreboard.objectives.add.displayTooLong=The display name '%s' is too long for an objective, it can be at most %s characters long commands.scoreboard.objectives.add.success=Added new objective '%s' successfully commands.scoreboard.objectives.remove.usage=/scoreboard objectives remove commands.scoreboard.objectives.remove.success=Removed objective '%s' successfully -commands.scoreboard.objectives.list.count=Showing %d objective(s) on scoreboard: +commands.scoreboard.objectives.list.count=Showing %s objective(s) on scoreboard: commands.scoreboard.objectives.list.entry=- %s: displays as '%s' and is type '%s' commands.scoreboard.objectives.list.empty=There are no objectives on the scoreboard commands.scoreboard.players.usage=/scoreboard players ... -commands.scoreboard.players.name.tooLong=The name '%s' is too long for a player, it can be at most %d characters long -commands.scoreboard.players.set.success=Set score of %s for player %s to %d +commands.scoreboard.players.name.tooLong=The name '%s' is too long for a player, it can be at most %s characters long +commands.scoreboard.players.set.success=Set score of %s for player %s to %s commands.scoreboard.players.set.tagMismatch=The dataTag does not match for %s commands.scoreboard.players.set.tagError=Could not parse dataTag, reason: %s commands.scoreboard.players.set.usage=/scoreboard players set [dataTag] @@ -1847,58 +2028,59 @@ commands.scoreboard.players.reset.usage=/scoreboard players reset [obje commands.scoreboard.players.reset.success=Reset scores of player %s commands.scoreboard.players.resetscore.success=Reset score %s of player %s commands.scoreboard.players.list.usage=/scoreboard players list [name] -commands.scoreboard.players.list.count=Showing %d tracked players on the scoreboard: +commands.scoreboard.players.list.count=Showing %s tracked players on the scoreboard: commands.scoreboard.players.list.empty=There are no tracked players on the scoreboard -commands.scoreboard.players.list.player.count=Showing %d tracked objective(s) for %s: -commands.scoreboard.players.list.player.entry=- %2$s: %1$d (%3$s) +commands.scoreboard.players.list.player.count=Showing %s tracked objective(s) for %s: +commands.scoreboard.players.list.player.entry=- %2$s: %1$s (%3$s) commands.scoreboard.players.list.player.empty=Player %s has no scores recorded commands.scoreboard.players.enable.usage=/scoreboard players enable commands.scoreboard.players.enable.success=Enabled trigger %s for %s commands.scoreboard.players.enable.noTrigger=Objective %s is not a trigger commands.scoreboard.players.test.usage=/scoreboard players test [max] commands.scoreboard.players.test.notFound=No %s score for %s found -commands.scoreboard.players.test.failed=Score %d is NOT in range %d to %d -commands.scoreboard.players.test.success=Score %d is in range %d to %d +commands.scoreboard.players.test.failed=Score %s is NOT in range %s to %s +commands.scoreboard.players.test.success=Score %s is in range %s to %s commands.scoreboard.players.operation.usage=/scoreboard players operation commands.scoreboard.players.operation.notFound=No %s score for %s found commands.scoreboard.players.operation.invalidOperation=Invalid operation %s commands.scoreboard.players.operation.success=Operation applied successfully commands.scoreboard.players.tag.usage=/scoreboard players tag [dataTag] commands.scoreboard.players.tag.tagMismatch=The dataTag does not match for %s -commands.scoreboard.players.tag.tooMany=Can't add more than %d tags to an entity +commands.scoreboard.players.tag.tooMany=Can't add more than %s tags to an entity commands.scoreboard.players.tag.notFound=Entity didn't have the %s tag commands.scoreboard.players.tag.success.add=Tag %s added commands.scoreboard.players.tag.success.remove=Tag %s removed commands.scoreboard.players.tag.list=Tags on entity %s are: +commands.scoreboard.players.tag.tagError=Players tag command failed, reason: %s commands.scoreboard.teams.usage=/scoreboard teams ... commands.scoreboard.teams.add.usage=/scoreboard teams add [display name ...] commands.scoreboard.teams.add.alreadyExists=A team with the name '%s' already exists -commands.scoreboard.teams.add.tooLong=The name '%s' is too long for a team, it can be at most %d characters long -commands.scoreboard.teams.add.displayTooLong=The display name '%s' is too long for a team, it can be at most %d characters long +commands.scoreboard.teams.add.tooLong=The name '%s' is too long for a team, it can be at most %s characters long +commands.scoreboard.teams.add.displayTooLong=The display name '%s' is too long for a team, it can be at most %s characters long commands.scoreboard.teams.add.success=Added new team '%s' successfully commands.scoreboard.teams.list.usage=/scoreboard teams list [name] -commands.scoreboard.teams.list.count=Showing %d teams on the scoreboard: -commands.scoreboard.teams.list.entry=- %1$s: '%2$s' has %3$d players +commands.scoreboard.teams.list.count=Showing %s teams on the scoreboard: +commands.scoreboard.teams.list.entry=- %1$s: '%2$s' has %3$s players commands.scoreboard.teams.list.empty=There are no teams registered on the scoreboard -commands.scoreboard.teams.list.player.count=Showing %d player(s) in team %s: -commands.scoreboard.teams.list.player.entry=- %2$s: %1$d (%3$s) +commands.scoreboard.teams.list.player.count=Showing %s player(s) in team %s: +commands.scoreboard.teams.list.player.entry=- %2$s: %1$s (%3$s) commands.scoreboard.teams.list.player.empty=Team %s has no players commands.scoreboard.teams.empty.usage=/scoreboard teams empty commands.scoreboard.teams.empty.alreadyEmpty=Team %s is already empty, cannot remove nonexistant players -commands.scoreboard.teams.empty.success=Removed all %d player(s) from team %s +commands.scoreboard.teams.empty.success=Removed all %s player(s) from team %s commands.scoreboard.teams.remove.usage=/scoreboard teams remove commands.scoreboard.teams.remove.success=Removed team %s commands.scoreboard.teams.join.usage=/scoreboard teams join [player] -commands.scoreboard.teams.join.success=Added %d player(s) to team %s: %s -commands.scoreboard.teams.join.failure=Could not add %d player(s) to team %s: %s +commands.scoreboard.teams.join.success=Added %s player(s) to team %s: %s +commands.scoreboard.teams.join.failure=Could not add %s player(s) to team %s: %s commands.scoreboard.teams.leave.usage=/scoreboard teams leave [player] -commands.scoreboard.teams.leave.success=Removed %d player(s) from their teams: %s -commands.scoreboard.teams.leave.failure=Could not remove %d player(s) from their teams: %s +commands.scoreboard.teams.leave.success=Removed %s player(s) from their teams: %s +commands.scoreboard.teams.leave.failure=Could not remove %s player(s) from their teams: %s commands.scoreboard.teams.leave.noTeam=You are not in a team commands.scoreboard.teams.option.usage=/scoreboard teams option commands.scoreboard.teams.option.noValue=Valid values for option %s are: %s commands.scoreboard.teams.option.success=Set option %s for team %s to %s -commands.execute.usage=/execute OR /execute detect +commands.execute.usage=/execute OR /execute detect commands.execute.allInvocationsFailed=All invocations failed: '%s' commands.execute.failed=Failed to execute '%s' as %s commands.gamemode.success.self=Set own game mode to %s @@ -1907,7 +2089,7 @@ commands.gamemode.usage=/gamemode [player] commands.defaultgamemode.usage=/defaultgamemode commands.defaultgamemode.success=The world's default game mode is now %s commands.me.usage=/me -commands.help.header=--- Showing help page %d of %d (/help ) --- +commands.help.header=--- Showing help page %s of %s (/help ) --- commands.help.footer=Tip: Use the key while typing a command to auto-complete the command or its arguments commands.help.usage=/help [page|command name] commands.trigger.usage=/trigger @@ -1920,12 +2102,12 @@ commands.publish.usage=/publish commands.publish.started=Local game hosted on port %s commands.publish.failed=Unable to host local game commands.debug.start=Started debug profiling -commands.debug.stop=Stopped debug profiling after %.2f seconds (%d ticks) +commands.debug.stop=Stopped debug profiling after %s seconds (%s ticks) commands.debug.notStarted=Can't stop profiling when we haven't started yet! commands.debug.usage=/debug commands.chunkinfo.usage=/chunkinfo [ ] -commands.chunkinfo.location=Chunk location: (%d, %d, %d) -commands.chunkinfo.noChunk=No chunk found at chunk position %d, %d, %d +commands.chunkinfo.location=Chunk location: (%s, %s, %s) +commands.chunkinfo.noChunk=No chunk found at chunk position %s, %s, %s commands.chunkinfo.notEmpty=Chunk is not empty. commands.chunkinfo.empty=Chunk is empty. commands.chunkinfo.notCompiled=Chunk is not compiled. @@ -1933,7 +2115,7 @@ commands.chunkinfo.compiled=Chunk is compiled. commands.chunkinfo.hasNoRenderableLayers=Chunk has no renderable layers. commands.chunkinfo.hasLayers=Chunk has layers: %s commands.chunkinfo.isEmpty=Chunk has empty layers: %s -commands.chunkinfo.vertices=%s layer's buffer contains %d vertices +commands.chunkinfo.vertices=%s layer's buffer contains %s vertices commands.chunkinfo.data=First 64 vertices are: %s commands.tellraw.usage=/tellraw commands.tellraw.jsonException=Invalid json: %s @@ -1944,9 +2126,9 @@ commands.message.display.incoming=%s whispers to you: %s commands.difficulty.usage=/difficulty commands.difficulty.success=Set game difficulty to %s commands.spawnpoint.usage=/spawnpoint [player] [ ] -commands.spawnpoint.success=Set %s's spawn point to (%d, %d, %d) +commands.spawnpoint.success=Set %s's spawn point to (%s, %s, %s) commands.setworldspawn.usage=/setworldspawn [ ] -commands.setworldspawn.success=Set the world spawn point to (%d, %d, %d) +commands.setworldspawn.success=Set the world spawn point to (%s, %s, %s) commands.gamerule.usage=/gamerule [value] commands.gamerule.success=Game rule %s has been updated to %s commands.gamerule.norule=No game rule called '%s' is available @@ -1961,23 +2143,25 @@ commands.testfor.success=Found %s commands.testfor.tagError=Data tag parsing failed: %s commands.seed.usage=/seed commands.seed.success=Seed: %s +commands.spreadplayers.noop=No players found to spread commands.spreadplayers.usage=/spreadplayers -commands.spreadplayers.spreading.teams=Spreading %s teams %s blocks around %s,%s (min %s blocks apart) -commands.spreadplayers.spreading.players=Spreading %s players %s blocks around %s,%s (min %s blocks apart) -commands.spreadplayers.success.teams=Successfully spread %s teams around %s,%s -commands.spreadplayers.success.players=Successfully spread %s players around %s,%s +commands.spreadplayers.spreading.teams=Spreading %s team(s) %s blocks around %s, %s (min %s blocks apart) +commands.spreadplayers.spreading.players=Spreading %s player(s) %s blocks around %s, %s (min %s blocks apart) +commands.spreadplayers.success.teams=Successfully spread %s team(s) around %s, %s +commands.spreadplayers.success.players=Successfully spread %s player(s) around %s, %s commands.spreadplayers.info.teams=(Average distance between teams is %s blocks apart after %s iterations) commands.spreadplayers.info.players=(Average distance between players is %s blocks apart after %s iterations) -commands.spreadplayers.failure.teams=Could not spread %s teams around %s,%s (too many players for space - try using spread of at most %s) -commands.spreadplayers.failure.players=Could not spread %s players around %s,%s (too many players for space - try using spread of at most %s) -commands.achievement.usage=/achievement [player] -commands.achievement.unknownAchievement=Unknown achievement '%s' -commands.achievement.alreadyHave=Player %s already has achievement %s -commands.achievement.dontHave=Player %s doesn't have achievement %s -commands.achievement.give.success.all=Successfully given all achievements to %s -commands.achievement.give.success.one=Successfully given %s the achievement %s -commands.achievement.take.success.all=Successfully taken all achievements from %s -commands.achievement.take.success.one=Successfully taken the achievement %s from %s +commands.spreadplayers.failure.teams=Could not spread %s team(s) around %s, %s (too many players for space - try using spread of at most %s) +commands.spreadplayers.failure.players=Could not spread %s player(s) around %s, %s (too many players for space - try using spread of at most %s) +commands.recipe.usage=/recipe [player] +commands.recipe.alreadyHave=Player %s already has a recipe for %s +commands.recipe.dontHave=Player %s doesn't have the recipe for %s +commands.recipe.give.success.all=Successfully given all recipes to %s +commands.recipe.give.success.one=Successfully given %s the recipe for %s +commands.recipe.take.success.all=Successfully taken all recipes from %s +commands.recipe.take.success.one=Successfully removed the recipe for %s from %s +commands.recipe.unknownrecipe=%s is an unknown recipe +commands.recipe.unsupported=%s is an unsupported recipe commands.worldborder.usage=/worldborder ... commands.worldborder.add.usage=/worldborder add [timeInSeconds] commands.worldborder.set.usage=/worldborder set [timeInSeconds] @@ -1986,7 +2170,7 @@ commands.worldborder.get.success=World border is currently %s blocks wide commands.worldborder.setSlowly.shrink.success=Shrinking world border to %s blocks wide (down from %s blocks) over %s seconds commands.worldborder.setSlowly.grow.success=Growing world border to %s blocks wide (up from %s blocks) over %s seconds commands.worldborder.center.usage=/worldborder center -commands.worldborder.center.success=Set world border center to %s,%s +commands.worldborder.center.success=Set world border center to %s, %s commands.worldborder.damage.usage=/worldborder damage ... commands.worldborder.damage.buffer.usage=/worldborder damage buffer commands.worldborder.damage.buffer.success=Set world border damage buffer to %s blocks (from %s blocks) @@ -1997,8 +2181,8 @@ commands.worldborder.warning.time.usage=/worldborder warning time commands.worldborder.warning.time.success=Set world border warning to %s seconds away (from %s seconds) commands.worldborder.warning.distance.usage=/worldborder warning distance commands.worldborder.warning.distance.success=Set world border warning to %s blocks away (from %s blocks) -commands.title.usage=/title ... -commands.title.usage.title=/title title|subtitle +commands.title.usage=/title title|subtitle|actionbar|clear|reset|times ... +commands.title.usage.title=/title title|subtitle|actionbar commands.title.usage.clear=/title clear|reset commands.title.usage.times=/title times commands.title.success=Title command successfully executed @@ -2007,6 +2191,9 @@ commands.stopsound.unknownSoundSource=Source %s is unknown commands.stopsound.success.individualSound=Stopped sound '%s' with source '%s' for %s commands.stopsound.success.soundSource=Stopped source '%s' for %s commands.stopsound.success.all=Stopped all sounds for %s +commands.locate.usage=/locate +commands.locate.success=Located %s at %s (y?) %s +commands.locate.failure=Unable to locate any %s feature itemGroup.buildingBlocks=Building Blocks itemGroup.decorations=Decoration Blocks @@ -2020,8 +2207,11 @@ itemGroup.combat=Combat itemGroup.brewing=Brewing itemGroup.materials=Materials itemGroup.inventory=Survival Inventory +itemGroup.hotbar=Saved Toolbars inventory.binSlot=Destroy Item +inventory.hotbarSaved=Item toolbar saved (restore with %1$s+%2$s) +inventory.hotbarInfo=Save toolbar with %1$s+%2$s advMode.setCommand=Set Console Command for Block advMode.setCommand.success=Command set: %s @@ -2030,6 +2220,7 @@ advMode.nearestPlayer=Use "@p" to target nearest player advMode.randomPlayer=Use "@r" to target random player advMode.allPlayers=Use "@a" to target all players advMode.allEntities=Use "@e" to target all entities +advMode.self=Use "@s" to target the executing entity advMode.previousOutput=Previous Output advMode.mode.sequence=Chain advMode.mode.auto=Repeat @@ -2053,15 +2244,15 @@ item.modifiers.legs=When on legs: item.modifiers.chest=When on body: item.modifiers.head=When on head: -attribute.modifier.plus.0=+%d %s -attribute.modifier.plus.1=+%d%% %s -attribute.modifier.plus.2=+%d%% %s -attribute.modifier.take.0=-%d %s -attribute.modifier.take.1=-%d%% %s -attribute.modifier.take.2=-%d%% %s -attribute.modifier.equals.0=%d %s -attribute.modifier.equals.1=%d%% %s -attribute.modifier.equals.2=%d%% %s +attribute.modifier.plus.0=+%s %s +attribute.modifier.plus.1=+%s%% %s +attribute.modifier.plus.2=+%s%% %s +attribute.modifier.take.0=-%s %s +attribute.modifier.take.1=-%s%% %s +attribute.modifier.take.2=-%s%% %s +attribute.modifier.equals.0=%s %s +attribute.modifier.equals.1=%s%% %s +attribute.modifier.equals.2=%s%% %s attribute.name.horse.jumpStrength=Horse Jump Strength attribute.name.zombie.spawnReinforcements=Zombie Reinforcements @@ -2181,39 +2372,39 @@ item.banner.square_top_right.magenta=Magenta Chief Sinister Canton item.banner.square_top_right.orange=Orange Chief Sinister Canton item.banner.square_top_right.white=White Chief Sinister Canton -item.banner.stripe_bottom.black=Black Base Fess -item.banner.stripe_bottom.red=Red Base Fess -item.banner.stripe_bottom.green=Green Base Fess -item.banner.stripe_bottom.brown=Brown Base Fess -item.banner.stripe_bottom.blue=Blue Base Fess -item.banner.stripe_bottom.purple=Purple Base Fess -item.banner.stripe_bottom.cyan=Cyan Base Fess -item.banner.stripe_bottom.silver=Light Gray Base Fess -item.banner.stripe_bottom.gray=Gray Base Fess -item.banner.stripe_bottom.pink=Pink Base Fess -item.banner.stripe_bottom.lime=Lime Base Fess -item.banner.stripe_bottom.yellow=Yellow Base Fess -item.banner.stripe_bottom.lightBlue=Light Blue Base Fess -item.banner.stripe_bottom.magenta=Magenta Base Fess -item.banner.stripe_bottom.orange=Orange Base Fess -item.banner.stripe_bottom.white=White Base Fess - -item.banner.stripe_top.black=Black Chief Fess -item.banner.stripe_top.red=Red Chief Fess -item.banner.stripe_top.green=Green Chief Fess -item.banner.stripe_top.brown=Brown Chief Fess -item.banner.stripe_top.blue=Blue Chief Fess -item.banner.stripe_top.purple=Purple Chief Fess -item.banner.stripe_top.cyan=Cyan Chief Fess -item.banner.stripe_top.silver=Light Gray Chief Fess -item.banner.stripe_top.gray=Gray Chief Fess -item.banner.stripe_top.pink=Pink Chief Fess -item.banner.stripe_top.lime=Lime Chief Fess -item.banner.stripe_top.yellow=Yellow Chief Fess -item.banner.stripe_top.lightBlue=Light Blue Chief Fess -item.banner.stripe_top.magenta=Magenta Chief Fess -item.banner.stripe_top.orange=Orange Chief Fess -item.banner.stripe_top.white=White Chief Fess +item.banner.stripe_bottom.black=Black Base +item.banner.stripe_bottom.red=Red Base +item.banner.stripe_bottom.green=Green Base +item.banner.stripe_bottom.brown=Brown Base +item.banner.stripe_bottom.blue=Blue Base +item.banner.stripe_bottom.purple=Purple Base +item.banner.stripe_bottom.cyan=Cyan Base +item.banner.stripe_bottom.silver=Light Gray Base +item.banner.stripe_bottom.gray=Gray Base +item.banner.stripe_bottom.pink=Pink Base +item.banner.stripe_bottom.lime=Lime Base +item.banner.stripe_bottom.yellow=Yellow Base +item.banner.stripe_bottom.lightBlue=Light Blue Base +item.banner.stripe_bottom.magenta=Magenta Base +item.banner.stripe_bottom.orange=Orange Base +item.banner.stripe_bottom.white=White Base + +item.banner.stripe_top.black=Black Chief +item.banner.stripe_top.red=Red Chief +item.banner.stripe_top.green=Green Chief +item.banner.stripe_top.brown=Brown Chief +item.banner.stripe_top.blue=Blue Chief +item.banner.stripe_top.purple=Purple Chief +item.banner.stripe_top.cyan=Cyan Chief +item.banner.stripe_top.silver=Light Gray Chief +item.banner.stripe_top.gray=Gray Chief +item.banner.stripe_top.pink=Pink Chief +item.banner.stripe_top.lime=Lime Chief +item.banner.stripe_top.yellow=Yellow Chief +item.banner.stripe_top.lightBlue=Light Blue Chief +item.banner.stripe_top.magenta=Magenta Chief +item.banner.stripe_top.orange=Orange Chief +item.banner.stripe_top.white=White Chief item.banner.stripe_left.black=Black Pale Dexter item.banner.stripe_left.red=Red Pale Dexter @@ -2787,11 +2978,13 @@ subtitles.block.iron_trapdoor.open=Trapdoor closes subtitles.block.lava.ambient=Lava pops subtitles.block.lava.extinguish=Lava hisses subtitles.block.lever.click=Lever clicks -subtitles.block.note.note=Noteblock plays +subtitles.block.note.note=Note Block plays subtitles.block.piston.move=Piston moves subtitles.block.portal.ambient=Portal whooshes subtitles.block.pressure_plate.click=Pressure Plate clicks subtitles.block.redstone_torch.burnout=Torch fizzes +subtitles.block.shulker_box.close=Shulker closes +subtitles.block.shulker_box.open=Shulker opens subtitles.block.trapdoor.toggle=Trapdoor creaks subtitles.block.tripwire.attach=Tripwire attaches subtitles.block.tripwire.click=Tripwire clicks @@ -2820,6 +3013,38 @@ subtitles.entity.chicken.ambient=Chicken clucks subtitles.entity.chicken.death=Chicken dies subtitles.entity.chicken.egg=Chicken plops subtitles.entity.chicken.hurt=Chicken hurts +subtitles.entity.parrot.ambient=Parrot talks +subtitles.entity.parrot.death=Parrot dies +subtitles.entity.parrot.eats=Parrot eats +subtitles.entity.parrot.hurts=Parrot hurts +subtitles.entity.parrot.imitate.blaze=Parrot breathes +subtitles.entity.parrot.imitate.cave_spider=Parrot hisses +subtitles.entity.parrot.imitate.creeper=Parrot hisses +subtitles.entity.parrot.imitate.elder_guardian=Parrot flaps +subtitles.entity.parrot.imitate.enderdragon=Parrot roars +subtitles.entity.parrot.imitate.enderman=Parrot vwoops +subtitles.entity.parrot.imitate.endermite=Parrot scuttles +subtitles.entity.parrot.imitate.evocation_illager=Parrot murmurs +subtitles.entity.parrot.imitate.ghast=Parrot cries +subtitles.entity.parrot.imitate.husk=Parrot groans +subtitles.entity.parrot.imitate.illusion_illager=Parrot murmurs +subtitles.entity.parrot.imitate.magmacube=Parrot squishes +subtitles.entity.parrot.imitate.polar_bear=Parrot groans +subtitles.entity.parrot.imitate.shulker=Parrot lurks +subtitles.entity.parrot.imitate.silverfish=Parrot hisses +subtitles.entity.parrot.imitate.skeleton=Parrot rattles +subtitles.entity.parrot.imitate.slime=Parrot squishes +subtitles.entity.parrot.imitate.spider=Parrot hisses +subtitles.entity.parrot.imitate.stray=Parrot rattles +subtitles.entity.parrot.imitate.vex=Parrot vexes +subtitles.entity.parrot.imitate.vindication_illager=Parrot mutters +subtitles.entity.parrot.imitate.witch=Parrot giggles +subtitles.entity.parrot.imitate.wither=Parrot angers +subtitles.entity.parrot.imitate.wither_skeleton=Parrot rattles +subtitles.entity.parrot.imitate.wolf=Parrot pants +subtitles.entity.parrot.imitate.zombie=Parrot groans +subtitles.entity.parrot.imitate.zombie_pigman=Parrot grunts +subtitles.entity.parrot.imitate.zombie_villager=Parrot groans subtitles.entity.cow.ambient=Cow moos subtitles.entity.cow.death=Cow dies subtitles.entity.cow.hurt=Cow hurts @@ -2833,6 +3058,13 @@ subtitles.entity.donkey.chest=Donkey Chest equips subtitles.entity.donkey.death=Donkey dies subtitles.entity.donkey.hurt=Donkey hurts subtitles.entity.egg.throw=Egg flies +subtitles.entity.elder_guardian.ambient.land=Elder Guardian flaps +subtitles.entity.elder_guardian.ambient=Elder Guardian moans +subtitles.entity.elder_guardian.attack=Elder Guardian shoots +subtitles.entity.elder_guardian.curse=Elder Guardian curses +subtitles.entity.elder_guardian.death=Elder Guardian dies +subtitles.entity.elder_guardian.flop=Elder Guardian flops +subtitles.entity.elder_guardian.hurt=Elder Guardian hurts subtitles.entity.enderdragon.ambient=Dragon roars subtitles.entity.enderdragon.death=Dragon dies subtitles.entity.enderdragon.flap=Dragon flaps @@ -2849,6 +3081,14 @@ subtitles.entity.endermite.ambient=Endermite scuttles subtitles.entity.endermite.death=Endermite dies subtitles.entity.endermite.hurt=Endermite hurts subtitles.entity.enderpearl.throw=Ender Pearl flies +subtitles.entity.evocation_fangs.attack=Fangs snap +subtitles.entity.evocation_illager.ambient=Evoker murmurs +subtitles.entity.evocation_illager.cast_spell=Evoker casts spell +subtitles.entity.evocation_illager.death=Evoker dies +subtitles.entity.evocation_illager.hurt=Evoker hurts +subtitles.entity.evocation_illager.prepare_attack=Evoker prepares attack +subtitles.entity.evocation_illager.prepare_summon=Evoker prepares summoning +subtitles.entity.evocation_illager.prepare_wololo=Evoker prepares charming subtitles.entity.experience_orb.pickup=Experience gained subtitles.entity.firework.blast=Firework blasts subtitles.entity.firework.launch=Firework launches @@ -2888,6 +3128,13 @@ subtitles.entity.horse.saddle=Saddle equips subtitles.entity.husk.ambient=Husk groans subtitles.entity.husk.death=Husk dies subtitles.entity.husk.hurt=Husk hurts +subtitles.entity.illusion_illager.ambient=Illusioner murmurs +subtitles.entity.illusion_illager.cast_spell=Illusioner casts spell +subtitles.entity.illusion_illager.death=Illusioner dies +subtitles.entity.illusion_illager.hurt=Illusioner hurts +subtitles.entity.illusion_illager.mirror_move=Illusioner displaces +subtitles.entity.illusion_illager.prepare_blindness=Illusioner prepares blindness +subtitles.entity.illusion_illager.prepare_mirror=Illusioner prepares mirror image subtitles.entity.iron_golem.attack=Iron Golem attacks subtitles.entity.iron_golem.death=Iron Golem dies subtitles.entity.iron_golem.hurt=Iron Golem hurts @@ -2900,13 +3147,23 @@ subtitles.entity.itemframe.remove_item=Item Frame empties subtitles.entity.itemframe.rotate_item=Item Frame clicks subtitles.entity.leashknot.break=Leash knot breaks subtitles.entity.leashknot.place=Leash knot tied -subtitles.entity.lightning.impact=Lighting strikes +subtitles.entity.lightning.impact=Lightning strikes subtitles.entity.lightning.thunder=Thunder roars +subtitles.entity.llama.ambient=Llama bleats +subtitles.entity.llama.angry=Llama bleats angry +subtitles.entity.llama.chest=Llama Chest equips +subtitles.entity.llama.death=Llama dies +subtitles.entity.llama.eat=Llama eats +subtitles.entity.llama.hurt=Llama hurts +subtitles.entity.llama.spit=Llama spits +subtitles.entity.llama.step=Llama steps +subtitles.entity.llama.swag=Llama is decorated subtitles.entity.magmacube.death=Magma Cube dies subtitles.entity.magmacube.hurt=Magma Cube hurts subtitles.entity.magmacube.squish=Magma Cube squishes subtitles.entity.minecart.riding=Minecart rolls subtitles.entity.mule.ambient=Mule hee-haws +subtitles.entity.mule.chest=Mule Chest equips subtitles.entity.mule.death=Mule dies subtitles.entity.mule.hurt=Mule hurts subtitles.entity.painting.break=Painting breaks @@ -2970,12 +3227,19 @@ subtitles.entity.stray.ambient=Stray rattles subtitles.entity.stray.death=Stray dies subtitles.entity.stray.hurt=Stray hurts subtitles.entity.tnt.primed=TNT fizzes +subtitles.entity.vex.ambient=Vex vexes +subtitles.entity.vex.charge=Vex shrieks +subtitles.entity.vex.death=Vex dies +subtitles.entity.vex.hurt=Vex hurts subtitles.entity.villager.ambient=Villager mumbles subtitles.entity.villager.death=Villager dies subtitles.entity.villager.hurt=Villager hurts subtitles.entity.villager.no=Villager disagrees subtitles.entity.villager.trading=Villager trades subtitles.entity.villager.yes=Villager agrees +subtitles.entity.vindication_illager.ambient=Vindicator mutters +subtitles.entity.vindication_illager.death=Vindicator dies +subtitles.entity.vindication_illager.hurt=Vindicator hurts subtitles.entity.witch.ambient=Witch giggles subtitles.entity.witch.death=Witch dies subtitles.entity.witch.drink=Witch drinks @@ -3005,11 +3269,15 @@ subtitles.entity.zombie_pigman.ambient=Zombie Pigman grunts subtitles.entity.zombie_pigman.angry=Zombie Pigman angers subtitles.entity.zombie_pigman.death=Zombie Pigman dies subtitles.entity.zombie_pigman.hurt=Zombie Pigman hurts +subtitles.entity.zombie_villager.ambient=Zombie Villager groans subtitles.entity.zombie_villager.converted=Zombie vociferates subtitles.entity.zombie_villager.cure=Zombie snuffles +subtitles.entity.zombie_villager.death=Zombie Villager dies +subtitles.entity.zombie_villager.hurt=Zombie Villager hurts subtitles.item.armor.equip=Gear equipped subtitles.item.armor.equip_chain=Chain armor jingles subtitles.item.armor.equip_diamond=Diamond armor clangs +subtitles.item.armor.equip_elytra=Elytra rustles subtitles.item.armor.equip_gold=Gold armor clinks subtitles.item.armor.equip_iron=Iron armor clanks subtitles.item.armor.equip_leather=Leather armor rustles @@ -3023,4 +3291,163 @@ subtitles.item.hoe.till=Hoe tills subtitles.item.shear=Shears click subtitles.item.shield.block=Shield blocks subtitles.item.shovel.flatten=Shovel flattens +subtitles.item.totem.use=Totem activates subtitles.weather.rain=Rain falls + +debug.prefix=[Debug]: +debug.reload_chunks.help=F3 + A = Reload chunks +debug.show_hitboxes.help=F3 + B = Show hitboxes +debug.clear_chat.help=F3 + D = Clear chat +debug.cycle_renderdistance.help=F3 + F = Cycle render distance (Shift to invert) +debug.chunk_boundaries.help=F3 + G = Show chunk boundaries +debug.advanced_tooltips.help=F3 + H = Advanced tooltips +debug.creative_spectator.help=F3 + N = Cycle creative <-> spectator +debug.pause_focus.help=F3 + P = Pause on lost focus +debug.help.help=F3 + Q = Show this list +debug.reload_resourcepacks.help=F3 + T = Reload resource packs + +debug.reload_chunks.message=Reloading all chunks +debug.show_hitboxes.on=Hitboxes: shown +debug.show_hitboxes.off=Hitboxes: hidden +debug.cycle_renderdistance.message=Render Distance: %s +debug.chunk_boundaries.on=Chunk borders: shown +debug.chunk_boundaries.off=Chunk borders: hidden +debug.advanced_tooltips.on=Advanced tooltips: shown +debug.advanced_tooltips.off=Advanced tooltips: hidden +debug.creative_spectator.error=Unable to switch gamemode, no permission +debug.pause_focus.on=Pause on lost focus: enabled +debug.pause_focus.off=Pause on lost focus: disabled +debug.help.message=Key bindings: +debug.reload_resourcepacks.message=Reloaded resource packs + +resourcepack.downloading=Downloading Resource Pack +resourcepack.requesting=Making Request... +resourcepack.progress=Downloading file (%s MB)... + +tutorial.move.title=Move with %s, %s, %s and %s +tutorial.move.description=Jump with %s +tutorial.look.title=Look around +tutorial.look.description=Use your mouse to turn +tutorial.find_tree.title=Find a tree +tutorial.find_tree.description=Punch it to collect wood +tutorial.punch_tree.title=Destroy the tree +tutorial.punch_tree.description=Hold down %s +tutorial.open_inventory.title=Open your inventory +tutorial.open_inventory.description=Press %s +tutorial.craft_planks.title=Craft wooden planks +tutorial.craft_planks.description=The recipe book can help + +advancements.adventure.adventuring_time.title=Adventuring Time +advancements.adventure.adventuring_time.description=Discover every biome +advancements.adventure.kill_all_mobs.title=Monsters Hunted +advancements.adventure.kill_all_mobs.description=Kill one of every hostile monster +advancements.adventure.kill_a_mob.title=Monster Hunter +advancements.adventure.kill_a_mob.description=Kill any hostile monster +advancements.adventure.root.title=Adventure +advancements.adventure.root.description=Adventure, exploration and combat +advancements.adventure.shoot_arrow.title=Take Aim +advancements.adventure.shoot_arrow.description=Shoot something with a bow and arrow +advancements.adventure.sleep_in_bed.title=Sweet dreams +advancements.adventure.sleep_in_bed.description=Change your respawn point +advancements.adventure.sniper_duel.title=Sniper duel +advancements.adventure.sniper_duel.description=Kill a skeleton with an arrow from more than 50 meters +advancements.adventure.trade.title=What a Deal! +advancements.adventure.trade.description=Successfully trade with a Villager +advancements.adventure.summon_iron_golem.title=Hired Help +advancements.adventure.summon_iron_golem.description=Summon an Iron Golem to help defend a village +advancements.adventure.totem_of_undying.title=Postmortal +advancements.adventure.totem_of_undying.description=Use a Totem of Undying to cheat death + +advancements.husbandry.root.title=Husbandry +advancements.husbandry.root.description=The world is full of friends and food +advancements.husbandry.breed_an_animal.title=The Parrots and the Bats +advancements.husbandry.breed_an_animal.description=Breed two animals together +advancements.husbandry.breed_all_animals.title=Two by Two +advancements.husbandry.breed_all_animals.description=Breed all the animals! +advancements.husbandry.tame_an_animal.title=Best Friends Forever +advancements.husbandry.tame_an_animal.description=Tame an animal +advancements.husbandry.plant_seed.title=A Seedy Place +advancements.husbandry.plant_seed.description=Plant a seed and watch it grow +advancements.husbandry.break_diamond_hoe.title=Serious Dedication +advancements.husbandry.break_diamond_hoe.description=Completely use up a diamond hoe, and then reevaluate your life choices +advancements.husbandry.balanced_diet.title=A Balanced Diet +advancements.husbandry.balanced_diet.description=Eat everything that is edible, even if it's not good for you + +advancements.end.dragon_breath.title=You Need a Mint +advancements.end.dragon_breath.description=Collect dragon's breath in a glass bottle +advancements.end.dragon_egg.title=The Next Generation +advancements.end.dragon_egg.description=Hold the Dragon Egg +advancements.end.elytra.title=Sky's the Limit +advancements.end.elytra.description=Find an Elytra +advancements.end.enter_end_gateway.title=Remote Getaway +advancements.end.enter_end_gateway.description=Escape the island +advancements.end.find_end_city.title=The City at the End of the Game +advancements.end.find_end_city.description=Go on in, what could happen? +advancements.end.kill_dragon.title=Free the End +advancements.end.kill_dragon.description=Good luck +advancements.end.levitate.title=Great View From Up Here +advancements.end.levitate.description=Levitate up 50 blocks from the attacks of a Shulker +advancements.end.respawn_dragon.title=The End... Again... +advancements.end.respawn_dragon.description=Respawn the ender dragon +advancements.end.root.title=The End +advancements.end.root.description=Or the beginning? + +advancements.nether.brew_potion.title=Local Brewery +advancements.nether.brew_potion.description=Brew a potion +advancements.nether.all_potions.title=A Furious Cocktail +advancements.nether.all_potions.description=Have every potion effect applied at the same time +advancements.nether.all_effects.title=How Did We Get Here? +advancements.nether.all_effects.description=Have every effect applied at the same time +advancements.nether.create_beacon.title=Bring Home the Beacon +advancements.nether.create_beacon.description=Construct and place a Beacon +advancements.nether.create_full_beacon.title=Beaconator +advancements.nether.create_full_beacon.description=Bring a beacon to full power +advancements.nether.find_fortress.title=A Terrible Fortress +advancements.nether.find_fortress.description=Break your way into a Nether Fortress +advancements.nether.get_wither_skull.title=Spooky Scary Skeleton +advancements.nether.get_wither_skull.description=Obtain a wither skeleton's skull +advancements.nether.obtain_blaze_rod.title=Into Fire +advancements.nether.obtain_blaze_rod.description=Relieve a Blaze of its rod +advancements.nether.return_to_sender.title=Return to Sender +advancements.nether.return_to_sender.description=Destroy a Ghast with a fireball +advancements.nether.root.title=Nether +advancements.nether.root.description=Bring summer clothes +advancements.nether.summon_wither.title=Withering Heights +advancements.nether.summon_wither.description=Summon the Wither +advancements.nether.fast_travel.title=Subspace Bubble +advancements.nether.fast_travel.description=Use the Nether to travel 7km in the Overworld +advancements.nether.uneasy_alliance.title=Uneasy Alliance +advancements.nether.uneasy_alliance.description=Rescue a Ghast from the Nether, bring it safely home to the Overworld... and then kill it. + +advancements.story.cure_zombie_villager.title=Zombie Doctor +advancements.story.cure_zombie_villager.description=Weaken and then cure a zombie villager +advancements.story.deflect_arrow.title=Not Today, Thank You +advancements.story.deflect_arrow.description=Deflect an arrow with a shield +advancements.story.enchant_item.title=Enchanter +advancements.story.enchant_item.description=Enchant an item at an Enchanting Table +advancements.story.enter_the_end.title=The End? +advancements.story.enter_the_end.description=Enter the End Portal +advancements.story.enter_the_nether.title=We Need to Go Deeper +advancements.story.enter_the_nether.description=Build, light and enter a Nether Portal +advancements.story.follow_ender_eye.title=Eye Spy +advancements.story.follow_ender_eye.description=Follow an Ender Eye +advancements.story.form_obsidian.title=Ice Bucket Challenge +advancements.story.form_obsidian.description=Form and mine a block of Obsidian +advancements.story.iron_tools.title=Isn't It Iron Pick +advancements.story.iron_tools.description=Upgrade your pickaxe +advancements.story.lava_bucket.title=Hot Stuff +advancements.story.lava_bucket.description=Fill a bucket with lava +advancements.story.mine_diamond.title=Diamonds! +advancements.story.mine_diamond.description=Acquire diamonds +advancements.story.mine_stone.title=Stone Age +advancements.story.mine_stone.description=Mine stone with your new pickaxe +advancements.story.obtain_armor.title=Suit Up +advancements.story.obtain_armor.description=Protect yourself with a piece of iron armor +advancements.story.root.title=Minecraft +advancements.story.root.description=The heart and story of the game +advancements.story.shiny_gear.title=Cover Me With Diamonds +advancements.story.shiny_gear.description=Diamond armor saves lives +advancements.story.smelt_iron.title=Acquire Hardware +advancements.story.smelt_iron.description=Smelt an iron ingot +advancements.story.upgrade_tools.title=Getting an Upgrade +advancements.story.upgrade_tools.description=Construct a better pickaxe diff --git a/chat/src/test/java/net/md_5/bungee/api/chat/TranslatableComponentTest.java b/chat/src/test/java/net/md_5/bungee/api/chat/TranslatableComponentTest.java index 453d375d15..0837c67299 100644 --- a/chat/src/test/java/net/md_5/bungee/api/chat/TranslatableComponentTest.java +++ b/chat/src/test/java/net/md_5/bungee/api/chat/TranslatableComponentTest.java @@ -1,8 +1,6 @@ package net.md_5.bungee.api.chat; -import net.md_5.bungee.api.chat.TranslatableComponent; import org.junit.Test; - import static org.junit.Assert.assertEquals; public class TranslatableComponentTest From 828e45651ef11ef4c7bde3f4ea0a1dbc97390c77 Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 9 Aug 2017 16:51:45 +1000 Subject: [PATCH 5/7] Client defaults to right hand --- proxy/src/main/java/net/md_5/bungee/UserConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index a21b30c8bd..47a30f71c9 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -589,7 +589,7 @@ public SkinConfiguration getSkinParts() @Override public ProxiedPlayer.MainHand getMainHand() { - return ( settings != null && settings.getMainHand() == 1 ) ? ProxiedPlayer.MainHand.RIGHT : ProxiedPlayer.MainHand.LEFT; + return ( settings == null || settings.getMainHand() == 1 ) ? ProxiedPlayer.MainHand.RIGHT : ProxiedPlayer.MainHand.LEFT; } @Override From db266a8484d0ebebc5e40ca0803a91fa60427248 Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 9 Aug 2017 22:05:06 +1000 Subject: [PATCH 6/7] Use newer writeAndFlush method --- .../main/java/net/md_5/bungee/connection/InitialHandler.java | 3 +-- .../src/main/java/net/md_5/bungee/netty/ChannelWrapper.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java index baa8dd3663..e596f82237 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java @@ -184,8 +184,7 @@ public void done(ProxyPingEvent result, Throwable error) + '\u00a7' + legacy.getPlayers().getMax(); } - ch.getHandle().writeAndFlush( kickMessage ); - ch.close(); + ch.close( kickMessage ); } }; diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java index 2b2d15b3c4..71df1fd51f 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java @@ -54,12 +54,11 @@ public void write(Object packet) if ( packet instanceof PacketWrapper ) { ( (PacketWrapper) packet ).setReleased( true ); - ch.write( ( (PacketWrapper) packet ).buf, ch.voidPromise() ); + ch.writeAndFlush( ( (PacketWrapper) packet ).buf, ch.voidPromise() ); } else { - ch.write( packet, ch.voidPromise() ); + ch.writeAndFlush( packet, ch.voidPromise() ); } - ch.flush(); } } From a1f9c2e7d4ab917ed8d12ae3303a3f4357055564 Mon Sep 17 00:00:00 2001 From: Mystiflow Date: Wed, 9 Aug 2017 13:13:25 +0100 Subject: [PATCH 7/7] Disable plugins before shutting down EventLoops (#2214) Because disabling plugins also cancels any pending tasks, there will be no task accessing the eventLoops. Reimplementation of #1578, fixes #1403 --- .../main/java/net/md_5/bungee/BungeeCord.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 0d11201efa..b4c8bcfc06 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -404,15 +404,6 @@ public void run() { } - getLogger().info( "Closing IO threads" ); - eventLoops.shutdownGracefully(); - try - { - eventLoops.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS ); - } catch ( InterruptedException ex ) - { - } - if ( reconnectHandler != null ) { getLogger().info( "Saving reconnect locations" ); @@ -441,6 +432,15 @@ public void run() plugin.getExecutorService().shutdownNow(); } + getLogger().info( "Closing IO threads" ); + eventLoops.shutdownGracefully(); + try + { + eventLoops.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS ); + } catch ( InterruptedException ex ) + { + } + getLogger().info( "Thank you and goodbye" ); // Need to close loggers after last message! for ( Handler handler : getLogger().getHandlers() )