1058 lines
40 KiB
C#
1058 lines
40 KiB
C#
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Plugins.Common;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
using Thousandto.Core.RootSystem;
|
|||
|
using Thousandto.Core.Base;
|
|||
|
using System.Text;
|
|||
|
using Thousandto.Code.Global;
|
|||
|
using Thousandto.Cfg.Data;
|
|||
|
using System.IO;
|
|||
|
using Thousandto.Code.Logic.LocalPlayerBT;
|
|||
|
|
|||
|
namespace Thousandto.Code.Logic
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 聊天节点,跟每一个控件相关
|
|||
|
/// </summary>
|
|||
|
public class ChatNode
|
|||
|
{
|
|||
|
private class MyWords
|
|||
|
{
|
|||
|
public static string Join_now = DeclareMessageString.Get(DeclareMessageString.C_CHATNODE_JOIN_IN);//Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_LIJIJIARU);
|
|||
|
}
|
|||
|
|
|||
|
public int Type;
|
|||
|
public string Param1// param --> type
|
|||
|
{
|
|||
|
//写成属性,是为了在Param1修改的时候重置_displayText的值,避免删除操作时_displayText没有变
|
|||
|
get { return _param1; }
|
|||
|
set { _param1 = value; _displayText = null; }
|
|||
|
}
|
|||
|
private string _param1;
|
|||
|
public string Param2;
|
|||
|
public string Param3;
|
|||
|
public string VoiceKey; //如果是语音节点,则需要设置这个key
|
|||
|
public ItemBase ItemParam;
|
|||
|
|
|||
|
public int LabelType; //接收聊天信息后,设置显示的颜色
|
|||
|
public int ChannelID; //频道id, 接收消息后才赋值
|
|||
|
public int Width; //接收消息后赋值
|
|||
|
public int Height; //接收消息后赋值
|
|||
|
public int ImgStartX; //如果是图片类型,这里记录图片应该存放的坐标x起点
|
|||
|
//在第几行
|
|||
|
public int Line;
|
|||
|
public bool IgnoreInPrivateChat; //当前节点不在私聊界面显示
|
|||
|
public bool ShowRedPoint; //显示红点
|
|||
|
public bool IsChannelNode; //是否频道节点
|
|||
|
public string Position; //坐标节点,用来保存坐标值
|
|||
|
|
|||
|
private ChatNode _baseChatNode; //关联的node
|
|||
|
private GameObject _go;
|
|||
|
private static int _playAudioCounter; //录音播放计数器, 全局静态的
|
|||
|
private int _curPlayerAudio; //当前播放录音计数值
|
|||
|
|
|||
|
//逻辑代码使用NGUI内容的中间转换类
|
|||
|
private IChatNodeTool _chatNodeTool;
|
|||
|
private bool _audioCoroRuning; //语音协程正在运行,避免多次点击同一个语音导致播放异常的问题
|
|||
|
|
|||
|
private string _displayText;
|
|||
|
private string _displayBBCodeText;
|
|||
|
public ulong specialId = 0;
|
|||
|
public bool isPrivateChatNode = false;
|
|||
|
public bool IsBeginNode = false;
|
|||
|
public bool IsEndNode = false;
|
|||
|
|
|||
|
//当前节点转化成的ui
|
|||
|
public GameObject GO
|
|||
|
{
|
|||
|
get { return _go; }
|
|||
|
set
|
|||
|
{
|
|||
|
if (_go != null)
|
|||
|
{
|
|||
|
Destory();
|
|||
|
}
|
|||
|
_go = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public ChatNode BaseChatNode
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _baseChatNode;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public ChatNode()
|
|||
|
{
|
|||
|
Type = (int)TNodeType.Text;
|
|||
|
Param1 = "";
|
|||
|
Param2 = "";
|
|||
|
Param3 = "";
|
|||
|
LabelType = -1;
|
|||
|
ChannelID = -1;
|
|||
|
GO = null;
|
|||
|
Line = 0;
|
|||
|
Width = 0;
|
|||
|
Height = 0;
|
|||
|
VoiceKey = "";
|
|||
|
_displayText = "";
|
|||
|
_displayBBCodeText = "";
|
|||
|
IgnoreInPrivateChat = false;
|
|||
|
IsChannelNode = false;
|
|||
|
ShowRedPoint = true;
|
|||
|
ItemParam = null;
|
|||
|
IsBeginNode = true;
|
|||
|
IsEndNode = true;
|
|||
|
}
|
|||
|
|
|||
|
public ChatNode(ChatNode nd)
|
|||
|
{
|
|||
|
this.Type = nd.Type;
|
|||
|
this.Param1 = nd.Param1;
|
|||
|
this.Param2 = nd.Param2;
|
|||
|
this.Param3 = nd.Param3;
|
|||
|
this.Position = nd.Position;
|
|||
|
this.VoiceKey = nd.VoiceKey;
|
|||
|
this.LabelType = nd.LabelType;
|
|||
|
this.Line = nd.Line;
|
|||
|
this.ChannelID = nd.ChannelID;
|
|||
|
this.ImgStartX = nd.ImgStartX;
|
|||
|
this.Width = nd.Width;
|
|||
|
this.Height = nd.Height;
|
|||
|
this._displayText = "";
|
|||
|
this._displayBBCodeText = "";
|
|||
|
this.IgnoreInPrivateChat = nd.IgnoreInPrivateChat;
|
|||
|
this.IsChannelNode = nd.IsChannelNode;
|
|||
|
this._baseChatNode = nd;
|
|||
|
this.ShowRedPoint = nd.ShowRedPoint;
|
|||
|
this.specialId = nd.specialId;
|
|||
|
this.ItemParam = nd.ItemParam;
|
|||
|
this.IsBeginNode = nd.IsBeginNode;
|
|||
|
this.IsEndNode = nd.IsEndNode;
|
|||
|
}
|
|||
|
|
|||
|
//显示红点
|
|||
|
public void EnableRedPoint(bool show)
|
|||
|
{
|
|||
|
if (show == ShowRedPoint)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
ShowRedPoint = show;
|
|||
|
if (_baseChatNode != null)
|
|||
|
{
|
|||
|
_baseChatNode.ShowRedPoint = show;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//设置转换工具
|
|||
|
public void SetTool(IChatNodeTool tool)
|
|||
|
{
|
|||
|
_chatNodeTool = tool;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 建立gameObject对象,用来显示在界面上
|
|||
|
/// 不同节点类型,生成的GO是不同的
|
|||
|
/// </summary>
|
|||
|
public GameObject GenGO(MonoBehaviour label)
|
|||
|
{
|
|||
|
Destory();
|
|||
|
|
|||
|
if (Type == (int)TNodeType.Image || Type == (int)TNodeType.Audio)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
if (Type == (int)TNodeType.Item || Type == (int)TNodeType.Equipment)
|
|||
|
{
|
|||
|
int color = getItemOrEquipColorId();
|
|||
|
|
|||
|
MonoBehaviour colorLabel = (MonoBehaviour)GameCenter.ChatSystem.GetLabelByColorID(color);
|
|||
|
if (colorLabel != null)
|
|||
|
{
|
|||
|
label = colorLabel;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//UnityEngine.Debug.LogError("没有找到对应的color label: color=" + color);
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Type == (int)TNodeType.Equipment)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
GO = GameObject.Instantiate(label.transform.gameObject) as GameObject;
|
|||
|
|
|||
|
return GO;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 拷贝属性
|
|||
|
/// </summary>
|
|||
|
/// <param name="from"></param>
|
|||
|
/// <param name="to"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public MonoBehaviour CopyLabelProperty(MonoBehaviour labelSkin, MonoBehaviour to)
|
|||
|
{
|
|||
|
MonoBehaviour from = null;
|
|||
|
if (Type == (int)TNodeType.Item || Type == (int)TNodeType.Equipment)
|
|||
|
{
|
|||
|
int color = getItemOrEquipColorId();
|
|||
|
|
|||
|
MonoBehaviour colorLabel = (MonoBehaviour)GameCenter.ChatSystem.GetLabelByColorID(color);
|
|||
|
if (colorLabel != null)
|
|||
|
{
|
|||
|
from = colorLabel;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
from = labelSkin;
|
|||
|
}
|
|||
|
return _chatNodeTool.CopyLabelProperty(from, to);
|
|||
|
}
|
|||
|
|
|||
|
//获取颜色id
|
|||
|
private int getItemOrEquipColorId()
|
|||
|
{
|
|||
|
int itemId = 0;
|
|||
|
int.TryParse(getItemOrEquipIdStr(Param2), out itemId);
|
|||
|
|
|||
|
switch (Type)
|
|||
|
{
|
|||
|
case (int)TNodeType.Item:
|
|||
|
case (int)TNodeType.Equipment:
|
|||
|
if(ItemParam != null)
|
|||
|
{
|
|||
|
return ItemParam.Quality;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
private string getItemOrEquipIdStr(string param2)
|
|||
|
{
|
|||
|
if (param2.Contains("_"))
|
|||
|
{
|
|||
|
string[] values = param2.Split('_');
|
|||
|
return values[0];
|
|||
|
}
|
|||
|
|
|||
|
return param2;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 对已生成的go对象,添加必要的组件,已经相应点击函数
|
|||
|
/// </summary>
|
|||
|
public void AddCommponentToGO(bool enableClick = true)
|
|||
|
{
|
|||
|
if (_chatNodeTool == null)
|
|||
|
{
|
|||
|
//UnityEngine.Debug.LogError("chatNode工具类为null");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (ChannelID == (int)ChatChanelType.PERSONAL)
|
|||
|
{
|
|||
|
_chatNodeTool.AddCommponentToGO(this, onClickLabel, enableClick);
|
|||
|
}
|
|||
|
else
|
|||
|
_chatNodeTool.AddCommponentToGO(this, null, enableClick);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 结束动画播放
|
|||
|
/// </summary>
|
|||
|
public void StopPlayAnim()
|
|||
|
{
|
|||
|
if (_chatNodeTool == null)
|
|||
|
{
|
|||
|
//UnityEngine.Debug.LogError("chatNode工具类为null");
|
|||
|
return;
|
|||
|
}
|
|||
|
_chatNodeTool.StopAnim();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 格式化输入字符串,用于发送消息
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public string GetTransferText()
|
|||
|
{
|
|||
|
if (Type == (int)TNodeType.Private)
|
|||
|
return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
|
|||
|
else if (Type == (int)TNodeType.Text)
|
|||
|
{
|
|||
|
// string tmp = Param1.Replace("<", "<");
|
|||
|
// tmp = tmp.Replace(">", ">");
|
|||
|
return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
|
|||
|
}
|
|||
|
else if (Type == (int)TNodeType.CMD)
|
|||
|
{
|
|||
|
return Param1;
|
|||
|
}
|
|||
|
else
|
|||
|
return string.Format("<t={0}>{1},{2},{3}</t>", Type, Param3, Param2, Param1);
|
|||
|
}
|
|||
|
|
|||
|
private string removeColorTag(string text, List<ChatColorFlag> colorflags)
|
|||
|
{
|
|||
|
int start = 0;
|
|||
|
int end = 0;
|
|||
|
Stack<ChatColorFlag> stack = null;
|
|||
|
if (colorflags != null)
|
|||
|
{
|
|||
|
colorflags.Clear();
|
|||
|
stack = new Stack<ChatColorFlag>();
|
|||
|
}
|
|||
|
StringBuilder sb = new StringBuilder();
|
|||
|
end = text.IndexOf("[", start);
|
|||
|
while (end >= 0)
|
|||
|
{
|
|||
|
var nextTag = text.IndexOf("[", end + 1);
|
|||
|
if (nextTag - end == 1)
|
|||
|
{
|
|||
|
end = nextTag;
|
|||
|
continue;
|
|||
|
}
|
|||
|
int offset = text.IndexOf("]", end) - end;
|
|||
|
if (offset < 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
sb.Append(text.Substring(start, end - start));
|
|||
|
string colorTag = text.Substring(end, offset + 1);
|
|||
|
if (offset == 7)
|
|||
|
{
|
|||
|
//不在颜色区间中
|
|||
|
if (colorTag.CompareTo("[000000]") < 0 || colorTag.CompareTo("[ffffff]") > 0)
|
|||
|
{
|
|||
|
sb.Append(colorTag);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (colorflags != null)
|
|||
|
{
|
|||
|
stack.Push(new ChatColorFlag() { ColorText = colorTag, Left = sb.Length });
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else if (offset == 2)
|
|||
|
{
|
|||
|
if (colorTag != "[-]")
|
|||
|
{
|
|||
|
sb.Append(colorTag);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (colorflags != null)
|
|||
|
{
|
|||
|
var cr = stack.Pop();
|
|||
|
cr.Right = sb.Length;
|
|||
|
colorflags.Add(cr);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
sb.Append(colorTag);
|
|||
|
|
|||
|
start = end + offset + 1;
|
|||
|
|
|||
|
end = text.IndexOf("[", start);
|
|||
|
}
|
|||
|
|
|||
|
sb.Append(text.Substring(start));
|
|||
|
|
|||
|
if (colorflags != null)
|
|||
|
{
|
|||
|
//说明有些颜色没有结束符--加上他.
|
|||
|
while (stack.Count > 0)
|
|||
|
{
|
|||
|
var cr = stack.Pop();
|
|||
|
cr.Left = sb.Length;
|
|||
|
colorflags.Add(cr);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return sb.ToString();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 生成显示在界面上的内容
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public string GetDisplayText(bool useForCalcWidth = true, bool ignoreUrl = true, List<ChatColorFlag> list = null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(_displayText) && useForCalcWidth)
|
|||
|
{
|
|||
|
return _displayText;
|
|||
|
}
|
|||
|
|
|||
|
switch ((TNodeType)Type)
|
|||
|
{
|
|||
|
case TNodeType.CMD:
|
|||
|
case TNodeType.TextEx:
|
|||
|
case TNodeType.Text:
|
|||
|
if (useForCalcWidth)
|
|||
|
{
|
|||
|
_displayText = removeColorTag(Param1, list);
|
|||
|
}
|
|||
|
else
|
|||
|
_displayText = (Param1);
|
|||
|
break;
|
|||
|
|
|||
|
case TNodeType.PlayerEx:
|
|||
|
case TNodeType.Player:
|
|||
|
//以防名字里面有颜色值
|
|||
|
if (Param1 != null && Param1.CompareTo("000000") >= 0 &&
|
|||
|
Param2.CompareTo("FFFFFF") <= 0)
|
|||
|
{
|
|||
|
_displayText = Param1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_displayText = string.Format("[{0}]", Param1);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case TNodeType.ImageEx:
|
|||
|
case TNodeType.BigImage:
|
|||
|
case TNodeType.Image:
|
|||
|
_displayText = Param1;
|
|||
|
break;
|
|||
|
|
|||
|
case TNodeType.Position:
|
|||
|
{
|
|||
|
//做了分割,不再加[] 括号
|
|||
|
if (Param1.StartsWith("<"))
|
|||
|
{
|
|||
|
Param1 = Param1.Replace("<", string.Empty);
|
|||
|
_displayText = Param1;
|
|||
|
}
|
|||
|
if (Param1.EndsWith(">"))
|
|||
|
{
|
|||
|
Param1 = Param1.Replace(">", string.Empty);
|
|||
|
_displayText = Param1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//if (Param1.Contains("[") && Param1.Contains("]"))
|
|||
|
//{
|
|||
|
// int start = 0;
|
|||
|
// int end = 0;
|
|||
|
// int offset = 0;
|
|||
|
// start = Param1.IndexOf("[", start);
|
|||
|
// offset = Param1.IndexOf("]", end) - start;
|
|||
|
// Param1 = Param1.Substring(start + 1, offset - 1);
|
|||
|
//}
|
|||
|
int mapId = -1;
|
|||
|
if (Param2.IndexOf("_") > 0)
|
|||
|
{
|
|||
|
string[] args = Param2.Split('_');
|
|||
|
int.TryParse(args[0], out mapId);
|
|||
|
}
|
|||
|
else
|
|||
|
int.TryParse(Param2, out mapId);
|
|||
|
DeclareMapsetting map = DeclareMapsetting.Get(mapId);
|
|||
|
if (map != null)
|
|||
|
{
|
|||
|
_displayText = string.Format(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_DIANJICHUANSONG), map.Name, Param1);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_displayText = string.Format("[{0}]", Param1);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
case TNodeType.Private:
|
|||
|
_displayText = Param1;
|
|||
|
break;
|
|||
|
case TNodeType.Equipment:
|
|||
|
case TNodeType.Item:
|
|||
|
_displayText = Param1;
|
|||
|
break;
|
|||
|
|
|||
|
case TNodeType.Team:
|
|||
|
_displayText = "";
|
|||
|
break;
|
|||
|
case TNodeType.Audio:
|
|||
|
_displayText = string.Format("[Audio]{0}\'", Param2);
|
|||
|
break;
|
|||
|
case TNodeType.Function:
|
|||
|
var parseType = ParseFuncNode();
|
|||
|
if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion || parseType == FuncNodeType.FuDiHelp)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(Param1))
|
|||
|
{
|
|||
|
_displayText = MyWords.Join_now;
|
|||
|
}
|
|||
|
else
|
|||
|
_displayText = Param1;
|
|||
|
|
|||
|
}
|
|||
|
else if (parseType == FuncNodeType.FunctionStartId)
|
|||
|
{
|
|||
|
if (useForCalcWidth || ignoreUrl)
|
|||
|
_displayText = Param1;
|
|||
|
else
|
|||
|
_displayText = string.Format("[url={1}][u]{0}[/u][/url]", Param1, Param2);
|
|||
|
}
|
|||
|
else if (parseType == FuncNodeType.FightSoul)
|
|||
|
{
|
|||
|
//if(string.IsNullOrEmpty(Param1))
|
|||
|
//{
|
|||
|
// int cfgId = int.Parse(Param2);
|
|||
|
// Param1 = "[" + DeclareFightingSoul.Get(cfgId).Name + "]";
|
|||
|
//}
|
|||
|
|
|||
|
//if(useForCalcWidth)
|
|||
|
//{
|
|||
|
// _displayText = Param1;
|
|||
|
//}
|
|||
|
//else
|
|||
|
//{
|
|||
|
// int cfgId = int.Parse(Param2);
|
|||
|
// int qulity = DeclareFightingSoul.Get(cfgId).Quality;
|
|||
|
// var colorStr = ItemBase.GetQualityStrColor((QualityCode)qulity);
|
|||
|
// _displayText = string.Format("[{0}]{1}[-]", colorStr, Param1);
|
|||
|
//}
|
|||
|
}
|
|||
|
else if (parseType == FuncNodeType.OpenUI)
|
|||
|
{
|
|||
|
_displayText = Param1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_displayText = "";
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default: break;
|
|||
|
}
|
|||
|
return _displayText;
|
|||
|
}
|
|||
|
|
|||
|
public FuncNodeType ParseFuncNode()
|
|||
|
{
|
|||
|
if ((TNodeType)Type != TNodeType.Function)
|
|||
|
{
|
|||
|
return FuncNodeType.Default;
|
|||
|
}
|
|||
|
|
|||
|
int funcNodeType = 0;
|
|||
|
if (int.TryParse(Param3, out funcNodeType))
|
|||
|
{
|
|||
|
FuncNodeType nodeType = (FuncNodeType)funcNodeType;
|
|||
|
return nodeType;
|
|||
|
}
|
|||
|
|
|||
|
return FuncNodeType.Default;
|
|||
|
}
|
|||
|
|
|||
|
public void SetDisplayText(string text)
|
|||
|
{
|
|||
|
switch ((TNodeType)Type)
|
|||
|
{
|
|||
|
case TNodeType.Equipment:
|
|||
|
case TNodeType.Item:
|
|||
|
Param1 = text;
|
|||
|
break;
|
|||
|
case TNodeType.Function:
|
|||
|
var parseType = ParseFuncNode();
|
|||
|
if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion)
|
|||
|
{
|
|||
|
Param1 = text;
|
|||
|
}
|
|||
|
break;
|
|||
|
case TNodeType.CMD:
|
|||
|
case TNodeType.TextEx:
|
|||
|
case TNodeType.Text:
|
|||
|
case TNodeType.PlayerEx:
|
|||
|
case TNodeType.Player:
|
|||
|
case TNodeType.ImageEx:
|
|||
|
case TNodeType.BigImage:
|
|||
|
case TNodeType.Image:
|
|||
|
case TNodeType.Position:
|
|||
|
case TNodeType.Private:
|
|||
|
case TNodeType.Team:
|
|||
|
case TNodeType.Audio:
|
|||
|
default:
|
|||
|
Param1 = text;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 生成显示在界面上的内容
|
|||
|
/// contentUseDefaultColor: 0 读取配置颜色, 1 固定小聊天窗颜色, 2 固定大聊天窗颜色
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public string GetDisplayTextBBCode(int contentUseDefaultColor = 1, bool ignoreUrl = false, int realChannelId = -1)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(_displayBBCodeText))
|
|||
|
{
|
|||
|
return _displayBBCodeText;
|
|||
|
}
|
|||
|
|
|||
|
if (LabelType == -1)
|
|||
|
{
|
|||
|
SetLabelType(ChannelID);
|
|||
|
}
|
|||
|
|
|||
|
//使用固定配置的颜色,大小聊天窗,text文字颜色是固定的,不区分频道
|
|||
|
string color = GameCenter.ChatSystem.GetLabelColor(LabelType);
|
|||
|
//频道节点的颜色要区分频道
|
|||
|
if (!IsChannelNode && (TNodeType)Type == TNodeType.Text)
|
|||
|
{
|
|||
|
color = GameCenter.ChatSystem.GetLabelColor(LabelType, contentUseDefaultColor);
|
|||
|
|
|||
|
//小聊天窗,并且不是系统和招募信息,显示蓝色字体
|
|||
|
if (contentUseDefaultColor == 1 &&
|
|||
|
ChannelID != (int)ChatChanelType.SYSTEM &&
|
|||
|
ChannelID != (int)ChatChanelType.JOINTEAM)
|
|||
|
color = "00f4ff";
|
|||
|
if (contentUseDefaultColor == 2 && realChannelId == (int)ChatChanelType.SYSTEM)
|
|||
|
{
|
|||
|
//如果是系统频道并且 contentUseDefaultColor == 2
|
|||
|
color = "ffffff";//"1f7f1a";
|
|||
|
}
|
|||
|
if (contentUseDefaultColor == 2 && realChannelId == (int)ChatChanelType.ChuanWen)
|
|||
|
{
|
|||
|
color = "f97602";
|
|||
|
}
|
|||
|
}
|
|||
|
//打开跑马灯的超链接
|
|||
|
ignoreUrl = true;
|
|||
|
string text = GetDisplayText(false, ignoreUrl);
|
|||
|
|
|||
|
switch ((TNodeType)Type)
|
|||
|
{
|
|||
|
case TNodeType.Equipment:
|
|||
|
case TNodeType.Item:
|
|||
|
int colorId = getItemOrEquipColorId();
|
|||
|
color = ItemBase.GetQualityStrColor(colorId);
|
|||
|
break;
|
|||
|
case TNodeType.Function:
|
|||
|
int functionType = int.TryParse(Param3, out functionType) ? functionType : -1;
|
|||
|
if (functionType == 7)
|
|||
|
{
|
|||
|
string[] strs = Param2.Split('_');
|
|||
|
if (strs.Length >= 3)
|
|||
|
{
|
|||
|
color = strs[2];
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//不加下划线
|
|||
|
|
|||
|
//var parseType = ParseFuncNode();
|
|||
|
//if (parseType == FuncNodeType.Guild_Jion || parseType == FuncNodeType.Tean_Jion)
|
|||
|
//{
|
|||
|
// _displayBBCodeText = string.Format("[{0}][u]{1}[-][-]", color, text);
|
|||
|
//}
|
|||
|
//else
|
|||
|
|
|||
|
//if (text.EndsWith("[-]") == false || text.StartsWith("[") == false)
|
|||
|
if ((TNodeType)Type == TNodeType.Position || (ChannelID == (int)ChatChanelType.JOINTEAM && (TNodeType)Type != TNodeType.Text
|
|||
|
&& (TNodeType)Type != TNodeType.Player))
|
|||
|
{
|
|||
|
_displayBBCodeText = text;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(IsBeginNode && IsEndNode)
|
|||
|
{
|
|||
|
_displayBBCodeText = string.Format("[{0}]{1}[-]", color, text);
|
|||
|
}
|
|||
|
else if (IsBeginNode)
|
|||
|
{
|
|||
|
_displayBBCodeText = string.Format("[{0}]{1}", color, text);
|
|||
|
}
|
|||
|
else if (IsEndNode)
|
|||
|
{
|
|||
|
_displayBBCodeText = string.Format("{0}[-]", text);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_displayBBCodeText = text;
|
|||
|
}
|
|||
|
}
|
|||
|
//else
|
|||
|
//_displayBBCodeText = text;
|
|||
|
|
|||
|
return _displayBBCodeText;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 设置节点要显示的颜色风格
|
|||
|
/// </summary>
|
|||
|
/// <param name="channelId"></param>
|
|||
|
public void SetLabelType(int channelId)
|
|||
|
{
|
|||
|
if (ChannelID == -1 && channelId != -1)
|
|||
|
{
|
|||
|
ChannelID = channelId;
|
|||
|
}
|
|||
|
|
|||
|
int type = GameCenter.ChatSystem.GetLabelTypeByChannel(ChannelID);
|
|||
|
|
|||
|
//通过节点类型,获取字体类型,变颜色用
|
|||
|
switch ((TNodeType)Type)
|
|||
|
{
|
|||
|
case TNodeType.Position:
|
|||
|
type = (int)TLabelType.Position;
|
|||
|
break;
|
|||
|
case TNodeType.Player:
|
|||
|
//type = (int)TLabelType.Player; // 名字节点颜色随频道颜色
|
|||
|
break;
|
|||
|
case TNodeType.Equipment:
|
|||
|
type = (int)TLabelType.Team;
|
|||
|
break;
|
|||
|
case TNodeType.Item:
|
|||
|
type = (int)TLabelType.Team;
|
|||
|
break;
|
|||
|
case TNodeType.Function:
|
|||
|
type = (int)TLabelType.Position;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
LabelType = type;
|
|||
|
}
|
|||
|
|
|||
|
//相应点击事件
|
|||
|
public void TriggerClick(GameObject go)
|
|||
|
{
|
|||
|
onClickLabel(go);
|
|||
|
}
|
|||
|
|
|||
|
IEnumerator playAudioIE(GameObject obj, ChatNode node)
|
|||
|
{
|
|||
|
if (_audioCoroRuning)
|
|||
|
{
|
|||
|
yield break;
|
|||
|
}
|
|||
|
_audioCoroRuning = true;
|
|||
|
int lenght = int.Parse(node.Param2);
|
|||
|
obj.transform.Find("RedPoint").gameObject.SetActive(false);
|
|||
|
//UnityEngine.Debug.LogError("Click audio ID,Length = " + Param1 + "," + Param2);
|
|||
|
GameObject indicateGo = obj.transform.Find("Left").gameObject;
|
|||
|
if (!indicateGo.activeSelf)
|
|||
|
{
|
|||
|
indicateGo = obj.transform.Find("Right").gameObject;
|
|||
|
}
|
|||
|
|
|||
|
bool show = true;
|
|||
|
lenght *= 5;
|
|||
|
while (lenght > 0 && _curPlayerAudio == _playAudioCounter && GameCenter.ChatSystem.IsAudioPlaying())
|
|||
|
{
|
|||
|
show = !show;
|
|||
|
yield return new WaitForSeconds(0.2f);
|
|||
|
lenght--;
|
|||
|
if (node.GO != null)
|
|||
|
{
|
|||
|
indicateGo.SetActive(show);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (node.GO != null)
|
|||
|
{
|
|||
|
indicateGo.SetActive(true);
|
|||
|
}
|
|||
|
|
|||
|
//没有在录音时,恢复背景音乐
|
|||
|
if (!GameCenter.ChatSystem.IsRecording())
|
|||
|
GameCenter.ChatSystem.ResumeAllSound();
|
|||
|
|
|||
|
_audioCoroRuning = false;
|
|||
|
}
|
|||
|
|
|||
|
private void onAudioReceive()
|
|||
|
{
|
|||
|
GameCenter.ChatSystem.Coro.StartCoroutine(playAudioIE(GO, this));
|
|||
|
}
|
|||
|
|
|||
|
private void onClickLabel(GameObject obj)
|
|||
|
{
|
|||
|
int id = 0;
|
|||
|
//UnityEngine.Debug.Log("Trigger click: " + (TNodeType)Type + " -> " + Param1);
|
|||
|
|
|||
|
switch ((TNodeType)Type)
|
|||
|
{
|
|||
|
case TNodeType.Audio:
|
|||
|
if (_audioCoroRuning)
|
|||
|
{
|
|||
|
GameCenter.ChatSystem.StopPlayingAudio();
|
|||
|
return;
|
|||
|
}
|
|||
|
_playAudioCounter++;
|
|||
|
_curPlayerAudio = _playAudioCounter;
|
|||
|
EnableRedPoint(false);
|
|||
|
GameCenter.ChatSystem.ReqVoiceData(VoiceKey, onAudioReceive);
|
|||
|
break;
|
|||
|
case TNodeType.Image:
|
|||
|
case TNodeType.BigImage:
|
|||
|
case TNodeType.Private: //return "[" + Locale.TextManager.Instance.GetText(5, "H") + "]" + Param1 + ":";
|
|||
|
case TNodeType.Text:
|
|||
|
case TNodeType.TextEx:
|
|||
|
break;
|
|||
|
case TNodeType.Position:
|
|||
|
{
|
|||
|
if (GameCenter.GameSceneSystem.GetLocalPlayer().IsDead())
|
|||
|
{
|
|||
|
GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.Die_CanNotOperate));
|
|||
|
return;
|
|||
|
}
|
|||
|
int mapId = int.TryParse(Param2, out mapId) ? mapId : 0;
|
|||
|
if (mapId != 0)
|
|||
|
{
|
|||
|
float x = 0;
|
|||
|
float z = 0;
|
|||
|
int param = 0;
|
|||
|
string[] strs = Position.Split(',');
|
|||
|
if (strs.Length >= 3)
|
|||
|
{
|
|||
|
x = float.TryParse(strs[0], out x) ? x : 0;
|
|||
|
z = float.TryParse(strs[1], out z) ? z : 0;
|
|||
|
param = int.TryParse(strs[2], out param) ? param : 0;
|
|||
|
}
|
|||
|
PlayerBT.crossBD.Write(mapId, new Vector3(x, 0, z), param);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case TNodeType.Player: //return string.Format("[{0}]", Param1);
|
|||
|
case TNodeType.PlayerEx:
|
|||
|
{
|
|||
|
//ulong playerID = 0;
|
|||
|
//ulong.TryParse(Param2, out playerID);
|
|||
|
//if (playerID != 0)
|
|||
|
//{
|
|||
|
// // ChatPrivateInfo info = new ChatPrivateInfo();
|
|||
|
// // info.ID = playerID;
|
|||
|
// // info.Name = Param1;
|
|||
|
// //
|
|||
|
// // GameCenter.ChatPrivateSystem.AddChatPlayer(info);
|
|||
|
// // GameCenter.ChatPrivateSystem.Open(playerID);
|
|||
|
|
|||
|
// GameCenter.PopMenuSystem.Open(playerID, Param1);
|
|||
|
//}
|
|||
|
}
|
|||
|
break;
|
|||
|
case TNodeType.Equipment: //return string.Format("[{0}]", Param1);
|
|||
|
{
|
|||
|
if(ItemParam != null)
|
|||
|
{
|
|||
|
GameCenter.LuaSystem.Adaptor.ShowItemTips(ItemParam, obj);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case TNodeType.Item: //return string.Format("[{0}]", Param1);
|
|||
|
{
|
|||
|
if (int.TryParse(Param2, out id))
|
|||
|
{
|
|||
|
if (GO == null)
|
|||
|
{
|
|||
|
GameCenter.LuaSystem.Adaptor.ShowItemTips(id, obj, false);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
GameCenter.LuaSystem.Adaptor.ShowItemTips(id, GO, false);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case TNodeType.Function: //功能节点
|
|||
|
{
|
|||
|
if (GameCenter.GameSceneSystem.GetLocalPlayer().IsDead())
|
|||
|
{
|
|||
|
GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.Die_CanNotOperate));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
int funcType = 0;
|
|||
|
if (int.TryParse(Param3, out funcType))
|
|||
|
{
|
|||
|
if (funcType == (int)FuncNodeType.Guild_Jion)
|
|||
|
{
|
|||
|
//UnityEngine.Debug.Log("快速加入帮会->" + Param2);
|
|||
|
//string[] args = Param2.Split('_');
|
|||
|
ulong guildId = 0;
|
|||
|
if (ulong.TryParse(Param2, out guildId))
|
|||
|
{
|
|||
|
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if (lp != null && lp.GuildID != 0)
|
|||
|
{
|
|||
|
GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHAT_YIYOUXIANMENG));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var info = GameCenter.MainFunctionSystem.GetFunctionInfo(FunctionStartIdCode.Guild);
|
|||
|
if (info != null)
|
|||
|
{
|
|||
|
if (info.IsEnable == false)
|
|||
|
{
|
|||
|
GameCenter.MsgPromptSystem.ShowPrompt(string.Format(DeclareMessageString.Get(DeclareMessageString.C_MAIN_GONGNENGWEIKAIQI), info.Cfg.FunctionName));
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
MSG_Guild.ReqJoinGuild msg = new MSG_Guild.ReqJoinGuild();
|
|||
|
msg.ids.Add(guildId);
|
|||
|
msg.Send();
|
|||
|
}
|
|||
|
}
|
|||
|
//int level = int.Parse(args[1]);
|
|||
|
|
|||
|
//GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_CHATNODE_APPLY_FINISH));
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.Tean_Jion)
|
|||
|
{
|
|||
|
ulong teamId = 0;
|
|||
|
if (ulong.TryParse(Param2, out teamId))
|
|||
|
{
|
|||
|
if (GameCenter.LuaSystem.Adaptor.IsTeamExist())
|
|||
|
{
|
|||
|
GameCenter.MsgPromptSystem.ShowPrompt(Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.TEAM_YOUHAVEDTEAM));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
MSG_Team.ReqApplyEnter msg = new MSG_Team.ReqApplyEnter();
|
|||
|
msg.teamId = (long)teamId;
|
|||
|
msg.Send();
|
|||
|
}
|
|||
|
//GameCenter.MsgPromptSystem.ShowPrompt(DeclareMessageString.Get(DeclareMessageString.C_CHATNODE_APPLY_FINISH));
|
|||
|
}
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.ToGuildNPC)
|
|||
|
{
|
|||
|
ulong npcId = 0;
|
|||
|
if (ulong.TryParse(Param2, out npcId))
|
|||
|
{
|
|||
|
//GameCenter.GuildSystem.OnEnterGuildMapTalkToNpc((int)npcId);
|
|||
|
}
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.FuDiHelp)
|
|||
|
{
|
|||
|
//福地支援
|
|||
|
int cfgId = 0;
|
|||
|
if (int.TryParse(Param2, out cfgId))
|
|||
|
{
|
|||
|
LocalPlayer lp = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if (lp != null && lp.ID != specialId)
|
|||
|
{
|
|||
|
//发送进入副本消息
|
|||
|
DeclareGuildBattleBoss cfg = DeclareGuildBattleBoss.Get(cfgId);
|
|||
|
if (cfg != null)
|
|||
|
{
|
|||
|
//请求该支援消息是否有效
|
|||
|
var req = new MSG_GuildActivity.ReqFudiCanHelp();
|
|||
|
req.cfgId = cfgId;
|
|||
|
req.Send();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.FunctionStartId)
|
|||
|
{
|
|||
|
if (Param2.IndexOf("_") > 0)
|
|||
|
{
|
|||
|
string[] args = Param2.Split('_');
|
|||
|
int functionId = int.Parse(args[0]);
|
|||
|
int argParam = int.Parse(args[1]);
|
|||
|
GameCenter.MainFunctionSystem.DoFunctionCallBack(functionId, argParam);
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
int functionId = int.Parse(Param2);
|
|||
|
|
|||
|
////专门护送
|
|||
|
//if(functionId == 2340000)
|
|||
|
//{
|
|||
|
// GameCenter.HuSongSystem.SearchToNpc();
|
|||
|
// return;
|
|||
|
//}
|
|||
|
|
|||
|
GameCenter.MainFunctionSystem.DoFunctionCallBack(functionId, null);
|
|||
|
}
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.FightSoul)
|
|||
|
{
|
|||
|
int cfgId = int.Parse(Param2);
|
|||
|
//FightSoulSystem.ShowTempItemTips(cfgId);
|
|||
|
}
|
|||
|
if (funcType == (int)FuncNodeType.OpenUI)
|
|||
|
{
|
|||
|
string[] strs = Param2.Split('_');
|
|||
|
if (strs.Length >= 2)
|
|||
|
{
|
|||
|
int uiID = int.TryParse(strs[1], out uiID) ? uiID : 0;
|
|||
|
long param = long.TryParse(strs[0], out param) ? param : 0;
|
|||
|
if (param == 0)
|
|||
|
{
|
|||
|
GameCenter.MainFunctionSystem.DoFunctionCallBack(uiID);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
GameCenter.MainFunctionSystem.DoFunctionCallBack(uiID, param);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
default: break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public void Destory()
|
|||
|
{
|
|||
|
if (_go == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
GameObject.Destroy(_go);
|
|||
|
_go = null;
|
|||
|
|
|||
|
if (_chatNodeTool != null)
|
|||
|
{
|
|||
|
_chatNodeTool.Destory();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 如果当前node是动画节点,则开始播放动画
|
|||
|
/// </summary>
|
|||
|
public void PlayAnim()
|
|||
|
{
|
|||
|
if ((Type != (int)TNodeType.Image && Type != (int)TNodeType.BigImage) || GO == null)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (_chatNodeTool != null)
|
|||
|
{
|
|||
|
_chatNodeTool.PlayAnim(this);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|