seta crosshair_hittest_showimpact 0 "move the crosshair to the actual impact location if obstructed"
// change color based on special case
-seta crosshair_color_by_health 0 "if enabled, crosshair color will depend on current health"
-seta crosshair_color_per_weapon 1 "when 1, each gun will display the crosshair with a different color"
+seta crosshair_color_special 1 "special color handling for crosshair... 1 = per-weapon crosshair color (see crosshair_per_weapon), 2 = crosshair changes color based on health, 3 = rainbow/random color selection"
+seta crosshair_color_special_rainbow_delay 0.1
+seta crosshair_color_special_rainbow_brightness 20 "color brightness of the random crosshair colors"
// ===============================
set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition"
set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn"
set g_minstagib 0 "enable minstagib"
-set g_minstagib_extralives 2 "how many extra lives you will get per powerup"
+set g_minstagib_extralives 1 "how many extra lives you will get per powerup"
set g_minstagib_ammo_start 10 "starting ammo"
set g_minstagib_ammo_drop 5 "how much ammo you'll get for weapons or cells"
set g_minstagib_invis_alpha 0.15
set g_cdtracks_dontusebydefault "rising-of-the-phoenix"
set menu_cdtrack "rising-of-the-phoenix"
-// maxidle (in seconds): kick players idle for more than that amount of time
-set sv_maxidle 0
-// when sv_maxidle is not 0, assume spectators are idle too
-set sv_maxidle_spectatorsareidle 0
+set sv_maxidle 0 "kick players idle for more than this amount of time in seconds"
+set sv_maxidle_spectatorsareidle 0 "when sv_maxidle is not 0, assume spectators are idle too"
// these entities are not referenced by anything directly, they just represent
// teams and are found by find() when needed
float checkfail[16];
+float rainbow_last_flicker;
+vector rainbow_prev_color;
+
#define BUTTON_3 4
#define BUTTON_4 8
float cl_notice_run();
string wcross_wep = "", wcross_name;
float wcross_scale, wcross_blur;
- if (autocvar_crosshair_per_weapon || autocvar_crosshair_color_per_weapon) {
+ if (autocvar_crosshair_per_weapon || (autocvar_crosshair_color_special == 1))
+ {
e = get_weaponinfo(switchingweapon);
if (e && e.netname != "")
{
}
}
}
- if(wcross_wep != "" && autocvar_crosshair_color_per_weapon)
- wcross_color = stov(cvar_string(strcat("crosshair_", wcross_wep, "_color")));
- else if(autocvar_crosshair_color_by_health)
- {
- float x = getstati(STAT_HEALTH);
- //x = red
- //y = green
- //z = blue
-
- wcross_color_z = 0;
+ //print(sprintf("crosshair style: %s\n", wcross_style));
+ wcross_name = strcat("gfx/crosshair", wcross_style);
- if(x > 200)
- {
- wcross_color_x = 0;
- wcross_color_y = 1;
- }
- else if(x > 150)
- {
- wcross_color_x = 0.4 - (x-150)*0.02 * 0.4;
- wcross_color_y = 0.9 + (x-150)*0.02 * 0.1;
- }
- else if(x > 100)
- {
- wcross_color_x = 1 - (x-100)*0.02 * 0.6;
- wcross_color_y = 1 - (x-100)*0.02 * 0.1;
- wcross_color_z = 1 - (x-100)*0.02;
- }
- else if(x > 50)
+ // MAIN CROSSHAIR COLOR DECISION
+ switch(autocvar_crosshair_color_special)
+ {
+ case 1: // crosshair_color_per_weapon
{
- wcross_color_x = 1;
- wcross_color_y = 1;
- wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+ if(wcross_wep != "")
+ {
+ wcross_color = stov(cvar_string(sprintf("crosshair_%s_color", wcross_wep)));
+ break;
+ }
+ else { goto normalcolor; }
}
- else if(x > 20)
+
+ case 2: // crosshair_color_by_health
{
- wcross_color_x = 1;
- wcross_color_y = (x-20)*90/27/100;
- wcross_color_z = (x-20)*90/27/100 * 0.2;
+ float x = getstati(STAT_HEALTH);
+
+ //x = red
+ //y = green
+ //z = blue
+
+ wcross_color_z = 0;
+
+ if(x > 200)
+ {
+ wcross_color_x = 0;
+ wcross_color_y = 1;
+ }
+ else if(x > 150)
+ {
+ wcross_color_x = 0.4 - (x-150)*0.02 * 0.4;
+ wcross_color_y = 0.9 + (x-150)*0.02 * 0.1;
+ }
+ else if(x > 100)
+ {
+ wcross_color_x = 1 - (x-100)*0.02 * 0.6;
+ wcross_color_y = 1 - (x-100)*0.02 * 0.1;
+ wcross_color_z = 1 - (x-100)*0.02;
+ }
+ else if(x > 50)
+ {
+ wcross_color_x = 1;
+ wcross_color_y = 1;
+ wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
+ }
+ else if(x > 20)
+ {
+ wcross_color_x = 1;
+ wcross_color_y = (x-20)*90/27/100;
+ wcross_color_z = (x-20)*90/27/100 * 0.2;
+ }
+ else
+ {
+ wcross_color_x = 1;
+ wcross_color_y = 0;
+ }
+ break;
}
- else
+
+ case 3: // crosshair_color_rainbow
{
- wcross_color_x = 1;
- wcross_color_y = 0;
+ if(time >= rainbow_last_flicker)
+ {
+ rainbow_prev_color = randomvec() * autocvar_crosshair_color_special_rainbow_brightness;
+ rainbow_last_flicker = time + autocvar_crosshair_color_special_rainbow_delay;
+ }
+ wcross_color = rainbow_prev_color;
+ break;
}
+ :normalcolor
+ default: { wcross_color = stov(autocvar_crosshair_color); break; }
}
- else
- wcross_color = stov(autocvar_crosshair_color);
-
- wcross_name = strcat("gfx/crosshair", wcross_style);
if(autocvar_crosshair_effect_scalefade)
{
if(autocvar_crosshair_hitindication)
{
- vector hitindication_color = ((autocvar_crosshair_color_per_weapon) ? stov(autocvar_crosshair_hitindication_per_weapon_color) : stov(autocvar_crosshair_hitindication_color));
+ vector hitindication_color = ((autocvar_crosshair_color_special == 1) ? stov(autocvar_crosshair_hitindication_per_weapon_color) : stov(autocvar_crosshair_hitindication_color));
if(hitindication_crosshair_time < hit_time)
{
string autocvar_crosshair;
float autocvar_crosshair_alpha;
string autocvar_crosshair_color;
-float autocvar_crosshair_color_per_weapon;
+float autocvar_crosshair_color_special;
+var float autocvar_crosshair_color_special_rainbow_brightness = 2;
+var float autocvar_crosshair_color_special_rainbow_delay = 0.1;
float autocvar_crosshair_dot;
float autocvar_crosshair_dot_alpha;
string autocvar_crosshair_dot_color;
float autocvar_g_waypointsprite_timealphaexponent;
var float autocvar_g_waypointsprite_turrets = TRUE;
var float autocvar_g_waypointsprite_turrets_maxdist = 5000;
-
var float autocvar_hud_cursormode = TRUE;
float autocvar_hud_colorflash_alpha;
float autocvar_hud_configure_checkcollisions;
float autocvar_vid_conwidth;
float autocvar_vid_pixelheight;
float autocvar_viewsize;
-float autocvar_crosshair_color_by_health;
float autocvar_cl_hitsound;
float autocvar_cl_hitsound_antispam_time;
var float autocvar_cl_eventchase_death = 1;
return 0;
}
-float g_minstagib;
float average_accuracy;
vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
{
float fontsize = height * 1/3;
float weapon_height = height * 2/3;
float weapon_width = sbwidth / weapon_cnt;
+ float g_minstagib = 0;
drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness;
MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK, 0, 0, "", CPID_LMS_CAMP, "0 0", _("^F2Don't camp!"), "") \
MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO, 0, 0, "", CPID_MINSTA_FINDAMMO, "1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO_FIRST, 0, 0, "", CPID_MINSTA_FINDAMMO, "1 10", _("^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"), _("^BGGet some ammo! ^F4^COUNT^BG left!")) \
+ MSG_CENTER_NOTIF(1, CENTER_MINSTA_LIVES_REMAINING, 0, 1, "f1", NO_CPID, "0 0", _("^F2Extra lives remaining: ^K1%s"), "") \
+ MSG_CENTER_NOTIF(1, CENTER_MINSTA_SECONDARY, 0, 0, "", NO_CPID, "0 0", _("^BGSecondary fire inflicts no damage!"), "") \
MSG_CENTER_NOTIF(1, CENTER_MOTD, 1, 0, "s1", CPID_MOTD, "-1 0", _("^BG%s"), "") \
MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN, 0, 2, "item_wepname", CPID_NIX, "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "") \
float CSQCModel_Send(entity to, float sf)
{
// some nice flags for CSQCMODEL_IF
- float isplayer = (self.flags & FL_CLIENT);
+ float isplayer = (IS_CLIENT(self));
float islocalplayer = (self == to);
float isnolocalplayer = (isplayer && (self != to));
void CSQCModel_CheckUpdate()
{
// some nice flags for CSQCMODEL_IF
- float isplayer = (self.flags & FL_CLIENT);
+ float isplayer = (IS_CLIENT(self));
float islocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
float isnolocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
METHOD(Label, recalcPositionWithText, void(entity, string))
ATTRIB(Label, isBold, float, 0)
ATTRIB(Label, text, string, string_null)
+ ATTRIB(Label, currentText, string, string_null)
ATTRIB(Label, fontSize, float, 8)
ATTRIB(Label, align, float, 0.5)
ATTRIB(Label, allowCut, float, 0)
void Label_setText(entity me, string txt)
{
me.text = txt;
- me.recalcPos = 1;
+ if(txt != me.currentText)
+ {
+ if(me.currentText)
+ strunzone(me.currentText);
+ me.currentText = strzone(txt);
+ me.recalcPos = 1;
+ }
}
void Label_recalcPositionWithText(entity me, string t)
{
if(me.textEntity)
{
t = me.textEntity.toString(me.textEntity);
- me.recalcPos = 1;
+ if(t != me.currentText)
+ {
+ if(me.currentText)
+ strunzone(me.currentText);
+ me.currentText = strzone(t);
+ me.recalcPos = 1;
+ }
}
else
t = me.text;
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_vampire", _("Vampire")));
+ setDependent(e, "g_minstagib", 0, 0);
me.TR(me);
me.TDempty(me, 0.2);
s = makeXonoticSlider(10, 50, 1, "g_bloodloss");
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_invincible_projectiles", _("Invincible Projectiles")));
+ setDependent(e, "g_minstagib", 0, 0);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_new_toys", _("New Toys")));
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_rocket_flying", _("Rocket Flying")));
+ setDependent(e, "g_minstagib", 0, 0);
me.TR(me);
me.TDempty(me, 0.2);
me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_pinata", _("Piñata")));
me.TR(me);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair color:")));
setDependent(e, "crosshair_enabled", 1, 2);
- me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_per_weapon", string_null, _("Per weapon")));
+ me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_special", "1", _("Per weapon")));
setDependent(e, "crosshair_enabled", 1, 2);
- me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_by_health", string_null, _("By health")));
+ me.TD(me, 1, 1, e = makeXonoticRadioButton(5, "crosshair_color_special", "2", _("By health")));
setDependent(e, "crosshair_enabled", 1, 2);
me.TR(me);
me.TDempty(me, 0.1);
- me.TD(me, 1, 0.9, e = makeXonoticRadioButton(5, string_null, string_null, _("Custom")));
+ me.TD(me, 1, 0.9, e = makeXonoticRadioButton(5, "crosshair_color_special", "0", _("Custom")));
setDependent(e, "crosshair_enabled", 1, 2);
me.TD(me, 2, 2, e = makeXonoticColorpickerString("crosshair_color", "crosshair_color"));
- setDependentAND3(e, "crosshair_color_per_weapon", 0, 0, "crosshair_color_by_health", 0, 0, "crosshair_enabled", 1, 2);
+ setDependentAND(e, "crosshair_color_special", 0, 0, "crosshair_enabled", 1, 2);
me.TR(me);
me.TR(me);
me.TR(me);
e.onClick = SetLanguage_Click;
e.onClickEntity = sk;*/
- me.gotoRC(me, 0, 3.1); me.setFirstColumn(me, me.currentColumn);
+ me.gotoRC(me, 0, 2.85); me.setFirstColumn(me, me.currentColumn);
me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Text language:")));
me.TR(me);
- me.TD(me, 6, 1, sk = makeXonoticLanguageList());
+ me.TD(me, 6, 1.5, sk = makeXonoticLanguageList());
me.TR(me);
me.TR(me);
me.TR(me);
me.TR(me);
me.TR(me);
me.TR(me);
- me.TD(me, 1, 1, e = makeXonoticButton(_("Set language"), '0 0 0'));
+ me.TD(me, 1, 1.5, e = makeXonoticButton(_("Set language"), '0 0 0'));
e.onClick = SetLanguage_Click;
e.onClickEntity = sk;
WriteByte(MSG_ENTITY, ENT_CLIENT_ACCURACY);
a = self.owner;
- if(a.classname == "spectator")
+ if(IS_SPEC(a))
a = a.enemy;
a = a.accuracy;
w = pow(2, mod(w, 24));
a.SendFlags |= w;
FOR_EACH_CLIENT(a)
- if(a.classname == "spectator")
+ if(IS_SPEC(a))
if(a.enemy == e)
a.SendFlags |= w;
}
float accuracy_isgooddamage(entity attacker, entity targ)
{
if(!inWarmupStage)
- if(targ.flags & FL_CLIENT)
+ if(IS_CLIENT(targ))
if(targ.deadflag == DEAD_NO)
if(IsDifferentTeam(attacker, targ))
return TRUE;
entity ent;
for(ent = world; (ent = nextent(ent)); )
{
- if(clienttype(ent) == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(ent))
{
if(ent.team_saved == NUM_TEAM_1)
ent.team_saved = NUM_TEAM_2;
vector ang = '0 0 0';
entity rune;
- if(self.owner.classname != "player" || time < game_starttime)
+ if(!IS_PLAYER(self.owner) || time < game_starttime)
{
rune_respawn();
return;
return;
}
- if(other.classname != "player" || other.health < 1)
+ if(!IS_PLAYER(other) || other.health < 1)
return;
if(self.wait > time)
return; // "notouch" time isn't finished
if(!rune)
return;
- if(rune.owner.classname == "player")
+ if(IS_PLAYER(rune.owner))
{
UpdateFrags(rune.owner, autocvar_g_runematch_pointamt);
}
#define autocvar_bot_suffix cvar_string("bot_suffix")
float autocvar_bot_usemodelnames;
float autocvar_bot_vs_human;
+float autocvar_bot_debug;
float autocvar_bot_debug_tracewalk;
float autocvar_bot_debug_goalstack;
float autocvar_bot_wander_enable;
float autocvar_g_minstagib_ammo_drop;
float autocvar_g_minstagib_extralives;
float autocvar_g_minstagib_speed_highspeed;
+float autocvar_g_minstagib_invis_alpha;
#define autocvar_g_mirrordamage cvar("g_mirrordamage")
#define autocvar_g_mirrordamage_virtual cvar("g_mirrordamage_virtual")
return FALSE;
}
else if(bot_ignore_bots)
- if(clienttype(e) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(e))
return FALSE;
if (!e.takedamage)
return FALSE;
if (e.BUTTON_CHAT)
return FALSE;
- if(g_minstagib)
- if(e.items & IT_STRENGTH)
- return FALSE;
if(e.flags & FL_NOTARGET)
return FALSE;
+
+ checkentity = e;
+ if(MUTATOR_CALLHOOK(BotShouldAttack))
+ return FALSE;
+
return TRUE;
}
prio = 1;
FOR_EACH_CLIENT(p)
{
- if(clienttype(p) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(p))
if(s == p.cleanname)
{
prio = 0;
i = 0;
FOR_EACH_CLIENT(p)
{
- if(clienttype(p) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(p))
if(p.cleanname == name)
++i;
}
{
player_count = player_count + 1;
e.nextplayer = e.chain;
- if (clienttype(e) == CLIENTTYPE_BOT)
+ if (IS_BOT_CLIENT(e))
{
if (prevbot)
prevbot.nextbot = e;
void bot_clientdisconnect()
{
- if (clienttype(self) != CLIENTTYPE_BOT)
+ if not(IS_BOT_CLIENT(self))
return;
bot_clearqueue(self);
if(self.cleanname)
void bot_clientconnect()
{
- if (clienttype(self) != CLIENTTYPE_BOT)
+ if not(IS_BOT_CLIENT(self))
return;
self.bot_preferredcolors = self.clientcolors;
self.bot_nextthink = time - random();
bestplayer = -1;
FOR_EACH_PLAYER(head)
{
- if(clienttype(head) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(head))
bestplayer = max(bestplayer, head.totalfrags - head.totalfrags_lastcheck);
else
bestbot = max(bestbot, head.totalfrags - head.totalfrags_lastcheck);
FOR_EACH_REALCLIENT(head)
{
- if(head.classname == "player" || g_lms || g_arena || head.caplayer == 1)
+ if(IS_PLAYER(head) || g_lms || g_arena || head.caplayer == 1)
++activerealplayers;
++realplayers;
}
}
else
{
- if(self.bot_aimtarg.classname=="player")
+ if(IS_PLAYER(self.bot_aimtarg))
bot_aimdir(self.bot_aimtarg.origin + self.bot_aimtarg.view_ofs - self.origin - self.view_ofs , -1);
}
}
if(self.aistatus & AI_STATUS_ATTACKING)
return;
- if(self.goalcurrent.classname == "player")
+ if(IS_PLAYER(self.goalcurrent))
return;
maxspeed = autocvar_sv_maxspeed;
}
// Don't chase players while using a jump pad
- if(self.goalcurrent.classname=="player" || self.goalstack01.classname=="player")
+ if(IS_PLAYER(self.goalcurrent) || IS_PLAYER(self.goalstack01))
return;
}
}
dodge = dodge * bound(0,0.5+(skill+self.bot_dodgeskill)*0.1,1);
evadelava = evadelava * bound(1,3-(skill+self.bot_dodgeskill),3); //Noobs fear lava a lot and take more distance from it
traceline(self.origin, ( ( self.enemy.absmin + self.enemy.absmax ) * 0.5 ), TRUE, world);
- if(trace_ent.classname == "player")
+ if(IS_PLAYER(trace_ent))
dir = dir * bound(0,(skill+self.bot_dodgeskill)/7,1);
dir = normalize(dir + dodge + evadeobstacle + evadelava);
if ( player.team == self.team )
{
- if ( clienttype(player) != CLIENTTYPE_REAL || discard )
+ if ( !IS_REAL_CLIENT(player) || discard )
continue;
if( d > friend_distance)
+void bot_debug(string input)
+{
+ switch(autocvar_bot_debug)
+ {
+ case 1: dprint(input); break;
+ case 2: print(input); break;
+ }
+}
// rough simulation of walking from one point to another to test if a path
// can be traveled, used for waypoint linking and havocbot
{
vector pointa, pointb;
- // dprint("jetpack ai: evaluating path for ", e.classname,"\n");
+ bot_debug(strcat("jetpack ai: evaluating path for ", e.classname, "\n"));
// Point A
traceline(self.origin, self.origin + '0 0 65535', MOVE_NORMAL, self);
if(trace_fraction==1)
{
- // dprint("jetpack ai: can bridge these two points\n");
+ bot_debug("jetpack ai: can bridge these two points\n");
// Lower the altitude of these points as much as possible
float zdistance, xydistance, cost, t, fuel;
t = zdistance / autocvar_g_jetpack_maxspeed_up;
t += xydistance / autocvar_g_jetpack_maxspeed_side;
fuel = t * autocvar_g_jetpack_fuel * 0.8;
-
- // dprint("jetpack ai: required fuel ", ftos(fuel), " self.ammo_fuel ", ftos(self.ammo_fuel),"\n");
+
+ bot_debug(strcat("jetpack ai: required fuel ", ftos(fuel), " self.ammo_fuel ", ftos(self.ammo_fuel), "\n"));
// enough fuel ?
if(self.ammo_fuel>fuel)
if (navigation_bestrating < f)
{
- // dprint("jetpack path: added goal", e.classname, " (with rating ", ftos(f), ")\n");
+ bot_debug(strcat("jetpack path: added goal ", e.classname, " (with rating ", ftos(f), ")\n"));
navigation_bestrating = f;
navigation_bestgoal = e;
self.navigation_jetpack_goal = e;
e.nearestwaypoint = nwp;
else
{
- dprint("FAILED to find a nearest waypoint to '", e.classname, "' #", etos(e), "\n");
+ bot_debug(strcat("FAILED to find a nearest waypoint to '", e.classname, "' #", etos(e), "\n"));
if(e.flags & FL_ITEM)
e.blacklisted = TRUE;
if(e.blacklisted)
{
- dprint("The entity '", e.classname, "' is going to be excluded from path finding during this match\n");
+ bot_debug(strcat("The entity '", e.classname, "' is going to be excluded from path finding during this match\n"));
return;
}
}
nwp = e.nearestwaypoint;
}
- //dprint("-- checking ", e.classname, " (with cost ", ftos(nwp.wpcost), ")\n");
+ bot_debug(strcat("-- checking ", e.classname, " (with cost ", ftos(nwp.wpcost), ")\n"));
if (nwp)
if (nwp.wpcost < 10000000)
{
//te_wizspike(nwp.wpnearestpoint);
- // dprint(e.classname, " ", ftos(f), "/(1+", ftos((nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint))), "/", ftos(rangebias), ") = ");
+ bot_debug(strcat(e.classname, " ", ftos(f), "/(1+", ftos((nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint))), "/", ftos(rangebias), ") = "));
f = f * rangebias / (rangebias + (nwp.wpcost + vlen(o - nwp.wpnearestpoint)));
- //dprint("considering ", e.classname, " (with rating ", ftos(f), ")\n");
- //dprint(ftos(f));
+ bot_debug(strcat("considering ", e.classname, " (with rating ", ftos(f), ")\n"));
if (navigation_bestrating < f)
{
- // dprint("ground path: added goal ", e.classname, " (with rating ", ftos(f), ")\n");
+ bot_debug(strcat("ground path: added goal ", e.classname, " (with rating ", ftos(f), ")\n"));
navigation_bestrating = f;
navigation_bestgoal = e;
}
}
- //dprint("\n");
}
// adds an item to the the goal stack with the path to a given item
if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
if(tracewalk(self, self.origin, self.mins, self.maxs, (self.goalstack01.absmin + self.goalstack01.absmax) * 0.5, bot_navigation_movemode))
{
- /// dprint("path optimized for ", self.netname, ", removed a goal from the queue\n");
+ bot_debug(strcat("path optimized for ", self.netname, ", removed a goal from the queue\n"));
navigation_poproute();
// TODO this may also be a nice idea to do "early" (e.g. by
// manipulating the vlen() comparisons) to shorten paths in
// HACK: remove players/bots as goals, they can lead a bot to unexpected places (cliffs, lava, etc)
// TODO: rate waypoints near the targetted player at that moment, instead of the player itself
- if(self.goalcurrent.classname=="player")
+ if(IS_PLAYER(self.goalcurrent))
navigation_poproute();
// aid for detecting jump pads better (distance based check fails sometimes)
return;
navigation_routetogoal(navigation_bestgoal, self.origin);
-// dprint("best goal ", self.goalcurrent.classname , "\n");
+ bot_debug(strcat("best goal ", self.goalcurrent.classname , "\n"));
// If the bot got stuck then try to reach the farthest waypoint
if not (self.navigation_hasgoals)
{
if not(self.aistatus & AI_STATUS_STUCK)
{
- dprint(self.netname, " cannot walk to any goal\n");
+ bot_debug(strcat(self.netname, " cannot walk to any goal\n"));
self.aistatus |= AI_STATUS_STUCK;
}
if not(bot_waypoint_queue_owner)
{
- // dprint(self.netname, " sutck, taking over the waypoints queue\n");
+ bot_debug(strcat(self.netname, " sutck, taking over the waypoints queue\n"));
bot_waypoint_queue_owner = self;
bot_waypoint_queue_bestgoal = world;
bot_waypoint_queue_bestgoalrating = 0;
{
// evaluate the next goal on the queue
float d = vlen(self.origin - bot_waypoint_queue_goal.origin);
- // dprint(self.netname, " evaluating ", bot_waypoint_queue_goal.classname, " with distance ", ftos(d), "\n");
+ bot_debug(strcat(self.netname, " evaluating ", bot_waypoint_queue_goal.classname, " with distance ", ftos(d), "\n"));
if(tracewalk(bot_waypoint_queue_goal, self.origin, PL_MIN, PL_MAX, bot_waypoint_queue_goal.origin, bot_navigation_movemode))
{
if( d > bot_waypoint_queue_bestgoalrating)
{
if (bot_waypoint_queue_bestgoal)
{
- dprint(self.netname, " stuck, reachable waypoint found, heading to it\n");
+ bot_debug(strcat(self.netname, " stuck, reachable waypoint found, heading to it\n"));
navigation_routetogoal(bot_waypoint_queue_bestgoal, self.origin);
self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
self.aistatus &~= AI_STATUS_STUCK;
}
else
{
- dprint(self.netname, " stuck, cannot walk to any waypoint at all\n");
+ bot_debug(strcat(self.netname, " stuck, cannot walk to any waypoint at all\n"));
}
bot_waypoint_queue_owner = world;
return;
// build a new queue
- dprint(self.netname, " stuck, scanning reachable waypoints within ", ftos(search_radius)," qu\n");
+ bot_debug(strcat(self.netname, " stuck, scanning reachable waypoints within ", ftos(search_radius)," qu\n"));
entity head, first;
bot_waypoint_queue_goal = first;
else
{
- dprint(self.netname, " stuck, cannot walk to any waypoint at all\n");
+ bot_debug(strcat(self.netname, " stuck, cannot walk to any waypoint at all\n"));
bot_waypoint_queue_owner = world;
}
}
void debugnode(vector node)
{
- if not(self.classname=="player")
+ if not(IS_PLAYER(self))
return;
if(debuglastnode=='0 0 0')
bot = findchainflags(flags, FL_CLIENT);
while (bot)
{
- if(clienttype(bot) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(bot))
if(bot.netname==name)
return bot;
bot = findchainflags(flags, FL_CLIENT);
while (bot)
{
- if(clienttype(bot) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(bot))
{
if(++c==number)
return bot;
head = findchain(classname, "player");
while(head)
{
- if(clienttype(head) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(head))
{
if(head.winning)
won = won + 1;
// dead people cannot cheat
if(self.deadflag != DEAD_NO)
return 0;
- if(gamestart_sv_cheats < 2 && self.classname != "player")
+ if(gamestart_sv_cheats < 2 && !IS_PLAYER(self))
return 0;
// sv_clones
return FALSE;
// if(draggee.model == "")
// return FALSE;
- if(draggee.classname == "spectator")
+ if(IS_SPEC(draggee))
return FALSE;
- if(draggee.classname == "observer")
+ if(IS_OBSERVER(draggee))
return FALSE;
if(draggee.classname == "exteriorweaponentity")
return FALSE;
float Drag_CanDrag(entity dragger)
{
- return (dragger.deadflag == DEAD_NO) || (dragger.classname == "player");
+ return (dragger.deadflag == DEAD_NO) || (IS_PLAYER(dragger));
}
float Drag_IsDragging(entity dragger)
entity e;
e = to;
- if(to.classname == "spectator")
+ if(IS_SPEC(to))
e = to.enemy;
sf = 0;
FOR_EACH_REALCLIENT(e2)
{
if(e2 != e)
- if(e2.classname == "spectator")
+ if(IS_SPEC(e2))
if(e2.enemy == e)
e2.clientdata.SendFlags = 1;
}
error("No spawnpoints for observers?!?\n");
RemoveGrapplingHook(self); // Wazat's Grappling Hook
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
{
msg_entity = self;
WriteByte(MSG_ONE, SVC_SETVIEW);
MUTATOR_CALLHOOK(MakePlayerObserver);
- minstagib_stop_countdown(self);
-
Portal_ClearAll(self);
if(self.alivetime)
void PutClientInServer (void)
{
- if(clienttype(self) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(self))
self.classname = "player";
- else if(clienttype(self) == CLIENTTYPE_REAL)
+ else if(IS_REAL_CLIENT(self))
{
msg_entity = self;
WriteByte(MSG_ONE, SVC_SETVIEW);
if(gameover)
self.classname = "observer";
- if(self.classname == "player") {
+ if(IS_PLAYER(self))
+ {
entity spot, oldself;
float j;
self.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_SOLID;
if(autocvar_g_playerclip_collisions)
self.dphitcontentsmask |= DPCONTENTS_PLAYERCLIP;
- if(clienttype(self) == CLIENTTYPE_BOT && autocvar_g_botclip_collisions)
+ if(IS_BOT_CLIENT(self) && autocvar_g_botclip_collisions)
self.dphitcontentsmask |= DPCONTENTS_BOTCLIP;
self.frags = FRAGS_PLAYER;
if(INDEPENDENT_PLAYERS)
if(autocvar__notarget)
self.flags |= FL_NOTARGET;
self.takedamage = DAMAGE_AIM;
- if(g_minstagib)
- self.effects = EF_FULLBRIGHT;
- else
- self.effects = 0;
+ self.effects = 0;
self.effects |= EF_TELEPORT_BIT | EF_RESTARTANIM_BIT;
self.air_finished = time + 12;
self.dmg = 2;
if (autocvar_g_spawnsound)
soundat(world, self.origin, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
- } else if(self.classname == "observer") {
+ } else if(IS_OBSERVER(self)) {
PutObserverInServer ();
}
}
{
if(self.cnt <= 10)
setmodel(self, strcat("models/sprites/", ftos(self.cnt), ".spr32"));
- if(clienttype(self.owner) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self.owner))
{
if(self.cnt <= 10)
{ Send_Notification(NOTIF_ONE, self.owner, MSG_ANNCE, Announcer_PickNumber(self.cnt)); }
self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam;
}
- if(killtime <= 0 || self.classname != "player" || self.deadflag != DEAD_NO)
+ if(killtime <= 0 || !IS_PLAYER(self) || self.deadflag != DEAD_NO)
{
ClientKill_Now();
}
if(targetteam == 0) // just die
{
self.killindicator.colormod = '0 0 0';
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(self.killindicator.cnt > 0)
Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SUICIDE, self.killindicator.cnt);
}
else if(targetteam == -1) // auto
{
self.killindicator.colormod = '0 1 0';
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(self.killindicator.cnt > 0)
Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_AUTO, self.killindicator.cnt);
}
else if(targetteam == -2) // spectate
{
self.killindicator.colormod = '0.5 0.5 0.5';
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(self.killindicator.cnt > 0)
Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SPECTATE, self.killindicator.cnt);
}
else
{
self.killindicator.colormod = Team_ColorRGB(targetteam);
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(self.killindicator.cnt > 0)
Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, APP_TEAM_NUM_4(targetteam, CENTER_TEAMCHANGE_), self.killindicator.cnt);
}
if(gameover) return;
if(self.player_blocked) return;
if(self.freezetag_frozen) return;
-
+
ClientKill_TeamChange(0);
}
{
float t;
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
print("Warning: ClientConnect, but already connected!\n");
return;
// identify the right forced team
if(autocvar_g_campaign)
{
- if(clienttype(self) == CLIENTTYPE_REAL) // only players, not bots
+ if(IS_REAL_CLIENT(self)) // only players, not bots
{
switch(autocvar_g_campaign_forceteam)
{
PlayerStats_AddEvent(sprintf("kills-%d", self.playerid));
- if(clienttype(self) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(self))
PlayerStats_AddPlayer(self);
if(autocvar_sv_eventlog)
- GameLogEcho(strcat(":join:", ftos(self.playerid), ":", ftos(num_for_edict(self)), ":", ((clienttype(self) == CLIENTTYPE_REAL) ? self.netaddress : "bot"), ":", self.netname));
+ GameLogEcho(strcat(":join:", ftos(self.playerid), ":", ftos(num_for_edict(self)), ":", ((IS_REAL_CLIENT(self)) ? self.netaddress : "bot"), ":", self.netname));
LogTeamchange(self.playerid, self.team, 1);
self.netname_previous = strzone(self.netname);
- if((self.classname == STR_PLAYER && teamplay))
+ if(IS_PLAYER(self) && teamplay)
Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_ENT_4(self, INFO_JOIN_CONNECT_TEAM_), self.netname);
else
Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_CONNECT, self.netname);
self.jointime = time;
self.allowed_timeouts = autocvar_sv_timeout_number;
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
{
if(!autocvar_g_campaign)
{
self.model_randomizer = random();
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
sv_notice_join();
MUTATOR_CALLHOOK(ClientConnect);
if(self.vehicle)
vehicles_exit(VHEF_RELESE);
- if not(self.flags & FL_CLIENT)
+ if not(IS_CLIENT(self))
{
print("Warning: ClientDisconnect without ClientConnect\n");
return;
void play_countdown(float finished, string samp)
{
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(floor(finished - time - frametime) != floor(finished - time))
if(finished - time < 6)
sound (self, CH_INFO, samp, VOL_BASE, ATTN_NORM);
Fire_ApplyDamage(self);
Fire_ApplyEffect(self);
- if (g_minstagib)
- {
- self.effects |= EF_FULLBRIGHT;
-
- if (self.items & IT_STRENGTH)
- {
- play_countdown(self.strength_finished, "misc/poweroff.wav");
- if (time > self.strength_finished)
- {
- self.alpha = default_player_alpha;
- self.exteriorweaponentity.alpha = default_weapon_alpha;
- self.items &~= IT_STRENGTH;
- //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_INVISIBILITY, self.netname);
- Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY);
- }
- }
- else
- {
- if (time < self.strength_finished)
- {
- self.alpha = g_minstagib_invis_alpha;
- self.exteriorweaponentity.alpha = g_minstagib_invis_alpha;
- self.items |= IT_STRENGTH;
- Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname);
- Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY);
- }
- }
-
- if (self.items & IT_INVINCIBLE)
- {
- play_countdown(self.invincible_finished, "misc/poweroff.wav");
- if (time > self.invincible_finished)
- {
- self.items = self.items - (self.items & IT_INVINCIBLE);
- //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_SPEED, self.netname);
- Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED);
- }
- }
- else
- {
- if (time < self.invincible_finished)
- {
- self.items = self.items | IT_INVINCIBLE;
- Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname);
- Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED);
- }
- }
- }
- else // if we're not in minstagib, continue. I added this else to replace the "return" which was here that broke the callhook for this function -- This code is nasty.
+ if not(g_minstagib)
{
if (self.items & IT_STRENGTH)
{
if (self == self.enemy)
return 0;
- if(self.enemy.classname != "player")
+ if not(IS_PLAYER(self.enemy))
return 0;
SpectateCopy(self.enemy);
float currentlyPlaying = 0;
FOR_EACH_REALCLIENT(e)
- if(e.classname == "player" || e.caplayer == 1)
+ if(IS_PLAYER(e) || e.caplayer == 1)
currentlyPlaying += 1;
if(currentlyPlaying < autocvar_g_maxplayers)
* g_maxplayers_spectator_blocktime seconds
*/
void checkSpectatorBlock() {
- if(self.classname == "spectator" || self.classname == "observer") {
+ if(IS_SPEC(self) || IS_OBSERVER(self)) {
if( time > (self.spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) {
Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_QUIT_KICK_SPECTATING);
dropclient(self);
if(self.motd_actived_time == 0)
{
if (autocvar_g_campaign) {
- if ((self.classname == "player" && self.BUTTON_INFO) || (self.classname != "player")) {
+ if ((IS_PLAYER(self) && self.BUTTON_INFO) || (!IS_PLAYER(self))) {
self.motd_actived_time = time;
Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, campaign_message);
}
if (autocvar_g_campaign) {
if (self.BUTTON_INFO)
self.motd_actived_time = time;
- else if ((time - self.motd_actived_time > 2) && self.classname == "player") { // hide it some seconds after BUTTON_INFO has been released
+ else if ((time - self.motd_actived_time > 2) && IS_PLAYER(self)) { // hide it some seconds after BUTTON_INFO has been released
self.motd_actived_time = 0;
Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_MOTD);
}
void PlayerUseKey()
{
- if(self.classname != "player")
+ if not(IS_PLAYER(self))
return;
if(self.vehicle)
self.usekeypressed = self.BUTTON_USE;
}
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
PrintWelcomeMessage();
- if(self.classname == "player") {
+ if(IS_PLAYER(self))
+ {
CheckRules_Player();
player_powerups();
}
- if (g_minstagib)
- minstagib_ammocheck();
-
if (self.deadflag != DEAD_NO)
{
if(self.personal && g_race_qualifying)
if (intermission_running)
IntermissionThink (); // otherwise a button could be missed between
return;
- } else if(self.classname == "observer") {
+ } else if(IS_OBSERVER(self)) {
ObserverThink();
- } else if(self.classname == "spectator") {
+ } else if(IS_SPEC(self)) {
SpectatorThink();
}
float oldspectatee_status;
oldspectatee_status = self.spectatee_status;
- if(self.classname == "spectator")
+ if(IS_SPEC(self))
self.spectatee_status = num_for_edict(self.enemy);
- else if(self.classname == "observer")
+ else if(IS_OBSERVER(self))
self.spectatee_status = num_for_edict(self);
else
self.spectatee_status = 0;
stuffcmd(self, strcat("name ", self.netname, substring(ftos(random()), 2, -1), "\n"));
}
- if(sv_maxidle && frametime) // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
+ if(sv_maxidle > 0 && frametime) // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
+ if(IS_PLAYER(self) || sv_maxidle_spectatorsareidle)
{
if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10
{
- if(self.idlekick_lasttimeleft) { self.idlekick_lasttimeleft = 0; }
+ if(self.idlekick_lasttimeleft)
+ {
+ self.idlekick_lasttimeleft = 0;
+ Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_IDLING);
+ }
}
else
{
//CheckPlayerJump();
- if(self.classname == "player") {
+ if(IS_PLAYER(self)) {
CheckRules_Player();
UpdateChatBubble();
if (self.impulse)
W_PreviousWeapon (2);
break;
case 17:
- if (!g_minstagib)
- W_ThrowWeapon(W_CalculateProjectileVelocity(self.velocity, v_forward * 750, FALSE), '0 0 0', TRUE);
+ W_ThrowWeapon(W_CalculateProjectileVelocity(self.velocity, v_forward * 750, FALSE), '0 0 0', TRUE);
break;
case 18:
W_NextWeapon (1);
WarpZone_PlayerPhysics_FixVAngle();
maxspd_mod = 1;
- if(g_minstagib && (self.items & IT_INVINCIBLE))
- maxspd_mod *= autocvar_g_minstagib_speed_highspeed;
if(self.ballcarried)
if(g_nexball)
maxspd_mod *= autocvar_g_nexball_basketball_carrier_highspeed;
else if(self.specialcommand_pos && (c != substring(specialcommand, self.specialcommand_pos - 1, 1)))
self.specialcommand_pos = 0;
- if(!sv_maxidle_spectatorsareidle || self.movetype == MOVETYPE_WALK)
+ if(sv_maxidle > 0)
{
if(buttons != self.buttons_old || self.movement != self.movement_old || self.v_angle != self.v_angle_old)
self.parm_idlesince = time;
self.punchvector = '0 0 0';
}
- if (clienttype(self) == CLIENTTYPE_BOT)
+ if (IS_BOT_CLIENT(self))
{
if(playerdemo_read())
return;
self.items &~= IT_USING_JETPACK;
- if(self.classname == "player")
+ if(IS_PLAYER(self))
{
if(self.race_penalty)
if(time > self.race_penalty)
if(self.conveyor.state)
self.velocity -= self.conveyor.movedir;
- if(self.classname != "player")
+ if not(IS_PLAYER(self))
{
maxspd_mod = autocvar_sv_spectator_speed_multiplier;
if(!self.spectatorspeed)
}
if(self.flags & FL_ONGROUND)
- if(self.classname == "player") // no fall sounds for observers thank you very much
+ if(IS_PLAYER(self)) // no fall sounds for observers thank you very much
if(self.wasFlying)
{
self.wasFlying = 0;
if(IsFlying(self))
self.wasFlying = 1;
- if(self.classname == "player")
+ if(IS_PLAYER(self))
CheckPlayerJump();
if (self.flags & FL_WATERJUMP )
self.teleport_time = 0;
}
}
- else if (g_bugrigs && self.classname == "player")
+ else if (g_bugrigs && IS_PLAYER(self))
{
RaceCarPhysics();
}
}
}
- if((g_cts || g_race) && self.classname != "observer") {
+ if((g_cts || g_race) && !IS_OBSERVER(self)) {
if(vlen(self.velocity - self.velocity_z * '0 0 1') > speedaward_speed) {
speedaward_speed = vlen(self.velocity - self.velocity_z * '0 0 1');
speedaward_holder = self.netname;
void SpawnThrownWeapon (vector org, float w)
{
- if(g_minstagib)
- if(self.ammo_cells <= 0)
- return;
-
if(g_pinata)
{
float j;
}
else
{
- if(W_IsWeaponThrowable(self.weapon))
- W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
+ if(WEPSET_CONTAINS_EW(self, self.weapon))
+ if(W_IsWeaponThrowable(self.weapon))
+ W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200');
}
}
else
Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
- if (!g_minstagib)
- {
- v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
- take = v_x;
- save = v_y;
- }
- else
- {
- save = 0;
- take = damage;
- }
+
+ v = healtharmor_applydamage(self.armorvalue, autocvar_g_balance_armor_blockpercent, damage);
+ take = v_x;
+ save = v_y;
if(attacker == self)
{
//self.pushltime = 0;
self.istypefrag = 0;
}
- else if(attacker.classname == "player")
+ else if(IS_PLAYER(attacker))
{
self.pusher = attacker;
self.pushltime = time + autocvar_g_maxpushtime;
self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
self.dmg_inflictor = inflictor;
- if(g_ca && self != attacker && attacker.classname == "player")
+ if(g_ca && self != attacker && IS_PLAYER(attacker))
PlayerScore_Add(attacker, SP_SCORE, (damage - excess) * autocvar_g_ca_damage2score_multiplier);
float abot, vbot, awep;
- abot = (clienttype(attacker) == CLIENTTYPE_BOT);
- vbot = (clienttype(self) == CLIENTTYPE_BOT);
+ abot = (IS_BOT_CLIENT(attacker));
+ vbot = (IS_BOT_CLIENT(self));
valid_damage_for_weaponstats = 0;
awep = 0;
- if(vbot || clienttype(self) == CLIENTTYPE_REAL)
- if(abot || clienttype(attacker) == CLIENTTYPE_REAL)
+ if(vbot || IS_REAL_CLIENT(self))
+ if(abot || IS_REAL_CLIENT(attacker))
if(attacker && self != attacker)
if(IsDifferentTeam(self, attacker))
{
Portal_ClearAllLater(self);
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
{
self.fixangle = TRUE;
//msg_entity = self;
// player could have been miraculously resuscitated ;)
// e.g. players in freezetag get frozen, they don't really die
- if(self.health >= 1 || self.classname != "player")
+ if(self.health >= 1 || !IS_PLAYER(self))
return;
// when we get here, player actually dies
msgin = formatmessage(msgin);
- if(source.classname != "player")
+ if not(IS_PLAYER(source))
colorstr = "^0"; // black for spectators
else if(teamplay)
colorstr = Team_ColorCode(source.team);
}
if(!privatesay)
- if(source.classname != "player")
+ if not(IS_PLAYER(source))
{
if not(intermission_running)
if(teamsay || (autocvar_g_chat_nospectators == 1) || (autocvar_g_chat_nospectators == 2 && !(inWarmupStage || gameover)))
{
sprint(source, sourcemsgstr);
dedicated_print(msgstr); // send to server console too
- FOR_EACH_REALCLIENT(head) if(head.classname != "player")
+ FOR_EACH_REALCLIENT(head) if not(IS_PLAYER(head))
if(head != source)
sprint(head, msgstr);
}
if(self.pusher)
{
msg_entity = self;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
}
break;
}
break;
case VOICETYPE_TAUNT:
- if(self.classname == "player")
+ if(IS_PLAYER(self))
if(self.deadflag == DEAD_NO)
animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
if(!sv_taunt)
if(self.pusher)
{
msg_entity = self.pusher;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
{
if(msg_entity.cvar_cl_voice_directional == 1)
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
if(self.pusher)
{
msg_entity = self.pusher;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
{
if(msg_entity.cvar_cl_voice_directional == 1)
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
}
msg_entity = self;
- if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(msg_entity))
soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
}
break;
}
break;
case VOICETYPE_TAUNT:
- if(self.classname == "player")
+ if(IS_PLAYER(self))
if(self.deadflag == DEAD_NO)
animdecide_setaction(self, ANIMACTION_TAUNT, TRUE);
if(!sv_taunt)
lag = ANTILAG_LATENCY(player);
if(lag < 0.001)
lag = 0;
- if(clienttype(player) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(player))
lag = 0; // only antilag for clients
org = player.origin + player.view_ofs;
traceline_antilag_force(player, org, org + screenforward * MAX_SHOT_DISTANCE, MOVE_NORMAL, player, lag);
- if(trace_ent.flags & FL_CLIENT)
+ if(IS_CLIENT(trace_ent))
{
antilag_takeback(trace_ent, time - lag);
hitplot = W_HitPlotNormalizedUntransform(org, trace_ent, screenforward, screenright, screenup, trace_endpos);
.float prevstrengthsoundattempt;
void W_PlayStrengthSound(entity player) // void W_PlayStrengthSound
{
- if((!g_minstagib)
- && (player.items & IT_STRENGTH)
- && ((time > player.prevstrengthsound + autocvar_sv_strengthsound_antispam_time) // prevent insane sound spam
- || (time > player.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)))
+ if((player.items & IT_STRENGTH)
+ && ((time > player.prevstrengthsound + autocvar_sv_strengthsound_antispam_time) // prevent insane sound spam
+ || (time > player.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)))
{
sound(player, CH_TRIGGER, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
player.prevstrengthsound = time;
if (!trace_ent.takedamage)
{
traceline_antilag_force (ent, w_shotorg, w_shotorg + w_shotdir * range, MOVE_NORMAL, ent, ANTILAG_LATENCY(ent));
- if (trace_ent.takedamage && trace_ent.classname == "player")
+ if (trace_ent.takedamage && IS_PLAYER(trace_ent))
{
entity e;
e = trace_ent;
if (ent.cursor_trace_ent) // client was aiming at someone
if (ent.cursor_trace_ent != ent) // just to make sure
if (ent.cursor_trace_ent.takedamage) // and that person is killable
- if (ent.cursor_trace_ent.classname == "player") // and actually a player
+ if (IS_PLAYER(ent.cursor_trace_ent)) // and actually a player
{
// verify that the shot would miss without antilag
// (avoids an issue where guns would always shoot at their origin)
float CL_Weaponentity_CustomizeEntityForClient()
{
self.viewmodelforclient = self.owner;
- if(other.classname == "spectator")
+ if(IS_SPEC(other))
if(other.enemy == self.owner)
self.viewmodelforclient = other;
return TRUE;
if (!f)
{
if (complain)
- if(clienttype(cl) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(cl))
{
play2(cl, "weapons/unavailable.wav");
Send_WeaponComplain (cl, wpn, W_Name(wpn), 0);
if(!self.(self.current_ammo) && self.reload_ammo_min)
if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
{
- if(clienttype(self) == CLIENTTYPE_REAL && self.reload_complain < time)
+ if(IS_REAL_CLIENT(self) && self.reload_complain < time)
{
play2(self, "weapons/unavailable.wav");
sprint(self, strcat("You don't have enough ammo to reload the ^2", W_Name(self.weapon), "\n"));
{
if(argv(1) != "")
{
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
self.version = ((argv(1) == "$gameversion") ? 1 : stof(argv(1)));
{
case CMD_REQUEST_COMMAND:
{
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
- if(self.classname != "player" && !lockteams && !g_arena)
+ if(!IS_PLAYER(self) && !lockteams && !g_arena)
{
if(nJoinAllowed(self))
{
{
case CMD_REQUEST_COMMAND:
{
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
if(inWarmupStage || autocvar_sv_ready_restart || g_race_qualifying == 2)
{
{
if(argv(1) != "")
{
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
if(teamplay)
if not(self.team_forced > 0)
{
case CMD_REQUEST_COMMAND:
{
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
if(g_arena) { return; }
if(g_lms)
}
}
- if(self.classname == "player" && autocvar_sv_spectate == 1)
+ if(IS_PLAYER(self) && autocvar_sv_spectate == 1)
ClientKill_TeamChange(-2); // observe
// in CA, allow a dead player to move to spectators (without that, caplayer!=0 will be moved back to the player list)
// note: if arena game mode is ever done properly, this needs to be removed.
- if(self.caplayer && (self.classname == "spectator" || self.classname == "observer"))
+ if(self.caplayer && (IS_SPEC(self) || IS_OBSERVER(self)))
{
sprint(self, "WARNING: you will spectate in the next round.\n");
self.caplayer = 0;
// verify that the client provided is acceptable for use
float VerifyClientEntity(entity client, float must_be_real, float must_be_bots)
{
- if not(client.flags & FL_CLIENT)
+ if not(IS_CLIENT(client))
return CLIENT_DOESNT_EXIST;
- else if(must_be_real && (clienttype(client) != CLIENTTYPE_REAL))
+ else if(must_be_real && !IS_REAL_CLIENT(client))
return CLIENT_NOT_REAL;
- else if(must_be_bots && (clienttype(client) != CLIENTTYPE_BOT))
+ else if(must_be_bots && !IS_BOT_CLIENT(client))
return CLIENT_NOT_BOT;
return CLIENT_ACCEPTABLE;
else if(inWarmupStage && !g_warmup_allow_timeout) { print_to(caller, "^7Error: You can not call a timeout in warmup-stage."); }
else if(time < game_starttime) { print_to(caller, "^7Error: You can not call a timeout while the map is being restarted."); }
else if(caller && (caller.allowed_timeouts < 1)) { print_to(caller, "^7Error: You already used all your timeout calls for this map."); }
- else if(caller && (caller.classname != "player")) { print_to(caller, "^7Error: You must be a player to call a timeout."); }
+ else if(caller && !IS_PLAYER(caller)) { print_to(caller, "^7Error: You must be a player to call a timeout."); }
else if((autocvar_timelimit) && (last_possible_timeout < time - game_starttime)) { print_to(caller, "^7Error: It is too late to call a timeout now!"); }
else // everything should be okay, proceed with starting the timeout
total_listed_players = 0;
FOR_EACH_CLIENT(tmp_player)
{
- is_bot = (clienttype(tmp_player) == CLIENTTYPE_BOT);
+ is_bot = (IS_BOT_CLIENT(tmp_player));
if(is_bot)
{
// Where are we putting this player?
if(destination == "spec" || destination == "spectator")
{
- if(client.classname != "spectator" && client.classname != "observer")
+ if(!IS_SPEC(client) && !IS_OBSERVER(client))
{
self = client;
PutObserverInServer();
}
else
{
- if(client.classname != "spectator" && client.classname != "observer")
+ if(!IS_SPEC(client) && !IS_OBSERVER(client))
{
if(teamplay)
{
entity plr;
FOR_EACH_CLIENT(plr) //give every spectator <g_maxplayers_spectator_blocktime> seconds time to become a player
{
- if(plr.classname == "spectator" || plr.classname == "observer")
+ if(IS_SPEC(plr) || IS_OBSERVER(plr))
{
plr.spectatortime = time;
Send_Notification(NOTIF_ONE_ONLY, plr, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime);
for(i = 1; i <= maxclients; i += 8)
{
for(f = 0, e = edict_num(i), b = 1; b < 256; b *= 2, e = nextent(e))
- if(clienttype(e) != CLIENTTYPE_REAL || e.ready)
+ if(!IS_REAL_CLIENT(e) || e.ready)
f |= b;
WriteByte(MSG_ENTITY, f);
}
|| ((autocvar_sv_vote_nospectators == 1) && (inWarmupStage || gameover))
|| (autocvar_sv_vote_nospectators == 0));
- float vote_player_count = 0, is_player, notvoters = 0;
+ float vote_player_count = 0, notvoters = 0;
float vote_real_player_count = 0, vote_real_accept_count = 0;
float vote_real_reject_count = 0, vote_real_abstain_count = 0;
float vote_needed_of_voted, final_needed_votes;
// add up all the votes from each connected client
FOR_EACH_REALCLIENT(tmp_player)
{
- is_player = (tmp_player.classname == "player");
-
++vote_player_count;
- if(is_player) { ++vote_real_player_count; }
+ if(IS_PLAYER(tmp_player)) { ++vote_real_player_count; }
switch(tmp_player.vote_selection)
{
- case VOTE_SELECT_REJECT: { ++vote_reject_count; { if(is_player) ++vote_real_reject_count; } break; }
- case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(is_player) ++vote_real_reject_count; } break; }
- case VOTE_SELECT_ABSTAIN: { ++vote_abstain_count; { if(is_player) ++vote_real_abstain_count; } break; }
+ case VOTE_SELECT_REJECT: { ++vote_reject_count; { if(IS_PLAYER(tmp_player)) ++vote_real_reject_count; } break; }
+ case VOTE_SELECT_ACCEPT: { ++vote_accept_count; { if(IS_PLAYER(tmp_player)) ++vote_real_reject_count; } break; }
+ case VOTE_SELECT_ABSTAIN: { ++vote_abstain_count; { if(IS_PLAYER(tmp_player)) ++vote_real_abstain_count; } break; }
default: break;
}
}
else MUTATOR_CALLHOOK(reset_map_global);
for(self = world; (self = nextent(self)); )
- if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(self))
{
if(self.reset)
{
// Waypoints and assault start come LAST
for(self = world; (self = nextent(self)); )
- if(clienttype(self) == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(self))
{
if(self.reset2)
{
if not(autocvar_sv_vote_call || !caller) { print_to(caller, "^1Vote calling is not allowed."); }
else if(!autocvar_sv_vote_gamestart && time < game_starttime) { print_to(caller, "^1Vote calling is not allowed before the match has started."); }
else if(vote_called) { print_to(caller, "^1There is already a vote called."); }
- else if(!spectators_allowed && (caller && (caller.classname != "player"))) { print_to(caller, "^1Only players can call a vote."); }
+ else if(!spectators_allowed && (caller && !IS_PLAYER(caller))) { print_to(caller, "^1Only players can call a vote."); }
else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); }
else if(caller && (time < caller.vote_waittime)) { print_to(caller, strcat("^1You have to wait ^2", ftos(ceil(caller.vote_waittime - time)), "^1 seconds before you can again call a vote.")); }
else if not(VoteCommand_checknasty(vote_command)) { print_to(caller, "^1Syntax error in command, see 'vhelp' for more info."); }
if not(autocvar_sv_vote_master_callable) { print_to(caller, "^1Vote to become vote master is not allowed."); }
else if(vote_called) { print_to(caller, "^1There is already a vote called."); }
- else if(!spectators_allowed && (caller && (caller.classname != "player"))) { print_to(caller, "^1Only players can call a vote."); }
+ else if(!spectators_allowed && (caller && !IS_PLAYER(caller))) { print_to(caller, "^1Only players can call a vote."); }
else if(timeout_status) { print_to(caller, "^1You can not call a vote while a timeout is active."); }
else // everything went okay, continue with creating vote
// Globals
-float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_minstagib_invis_alpha, g_bloodloss;
+float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_bloodloss;
float g_warmup_limit;
float g_warmup_allguns;
float g_warmup_allow_timeout;
o = self.owner;
if(o.deadflag != DEAD_NO)
return FALSE;
- if(o.classname != "player")
+ if not(IS_PLAYER(o))
return FALSE;
if(other == o)
return FALSE;
- if((other.classname == "player") || other.caplayer)
+ if((IS_PLAYER(other)) || other.caplayer)
if(!teamplay || o.team != other.team)
if not (radar_showennemies)
return FALSE;
damage_attacker = attacker;
attacker_save = attacker;
- if(targ.classname == "player")
+ if(IS_PLAYER(targ))
if(targ.hook)
if(targ.hook.aiment)
if(targ.hook.aiment == attacker)
// special rule: gravity bomb does not hit team mates (other than for disconnecting the hook)
if(DEATH_ISWEAPON(deathtype, WEP_HOOK) || DEATH_ISWEAPON(deathtype, WEP_TUBA))
{
- if(targ.classname == "player")
+ if(IS_PLAYER(targ))
if not(IsDifferentTeam(targ, attacker))
{
self = oldself;
}
else
{
- /*
- skill based bot damage? gtfo. (tZork)
- if (targ.classname == "player")
- if (attacker.classname == "player")
- if (!targ.isbot)
- if (attacker.isbot)
- damage = damage * bound(0.1, (skill + 5) * 0.1, 1);
- */
-
// nullify damage if teamplay is on
if(deathtype != DEATH_TELEFRAG)
- if(attacker.classname == "player")
+ if(IS_PLAYER(attacker))
{
- if(targ.classname == "player" && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
+ if(IS_PLAYER(targ) && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
{
damage = 0;
force = '0 0 0';
damage = 0;
else if(autocvar_teamplay_mode == 4)
{
- if(targ.classname == "player" && targ.deadflag == DEAD_NO)
+ if(IS_PLAYER(targ) && targ.deadflag == DEAD_NO)
{
attacker.dmg_team = attacker.dmg_team + damage;
complainteamdamage = attacker.dmg_team - autocvar_g_teamdamage_threshold;
if(complainteamdamage > 0 && !g_ca) // FIXME why is g_ca ruled out here? Why not just g_mirrordamage 0 on CA servers?
mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
mirrorforce = autocvar_g_mirrordamage * vlen(force);
- if(g_minstagib)
- {
- if(autocvar_g_friendlyfire == 0)
- damage = 0;
- }
- else if(g_ca)
+ if(g_ca)
damage = 0;
else
damage = autocvar_g_friendlyfire * damage;
}
}
- if(targ.classname == "player")
- if (g_minstagib)
- {
- if ((deathtype == DEATH_FALL) ||
- (deathtype == DEATH_DROWN) ||
- (deathtype == DEATH_SLIME) ||
- (deathtype == DEATH_LAVA) ||
- (!DEATH_ISWEAPON(deathtype, WEP_LASER) && damage > 0 && damage < 100))
- {
- self = oldself;
- return;
- }
- if(damage > 0)
- damage = 10000;
- if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
- {
- targ.armorvalue -= 1;
- centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue)));
- damage = 0;
- targ.hitsound += 1;
- attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
- }
- if (DEATH_ISWEAPON(deathtype, WEP_LASER))
- {
- damage = 0;
- mirrordamage = 0;
- complainteamdamage = 0;
- if (targ != attacker)
- {
- if ((targ.health >= 1) && (targ.classname == "player"))
- centerprint(attacker, "Secondary fire inflicts no damage!");
- force = '0 0 0';
- // keep mirrorforce
- attacker = targ;
- }
- }
- }
-
if not(DEATH_ISSPECIAL(deathtype))
{
damage *= g_weapondamagefactor;
frag_damage = damage;
frag_force = force;
frag_deathtype = deathtype;
+ frag_mirrordamage = mirrordamage;
MUTATOR_CALLHOOK(PlayerDamage_Calculate);
damage = frag_damage;
+ mirrordamage = frag_mirrordamage;
force = frag_force;
- // apply strength multiplier
- if ((attacker.items & IT_STRENGTH) && !g_minstagib)
+ if not(g_minstagib)
{
- if(targ == attacker)
+ // apply strength multiplier
+ if (attacker.items & IT_STRENGTH)
{
- damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
- force = force * autocvar_g_balance_powerup_strength_selfforce;
- }
- else
- {
- damage = damage * autocvar_g_balance_powerup_strength_damage;
- force = force * autocvar_g_balance_powerup_strength_force;
+ if(targ == attacker)
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_selfdamage;
+ force = force * autocvar_g_balance_powerup_strength_selfforce;
+ }
+ else
+ {
+ damage = damage * autocvar_g_balance_powerup_strength_damage;
+ force = force * autocvar_g_balance_powerup_strength_force;
+ }
}
- }
- // apply invincibility multiplier
- if (targ.items & IT_INVINCIBLE && !g_minstagib)
- damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ // apply invincibility multiplier
+ if (targ.items & IT_INVINCIBLE)
+ damage = damage * autocvar_g_balance_powerup_invincible_takedamage;
+ }
if (targ == attacker)
{
else
victim = targ;
- if(victim.classname == "player" || victim.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+ if(IS_PLAYER(victim) || victim.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
{
if(IsDifferentTeam(victim, attacker))
{
if not(DEATH_ISSPECIAL(deathtype))
{
- if(targ.classname == "player") // don't do this for vehicles
- if(!g_minstagib)
+ if(IS_PLAYER(targ)) // don't do this for vehicles
if(IsFlying(victim))
yoda = 1;
-
- if(g_minstagib)
- if(victim.items & IT_STRENGTH)
- yoda = 1;
}
}
}
// apply push
if (self.damageforcescale)
if (vlen(force))
- if (self.classname != "player" || time >= self.spawnshieldtime || g_midair)
+ if (!IS_PLAYER(self) || time >= self.spawnshieldtime || g_midair)
{
vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
if(self.movetype == MOVETYPE_PHYSICS)
if(mirrordamage > 0 || mirrorforce > 0)
{
attacker = attacker_save;
- if(g_minstagib)
- if(mirrordamage > 0)
- {
- // just lose extra LIVES, don't kill the player for mirror damage
- if(attacker.armorvalue > 0)
- {
- attacker.armorvalue = attacker.armorvalue - 1;
- centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
- attacker.hitsound += 1;
- }
- mirrordamage = 0;
- }
force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE, attacker.origin, force);
if(autocvar_g_throughfloor_debug)
print(sprintf(" steps=%f", total));
- if (targ.classname == "player")
+ if (IS_PLAYER(targ))
total = ceil(bound(autocvar_g_throughfloor_min_steps_player, total, autocvar_g_throughfloor_max_steps_player));
else
total = ceil(bound(autocvar_g_throughfloor_min_steps_other, total, autocvar_g_throughfloor_max_steps_other));
float dps;
float maxtime, mintime, maxdamage, mindamage, maxdps, mindps, totaldamage, totaltime;
- if(e.classname == "player")
+ if(IS_PLAYER(e))
{
if(e.deadflag)
return -1;
return;
for(t = 0, o = e.owner; o.owner && t < 16; o = o.owner, ++t);
- if(clienttype(o) == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(o))
o = e.fire_owner;
// water and slime stop fire
if not(IS_INDEPENDENT_PLAYER(e))
FOR_EACH_PLAYER(other) if(e != other)
{
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(other.deadflag == DEAD_NO)
if not(IS_INDEPENDENT_PLAYER(other))
if(boxesoverlap(e.absmin, e.absmax, other.absmin, other.absmax))
*/
void SUB_VanishOrRemove (entity ent)
{
- if (ent.flags & FL_CLIENT)
+ if (IS_CLIENT(ent))
{
// vanish
ent.alpha = -1;
*/
void SUB_SetFade (entity ent, float when, float fadetime)
{
- //if (ent.flags & FL_CLIENT) // && ent.deadflag != DEAD_NO)
- // return;
- //ent.alpha = 1;
ent.fade_rate = 1/fadetime;
ent.think = SUB_SetFade_Think;
ent.nextthink = when;
// check whether antilagged traces are enabled
if (lag < 0.001)
lag = 0;
- if (clienttype(forent) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(forent))
lag = 0; // only antilag for clients
// change shooter to SOLID_BBOX so the shot can hit corpses
//
// print the message
//
- if (activator.classname == "player" && self.message != "")
+ if (IS_PLAYER(activator) && self.message != "")
{
- if(clienttype(activator) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(activator))
{
centerprint (activator, self.message);
if (self.noise == "")
if (self.classname == "trigger_secret")
{
- if (self.enemy.classname != "player")
+ if not(IS_PLAYER(self.enemy))
return;
found_secrets = found_secrets + 1;
WriteByte (MSG_ALL, SVC_FOUNDSECRET);
if (self.count != 0)
{
- if (activator.classname == "player"
+ if (IS_PLAYER(activator)
&& (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
{
if (self.count >= 4)
return;
}
- if (activator.classname == "player"
+ if (IS_PLAYER(activator)
&& (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
centerprint(activator, "Sequence completed!");
self.enemy = activator;
void trigger_hurt_use()
{
- if(activator.classname == "player")
+ if(IS_PLAYER(activator))
self.enemy = activator;
else
self.enemy = world; // let's just destroy it, if taking over is too much work
entity own;
own = self.enemy;
- if(own.classname != "player")
+ if not(IS_PLAYER(own))
{
own = self;
self.enemy = world; // I still hate you all
void target_speaker_use_off();
void target_speaker_use_activator()
{
- if(clienttype(activator) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(activator))
return;
string snd;
if(substring(self.noise, 0, 1) == "*")
return;
if(vs.message == "")
return;
- if(pl.classname != "player")
+ if not(IS_PLAYER(pl))
return;
if(gameover)
return;
magicear_matched = FALSE;
- dotrigger = ((source.classname == "player") && (source.deadflag == DEAD_NO) && ((ear.radius == 0) || (vlen(source.origin - ear.origin) <= ear.radius)));
+ dotrigger = ((IS_PLAYER(source)) && (source.deadflag == DEAD_NO) && ((ear.radius == 0) || (vlen(source.origin - ear.origin) <= ear.radius)));
domatch = ((ear.spawnflags & 32) || dotrigger);
if not(domatch)
self.nextthink = time + delta;
e = edict_num(self.cnt + 1);
- if(clienttype(e) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(e))
{
WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte(MSG_BROADCAST, TE_CSQC_PINGPLREPORT);
BADCVAR("g_minstagib");
BADCVAR("g_new_toys");
BADCVAR("g_nix");
-
- if(autocvar_g_minstagib)
- {
- BADCVAR("g_grappling_hook");
- BADCVAR("g_jetpack");
- }
+ BADCVAR("g_grappling_hook");
+ BADCVAR("g_jetpack");
+
#undef BADPREFIX
#undef BADCVAR
if(autocvar_g_midair)
s = strcat(s, ":midair");
- // TODO to mutator system
- if(autocvar_g_minstagib)
- s = strcat(s, ":minstagib");
-
// TODO to mutator system
if(autocvar_g_powerups == 0)
s = strcat(s, ":no_powerups");
modname = cvar_string("g_mod_balance");
if(cvar_string("g_mod_config") != cvar_defstring("g_mod_config"))
modname = cvar_string("g_mod_config");
- // weird mutators that deserve to count as mod
- if(autocvar_g_minstagib)
- modname = "MinstaGib";
// extra mutators that deserve to count as mod
MUTATOR_CALLHOOK(SetModname);
&& ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) )
{
self.autoscreenshot = -1;
- if(clienttype(self) == CLIENTTYPE_REAL) { stuffcmd(self, sprintf("\nscreenshot screenshots/autoscreenshot/%s-%s.jpg; echo \"^5A screenshot has been taken at request of the server.\"\n", GetMapname(), strftime(FALSE, "%s"))); }
+ if(IS_REAL_CLIENT(self)) { stuffcmd(self, sprintf("\nscreenshot screenshots/autoscreenshot/%s-%s.jpg; echo \"^5A screenshot has been taken at request of the server.\"\n", GetMapname(), strftime(FALSE, "%s"))); }
return;
}
FOR_EACH_CLIENT(other)
{
- if ((clienttype(other) == CLIENTTYPE_REAL) || (clienttype(other) == CLIENTTYPE_BOT && autocvar_sv_logscores_bots))
+ if ((IS_REAL_CLIENT(other)) || (IS_BOT_CLIENT(other) && autocvar_sv_logscores_bots))
{
s = strcat(":player:see-labels:", GetPlayerScoreString(other, 0), ":");
s = strcat(s, ftos(rint(time - other.jointime)), ":");
- if(other.classname == "player" || g_arena || other.caplayer == 1 || g_lms)
+ if(IS_PLAYER(other) || g_arena || other.caplayer == 1 || g_lms)
s = strcat(s, ftos(other.team), ":");
else
s = strcat(s, "spectator:");
if (e.weaponentity.weaponentity)
e.weaponentity.weaponentity.effects = EF_NODRAW;
}
- if(clienttype(e) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(e))
{
stuffcmd(e, "\nscr_printspeed 1000000\n");
s = autocvar_sv_intermission_cdtrack;
}
}
-void minstagib_stop_countdown(entity e);
/*
go to the next level for deathmatch
only called if a time or frag limit has expired
GameLogClose();
FOR_EACH_PLAYER(other) {
- minstagib_stop_countdown(other);
FixIntermissionClient(other);
if(other.winning)
bprint(other.netname, " ^7wins.\n");
{
other.health = 2342;
other.impulse = 0;
- if(clienttype(other) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(other))
{
msg_entity = other;
WriteByte(MSG_ONE, SVC_FINALE);
float altime;
FOR_EACH_REALCLIENT(self)
{
- if(self.classname == "spectator")
+ if(IS_SPEC(self))
{
if(self.enemy.typehitsound)
self.typehit_time = time;
* Key touch handler.
*/
void item_key_touch(void) {
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
// player already picked up this key
started_delay = FALSE;
// only player may trigger the lock
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
string playername(entity p)
{
string t;
- if (teamplay && !intermission_running && p.classname == "player")
+ if (teamplay && !intermission_running && IS_PLAYER(p))
{
t = Team_ColorCode(p.team);
return strcat(t, strdecolorize(p.netname));
if (g_weaponarena)
{
- g_minstagib = 0; // incompatible
g_pinata = 0; // incompatible
g_weapon_stay = 0; // incompatible
WEPSET_COPY_AA(start_weapons, g_weaponarena_weapons);
start_items |= IT_UNLIMITED_AMMO;
}
- else if (g_minstagib)
- {
- g_pinata = 0; // incompatible
- g_weapon_stay = 0; // incompatible
- g_bloodloss = 0; // incompatible
- start_health = 100;
- start_armorvalue = 0;
- WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
- g_minstagib_invis_alpha = cvar("g_minstagib_invis_alpha");
- start_items |= IT_UNLIMITED_SUPERWEAPONS;
-
- if (g_minstagib_invis_alpha <= 0)
- g_minstagib_invis_alpha = -1;
- }
else
{
for (i = WEP_FIRST; i <= WEP_LAST; ++i)
if(cvar("g_nexball"))
start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT
- if(g_minstagib)
- {
- start_ammo_cells = cvar("g_minstagib_ammo_start");
- start_ammo_fuel = cvar("g_start_ammo_fuel");
- }
- else if(start_items & IT_UNLIMITED_WEAPON_AMMO)
+ if(start_items & IT_UNLIMITED_WEAPON_AMMO)
{
start_ammo_rockets = 999;
start_ammo_shells = 999;
WEPSET_COPY_AA(warmup_start_weapons_default, start_weapons_default);
WEPSET_COPY_AA(warmup_start_weapons_defaultmask, start_weapons_defaultmask);
- if (!g_weaponarena && !g_minstagib && !g_ca)
+ if (!g_weaponarena && !g_ca)
{
warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
string GetGametype(); // g_world.qc
void readlevelcvars(void)
{
- g_minstagib = cvar("g_minstagib");
-
- // load ALL the mutators
- if(cvar("g_dodging"))
- MUTATOR_ADD(mutator_dodging);
- if(cvar("g_spawn_near_teammate"))
- MUTATOR_ADD(mutator_spawn_near_teammate);
- if(cvar("g_physical_items"))
- MUTATOR_ADD(mutator_physical_items);
- if(cvar("g_touchexplode"))
- MUTATOR_ADD(mutator_touchexplode);
- if(!g_minstagib)
- {
- if(cvar("g_invincible_projectiles"))
- MUTATOR_ADD(mutator_invincibleprojectiles);
- if(cvar("g_new_toys"))
- MUTATOR_ADD(mutator_new_toys);
- if(cvar("g_nix"))
- MUTATOR_ADD(mutator_nix);
- if(cvar("g_rocket_flying"))
- MUTATOR_ADD(mutator_rocketflying);
- if(cvar("g_vampire"))
- MUTATOR_ADD(mutator_vampire);
- if(cvar("g_superspectate"))
- MUTATOR_ADD(mutator_superspec);
- }
-
- // is this a mutator? is this a mode?
- if(cvar("g_sandbox"))
- MUTATOR_ADD(sandbox);
-
+ // load mutators
+ #define CHECK_MUTATOR_ADD(mut_cvar,mut_name,dependence) \
+ { if(cvar(mut_cvar) && dependence) { MUTATOR_ADD(mut_name); } }
+
+ CHECK_MUTATOR_ADD("g_dodging", mutator_dodging, 1);
+ CHECK_MUTATOR_ADD("g_spawn_near_teammate", mutator_spawn_near_teammate, 1);
+ CHECK_MUTATOR_ADD("g_physical_items", mutator_physical_items, 1);
+ CHECK_MUTATOR_ADD("g_touchexplode", mutator_touchexplode, 1);
+ CHECK_MUTATOR_ADD("g_minstagib", mutator_minstagib, 1);
+ CHECK_MUTATOR_ADD("g_invincible_projectiles", mutator_invincibleprojectiles, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_new_toys", mutator_new_toys, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_nix", mutator_nix, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_rocket_flying", mutator_rocketflying, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_vampire", mutator_vampire, !cvar("g_minstagib"));
+ CHECK_MUTATOR_ADD("g_superspectate", mutator_superspec, 1);
+ CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1);
+
+ #undef CHECK_MUTATOR_ADD
+
if(cvar("sv_allow_fullbright"))
serverflags |= SERVERFLAG_ALLOW_FULLBRIGHT;
g_bugrigs_speed_ref = cvar("g_bugrigs_speed_ref");
g_bugrigs_speed_pow = cvar("g_bugrigs_speed_pow");
g_bugrigs_steer = cvar("g_bugrigs_steer");
+
+ g_minstagib = cvar("g_minstagib");
sv_clones = cvar("sv_clones");
sv_foginterval = cvar("sv_foginterval");
g_warmup_allguns = cvar("g_warmup_allguns");
g_warmup_allow_timeout = cvar("g_warmup_allow_timeout");
- if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign"))
+ if ((g_race && g_race_qualifying == 2) || g_arena || g_minstagib || g_assault || cvar("g_campaign"))
inWarmupStage = 0; // these modes cannot work together, sorry
g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon");
return TRUE;
// sounds by players can be removed
if (autocvar_bot_sound_monopoly)
- if (clienttype(e) == CLIENTTYPE_REAL)
+ if (IS_REAL_CLIENT(e))
return FALSE;
// anything else may pass
return TRUE;
// appends ", Mutator name" to ret_string for display
// INPUT, OUTPUT:
string ret_string;
+
+MUTATOR_HOOKABLE(CustomizeWaypoint);
+ // called every frame
+ // customizes the waypoint for spectators
+ // INPUT: self = waypoint, other = player, other.enemy = spectator
MUTATOR_HOOKABLE(FilterItem);
// checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields)
float frag_deathtype;
// INPUT, OUTPUT:
float frag_damage;
+ float frag_mirrordamage;
vector frag_force;
MUTATOR_HOOKABLE(PlayerPowerups);
entity other; // weapon info
// IN+OUT
string ret_string;
+
+MUTATOR_HOOKABLE(Item_RespawnCountdown);
+ // called when an item is about to respawn
+ // INPUT+OUTPUT:
+ string item_name;
+ vector item_color;
+
+MUTATOR_HOOKABLE(BotShouldAttack);
+ // called when a bot checks a target to attack
+ // INPUT
+ entity checkentity;
MUTATOR_HOOKABLE(PortalTeleport);
// called whenever a player goes through a portal gun teleport
if(!self.caplayer)
{
self.caplayer = 0.5;
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
sprint(self, "You will join the game in the next round.\n");
}
}
else
return; // do nothing
}
- else if(toucher.classname != "player") // The flag just touched an object, most likely the world
+ else if not(IS_PLAYER(toucher)) // The flag just touched an object, most likely the world
{
if(time > self.wait) // if we haven't in a while, play a sound/effect
{
case FLAG_PASSING:
{
- if((toucher.classname == "player") && (toucher.deadflag == DEAD_NO) && (toucher != self.pass_sender))
+ if((IS_PLAYER(toucher)) && (toucher.deadflag == DEAD_NO) && (toucher != self.pass_sender))
{
if(IsDifferentTeam(toucher, self.pass_sender))
ctf_Handle_Return(self, toucher);
void ctf_Reset()
{
if(self.owner)
- if(self.owner.classname == "player")
+ if(IS_PLAYER(self.owner))
ctf_Handle_Throw(self.owner, world, DROP_RESET);
ctf_RespawnFlag(self);
MUTATOR_HOOKFUNCTION(ctf_PlayerDies)
{
- if((frag_attacker != frag_target) && (frag_attacker.classname == "player") && (frag_target.flagcarried))
+ if((frag_attacker != frag_target) && (IS_PLAYER(frag_target)) && (frag_target.flagcarried))
{
PlayerTeamScore_AddScore(frag_attacker, autocvar_g_ctf_score_kill);
PlayerScore_Add(frag_attacker, SP_CTF_FCKILLS, 1);
while(head) // find the closest acceptable target to pass to
{
- if(head.classname == "player" && head.deadflag == DEAD_NO)
+ if(IS_PLAYER(head) && head.deadflag == DEAD_NO)
if(head != player && !IsDifferentTeam(head, player))
if(!head.speedrunning && !head.vehicle)
{
{
if(autocvar_g_ctf_pass_request && !player.flagcarried && head.flagcarried)
{
- if(clienttype(head) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(head))
{
Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_CTF_PASS_REQUESTING, head.netname);
ctf_Handle_Throw(head, player, DROP_PASS);
void dompointtouch()
{
entity head;
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if (other.health < 1)
return;
if(frag_attacker == frag_target || frag_attacker == world)
{
- if(frag_target.classname == STR_PLAYER)
+ if(IS_PLAYER(frag_target))
Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_SELF);
Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_SELF, frag_target.netname);
}
else
{
- if(frag_target.classname == STR_PLAYER)
+ if(IS_PLAYER(frag_target))
Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_FROZEN, frag_attacker.netname);
- if(frag_attacker.classname == STR_PLAYER)
+ if(IS_PLAYER(frag_attacker))
Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_FREEZETAG_FREEZE, frag_target.netname);
Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_FREEZE, frag_target.netname, frag_attacker.netname);
}
float ka_ballcarrier_waypointsprite_visible_for_player(entity e) // runs on waypoints which are attached to ballcarriers, updates once per frame
{
if(e.ballcarried)
- if(other.classname == "spectator")
+ if(IS_SPEC(other))
return FALSE; // we don't want spectators of the ballcarrier to see the attached waypoint on the top of their screen
// TODO: Make the ballcarrier lack a waypointsprite whenever they have the invisibility powerup
return;
}
if(other.deadflag != DEAD_NO) { return; }
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
{ // The ball just touched an object, most likely the world
pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1);
sound(self, CH_TRIGGER, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
void ka_Reset() // used to clear the ballcarrier whenever the match switches from warmup to normal
{
- if((self.owner) && (self.owner.classname == "player"))
+ if((self.owner) && (IS_PLAYER(self.owner)))
ka_DropEvent(self.owner);
ka_RespawnBall();
MUTATOR_HOOKFUNCTION(ka_Scoring)
{
- if((frag_attacker != frag_target) && (frag_attacker.classname == "player"))
+ if((frag_attacker != frag_target) && (IS_PLAYER(frag_attacker)))
{
if(frag_target.ballcarried) { // add to amount of times killing carrier
PlayerScore_Add(frag_attacker, SP_KEEPAWAY_CARRIERKILLS, 1);
float kh_KeyCarrier_waypointsprite_visible_for_player(entity e) // runs all the time
{
- if(e.classname != "player" || self.team != e.team)
+ if(!IS_PLAYER(e) || self.team != e.team)
if(!kh_tracking_enabled)
return FALSE;
if(vlen(force) <= 0)
return;
if(time > self.pushltime)
- if(attacker.classname == "player")
+ if(IS_PLAYER(attacker))
self.team = attacker.team;
}
// maybe start a shorter countdown?
}
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if(other.deadflag != DEAD_NO)
return;
attacker = world;
if(lostkey.pusher)
if(lostkey.pusher.team != teem)
- if(lostkey.pusher.classname == "player")
+ if(IS_PLAYER(lostkey.pusher))
attacker = lostkey.pusher;
players = keys = 0;
{
if(self == other)
kh_Key_DropAll(self, TRUE);
- else if(other.classname == "player")
+ else if(IS_PLAYER(other))
kh_Key_DropAll(self, FALSE);
else
kh_Key_DropAll(self, TRUE);
self.nextthink = time + autocvar_g_nexball_delay_idle;
return;
}
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if(other.health < 1)
return;
football_touch();
return;
}
- if(!self.cnt && other.classname == "player" && (other != self.nb_dropper || time > self.nb_droptime + autocvar_g_nexball_delay_collect))
+ if(!self.cnt && IS_PLAYER(other) && (other != self.nb_dropper || time > self.nb_droptime + autocvar_g_nexball_delay_collect))
{
if(other.health <= 0)
return;
else
otherteam = 0;
- if((isclient = ball.pusher.flags & FL_CLIENT))
+ if((isclient = IS_CLIENT(ball.pusher)))
pname = ball.pusher.netname;
else
pname = "Someone (?)";
PROJECTILE_TOUCH;
if(attacker.team != other.team || autocvar_g_nexball_basketball_teamsteal)
- if((ball = other.ballcarried) && (attacker.classname == "player"))
+ if((ball = other.ballcarried) && (IS_PLAYER(attacker)))
{
other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
other.flags &~= FL_ONGROUND;
//tracebox(self.origin + self.view_ofs, '-2 -2 -2', '2 2 2', self.origin + self.view_ofs + v_forward * autocvar_g_nexball_safepass_maxdist);
crosshair_trace(self);
if( trace_ent &&
- trace_ent.flags & FL_CLIENT &&
+ IS_CLIENT(trace_ent) &&
trace_ent.deadflag == DEAD_NO &&
trace_ent.team == self.team &&
vlen(trace_ent.origin - self.origin) <= autocvar_g_nexball_safepass_maxdist )
{
// this is protected by a shield, so ignore the damage
if (time > self.pain_finished)
- if (attacker.classname == "player")
+ if (IS_PLAYER(attacker))
{
play2(attacker, "onslaught/damageblockedbyshield.wav");
self.pain_finished = time + 1;
{
// this is protected by a shield, so ignore the damage
if (time > self.pain_finished)
- if (attacker.classname == "player")
+ if (IS_PLAYER(attacker))
{
play2(attacker, "onslaught/damageblockedbyshield.wav");
self.pain_finished = time + 1;
return;
}
- if (attacker.classname == "player")
+ if (IS_PLAYER(attacker))
{
nag = FALSE;
if(self.team == NUM_TEAM_1)
{
entity e;
float a;
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
a = onslaught_controlpoint_attackable(self, other.team);
if(a != 2 && a != 4)
--- /dev/null
+void spawnfunc_item_minst_cells (void)
+{
+ if not(g_minstagib) { remove(self); return; }
+ if not(self.ammo_cells)
+ self.ammo_cells = autocvar_g_minstagib_ammo_drop;
+
+ StartItem ("models/items/a_cells.md3",
+ "misc/itempickup.wav", 45, 0,
+ "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100);
+}
+
+void minstagib_health_mega()
+{
+ self.max_health = 1;
+ StartItem ("models/items/g_h100.md3",
+ "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup,
+ "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
+}
+
+.float minstagib_nextthink;
+.float minstagib_needammo;
+void minstagib_stop_countdown(entity e)
+{
+ if (!e.minstagib_needammo)
+ return;
+ Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_MINSTA_FINDAMMO);
+ e.minstagib_needammo = FALSE;
+}
+void minstagib_ammocheck(void)
+{
+ if not(IS_PLAYER(self))
+ return; // not a player
+ if (time < self.minstagib_nextthink)
+ return;
+
+ if (self.deadflag || gameover)
+ minstagib_stop_countdown(self);
+ else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
+ minstagib_stop_countdown(self);
+ else
+ {
+ self.minstagib_needammo = TRUE;
+ if (self.health == 5)
+ {
+ Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_MINSTAGIB_TERMINATED);
+ }
+ else if (self.health == 10)
+ {
+ Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_1);
+ }
+ else if (self.health == 20)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_2);
+ }
+ else if (self.health == 30)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_3);
+ }
+ else if (self.health == 40)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_4);
+ }
+ else if (self.health == 50)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_5);
+ }
+ else if (self.health == 60)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_6);
+ }
+ else if (self.health == 70)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_7);
+ }
+ else if (self.health == 80)
+ {
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_8);
+ }
+ else if (self.health == 90)
+ {
+ Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO);
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_9);
+ }
+ else if (self.health == 100)
+ {
+ Send_Notification(NOTIF_ONE_ONLY, self, MSG_MULTI, MULTI_MINSTA_FINDAMMO);
+ Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
+ }
+ }
+ self.minstagib_nextthink = time + 1;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_MatchEnd)
+{
+ entity head;
+ FOR_EACH_PLAYER(head)
+ minstagib_stop_countdown(head);
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_BotShouldAttack)
+{
+ if(checkentity.items & IT_STRENGTH)
+ return TRUE;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_MakePlayerObserver)
+{
+ minstagib_stop_countdown(self);
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_PlayerSpawn)
+{
+ self.effects |= EF_FULLBRIGHT;
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_PlayerPreThink)
+{
+ minstagib_ammocheck();
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_PlayerPowerups)
+{
+ if not(self.effects & EF_FULLBRIGHT)
+ self.effects |= EF_FULLBRIGHT;
+
+ if (self.items & IT_STRENGTH)
+ {
+ play_countdown(self.strength_finished, "misc/poweroff.wav");
+ if (time > self.strength_finished)
+ {
+ self.alpha = default_player_alpha;
+ self.exteriorweaponentity.alpha = default_weapon_alpha;
+ self.items &~= IT_STRENGTH;
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY);
+ }
+ }
+ else
+ {
+ if (time < self.strength_finished)
+ {
+ self.alpha = autocvar_g_minstagib_invis_alpha;
+ self.exteriorweaponentity.alpha = autocvar_g_minstagib_invis_alpha;
+ self.items |= IT_STRENGTH;
+ Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname);
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY);
+ }
+ }
+
+ if (self.items & IT_INVINCIBLE)
+ {
+ play_countdown(self.invincible_finished, "misc/poweroff.wav");
+ if (time > self.invincible_finished)
+ {
+ self.items &~= IT_INVINCIBLE;
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED);
+ }
+ }
+ else
+ {
+ if (time < self.invincible_finished)
+ {
+ self.items |= IT_INVINCIBLE;
+ Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname);
+ Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED);
+ }
+ }
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_PlayerPhysics)
+{
+ if(self.items & IT_INVINCIBLE)
+ self.stat_sv_maxspeed = self.stat_sv_maxspeed * autocvar_g_minstagib_speed_highspeed;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_SplitHealthArmor)
+{
+ damage_save = 0;
+ //damage_take = frag_damage; // frag_damage isn't even set here?!
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_ForbidThrowing)
+{
+ if (self.health < 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_PlayerDamage)
+{
+ if(autocvar_g_friendlyfire == 0 && !IsDifferentTeam(frag_target, frag_attacker) && IS_PLAYER(frag_target))
+ frag_damage = 0;
+
+ if(IS_PLAYER(frag_target))
+ {
+ if ((frag_deathtype == DEATH_FALL) ||
+ (frag_deathtype == DEATH_DROWN) ||
+ (frag_deathtype == DEATH_SLIME) ||
+ (frag_deathtype == DEATH_LAVA))
+ {
+ frag_damage = 0;
+ }
+
+ if (frag_target.armorvalue && (frag_deathtype == WEP_MINSTANEX) && frag_damage)
+ {
+ frag_target.armorvalue -= 1;
+ Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_target.armorvalue);
+ frag_damage = 0;
+ frag_target.hitsound += 1;
+ frag_attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
+ }
+ if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
+ {
+ frag_damage = 0;
+ frag_mirrordamage = 0;
+ if (frag_target != frag_attacker)
+ {
+ if ((frag_target.health >= 1) && IS_PLAYER(frag_target))
+ Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_SECONDARY);
+ frag_force = '0 0 0';
+ // keep mirrorfrag_force
+ frag_attacker = frag_target;
+ }
+ }
+ }
+
+ if(frag_mirrordamage > 0)
+ {
+ // just lose extra LIVES, don't kill the player for mirror damage
+ if(frag_attacker.armorvalue > 0)
+ {
+ frag_attacker.armorvalue = frag_attacker.armorvalue - 1;
+ Send_Notification(NOTIF_ONE, frag_attacker, MSG_CENTER, CENTER_MINSTA_LIVES_REMAINING, frag_attacker.armorvalue);
+ frag_attacker.hitsound += 1;
+ }
+ frag_mirrordamage = 0;
+ }
+
+ if(frag_target.items & IT_STRENGTH)
+ yoda = 1;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_SetStartItems)
+{
+ start_ammo_cells = cvar("g_minstagib_ammo_start");
+
+ start_health = 100;
+ start_armorvalue = 0;
+ WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX);
+ start_items |= IT_UNLIMITED_SUPERWEAPONS;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_FilterItem)
+{
+ if(self.classname == "item_cells")
+ return TRUE; // no normal cells?
+
+ if(self.weapon == WEP_MINSTANEX && self.classname == "droppedweapon")
+ {
+ self.ammo_cells = autocvar_g_minstagib_ammo_drop;
+ return FALSE;
+ }
+
+ if(self.weapon == WEP_ROCKET_LAUNCHER || self.weapon == WEP_NEX)
+ {
+ entity e = spawn();
+ setorigin(e, self.origin);
+ entity oldself;
+ oldself = self;
+ self = e;
+ spawnfunc_item_minst_cells();
+ self = oldself;
+ return TRUE;
+ }
+
+ if(self.flags & FL_POWERUP)
+ return FALSE;
+
+ if(self.ammo_cells > autocvar_g_minstagib_ammo_drop && self.classname != "item_minst_cells")
+ self.ammo_cells = autocvar_g_minstagib_ammo_drop;
+
+ if(self.ammo_cells && !self.weapon)
+ return FALSE;
+
+ return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_CustomizeWaypoint)
+{
+ entity e = WaypointSprite_getviewentity(other);
+
+ // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
+ // but only apply this to real players, not to spectators
+ if((self.owner.flags & FL_CLIENT) && (self.owner.items & IT_STRENGTH) && (e == other))
+ if(IsDifferentTeam(self.owner, e))
+ return TRUE;
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_ItemCountdown)
+{
+ switch(self.items)
+ {
+ case IT_STRENGTH: item_name = "item-invis"; item_color = '0 0 1'; break;
+ case IT_NAILS: item_name = "item-extralife"; item_color = '1 0 0'; break;
+ case IT_INVINCIBLE: item_name = "item-speed"; item_color = '1 0 1'; break;
+ }
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_ItemTouch)
+{
+ if(self.ammo_cells)
+ {
+ // play some cool sounds ;)
+ if (IS_CLIENT(other))
+ {
+ if(other.health <= 5)
+ Send_Notification(NOTIF_ONE, other, MSG_ANNCE, ANNCE_MINSTAGIB_LASTSECOND);
+ else if(other.health < 50)
+ Send_Notification(NOTIF_ONE, other, MSG_ANNCE, ANNCE_MINSTAGIB_NARROWLY);
+ }
+
+ if(other.health < 100)
+ other.health = 100;
+ }
+
+ if(self.max_health)
+ {
+ other.armorvalue = bound(other.armorvalue, 999, other.armorvalue + autocvar_g_minstagib_extralives);
+ Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_EXTRALIVES);
+ }
+
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_OnEntityPreSpawn)
+{
+ if not(autocvar_g_powerups) { return FALSE; }
+ if not(self.classname == "item_strength" || self.classname == "item_invincible" || self.classname == "item_health_mega")
+ return FALSE;
+
+ entity e = spawn();
+
+ if(random() < 0.3)
+ e.think = spawnfunc_item_strength;
+ else if(random() < 0.6)
+ e.think = minstagib_health_mega;
+ else
+ e.think = spawnfunc_item_invincible;
+
+ e.nextthink = time + 0.1;
+ e.spawnflags = self.spawnflags;
+ e.noalign = self.noalign;
+ setorigin(e, self.origin);
+
+ return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsString)
+{
+ ret_string = strcat(ret_string, ":MinstaGib");
+ return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(minstagib_BuildMutatorsPrettyString)
+{
+ ret_string = strcat(ret_string, ", MinstaGib");
+ return FALSE;
+}
+
+MUTATOR_DEFINITION(mutator_minstagib)
+{
+ MUTATOR_HOOK(MatchEnd, minstagib_MatchEnd, CBC_ORDER_ANY);
+ MUTATOR_HOOK(BotShouldAttack, minstagib_BotShouldAttack, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPhysics, minstagib_PlayerPhysics, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerSpawn, minstagib_PlayerSpawn, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDamage_Calculate, minstagib_PlayerDamage, CBC_ORDER_ANY);
+ MUTATOR_HOOK(MakePlayerObserver, minstagib_MakePlayerObserver, CBC_ORDER_ANY);
+ MUTATOR_HOOK(SetStartItems, minstagib_SetStartItems, CBC_ORDER_ANY);
+ MUTATOR_HOOK(ItemTouch, minstagib_ItemTouch, CBC_ORDER_ANY);
+ MUTATOR_HOOK(FilterItem, minstagib_FilterItem, CBC_ORDER_ANY);
+ MUTATOR_HOOK(CustomizeWaypoint, minstagib_CustomizeWaypoint, CBC_ORDER_ANY);
+ MUTATOR_HOOK(Item_RespawnCountdown, minstagib_ItemCountdown, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, minstagib_SplitHealthArmor, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPowerups, minstagib_PlayerPowerups, CBC_ORDER_ANY);
+ MUTATOR_HOOK(ForbidThrowCurrentWeapon, minstagib_ForbidThrowing, CBC_ORDER_ANY);
+ MUTATOR_HOOK(PlayerPreThink, minstagib_PlayerPreThink, CBC_ORDER_ANY);
+ MUTATOR_HOOK(OnEntityPreSpawn, minstagib_OnEntityPreSpawn, CBC_ORDER_ANY);
+ MUTATOR_HOOK(BuildMutatorsString, minstagib_BuildMutatorsString, CBC_ORDER_ANY);
+ MUTATOR_HOOK(BuildMutatorsPrettyString, minstagib_BuildMutatorsPrettyString, CBC_ORDER_ANY);
+
+ return FALSE;
+}
{
if(!intermission_running)
if(self.deadflag == DEAD_NO)
- if(self.classname == "player")
+ if(IS_PLAYER(self))
NIX_GiveCurrentWeapon();
return 0;
}
(self.autospec_flags& ASF_FLAG_GRAB && _item.classname == "item_flag_team"))
{
- if((self.enemy != other) || self.classname == "observer")
+ if((self.enemy != other) || IS_OBSERVER(self))
{
- if(self.autospec_flags & ASF_OBSERVER_ONLY && self.classname != "observer")
+ if(self.autospec_flags & ASF_OBSERVER_ONLY && !IS_OBSERVER(self))
{
if(self.superspec_flags & SSF_VERBOSE)
superspec_msg("", "", self, sprintf("^8Ignored that %s^8 grabbed %s^8 since the observer_only option is ON\n", other.netname, _item.netname), 2);
if(MUTATOR_RETURNVALUE) // command was already handled?
return FALSE;
- if(self.classname == "player")
+ if(IS_PLAYER(self))
return FALSE;
if(cmd_name == "superspec_itemfilter")
MUTATOR_HOOKFUNCTION(superspec_ClientConnect)
{
- if(clienttype(self) != CLIENTTYPE_REAL)
+ if(!IS_REAL_CLIENT(self))
return FALSE;
string fn = "superspec-local.options";
if(g_minstagib)
{
// minstagib: each hit means +1 ammo
- frag_attacker.ammo_cells += 2; // note: 1 cell was deducted for the shot
+ if(frag_attacker != frag_target)
+ frag_attacker.ammo_cells += 2; // note: 1 cell was deducted for the shot
}
else
{
MUTATOR_DECLARATION(mutator_physical_items);
MUTATOR_DECLARATION(mutator_vampire);
MUTATOR_DECLARATION(mutator_superspec);
+MUTATOR_DECLARATION(mutator_minstagib);
MUTATOR_DECLARATION(mutator_touchexplode);
MUTATOR_DECLARATION(sandbox);
s = string_null;
if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
s = e.crypto_idfp;
- else if(clienttype(e) == CLIENTTYPE_BOT)
+ else if(IS_BOT_CLIENT(e))
s = sprintf("bot#%g#%s", skill, e.cleanname);
if((s == "") || find(world, playerstats_id, s)) // already have one of the ID - next one can't be tracked then!
{
- if(clienttype(e) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(e))
s = sprintf("bot#%d", e.playerid);
else
s = sprintf("player#%d", e.playerid);
db_put(playerstats_db, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid));
- if(p.cvar_cl_allow_uid2name == 1 || clienttype(p) == CLIENTTYPE_BOT)
+ if(p.cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p))
db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
if(teamplay)
PlayerStats_Accuracy(p);
- if(clienttype(p) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(p))
{
if(p.latency_cnt)
{
//print(vtos(to), "\n");
// ang_x stuff works around weird quake angles
- if(player.classname == "player")
+ if(IS_PLAYER(player))
ang = Portal_ApplyTransformToPlayerAngle(transform, player.v_angle);
else
ang = AnglesTransform_ApplyToAngles(transform, player.angles);
if(self.solid != SOLID_TRIGGER)
return; // possibly engine bug
- if(other.classname == "player")
+ if(IS_PLAYER(other))
return; // handled by think
#endif
return;
}
if(other != self.aiment)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IS_INDEPENDENT_PLAYER(other) || IS_INDEPENDENT_PLAYER(self.aiment))
return; // cannot go through someone else's portal
if(other.aiment != self.aiment)
- if(other.aiment.classname == "player")
+ if(IS_PLAYER(other.aiment))
if(IS_INDEPENDENT_PLAYER(other.aiment) || IS_INDEPENDENT_PLAYER(self.aiment))
return; // cannot go through someone else's portal
fixedmakevectors(self.mangle);
float Portal_Customize()
{
- if(other.classname == "spectator")
+ if(IS_SPEC(other))
other = other.enemy;
if(other == self.aiment)
{
mutators/mutator_physical_items.qc
mutators/sandbox.qc
mutators/mutator_superspec.qc
+mutators/mutator_minstagib.qc
mutators/mutator_touchexplode.qc
../warpzonelib/anglestransform.qc
/*
* Trigger targets
*/
- if not((self.spawnflags & 2) && (other.classname == "player"))
+ if not((self.spawnflags & 2) && (IS_PLAYER(other)))
{
activator = other;
oldmsg = self.message;
self.message = oldmsg;
}
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return;
/*
if(fullstatus)
{
s = GetPlayerScoreString(p, 1);
- if(clienttype(p) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(p))
s = strcat(s, ":human");
else
s = strcat(s, ":bot");
- if(p.classname != "player" && !g_arena && p.caplayer != 1 && !g_lms)
+ if(!IS_PLAYER(p) && !g_arena && p.caplayer != 1 && !g_lms)
s = strcat(s, ":spectator");
}
else
{
- if(p.classname == "player" || g_arena || p.caplayer == 1 || g_lms)
+ if(IS_PLAYER(p) || g_arena || p.caplayer == 1 || g_lms)
s = GetPlayerScoreString(p, 2);
else
s = "-666";
t = 0;
FOR_EACH_CLIENT(p)
- if(p.classname != "player")
+ if not(IS_PLAYER(p))
{
if not(t)
Score_NicePrint_Spectators(to);
*/
void trigger_secret_touch() {
// only a player can trigger this
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
// update secrets found counter
c_seen = 0;
FOR_EACH_CLIENT(cl)
{
- if(clienttype(cl) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(cl))
++c_seeing;
- if(cl.classname == "player")
+ if(IS_PLAYER(cl))
++c_seen;
}
print("CEFC calls per second: ", ftos(c_seeing * (c_seen - 1) / t), "; ");
float have_pickup_item(void)
{
- // minstagib: only allow filtered items
- if(g_minstagib)
- if(self.classname != "minstagib")
- return FALSE;
-
if(self.flags & FL_POWERUP)
{
if(autocvar_g_powerups > 0)
void Item_Respawn (void)
{
Item_Show(self, 1);
- if(!g_minstagib && self.items == IT_STRENGTH)
+ // this is ugly...
+ if(self.items == IT_STRENGTH)
sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
- else if(!g_minstagib && self.items == IT_INVINCIBLE)
+ else if(self.items == IT_INVINCIBLE)
sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
else
sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound
string name;
vector rgb = '1 0 1';
name = string_null;
- if(g_minstagib)
- {
- switch(self.items)
- {
- case IT_STRENGTH: name = "item-invis"; rgb = '0 0 1'; break;
- case IT_NAILS: name = "item-extralife"; rgb = '1 0 0'; break;
- case IT_INVINCIBLE: name = "item-speed"; rgb = '1 0 1'; break;
- }
- }
- else
- {
- switch(self.items)
- {
- case IT_STRENGTH: name = "item-strength"; rgb = '0 0 1'; break;
- case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break;
- }
- }
switch(self.items)
{
- case IT_FUEL_REGEN: name = "item-fuelregen"; rgb = '1 0.5 0'; break;
- case IT_JETPACK: name = "item-jetpack"; rgb = '0.5 0.5 0.5'; break;
+ case IT_FUEL_REGEN: name = "item-fuelregen"; rgb = '1 0.5 0'; break;
+ case IT_JETPACK: name = "item-jetpack"; rgb = '0.5 0.5 0.5'; break;
+ case IT_STRENGTH: name = "item-strength"; rgb = '0 0 1'; break;
+ case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break;
}
+ item_name = name;
+ item_color = rgb;
+ MUTATOR_CALLHOOK(Item_RespawnCountdown);
+ name = item_name;
+ rgb = item_color;
if(self.flags & FL_WEAPON)
{
entity wi = get_weaponinfo(self.weapon);
// if nothing happens to player, just return without taking the item
pickedup = FALSE;
_switchweapon = FALSE;
+ // in case the player has autoswitch enabled do the following:
+ // if the player is using their best weapon before items are given, they
+ // probably want to switch to an even better weapon after items are given
+ if (player.autoswitch)
+ if (player.switchweapon == w_getbestweapon(player))
+ _switchweapon = TRUE;
- if (g_minstagib)
- {
- float prevcells = player.ammo_cells;
-
- pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
- pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, 999, ITEM_MODE_NONE);
-
- if(player.ammo_cells > prevcells)
- {
- _switchweapon = TRUE;
-
- // play some cool sounds ;)
- if (clienttype(player) == CLIENTTYPE_REAL)
- {
- if(player.health <= 5)
- Send_Notification(NOTIF_ONE, player, MSG_ANNCE, ANNCE_MINSTAGIB_LASTSECOND);
- else if(player.health < 50)
- Send_Notification(NOTIF_ONE, player, MSG_ANNCE, ANNCE_MINSTAGIB_NARROWLY);
- }
- // sound not available
- // else if(item.items == IT_CELLS)
- // AnnounceTo(player, "ammo");
+ if not(WEPSET_CONTAINS_EW(player, player.switchweapon))
+ _switchweapon = TRUE;
- if (WEPSET_CONTAINS_EW(item, WEP_MINSTANEX))
- W_GiveWeapon (player, WEP_MINSTANEX);
- player.health = 100;
- }
+ pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
+ pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE);
+ pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
+ pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
+ pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
+ pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
+ pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
- if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
- {
- pickedup = TRUE;
- player.items |= it;
- sprint (player, strcat("You got the ^2", item.netname, "\n"));
- }
+ if (item.flags & FL_WEAPON)
+ {
+ WEPSET_DECLARE_A(it);
+ WEPSET_COPY_AE(it, item);
+ WEPSET_ANDNOT_AE(it, player);
- // extralife powerup
- if (item.max_health)
+ if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && item.pickup_anyway))
{
pickedup = TRUE;
- // sound not available
- // AnnounceTo(player, "_lives");
- player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives);
- Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_EXTRALIVES);
+ for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+ if(WEPSET_CONTAINS_AW(it, i))
+ W_GiveWeapon(player, i);
}
+ }
- // invis powerup
- if (item.strength_finished)
- {
- pickedup = TRUE;
- // sound not available
- // AnnounceTo(player, "invisible");
- player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time;
- }
+ if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
+ {
+ pickedup = TRUE;
+ player.items |= it;
+ sprint (player, strcat("You got the ^2", item.netname, "\n"));
+ }
- // speed powerup
- if (item.invincible_finished)
- {
- pickedup = TRUE;
- // sound not available
- // AnnounceTo(player, "speed");
- player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time;
- }
+ if (item.strength_finished)
+ {
+ pickedup = TRUE;
+ player.strength_finished = max(player.strength_finished, time) + item.strength_finished;
}
- else
+ if (item.invincible_finished)
{
- // in case the player has autoswitch enabled do the following:
- // if the player is using their best weapon before items are given, they
- // probably want to switch to an even better weapon after items are given
- if (player.autoswitch)
- if (player.switchweapon == w_getbestweapon(player))
- _switchweapon = TRUE;
-
- if not(WEPSET_CONTAINS_EW(player, player.switchweapon))
- _switchweapon = TRUE;
-
- pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL);
- pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE);
- pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE);
- pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE);
- pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE);
- pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH);
- pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR);
-
- if (item.flags & FL_WEAPON)
- {
- WEPSET_DECLARE_A(it);
- WEPSET_COPY_AE(it, item);
- WEPSET_ANDNOT_AE(it, player);
-
- if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && self.pickup_anyway))
- {
- pickedup = TRUE;
- for(i = WEP_FIRST; i <= WEP_LAST; ++i)
- if(WEPSET_CONTAINS_AW(it, i))
- W_GiveWeapon(player, i);
- }
- }
-
- if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK))
- {
- pickedup = TRUE;
- player.items |= it;
- sprint (player, strcat("You got the ^2", item.netname, "\n"));
- }
-
- if (item.strength_finished)
- {
- pickedup = TRUE;
- player.strength_finished = max(player.strength_finished, time) + item.strength_finished;
- }
- if (item.invincible_finished)
- {
- pickedup = TRUE;
- player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished;
- }
- if (item.superweapons_finished)
- {
- pickedup = TRUE;
- player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
- }
+ pickedup = TRUE;
+ player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished;
+ }
+ if (item.superweapons_finished)
+ {
+ pickedup = TRUE;
+ player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished;
+ }
+ if (item.max_health)
+ {
+ pickedup = TRUE;
+ // extra life powerup handled by mutators
}
:skip
+
// always eat teamed entities
if(item.team)
pickedup = TRUE;
}
}
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if (other.deadflag)
return;
precache_sound (self.item_pickupsound);
precache_sound ("misc/itemrespawncountdown.wav");
- if(!g_minstagib && itemid == IT_STRENGTH)
+ if(itemid == IT_STRENGTH)
precache_sound ("misc/strength_respawn.wav");
- else if(!g_minstagib && itemid == IT_INVINCIBLE)
+ else if(itemid == IT_INVINCIBLE)
precache_sound ("misc/shield_respawn.wav");
else
precache_sound ("misc/itemrespawn.wav");
}
}
-/* replace items in minstagib
- * IT_STRENGTH = invisibility
- * IT_NAILS = extra lives
- * IT_INVINCIBLE = speed
- */
-void minstagib_items (float itemid) // will be deleted soon.
-{
- float rnd;
- self.classname = "minstagib"; // ...?
-
- // replace rocket launchers and nex guns with ammo cells
- if (itemid == IT_CELLS)
- {
- self.ammo_cells = autocvar_g_minstagib_ammo_drop;
- StartItem ("models/items/a_cells.md3",
- "misc/itempickup.wav", 45, 0,
- "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100);
- return;
- }
-
- // randomize
- rnd = random() * 3;
- if (rnd <= 1)
- itemid = IT_STRENGTH;
- else if (rnd <= 2)
- itemid = IT_NAILS;
- else
- itemid = IT_INVINCIBLE;
-
- // replace with invis
- if (itemid == IT_STRENGTH)
- {
- if(!self.strength_finished)
- self.strength_finished = autocvar_g_balance_powerup_strength_time;
- StartItem ("models/items/g_strength.md3",
- "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup,
- "Invisibility", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_MID);
- }
- // replace with extra lives
- if (itemid == IT_NAILS)
- {
- self.max_health = 1;
- StartItem ("models/items/g_h100.md3",
- "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup,
- "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
- }
- // replace with speed
- if (itemid == IT_INVINCIBLE)
- {
- if(!self.invincible_finished)
- self.invincible_finished = autocvar_g_balance_powerup_invincible_time;
- StartItem ("models/items/g_invincible.md3",
- "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup,
- "Speed", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_MID);
- }
-}
-
-float minst_no_auto_cells;
-void minst_remove_item (void) {
- if(minst_no_auto_cells)
- remove(self);
-}
-
float weaponswapping;
float internalteam;
if(self.team)
f |= FL_NO_WEAPON_STAY;
- // stupid minstagib hack, don't ask
- if(g_minstagib)
- if(self.ammo_cells)
- self.ammo_cells = autocvar_g_minstagib_ammo_drop;
-
StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue);
if (self.modelindex) // don't precache if self was removed
weapon_action(e.weapon, WR_PRECACHE);
void spawnfunc_weapon_nex (void)
{
- if (g_minstagib)
- {
- minstagib_items(IT_CELLS);
- self.think = minst_remove_item;
- self.nextthink = time;
- return;
- }
weapon_defaultspawnfunc(WEP_NEX);
}
void spawnfunc_weapon_minstanex (void)
{
- if (g_minstagib)
- {
- minstagib_items(IT_CELLS);
- self.think = minst_remove_item;
- self.nextthink = time;
- return;
- }
weapon_defaultspawnfunc(WEP_MINSTANEX);
}
void spawnfunc_weapon_rocketlauncher (void)
{
- if (g_minstagib)
- {
- minstagib_items(IT_CELLS); // replace rocketlauncher with cells
- self.think = minst_remove_item;
- self.nextthink = time;
- return;
- }
weapon_defaultspawnfunc(WEP_ROCKET_LAUNCHER);
}
}
void spawnfunc_item_health_mega (void) {
- if(g_minstagib) {
- minstagib_items(IT_NAILS);
- } else {
if(!self.max_health)
self.max_health = g_pickup_healthmega_max;
if(!self.health)
if(!self.pickup_anyway)
self.pickup_anyway = g_pickup_healthmega_anyway;
StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Health", IT_HEALTH, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
- }
}
// support old misnamed entities
void spawnfunc_item_health100() { spawnfunc_item_health_mega(); }
void spawnfunc_item_strength (void) {
- if(g_minstagib) {
- minstagib_items(IT_STRENGTH);
- } else {
precache_sound("weapons/strength_fire.wav");
if(!self.strength_finished)
self.strength_finished = autocvar_g_balance_powerup_strength_time;
StartItem ("models/items/g_strength.md3", "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Strength Powerup", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, 100000);
- }
}
void spawnfunc_item_invincible (void) {
- if(g_minstagib) {
- minstagib_items(IT_INVINCIBLE);
- } else {
if(!self.invincible_finished)
self.invincible_finished = autocvar_g_balance_powerup_invincible_time;
StartItem ("models/items/g_invincible.md3", "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Shield", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, 100000);
- }
-}
-
-void spawnfunc_item_minst_cells (void) {
- if (g_minstagib)
- {
- minst_no_auto_cells = TRUE;
- minstagib_items(IT_CELLS);
- }
- else
- remove(self);
}
// compatibility:
return;
}
- if(activator.classname != "player")
+ if not(IS_PLAYER(activator))
return;
if(activator.deadflag != DEAD_NO)
return;
if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS))
e.superweapons_finished = autocvar_g_balance_superweapons_time;
- if (g_minstagib)
- {
- e.health = bound(0, e.health, 100);
- e.armorvalue = bound(0, e.armorvalue, 999);
- }
-
if(e.strength_finished <= 0)
e.strength_finished = 0;
else
other.flags &~= FL_ONGROUND;
- if (other.classname == "player")
+ if (IS_PLAYER(other))
{
// reset tracking of oldvelocity for impact damage (sudden velocity changes)
other.oldvelocity = other.velocity;
sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
self.pushltime = time + 0.2;
}
- float ct;
- ct = clienttype(other);
- if( ct == CLIENTTYPE_REAL || ct == CLIENTTYPE_BOT)
+ if(IS_REAL_CLIENT(other) || IS_BOT_CLIENT(other))
{
float i;
float found;
other.jumppadcount = other.jumppadcount + 1;
}
- if(ct == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(other))
{
if(self.message)
centerprint(other, self.message);
void button_use()
{
-// if (activator.classname != "player")
-// {
-// dprint(activator.classname);
-// dprint(" triggered a button\n");
-// }
-
if not (self.active == ACTIVE_ACTIVE)
return;
void button_touch()
{
-// if (activator.classname != "player")
-// {
-// dprint(activator.classname);
-// dprint(" touched a button\n");
-// }
if (!other)
return;
if not(other.iscreature)
self.health = self.health - damage;
if (self.health <= 0)
{
- // if (activator.classname != "player")
- // {
- // dprint(activator.classname);
- // dprint(" killed a button\n");
- // }
self.enemy = damage_attacker;
button_fire ();
}
// this door require a key
// only a player can have a key
- if (other.classname != "player")
+ if not(IS_PLAYER(other))
return FALSE;
if (item_keys_usekey(door, other)) {
*/
void door_touch()
{
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if (self.owner.attack_finished_single > time)
return;
if (!(self.owner.dmg) && (self.owner.message != ""))
{
- if (other.flags & FL_CLIENT)
+ if (IS_CLIENT(other))
centerprint (other, self.owner.message);
play2(other, "misc/talk.wav");
}
if (self.message)
{
- if (other.flags & FL_CLIENT)
+ if (IS_CLIENT(other))
centerprint (other, self.message);
play2(other, "misc/talk.wav");
}
for(e = world; (e = findentity(e, conveyor, self)); )
{
- if(e.flags & FL_CLIENT) // doing it via velocity has quite some advantages
+ if(IS_CLIENT(e)) // doing it via velocity has quite some advantages
continue; // done in SV_PlayerPhysics
setorigin(e, e.origin + self.movedir * sys_frametime);
{
// If whatever thats touching the swamp is not a player
// or if its a dead player, just dont care abt it.
- if((other.classname != "player")||(other.deadflag != DEAD_NO))
+ if(!IS_PLAYER(other) || other.deadflag != DEAD_NO)
return;
EXACTTRIGGER_TOUCH;
float check_tdeath(entity player, vector org, vector telefragmin, vector telefragmax)
{
- if (player.classname == "player" && player.health >= 1)
+ if (IS_PLAYER(player) && player.health >= 1)
{
TDEATHLOOP(org)
{
if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
- if(head.classname == "player")
+ if(IS_PLAYER(head))
if(head.health >= 1)
return 1;
}
{
TDEATHLOOP(player.origin)
{
- if (player.classname == "player" && player.health >= 1)
+ if (IS_PLAYER(player) && player.health >= 1)
{
if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
{
- if(head.classname == "player")
+ if(IS_PLAYER(head))
if(head.health >= 1)
++tdeath_hit;
Damage (head, teleporter, telefragger, 10000, DEATH_TELEFRAG, head.origin, '0 0 0');
UpdateCSQCProjectileAfterTeleport(player);
- if(player.classname == "player")
+ if(IS_PLAYER(player))
{
if(tflags & TELEPORT_FLAG_TDEATH)
if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && (autocvar_g_telefrags || (tflags & TELEPORT_FLAG_FORCE_TDEATH)))
EXACTTRIGGER_TOUCH;
- if(other.classname == "player")
+ if(IS_PLAYER(other))
RemoveGrapplingHook(other);
entity e;
print("A non-projectile got through a warpzone and its owner cleared. It's a ", pl.classname, ".\n");
pl.owner = world;
}
- if(pl.classname == "player")
+ if(IS_PLAYER(pl))
{
// reset tracking of oldvelocity for impact damage (sudden velocity changes)
pl.oldvelocity = pl.velocity;
ret_string = "";
MUTATOR_CALLHOOK(BuildMutatorsPrettyString);
modifications = ret_string;
-
- if(g_minstagib)
- modifications = strcat(modifications, ", MinstaGib");
+
if(g_weaponarena)
{
if(g_weaponarena_random)
if(autocvar_bot_vs_human > 0)
{
// bots are all blue
- if(clienttype(for_whom) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(for_whom))
c1 = c3 = c4 = -1;
else
c2 = -1;
else
{
// bots are all red
- if(clienttype(for_whom) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(for_whom))
c2 = c3 = c4 = -1;
else
c1 = -1;
FOR_EACH_CLIENT(head)
{
float t;
- if(head.classname == "player")
+ if(IS_PLAYER(head))
t = head.team;
else if(head.team_forced > 0)
t = head.team_forced; // reserve the spot
if(head != ignore)// && head.netname != "")
{
value = PlayerValue(head);
- if(clienttype(head) == CLIENTTYPE_BOT)
+ if(IS_BOT_CLIENT(head))
bvalue = value;
else
bvalue = 0;
if(ta == tb)
return TRUE;
- if(clienttype(e) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(e))
{
if(bots_would_leave)
{
if(totalteams <= 1)
{
- if(autocvar_g_campaign && pl && clienttype(pl) == CLIENTTYPE_REAL)
+ if(autocvar_g_campaign && pl && IS_REAL_CLIENT(pl))
return 1; // special case for campaign and player joining
else if(g_domination)
error("Too few teams available for domination\n");
// bprint("allow change teams from ", ftos(steam), " to ", ftos(dteam), "\n");
- if(self.classname == "player" && steam != dteam)
+ if(IS_PLAYER(self) && steam != dteam)
{
// reduce frags during a team change
TeamchangeFrags(self);
SetPlayerTeam(self, dteam, steam, FALSE);
- if(self.classname == "player" && steam != dteam)
+ if(IS_PLAYER(self) && steam != dteam)
{
// kill player when changing teams
if(self.deadflag == DEAD_NO)
if (self.team == attacker.team)
{
// This does not happen anymore. Re-enable if you fix that.
- if(clienttype(attacker) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(attacker))
sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
if(autocvar_g_friendlyfire)
return -6;
// player
- if (e_target.flags & FL_CLIENT)
+ if (IS_CLIENT(e_target))
{
if not (validate_flags & TFL_TARGETSELECT_PLAYERS)
return -7;
if ((_turret.target_select_missilebias > 0) && (_target.flags & FL_PROJECTILE))
m_score = 1;
- if ((_turret.target_select_playerbias > 0) && (_target.flags & FL_CLIENT))
+ if ((_turret.target_select_playerbias > 0) && IS_CLIENT(_target))
p_score = 1;
d_score = max(d_score, 0);
return 0;
// player
- if (e_target.flags & FL_CLIENT)
+ if (IS_CLIENT(e_target))
{
if (self.owner.target_select_playerbias < 0)
return 0;
void bumb_gunner_exit(float _exitflag)
{
-
-
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
{
msg_entity = self;
WriteByte(MSG_ONE, SVC_SETVIEWPORT);
float vehicles_valid_pilot()
{
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return FALSE;
if(other.deadflag != DEAD_NO)
if(other.vehicle != world)
return FALSE;
- if(clienttype(other) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(other))
if(!autocvar_g_vehicles_allow_bots)
return FALSE;
if(autocvar_g_vehicle_bumblebee_healgun_hps)
trace_ent.vehicle_health = min(trace_ent.vehicle_health + autocvar_g_vehicle_bumblebee_healgun_hps * frametime, trace_ent.tur_health);
}
- else if(trace_ent.flags & FL_CLIENT)
+ else if(IS_CLIENT(trace_ent))
{
if(trace_ent.health <= autocvar_g_vehicle_bumblebee_healgun_hmax && autocvar_g_vehicle_bumblebee_healgun_hps)
trace_ent.health = min(trace_ent.health + autocvar_g_vehicle_bumblebee_healgun_hps * frametime, autocvar_g_vehicle_bumblebee_healgun_hmax);
void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
{
- if (clienttype(own) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(own))
return;
entity axh;
**/
void CSQCVehicleSetup(entity own, float vehicle_id)
{
- if (clienttype(own) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(own))
return;
msg_entity = own;
// Better way of determening whats crushable needed! (fl_crushable?)
float vehicles_crushable(entity e)
{
- if(e.classname == "player")
+ if(IS_PLAYER(e))
return TRUE;
- if(e.classname == "monster_zombie")
- return TRUE;
+ if(e.flags & FL_MONSTER)
+ return TRUE; // more bitflags for everyone!
return FALSE;
}
return;
}
- if(other.classname != "player")
+ if not(IS_PLAYER(other))
return;
if(other.deadflag != DEAD_NO)
{
// Remove this when bots know how to use vehicles
- if (clienttype(other) == CLIENTTYPE_BOT)
+ if (IS_BOT_CLIENT(other))
if (autocvar_g_vehicles_allow_bots)
dprint("Bot enters vehicle\n"); // This is where we need to disconnect (some, all?) normal bot AI and hand over to vehicle's _aiframe()
else
self.team = self.owner.team;
self.flags -= FL_NOTARGET;
- if (clienttype(other) == CLIENTTYPE_REAL)
+ if (IS_REAL_CLIENT(other))
{
msg_entity = other;
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
}
vehicles_exit_running = TRUE;
- if(self.flags & FL_CLIENT)
+ if(IS_CLIENT(self))
{
_vehicle = self.vehicle;
if (_player)
{
- if (clienttype(_player) == CLIENTTYPE_REAL)
+ if (IS_REAL_CLIENT(_player))
{
msg_entity = _player;
WriteByte (MSG_ONE, SVC_SETVIEWPORT);
oldself = self;
self = e;
- if not(g_minstagib)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
{ Send_Notification(NOTIF_ONE, other, MSG_MULTI, ITEM_WEAPON_GOT, wep); }
self = oldself;
// Find all non-hit players the beam passed close by
if(deathtype == WEP_MINSTANEX || deathtype == WEP_NEX)
{
- FOR_EACH_REALCLIENT(msg_entity) if(msg_entity != self) if(!msg_entity.railgunhit) if not(msg_entity.classname == "spectator" && msg_entity.enemy == self) // we use realclient, so spectators can hear the whoosh too
+ FOR_EACH_REALCLIENT(msg_entity) if(msg_entity != self) if(!msg_entity.railgunhit) if not(IS_SPEC(msg_entity) && msg_entity.enemy == self) // we use realclient, so spectators can hear the whoosh too
{
// nearest point on the beam
beampos = start + dir * bound(0, (msg_entity.origin - start) * dir, length);
lag = ANTILAG_LATENCY(self);
if(lag < 0.001)
lag = 0;
- if(clienttype(self) != CLIENTTYPE_REAL)
+ if not(IS_REAL_CLIENT(self))
lag = 0;
if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
lag = 0; // only do hitscan, but no antilag
self.takedamage = DAMAGE_NO;
self.event_damage = func_null;
- if((attacker.flags & FL_CLIENT) && !autocvar_g_projectiles_keep_owner)
+ if(IS_CLIENT(attacker) && !autocvar_g_projectiles_keep_owner)
{
self.owner = attacker;
self.realowner = attacker;
void W_Plasma_Explode (void)
{
if(other.takedamage == DAMAGE_AIM)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
// 2. bfg effect
// NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain)
- if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
+ if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || IsDifferentTeam(e, self))
{
// can we see fireball?
traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e);
RandomSelection_Init();
for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain)
- if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
+ if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(!IS_PLAYER(e) || !self.realowner || IsDifferentTeam(e, self))
{
p = e.origin;
p_x += e.mins_x + random() * (e.maxs_x - e.mins_x);
void W_Grenade_Explode (void)
{
if(other.takedamage == DAMAGE_AIM)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
void W_Grenade_Explode2 (void)
{
if(other.takedamage == DAMAGE_AIM)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
entity missile;
vector s_forward;
float a;
- float nodamage;
-
- if(issecondary == 2) // minstanex shot
- nodamage = g_minstagib;
- else
- nodamage = FALSE;
a = autocvar_g_balance_laser_primary_shotangle;
s_forward = v_forward * cos(a * DEG2RAD) + v_up * sin(a * DEG2RAD);
- if(nodamage)
- W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, 0);
- else if(issecondary == 1)
+ if(issecondary == 1)
W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_secondary_damage);
else
W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_primary_damage);
missile.owner = missile.realowner = self;
missile.classname = "laserbolt";
missile.dmg = 0;
- if(!nodamage)
- {
- missile.bot_dodge = TRUE;
- missile.bot_dodgerating = autocvar_g_balance_laser_primary_damage;
- }
+ missile.bot_dodge = TRUE;
+ missile.bot_dodgerating = autocvar_g_balance_laser_primary_damage;
PROJECTILE_MAKETRIGGER(missile);
missile.projectiledeathtype = WEP_LASER;
void W_Mine_Explode ()
{
if(other.takedamage == DAMAGE_AIM)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
// a player's mines shall explode if he disconnects or dies
// TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
- if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
+ if(!IS_PLAYER(self.realowner) || self.realowner.deadflag != DEAD_NO)
{
other = world;
self.projectiledeathtype |= HITTYPE_BOUNCE;
head = findradius(self.origin, autocvar_g_balance_minelayer_proximityradius);
while(head)
{
- if(head.classname == "player" && head.deadflag == DEAD_NO)
+ if(IS_PLAYER(head) && head.deadflag == DEAD_NO)
if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates
if(!self.mine_time)
{
return;
}
- if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+ if(other && IS_PLAYER(other) && other.deadflag == DEAD_NO)
{
// hit a player
// don't stick
//As the distance gets larger, a correct detonation gets near imposible
//Bots are assumed to use the mine spawnfunc_light to see if the mine gets near a player
if(v_forward * normalize(mine.origin - self.enemy.origin)< 0.1)
- if(self.enemy.classname == "player")
+ if(IS_PLAYER(self.enemy))
if(desirabledamage >= 0.1*coredamage)
if(random()/distance*300 > frametime*bound(0,(10-skill)*0.2,1))
self.BUTTON_ATCK2 = TRUE;
damage_goodhits = 0;
FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, 10000, 800, 0, 0, 0, 0, WEP_MINSTANEX);
- if(g_minstagib)
+ if(yoda && flying)
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
+ if(damage_goodhits && self.minstanex_lasthit)
{
- if(yoda)
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
- }
- else
- {
- if(yoda && flying)
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
- if(damage_goodhits && self.minstanex_lasthit)
- {
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
- damage_goodhits = 0; // only every second time
- }
+ Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
+ damage_goodhits = 0; // only every second time
}
self.minstanex_lasthit = damage_goodhits;
// teamcolor / hit beam effect
vector v;
v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
- if(teamplay)
- {
- switch(self.team)
- {
- case NUM_TEAM_1: // Red
- if(damage_goodhits)
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, v);
- else
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, v);
- break;
- case NUM_TEAM_2: // Blue
- if(damage_goodhits)
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, v);
- else
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, v);
- break;
- case NUM_TEAM_3: // Yellow
- if(damage_goodhits)
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, v);
- else
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, v);
- break;
- case NUM_TEAM_4: // Pink
- if(damage_goodhits)
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, v);
- else
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, v);
- break;
- }
- }
- else
- WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
-
- if (g_minstagib)
- W_DecreaseAmmo(ammo_cells, 1, autocvar_g_balance_minstanex_reload_ammo);
- else
- W_DecreaseAmmo(ammo_cells, autocvar_g_balance_minstanex_ammo, autocvar_g_balance_minstanex_reload_ammo);
-}
-
-
-.float minstagib_nextthink;
-.float minstagib_needammo;
-void minstagib_stop_countdown(entity e)
-{
- if (!e.minstagib_needammo)
- return;
- Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_MINSTA_FINDAMMO);
- e.minstagib_needammo = FALSE;
-}
-void minstagib_ammocheck(void)
-{
- if (time < self.minstagib_nextthink)
- return;
-
- if (self.deadflag || gameover || (self.flags & FL_GODMODE))
- minstagib_stop_countdown(self);
- else if (self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
- {
- if (self.minstagib_needammo)
- self.health = 100;
- minstagib_stop_countdown(self);
- }
- else
- {
- self.minstagib_needammo = TRUE;
- if (self.health == 5)
- {
- Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_MINSTAGIB_TERMINATED);
- }
- else if (self.health == 10)
- {
- Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_1);
- }
- else if (self.health == 20)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_2);
- }
- else if (self.health == 30)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_3);
- }
- else if (self.health == 40)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_4);
- }
- else if (self.health == 50)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_5);
- }
- else if (self.health == 60)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_6);
- }
- else if (self.health == 70)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_7);
- }
- else if (self.health == 80)
- {
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_8);
- }
- else if (self.health == 90)
- {
- Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MINSTA_FINDAMMO);
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- Send_Notification(NOTIF_ONE, self, MSG_ANNCE, ANNCE_NUM_9);
- }
- else if (self.health == 100)
- {
- Send_Notification(NOTIF_ONE_ONLY, self, MSG_MULTI, MULTI_MINSTA_FINDAMMO);
- Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
- }
- }
- self.minstagib_nextthink = time + 1;
+ switch(self.team)
+ {
+ case NUM_TEAM_1: // Red
+ if(damage_goodhits)
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED_HIT"), w_shotorg, v);
+ else
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3RED"), w_shotorg, v);
+ break;
+ case NUM_TEAM_2: // Blue
+ if(damage_goodhits)
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE_HIT"), w_shotorg, v);
+ else
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3BLUE"), w_shotorg, v);
+ break;
+ case NUM_TEAM_3: // Yellow
+ if(damage_goodhits)
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW_HIT"), w_shotorg, v);
+ else
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3YELLOW"), w_shotorg, v);
+ break;
+ case NUM_TEAM_4: // Pink
+ if(damage_goodhits)
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK_HIT"), w_shotorg, v);
+ else
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3PINK"), w_shotorg, v);
+ break;
+ default:
+ if(damage_goodhits)
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3_HIT"), w_shotorg, v);
+ else
+ WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), w_shotorg, v);
+ break;
+ }
+
+ W_DecreaseAmmo(ammo_cells, ((g_minstagib) ? 1 : autocvar_g_balance_minstanex_ammo), autocvar_g_balance_minstanex_reload_ammo);
}
void spawnfunc_weapon_minstanex (void); // defined in t_items.qc
float minstanex_ammo;
// now multiple WR_s use this
- if(g_minstagib)
- minstanex_ammo = 1;
- else
- minstanex_ammo = autocvar_g_balance_minstanex_ammo;
+ minstanex_ammo = ((g_minstagib) ? 1 : autocvar_g_balance_minstanex_ammo);
if (req == WR_AIM)
{
W_Rocket_Unregister();
if(other.takedamage == DAMAGE_AIM)
- if(other.classname == "player")
+ if(IS_PLAYER(other))
if(IsDifferentTeam(self.realowner, other))
if(other.deadflag == DEAD_NO)
if(IsFlying(other))
//As the distance gets larger, a correct detonation gets near imposible
//Bots are assumed to use the rocket spawnfunc_light to see if the rocket gets near a player
if(v_forward * normalize(missile.origin - self.enemy.origin)< 0.1)
- if(self.enemy.classname == "player")
+ if(IS_PLAYER(self.enemy))
if(desirabledamage >= 0.1*coredamage)
if(random()/distance*300 > frametime*bound(0,(10-skill)*0.2,1))
self.BUTTON_ATCK2 = TRUE;
//te_lightning2(world, targpos, self.realowner.origin + self.realowner.view_ofs + v_forward * 5 - v_up * 5);
//te_customflash(targpos, 40, 2, '1 1 1');
- is_player = (trace_ent.classname == "player" || trace_ent.classname == "body");
+ is_player = (IS_PLAYER(trace_ent) || trace_ent.classname == "body");
if((trace_fraction < 1) // if trace is good, apply the damage and remove self
&& (trace_ent.takedamage == DAMAGE_AIM)
{
if(self.team != e.team)
return FALSE;
- if(e.classname != "player")
+ if not(IS_PLAYER(e))
return FALSE;
}
entity WaypointSprite_getviewentity(entity e)
{
- if(e.classname == "spectator")
+ if(IS_SPEC(e))
e = e.enemy;
/* TODO idea (check this breaks nothing)
else if(e.classname == "observer")
entity e;
e = WaypointSprite_getviewentity(other);
- // as a GENERAL rule:
- // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
- // but only apply this to real players, not to spectators
- if(g_minstagib && (self.owner.flags & FL_CLIENT) && (self.owner.items & IT_STRENGTH) && (e == other))
- {
- if(!WaypointSprite_isteammate(self.owner, e))
- return FALSE;
- }
+ if(MUTATOR_CALLHOOK(CustomizeWaypoint))
+ return FALSE;
return self.waypointsprite_visible_for_player(e);
}
BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
- if(player.classname == "player")
+ if(IS_PLAYER(player))
BITCLR_ASSIGN(player.flags, FL_ONGROUND);
WarpZone_PostTeleportPlayer_Callback(player);
o10 = o1 = WarpZone_TransformOrigin(wz, o0);
v1 = WarpZone_TransformVelocity(wz, v0);
- if(clienttype(player) != CLIENTTYPE_NOTACLIENT)
+ if not(IS_NOT_A_CLIENT(player))
a1 = WarpZone_TransformVAngles(wz, player.v_angle);
else
a1 = WarpZone_TransformAngles(wz, a0);
player.warpzone_teleport_finishtime += sys_frametime - dt;
#ifndef WARPZONE_USE_FIXANGLE
- if(player.classname == "player")
+ if(IS_PLAYER(player))
{
// instead of fixangle, send the transform to the client for smoother operation
player.fixangle = FALSE;
// 96*frametime
float d;
d = 24 + max(vlen(other.mins), vlen(other.maxs));
- if(clienttype(other) == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(other))
f = -d / bound(frametime * d * 1, frametime * vlen(other.velocity), d);
else
f = -1;
{
if(warpzone_warpzones_exist) { WarpZone_StoreProjectileData(e); }
- float f = clienttype(e);
- if(f == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(e))
{
if(e.solid == SOLID_NOT) // not spectating?
if(e.movetype == MOVETYPE_NOCLIP || e.movetype == MOVETYPE_FLY || e.movetype == MOVETYPE_FLY_WORLDONLY) // not spectating? (this is to catch observers)
}
}
- if(f == CLIENTTYPE_NOTACLIENT)
+ if(IS_NOT_A_CLIENT(e))
{
if(warpzone_warpzones_exist)
for(; (e = nextent(e)); )
float visible_to_some_client(entity ent)
{
entity e;
- for(e = nextent(world); clienttype(e) != CLIENTTYPE_NOTACLIENT; e = nextent(e))
- if(e.classname == "player" && clienttype(e) == CLIENTTYPE_REAL)
+ for(e = nextent(world); !IS_NOT_A_CLIENT(e); e = nextent(e))
+ if(IS_PLAYER(e) && IS_REAL_CLIENT(e))
if(checkpvs(e.origin + e.view_ofs, ent))
return 1;
return 0;
void WarpZone_PlayerPhysics_FixVAngle(void)
{
#ifndef WARPZONE_DONT_FIX_VANGLE
- if(clienttype(self) == CLIENTTYPE_REAL)
+ if(IS_REAL_CLIENT(self))
if(self.v_angle_z <= 360) // if not already adjusted
if(time - self.ping * 0.001 < self.warpzone_teleport_time)
{
set g_vehicles_crush_dmg 70
set g_vehicles_crush_force 50
-set cl_vehicles_hudscale 0.5way
+set cl_vehicles_hudscale 0.5
set g_vehicles_delayspawn 1
set g_vehicles_delayspawn_jitter 10
set g_vehicles_nex_damagerate 0.5
set g_vehicles_uzi_damagerate 0.65
set g_vehicles_rifle_damagerate 1
-set g_vehicles_minstanex_damagerate 0.001
+set g_vehicles_minstanex_damagerate 0.007
set g_vehicles_tag_damagerate 2