16. Optional: Customizing game settings. (~10 min-4 hrs, depending on OCD levels)
The above game modes noted in the posted code draw their settings from .dsr files located in “gameserver/iw5/admin”. I do not recommend editing the default .dsr files, however, you can copy them, rename them, edit them, and then point your “iw5_server_mp.cfg” to these modified .dsr files to create custom game modes. You will have to peruse these files to find features such as score limit, respawn delay, number of lives, etc.—they are very long files, mostly because they contain text description of the default classes.
I believe it is also possible to create .dsr files directly from Plutonium IW5 by going into Private Match and saving “recipes” for custom games. You might find it easier to do things this way—you’ll just have to locate where the game saves your .dsr files, put them in “gameserver/iw5/admin”, and then reference them by name in “iw5_server_mp.cfg”.
As always, test everything.
17. Optional: Adding additional mods for quality of life improvements. (~5-10 min)
You might have a vague idea of how scripts work now, so I’m going to share some others that I typically play with as some examples of things you can do with GSC scripting. For each of these, copy the code into Notepad and save as a .gsc file in “storage/iw5/mods/bots/scripts”, and they will be functional on your gameserver or your client as long as you’re loading “mods/bots” via “set fs_game”.
This script will allow Scavenger to resupply equipment and launchers (a la MW2/Black Ops II):
// Credit to Xplod_ for this code, written Mar 20, 2025 (https://forum.plutonium.pw/post/155494)
#include maps\mp\_utility;
Init()
{
InitScavengerResupply();
level.scavenger_altmode = 1;
level.scavenger_secondary = 1;
}
InitScavengerResupply()
{
level thread OnPlayerConnect();
}
OnPlayerConnect()
{
for(;;)
{
level waittill("connected", player);
player thread OnPlayerSpawned();
}
}
OnPlayerSpawned()
{
self endon("disconnect");
for(;;)
{
self waittill("changed_kit");
// Check if the player has the Scavenger perk
if (self HasPerk("specialty_scavenger"))
{
self thread OnScavengerPickup();
}
}
}
OnScavengerPickup()
{
self endon("disconnect");
self endon("death");
for (;;)
{
self waittill("scavenger_pickup");
self GiveMaxAmmo();
if (self HasWeapon(self GetCurrentOffhand()))
{
self GiveMaxAmmo(self GetCurrentOffhand());
}
if (self GetWeaponAmmoStock("frag_grenade_mp") < 1)
{
self SetWeaponAmmoStock("frag_grenade_mp", 1);
}
if (self GetWeaponAmmoStock("semtex_mp") < 1)
{
self SetWeaponAmmoStock("semtex_mp", 1);
}
if (self GetWeaponAmmoStock("throwingknife_mp") < 1)
{
self SetWeaponAmmoStock("throwingknife_mp", 1);
}
if (self GetWeaponAmmoStock("bouncingbetty_mp") < 1)
{
self SetWeaponAmmoStock("bouncingbetty_mp", 1);
}
if (self GetWeaponAmmoStock("claymore_mp") < 1)
{
self SetWeaponAmmoStock("claymore_mp", 1);
}
if (self GetWeaponAmmoStock("c4_mp") < 1)
{
self SetWeaponAmmoStock("c4_mp", 1);
}
if (self GetWeaponAmmoStock("flash_grenade_mp") < 1)
{
self SetWeaponAmmoStock("flash_grenade_mp", 1);
}
if (self GetWeaponAmmoStock("concussion_grenade_mp") < 1)
{
self SetWeaponAmmoStock("concussion_grenade_mp", 1);
}
if (self GetWeaponAmmoStock("scrambler_mp") < 1)
{
self SetWeaponAmmoStock("scrambler_mp", 1);
}
if (self GetWeaponAmmoStock("emp_grenade_mp") < 1)
{
self SetWeaponAmmoStock("emp_grenade_mp", 1);
}
if (self GetWeaponAmmoStock("smoke_grenade_mp") < 1)
{
self SetWeaponAmmoStock("smoke_grenade_mp", 1);
}
if (self GetWeaponAmmoStock("trophy_mp") < 1)
{
self SetWeaponAmmoStock("trophy_mp", 1);
}
if (self GetWeaponAmmoStock("portable_radar_mp") < 1)
{
self SetWeaponAmmoStock("portable_radar_mp", 1);
}
self thread ResupplyLaunchers();
}
}
ResupplyLaunchers()
{
launchers = [
"m320_mp",
"rpg_mp",
"iw5_smaw_mp",
"stinger_mp",
"xm25_mp",
"javelin_mp"
];
for (i = 0; i < launchers.size; i++)
{
weapon = launchers[i];
if (self HasWeapon(weapon))
{
self GiveMaxAmmo(weapon);
}
}
}
This script will disable the screen effects from a nuke/MOAB so that the game isn’t all washed out each time you get one:
// Credit to Resxt for the scripts in this file (https://github.com/Resxt/Plutonium-IW5-Scripts)
#include maps\mp\_utility;
#include maps\mp\killstreaks\_nuke;
main()
{
replacefunc(maps\mp\killstreaks\_nuke::nukeVision, ::disableNukeVision);
replacefunc(maps\mp\killstreaks\_nuke::nukeEffects, ::disableNukeEffects);
}
disableNukeVision()
{
}
disableNukeEffects()
{
level endon( "nuke_cancelled" );
setdvar( "ui_bomb_timer", 0 );
foreach ( var_1 in level.players )
{
var_2 = anglestoforward( var_1.angles );
var_2 = ( var_2[0], var_2[1], 0 );
var_2 = vectornormalize( var_2 );
var_3 = 5000;
var_4 = spawn( "script_model", var_1.origin + var_2 * var_3 );
var_4 setmodel( "tag_origin" );
var_4.angles = ( 0, var_1.angles[1] + 180, 90 );
var_4 thread nukeEffect( var_1 );
}
}
This script will disable spawn protection, if you want serious killstreak carnage on Shipment or enjoy dying all the time:
// Credit to Resxt for the script in this file
#include maps\mp\_utility;
Init()
{
level.killstreakSpawnShield = 0;
}
The sky is the limit if you learn to code—you can do a lot and add any other mods based on GSC script as .gsc files using the method you learned here.
18. Find some friends and have fun!
Any players connecting to your game need only allow Plutonium to send and receive through their firewall on your network, start the game, use the console to enter “connect [your IPv4 address]:27016” (or 27017 if that doesn’t work). By following everything on this guide to the letter on two cleanly installed versions of Windows on old BootCamp Macs, I’ve got a couple of spare systems ready for MW3 LAN parties at a moment’s notice. The additional machines don’t need any mods or usermaps installed, just Plutonium and the MW3 game files. Just keep Windows up to date and update your Bot Warfare mod as new releases are sent out, and you should be good!
Thanks for reading, and hopefully this has demystified a lot of how to host a gameserver with Plutonium. I am not a programmer, so do not expect me to effectively answer many questions about this guide—I have used it to reproduce hosting behavior on multiple machines and am not equipped to solve your computer problems! Nonetheless, I hope this serves as a starting point to help you get going with Plutonium. Much of what is written here can also be applied to T4 to get it working with bots—I may adapt the guide for T4 as well if I get time in the future. Thanks again.
Mods: Please let me know if you spot any factual errors or have better recommendations as to how things in this guide can be accomplished. I am more than happy to make changes/edit/update as necessary (or have it taken down, it's fine, lol). Thank you all for everything you do to make Plutonium awesome.
Waypoint pack for Bot Warfare: download this file, change the extension from ".iwd" to ".zip", then use "Extract All" to see the contents. Copy the folders in this .zip file to storage/iw5/mods/bots/scripts/mp and you should have waypoints for several custom maps.
waypoints.iwd