r89 - trunk/basezym/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Dec 10 13:22:40 EST 2007


Author: vermeulen
Date: 2007-12-10 13:22:40 -0500 (Mon, 10 Dec 2007)
New Revision: 89

Modified:
   trunk/basezym/progsqc/actor.qc
   trunk/basezym/progsqc/damage.qc
   trunk/basezym/progsqc/gamedefs.qc
   trunk/basezym/progsqc/inventory.qc
   trunk/basezym/progsqc/player.qc
   trunk/basezym/progsqc/server.qc
Log:
Class selection
Made the Jetpack an item

Modified: trunk/basezym/progsqc/actor.qc
===================================================================
--- trunk/basezym/progsqc/actor.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/actor.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -311,8 +311,20 @@
 		else if (self.button7)
 		{
 		 	Inventory_GetItemInfo(self, self.itemselected);
-			if (iteminfo_weapon_canfire1 && iteminfo_weapon_canfire2 && (!self.weapon_oldbutton7 || !(iteminfo_ammo1fireflags & FIREFLAG_SEMIAUTOMATIC)))
-			   weapon_state(WS_FIRE3);
+			if ((!iteminfo_ammo1noprojectile) && iteminfo_weapon_canfire1 && iteminfo_weapon_canfire2 && (!self.weapon_oldbutton7 || !(iteminfo_ammo1fireflags & FIREFLAG_SEMIAUTOMATIC)))
+			{
+			   	weapon_state(WS_FIRE3);
+			}
+			else if (iteminfo_ammo1fireflags & FIREFLAG_JETPACK)
+			{
+			    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
+				self.jetpack_fuel = iteminfo_quantity;
+			   	if (!self.jetpackactive)
+				{
+			   	   sound(self, CHAN_BODY, strcat(self.playerclass.sounddir, "/jetpack.wav"), 1, ATTN_NORM);
+				   self.jetpackactive = TRUE;
+				}
+			}
 		}
 	}
 	self.weapon_oldbutton0 = self.button0;

Modified: trunk/basezym/progsqc/damage.qc
===================================================================
--- trunk/basezym/progsqc/damage.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/damage.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -551,27 +551,36 @@
 							
 		if(self.state == 1)
 		{
-		 	pullspeed = 2000;
-			rubberforce = 2000;
-			rubberforce_overstretch = 1000;
-			minlength = 100;
-			ropestretch = 400;
-			ropeairfriction = 0.2;
+		 	pullspeed = cvar("g_grapplehook_speed_pull");
+			rubberforce = cvar("g_grapplehook_force_rubber");
+			rubberforce_overstretch = cvar("g_grapplehook_force_rubber_overstretch");
+			minlength = cvar("g_grapplehook_length_min");
+			ropestretch = cvar("g_grapplehook_stretch");
+			ropeairfriction = cvar("g_grapplehook_airfriction");
 		
 			dir = self.origin - org;
 			dist = vlen(dir);
 			dir = normalize(dir);
 		
-			end = self.origin - dir*50;
-			dist = vlen(end - org);
-			if(dist < 200)
-				spd = dist * (pullspeed / 200);
-			else
-				spd = pullspeed;
-			if(spd < 50)
-			   spd = 0;
-			self.owner.velocity = dir*spd;
-			self.owner.movetype = MOVETYPE_FLY;
+			newlength = self.rope_length;
+
+			// first pull the rope...
+			newlength = max(newlength - pullspeed * frametime, minlength);
+
+			if(newlength < dist - ropestretch) // overstretched?
+			{
+				newlength = dist - ropestretch;
+				if(self.owner.velocity * dir < 0) // only if not already moving in hook direction
+					self.owner.velocity = self.owner.velocity + frametime * dir * rubberforce_overstretch;
+			}
+
+			if(!self.owner.button5) // crouch key = don't pull
+				self.rope_length = newlength;
+
+			// then pull the player
+			spd = bound(0, (dist - self.rope_length) / ropestretch, 1);
+			self.owner.velocity = self.owner.velocity * (1 - frametime * ropeairfriction);
+			self.owner.velocity = self.owner.velocity + frametime * dir * spd * rubberforce;
 		}
 		
 		makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');

Modified: trunk/basezym/progsqc/gamedefs.qc
===================================================================
--- trunk/basezym/progsqc/gamedefs.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/gamedefs.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -13,6 +13,8 @@
 
 .float itemselected;
 
+.float spawned;
+
 .vector viewmodelchange;
 .vector viewmodeldiff;
 
@@ -57,6 +59,7 @@
 .float aitype;
 .float animationtype;
 .float team;
+.float classnum;
 
 float AITYPE_NONE = 0;
 float AITYPE_1 = 1;

Modified: trunk/basezym/progsqc/inventory.qc
===================================================================
--- trunk/basezym/progsqc/inventory.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/inventory.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -11,23 +11,33 @@
 float ITEMTYPE_WEAP5 = 4;
 float ITEMTYPE_WEAP6 = 5;
 float ITEMTYPE_WEAP7 = 6;
+float ITEMTYPE_WEAP8 = 7;
+float ITEMTYPE_WEAP9 = 8;
+float ITEMTYPE_WEAP10 = 9;
+float ITEMTYPE_WEAP11 = 10;
+float ITEMTYPE_WEAP12 = 11;
+float ITEMTYPE_WEAP13 = 12;
+float ITEMTYPE_WEAP14 = 13;
+float ITEMTYPE_WEAP15 = 14;
+float ITEMTYPE_WEAP16 = 15;
 
-float ITEMTYPE_AI_WEAP1 = 7;
-float ITEMTYPE_AI_WEAP2 = 8;
-float ITEMTYPE_AI_WEAP3 = 9;
-float ITEMTYPE_AI_WEAP4 = 10;
-float ITEMTYPE_AI_WEAP5 = 11;
-float ITEMTYPE_AI_WEAP6 = 12;
+float ITEMTYPE_AI_WEAP1 = 16;
+float ITEMTYPE_AI_WEAP2 = 17;
+float ITEMTYPE_AI_WEAP3 = 18;
+float ITEMTYPE_AI_WEAP4 = 19;
+float ITEMTYPE_AI_WEAP5 = 20;
+float ITEMTYPE_AI_WEAP6 = 21;
 
-float ITEMTYPE_ITEM1 = 13;
-float ITEMTYPE_ITEM2 = 14;
+float ITEMTYPE_ITEM1 = 22;
+float ITEMTYPE_ITEM2 = 23;
+float ITEMTYPE_ITEM3 = 24;
 
-float ITEMTYPE_AMMO1 = 15;
-float ITEMTYPE_AMMO2 = 16;
-float ITEMTYPE_AMMO3 = 17;
-float ITEMTYPE_AMMO4 = 18;
+float ITEMTYPE_AMMO1 = 25;
+float ITEMTYPE_AMMO2 = 26;
+float ITEMTYPE_AMMO3 = 27;
+float ITEMTYPE_AMMO4 = 28;
 
-float ITEMTYPE_TOTAL = 19;
+float ITEMTYPE_TOTAL = 29;
 
 float WS_IDLE = 0;
 float WS_FIRE1 = 1;
@@ -56,6 +66,7 @@
 string iteminfo_name;
 float iteminfo_itemtype;
 float iteminfo_quantitymax;
+float iteminfo_rechargerate;
 float iteminfo_ammomax;
 float iteminfo_ammoinventorymax;
 float iteminfo_ammotype;
@@ -102,6 +113,8 @@
 vector iteminfo_ammo2colormod;
 vector iteminfo_ammo1viewmodelpush;
 vector iteminfo_ammo2viewmodelpush;
+float iteminfo_ammo1noprojectile;
+float iteminfo_ammo2noprojectile;
 
 // special information specific to weapon items
 string iteminfo_weapon_viewmodel;
@@ -144,7 +157,7 @@
 		//error("itemtype = ",ftos(itemtype),"\n");
 	}
 	if (itemtype >= ITEMTYPE_TOTAL)
-		error("itemtype >= ITEMTYPE_TOTAL\n");
+		bprint(ftos(itemtype)," ", ftos(ITEMTYPE_TOTAL), " : itemtype >= ITEMTYPE_TOTAL\n");
 	iteminfo_itemtype = itemtype;
 	item = Inventory_GetItem(character, itemtype);
 	iteminfo_quantity = item_x;
@@ -157,6 +170,7 @@
 	iteminfo_name = "unknown";
 	iteminfo_pickupsound = "";
 	iteminfo_quantitymax = 0;
+	iteminfo_rechargerate = 0;
 	iteminfo_ammomax = 0;
 	iteminfo_ammoinventorymax = 0;
 	iteminfo_ammotype = ITEMTYPE_NONE;
@@ -182,6 +196,7 @@
 	iteminfo_ammo1mass = 0;
 	iteminfo_ammo1colormod = '0 0 0';
 	iteminfo_ammo1viewmodelpush = '0 0 0';
+	iteminfo_ammo1noprojectile = 0;
 	iteminfo_ammo2minimumtofire = 0;
 	iteminfo_ammo2damagetype = DAMAGETYPE_UNKNOWN;
 	iteminfo_ammo2damage = '0 0 0';
@@ -203,6 +218,7 @@
 	iteminfo_ammo2mass = 0;
 	iteminfo_ammo2colormod = '0 0 0';
 	iteminfo_ammo2viewmodelpush =  '0 0 0';
+	iteminfo_ammo2noprojectile = 0;
 	iteminfo_weapon_viewmodel = "";
 	iteminfo_weapon_viewmodelanim_idle = '0 0 1';
 	iteminfo_weapon_viewmodelanim_fire1 = '0 0 2';
@@ -255,6 +271,8 @@
 		iteminfo_pickupmodel = cvar_string(wname,"_pickupmodel");
 		iteminfo_viewmodeloffset = stov(cvar_string(wname,"_viewmodeloffset"));
 		
+		iteminfo_rechargerate = cvar(wname,"_rechargerate");
+		
 		iteminfo_ammomax = cvar(wname,"_ammomax");
 		iteminfo_ammoinventorymax = cvar(wname,"_ammoinventorymax");
 		
@@ -268,6 +286,8 @@
 		iteminfo_ammo1explflags = cvar(wname,"_ammo1explflags");
 		iteminfo_ammo1fireflags = cvar(wname,"_ammo1fireflags");
 		
+		iteminfo_ammo1noprojectile = cvar(wname,"_ammo1noprojectile");
+		
 		iteminfo_ammo1numberof = cvar(wname,"_ammo1numberof");
 		iteminfo_ammo1recoil = cvar(wname,"_ammo1recoil");
 		iteminfo_ammo1minimumtofire = cvar(wname,"_ammo1mintofire");
@@ -291,6 +311,8 @@
 		iteminfo_ammo2explflags = cvar(wname,"_ammo2explflags");
 		iteminfo_ammo2fireflags = cvar(wname,"_ammo2fireflags");
 		
+		iteminfo_ammo2noprojectile = cvar(wname,"_ammo2noprojectile");
+		
 		iteminfo_ammo2numberof = cvar(wname,"_ammo2numberof");
 		iteminfo_ammo2recoil = cvar(wname,"_ammo2recoil");
 		iteminfo_ammo2minimumtofire = cvar(wname,"_ammo2mintofire");
@@ -313,7 +335,7 @@
 		iteminfo_quantitymax = cvar(wname,"_quantitymax");
 	}
 	else
-		error(ftos(itemtype)," Inventory_GetItemInfo: unknown itemtype\n");
+		bprint(ftos(itemtype)," Inventory_GetItemInfo: unknown itemtype\n");
 	
 	if (iteminfo_quantity >= 1)
 	{
@@ -445,6 +467,24 @@
 	return best;
 };
 
+float(entity character) Inventory_GetBestItem =
+{
+	local float best;
+	local float rank;
+	local float c;
+	best = -1;
+	rank = 0;
+	c = ITEMTYPE_ITEM1;
+	while (c < ITEMTYPE_AMMO1)
+	{
+		Inventory_GetItemInfo(character, c);
+		if (iteminfo_weapon_canraise)
+			best = c;
+		c = c + 1;
+	}
+	return best;
+};
+
 vector(entity character, float itemtype, float adjustquantity, float adjustammo) Inventory_ModifyItem =
 {
 	local float olditemtype;

Modified: trunk/basezym/progsqc/player.qc
===================================================================
--- trunk/basezym/progsqc/player.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/player.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -34,13 +34,14 @@
 	
 	string cname;
 
-	local float startingweapon;
-	local float classnum;
-	for (classnum = 1;classnum < ACTORTYPE_TOTAL;classnum++)
+	local float newweapon;
+	local float classnumber;
+	local float i;
+	for (classnumber = 1;classnumber < ACTORTYPE_TOTAL;classnumber++)
 	{
-	 	  cname = strcat("g_class",ftos(classnum));
+	 	  cname = strcat("g_class",ftos(classnumber));
 	
-		  pc = playerclass_spawn(classnum, cvar(cname,"_aitype"), strzone(cvar_string(cname,"_model")), ".md3", strzone(cvar_string(cname,"_name")));
+		  pc = playerclass_spawn(classnumber, cvar(cname,"_aitype"), strzone(cvar_string(cname,"_model")), ".md3", strzone(cvar_string(cname,"_name")));
 		  
 		  pc.health = cvar(cname,"_healthstart");
 		  pc.max_health = cvar(cname,"_healthmax");
@@ -175,21 +176,26 @@
 		 
 		 Inventory_Clear(pc);
 		 
-		 if (cvar(cname,"_startinguserweapon") != 0) // User weapons
+		 for (i=1; i < ITEMTYPE_AI_WEAP1; i++)
 		 {
-		  		startingweapon = cvar(cname,"_startinguserweapon") - 1;
-		  		Inventory_GetItemInfo(pc, startingweapon);
-		  		Inventory_ModifyItem(pc, startingweapon, 1, iteminfo_ammomax);
-		  		Inventory_ModifyItem(pc, ITEMTYPE_AMMO1 + startingweapon, iteminfo_ammoinventorymax * 2, 0);
+		  	 if (cvar(cname,"_weapon",ftos(i)) != 0)
+		 	 {
+		  		newweapon = cvar(cname,"_weapon",ftos(i)) - 1;
+		  		Inventory_GetItemInfo(pc, newweapon);
+		  		Inventory_ModifyItem(pc, newweapon, 1, iteminfo_ammomax);
+		  		Inventory_ModifyItem(pc, ITEMTYPE_AMMO1 + newweapon, iteminfo_ammoinventorymax * 2, 0);
+		 	 }
 		 }
-		 else if (cvar(cname,"_startingaiweapon") != 0) // AI weapons
+		 
+		 for (i=1; i <= (ITEMTYPE_AMMO1 - ITEMTYPE_ITEM1); i++)
 		 {
-		  		startingweapon = cvar(cname,"_startingaiweapon") + ITEMTYPE_AI_WEAP1 - 1;
-		  		Inventory_GetItemInfo(pc, startingweapon);
-		  		Inventory_ModifyItem(pc, startingweapon, 1, iteminfo_ammomax);
+		  	 if (cvar(cname,"_item",ftos(i)) != 0)
+		 	 {
+		  		newweapon = cvar(cname,"_item",ftos(i)) - 1;
+		  		Inventory_GetItemInfo(pc, newweapon + ITEMTYPE_ITEM1);
+		  		Inventory_ModifyItem(pc, newweapon + ITEMTYPE_ITEM1, iteminfo_quantitymax, 0);
+		 	 }
 		 }
-		 Inventory_GetItemInfo(pc, ITEMTYPE_ITEM1);
-		 Inventory_ModifyItem(pc, ITEMTYPE_ITEM1, 10, 0);
 	}
 };
 
@@ -268,8 +274,6 @@
 	self.jumpspeed = pc.jumpspeed;
 	self.speedratio = pc.speedratio;
 	
-	self.itemselected = ITEMTYPE_ITEM1;
-	
 	setsize (self, pc.mins, pc.maxs);
 	Inventory_CloneFromInventory(self, pc);
 	
@@ -277,6 +281,7 @@
 	player_selectlegsanim(TRUE);
 	anim_start(self.actorpart_torso, self.playerclass.actoranim_TORSO_STAND, ANIMTYPE_IDLE, torso_animframefunc);
 	
+	self.itemselected = Inventory_GetBestItem(self);
 	weapon_setup(self, Inventory_GetBestWeapon(self));
 };
 
@@ -350,6 +355,7 @@
 	return spot;
 };
 
+
 /*
 =============
 PutClientInServer
@@ -360,7 +366,6 @@
 void() PutClientInServer =
 {
 	local entity spot;
-	local float classnum;
 
 	self.flags = FL_CLIENT;
 
@@ -371,9 +376,19 @@
 	self.fixangle = TRUE;
 	self.v_angle = self.angles_x * '-1 0 0' + self.angles_y * '0 1 0';
 	self.nextthink = 0;
+	
 	self.team = cvar("g_playerteam");
-	classnum = cvar("g_startclass");
-	player_spawn(classnum);
+	//self.classnum = cvar("g_startclass");
+	
+	if (!self.spawned)
+	{
+	   self.health = 1;
+	   stuffcmd(self,"menu_showteamselect\n");
+	}
+	else
+	{
+	 	player_spawn(self.classnum);
+	}
 };
 
 /*
@@ -466,11 +481,10 @@
 .float deadtime;
 void() PlayerPreThink =
 {
-	if ((self.jetpack_fuel < self.jetpack_fuelmax) && (!(self.jetpackactive)))
+	if (!self.spawned)
 	{
-	   self.jetpack_fuel = self.jetpack_fuel + self.jetpack_fuelregenair;
+	   return;
 	}
-	
 	if (self.flags & FL_CLIENT) // should really be client side
 	{
 	   self.viewmodelchange_x = self.viewmodelchange_x - (self.movement_x / 1000);
@@ -489,6 +503,11 @@
 			remove(self.hook);
 	}
 	
+	Inventory_GetItemInfo(self, self.itemselected);
+	Inventory_ModifyItem(self, self.itemselected, 0 + iteminfo_rechargerate, 0);
+	Inventory_GetItemInfo(self, self.weaponitem);
+	Inventory_ModifyItem(self, self.weaponitem, 0, 0 + iteminfo_rechargerate);
+	
 	local float im;
 	if (self.flags & FL_CLIENT) // only real players can respawn, not NPCs
 	if (self.deadflag)
@@ -507,12 +526,7 @@
 	}
 	if (!self.deadflag)
 	if (self.flags & FL_ONGROUND)
-	{
-	   	if ((self.jetpack_fuel < self.jetpack_fuelmax) && (!(self.jetpackactive)))
-		{
-	   	   self.jetpack_fuel = self.jetpack_fuel + self.jetpack_fuelregenground;
-	    }
-	
+	{	
 		if (self.jumpflag || self.oldvelocity_z < -200)
 		{
 			if (self.oldvelocity_z < -500)
@@ -546,19 +560,12 @@
 		}
 		else
 			self.viewzoom = 1;
-		if (self.button5)
+		if (self.button7 & self.jetpackactive)
 		{
 			if ((self.jetpack_fuel > 10) && (self.actorpart_jetpacktrail.effects & EF_NODRAW))
-			   	 self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects - EF_NODRAW;
+			  	self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects - EF_NODRAW;
 			else if (self.jetpack_fuel < 10)
-			 	 self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects | EF_NODRAW;
-				
-			self.jetpack_fuel = max(0, self.jetpack_fuel - self.jetpack_use * frametime);
-			if (!self.jetpackactive)
-			{
-				   	sound(self, CHAN_BODY, strcat(self.playerclass.sounddir, "/jetpack.wav"), 1, ATTN_NORM);
-					self.jetpackactive = TRUE;
-			}
+			 	self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects | EF_NODRAW;
 		}
 		else
 		{
@@ -595,7 +602,11 @@
 .float oldbutton3;
 .float pointitemannouncetime;
 void() PlayerPostThink =
-{
+{	
+	if (!self.spawned)
+	{
+	   return;
+	}
 	local entity oldself;
 	player_regen();
 	
@@ -853,20 +864,21 @@
 		wishdir = normalize(wishvel);
 		wishspeed = wishspeed + vlen(wishvel);
 		
-		if (self.button5 && self.jetpack_fuel > 5)
+		if (self.jetpackactive && self.jetpack_fuel > 5)
 		{
-		    self.movetype = MOVETYPE_FLY;
+			self.movetype = MOVETYPE_FLY;
 			
 			if (self.velocity_z < self.jetpack_maxupspeed)
 			{
-		   	   self.jetpack_acc = self.jetpack_acc + self.jetpack_acc;
-			   self.velocity_z = self.velocity_z + self.jetpackacc;
+			  self.jetpack_acc = self.jetpack_acc + self.jetpack_acc;
+			  self.velocity_z = self.velocity_z + self.jetpackacc;
 			}
 			if (wishspeed > self.jetpack_maxmovespeed)
 			   wishspeed = self.jetpack_maxmovespeed;
 		}
 		else 
 		{
+		 	self.jetpackactive = FALSE;
 		 	self.movetype = MOVETYPE_WALK;
 		 	if (wishspeed > sv_maxairspeed)
 			   wishspeed = sv_maxairspeed;
@@ -1183,6 +1195,7 @@
 				if (select == 0)
 				{
 				   self.switchweaponitem = w;
+				   bprint(iteminfo_name,"\n");
 				   break;
 				}
 			}
@@ -1203,6 +1216,7 @@
 			if (iteminfo_weapon_canraise)
 			{
 				self.switchweaponitem = w;
+				bprint(iteminfo_name,"\n");
 				break;
 			}
 		}
@@ -1221,6 +1235,7 @@
 			if (iteminfo_weapon_canraise)
 			{
 				self.switchweaponitem = w;
+				bprint(iteminfo_name,"\n");
 				break;
 			}
 		}
@@ -1238,8 +1253,8 @@
 			Inventory_GetItemInfo(self, w);
 			if (iteminfo_weapon_canraise)
 			{
+			   	bprint(iteminfo_name,"\n");
 				self.itemselected = w;
-				Inventory_GetItemInfo(self, w);
 				break;
 			}
 		}

Modified: trunk/basezym/progsqc/server.qc
===================================================================
--- trunk/basezym/progsqc/server.qc	2007-12-09 00:00:09 UTC (rev 88)
+++ trunk/basezym/progsqc/server.qc	2007-12-10 18:22:40 UTC (rev 89)
@@ -100,3 +100,24 @@
 	
 	bot_serverframe();
 };
+
+void SV_ParseClientCommand(string s)
+{
+	tokenize(s);
+	if(argv(0) == "join") 
+	{
+		bprint ("^4", self.netname, "^4 is playing now\n");
+	 	if (!self.spawned)
+		{
+			self.spawned = TRUE;
+			self.frags = 0;
+			PutClientInServer();
+		}
+	} 
+	else if( argv(0) == "selectclass" ) 
+	{
+	 	self.classnum = stof(argv(1));
+		if ((self.classnum > ACTORTYPE_TOTAL) || (self.classnum <= ACTORTYPE_INVALID))
+		   self.classnum = 1;
+	}
+}
\ No newline at end of file




More information about the zymotic-commits mailing list