#include "teamplay.qh"
#include "weapons/throwing.qh"
#include "command/common.qh"
+#include "../common/state.qh"
#include "../common/anim.qh"
#include "../common/animdecide.qh"
#include "../common/csqcmodel_settings.qh"
#include "../common/minigames/sv_minigames.qh"
+#include "../common/physics/player.qh"
+#include "../common/effects/qc/all.qh"
#include "../common/mutators/mutator/waypoints/waypointsprites.qh"
#include "../common/triggers/include.qh"
void CopyBody_Think()
{SELFPARAM();
- if(self.CopyBody_nextthink && time > self.CopyBody_nextthink)
+ if(this.CopyBody_nextthink && time > this.CopyBody_nextthink)
{
- self.CopyBody_think();
- if(wasfreed(self))
+ this.CopyBody_think();
+ if(wasfreed(this))
return;
- self.CopyBody_nextthink = self.nextthink;
- self.CopyBody_think = self.think;
- self.think = CopyBody_Think;
+ this.CopyBody_nextthink = this.nextthink;
+ this.CopyBody_think = this.think;
+ this.think = CopyBody_Think;
}
- CSQCMODEL_AUTOUPDATE(self);
- self.nextthink = time;
+ CSQCMODEL_AUTOUPDATE(this);
+ this.nextthink = time;
}
-void CopyBody(float keepvelocity)
-{SELFPARAM();
- if (self.effects & EF_NODRAW)
+void CopyBody(entity this, float keepvelocity)
+{
+ if (this.effects & EF_NODRAW)
return;
- setself(new(body));
- self.enemy = this;
- self.lip = this.lip;
- self.colormap = this.colormap;
- self.iscreature = this.iscreature;
- self.teleportable = this.teleportable;
- self.damagedbycontents = this.damagedbycontents;
- self.angles = this.angles;
- self.v_angle = this.v_angle;
- self.avelocity = this.avelocity;
- self.damageforcescale = this.damageforcescale;
- self.effects = this.effects;
- self.glowmod = this.glowmod;
- self.event_damage = this.event_damage;
- self.anim_state = this.anim_state;
- self.anim_time = this.anim_time;
- self.anim_lower_action = this.anim_lower_action;
- self.anim_lower_time = this.anim_lower_time;
- self.anim_upper_action = this.anim_upper_action;
- self.anim_upper_time = this.anim_upper_time;
- self.anim_implicit_state = this.anim_implicit_state;
- self.anim_implicit_time = this.anim_implicit_time;
- self.anim_lower_implicit_action = this.anim_lower_implicit_action;
- self.anim_lower_implicit_time = this.anim_lower_implicit_time;
- self.anim_upper_implicit_action = this.anim_upper_implicit_action;
- self.anim_upper_implicit_time = this.anim_upper_implicit_time;
- self.dphitcontentsmask = this.dphitcontentsmask;
- self.death_time = this.death_time;
- self.pain_finished = this.pain_finished;
- self.health = this.health;
- self.armorvalue = this.armorvalue;
- self.armortype = this.armortype;
- self.model = this.model;
- self.modelindex = this.modelindex;
- self.skin = this.skin;
- self.species = this.species;
- self.movetype = this.movetype;
- self.solid = this.solid;
- self.ballistics_density = this.ballistics_density;
- self.takedamage = this.takedamage;
- self.customizeentityforclient = this.customizeentityforclient;
- self.uncustomizeentityforclient = this.uncustomizeentityforclient;
- self.uncustomizeentityforclient_set = this.uncustomizeentityforclient_set;
+ entity clone = new(body);
+ clone.enemy = this;
+ clone.lip = this.lip;
+ clone.colormap = this.colormap;
+ clone.iscreature = this.iscreature;
+ clone.teleportable = this.teleportable;
+ clone.damagedbycontents = this.damagedbycontents;
+ clone.angles = this.angles;
+ clone.v_angle = this.v_angle;
+ clone.avelocity = this.avelocity;
+ clone.damageforcescale = this.damageforcescale;
+ clone.effects = this.effects;
+ clone.glowmod = this.glowmod;
+ clone.event_damage = this.event_damage;
+ clone.anim_state = this.anim_state;
+ clone.anim_time = this.anim_time;
+ clone.anim_lower_action = this.anim_lower_action;
+ clone.anim_lower_time = this.anim_lower_time;
+ clone.anim_upper_action = this.anim_upper_action;
+ clone.anim_upper_time = this.anim_upper_time;
+ clone.anim_implicit_state = this.anim_implicit_state;
+ clone.anim_implicit_time = this.anim_implicit_time;
+ clone.anim_lower_implicit_action = this.anim_lower_implicit_action;
+ clone.anim_lower_implicit_time = this.anim_lower_implicit_time;
+ clone.anim_upper_implicit_action = this.anim_upper_implicit_action;
+ clone.anim_upper_implicit_time = this.anim_upper_implicit_time;
+ clone.dphitcontentsmask = this.dphitcontentsmask;
+ clone.death_time = this.death_time;
+ clone.pain_finished = this.pain_finished;
+ clone.health = this.health;
+ clone.armorvalue = this.armorvalue;
+ clone.armortype = this.armortype;
+ clone.model = this.model;
+ clone.modelindex = this.modelindex;
+ clone.skin = this.skin;
+ clone.species = this.species;
+ clone.movetype = this.movetype;
+ clone.solid = this.solid;
+ clone.ballistics_density = this.ballistics_density;
+ clone.takedamage = this.takedamage;
+ clone.customizeentityforclient = this.customizeentityforclient;
+ clone.uncustomizeentityforclient = this.uncustomizeentityforclient;
+ clone.uncustomizeentityforclient_set = this.uncustomizeentityforclient_set;
if (keepvelocity == 1)
- self.velocity = this.velocity;
- self.oldvelocity = self.velocity;
- self.alpha = this.alpha;
- self.fade_time = this.fade_time;
- self.fade_rate = this.fade_rate;
- //self.weapon = this.weapon;
- setorigin(self, this.origin);
- setsize(self, this.mins, this.maxs);
- self.prevorigin = this.origin;
- self.reset = SUB_Remove;
-
- Drag_MoveDrag(this, self);
-
- if(self.colormap <= maxclients && self.colormap > 0)
- self.colormap = 1024 + this.clientcolors;
-
- CSQCMODEL_AUTOINIT(self);
- self.CopyBody_nextthink = this.nextthink;
- self.CopyBody_think = this.think;
- self.nextthink = time;
- self.think = CopyBody_Think;
+ clone.velocity = this.velocity;
+ clone.oldvelocity = clone.velocity;
+ clone.alpha = this.alpha;
+ clone.fade_time = this.fade_time;
+ clone.fade_rate = this.fade_rate;
+ //clone.weapon = this.weapon;
+ setorigin(clone, this.origin);
+ setsize(clone, this.mins, this.maxs);
+ clone.prevorigin = this.origin;
+ clone.reset = SUB_Remove;
+ clone._ps = this._ps;
+
+ Drag_MoveDrag(this, clone);
+
+ if(clone.colormap <= maxclients && clone.colormap > 0)
+ clone.colormap = 1024 + this.clientcolors;
+
+ CSQCMODEL_AUTOINIT(clone);
+ clone.CopyBody_nextthink = this.nextthink;
+ clone.CopyBody_think = this.think;
+ clone.nextthink = time;
+ clone.think = CopyBody_Think;
// "bake" the current animation frame for clones (they don't get clientside animation)
- animdecide_load_if_needed(self);
- animdecide_setframes(self, false, frame, frame1time, frame2, frame2time);
-
- setself(this);
+ animdecide_load_if_needed(clone);
+ animdecide_setframes(clone, false, frame, frame1time, frame2, frame2time);
}
void player_setupanimsformodel()
void player_anim ()
{SELFPARAM();
- int deadbits = (self.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2));
- if(IS_DEAD(self)) {
+ int deadbits = (this.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2));
+ if(IS_DEAD(this)) {
if (!deadbits) {
// Decide on which death animation to use.
if(random() < 0.5)
deadbits = 0;
}
int animbits = deadbits;
- if(STAT(FROZEN, self))
+ if(STAT(FROZEN, this))
animbits |= ANIMSTATE_FROZEN;
- if(self.movetype == MOVETYPE_FOLLOW)
+ if(this.movetype == MOVETYPE_FOLLOW)
animbits |= ANIMSTATE_FOLLOW;
- if(self.crouch)
+ if(this.crouch)
animbits |= ANIMSTATE_DUCK;
- animdecide_setstate(self, animbits, false);
- animdecide_setimplicitstate(self, (IS_ONGROUND(self)));
+ animdecide_setstate(this, animbits, false);
+ animdecide_setimplicitstate(this, IS_ONGROUND(this));
}
void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
{
this.pusher = attacker;
this.pushltime = time + autocvar_g_maxpushtime;
- this.istypefrag = this.BUTTON_CHAT;
+ this.istypefrag = PHYS_INPUT_BUTTON_CHAT(this);
}
else if(time < this.pushltime)
{
this.istypefrag = 0;
}
+ if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1)
+ {
+ vector v = healtharmor_applydamage(this.armorvalue, max(0, autocvar_g_spawnshield_blockdamage), deathtype, damage);
+ take = v.x;
+ save = v.y;
+ }
+
frag_damage = damage;
MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor, inflictor, attacker, this, force, take, save);
take = bound(0, damage_take, this.health);
if (take > 100)
Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, this, attacker);
- if (time >= this.spawnshieldtime)
+ if (time >= this.spawnshieldtime || autocvar_g_spawnshield_blockdamage < 1)
{
if (!(this.flags & FL_GODMODE))
{
{
if(deathtype == DEATH_FALL.m_id)
PlayerSound(this, playersound_fall, CH_PAIN, VOICETYPE_PLAYERSOUND);
- else if(this.health > 75) // TODO make a "gentle" version?
+ else if(this.health > 75)
PlayerSound(this, playersound_pain100, CH_PAIN, VOICETYPE_PLAYERSOUND);
else if(this.health > 50)
PlayerSound(this, playersound_pain75, CH_PAIN, VOICETYPE_PLAYERSOUND);
if(valid_damage_for_weaponstats)
WeaponStats_LogKill(awep.m_id, abot, PS(this).m_weapon.m_id, vbot);
- if(autocvar_sv_gentle < 1) // TODO make a "gentle" version?
+ if(autocvar_sv_gentle < 1)
if(sound_allowed(MSG_BROADCAST, attacker))
{
if(deathtype == DEATH_DROWN.m_id)
if(accuracy_isgooddamage(attacker, this))
attacker.accuracy.(accuracy_frags[w.m_id-1]) += 1;
- WITH(entity, self, this, MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, this, deathtype));
+ MUTATOR_CALLHOOK(PlayerDies, inflictor, attacker, this, deathtype);
excess = frag_damage;
Weapon wep = PS(this).m_weapon;
- WITH(entity, self, this, wep.wr_playerdeath(wep));
+ WITHSELF(this, wep.wr_playerdeath(wep));
RemoveGrapplingHook(this);
// reset fields the weapons may use just in case
FOREACH(Weapons, it != WEP_Null, LAMBDA(
- WITH(entity, self, this, it.wr_resetplayer(it));
+ WITHSELF(this, it.wr_resetplayer(it));
for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
{
ATTACK_FINISHED_FOR(this, it.m_id, slot) = 0;