]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_damage.qc
Only set z axis target if the flying monster has vertical movement enabled
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_damage.qc
index d4bb9a44982bdbe9bb87b12243cfb5da18e62eee..5b310818c1319a0e57de122a528ff86ac563c804 100644 (file)
@@ -128,7 +128,7 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype)
                culprit = DEATH_WEAPONOF(deathtype);
                if(!culprit)
                        culprit = attacker.weapon;
-               else if(!WEPSET_CONTAINS_EW(attacker, culprit))
+               else if(!(attacker.weapons & WepSet_FromWeapon(culprit)))
                        culprit = attacker.weapon;
 
                if(g_weaponarena_random_with_laser && culprit == WEP_LASER)
@@ -144,26 +144,26 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype)
                        }
 
                        if(inWarmupStage)
-                               WEPSET_COPY_EA(GiveFrags_randomweapons, warmup_start_weapons);
+                               GiveFrags_randomweapons.weapons = warmup_start_weapons;
                        else
-                               WEPSET_COPY_EA(GiveFrags_randomweapons, start_weapons);
+                               GiveFrags_randomweapons.weapons = start_weapons;
 
                        // all others (including the culprit): remove
-                       WEPSET_ANDNOT_EE(GiveFrags_randomweapons, attacker);
-                       WEPSET_ANDNOT_EW(GiveFrags_randomweapons, culprit);
+                       GiveFrags_randomweapons.weapons &= ~attacker.weapons;
+                       GiveFrags_randomweapons.weapons &= ~WepSet_FromWeapon(culprit);
 
                        // among the remaining ones, choose one by random
                        W_RandomWeapons(GiveFrags_randomweapons, 1);
 
-                       if(!WEPSET_EMPTY_E(GiveFrags_randomweapons))
+                       if(GiveFrags_randomweapons.weapons)
                        {
-                               WEPSET_OR_EE(attacker, GiveFrags_randomweapons);
-                               WEPSET_ANDNOT_EW(attacker, culprit);
+                               attacker.weapons |= GiveFrags_randomweapons.weapons;
+                               attacker.weapons &= ~WepSet_FromWeapon(culprit);
                        }
                }
 
                // after a frag, choose another random weapon set
-               if not(WEPSET_CONTAINS_EW(attacker, attacker.weapon))
+               if not(attacker.weapons & WepSet_FromWeapon(attacker.weapon))
                        W_SwitchWeapon_Force(attacker, w_getbestweapon(attacker));
        }
 
@@ -552,10 +552,7 @@ void Ice_Think()
 
 void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypoint)
 {
-       float monster = (targ.flags & FL_MONSTER);
-       float player = (targ.flags & FL_CLIENT);
-       
-       if(!player && !monster) // only specified entities can be freezed
+       if(!IS_PLAYER(targ) && !(targ.flags & FL_MONSTER)) // only specified entities can be freezed
                return;
                
        if(targ.frozen)
@@ -566,7 +563,7 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
        targ.health = 1;
        targ.revive_speed = freeze_time;
 
-       entity ice;
+       entity ice, head;
        ice = spawn();
        ice.owner = targ;
        ice.classname = "ice";
@@ -576,7 +573,7 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
        ice.frame = floor(random() * 21); // ice model has 20 different looking frames
        setmodel(ice, "models/ice/ice.md3");
        ice.alpha = 1;
-       ice.colormod = Team_ColorRGB(self.team);
+       ice.colormod = Team_ColorRGB(targ.team);
        ice.glowmod = ice.colormod;
        targ.iceblock = ice;
 
@@ -588,6 +585,10 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
 
        RemoveGrapplingHook(targ);
        
+       FOR_EACH_PLAYER(head)
+       if(head.hook.aiment == targ)
+               RemoveGrapplingHook(head);
+       
        // add waypoint
        if(show_waypoint)       
                WaypointSprite_Spawn("frozen", 0, 0, targ, '0 0 64', world, targ.team, targ, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
@@ -595,17 +596,22 @@ void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypo
 
 void Unfreeze (entity targ)
 {
-       if not(targ.frozen)
-               return; // not even frozen?
-               
+       if(targ.frozen) // only reset health if target was frozen
+               targ.health = ((IS_PLAYER(targ)) ? autocvar_g_balance_health_start : targ.max_health);
+
+       entity head;
        targ.frozen = 0;
        targ.revive_progress = 0;
-       targ.health = ((targ.classname == STR_PLAYER) ? autocvar_g_balance_health_start : targ.max_health);
        
        WaypointSprite_Kill(targ.waypointsprite_attached);
+       
+       FOR_EACH_PLAYER(head)
+       if(head.hook.aiment == targ)
+               RemoveGrapplingHook(head);
 
        // remove the ice block
-       remove(targ.iceblock);
+       if(targ.iceblock)
+               remove(targ.iceblock);
        targ.iceblock = world;
 }
 
@@ -691,13 +697,10 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                                {
                                                        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?
+                                                       if(complainteamdamage > 0)
                                                                mirrordamage = autocvar_g_mirrordamage * complainteamdamage;
                                                        mirrorforce = autocvar_g_mirrordamage * vlen(force);
-                                                       if(g_ca)
-                                                               damage = 0;
-                                                       else
-                                                               damage = autocvar_g_friendlyfire * damage;
+                                                       damage = autocvar_g_friendlyfire * damage;
                                                        // mirrordamage will be used LATER
 
                                                        if(autocvar_g_mirrordamage_virtual)
@@ -737,7 +740,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        mirrorforce *= g_weaponforcefactor;
                }
                
-               if(((targ.frozen == 2 && attacker.monsterid != MONSTER_SPIDER) || (targ.frozen == 1)) && deathtype != DEATH_HURTTRIGGER)
+               if(((targ.frozen == 2 && attacker.monsterid != MON_SPIDER) || (targ.frozen == 1)) && deathtype != DEATH_HURTTRIGGER)
                {
                        damage = 0;
                        force *= 0.2;
@@ -748,7 +751,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                frag_target = targ;
                frag_damage = damage;
                frag_force = force;
-        frag_deathtype = deathtype;
+               frag_deathtype = deathtype;
                frag_mirrordamage = mirrordamage;
                MUTATOR_CALLHOOK(PlayerDamage_Calculate);
                damage = frag_damage;
@@ -779,7 +782,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
 
                if (targ == attacker)
                {
-                       if(g_ca || (g_cts && !autocvar_g_cts_selfdamage))
+                       if(g_cts && !autocvar_g_cts_selfdamage)
                                damage = 0;
                        else
                                damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself
@@ -843,7 +846,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
        // apply push
        if (self.damageforcescale)
        if (vlen(force))
-       if (!IS_PLAYER(self) || time >= self.spawnshieldtime || g_midair)
+       if (!IS_PLAYER(self) || time >= self.spawnshieldtime)
        {
                vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor);
                if(self.movetype == MOVETYPE_PHYSICS)
@@ -862,7 +865,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                }
                else
                        self.velocity = self.velocity + farce;
-               self.flags &~= FL_ONGROUND;
+               self.flags &= ~FL_ONGROUND;
                UpdateCSQCProjectile(self);
        }
        // apply damage
@@ -1301,7 +1304,7 @@ void Fire_ApplyEffect(entity e)
        if(Fire_IsBurning(e))
                e.effects |= EF_FLAME;
        else
-               e.effects &~= EF_FLAME;
+               e.effects &= ~EF_FLAME;
 }
 
 void fireburner_think()