Files
EscapistsReintroduced/docs/evidence/chat-ownership-2026-10-02/before.c.txt
T
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

55 lines
1.8 KiB
Plaintext

// Local chat registration and mission scope. RPC transport stays on the controller.
class ERR_ChatClient
{
protected SCR_PlayerController m_Controller;
protected ERR_GameMode m_Mode;
protected ChatCommandInvoker m_Command;
protected int m_Attempts;
protected int m_Token = 1;
protected bool m_Stopped;
void ERR_ChatClient(SCR_PlayerController controller)
{
m_Controller = controller;
m_Mode = ERR_GameMode.Get();
Register();
GetGame().GetCallqueue().CallLater(Poll, 1000, true);
}
protected void Register()
{
if (m_Stopped || m_Command || m_Attempts++ >= 40 || !GetGame() || m_Controller != GetGame().GetPlayerController()) return;
SCR_ChatPanelManager manager = SCR_ChatPanelManager.GetInstance();
if (manager) m_Command = manager.GetCommandInvoker("esc");
if (m_Command) m_Command.Insert(OnCommand);
else GetGame().GetCallqueue().CallLater(Register, 250, false);
}
protected void Poll()
{
if (!GetGame() || m_Controller != GetGame().GetPlayerController()) { Stop(); return; }
Scope();
}
int Scope()
{
ERR_GameMode mode = ERR_GameMode.Get();
if (mode != m_Mode)
{
m_Mode = mode;
m_Token++;
ERR_AdminMenu menu = ERR_AdminMenu.GetOpenMenu();
if (menu) menu.Close();
}
return m_Token;
}
bool Accept(int token) { return !m_Stopped && GetGame() && m_Controller == GetGame().GetPlayerController() && ERR_GameMode.Get() && token == Scope(); }
protected void OnCommand(SCR_ChatPanel panel, string arguments) { m_Controller.ERR_AdminSubmit(arguments); }
void Stop()
{
if (m_Stopped) return;
m_Stopped = true;
if (GetGame()) { GetGame().GetCallqueue().Remove(Register); GetGame().GetCallqueue().Remove(Poll); }
if (m_Command) m_Command.Remove(OnCommand);
m_Command = null;
ERR_AdminMenu menu = ERR_AdminMenu.GetOpenMenu();
if (menu) menu.Close();
}
}