301 lines
13 KiB
C#
301 lines
13 KiB
C#
|
using System;
|
|||
|
using Games.GlobeDefine;
|
|||
|
using Module.Log;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace GCGame.Table
|
|||
|
{
|
|||
|
public class StrDictionary
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 替换字符串里面的$R,$G,$N等特殊字符,注意是字符串,多为剧情表格、任务等定制
|
|||
|
/// 例子:
|
|||
|
/// string clientStr = "各种中文字符等"; //这里通常是读剧情表格,里面是直接配置的中文
|
|||
|
/// string dicStr = StrDictionary.GetClientString_WithNameSex(clientStr);
|
|||
|
/// </summary>
|
|||
|
/// <param name="ClientStr"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static string GetClientString_WithNameSex(string ClientStr)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(ClientStr)) return "";
|
|||
|
|
|||
|
var goodNameID = GlobeVar.INVALID_ID;
|
|||
|
var badNameID = GlobeVar.INVALID_ID;
|
|||
|
if (LoginData.m_sbIsMale)
|
|||
|
{
|
|||
|
goodNameID = 1387;
|
|||
|
badNameID = 1389;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
goodNameID = 1388;
|
|||
|
badNameID = 1390;
|
|||
|
}
|
|||
|
|
|||
|
var goodName = "";
|
|||
|
var pGoodNameDictionary = TableManager.GetStrDictionaryByID(goodNameID, 0);
|
|||
|
if (pGoodNameDictionary != null)
|
|||
|
goodName = pGoodNameDictionary.StrDictionary;
|
|||
|
else
|
|||
|
goodName = "";
|
|||
|
|
|||
|
var badName = "";
|
|||
|
var pbadNameDictionary = TableManager.GetStrDictionaryByID(badNameID, 0);
|
|||
|
if (pbadNameDictionary != null)
|
|||
|
badName = pbadNameDictionary.StrDictionary;
|
|||
|
else
|
|||
|
badName = "";
|
|||
|
|
|||
|
var strFullDic = ClientStr.Replace("$R", goodName);
|
|||
|
strFullDic = strFullDic.Replace("$G", badName);
|
|||
|
strFullDic = strFullDic.Replace("$N", LoginData.m_sRoleName);
|
|||
|
strFullDic = strFullDic.Replace("#r", "\n"); //支持换行符
|
|||
|
|
|||
|
return strFullDic;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 解析$R,$G,$N等特殊字符的字典解析函数,除非确定要用,否则使用GetClientDictionaryString函数
|
|||
|
/// 例子:
|
|||
|
/// string dicStr = StrDictionary.GetClientDictionaryString_WithNameSex("#{2344}", element1, element2, element3 ... );
|
|||
|
/// //其中element1等是字符串或者整数
|
|||
|
/// </summary>
|
|||
|
/// <param name="ClientDictionaryStr">
|
|||
|
/// ClientDictionaryStr为客户端字典号,例如#{5676}
|
|||
|
/// </param>
|
|||
|
/// <param name="args"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static string GetClientDictionaryString_WithNameSex(string ClientDictionaryStr, params object[] args)
|
|||
|
{
|
|||
|
var strFullDic = GetClientDictionaryString(ClientDictionaryStr, args);
|
|||
|
return GetClientString_WithNameSex(strFullDic);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 返回翻译完的字典内容,只能用于客户端本地字典的解析
|
|||
|
/// 使用例子:
|
|||
|
/// string dicStr = StrDictionary.GetClientDictionaryString("#{2344}", element1, element2, element3 ... );
|
|||
|
/// //其中element1等是字符串或者整数
|
|||
|
/// 或者
|
|||
|
/// string dicStr2 = StrDictionary.GetClientDictionaryString("#{2344}"); //直接在客户端写字典号
|
|||
|
/// </summary>
|
|||
|
/// <param name="ClientDictionaryStr"></param>
|
|||
|
/// ClientDictionaryStr为客户端字典号,例如#{5676}
|
|||
|
/// <param name="args">
|
|||
|
/// 变参内容,要依据字典中填写的{x}来确定有多少个内容,如果不对应,会报错(解析出的也是乱的);
|
|||
|
/// </param>
|
|||
|
/// <returns>返回翻译完的字典内容,可以直接显示</returns>
|
|||
|
public static string GetClientDictionaryString(string ClientDictionaryStr, params object[] args)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(ClientDictionaryStr)) return "EmptyString -- ClientDictionary ERROR0";
|
|||
|
|
|||
|
if (ClientDictionaryStr.Length < 3) return ClientDictionaryStr + " -- ClientDictionary ERROR1 Length < 3";
|
|||
|
var dicIdStr = ClientDictionaryStr.Substring(2, ClientDictionaryStr.Length - 3);
|
|||
|
var dicID = int.Parse(dicIdStr);
|
|||
|
|
|||
|
var pDictionary = TableManager.GetStrDictionaryByID(dicID, 0);
|
|||
|
if (pDictionary != null)
|
|||
|
{
|
|||
|
string full;
|
|||
|
if (args.Length > 0)
|
|||
|
{
|
|||
|
full = GetActDictionaryString(pDictionary.StrDictionary, args);
|
|||
|
if (string.IsNullOrEmpty(full))
|
|||
|
full = pDictionary.StrDictionary;
|
|||
|
full = string.Format(full, args);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
full = pDictionary.StrDictionary;
|
|||
|
}
|
|||
|
|
|||
|
return full.Replace("#r", "\n"); //支持换行符
|
|||
|
}
|
|||
|
|
|||
|
return ClientDictionaryStr + " -- ClientDictionary ERROR2";
|
|||
|
}
|
|||
|
|
|||
|
// 增加一种活动的类型字符串的解析
|
|||
|
// 服务器可能会发送多个活动消息到一条信息中
|
|||
|
// 所以增加循环解析
|
|||
|
public static string GetActDictionaryString(string pDictionaryStr, params object[] args)
|
|||
|
{
|
|||
|
// 安全计数
|
|||
|
var saveCount = 0;
|
|||
|
var maxCount = pDictionaryStr.Length;
|
|||
|
|
|||
|
while (pDictionaryStr.Contains("[act,"))
|
|||
|
{
|
|||
|
++saveCount;
|
|||
|
if (saveCount > maxCount)
|
|||
|
{
|
|||
|
LogModule.ErrorLog(pDictionaryStr + "-- ClientDictionary ERROR, Endless looping");
|
|||
|
return "";
|
|||
|
}
|
|||
|
|
|||
|
var index = pDictionaryStr.IndexOf("[act,");
|
|||
|
var i = index + 5;
|
|||
|
var len = 0;
|
|||
|
for (; i < pDictionaryStr.Length; i++)
|
|||
|
if (pDictionaryStr[i] != ']')
|
|||
|
len++;
|
|||
|
else
|
|||
|
break;
|
|||
|
|
|||
|
var act = pDictionaryStr.Substring(index + 5, len);
|
|||
|
var actIdIndex = -1;
|
|||
|
var actId = -1;
|
|||
|
if (int.TryParse(act, out actIdIndex))
|
|||
|
if (args.Length > actIdIndex)
|
|||
|
if (int.TryParse((string) args[actIdIndex], out actId))
|
|||
|
{
|
|||
|
var activityBaseDic = TableManager.GetActivityBase().Values;
|
|||
|
|
|||
|
foreach (var d in activityBaseDic)
|
|||
|
if (d.ActivityServerType == actId)
|
|||
|
{
|
|||
|
args[actIdIndex] = d.ActivityName;
|
|||
|
var replace = string.Format("[act,{0}]", actIdIndex);
|
|||
|
pDictionaryStr = pDictionaryStr.Replace(replace,
|
|||
|
string.Format("{0}{1}{2}", "{", actIdIndex, "}"));
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
pDictionaryStr = string.Format(pDictionaryStr, args);
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
Debug.LogError(e);
|
|||
|
}
|
|||
|
|
|||
|
return pDictionaryStr.Replace("#r", "\n"); //支持换行符
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 解析由服务器函数DictionaryFormat::FormatDictionary()返回的包含字典的字符串。
|
|||
|
/// 返回翻译完的字典内容,只能用于从服务器发过来字典的解析
|
|||
|
/// 使用例子:
|
|||
|
/// string serverSendedStr = "#{12345}*hello*newWorld";
|
|||
|
/// //Server发过来的字符串,由Server端的DictionaryFormat::FormatDictionary()生成的。
|
|||
|
/// 或者
|
|||
|
/// string serverSendedStr2 = "#{12345}"; //Server发过来的字符串,就是一个字典号
|
|||
|
/// string dicStr = StrDictionary.GetServerDictionaryFormatString(serverSendedStr);
|
|||
|
/// string dicStr2 = StrDictionary.GetServerDictionaryFormatString(serverSendedStr2);
|
|||
|
/// </summary>
|
|||
|
/// <param name="ServerSendedDictionaryStr">
|
|||
|
/// ServerSendedDictionaryStr为服务器发过来的包含字典号的字符串
|
|||
|
/// 格式举例如下:
|
|||
|
/// #{12345}*hello*newWorld
|
|||
|
/// 其中字典#{12345}的内容为:{0}{1}
|
|||
|
/// 上面的两个变量字符串分别为hello,newWorld
|
|||
|
/// 解析完整个字典串返回值为:hello newWorld
|
|||
|
/// </param>
|
|||
|
/// <returns>返回翻译完的字典内容,可以直接显示</returns>
|
|||
|
public static string GetServerDictionaryFormatString(string ServerSendedDictionaryStr) //#{12345}*hello*newWorld
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(ServerSendedDictionaryStr)) return "EmptyString -- ServerDictionaryFormat ERROR0";
|
|||
|
|
|||
|
var firstChar = ServerSendedDictionaryStr[0];
|
|||
|
if (firstChar != '#')
|
|||
|
return ServerSendedDictionaryStr + " -- ServerDictionaryFormat ERROR1 FirstChar is not #";
|
|||
|
|
|||
|
var dicEndPos = ServerSendedDictionaryStr.IndexOf('*');
|
|||
|
if (dicEndPos > 0) //#{12345}*hello*newWorld 这种格式
|
|||
|
{
|
|||
|
var dictionaryStr = ServerSendedDictionaryStr.Substring(0, dicEndPos);
|
|||
|
var elementStr =
|
|||
|
ServerSendedDictionaryStr.Substring(dicEndPos + 1,
|
|||
|
ServerSendedDictionaryStr.Length - dicEndPos - 1);
|
|||
|
|
|||
|
var allElements = elementStr.Split('*');
|
|||
|
|
|||
|
return GetClientDictionaryString(dictionaryStr, allElements);
|
|||
|
}
|
|||
|
|
|||
|
if (ServerSendedDictionaryStr.Length < 3)
|
|||
|
return ServerSendedDictionaryStr + " -- ServerDictionaryFormat ERROR2 Length < 3";
|
|||
|
var dicIdStr = ServerSendedDictionaryStr.Substring(2, ServerSendedDictionaryStr.Length - 3);
|
|||
|
var dicID = -1;
|
|||
|
int.TryParse(dicIdStr, out dicID);
|
|||
|
var pDictionary = TableManager.GetStrDictionaryByID(dicID, 0);
|
|||
|
if (pDictionary != null)
|
|||
|
return pDictionary.StrDictionary.Replace("#r", "\n");
|
|||
|
//return pDictionary.StrDictionary;
|
|||
|
|
|||
|
return ServerSendedDictionaryStr + " -- ServerDictionaryFormat ERROR3";
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 检测由服务器函数DictionaryFormat::FormatDictionary()字典是否可以在客户端解析,返回true或false。
|
|||
|
/// </summary>
|
|||
|
/// <param name="IsServerSendedDictionaryStr">
|
|||
|
/// </param>
|
|||
|
/// <returns>返回true或false</returns>
|
|||
|
public static bool IsServerDictionaryFormatString(string ServerSendedDictionaryStr) //#{12345}*hello*newWorld
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(ServerSendedDictionaryStr)) return false;
|
|||
|
var firstChar = ServerSendedDictionaryStr[0];
|
|||
|
if (firstChar != '#') return false;
|
|||
|
var dicEndPos = ServerSendedDictionaryStr.IndexOf('*');
|
|||
|
if (dicEndPos > 0) //#{12345}*hello*newWorld 这种格式
|
|||
|
{
|
|||
|
var dictionaryStr = ServerSendedDictionaryStr.Substring(0, dicEndPos);
|
|||
|
var elementStr =
|
|||
|
ServerSendedDictionaryStr.Substring(dicEndPos + 1,
|
|||
|
ServerSendedDictionaryStr.Length - dicEndPos - 1);
|
|||
|
|
|||
|
var allElements = elementStr.Split('*');
|
|||
|
|
|||
|
return IsClientDictionaryString(dictionaryStr, allElements);
|
|||
|
}
|
|||
|
|
|||
|
if (ServerSendedDictionaryStr.Length < 3) return false;
|
|||
|
var dicIdStr = ServerSendedDictionaryStr.Substring(2, ServerSendedDictionaryStr.Length - 3);
|
|||
|
var dicID = int.Parse(dicIdStr);
|
|||
|
var pDictionary = TableManager.GetStrDictionaryByID(dicID, 0);
|
|||
|
if (pDictionary != null) return true;
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/// ///
|
|||
|
/// <summary>
|
|||
|
/// 检测客户端本地字典的解析,返回true或false。
|
|||
|
/// </summary>
|
|||
|
/// <param name="IsClientDictionaryStr">
|
|||
|
/// </param>
|
|||
|
/// <returns>返回true或false</returns>
|
|||
|
public static bool IsClientDictionaryString(string ClientDictionaryStr, params object[] args)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(ClientDictionaryStr)) return false;
|
|||
|
|
|||
|
if (ClientDictionaryStr.Length < 3) return false;
|
|||
|
var dicIdStr = ClientDictionaryStr.Substring(2, ClientDictionaryStr.Length - 3);
|
|||
|
var dicID = int.Parse(dicIdStr);
|
|||
|
var pDictionary = TableManager.GetStrDictionaryByID(dicID, 0);
|
|||
|
if (pDictionary != null) return true; //支持换行符
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public static string GetClientStrMoneyType(MONEYTYPE moneyType)
|
|||
|
{
|
|||
|
switch (moneyType)
|
|||
|
{
|
|||
|
case MONEYTYPE.MONEYTYPE_COIN:
|
|||
|
return GetClientDictionaryString("#{10390}");
|
|||
|
case MONEYTYPE.MONEYTYPE_COIN_BIND:
|
|||
|
return GetClientDictionaryString("#{10391}");
|
|||
|
case MONEYTYPE.MONEYTYPE_YUANBAO:
|
|||
|
return GetClientDictionaryString("#{10388}");
|
|||
|
case MONEYTYPE.MONEYTYPE_YUANBAO_BIND:
|
|||
|
return GetClientDictionaryString("#{10389}");
|
|||
|
}
|
|||
|
|
|||
|
return "";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|