mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-26 20:31:30 +00:00
Merge branch 'master' into sdl2
This commit is contained in:
commit
26d2d37d31
17 changed files with 118 additions and 59 deletions
|
@ -1,4 +1,7 @@
|
||||||
Here it is! SRB2 v2.1.7 source code!
|
Here it is! SRB2 v2.1.8 source code!
|
||||||
|
(why do we keep the version number up to date
|
||||||
|
when everything else in this file is hilariously old?
|
||||||
|
- Inuyasha)
|
||||||
|
|
||||||
|
|
||||||
Win32 with Visual C (6SP6+Processor Pack OR 7)
|
Win32 with Visual C (6SP6+Processor Pack OR 7)
|
||||||
|
|
|
@ -158,10 +158,13 @@ void I_SetupMumble(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateMumble(const MumblePos_t *MPos)
|
#ifndef NOMUMBLE
|
||||||
|
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
||||||
{
|
{
|
||||||
(void)MPos;
|
(void)mobj;
|
||||||
|
(void)listener;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void I_OutputMsg(const char *fmt, ...)
|
void I_OutputMsg(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8489,7 +8489,10 @@ static inline int lib_getenum(lua_State *L)
|
||||||
// DYNAMIC variables too!!
|
// DYNAMIC variables too!!
|
||||||
// Try not to add anything that would break netgames or timeattack replays here.
|
// Try not to add anything that would break netgames or timeattack replays here.
|
||||||
// You know, like consoleplayer, displayplayer, secondarydisplayplayer, or gametime.
|
// You know, like consoleplayer, displayplayer, secondarydisplayplayer, or gametime.
|
||||||
if (fastcmp(word,"maptol")) {
|
if (fastcmp(word,"gamemap")) {
|
||||||
|
lua_pushinteger(L, gamemap);
|
||||||
|
return 1;
|
||||||
|
} else if (fastcmp(word,"maptol")) {
|
||||||
lua_pushinteger(L, maptol);
|
lua_pushinteger(L, maptol);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (fastcmp(word,"mariomode")) {
|
} else if (fastcmp(word,"mariomode")) {
|
||||||
|
|
|
@ -175,10 +175,13 @@ void I_SetupMumble(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateMumble(const MumblePos_t *MPos)
|
#ifndef NOMUMBLE
|
||||||
|
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
||||||
{
|
{
|
||||||
(void)MPos;
|
(void)mobj;
|
||||||
|
(void)listener;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocates the base zone memory,
|
// Allocates the base zone memory,
|
||||||
|
|
|
@ -144,8 +144,8 @@ extern FILE *logstream;
|
||||||
#define VERSIONSTRING "Trunk"
|
#define VERSIONSTRING "Trunk"
|
||||||
#else
|
#else
|
||||||
#define VERSION 201 // Game version
|
#define VERSION 201 // Game version
|
||||||
#define SUBVERSION 7 // more precise version number
|
#define SUBVERSION 8 // more precise version number
|
||||||
#define VERSIONSTRING "v2.1.7"
|
#define VERSIONSTRING "v2.1.8"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Modification options
|
// Modification options
|
||||||
|
@ -201,7 +201,7 @@ extern FILE *logstream;
|
||||||
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
// it's only for detection of the version the player is using so the MS can alert them of an update.
|
||||||
// Only set it higher, not lower, obviously.
|
// Only set it higher, not lower, obviously.
|
||||||
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
|
// Note that we use this to help keep internal testing in check; this is why v2.1.0 is not version "1".
|
||||||
#define MODVERSION 12
|
#define MODVERSION 13
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -179,6 +179,9 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
|
||||||
if (option & V_NOSCALESTART)
|
if (option & V_NOSCALESTART)
|
||||||
sdupx = sdupy = 2.0f;
|
sdupx = sdupy = 2.0f;
|
||||||
|
|
||||||
|
if (option & V_SPLITSCREEN)
|
||||||
|
sdupy /= 2.0f;
|
||||||
|
|
||||||
if (option & V_FLIP) // Need to flip both this and sow
|
if (option & V_FLIP) // Need to flip both this and sow
|
||||||
{
|
{
|
||||||
v[0].x = v[3].x = (cx*sdupx-(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1;
|
v[0].x = v[3].x = (cx*sdupx-(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1;
|
||||||
|
|
|
@ -1459,7 +1459,7 @@ static int lib_sSoundPlaying(lua_State *L)
|
||||||
|
|
||||||
static int lib_gBuildMapName(lua_State *L)
|
static int lib_gBuildMapName(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 map = luaL_checkinteger(L, 1);
|
INT32 map = luaL_optinteger(L, 1, gamemap);
|
||||||
//HUDSAFE
|
//HUDSAFE
|
||||||
lua_pushstring(L, G_BuildMapName(map));
|
lua_pushstring(L, G_BuildMapName(map));
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1484,7 +1484,7 @@ static int lib_gExitLevel(lua_State *L)
|
||||||
|
|
||||||
static int lib_gIsSpecialStage(lua_State *L)
|
static int lib_gIsSpecialStage(lua_State *L)
|
||||||
{
|
{
|
||||||
INT32 mapnum = luaL_checkinteger(L, 1);
|
INT32 mapnum = luaL_optinteger(L, 1, gamemap);
|
||||||
//HUDSAFE
|
//HUDSAFE
|
||||||
lua_pushboolean(L, G_IsSpecialStage(mapnum));
|
lua_pushboolean(L, G_IsSpecialStage(mapnum));
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -30,14 +30,21 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
||||||
{
|
{
|
||||||
UINT8 i, argc, flags;
|
UINT8 i, argc, flags;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
I_Assert(gL != NULL);
|
|
||||||
|
// don't use I_Assert here, goto the deny code below
|
||||||
|
// to clean up and kick people who try nefarious exploits
|
||||||
|
// like sending random junk lua commands to crash the server
|
||||||
|
|
||||||
|
if (!gL) goto deny;
|
||||||
lua_getfield(gL, LUA_REGISTRYINDEX, "COM_Command"); // push COM_Command
|
lua_getfield(gL, LUA_REGISTRYINDEX, "COM_Command"); // push COM_Command
|
||||||
I_Assert(lua_istable(gL, -1));
|
if (!lua_istable(gL, -1)) goto deny;
|
||||||
|
|
||||||
argc = READUINT8(*cp);
|
argc = READUINT8(*cp);
|
||||||
READSTRINGN(*cp, buf, 255);
|
READSTRINGN(*cp, buf, 255);
|
||||||
|
strlwr(buf); // must lowercase buffer
|
||||||
lua_getfield(gL, -1, buf); // push command info table
|
lua_getfield(gL, -1, buf); // push command info table
|
||||||
I_Assert(lua_istable(gL, -1));
|
if (!lua_istable(gL, -1)) goto deny;
|
||||||
|
|
||||||
lua_remove(gL, -2); // pop COM_Command
|
lua_remove(gL, -2); // pop COM_Command
|
||||||
|
|
||||||
lua_rawgeti(gL, -1, 2); // push flags from command info table
|
lua_rawgeti(gL, -1, 2); // push flags from command info table
|
||||||
|
@ -47,26 +54,16 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
||||||
flags = (UINT8)lua_tointeger(gL, -1);
|
flags = (UINT8)lua_tointeger(gL, -1);
|
||||||
lua_pop(gL, 1); // pop flags
|
lua_pop(gL, 1); // pop flags
|
||||||
|
|
||||||
if (flags & 1 && playernum != serverplayer && playernum != adminplayer)
|
// requires server/admin and the player is not one of them
|
||||||
{
|
if ((flags & 1) && playernum != serverplayer && playernum != adminplayer)
|
||||||
// not from server or remote admin, must be hacked/buggy client
|
goto deny;
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Illegal lua command received from %s\n"), player_names[playernum]);
|
|
||||||
|
|
||||||
lua_pop(gL, 1); // pop command info table
|
|
||||||
|
|
||||||
if (server)
|
|
||||||
{
|
|
||||||
XBOXSTATIC UINT8 bufn[2];
|
|
||||||
|
|
||||||
bufn[0] = (UINT8)playernum;
|
|
||||||
bufn[1] = KICK_MSG_CON_FAIL;
|
|
||||||
SendNetXCmd(XD_KICK, &bufn, 2);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
lua_rawgeti(gL, -1, 1); // push function from command info table
|
lua_rawgeti(gL, -1, 1); // push function from command info table
|
||||||
I_Assert(lua_isfunction(gL, -1));
|
|
||||||
|
// although honestly this should be true anyway
|
||||||
|
// BUT GODDAMNIT I SAID NO I_ASSERTS SO NO I_ASSERTS IT IS
|
||||||
|
if (!lua_isfunction(gL, -1)) goto deny;
|
||||||
|
|
||||||
lua_remove(gL, -2); // pop command info table
|
lua_remove(gL, -2); // pop command info table
|
||||||
|
|
||||||
LUA_PushUserdata(gL, &players[playernum], META_PLAYER);
|
LUA_PushUserdata(gL, &players[playernum], META_PLAYER);
|
||||||
|
@ -76,6 +73,20 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum)
|
||||||
lua_pushstring(gL, buf);
|
lua_pushstring(gL, buf);
|
||||||
}
|
}
|
||||||
LUA_Call(gL, (int)argc); // argc is 1-based, so this will cover the player we passed too.
|
LUA_Call(gL, (int)argc); // argc is 1-based, so this will cover the player we passed too.
|
||||||
|
return;
|
||||||
|
|
||||||
|
deny:
|
||||||
|
//must be hacked/buggy client
|
||||||
|
lua_settop(gL, 0); // clear stack
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Illegal lua command received from %s\n"), player_names[playernum]);
|
||||||
|
if (server)
|
||||||
|
{
|
||||||
|
XBOXSTATIC UINT8 bufn[2];
|
||||||
|
|
||||||
|
bufn[0] = (UINT8)playernum;
|
||||||
|
bufn[1] = KICK_MSG_CON_FAIL;
|
||||||
|
SendNetXCmd(XD_KICK, &bufn, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrapper for COM_AddCommand commands
|
// Wrapper for COM_AddCommand commands
|
||||||
|
|
|
@ -145,6 +145,7 @@ static int lib_addHook(lua_State *L)
|
||||||
lua_pushvalue(L, 2);
|
lua_pushvalue(L, 2);
|
||||||
lua_rawseti(L, -2, hook);
|
lua_rawseti(L, -2, hook);
|
||||||
}
|
}
|
||||||
|
hooksAvailable[hook/8] |= 1<<(hook%8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +187,6 @@ static int lib_addHook(lua_State *L)
|
||||||
if (subfield)
|
if (subfield)
|
||||||
Z_Free(subfield);
|
Z_Free(subfield);
|
||||||
|
|
||||||
|
|
||||||
hooksAvailable[hook/8] |= 1<<(hook%8);
|
hooksAvailable[hook/8] |= 1<<(hook%8);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,8 +344,16 @@ static int player_set(lua_State *L)
|
||||||
if (hud_running)
|
if (hud_running)
|
||||||
return luaL_error(L, "Do not alter player_t in HUD rendering code!");
|
return luaL_error(L, "Do not alter player_t in HUD rendering code!");
|
||||||
|
|
||||||
if (fastcmp(field,"mo"))
|
if (fastcmp(field,"mo")) {
|
||||||
plr->mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
if (!lua_isnil(L, 3))
|
||||||
|
{
|
||||||
|
plr->mo->player = NULL;
|
||||||
|
plr->mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
|
||||||
|
plr->mo->player = plr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return luaL_error(L, "player.mo should not be nil!");
|
||||||
|
}
|
||||||
else if (fastcmp(field,"cmd"))
|
else if (fastcmp(field,"cmd"))
|
||||||
return NOSET;
|
return NOSET;
|
||||||
else if (fastcmp(field,"playerstate"))
|
else if (fastcmp(field,"playerstate"))
|
||||||
|
|
|
@ -351,16 +351,28 @@ static void GIF_lzw(void)
|
||||||
scrbuf_pos = scrbuf_linebegin;
|
scrbuf_pos = scrbuf_linebegin;
|
||||||
}
|
}
|
||||||
// Just a bit of overflow prevention
|
// Just a bit of overflow prevention
|
||||||
// We leave ourselves 40 bits of space JUST IN CASE the
|
if (gifbwr_bufsize >= 248)
|
||||||
// end of data is right here, as that's EXACTLY how much
|
|
||||||
// the end of data could require at worst
|
|
||||||
if (gifbwr_bufsize >= 250)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (scrbuf_pos > scrbuf_writeend)
|
if (scrbuf_pos > scrbuf_writeend)
|
||||||
{
|
{
|
||||||
|
// 4.15.14 - I failed to account for the possibility that
|
||||||
|
// these two writes could possibly cause minbits increases.
|
||||||
|
// Luckily, we have a guarantee that the first byte CANNOT exceed
|
||||||
|
// the maximum possible code. So, we do a minbits check here...
|
||||||
|
if (giflzw_nextCodeToAssign++ > (1 << gifbwr_bits_min))
|
||||||
|
++gifbwr_bits_min; // out of room, extend minbits
|
||||||
GIF_bwrwrite(giflzw_workingCode);
|
GIF_bwrwrite(giflzw_workingCode);
|
||||||
|
|
||||||
|
// And luckily once more, if the data marker somehow IS at
|
||||||
|
// MAXCODE it doesn't matter, because it still marks the
|
||||||
|
// end of the stream and thus no extending will happen!
|
||||||
|
// But still, we need to check minbits again...
|
||||||
|
if (giflzw_nextCodeToAssign++ > (1 << gifbwr_bits_min))
|
||||||
|
++gifbwr_bits_min; // out of room, extend minbits
|
||||||
GIF_bwrwrite(GIFLZW_DATAEND);
|
GIF_bwrwrite(GIFLZW_DATAEND);
|
||||||
|
|
||||||
|
// Okay, the flush is safe at least.
|
||||||
GIF_bwrflush();
|
GIF_bwrflush();
|
||||||
gif_writeover = 1;
|
gif_writeover = 1;
|
||||||
}
|
}
|
||||||
|
@ -527,7 +539,8 @@ static void GIF_framewrite(void)
|
||||||
while (!gif_writeover)
|
while (!gif_writeover)
|
||||||
{
|
{
|
||||||
GIF_lzw(); // main lzw packing loop
|
GIF_lzw(); // main lzw packing loop
|
||||||
if ((size_t)(p - gifframe_data) + gifbwr_bufsize > gifframe_size)
|
|
||||||
|
if ((size_t)(p - gifframe_data) + gifbwr_bufsize + 1 >= gifframe_size)
|
||||||
{
|
{
|
||||||
INT32 temppos = p - gifframe_data;
|
INT32 temppos = p - gifframe_data;
|
||||||
gifframe_data = Z_Realloc(gifframe_data, (gifframe_size *= 2), PU_STATIC, NULL);
|
gifframe_data = Z_Realloc(gifframe_data, (gifframe_size *= 2), PU_STATIC, NULL);
|
||||||
|
|
|
@ -149,10 +149,13 @@ void I_SetupMumble(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_UpdateMumble(const MumblePos_t *MPos)
|
#ifndef NOMUMBLE
|
||||||
|
void I_UpdateMumble(const mobj_t *mobj, const listener_t listener)
|
||||||
{
|
{
|
||||||
(void)MPos;
|
(void)mobj;
|
||||||
|
(void)listener;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void I_OutputMsg(const char *error, ...)
|
void I_OutputMsg(const char *error, ...)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2865,6 +2865,13 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_BLUA
|
||||||
|
else if (target->flags & MF_ENEMY)
|
||||||
|
{
|
||||||
|
if (LUAh_MobjDamage(target, inflictor, source, damage) || P_MobjWasRemoved(target))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
player = target->player;
|
player = target->player;
|
||||||
|
|
||||||
|
@ -3030,7 +3037,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
}
|
}
|
||||||
|
|
||||||
// Killing dead. Just for kicks.
|
// Killing dead. Just for kicks.
|
||||||
if (cv_killingdead.value && source && source->player && P_Random() < 80)
|
// Require source and inflictor be player. Don't hurt for firing rings.
|
||||||
|
if (cv_killingdead.value && (source && source->player) && (inflictor && inflictor->player) && P_Random() < 80)
|
||||||
P_DamageMobj(source, target, target, 1);
|
P_DamageMobj(source, target, target, 1);
|
||||||
|
|
||||||
// do the damage
|
// do the damage
|
||||||
|
|
14
src/p_mobj.c
14
src/p_mobj.c
|
@ -5883,6 +5883,20 @@ void P_MobjThinker(mobj_t *mobj)
|
||||||
mobj->fuse--;
|
mobj->fuse--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case MT_PLAYER:
|
||||||
|
/// \todo Have the player's dead body completely finish its animation even if they've already respawned.
|
||||||
|
if (!(mobj->flags2 & MF2_DONTDRAW))
|
||||||
|
{
|
||||||
|
if (mobj->player && mobj->player->deadtimer > 3*TICRATE)
|
||||||
|
{ // Go away.
|
||||||
|
/// \todo Actually go ahead and remove mobj completely, and fix any bugs and crashes doing this creates. Chasecam should stop moving, and F12 should never return to it.
|
||||||
|
mobj->momz = 0;
|
||||||
|
mobj->flags2 |= MF2_DONTDRAW;
|
||||||
|
}
|
||||||
|
else // Apply gravity to fall downwards.
|
||||||
|
P_SetObjectMomZ(mobj, -2*FRACUNIT/3, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2325,7 +2325,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
|
|
||||||
if (cv_runscripts.value && mapheaderinfo[gamemap-1]->scriptname[0] != '#')
|
if (cv_runscripts.value && mapheaderinfo[gamemap-1]->scriptname[0] != '#')
|
||||||
{
|
{
|
||||||
if (!mapheaderinfo[gamemap-1]->levelflags & LF_SCRIPTISFILE)
|
if (!(mapheaderinfo[gamemap-1]->levelflags & LF_SCRIPTISFILE))
|
||||||
{
|
{
|
||||||
lumpnum_t lumpnum;
|
lumpnum_t lumpnum;
|
||||||
char newname[9];
|
char newname[9];
|
||||||
|
|
13
src/p_user.c
13
src/p_user.c
|
@ -7772,19 +7772,6 @@ static void P_DeathThink(player_t *player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
P_CalcHeight(player);
|
P_CalcHeight(player);
|
||||||
|
|
||||||
/// \todo Do all this physics stuff in a seperate thinker to be run by the mobj itself, and have your dead body completely finish its animation even if you've already respawned.
|
|
||||||
if (!(player->mo->flags2 & MF2_DONTDRAW))
|
|
||||||
{
|
|
||||||
if (player->deadtimer > 3*TICRATE)
|
|
||||||
{ // Go away.
|
|
||||||
/// \todo Actually go ahead and remove player->mo completely, and fix any bugs and crashes doing this creates. Chasecam should stop moving, and F12 should never return to it.
|
|
||||||
player->mo->momz = 0;
|
|
||||||
player->mo->flags2 |= MF2_DONTDRAW;
|
|
||||||
}
|
|
||||||
else // Apply gravity to fall downwards.
|
|
||||||
P_SetObjectMomZ(player->mo, -2*FRACUNIT/3, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -1214,7 +1214,7 @@
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4B08A954540054247B /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CURRENT_PROJECT_VERSION = 2.1.7;
|
CURRENT_PROJECT_VERSION = 2.1.8;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
NORMALSRB2,
|
NORMALSRB2,
|
||||||
|
@ -1226,7 +1226,7 @@
|
||||||
C01FCF4C08A954540054247B /* Release */ = {
|
C01FCF4C08A954540054247B /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CURRENT_PROJECT_VERSION = 2.1.7;
|
CURRENT_PROJECT_VERSION = 2.1.8;
|
||||||
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
GCC_ENABLE_FIX_AND_CONTINUE = NO;
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
|
Loading…
Reference in a new issue