243 lines
8.1 KiB
C#
243 lines
8.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using BrewMonster.Network;
|
|
using BrewMonster.Scripts.UI;
|
|
using CSNetwork.GPDataType;
|
|
using CSNetwork.Protocols;
|
|
|
|
namespace BrewMonster.Scripts.Chat
|
|
{
|
|
public static class Chat_GameSession
|
|
{
|
|
private static List<Protocol> m_aPendingProtocols = new();
|
|
private static List<int> m_aPendingPlayers = new();
|
|
|
|
public static void AddElemForPendingProtocols(Protocol p)
|
|
{
|
|
m_aPendingProtocols.Add(p);
|
|
}
|
|
|
|
// Add one player's id to a buffer in order to get his name later
|
|
public static void AddChatPlayerID(int id)
|
|
{
|
|
if (EC_Game.GetGameRun().GetPlayerName(id, false) != null)
|
|
{
|
|
m_aPendingPlayers.Add(id);
|
|
}
|
|
}
|
|
|
|
public static bool ShouldBlockByLevel(chatmessage p)
|
|
{
|
|
int levelBlock = EC_Game.GetConfigs().GetBlackListSettings().levelBlock;
|
|
if (p.Srclevel > 0 && p.Srclevel < levelBlock)
|
|
{
|
|
if ((ChatChannel)p.Channel is ChatChannel.GP_CHAT_LOCAL
|
|
or ChatChannel.GP_CHAT_WHISPER
|
|
or ChatChannel.GP_CHAT_TRADE)
|
|
{
|
|
if (!EC_Game.GetGameRun().GetHostPlayer().IsOmitBlocking(p.Srcroleid))
|
|
{
|
|
// should be filted by level
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool PolicyResolver(Protocol pProtocol, chatmessage p, ref string strTemp)
|
|
{
|
|
if (IsPolicyChat(p))
|
|
{
|
|
// Todo: check logic
|
|
CHAT_S2C.PolicyChatParameter pPolicyChatPara = CHAT_S2C.CreatPolicyChatParameter(p.Data);
|
|
if (pPolicyChatPara != null && p.Data.Size > 0)
|
|
{
|
|
strTemp = ("???");
|
|
}
|
|
else
|
|
{
|
|
if (pPolicyChatPara != null && !pPolicyChatPara.IsNameReady())
|
|
{
|
|
pPolicyChatPara.GetNameFromServer();
|
|
m_aPendingProtocols.Add(pProtocol);
|
|
return false;
|
|
}
|
|
|
|
strTemp = CECUIHelper.PolicySpecialCharReplace(strTemp, pPolicyChatPara);
|
|
if (CanFormatCoordText(p))
|
|
{
|
|
//strTemp = CECUIHelper.FormatCoordText(strTemp);
|
|
}
|
|
}
|
|
//int strLen = strTemp.GetLength();
|
|
//wcsncpy(szMsg, strTemp, strLen);
|
|
//szMsg[strLen] = 0;
|
|
}
|
|
else
|
|
{
|
|
//AUI_ConvertChatString(strTemp, szMsg, false);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*private void AUI_ConvertChatString(string pszChat, string pszConv, bool bName)
|
|
{
|
|
int i, nLen = 0;
|
|
if (pszChat != null || pszConv != null)
|
|
return;
|
|
|
|
pszConv[0] = 0;
|
|
for( i = 0; i < (int)a_strlen(pszChat); i++ )
|
|
{
|
|
if( pszChat[i] == '^' )
|
|
{
|
|
pszConv[nLen] = '^';
|
|
pszConv[nLen + 1] = '^';
|
|
nLen += 2;
|
|
}
|
|
else if( pszChat[i] == '&' )
|
|
{
|
|
pszConv[nLen] = '^';
|
|
pszConv[nLen + 1] = '&';
|
|
nLen += 2;
|
|
}
|
|
else
|
|
{
|
|
pszConv[nLen] = pszChat[i];
|
|
nLen++;
|
|
}
|
|
}
|
|
pszConv[nLen] = 0;
|
|
}*/
|
|
|
|
private static bool IsPolicyChat(chatmessage p)
|
|
{
|
|
bool bOK = false;
|
|
switch (p.Channel)
|
|
{
|
|
case (byte)ChatChannel.GP_CHAT_LOCAL: // ÃæÏò¸Ã NPC ¿É¼ûÓòÖÐËùÓÐÍæ¼Ò
|
|
if (p.Srcroleid == 0 || // £¨²ßÂÔº°»°Öбê¼Ç $A £©
|
|
ISNPCID(p.Srcroleid))
|
|
{
|
|
// £¨²ßÂÔº°»°ÖÐÎÞ±ê¼Ç £©
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_BATTLE: // ÃæÏò³ÇÕ½¸±±¾Ö¸¶¨ÕóÓª»òÈ«²¿Íæ¼Òº°»°£¨²ßÂÔº°»°Öбê¼Ç $F¡¢$T £©
|
|
if (p.Srcroleid == 0)
|
|
{
|
|
// Ϊ·ÀÒÔºóÓб仯£¬Ôö¼Ó´ËÅжÏ
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_BROADCAST: // ÃæÏòÈ«ÌåÔÚÏßÍæ¼Ò£¨²ßÂÔº°»°Öбê¼Ç $S £©
|
|
if (p.Srcroleid == 0)
|
|
{
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_INSTANCE
|
|
: // ÃæÏò¸±±¾ÖÐÍæ¼Ò£¨²ßÂÔº°»°Öбê¼Ç $I £©£¨ $X ±ê¼Çʱ p->srcroleid == 1£¬´Ëʱֻ³öÏÖÔÚÆÁÄ»ÖÐÑ룩
|
|
if (p.Srcroleid == 0 || p.Srcroleid == 1)
|
|
{
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return bOK;
|
|
}
|
|
|
|
static bool ISNPCID(int id)
|
|
{
|
|
uint uid = (uint)id;
|
|
return (uid & 0x80000000) != 0 &&
|
|
(uid & 0x40000000) == 0;
|
|
}
|
|
|
|
static bool CanFormatCoordText(chatmessage p)
|
|
{
|
|
bool bOK = false;
|
|
switch (p.Channel)
|
|
{
|
|
case (byte)ChatChannel.GP_CHAT_LOCAL: // ÃæÏò¸Ã NPC ¿É¼ûÓòÖÐËùÓÐÍæ¼Ò
|
|
if (p.Srcroleid == 0 || // £¨²ßÂÔº°»°Öбê¼Ç $A £©
|
|
ISNPCID(p.Srcroleid))
|
|
{
|
|
// £¨²ßÂÔº°»°ÖÐÎÞ±ê¼Ç £©
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_BATTLE: // ÃæÏò³ÇÕ½¸±±¾Ö¸¶¨ÕóÓª»òÈ«²¿Íæ¼Òº°»°£¨²ßÂÔº°»°Öбê¼Ç $F¡¢$T £©
|
|
if (p.Srcroleid == 0)
|
|
{
|
|
// Ϊ·ÀÒÔºóÓб仯£¬Ôö¼Ó´ËÅжÏ
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_BROADCAST: // ÃæÏòÈ«ÌåÔÚÏßÍæ¼Ò£¨²ßÂÔº°»°Öбê¼Ç $S £©
|
|
if (p.Srcroleid == 0)
|
|
{
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
case (byte)ChatChannel.GP_CHAT_INSTANCE: //p->srcroleid == 1 ʱ²»½øÐÐ×ø±êµÄÌæ»»
|
|
if (p.Srcroleid == 0)
|
|
{
|
|
bOK = true;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return bOK;
|
|
}
|
|
|
|
public class AUICTranslate
|
|
{
|
|
protected string m_AString = string.Empty;
|
|
protected string m_AWString = string.Empty;
|
|
|
|
public AUICTranslate()
|
|
{
|
|
}
|
|
|
|
public string Translate(string str)
|
|
{
|
|
// In original C++ this likely performs UI charset translation.
|
|
// Here we simply return the same string or store it.
|
|
m_AString = str;
|
|
return m_AString;
|
|
}
|
|
|
|
public string Translate(ReadOnlySpan<char> str)
|
|
{
|
|
m_AWString = new string(str);
|
|
return m_AWString;
|
|
}
|
|
|
|
public string ReverseTranslate(string str)
|
|
{
|
|
// Reverse translation placeholder
|
|
m_AString = str;
|
|
return m_AString;
|
|
}
|
|
|
|
public string ReverseTranslate(ReadOnlySpan<char> str)
|
|
{
|
|
m_AWString = new string(str);
|
|
return m_AWString;
|
|
}
|
|
}
|
|
}
|
|
} |