Стандартными виндоузовскими. Или блокнотом, или WordPad. Хотя, я лично предпочитаю EmEditor. Он с подсветкой синтаксиса. И есть отмена последнего исправления.
Там же по сути только текст (скрипт).
Вот например, как выглядит кусок кода PezBOTWAW
Код:
///////////////////////////////////////////////////////////////
// PeZBOTWAW , version: 004p
// Author: PEZZALUCIFER
// Feel free to add this gsc to any mod you like, just give credit to PeZBOT.
// Any and all feedback is welcome --> perry_hart@hotmail.com
////////////////////////////////////////////////////////////////
init()
{
if (getdvar("svr_pezbots") == "") setdvar("svr_pezbots", 0);
if (getdvar("svr_pezbots_dewards") == "") setdvar("svr_pezbots_dewards", 0);
if (getdvar("svr_pezbots_team") == "") setdvar("svr_pezbots_team", "autoassign");
if (getdvar("svr_pezbots_drawdebug") == "") setdvar("svr_pezbots_drawdebug", 0);
if (getdvar("svr_pezbots_XPCheat") == "") setdvar("svr_pezbots_XPCheat", 0);
if (getdvar("svr_pezbots_skill") == "") setdvar("svr_pezbots_skill", 1.0);
if (getdvar("svr_pezbots_mode") == "") setdvar("svr_pezbots_mode", "normal");
if (getdvar("svr_pezbots_WPDrawRange") == "") setdvar("svr_pezbots_WPDrawRange", 1000);
if (getDvar("svr_pezbots_weapons") == "") setdvar("svr_pezbots_weapons", "normal"); //Random or nationality
if (getDvar("svr_pezbots_grenadepickup") == "") setdvar("svr_pezbots_grenadepickup", 0);
if (getdvar("svr_pezbots_roundCount") == "") setdvar("svr_pezbots_roundCount", 2);
level.maxroundCount = getdvarint("svr_pezbots_roundCount", 2, 0, 32, "int");
level.roundCount = getdvarint("tdm_roundCount", 0, 0, 32, "int");
setdvar("svr_pezbots_classPicker", 0);
setdvar("addbot", "");
setdvar("sv_punkbuster", 0);
setdvar("tdm_roundCount", 0);
Ничего там компилировать не надо.
С нуля писать моды, тем более не разбираясь в языке C++ неблагодарное дело.
Лучше ковырять чужие моды.