Decompiled source of CoastalFishingChinese v1.0.0

DSH.CoastalFishingChinese.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("DSH.CoastalFishingChinese")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DSH.CoastalFishingChinese")]
[assembly: AssemblyTitle("DSH.CoastalFishingChinese")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CFChinese
{
	[BepInPlugin("dsh.coastalfishing.chinese", "Coastal Fishing Chinese", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public const string Guid = "dsh.coastalfishing.chinese";

		internal static ManualLogSource Log;

		private static ConfigEntry<float> _lobsterSmall;

		private static ConfigEntry<float> _lobsterMedium;

		private static ConfigEntry<float> _lobsterLarge;

		private static ConfigEntry<float> _crabSmall;

		private static ConfigEntry<float> _crabMedium;

		private static ConfigEntry<float> _crabLarge;

		private static List<KeyValuePair<string, string>> _ordered;

		private static readonly HashSet<int> Attached = new HashSet<int>();

		private static readonly HashSet<int> Scaled = new HashSet<int>();

		private static List<KeyValuePair<string, string>> Ordered
		{
			get
			{
				if (_ordered == null)
				{
					_ordered = Translations.Text.OrderByDescending((KeyValuePair<string, string> kv) => kv.Key.Length).ToList();
				}
				return _ordered;
			}
		}

		private void Awake()
		{
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Expected O, but got Unknown
			//IL_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Expected O, but got Unknown
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Expected O, but got Unknown
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			//IL_031a: Expected O, but got Unknown
			//IL_0355: Unknown result type (might be due to invalid IL or missing references)
			//IL_0362: Expected O, but got Unknown
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			_lobsterSmall = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "LobsterSmall", 1f, "小龙虾视觉放大倍数(1 = 原样)");
			_lobsterMedium = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "LobsterMedium", 2.5f, "中龙虾视觉放大倍数");
			_lobsterLarge = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "LobsterLarge", 5f, "大龙虾视觉放大倍数(想要金枪鱼那级别就用 5 或更大)");
			_crabSmall = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "CrabSmall", 1f, "小蟹视觉放大倍数");
			_crabMedium = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "CrabMedium", 1.5f, "中蟹视觉放大倍数");
			_crabLarge = ((BaseUnityPlugin)this).Config.Bind<float>("Scale", "CrabLarge", 3f, "大蟹视觉放大倍数");
			Diag("=== CF-CN start, assembly loaded from " + typeof(Plugin).Assembly.Location);
			try
			{
				Harmony val = new Harmony("dsh.coastalfishing.chinese");
				Type type = AccessTools.TypeByName("MarcCoastalFishing.Util");
				if (type == null)
				{
					Log.LogError((object)"[CF-CN] MarcCoastalFishing.Util not found - is Coastal Fishing installed?");
				}
				else
				{
					MethodInfo methodInfo = AccessTools.Method(type, "Localize", new Type[1] { typeof(string) }, (Type[])null);
					if (methodInfo != null)
					{
						val.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin).GetMethod("LocalizePostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					}
					else
					{
						Log.LogWarning((object)"[CF-CN] Util.Localize not found.");
					}
					string[] array = new string[2] { "Center", "TopLeft" };
					foreach (string text in array)
					{
						MethodInfo methodInfo2 = AccessTools.Method(type, text, new Type[1] { typeof(string) }, (Type[])null);
						if (methodInfo2 != null)
						{
							val.Patch((MethodBase)methodInfo2, new HarmonyMethod(typeof(Plugin).GetMethod("MessagePrefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
						}
						else
						{
							Log.LogWarning((object)("[CF-CN] Util." + text + " not found."));
						}
					}
				}
				Type type2 = AccessTools.TypeByName("MarcCoastalFishing.GearBase");
				if (type2 != null)
				{
					MethodInfo methodInfo3 = AccessTools.Method(type2, "GetHoverName", new Type[0], (Type[])null);
					if (methodInfo3 != null)
					{
						val.Patch((MethodBase)methodInfo3, (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin).GetMethod("HoverNamePostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
					}
					else
					{
						Diag("WARN GearBase.GetHoverName not found");
					}
				}
				else
				{
					Diag("WARN MarcCoastalFishing.GearBase not found");
				}
				Type type3 = AccessTools.TypeByName("ItemStand");
				MethodInfo methodInfo4 = ((type3 != null) ? AccessTools.Method(type3, "CanAttach", new Type[1] { typeof(ItemData) }, (Type[])null) : null);
				if (methodInfo4 != null)
				{
					val.Patch((MethodBase)methodInfo4, (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin).GetMethod("AllowAttachPostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
				else
				{
					Diag("WARN ItemStand.CanAttach not found");
				}
				val.Patch((MethodBase)AccessTools.Method(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin).GetMethod("RenamePostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				val.Patch((MethodBase)AccessTools.Method(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Plugin).GetMethod("RenamePostfix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				Log.LogInfo((object)"[CF-CN] Coastal Fishing 汉化补齐已加载。");
				Diag("patched OK");
			}
			catch (Exception ex)
			{
				Log.LogError((object)("[CF-CN] patch failed: " + ex));
			}
		}

		internal static void Diag(string line)
		{
			try
			{
				File.AppendAllText(Path.Combine(Path.GetDirectoryName(typeof(Plugin).Assembly.Location) ?? ".", "CF-CN.log"), DateTime.Now.ToString("HH:mm:ss") + "  " + line + Environment.NewLine);
			}
			catch
			{
			}
		}

		private static void LocalizePostfix(ref string __result)
		{
			try
			{
				__result = Tr(__result);
			}
			catch
			{
			}
		}

		private static void HoverNamePostfix(ref string __result)
		{
			try
			{
				__result = TrName(__result);
			}
			catch
			{
			}
		}

		private static void AllowAttachPostfix(ref bool __result, ItemData item)
		{
			try
			{
				if (!__result && item != null && !((Object)(object)item.m_dropPrefab == (Object)null))
				{
					string name = ((Object)item.m_dropPrefab).name;
					if (!string.IsNullOrEmpty(name) && name.StartsWith("MF_", StringComparison.Ordinal))
					{
						__result = true;
						Diag("itemstand: allowed " + name);
					}
				}
			}
			catch
			{
			}
		}

		private static void MessagePrefix(ref string msg)
		{
			try
			{
				msg = Tr(msg);
			}
			catch
			{
			}
		}

		[HarmonyPriority(50)]
		private static void RenamePostfix()
		{
			try
			{
				int num = 0;
				ObjectDB instance = ObjectDB.instance;
				if ((Object)(object)instance != (Object)null && instance.m_items != null)
				{
					foreach (GameObject item in instance.m_items)
					{
						if ((Object)(object)item == (Object)null)
						{
							continue;
						}
						ItemDrop component = item.GetComponent<ItemDrop>();
						SharedData val = (((Object)(object)component != (Object)null && component.m_itemData != null) ? component.m_itemData.m_shared : null);
						if (val == null)
						{
							continue;
						}
						if (!string.IsNullOrEmpty(val.m_name))
						{
							string text = TrName(val.m_name);
							if (text != val.m_name)
							{
								val.m_name = text;
								num++;
							}
						}
						if (!string.IsNullOrEmpty(val.m_description))
						{
							val.m_description = Tr(val.m_description);
						}
					}
				}
				ZNetScene instance2 = ZNetScene.instance;
				if ((Object)(object)instance2 != (Object)null && instance2.m_prefabs != null)
				{
					foreach (GameObject prefab in instance2.m_prefabs)
					{
						if ((Object)(object)prefab == (Object)null)
						{
							continue;
						}
						CraftingStation component2 = prefab.GetComponent<CraftingStation>();
						if ((Object)(object)component2 != (Object)null && !string.IsNullOrEmpty(component2.m_name))
						{
							string text2 = TrName(component2.m_name);
							if (text2 != component2.m_name)
							{
								component2.m_name = text2;
								num++;
							}
						}
						Piece component3 = prefab.GetComponent<Piece>();
						if ((Object)(object)component3 != (Object)null && !string.IsNullOrEmpty(component3.m_name))
						{
							string text3 = TrName(component3.m_name);
							if (text3 != component3.m_name)
							{
								component3.m_name = text3;
								num++;
							}
							if (!string.IsNullOrEmpty(component3.m_description))
							{
								component3.m_description = Tr(component3.m_description);
							}
						}
					}
				}
				Diag("rename pass: " + num + " display name(s) translated (items=" + (((Object)(object)instance != (Object)null && instance.m_items != null) ? instance.m_items.Count : 0) + ")");
				ApplyScale("MF_Lobster_T1", _lobsterSmall.Value);
				ApplyScale("MF_Lobster_T2", _lobsterMedium.Value);
				ApplyScale("MF_Lobster_T3", _lobsterLarge.Value);
				ApplyScale("MF_Crab_T1", _crabSmall.Value);
				ApplyScale("MF_Crab_T2", _crabMedium.Value);
				ApplyScale("MF_Crab_T3", _crabLarge.Value);
				string[] array = new string[5] { "Lobster", "Crab", "Mackerel", "Haddock", "Pollack" };
				foreach (string text4 in array)
				{
					for (int j = 1; j <= 3; j++)
					{
						AddAttachPoint("MF_" + text4 + "_T" + j);
					}
				}
			}
			catch (Exception ex)
			{
				Diag("rename pass FAILED: " + ex);
				Log.LogWarning((object)("[CF-CN] rename pass failed: " + ex.Message));
			}
		}

		private static void AddAttachPoint(string prefabName)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = FindPrefab(prefabName);
			if ((Object)(object)val == (Object)null || !Attached.Add(((Object)val).GetInstanceID()))
			{
				return;
			}
			Transform transform = val.transform;
			if (!((Object)(object)transform.Find("attach") != (Object)null))
			{
				Transform val2 = transform.Find("visual");
				if ((Object)(object)val2 == (Object)null)
				{
					Diag("attach: no 'visual' child in " + prefabName);
					return;
				}
				Transform transform2 = new GameObject("attach").transform;
				transform2.SetParent(transform, false);
				transform2.localPosition = val2.localPosition;
				transform2.localRotation = val2.localRotation;
				transform2.localScale = Vector3.one;
				val2.SetParent(transform2, true);
				Diag("attach: point added to " + prefabName);
			}
		}

		private static void ApplyScale(string prefabName, float multiplier)
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			if (Mathf.Approximately(multiplier, 1f))
			{
				return;
			}
			GameObject val = FindPrefab(prefabName);
			if ((Object)(object)val == (Object)null)
			{
				Diag("scale: prefab not found " + prefabName);
			}
			else if (Scaled.Add(((Object)val).GetInstanceID()))
			{
				Transform val2 = FindDeep(val.transform, "visual");
				if ((Object)(object)val2 == (Object)null)
				{
					Diag("scale: no 'visual' child in " + prefabName);
					return;
				}
				val2.localScale *= multiplier;
				Diag("scale: " + prefabName + " x" + multiplier + " -> " + ((object)val2.localScale/*cast due to .constrained prefix*/).ToString());
			}
		}

		private static GameObject FindPrefab(string name)
		{
			GameObject val = null;
			ObjectDB instance = ObjectDB.instance;
			if ((Object)(object)instance != (Object)null && instance.m_items != null)
			{
				val = instance.m_items.Find((GameObject g) => (Object)(object)g != (Object)null && ((Object)g).name == name);
			}
			if ((Object)(object)val != (Object)null)
			{
				return val;
			}
			ZNetScene instance2 = ZNetScene.instance;
			if ((Object)(object)instance2 != (Object)null && instance2.m_prefabs != null)
			{
				val = instance2.m_prefabs.Find((GameObject g) => (Object)(object)g != (Object)null && ((Object)g).name == name);
			}
			return val;
		}

		private static Transform FindDeep(Transform root, string name)
		{
			if ((Object)(object)root == (Object)null)
			{
				return null;
			}
			if (((Object)root).name == name)
			{
				return root;
			}
			for (int i = 0; i < root.childCount; i++)
			{
				Transform val = FindDeep(root.GetChild(i), name);
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
			}
			return null;
		}

		internal static string TrName(string s)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			if (Translations.Names.TryGetValue(s, out var value))
			{
				return value;
			}
			string text = s.Trim();
			if (text.Length == 0)
			{
				return s;
			}
			if (text.EndsWith(" fillet", StringComparison.OrdinalIgnoreCase))
			{
				string text2 = FishNoun(text.Substring(0, text.Length - " fillet".Length));
				if (text2 != null)
				{
					return text2 + "片";
				}
			}
			string text3 = null;
			string noun = text;
			string[] array = new string[4] { "Small ", "Medium ", "Large ", "Giant " };
			foreach (string text4 in array)
			{
				if (text.StartsWith(text4, StringComparison.OrdinalIgnoreCase))
				{
					text3 = text4.Trim();
					noun = text.Substring(text4.Length);
					break;
				}
			}
			string text5 = FishNoun(noun);
			if (text5 == null)
			{
				return s;
			}
			string text6 = null;
			switch (text3)
			{
			case "Small":
				text6 = "小";
				break;
			case "Medium":
				text6 = "中";
				break;
			case "Large":
				text6 = "大";
				break;
			case "Giant":
				text6 = "巨型";
				break;
			}
			if (text6 == null)
			{
				return text5;
			}
			return text6 + text5;
		}

		private static string FishNoun(string noun)
		{
			return noun.ToLowerInvariant() switch
			{
				"crab" => "蟹", 
				"lobster" => "龙虾", 
				"mackerel" => "鲭鱼", 
				"haddock" => "黑线鳕", 
				"pollack" => "绿鳕", 
				_ => null, 
			};
		}

		internal static string Tr(string s)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			if (Translations.Text.TryGetValue(s, out var value))
			{
				return value;
			}
			foreach (KeyValuePair<string, string> item in Ordered)
			{
				if (s.IndexOf(item.Key, StringComparison.Ordinal) >= 0)
				{
					s = s.Replace(item.Key, item.Value);
				}
			}
			return s;
		}
	}
	internal static class Translations
	{
		public static readonly Dictionary<string, string> Names = new Dictionary<string, string>
		{
			{ "Boat hook", "船钩" },
			{ "Gill net", "刺网" },
			{ "Lobster pot", "龙虾笼" },
			{ "Fish box", "鱼箱" },
			{ "Preparation table", "清理台" },
			{ "Net buoy", "网浮标" },
			{ "Lobster pot buoy", "笼浮标" },
			{ "Fishing buoy", "钓鱼浮标" },
			{ "Mackerel", "鲭鱼" },
			{ "Haddock", "黑线鳕" },
			{ "Pollack", "绿鳕" },
			{ "Roasted mackerel", "烤鲭鱼" },
			{ "Roasted haddock", "烤黑线鳕" },
			{ "Roasted pollack", "烤绿鳕" },
			{ "Raw crab claws", "生蟹钳" },
			{ "Boiled crab claws", "煮蟹钳" },
			{ "Boiled lobster", "煮龙虾" },
			{ "Lobster", "龙虾" },
			{ "Crab", "蟹" },
			{ "Coastal crab", "海岸蟹" },
			{ "Large coastal crab", "大海岸蟹" },
			{ "Giant coastal crab", "巨型海岸蟹" },
			{ "Coastal crab swarm", "蟹群" },
			{ "Seabed lobster", "海底龙虾" },
			{ "Seabed crab", "海底蟹" }
		};

		public static readonly Dictionary<string, string> Text = new Dictionary<string, string>
		{
			{ "Too big for your pack: you carry it in your arms, and can set it down on your boat, on the ground or in a cart. Bait it, then throw it over the side in deep water.", "太大装不进背包:只能抱在手里,可以放在船上、地上或推车里。先上饵,再到深水里甩过船舷。" },
			{ "Too big for your pack: you carry it in your arms, and can set it down on your boat, on the ground or in a cart. From your boat, throw the first buoy, sail away while the net pays out, then drop the end buoy.", "太大装不进背包:只能抱在手里,可以放在船上、地上或推车里。从船上扔出第一个浮标,开船把网放出去,再扔末端浮标。" },
			{ "Too big for your pack: you carry it in your arms, and can set it down on your boat, on the ground or in a cart.", "太大装不进背包:只能抱在手里,可以放在船上、地上或推车里。" },
			{ "Too big for your pack: you carry it in your arms, and can set it down on your boat, on the ground or in a cart. Keeps your catch on deck.", "太大装不进背包:只能抱在手里,可以放在船上、地上或推车里。用来把渔获留在甲板上。" },
			{ "Equip it to reach and pull in buoys from the boat. With it equipped, Shift+E lays it down on the deck or the ground.", "装备它才能从船上够到并拉起浮标。装备时按 Shift+E 可以把它放在甲板或地上。" },
			{ "Marks gear in the water. Used to make pots and nets.", "标记水里的渔具。也用于制作龙虾笼和刺网。" },
			{ "Gut and clean whole fish into fillets, and crack crabs for their claws.", "把整鱼剖成鱼片,敲开螃蟹取蟹钳。" },
			{ "A live crab. Crack it at a preparation table for its claws.", "一只活蟹。在清理台上敲开取蟹钳。" },
			{ "A live lobster. Boil it in a cauldron.", "一只活龙虾。放进大锅煮。" },
			{ "A whole boiled lobster. A real feast.", "整只煮龙虾。一顿真正的盛宴。" },
			{ "A whole mackerel. Clean it at a preparation table.", "整条鲭鱼。在清理台上清理。" },
			{ "A whole haddock. Clean it at a preparation table.", "整条黑线鳕。在清理台上清理。" },
			{ "A whole pollack. Clean it at a preparation table.", "整条绿鳕。在清理台上清理。" },
			{ "Raw fillet. Cook it on a cooking station.", "生鱼片。在烹饪站烤。" },
			{ "Roasted over an open flame.", "明火烤制。" },
			{ "Oily and rich, straight off the fire.", "油润肥美,刚下火。" },
			{ "Sweet, succulent claw meat.", "鲜甜的蟹钳肉。" },
			{ "Firm white flakes.", "紧实的白色鱼片。" },
			{ "Cook them in a cauldron.", "放进大锅煮。" },
			{ "\n<color=#aaaaaa>Equip a boat hook to haul it in</color>", "\n<color=#aaaaaa>装备船钩才能把它拉上来</color>" },
			{ "\n<color=#aaaaaa>No bait - use bait on it from your hotbar</color>", "\n<color=#aaaaaa>没放饵——把饵放到快捷栏后对着它按数字键</color>" },
			{ "\n<color=#aaaaaa>In use</color>", "\n<color=#aaaaaa>使用中</color>" },
			{ "\n<color=#aaaaaa>Left half-hauled</color>", "\n<color=#aaaaaa>拉到一半</color>" },
			{ "\n<color=#aaaaaa>Left half-way</color>", "\n<color=#aaaaaa>放到一半</color>" },
			{ "\n<color=#aaaaaa>Paying out - sail away from the first buoy</color>", "\n<color=#aaaaaa>正在放网——开离第一个浮标</color>" },
			{ "\n<color=#aaaaaa>Soaking for ", "\n<color=#aaaaaa>已泡 " },
			{ "\n<color=#aaaaaa>Baited (", "\n<color=#aaaaaa>已上饵(" },
			{ "\nCatch: ", "\n渔获: " },
			{ "\nHold ", "\n按住 " },
			{ "Hauling the pot", "正在拉龙虾笼" },
			{ "Hauling the net", "正在拉刺网" },
			{ "Let go", "松手" },
			{ "Pull the net back in", "把网收回" },
			{ "Lay the boat hook on the deck", "把船钩放到甲板" },
			{ "Lay the boat hook down", "把船钩放下" },
			{ "Put it down - on the deck, the ground or in a cart", "放下——甲板、地面或推车里" },
			{ "Face where you look while walking", "行走时面向镜头" },
			{ "Net paid out: ", "网已放出: " },
			{ "Sail away from the first buoy to pay the net out, then press Shift+E to drop the end buoy", "开离第一个浮标把网放出去,然后按 Shift+E 扔下末端浮标" },
			{ "Aim and throw the first buoy", "瞄准并扔出第一个浮标" },
			{ "Aim the buoy at open water", "把浮标瞄准开阔水面" },
			{ "Aim past the side of the boat", "瞄准船舷外侧" },
			{ "Aim at the floor of the boat.", "瞄准船底。" },
			{ "Net set: ", "网已布好: " },
			{ "Come back later with a boat hook.", "稍后带船钩回来收。" },
			{ "Pot away. Come back later with a boat hook to haul it.", "笼子已下水。稍后带船钩回来拉它。" },
			{ "Hook the buoy and haul", "勾住浮标往上拉" },
			{ "Haul it from a boat.", "从船上把它拉上来。" },
			{ "Take catch", "取渔获" },
			{ "Sort catch into fish box", "把渔获分进鱼箱" },
			{ "Pick up", "拾起" },
			{ "Throw overboard", "扔出船外" },
			{ "Let it back down", "放回去" },
			{ "You need a boat hook equipped to reach the buoy.", "需要装备船钩才能够到浮标。" },
			{ "Too far to hook the buoy (", "离浮标太远(" },
			{ "Too far to hook - get within ", "离得太远,靠近到 " },
			{ "You let go - the pot sinks back down.", "你松手了——笼子又沉了回去。" },
			{ "You let go - the net drifts back out.", "你松手了——网又飘了回去。" },
			{ "The pot came up empty. Leave it down longer next time.", "笼子拉上来是空的。下次多泡一会儿。" },
			{ "The net came up empty. Leave it longer next time.", "网上来是空的。下次多放一会儿。" },
			{ "The net was left half-way; it's been reset.", "网上次放到一半,已重置。" },
			{ "The pot was left half-hauled; it's back on the seabed.", "笼子拉到一半就放下了,已回到海底。" },
			{ "Too tired - catch your breath", "太累了——先缓口气" },
			{ "Something's in the way there", "那里有东西挡着" },
			{ "There's something in the way.", "有东西挡着。" },
			{ "Not in the water.", "不在水里。" },
			{ "Too shallow there (", "那里太浅(" },
			{ "Too strong", "太猛了" },
			{ "Too close to shore - sail further out", "离岸太近——再往外开" },
			{ "Slow the boat down first.", "先把船速降下来。" },
			{ "Face the water to throw it over the side.", "面向水面才能甩出船舷。" },
			{ "Put the pot on your boat and stand on the boat to throw it.", "把笼子放到船上,站在船上才能扔。" },
			{ "Put the net on your boat and stand on the boat to set it.", "把网放到船上,站在船上才能布网。" },
			{ "Bait the pot first: use raw fish, entrails or meat on it from your hotbar.", "先给笼子上饵:把生鱼、内脏或肉放到快捷栏,对着笼子按数字键。" },
			{ "That's no good as bait. Try raw fish, entrails or meat.", "这个不能当饵。用生鱼、内脏或肉。" },
			{ "The pot is already baited.", "笼子已经上过饵了。" },
			{ "Baited the pot (", "已给龙虾笼上饵(" },
			{ "Catch sorted into the fish box.", "渔获已装进鱼箱。" },
			{ "Inventory full - dropped at your feet.", "背包满了——掉在你脚边。" },
			{ "No room in your inventory.", "背包没空间。" },
			{ "No room for the fillets.", "装不下鱼片。" },
			{ "Bring whole fish or crabs to clean.", "带整鱼或螃蟹来清理。" },
			{ "You can only clean whole fish and crabs here.", "这里只能清理整鱼和螃蟹。" },
			{ "Clean a fish (hold to keep going)", "清理一条鱼(按住继续)" },
			{ "Clean a specific fish from your hotbar", "清理快捷栏里指定的鱼" },
			{ "The fish box is full.", "鱼箱满了。" },
			{ "Empty the fish box first.", "先把鱼箱清空。" },
			{ "The fish box isn't ready.", "鱼箱还没准备好。" },
			{ "Someone has the fish box open.", "有人正在打开这个鱼箱。" },
			{ "You're busy.", "你正忙着。" },
			{ "Put down what you're carrying first.", "先把手里的东西放下。" },
			{ "Put the fish box down first.", "先把鱼箱放下。" },
			{ "The cart is full.", "推车满了。" },
			{ "Someone is using that cart.", "有人正在用那辆推车。" },
			{ "Someone is using the ", "有人正在使用" },
			{ "Too far - move closer to where you want to put it.", "太远了——靠近要放的位置。" },
			{ "That's too steep.", "那里太陡了。" },
			{ "Couldn't put the boat hook down.", "没法把船钩放下。" },
			{ "Laid the boat hook down.", "船钩已放下。" },
			{ "Laid the boat hook on the deck.", "船钩已放在甲板上。" },
			{ "Picked up the boat hook.", "拿起了船钩。" },
			{ "You pulled the net back aboard.", "你把网收回了船上。" },
			{ "You put the buoy back.", "你收回了浮标。" },
			{ "You left the boat - the net was pulled back aboard.", "你离开了船——网已收回船上。" },
			{ "You can only carry one at a time - the ", "一次只能搬一件——那" },
			{ "You can't carry that right now.", "现在不能搬那个。" },
			{ "Look at the deck or the ground where you want to put it.", "看着要放下位置的甲板或地面。" },
			{ "Carrying the ", "正在搬运" },
			{ "Coastal crab", "海岸蟹" },
			{ "Large coastal crab", "大海岸蟹" },
			{ "Giant coastal crab", "巨型海岸蟹" },
			{ "Coastal crab swarm", "蟹群" },
			{ "Lobster pot", "龙虾笼" },
			{ "Gill net", "刺网" },
			{ "Boat hook", "船钩" },
			{ "Fish box", "鱼箱" },
			{ "Carry", "搬起" },
			{ "Open", "打开" },
			{ "No bait - use bait on it from your hotbar", "没放饵——把饵放到快捷栏后对着它按数字键" },
			{ "Equip a boat hook to haul it in", "装备船钩才能把它拉上来" },
			{ "Carried by ", "由" },
			{ "In use", "使用中" },
			{ "Left half-hauled", "拉到一半" },
			{ "Left half-way", "放到一半" },
			{ "Paying out - sail away from the first buoy", "正在放网——开离第一个浮标" },
			{ "Catch: ", "渔获: " },
			{ "Baited (", "已上饵(" },
			{ "Soaking for ", "已泡 " },
			{ " min</color>", " 分钟</color>" },
			{ " m of it.", " 米以内。" }
		};
	}
}