r75 - trunk/basezym/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Oct 18 23:14:58 EDT 2007


Author: Vermeulen
Date: 2007-10-18 23:14:58 -0400 (Thu, 18 Oct 2007)
New Revision: 75

Added:
   trunk/basezym/progsqc/bots.qc
   trunk/basezym/progsqc/violence.qc
Modified:
   trunk/basezym/progsqc/actor.qc
   trunk/basezym/progsqc/damage.qc
   trunk/basezym/progsqc/inventory.qc
   trunk/basezym/progsqc/player.qc
   trunk/basezym/progsqc/progs.src
   trunk/basezym/progsqc/server.qc
Log:
Added gibbing for the bots/players
More weapon changes and options
Moved bot code to bots.qc
Changed the view weapons position
Changed heavy unit model to the spy


Modified: trunk/basezym/progsqc/actor.qc
===================================================================
--- trunk/basezym/progsqc/actor.qc	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/actor.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -6,6 +6,7 @@
 .entity actorpart_head;
 .entity actorpart_weapon;
 .entity actorpart_viewweapon;
+.entity actorpart_hand;
 
 float ACTORTYPE_INVALID = 0;
 float ACTORTYPE_THEPLAYER = 1;
@@ -65,6 +66,12 @@
 		remove(self);
 };
 
+void() actor_part_hand_think =
+{
+	if (self.owner.actorpart_hand != self)
+		remove(self);
+};
+
 .string modeldir;
 .string modelext;
 .entity playerclass;
@@ -102,16 +109,25 @@
 		self.actorpart_viewweapon.classname = "actorpart_viewweapon";
 		self.actorpart_viewweapon.think = actor_part_viewweapon_think;
 		self.actorpart_viewweapon.nextthink = time;
+		self.actorpart_hand = spawn();
+		self.actorpart_hand.owner = self;
+		self.actorpart_hand.classname = "actorpart_hand";
+		self.actorpart_hand.think = actor_part_hand_think;
+		self.actorpart_hand.nextthink = time;
 	}
 
 	setmodel(self, strcat(self.playerclass.modeldir, "/lower", self.playerclass.modelext));
 	setmodel(self.actorpart_torso, strcat(self.playerclass.modeldir, "/upper", self.playerclass.modelext));
 	setmodel(self.actorpart_head, strcat(self.playerclass.modeldir, "/head", self.playerclass.modelext));
+	//setmodel(self.actorpart_hand,"models/weapons/hand.md3");
 	self.actorpart_weapon.model = ""; // will be changed by weapon code as needed
 	self.actorpart_viewweapon.model = ""; // will be changed by weapon code as needed
+	
 	// 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 + '4 0 0';
+	v = self.weapon_ofs - self.view_ofs + '10 4 -10'; // front side up
 	v_y = v_y * -1;
+	//setorigin(self.actorpart_hand, v);
+	//setattachment(self.actorpart_hand, self.actorpart_viewweapon, "tag_weapon");
 	setorigin(self.actorpart_viewweapon, v);
 
 	// it's ok if this bone is missing as long as the torso model is made
@@ -126,10 +142,12 @@
 		setattachment(self.actorpart_weapon, self.actorpart_torso, "bip01 r hand");
 	// model seen in first person while holding weapon
 	self.actorpart_viewweapon.viewmodelforclient = self;
+	self.actorpart_hand.viewmodelforclient = self;
 };
 
 void() actor_gib =
 {
+ 	// not used
 	local float c;
 	c = 0;
 	while (c < 5)
@@ -378,6 +396,7 @@
 	local float modelscale;
 	local float projhealth;
 	local float projmass;
+	local vector projcolormod;
 	muzzle1tagorigin = muzzle2tagorigin = muzzle3tagorigin = self.origin + self.weapon_ofs_x * v_forward + self.weapon_ofs_y * v_right + self.weapon_ofs_z * '0 0 1';
 	makevectors(self.v_angle);
 	if (secondary)
@@ -400,6 +419,7 @@
 		modelscale = iteminfo_ammo2modelscale;
 		projhealth = iteminfo_ammo2health;
 		projmass = iteminfo_ammo2mass;
+		projcolormod = iteminfo_ammo2colormod;
 	}
 	else
 	{
@@ -420,13 +440,14 @@
 		tracermodel = iteminfo_ammo1tracermodel;
 		projhealth = iteminfo_ammo1health;
 		projmass = iteminfo_ammo1mass;
+		projcolormod = iteminfo_ammo1colormod;
 	}
 
 	Inventory_ModifyItem(self, self.weaponitem, 0, 0 - mintofire, 0);
 	weapon_recoil(recoil);
 	while (numberof != 0)
 	{
-		  weapon_fireprojectile(shotmodel, shotorg, shotdir, shotdamage, shotdamagetype, shotlifetime, shotprojectileflags, shotfiresound, shotexplodesound, shotbouncesound, tracer, tracermodel, modelscale, projhealth, projmass);	
+		  weapon_fireprojectile(shotmodel, shotorg, shotdir, shotdamage, shotdamagetype, shotlifetime, shotprojectileflags, shotfiresound, shotexplodesound, shotbouncesound, tracer, tracermodel, modelscale, projhealth, projmass, projcolormod);	
 		  numberof = numberof - 1;
 	}
 };

Added: trunk/basezym/progsqc/bots.qc
===================================================================
--- trunk/basezym/progsqc/bots.qc	                        (rev 0)
+++ trunk/basezym/progsqc/bots.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -0,0 +1,223 @@
+
+float(entity targ) SInfront =
+{
+	local float dot;
+	local vector vec;
+
+	makevectors (self.angles);
+	vec = normalize (targ.origin - self.origin);
+	dot = vec * v_forward;
+
+	if (dot > 0.3)
+		return TRUE;
+	return FALSE;
+};
+
+void() SAim =
+{
+	local float dist;
+	local vector vec, desiredang, testang, diffang;
+
+	// get the desired angles to aim at
+	vec = (self.enemy.absmin + self.enemy.absmax) * 0.5;
+	desiredang = vectoangles(vec - (self.origin + self.view_ofs));
+	desiredang_x = 0-desiredang_x;
+
+	if (desiredang_y <= -180)
+		desiredang_y = desiredang_y + 360;
+	else if (desiredang_y >= 180)
+		desiredang_y = desiredang_y - 360;
+	if (desiredang_x <= -180)
+		desiredang_x = desiredang_x + 360;
+	else if (desiredang_x >= 180)
+		desiredang_x = desiredang_x - 360;
+
+	// calculate turn angles
+	testang = desiredang - self.v_angle;
+	testang_z = 0;
+
+	// turn
+	dist = vlen(testang * (5 * frametime));
+	if (vlen(normalize(testang) * 4) > dist)
+	{
+		diffang = normalize(testang) * 4;
+		dist = vlen(normalize(testang) * 4);
+	}
+	else
+		diffang = testang * (5 * frametime);
+	if (dist > vlen(testang))
+		diffang = testang;
+
+	self.v_angle = self.v_angle + diffang;
+	// self.angles_y = self.v_angle_y;
+};
+
+void() MoveToGoal =
+{
+	local vector vec, en, diff, dir;
+
+	vec = self.origin;
+	movetogoal(20);
+	en = self.origin;
+	self.origin = vec;
+
+	diff = en - self.origin;
+	if (diff == '0 0 0')
+		diff = self.enemy.origin - self.origin;
+
+	dir = normalize(diff);
+	dir = dir * cvar("sv_maxspeed");
+
+	makevectors(self.v_angle);
+	self.movement_x = dir * v_forward;
+	self.movement_y = dir * v_right;
+	self.movement_z = dir * v_up;
+};
+
+.float ai_strafetime;
+.vector ai_strafemove;
+void() ai_strafe =
+{
+	if (time >= self.ai_strafetime)
+	{
+		self.ai_strafetime = time + 0.4 + random() * 0.6;
+		self.ai_strafemove_x = (random() - 0.5) * cvar("sv_maxspeed");
+		self.ai_strafemove_y = (random() - 0.5) * cvar("sv_maxspeed");
+		self.ai_strafemove_z = 0;
+	}
+	self.movement = self.ai_strafemove;
+};
+
+void() ai_findenemy =
+{
+	local vector v1, v2;
+	local entity e;
+	if (self.enemy)
+		return;
+	v1 = self.origin + self.view_ofs;
+	e = findradius(v1, 1500);
+	while (e)
+	{
+		if (e.aitype == AITYPE_PLAYER)
+		if (e.takedamage)
+		if (!e.deadflag)
+		if (!(e.flags & FL_NOTARGET))
+		{
+			v2 = (e.absmin + e.absmax) * 0.5;
+			traceline(v1, v2, TRUE, self);
+			if (trace_fraction == 1 || trace_ent == e)
+				self.enemy = e;
+		}
+		e = e.chain;
+	}
+};
+
+void() bot_ai =
+{
+	local vector v1, v2;
+
+	if (self.aitype == AITYPE_SMARTFELLOW)
+	{
+		self.movement = '0 0 0';
+		self.button0 = self.button2 = self.button3 = self.button4 = 0;
+		if (!self.enemy)
+			ai_findenemy();
+		else
+		{
+			if (self.enemy.deadflag || !self.enemy.takedamage)
+			{
+				self.enemy = world;
+				return;
+			}
+			ai_strafe();
+			Inventory_GetItemInfo(self, self.weaponitem);
+			if (!iteminfo_weapon_canfire1)
+			if (!iteminfo_weapon_canfire2)
+			{
+				if (iteminfo_weapon_canreload)
+					self.button4 = 1;
+				else
+					self.switchweaponitem = Inventory_GetBestWeapon(self);
+			}
+			SAim();
+			v1 = self.origin + '0 0 16';
+			v2 = (self.enemy.absmin + self.enemy.absmax) * 0.5;
+			traceline(v1, v2, FALSE, self);
+			if ((trace_fraction == 1 || trace_ent == self.enemy) && SInfront(self.enemy))
+			{
+				if (iteminfo_weapon_canfire1)
+				{
+					if (iteminfo_weapon_canfire2)
+					{
+						if (random() < 0.05)
+							self.button3 = 1;
+						else
+							self.button0 = 1;
+					}
+					else
+						self.button0 = 1;
+				}
+				else if (iteminfo_weapon_canfire2)
+					self.button3 = 1;
+			}
+			else
+				MoveToGoal(); // a tad different
+		}
+	}
+};
+
+void() bot_npcthink =
+{
+	self.nextthink = time;
+	bot_ai();
+	SV_PlayerPhysics();
+	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)
+	{
+		setorigin(self, self.origin + '0 0 1');
+		self.think = bot_npcthink;
+		self.nextthink = time;
+		self.netname = "Light Guard";
+		player_spawn(ACTORTYPE_LIGHTGUARD);
+	}
+};
+
+void() monster_heavy_guard
+{
+ 	if (cvar("g_gametype") == 1)
+	{
+		setorigin(self, self.origin + '0 0 1');
+		self.think = bot_npcthink;
+		self.nextthink = time;
+		self.netname = "Heavy Guard";
+		player_spawn(ACTORTYPE_HEAVYGUARD);
+	}
+};
+
+void() bot_serverframe =
+{
+ 	   // keep spawning new bots
+}
\ No newline at end of file

Modified: trunk/basezym/progsqc/damage.qc
===================================================================
--- trunk/basezym/progsqc/damage.qc	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/damage.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -522,7 +522,7 @@
 	}
 }
 
-void(string modelname, vector shotorg, vector shotvel, vector damage, float damagtype, float lifetime, float projectileflags, string firesound, string explodesound, string bouncesound, float tracer, string tracermodel, float modelscale, float projhealth, float projmass) weapon_fireprojectile =
+void(string modelname, vector shotorg, vector shotvel, vector damage, float damagtype, float lifetime, float projectileflags, string firesound, string explodesound, string bouncesound, float tracer, string tracermodel, float modelscale, float projhealth, float projmass, vector projcolormod) weapon_fireprojectile =
 {
 	local float r; // templeofnoise
 
@@ -550,6 +550,7 @@
  	setmodel(newmis, modelname);
  	setsize(newmis, '0 0 0', '0 0 0');
 	newmis.scale = modelscale;
+	newmis.colormod = projcolormod;
 	newmis.health = projhealth;
 	newmis.mass = projmass;
 	if (newmis.health > 0)

Modified: trunk/basezym/progsqc/inventory.qc
===================================================================
--- trunk/basezym/progsqc/inventory.qc	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/inventory.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -20,8 +20,12 @@
 float ITEMTYPE_WEAP6_AMMO = 12;
 float ITEMTYPE_WEAP7_AMMO = 13;
 
-float ITEMTYPE_TOTAL = 14;
+float ITEMTYPE_AI_WEAP1 = 14;
+float ITEMTYPE_AI_WEAP2 = 15;
+float ITEMTYPE_AI_WEAP3 = 16;
 
+float ITEMTYPE_TOTAL = 17;
+
 float WS_IDLE = 0;
 float WS_FIRE1 = 1;
 float WS_FIRE2 = 2;
@@ -91,6 +95,8 @@
 float iteminfo_ammo2health;
 float iteminfo_ammo1mass;
 float iteminfo_ammo2mass;
+vector iteminfo_ammo1colormod;
+vector iteminfo_ammo2colormod;
 
 // special information specific to weapon items
 string iteminfo_weapon_viewmodel;
@@ -168,7 +174,8 @@
 	iteminfo_ammo1tracermodel = "";
 	iteminfo_ammo1modelscale = 1;
 	iteminfo_ammo1health = 0;
-	iteminfo_ammo2mass = 0;
+	iteminfo_ammo1mass = 0;
+	iteminfo_ammo1colormod = '0 0 0';
 	iteminfo_ammo2max = 0;
 	iteminfo_ammo2inventorymax = 0;
 	iteminfo_ammo2minimumtofire = 0;
@@ -189,6 +196,7 @@
 	iteminfo_ammo2modelscale = 1;
 	iteminfo_ammo2health = 0;
 	iteminfo_ammo2mass = 0;
+	iteminfo_ammo2colormod = '0 0 0';
 	iteminfo_weapon_viewmodel = "";
 	iteminfo_weapon_viewmodelanim_idle = '0 0 1';
 	iteminfo_weapon_viewmodelanim_fire1 = '0 0 2';
@@ -244,6 +252,7 @@
 		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"));
 		
 		iteminfo_ammo2damage = stov(cvar_string(wname,"_ammo2damage"));
@@ -262,9 +271,10 @@
 		iteminfo_ammo2modelscale = cvar(wname,"_ammo2modelscale");
 		iteminfo_ammo2health = cvar(wname,"_ammo2health");
 		iteminfo_ammo2mass = cvar(wname,"_ammo2mass");
+		iteminfo_ammo2colormod = stov(cvar_string(wname,"_ammo2colormod"));
 		iteminfo_weapon_viewmodelanim_fire2 = stov(cvar_string(wname,"_fire2"));
 	}
-	else if (itemtype < ITEMTYPE_TOTAL)
+	else if (itemtype < ITEMTYPE_AI_WEAP1)
 	{
 		wname = strcat("g_weap",ftos(itemtype - ITEMTYPE_WEAP1_AMMO + 1));
 		iteminfo_name = cvar_string(wname,"_ammo_name");
@@ -273,6 +283,47 @@
 		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");
 	

Modified: trunk/basezym/progsqc/player.qc
===================================================================
--- trunk/basezym/progsqc/player.qc	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/player.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -3,11 +3,11 @@
 .float jetpackacc;
 
 void(float impuls) player_impulse;
+void() player_npcthink;
 
 float AITYPE_NONE = 0;
 float AITYPE_PLAYER = 1;
-float AITYPE_MIMIC = 2;
-float AITYPE_SMARTFELLOW = 3;
+float AITYPE_SMARTFELLOW = 2;
 .float aitype;
 
 .string modeldir;
@@ -96,7 +96,7 @@
 	pc.armortype = 1;
 	pc.armorregenrate = 0;
 	pc.armorregenmax = 0;
-	pc.gibhealth = -10;
+	pc.gibhealth = -50;
 	pc.paintake = 20;
 	pc.unlimitedinventory = TRUE;
 	pc.mass = 90;
@@ -130,18 +130,17 @@
 	pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
 	pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
 	Inventory_Clear(pc);
-	Inventory_GetItemInfo(pc, ITEMTYPE_WEAP5);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP5, 1, iteminfo_ammo1max, iteminfo_ammo2max);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP5_AMMO, iteminfo_ammo1inventorymax * 2, 0, 0);
+	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/soldier", ".md3", "player");
-	pc.health = cvar("g_player_healthstart");
-	pc.max_health = cvar("g_player_healthmax");
-	pc.armorvalue = cvar("g_player_shieldstart");
+	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 = cvar("g_player_regenrate");
-	pc.armorregenmax = cvar("g_player_shieldmax");
-	pc.gibhealth = -100;
+	pc.armorregenrate = 0;
+	pc.armorregenmax = 0;
+	pc.gibhealth = -50;
 	pc.paintake = 20;
 	pc.unlimitedinventory = TRUE;
 	pc.mass = 90;
@@ -175,9 +174,8 @@
 	pc.actoranim_LEGS_IDLECR   = '236 5 15' + legsframesoffset;
 	pc.actoranim_LEGS_TURN     = '245 7 15' + legsframesoffset;
 	Inventory_Clear(pc);
-	Inventory_GetItemInfo(pc, ITEMTYPE_WEAP2);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP2, 1, iteminfo_ammo1max, iteminfo_ammo2max);
-	Inventory_ModifyItem(pc, ITEMTYPE_WEAP2_AMMO, iteminfo_ammo1inventorymax * 2, 0, 0);
+	Inventory_GetItemInfo(pc, ITEMTYPE_AI_WEAP2);
+	Inventory_ModifyItem(pc, ITEMTYPE_AI_WEAP2, 1, iteminfo_ammo1max, iteminfo_ammo2max);
 };
 
 entity(float type) playerclass_find =
@@ -823,209 +821,6 @@
 	}
 };
 
-float(entity targ) SInfront =
-{
-	local float dot;
-	local vector vec;
-
-	makevectors (self.angles);
-	vec = normalize (targ.origin - self.origin);
-	dot = vec * v_forward;
-
-	if (dot > 0.3)
-		return TRUE;
-	return FALSE;
-};
-
-void() SAim =
-{
-	local float dist;
-	local vector vec, desiredang, testang, diffang;
-
-	// get the desired angles to aim at
-	vec = (self.enemy.absmin + self.enemy.absmax) * 0.5;
-	desiredang = vectoangles(vec - (self.origin + self.view_ofs));
-	desiredang_x = 0-desiredang_x;
-
-	if (desiredang_y <= -180)
-		desiredang_y = desiredang_y + 360;
-	else if (desiredang_y >= 180)
-		desiredang_y = desiredang_y - 360;
-	if (desiredang_x <= -180)
-		desiredang_x = desiredang_x + 360;
-	else if (desiredang_x >= 180)
-		desiredang_x = desiredang_x - 360;
-
-	// calculate turn angles
-	testang = desiredang - self.v_angle;
-	testang_z = 0;
-
-	// turn
-	dist = vlen(testang * (5 * frametime));
-	if (vlen(normalize(testang) * 4) > dist)
-	{
-		diffang = normalize(testang) * 4;
-		dist = vlen(normalize(testang) * 4);
-	}
-	else
-		diffang = testang * (5 * frametime);
-	if (dist > vlen(testang))
-		diffang = testang;
-
-	self.v_angle = self.v_angle + diffang;
-	// self.angles_y = self.v_angle_y;
-};
-
-void() MauveToGoal =
-{
-	local vector vec, en, diff, dir;
-
-	vec = self.origin;
-	movetogoal(20);
-	en = self.origin;
-	self.origin = vec;
-
-	diff = en - self.origin;
-	if (diff == '0 0 0')
-		diff = self.enemy.origin - self.origin;
-
-	dir = normalize(diff);
-	dir = dir * cvar("sv_maxspeed");
-
-	makevectors(self.v_angle);
-	self.movement_x = dir * v_forward;
-	self.movement_y = dir * v_right;
-	self.movement_z = dir * v_up;
-};
-
-.float ai_strafetime;
-.vector ai_strafemove;
-void() ai_strafe =
-{
-	if (time >= self.ai_strafetime)
-	{
-		self.ai_strafetime = time + 0.4 + random() * 0.6;
-		self.ai_strafemove_x = (random() - 0.5) * cvar("sv_maxspeed");
-		self.ai_strafemove_y = (random() - 0.5) * cvar("sv_maxspeed");
-		self.ai_strafemove_z = 0;
-	}
-	self.movement = self.ai_strafemove;
-};
-
-void() ai_findenemy =
-{
-	local vector v1, v2;
-	local entity e;
-	if (self.enemy)
-		return;
-	v1 = self.origin + self.view_ofs;
-	e = findradius(v1, 1500);
-	while (e)
-	{
-		if (e.aitype == AITYPE_PLAYER)
-		if (e.takedamage)
-		if (!e.deadflag)
-		if (!(e.flags & FL_NOTARGET))
-		{
-			v2 = (e.absmin + e.absmax) * 0.5;
-			traceline(v1, v2, TRUE, self);
-			if (trace_fraction == 1 || trace_ent == e)
-				self.enemy = e;
-		}
-		e = e.chain;
-	}
-};
-
-void() player_ai =
-{
-	local vector v1, v2;
-
-	if (self.aitype == AITYPE_MIMIC)
-	{
-		self.movement = self.realowner.movement;
-		self.v_angle = self.realowner.v_angle;
-		self.switchweaponitem = self.realowner.switchweaponitem;
-		self.button0 = self.realowner.button0;
-		self.button3 = self.realowner.button3;
-		self.button4 = self.realowner.button4;
-	}
-	else if (self.aitype == AITYPE_SMARTFELLOW)
-	{
-		self.movement = '0 0 0';
-		self.button0 = self.button2 = self.button3 = self.button4 = 0;
-		if (!self.enemy)
-			ai_findenemy();
-		else
-		{
-			if (self.enemy.deadflag || !self.enemy.takedamage)
-			{
-				self.enemy = world;
-				return;
-			}
-			ai_strafe();
-			Inventory_GetItemInfo(self, self.weaponitem);
-			if (!iteminfo_weapon_canfire1)
-			if (!iteminfo_weapon_canfire2)
-			{
-				if (iteminfo_weapon_canreload)
-					self.button4 = 1;
-				else
-					self.switchweaponitem = Inventory_GetBestWeapon(self);
-			}
-			SAim();
-			v1 = self.origin + '0 0 16';
-			v2 = (self.enemy.absmin + self.enemy.absmax) * 0.5;
-			traceline(v1, v2, FALSE, self);
-			if ((trace_fraction == 1 || trace_ent == self.enemy) && SInfront(self.enemy))
-			{
-				if (iteminfo_weapon_canfire1)
-				{
-					if (iteminfo_weapon_canfire2)
-					{
-						if (random() < 0.05)
-							self.button3 = 1;
-						else
-							self.button0 = 1;
-					}
-					else
-						self.button0 = 1;
-				}
-				else if (iteminfo_weapon_canfire2)
-					self.button3 = 1;
-			}
-			else
-				MauveToGoal(); // a tad different
-		}
-	}
-};
-
-void() player_npcthink =
-{
-	self.nextthink = time;
-	player_ai();
-	SV_PlayerPhysics();
-	PlayerPreThink();
-	PlayerPostThink();
-};
-.float starting_gun;
-void() info_npc_smartfellow =
-{
-	local float c;
-
-	self.think = player_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(float animdone) player_dyingfunc =
 {
 	if (animdone)
@@ -1061,7 +856,41 @@
 void() player_gib =
 {
 	self.deadflag = DEAD_DEAD;
-	// TODO: gib
+	
+	float multiplier = 1;
+	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);
+
+		// 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);
+	}
+
+	sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
 };
 
 void(entity attacker, float damage) player_pain =
@@ -1185,21 +1014,6 @@
 		return;
 	if (cvar("sv_cheats"))
 	{
-		if (impuls == 30)
-		{
-			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.nextthink = time;
-			newmis.realowner = self;
-			oldself = self;
-			self = newmis;
-			player_spawn(ACTORTYPE_THEPLAYER);
-			self.aitype = AITYPE_MIMIC;
-			self = oldself;
-		}
 		if (impuls == 31)
 		{
 			makevectors(self.v_angle);
@@ -1295,19 +1109,3 @@
 	}
 };
 
-void() monster_light_guard
-{
-	setorigin(self, self.origin + '0 0 1');
-	self.think = player_npcthink;
-	self.nextthink = time;
-	player_spawn(ACTORTYPE_LIGHTGUARD);
-};
-
-void() monster_heavy_guard
-{
-	setorigin(self, self.origin + '0 0 1');
-	self.think = player_npcthink;
-	self.nextthink = time;
-	player_spawn(ACTORTYPE_HEAVYGUARD);
-};
-

Modified: trunk/basezym/progsqc/progs.src
===================================================================
--- trunk/basezym/progsqc/progs.src	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/progs.src	2007-10-19 03:14:58 UTC (rev 75)
@@ -5,11 +5,13 @@
 gamedefs.qc
 
 util.qc
+violence.qc
 damage.qc
 decors.qc
 inventory.qc
 actor.qc
 player.qc
+bots.qc
 server.qc
 mapentities.qc
 jumppads.qc

Modified: trunk/basezym/progsqc/server.qc
===================================================================
--- trunk/basezym/progsqc/server.qc	2007-08-12 05:51:42 UTC (rev 74)
+++ trunk/basezym/progsqc/server.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -63,4 +63,6 @@
 	//cl_divspeed = 1 / cvar("cl_rollspeed");
 
 	// TODO: implement timelimit
+	
+	bot_serverframe();
 };

Added: trunk/basezym/progsqc/violence.qc
===================================================================
--- trunk/basezym/progsqc/violence.qc	                        (rev 0)
+++ trunk/basezym/progsqc/violence.qc	2007-10-19 03:14:58 UTC (rev 75)
@@ -0,0 +1,69 @@
+void GibDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	float r;
+	r = random ();
+	if (r < 0.60)
+		sound (self, CHAN_WEAPON, "misc/gib_splat01.wav", 1, ATTN_NORM);
+	else if (r < 0.65)
+		sound (self, CHAN_WEAPON, "misc/gib_splat02.wav", 1, ATTN_NORM);
+	else if (r < 0.70)
+		sound (self, CHAN_WEAPON, "misc/gib_splat03.wav", 1, ATTN_NORM);
+	else if (r < 0.75)
+		sound (self, CHAN_WEAPON, "misc/gib_splat04.wav", 1, ATTN_NORM);
+	te_blood (self.origin + '0 0 1', '0 0 30', 10);
+	self.health = self.health - damage;
+	if (self.health <= -1000)
+	{
+		SUB_VanishOrRemove (self);
+	}
+}
+
+
+void GibTouch ()
+{
+	GibDamage (other, other, 1000, 0, self.origin, '0 0 0');
+}
+
+
+.float gibrandom;
+.float gibmodelindex;
+
+// changes by LordHavoc on 03/30/04
+// TossGib now takes a gib entity so it can be used for tossing heads
+// gib.velocity now uses randomvec() instead of a bunch of manual random calls
+// merged Gib() into PlayerGib()
+void TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch)
+{
+	if (gib == world)
+	{
+		gib = spawn ();
+		gib.deadflag = DEAD_DEAD;
+	}
+
+	// don't set his classname to something else or it'll screw up a lot of stuff
+	if(gib.classname != "player")
+		gib.classname = "gib";
+	gib.movetype = MOVETYPE_BOUNCE;
+	gib.solid = SOLID_CORPSE;
+	gib.skin = 0;
+	gib.effects = 0;
+	gib.gibrandom = random(); // used for customize function to reduce gibs
+	gib.effects = EF_LOWPRECISION; // use less bandwidth
+
+	setmodel (gib, mdlname); // precision set above
+	gib.gibmodelindex = gib.modelindex;
+	setsize (gib, '-8 -8 -8', '8 8 8');
+	setorigin (gib, org);
+
+	gib.health = -1;
+	gib.takedamage = DAMAGE_YES;
+	gib.mass = 25;
+	gib.th_pain = GibDamage;
+	if (destroyontouch == 1)
+		gib.touch = GibTouch;
+
+	gib.velocity = v + randomvec() * 450;
+	gib.avelocity = randomvec() * 300;
+
+	SUB_SetFade (gib, time + 12 + random () * 4, 1);
+}




More information about the zymotic-commits mailing list