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

@ -983,13 +983,26 @@ namespace MinecraftClient
/// </summary>
/// <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="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>
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>
/// Look at the specified location
/// </summary>

View file

@ -8,7 +8,7 @@ namespace MinecraftClient.Commands
public class Move : Command
{
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 Run(McClient handler, string command, Dictionary<string, object> localVars)
@ -35,6 +35,14 @@ namespace MinecraftClient.Commands
handler.SetTerrainEnabled(false);
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())
{
if (args.Count == 1)

View file

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

View file

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

View file

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

View file

@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MinecraftClient.Mapping
{
@ -21,21 +22,24 @@ namespace MinecraftClient.Mapping
/// <returns>Updated location after applying gravity</returns>
public static Location HandleGravity(World world, Location location, ref double motionY)
{
Location onFoots = new Location(location.X, Math.Floor(location.Y), location.Z);
Location belowFoots = Move(location, Direction.Down);
if (location.Y > Math.Truncate(location.Y) + 0.0001)
if (Settings.GravityEnabled)
{
belowFoots = location;
belowFoots.Y = Math.Truncate(location.Y);
Location onFoots = new Location(location.X, Math.Floor(location.Y), location.Z);
Location belowFoots = Move(location, Direction.Down);
if (location.Y > Math.Truncate(location.Y) + 0.0001)
{
belowFoots = location;
belowFoots.Y = Math.Truncate(location.Y);
}
if (!IsOnGround(world, location) && !IsSwimming(world, location))
{
while (!IsOnGround(world, belowFoots) && belowFoots.Y >= 1)
belowFoots = Move(belowFoots, Direction.Down);
location = Move2Steps(location, belowFoots, ref motionY, true).Dequeue();
}
else if (!(world.GetBlock(onFoots).Type.IsSolid()))
location = Move2Steps(location, onFoots, ref motionY, true).Dequeue();
}
if (!IsOnGround(world, location) && !IsSwimming(world, location))
{
while (!IsOnGround(world, belowFoots) && belowFoots.Y >= 1)
belowFoots = Move(belowFoots, Direction.Down);
location = Move2Steps(location, belowFoots, ref motionY, true).Dequeue();
}
else if (!(world.GetBlock(onFoots).Type.IsSolid()))
location = Move2Steps(location, onFoots, ref motionY, true).Dequeue();
return location;
}
@ -126,62 +130,126 @@ namespace MinecraftClient.Mapping
/// <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="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>
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;
AutoTimeout.Perform(() =>
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)
{
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
Dictionary<Location, Location> Came_From = new Dictionary<Location, Location>(); // The map of navigated nodes.
cts.Cancel();
pathfindingTask.Wait();
}
return pathfindingTask.Result;
}
Dictionary<Location, int> g_score = new Dictionary<Location, int>(); //:= map with default value of Infinity
g_score[start] = 0; // Cost from start along best known path.
// Estimated total cost from start to goal through y.
Dictionary<Location, int> f_score = new Dictionary<Location, int>(); //:= map with default value of Infinity
f_score[start] = (int)start.DistanceSquared(goal); //heuristic_cost_estimate(start, goal)
/// <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)
{
while (OpenSet.Count > 0)
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> 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, int> g_score = new Dictionary<Location, int>(); //:= map with default value of Infinity
g_score[start] = 0; // Cost from start along best known path.
// Estimated total cost from start to goal through y.
Dictionary<Location, int> f_score = new Dictionary<Location, int>(); //:= map with default value of Infinity
f_score[start] = (int)start.DistanceSquared(goal); //heuristic_cost_estimate(start, goal)
while (OpenSet.Count > 0)
{
current = //the node in OpenSet having the lowest f_score[] value
OpenSet.Select(location => f_score.ContainsKey(location)
? new KeyValuePair<Location, int>(location, f_score[location])
: new KeyValuePair<Location, int>(location, int.MaxValue))
.OrderBy(pair => pair.Value).
// Sort for h-score (f-score - g-score) to get smallest distance to goal if f-scores are equal
ThenBy(pair => f_score[pair.Key]-g_score[pair.Key]).First().Key;
// Only assert a value if it is of actual use later
if (maxOffset > 0 && ClosedSet.Count > 0)
// Get the block that currently is closest to the goal
closestGoal = ClosedSet.OrderBy(checkedLocation => checkedLocation.DistanceSquared(goal)).First();
// Stop when goal is reached or we are close enough
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);
ClosedSet.Add(current);
foreach (Location neighbor in GetAvailableMoves(world, current, allowUnsafe))
{
Location current = //the node in OpenSet having the lowest f_score[] value
OpenSet.Select(location => f_score.ContainsKey(location)
? new KeyValuePair<Location, int>(location, f_score[location])
: new KeyValuePair<Location, int>(location, int.MaxValue))
.OrderBy(pair => pair.Value).First().Key;
if (current == goal)
{ //reconstruct_path(Came_From, goal)
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();
result = new Queue<Location>(total_path);
}
OpenSet.Remove(current);
ClosedSet.Add(current);
foreach (Location neighbor in GetAvailableMoves(world, current, allowUnsafe))
{
if (ClosedSet.Contains(neighbor))
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.
if (!OpenSet.Contains(neighbor)) // Discover a new node
OpenSet.Add(neighbor);
else if (tentative_g_score >= g_score[neighbor])
continue; // This is not a better path.
if (ct.IsCancellationRequested)
break; // Stop searching for blocks if we are cancelled.
if (ClosedSet.Contains(neighbor))
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.
if (!OpenSet.Contains(neighbor)) // Discover a new node
OpenSet.Add(neighbor);
else if (tentative_g_score >= g_score[neighbor])
continue; // This is not a better path.
// This path is the best until now. Record it!
Came_From[neighbor] = current;
g_score[neighbor] = tentative_g_score;
f_score[neighbor] = g_score[neighbor] + (int)neighbor.DistanceSquared(goal); //heuristic_cost_estimate(neighbor, goal)
}
// This path is the best until now. Record it!
Came_From[neighbor] = current;
g_score[neighbor] = tentative_g_score;
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 ========= */

View file

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MinecraftClient.Mapping
{
@ -15,6 +16,11 @@ namespace MinecraftClient.Mapping
/// </summary>
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>
/// Read, set or unload the specified chunk column
/// </summary>
@ -25,34 +31,50 @@ namespace MinecraftClient.Mapping
{
get
{
//Read a chunk
if (chunks.ContainsKey(chunkX))
if (chunks[chunkX].ContainsKey(chunkZ))
return chunks[chunkX][chunkZ];
return null;
chunksLock.EnterReadLock();
try
{
//Read a chunk
if (chunks.ContainsKey(chunkX))
if (chunks[chunkX].ContainsKey(chunkZ))
return chunks[chunkX][chunkZ];
return null;
}
finally
{
chunksLock.ExitReadLock();
}
}
set
{
if (value != null)
chunksLock.EnterWriteLock();
try
{
//Update a chunk column
if (!chunks.ContainsKey(chunkX))
chunks[chunkX] = new Dictionary<int, ChunkColumn>();
chunks[chunkX][chunkZ] = value;
}
else
{
//Unload a chunk column
if (chunks.ContainsKey(chunkX))
if (value != null)
{
if (chunks[chunkX].ContainsKey(chunkZ))
//Update a chunk column
if (!chunks.ContainsKey(chunkX))
chunks[chunkX] = new Dictionary<int, ChunkColumn>();
chunks[chunkX][chunkZ] = value;
}
else
{
//Unload a chunk column
if (chunks.ContainsKey(chunkX))
{
chunks[chunkX].Remove(chunkZ);
if (chunks[chunkX].Count == 0)
chunks.Remove(chunkX);
if (chunks[chunkX].ContainsKey(chunkZ))
{
chunks[chunkX].Remove(chunkZ);
if (chunks[chunkX].Count == 0)
chunks.Remove(chunkX);
}
}
}
}
finally
{
chunksLock.ExitWriteLock();
}
}
}
@ -117,7 +139,7 @@ namespace MinecraftClient.Mapping
{
Location doneloc = new Location(x, y, z);
Block doneblock = GetBlock(doneloc);
Material blockType = GetBlock(doneloc).Type;
Material blockType = doneblock.Type;
if (blockType == block)
{
list.Add(doneloc);
@ -150,7 +172,15 @@ namespace MinecraftClient.Mapping
/// </summary>
public void Clear()
{
chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>();
chunksLock.EnterWriteLock();
try
{
chunks = new Dictionary<int, Dictionary<int, ChunkColumn>>();
}
finally
{
chunksLock.ExitWriteLock();
}
}
/// <summary>

View file

@ -1061,8 +1061,12 @@ namespace MinecraftClient
/// <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="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>
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)
{
@ -1078,7 +1082,7 @@ namespace MinecraftClient
// 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))
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;
}
}
@ -1847,6 +1851,15 @@ namespace MinecraftClient
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>
/// Called when the server sends a new player 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 MCLowestVersion = "1.4.6";
public const string MCHighestVersion = "1.18.1";
public const string MCHighestVersion = "1.18.2";
public static readonly string BuildInfo = null;
private static Thread offlinePrompt = null;

View file

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

View file

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

View file

@ -127,7 +127,7 @@ namespace MinecraftClient.Protocol
int[] supportedVersions_Protocol16 = { 51, 60, 61, 72, 73, 74, 78 };
if (Array.IndexOf(supportedVersions_Protocol16, ProtocolVersion) > -1)
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)
return new Protocol18Handler(Client, ProtocolVersion, Handler, forgeInfo);
throw new NotSupportedException(Translations.Get("exception.version_unsupport", ProtocolVersion));
@ -253,6 +253,8 @@ namespace MinecraftClient.Protocol
case "1.18":
case "1.18.1":
return 757;
case "1.18.2":
return 758;
default:
return 0;
}
@ -317,6 +319,7 @@ namespace MinecraftClient.Protocol
case 755: return "1.17";
case 756: return "1.17.1";
case 757: return "1.18.1";
case 758: return "1.18.2";
default: return "0.0";
}
}

View file

@ -13,7 +13,7 @@
login=
password=
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
# 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.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.gravity.enabled=Gravitation ist aktiv.
cmd.move.gravity.disabled=Gravitation ist deaktiviert.
# Reco
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.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.gravity.enabled=Gravity is enabled.
cmd.move.gravity.disabled=Gravity is disabled.
# Reco
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.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.gravity.enabled=La gravité est activée.
cmd.move.gravity.disabled=La gravité est désactivée.
# Reco
cmd.reco.desc=Relancer le programme et se reconnecter au serveur

View file

@ -2,14 +2,14 @@
# Messages from MCC itself
mcc.login=Логин :
mcc.login_basic_io=Пожалуйста, введите имя пользователя или email по вашему выбору.
mcc.password=Пароль :
mcc.password=Пароль:
mcc.password_basic_io=Пожалуйста, введите пароль для {0}.
mcc.password_hidden=Пароль : {0}
mcc.password_hidden=Пароль: {0}
mcc.offline=§8Вы выбрали запуск в автономном режиме.
mcc.session_invalid=§8Кэшированная сессия недействительна или истекла.
mcc.session_valid=§8Кэшированная сессия все еще действительна для {0}.
mcc.connecting=Подключение к {0}...
mcc.ip=IP сервера :
mcc.ip=IP сервера:
mcc.use_version=§8Используется Minecraft версии {0} (протокол v{1})
mcc.unknown_version=§8Неизвестная или не поддерживаемая версия MC {0}.\nПереключение в режим автоопределения.
mcc.forge=Проверка, запущен ли на сервере Forge...
@ -20,7 +20,7 @@ mcc.not_found=§8Failed to perform SRV lookup for {0}\n{1}: {2}
mcc.retrieve=Получение информации о сервере...
mcc.restart=Перезапуск консольного клиента Minecraft...
mcc.restart_delay=Ожидание {0} секунд перед перезапуском...
mcc.server_version=Версия сервера :
mcc.server_version=Версия сервера:
mcc.disconnected=Не подключен ни к одному серверу. Используйте '{0}help' для получения справки.
mcc.press_exit=Нажмите Enter, чтобы выйти из консольного клиента Minecraft.
mcc.version_supported=Версия поддерживается.\nВойти в игру...
@ -28,15 +28,15 @@ mcc.single_cmd=§7Команда §8 {0} §7 отправлена.
mcc.joined=Сервер был успешно подключен.\nType '{0}quit' для выхода из сервера.
mcc.reconnect=Ожидание 5 секунд (осталось {0} попыток)...
mcc.disconnect.lost=Соединение было потеряно.
mcc.disconnect.server=Отключен сервером :
mcc.disconnect.login=Войти не удалось :
mcc.disconnect.server=Отключен сервером:
mcc.disconnect.login=Войти не удалось:
mcc.link=Ссылка: {0}
mcc.player_dead_respawn=Вы мертвы. Автоматически возрождаетесь через 1 секунду.
mcc.player_dead=Вы мертвы. Введите /respawn, чтобы возродиться.
mcc.server_offline=§8Сервер находится в автономном режиме.
mcc.session=Проверка сессии...
mcc.session_fail=Не удалось проверить сессию.
mcc.server_protocol=§8Версия сервера : {0} (протокол v{1})
mcc.server_protocol=§8Версия сервера: {0} (протокол v{1})
mcc.with_forge=, с Forge
mcc.handshake=§8Handshake successful. (ID сервера: {0})
mcc.realms_available=У вас есть доступ к следующим мирам Realms
@ -498,4 +498,4 @@ bot.scriptScheduler.task=triggeronfirstlogin: {0}\n triggeronlogin: {1}\n trigge
# TestBot
bot.testBot.told=Bot: {0} сказал мне : {1}
bot.testBot.said=Бот: {0} сказал : {1}
bot.testBot.said=Бот: {0} сказал: {1}

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

View file

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