]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into nifrek/longjumpanim
authornifrek <nifrek@gmail.com>
Wed, 15 Jun 2011 15:48:47 +0000 (11:48 -0400)
committernifrek <nifrek@gmail.com>
Wed, 15 Jun 2011 15:48:47 +0000 (11:48 -0400)
input-demoseeking.cfg
qcsrc/server/g_hook.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/w_minelayer.qc
xonotic-credits.txt

index 87b42330a576f91f366730b7d09e93c3ab8e32cc..45df74f223564da7c19369f7158363dd6ca1f681 100644 (file)
@@ -9,7 +9,7 @@ alias seekdemo "_seekdemo_1_$_demo_seeking $1"
 alias _seekdemo_1_0 "cl_cmd rpn time dup        \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
 alias _seekdemo_1_1 "cl_cmd rpn time _demo_time \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
 alias _seekdemo_2 "_demo_seeking 1; r_render 0; snd_startnonloopingsounds 0; _seekdemo_3_$_demo_time_increasing"
-alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 2 _seekdemo_9_2"
+alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 10 _seekdemo_9_2"
 alias _seekdemo_3_1 "_seekdemo_7"
 alias _seekdemo_4 "set _demo_good 0; cl_cmd rpn /_demo_good 1 def; _seekdemo_5"
 alias _seekdemo_5 "_seekdemo_6_$_demo_good"
index dd6d73effd8aae382ae92c4d40bf16807faa9b2b..b7291dee3f8cedc4c92d82846330bb930593b8de 100644 (file)
@@ -47,43 +47,6 @@ And you should be done!
 
 ============================================*/
 
-.string aiment_classname;
-.float aiment_deadflag;
-void SetMovetypeFollow(entity ent, entity e)
-{
-       // FIXME this may not be warpzone aware
-       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
-       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
-       ent.aiment = e; // make the hole follow bmodel
-       ent.punchangle = e.angles; // the original angles of bmodel
-       ent.view_ofs = ent.origin - e.origin; // relative origin
-       ent.v_angle = ent.angles - e.angles; // relative angles
-       ent.aiment_classname = strzone(e.classname);
-       ent.aiment_deadflag = e.deadflag;
-}
-void UnsetMovetypeFollow(entity ent)
-{
-       ent.movetype = MOVETYPE_FLY;
-       PROJECTILE_MAKETRIGGER(ent);
-       ent.aiment = world;
-}
-float LostMovetypeFollow(entity ent)
-{
-/*
-       if(ent.movetype != MOVETYPE_FOLLOW)
-               if(ent.aiment)
-                       error("???");
-*/
-       if(ent.aiment)
-       {
-               if(ent.aiment.classname != ent.aiment_classname)
-                       return 1;
-               if(ent.aiment.deadflag != ent.aiment_deadflag)
-                       return 1;
-       }
-       return 0;
-}
-
 .float hook_length;
 .float hook_switchweapon;
 
index c16608821abf47ee661137a9ce5203b023b39486..8b7806e566e91968bf6cc1211fa759aa4d27ac02 100644 (file)
@@ -3086,3 +3086,40 @@ void defer(float fdelay, void() func)
     e.think     = defer_think;
     e.nextthink = time + fdelay;
 }
+
+.string aiment_classname;
+.float aiment_deadflag;
+void SetMovetypeFollow(entity ent, entity e)
+{
+       // FIXME this may not be warpzone aware
+       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
+       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
+       ent.aiment = e; // make the hole follow bmodel
+       ent.punchangle = e.angles; // the original angles of bmodel
+       ent.view_ofs = ent.origin - e.origin; // relative origin
+       ent.v_angle = ent.angles - e.angles; // relative angles
+       ent.aiment_classname = strzone(e.classname);
+       ent.aiment_deadflag = e.deadflag;
+}
+void UnsetMovetypeFollow(entity ent)
+{
+       ent.movetype = MOVETYPE_FLY;
+       PROJECTILE_MAKETRIGGER(ent);
+       ent.aiment = world;
+}
+float LostMovetypeFollow(entity ent)
+{
+/*
+       if(ent.movetype != MOVETYPE_FOLLOW)
+               if(ent.aiment)
+                       error("???");
+*/
+       if(ent.aiment)
+       {
+               if(ent.aiment.classname != ent.aiment_classname)
+                       return 1;
+               if(ent.aiment.deadflag != ent.aiment_deadflag)
+                       return 1;
+       }
+       return 0;
+}
index ae8db2fedae929cb6a200302978eb9d285fb2cd0..b4ecb9b5519620411ac834deb9098cff4c615b45 100644 (file)
@@ -11,7 +11,7 @@ void spawnfunc_weapon_minelayer (void)
        weapon_defaultspawnfunc(WEP_MINE_LAYER);
 }
 
-void W_Mine_Stick ()
+void W_Mine_Stick (entity to)
 {
        spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
 
@@ -51,6 +51,9 @@ void W_Mine_Stick ()
 
        remove(self);
        self = newmine;
+
+       if(to)
+               SetMovetypeFollow(self, to);
 }
 
 void W_Mine_Explode ()
@@ -89,7 +92,7 @@ void W_Mine_DoRemoteExplode ()
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       if(self.movetype == MOVETYPE_NONE)
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
                self.velocity = self.oldvelocity;
 
        RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
@@ -157,6 +160,15 @@ void W_Mine_Think (void)
        entity head;
 
        self.nextthink = time;
+
+       if(self.movetype == MOVETYPE_FOLLOW)
+       {
+               if(LostMovetypeFollow(self))
+               {
+                       UnsetMovetypeFollow(self);
+                       self.movetype = MOVETYPE_NONE;
+               }
+       }
        
        // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
        // TODO: replace this mine_trigger.wav sound with a real countdown
@@ -208,11 +220,20 @@ void W_Mine_Think (void)
 
 void W_Mine_Touch (void)
 {
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+               return; // we're already a stuck mine, why do we get called? TODO does this even happen?
+
        PROJECTILE_TOUCH;
-       if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))
-               W_Mine_Stick();
-       else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it
-               self.velocity = '0 0 0';
+
+       if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+       {
+               // hit a player
+               // don't stick
+       }
+       else
+       {
+               W_Mine_Stick(other);
+       }
 }
 
 void W_Mine_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
index 2a17bfb0789fdd460ed6e0b217a2c46a70b72a1f..462378e9b78065a0fa4594a7a9bf41dd8db2a9ed 100644 (file)
@@ -84,6 +84,7 @@ Lord Canistra
 Nikoli
 
 **Active Contributors
+Ant "Antibody" Zucaro
 Antonio "terencehill" Piu
 Ben "MooKow" Banker
 Calinou