Merge branch 'MCCTeam:master' into master

This commit is contained in:
Anon 2022-06-28 10:43:13 +00:00 committed by GitHub
commit 3ea109b330
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 1154 additions and 384 deletions

View file

@ -1,5 +1,5 @@
# This workflow will build the project using .NET 4 then publish to GitHub releases # This workflow will build the project using .NET 4 then publish to GitHub releases
# Due to running .NET 4 this workflow needs to run on windows-latest # Due to running .NET 4 this workflow needs to run on windows-2019 (support dropped on windows 2022)
# Changes would need to be made for using .NET 5 and later on linux # Changes would need to be made for using .NET 5 and later on linux
name: Build name: Build
@ -10,7 +10,7 @@ on:
jobs: jobs:
build: build:
runs-on: windows-latest runs-on: windows-2019
env: env:
PROJECT: "MinecraftClient" PROJECT: "MinecraftClient"

View file

@ -983,11 +983,24 @@ namespace MinecraftClient
/// </summary> /// </summary>
/// <param name="location">Location to reach</param> /// <param name="location">Location to reach</param>
/// <param name="allowUnsafe">Allow possible but unsafe locations thay may hurt the player: lava, cactus...</param> /// <param name="allowUnsafe">Allow possible but unsafe locations thay may hurt the player: lava, cactus...</param>
/// <param name="allowDirectTeleport">Allow non-vanilla teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins</param> /// <param name="allowDirectTeleport">Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins</param>
/// <param name="maxOffset">If no valid path can be found, also allow locations within specified distance of destination</param>
/// <param name="minOffset">Do not get closer of destination than specified distance</param>
/// <param name="timeout">How long to wait before stopping computation (default: 5 seconds)</param>
/// <remarks>When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset</remarks>
/// <returns>True if a path has been found</returns> /// <returns>True if a path has been found</returns>
protected bool MoveToLocation(Mapping.Location location, bool allowUnsafe = false, bool allowDirectTeleport = false) protected bool MoveToLocation(Mapping.Location location, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, TimeSpan? timeout = null)
{ {
return Handler.MoveTo(location, allowUnsafe, allowDirectTeleport); return Handler.MoveTo(location, allowUnsafe, allowDirectTeleport, maxOffset, minOffset, timeout);
}
/// <summary>
/// Check if the client is currently processing a Movement.
/// </summary>
/// <returns>true if a movement is currently handled</returns>
protected bool ClientIsMoving()
{
return Handler.ClientIsMoving();
} }
/// <summary> /// <summary>

View file

@ -8,7 +8,7 @@ namespace MinecraftClient.Commands
public class Move : Command public class Move : Command
{ {
public override string CmdName { get { return "move"; } } public override string CmdName { get { return "move"; } }
public override string CmdUsage { get { return "move <on|off|get|up|down|east|west|north|south|x y z> [-f]"; } } public override string CmdUsage { get { return "move <on|off|get|up|down|east|west|north|south|x y z|gravity [on|off]> [-f]"; } }
public override string CmdDesc { get { return "walk or start walking. \"-f\": force unsafe movements like falling or touching fire"; } } public override string CmdDesc { get { return "walk or start walking. \"-f\": force unsafe movements like falling or touching fire"; } }
public override string Run(McClient handler, string command, Dictionary<string, object> localVars) public override string Run(McClient handler, string command, Dictionary<string, object> localVars)
@ -35,6 +35,14 @@ namespace MinecraftClient.Commands
handler.SetTerrainEnabled(false); handler.SetTerrainEnabled(false);
return Translations.Get("cmd.move.disable"); return Translations.Get("cmd.move.disable");
} }
else if (args[0] == "gravity")
{
if (args.Count >= 2)
Settings.GravityEnabled = (args[1] == "on");
if (Settings.GravityEnabled)
return Translations.Get("cmd.move.gravity.enabled");
else return Translations.Get("cmd.move.gravity.disabled");
}
else if (handler.GetTerrainEnabled()) else if (handler.GetTerrainEnabled())
{ {
if (args.Count == 1) if (args.Count == 1)

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
namespace MinecraftClient.Mapping namespace MinecraftClient.Mapping
{ {
@ -19,6 +20,11 @@ namespace MinecraftClient.Mapping
/// </summary> /// </summary>
private readonly Block[,,] blocks = new Block[SizeX, SizeY, SizeZ]; private readonly Block[,,] blocks = new Block[SizeX, SizeY, SizeZ];
/// <summary>
/// Lock for thread safety
/// </summary>
private readonly ReaderWriterLockSlim blockLock = new ReaderWriterLockSlim();
/// <summary> /// <summary>
/// Read, or set the specified block /// Read, or set the specified block
/// </summary> /// </summary>
@ -36,8 +42,17 @@ namespace MinecraftClient.Mapping
throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)"); throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)");
if (blockZ < 0 || blockZ >= SizeZ) if (blockZ < 0 || blockZ >= SizeZ)
throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)"); throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)");
blockLock.EnterReadLock();
try
{
return blocks[blockX, blockY, blockZ]; return blocks[blockX, blockY, blockZ];
} }
finally
{
blockLock.ExitReadLock();
}
}
set set
{ {
if (blockX < 0 || blockX >= SizeX) if (blockX < 0 || blockX >= SizeX)
@ -46,8 +61,17 @@ namespace MinecraftClient.Mapping
throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)"); throw new ArgumentOutOfRangeException("blockY", "Must be between 0 and " + (SizeY - 1) + " (inclusive)");
if (blockZ < 0 || blockZ >= SizeZ) if (blockZ < 0 || blockZ >= SizeZ)
throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)"); throw new ArgumentOutOfRangeException("blockZ", "Must be between 0 and " + (SizeZ - 1) + " (inclusive)");
blockLock.EnterWriteLock();
try
{
blocks[blockX, blockY, blockZ] = value; blocks[blockX, blockY, blockZ] = value;
} }
finally
{
blockLock.ExitWriteLock();
}
}
} }
/// <summary> /// <summary>

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
namespace MinecraftClient.Mapping namespace MinecraftClient.Mapping
{ {
@ -17,6 +18,11 @@ namespace MinecraftClient.Mapping
/// </summary> /// </summary>
private readonly Chunk[] chunks = new Chunk[ColumnSize]; private readonly Chunk[] chunks = new Chunk[ColumnSize];
/// <summary>
/// Lock for thread safety
/// </summary>
private readonly ReaderWriterLockSlim chunkLock = new ReaderWriterLockSlim();
/// <summary> /// <summary>
/// Get or set the specified chunk column /// Get or set the specified chunk column
/// </summary> /// </summary>
@ -26,13 +32,29 @@ namespace MinecraftClient.Mapping
public Chunk this[int chunkY] public Chunk this[int chunkY]
{ {
get get
{
chunkLock.EnterReadLock();
try
{ {
return chunks[chunkY]; return chunks[chunkY];
} }
finally
{
chunkLock.ExitReadLock();
}
}
set set
{
chunkLock.EnterWriteLock();
try
{ {
chunks[chunkY] = value; chunks[chunkY] = value;
} }
finally
{
chunkLock.ExitWriteLock();
}
}
} }
/// <summary> /// <summary>

View file

@ -200,9 +200,9 @@ namespace MinecraftClient.Mapping
public static bool operator !=(Location loc1, Location loc2) public static bool operator !=(Location loc1, Location loc2)
{ {
if (loc1 == null && loc2 == null) if (loc1 == null && loc2 == null)
return true;
if (loc1 == null || loc2 == null)
return false; return false;
if (loc1 == null || loc2 == null)
return true;
return !loc1.Equals(loc2); return !loc1.Equals(loc2);
} }

View file

@ -1,7 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Threading;
using System.Threading.Tasks;
namespace MinecraftClient.Mapping namespace MinecraftClient.Mapping
{ {
@ -20,6 +21,8 @@ namespace MinecraftClient.Mapping
/// <param name="motionY">Current vertical motion speed</param> /// <param name="motionY">Current vertical motion speed</param>
/// <returns>Updated location after applying gravity</returns> /// <returns>Updated location after applying gravity</returns>
public static Location HandleGravity(World world, Location location, ref double motionY) public static Location HandleGravity(World world, Location location, ref double motionY)
{
if (Settings.GravityEnabled)
{ {
Location onFoots = new Location(location.X, Math.Floor(location.Y), location.Z); Location onFoots = new Location(location.X, Math.Floor(location.Y), location.Z);
Location belowFoots = Move(location, Direction.Down); Location belowFoots = Move(location, Direction.Down);
@ -36,6 +39,7 @@ namespace MinecraftClient.Mapping
} }
else if (!(world.GetBlock(onFoots).Type.IsSolid())) else if (!(world.GetBlock(onFoots).Type.IsSolid()))
location = Move2Steps(location, onFoots, ref motionY, true).Dequeue(); location = Move2Steps(location, onFoots, ref motionY, true).Dequeue();
}
return location; return location;
} }
@ -126,13 +130,50 @@ namespace MinecraftClient.Mapping
/// <param name="start">Start location</param> /// <param name="start">Start location</param>
/// <param name="goal">Destination location</param> /// <param name="goal">Destination location</param>
/// <param name="allowUnsafe">Allow possible but unsafe locations</param> /// <param name="allowUnsafe">Allow possible but unsafe locations</param>
/// <param name="maxOffset">If no valid path can be found, also allow locations within specified distance of destination</param>
/// <param name="minOffset">Do not get closer of destination than specified distance</param>
/// <param name="timeout">How long to wait before stopping computation</param>
/// <remarks>When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset</remarks>
/// <returns>A list of locations, or null if calculation failed</returns> /// <returns>A list of locations, or null if calculation failed</returns>
public static Queue<Location> CalculatePath(World world, Location start, Location goal, bool allowUnsafe = false) public static Queue<Location> CalculatePath(World world, Location start, Location goal, bool allowUnsafe, int maxOffset, int minOffset, TimeSpan timeout)
{ {
Queue<Location> result = null; CancellationTokenSource cts = new CancellationTokenSource();
Task<Queue<Location>> pathfindingTask = Task.Factory.StartNew(() => Movement.CalculatePath(world, start, goal, allowUnsafe, maxOffset, minOffset, cts.Token));
pathfindingTask.Wait(timeout);
if (!pathfindingTask.IsCompleted)
{
cts.Cancel();
pathfindingTask.Wait();
}
return pathfindingTask.Result;
}
AutoTimeout.Perform(() => /// <summary>
/// Calculate a path from the start location to the destination location
/// </summary>
/// <remarks>
/// Based on the A* pathfinding algorithm described on Wikipedia
/// </remarks>
/// <see href="https://en.wikipedia.org/wiki/A*_search_algorithm#Pseudocode"/>
/// <param name="start">Start location</param>
/// <param name="goal">Destination location</param>
/// <param name="allowUnsafe">Allow possible but unsafe locations</param>
/// <param name="maxOffset">If no valid path can be found, also allow locations within specified distance of destination</param>
/// <param name="minOffset">Do not get closer of destination than specified distance</param>
/// <param name="ct">Token for stopping computation after a certain time</param>
/// <returns>A list of locations, or null if calculation failed</returns>
public static Queue<Location> CalculatePath(World world, Location start, Location goal, bool allowUnsafe, int maxOffset, int minOffset, CancellationToken ct)
{ {
if (minOffset > maxOffset)
throw new ArgumentException("minOffset must be lower or equal to maxOffset", "minOffset");
// We always use distance squared so our limits must also be squared.
minOffset *= minOffset;
maxOffset *= maxOffset;
Location current = new Location(); // Location that is currently processed
Location closestGoal = new Location(); // Closest Location to the goal. Used for approaching if goal can not be reached or was not found.
HashSet<Location> ClosedSet = new HashSet<Location>(); // The set of locations already evaluated. HashSet<Location> ClosedSet = new HashSet<Location>(); // The set of locations already evaluated.
HashSet<Location> OpenSet = new HashSet<Location>(new[] { start }); // The set of tentative nodes to be evaluated, initially containing the start node HashSet<Location> OpenSet = new HashSet<Location>(new[] { start }); // The set of tentative nodes to be evaluated, initially containing the start node
Dictionary<Location, Location> Came_From = new Dictionary<Location, Location>(); // The map of navigated nodes. Dictionary<Location, Location> Came_From = new Dictionary<Location, Location>(); // The map of navigated nodes.
@ -145,26 +186,32 @@ namespace MinecraftClient.Mapping
while (OpenSet.Count > 0) while (OpenSet.Count > 0)
{ {
Location current = //the node in OpenSet having the lowest f_score[] value current = //the node in OpenSet having the lowest f_score[] value
OpenSet.Select(location => f_score.ContainsKey(location) OpenSet.Select(location => f_score.ContainsKey(location)
? new KeyValuePair<Location, int>(location, f_score[location]) ? new KeyValuePair<Location, int>(location, f_score[location])
: new KeyValuePair<Location, int>(location, int.MaxValue)) : new KeyValuePair<Location, int>(location, int.MaxValue))
.OrderBy(pair => pair.Value).First().Key; .OrderBy(pair => pair.Value).
if (current == goal) // Sort for h-score (f-score - g-score) to get smallest distance to goal if f-scores are equal
{ //reconstruct_path(Came_From, goal) ThenBy(pair => f_score[pair.Key]-g_score[pair.Key]).First().Key;
List<Location> total_path = new List<Location>(new[] { current });
while (Came_From.ContainsKey(current)) // Only assert a value if it is of actual use later
{ if (maxOffset > 0 && ClosedSet.Count > 0)
current = Came_From[current]; // Get the block that currently is closest to the goal
total_path.Add(current); closestGoal = ClosedSet.OrderBy(checkedLocation => checkedLocation.DistanceSquared(goal)).First();
}
total_path.Reverse(); // Stop when goal is reached or we are close enough
result = new Queue<Location>(total_path); if (current == goal || (minOffset > 0 && current.DistanceSquared(goal) <= minOffset))
} return ReconstructPath(Came_From, current);
else if (ct.IsCancellationRequested)
break; // Return if we are cancelled
OpenSet.Remove(current); OpenSet.Remove(current);
ClosedSet.Add(current); ClosedSet.Add(current);
foreach (Location neighbor in GetAvailableMoves(world, current, allowUnsafe)) foreach (Location neighbor in GetAvailableMoves(world, current, allowUnsafe))
{ {
if (ct.IsCancellationRequested)
break; // Stop searching for blocks if we are cancelled.
if (ClosedSet.Contains(neighbor)) if (ClosedSet.Contains(neighbor))
continue; // Ignore the neighbor which is already evaluated. continue; // Ignore the neighbor which is already evaluated.
int tentative_g_score = g_score[current] + (int)current.DistanceSquared(neighbor); //dist_between(current,neighbor) // length of this path. int tentative_g_score = g_score[current] + (int)current.DistanceSquared(neighbor); //dist_between(current,neighbor) // length of this path.
@ -179,9 +226,30 @@ namespace MinecraftClient.Mapping
f_score[neighbor] = g_score[neighbor] + (int)neighbor.DistanceSquared(goal); //heuristic_cost_estimate(neighbor, goal) f_score[neighbor] = g_score[neighbor] + (int)neighbor.DistanceSquared(goal); //heuristic_cost_estimate(neighbor, goal)
} }
} }
}, TimeSpan.FromSeconds(5));
return result; // Goal could not be reached. Set the path to the closest location if close enough
if (maxOffset == int.MaxValue || goal.DistanceSquared(closestGoal) <= maxOffset)
return ReconstructPath(Came_From, closestGoal);
else
return null;
}
/// <summary>
/// Helper function for CalculatePath(). Backtrack from goal to start to reconstruct a step-by-step path.
/// </summary>
/// <param name="Came_From">The collection of Locations that leads back to the start</param>
/// <param name="current">Endpoint of our later walk</param>
/// <returns>the path that leads to current from the start position</returns>
private static Queue<Location> ReconstructPath(Dictionary<Location, Location> Came_From, Location current)
{
List<Location> total_path = new List<Location>(new[] { current });
while (Came_From.ContainsKey(current))
{
current = Came_From[current];
total_path.Add(current);
}
total_path.Reverse();
return new Queue<Location>(total_path);
} }
/* ========= LOCATION PROPERTIES ========= */ /* ========= LOCATION PROPERTIES ========= */

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading;
namespace MinecraftClient.Mapping namespace MinecraftClient.Mapping
{ {
@ -15,6 +16,11 @@ namespace MinecraftClient.Mapping
/// </summary> /// </summary>
private Dictionary<int, Dictionary<int, ChunkColumn>> chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>(); private Dictionary<int, Dictionary<int, ChunkColumn>> chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>();
/// <summary>
/// Lock for thread safety
/// </summary>
private readonly ReaderWriterLockSlim chunksLock = new ReaderWriterLockSlim();
/// <summary> /// <summary>
/// Read, set or unload the specified chunk column /// Read, set or unload the specified chunk column
/// </summary> /// </summary>
@ -24,6 +30,9 @@ namespace MinecraftClient.Mapping
public ChunkColumn this[int chunkX, int chunkZ] public ChunkColumn this[int chunkX, int chunkZ]
{ {
get get
{
chunksLock.EnterReadLock();
try
{ {
//Read a chunk //Read a chunk
if (chunks.ContainsKey(chunkX)) if (chunks.ContainsKey(chunkX))
@ -31,7 +40,15 @@ namespace MinecraftClient.Mapping
return chunks[chunkX][chunkZ]; return chunks[chunkX][chunkZ];
return null; return null;
} }
finally
{
chunksLock.ExitReadLock();
}
}
set set
{
chunksLock.EnterWriteLock();
try
{ {
if (value != null) if (value != null)
{ {
@ -54,6 +71,11 @@ namespace MinecraftClient.Mapping
} }
} }
} }
finally
{
chunksLock.ExitWriteLock();
}
}
} }
/// <summary> /// <summary>
@ -117,7 +139,7 @@ namespace MinecraftClient.Mapping
{ {
Location doneloc = new Location(x, y, z); Location doneloc = new Location(x, y, z);
Block doneblock = GetBlock(doneloc); Block doneblock = GetBlock(doneloc);
Material blockType = GetBlock(doneloc).Type; Material blockType = doneblock.Type;
if (blockType == block) if (blockType == block)
{ {
list.Add(doneloc); list.Add(doneloc);
@ -149,9 +171,17 @@ namespace MinecraftClient.Mapping
/// Clear all terrain data from the world /// Clear all terrain data from the world
/// </summary> /// </summary>
public void Clear() public void Clear()
{
chunksLock.EnterWriteLock();
try
{ {
chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>(); chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>();
} }
finally
{
chunksLock.ExitWriteLock();
}
}
/// <summary> /// <summary>
/// Get the location of block of the entity is looking /// Get the location of block of the entity is looking

View file

@ -1061,8 +1061,12 @@ namespace MinecraftClient
/// <param name="location">Location to reach</param> /// <param name="location">Location to reach</param>
/// <param name="allowUnsafe">Allow possible but unsafe locations thay may hurt the player: lava, cactus...</param> /// <param name="allowUnsafe">Allow possible but unsafe locations thay may hurt the player: lava, cactus...</param>
/// <param name="allowDirectTeleport">Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins</param> /// <param name="allowDirectTeleport">Allow non-vanilla direct teleport instead of computing path, but may cause invalid moves and/or trigger anti-cheat plugins</param>
/// <param name="maxOffset">If no valid path can be found, also allow locations within specified distance of destination</param>
/// <param name="minOffset">Do not get closer of destination than specified distance</param>
/// <param name="timeout">How long to wait until the path is evaluated (default: 5 seconds)</param>
/// <remarks>When location is unreachable, computation will reach timeout, then optionally fallback to a close location within maxOffset</remarks>
/// <returns>True if a path has been found</returns> /// <returns>True if a path has been found</returns>
public bool MoveTo(Location location, bool allowUnsafe = false, bool allowDirectTeleport = false) public bool MoveTo(Location location, bool allowUnsafe = false, bool allowDirectTeleport = false, int maxOffset = 0, int minOffset = 0, TimeSpan? timeout=null)
{ {
lock (locationLock) lock (locationLock)
{ {
@ -1078,7 +1082,7 @@ namespace MinecraftClient
// Calculate path through pathfinding. Path contains a list of 1-block movement that will be divided into steps // Calculate path through pathfinding. Path contains a list of 1-block movement that will be divided into steps
if (Movement.GetAvailableMoves(world, this.location, allowUnsafe).Contains(location)) if (Movement.GetAvailableMoves(world, this.location, allowUnsafe).Contains(location))
path = new Queue<Location>(new[] { location }); path = new Queue<Location>(new[] { location });
else path = Movement.CalculatePath(world, this.location, location, allowUnsafe); else path = Movement.CalculatePath(world, this.location, location, allowUnsafe, maxOffset, minOffset, timeout ?? TimeSpan.FromSeconds(5));
return path != null; return path != null;
} }
} }
@ -1847,6 +1851,15 @@ namespace MinecraftClient
DispatchBotEvent(bot => bot.OnRespawn()); DispatchBotEvent(bot => bot.OnRespawn());
} }
/// <summary>
/// Check if the client is currently processing a Movement.
/// </summary>
/// <returns>true if a movement is currently handled</returns>
public bool ClientIsMoving()
{
return terrainAndMovementsEnabled && locationReceived && ((steps != null && steps.Count > 0) || (path != null && path.Count > 0));
}
/// <summary> /// <summary>
/// Called when the server sends a new player location, /// Called when the server sends a new player location,
/// or if a ChatBot whishes to update the player's location. /// or if a ChatBot whishes to update the player's location.

View file

@ -36,7 +36,7 @@ namespace MinecraftClient
public const string Version = MCHighestVersion; public const string Version = MCHighestVersion;
public const string MCLowestVersion = "1.4.6"; public const string MCLowestVersion = "1.4.6";
public const string MCHighestVersion = "1.18.1"; public const string MCHighestVersion = "1.18.2";
public static readonly string BuildInfo = null; public static readonly string BuildInfo = null;
private static Thread offlinePrompt = null; private static Thread offlinePrompt = null;

View file

@ -51,7 +51,7 @@ namespace MinecraftClient.Protocol.Handlers
public PacketTypePalette GetTypeHandler(int protocol) public PacketTypePalette GetTypeHandler(int protocol)
{ {
PacketTypePalette p; PacketTypePalette p;
if (protocol > Protocol18Handler.MC1181Version) if (protocol > Protocol18Handler.MC1182Version)
throw new NotImplementedException(Translations.Get("exception.palette.packet")); throw new NotImplementedException(Translations.Get("exception.palette.packet"));
if (protocol <= Protocol18Handler.MC18Version) if (protocol <= Protocol18Handler.MC18Version)
p = new PacketPalette17(); p = new PacketPalette17();

View file

@ -53,6 +53,7 @@ namespace MinecraftClient.Protocol.Handlers
internal const int MC117Version = 755; internal const int MC117Version = 755;
internal const int MC1171Version = 756; internal const int MC1171Version = 756;
internal const int MC1181Version = 757; internal const int MC1181Version = 757;
internal const int MC1182Version = 758;
private int compression_treshold = 0; private int compression_treshold = 0;
private bool autocomplete_received = false; private bool autocomplete_received = false;

View file

@ -127,7 +127,7 @@ namespace MinecraftClient.Protocol
int[] supportedVersions_Protocol16 = { 51, 60, 61, 72, 73, 74, 78 }; int[] supportedVersions_Protocol16 = { 51, 60, 61, 72, 73, 74, 78 };
if (Array.IndexOf(supportedVersions_Protocol16, ProtocolVersion) > -1) if (Array.IndexOf(supportedVersions_Protocol16, ProtocolVersion) > -1)
return new Protocol16Handler(Client, ProtocolVersion, Handler); return new Protocol16Handler(Client, ProtocolVersion, Handler);
int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751, 753, 754, 755, 756, 757 }; int[] supportedVersions_Protocol18 = { 4, 5, 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340, 393, 401, 404, 477, 480, 485, 490, 498, 573, 575, 578, 735, 736, 751, 753, 754, 755, 756, 757, 758 };
if (Array.IndexOf(supportedVersions_Protocol18, ProtocolVersion) > -1) if (Array.IndexOf(supportedVersions_Protocol18, ProtocolVersion) > -1)
return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo); return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo);
throw new NotSupportedException(Translations.Get("exception.version_unsupport", ProtocolVersion)); throw new NotSupportedException(Translations.Get("exception.version_unsupport", ProtocolVersion));
@ -253,6 +253,8 @@ namespace MinecraftClient.Protocol
case "1.18": case "1.18":
case "1.18.1": case "1.18.1":
return 757; return 757;
case "1.18.2":
return 758;
default: default:
return 0; return 0;
} }
@ -317,6 +319,7 @@ namespace MinecraftClient.Protocol
case 755: return "1.17"; case 755: return "1.17";
case 756: return "1.17.1"; case 756: return "1.17.1";
case 757: return "1.18.1"; case 757: return "1.18.1";
case 758: return "1.18.2";
default: return "0.0"; default: return "0.0";
} }
} }

View file

@ -13,7 +13,7 @@
login= login=
password= password=
serverip= serverip=
type=mojang # Account type. mojang or microsoft. Also affects interactive login in console. type=microsoft # Account type. mojang or microsoft. Also affects interactive login in console.
method=mcc # Microsoft Account sign-in method. mcc OR browser method=mcc # Microsoft Account sign-in method. mcc OR browser
# Advanced settings # Advanced settings

View file

@ -311,6 +311,9 @@ cmd.move.dir_fail=Kann nicht in diese Richtung laufen.
cmd.move.walk=Gehe nach {0} cmd.move.walk=Gehe nach {0}
cmd.move.fail=Konnte Pfad nach {0} nicht berechnen. cmd.move.fail=Konnte Pfad nach {0} nicht berechnen.
cmd.move.suggestforce=Weg nach {0} konnte nicht berechnet werden. Benutze den -f Parameter, um unsichere Wege zu aktivieren. cmd.move.suggestforce=Weg nach {0} konnte nicht berechnet werden. Benutze den -f Parameter, um unsichere Wege zu aktivieren.
cmd.move.gravity.enabled=Gravitation ist aktiv.
cmd.move.gravity.disabled=Gravitation ist deaktiviert.
# Reco # Reco
cmd.reco.desc=Starte neu und verbinde erneut zum Server. cmd.reco.desc=Starte neu und verbinde erneut zum Server.

View file

@ -311,6 +311,8 @@ cmd.move.dir_fail=Cannot move in that direction.
cmd.move.walk=Walking to {0} cmd.move.walk=Walking to {0}
cmd.move.fail=Failed to compute path to {0} cmd.move.fail=Failed to compute path to {0}
cmd.move.suggestforce=Failed to compute a safe path to {0}. Try -f parameter to allow unsafe movements. cmd.move.suggestforce=Failed to compute a safe path to {0}. Try -f parameter to allow unsafe movements.
cmd.move.gravity.enabled=Gravity is enabled.
cmd.move.gravity.disabled=Gravity is disabled.
# Reco # Reco
cmd.reco.desc=restart and reconnect to the server. cmd.reco.desc=restart and reconnect to the server.

View file

@ -311,6 +311,8 @@ cmd.move.dir_fail=Impossible de se déplacer dans cette direction.
cmd.move.walk=Marche vers {0} cmd.move.walk=Marche vers {0}
cmd.move.fail=Échec de calcul du chemin vers {0} cmd.move.fail=Échec de calcul du chemin vers {0}
cmd.move.suggestforce=Échec de calcul du chemin vers {0}. Utilisez -f pour autoriser les mouvements risqués. cmd.move.suggestforce=Échec de calcul du chemin vers {0}. Utilisez -f pour autoriser les mouvements risqués.
cmd.move.gravity.enabled=La gravité est activée.
cmd.move.gravity.disabled=La gravité est désactivée.
# Reco # Reco
cmd.reco.desc=Relancer le programme et se reconnecter au serveur cmd.reco.desc=Relancer le programme et se reconnecter au serveur

View file

@ -0,0 +1,501 @@
[mcc]
# Messages from MCC itself
mcc.login=Đăng nhập:
mcc.login_basic_io=Hãy nhập địa chỉ email hoặc tên tài khoản của bạn:
mcc.password=Mật khẩu:
mcc.password_basic_io=Hãy nhập mật khẩu cho {0}.
mcc.password_hidden=Password : {0}
mcc.offline=§8Bạn chọn sử dụng chế độ ngoại tuyến.
mcc.session_invalid=§8Phiên không hợp lệ hoặc đã hết hạn.
mcc.session_valid=§8Phiên vẫn còn hợp lệ cho {0}.
mcc.connecting=Đang kết nối tới {0}...
mcc.ip=Địa chỉ máy chủ:
mcc.use_version=§8Sử dụng Minecraft phiên bản {0} (protocol v{1})
mcc.unknown_version=§8Phiên bản không hợp lệ {0}.\nChuyển sang chế độ nhận diện tự động.
mcc.forge=Đang kiểm tra xem máy chủ có dùng Forge...
mcc.forgeforce=Bắt buộc hỗ trợ Forge.
mcc.resolve=Đang giải quyết {0}...
mcc.found=§8Tìm thấy máy chủ {0}:{1} cho tên miền {2}
mcc.not_found=§8Tìm kiếm SRV thất bại cho {0}\n{1}: {2}
mcc.retrieve=Đang nhận thông tin máy chủ...
mcc.restart=Đang khởi động lại Minecraft Console Client...
mcc.restart_delay=Đang chờ {0} giây trước khi khởi động lại...
mcc.server_version=Phiên bản máy chủ:
mcc.disconnected=Chưa kết nối tới máy chủ nào. Dùng '{0}help' để in ra hướng dẫn.
mcc.press_exit=Hoặc nhấn Enter để đóng Minecraft Console Client
mcc.version_supported=Phiên bản hợp lệ \nĐang đăng nhập
mcc.single_cmd=§7Đã gửi lệnh §8 {0}.
mcc.joined=Đã tham gia máy chủ thành công\nGõ '{0}quit' để thoát máy chủ.
mcc.reconnect=Đang chờ 5 giây ({0} lượt còn lại)...
mcc.disconnect.lost=Mất kết nối.
mcc.disconnect.server=Ngắt kết nối bởi máy chủ.
mcc.disconnect.login=Đăng nhập thất bại.
mcc.link=Link: {0}
mcc.player_dead_respawn=Bạn đã chết. Sẽ tự động hồi sinh trong 1 giây.
mcc.player_dead=Bạn đã chết. Gõ /respawn để hồi sinh
mcc.server_offline=§8Máy chủ đang ở trong chế độ ngoại tuyến.
mcc.session=Đang kiểm tra phiên...
mcc.session_fail=Kiểm tra phiên thất bại.
mcc.server_protocol=§8Phiên bản server: {0} (Giao thức v{1})
mcc.with_forge=, với Forge
mcc.handshake=§8Bắt tay thành công (ID máy chủ: {0})
mcc.realms_available=Bạn có quyền tham gia vào những máy chủ Realm này
mcc.realms_join=Dùng realm:[thứ tự] để tham gia máy chủ Realm
[debug]
# Messages from MCC Debug Mode
debug.color_test=Color test: Màn hình của bạn sẽ hiển thị {0}
debug.session_cache_ok=§8Đã load thông tin phiên thành công
debug.session_cache_fail=§8Không có phiên nào có thể load.
debug.session_id=Thành công. (session ID: {0})
debug.crypto=§8Khóa mật mã và hash đã được tạo.
debug.request=§8Đang gửi yêu cầu tới {0}
[error]
# Error messages from MCC
error.ping=Ping IP thất bại.
error.unsupported=Không thể kết nối tới máy chủ: Phiên bản không hợp lệ.
error.determine=Nhận diện phiên bản máy chủ thất bại.
error.forgeforce=Không thể bắt buộc hỗ trợ Forge cho phiên bản này.
error.login=Đăng nhập Minecraft thất bại:
error.login.migrated=Tài khoản đã migrate, dùng địa chỉ email để đăng nhập.
error.login.server=Đăng nhập máy chủ không có sẵn. Hãy thử lại sau.
error.login.blocked=Sai mật khẩu, IP bị chặn hoặc quá nhiều lượt đăng nhập
error.login.response=Invalid server response.
error.login.premium=User not premium.
error.login.network=Network error.
error.login.ssl=SSL Error.
error.login.unknown=Unknown Error.
error.login.ssl_help=§8It appears that you are using Mono to run this program.\nThe first time, you have to import HTTPS certificates using:\nmozroots --import --ask-remove
error.login.cancel=User cancelled.
error.login_failed=Failed to login to this server.
error.join=Failed to join this server.
error.connect=Failed to connect to this IP.
error.timeout=Connection Timeout
error.unexpect_response=§8Unexpected response from the server (is that a Minecraft server?)
error.invalid_response=§8Invalid response to Handshake packet
error.invalid_encrypt=§8Invalid response to StartEncryption packet
error.version_different=§8Server reports a different version than manually set. Login may not work.
error.no_version_report=§8Server does not report its protocol version, autodetection will not work.
error.connection_timeout=§8A timeout occured while attempting to connect to this IP.
error.forge=§8Forge Login Handshake did not complete successfully
error.forge_encrypt=§8Forge StartEncryption Handshake did not complete successfully
error.setting.str2int=Failed to convert '{0}' into an int. Please check your settings.
error.setting.argument_syntax={0}: Invalid syntax, expecting --argname=value or --section.argname=value
error.setting.unknown_section={0}: Unknown setting section '{1}'
error.setting.unknown_or_invalid={0}: Unknown setting or invalid value
error.http_code=§8Got error code from server: {0}
error.auth=§8Got error code from server while refreshing authentication: {0}
error.realms.ip_error=Cannot retrieve the server IP of your Realms world
error.realms.access_denied=This Realms world does not exist or access was denied
error.realms.server_unavailable=Realms server may require some time to start up. Please retry again later.
error.realms.server_id=Invalid or unknown Realms server ID.
error.realms.disabled=Trying to join a Realms world but Realms support is disabled in config
[internal command]
# MCC internal help command
icmd.help=help <cmdname>: show brief help about a command.
icmd.unknown=Unknown command '{0}'. Use 'help' for command list.
icmd.list=help <cmdname>. Available commands: {0}. For server help, use '{1}send /help' instead.
icmd.error=OnInternalCommand: Got error from {0}: {1}
[exception]
# Exception messages threw by MCC
exception.user_logout=User-initiated logout should be done by calling Disconnect()
exception.unknown_direction=Unknown direction
exception.palette.block=Please update block types handling for this Minecraft version. See Material.cs
exception.palette.entity=Please update entity types handling for this Minecraft version. See EntityType.cs
exception.palette.item=Please update item types handling for this Minecraft version. See ItemType.cs
exception.palette.packet=Please update packet type palette for this Minecraft version. See PacketTypePalette.cs
exception.packet_process=Failed to process incoming packet of type {0}. (PacketID: {1}, Protocol: {2}, LoginPhase: {3}, InnerException: {4}).
exception.version_unsupport=The protocol version no.{0} is not supported.
exception.chatbot.init=ChatBot methods should NOT be called in the constructor as API handler is not initialized yet. Override Initialize() or AfterGameJoined() instead to perform initialization tasks.
exception.csrunner.invalid_head=The provided script does not have a valid MCCScript header
[chatbot]
# ChatBot API
chatbot.reconnect=[{0}] Disconnecting and Reconnecting to the Server
[filemonitor]
# FileMonitor
filemonitor.init=§8[{0}] Initializing FileSystemWatcher for file: {1}
filemonitor.fail=§8[{0}] Failed to initialize FileSystemWatcher, retrying using Polling
[extra]
# Inventory, Terrain & Movements, Entity related messages
# Terrain & Movements
extra.terrainandmovement_enabled=Terrain and Movements is now enabled.
extra.terrainandmovement_disabled=§cTerrain & Movements currently not handled for that MC version.
extra.terrainandmovement_required=Please enable Terrain and Movements in the config file first.
# Inventory
extra.inventory_enabled=Inventory handling is now enabled.
extra.inventory_disabled=§cInventories are currently not handled for that MC version.
extra.inventory_required=Please enable InventoryHandling in the config file first.
extra.inventory_interact=Use /inventory to interact with it.
extra.inventory_open=Inventory # {0} opened: {1}
extra.inventory_close=Inventory # {0} closed.
# Entity
extra.entity_disabled=§cEntities are currently not handled for that MC version.
extra.entity_required=Please enable EntityHandling in the config file first.
[forge]
# Messages from Forge handler
forge.version=§8Forge protocol version : {0}
forge.send_mod=§8Sending falsified mod list to server...
forge.accept=§8Accepting server mod list...
forge.registry=§8Received registry with {0} entries
forge.registry_2=§8Received registry {0} with {1} entries
forge.accept_registry=§8Accepting server registries...
forge.complete=Forge server connection complete!
forge.with_mod=§8Server is running Forge with {0} mods.
forge.no_mod=§8Server is running Forge without mods.
forge.mod_list=§8Mod list:
# FML2
forge.fml2.mod=§8Received FML2 Server Mod List
forge.fml2.mod_send=§8Sending back FML2 Client Mod List
forge.fml2.registry=§8Acknowledging FML2 Server Registry: {0}
forge.fml2.config=§8Acknowledging FML2 Server Config: {0}
forge.fml2.unknown=§8Got Unknown FML2 Handshake message no. {0}
forge.fml2.unknown_channel=§8Ignoring Unknown FML2 LoginMessage channel: {0}
[cache]
# Session Cache
cache.loading=§8Loading Minecraft profiles: {0}
cache.loaded=§8Loaded session: {0}:{1}
cache.converting=§8Converting session cache from disk: {0}
cache.read_fail=§8Failed to read serialized session cache from disk: {0}
cache.malformed=§8Got malformed data while reading serialized session cache from disk: {0}
cache.loading_session=§8Loading session cache from disk: {0}
cache.ignore_string=§8Ignoring session token string '{0}': {1}
cache.ignore_line=§8Ignoring invalid session token line: {0}
cache.read_fail_plain=§8Failed to read session cache from disk: {0}
cache.saving=§8Saving session cache to disk
cache.save_fail=§8Failed to write session cache to disk: {0}
[proxy]
proxy.connected=§8Connected to proxy {0}:{1}
[chat]
# Chat Parser
chat.download=§8Downloading '{0}.lang' from Mojang servers...
chat.request=§8Performing request to {0}
chat.done=§8Done. File saved as '{0}'
chat.fail=§8Failed to download the file.
chat.from_dir=§8Defaulting to en_GB.lang from your Minecraft directory.
chat.loaded=§8Translations file loaded.
chat.not_found=§8Translations file not found: '{0}'\nSome messages won't be properly printed without this file.
[general]
# General message/information (i.e. Done)
general.done=Done
general.fail=Fail
general.bot_unload=This bot will be unloaded.
general.available_cmd=Available commands: {0}
[cmd]
# Commands. Naming style: cmd.<className>.<msg...>
# Animation
cmd.animation.desc=Swing your arm.
# ChangeSlot
cmd.changeSlot.desc=Change hotbar
cmd.changeSlot.nan=Could not change slot: Not a Number
cmd.changeSlot.changed=Changed to slot {0}
cmd.changeSlot.fail=Could not change slot
# Connect
cmd.connect.desc=connect to the specified server.
cmd.connect.unknown=Unknown account '{0}'.
cmd.connect.invalid_ip=Invalid server IP '{0}'.
# Debug
cmd.debug.desc=toggle debug messages.
cmd.debug.state_on=Debug messages are now ON
cmd.debug.state_off=Debug messages are now OFF
# Dig
cmd.dig.desc=attempt to break a block
cmd.dig.too_far=You are too far away from this block.
cmd.dig.no_block=No block at this location (Air)
cmd.dig.dig=Attempting to dig block at {0} {1} {2}
cmd.dig.fail=Failed to start digging block.
# Entitycmd
cmd.entityCmd.attacked=Entity attacked
cmd.entityCmd.used=Entity used
cmd.entityCmd.not_found=Entity not found
cmd.entityCmd.entity=Entity
cmd.entityCmd.entities=Entities
cmd.entityCmd.nickname=Nickname
cmd.entityCmd.customname=Custom Name
cmd.entityCmd.latency=Latency
cmd.entityCmd.item=Item
cmd.entityCmd.equipment=Equipment
cmd.entityCmd.mainhand=Main Hand
cmd.entityCmd.offhane=Off Hand
cmd.entityCmd.helmet=Helmet
cmd.entityCmd.chestplate=Chestplate
cmd.entityCmd.leggings=Leggings
cmd.entityCmd.boots=Boots
cmd.entityCmd.pose=Pose
cmd.entityCmd.health=Health
cmd.entityCmd.distance=Distance
cmd.entityCmd.location=Location
cmd.entityCmd.type=Type
# Exit
cmd.exit.desc=disconnect from the server.
# Health
cmd.health.desc=Display Health and Food saturation.
cmd.health.response=Health: {0}, Saturation: {1}, Level: {2}, TotalExperience: {3}
# Inventory
cmd.inventory.desc=Inventory command
cmd.inventory.creative_done=Requested {0} x{1} in slot #{2}
cmd.inventory.creative_delete=Requested to clear slot #{0}
cmd.inventory.creative_fail=Failed to request Creative action
cmd.inventory.need_creative=You must be in Creative gamemode
cmd.inventory.container_not_found=Cannot find container, please retry with explicit ID
cmd.inventory.close=Closing Inventoy #{0}
cmd.inventory.close_fail=Failed to close Inventory #{0}
cmd.inventory.not_exist=Inventory #{0} do not exist
cmd.inventory.inventory=Inventory
cmd.inventory.inventories=Inventories
cmd.inventory.hotbar=Your selected hotbar is {0}
cmd.inventory.damage=Damage
cmd.inventory.left=Left
cmd.inventory.right=Right
cmd.inventory.middle=Middle
cmd.inventory.clicking={0} clicking slot {1} in window #{2}
cmd.inventory.no_item=No item in slot #{0}
cmd.inventory.drop=Dropped 1 item from slot #{0}
cmd.inventory.drop_stack=Dropped whole item stack from slot #{0}
# Inventory Help
cmd.inventory.help.basic=Basic usage
cmd.inventory.help.available=Available actions
cmd.inventory.help.help={0}\nUse '/inventory help <action>' for action help.\n'player' and 'container' can be simplified to 'p' and 'c'.\nNote that parameters in '[]' are optional.
cmd.inventory.help.usage=Usage
cmd.inventory.help.list=List your inventory.
cmd.inventory.help.close=Close an opened container.
cmd.inventory.help.click=Click on an item.
cmd.inventory.help.drop=Drop an item from inventory.
cmd.inventory.help.creativegive=Give item in creative mode.
cmd.inventory.help.creativedelete=Clear slot in creative mode.
cmd.inventory.help.unknown=Unknown action.
# List
cmd.list.desc=get the player list.
cmd.list.players=PlayerList: {0}
# Log
cmd.log.desc=log some text to the console.
# Look
cmd.look.desc=look at direction or coordinates.
cmd.look.unknown=Unknown direction '{0}'
cmd.look.at=Looking at YAW: {0} PITCH: {1}
cmd.look.block=Looking at {0}
# Move
cmd.move.desc=walk or start walking.
cmd.move.enable=Enabling Terrain and Movements on next server login, respawn or world change.
cmd.move.disable=Disabling Terrain and Movements.
cmd.move.moving=Moving {0}
cmd.move.dir_fail=Cannot move in that direction.
cmd.move.walk=Walking to {0}
cmd.move.fail=Failed to compute path to {0}
# Reco
cmd.reco.desc=restart and reconnect to the server.
# Respawn
cmd.respawn.desc=Use this to respawn if you are dead.
cmd.respawn.done=You have respawned.
# Script
cmd.script.desc=run a script file.
# Send
cmd.send.desc=send a chat message or command.
# Set
cmd.set.desc=set a custom %variable%.
cmd.set.format=variable name must be A-Za-z0-9.
# Sneak
cmd.sneak.desc=Toggles sneaking
cmd.sneak.on=You are sneaking now
cmd.sneak.off=You aren't sneaking anymore
# DropItem
cmd.dropItem.desc=Drop specified type of items from player inventory or opened container
cmd.dropItem.dropped=Dropped all {0} from inventory #{1}
cmd.dropItem.unknown_item=Unknown item {0}
# Tps
cmd.tps.desc=Display server current tps (tick per second). May not be accurate
cmd.tps.current=Current tps
# Useblock
cmd.useblock.desc=Place a block or open chest
# Useitem
cmd.useitem.desc=Use (left click) an item on the hand
cmd.useitem.use=Used an item
[bot]
# ChatBots. Naming style: bot.<className>.<msg...>
# AutoAttack
bot.autoAttack.mode=Unknown attack mode: {0}. Using single mode as default.
bot.autoAttack.priority=Unknown priority: {0}. Using distance priority as default.
bot.autoAttack.invalidcooldown=Attack cooldown value cannot be smaller than 0. Using auto as default
# AutoCraft
bot.autoCraft.cmd=Auto-crafting ChatBot command
bot.autoCraft.alias=Auto-crafting ChatBot command alias
bot.autoCraft.cmd.list=Total {0} recipes loaded: {1}
bot.autoCraft.cmd.resetcfg=Resetting your config to default
bot.autoCraft.recipe_not_exist=Specified recipe name does not exist. Check your config file.
bot.autoCraft.no_recipe_name=Please specify the recipe name you want to craft.
bot.autoCraft.stop=AutoCraft stopped
bot.autoCraft.available_cmd=Available commands: {0}. Use /autocraft help <cmd name> for more information. You may use /ac as command alias.
bot.autoCraft.help.load=Load the config file.
bot.autoCraft.help.list=List loaded recipes name.
bot.autoCraft.help.reload=Reload the config file.
bot.autoCraft.help.resetcfg=Write the default example config to default location.
bot.autoCraft.help.start=Start the crafting. Usage: /autocraft start <recipe name>
bot.autoCraft.help.stop=Stop the current running crafting process
bot.autoCraft.help.help=Get the command description. Usage: /autocraft help <command name>
bot.autoCraft.loaded=Successfully loaded
bot.autoCraft.start=Starting AutoCraft: {0}
bot.autoCraft.start_fail=AutoCraft cannot be started. Check your available materials for crafting {0}
bot.autoCraft.table_not_found=table not found
bot.autoCraft.close_inventory=Inventory #{0} was closed by AutoCraft
bot.autoCraft.missing_material=Missing material: {0}
bot.autoCraft.aborted=Crafting aborted! Check your available materials.
bot.autoCraft.craft_fail=Crafting failed! Waiting for more materials
bot.autoCraft.timeout=Action timeout! Reason: {0}
bot.autoCraft.error.config=Error while parsing config: {0}
bot.autoCraft.exception.empty=Empty configuration file: {0}
bot.autoCraft.exception.invalid=Invalid configuration file: {0}
bot.autoCraft.exception.item_miss=Missing item in recipe: {0}
bot.autoCraft.exception.invalid_table=Invalid tablelocation format: {0}
bot.autoCraft.exception.item_name=Invalid item name in recipe {0} at {1}
bot.autoCraft.exception.name_miss=Missing recipe name while parsing a recipe
bot.autoCraft.exception.slot=Invalid slot field in recipe: {0}
bot.autoCraft.exception.duplicate=Duplicate recipe name specified: {0}
bot.autoCraft.debug.no_config=No config found. Writing a new one.
# AutoDrop
bot.autoDrop.cmd=AutoDrop ChatBot command
bot.autoDrop.alias=AutoDrop ChatBot command alias
bot.autoDrop.on=AutoDrop enabled
bot.autoDrop.off=AutoDrop disabled
bot.autoDrop.added=Added item {0}
bot.autoDrop.incorrect_name=Incorrect item name {0}. Please try again
bot.autoDrop.removed=Removed item {0}
bot.autoDrop.not_in_list=Item not in the list
bot.autoDrop.no_item=No item in the list
bot.autoDrop.list=Total {0} in the list:\n {1}
bot.autoDrop.switched=Switched to {0} mode.
bot.autoDrop.unknown_mode=Unknwon mode. Available modes: Include, Exclude, Everything
bot.autoDrop.no_mode=Cannot read drop mode from config. Using include mode.
bot.autoDrop.no_inventory=Cannot find inventory {0}!
# AutoFish
bot.autoFish.throw=Threw a fishing rod
bot.autoFish.caught=Caught a fish!
bot.autoFish.no_rod=No Fishing Rod on hand. Maybe broken?
# AutoRelog
bot.autoRelog.launch=Launching with {0} reconnection attempts
bot.autoRelog.no_kick_msg=Initializing without a kick message file
bot.autoRelog.loading=Loading messages from file: {0}
bot.autoRelog.loaded=Loaded message: {0}
bot.autoRelog.not_found=File not found: {0}
bot.autoRelog.curr_dir=Current directory was: {0}
bot.autoRelog.ignore_user_logout=Disconnection initiated by User or MCC bot. Ignoring.
bot.autoRelog.disconnect_msg=Got disconnected with message: {0}
bot.autoRelog.reconnect_always=Ignoring kick message, reconnecting anyway.
bot.autoRelog.reconnect=Message contains '{0}'. Reconnecting.
bot.autoRelog.reconnect_ignore=Message not containing any defined keywords. Ignoring.
bot.autoRelog.wait=Waiting {0} seconds before reconnecting...
# AutoRespond
bot.autoRespond.loading=Loading matches from '{0}'
bot.autoRespond.file_not_found=File not found: '{0}'
bot.autoRespond.loaded_match=Loaded match:\n{0}
bot.autoRespond.no_trigger=This match will never trigger:\n{0}
bot.autoRespond.no_action=No action for match:\n{0}
bot.autoRespond.match_run=Running action: {0}
bot.autoRespond.match=match: {0}\nregex: {1}\naction: {2}\nactionPrivate: {3}\nactionOther: {4}\nownersOnly: {5}\ncooldown: {6}
# ChatLog
bot.chatLog.invalid_file=Path '{0}' contains invalid characters.
# Mailer
bot.mailer.init=Initializing Mailer with settings:
bot.mailer.init.db= - Database File: {0}
bot.mailer.init.ignore= - Ignore List: {0}
bot.mailer.init.public= - Public Interactions: {0}
bot.mailer.init.max_mails= - Max Mails per Player: {0}
bot.mailer.init.db_size= - Max Database Size: {0}
bot.mailer.init.mail_retention= - Mail Retention: {0}
bot.mailer.init_fail.db_size=Cannot enable Mailer: Max Database Size must be greater than zero. Please review the settings.
bot.mailer.init_fail.max_mails=Cannot enable Mailer: Max Mails per Player must be greater than zero. Please review the settings.
bot.mailer.init_fail.mail_retention=Cannot enable Mailer: Mail Retention must be greater than zero. Please review the settings.
bot.mailer.create.db=Creating new database file: {0}
bot.mailer.create.ignore=Creating new ignore list: {0}
bot.mailer.load.db=Loading database file: {0}
bot.mailer.load.ignore=Loading ignore list:
bot.mailer.cmd=mailer command
bot.mailer.saving=Saving message: {0}
bot.mailer.user_ignored={0} is ignored!
bot.mailer.process_mails=Looking for mails to send @ {0}
bot.mailer.delivered=Delivered: {0}
bot.mailer.cmd.getmails=--- Mails in database ---\n{0}
bot.mailer.cmd.getignored=--- Ignore list ---\n{0}
bot.mailer.cmd.ignore.added=Added {0} to the ignore list!
bot.mailer.cmd.ignore.removed=Removed {0} from the ignore list!
bot.mailer.cmd.ignore.invalid=Missing or invalid name. Usage: {0} <username>
bot.mailer.cmd.help=See usage
# ReplayCapture
bot.replayCapture.cmd=replay command
bot.replayCapture.created=Replay file created.
bot.replayCapture.stopped=Record stopped.
bot.replayCapture.restart=Record was stopped. Restart the program to start another record.
# Script
bot.script.not_found=§8[MCC] [{0}] Cannot find script file: {1}
bot.script.file_not_found=File not found: '{0}'
bot.script.fail=Script '{0}' failed to run ({1}).
bot.script.pm.loaded=Script '{0}' loaded.
# ScriptScheduler
bot.scriptScheduler.loading=Loading tasks from '{0}'
bot.scriptScheduler.not_found=File not found: '{0}'
bot.scriptScheduler.loaded_task=Loaded task:\n{0}
bot.scriptScheduler.no_trigger=This task will never trigger:\n{0}
bot.scriptScheduler.no_action=No action for task:\n{0}
bot.scriptScheduler.running_time=Time / Running action: {0}
bot.scriptScheduler.running_inverval=Interval / Running action: {0}
bot.scriptScheduler.running_login=Login / Running action: {0}
bot.scriptScheduler.task=triggeronfirstlogin: {0}\n triggeronlogin: {1}\n triggerontime: {2}\n triggeroninterval: {3}\n timevalue: {4}\n timeinterval: {5}\n action: {6}
# TestBot
bot.testBot.told=Bot: {0} told me : {1}
bot.testBot.said=Bot: {0} said : {1}

View file

@ -1,76 +1,76 @@
[mcc] [mcc]
# Messages from MCC itself # Messages from MCC itself
mcc.login=登录: mcc.login=登录:
mcc.login_basic_io=请输入用户名或邮箱 mcc.login_basic_io=请输入用户名或邮箱
mcc.password=密码: mcc.password=密码:
mcc.password_basic_io=请输入 {0} 的密码. mcc.password_basic_io=请输入{0}的密码。
mcc.password_hidden=密码:{0} mcc.password_hidden=密码:{0}
mcc.offline=§8您正在使用离线模式 mcc.offline=§8您正在使用离线模式
mcc.session_invalid=§8缓存无效或已过期 mcc.session_invalid=§8缓存无效或已过期
mcc.session_valid=§8{0} 的缓存仍然有效. mcc.session_valid=§8{0}的缓存仍然有效。
mcc.connecting=正在连接至{0}... mcc.connecting=正在连接至{0}...
mcc.ip=服务器IP mcc.ip=服务器IP
mcc.use_version=§8正在运行Minecraft版本{0} (v{1}协议) mcc.use_version=§8正在运行Minecraft版本{0} (v{1}协议)
mcc.unknown_version=§8未知或不受支持的Minecraft版本 {0}.\n正在切换至自动检测模式 mcc.unknown_version=§8未知或不受支持的Minecraft版本{0}。\n正在切换至自动检测模式。
mcc.forge=检查服务器是否正在运行Forge... mcc.forge=检查服务器是否正在运行Forge...
mcc.forgeforce=正在强制启动Forge支持 mcc.forgeforce=正在强制启动Forge支持
mcc.resolve=正在解析{0}... mcc.resolve=正在解析{0}...
mcc.found=§8已找到服务器{0}:{1},域名:{2} mcc.found=§8已找到服务器{0}:{1},域名:{2}
mcc.not_found=§8无法执行 {0} 的SRV解析\n{1}: {2} mcc.not_found=§8无法执行{0}的SRV解析\n{1}{2}
mcc.retrieve=正在获取服务器信息... mcc.retrieve=正在获取服务器信息...
mcc.restart=正在重启Minecraft控制台客户端... mcc.restart=正在重启Minecraft Console Client...
mcc.restart_delay=等待{0}秒后重启... mcc.restart_delay=等待{0}秒后重启...
mcc.server_version=服务器版本: mcc.server_version=服务器版本:
mcc.disconnected=未连接至任何服务器。输入 '{0}help' 获得帮助 mcc.disconnected=未连接至任何服务器。输入 '{0}help' 获得帮助
mcc.press_exit=或者敲击回车退出Minecraft控制台客户端 mcc.press_exit=或者敲击回车退出Minecraft Console Client。
mcc.version_supported=该版本受到支持\n正在登录... mcc.version_supported=该版本受到支持\n正在登录...
mcc.single_cmd=§7已发送命令§8 {0} mcc.single_cmd=§7已发送命令§8 {0}
mcc.joined=已成功加入服务器\n输入 '{0}quit' 离开服务器 mcc.joined=已成功加入服务器\n输入 '{0}quit' 离开服务器
mcc.reconnect=等待5秒 (剩余{0}次尝试)... mcc.reconnect=等待5秒 (剩余{0}次尝试)...
mcc.disconnect.lost=失去连接 mcc.disconnect.lost=失去连接
mcc.disconnect.server=从服务器断开: mcc.disconnect.server=从服务器断开:
mcc.disconnect.login=连接失败: mcc.disconnect.login=连接失败:
mcc.link=链接:{0} mcc.link=链接:{0}
mcc.player_dead_respawn=你死了1秒后自动重生 mcc.player_dead_respawn=你死了1秒后自动重生
mcc.player_dead=你死了!输入/respawn重生 mcc.player_dead=你死了!输入/respawn重生
mcc.server_offline=§8服务器正处于离线模式 mcc.server_offline=§8服务器正处于离线模式
mcc.session=检查会话... mcc.session=检查会话...
mcc.session_fail=检查会话失败 mcc.session_fail=检查会话失败
mcc.server_protocol=§8服务器版本{0} (v{1}协议) mcc.server_protocol=§8服务器版本{0} (v{1}协议)
mcc.with_forge=, 带有Forge mcc.with_forge=, 带有Forge
mcc.handshake=§8握手成功 (服务器ID: {0}) mcc.handshake=§8握手成功。 (服务器ID{0})
mcc.realms_available==您拥有以下Realms地图的访问权 mcc.realms_available==您可以访问以下Realms世界
mcc.realms_join=加入realms使用服务器IP连接Realms地图 mcc.realms_join=请使用realms:<序号>作为服务器IP加入Realms世界
[debug] [debug]
# Messages from MCC Debug Mode # Messages from MCC Debug Mode
debug.color_test=颜色测试:终端应该显示的颜色是:{0} debug.color_test=颜色测试:终端应该显示的颜色是:{0}
debug.session_cache_ok=§8已成功从磁盘中加载会话数据. debug.session_cache_ok=§8已成功从磁盘中加载会话数据
debug.session_cache_fail=§8无法从磁盘加载会话 debug.session_cache_fail=§8无法从磁盘加载会话
debug.session_id=成功!(会话ID: {0}) debug.session_id=成功!(会话ID{0})
debug.crypto=§8密钥已生成: debug.crypto=§8密钥和哈希值已生成:
debug.request=§8正在执行请求对 {0} debug.request=§8正在请求{0}
[error] [error]
# Error messages from MCC # Error messages from MCC
error.ping=ping此IP失败。 error.ping=ping此IP失败。
error.unsupported=无法连接到服务器:不支持此版本! error.unsupported=无法连接到服务器:不支持此版本!
error.determine=无法确定服务器版本。 error.determine=无法确定服务器版本。
error.forgeforce=Forge无法强制支持此Minecraft版本 error.forgeforce=无法为此Minecraft版本强制启动Forge支持
error.login=Minecraft登录失败: error.login=登录失败:
error.login.migrated=帐户已迁移,使用电子邮件作为用户名. error.login.migrated=帐户已迁移,使用电子邮件作为用户名
error.login.server=登录服务器不可用。请稍后再试. error.login.server=登录服务器不可用。请稍后再试
error.login.blocked=密码错误、黑名单IP或登录次数过多 error.login.blocked=密码错误、IP被禁用或登录次数过多。
error.login.response=服务器响应无效。 error.login.response=服务器响应无效。
error.login.premium=不是白名单内用户 error.login.premium=不是Premium用户。
error.login.network=网络错误。 error.login.network=网络错误。
error.login.ssl=SSL错误 error.login.ssl=SSL错误
error.login.unknown=未知错误 error.login.unknown=未知错误
error.login.ssl_help=§8似乎正在使用Mono运行此程序.\n第一次您必须使用以下命令导入HTTPS证书\mozroots --import --ask-remove error.login.ssl_help=§8似乎正在使用Mono运行此程序.\n第一次运行您必须使用以下命令导入HTTPS证书\nmozroots --import --ask-remove
error.login.cancel=用户取消 error.login.cancel=用户取消
error.login_failed=无法登录到此服务器。 error.login_failed=无法登录到此服务器。
error.join=无法加入服务器。 error.join=加入服务器时发生错误
error.connect=无法连接到此IP。 error.connect=无法连接到此IP。
error.timeout=连接超时 error.timeout=连接超时
error.unexpect_response=§8来自服务器的意外响应这是Minecraft服务器吗 error.unexpect_response=§8来自服务器的意外响应这是Minecraft服务器吗
@ -78,39 +78,39 @@ error.invalid_response=§8对握手包的响应无效
error.invalid_encrypt=§8对StartEncryption数据包的响应无效 error.invalid_encrypt=§8对StartEncryption数据包的响应无效
error.version_different=§8服务器报告的版本与手动设置的版本不同。登录可能无法工作。 error.version_different=§8服务器报告的版本与手动设置的版本不同。登录可能无法工作。
error.no_version_report=§8服务器未报告其协议版本自动检测将不起作用。 error.no_version_report=§8服务器未报告其协议版本自动检测将不起作用。
error.connection_timeout=§8A 尝试连接到此IP时超时。 error.connection_timeout=§8尝试连接到此IP时超时。
error.forge=§8Forge登录握手未成功完成 error.forge=§8Forge登录握手未成功完成
error.forge_encrypt=§8Forge StartEncryption握手未成功完成 error.forge_encrypt=§8Forge StartEncryption握手未成功完成
error.setting.str2int=无法将'{0}'转换为int。请检查设置。 error.setting.str2int=无法将'{0}'转换为整数。请检查设置。
error.setting.argument_syntax={0}: 无效语法,应为--argname=value或--section.argname=value error.setting.argument_syntax={0}:无效语法,应为 --argname=value 或 --section.argname=value
error.setting.unknown_section={0}: 未知设置部分 '{1}' error.setting.unknown_section={0}:未知设置部分'{1}'
error.setting.unknown_or_invalid={0}: 未知设置或无效值 error.setting.unknown_or_invalid={0}未知设置或无效值
error.http_code=§8接收到服务器错误: {0} error.http_code=§8接收到服务器错误{0}
error.auth=§8在刷新身份验证时接收到服务器错误: {0} error.auth=§8在刷新身份验证时接收到服务器错误{0}
error.realms.ip_error=无法检索您所在领域的服务器IP error.realms.ip_error=无法获取您Realms世界的服务器IP
error.realms.access_denied=领域世界不存在或访问被拒绝 error.realms.access_denied=Realms世界不存在或访问被拒绝
error.realms.server_unavailable=领域服务器可能需要一些时间来启动,请稍后再试。 error.realms.server_unavailable=Realms服务器可能需要一些时间来启动。请稍后再试。
error.realms.server_id=领域服务器ID无效或未知。 error.realms.server_id=Realms服务器ID无效或未知。
error.realms.disabled=正在尝试加入领域世界,但配置中禁用了领域支持 error.realms.disabled=正在尝试加入Realms世界但配置中禁用了Realms支持
[internal command] [internal command]
# MCC internal help command # MCC internal help command
icmd.help=help <cmdname>: 显示有关命令的简要帮助. icmd.help=help <命令名称> :显示有关命令的简要帮助。
icmd.unknown=未知命令 '{0}',请使用 'help' 命令来获取命令列表. icmd.unknown=未知命令 '{0}'。请使用 'help' 命令来获取命令列表。
icmd.list=帮助 <cmdname>. 可用命令: {0}. 对于服务器帮助,请改用 '{1}send /help'. icmd.list=help <命令名称>。可用命令:{0}。在服务器上获取帮助,请改用 '{1}send /help'。
icmd.error=内部命令: 来自{0}的错误{1} icmd.error=OnInternalCommand: 来自{0}的错误{1}
[exception] [exception]
# Exception messages threw by MCC # Exception messages threw by MCC
exception.user_logout=用户发起的注销应该通过调用Disconnect来完成() exception.user_logout=用户发起的注销应该通过调用Disconnect()来完成
exception.unknown_direction=未知方向 exception.unknown_direction=未知方向
exception.palette.block=更新此minecraft版本的块类型处理. 详细请参考 Material.cs exception.palette.block=为此Minecraft版本更新方块类型处理。详细请参考 Material.cs
exception.palette.entity=更新此Minecraft版本的实体类型处理. 详细请参考 EntityType.cs exception.palette.entity=为此Minecraft版本更新实体类型处理。详细请参考 EntityType.cs
exception.palette.item=更新此Minecraft版本的物品类型处理. 详细请参考 ItemType.cs exception.palette.item=为此Minecraft版本更新物品类型处理。详细请参考 ItemType.cs
exception.palette.packet=更新此Minecraft版本的数据包类型调色板. 详细请参考 PacketTypePalette.cs exception.palette.packet=为此Minecraft版本更新数据包类型调色板。详细请参考 PacketTypePalette.cs
exception.packet_process=无法处理传入的{0}类型的数据包. (数据包ID: {1}, 协议: {2}, 登陆阶段: {3}, 内部异常: {4}). exception.packet_process=无法处理传入的{0}类型的数据包。(数据包ID{1},协议:{2},登陆阶段:{3},内部异常:{4})。
exception.version_unsupport=版本{0}的协议未被支持. exception.version_unsupport=版本{0}的协议未被支持
exception.chatbot.init=不应调用ChatBot方法因为在构造函数中作为API处理程序的模块尚未初始化请使用 Override Initialize() or AfterGameJoined() 来执行初始化任务. exception.chatbot.init=不应在构造函数中调用ChatBot的方法因为作为API处理程序的模块尚未初始化。请重写 Initialize() 或 AfterGameJoined() 来执行初始化任务。
exception.csrunner.invalid_head=提供的脚本没有有效的MCCScript头 exception.csrunner.invalid_head=提供的脚本没有有效的MCCScript头
[chatbot] [chatbot]
@ -119,114 +119,114 @@ chatbot.reconnect=[{0}] 断开并重新连接到服务器
[filemonitor] [filemonitor]
# FileMonitor # FileMonitor
filemonitor.init=§8[{0}] 正在为文件{1}初始化... filemonitor.init=§8[{0}] 正在为文件{1}初始化FileSystemWatcher
filemonitor.fail=§8[{0}] 无法初始化文件系统监视程序,正在使用轮询重试 filemonitor.fail=§8[{0}] 无法初始化FileSystemWatcher,正在使用轮询重试
[extra] [extra]
# Inventory, Terrain & Movements, Entity related messages # Inventory, Terrain & Movements, Entity related messages
# Terrain & Movements # Terrain & Movements
extra.terrainandmovement_enabled=地形和移动现在已启用。 extra.terrainandmovement_enabled=地形和移动现在已启用。
extra.terrainandmovement_disabled=§c该MC版本目前未支持处理地形和移动. extra.terrainandmovement_disabled=§c该MC版本目前未支持处理地形和移动
extra.terrainandmovement_required=请先在配置文件中启用地形和移动. extra.terrainandmovement_required=请先在配置文件中启用地形和移动
# Inventory # Inventory
extra.inventory_enabled=物品栏处理现在已启用. extra.inventory_enabled=物品栏处理现在已启用
extra.inventory_disabled=§c该MC版本目前未支持处理物品栏. extra.inventory_disabled=§c该MC版本目前未支持处理物品栏
extra.inventory_required=请先在配置文件中启用物品栏处理. extra.inventory_required=请先在配置文件中启用InventoryHandling。
extra.inventory_interact=使用 /inventory 来与其交互. extra.inventory_interact=请使用 /inventory 来与其交互。
extra.inventory_open=物品栏 # {0} 已开启: {1} extra.inventory_open=物品栏# {0}已开启:{1}
extra.inventory_close=物品栏 # {0} 已关闭. extra.inventory_close=物品栏# {0}已关闭。
# Entity # Entity
extra.entity_disabled=§c该MC版本当前未支持处理实体。 extra.entity_disabled=§c该MC版本当前未支持处理实体。
extra.entity_required=请先在配置文件中启用实体处理Entity Handling. extra.entity_required=请先在配置文件中启用EntityHandling。
[forge] [forge]
# Messages from Forge handler # Messages from Forge handler
forge.version=§8forge协议版本 : {0} forge.version=§8Forge协议版本{0}
forge.send_mod=§8向服务器发送forge的mod列表... forge.send_mod=§8向服务器发送伪造的forge模组列表...
forge.accept=§8接受来自的服务器mod列表... forge.accept=§8接受来自的服务器模组列表...
forge.registry=§8收到的注册表有 {0} 个条目 forge.registry=§8已接收的注册表包含{0}个条目
forge.registry_2=§8已接收注册表 {0} 来自 {1} 条目 forge.registry_2=§8已接收注册表{0},包含{1}个条目
forge.accept_registry=§8接受服务器注册... forge.accept_registry=§8接受服务器注册...
forge.complete=Forge服务器连接完成! forge.complete=Forge服务器连接完成!
forge.with_mod=§8服务器正在运行Forge {0} mods. forge.with_mod=§8服务器正在运行Forge{0}个模组。
forge.no_mod=§8正在运行的服务器没有Forgemods. forge.no_mod=§8正在运行的服务器没有Forge模组。
forge.mod_list=§8模组列表: forge.mod_list=§8模组列表:
# FML2 # FML2
forge.fml2.mod=§8收到FM2服务器Mod列表 forge.fml2.mod=§8收到FM2服务器模组列表
forge.fml2.mod_send=§8发回FML2客户端的mod列表 forge.fml2.mod_send=§8发回FML2客户端的模组列表
forge.fml2.registry=§8确认FML2服务器注册表: {0} forge.fml2.registry=§8确认FML2服务器注册表{0}
forge.fml2.config=§8确认FML2服务器配置: {0} forge.fml2.config=§8确认FML2服务器配置{0}
forge.fml2.unknown=§8收到未知的FML2握手信息. {0} forge.fml2.unknown=§8收到未知的FML2握手信息,编号:{0}
forge.fml2.unknown_channel=§8忽略未知的FML2登录消息通道: {0} forge.fml2.unknown_channel=§8忽略未知的FML2登录消息通道{0}
[cache] [cache]
# Session Cache # Session Cache
cache.loading=§8加载Minecraft配置文件: {0} cache.loading=§8加载Minecraft配置文件{0}
cache.loaded=§8已加载会话: {0}:{1} cache.loaded=§8已加载会话{0}:{1}
cache.converting=§8从磁盘转换的会话缓存: {0} cache.converting=§8从磁盘转换会话缓存:{0}
cache.read_fail=§8无法从磁盘读取序列化会话缓存: {0} cache.read_fail=§8无法从磁盘读取序列化会话缓存{0}
cache.malformed=§8从磁盘读取序列化会话缓存时获取的数据格式错误,格式错误的数据: {0} cache.malformed=§8从磁盘读取序列化会话缓存时获取到格式错误的数据:{0}
cache.loading_session=§8从磁盘加载会话缓存: {0} cache.loading_session=§8从磁盘加载会话缓存{0}
cache.ignore_string=§8忽略会话令牌字符串 '{0}': {1} cache.ignore_string=§8忽略会话令牌字符串'{0}'{1}
cache.ignore_line=§8忽略会话令牌行无效: {0} cache.ignore_line=§8忽略无效的会话令牌行:{0}
cache.read_fail_plain=§8无法从磁盘读取会话缓存: {0} cache.read_fail_plain=§8无法从磁盘读取会话缓存{0}
cache.saving=§8将会话缓存保存到磁盘... cache.saving=§8将会话缓存保存到磁盘
cache.save_fail=§8无法将会话缓存写入磁盘: {0} cache.save_fail=§8无法将会话缓存写入磁盘{0}
[proxy] [proxy]
proxy.connected=§8已连接到代理{0}:{1} proxy.connected=§8已连接到代理{0}:{1}
[chat] [chat]
# Chat Parser # Chat Parser
chat.download=§8从Mojang服务器下载...'{0}.lang' chat.download=§8从Mojang服务器下载 '{0}.lang'...
chat.request=§8正在执行请求对 {0}... chat.request=§8正在请求{0}...
chat.done=§8完成。文件另存为 '{0}' chat.done=§8完成。文件另存为 '{0}'
chat.fail=§8下载文件失败. chat.fail=§8下载文件失败
chat.from_dir=§8默认为你的Minecraft目录中的en_GB.lang chat.from_dir=§8默认为你的Minecraft目录中的en_GB.lang
chat.loaded=§8已加载翻译文件. chat.loaded=§8已加载翻译文件
chat.not_found=§8找不到翻译文件: '{0}'\n如果没有此文件某些信息将无法正确打印. chat.not_found=§8找不到翻译文件'{0}'\n如果没有此文件某些信息将无法正确打印。
[general] [general]
# General message/information (i.e. Done) # General message/information (i.e. Done)
general.done=完成 general.done=完成
general.fail=失败 general.fail=失败
general.bot_unload=将卸载此bot。. general.bot_unload=卸载此bot。
general.available_cmd=可用命令: {0} general.available_cmd=可用命令{0}
[cmd] [cmd]
# Commands. Naming style: cmd.<className>.<msg...> # Commands. Naming style: cmd.<className>.<msg...>
# Animation # Animation
cmd.animation.desc=挥动你的手臂. cmd.animation.desc=挥动你的手臂
# ChangeSlot # ChangeSlot
cmd.changeSlot.desc=更改物品栏 cmd.changeSlot.desc=变更快捷栏栏位
cmd.changeSlot.nan=无法更改插槽:不是数字 cmd.changeSlot.nan=无法变更栏位:不是数字
cmd.changeSlot.changed=更改为插槽 {0} cmd.changeSlot.changed=变更为栏位{0}
cmd.changeSlot.fail=无法更改插槽 cmd.changeSlot.fail=无法变更栏位
# Connect # Connect
cmd.connect.desc=连接到指定的服务器. cmd.connect.desc=连接到指定的服务器
cmd.connect.unknown=未知帐户 '{0}'. cmd.connect.unknown=未知帐户 '{0}'
cmd.connect.invalid_ip=无效的服务器IP '{0}'. cmd.connect.invalid_ip=无效的服务器IP '{0}'
# Debug # Debug
cmd.debug.desc=切换调试消息. cmd.debug.desc=切换调试消息
cmd.debug.state_on=调试消息现在已打开 cmd.debug.state_on=调试消息现在已打开
cmd.debug.state_off=调试消息现在已关闭 cmd.debug.state_off=调试消息现在已关闭
# Dig # Dig
cmd.dig.desc=试图破一个方块 cmd.dig.desc=试图一个方块
cmd.dig.too_far=你离这个方块太远了. cmd.dig.too_far=你离这个方块太远了
cmd.dig.no_block=这个地方没有方块 (空气) cmd.dig.no_block=这个地方没有方块 (空气)
cmd.dig.dig=尝试挖掘位于{0} {1} {2}的方块 cmd.dig.dig=尝试挖掘位于{0} {1} {2}的方块
cmd.dig.fail=无法开始挖掘方块. cmd.dig.fail=无法开始挖掘方块
# Entitycmd # Entitycmd
cmd.entityCmd.attacked=被攻击的实体 cmd.entityCmd.attacked=已攻击实体
cmd.entityCmd.used=使用实体 cmd.entityCmd.used=使用实体
cmd.entityCmd.not_found=找不到实体 cmd.entityCmd.not_found=找不到实体
cmd.entityCmd.entity=实体 cmd.entityCmd.entity=实体
@ -235,13 +235,13 @@ cmd.entityCmd.nickname=昵称
cmd.entityCmd.customname=自定义名称 cmd.entityCmd.customname=自定义名称
cmd.entityCmd.latency=延迟 cmd.entityCmd.latency=延迟
cmd.entityCmd.item=物品 cmd.entityCmd.item=物品
cmd.entityCmd.equipment= cmd.entityCmd.equipment=
cmd.entityCmd.mainhand=主手 cmd.entityCmd.mainhand=主手
cmd.entityCmd.offhane=副手 cmd.entityCmd.offhane=副手
cmd.entityCmd.helmet=头盔 cmd.entityCmd.helmet=头盔
cmd.entityCmd.chestplate=胸甲 cmd.entityCmd.chestplate=胸甲
cmd.entityCmd.leggings=裤甲 cmd.entityCmd.leggings=护腿
cmd.entityCmd.boots= cmd.entityCmd.boots=
cmd.entityCmd.pose=姿势 cmd.entityCmd.pose=姿势
cmd.entityCmd.health=生命值 cmd.entityCmd.health=生命值
cmd.entityCmd.distance=距离 cmd.entityCmd.distance=距离
@ -249,97 +249,105 @@ cmd.entityCmd.location=位置
cmd.entityCmd.type=类型 cmd.entityCmd.type=类型
# Exit # Exit
cmd.exit.desc=断开与服务器的连接. cmd.exit.desc=断开与服务器的连接
# Health # Health
cmd.health.desc=显示生命值和饱食度. cmd.health.desc=显示生命值和饱食度
cmd.health.response=健康值: {0}, 饱食度: {1}, 等级: {2}, 经验值: {3} cmd.health.response=生命值:{0},饱食度:{1},等级:{2},总经验值:{3}
# Inventory # Inventory
cmd.inventory.desc=存储类型命令 cmd.inventory.desc=物品栏相关命令
cmd.inventory.creative_done=请求 {0} x{1} 在存储槽 #{2} cmd.inventory.creative_done=向栏位#{2}请求{0} x{1}
cmd.inventory.creative_delete=请求清除存储槽 #{0} cmd.inventory.creative_delete=请求清除栏位 #{0}
cmd.inventory.creative_fail=请求创造操作失败 cmd.inventory.creative_fail=请求创造模式操作失败
cmd.inventory.need_creative=你必须在创造模式 cmd.inventory.need_creative=你必须在创造模式
cmd.inventory.container_not_found=找不到容器请使用显式ID重试 cmd.inventory.container_not_found=找不到容器请使用显式ID重试
cmd.inventory.close=关闭物品栏 #{0} cmd.inventory.close=关闭物品栏 #{0}
cmd.inventory.close_fail=关闭物品栏失败 #{0} cmd.inventory.close_fail=关闭物品栏失败 #{0}
cmd.inventory.not_exist=物品栏#{0}不存在 cmd.inventory.not_exist=物品栏#{0}不存在
cmd.inventory.inventory=物品栏 cmd.inventory.inventory=物品栏
cmd.inventory.inventories=存货 cmd.inventory.inventories=物品栏集
cmd.inventory.hotbar=您选择的物品栏是 {0} cmd.inventory.hotbar=您选择的快捷栏是{0}
cmd.inventory.damage=武器伤害值 cmd.inventory.damage=武器伤害值
cmd.inventory.left= cmd.inventory.left=
cmd.inventory.right= cmd.inventory.right=
cmd.inventory.middle=中间 cmd.inventory.middle=中间
cmd.inventory.clicking={0} 单机存储槽 {1} 在窗口中 #{2} cmd.inventory.clicking={0}正在点击窗口#{2}中的栏位{1}
cmd.inventory.no_item=存储槽中没有物品 #{0} cmd.inventory.no_item=栏位#{0}中没有物品
cmd.inventory.drop=存储槽中删除了1个项目 #{0} cmd.inventory.drop=栏位#{0}中丢弃了1个物品
cmd.inventory.drop_stack=存储槽中删除了所有堆叠的物品 #{0} cmd.inventory.drop_stack=栏位#{0}中丢弃了所有堆叠的物品
# Inventory Help # Inventory Help
cmd.inventory.help.basic=基本用法 cmd.inventory.help.basic=基本用法
cmd.inventory.help.available=可用操作 cmd.inventory.help.available=可用操作
cmd.inventory.help.help={0}\n使用 '/inventory help <action>' 获取帮助.\n'player' 和 'container' 可以简化为 'p' 和 'c'.\n请注意这些中的参数 '[]' 是可选的. cmd.inventory.help.help={0}\n使用 '/inventory help <action>' 获取帮助。\n'player' 和 'container' 可以简化为 'p' 和 'c'。\n请注意'[]' 中的参数是可选的。
cmd.inventory.help.usage=用法 cmd.inventory.help.usage=用法
cmd.inventory.help.list=列出你的列表. cmd.inventory.help.list=列出你的物品栏。
cmd.inventory.help.close=关闭打开的容器. cmd.inventory.help.close=关闭打开的容器
cmd.inventory.help.click=单击项目. cmd.inventory.help.click=单击物品。
cmd.inventory.help.drop=从物品栏中删除项目 cmd.inventory.help.drop=从物品栏中丢弃物品
cmd.inventory.help.creativegive=在创造模式给予物品. cmd.inventory.help.creativegive=在创造模式中给予物品。
cmd.inventory.help.creativedelete=在创造性模式中清除物品栏. cmd.inventory.help.creativedelete=在创造性模式中清除栏位。
cmd.inventory.help.unknown=未知操作. cmd.inventory.help.unknown=未知操作
# List 列表设置 # List 列表设置
cmd.list.desc=获取玩家列表.... cmd.list.desc=获取玩家列表
cmd.list.players=玩家列表: {0} cmd.list.players=玩家列表{0}
# Log # Log
cmd.log.desc=将文本记录到控制台. cmd.log.desc=将文本记录到控制台
# Look # Look
cmd.look.desc=查看方向或坐标. cmd.look.desc=查看方向或坐标
cmd.look.unknown=未知方向 '{0}' cmd.look.unknown=未知方向 '{0}'
cmd.look.at=查看相对偏差: {0} 间距: {1} cmd.look.at=正在看向偏航角:{0} 俯仰角:{1}
cmd.look.block=正在看向{0} cmd.look.block=正在看向{0}
# Move # Move
cmd.move.desc=移动或开始移动. cmd.move.desc=移动或开始移动
cmd.move.enable=在下次服务器登录、重生或世界改变时启用地形和移动。 cmd.move.enable=在下次服务器登录、重生或更换世界时启用地形和移动。
cmd.move.disable=禁用地形和移动. cmd.move.disable=禁用地形和移动
cmd.move.moving=移动{0} cmd.move.moving=移动{0}
cmd.move.dir_fail=不能朝此方向移动. cmd.move.dir_fail=不能朝此方向移动
cmd.move.walk=移动到{0} cmd.move.walk=移动到{0}
cmd.move.fail=无法计算到的路径 {0} cmd.move.fail=无法计算到达{0}的路径。
cmd.move.suggestforce=无法计算安全到达{0}的路径. 请使用 -f 参数允许不安全移动。
cmd.move.gravity.enabled=重力已开启。
cmd.move.gravity.disabled=重力已关闭。
# Reco # Reco
cmd.reco.desc=重新启动并重新连接到服务器. cmd.reco.desc=重新启动并重新连接到服务器
# Respawn # Respawn
cmd.respawn.desc=如果你死亡了,请用这个来重生. cmd.respawn.desc=如果你死亡了,请用这个来重生
cmd.respawn.done=你重生了. cmd.respawn.done=你重生了
# Script # Script
cmd.script.desc=运行脚本文件. cmd.script.desc=运行脚本文件
# Send # Send
cmd.send.desc=发送聊天信息或命令. cmd.send.desc=发送聊天信息或命令
# Set # Set
cmd.set.desc=设置自定义 %variable%. cmd.set.desc=设置自定义 %variable%。
cmd.set.format=变量名范围必须为 A-Za-z0-9. cmd.set.format=变量名范围必须为 A-Za-z0-9。
# SetRnd
cmd.setrnd.desc=随机为自定义 %变量名% 赋值。
cmd.setrndnum.format=setrnd 变量名 -7to17
cmd.setrndstr.format=setrnd 变量名 字符串1 "\"字符串2\" 字符串3"
# Sneak # Sneak
cmd.sneak.desc=切换到潜行 cmd.sneak.desc=切换到潜行
cmd.sneak.on=现在你在潜行状态 cmd.sneak.on=现在你在潜行状态
cmd.sneak.off=你不在潜行状态了 cmd.sneak.off=你不在潜行状态了
# DropItem # DropItem
cmd.dropItem.desc=删除指定类型的玩家背包或打开的容器中的物品 cmd.dropItem.desc=丢弃玩家物品栏中的指定类型物品或打开的容器
cmd.dropItem.dropped=已从清单中删除所有物品{0} #{1} cmd.dropItem.dropped=已从物品栏#{1}中丢弃所有{0}
cmd.dropItem.unknown_item=未知{0} cmd.dropItem.unknown_item=未知物品:{0}
# Tps # Tps
cmd.tps.desc=显示服务器当前tps,可能不准确 cmd.tps.desc=显示服务器当前tps (tick per second)。(可能不精确)
cmd.tps.current=当前TPS cmd.tps.current=当前TPS
# Useblock # Useblock
@ -347,7 +355,7 @@ cmd.useblock.desc=放置一个方块或打开箱子
# Useitem # Useitem
cmd.useitem.desc=使用(左键单击)手上的物品 cmd.useitem.desc=使用(左键单击)手上的物品
cmd.useitem.use=使用了一个物品 cmd.useitem.use=使用了一个物品
[bot] [bot]
@ -355,147 +363,147 @@ cmd.useitem.use=使用了一个物品
# AutoAttack # AutoAttack
bot.autoAttack.mode=未知的攻击模式:{0},使用单一模式作为默认值。 bot.autoAttack.mode=未知的攻击模式:{0},使用单一模式作为默认值。
bot.autoAttack.priority=未知优先级:{0},使用距离优先级作为默认值。 bot.autoAttack.priority=未知优先模式:{0},使用距离优先作为默认值。
bot.autoAttack.invalidcooldown=攻击冷却时间值不能小于0已使用自动作为默认值 bot.autoAttack.invalidcooldown=攻击冷却时间值不能小于0已使用自动作为默认值
# AutoCraft # AutoCraft
bot.autoCraft.cmd=自动创建ChatBot命令 bot.autoCraft.cmd=自动制作ChatBot命令
bot.autoCraft.alias=自动创建ChatBot命令别名 bot.autoCraft.alias=自动制作ChatBot命令的别名
bot.autoCraft.cmd.list=已加载{0}个配方:{1} bot.autoCraft.cmd.list=已加载{0}个配方:{1}
bot.autoCraft.cmd.resetcfg=将配置重置为默认值 bot.autoCraft.cmd.resetcfg=将配置重置为默认值
bot.autoCraft.recipe_not_exist=指定的配方名称不存在。检查配置文件。 bot.autoCraft.recipe_not_exist=指定的配方名称不存在。检查配置文件。
bot.autoCraft.no_recipe_name=请指定要制作的配方名称。 bot.autoCraft.no_recipe_name=请指定要制作的配方名称。
bot.autoCraft.stop=自动合成已停止 bot.autoCraft.stop=AutoCraft已停止
bot.autoCraft.available_cmd=可用命令: {0}. 可使用 /autocraft help <cmd name> 了解更多信息. 您可以使用 /ac 作为命令别名. bot.autoCraft.available_cmd=可用命令{0}。可使用 /autocraft help <命令名> 了解更多信息。您可以使用 /ac 作为命令别名。
bot.autoCraft.help.load=加载配置文件. bot.autoCraft.help.load=加载配置文件
bot.autoCraft.help.list=列出加载的配方名称. bot.autoCraft.help.list=列出可用配方。
bot.autoCraft.help.reload=重新加载配置文件. bot.autoCraft.help.reload=重新加载配置文件
bot.autoCraft.help.resetcfg=将默认示例配置写入默认位置。 bot.autoCraft.help.resetcfg=将默认示例配置写入默认位置。
bot.autoCraft.help.start=开始制作. 用法: /autocraft start <配方名称> bot.autoCraft.help.start=开始制作。用法:/autocraft start <配方名称>
bot.autoCraft.help.stop=停止当前正在进行的合成过程 bot.autoCraft.help.stop=停止当前正在进行的制作过程
bot.autoCraft.help.help=获取命令描述. 用法: /autocraft help <命令名> bot.autoCraft.help.help=获取命令描述。用法: /autocraft help <命令名>
bot.autoCraft.loaded=已成功加载 bot.autoCraft.loaded=已成功加载
bot.autoCraft.start=自动合成启动中: {0} bot.autoCraft.start=AutoCraft启动中{0}
bot.autoCraft.start_fail=无法启动自动合成。检查你的可用制作材料 {0} bot.autoCraft.start_fail=无法启动AutoCraft。请检查用于制作{0}的可用材料
bot.autoCraft.table_not_found=找不到合成列表 bot.autoCraft.table_not_found=找不到工作台
bot.autoCraft.close_inventory=物品栏#{0}被AutoCraft关闭 bot.autoCraft.close_inventory=物品栏#{0}被AutoCraft关闭
bot.autoCraft.missing_material=丢失的材料: {0} bot.autoCraft.missing_material=缺失材料:{0}
bot.autoCraft.aborted=制作失败!检查可用材料. bot.autoCraft.aborted=制作被终止!请检查可用材料。
bot.autoCraft.craft_fail=制作失败!等待更多材料 bot.autoCraft.craft_fail=制作失败!等待更多材料
bot.autoCraft.timeout=动作超时!原因: {0} bot.autoCraft.timeout=动作超时!原因{0}
bot.autoCraft.error.config=分析配置时出错: {0} bot.autoCraft.error.config=分析配置时出错{0}
bot.autoCraft.exception.empty=空配置文件: {0} bot.autoCraft.exception.empty=空配置文件{0}
bot.autoCraft.exception.invalid=配置文件无效: {0} bot.autoCraft.exception.invalid=配置文件无效{0}
bot.autoCraft.exception.item_miss=配方中缺少物品: {0} bot.autoCraft.exception.item_miss=配方中缺少物品{0}
bot.autoCraft.exception.invalid_table=表位置格式无效: {0} bot.autoCraft.exception.invalid_table=tablelocation格式无效{0}
bot.autoCraft.exception.item_name=配方中的物品名称无效 {0} at {1} bot.autoCraft.exception.item_name=配方{0}中在{1}的物品名称无效
bot.autoCraft.exception.name_miss=解析配方时缺少配方名称 bot.autoCraft.exception.name_miss=解析配方时缺少配方名称
bot.autoCraft.exception.slot=配方中的插槽字段无效: {0} bot.autoCraft.exception.slot=配方中的栏位字段无效:{0}
bot.autoCraft.exception.duplicate=指定了重复的配方名称: {0} bot.autoCraft.exception.duplicate=指定了重复的配方名称{0}
bot.autoCraft.debug.no_config=找不到配置,请新建一个. bot.autoCraft.debug.no_config=找不到配置。请新建一个。
# AutoDrop # AutoDrop
bot.autoDrop.cmd=自动删除ChatBot命令 bot.autoDrop.cmd=AutoDrop ChatBot命令
bot.autoDrop.alias=自动删除ChatBot命令别名 bot.autoDrop.alias=AutoDrop ChatBot命令别名
bot.autoDrop.on=已启用自动放置 bot.autoDrop.on=已启用AutoDrop
bot.autoDrop.off=已禁用自动放置 bot.autoDrop.off=已禁用AutoDrop
bot.autoDrop.added=添加的项目 {0} bot.autoDrop.added=已添加物品{0}
bot.autoDrop.incorrect_name=项目名称不正确 {0}. 请再试一次 bot.autoDrop.incorrect_name=物品名称不正确:{0}。请再试一次。
bot.autoDrop.removed=删除的项目 {0} bot.autoDrop.removed=已删除物品{0}
bot.autoDrop.not_in_list=不在列表中的项目 bot.autoDrop.not_in_list=物品不在列表中
bot.autoDrop.no_item=列表中没有项目 bot.autoDrop.no_item=列表中没有物品
bot.autoDrop.list=总计 {0} 在列表中:\n {1} bot.autoDrop.list=列表中总计{0}个物品:\n {1}
bot.autoDrop.switched= 切换到 {0} 模式. bot.autoDrop.switched= 切换到{0}模式。
bot.autoDrop.unknown_mode=未知模式. 可用的模式: Include, Exclude, Everything bot.autoDrop.unknown_mode=未知模式。可用的模式:Include, Exclude, Everything
bot.autoDrop.no_mode=无法从配置中读取删除模式drop mode。使用包含模式include mode bot.autoDrop.no_mode=无法从配置中读取丢弃模式drop mode。使用Include模式。
bot.autoDrop.no_inventory=找不到物品栏{0}! bot.autoDrop.no_inventory=找不到物品栏{0}!
# AutoFish # AutoFish
bot.autoFish.throw=扔钓竿 bot.autoFish.throw=竿
bot.autoFish.caught=钓到鱼了! bot.autoFish.caught=钓到鱼了!
bot.autoFish.no_rod=手上没有鱼竿,可能用坏了? bot.autoFish.no_rod=手上没有鱼竿,可能用坏了?
# AutoRelog # AutoRelog
bot.autoRelog.launch=已启动,尝试了{0}次重新连接 bot.autoRelog.launch=已启动尝试了{0}次重新连接
bot.autoRelog.no_kick_msg=在没有kick消息文件的情况下初始化 bot.autoRelog.no_kick_msg=在没有kick消息文件的情况下初始化
bot.autoRelog.loading=从文件{0}加载消息 bot.autoRelog.loading=从文件{0}加载消息
bot.autoRelog.loaded=已加载消息: {0} bot.autoRelog.loaded=已加载消息{0}
bot.autoRelog.not_found=找不到的文件或目录: {0} bot.autoRelog.not_found=找不到文件或目录:{0}
bot.autoRelog.curr_dir=当前目录为: {0} bot.autoRelog.curr_dir=当前目录为{0}
bot.autoRelog.ignore_user_logout=由用户或MCC bot启动的断开连接. 忽略. bot.autoRelog.ignore_user_logout=由用户或MCC bot启动的断开连接。忽略。
bot.autoRelog.disconnect_msg=断开连接的消息: {0} bot.autoRelog.disconnect_msg=连接断开,收到消息:{0}
bot.autoRelog.reconnect_always=忽略kick消息仍要重新连接. bot.autoRelog.reconnect_always=忽略kick消息仍要重新连接
bot.autoRelog.reconnect=信息包含 '{0}'. 重新连接. bot.autoRelog.reconnect=信息包含 '{0}'。重新连接。
bot.autoRelog.reconnect_ignore=不包含任何已定义关键字的消息,忽略. bot.autoRelog.reconnect_ignore=不包含任何已定义关键字的消息,忽略
bot.autoRelog.wait=在重新连接前等待 {0} 秒... bot.autoRelog.wait=等待{0}秒后重新连接...
# AutoRespond # AutoRespond
bot.autoRespond.loading=正在从'{0}'加载匹配项 bot.autoRespond.loading=正在从'{0}'加载匹配项
bot.autoRespond.file_not_found=找不到文件或目录: '{0}' bot.autoRespond.file_not_found=找不到文件或目录: '{0}'
bot.autoRespond.loaded_match=加载的匹配项:\n{0} bot.autoRespond.loaded_match=加载匹配项:\n{0}
bot.autoRespond.no_trigger=这个配对永远不会触发:\n{0} bot.autoRespond.no_trigger=这个匹配永远不会触发:\n{0}
bot.autoRespond.no_action=不匹配的操作:\n{0} bot.autoRespond.no_action=匹配没有对应操作:\n{0}
bot.autoRespond.match_run=运行动作: {0} bot.autoRespond.match_run=进行操作:{0}
bot.autoRespond.match=配对: {0}\nregex: {1}\naction: {2}\nactionPrivate: {3}\nactionOther: {4}\nownersOnly: {5}\ncooldown: {6} bot.autoRespond.match=match: {0}\nregex: {1}\naction: {2}\nactionPrivate: {3}\nactionOther: {4}\nownersOnly: {5}\ncooldown: {6}
# ChatLog # ChatLog
bot.chatLog.invalid_file=路径'{0}'包含无效字符。 bot.chatLog.invalid_file=路径'{0}'包含无效字符。
# Mailer # Mailer
bot.mailer.init=使用设置初始化邮件程序: bot.mailer.init=使用设置初始化Mailer
bot.mailer.init.db= - 数据库文件: {0} bot.mailer.init.db= - 数据库文件{0}
bot.mailer.init.ignore= - 忽略列表: {0} bot.mailer.init.ignore= - 忽略列表{0}
bot.mailer.init.public= - 开放的互动: {0} bot.mailer.init.public= - 公开交互:{0}
bot.mailer.init.max_mails= - 每位玩家最多邮件数: {0} bot.mailer.init.max_mails= - 每位玩家最多邮件数{0}
bot.mailer.init.db_size= - 最大数据库大小: {0} bot.mailer.init.db_size= - 最大数据库大小{0}
bot.mailer.init.mail_retention= - 邮件保留数: {0} bot.mailer.init.mail_retention= - 邮件保留天数:{0}
bot.mailer.init_fail.db_size=无法启用邮件程序:最大数据库大小必须大于零。请检查设置. bot.mailer.init_fail.db_size=无法启用Mailer最大数据库大小必须大于0。请检查设置。
bot.mailer.init_fail.max_mails=无法启用邮件:每个玩家的最大邮件数必须大于零。请检查设置。 bot.mailer.init_fail.max_mails=无法启用Mailer每个玩家的最大邮件数必须大于0。请检查设置。
bot.mailer.init_fail.mail_retention=无法启用邮件程序:邮件保留必须大于零。请检查设置。 bot.mailer.init_fail.mail_retention=无法启用Mailer邮件保留天数必须大于0。请检查设置。
bot.mailer.create.db=创建新数据库文件: {0} bot.mailer.create.db=创建新数据库文件{0}
bot.mailer.create.ignore=创建新的忽略列表: {0} bot.mailer.create.ignore=创建新忽略列表:{0}
bot.mailer.load.db=正在加载数据库文件: {0} bot.mailer.load.db=加载数据库文件:{0}
bot.mailer.load.ignore=加载忽略列表: bot.mailer.load.ignore=加载忽略列表
bot.mailer.cmd=mailer 命令 bot.mailer.cmd=mailer 命令
bot.mailer.saving=正在保存邮件: {0} bot.mailer.saving=正在保存邮件{0}
bot.mailer.user_ignored={0}已被忽略! bot.mailer.user_ignored={0}已被忽略!
bot.mailer.process_mails=正在查找要发送的邮件 @ {0} bot.mailer.process_mails=正在查找要发送的邮件 @ {0}
bot.mailer.delivered=已发送: {0} bot.mailer.delivered=已发送{0}
bot.mailer.cmd.getmails=--- 数据库中的邮件 ---\n{0} bot.mailer.cmd.getmails=--- 数据库中的邮件 ---\n{0}
bot.mailer.cmd.getignored=--- 忽略列表 ---\n{0} bot.mailer.cmd.getignored=--- 忽略列表 ---\n{0}
bot.mailer.cmd.ignore.added=已补充 {0} 到忽略列表! bot.mailer.cmd.ignore.added=添加{0}到忽略列表!
bot.mailer.cmd.ignore.removed= {0} 已从忽略列表中删除! bot.mailer.cmd.ignore.removed={0}已从忽略列表中删除!
bot.mailer.cmd.ignore.invalid=丢失或无效的名称。用法: {0} <username> bot.mailer.cmd.ignore.invalid=丢失或无效的名称。用法{0}<用户名>
bot.mailer.cmd.help=查看用法 bot.mailer.cmd.help=查看用法
# ReplayCapture # ReplayCapture
bot.replayCapture.cmd=replay 命令 bot.replayCapture.cmd=replay 命令
bot.replayCapture.created=已创建replay文件。 bot.replayCapture.created=已创建重播文件。
bot.replayCapture.stopped=记录已停止. bot.replayCapture.stopped=录制已停止。
bot.replayCapture.restart=记录已停止,请重新启动程序以启动另一个记录 bot.replayCapture.restart=录制已停止。请重新启动程序以进行另一段录制
# Script # Script
bot.script.not_found=§8[MCC] [{0}] 找不到脚本文件: {1} bot.script.not_found=§8[MCC] [{0}] 找不到脚本文件{1}
bot.script.file_not_found=找不到文件: '{0}' bot.script.file_not_found=找不到文件'{0}'
bot.script.fail=脚本 '{0}' 运行失败 ({1}). bot.script.fail=脚本'{0}'运行失败 ({1})。
bot.script.pm.loaded=脚本 '{0}' 加载中. bot.script.pm.loaded=脚本'{0}'加载。
# ScriptScheduler # ScriptScheduler
bot.scriptScheduler.loading=正在从'{0}'加载任务 bot.scriptScheduler.loading=正在从'{0}'加载任务
bot.scriptScheduler.not_found=找不到文件: '{0}' bot.scriptScheduler.not_found=找不到文件'{0}'
bot.scriptScheduler.loaded_task=已加载任务k:\n{0} bot.scriptScheduler.loaded_task=已加载任务\n{0}
bot.scriptScheduler.no_trigger=这个任务永远不会触发:\n{0} bot.scriptScheduler.no_trigger=这个任务永远不会触发\n{0}
bot.scriptScheduler.no_action=无任务操作:\n{0} bot.scriptScheduler.no_action=任务没有对应操作:\n{0}
bot.scriptScheduler.running_time=时间 / 运行的行为: {0} bot.scriptScheduler.running_time=时间 / 运行中的操作:{0}
bot.scriptScheduler.running_inverval=间隔 / 运行的行为: {0} bot.scriptScheduler.running_inverval=间隔 / 运行中的操作:{0}
bot.scriptScheduler.running_login=登录 / 运行的行为: {0} bot.scriptScheduler.running_login=登录 / 运行中的操作:{0}
bot.scriptScheduler.task=首次登录时触发: {0}\n 登录时触发: {1}\n 按时触发: {2}\n 间隔触发: {3}\n 时间间隔: {4}\n 间隔时间: {5}\n 行为: {6} bot.scriptScheduler.task=triggeronfirstlogin: {0}\n triggeronlogin: {1}\n triggerontime: {2}\n triggeroninterval: {3}\n timevalue: {4}\n timeinterval: {5}\n action: {6}
# TestBot # TestBot
bot.testBot.told=Bot: {0} told me : {1} bot.testBot.told=Bot{0}对我说:{1}
bot.testBot.said=Bot: {0} said : {1} bot.testBot.said=Bot{0}说:{1}

View file

@ -93,6 +93,7 @@ namespace MinecraftClient
public static bool DisplayChatLinks = true; public static bool DisplayChatLinks = true;
public static bool DisplayInventoryLayout = true; public static bool DisplayInventoryLayout = true;
public static bool TerrainAndMovements = false; public static bool TerrainAndMovements = false;
public static bool GravityEnabled = true;
public static bool InventoryHandling = false; public static bool InventoryHandling = false;
public static string PrivateMsgsCmdName = "tell"; public static string PrivateMsgsCmdName = "tell";
public static CacheType SessionCaching = CacheType.Disk; public static CacheType SessionCaching = CacheType.Disk;

71
README-vi-vn.md Normal file
View file

@ -0,0 +1,71 @@
Minecraft Console Client
========================
[![GitHub Actions build status](https://github.com/MCCTeam/Minecraft-Console-Client/actions/workflows/build-and-release.yml/badge.svg)](https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest)
Minecraft Console Client (MCC) là một ứng dụng nhẹ cho phép bạn kết nối tới bất kì máy chủ Minecraft nào, gửi lệnh và nhận tin nhắn bằng một cách nhanh và dễ dàng mà không cần phải mở Minecraft. Nó cũng cung cấp nhiều hoạt động tự động mà bạn có thể bật để quản lý và nhiều mục đích khác.
## Tải 🔽
Tải binary ngay tại [đây](https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest).
File exe là .NET binary nên cũng có thể chạy được trên MacOS và Linux
## Hướng dẫn sử dụng 📚
Hãy xem [file cài đặt mẫu](MinecraftClient/config/) có bao gồm hướng dẫn sử dụng [README](https://github.com/MCCTeam/Minecraft-Console-Client/tree/master/MinecraftClient/config#minecraft-console-client-user-manual).
## Hỗ trợ 🙋
Hãy xem [README](https://github.com/MCCTeam/Minecraft-Console-Client/tree/master/MinecraftClient/config#minecraft-console-client-user-manual) và [Thảo luận](https://github.com/MCCTeam/Minecraft-Console-Client/discussions): Có thể câu hỏi của bạn sẽ được trả lời ở đây. Nếu không, hãy mở một [cuộc thảo luận mới](https://github.com/MCCTeam/Minecraft-Console-Client/discussions/new) và hỏi câu hỏi của bạn. Nếu bạn tìm thấy lỗi, hãy báo cáo chúng ở [khu vực vấn đề](https://github.com/MCCTeam/Minecraft-Console-Client/issues).
## Giúp đỡ chúng tôi ❤️
Chúng tôi là một cộng đồng nhỏ nên chúng tôi cần giúp đỡ để cài đặt cập nhật cho những phiên bản mới hơn, sửa lỗi trong ứng dụng và mở rộng kế hoạch. Chúng tôi luôn tìm kiếm những người có động lục để đóng góp. Nếu bạn nghĩ đó có thể là bạn, hãy xem phần [issues](https://github.com/MCCTeam/Minecraft-Console-Client/issues?q=is%3Aissue+is%3Aopen+label%3Awaiting-for%3Acontributor) :)
## Làm thế nào để đóng góp? 📝
Nếu bạn cảm thấy thích đóng góp cho Minecraft Console Client, tuyệt vời, chỉ cần fork repository này và nộp 1 cái pull request trên nhánh *Master*. MCC đang được phân phối bằng những phiên bản development (thường là ổn định) và chúng tôi không còn sử dụng nhánh *Indev*.
## Dịch Minecraft Console Client 🌍
Nếu bạn muốn dịch Minecraft Console Client bằng một ngôn ngữ khác, hãy tải file mẫu này [ở đây](https://github.com/MCCTeam/Minecraft-Console-Client/tree/master/MinecraftClient/Resources/lang) hoặc chỉ cần fork repository này. Khi bạn xong với việc dịch, nộp 1 cái pull request hoặc gửi cho chúng tôi tại [khu vực vấn đề](https://github.com/MCCTeam/Minecraft-Console-Client/issues).
Để sử dụng file dịch, hãy để nó trong thư mục `lang/mcc/` và chỉnh ngôn ngữ của bạn trong file `.ini` config. Bạn có thể tạo thư mục đó nếu không có.
Để xem hướng dẫn đặt tên, hãy xem [bình luận này](https://github.com/MCCTeam/Minecraft-Console-Client/pull/1282#issuecomment-711150715).
## Xây từ gốc 🏗️
_The recommended development environment is [Visual Studio](https://visualstudio.microsoft.com/). If you want to build the project without installing a development environment, you may also follow these instructions:_
First of all, get a [zip of source code](https://github.com/MCCTeam/Minecraft-Console-Client/archive/master.zip), extract it and navigate to the `MinecraftClient` folder.
Edit `MinecraftClient.csproj` to set the Build target to `Release` on [line 4](https://github.com/MCCTeam/Minecraft-Console-Client/blob/master/MinecraftClient/MinecraftClient.csproj#L4):
```xml
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
```
### On Windows 🪟
1. Locate `MSBuild.exe` for .NET 4 inside `C:\Windows\Microsoft.NET\Framework\v4.X.XXXXX`
2. Drag and drop `MinecraftClient.csproj` over `MSBuild.exe` to launch the build
3. If the build succeeds, you can find `MinecraftClient.exe` under `MinecraftClient\bin\Release`
### On Mac and Linux 🐧
1. Install the [Mono Framework](https://www.mono-project.com/download/stable/#download-lin) if not already installed
2. Run `msbuild MinecraftClient.csproj` in a terminal
3. If the build succeeds, you can find `MinecraftClient.exe` under `MinecraftClient\bin\Release`
## License ⚖️
Unless specifically stated, the code is from the MCC Team or Contributors, and available under CDDL-1.0. Else, the license and original author are mentioned in source file headers.
The main terms of the CDDL-1.0 license are basically the following:
- You may use the licensed code in whole or in part in any program you desire, regardless of the license of the program as a whole (or rather, as excluding the code you are borrowing). The program itself may be open or closed source, free or commercial.
- However, in all cases, any modifications, improvements, or additions to the CDDL code (any code that is referenced in direct modifications to the CDDL code is considered an addition to the CDDL code, and so is bound by this requirement; e.g. a modification of a math function to use a fast lookup table makes that table itself an addition to the CDDL code, regardless of whether it's in a source code file of its own) must be made publicly and freely available in source, under the CDDL license itself.
- In any program (source or binary) that uses CDDL code, recognition must be given to the source (either project or author) of the CDDL code. As well, modifications to the CDDL code (which must be distributed as source) may not remove notices indicating the ancestry of the code.
More info at http://qstuff.blogspot.fr/2007/04/why-cddl.html
Full license at http://opensource.org/licenses/CDDL-1.0