From: Cloudwalk Date: Tue, 25 Aug 2020 14:48:35 +0000 (-0400) Subject: Merge branch 'master' into Mario/wrath-darkplaces_extra X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=4b2e33816c2cdf97f81f7621e5d972fff73b6d33;p=xonotic%2Fdarkplaces.git Merge branch 'master' into Mario/wrath-darkplaces_extra --- 4b2e33816c2cdf97f81f7621e5d972fff73b6d33 diff --cc com_game.c index 00000000,a40f5c40..a8e7dfca mode 000000,100644..100644 --- a/com_game.c +++ b/com_game.c @@@ -1,0 -1,206 +1,207 @@@ + /* + Copyright (C) 1996-1997 Id Software, Inc. + Copyright (C) 2000-2020 Ashley Rose "LadyHavoc" Hale + Copyright (C) 2020 David "Cloudwalk" Knapp + Copyright (C) 2020 Kristus + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + */ + + #include "quakedef.h" + + // Game mods + + gamemode_t gamemode; + const char *gamename; + const char *gamenetworkfiltername; // same as gamename currently but with _ in place of spaces so that "getservers" packets parse correctly (this also means the + const char *gamedirname1; + const char *gamedirname2; + const char *gamescreenshotname; + const char *gameuserdirname; + char com_modname[MAX_OSPATH] = ""; + + gamemode_t com_startupgamemode; + gamemode_t com_startupgamegroup; + + typedef struct gamemode_info_s + { + gamemode_t mode; // this gamemode + gamemode_t group; // different games with same group can switch automatically when gamedirs change + const char* prog_name; // not null + const char* cmdline; // not null + const char* gamename; // not null + const char* gamenetworkfiltername; // not null + const char* gamedirname1; // not null + const char* gamedirname2; // null + const char* gamescreenshotname; // not nul + const char* gameuserdirname; // not null + } gamemode_info_t; + + static const gamemode_info_t gamemode_info [GAME_COUNT] = + {// game basegame prog_name cmdline gamename gamenetworkfilername basegame modgame screenshot userdir // commandline option + { GAME_NORMAL, GAME_NORMAL, "", "-quake", "DarkPlaces-Quake", "DarkPlaces-Quake", "id1", NULL, "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -quake runs the game Quake (default) + { GAME_HIPNOTIC, GAME_NORMAL, "hipnotic", "-hipnotic", "Darkplaces-Hipnotic", "Darkplaces-Hipnotic", "id1", "hipnotic", "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -hipnotic runs Quake mission pack 1: The Scourge of Armagon + { GAME_ROGUE, GAME_NORMAL, "rogue", "-rogue", "Darkplaces-Rogue", "Darkplaces-Rogue", "id1", "rogue", "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -rogue runs Quake mission pack 2: The Dissolution of Eternity + { GAME_NEHAHRA, GAME_NORMAL, "nehahra", "-nehahra", "DarkPlaces-Nehahra", "DarkPlaces-Nehahra", "id1", "nehahra", "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -nehahra runs The Seal of Nehahra movie and game + { GAME_QUOTH, GAME_NORMAL, "quoth", "-quoth", "Darkplaces-Quoth", "Darkplaces-Quoth", "id1", "quoth", "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -quoth runs the Quoth mod for playing community maps made for it + { GAME_NEXUIZ, GAME_NEXUIZ, "nexuiz", "-nexuiz", "Nexuiz", "Nexuiz", "data", NULL, "nexuiz", "nexuiz" }, // COMMANDLINEOPTION: Game: -nexuiz runs the multiplayer game Nexuiz + { GAME_XONOTIC, GAME_XONOTIC, "xonotic", "-xonotic", "Xonotic", "Xonotic", "data", NULL, "xonotic", "xonotic" }, // COMMANDLINEOPTION: Game: -xonotic runs the multiplayer game Xonotic + { GAME_TRANSFUSION, GAME_TRANSFUSION, "transfusion", "-transfusion", "Transfusion", "Transfusion", "basetf", NULL, "transfusion", "transfusion" }, // COMMANDLINEOPTION: Game: -transfusion runs Transfusion (the recreation of Blood in Quake) + { GAME_GOODVSBAD2, GAME_GOODVSBAD2, "gvb2", "-goodvsbad2", "GoodVs.Bad2", "GoodVs.Bad2", "rts", NULL, "gvb2", "gvb2" }, // COMMANDLINEOPTION: Game: -goodvsbad2 runs the psychadelic RTS FPS game Good Vs Bad 2 + { GAME_TEU, GAME_TEU, "teu", "-teu", "TheEvilUnleashed", "TheEvilUnleashed", "baseteu", NULL, "teu", "teu" }, // COMMANDLINEOPTION: Game: -teu runs The Evil Unleashed (this option is obsolete as they are not using darkplaces) + { GAME_BATTLEMECH, GAME_BATTLEMECH, "battlemech", "-battlemech", "Battlemech", "Battlemech", "base", NULL, "battlemech", "battlemech" }, // COMMANDLINEOPTION: Game: -battlemech runs the multiplayer topdown deathmatch game BattleMech + { GAME_ZYMOTIC, GAME_ZYMOTIC, "zymotic", "-zymotic", "Zymotic", "Zymotic", "basezym", NULL, "zymotic", "zymotic" }, // COMMANDLINEOPTION: Game: -zymotic runs the singleplayer game Zymotic + { GAME_SETHERAL, GAME_SETHERAL, "setheral", "-setheral", "Setheral", "Setheral", "data", NULL, "setheral", "setheral" }, // COMMANDLINEOPTION: Game: -setheral runs the multiplayer game Setheral + { GAME_TENEBRAE, GAME_NORMAL, "tenebrae", "-tenebrae", "DarkPlaces-Tenebrae", "DarkPlaces-Tenebrae", "id1", "tenebrae", "dp", "darkplaces" }, // COMMANDLINEOPTION: Game: -tenebrae runs the graphics test mod known as Tenebrae (some features not implemented) + { GAME_NEOTERIC, GAME_NORMAL, "neoteric", "-neoteric", "Neoteric", "Neoteric", "id1", "neobase", "neo", "darkplaces" }, // COMMANDLINEOPTION: Game: -neoteric runs the game Neoteric + { GAME_OPENQUARTZ, GAME_NORMAL, "openquartz", "-openquartz", "OpenQuartz", "OpenQuartz", "id1", NULL, "openquartz", "darkplaces" }, // COMMANDLINEOPTION: Game: -openquartz runs the game OpenQuartz, a standalone GPL replacement of the quake content + { GAME_PRYDON, GAME_NORMAL, "prydon", "-prydon", "PrydonGate", "PrydonGate", "id1", "prydon", "prydon", "darkplaces" }, // COMMANDLINEOPTION: Game: -prydon runs the topdown point and click action-RPG Prydon Gate + { GAME_DELUXEQUAKE, GAME_DELUXEQUAKE, "dq", "-dq", "Deluxe Quake", "Deluxe_Quake", "basedq", "extradq", "basedq", "dq" }, // COMMANDLINEOPTION: Game: -dq runs the game Deluxe Quake + { GAME_THEHUNTED, GAME_THEHUNTED, "thehunted", "-thehunted", "The Hunted", "The_Hunted", "thdata", NULL, "th", "thehunted" }, // COMMANDLINEOPTION: Game: -thehunted runs the game The Hunted + { GAME_DEFEATINDETAIL2, GAME_DEFEATINDETAIL2, "did2", "-did2", "Defeat In Detail 2", "Defeat_In_Detail_2", "data", NULL, "did2_", "did2" }, // COMMANDLINEOPTION: Game: -did2 runs the game Defeat In Detail 2 + { GAME_DARSANA, GAME_DARSANA, "darsana", "-darsana", "Darsana", "Darsana", "ddata", NULL, "darsana", "darsana" }, // COMMANDLINEOPTION: Game: -darsana runs the game Darsana + { GAME_CONTAGIONTHEORY, GAME_CONTAGIONTHEORY, "contagiontheory", "-contagiontheory", "Contagion Theory", "Contagion_Theory", "ctdata", NULL, "ct", "contagiontheory" }, // COMMANDLINEOPTION: Game: -contagiontheory runs the game Contagion Theory + { GAME_EDU2P, GAME_EDU2P, "edu2p", "-edu2p", "EDU2 Prototype", "EDU2_Prototype", "id1", "edu2", "edu2_p", "edu2prototype" }, // COMMANDLINEOPTION: Game: -edu2p runs the game Edu2 prototype + { GAME_PROPHECY, GAME_PROPHECY, "prophecy", "-prophecy", "Prophecy", "Prophecy", "gamedata", NULL, "phcy", "prophecy" }, // COMMANDLINEOPTION: Game: -prophecy runs the game Prophecy + { GAME_BLOODOMNICIDE, GAME_BLOODOMNICIDE, "omnicide", "-omnicide", "Blood Omnicide", "Blood_Omnicide", "kain", NULL, "omnicide", "omnicide" }, // COMMANDLINEOPTION: Game: -omnicide runs the game Blood Omnicide + { GAME_STEELSTORM, GAME_STEELSTORM, "steelstorm", "-steelstorm", "Steel-Storm", "Steel-Storm", "gamedata", NULL, "ss", "steelstorm" }, // COMMANDLINEOPTION: Game: -steelstorm runs the game Steel Storm + { GAME_STEELSTORM2, GAME_STEELSTORM2, "steelstorm2", "-steelstorm2", "Steel Storm 2", "Steel_Storm_2", "gamedata", NULL, "ss2", "steelstorm2" }, // COMMANDLINEOPTION: Game: -steelstorm2 runs the game Steel Storm 2 + { GAME_SSAMMO, GAME_SSAMMO, "steelstorm-ammo", "-steelstormammo", "Steel Storm A.M.M.O.", "Steel_Storm_A.M.M.O.", "gamedata", NULL, "ssammo", "steelstorm-ammo" }, // COMMANDLINEOPTION: Game: -steelstormammo runs the game Steel Storm A.M.M.O. + { GAME_STEELSTORMREVENANTS, GAME_STEELSTORMREVENANTS, "steelstorm-revenants", "-steelstormrev", "Steel Storm: Revenants", "Steel_Storm_Revenants", "base", NULL, "ssrev", "steelstorm-revenants" }, // COMMANDLINEOPTION: Game: -steelstormrev runs the game Steel Storm: Revenants + { GAME_TOMESOFMEPHISTOPHELES, GAME_TOMESOFMEPHISTOPHELES, "tomesofmephistopheles","-tomesofmephistopheles", "Tomes of Mephistopheles", "Tomes_of_Mephistopheles", "gamedata", NULL, "tom", "tomesofmephistopheles" }, // COMMANDLINEOPTION: Game: -tomesofmephistopheles runs the game Tomes of Mephistopheles + { GAME_STRAPBOMB, GAME_STRAPBOMB, "strapbomb", "-strapbomb", "Strap-on-bomb Car", "Strap-on-bomb_Car", "id1", NULL, "strap", "strapbomb" }, // COMMANDLINEOPTION: Game: -strapbomb runs the game Strap-on-bomb Car + { GAME_MOONHELM, GAME_MOONHELM, "moonhelm", "-moonhelm", "MoonHelm", "MoonHelm", "data", NULL, "mh", "moonhelm" }, // COMMANDLINEOPTION: Game: -moonhelm runs the game MoonHelm + { GAME_VORETOURNAMENT, GAME_VORETOURNAMENT, "voretournament", "-voretournament", "Vore Tournament", "Vore_Tournament", "data", NULL, "voretournament", "voretournament" }, // COMMANDLINEOPTION: Game: -voretournament runs the multiplayer game Vore Tournament + { GAME_DOOMBRINGER, GAME_DOOMBRINGER, "doombringer", "-doombringer", "DOOMBRINGER", "DOOMBRINGER", "dbdata", NULL, "doombringer", "doombringer" }, // COMMANDLINEOPTION: Game: -doombringer runs the game DOOMBRINGER ++{ GAME_WRATH, GAME_WRATH, "wrath", "-wrath", "WRATH", "WRATH", "kp1", NULL, "wrath", "WRATH" }, // COMMANDLINEOPTION: Game: -wrath runs WRATH + }; + + static void COM_SetGameType(int index); + void COM_InitGameType (void) + { + char name [MAX_OSPATH]; + int i; + int index = 0; + + #ifdef FORCEGAME + COM_ToLowerString(FORCEGAME, name, sizeof (name)); + #else + // check executable filename for keywords, but do it SMARTLY - only check the last path element + FS_StripExtension(FS_FileWithoutPath(sys.argv[0]), name, sizeof (name)); + COM_ToLowerString(name, name, sizeof (name)); + #endif + for (i = 1;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++) + if (gamemode_info[i].prog_name && gamemode_info[i].prog_name[0] && strstr (name, gamemode_info[i].prog_name)) + index = i; + + // check commandline options for keywords + for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++) + if (COM_CheckParm (gamemode_info[i].cmdline)) + index = i; + + com_startupgamemode = gamemode_info[index].mode; + com_startupgamegroup = gamemode_info[index].group; + COM_SetGameType(index); + } + + void COM_ChangeGameTypeForGameDirs(void) + { + int i; + int index = -1; + // this will not not change the gamegroup + // first check if a base game (single gamedir) matches + for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++) + { + if (gamemode_info[i].group == com_startupgamegroup && !(gamemode_info[i].gamedirname2 && gamemode_info[i].gamedirname2[0])) + { + index = i; + break; + } + } + // now that we have a base game, see if there is a matching derivative game (two gamedirs) + if (fs_numgamedirs) + { + for (i = 0;i < (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]));i++) + { + if (gamemode_info[i].group == com_startupgamegroup && (gamemode_info[i].gamedirname2 && gamemode_info[i].gamedirname2[0]) && !strcasecmp(fs_gamedirs[0], gamemode_info[i].gamedirname2)) + { + index = i; + break; + } + } + } + // we now have a good guess at which game this is meant to be... + if (index >= 0 && gamemode != gamemode_info[index].mode) + COM_SetGameType(index); + } + + static void COM_SetGameType(int index) + { + static char gamenetworkfilternamebuffer[64]; + int i, t; + if (index < 0 || index >= (int)(sizeof (gamemode_info) / sizeof (gamemode_info[0]))) + index = 0; + gamemode = gamemode_info[index].mode; + gamename = gamemode_info[index].gamename; + gamenetworkfiltername = gamemode_info[index].gamenetworkfiltername; + gamedirname1 = gamemode_info[index].gamedirname1; + gamedirname2 = gamemode_info[index].gamedirname2; + gamescreenshotname = gamemode_info[index].gamescreenshotname; + gameuserdirname = gamemode_info[index].gameuserdirname; + + if (gamemode == com_startupgamemode) + { + if((t = COM_CheckParm("-customgamename")) && t + 1 < sys.argc) + gamename = gamenetworkfiltername = sys.argv[t+1]; + if((t = COM_CheckParm("-customgamenetworkfiltername")) && t + 1 < sys.argc) + gamenetworkfiltername = sys.argv[t+1]; + if((t = COM_CheckParm("-customgamedirname1")) && t + 1 < sys.argc) + gamedirname1 = sys.argv[t+1]; + if((t = COM_CheckParm("-customgamedirname2")) && t + 1 < sys.argc) + gamedirname2 = *sys.argv[t+1] ? sys.argv[t+1] : NULL; + if((t = COM_CheckParm("-customgamescreenshotname")) && t + 1 < sys.argc) + gamescreenshotname = sys.argv[t+1]; + if((t = COM_CheckParm("-customgameuserdirname")) && t + 1 < sys.argc) + gameuserdirname = sys.argv[t+1]; + } + + if (gamedirname2 && gamedirname2[0]) + Con_Printf("Game is %s using base gamedirs %s %s", gamename, gamedirname1, gamedirname2); + else + Con_Printf("Game is %s using base gamedir %s", gamename, gamedirname1); + for (i = 0;i < fs_numgamedirs;i++) + { + if (i == 0) + Con_Printf(", with mod gamedirs"); + Con_Printf(" %s", fs_gamedirs[i]); + } + Con_Printf("\n"); + + if (strchr(gamenetworkfiltername, ' ')) + { + char *s; + // if there are spaces in the game's network filter name it would + // cause parse errors in getservers in dpmaster, so we need to replace + // them with _ characters + strlcpy(gamenetworkfilternamebuffer, gamenetworkfiltername, sizeof(gamenetworkfilternamebuffer)); + while ((s = strchr(gamenetworkfilternamebuffer, ' ')) != NULL) + *s = '_'; + gamenetworkfiltername = gamenetworkfilternamebuffer; + } + + Con_Printf("gamename for server filtering: %s\n", gamenetworkfiltername); + } diff --cc common.h index 44f49a1f,15ca90d0..b1e35796 --- a/common.h +++ b/common.h @@@ -298,7 -293,7 +293,8 @@@ typedef enum gamemode_ GAME_STRAPBOMB, // added by motorsep for Urre GAME_MOONHELM, GAME_VORETOURNAMENT, + GAME_DOOMBRINGER, // added by Cloudwalk for kristus + GAME_WRATH, GAME_COUNT } gamemode_t; diff --cc gl_rmain.c index a6aac386,6a69bdd6..c393f69b --- a/gl_rmain.c +++ b/gl_rmain.c @@@ -3186,8 -3097,9 +3137,10 @@@ static void gl_main_start(void R_BuildBlankTextures(); R_BuildNoTexture(); R_BuildWhiteCube(); + #ifndef USE_GLES2 R_BuildNormalizationCube(); + #endif //USE_GLES2 + R_BuildDefaultLUT(); r_texture_fogattenuation = NULL; r_texture_fogheighttexture = NULL; r_texture_gammaramps = NULL; diff --cc svvm_cmds.c index 011bfcdf,871e7386..09369190 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@@ -9,230 -8,230 +9,232 @@@ - const char *vm_sv_extensions = - "BX_WAL_SUPPORT " - "DP_BUTTONCHAT " - "DP_BUTTONUSE " - "DP_CL_LOADSKY " - "DP_CON_ALIASPARAMETERS " - "DP_CON_BESTWEAPON " - "DP_CON_EXPANDCVAR " - "DP_CON_SET " - "DP_CON_SETA " - "DP_CON_STARTMAP " - "DP_COVERAGE " - "DP_CRYPTO " - "DP_CSQC_BINDMAPS " - "DP_CSQC_ENTITYWORLDOBJECT " - "DP_CSQC_ENTITYMODELLIGHT " - "DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET " - "DP_CSQC_MAINVIEW " - "DP_CSQC_MINFPS_QUALITY " - "DP_CSQC_MULTIFRAME_INTERPOLATION " - "DP_CSQC_BOXPARTICLES " - "DP_CSQC_SPAWNPARTICLE " - "DP_CSQC_QUERYRENDERENTITY " - "DP_CSQC_ROTATEMOVES " - "DP_CSQC_SETPAUSE " - "DP_CSQC_V_CALCREFDEF_WIP1 " - "DP_CSQC_V_CALCREFDEF_WIP2 " - "DP_EF_ADDITIVE " - "DP_EF_BLUE " - "DP_EF_DOUBLESIDED " - "DP_EF_DYNAMICMODELLIGHT " - "DP_EF_FLAME " - "DP_EF_FULLBRIGHT " - "DP_EF_NODEPTHTEST " - "DP_EF_NODRAW " - "DP_EF_NOGUNBOB " - "DP_EF_NOSELFSHADOW " - "DP_EF_NOSHADOW " - "DP_EF_RED " - "DP_EF_RESTARTANIM_BIT " - "DP_EF_STARDUST " - "DP_EF_TELEPORT_BIT " - "DP_ENT_ALPHA " - "DP_ENT_COLORMOD " - "DP_ENT_CUSTOMCOLORMAP " - "DP_ENT_EXTERIORMODELTOCLIENT " - "DP_ENT_GLOW " - "DP_ENT_GLOWMOD " - "DP_ENT_LOWPRECISION " - "DP_ENT_SCALE " - "DP_ENT_TRAILEFFECTNUM " - "DP_ENT_VIEWMODEL " - "DP_GFX_EXTERNALTEXTURES " - "DP_GFX_EXTERNALTEXTURES_PERMAP " - "DP_GFX_FOG " - "DP_GFX_MODEL_INTERPOLATION " - "DP_GFX_QUAKE3MODELTAGS " - "DP_GFX_SKINFILES " - "DP_GFX_SKYBOX " - "DP_GFX_FONTS " - "DP_GFX_FONTS_FREETYPE " - "DP_UTF8 " - "DP_FONT_VARIABLEWIDTH " - "DP_HALFLIFE_MAP " - "DP_HALFLIFE_MAP_CVAR " - "DP_HALFLIFE_SPRITE " - "DP_INPUTBUTTONS " - "DP_LIGHTSTYLE_STATICVALUE " - "DP_LITSPRITES " - "DP_LITSUPPORT " - "DP_MONSTERWALK " - "DP_MOVETYPEBOUNCEMISSILE " - "DP_MOVETYPEFLYWORLDONLY " - "DP_MOVETYPEFOLLOW " - "DP_NULL_MODEL " - "DP_QC_ASINACOSATANATAN2TAN " - "DP_QC_AUTOCVARS " - "DP_QC_CHANGEPITCH " - "DP_QC_CMD " - "DP_QC_COPYENTITY " - "DP_QC_CRC16 " - "DP_QC_CVAR_DEFSTRING " - "DP_QC_CVAR_DESCRIPTION " - "DP_QC_CVAR_STRING " - "DP_QC_CVAR_TYPE " - "DP_QC_DIGEST " - "DP_QC_DIGEST_SHA256 " - "DP_QC_EDICT_NUM " - "DP_QC_ENTITYDATA " - "DP_QC_ENTITYSTRING " - "DP_QC_ETOS " - "DP_QC_EXTRESPONSEPACKET " - "DP_QC_FINDCHAIN " - "DP_QC_FINDCHAINFLAGS " - "DP_QC_FINDCHAINFLOAT " - "DP_QC_FINDCHAIN_TOFIELD " - "DP_QC_FINDFLAGS " - "DP_QC_FINDFLOAT " - "DP_QC_FS_SEARCH " - "DP_QC_GETLIGHT " - "DP_QC_GETSURFACE " - "DP_QC_GETSURFACETRIANGLE " - "DP_QC_GETSURFACEPOINTATTRIBUTE " - "DP_QC_GETTAGINFO " - "DP_QC_GETTAGINFO_BONEPROPERTIES " - "DP_QC_GETTIME " - "DP_QC_GETTIME_CDTRACK " - "DP_QC_I18N " - "DP_QC_LOG " - "DP_QC_MINMAXBOUND " - "DP_QC_MULTIPLETEMPSTRINGS " - "DP_QC_NUM_FOR_EDICT " - "DP_QC_RANDOMVEC " - "DP_QC_SINCOSSQRTPOW " - "DP_QC_SPRINTF " - "DP_QC_STRFTIME " - "DP_QC_STRINGBUFFERS " - "DP_QC_STRINGBUFFERS_CVARLIST " - "DP_QC_STRINGBUFFERS_EXT_WIP " - "DP_QC_STRINGCOLORFUNCTIONS " - "DP_QC_STRING_CASE_FUNCTIONS " - "DP_QC_STRREPLACE " - "DP_QC_TOKENIZEBYSEPARATOR " - "DP_QC_TOKENIZE_CONSOLE " - "DP_QC_TRACEBOX " - "DP_QC_TRACETOSS " - "DP_QC_TRACE_MOVETYPE_HITMODEL " - "DP_QC_TRACE_MOVETYPE_WORLDONLY " - "DP_QC_UNLIMITEDTEMPSTRINGS " - "DP_QC_URI_ESCAPE " - "DP_QC_URI_GET " - "DP_QC_URI_POST " - "DP_QC_VECTOANGLES_WITH_ROLL " - "DP_QC_VECTORVECTORS " - "DP_QC_WHICHPACK " - "DP_QUAKE2_MODEL " - "DP_QUAKE2_SPRITE " - "DP_QUAKE3_MAP " - "DP_QUAKE3_MODEL " - "DP_REGISTERCVAR " - "DP_SKELETONOBJECTS " - "DP_SND_DIRECTIONLESSATTNNONE " - "DP_SND_FAKETRACKS " - "DP_SND_SOUND7_WIP1 " - "DP_SND_SOUND7_WIP2 " - "DP_SND_OGGVORBIS " - "DP_SND_SETPARAMS " - "DP_SND_STEREOWAV " - "DP_SND_GETSOUNDTIME " - "DP_VIDEO_DPV " - "DP_VIDEO_SUBTITLES " - "DP_SOLIDCORPSE " - "DP_SPRITE32 " - "DP_SV_BOTCLIENT " - "DP_SV_BOUNCEFACTOR " - "DP_SV_CLIENTCAMERA " - "DP_SV_CLIENTCOLORS " - "DP_SV_CLIENTNAME " - "DP_SV_CMD " - "DP_SV_CUSTOMIZEENTITYFORCLIENT " - "DP_SV_DISABLECLIENTPREDICTION " - "DP_SV_DISCARDABLEDEMO " - "DP_SV_DRAWONLYTOCLIENT " - "DP_SV_DROPCLIENT " - "DP_SV_EFFECT " - "DP_SV_ENTITYCONTENTSTRANSITION " - "DP_SV_MODELFLAGS_AS_EFFECTS " - "DP_SV_MOVETYPESTEP_LANDEVENT " - "DP_SV_NETADDRESS " - "DP_SV_NODRAWTOCLIENT " - "DP_SV_ONENTITYNOSPAWNFUNCTION " - "DP_SV_ONENTITYPREPOSTSPAWNFUNCTION " - "DP_SV_PING " - "DP_SV_PING_PACKETLOSS " - "DP_SV_PLAYERPHYSICS " - "DP_PHYSICS_ODE " - "DP_SV_POINTPARTICLES " - "DP_SV_POINTSOUND " - "DP_SV_PRECACHEANYTIME " - "DP_SV_PRINT " - "DP_SV_PUNCHVECTOR " - "DP_SV_QCSTATUS " - "DP_SV_ROTATINGBMODEL " - "DP_SV_SETCOLOR " - "DP_SV_SHUTDOWN " - "DP_SV_SLOWMO " - "DP_SV_SPAWNFUNC_PREFIX " - "DP_SV_WRITEPICTURE " - "DP_SV_WRITEUNTERMINATEDSTRING " - "DP_TE_BLOOD " - "DP_TE_BLOODSHOWER " - "DP_TE_CUSTOMFLASH " - "DP_TE_EXPLOSIONRGB " - "DP_TE_FLAMEJET " - "DP_TE_PARTICLECUBE " - "DP_TE_PARTICLERAIN " - "DP_TE_PARTICLESNOW " - "DP_TE_PLASMABURN " - "DP_TE_QUADEFFECTS1 " - "DP_TE_SMALLFLASH " - "DP_TE_SPARK " - "DP_TE_STANDARDEFFECTBUILTINS " - "DP_TRACE_HITCONTENTSMASK_SURFACEINFO " - "DP_USERMOVETYPES " - "DP_VIEWZOOM " - "EXT_BITSHIFT " - "FRIK_FILE " - "FTE_CSQC_SKELETONOBJECTS " - "FTE_QC_CHECKPVS " - "FTE_STRINGS " - "KRIMZON_SV_PARSECLIENTCOMMAND " - "NEH_CMD_PLAY2 " - "NEH_RESTOREGAME " - "NEXUIZ_PLAYERMODEL " - "NXQ_GFX_LETTERBOX " - "PRYDON_CLIENTCURSOR " - "TENEBRAE_GFX_DLIGHTS " - "TW_SV_STEPCONTROL " - "ZQ_PAUSE " - "EXT_WRATH " - "EXT_NODEGRAPH " - "DP_RM_CLIPGROUP " - //"EXT_CSQC " // not ready yet - ; + const char *vm_sv_extensions[] = { + "BX_WAL_SUPPORT", + "DP_BUTTONCHAT", + "DP_BUTTONUSE", + "DP_CL_LOADSKY", + "DP_CON_ALIASPARAMETERS", + "DP_CON_BESTWEAPON", + "DP_CON_EXPANDCVAR", + "DP_CON_SET", + "DP_CON_SETA", + "DP_CON_STARTMAP", + "DP_COVERAGE", + "DP_CRYPTO", + "DP_CSQC_BINDMAPS", + "DP_CSQC_ENTITYWORLDOBJECT", + "DP_CSQC_ENTITYMODELLIGHT", + "DP_CSQC_ENTITYTRANSPARENTSORTING_OFFSET", + "DP_CSQC_MAINVIEW", + "DP_CSQC_MINFPS_QUALITY", + "DP_CSQC_MULTIFRAME_INTERPOLATION", + "DP_CSQC_BOXPARTICLES", + "DP_CSQC_SPAWNPARTICLE", + "DP_CSQC_QUERYRENDERENTITY", + "DP_CSQC_ROTATEMOVES", + "DP_CSQC_SETPAUSE", + "DP_CSQC_V_CALCREFDEF_WIP1", + "DP_CSQC_V_CALCREFDEF_WIP2", + "DP_EF_ADDITIVE", + "DP_EF_BLUE", + "DP_EF_DOUBLESIDED", + "DP_EF_DYNAMICMODELLIGHT", + "DP_EF_FLAME", + "DP_EF_FULLBRIGHT", + "DP_EF_NODEPTHTEST", + "DP_EF_NODRAW", + "DP_EF_NOGUNBOB", + "DP_EF_NOSELFSHADOW", + "DP_EF_NOSHADOW", + "DP_EF_RED", + "DP_EF_RESTARTANIM_BIT", + "DP_EF_STARDUST", + "DP_EF_TELEPORT_BIT", + "DP_ENT_ALPHA", + "DP_ENT_COLORMOD", + "DP_ENT_CUSTOMCOLORMAP", + "DP_ENT_EXTERIORMODELTOCLIENT", + "DP_ENT_GLOW", + "DP_ENT_GLOWMOD", + "DP_ENT_LOWPRECISION", + "DP_ENT_SCALE", + "DP_ENT_TRAILEFFECTNUM", + "DP_ENT_VIEWMODEL", + "DP_GFX_EXTERNALTEXTURES", + "DP_GFX_EXTERNALTEXTURES_PERMAP", + "DP_GFX_FOG", + "DP_GFX_MODEL_INTERPOLATION", + "DP_GFX_QUAKE3MODELTAGS", + "DP_GFX_SKINFILES", + "DP_GFX_SKYBOX", + "DP_GFX_FONTS", + "DP_GFX_FONTS_FREETYPE", + "DP_UTF8", + "DP_FONT_VARIABLEWIDTH", + "DP_HALFLIFE_MAP", + "DP_HALFLIFE_MAP_CVAR", + "DP_HALFLIFE_SPRITE", + "DP_INPUTBUTTONS", + "DP_LIGHTSTYLE_STATICVALUE", + "DP_LITSPRITES", + "DP_LITSUPPORT", + "DP_MONSTERWALK", + "DP_MOVETYPEBOUNCEMISSILE", + "DP_MOVETYPEFLYWORLDONLY", + "DP_MOVETYPEFOLLOW", + "DP_NULL_MODEL", + "DP_QC_ASINACOSATANATAN2TAN", + "DP_QC_AUTOCVARS", + "DP_QC_CHANGEPITCH", + "DP_QC_CMD", + "DP_QC_COPYENTITY", + "DP_QC_CRC16", + "DP_QC_CVAR_DEFSTRING", + "DP_QC_CVAR_DESCRIPTION", + "DP_QC_CVAR_STRING", + "DP_QC_CVAR_TYPE", + "DP_QC_DIGEST", + "DP_QC_DIGEST_SHA256", + "DP_QC_EDICT_NUM", + "DP_QC_ENTITYDATA", + "DP_QC_ENTITYSTRING", + "DP_QC_ETOS", + "DP_QC_EXTRESPONSEPACKET", + "DP_QC_FINDCHAIN", + "DP_QC_FINDCHAINFLAGS", + "DP_QC_FINDCHAINFLOAT", + "DP_QC_FINDCHAIN_TOFIELD", + "DP_QC_FINDFLAGS", + "DP_QC_FINDFLOAT", + "DP_QC_FS_SEARCH", + "DP_QC_GETLIGHT", + "DP_QC_GETSURFACE", + "DP_QC_GETSURFACETRIANGLE", + "DP_QC_GETSURFACEPOINTATTRIBUTE", + "DP_QC_GETTAGINFO", + "DP_QC_GETTAGINFO_BONEPROPERTIES", + "DP_QC_GETTIME", + "DP_QC_GETTIME_CDTRACK", + "DP_QC_I18N", + "DP_QC_LOG", + "DP_QC_MINMAXBOUND", + "DP_QC_MULTIPLETEMPSTRINGS", + "DP_QC_NUM_FOR_EDICT", + "DP_QC_RANDOMVEC", + "DP_QC_SINCOSSQRTPOW", + "DP_QC_SPRINTF", + "DP_QC_STRFTIME", + "DP_QC_STRINGBUFFERS", + "DP_QC_STRINGBUFFERS_CVARLIST", + "DP_QC_STRINGBUFFERS_EXT_WIP", + "DP_QC_STRINGCOLORFUNCTIONS", + "DP_QC_STRING_CASE_FUNCTIONS", + "DP_QC_STRREPLACE", + "DP_QC_TOKENIZEBYSEPARATOR", + "DP_QC_TOKENIZE_CONSOLE", + "DP_QC_TRACEBOX", + "DP_QC_TRACETOSS", + "DP_QC_TRACE_MOVETYPE_HITMODEL", + "DP_QC_TRACE_MOVETYPE_WORLDONLY", + "DP_QC_UNLIMITEDTEMPSTRINGS", + "DP_QC_URI_ESCAPE", + "DP_QC_URI_GET", + "DP_QC_URI_POST", + "DP_QC_VECTOANGLES_WITH_ROLL", + "DP_QC_VECTORVECTORS", + "DP_QC_WHICHPACK", + "DP_QUAKE2_MODEL", + "DP_QUAKE2_SPRITE", + "DP_QUAKE3_MAP", + "DP_QUAKE3_MODEL", + "DP_REGISTERCVAR", + "DP_SKELETONOBJECTS", + "DP_SND_DIRECTIONLESSATTNNONE", + "DP_SND_FAKETRACKS", + "DP_SND_SOUND7_WIP1", + "DP_SND_SOUND7_WIP2", + "DP_SND_OGGVORBIS", + "DP_SND_SETPARAMS", + "DP_SND_STEREOWAV", + "DP_SND_GETSOUNDTIME", + "DP_VIDEO_DPV", + "DP_VIDEO_SUBTITLES", + "DP_SOLIDCORPSE", + "DP_SPRITE32", + "DP_SV_BOTCLIENT", + "DP_SV_BOUNCEFACTOR", + "DP_SV_CLIENTCAMERA", + "DP_SV_CLIENTCOLORS", + "DP_SV_CLIENTNAME", + "DP_SV_CMD", + "DP_SV_CUSTOMIZEENTITYFORCLIENT", + "DP_SV_DISABLECLIENTPREDICTION", + "DP_SV_DISCARDABLEDEMO", + "DP_SV_DRAWONLYTOCLIENT", + "DP_SV_DROPCLIENT", + "DP_SV_EFFECT", + "DP_SV_ENTITYCONTENTSTRANSITION", + "DP_SV_MODELFLAGS_AS_EFFECTS", + "DP_SV_MOVETYPESTEP_LANDEVENT", + "DP_SV_NETADDRESS", + "DP_SV_NODRAWTOCLIENT", + "DP_SV_ONENTITYNOSPAWNFUNCTION", + "DP_SV_ONENTITYPREPOSTSPAWNFUNCTION", + "DP_SV_PING", + "DP_SV_PING_PACKETLOSS", + "DP_SV_PLAYERPHYSICS", + "DP_PHYSICS_ODE", + "DP_SV_POINTPARTICLES", + "DP_SV_POINTSOUND", + "DP_SV_PRECACHEANYTIME", + "DP_SV_PRINT", + "DP_SV_PUNCHVECTOR", + "DP_SV_QCSTATUS", + "DP_SV_ROTATINGBMODEL", + "DP_SV_SETCOLOR", + "DP_SV_SHUTDOWN", + "DP_SV_SLOWMO", + "DP_SV_SPAWNFUNC_PREFIX", + "DP_SV_WRITEPICTURE", + "DP_SV_WRITEUNTERMINATEDSTRING", + "DP_TE_BLOOD", + "DP_TE_BLOODSHOWER", + "DP_TE_CUSTOMFLASH", + "DP_TE_EXPLOSIONRGB", + "DP_TE_FLAMEJET", + "DP_TE_PARTICLECUBE", + "DP_TE_PARTICLERAIN", + "DP_TE_PARTICLESNOW", + "DP_TE_PLASMABURN", + "DP_TE_QUADEFFECTS1", + "DP_TE_SMALLFLASH", + "DP_TE_SPARK", + "DP_TE_STANDARDEFFECTBUILTINS", + "DP_TRACE_HITCONTENTSMASK_SURFACEINFO" + "DP_USERMOVETYPES", + "DP_VIEWZOOM", + "EXT_BITSHIFT", + "FRIK_FILE", + "FTE_CSQC_SKELETONOBJECTS", + "FTE_QC_CHECKPVS", + "FTE_STRINGS", + "KRIMZON_SV_PARSECLIENTCOMMAND", + "NEH_CMD_PLAY2", + "NEH_RESTOREGAME", + "NEXUIZ_PLAYERMODEL", + "NXQ_GFX_LETTERBOX", + "PRYDON_CLIENTCURSOR", + "TENEBRAE_GFX_DLIGHTS", + "TW_SV_STEPCONTROL", + "ZQ_PAUSE", ++"EXT_WRATH", ++"EXT_NODEGRAPH", + "DP_RM_CLIPGROUP", + "DP_QC_FS_SEARCH_PACKFILE", + NULL + //"EXT_CSQC" // not ready yet + }; /* =================