-#pragma flag off fastarrays // make dp behave with new fteqcc versions. remove when dp bug with fteqcc fastarrays is fixed\r
-\r
-\r
//NOTE: THIS IS AN INTERFACE FILE. DO NOT EDIT.\r
//MODIFYING THIS FILE CAN RESULT IN CRC ERRORS.\r
//YOU HAVE BEEN WARNED.\r
// CSQC_Init : Called every time the CSQC code is initialized (essentially at map load)\r
// Useful for precaching things\r
\r
-void() menu_sub_null =\r
-{\r
-};\r
+float(float, float, float) menu_sub_null_float = { };\r
+void () menu_sub_null_void = { };\r
\r
#ifdef USE_FTE\r
float __engine_check;\r
drawfont = FONT_USER+1;\r
menu_visible = FALSE;\r
menu_show = menu_show_error;\r
- menu_action = menu_sub_null;\r
+ menu_action = menu_sub_null_float;\r
\r
for(i = 0; i < 255; ++i)\r
if(getplayerkey(i, "viewentity") == "")\r
\r
self.enttype = 0;\r
self.classname = "";\r
- self.draw = menu_sub_null;\r
- self.entremove = menu_sub_null;\r
+ self.draw = menu_sub_null_void;\r
+ self.entremove = menu_sub_null_void;\r
// TODO possibly set more stuff to defaults\r
}\r
// CSQC_Ent_Remove : Called when the server requests a SSQC / CSQC entity to be removed. Essentially call remove(self) as well.\r
void (entity e, string m) setmodel = #3;\r
void(entity e, vector min, vector max) setsize = #4;\r
\r
-void () break = #6;\r
float () random = #7;\r
void (entity e, float chan, string samp, float vol, float atten) sound = #8;\r
vector (vector v) normalize = #9;\r
{\r
menu_visible = false;\r
menu_show = menu_show_error;\r
- menu_action = menu_sub_null;\r
+ menu_action = menu_sub_null_float;\r
\r
/*if(ctf_temp_1)\r
strunzone(ctf_temp_1);*/\r
-const string string_null;\r
-\r
// --------------------------------------------------------------------------\r
// MENU Functionality\r
\r
#define DATABUF_NEXT (5*maxclients)\r
\r
void() menu_show_error;\r
-void() menu_sub_null;\r
+float(float, float, float) menu_sub_null_float;\r
+void () menu_sub_null_void;\r
\r
float menu_visible;\r
var void() menu_show;\r
-var float(string text, float handleColors, vector fontSize) stringwidth;\r
+float(string text, float handleColors, vector fontSize) stringwidth;\r
\r
entity players;\r
entity teams;\r
return TRUE;\r
}\r
else if(argv(0) == "records") {\r
- print(records_reply);\r
+ //print(records_reply); I HAVE NO CLUE HOW TO FIX THIS!\r
return TRUE;\r
}\r
else if(argv(0) == "rankings") {\r
return;\r
\r
s = db_get(_MapInfo_Cache_DB_NameToIndex, MapInfo_Map_bspname);\r
- if(!s) // empty string is NOT valid here!\r
+ if(s == "")\r
{\r
i = buf_getsize(_MapInfo_Cache_Buf_IndexToMapData);\r
db_put(_MapInfo_Cache_DB_NameToIndex, MapInfo_Map_bspname, ftos(i));\r
return 0;\r
\r
s = db_get(_MapInfo_Cache_DB_NameToIndex, map);\r
- if(!s)\r
+ if(s == "")\r
return 0;\r
i = stof(s);\r
\r
MapInfo_Map_supportedGametypes = stof(bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i));\r
MapInfo_Map_supportedFeatures = stof(bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i));\r
MapInfo_Map_flags = stof(bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i));\r
+\r
return 1;\r
}\r
\r
string _MapInfo_GlobItem(float i)\r
{\r
string s;\r
+ if(!_MapInfo_globopen)\r
+ return string_null;\r
s = search_getfilename(_MapInfo_globhandle, i);\r
return substring(s, 5, strlen(s) - 9); // without maps/ and .bsp\r
}\r
void MapInfo_Enumerate()\r
{\r
if(_MapInfo_globopen)\r
+ {\r
search_end(_MapInfo_globhandle);\r
+ _MapInfo_globopen = 0;\r
+ }\r
MapInfo_Cache_Invalidate();\r
_MapInfo_globhandle = search_begin("maps/*.bsp", TRUE, TRUE);\r
- _MapInfo_globcount = search_getsize(_MapInfo_globhandle);\r
- _MapInfo_globopen = 1;\r
+ if(_MapInfo_globhandle >= 0)\r
+ {\r
+ _MapInfo_globcount = search_getsize(_MapInfo_globhandle);\r
+ _MapInfo_globopen = 1;\r
+ }\r
+ else\r
+ _MapInfo_globcount = 0;\r
}\r
\r
// filter the info by game type mask (updates MapInfo_count)\r
#define func __merge__##otherfunc \\r
#else \\r
#define func otherfunc \\r
- #endif\r
+ #endif \\r
\r
// this returns a tempstring containing a copy of s with additional \n newlines added, it also replaces \n in the text with a real newline\r
// NOTE: s IS allowed to be a tempstring\r
void wordwrap_sprint(string s, float l);\r
#endif\r
#endif\r
-void wordwrap_cb(string s, float l, void(string) callback)\r
+void wordwrap_cb(string s, float l, void(string) callback);\r
\r
#ifndef SVQC\r
string draw_currentSkin;\r
void get_mi_min_max_texcoords(float mode);\r
#endif\r
\r
+#ifndef GMQCC\r
#define FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(x) void reference_##x() { x = x; }\r
+#else\r
+#define FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(x)\r
+#endif\r
\r
float almost_equals(float a, float b);\r
float almost_in_bounds(float a, float b, float c);\r
#endif\r
\r
// the NULL function\r
-const var void func_null(void); FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(func_null)\r
-const var string string_null;\r
+#ifdef GMQCC\r
+#define null nil\r
+#define func_null nil\r
+#define string_null nil\r
+#else\r
+#define null SUB_null\r
+var void func_null(void);\r
+var string string_null;\r
+#endif\r
float float2range11(float f);\r
float float2range01(float f);\r
\r
METHOD(Button, mousePress, float(entity, vector))\r
METHOD(Button, mouseDrag, float(entity, vector))\r
METHOD(Button, mouseRelease, float(entity, vector))\r
- ATTRIB(Button, onClick, void(entity, entity), SUB_Null)\r
+ ATTRIB(Button, onClick, void(entity, entity), func_null)\r
ATTRIB(Button, onClickEntity, entity, NULL)\r
ATTRIB(Button, src, string, string_null)\r
ATTRIB(Button, srcSuffix, string, string_null)\r
else if(!me.focused && me.playedfocus)\r
me.playedfocus = 0;\r
}\r
-#endif
\ No newline at end of file
+#endif\r
\r
void SUB_Null() { };\r
\r
-void() m_init =\r
+void m_init()\r
{\r
localcmd("maxplayers $menu_maxplayers\n"); // make sure maxplayers is set if we start a game with the map command\r
cvar_set("_menu_alpha", "0");\r
}\r
}\r
\r
-void() m_init_delayed =\r
+void m_init_delayed()\r
{\r
float fh, glob, n, i;\r
string s;\r
m_display(); // delayed menu display\r
};\r
\r
-void(float key, float ascii) m_keyup =\r
+void m_keyup (float key, float ascii)\r
{\r
if(!menuInitialized)\r
return;\r
if(key == K_SHIFT) menuShiftState -= (menuShiftState & S_SHIFT);\r
};\r
\r
-void(float key, float ascii) m_keydown =\r
+void m_keydown (float key, float ascii)\r
{\r
if(!menuInitialized)\r
return;\r
draw_Picture(org, img, isz, '1 1 1', a);\r
}\r
\r
-void(string img, float a, string algn, float force1) drawBackground =\r
+void drawBackground (string img, float a, string algn, float force1)\r
{\r
vector v;\r
float i, l;\r
}\r
}\r
\r
-void() m_draw =\r
+void m_draw()\r
{\r
float t;\r
float realFrametime;\r
frametime = 0;\r
};\r
\r
-void() m_display =\r
+void m_display()\r
{\r
Menu_Active = true;\r
setkeydest(KEY_MENU);\r
main.showNotify(main);\r
};\r
\r
-void() m_hide =\r
+void m_hide()\r
{\r
Menu_Active = false;\r
setkeydest(KEY_GAME);\r
main.hideNotify(main);\r
};\r
\r
-void() m_toggle =\r
+void m_toggle()\r
{\r
if(Menu_Active)\r
m_hide();\r
m_display();\r
};\r
\r
-void() m_shutdown =\r
+void m_shutdown()\r
{\r
entity e;\r
\r
}\r
}\r
\r
-void(string itemname) m_goto =\r
+void m_goto(string itemname)\r
{\r
entity e;\r
if(!menuInitialized)\r
}\r
}\r
\r
-void() m_goto_skin_selector =\r
+void m_goto_skin_selector()\r
{\r
if(!menuInitialized)\r
return;\r
m_goto("skinselector");\r
}\r
\r
-void() m_goto_video_settings =\r
+void m_goto_video_settings()\r
{\r
if(!menuInitialized)\r
return;\r
-#pragma flag off fastarrays // make dp behave with new fteqcc versions. remove when dp bug with fteqcc fastarrays is fixed\r
-\r
//////////////////////////////////////////////////////////\r
// sys globals\r
\r
#define EXTENDS(base) me = spawn##base ();\r
#define METHOD(cname,name,prototype) me.name = name##cname;\r
#define ATTRIB(cname,name,type,val) me.name = val;\r
-#define ATTRIBARRAY(cname,name,type,cnt) me.name = me.name;\r
+#define ATTRIBARRAY(cname,name,type,cnt)\r
#define ENDCLASS(cname) me.instanceOf##cname = 1; me.classname = #cname; return me; }\r
while(<DATA>)\r
{\r
chomp;\r
- if(/^\s*(?:SKINFLOAT|SKINVECTOR)\(([A-Z_]+), ([-'0-9. ]+)\);$/)\r
+ if(/^\s*(?:SKINFLOAT|SKINVECTOR)\(([A-Z_]+), ([-'0-9. ]+)\);$/) #'\r
{\r
printf "%-31s %s\n", $1, $2;\r
}\r
//#define SKINSTRING(name,def) case #name: break\r
#define SKINSTRING(name,def) case #name: SKIN##name = strzone(value); break\r
// I know this leaks memory when skin is read multiple times. Screw it.\r
-#define SKINEND case "": break; case "//": break; default: print("Invalid key in skin file: ", key, "\n"); } }\r
+#define SKINEND case "": break; case "//": break; default: dprint("Invalid key in skin file: ", key, "\n"); } }\r
#include "skin-customizables.inc"\r
#undef SKINEND\r
#undef SKINSTRING\r
METHOD(VoretInputBox, setText, void(entity, string))\r
ATTRIB(VoretInputBox, fontSize, float, SKINFONTSIZE_NORMAL)\r
ATTRIB(VoretInputBox, image, string, SKINGFX_INPUTBOX)\r
- ATTRIB(VoretInputBox, onChange, void(entity, entity), SUB_Null)\r
+ ATTRIB(VoretInputBox, onChange, void(entity, entity), func_null)\r
ATTRIB(VoretInputBox, onChangeEntity, entity, NULL)\r
- ATTRIB(VoretInputBox, onEnter, void(entity, entity), SUB_Null)\r
+ ATTRIB(VoretInputBox, onEnter, void(entity, entity), func_null)\r
ATTRIB(VoretInputBox, onEnterEntity, entity, NULL)\r
ATTRIB(VoretInputBox, marginLeft, float, SKINMARGIN_INPUTBOX_CHARS)\r
ATTRIB(VoretInputBox, marginRight, float, SKINMARGIN_INPUTBOX_CHARS)\r
if(me.text != new)\r
{\r
setTextInputBox(me, new);\r
- me.onChange(me, me.onChangeEntity);\r
+ if(me.onChange)\r
+ me.onChange(me, me.onChangeEntity);\r
}\r
else\r
setTextInputBox(me, new);\r
\r
void antilag_dummy()\r
{\r
- self.antilag_times = 0;\r
- self.antilag_origins = '0 0 0';\r
+ self.antilag_times[0] = 0;\r
+ self.antilag_origins[0] = '0 0 0';\r
}\r
\r
void antilag_record(entity e, float t)\r
}
}
-#ifdef 0
+#if 0
// TODO: This disabled code is not working well and got replaced by custom weapon priorities.
// However, this logic should be refactored and moved to weapons code so each new weapon can be
// evaluated dynamically by bots without updating the "ai" or config files. --mand1nga
.string bot_placenames[MAX_BOT_PLACES];
entity bot_getplace(string placename)
{
+ string s;
entity e;
if(substring(placename, 0, 1) == "@")
{
float i, p;
placename = substring(placename, 1, -1);
- string s, s2;
+ string s2;
for(i = 0; i < self.bot_places_count; ++i)
if(self.(bot_placenames[i]) == placename)
return self.(bot_places[i]);
self.angles_z = 0;\r
makevectors(self.angles); // new forward direction!\r
\r
+ float myspeed, upspeed, steerfactor, accelfactor;\r
if(self.flags & FL_ONGROUND || g_bugrigs_air_steering)\r
{\r
- float myspeed, upspeed, steerfactor, accelfactor;\r
-\r
myspeed = self.velocity * v_forward;\r
upspeed = self.velocity * v_up;\r
\r
\r
// FLOOD CONTROL\r
flood = 0;\r
+ var .float flood_field;\r
if(floodcontrol)\r
{\r
float flood_spl;\r
float flood_burst;\r
float flood_lmax;\r
- var .float flood_field;\r
float lines;\r
if(privatesay)\r
{\r
}\r
}\r
\r
- if (timeoutStatus == 2) //when game is paused, no flood protection\r
- source.flood_field = flood = 0;\r
+ if (timeoutStatus == 2) { //when game is paused, no flood protection\r
+ source.flood_field = 0;\r
+ flood = 0;\r
+ }\r
\r
if(flood == 2)\r
{\r
self.skin_for_playersound = self.skin;\r
ClearPlayerSounds();\r
LoadPlayerSounds("sound/player/default.sounds", 1);\r
- if not(LoadPlayerSounds(strcat(self.model, "_", ftos(self.skin), ".", "sounds"), 0))\r
- LoadPlayerSounds(strcat(self.model, ".", "sounds"), 0);\r
+ LoadPlayerSounds(strcat(self.model, "_", ftos(self.skin), ".", "sounds"), 0);\r
+ LoadPlayerSounds(strcat(self.model, ".", "sounds"), 0);\r
}\r
\r
void GlobalSound(string sample, float chan, float voicetype, float vol)\r
void func_breakable_behave_destroyed()\r
{\r
self.health = self.max_health;\r
- self.takedamage = DAMAGE_NO;\r
- self.event_damage = SUB_Null;\r
+ #ifndef GMQCC\r
+ self.event_damage = SUB_Null;\r
+ self.takedamage = DAMAGE_NO;\r
+ #else\r
+ // GMQCCs NIL keyword is the BOMB!\r
+ self.event_damage = nil;\r
+ self.takedamage = nil;\r
+ #endif\r
self.state = 1;\r
setsize(self, '0 0 0', '0 0 0');\r
func_breakable_colormod();\r
}\r
return 1;\r
};\r
+#endif\r
string GetMapname();\r
string GetGametype();\r
void GotoNextMap();\r
-void ShuffleMaplist()\r
+void ShuffleMaplist();\r
float() DoNextMapOverride;\r
\r
void SetDefaultAlpha()\r
.float siren_time; // time delay the siren\r
//.float stuff_time; // time delay to stuffcmd a cvar\r
\r
-float test[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
+// sigh GMQCC needs to implement this yet.\r
+float test[17]\r
+#ifndef GMQCC\r
+= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
+#else\r
+;\r
+#endif\r
+\r
//test[0] = status of dropped keys, test[1 - 16] = player #\r
//replace 17 with cvar("maxplayers") or similar !!!!!!!!!\r
//for(i = 0; i < maxplayers; ++i)\r
#define STR_ITEM_KH_KEY "item_kh_key"\r
typedef void(void) kh_Think_t;\r
var kh_Think_t kh_Controller_Thinkfunc;\r
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func)\r
-void kh_Key_Remove(entity key)\r
+void kh_Controller_SetThink(float t, string msg, kh_Think_t func);\r
+void kh_Key_Remove(entity key);\r
}\r
}\r
\r
-vector PL_VIEW_OFS;\r
-vector PL_MIN;\r
-vector PL_MAX;\r
-vector PL_CROUCH_VIEW_OFS;\r
-vector PL_CROUCH_MIN;\r
-vector PL_CROUCH_MAX;\r
+// you need an init method to set them somewhere\r
+// default values simply become constant\r
+const vector PL_VIEW_OFS;\r
+const vector PL_MIN;\r
+const vector PL_MAX;\r
+const vector PL_CROUCH_VIEW_OFS;\r
+const vector PL_CROUCH_MIN;\r
+const vector PL_CROUCH_MAX;\r
\r
float spawnpoint_nag;\r
void relocate_spawnpoint()\r
{\r
+ // this code wouldn't work anyways, they're constants by having default assignment in a header.\r
+#if 0\r
PL_VIEW_OFS = stov(cvar_string("sv_player_viewoffset"));\r
PL_MIN = stov(cvar_string("sv_player_mins"));\r
PL_MAX = stov(cvar_string("sv_player_maxs"));\r
PL_CROUCH_VIEW_OFS = stov(cvar_string("sv_player_crouch_viewoffset"));\r
PL_CROUCH_MIN = stov(cvar_string("sv_player_crouch_mins"));\r
PL_CROUCH_MAX = stov(cvar_string("sv_player_crouch_maxs"));\r
+#endif\r
\r
// nudge off the floor\r
setorigin(self, self.origin + '0 0 1');\r
self.islinked = FALSE;\r
self.isshielded = FALSE;\r
self.takedamage = DAMAGE_NO; // can't be hurt anymore\r
+#ifndef GMQCC\r
self.event_damage = SUB_Null; // won't do anything if hurt\r
+#else\r
+ self.event_damage = nil;\r
+#endif\r
self.count = 0; // reset counter\r
self.think = onslaught_generator_deaththink; // explosion sequence\r
self.nextthink = time; // start exploding immediately\r
return end;\r
}\r
\r
-vector pathlib_swimnode(vector start,vector end)\r
+vector pathlib_swimnode(vector start,vector end, float /*unused*/)\r
{\r
pathlib_movenode_goodnode = 0;\r
\r
float pathlib_movenode_goodnode;\r
\r
vector pathlib_wateroutnode(vector start, vector end);\r
-vector pathlib_swimnode(vector start, vector end);\r
+vector pathlib_swimnode(vector start, vector end, float /*unused*/);\r
vector pathlib_flynode(vector start, vector end);\r
vector pathlib_walknode(vector start, vector end, float doedge);\r
var vector pathlib_movenode(vector start, vector end, float doedge);\r
-#pragma flag off fastarrays // make dp behave with new fteqcc versions. remove when dp bug with fteqcc fastarrays is fixed\r
#define SVQC\r
\r
// DO NOT modify the contents of this file, or you will risk incompatibility with the game engine.\r
#define ITEM_RESPAWNTIME_INITIAL(i) (ITEM_RESPAWN_TICKS + random() * ((i).respawntime + (i).respawntimejitter - ITEM_RESPAWN_TICKS))\r
// range: 10 .. respawntime + respawntimejitter\r
\r
+#define Item_Func_Null null\r
+\r
floatfield Item_CounterField(float it)\r
{\r
switch(it)\r
e.colormod = '0 0 0';\r
e.glowmod = e.colormod;\r
e.alpha = 0;\r
- e.customizeentityforclient = func_null;\r
+ e.customizeentityforclient = Item_Func_Null;\r
\r
e.spawnshieldtime = 1;\r
}\r
e.colormod = '0 0 0';\r
e.glowmod = e.colormod;\r
e.alpha = 0;\r
- e.customizeentityforclient = func_null;\r
+ e.customizeentityforclient = Item_Func_Null;\r
\r
e.spawnshieldtime = 1;\r
}\r
e.colormod = stov(cvar_string("g_ghost_items_color"));\r
e.glowmod = e.colormod;\r
e.alpha = g_ghost_items;\r
- e.customizeentityforclient = func_null;\r
+ e.customizeentityforclient = Item_Func_Null;\r
\r
e.spawnshieldtime = 1;\r
}\r
e.colormod = stov(cvar_string("g_ghost_items_color"));\r
e.glowmod = e.colormod;\r
e.alpha = 0;\r
- e.customizeentityforclient = func_null;\r
+ e.customizeentityforclient = Item_Func_Null;\r
\r
e.spawnshieldtime = 1;\r
}\r
float SECRET_NO_SHOOT = 8; // only opened by trigger\r
float SECRET_YES_SHOOT = 16; // shootable even if targeted\r
\r
-\r
+// This is a bug in the code .. this is the HACK to work around the bug since casts don't exist yet.\r
+#ifdef GMQCC\r
+void fd_secret_use_core(entity, entity, float, float, vector, vector)\r
+#else\r
+void fd_secret_use();\r
+void fd_secret_use_core() { fd_secret_use(); }\r
void fd_secret_use()\r
+#endif\r
{\r
local float temp;\r
string message_save;\r
sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);\r
};\r
\r
+#ifdef GMQCC\r
+void fd_secret_use() {\r
+ fd_secret_use_core(nil, nil, nil, nil, nil, nil);\r
+}\r
+#endif\r
+\r
// Wait after first movement...\r
void fd_secret_move1()\r
{\r
{\r
self.health = 10000;\r
self.takedamage = DAMAGE_YES;\r
- self.event_damage = fd_secret_use;\r
+ self.event_damage = fd_secret_use_core;\r
}\r
self.oldorigin = self.origin;\r
if (!self.wait)\r
self.light_lev = 0;\r
self.color = '0 0 0';\r
self.style = 0;\r
- self.jumppadsused = world;\r
+ self.jumppadsused[0] = world;\r
self.disableclientprediction = 0;\r
- self.contentstransition = SUB_Null;\r
+ self.contentstransition = null;\r
self.dphitcontentsmask = 0;\r
self.modelflags = 0;\r
- self.attack_finished_for = 0; // why is this even valid? Spiiiiiiiiiiiiiiiiiiiiike!\r
+ self.attack_finished_for[0] = 0; // why is this even valid? Spiiiiiiiiiiiiiiiiiiiiike!\r
self.notsingle = 0;\r
trace_dphittexturename = "";\r
require_spawnfunc_prefix = 1;\r
- self.movetypesteplandevent = SUB_Null;\r
+ self.movetypesteplandevent = null;\r
self.viewzoom = 0;\r
- self.cvar_cl_weaponpriorities = "";\r
- self.scores = 0;\r
- self.teamscores = 0;\r
+ self.cvar_cl_weaponpriorities[0] = "";\r
+ self.scores[0] = 0;\r
+ self.teamscores[0] = 0;\r
gettaginfo_parent = 0;\r
gettaginfo_name = "";\r
gettaginfo_offset = '0 0 0';\r
* Aim functions\r
*/\r
/// Generic aimer guided by self.aim_flags\r
-vector turret_stdproc_aim_generic()\r
+vector turret_stdproc_aim_generic();\r
// Straight line, current location\r
-//vector turret_stdproc_aim_simple()\r
+//vector turret_stdproc_aim_simple();\r
\r
/*\r
* Turret turning & pitch\r
self.customizeentityforclient = SUB_False;\r
self.tur_head.customizeentityforclient = SUB_False;\r
\r
+#ifndef GMQCC\r
self.event_damage = SUB_Null;\r
+#else\r
+ self.event_damage = nil;\r
+#endif\r
self.takedamage = DAMAGE_NO;\r
\r
self.effects = 0;\r
\r
if (self.health <= 0)\r
{\r
+#ifndef GMQCC\r
self.event_damage = SUB_Null;\r
self.tur_head.event_damage = SUB_Null;\r
+#else\r
+ self.event_damage = nil;\r
+ self.tur_head.event_damage = nil;\r
+#endif\r
self.takedamage = DAMAGE_NO;\r
self.nextthink = time;\r
self.think = turret_stdproc_die;\r
void W_PrepareExplosionByDamage(entity attacker, void() explode)\r
{\r
self.takedamage = DAMAGE_NO;\r
- self.event_damage = SUB_Null;\r
+ self.event_damage = null;\r
self.owner = attacker;\r
\r
// do not explode NOW but in the NEXT FRAME!\r
- 0.8 BUG: Someone's reporting swallow speed doesn't change with the cvar\r
\r
- 0.8: Make some of the foxes (bots) in the campaign male\r
+\r
+- 0.8 BUG: In player.sounds files, "tag female" is used for the male voices too\r
+\r
+- 0.8: Fix all the gmqcc warnings when using the default Xonotic parameters\r