Guest User

Insta-Brink, headless corpses, muzzle flashes akimbo

a guest
Jan 11th, 2015
51
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff -r 424c0d946ec9 qblood/progs/client.qc
  2. --- a/qblood/progs/client.qc    Thu May 09 17:12:34 2013 +0200
  3. +++ b/qblood/progs/client.qc    Sat Jan 10 03:00:19 2015 +0000
  4. @@ -712,7 +712,7 @@
  5.         return;
  6.  
  7.     bprint3("Kevorkian approves ", self.netname, "!\n");
  8. -   sound(self, CHAN_AUTO, "thevoice/vo5.wav", 1, ATTN_NORM);
  9. +   self.noise1 = "thevoice/vo5.wav";
  10.     CTF_PlayerDropFlag();
  11.     self.modelindex = modelindex_player;
  12.     self.health = 0;
  13. @@ -1168,7 +1168,7 @@
  14.         // Play the obituary sound
  15.         if (self.noise1)
  16.         {
  17. -           sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NORM);
  18. +           sound(self, CHAN_VOICE, self.noise1, 1, ATTN_NONE);
  19.             self.noise1 = string_null;
  20.         }
  21.  
  22. @@ -1643,7 +1643,7 @@
  23.     }
  24.  
  25.     // If we aren't dead, we can play with our stuff
  26. -   else
  27. +   else if (isAlive)
  28.     {
  29.         // Weapons
  30.         if ((self.impulse >= IMP_PITCHFORK && self.impulse <= IMP_VOODOO_DOLL) ||
  31. @@ -1685,12 +1685,11 @@
  32.         // These ones are considered cheats and are only allowed when the "sv_cheats" cvar is set
  33.         else if (cvar("sv_cheats"))
  34.         {
  35. -#if !defined(NO_FRIKBOT)
  36. +#ifndef NO_FRIKBOT
  37.             if (self.impulse == IMP_BOT_CAM)
  38.                 botcam_u();
  39.             else if (self.impulse == IMP_BOT_WAYPT_EDIT)
  40.                 bot_way_edit();
  41. -           else
  42.  #endif
  43.         }
  44.     }
  45. @@ -1814,7 +1813,17 @@
  46.     if (self.player_state >= PS_BOD_FALL && self.player_state <= PS_BOD_SWAY)
  47.     {
  48.         if (self.t_length < time)
  49. -           Player_LiveAgain();
  50. +       {
  51. +           self.health = 0;
  52. +           self.player_state = PS_BOD_DEATH;
  53. +           ClientObituary(self.oldenemy);
  54. +           self.takedamage = DAMAGE_NO;
  55. +           PlayerDie();
  56. +       }
  57. +       else if (self.t_length-1 <= time)
  58. +           if (self.button4 && !self.oldbutton4)
  59. +               if (random() < 0.024)
  60. +                   Player_LiveAgain();
  61.         ResetIdle(self);
  62.         return;
  63.     }
  64. @@ -1851,7 +1860,7 @@
  65.  
  66.     bprint2(self.netname, " entered the game\n");
  67.  
  68. -   sound(self, CHAN_AUTO, "thevoice/vo1.wav", 1, ATTN_NORM); // Let the Bloodbath Begin!
  69. +   sound(self, CHAN_AUTO, "thevoice/vo1.wav", 1, ATTN_NONE); // Let the Bloodbath Begin!
  70.     self.do_observer = 1;
  71.  
  72.     // Reset the votes
  73. @@ -2019,6 +2028,7 @@
  74.             // killed self in a dumb fashion
  75.             Cl_UpdatePlayerFrags(attacker, -1);
  76.  
  77. +           if (self.noise1 != "thevoice/vo5.wav") { // Kevorkian
  78.             if (rnum < 0.33)
  79.             {
  80.                 deathstring = " receives the Darwin Award\n";
  81. @@ -2036,6 +2046,7 @@
  82.             }
  83.  
  84.             bprint2(self.netname, deathstring);
  85. +           }
  86.             return;
  87.         }
  88.         else if (friendlyfire && self.team > 0 && self.team == attacker.team)
  89. @@ -2060,14 +2071,14 @@
  90.             Cl_UpdatePlayerFrags(attacker, 1);
  91.             rnum = random()*54;
  92.             if (rnum <= 1) BuildDeathString2(attacker, "thevoice/vo39.wav", " beat ", " like a cur"); // Beaten like a Cur
  93. -           else if (rnum <= 2) BuildDeathString(attacker, "thevoice/vo31.wav", " bobbettized "); // Bobbettized!
  94. +           else if (rnum <= 2) BuildDeathString(attacker, "thevoice/vo31.wav", " bobbittized "); // Bobbettized!
  95.             else if (rnum <= 3) BuildDeathString(attacker, "thevoice/vo24.wav", " destroyed "); // Destroyed!
  96.             else if (rnum <= 4) BuildDeathString2(attacker, "thevoice/vo36.wav", " butchered ", " into dog meat"); // Dog meat
  97.             else if (rnum <= 5) BuildDeathString(attacker, "thevoice/vo44.wav", " showed his excellence to "); // Excellent!
  98.             else if (rnum <= 6) BuildDeathString(attacker, "thevoice/vo22.wav", " made fine work of "); // Fine work
  99.             else if (rnum <= 7) BuildDeathString2(attacker, "thevoice/vo20.wav", " showed ", " how good he is"); // Good one
  100.             else if (rnum <= 8) BuildDeathString(attacker, "thevoice/vo33.wav", " scored on "); // He shoots! He scores!
  101. -           else if (rnum <= 8) BuildDeathString(attacker, "thevoice/vo25.wav", " hosed "); // Hosed!
  102. +           else if (rnum <= 9) BuildDeathString(attacker, "thevoice/vo25.wav", " hosed "); // Hosed!
  103.             else if (rnum <= 10) BuildDeathString(attacker, "thevoice/vo26.wav", " humiliated "); // Humiliated!
  104.             else if (rnum <= 11) BuildDeathString(attacker, "thevoice/vo21.wav", " made lunch meat with "); // Lunch meat!
  105.             else if (rnum <= 12) BuildDeathString(attacker, "thevoice/vo29.wav", " passed the chili to "); // Pass the chili!
  106. @@ -2075,7 +2086,7 @@
  107.             else if (rnum <= 14) BuildDeathString(attacker, "thevoice/vo38.wav", " ripped "); // Ripped 'em loose
  108.             else if (rnum <= 15) BuildDeathString2(attacker, "thevoice/vo28.wav", " sent ", " to hell!"); // Sent to HELL!
  109.             else if (rnum <= 16) BuildDeathString(attacker, "thevoice/vo41.wav", " snuffed "); // Snuffed!
  110. -           else if (rnum <= 17) BuildDeathString2(attacker, "thevoice/vo34.wav", " split ", "'s blood"); // Spillage!
  111. +           else if (rnum <= 17) BuildDeathString2(attacker, "thevoice/vo34.wav", " spilt ", "'s blood"); // Spillage!
  112.             else if (rnum <= 18) BuildDeathString(attacker, "thevoice/vo35.wav", " sprayed "); // Sprayed!
  113.             else if (rnum <= 19) BuildDeathString(attacker, "thevoice/vo32.wav", " stiffed "); // Stiffed!
  114.             else if (rnum <= 20) BuildDeathString2(attacker, "thevoice/vo19.wav", " dazzled ", " with his talent"); // Talented!
  115. @@ -2083,21 +2094,21 @@
  116.             else if (rnum <= 22) BuildDeathString(attacker, "thevoice/vo43.wav", " vaporized "); // Vaporized!
  117.             else if (rnum <= 23) BuildDeathString(attacker, "thevoice/vo23.wav", " did well with "); // Well done!
  118.             else if (rnum <= 24) BuildDeathString(attacker, "thevoice/vo40.wav", " whipped and creamed "); // Whipped and creamed!
  119. -           else if (rnum <= 25) BuildDeathString2(attacker, "thevoice/vo9.wav", " made ", " suffer scrotum seperation"); // Scrotum separation
  120. +           else if (rnum <= 25) BuildDeathString2(attacker, "thevoice/vo9.wav", " made ", " suffer scrotum separation"); // Scrotum separation
  121.             else if (rnum <= 26) BuildDeathString2(attacker, "thevoice/vo7.wav", " turned ", " into excrement"); // Excrement
  122.             else if (rnum <= 27) BuildDeathString2(attacker, "thevoice/vo8.wav", " turned ", " into hamburger"); // Hamburger
  123.             else if (rnum <= 28) BuildDeathString2(attacker, "thevoice/vo42.wav", " vented ", "'s spleen"); //Vented spleen
  124.             else if (rnum <= 29) BuildDeathString(attacker, "thevoice/vo10.wav", " body bagged "); //Boddy bagged
  125.             else if (rnum <= 30) BuildDeathString2(attacker, "thevoice/boned.wav", " boned ", " like a fish!"); //Boned
  126.             else if (rnum <= 31) BuildDeathString2(attacker, "thevoice/justice.wav", " gave ", " Anal Justice!"); //Anal Justice
  127. -           else if (rnum <= 32) BuildDeathString2(attacker, string_null, " hurt ", " real bad!"); //Hurt them real bad
  128. +           else if (rnum <= 32) BuildDeathString2(attacker, "thevoice/vo6.wav", " hurt ", " real bad!"); //Hurt them real bad
  129.             else if (rnum <= 33) BuildDeathString2(attacker, "thevoice/ripped.wav", " ripped ", " a new orifice!"); //Ripped
  130.             else if (rnum <= 34) BuildDeathString(attacker, "thevoice/castra.wav", " castrated "); //Castrated
  131.             else if (rnum <= 35) BuildDeathString(attacker, "thevoice/creamed.wav", " creamed "); //Creamed
  132.             else if (rnum <= 36) BuildDeathString(attacker, "thevoice/decimat.wav", " decimated "); //Decimated
  133.             else if (rnum <= 37) BuildDeathString(attacker, "thevoice/destro.wav", " destroyed "); //Destroyed
  134.             else if (rnum <= 38) BuildDeathString(attacker, "thevoice/diced.wav", " diced "); //Diced
  135. -           else if (rnum <= 39) BuildDeathString(attacker, "thevoice/disembo.wav", " disembowled "); //Disembowled
  136. +           else if (rnum <= 39) BuildDeathString(attacker, "thevoice/disembo.wav", " disemboweled "); //Disembowled
  137.             else if (rnum <= 40) BuildDeathString(attacker, "thevoice/flatte.wav", " flattened "); //Flattened
  138.             else if (rnum <= 41) BuildDeathString(attacker, "thevoice/killed.wav", " killed "); //Killed
  139.             else if (rnum <= 42) BuildDeathString(attacker, "thevoice/madness.wav", " gave AnAl MaDnEsS to "); //Anal madness
  140. @@ -2107,7 +2118,7 @@
  141.             else if (rnum <= 46) BuildDeathString(attacker, "thevoice/reamed.wav", " reamed "); //Reamed
  142.             else if (rnum <= 47) BuildDeathString(attacker, "thevoice/vo14.wav", " shat upon "); //Shat upon
  143.             else if (rnum <= 48) BuildDeathString(attacker, "thevoice/slaught.wav", " slaughtered "); //Slaughtered
  144. -           else if (rnum <= 49) BuildDeathString(attacker, "thevoice/cliced.wav", " sliced "); //Sliced
  145. +           else if (rnum <= 49) BuildDeathString(attacker, "thevoice/sliced.wav", " sliced "); //Sliced
  146.             else if (rnum <= 50) BuildDeathString(attacker, "thevoice/smashed.wav", " smashed "); //Smashed
  147.             else if (rnum <= 51) BuildDeathString(attacker, "thevoice/sodomiz.wav", " sodomized "); //Sodomized
  148.             else if (rnum <= 52) BuildDeathString(attacker, "thevoice/splatt.wav", " splattered "); //Splattered
  149. diff -r 424c0d946ec9 qblood/progs/combat.qc
  150. --- a/qblood/progs/combat.qc    Thu May 09 17:12:34 2013 +0200
  151. +++ b/qblood/progs/combat.qc    Sat Jan 10 03:00:19 2015 +0000
  152. @@ -78,8 +78,10 @@
  153.     oself = self;
  154.     self = targ;
  155.  
  156. +#if 0
  157.     if (self.health < 0)
  158.         self.health = 0;      // Blood had no negative sign, so nothing below 0
  159. +#endif
  160.  
  161.  #ifndef NO_FRIKBOT
  162.  
  163. @@ -185,6 +187,7 @@
  164.     local   float   save;
  165.     local   float   take;
  166.     local   float   protected;  // PM:  Boolean for invulnerability.
  167. +   local   float   bodhealth;
  168.  
  169.     if (!targ.takedamage)
  170.         return;
  171. @@ -471,8 +474,12 @@
  172.     // Do the damage.
  173.     targ.health = targ.health - take;
  174.  
  175. +   if (cvar("g_instabrink"))
  176. +       bodhealth = 99;
  177. +   else
  178. +       bodhealth = 1;
  179.     if (targ.health >= -1                   && // If a player reaches between -1 and 1 HP (Brink Of Death)
  180. -       targ.health <= 1                    &&
  181. +       targ.health <= bodhealth            &&
  182.         targ.classname == "player"          && // BOD can only be done player to player
  183.         attacker.classname == "player"      &&
  184.         targ.player_state != PS_BOD_FALL    && // If he wasn't already on the Brink Of Death
  185. diff -r 424c0d946ec9 qblood/progs/defs.qc
  186. --- a/qblood/progs/defs.qc  Thu May 09 17:12:34 2013 +0200
  187. +++ b/qblood/progs/defs.qc  Sat Jan 10 03:00:19 2015 +0000
  188. @@ -352,6 +352,7 @@
  189.  .float      charge;
  190.  .float      tnt_time;
  191.  .float      tnt_type;
  192. +.float      remote_type;
  193.  
  194.  .float      idle_time;
  195.  .float      idle_done;
  196. diff -r 424c0d946ec9 qblood/progs/items.qc
  197. --- a/qblood/progs/items.qc Thu May 09 17:12:34 2013 +0200
  198. +++ b/qblood/progs/items.qc Sat Jan 10 03:00:19 2015 +0000
  199. @@ -1439,6 +1439,7 @@
  200.  
  201.  void() precache_flaregun =
  202.  {
  203. +   precache_model("models/weapons/objects/muzzle_flare.spr32");
  204.     precache_model("models/weapons/v_flare.psk");
  205.     precache_model("models/weapons/g_flare.md3");
  206.     precache_model("models/weapons/ga_flare.psk");  // akimbo model
  207. @@ -1659,6 +1660,7 @@
  208.  
  209.  void() precache_napalmlauncher =
  210.  {
  211. +   precache_model("models/weapons/objects/muzzle_napalm_2.spr32");
  212.     precache_model("models/weapons/v_napalm.psk");
  213.     precache_model("models/weapons/ga_napalm.psk");
  214.     precache_model("models/weapons/g_napalm.md3");
  215. diff -r 424c0d946ec9 qblood/progs/player.qc
  216. --- a/qblood/progs/player.qc    Thu May 09 17:12:34 2013 +0200
  217. +++ b/qblood/progs/player.qc    Sat Jan 10 03:00:19 2015 +0000
  218. @@ -25,6 +25,8 @@
  219.  void(float cloneCorpse) respawn;
  220.  void(entity ent) CloneCorpse;
  221.  void() Player_Idle;
  222. +void() GibPlayerCorpse;
  223. +void() FadeAway;
  224.  
  225.  /*
  226.  ==============================================================================
  227. @@ -60,9 +62,10 @@
  228.     // so that attackers will have the time to stop firing
  229.     player.takedamage = DAMAGE_NO;
  230.  
  231. -   player.t_length = time + 15;  // the effect will last 15 sec
  232. +   player.t_length = time + 5;  // the effect will last 5 sec
  233.     sound(player, CHAN_VOICE, "thevoice/vo15.wav", 1, ATTN_NONE);
  234.     centerprint(player, "YOU ARE ON THE BRINK OF DEATH!!");
  235. +   player.oldenemy = attacker;
  236.     // If there's a real attacker (not a BOD triggered by cheat code)
  237.     if (attacker != world)
  238.         centerprint(attacker, "FINISH HIM!!");
  239. @@ -70,6 +73,7 @@
  240.  
  241.  void() Player_LiveAgain =
  242.  {
  243. +   self.takedamage = DAMAGE_AIM;
  244.     sound(self, CHAN_VOICE, "player/taunts/t1010.wav", 1, ATTN_NORM);  // I live ... again!
  245.     Player_Idle();
  246.     W_DrawWeapon(self.weapon);
  247. @@ -477,6 +481,7 @@
  248.     {
  249.         self.nextthink = -1;
  250.         GibPlayer();
  251. +       self.health = 0;
  252.         return;
  253.     }
  254.  
  255. @@ -488,33 +493,47 @@
  256.     // If the player was on the Brink Of Death
  257.     if (self.player_state >= PS_BOD_FALL && self.player_state <= PS_BOD_SWAY)
  258.     {
  259. +#if 0
  260.         // If the head is removed in the process
  261.         if (self.health < -10)
  262.         {
  263. +#endif
  264.             // The player entity will be the head, so we must
  265.             // create a new entity for the corpse
  266.             player_head = self;
  267.             self = spawn();
  268.             setmodel(self, player_head.model);
  269.             setorigin(self, player_head.origin);
  270. -           setsize(self, player_head.mins, player_head.maxs);
  271. +           setsize(self, '-16 -16 -20', '16 16 -15');
  272.             self.angles = player_head.angles;
  273.             self.frame = player_head.frame;
  274.             self.skin = player_head.skin;
  275.             self.colormap = player_head.colormap;
  276. -           self.movetype = player_head.movetype;
  277. +           self.movetype = MOVETYPE_TOSS;
  278.             self.velocity = player_head.velocity;
  279.             self.player_state = PS_HEADLESS_DEATH;
  280. +           self.classname = "corpse";
  281. +           self.health = 100;
  282. +           self.th_die = GibPlayerCorpse;
  283. +           self.solid = SOLID_BBOX;
  284. +           self.takedamage = DAMAGE_AIM;
  285. +           self.reset = SUB_Remove;
  286. +           self.think = player_head.think;
  287. +           self.nextthink = player_head.nextthink;
  288.  
  289.             self = player_head;
  290.             self.deadflag = DEAD_DEAD;
  291.             ThrowHead("progs/h_player.mdl", self.health);
  292. +#if 0
  293.         }
  294.         else
  295.             self.player_state = PS_BOD_DEATH;
  296. +#endif
  297.     }
  298.     else
  299.         self.player_state = PS_DEATH;
  300. +   if (self.health < 0)
  301. +       self.health = 0;
  302.  };
  303.  
  304.  // used by kill command and disconnect command
  305. @@ -714,7 +733,9 @@
  306.     {
  307.         if (self.frame == PLAYER_DEATH_HEADLESS_END)
  308.         {
  309. -           self.think = SUB_Remove;
  310. +           self.nextthink = time + 30;
  311. +           self.think = FadeAway;
  312. +           self.oldorigin = self.origin;
  313.             return;
  314.         }
  315.  
  316. diff -r 424c0d946ec9 qblood/progs/w_bomb.qc
  317. --- a/qblood/progs/w_bomb.qc    Thu May 09 17:12:34 2013 +0200
  318. +++ b/qblood/progs/w_bomb.qc    Sat Jan 10 03:00:19 2015 +0000
  319. @@ -113,6 +113,8 @@
  320.     // Don't let grenade explode twice.
  321.     self.takedamage = DAMAGE_NO;
  322.  
  323. +   self.owner = self.enemy;
  324. +
  325.     if (self.netname == "Napalm Ball")
  326.     {
  327.         local   float   radius, damage, burn;
  328. diff -r 424c0d946ec9 qblood/progs/w_napalm.qc
  329. --- a/qblood/progs/w_napalm.qc  Thu May 09 17:12:34 2013 +0200
  330. +++ b/qblood/progs/w_napalm.qc  Sat Jan 10 03:00:19 2015 +0000
  331. @@ -242,6 +242,8 @@
  332.         newmis.reset = SUB_Remove;
  333.     }
  334.     muzzleflash(RIGHT);
  335. +   if (self.owner.items & IT_GUNS_AKIMBO)
  336. +       muzzleflash(LEFT);
  337.     if (!(self.owner.flags & FL_INFINATE_AMMO))
  338.         self.owner.currentammo = self.owner.ammo_rockets;
  339.     setorigin(newmis, W_Origin() + v_forward * 18 + v_right * 3 + v_up * -8);
  340. diff -r 424c0d946ec9 qblood/progs/w_remote_tnt.qc
  341. --- a/qblood/progs/w_remote_tnt.qc  Thu May 09 17:12:34 2013 +0200
  342. +++ b/qblood/progs/w_remote_tnt.qc  Sat Jan 10 03:00:19 2015 +0000
  343. @@ -60,7 +60,7 @@
  344.  {
  345.     if (self.button0)
  346.     {
  347. -       if (self.weaponentity.tnt_type) // We only have the remote
  348. +       if (self.weaponentity.remote_type) // We only have the remote
  349.         {
  350.             self.button0 = 0;
  351.             sound(self, CHAN_WEAPON, "weapons/tnt/remfire.wav", 1, ATTN_NORM);
  352. @@ -85,9 +85,9 @@
  353.             ShowThrowMeter();
  354.         }
  355.     }
  356. -   else if (self.button3)// Altfire
  357. +   else if (self.button3 && self.currentammo > 0)// Altfire
  358.     {
  359. -       if (self.weaponentity.tnt_type) // If we only have a remote, draw another bomb
  360. +       if (self.weaponentity.remote_type) // If we only have a remote, draw another bomb
  361.         {
  362.             self.weaponentity.anim_type = HALF_DRAW;
  363.             self.weaponentity.attack_finished = time + REMOTE_DRAW_TIME;
  364. @@ -98,7 +98,7 @@
  365.             self.weaponentity.charge = 0;
  366.             self.weaponentity.attack_finished = time + REMOTE_DROP_TIME;
  367.             self.weaponentity.anim_type = IDLE_WITH_REMOTE;
  368. -           self.weaponentity.tnt_type = REMOTE_ONLY;
  369. +           self.weaponentity.remote_type = REMOTE_ONLY;
  370.             self.player_state = PS_FIRE;
  371.             Bomb_Fire();
  372.             Bomb_Uncharge();
  373. @@ -122,9 +122,16 @@
  374.     Remote_UpdateView();
  375.     self.weaponentity.attack_finished = time + REMOTE_DRAW_TIME;
  376.     self.player_state = PS_DRAW;
  377. -   self.weaponentity.tnt_type = REMOTE_AND_BOMB;
  378. -   self.weaponentity.anim_type = DRAW;
  379. -   self.weaponentity.frame = REMOTE_DRAW_START;
  380. +   if (self.weaponentity.remote_type)
  381. +   {
  382. +       self.weaponentity.anim_type = IDLE_WITH_REMOTE;
  383. +       self.weaponentity.frame = REMOTE_THROW_END;
  384. +   }
  385. +   else
  386. +   {
  387. +       self.weaponentity.anim_type = DRAW;
  388. +       self.weaponentity.frame = REMOTE_DRAW_START;
  389. +   }
  390.     self.weaponentity.skin = 1;
  391.     self.weaponentity.nextthink = time;
  392.     self.weaponentity.think = remote_animate;
  393. @@ -140,7 +147,7 @@
  394.  void() Remote_Holster =
  395.  {
  396.     self.weaponentity.attack_finished = time + REMOTE_HOLSTER_TIME;
  397. -   if (self.weaponentity.tnt_type) //Only holding a remote
  398. +   if (self.weaponentity.remote_type) //Only holding a remote
  399.         self.weaponentity.anim_type = HALF_HOLSTER;
  400.     else
  401.         self.weaponentity.anim_type = HOLSTER;
  402. @@ -173,7 +180,7 @@
  403.  
  404.     //self.weaponentity.attack_finished = time + 0.5; // don't throw instantly after detonating.
  405.     self.owner.button0 = 0;
  406. -   self.weaponentity.tnt_type = REMOTE_AND_BOMB;
  407. +   self.weaponentity.remote_type = REMOTE_AND_BOMB;
  408.     self.weaponentity.charge = 0;
  409.  
  410.     self.weaponentity.nextthink = time;
  411. @@ -306,13 +313,13 @@
  412.     else // ammo_in_chamber == 1
  413.         self.weaponentity.skin = self.weaponentity.skin - 1;
  414.  
  415. -   if (self.owner.button0 && !self.weaponentity.tnt_type) // we have a bomb in hand and holding fire
  416. +   if (self.owner.button0 && !self.weaponentity.remote_type) // we have a bomb in hand and holding fire
  417.     {
  418.         if (self.weaponentity.charge < 20)
  419.             self.weaponentity.charge = self.weaponentity.charge + 1;
  420.         ShowThrowMeter();
  421.     }
  422. -   else if (self.weaponentity.charge && !self.weaponentity.tnt_type)
  423. +   else if (self.weaponentity.charge && !self.weaponentity.remote_type)
  424.     {
  425.         self.weaponentity.anim_type = THROW;
  426.         self.weaponentity.attack_finished = time + REMOTE_THROW_TIME - 0.4; //- 0.4 so we can det it nearly quickly.
  427. @@ -326,7 +333,7 @@
  428.         {
  429.             Bomb_Fire();
  430.             Bomb_Uncharge();
  431. -           self.weaponentity.tnt_type = REMOTE_ONLY;
  432. +           self.weaponentity.remote_type = REMOTE_ONLY;
  433.         }
  434.         else if (self.weaponentity.frame == REMOTE_THROW_END)
  435.             self.weaponentity.anim_type = IDLE_WITH_REMOTE;
  436. diff -r 424c0d946ec9 qblood/progs/w_shotgun.qc
  437. --- a/qblood/progs/w_shotgun.qc Thu May 09 17:12:34 2013 +0200
  438. +++ b/qblood/progs/w_shotgun.qc Sat Jan 10 03:00:19 2015 +0000
  439. @@ -436,12 +436,12 @@
  440.     {
  441.         if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_START)
  442.         {
  443. -           muzzleflash(LEFT);
  444. +           muzzleflash(RIGHT);
  445.             Shotgun_Fire();
  446.         }
  447.         else if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_START + 2)
  448.         {
  449. -           muzzleflash(RIGHT);
  450. +           muzzleflash(LEFT);
  451.             Shotgun_Fire();
  452.         }
  453.         else if (self.weaponentity.frame == SHOTGUN_AKIMBO_FIRE_END)
  454. @@ -472,7 +472,9 @@
  455.     {
  456.         if (self.weaponentity.frame == SHOTGUN_AKIMBO_ALTFIRE_START)
  457.         {
  458. +           muzzleflash(RIGHT);
  459.             Shotgun_Fire();
  460. +           muzzleflash(LEFT);
  461.             Shotgun_Fire();
  462.         }
  463.         else if (self.weaponentity.frame == SHOTGUN_AKIMBO_ALTFIRE_END)
  464. diff -r 424c0d946ec9 qblood/progs/weapons.qc
  465. --- a/qblood/progs/weapons.qc   Thu May 09 17:12:34 2013 +0200
  466. +++ b/qblood/progs/weapons.qc   Sat Jan 10 03:00:19 2015 +0000
  467. @@ -103,14 +103,40 @@
  468.  
  469.     local string sprite;
  470.  
  471. +   makevectors(self.v_angle);
  472.     if (self.owner.weapon == IT_FLAREGUN)
  473.     {
  474.  
  475. +       sprite = "models/weapons/objects/muzzle_flare.spr32";
  476. +       setmodel(muzzle, sprite);
  477. +       muzzle.alpha = 0.7;
  478. +       if (has_akimbo)
  479. +       {
  480. +           muzzle.scale = 0.4;
  481. +           if (hand == RIGHT)
  482. +               setorigin(muzzle, self.weaponentity.origin + v_up * -15);
  483. +       }
  484. +       else
  485. +       {
  486. +           muzzle.scale = 0.6;
  487. +           setorigin(muzzle, self.weaponentity.origin + v_up * -15);
  488. +       }
  489. +       muzzle.frame = 0;
  490. +       muzzle.nextthink = time + 0.1;
  491. +       muzzle.think = muzzle_animate;
  492. +       muzzle.th_die = muzzle_remove;
  493.     }
  494.     else if (self.owner.weapon == IT_SAWED_OFF)
  495.     {
  496.         if (has_akimbo)
  497.         {
  498. +           if (hand == LEFT)
  499. +               setattachment(muzzle, self.weaponentity, "Muzzle_L");
  500. +           else
  501. +               setattachment(muzzle, self.weaponentity, "Muzzle_R");
  502. +           setorigin(muzzle, self.weaponentity.origin + v_right * -13 + v_up * -4);
  503. +           muzzle.scale = 0.65;
  504. +#if 0
  505.             sprite = "models/weapons/objects/muzzle_shotgun.spr32";
  506.             setmodel(muzzle, sprite);
  507.             muzzle.scale = 0.45;
  508. @@ -119,6 +145,7 @@
  509.             muzzle.nextthink = time + 0.1;
  510.             muzzle.think = muzzle_animate;
  511.             muzzle.th_die = muzzle_remove;
  512. +#endif
  513.         }
  514.         else
  515.         {
  516. @@ -133,18 +160,19 @@
  517.                 if (self.weaponentity.ammo_in_chamber == 2)
  518.                 {
  519.                     setattachment(muzzle, self.weaponentity, "Muzzle_L");
  520. -                   setorigin(muzzle, '0 0 0' + v_right * -10.6);
  521. +                   setorigin(muzzle, self.weaponentity.origin + v_right * -10.6);
  522.                 }
  523.                 else
  524.                 {
  525.                     setattachment(muzzle, self.weaponentity, "Muzzle_R");
  526. -                   setorigin(muzzle, '0 0 0' + v_right * -10.4);
  527. +                   setorigin(muzzle, self.weaponentity.origin + v_right * -10.4);
  528.                 }
  529.                 muzzle.scale = 0.45;
  530.             }
  531.         }
  532.         sprite = "models/weapons/objects/muzzle_shotgun.spr32";
  533.         setmodel(muzzle, sprite);
  534. +       muzzle.alpha = 0.6;
  535.         muzzle.frame = 0;
  536.         muzzle.anim_end = 1;
  537.         muzzle.nextthink = time + 0.1;
  538. @@ -175,6 +203,7 @@
  539.         muzzle.think = muzzle_animate;
  540.         muzzle.th_die = muzzle_remove;
  541.     }
  542. +   else remove(muzzle);
  543.     //FIXME - add other weapons, and fix shotgun
  544.  };
  545.  
  546. @@ -845,6 +874,7 @@
  547.  
  548.     /* if you only have a pitchfork drawn, you can draw the Napalm Launcher
  549.         otherwise it won't draw if you run out of ammo of any other weapon */
  550. +   if (self.ammo_rockets >= 1)
  551.     if (self.weapon == IT_PITCHFORK && it & IT_NAPALM_LAUNCHER)
  552.         return IT_NAPALM_LAUNCHER;
  553.  
  554. @@ -1065,6 +1095,13 @@
  555.  {
  556.     local float am, newWeapon;
  557.  
  558. +   if (!self.weapon)
  559. +   {
  560. +       W_SwitchToWeapon(IT_PITCHFORK);
  561. +       W_DrawWeapon(IT_PITCHFORK);
  562. +       return;
  563. +   }
  564. +
  565.     newWeapon = self.weapon;
  566.  
  567.     // Don't let player change weapons while holding lit dynamite.
  568. @@ -1201,7 +1238,7 @@
  569.  
  570.     if (!W_AmmoAvailable() && self.weapon) //self.weapon is a check for dropping your weapons such as TNT self-explosion.
  571.     {
  572. -       if ((self.player_state != PS_HOLD_FIRE) && (self.weaponentity.tnt_type != REMOTE_ONLY))
  573. +       if ((self.player_state != PS_HOLD_FIRE) && (self.weapon != IT_REMOTE_DETONATOR))
  574.         {
  575.             W_SwitchToWeapon(W_BestWeapon());
  576.             return;
  577. diff -r 424c0d946ec9 qblood/progs/world.qc
  578. --- a/qblood/progs/world.qc Thu May 09 17:12:34 2013 +0200
  579. +++ b/qblood/progs/world.qc Sat Jan 10 03:00:19 2015 +0000
  580. @@ -54,6 +54,12 @@
  581.     precache_model("models/objects/m_leg.md3");
  582.     precache_model("models/objects/m_eyeball.md3");
  583.     precache_model("models/objects/m_hand.md3");
  584. +   precache_model("models/objects/glass1.md3");
  585. +   precache_model("models/objects/glass2.md3");
  586. +   precache_model("models/objects/glass3.md3");
  587. +   precache_model("models/objects/rubble1.md3");
  588. +   precache_model("models/objects/rubble2.md3");
  589. +   precache_model("models/objects/rubble3.md3");
  590.  
  591.     precache_model("progs/s_explod.spr");  // napalm sprite explosion
  592.  };
  593. @@ -167,6 +173,7 @@
  594.     precache_sound("thevoice/vo42.wav");
  595.     precache_sound("thevoice/vo43.wav");
  596.     precache_sound("thevoice/vo44.wav");
  597. +   precache_sound("thevoice/vo6.wav");
  598.     precache_sound("thevoice/vo7.wav");
  599.     precache_sound("thevoice/vo8.wav");  // Hamburger
  600.     precache_sound("thevoice/vo9.wav");
  601. @@ -295,6 +302,7 @@
  602.  
  603.     // Create our own cvars as soon as possible
  604.     registercvar("g_flashyEffects", "0");
  605. +   registercvar("g_instabrink", "0");
  606.     registercvar("g_lockTeams", "0");
  607.     registercvar("g_warmup", "0");
  608.     registercvar("g_weaponStay", "0");
RAW Paste Data