Exploding Nails
Author: Triften ChmilSource: https://www.insideqc.com/qctut/qctut-11.shtml
Introduction This tutorial will tell you how to change the regular wussy nailgun into a weapon of mass destruction. Instead of regular nails, you will have time-delay explosive nails (a la Ghost in the Shell). 1.5 seconds after the last one hits, everyone with a nail sticking out of the will go critical and make a BIG mess. |
Step 1 First, open weapons.qc and go down to launch_spike. It'll look like this: /* =============== launch_spike Used for both the player and the ogre (From QTest? Now, that's a bit outdated, eh?) =============== */Above this we will create a new function, W_FireDarts. We have to create a new function or else the scraggs will be certain death. Just cut and paste this or whatever: void(float ox) W_FireDarts =// the ox makes the nails come out of each barrel { local vector dir; local entity dart; //our dart entity if (self.ammo_nails >= 2 && self.weapon == IT_SUPER_NAILGUN) { W_FireSuperSpikes (); //fire spikes and not darts if you are using the super nailgun return; } self.punchangle_x = -4;//the kickback self.currentammo = self.ammo_nails = self.ammo_nails - 1; sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM); self.attack_finished = time + 0.2; dir = aim (self, 1000); dart = spawn ();//creat the dart dart.owner = self;//you are the owner dart.movetype = MOVETYPE_FLYMISSILE;//It doesn't bounce dart.solid = SOLID_BBOX;//it doesn't share space with other items dart.angles = vectoangles(dir); dart.touch = dart_touch;//when touched call dart_touch dart.classname = "spike"; dart.think = SUB_Remove; //After 6 seconds of uneventful flight, dart.nextthink = time + 6; //remove the dart setmodel (dart, "progs/spike.mdl"); setsize (dart, VEC_ORIGIN, VEC_ORIGIN); setorigin (dart, self.origin + '0 0 16' + v_right*ox); dart.velocity = dir * 700; //the dart's speed }; |
Step 2 Above this we will have to define the various touch and think functions Here goes: void() dart_touch = { local float rand; if (other == self.owner) return; //If it hits you, do nothing if (other.solid == SOLID_TRIGGER) return; // trigger field, do nothing if (pointcontents(self.origin) == CONTENT_SKY) { remove(self); return; } // hit something that bleeds if (other.takedamage) { spawn_touchblood (4); T_Damage (other, self, self.owner, 4); //Low damage self.velocity = (self.velocity * 0); //Set's the spike up so it sticks self.avelocity = VEC_ORIGIN; //to an enemy self.enemy = other; dart_wait = time + 1.5; //the time delay for detonation self.think = dart_stick; //In a tenth second self.nextthink = (time + 0.10); //go to dart_stick self.touch = dart_fuse; //now when touched call dart_fuse } else //otherwise the dart hits a wall... { WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_SPIKE); WriteCoord (MSG_BROADCAST, self.origin_x); WriteCoord (MSG_BROADCAST, self.origin_y); WriteCoord (MSG_BROADCAST, self.origin_z); remove(self); } }; |
Step 3 Finally we mention functions ahead of time to define later and add one thing to player.qc. Add this above dart_fuse: void() s_explode1; void() BecomeExplosion; float dart_wait; void() W_FireSuperSpikes;Open player.qc and find this: void() player_nail1 =[$nailatt1, player_nail2 ] { self.effects = self.effects | EF_MUZZLEFLASH; if (!self.button0) {player_run ();return;} self.weaponframe = self.weaponframe + 1; if (self.weaponframe == 9) self.weaponframe = 1; SuperDamageSound(); W_FireSpikes (4); self.attack_finished = time + 0.2; }; void() player_nail2 =[$nailatt2, player_nail1 ] { self.effects = self.effects | EF_MUZZLEFLASH; if (!self.button0) {player_run ();return;} self.weaponframe = self.weaponframe + 1; if (self.weaponframe == 9) self.weaponframe = 1; SuperDamageSound(); W_FireSpikes (-4); self.attack_finished = time + 0.2; };Change both of the W_FireSpikes to W_FireDarts. Leave the 4 and -4 alone. |
Step 4 Compile and run in with guns a-blazin'! |
Tags: tutorial, quakec, qc, insideqc, weapon