Files
test/Assets/PerfectWorld/Scripts/Chat/Chat_GameSession.cs
T
2026-03-16 11:25:31 +07:00

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;
}
}
}
}