/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { string FormattedMessage = String.Format( "</c><c=#FFFF00>{0}</c>", Message); NWScript.Vector3 v; v.x = v.y = v.z = 0.0f; Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); Script.FloatingTextStringOnCreature(FormattedMessage, PlayerObject, CLRScriptBase.FALSE, 5.0f, CLRScriptBase.COLOR_WHITE, CLRScriptBase.COLOR_WHITE, 0.0f, v); } Database.ACR_IncrementStatistic("BROADCAST_MESSAGE"); Script.WriteTimestampedLogEntry("Received broadcast notification: " + Message); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { string FormattedMessage = String.Format( "</c><c=#FFFF00>{0}</c>", Message); NWScript.Vector3 v; v.x = v.y = v.z = 0.0f; Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); Script.FloatingTextStringOnCreature(FormattedMessage, PlayerObject, CLRScriptBase.FALSE, 5.0f, CLRScriptBase.COLOR_WHITE, CLRScriptBase.COLOR_WHITE, 0.0f, v); } Database.ACR_IncrementStatistic("BROADCAST_MESSAGE"); Script.WriteTimestampedLogEntry("Received broadcast notification: " + Message); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { // // If the event was for the local server, then don't re-broadcast // it. // if (Database.ACR_GetServerID() == Server.ServerId) { return; } string Message = String.Format( "<c=#FFFF00>Server {0} is now online.</c>", Server.Name); string ChatMessage = "</c>" + Message; foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) { continue; } if (!Script.IsCrossServerNotificationEnabled(PlayerObject)) { continue; } if ((Player.Flags & PlayerStateFlags.SendCrossServerNotificationsToCombatLog) != 0) { Script.SendMessageToPC(PlayerObject, Message); } else { Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, ChatMessage, CLRScriptBase.FALSE); } } #if DEBUG_MODE Script.WriteTimestampedLogEntry(Message); #endif }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Player.PlayerId) continue; Database.ACR_IncrementStatistic("DISCONNECT_PLAYER"); Script.WriteTimestampedLogEntry("DisconnectPlayerEvent.DispatchEvent: Disconnecting player " + Script.GetPCPlayerName(PlayerObject) + " due to IPC request."); Script.BootPC(PlayerObject); return; } Script.WriteTimestampedLogEntry("DisconnectPlayerEvent.DispatchEvent: No player '" + Player.PlayerName + "' found locally connected to disconnect."); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Player.PlayerId) { continue; } Database.ACR_IncrementStatistic("DISCONNECT_PLAYER"); Script.WriteTimestampedLogEntry("DisconnectPlayerEvent.DispatchEvent: Disconnecting player " + Script.GetPCPlayerName(PlayerObject) + " due to IPC request."); Script.BootPC(PlayerObject); return; } Script.WriteTimestampedLogEntry("DisconnectPlayerEvent.DispatchEvent: No player '" + Player.PlayerName + "' found locally connected to disconnect."); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { // // If the event was for the local server, then don't re-broadcast // it. // if (Database.ACR_GetServerID() == Server.ServerId) return; string Message = String.Format( "<c=#FFFF00>Server {0} is now offline.</c>", Server.Name); string ChatMessage = "</c>" + Message; foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) continue; if (!Script.IsCrossServerNotificationEnabled(PlayerObject)) continue; if ((Player.Flags & PlayerStateFlags.SendCrossServerNotificationsToCombatLog) != 0) { Script.SendMessageToPC(PlayerObject, Message); } else { Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, ChatMessage, CLRScriptBase.FALSE); } } #if DEBUG_MODE Script.WriteTimestampedLogEntry(Message); #endif }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { string FormattedMessage = String.Format( "</c><c=#FFFF00>Server shutting down: {0}</c>", Message); NWScript.Vector3 v; v.x = v.y = v.z = 0.0f; Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); Script.FloatingTextStringOnCreature(FormattedMessage, PlayerObject, CLRScriptBase.FALSE, 5.0f, CLRScriptBase.COLOR_WHITE, CLRScriptBase.COLOR_WHITE, 0.0f, v); } Script.WriteTimestampedLogEntry("Received shutdown request: " + Message); Database.ACR_IncrementStatistic("SERVER_SHUTDOWN"); Script.SendInfrastructureIrcMessage(String.Format( "Server '{0}' shutting down or restarting: {1}", Script.GetName(Script.GetModule()), Message)); Script.DelayCommand(5.0f, delegate() { Database.ACR_FlushAllQueryQueues(); SystemInfo.ShutdownGameServer(Script); }); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { string FormattedMessage = String.Format( "</c><c=#FFFF00>Server shutting down: {0}</c>", Message); NWScript.Vector3 v; v.x = v.y = v.z = 0.0f; Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); Script.FloatingTextStringOnCreature(FormattedMessage, PlayerObject, CLRScriptBase.FALSE, 5.0f, CLRScriptBase.COLOR_WHITE, CLRScriptBase.COLOR_WHITE, 0.0f, v); } Script.WriteTimestampedLogEntry("Received shutdown request: " + Message); Database.ACR_IncrementStatistic("SERVER_SHUTDOWN"); Script.SendInfrastructureIrcMessage(String.Format( "Server '{0}' shutting down or restarting: {1}", Script.GetName(Script.GetModule()), Message)); Script.DelayCommand(5.0f, delegate() { Database.ACR_FlushAllQueryQueues(); SystemInfo.ShutdownGameServer(Script); }); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Recipient.PlayerId) continue; string FormattedMessage = String.Format( "</c><c=#FFCC99>{0}: </c><c=#30DDCC>[Page] {1}</c>", Sender.PlayerName, Message); Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); break; } }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Recipient.PlayerId) { continue; } string FormattedMessage = String.Format( "</c><c=#FFCC99>{0}: </c><c=#30DDCC>[ServerTell] {1}</c>", Sender.CharacterName, Message); Script.SetLastTellFromPlayerId(PlayerObject, Sender.Player.PlayerId); Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); // // If this is the first time that we have delivered a // cross-server tell to this player (since login), remind them // of how to respond. // if ((Database.ACR_GetPCLocalFlags(PlayerObject) & ALFA.Database.ACR_PC_LOCAL_FLAG_SERVER_TELL_HELP) == 0) { Script.SendMessageToPC( PlayerObject, "To respond to a [ServerTell] from a player on a different server, type: #re [message], or #t \"character name\" [message], or #tp \"player name\" [message]. Quotes are optional unless the name has spaces. The #rt [message] command will send a tell to the last player that you had sent a tell to."); Database.ACR_SetPCLocalFlags( PlayerObject, Database.ACR_GetPCLocalFlags(PlayerObject) | ALFA.Database.ACR_PC_LOCAL_FLAG_SERVER_TELL_HELP); } break; } }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Recipient.PlayerId) continue; string FormattedMessage = String.Format( "</c><c=#FFCC99>{0}: </c><c=#30DDCC>[ServerTell] {1}</c>", Sender.CharacterName, Message); Script.SetLastTellFromPlayerId(PlayerObject, Sender.Player.PlayerId); Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); // // If this is the first time that we have delivered a // cross-server tell to this player (since login), remind them // of how to respond. // if ((Database.ACR_GetPCLocalFlags(PlayerObject) & ALFA.Database.ACR_PC_LOCAL_FLAG_SERVER_TELL_HELP) == 0) { Script.SendMessageToPC( PlayerObject, "To respond to a [ServerTell] from a player on a different server, type: #re [message], or #t \"character name\" [message], or #tp \"player name\" [message]. Quotes are optional unless the name has spaces. The #rt [message] command will send a tell to the last player that you had sent a tell to."); Database.ACR_SetPCLocalFlags( PlayerObject, Database.ACR_GetPCLocalFlags(PlayerObject) | ALFA.Database.ACR_PC_LOCAL_FLAG_SERVER_TELL_HELP); } break; } }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { foreach (uint PlayerObject in Script.GetPlayers(true)) { if (Database.ACR_GetPlayerID(PlayerObject) != Recipient.PlayerId) { continue; } string FormattedMessage = String.Format( "</c><c=#FFCC99>{0}: </c><c=#30DDCC>[Page] {1}</c>", Sender.PlayerName, Message); Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, FormattedMessage, CLRScriptBase.FALSE); break; } }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { // // If the event was for a player logging off of the local server, // then don't re-broadcast it. // foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) continue; if (Player.CharacterIdsShown.Contains(Character.CharacterId)) { string sPlayerListBox = ""; if (Server.ServerId == Script.GetDatabase().ACR_GetServerID() || Script.GetLocalInt(PlayerObject, "chatselect_expanded") == 0) { if (IsDM == true) { sPlayerListBox = "LocalDMList"; Player.ChatSelectLocalDMsShown -= 1; } else { sPlayerListBox = "LocalPlayerList"; Player.ChatSelectLocalPlayersShown -= 1; } } else { if (IsDM == true) { sPlayerListBox = "RemoteDMList"; Player.ChatSelectRemoteDMsShown -= 1; } else { sPlayerListBox = "RemotePlayerList"; Player.ChatSelectRemotePlayersShown -= 1; } } Script.RemoveListBoxRow(Player.ObjectId, "ChatSelect", sPlayerListBox, Character.CharacterName); Player.CharacterIdsShown.Remove(Character.CharacterId); Player.UpdateChatSelectGUIHeaders(); } } if (Database.ACR_GetServerID() == Server.ServerId) return; string Message = String.Format( "{0}<c=#FFDAB9>{1} ({2}) left {3}.</c>", // <c=Peachpuff...> IsDM ? "<c=#99CCFF>[DM] </c>" : "", Character.Name, Character.Player.Name, Server.Name); string ChatMessage = "</c>" + Message; foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) continue; if (!Script.IsCrossServerNotificationEnabled(PlayerObject)) continue; if ((Player.Flags & PlayerStateFlags.SendCrossServerNotificationsToCombatLog) != 0) { Script.SendMessageToPC(PlayerObject, Message); } else { Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, ChatMessage, CLRScriptBase.FALSE); } } #if DEBUG_MODE Script.WriteTimestampedLogEntry(Message); #endif }
/// <summary> /// This method is called when a cross-server chat select /// resynchronization request is received. Its purpose is to scan the /// player list to check whether the argument player is online, and to /// activate chat select GUI resynchronization if appropriate, else to /// queue the resynchronization until the player does log in. /// </summary> /// <param name="SourceServerId">Supplies the server id of the server /// that requested the GUI resynchronization.</param> /// <param name="ResyncCommand">Supplies the GUI resynchronizer command /// line as generated by SendGUIStateToServer().</param> /// <param name="Script">Supplies the current script object.</param> /// <returns>TRUE on success, else FALSE on failure.</returns> public static int HandleGUIResync(int SourceServerId, string ResyncCommand, ACR_ServerCommunicator Script) { try { ResyncState RemoteResyncInfo; // // Deserialize the remote resynchronization state. On null, an // obviously invalid request was received. Otherwise a protocol // violation that is atypical was received and an exception is // raised. // if ((RemoteResyncInfo = ResyncState.FromString(ResyncCommand)) == null) { Script.WriteTimestampedLogEntry(String.Format( "ACR_ServerCommunicator.GUIResynchronizer.HandleGUIResync({0}, {1}): Invalid request.", SourceServerId, ResyncCommand)); return ACR_ServerCommunicator.FALSE; } // // If a request was not already enqueued for this player, then // enqueue it. // var ResyncInfo = (from RS in PlayerResyncStates where RS.PlayerId == RemoteResyncInfo.PlayerId select RS).FirstOrDefault(); if (ResyncInfo == null) { // // If the player is logged on, directly enqueue the execute // request now. Otherwise, wait for the ClientEnter event // as the player might still reside on the remote server. // foreach (uint PCObject in Script.GetPlayers(true)) { PlayerState State; if ((State = Script.TryGetPlayerState(PCObject)) == null) continue; if (State.PlayerId != RemoteResyncInfo.PlayerId) continue; ResynchronizePlayerState(RemoteResyncInfo, PCObject, Script); return ACR_ServerCommunicator.TRUE; } // // Enqueue the request so that it can be processed at // ClientEnter time. // PlayerResyncStates.Add(RemoteResyncInfo); } else { // // Update the resync flags to match the new request. // ResyncInfo.ResyncFlags = RemoteResyncInfo.ResyncFlags; } } catch (Exception e) { Script.WriteTimestampedLogEntry(String.Format( "ACR_ServerCommunicator.GUIResynchronizer.HandleGUIResync({0}, {1}): Exception: {0}", SourceServerId, ResyncCommand, e)); return ACR_ServerCommunicator.FALSE; } return ACR_ServerCommunicator.TRUE; }
/// <summary> /// This method is called when a cross-server chat select /// resynchronization request is received. Its purpose is to scan the /// player list to check whether the argument player is online, and to /// activate chat select GUI resynchronization if appropriate, else to /// queue the resynchronization until the player does log in. /// </summary> /// <param name="SourceServerId">Supplies the server id of the server /// that requested the GUI resynchronization.</param> /// <param name="ResyncCommand">Supplies the GUI resynchronizer command /// line as generated by SendGUIStateToServer().</param> /// <param name="Script">Supplies the current script object.</param> /// <returns>TRUE on success, else FALSE on failure.</returns> public static int HandleGUIResync(int SourceServerId, string ResyncCommand, ACR_ServerCommunicator Script) { try { ResyncState RemoteResyncInfo; // // Deserialize the remote resynchronization state. On null, an // obviously invalid request was received. Otherwise a protocol // violation that is atypical was received and an exception is // raised. // if ((RemoteResyncInfo = ResyncState.FromString(ResyncCommand)) == null) { Script.WriteTimestampedLogEntry(String.Format( "ACR_ServerCommunicator.GUIResynchronizer.HandleGUIResync({0}, {1}): Invalid request.", SourceServerId, ResyncCommand)); return(ACR_ServerCommunicator.FALSE); } // // If a request was not already enqueued for this player, then // enqueue it. // var ResyncInfo = (from RS in PlayerResyncStates where RS.PlayerId == RemoteResyncInfo.PlayerId select RS).FirstOrDefault(); if (ResyncInfo == null) { // // If the player is logged on, directly enqueue the execute // request now. Otherwise, wait for the ClientEnter event // as the player might still reside on the remote server. // foreach (uint PCObject in Script.GetPlayers(true)) { PlayerState State; if ((State = Script.TryGetPlayerState(PCObject)) == null) { continue; } if (State.PlayerId != RemoteResyncInfo.PlayerId) { continue; } ResynchronizePlayerState(RemoteResyncInfo, PCObject, Script); return(ACR_ServerCommunicator.TRUE); } // // Enqueue the request so that it can be processed at // ClientEnter time. // PlayerResyncStates.Add(RemoteResyncInfo); } else { // // Update the resync flags to match the new request. // ResyncInfo.ResyncFlags = RemoteResyncInfo.ResyncFlags; } } catch (Exception e) { Script.WriteTimestampedLogEntry(String.Format( "ACR_ServerCommunicator.GUIResynchronizer.HandleGUIResync({0}, {1}): Exception: {0}", SourceServerId, ResyncCommand, e)); return(ACR_ServerCommunicator.FALSE); } return(ACR_ServerCommunicator.TRUE); }
/// <summary> /// Dispatch the event (in a script context). /// </summary> /// <param name="Script">Supplies the script object.</param> /// <param name="Database">Supplies the database connection.</param> public void DispatchEvent(ACR_ServerCommunicator Script, ALFA.Database Database) { // // If the event was for a player logging on to the local server, // then don't re-broadcast it. // foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) { continue; } if (!Player.CharacterIdsShown.Contains(Character.CharacterId)) { string sPlayerListBox = ""; if (Server.ServerId == Script.GetDatabase().ACR_GetServerID() || Script.GetLocalInt(PlayerObject, "chatselect_expanded") == 0) { if (IsDM == true) { sPlayerListBox = "LocalDMList"; Player.ChatSelectLocalDMsShown += 1; } else { sPlayerListBox = "LocalPlayerList"; Player.ChatSelectLocalPlayersShown += 1; } if (Server.ServerId == Script.GetDatabase().ACR_GetServerID()) { Script.AddListBoxRow(Player.ObjectId, "ChatSelect", sPlayerListBox, Character.CharacterName, "RosterData=/t \"" + Character.CharacterName + "\"", "", "5=/t \"" + Character.CharacterName + "\" ", ""); } else { if (Player.Flags.HasFlag(PlayerStateFlags.ChatSelectShowLocalPlayersOnlyWhenCollapsed)) { continue; } Script.AddListBoxRow(Player.ObjectId, "ChatSelect", sPlayerListBox, Character.CharacterName, "RosterData=#t \"" + Character.CharacterName + "\"", "", "5=#t \"" + Character.CharacterName + "\" ", ""); } } else { if (IsDM == true) { sPlayerListBox = "RemoteDMList"; Player.ChatSelectRemoteDMsShown += 1; } else { sPlayerListBox = "RemotePlayerList"; Player.ChatSelectRemotePlayersShown += 1; } Script.AddListBoxRow(Player.ObjectId, "ChatSelect", sPlayerListBox, Character.CharacterName, "RosterData=#t \"" + Character.CharacterName + "\"", "", "5=#t \"" + Character.CharacterName + "\" ", ""); } Player.CharacterIdsShown.Add(Character.CharacterId); Player.UpdateChatSelectGUIHeaders(); } } if (Database.ACR_GetServerID() == Server.ServerId) { return; } string Message = String.Format( "{0}<c=#FFA500>{1} ({2}) joined {3}.</c>", // <c=Orange...> IsDM ? "<c=#99CCFF>[DM] </c>": "", Character.Name, Character.Player.Name, Server.Name); string ChatMessage = "</c>" + Message; foreach (uint PlayerObject in Script.GetPlayers(true)) { PlayerState Player = Script.TryGetPlayerState(PlayerObject); if (Player == null) { continue; } if (!Script.IsCrossServerNotificationEnabled(PlayerObject)) { continue; } if ((Player.Flags & PlayerStateFlags.SendCrossServerNotificationsToCombatLog) != 0) { Script.SendMessageToPC(PlayerObject, Message); } else { Script.SendChatMessage( CLRScriptBase.OBJECT_INVALID, PlayerObject, CLRScriptBase.CHAT_MODE_SERVER, ChatMessage, CLRScriptBase.FALSE); } } #if DEBUG_MODE Script.WriteTimestampedLogEntry(Message); #endif }