r76 - trunk/basezym/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Oct 25 07:40:55 EDT 2007


Author: Vermeulen
Date: 2007-10-25 07:40:54 -0400 (Thu, 25 Oct 2007)
New Revision: 76

Modified:
   trunk/basezym/progsqc/actor.qc
   trunk/basezym/progsqc/bots.qc
   trunk/basezym/progsqc/damage.qc
   trunk/basezym/progsqc/gamedefs.qc
   trunk/basezym/progsqc/inventory.qc
   trunk/basezym/progsqc/jumppads.qc
   trunk/basezym/progsqc/player.qc
Log:
Added player class system
Bugs fixed:
- torsos being attached to projectiles
- gibbing problems

Modified: trunk/basezym/progsqc/actor.qc
===================================================================
--- trunk/basezym/progsqc/actor.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/actor.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -9,9 +9,10 @@
 .entity actorpart_hand;
 
 float ACTORTYPE_INVALID = 0;
-float ACTORTYPE_THEPLAYER = 1;
-float ACTORTYPE_LIGHTGUARD = 2;
-float ACTORTYPE_HEAVYGUARD = 3;
+float ACTORTYPE_CLASS1 = 1;
+float ACTORTYPE_CLASS2 = 2;
+float ACTORTYPE_CLASS3 = 3;
+float ACTORTYPE_TOTAL = 4;
 
 .float actortype;
 
@@ -123,6 +124,9 @@
 	self.actorpart_weapon.model = ""; // will be changed by weapon code as needed
 	self.actorpart_viewweapon.model = ""; // will be changed by weapon code as needed
 	
+	self.scale = self.scaleratio;
+	//setsize(self, self.boxmin, self.boxmax);
+	
 	// FIXME: add a hands viewmodel for each player model (animated to match the torso) and attach the weapon to it, until this is done this setorigin is necessary to put it in roughly the right place on the screen
 	v = self.weapon_ofs - self.view_ofs + '10 4 -10'; // front side up
 	v_y = v_y * -1;
@@ -182,6 +186,7 @@
 	//s2 = ftos(self.button3);
 	//s3 = ftos(self.weaponstate);
 	//centerprint(self, "actor_update ", s1, " ", s2, " ", s3);
+	
 	player_selectlegsanim(FALSE);
 	anim_update(self);
 	anim_update(self.actorpart_torso);

Modified: trunk/basezym/progsqc/bots.qc
===================================================================
--- trunk/basezym/progsqc/bots.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/bots.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -98,7 +98,7 @@
 	e = findradius(v1, 1500);
 	while (e)
 	{
-		if (e.aitype == AITYPE_PLAYER)
+		if (e.team != self.team)
 		if (e.takedamage)
 		if (!e.deadflag)
 		if (!(e.flags & FL_NOTARGET))
@@ -116,7 +116,7 @@
 {
 	local vector v1, v2;
 
-	if (self.aitype == AITYPE_SMARTFELLOW)
+	if (self.aitype == AITYPE_1)
 	{
 		self.movement = '0 0 0';
 		self.button0 = self.button2 = self.button3 = self.button4 = 0;
@@ -174,25 +174,7 @@
 	PlayerPreThink();
 	PlayerPostThink();
 };
-.float starting_gun;
-void() info_npc_smartfellow =
-{
-	local float c;
 
-	self.think = bot_npcthink;
-	self.nextthink = time;
-	player_spawn(ACTORTYPE_THEPLAYER);
-	self.aitype = AITYPE_SMARTFELLOW;
-	c = 0;
-	while (c < ITEMTYPE_TOTAL)
-	{
-		Inventory_GetItemInfo(self, c);
-		Inventory_ModifyItem(self, c, iteminfo_quantitymax, iteminfo_ammo1max, iteminfo_ammo2max);
-		c = c + 1;
-	}
-	self.switchweaponitem = self.starting_gun;
-};
-
 void() monster_light_guard
 {
  	if (cvar("g_gametype") == 1)
@@ -201,7 +183,8 @@
 		self.think = bot_npcthink;
 		self.nextthink = time;
 		self.netname = "Light Guard";
-		player_spawn(ACTORTYPE_LIGHTGUARD);
+		self.team = 2;
+		player_spawn(ACTORTYPE_CLASS2);
 	}
 };
 
@@ -213,7 +196,8 @@
 		self.think = bot_npcthink;
 		self.nextthink = time;
 		self.netname = "Heavy Guard";
-		player_spawn(ACTORTYPE_HEAVYGUARD);
+		self.team = 2;
+		player_spawn(ACTORTYPE_CLASS3);
 	}
 };
 

Modified: trunk/basezym/progsqc/damage.qc
===================================================================
--- trunk/basezym/progsqc/damage.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/damage.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -234,6 +234,9 @@
 		self.armorregentime = max(self.armorregentime, time + ACTOR_SHIELD_REGENDELAY);
 		self.armorregenplaysound = TRUE;
 	}
+	te_blood(location, force, take);
+	te_blood(location, force, save);
+	
 	/*
 	if (self.entitytype == ETYPE_HUMAN)
 	{
@@ -247,8 +250,7 @@
 	{
 		//if (damage >= 1)
 		//	te_spark(location, '0 0 0' - force, damage);
-		if (damage >= 1)
-			te_blood(location, force, take);
+		//if (damage >= 1)
 	}
 	if (self.deadflag == DEAD_NO)
 	{

Modified: trunk/basezym/progsqc/gamedefs.qc
===================================================================
--- trunk/basezym/progsqc/gamedefs.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/gamedefs.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -3,12 +3,40 @@
 .float ladder_time;
 .entity ladder_entity;
 
-.float jetpackfuel;
-
 .float fade_time;
 .float fade_rate;
 .vector finaldest, finalangle;
 
+.string modeldir;
+.string modelext;
+.string sounddir;
+.entity playerclass;
+
+.float jumpspeed;
+.float speedratio;
+.float scaleratio;
+.vector boxmin;
+.vector boxmax;
+.float jetpack_fuel;
+.float jetpack_fuelmax;
+.float jetpack_fuelregenair;
+.float jetpack_fuelregenground;
+.float jetpack_acc;
+.float jetpack_accadd;
+.float jetpack_accbase;
+.float jetpack_maxupspeed;
+.float jetpack_maxmovespeed;
+.float jetpack_use;
+.float jetpackactive;
+
+.float aitype;
+.float animationtype;
+.float team;
+
+float AITYPE_NONE = 0;
+float AITYPE_1 = 1;
+float AITYPE_2 = 2;
+
 // gravity scaling (engine feature)
 // TODO: move to defs.qc or dpextensions.qc or something else?
 .float gravity;
@@ -23,7 +51,7 @@
 //float sv_edgefriction, cl_divspeed, cl_rollangle;
 
 
-// vector PL_MIN = stov(cvar_string("g_player_boxmin"));
+// vector PL_MIN = stov(cvar_string("g_player_boxmin"));    NOTE: g_player changed to g_class#
 //vector PL_MAX = stov(cvar_string("g_player_boxmax"));
 //vector PL_VIEW_OFS = stov(cvar_string("g_player_viewofs"));
 //vector PL_WEAPON_OFS = stov(cvar_string("g_player_weaponofs"));

Modified: trunk/basezym/progsqc/inventory.qc
===================================================================
--- trunk/basezym/progsqc/inventory.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/inventory.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -12,17 +12,17 @@
 float ITEMTYPE_WEAP6 = 5;
 float ITEMTYPE_WEAP7 = 6;
 
-float ITEMTYPE_WEAP1_AMMO = 7;
-float ITEMTYPE_WEAP2_AMMO = 8;
-float ITEMTYPE_WEAP3_AMMO = 9;
-float ITEMTYPE_WEAP4_AMMO = 10;
-float ITEMTYPE_WEAP5_AMMO = 11;
-float ITEMTYPE_WEAP6_AMMO = 12;
-float ITEMTYPE_WEAP7_AMMO = 13;
+float ITEMTYPE_AI_WEAP1 = 7;
+float ITEMTYPE_AI_WEAP2 = 8;
+float ITEMTYPE_AI_WEAP3 = 9;
 
-float ITEMTYPE_AI_WEAP1 = 14;
-float ITEMTYPE_AI_WEAP2 = 15;
-float ITEMTYPE_AI_WEAP3 = 16;
+float ITEMTYPE_WEAP1_AMMO = 10;
+float ITEMTYPE_WEAP2_AMMO = 11;
+float ITEMTYPE_WEAP3_AMMO = 12;
+float ITEMTYPE_WEAP4_AMMO = 13;
+float ITEMTYPE_WEAP5_AMMO = 14;
+float ITEMTYPE_WEAP6_AMMO = 15;
+float ITEMTYPE_WEAP7_AMMO = 16;
 
 float ITEMTYPE_TOTAL = 17;
 
@@ -224,7 +224,11 @@
 		iteminfo_weapon_viewmodelanim_raise = '0 0 2';
 		
 		string wname;
-		wname = strcat("g_weap",ftos(itemtype + 1));
+		if (itemtype < ITEMTYPE_AI_WEAP1)
+		   wname = strcat("g_weap",ftos(itemtype + 1));
+		else
+		   wname = strcat("g_ai_weap",ftos(itemtype - ITEMTYPE_AI_WEAP1 + 1));  
+			
 		iteminfo_ammo1itemtype = ITEMTYPE_WEAP1_AMMO + itemtype;
 		iteminfo_ammo1damagetype = DAMAGETYPE_WEAP1 + itemtype;
 		iteminfo_ammo2itemtype = ITEMTYPE_WEAP1_AMMO + itemtype;
@@ -274,7 +278,7 @@
 		iteminfo_ammo2colormod = stov(cvar_string(wname,"_ammo2colormod"));
 		iteminfo_weapon_viewmodelanim_fire2 = stov(cvar_string(wname,"_fire2"));
 	}
-	else if (itemtype < ITEMTYPE_AI_WEAP1)
+	else if (itemtype < ITEMTYPE_TOTAL)
 	{
 		wname = strcat("g_weap",ftos(itemtype - ITEMTYPE_WEAP1_AMMO + 1));
 		iteminfo_name = cvar_string(wname,"_ammo_name");
@@ -283,47 +287,6 @@
 		iteminfo_quantitymax = cvar(wname,"_ammo_quantitymax");
 		iteminfo_pickupsprite = cvar_string(wname,"_ammo_pickupsprite");
 	}
-	else if (itemtype < ITEMTYPE_TOTAL)
-	{
-		iteminfo_quantitymax = 1;
-		iteminfo_pickupsound = "items/pickupweapon.wav";
-		iteminfo_weapon_viewmodelanim_idle = '0 0 30';
-		iteminfo_weapon_viewmodelanim_reload = '0 0 1';
-		iteminfo_weapon_viewmodelanim_lower = '0 0 2';
-		iteminfo_weapon_viewmodelanim_raise = '0 0 2';
-		
-		string wname;
-		wname = strcat("g_ai_weap",ftos(itemtype - ITEMTYPE_AI_WEAP1 + 1));
-		iteminfo_ammo1itemtype = ITEMTYPE_WEAP1_AMMO + itemtype;
-		iteminfo_ammo1damagetype = DAMAGETYPE_WEAP1 + itemtype;
-		iteminfo_ammo2itemtype = ITEMTYPE_WEAP1_AMMO + itemtype;
-		iteminfo_ammo2damagetype = DAMAGETYPE_WEAP1 + itemtype;
-		
-		iteminfo_name = cvar_string(wname);
-		iteminfo_model = cvar_string(wname,"_model");
-		iteminfo_pickupsprite = cvar_string(wname,"_pickupsprite");
-		iteminfo_weapon_viewmodel = cvar_string(wname,"_viewmodel");
-		iteminfo_pickupmodel = cvar_string(wname,"_pickupmodel");
-		
-		iteminfo_ammo1damage = stov(cvar_string(wname,"_ammo1damage"));
-		iteminfo_ammo1speeds = stov(cvar_string(wname,"_ammo1speeds"));
-		iteminfo_ammo1model = cvar_string(wname,"_ammo1model");
-		iteminfo_ammo1firesound = cvar_string(wname,"_ammo1firesound");
-		iteminfo_ammo1max = cvar(wname,"_ammo1max");
-		iteminfo_ammo1inventorymax = cvar(wname,"_ammo1max");
-		iteminfo_ammo1flags = cvar(wname,"_ammo1flags");
-		iteminfo_ammo1numberof = cvar(wname,"_ammo1numberof");
-		iteminfo_ammo1recoil = cvar(wname,"_ammo1recoil");
-		iteminfo_ammo1minimumtofire = cvar(wname,"_ammo1mintofire");
-		iteminfo_ammo1lifetime = cvar(wname,"_ammo1lifetime");
-		iteminfo_ammo1tracer = cvar(wname,"_ammo1tracer");
-		iteminfo_ammo1tracermodel = cvar_string(wname,"_ammo1tracermodel");
-		iteminfo_ammo1modelscale = cvar(wname,"_ammo1modelscale");
-		iteminfo_ammo1health = cvar(wname,"_ammo1health");
-		iteminfo_ammo1mass = cvar(wname,"_ammo1mass");
-		iteminfo_ammo1colormod = stov(cvar_string(wname,"_ammo1colormod"));
-		iteminfo_weapon_viewmodelanim_fire1 = stov(cvar_string(wname,"_fire1"));
-	}
 	else
 		error(ftos(itemtype)," Inventory_GetItemInfo: unknown itemtype\n");
 	
@@ -418,7 +381,7 @@
 		}
 		if (iteminfo_ammo2max + iteminfo_ammo2inventorymax)
 		{
-			character.ammo_nails = character.jetpackfuel;
+			character.ammo_nails = character.jetpack_fuel;
 			character.ammo_rockets = 0;
 		}
 	}
@@ -602,7 +565,7 @@
 	newmis = spawn();
 	newmis.owner = own;
 	newmis.classname = "item";
-	newmis.netname = iteminfo_name;
+	newmis.netname = strzone(iteminfo_name);
 	newmis.ispointable = TRUE;
 	newmis.solid = SOLID_BBOX;
 	newmis.movetype = MOVETYPE_TOSS;

Modified: trunk/basezym/progsqc/jumppads.qc
===================================================================
--- trunk/basezym/progsqc/jumppads.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/jumppads.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -136,7 +136,7 @@
 
 	// first calculate a typical start point for the jump
 	org = (self.absmin + self.absmax) * 0.5;
-	org_z = self.absmax_z - stov(cvar_string("g_player_boxmin"));
+	org_z = self.absmax_z - self.boxmin;
 
 	if (self.target)
 	{

Modified: trunk/basezym/progsqc/player.qc
===================================================================
--- trunk/basezym/progsqc/player.qc	2007-10-19 03:14:58 UTC (rev 75)
+++ trunk/basezym/progsqc/player.qc	2007-10-25 11:40:54 UTC (rev 76)
@@ -3,19 +3,10 @@
 .float jetpackacc;
 
 void(float impuls) player_impulse;
-void() player_npcthink;
+void() bot_npcthink;
 
-float AITYPE_NONE = 0;
-float AITYPE_PLAYER = 1;
-float AITYPE_SMARTFELLOW = 2;
-.float aitype;
 
-.string modeldir;
-.string modelext;
-.string sounddir;
-.entity playerclass;
-
-entity(float actortyp, float aityp, string mdldir, string mdlext, string snddir) playerclass_spawn =
+entity(float actortyp, float aityp, float animtype, string mdldir, string mdlext, string snddir) playerclass_spawn =
 {
 	local entity e;
 	e = spawn();
@@ -25,9 +16,12 @@
 	e.modeldir = mdldir;
 	e.modelext = mdlext;
 	e.sounddir = snddir;
-	precache_model(strcat(e.modeldir, "/lower", e.modelext));
-	precache_model(strcat(e.modeldir, "/upper", e.modelext));
-	precache_model(strcat(e.modeldir, "/head", e.modelext));
+	if (animtype == 1)
+	{
+	 	  precache_model(strcat(e.modeldir, "/lower", e.modelext));
+	 	  precache_model(strcat(e.modeldir, "/upper", e.modelext));
+	 	  precache_model(strcat(e.modeldir, "/head", e.modelext));
+	}
 	precache_sound(strcat(e.sounddir, "/hardlanding.wav"));
 	precache_sound(strcat(e.sounddir, "/landing.wav"));
 	precache_sound(strcat(e.sounddir, "/jump.wav"));
@@ -40,142 +34,100 @@
 {
 	local entity pc;
 	local vector legsframesoffset;
+	
+	string cname;
 
-
-	pc = playerclass_spawn(ACTORTYPE_THEPLAYER, AITYPE_PLAYER, "models/players/soldier", ".md3", "player");
-	pc.health = cvar("g_player_healthstart");
-	pc.max_health = cvar("g_player_healthmax");
-	pc.armorvalue = cvar("g_player_shieldstart");
-	pc.armortype = 1;
-	pc.armorregenrate = cvar("g_player_regenrate");
-	pc.armorregenmax = cvar("g_player_shieldmax");
-	pc.gibhealth = -100;
-	pc.paintake = 20;
-	pc.unlimitedinventory = FALSE;
-	pc.mass = 90;
-	setsize(pc, stov(cvar_string("g_player_boxmin")), stov(cvar_string("g_player_boxmax")));
-	pc.view_ofs = stov(cvar_string("g_player_viewofs"));
-	pc.weapon_ofs = stov(cvar_string("g_player_weaponofs"));
-	pc.jetpackfuel = 200;
-	pc.actoranim_BOTH_DEATH1   = '0 30 25';
-	pc.actoranim_BOTH_DEAD1    = '29 1 25';
-	pc.actoranim_BOTH_DEATH2   = '30 30 25';
-	pc.actoranim_BOTH_DEAD2    = '59 1 25';
-	pc.actoranim_BOTH_DEATH3   = '60 30 25';
-	pc.actoranim_BOTH_DEAD3    = '89 1 25';
-	pc.actoranim_TORSO_GESTURE = '90 45 20';
-	pc.actoranim_TORSO_ATTACK  = '135 6 15';
-	pc.actoranim_TORSO_ATTACK2 = '141 6 15';
-	pc.actoranim_TORSO_DROP    = '147 5 20';
-	pc.actoranim_TORSO_RAISE   = '151 5 20';
-	pc.actoranim_TORSO_STAND   = '156 1 15';
-	pc.actoranim_TORSO_STAND2  = '157 1 15';
-	legsframesoffset = '-1 0 0' * (pc.actoranim_TORSO_STAND2_x + pc.actoranim_TORSO_STAND2_y - pc.actoranim_TORSO_GESTURE_x);
-	pc.actoranim_LEGS_WALKCR   = '158 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_WALK     = '168 12 20' + legsframesoffset;
-	pc.actoranim_LEGS_RUN      = '180 9 18' + legsframesoffset;
-	pc.actoranim_LEGS_BACK     = '189 10 15' + legsframesoffset;
-	pc.actoranim_LEGS_SWIM     = '199 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_JUMP     = '209 6 15' + legsframesoffset;
-	pc.actoranim_LEGS_LAND     = '215 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_JUMPB    = '218 8 15' + legsframesoffset;
-	pc.actoranim_LEGS_LANDB    = '226 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLE     = '227 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
-	Inventory_Clear(pc);
-	Inventory_GetItemInfo(pc, ITEMTYPE_WEAP1);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP1, 1, iteminfo_ammo1max, iteminfo_ammo2max);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP1_AMMO, iteminfo_ammo1inventorymax * 2, 0, 0);
+	local float startingweapon;
+	local float classnum;
+	for (classnum = 1;classnum < ACTORTYPE_TOTAL;classnum++)
+	{
+	 	  cname = strcat("g_class",ftos(classnum));
 	
-
-	pc = playerclass_spawn(ACTORTYPE_LIGHTGUARD, AITYPE_SMARTFELLOW, "models/players/soldier", ".md3", "player");
-	pc.health = 75;
-	pc.max_health = 75;
-	pc.armorvalue = 0;
-	pc.armortype = 1;
-	pc.armorregenrate = 0;
-	pc.armorregenmax = 0;
-	pc.gibhealth = -50;
-	pc.paintake = 20;
-	pc.unlimitedinventory = TRUE;
-	pc.mass = 90;
-	setsize(pc, stov(cvar_string("g_player_boxmin")), stov(cvar_string("g_player_boxmax")));
-	pc.view_ofs = stov(cvar_string("g_player_viewofs"));
-	pc.weapon_ofs = stov(cvar_string("g_player_weaponofs"));
-	pc.actoranim_BOTH_DEATH1   = '0 30 25';
-	pc.actoranim_BOTH_DEAD1    = '29 1 25';
-	pc.actoranim_BOTH_DEATH2   = '30 30 25';
-	pc.actoranim_BOTH_DEAD2    = '59 1 25';
-	pc.actoranim_BOTH_DEATH3   = '60 30 25';
-	pc.actoranim_BOTH_DEAD3    = '89 1 25';
-	pc.actoranim_TORSO_GESTURE = '90 45 20';
-	pc.actoranim_TORSO_ATTACK  = '135 6 15';
-	pc.actoranim_TORSO_ATTACK2 = '141 6 15';
-	pc.actoranim_TORSO_DROP    = '147 5 20';
-	pc.actoranim_TORSO_RAISE   = '151 5 20';
-	pc.actoranim_TORSO_STAND   = '156 1 15';
-	pc.actoranim_TORSO_STAND2  = '157 1 15';
-	legsframesoffset = '-1 0 0' * (pc.actoranim_TORSO_STAND2_x + pc.actoranim_TORSO_STAND2_y - pc.actoranim_TORSO_GESTURE_x);
-	pc.actoranim_LEGS_WALKCR   = '158 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_WALK     = '168 12 20' + legsframesoffset;
-	pc.actoranim_LEGS_RUN      = '180 9 18' + legsframesoffset;
-	pc.actoranim_LEGS_BACK     = '189 10 15' + legsframesoffset;
-	pc.actoranim_LEGS_SWIM     = '199 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_JUMP     = '209 9 15' + legsframesoffset;
-	pc.actoranim_LEGS_LAND     = '215 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_JUMPB    = '218 8 15' + legsframesoffset;
-	pc.actoranim_LEGS_LANDB    = '226 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLE     = '227 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
-	Inventory_Clear(pc);
-	Inventory_GetItemInfo(pc, ITEMTYPE_AI_WEAP1);
-	Inventory_ModifyItem(pc, ITEMTYPE_AI_WEAP1, 1, iteminfo_ammo1max, iteminfo_ammo2max);
-
-	pc = playerclass_spawn(ACTORTYPE_HEAVYGUARD, AITYPE_SMARTFELLOW, "models/players/spy", ".md3", "player");
-	pc.health = 75;
-	pc.max_health = 75;
-	pc.armorvalue = 0;
-	pc.armortype = 1;
-	pc.armorregenrate = 0;
-	pc.armorregenmax = 0;
-	pc.gibhealth = -50;
-	pc.paintake = 20;
-	pc.unlimitedinventory = TRUE;
-	pc.mass = 90;
-	setsize(pc, stov(cvar_string("g_player_boxmin")), stov(cvar_string("g_player_boxmax")));
-	pc.view_ofs = stov(cvar_string("g_player_viewofs"));
-	pc.weapon_ofs = stov(cvar_string("g_player_weaponofs"));
-	pc.actoranim_BOTH_DEATH1   = '0 30 25';
-	pc.actoranim_BOTH_DEAD1    = '29 1 25';
-	pc.actoranim_BOTH_DEATH2   = '30 30 25';
-	pc.actoranim_BOTH_DEAD2    = '59 1 25';
-	pc.actoranim_BOTH_DEATH3   = '60 30 25';
-	pc.actoranim_BOTH_DEAD3    = '89 1 25';
-	pc.actoranim_TORSO_GESTURE = '90 45 20';
-	pc.actoranim_TORSO_ATTACK  = '135 6 15';
-	pc.actoranim_TORSO_ATTACK2 = '141 6 15';
-	pc.actoranim_TORSO_DROP    = '147 5 20';
-	pc.actoranim_TORSO_RAISE   = '151 5 20';
-	pc.actoranim_TORSO_STAND   = '156 1 15';
-	pc.actoranim_TORSO_STAND2  = '157 1 15';
-	legsframesoffset = '-1 0 0' * (pc.actoranim_TORSO_STAND2_x + pc.actoranim_TORSO_STAND2_y - pc.actoranim_TORSO_GESTURE_x);
-	pc.actoranim_LEGS_WALKCR   = '158 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_WALK     = '168 12 20' + legsframesoffset;
-	pc.actoranim_LEGS_RUN      = '180 9 18' + legsframesoffset;
-	pc.actoranim_LEGS_BACK     = '189 10 15' + legsframesoffset;
-	pc.actoranim_LEGS_SWIM     = '199 10 20' + legsframesoffset;
-	pc.actoranim_LEGS_JUMP     = '209 9 15' + legsframesoffset;
-	pc.actoranim_LEGS_LAND     = '215 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_JUMPB    = '218 8 15' + legsframesoffset;
-	pc.actoranim_LEGS_LANDB    = '226 1 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLE     = '227 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
-	pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
-	Inventory_Clear(pc);
-	Inventory_GetItemInfo(pc, ITEMTYPE_AI_WEAP2);
-	Inventory_ModifyItem(pc, ITEMTYPE_AI_WEAP2, 1, iteminfo_ammo1max, iteminfo_ammo2max);
+		  pc = playerclass_spawn(classnum, cvar(cname,"_aitype"), cvar(cname,"_animationtype"), strzone(cvar_string(cname,"_model")), ".md3", strzone(cvar_string(cname,"_name")));
+		  
+		  pc.health = cvar(cname,"_healthstart");
+		  pc.max_health = cvar(cname,"_healthmax");
+		  pc.armorvalue = cvar(cname,"_shieldstart");
+		  pc.armortype = 1;
+		  pc.armorregenrate = cvar(cname,"_regenrate");
+		  pc.armorregenmax = cvar(cname,"_shieldmax");
+		  pc.gibhealth = cvar(cname,"_gibhealth");
+		  pc.paintake = 20;
+		  pc.unlimitedinventory = FALSE;
+		  pc.mass = 90;
+		  
+		  pc.jetpack_fuelmax = cvar(cname,"_jetpack_fuelmax");
+		  pc.jetpack_acc = cvar(cname,"_jetpack_acc");
+		  pc.jetpack_accadd = cvar(cname,"_jetpack_accadd");
+		  pc.jetpack_accbase = cvar(cname,"_jetpack_accbase");
+		  pc.jetpack_maxupspeed = cvar(cname,"_jetpack_maxupspeed");
+		  pc.jetpack_maxmovespeed = cvar(cname,"_jetpack_maxmovespeed");
+		  pc.jetpack_fuelregenair = cvar(cname,"_jetpack_fuelregenair");
+		  pc.jetpack_fuelregenground = cvar(cname,"_jetpack_fuelregenground");
+		  pc.jetpack_use = cvar(cname,"_jetpack_use");
+		  
+		  pc.animationtype = cvar(cname,"_animationtype");
+		  
+		  pc.scaleratio = cvar(cname,"_scaleratio");
+		  
+		  pc.boxmin = stov(cvar_string(cname,"_boxmin"));
+		  pc.boxmax = stov(cvar_string(cname,"_boxmax"));
+		  
+		  pc.boxmin = pc.boxmin * pc.scaleratio;
+		  pc.boxmax = pc.boxmax * pc.scaleratio;
+		  
+		  setsize(pc, pc.boxmin, pc.boxmax);
+		  
+		  pc.view_ofs = stov(cvar_string(cname,"_viewofs"));
+		  pc.weapon_ofs = stov(cvar_string(cname,"_weaponofs"));
+		  
+		  pc.jumpspeed = cvar(cname,"_jumpspeed");
+		  pc.speedratio = cvar(cname,"_speedratio");
+		  
+		  if (cvar(cname,"_animationtype") == 1)
+		  {
+	   	   	 	pc.actoranim_BOTH_DEATH1   = '0 30 25';
+		  		pc.actoranim_BOTH_DEAD1    = '29 1 25';
+		  		pc.actoranim_BOTH_DEATH2   = '30 30 25';
+		  		pc.actoranim_BOTH_DEAD2    = '59 1 25';
+		  		pc.actoranim_BOTH_DEATH3   = '60 30 25';
+		  		pc.actoranim_BOTH_DEAD3    = '89 1 25';
+		  		pc.actoranim_TORSO_GESTURE = '90 45 20';
+		  		pc.actoranim_TORSO_ATTACK  = '135 6 15';
+		  		pc.actoranim_TORSO_ATTACK2 = '141 6 15';
+		 		pc.actoranim_TORSO_DROP    = '147 5 20';
+		  		pc.actoranim_TORSO_RAISE   = '151 5 20';
+		  		pc.actoranim_TORSO_STAND   = '156 1 15';
+		  		pc.actoranim_TORSO_STAND2  = '157 1 15';
+		  		legsframesoffset = '-1 0 0' * (pc.actoranim_TORSO_STAND2_x + pc.actoranim_TORSO_STAND2_y - pc.actoranim_TORSO_GESTURE_x);
+		  		pc.actoranim_LEGS_WALKCR   = '158 10 20' + legsframesoffset;
+		  		pc.actoranim_LEGS_WALK     = '168 12 20' + legsframesoffset;
+		  		pc.actoranim_LEGS_RUN      = '180 9 18' + legsframesoffset;
+		  		pc.actoranim_LEGS_BACK     = '189 10 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_SWIM     = '199 10 20' + legsframesoffset;
+		  		pc.actoranim_LEGS_JUMP     = '209 6 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_LAND     = '215 1 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_JUMPB    = '218 8 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_LANDB    = '226 1 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_IDLE     = '227 5 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
+		  		pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
+		 }
+		 Inventory_Clear(pc);
+		 if (cvar(cname,"_startinguserweapon") != 0) // User weapons
+		 {
+		  		startingweapon = cvar(cname,"_startinguserweapon") - 1;
+		  		Inventory_GetItemInfo(pc, startingweapon);
+		  		Inventory_ModifyItem(pc, startingweapon, 1, iteminfo_ammo1max, iteminfo_ammo2max);
+		  		Inventory_ModifyItem(pc, ITEMTYPE_WEAP1_AMMO + cvar(cname,"_startingweapon"), iteminfo_ammo1inventorymax * 2, 0, 0);
+		 }
+		 else if (cvar(cname,"_startingaiweapon") != 0) // AI weapons
+		 {
+		  		startingweapon = cvar(cname,"_startingaiweapon") + ITEMTYPE_AI_WEAP1 - 1;
+		  		Inventory_GetItemInfo(pc, startingweapon);
+		  		Inventory_ModifyItem(pc, startingweapon, 1, iteminfo_ammo1max, iteminfo_ammo2max);
+		 }
+	}
 };
 
 entity(float type) playerclass_find =
@@ -227,19 +179,49 @@
 	self.gibhealth = pc.gibhealth;
 	self.paintake = pc.paintake;
 	self.unlimitedinventory = pc.unlimitedinventory;
-	self.jetpackfuel = pc.jetpackfuel;
 	self.mass = pc.mass;
-	actor_setup();
+	
+	self.jetpack_fuel = pc.jetpack_fuelmax;
+	self.jetpack_fuelmax = pc.jetpack_fuelmax;
+	self.jetpack_acc = pc.jetpack_acc;
+	self.jetpack_accadd = pc.jetpack_accadd;
+	self.jetpack_accbase = pc.jetpack_accbase;
+	self.jetpack_maxupspeed = pc.jetpack_maxupspeed;
+	self.jetpack_maxmovespeed = pc.jetpack_maxmovespeed;
+	self.jetpack_fuelregenair = pc.jetpack_fuelregenair;
+	self.jetpack_fuelregenground = pc.jetpack_fuelregenground;
+	self.jetpack_use = pc.jetpack_use;
+	
+	self.animationtype = pc.animationtype;
+	
+	self.scaleratio = pc.scaleratio;
+	
+	self.jumpspeed = pc.jumpspeed;
+	self.speedratio = pc.speedratio;
+	
 	setsize (self, pc.mins, pc.maxs);
-
 	Inventory_CloneFromInventory(self, pc);
-
-	player_selectlegsanim(TRUE);
-	anim_start(self.actorpart_torso, self.playerclass.actoranim_TORSO_STAND, ANIMTYPE_IDLE, torso_animframefunc);
-	// this will be overridden by weapon_setup
-	//anim_start(self.actorpart_torso, self.playerclass.actoranim_TORSO_STAND, ANIMTYPE_STAND, player_repeatstandframe);
-	//anim_start(self.actorpart_weapon, '0 0 30', ANIMTYPE_STAND, anim_nullfunc);
-
+	
+	if (self.animationtype == 1)
+	{
+		actor_setup();
+		player_selectlegsanim(TRUE);
+		anim_start(self.actorpart_torso, self.playerclass.actoranim_TORSO_STAND, ANIMTYPE_IDLE, torso_animframefunc);
+	}
+	else
+	{
+		local vector v;
+		self.movetype = MOVETYPE_WALK;
+		self.solid = SOLID_SLIDEBOX;
+		self.takedamage = DAMAGE_AIM;
+		self.ammo_shells = 0;
+		self.ammo_nails = 0;
+		self.ammo_rockets = 0;
+		self.ammo_cells = 0;
+		self.deadflag = DEAD_NO;
+		setmodel(self, strcat(self.playerclass.modeldir, "/model", self.playerclass.modelext));
+	}
+	
 	weapon_setup(self, Inventory_GetBestWeapon(self));
 };
 
@@ -323,6 +305,7 @@
 void() PutClientInServer =
 {
 	local entity spot;
+	local float classnum;
 
 	self.flags = FL_CLIENT;
 
@@ -333,7 +316,9 @@
 	self.fixangle = TRUE;
 	self.v_angle = self.angles_x * '-1 0 0' + self.angles_y * '0 1 0';
 	self.nextthink = 0;
-	player_spawn(ACTORTYPE_THEPLAYER);
+	self.team = 1;
+	classnum = cvar("g_startclass");
+	player_spawn(classnum);
 };
 
 /*
@@ -424,17 +409,16 @@
 =============
 */
 .float deadtime;
-.float jetpackactive;
 void() PlayerPreThink =
 {
 	local float im;
-	if (self.flags & FL_CLIENT) // only real players can respawn, not NPCs
 	
-	if (self.jetpackfuel < cvar("g_player_jetpack_fuelmax") && (!(self.jetpackactive)))
+	if ((self.jetpack_fuel < self.jetpack_fuelmax) && (!(self.jetpackactive)))
 	{
-	   self.jetpackfuel = self.jetpackfuel + cvar("g_player_jetpack_fuelregenair");
+	   self.jetpack_fuel = self.jetpack_fuel + self.jetpack_fuelregenair;
 	}
 	
+	if (self.flags & FL_CLIENT) // only real players can respawn, not NPCs
 	if (self.deadflag)
 	{
 		if (self.deadflag == DEAD_DYING)
@@ -452,9 +436,9 @@
 	if (!self.deadflag)
 	if (self.flags & FL_ONGROUND)
 	{
-	   	if (self.jetpackfuel < cvar("g_player_jetpack_fuelmax") && (!(self.jetpackactive)))
+	   	if ((self.jetpack_fuel < self.jetpack_fuelmax) && (!(self.jetpackactive)))
 		{
-	   	   self.jetpackfuel = self.jetpackfuel + cvar("g_player_jetpack_fuelregenground");
+	   	   self.jetpack_fuel = self.jetpack_fuel + self.jetpack_fuelregenground;
 	    }
 	
 		if (self.jumpflag || self.oldvelocity_z < -200)
@@ -475,7 +459,7 @@
 		{
 			sound(self, CHAN_BODY, strcat(self.playerclass.sounddir, "/jump.wav"), 1, ATTN_NORM);
 			anim_start(self, self.playerclass.actoranim_LEGS_JUMP, ANIMTYPE_JUMP, anim_nullfunc);
-			self.velocity_z = self.velocity_z + cvar("g_player_jumpspeed");
+			self.velocity_z = self.velocity_z + self.jumpspeed;
 			self.flags = self.flags - self.flags & (FL_ONGROUND | FL_JUMPRELEASED);
 			self.jumpflag = TRUE;
 		}
@@ -484,7 +468,7 @@
 	{
 		if (self.button5)
 		{
-			self.jetpackfuel = max(0, self.jetpackfuel - cvar("g_player_jetpack_use") * frametime);
+			self.jetpack_fuel = max(0, self.jetpack_fuel - self.jetpack_use * frametime);
 			//self.armorregentime = max(self.armorregentime, time + ACTOR_SHIELD_REGENDELAY);
 			//self.armorregenplaysound = TRUE;
 			if (!self.jetpackactive)
@@ -497,7 +481,7 @@
 		{
 			if (self.jetpackactive)
 			{
-			    self.jetpackacc = cvar("g_player_jetpack_accbase");
+			    self.jetpackacc = self.jetpack_accbase;
 				sound(self, CHAN_BODY, strcat(self.playerclass.sounddir, "/jetpackstop.wav"), 1, ATTN_NORM);
 				self.jetpackactive = FALSE;
 			}
@@ -530,7 +514,12 @@
 {
 	local entity oldself;
 	player_regen();
-	actor_update();
+	
+	if (self.animationtype == 1)
+	    actor_update();
+	else
+		anim_update(self);
+	   
 	if (self.pointitem)
 	if (self.pointitem.classname != "")
 		self.pointitem.colormod = '1 1 1';
@@ -589,6 +578,8 @@
 	local vector wishvel, wishdir, v;
 	local float wishspeed, f;
 	float vel_z;
+	
+	self.movement = self.movement * self.speedratio;
 
 	if (self.movetype == MOVETYPE_NONE)
 		return;
@@ -781,17 +772,17 @@
 		wishdir = normalize(wishvel);
 		wishspeed = wishspeed + vlen(wishvel);
 		
-		if (self.button5 && self.jetpackfuel > 5)
+		if (self.button5 && self.jetpack_fuel > 5)
 		{
 		    self.movetype = MOVETYPE_FLY;
 			
-			if (self.velocity_z < cvar("g_player_jetpack_maxupspeed"))
+			if (self.velocity_z < self.jetpack_maxupspeed)
 			{
-		   	   self.jetpackacc = self.jetpackacc + cvar("g_player_jetpack_acc");
+		   	   self.jetpack_acc = self.jetpack_acc + self.jetpack_acc;
 			   self.velocity_z = self.velocity_z + self.jetpackacc;
 			}
-			if (wishspeed > cvar("g_player_jetpack_maxmovespeed"))
-			   wishspeed = cvar("g_player_jetpack_maxmovespeed");
+			if (wishspeed > self.jetpack_maxmovespeed)
+			   wishspeed = self.jetpack_maxmovespeed;
 		}
 		else 
 		{
@@ -832,12 +823,11 @@
 
 void() player_die =
 {
+	self.deadtime = time;
 	local float c;
-	self.deadflag = DEAD_DYING;
-	self.deadtime = time;
 	c = random() * 3;
 	if (c < 1)
-	{
+	{ 
 		anim_start(self, self.playerclass.actoranim_BOTH_DEATH1, ANIMTYPE_DYING, player_dyingfunc);
 		anim_start(self.actorpart_torso, self.playerclass.actoranim_BOTH_DEATH1, ANIMTYPE_DYING, anim_nullfunc);
 	}
@@ -858,45 +848,44 @@
 	self.deadflag = DEAD_DEAD;
 	
 	float multiplier = 1;
-	te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 50, 3000);
+	te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 50, 3000);	
 	
 	// make a meaty mess
-	self.actorpart_torso = world;
-	self.actorpart_head = world;
-	self.actorpart_weapon = world;
-	self.actorpart_viewweapon = world;
-	TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0);
 	TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0);
 
-	local float c;
-	c = 0;
-	while (c < multiplier)
-	{
-		c = c + 1;
-		TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0);
-		//TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib1.mdl", self.origin, self.velocity,0);
-		//TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity,0);
-		//TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity,0);
+	TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0);
+	TossGib (world, "models/gibs/gib1.mdl", self.origin, self.velocity,0);
+	TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity,0);
+	TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity,0);
 
-		// these destory on impact
-		TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1);
-		//TossGib (world, "models/gibs/gib6.md3", self.origin, '0 500 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1);
-	}
+	// these destory on impact
+	TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1);
+	TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1);
+	TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1);
+	TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1);
+	TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1);
 
 	sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
+	
+	if (self.flags & FL_CLIENT)
+	   TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0);
+	else
+	{
+		remove(self.actorpart_torso);
+		remove(self.actorpart_head);
+		remove(self.actorpart_weapon);
+		remove(self.actorpart_viewweapon);
+		remove(self);
+	}
 };
 
 void(entity attacker, float damage) player_pain =
 {
-	if (attacker.aitype == AITYPE_PLAYER)
+	if (attacker.team != self.team)
 		self.enemy = attacker;
+	if (self.flags & FL_CLIENT)
+		self.enemy = attacker;
+	
 	if (damage >= self.paintake)
 	{
 		sound(self, CHAN_VOICE, strcat(self.playerclass.sounddir, "/voice/pain.wav"), 1, ATTN_NORM);
@@ -906,7 +895,7 @@
 
 void() player_regen =
 {
-	if (self.armorvalue < cvar("g_player_regenmax"))
+	if (self.armorvalue < self.armorregenmax)
 	if (time > self.armorregentime)
 	if (!self.deadflag)
 	{
@@ -1014,39 +1003,66 @@
 		return;
 	if (cvar("sv_cheats"))
 	{
-		if (impuls == 31)
+		if (impuls == 16)
 		{
+			eprint(self.cursor_trace_ent);
+			return;
+		}
+		if (impuls == 15)
+		{
+			printsurfaceinfo(self.cursor_trace_ent, self.cursor_trace_endpos);
+			return;
+		}
+		if ((impuls >= 30) && (impuls <= 33))
+		{
 			makevectors(self.v_angle);
 			newmis = spawn();
 			setorigin(newmis, self.origin + v_forward * 60);
 			newmis.angles = '0 1 0' * self.v_angle_y;
-			newmis.think = player_npcthink;
+			newmis.think = bot_npcthink;
 			newmis.nextthink = time;
-			newmis.realowner = self;
 			oldself = self;
 			self = newmis;
-			player_spawn(ACTORTYPE_THEPLAYER);
-			self.aitype = AITYPE_SMARTFELLOW;
-			c = 0;
-			while (c < ITEMTYPE_TOTAL)
+			
+			if (impuls == 30)
 			{
-				Inventory_GetItemInfo(self, c);
-				Inventory_ModifyItem(self, c, iteminfo_quantitymax, iteminfo_ammo1max, iteminfo_ammo2max);
-				c = c + 1;
+				self.netname = "Mine Soldier";
+				self.team = 1;
+				player_spawn(ACTORTYPE_CLASS1);
 			}
-			self.switchweaponitem = Inventory_GetBestWeapon(self);
+			if (impuls == 31) // Players team
+			{
+				self.netname = "Light Guard";
+				self.team = 1;
+				player_spawn(ACTORTYPE_CLASS2);
+			}
+			if (impuls == 32)
+			{
+				self.netname = "Heavy Guard";
+				self.team = 1;
+				player_spawn(ACTORTYPE_CLASS3);
+			}
+			if (impuls == 33) // AI team
+			{
+				self.netname = "Mine Soldier";
+				self.team = 2;
+				player_spawn(ACTORTYPE_CLASS1);
+			}
+			if (impuls == 34)
+			{
+				self.netname = "Light Guard";
+				self.team = 2;
+				player_spawn(ACTORTYPE_CLASS2);
+			}
+			if (impuls == 35)
+			{
+				self.netname = "Heavy Guard";
+				self.team = 2;
+				player_spawn(ACTORTYPE_CLASS3);
+			}
+			
 			self = oldself;
 		}
-		if (impuls == 16)
-		{
-			eprint(self.cursor_trace_ent);
-			return;
-		}
-		if (impuls == 15)
-		{
-			printsurfaceinfo(self.cursor_trace_ent, self.cursor_trace_endpos);
-			return;
-		}
 		if (impuls == 9)
 		{
 			c = 0;




More information about the zymotic-commits mailing list