]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_minelayer.qc
Tiny cvar tweaks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_minelayer.qc
index 06a639f0846a5f5e299214964a92e20162dea91f..f1467e7765e1090e0aec6827f24ef6d927fd5b5e 100644 (file)
@@ -1,7 +1,3 @@
-/*TODO list (things left to do before this weapon should be ready, delete once it's all done):
-- The mine model needs to face properly when it sticks to a surface. Once we'll have a correct mine model, we can't afford the model facing any way it falls to the ground. Should probably look at the porto code to see how portals face in the right direction when sticking to walls. 
-*/
-
 #ifdef REGISTER_WEAPON
 REGISTER_WEAPON(MINE_LAYER, w_minelayer, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "minelayer", "minelayer", "Mine Layer");
 #else
@@ -14,6 +10,46 @@ void spawnfunc_weapon_minelayer (void)
        weapon_defaultspawnfunc(WEP_MINE_LAYER);
 }
 
+void W_Mine_Stick ()
+{
+       spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
+
+       // in order for mines to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile
+
+       local entity newmine;
+       newmine = spawn();
+       newmine.classname = self.classname;
+
+       newmine.bot_dodge = self.bot_dodge;
+       newmine.bot_dodgerating = self.bot_dodgerating;
+
+       newmine.owner = self.owner;
+       setsize(newmine, '-4 -4 -4', '4 4 4');
+       setorigin(newmine, self.origin);
+       setmodel(newmine, "models/mine.md3");
+       newmine.angles = vectoangles(-trace_plane_normal); // face against the surface
+
+       newmine.takedamage = self.takedamage;
+       newmine.damageforcescale = self.damageforcescale;
+       newmine.health = self.health;
+       newmine.event_damage = self.event_damage;
+
+       newmine.movetype = MOVETYPE_NONE; // lock the mine in place
+       newmine.projectiledeathtype = self.projectiledeathtype;
+
+       newmine.mine_number = self.mine_number;
+       newmine.mine_time = self.mine_time;
+
+       newmine.touch = SUB_Null;
+       newmine.think = self.think;
+       newmine.nextthink = time;
+       newmine.cnt = self.cnt;
+       newmine.flags = self.flags;
+
+       remove(self);
+       self = newmine;
+}
+
 void W_Mine_Explode ()
 {
        if(other.takedamage == DAMAGE_AIM)
@@ -58,7 +94,7 @@ void W_Mine_DoRemoteExplode ()
        remove (self);
 }
 
-void W_Mine_RemoteExplode()
+void W_Mine_RemoteExplode ()
 {
        if(self.owner.deadflag == DEAD_NO)
                if((self.spawnshieldtime >= 0)
@@ -70,7 +106,7 @@ void W_Mine_RemoteExplode()
                }
 }
 
-void W_Mine_ProximityExplode()
+void W_Mine_ProximityExplode ()
 {
        // make sure no friend is in the mine's radius. If there is any, explosion is delayed until he's at a safe distance
        if(cvar("g_balance_minelayer_protection"))
@@ -103,7 +139,7 @@ void W_Mine_Think (void)
        }
 
        // set the mine for detonation when a foe gets too close
-       head = findradius(self.origin, cvar("g_balance_minelayer_detectionradius"));
+       head = findradius(self.origin, cvar("g_balance_minelayer_proximityradius"));
        while(head)
        {
                if(head.classname == "player" && head.deadflag == DEAD_NO)
@@ -134,10 +170,7 @@ void W_Mine_Touch (void)
 {
        PROJECTILE_TOUCH;
        if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))
-       {
-               spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
-               self.movetype = MOVETYPE_NONE; // lock the mine in place
-       }
+               W_Mine_Stick();
        else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it
                self.velocity = '0 0 0';
 }
@@ -351,6 +384,7 @@ float w_minelayer(float req)
        else if (req == WR_PRECACHE)
        {
                precache_model ("models/flash.md3");
+               precache_model ("models/mine.md3");
                precache_model ("models/weapons/g_minelayer.md3");
                precache_model ("models/weapons/v_minelayer.md3");
                precache_model ("models/weapons/h_minelayer.iqm");