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