mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-11-07 17:36:07 +00:00
Merge branch 'MCCTeam:master' into master
This commit is contained in:
commit
3ea109b330
22 changed files with 1154 additions and 384 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ========= */
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
501
MinecraftClient/Resources/lang/vi.ini
Normal file
501
MinecraftClient/Resources/lang/vi.ini
Normal 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}
|
||||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue