]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Remove freeze code, monsters no longer use freeze attacks
authorMario <mario.mario@y7mail.com>
Tue, 24 Dec 2013 23:12:05 +0000 (10:12 +1100)
committerMario <mario.mario@y7mail.com>
Tue, 24 Dec 2013 23:12:05 +0000 (10:12 +1100)
28 files changed:
qcsrc/client/View.qc
qcsrc/client/projectile.qc
qcsrc/client/waypointsprites.qc
qcsrc/common/deathtypes.qh
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/server/accuracy.qc
qcsrc/server/bot/aim.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/command/getreplies.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/movelib.qc
qcsrc/server/mutators/gamemode_ctf.qc
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/mutator_dodging.qc
qcsrc/server/progs.src
qcsrc/server/t_items.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/server/w_electro.qc

index 9acee0173954f67ea5f288042ce10d6ca2632786..8c9d59dd91f9a77e421d746a0b8193a8c449fb0f 100644 (file)
@@ -994,7 +994,7 @@ void CSQC_UpdateView(float w, float h)
                        }
                }
        }
-       
+
        float e1 = (autocvar_hud_postprocessing_maxbluralpha != 0);
        float e2 = (autocvar_hud_powerup != 0);
        if(autocvar_hud_postprocessing && (e1 || e2)) // TODO: Remove this code and re-do the postprocess handling in the engine, where it properly belongs.
@@ -1086,12 +1086,15 @@ void CSQC_UpdateView(float w, float h)
 
        //else
        {
-               if(getstati(STAT_FROZEN))
-                       drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
-               if(getstatf(STAT_REVIVE_PROGRESS))
+               if(gametype == MAPINFO_TYPE_FREEZETAG)
                {
-                       DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
-                       drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
+                       if(getstati(STAT_FROZEN))
+                               drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
+                       if(getstatf(STAT_REVIVE_PROGRESS))
+                       {
+                               DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
+                               drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
+                       }
                }
 
                if(autocvar_r_letterbox == 0)
index 518f0310294b0a2a326e1e0c6941189e864cd749..8cdcdf470c18c47dd2a97e5508f334b5ab647116 100644 (file)
@@ -307,7 +307,7 @@ void Ent_Projectile()
                        case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break;
                        case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; self.traileffect = particleeffectnum("TR_SEEKER"); break;
                        case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.traileffect = particleeffectnum("TR_SEEKER"); break;
-                       
+
                        case PROJECTILE_MAGE_SPIKE: setmodel(self, "models/ebomb.mdl"); self.traileffect = particleeffectnum("TR_VORESPIKE"); break;
                        case PROJECTILE_SHAMBLER_LIGHTNING: setmodel(self, "models/ebomb.mdl"); self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
 
index 3a54f7239ebc17633efddb4344d98b7494dab4d7..a3e856d1438197df091be171493946c75273a1c5 100644 (file)
@@ -316,7 +316,7 @@ string spritelookuptext(string s)
                case "item-shield": return _("Shield");
                case "item-fuelregen": return _("Fuel regen");
                case "item-jetpack": return _("Jet Pack");
-               case "frozen": return _("Frozen!");
+               case "freezetag_frozen": return _("Frozen!");
                case "tagged-target": return _("Tagged");
                case "vehicle": return _("Vehicle");
                default: return s;
index 35f4f16b2208b0f9f89bcd5985ef209bee4c1289..1265e7eea05736d3ac2270e1e0b3a33af5e141c5 100644 (file)
@@ -94,7 +94,7 @@ DEATHTYPES
 #define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
 #define DEATH_ISVEHICLE(t)            ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
 #define DEATH_ISTURRET(t)             ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST)
-#define DEATH_ISMONSTER(t)                       ((t) >= DEATH_MONSTER_FIRST && (t) <= DEATH_MONSTER_LAST)
+#define DEATH_ISMONSTER(t)            ((t) >= DEATH_MONSTER_FIRST && (t) <= DEATH_MONSTER_LAST)
 #define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
 #define DEATH_ISWEAPON(t,w)           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
 #define DEATH_WEAPONOF(t)             (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
index d340c09d780b2dabfd36176049de169a61545878..6156cd75b3cbd49ed0e315a141ff43675fa39e63 100644 (file)
@@ -60,7 +60,7 @@ float friend_needshelp(entity e)
                return FALSE;
        if(DIFF_TEAM(e, self) && e != self.monster_owner)
                return FALSE;
-       if(e.frozen)
+       if(e.freezetag_frozen)
                return FALSE;
        if(!IS_PLAYER(e))
                return ((e.flags & FL_MONSTER) && e.health < e.max_health);
index 28a78ceb87f4ddd8123e8cc72fef483ccfbc14d0..038ffb58c67845861722b165bbeb668380c7741d 100644 (file)
@@ -104,7 +104,7 @@ float monster_isvalidtarget (entity targ, entity ent)
        if(SAME_TEAM(targ, ent))
                return FALSE; // enemy is on our team
 
-       if (targ.frozen)
+       if (targ.freezetag_frozen)
                return FALSE; // ignore frozen
 
        if(autocvar_g_monsters_target_infront || ent.spawnflags & MONSTERFLAG_INFRONT)
@@ -538,26 +538,6 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_
 
        entity targ;
 
-       if(self.frozen)
-       {
-               self.revive_progress = bound(0, self.revive_progress + self.ticrate * self.revive_speed, 1);
-               self.health = max(1, self.max_health * self.revive_progress);
-
-               WaypointSprite_UpdateHealth(self.sprite, self.health);
-
-               movelib_beak_simple(stopspeed);
-
-               self.frame = manim_idle;
-
-               self.enemy = world;
-               self.nextthink = time + self.ticrate;
-
-               if(self.revive_progress >= 1)
-                       Unfreeze(self); // wait for next think before attacking
-
-               return; // no moving while frozen
-       }
-
        if(self.flags & FL_SWIM)
        {
                if(self.waterlevel < WATERLEVEL_WETFEET)
@@ -733,9 +713,6 @@ void monster_remove(entity mon)
        if(mon.weaponentity)
                remove(mon.weaponentity);
 
-       if(mon.iceblock)
-               remove(mon.iceblock);
-
        WaypointSprite_Kill(mon.sprite);
 
        remove(mon);
@@ -786,8 +763,6 @@ void monsters_reset()
        setorigin(self, self.pos1);
        self.angles = self.pos2;
 
-       Unfreeze(self); // remove any icy remains
-
        self.health = self.max_health;
        self.velocity = '0 0 0';
        self.enemy = world;
@@ -821,12 +796,6 @@ void monster_die(entity attacker, float gibbed)
        self.nextthink = time;
        self.ltime = time + 5;
 
-       if ( self.frozen )
-       {
-               Unfreeze(self); // remove any icy remains
-               self.health = 0; // reset by Unfreeze
-       }
-
        monster_dropitem();
 
        MonsterSound(monstersound_death, 0, FALSE, CH_VOICE);
@@ -871,10 +840,6 @@ void monster_die(entity attacker, float gibbed)
 
 void monsters_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
-
-       if(self.frozen && deathtype != DEATH_KILL)
-               return;
-
        if(time < self.pain_finished && deathtype != DEATH_KILL)
                return;
 
index ab057662b6f846907442cfd338203083a0d6b48e..b78cc4fcda0cdf02ef7f5ad9c03161f4e9464795 100644 (file)
@@ -113,7 +113,6 @@ float accuracy_isgooddamage(entity attacker, entity targ)
 
        if(!warmup_stage)
        if(targ_isvalid)
-       if(!targ.frozen)
        if(targ.deadflag == DEAD_NO)
        if(DIFF_TEAM(attacker, targ))
                return TRUE;
index 61f4ab5e8f307b8bc421b4f250090c5169652c0e..3467e2b395d61c7c1f28357fe0460b0a97011394 100644 (file)
@@ -111,7 +111,7 @@ float bot_shouldattack(entity e)
                        return FALSE;
        }
 
-       if(e.frozen)
+       if(e.freezetag_frozen)
                return FALSE;
 
        // If neither player has ball then don't attack unless the ball is on the
index ebb9ec5285820f5e7ee5f396a36c01c33cf96b00..19a1a2e85242902a135fb3182fdedab7f7035140 100644 (file)
@@ -168,8 +168,6 @@ void PutObserverInServer (void)
 
        Portal_ClearAll(self);
 
-       Unfreeze(self);
-
        if(self.alivetime)
        {
                if(!warmup_stage)
@@ -588,8 +586,6 @@ void PutClientInServer (void)
                                self.target = s;
                        activator = world;
                self = oldself;
-               
-               Unfreeze(self);
 
                spawn_spot = spot;
                MUTATOR_CALLHOOK(PlayerSpawn);
@@ -940,7 +936,7 @@ void ClientKill (void)
 {
        if(gameover) return;
        if(self.player_blocked) return;
-       if(self.frozen) return;
+       if(self.freezetag_frozen) return;
 
        ClientKill_TeamChange(0);
 }
@@ -1290,8 +1286,6 @@ void ClientDisconnect (void)
        MUTATOR_CALLHOOK(ClientDisconnect);
 
        Portal_ClearAll(self);
-       
-       Unfreeze(self);
 
        RemoveGrapplingHook(self);
 
@@ -1734,8 +1728,6 @@ void SpectateCopy(entity spectatee) {
        self.dmg_inflictor = spectatee.dmg_inflictor;
        self.v_angle = spectatee.v_angle;
        self.angles = spectatee.v_angle;
-       self.frozen = spectatee.frozen;
-       self.revive_progress = spectatee.revive_progress;
        if(!self.BUTTON_USE)
                self.fixangle = TRUE;
        setorigin(self, spectatee.origin);
@@ -2246,16 +2238,6 @@ void PlayerPreThink (void)
                return;
 #endif
 
-       if(self.frozen == 2)
-       {
-               self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1);
-               self.health = max(1, self.revive_progress * autocvar_g_balance_health_start);
-               self.iceblock.alpha = 1 - self.revive_progress;
-
-               if(self.revive_progress >= 1)
-                       Unfreeze(self);
-       }
-
        MUTATOR_CALLHOOK(PlayerPreThink);
 
        if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button
@@ -2380,7 +2362,7 @@ void PlayerPreThink (void)
                        do_crouch = 0;
                if(self.vehicle)
                        do_crouch = 0;
-               if(self.frozen)
+               if(self.freezetag_frozen)
                        do_crouch = 0;
                if(self.weapon == WEP_SHOTGUN && self.weaponentity.wframe == WFRAME_FIRE2 && time < self.weapon_nextthink)
                        do_crouch = 0;
index 8c7bd126e96c87ec7801ced880dd8dd293b9afb6..0098561373abb930bb7d869d71ac88f0bffeac33 100644 (file)
@@ -19,9 +19,6 @@ When you press the jump key
 */
 void PlayerJump (void)
 {
-       if(self.frozen)
-               return; // no jumping in freezetag when frozen
-               
        float doublejump = FALSE;
 
        player_multijump = doublejump;
@@ -787,25 +784,12 @@ void SV_PlayerPhysics()
        self.disableclientprediction = 0;
        if(time < self.ladder_time)
                self.disableclientprediction = 1;
-               
+
        if(time < self.spider_slowness)
        {
                self.stat_sv_maxspeed *= 0.5; // half speed while slow from spider
                self.stat_sv_airspeedlimit_nonqw *= 0.5;
        }
-               
-       if(self.frozen)
-       {
-               if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
-               {
-                       self.movement_x = bound(-5, self.movement_x, 5);
-                       self.movement_y = bound(-5, self.movement_y, 5);
-                       self.movement_z = bound(-5, self.movement_z, 5);
-               }
-               else
-                       self.movement = '0 0 0';
-               self.disableclientprediction = 1;
-       }
 
        MUTATOR_CALLHOOK(PlayerPhysics);
 
@@ -1008,7 +992,7 @@ void SV_PlayerPhysics()
                        PM_Accelerate(wishdir, wishspeed, wishspeed, autocvar_sv_accelerate*maxspd_mod, 1, 0, 0, 0);
                }
        }
-       else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO) && !self.frozen)
+       else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!autocvar_g_jetpack_fuel || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO) && !self.freezetag_frozen)
        {
                //makevectors(self.v_angle_y * '0 1 0');
                makevectors(self.v_angle);
index b51f295ea3bcb91fa8bc3f8a96bffcb4a7549bfb..0229d3ed5734a9aebe9f77021c79e4d249d939bb 100644 (file)
@@ -246,7 +246,7 @@ void player_anim (void)
                else
                        deadbits = ANIMSTATE_DEAD2;
        float animbits = deadbits;
-       if(self.frozen)
+       if(self.freezetag_frozen)
                animbits |= ANIMSTATE_FROZEN;
        if(self.crouch)
                animbits |= ANIMSTATE_DUCK;
index ed4fa901f1708c406133a388ecdba8d791c81638..88397a88021feff495ada18a2d140c0412849c6e 100644 (file)
@@ -330,8 +330,6 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
        w = self.weapon;
        if (w == 0)
                return; // just in case
-       if(self.frozen)
-               return;
        if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon))
                return;
        if(!autocvar_g_weapon_throwable)
@@ -360,7 +358,7 @@ float forbidWeaponUse()
                return 1;
        if(self.player_blocked)
                return 1;
-       if(self.frozen)
+       if(self.freezetag_frozen)
                return 1;
        return 0;
 }
index c0fd3dfbd689ef4becf0290ff00509b5f6b4f016..8d72a798bab35d21c183711337a95095bcced570 100644 (file)
@@ -163,7 +163,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
        // track max damage
        if(accuracy_canbegooddamage(ent))
                accuracy_add(ent, ent.weapon, maxdamage, 0);
-               
+
        W_HitPlotAnalysis(ent, v_forward, v_right, v_up);
 
        if(ent.weaponentity.movedir_x > 0)
index 5e92523f7caf9454a7f64568620fe17aa9982880..b8979155d9d3f0a139a38a9d88bab925d001bf3d 100644 (file)
@@ -345,13 +345,13 @@ string getmonsterlist()
 {
        string monsterlist = "", col;
        float i;
-       
+
        for(i = MON_FIRST; i <= MON_LAST; ++i)
        {
                if(mod(i, 2)) { col = "^2"; }
                else { col = "^3"; }
                monsterlist = sprintf("%s%s%s ", monsterlist, col, (get_monsterinfo(i)).netname);
        }
-       
+
        return sprintf("^7Monsters available: %s\n", monsterlist);
 }
index c98ed3cfed0c94cc1700f8790475f8eb1b04863c..73c04ba910af3c71f3145c72c329467a0c6922fd 100644 (file)
@@ -147,32 +147,32 @@ void GameCommand_butcher(float request)
                {
                        if(autocvar_g_campaign) { print("This command doesn't work in campaign mode.\n"); return; }
                        if(g_invasion) { print("This command doesn't work during an invasion.\n"); return; }
-               
-            float removed_count = 0;
+
+                       float removed_count = 0;
                        entity head;
-                       
+
                        FOR_EACH_MONSTER(head)
                        {
                                monster_remove(head);
                                ++removed_count;
                        }
-                       
+
                        FOR_EACH_PLAYER(head)
                                head.monstercount = 0;
-                               
+
                        monsters_total = 0; // reset stats?
                        monsters_killed = 0;
-                               
+
                        totalspawned = 0;
-                       
+
                        if(removed_count <= 0)
                                print("No monsters to kill\n");
                        else
                                print(sprintf("Killed %d monster%s\n", removed_count, ((removed_count == 1) ? "" : "s")));
-                               
+
                        return; // never fall through to usage
                }
-                       
+
                default:
                case CMD_REQUEST_USAGE:
                {
index 3823fa0a5cd161316912afa451ef8148d89f6fc5..cfc2ddf3132af0ddcab7e5b6aabcc4b4dcb4ba3d 100644 (file)
@@ -585,10 +585,7 @@ float serverflags;
 
 .float player_blocked;
 
-.float frozen; // for freeze attacks
-.float revive_progress;
-.float revive_speed; // NOTE: multiplier (anything above 1 is instaheal)
-.entity iceblock;
+.float freezetag_frozen;
 
 .entity muzzle_flash;
 .float misc_bulletcounter;     // replaces uzi & hlac bullet counter.
index 4b7c297314c84531ed240eaea1609b9346c3d990..d25822347cbc803324818fb3212f82486578dde7 100644 (file)
@@ -549,77 +549,6 @@ void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
        if(targ.killcount) { targ.killcount = 0; }
 }
 
-void Ice_Think()
-{
-       setorigin(self, self.owner.origin - '0 0 16');
-       self.nextthink = time;
-}
-
-void Freeze (entity targ, float freeze_time, float frozen_type, float show_waypoint)
-{
-       if(!IS_PLAYER(targ) && !(targ.flags & FL_MONSTER)) // only specified entities can be freezed
-               return;
-               
-       if(targ.frozen)
-               return;
-               
-       targ.frozen = frozen_type;
-       targ.revive_progress = 0;
-       targ.health = 1;
-       targ.revive_speed = freeze_time;
-
-       entity ice, head;
-       ice = spawn();
-       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");
-       ice.alpha = 1;
-       ice.colormod = Team_ColorRGB(targ.team);
-       ice.glowmod = ice.colormod;
-       targ.iceblock = ice;
-
-       entity oldself;
-       oldself = self;
-       self = ice;
-       Ice_Think();
-       self = oldself;
-
-       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');
-}
-
-void Unfreeze (entity targ)
-{
-       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;
-       
-       WaypointSprite_Kill(targ.waypointsprite_attached);
-       
-       FOR_EACH_PLAYER(head)
-       if(head.hook.aiment == targ)
-               RemoveGrapplingHook(head);
-
-       // remove the ice block
-       if(targ.iceblock)
-               remove(targ.iceblock);
-       targ.iceblock = world;
-}
-
 // these are updated by each Damage call for use in button triggering and such
 entity damage_targ;
 entity damage_inflictor;
@@ -749,12 +678,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        mirrorforce *= g_weaponforcefactor;
                }
 
-               if(targ.frozen && deathtype != DEATH_HURTTRIGGER)
-               {
-                       damage = 0;
-                       force *= 0.2;
-               }
-
                // should this be changed at all? If so, in what way?
                frag_attacker = attacker;
                frag_target = targ;
@@ -1277,7 +1200,7 @@ void Fire_ApplyDamage(entity e)
                e.fire_endtime = 0;
 
        // ice stops fire
-       if(e.frozen)
+       if(e.freezetag_frozen)
                e.fire_endtime = 0;
 
        t = min(frametime, e.fire_endtime - time);
index 85bd64ac4c0e88745edfa5ed677e123b455204d5..1366dbbf33c471d759f4a152898c78e895fe251a 100644 (file)
@@ -793,10 +793,6 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_NEX_CHARGEPOOL, AS_FLOAT, nex_chargepool_ammo);
 
        addstat(STAT_HAGAR_LOAD, AS_INT, hagar_load);
-       
-       // freeze attacks
-       addstat(STAT_FROZEN, AS_INT, frozen);
-       addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, revive_progress);
 
        // g_movementspeed hack
        addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
@@ -807,7 +803,7 @@ void spawnfunc_worldspawn (void)
        // secrets
        addstat(STAT_SECRETS_TOTAL, AS_FLOAT, stat_secrets_total);
        addstat(STAT_SECRETS_FOUND, AS_FLOAT, stat_secrets_found);
-       
+
        // monsters
        addstat(STAT_MONSTERS_TOTAL, AS_FLOAT, stat_monsters_total);
        addstat(STAT_MONSTERS_KILLED, AS_FLOAT, stat_monsters_killed);
index c262d0152e23bb9c1ad88b39dad2c51ddce3681e..0774dd1dc7037de88324db2bd2698aa0df088863 100644 (file)
@@ -170,7 +170,7 @@ void movelib_move_simple(vector newdir,float velo,float blendrate)
 */
 #define movelib_move_simple(newdir,velo,blendrate) \
     self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo
-       
+
 #define movelib_move_simple_gravity(newdir,velo,blendrate) \
     if(self.flags & FL_ONGROUND) movelib_move_simple(newdir,velo,blendrate)
 
index 862504d72c826b9bb04dd65a2b01174a84cadb13..d3565578ae5834f257eb8d74af63e78d465ee866 100644 (file)
@@ -785,8 +785,7 @@ void ctf_FlagTouch()
        }
 
        // special touch behaviors
-       if(toucher.frozen) { return; }
-       else if(toucher.vehicle_flags & VHF_ISVEHICLE)
+       if(toucher.vehicle_flags & VHF_ISVEHICLE)
        {
                if(autocvar_g_ctf_allow_vehicle_touch)
                        toucher = toucher.owner; // the player is actually the vehicle owner, not other
index 029a9b58fe35064deec989b3a2ee22c5d56d2d4a..9bc06522374aaae4e22b810d3c1a73afbaf3b46c 100644 (file)
@@ -1,6 +1,7 @@
 .float freezetag_frozen_time;
 .float freezetag_frozen_timeout;
 .float freezetag_revive_progress;
+.entity freezetag_ice;
 #define ICE_MAX_ALPHA 1
 #define ICE_MIN_ALPHA 0.1
 float freezetag_teams;
@@ -13,22 +14,22 @@ void freezetag_count_alive_players()
                if(e.team == NUM_TEAM_1 && e.health >= 1)
                {
                        ++total_players;
-                       if (e.frozen != 1) ++redalive;
+                       if (!e.freezetag_frozen) ++redalive;
                }
                else if(e.team == NUM_TEAM_2 && e.health >= 1)
                {
                        ++total_players;
-                       if (e.frozen != 1) ++bluealive;
+                       if (!e.freezetag_frozen) ++bluealive;
                }
                else if(e.team == NUM_TEAM_3 && e.health >= 1)
                {
                        ++total_players;
-                       if (e.frozen != 1) ++yellowalive;
+                       if (!e.freezetag_frozen) ++yellowalive;
                }
                else if(e.team == NUM_TEAM_4 && e.health >= 1)
                {
                        ++total_players;
-                       if (e.frozen != 1) ++pinkalive;
+                       if (!e.freezetag_frozen) ++pinkalive;
                }
        }
        FOR_EACH_REALCLIENT(e) {
@@ -127,6 +128,15 @@ float freezetag_CheckWinner()
        return 1;
 }
 
+// this is needed to allow the player to turn his view around (fixangle can't
+// be used to freeze his view, as that also changes the angles), while not
+// turning that ice object with the player
+void freezetag_Ice_Think()
+{
+       setorigin(self, self.owner.origin - '0 0 16');
+       self.nextthink = time;
+}
+
 void freezetag_Add_Score(entity attacker)
 {
        if(attacker == self)
@@ -147,24 +157,54 @@ void freezetag_Add_Score(entity attacker)
 
 void freezetag_Freeze(entity attacker)
 {
-       if(self.frozen)
+       if(self.freezetag_frozen)
                return;
-       
-       Freeze(self, 0, 1, TRUE);
-       
+       self.freezetag_frozen = 1;
+       self.freezetag_frozen_time = time;
+       self.freezetag_revive_progress = 0;
+       self.health = 1;
+       if(autocvar_g_freezetag_frozen_maxtime > 0)
+               self.freezetag_frozen_timeout = time + autocvar_g_freezetag_frozen_maxtime;
+
        freezetag_count_alive_players();
 
+       entity ice;
+       ice = spawn();
+       ice.owner = self;
+       ice.classname = "freezetag_ice";
+       ice.think = freezetag_Ice_Think;
+       ice.nextthink = time;
+       ice.frame = floor(random() * 21); // ice model has 20 different looking frames
+       ice.alpha = ICE_MAX_ALPHA;
+       ice.colormod = Team_ColorRGB(self.team);
+       ice.glowmod = ice.colormod;
+       setmodel(ice, "models/ice/ice.md3");
+
+       self.freezetag_ice = ice;
+
+       RemoveGrapplingHook(self);
+
+       // add waypoint
+       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
+
        freezetag_Add_Score(attacker);
 }
 
 void freezetag_Unfreeze(entity attacker)
 {
+       self.freezetag_frozen = 0;
        self.freezetag_frozen_time = 0;
        self.freezetag_frozen_timeout = 0;
-       
-       Unfreeze(self);
+       self.freezetag_revive_progress = 0;
+
+       remove(self.freezetag_ice);
+       self.freezetag_ice = world;
+
+       if(self.waypointsprite_attached)
+               WaypointSprite_Kill(self.waypointsprite_attached);
 }
 
+
 // ================
 // Bot player logic
 // ================
@@ -181,7 +221,7 @@ void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradiu
        {
                if ((head != self) && (head.team == self.team))
                {
-                       if (head.frozen == 1)
+                       if (head.freezetag_frozen)
                        {
                                distance = vlen(head.origin - org);
                                if (distance > sradius)
@@ -213,12 +253,12 @@ void havocbot_role_ft_offense()
        unfrozen = 0;
        FOR_EACH_PLAYER(head)
        {
-               if ((head.team == self.team) && (head.frozen != 1))
+               if ((head.team == self.team) && (!head.freezetag_frozen))
                        unfrozen++;
        }
 
        // If only one left on team or if role has timed out then start trying to free players.
-       if (((unfrozen == 0) && (!self.frozen)) || (time > self.havocbot_role_timeout))
+       if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout))
        {
                dprint("changing role to freeing\n");
                self.havocbot_role = havocbot_role_ft_freeing;
@@ -286,7 +326,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
        if(round_handler_IsActive())
        if(round_handler_CountdownRunning())
        {
-               if(self.frozen)
+               if(self.freezetag_frozen)
                        freezetag_Unfreeze(world);
                freezetag_count_alive_players();
                return 1; // let the player die so that he can respawn whenever he wants
@@ -298,7 +338,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
                || frag_deathtype == DEATH_TEAMCHANGE || frag_deathtype == DEATH_AUTOTEAMCHANGE)
        {
                // let the player die, he will be automatically frozen when he respawns
-               if(self.frozen != 1)
+               if(!self.freezetag_frozen)
                {
                        freezetag_Add_Score(frag_attacker);
                        freezetag_count_alive_players();
@@ -309,7 +349,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
                return 1;
        }
 
-       if(self.frozen)
+       if(self.freezetag_frozen)
                return 1;
 
        freezetag_Freeze(frag_attacker);
@@ -329,6 +369,8 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
                Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_FREEZE, frag_target.netname, frag_attacker.netname);
        }
 
+       frag_target.health = 1; // "respawn" the player :P
+
        return 1;
 }
 
@@ -359,7 +401,7 @@ MUTATOR_HOOKFUNCTION(freezetag_reset_map_players)
 {
        FOR_EACH_PLAYER(self)
        {
-               if (self.frozen)
+               if (self.freezetag_frozen)
                        freezetag_Unfreeze(world);
                self.freezetag_frozen_timeout = -1;
                PutClientInServer();
@@ -383,7 +425,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
        if(gameover)
                return 1;
 
-       if(self.frozen == 1)
+       if(self.freezetag_frozen)
        {
                // keep health = 1
                self.pauseregen_finished = time + autocvar_g_balance_pause_health_regen;
@@ -396,7 +438,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
        entity o;
        o = world;
        if(self.freezetag_frozen_timeout > 0 && time < self.freezetag_frozen_timeout)
-               self.iceblock.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (self.freezetag_frozen_timeout - time) / (self.freezetag_frozen_timeout - self.freezetag_frozen_time);
+               self.freezetag_ice.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (self.freezetag_frozen_timeout - time) / (self.freezetag_frozen_timeout - self.freezetag_frozen_time);
 
        if(self.freezetag_frozen_timeout > 0 && time >= self.freezetag_frozen_timeout)
                n = -1;
@@ -406,15 +448,15 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                n = 0;
                FOR_EACH_PLAYER(other) if(self != other)
                {
-                       if(other.frozen == 0)
+                       if(other.freezetag_frozen == 0)
                        {
-                               if(SAME_TEAM(other, self))
+                               if(other.team == self.team)
                                {
                                        if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
                                        {
                                                if(!o)
                                                        o = other;
-                                               if(self.frozen == 1)
+                                               if(self.freezetag_frozen)
                                                        other.reviving = TRUE;
                                                ++n;
                                        }
@@ -423,12 +465,12 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                }
        }
 
-       if(n && self.frozen == 1) // OK, there is at least one teammate reviving us
+       if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
        {
-               self.revive_progress = bound(0, self.revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1);
-               self.health = max(1, self.revive_progress * autocvar_g_balance_health_start);
+               self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1);
+               self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
 
-               if(self.revive_progress >= 1)
+               if(self.freezetag_revive_progress >= 1)
                {
                        freezetag_Unfreeze(self);
                        freezetag_count_alive_players();
@@ -459,27 +501,45 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                {
                        if(other.reviving)
                        {
-                               other.revive_progress = self.revive_progress;
+                               other.freezetag_revive_progress = self.freezetag_revive_progress;
                                other.reviving = FALSE;
                        }
                }
        }
-       else if(!n && self.frozen == 1) // only if no teammate is nearby will we reset
+       else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
        {
-               self.revive_progress = bound(0, self.revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
-               self.health = max(1, self.revive_progress * autocvar_g_balance_health_start);
+               self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
+               self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
        }
-       else if(!n && !self.frozen)
+       else if(!n)
        {
-               self.revive_progress = 0; // thawing nobody
+               self.freezetag_revive_progress = 0; // thawing nobody
        }
 
        return 1;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics)
+{
+       if(self.freezetag_frozen)
+       {
+               if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
+               {
+                       self.movement_x = bound(-5, self.movement_x, 5);
+                       self.movement_y = bound(-5, self.movement_y, 5);
+                       self.movement_z = bound(-5, self.movement_z, 5);
+               }
+               else
+                       self.movement = '0 0 0';
+
+               self.disableclientprediction = 1;
+       }
+       return 1;
+}
+
 MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
 {
-       if(frag_target.frozen == 1 && frag_deathtype != DEATH_HURTTRIGGER)
+       if(frag_target.freezetag_frozen && frag_deathtype != DEATH_HURTTRIGGER)
        {
                if(autocvar_g_freezetag_revive_falldamage > 0)
                if(frag_deathtype == DEATH_FALL)
@@ -498,6 +558,28 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
        return 1;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_PlayerJump)
+{
+       if(self.freezetag_frozen)
+               return TRUE; // no jumping in freezetag when frozen
+
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon)
+{
+       if (self.freezetag_frozen)
+               return 1;
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_ItemTouch)
+{
+       if (other.freezetag_frozen)
+               return MUT_ITEMTOUCH_RETURN;
+       return MUT_ITEMTOUCH_CONTINUE;
+}
+
 MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
 {
        if (!self.deadflag)
@@ -511,6 +593,13 @@ MUTATOR_HOOKFUNCTION(freezetag_BotRoles)
        return TRUE;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_SpectateCopy)
+{
+       self.freezetag_frozen = other.freezetag_frozen;
+       self.freezetag_revive_progress = other.freezetag_revive_progress;
+       return 0;
+}
+
 MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount)
 {
        freezetag_teams = autocvar_g_freezetag_teams_override;
@@ -521,6 +610,14 @@ MUTATOR_HOOKFUNCTION(freezetag_GetTeamCount)
        return 0;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_VehicleTouch)
+{
+       if(other.freezetag_frozen)
+               return TRUE;
+
+       return FALSE;
+}
+
 void freezetag_Initialize()
 {
        precache_model("models/ice/ice.md3");
@@ -533,6 +630,9 @@ void freezetag_Initialize()
        addstat(STAT_BLUEALIVE, AS_INT, bluealive_stat);
        addstat(STAT_YELLOWALIVE, AS_INT, yellowalive_stat);
        addstat(STAT_PINKALIVE, AS_INT, pinkalive_stat);
+
+       addstat(STAT_FROZEN, AS_INT, freezetag_frozen);
+       addstat(STAT_REVIVE_PROGRESS, AS_FLOAT, freezetag_revive_progress);
 }
 
 MUTATOR_DEFINITION(gamemode_freezetag)
@@ -544,9 +644,15 @@ MUTATOR_DEFINITION(gamemode_freezetag)
        MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY);
        MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
+       MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerJump, freezetag_PlayerJump, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ItemTouch, freezetag_ItemTouch, CBC_ORDER_ANY);
        MUTATOR_HOOK(HavocBot_ChooseRule, freezetag_BotRoles, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SpectateCopy, freezetag_SpectateCopy, CBC_ORDER_ANY);
        MUTATOR_HOOK(GetTeamCount, freezetag_GetTeamCount, CBC_ORDER_EXCLUSIVE);
+       MUTATOR_HOOK(VehicleTouch, freezetag_VehicleTouch, CBC_ORDER_ANY);
 
        MUTATOR_ONADD
        {
index 6e187b90c4c765fdcc109be419e82e62de60513e..3f808499a8d4a5bd015b28ceec3a86d62797b3b2 100644 (file)
@@ -35,7 +35,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        float clean_up_and_do_nothing;
        float horiz_speed = autocvar_sv_dodging_horiz_speed;
 
-       if(self.frozen)
+       if(self.freezetag_frozen)
                horiz_speed = autocvar_sv_dodging_horiz_speed_frozen;
 
     if (self.deadflag != DEAD_NO)
@@ -170,7 +170,7 @@ MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
        tap_direction_y = 0;
 
        float frozen_dodging;
-       frozen_dodging = (self.frozen && autocvar_sv_dodging_frozen);
+       frozen_dodging = (self.freezetag_frozen && autocvar_sv_dodging_frozen);
 
        float dodge_detected;
        if (g_dodging == 0)
index 78f69eb8382d871c03f3f4c756466126e561d8f9..1ae22e2029f7ff518aff3b21533a54a07163673d 100644 (file)
@@ -26,12 +26,10 @@ sys-post.qh
 ../common/command/shared_defs.qh
 ../common/net_notice.qh
 ../common/animdecide.qh
-
 ../common/monsters/monsters.qh
 ../common/monsters/sv_monsters.qh
 ../common/monsters/spawn.qh
 
-
 autocvars.qh
 constants.qh
 defs.qh                // Should rename this, it has fields and globals
index b0e2e5e993bd7fa19c4424cc73b36b2440ff1f6a..8878a3199b2ffd963dde68360f916df87ce94d0d 100644 (file)
@@ -682,8 +682,6 @@ void Item_Touch (void)
 
        if (!IS_PLAYER(other))
                return;
-       if (other.frozen)
-               return;
        if (other.deadflag)
                return;
        if (self.solid != SOLID_TRIGGER)
index 8ad3b5ac2b4e436024926a8ac6682ed9863af6e4..ab1851e844b12315b77d8702faa8c6513e73f961 100644 (file)
@@ -190,7 +190,7 @@ void InitGameplayMode()
        {
                MUTATOR_ADD(gamemode_keepaway);
        }
-       
+
        if(g_invasion)
        {
                timelimit_override = 0; // no timelimit in invasion, round based
index cced0ec369f2f47119da322907cdc49bb96988dc..d35573b541e4b2ae7d8121da1f75cd5f51089ac9 100644 (file)
@@ -1102,7 +1102,7 @@ float turret_stdproc_init (string cvar_base_name, string base, string head, floa
     if (!self.health)
         self.health = 1000;
     self.tur_health = max(1, self.health);
-       self.bot_attack = TRUE;
+    self.bot_attack = TRUE;
     self.monster_attack = TRUE;
 
     if (!self.turrcaps_flags)
index 3e9a96f01003cc8c0a9d47a191862bef5546fc6e..3172aced9fc7ea946761d7254d95c5466714d557 100644 (file)
@@ -564,9 +564,6 @@ void vehicles_touch()
 
     if(other.deadflag != DEAD_NO)
         return;
-               
-       if(other.frozen)
-               return;
 
     if(other.vehicle != world)
         return;
@@ -586,9 +583,6 @@ void vehicles_enter()
 
     if(self.phase > time)
         return;
-               
-       if(other.frozen)
-               return;
 
     if(teamplay)
     if(self.team)
@@ -642,7 +636,7 @@ void vehicles_enter()
 
     self.team                 = self.owner.team;
     self.flags               -= FL_NOTARGET;
-       self.monster_attack               = TRUE;
+    self.monster_attack       = TRUE;
 
     if (IS_REAL_CLIENT(other))
     {
@@ -820,7 +814,7 @@ void vehicles_exit(float eject)
     sound (_vehicle, CH_TRIGGER_SINGLE, "misc/null.wav", 1, ATTEN_NORM);
     _vehicle.vehicle_hudmodel.viewmodelforclient = _vehicle;
     _vehicle.phase = time + 1;
-       _vehicle.monster_attack = FALSE;
+    _vehicle.monster_attack = FALSE;
 
     _vehicle.vehicle_exit(eject);
 
index ea2cf8bf0560dfee7a879789377231dc82e8cd0f..0ad23a137ec53177cf29fb60390b8ba28f6512ee 100644 (file)
@@ -263,7 +263,7 @@ void lgbeam_think()
                return;
        }
 
-       if (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.frozen)
+       if (owner_player.weaponentity.state != WS_INUSE || !lgbeam_checkammo() || owner_player.deadflag != DEAD_NO || !owner_player.BUTTON_ATCK || owner_player.freezetag_frozen)
        {
                if(self == owner_player.lgbeam)
                        owner_player.lgbeam = world;