#include "g_damage.qh"
-#include "_all.qh"
+#include "bot/bot.qh"
#include "g_hook.qh"
-#include "mutators/mutators_include.qh"
+#include "mutators/all.qh"
#include "scores.qh"
#include "spawnpoints.qh"
#include "t_items.qh"
#include "../common/vehicles/all.qh"
+#include "../common/items/all.qc"
+#include "../common/mutators/mutator/waypoints/waypointsprites.qh"
#include "weapons/accuracy.qh"
#include "weapons/csqcprojectile.qh"
#include "weapons/selection.qh"
-#include "../common/buffs.qh"
#include "../common/constants.qh"
-#include "../common/deathtypes.qh"
+#include "../common/deathtypes/all.qh"
#include "../common/notifications.qh"
#include "../common/movetypes/movetypes.qh"
#include "../common/playerstats.qh"
#include "../common/teams.qh"
#include "../common/util.qh"
#include "../common/weapons/all.qh"
-#include "../csqcmodellib/sv_model.qh"
-#include "../warpzonelib/common.qh"
-
-float Damage_DamageInfo_SendEntity(entity to, int sf)
-{SELFPARAM();
- WriteByte(MSG_ENTITY, ENT_CLIENT_DAMAGEINFO);
- WriteShort(MSG_ENTITY, self.projectiledeathtype);
- WriteCoord(MSG_ENTITY, floor(self.origin.x));
- WriteCoord(MSG_ENTITY, floor(self.origin.y));
- WriteCoord(MSG_ENTITY, floor(self.origin.z));
- WriteByte(MSG_ENTITY, bound(1, self.dmg, 255));
- WriteByte(MSG_ENTITY, bound(0, self.dmg_radius, 255));
- WriteByte(MSG_ENTITY, bound(1, self.dmg_edge, 255));
- WriteShort(MSG_ENTITY, self.oldorigin.x);
- WriteByte(MSG_ENTITY, self.species);
- return true;
-}
-
-void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)
-{
- // TODO maybe call this from non-edgedamage too?
- // TODO maybe make the client do the particle effects for the weapons and the impact sounds using this info?
-
- entity e;
-
- if(!sound_allowed(MSG_BROADCAST, dmgowner))
- deathtype |= 0x8000;
-
- e = spawn();
- setorigin(e, org);
- e.projectiledeathtype = deathtype;
- e.dmg = coredamage;
- e.dmg_edge = edgedamage;
- e.dmg_radius = rad;
- e.dmg_force = vlen(force);
- e.velocity = force;
- e.oldorigin_x = compressShortVector(e.velocity);
- e.species = bloodtype;
-
- Net_LinkEntity(e, false, 0.2, Damage_DamageInfo_SendEntity);
-}
+#include "../lib/csqcmodel/sv_model.qh"
+#include "../lib/warpzone/common.qh"
void UpdateFrags(entity player, float f)
{
if(g_weaponarena_random)
{
// after a frag, exchange the current weapon (or the culprit, if detectable) by a new random weapon
- float culprit;
- culprit = DEATH_WEAPONOF(deathtype);
- if(!culprit)
- culprit = attacker.weapon;
- else if(!(attacker.weapons & WepSet_FromWeapon(culprit)))
- culprit = attacker.weapon;
-
- if(g_weaponarena_random_with_blaster && culprit == WEP_BLASTER.m_id) // WEAPONTODO: Shouldn't this be in a mutator?
+ Weapon culprit = DEATH_WEAPONOF(deathtype);
+ if(!culprit) culprit = get_weaponinfo(attacker.weapon);
+ else if(!(attacker.weapons & (culprit.m_wepset))) culprit = get_weaponinfo(attacker.weapon);
+
+ if(g_weaponarena_random_with_blaster && culprit == WEP_BLASTER) // WEAPONTODO: Shouldn't this be in a mutator?
{
// no exchange
}
{
if(!GiveFrags_randomweapons)
{
- GiveFrags_randomweapons = spawn();
- GiveFrags_randomweapons.classname = "GiveFrags_randomweapons";
+ GiveFrags_randomweapons = new(GiveFrags_randomweapons);
}
if(warmup_stage)
// all others (including the culprit): remove
GiveFrags_randomweapons.weapons &= ~attacker.weapons;
- GiveFrags_randomweapons.weapons &= ~WepSet_FromWeapon(culprit);
+ GiveFrags_randomweapons.weapons &= ~(culprit.m_wepset);
// among the remaining ones, choose one by random
W_RandomWeapons(GiveFrags_randomweapons, 1);
if(GiveFrags_randomweapons.weapons)
{
attacker.weapons |= GiveFrags_randomweapons.weapons;
- attacker.weapons &= ~WepSet_FromWeapon(culprit);
+ attacker.weapons &= ~(culprit.m_wepset);
}
}
{
if(DEATH_ISSPECIAL(deathtype))
{
- entity deathent = deathtypes[(deathtype - DT_FIRST)];
+ entity deathent = Deathtypes_from(deathtype - DT_FIRST);
if (!deathent) { backtrace("Obituary_SpecialDeath: Could not find deathtype entity!\n"); return; }
if(murder)
string s1, string s2, string s3,
float f1, float f2)
{
- float death_weapon = DEATH_WEAPONOF(deathtype);
- if(death_weapon)
+ Weapon death_weapon = DEATH_WEAPONOF(deathtype);
+ if (death_weapon != WEP_Null)
{
w_deathtype = deathtype;
- int death_message = WEP_ACTION(death_weapon, ((murder) ? WR_KILLMESSAGE : WR_SUICIDEMESSAGE));
+ int death_message = ((murder) ? death_weapon.wr_killmessage(death_weapon) : death_weapon.wr_suicidemessage(death_weapon));
w_deathtype = false;
if (death_message)
return false;
}
+.int buffs; // TODO: remove
+
void Obituary(entity attacker, entity inflictor, entity targ, int deathtype)
{
// Sanity check
{
if(DEATH_ISSPECIAL(deathtype))
{
- if(deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
+ if(deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
{
Obituary_SpecialDeath(targ, false, deathtype, targ.netname, deathlocation, "", targ.team, 0, 0);
}
else
{
- switch(deathtype)
+ switch(DEATH_ENT(deathtype))
{
case DEATH_MIRRORDAMAGE:
{
}
float f3 = 0;
- if(deathtype == DEATH_BUFF)
+ if(deathtype == DEATH_BUFF.m_id)
f3 = attacker.buffs;
if (!Obituary_WeaponDeath(targ, true, deathtype, targ.netname, attacker.netname, deathlocation, targ.killcount, kill_count_to_attacker))
// =============
else
{
- switch(deathtype)
+ switch(DEATH_ENT(deathtype))
{
// For now, we're just forcing HURTTRIGGER to behave as "DEATH_VOID" and giving it no special options...
// Later on you will only be able to make custom messages using DEATH_CUSTOM,
targ.revive_progress = ((frozen_type == 3) ? 1 : 0);
targ.health = ((frozen_type == 3) ? targ_maxhealth : 1);
targ.revive_speed = freeze_time;
+ self.bot_attack = false;
- entity ice, head;
- ice = spawn();
+ entity ice = new(ice);
ice.owner = targ;
- ice.classname = "ice";
ice.scale = targ.scale;
ice.think = Ice_Think;
ice.nextthink = time;
ice.frame = floor(random() * 21); // ice model has 20 different looking frames
- setmodel(ice, "models/ice/ice.md3");
+ setmodel(ice, MDL_ICE);
ice.alpha = 1;
ice.colormod = Team_ColorRGB(targ.team);
ice.glowmod = ice.colormod;
targ.iceblock = ice;
targ.revival_time = 0;
- SELFCALL(ice, Ice_Think());
- SELFCALL_DONE();
+ WITH(entity, self, ice, Ice_Think());
RemoveGrapplingHook(targ);
+ entity head;
FOR_EACH_PLAYER(head)
if(head.hook.aiment == targ)
RemoveGrapplingHook(head);
void Unfreeze (entity targ)
{
+ if(!targ.frozen)
+ return;
+
if(targ.frozen && targ.frozen != 3) // only reset health if target was frozen
targ.health = ((IS_PLAYER(targ)) ? start_health : targ.max_health);
targ.frozen = 0;
targ.revive_progress = 0;
targ.revival_time = time;
+ self.bot_attack = true;
WaypointSprite_Kill(targ.waypointsprite_attached);
mirrordamage = 0;
mirrorforce = 0;
- if (gameover || targ.killcount == -666)
+ if (gameover || targ.killcount == FRAGS_SPECTATOR)
return;
setself(targ);
RemoveGrapplingHook(targ); // STOP THAT, you parasite!
// special rule: gravity bomb does not hit team mates (other than for disconnecting the hook)
- if(DEATH_ISWEAPON(deathtype, WEP_HOOK.m_id) || DEATH_ISWEAPON(deathtype, WEP_TUBA.m_id))
+ if(DEATH_ISWEAPON(deathtype, WEP_HOOK) || DEATH_ISWEAPON(deathtype, WEP_TUBA))
{
if(IS_PLAYER(targ))
if(SAME_TEAM(targ, attacker))
}
}
- if(deathtype == DEATH_KILL || deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE)
+ if(deathtype == DEATH_KILL.m_id || deathtype == DEATH_TEAMCHANGE.m_id || deathtype == DEATH_AUTOTEAMCHANGE.m_id)
{
// exit the vehicle before killing (fixes a crash)
if(IS_PLAYER(targ) && targ.vehicle)
targ.flags -= targ.flags & FL_GODMODE;
damage = 100000;
}
- else if(deathtype == DEATH_MIRRORDAMAGE || deathtype == DEATH_NOAMMO)
+ else if(deathtype == DEATH_MIRRORDAMAGE.m_id || deathtype == DEATH_NOAMMO.m_id)
{
// no processing
}
else
{
// nullify damage if teamplay is on
- if(deathtype != DEATH_TELEFRAG)
+ if(deathtype != DEATH_TELEFRAG.m_id)
if(IS_PLAYER(attacker))
{
if(IS_PLAYER(targ) && targ != attacker && (IS_INDEPENDENT_PLAYER(attacker) || IS_INDEPENDENT_PLAYER(targ)))
force = frag_force;
if(targ.frozen)
- if(deathtype != DEATH_HURTTRIGGER && deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_AUTOTEAMCHANGE)
+ if(deathtype != DEATH_HURTTRIGGER.m_id && deathtype != DEATH_TEAMCHANGE.m_id && deathtype != DEATH_AUTOTEAMCHANGE.m_id)
{
- if(autocvar_g_freezetag_revive_falldamage > 0)
- if(deathtype == DEATH_FALL)
- if(damage >= autocvar_g_freezetag_revive_falldamage)
+ if(autocvar_g_frozen_revive_falldamage > 0)
+ if(deathtype == DEATH_FALL.m_id)
+ if(damage >= autocvar_g_frozen_revive_falldamage)
{
Unfreeze(targ);
- targ.health = autocvar_g_freezetag_revive_falldamage_health;
+ targ.health = autocvar_g_frozen_revive_falldamage_health;
Send_Effect(EFFECT_ICEORGLASS, targ.origin, '0 0 0', 3);
Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, targ.netname);
Send_Notification(NOTIF_ONE, targ, MSG_CENTER, CENTER_FREEZETAG_REVIVE_SELF);
}
damage = 0;
- force *= autocvar_g_freezetag_frozen_force;
+ force *= autocvar_g_frozen_force;
}
- if(targ.frozen && deathtype == DEATH_HURTTRIGGER && !autocvar_g_freezetag_frozen_damage_trigger)
+ if(targ.frozen && deathtype == DEATH_HURTTRIGGER.m_id && !autocvar_g_frozen_damage_trigger)
{
Send_Effect(EFFECT_TELEPORT, targ.origin, '0 0 0', 1);
// count the damage
if(attacker)
if(!targ.deadflag)
- if(deathtype != DEATH_BUFF)
+ if(deathtype != DEATH_BUFF.m_id)
if(targ.takedamage == DAMAGE_AIM)
if(targ != attacker)
{
{
if(damage > 0)
{
- if(deathtype != DEATH_FIRE)
+ if(deathtype != DEATH_FIRE.m_id)
{
if(victim.BUTTON_CHAT)
attacker.typehitsound += 1;
}
else
{
- if(deathtype != DEATH_FIRE)
+ if(deathtype != DEATH_FIRE.m_id)
{
attacker.typehitsound += 1;
}
vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
if(self.movetype == MOVETYPE_PHYSICS)
{
- entity farcent;
- farcent = spawn();
- farcent.classname = "farce";
+ entity farcent = new(farce);
farcent.enemy = self;
farcent.movedir = farce * 10;
if(self.mass)
farcent.origin = hitloc;
farcent.forcetype = FORCETYPE_FORCEATPOS;
farcent.nextthink = time + 0.1;
- farcent.think = SUB_Remove;
+ farcent.think = SUB_Remove_self;
}
else
{
attacker = attacker_save;
force = normalize(attacker.origin + attacker.view_ofs - hitloc) * mirrorforce;
- Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE, attacker.origin, force);
+ Damage(attacker, inflictor, attacker, mirrordamage, DEATH_MIRRORDAMAGE.m_id, attacker.origin, force);
}
}
total_damage_to_creatures = 0;
if(deathtype != (WEP_HOOK.m_id | HITTYPE_SECONDARY | HITTYPE_BOUNCE)) // only send gravity bomb damage once
- if(DEATH_WEAPONOF(deathtype) != WEP_TUBA.m_id) // do not send tuba damage (bandwidth hog)
+ if(DEATH_WEAPONOF(deathtype) != WEP_TUBA) // do not send tuba damage (bandwidth hog)
{
force = inflictorvelocity;
if(vlen(force) == 0)
RadiusDamage_running = 0;
if(!DEATH_ISSPECIAL(deathtype))
- accuracy_add(attacker, DEATH_WEAPONOF(deathtype), 0, min(coredamage, stat_damagedone));
+ accuracy_add(attacker, DEATH_WEAPONOF(deathtype).m_id, 0, min(coredamage, stat_damagedone));
return total_damage_to_creatures;
}
if(!e.fire_burner)
{
// print("adding a fire burner to ", e.classname, "\n");
- e.fire_burner = spawn();
- e.fire_burner.classname = "fireburner";
+ e.fire_burner = new(fireburner);
e.fire_burner.think = fireburner_think;
e.fire_burner.nextthink = time;
e.fire_burner.owner = e;
}
}
if(accuracy_isgooddamage(o, e))
- accuracy_add(o, DEATH_WEAPONOF(dt), 0, max(0, totaldamage - mindamage));
+ accuracy_add(o, DEATH_WEAPONOF(dt).m_id, 0, max(0, totaldamage - mindamage));
return max(0, totaldamage - mindamage); // can never be negative, but to make sure
}
else
e.fire_owner = o;
e.fire_hitsound = false;
if(accuracy_isgooddamage(o, e))
- accuracy_add(o, DEATH_WEAPONOF(dt), 0, d);
+ accuracy_add(o, DEATH_WEAPONOF(dt).m_id, 0, d);
return d;
}
}
{
t = autocvar_g_balance_firetransfer_time * (e.fire_endtime - time);
d = autocvar_g_balance_firetransfer_damage * e.fire_damagepersec * t;
- Fire_AddDamage(other, o, d, t, DEATH_FIRE);
+ Fire_AddDamage(other, o, d, t, DEATH_FIRE.m_id);
}
}
}