]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_minelayer.qc
Proper protection system
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_minelayer.qc
index 412e6b57f3438880e2e952c86b04ce6f98156dfd..df15007d3b71fef879cd4e998c7b29cd5df87ab0 100644 (file)
@@ -1,5 +1,12 @@
+/*TODO list (things left to do before this weapon should be ready, delete once it's all done):
+- The weapon currently uses sounds and models from other weapons. We need a modeler and sound artist to make this weapon its own (the gun model should probably be something between the porto and rocket launcher design-wise).
+- Mines remain stuck in the air if they hit a moving entity (like an elevator or players). They should normally stick to them... perhaps set them as an attachment?
+- Bot code for the weapon may be needed. The bot AI may not have any info about this gun yet.
+- 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, 9, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "minelayer", "minelayer", "Mine Layer");
+REGISTER_WEAPON(MINE_LAYER, w_minelayer, IT_ROCKETS, 4, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_HIGH, "minelayer", "minelayer", "Mine Layer");
 #else
 #ifdef SVQC
 .float minelayer_detonate;
@@ -79,8 +86,28 @@ void W_Mine_RemoteExplode()
        }
 }
 
+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"))
+       {
+               entity head;
+               head = findradius(self.origin, cvar("g_balance_minelayer_radius"));
+               while(head)
+               {
+                       if(head == self.owner || !IsDifferentTeam(head, self.owner))
+                               return;
+                       head = head.chain;
+               }
+       }
+
+       W_Mine_Explode();
+}
+
 void W_Mine_Think (void)
 {
+       entity head;
+
        self.nextthink = time;
        if (time > self.cnt)
        {
@@ -90,15 +117,12 @@ void W_Mine_Think (void)
                return;
        }
 
-       // detect players who are close the mine and explode if the player should detonate it
-       entity head;
+       // set the mine for detonation when a foe gets too close
        head = findradius(self.origin, cvar("g_balance_minelayer_detectionradius"));
-
        while(head)
        {
                if(head.classname == "player" && head.deadflag == DEAD_NO)
-               if(head != self.owner)
-               if(IsDifferentTeam(head, self.owner)) // don't detonate for team mates
+               if(head != self.owner && IsDifferentTeam(head, self.owner)) // don't trigger for team mates
                if(!self.mine_time)
                {
                        spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
@@ -107,11 +131,11 @@ void W_Mine_Think (void)
                head = head.chain;
        }
 
-       // explode if it's time
+       // explode if it's time to
        if(self.mine_time && time >= self.mine_time)
        {
                self.mine_time = 0;
-               W_Mine_Explode();
+               W_Mine_ProximityExplode();
        }
 
        // remote detonation