CoD1 Server Messaging script

Call of Duty 1 Message System Mod

Overview

The Call of Duty 1 Message System Mod is a server-side script for Call of Duty 1 (CoD1) that displays customizable messages to all players in multiplayer games. Messages are controlled via server cvars, allowing admins to configure content, timing, display style, and behavior without modifying scripts. The system supports sequential or random message order, configurable display types (chat area or bold/centered), message repetition for visibility, and debug logging for troubleshooting.

This mod integrates with gametype scripts (dm.gsc, tdm.gsc, sd.gsc, re.gsc, bel.gsc, hq.gsc) to work across all CoD1 multiplayer gametypes. It is lightweight, robust, and optimized for CoD1’s scripting limitations.

Features

  • Customizable Messages: Define messages via cvars (svr_message1, svr_message2, etc.).
  • Enable/Disable: Toggle the system with svr_messages_init (0 = off, 1 = on).
  • Message Count: Set the number of messages with svr_messages_count (up to 50).
  • Prefix Support: Add a prefix (e.g., [Admin]) with svr_message_prefix.
  • Timing Control: Configure intervals between messages (svr_message_interval) and delays between loops (svr_message_delay).
  • Random Order: Enable random message display with svr_messages_random.
  • Display Options: Choose between chat area (iprintln) or bold/centered (iprintlnbold) with svr_message_display.
  • Message Repetition: Repeat messages for visibility with svr_message_repeat.
  • Debug Logging: Toggle debug logs with svr_messages_debug to monitor script behavior.
  • Dynamic Updates: Change cvars via RCON for real-time configuration without server restarts.
  • Error Handling: Validates cvar values to prevent crashes and logs issues when debug is enabled.

Requirements

  • Game: Call of Duty 1 (vanilla or modded server).
  • Server Access: Ability to modify server files and configuration (server.cfg).
  • File Structure: A .pk3 file to package the scripts.
  • Gametype Scripts: Integration with gametype scripts (e.g., dm.gsc, tdm.gsc) or a mod’s custom gametype scripts.

Installation

Note: Ensure all gametype scripts (e.g., dm.gsc, tdm.gsc) include the message system initialization to avoid compatibility issues, especially when combining with other mods.

  1. Create the Mod Structure:
    • Create a folder structure for the .pk3 file:
      • zzz_mymod.pk3
      • maps
      • mp
      • gametypes
      • _message_system.gsc
      • dm.gsc (and other gametype scripts as needed)
    • Note: If combining with another mod, merge the message system initialization into the mod’s gametype scripts.
  2. Add Scripts:
    • Place _message_system.gsc in maps/mp/gametypes/.
    • Modify gametype scripts (e.g., dm.gsc, tdm.gsc) to include the message system initialization.
    • Example for dm.gsc:
      • Add the line: thread maps\mp\gametypes\_message_system::init();
      • Place this in the main() function of each gametype script.
    • If using another mod, merge the initialization call into the mod’s gametype scripts (e.g., combine with existing main() functions).
  3. _message_system.gsc:
    • Copy the following code to a text file and call it _message_system.gsc
    • 
      // Grimms message script for Call of Duty 1
      // Modified to ensure the script runs only once and fix syntax error
      
      // cvars for config file
      /* 
      set sv_gametype "dm"             // Ensure valid gametype
      set svr_messages_init 1          // Enable the message system
      set svr_messages_count 3         // Number of messages
      set svr_message_prefix "[Admin]"  // Message prefix
      set svr_message_interval 5       // 5 seconds between messages
      set svr_message_delay 15         // 15 seconds between loops
      set svr_messages_random 0        // Random message order
      set svr_message_display 0        // Use iprintlnbold (1) or iprintln (0) be aware iprintlnbold would be annoying
      set svr_message_repeat 0         // Repeat each message to keep messages on screen longer (rec values 0 1 2)
      set svr_messages_debug 0         // Disable debug logs requires developer
      set svr_message1 "Welcome to the server!"
      set svr_message2 "Follow the rules and have fun!"
      set svr_message3 "Visit our website at example.com!"
       */
      
      init()
      {
          // Check if the script has already been initialized
          if (isDefined(level.messageSystemInitialized) && level.messageSystemInitialized)
          {
              if (getCvarInt("svr_messages_debug") == 1)
                  print("Message system: Already initialized, skipping.\n");
              return;
          }
      
          // Set the flag to indicate the script is initialized
          level.messageSystemInitialized = true;
      
          // Initialize cvars with default values if not set
          if (!isDefined(getCvar("svr_messages_init")))
              setCvar("svr_messages_init", "0"); // Disabled by default
          if (!isDefined(getCvar("svr_messages_count")))
              setCvar("svr_messages_count", "0"); // No messages by default
          if (!isDefined(getCvar("svr_message_prefix")))
              setCvar("svr_message_prefix", ""); // Empty prefix by default
          if (!isDefined(getCvar("svr_message_interval")))
              setCvar("svr_message_interval", "10"); // 10 seconds between messages
          if (!isDefined(getCvar("svr_message_delay")))
              setCvar("svr_message_delay", "30"); // 30 seconds between loops
          if (!isDefined(getCvar("svr_messages_random")))
              setCvar("svr_messages_random", "0"); // Sequential order by default
          if (!isDefined(getCvar("svr_message_display")))
              setCvar("svr_message_display", "0"); // 0 for iprintln, 1 for iprintlnbold
          if (!isDefined(getCvar("svr_message_repeat")))
              setCvar("svr_message_repeat", "1"); // Repeat each message once
          if (!isDefined(getCvar("svr_messages_debug")))
              setCvar("svr_messages_debug", "1"); // Debug enabled by default
      
          // Debug log
          if (getCvarInt("svr_messages_debug") == 1)
              print("Message system: Initializing...\n");
      
          // Check if message system is enabled
          if (getCvarInt("svr_messages_init") == 1)
          {
              if (getCvarInt("svr_messages_debug") == 1)
                  print("Message system: Starting message loop\n");
              thread messageLoop();
          }
      }
      
      messageLoop()
      {
          // Cap maximum messages to prevent performance issues
          maxMessages = 50;
      
          while (getCvarInt("svr_messages_init") == 1)
          {
              // Get cvars each loop to allow dynamic updates
              messageCount = getCvarInt("svr_messages_count");
              prefix = getCvar("svr_message_prefix");
              interval = getCvarFloat("svr_message_interval");
              delay = getCvarFloat("svr_message_delay");
              randomOrder = getCvarInt("svr_messages_random");
              displayType = getCvarInt("svr_message_display");
              repeatCount = getCvarInt("svr_message_repeat");
              debug = getCvarInt("svr_messages_debug");
      
              // Validate message count
              if (messageCount <= 0 || messageCount > maxMessages)
              {
                  if (debug == 1)
                      print("Message system: svr_messages_count is invalid (" + messageCount + "). Must be 1 to " + maxMessages + ". Stopping.\n");
                  return;
              }
      
              // Validate timing values
              if (interval < 1)
              {
                  if (debug == 1)
                      print("Message system: svr_message_interval is too low (< 1). Setting to 1 second.\n");
                  interval = 1;
              }
              if (delay < 0)
              {
                  if (debug == 1)
                      print("Message system: svr_message_delay is negative. Setting to 0 seconds.\n");
                  delay = 0;
              }
              if (repeatCount < 1)
              {
                  if (debug == 1)
                      print("Message system: svr_message_repeat is too low (< 1). Setting to 1.\n");
                  repeatCount = 1;
              }
      
              // Create message index array for random or sequential order
              messageIndices = [];
              for (i = 0; i < messageCount; i++)
                  messageIndices[i] = i + 1;
      
              // Shuffle indices if random order is enabled
              if (randomOrder == 1)
              {
                  for (i = 0; i < messageCount; i++)
                  {
                      j = i + randomInt(messageCount - i); // Simple shuffle
                      temp = messageIndices[i];
                      messageIndices[i] = messageIndices[j];
                      messageIndices[j] = temp;
                  }
              }
      
              // Cycle through messages
              for (i = 0; i < messageCount; i++)
              {
                  // Get message index (sequential or random)
                  index = messageIndices[i];
                  cvarName = "svr_message" + index;
                  message = getCvar(cvarName);
      
                  // Check if the message cvar exists and is not empty
                  if (isDefined(message) && message != "")
                  {
                      // Combine prefix and message if prefix is defined
                      displayMessage = message; // Default to message only
                      if (isDefined(prefix) && prefix != "")
                      {
                          displayMessage = prefix + " " + message;
                      }
      
                      // Repeat message based on svr_message_repeat
                      for (j = 0; j < repeatCount; j++)
                      {
                          if (displayType == 1)
                              iprintlnbold(displayMessage); // Bold, centered
                          else
                              iprintln(displayMessage); // Chat area
                          wait 1; // Short wait between repeats to simulate longer visibility
                      }
                  }
                  else if (debug == 1)
                  {
                      print("Message system: " + cvarName + " is undefined or empty.\n");
                  }
      
                  // Wait for the interval between messages
                  wait interval;
      
                  // Recheck if the system is still enabled
                  if (getCvarInt("svr_messages_init") == 0)
                      return;
              }
      
              // Wait for the delay between loops
              wait delay;
          }
      }
                          
  4. Package the Mod:
    • Zip the maps/ folder into a .pk3 file (e.g., zzz_mymod.pk3).
    • Place the .pk3 in the main/ directory of your CoD1 server.
  5. Configure the Server:
    • Edit server.cfg (in main/ or your mod folder) to include the message system cvars. Example:
    • 
      set sv_gametype "dm"
      set svr_messages_init 1
      set svr_messages_count 3
      set svr_message_prefix "[Admin]"
      set svr_message_interval 5
      set svr_message_delay 15
      set svr_messages_random 1
      set svr_message_display 1
      set svr_message_repeat 2
      set svr_messages_debug 0
      set svr_message1 "Welcome to the server!"
      set svr_message2 "Follow the rules and have fun!"
      set svr_message3 "Visit our website at example.com!"
                          
  6. Start the Server:
    • Launch the CoD1 server with your modded .pk3 loaded.
    • Join as a client to verify messages display correctly.

Configuration

Note: Modify the configuration as needed, especially sv_hostname, rconpassword (set via command line for security), and map rotation settings, in addition to the message system cvars.

The message system is controlled via cvars in server.cfg or RCON. Below is a list of all cvars and their descriptions:

Cvar Type Default Description
svr_messages_init Integer 0 Enable (1) or disable (0) the message system.
svr_messages_count Integer 0 Number of messages to display (1 to 50).
svr_message_prefix String "" Prefix for messages (e.g., [Admin]). Empty for no prefix.
svr_message_interval Float 10 Seconds between messages (minimum 1).
svr_message_delay Float 30 Seconds between message loops (minimum 0).
svr_messages_random Integer 0 Display messages in random order (1) or sequential (0).
svr_message_display Integer 0 Display type: 0 = iprintln (chat area), 1 = iprintlnbold (bold, centered).
svr_message_repeat Integer 1 Number of times to repeat each message (minimum 1).
svr_messages_debug Integer 1 Enable (1) or disable (0) debug logs in the server console.
svr_message1, svr_message2, etc. String "" Message text for each message (e.g., svr_message1 "Hello!").

Example RCON Commands

Use RCON to dynamically adjust settings without restarting the server:

  • rcon set svr_messages_init 1
  • rcon set svr_message_prefix "[Server]"
  • rcon set svr_messages_random 1
  • rcon set svr_message_display 0
  • rcon set svr_message_repeat 3
  • rcon set svr_message1 "New message!"
  • rcon set svr_messages_debug 1

Usage

  • Message Display: When svr_messages_init is 1, messages (svr_message1, svr_message2, etc.) are displayed to all players at the specified svr_message_interval. After all messages are shown, the system waits for svr_message_delay before looping.
  • Random Order: If svr_messages_random is 1, messages are displayed in a random order each loop.
  • Display Style: Messages appear in the chat area (iprintln) or centered and bold (iprintlnbold) based on svr_message_display.
  • Repetition: Each message is repeated svr_message_repeat times with a 1-second delay between repeats to enhance visibility.
  • Debugging: Set svr_messages_debug to 1 to log initialization, errors, and message status to the server console (games_mp.log).

Example Output

With the sample server.cfg above:

  • At 0 seconds: [Admin] Welcome to the server! (repeated twice, 1-second apart)
  • At 5 seconds: [Admin] Follow the rules and have fun! (repeated twice)
  • At 10 seconds: [Admin] Visit our website at example.com! (repeated twice)
  • At 15 seconds: Wait for svr_message_delay (15 seconds)
  • At 30 seconds: Next loop starts (random order if svr_messages_random 1)

Combining with Other Mods

Note: When combining with other mods, carefully merge the message system initialization into the mod’s gametype scripts to avoid conflicts, and test thoroughly to ensure compatibility.

If using another mod that modifies gametype scripts (e.g., dm.gsc, tdm.gsc):

  • Merge the message system initialization (thread maps\mp\gametypes\_message_system::init();) into the mod’s gametype scripts.
  • Example for a mod’s dm.gsc:
    • Find the main() function.
    • Add: thread maps\mp\gametypes\_message_system::init();
    • Ensure the path matches your .pk3 structure (e.g., use maps\mp\gametypes\message_system::init(); if the file is message_system.gsc).
  • Repackage the combined scripts into a new .pk3, including both the mod’s files and _message_system.gsc.
  • Test to ensure no conflicts (e.g., duplicate initializations or cvar clashes).

Troubleshooting

Note: Debug logs require developer 1 and logfile 1 in server.cfg to appear in games_mp.log. Always enable these settings during testing to diagnose issues.

  • Messages Not Displaying:
    • Verify svr_messages_init is 1 and svr_messages_count is greater than 0.
    • Check that svr_message1, svr_message2, etc., are set in server.cfg or via RCON.
    • Ensure the message system is initialized in all relevant gametype scripts (e.g., dm.gsc).
    • Enable svr_messages_debug 1 and check games_mp.log for errors.
  • Debug Messages Not Showing:
    • CoD1’s print function requires developer mode. Add to server.cfg:
    • 
      set developer 1
      set logfile 1
                          
    • Check games_mp.log in the main/ or mod folder for logs.
    • Ensure svr_messages_debug is 1.
    • If using a modded server (e.g., CoD4x), verify console output settings.
  • Gametype Error (e.g., couldn’t load GameType description file):
    • Ensure sv_gametype is set to a valid gametype (dm, tdm, sd, re, bel, hq) in server.cfg.
    • Check for typos in scripts or configs (e.g., message_systemt or maps/,p/gametypes).
    • Verify .pk3 structure: maps/mp/gametypes/_message_system.gsc.
  • Performance Issues:
    • Keep svr_messages_count below 50 and svr_message_interval above 1 second.
    • Avoid excessive svr_message_repeat values (e.g., >5).
  • Mod Conflicts:
    • If combining with another mod, ensure the message system initialization is added to the mod’s gametype scripts.
    • Check for conflicting cvars or script calls in the mod’s .pk3.

Limitations

  • CoD1 Scripting Constraints:
    • No support for custom HUD elements.
    • String length is limited (~1024 characters), so keep messages and prefixes short.
    • Minimum wait time is 0.05 seconds; svr_message_interval is capped at 1 second for readability.
  • Randomization: Uses a simple shuffle algorithm due to CoD1’s limited randomInt function.
  • Message Visibility: iprintln and iprintlnbold messages fade after a fixed time (not configurable in CoD1). Use svr_message_repeat to simulate longer visibility.
  • Debug Logging: Requires developer 1 and logfile 1 in server.cfg to ensure logs appear in games_mp.log.

License

This mod is provided as-is for use in Call of Duty 1 servers. Feel free to modify and distribute, but please credit the original author (Grimm) for the message system script.

Credits

  • Author: Grimm
  • Purpose: Created to enhance CoD1 multiplayer servers with a flexible message system.
  • Version: 1.0 (as of July 20, 2025)
Bottom Left BackgroundBottom Right Background
Grimms 3D worlds
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.