prozac-qfcc/warlock.qc
Adam Olsen 33ac007d15 - Fix printing of number of knife kills
- add a spawn wrapper, so we can guarantee certain fields are
  initialized.  (not that it initializes anything yet)
- removed some commenting that prevented GRUNTY_EXTRA_WEAPONS (a debug
  define) from working
- removed "hacked forcefield gets you teamkills" from BUGS list.
2001-08-13 15:39:14 +00:00

1237 lines
33 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "defs.qh"
/*=======================================================//
// Warlock.QC - CustomTF 3.2.OfN - 30/1/2001 - //
=========================================================//
Warlock stuff
=========================================================*/
void() SummonThink; // external, used by demon menu thing
entity (vector location, float life, float type) CreateWaypoint; // Create a new grunty waypoint
//- OfN - Gets the name of monster class (shambler, fiend, scrag or soldier)
string(entity themonster) GetMonsterName;
void() MonsterTouch;
void(vector where) spawnFOG;
void (entity themonster) PutMonsterStand;
void (entity themonster) PutMonsterWalk;
//WK Done -----------------------------
// SB - demon summon menu
void() Menu_Demon =
{
local string str1,st,st3,st2,st4,st5;
str1 = ftos(self.demon_blood);
//if (self.job & JOB_BLOODY_KNIFE)
// st2="ÛÂÌÏÏÄÝ";
if (self.demon_one!=world)
{
custom_demon_name(self.demon_one);
st=GetMonsterName(self.demon_one);
CenterPrint6(self, self.demon_one.netname," ¼",st,"¾",
"\n\n Áãôéïî: \n\n“.. Come here, damn beast! \n”.. Patrol the zone! \n•.. Stop there! \n\nš®® Unsummon! \n\n.. Îïôèéîç \n\nËîéæå Ëéììó: "
, str1);
}
else
{
if (self.job & JOB_BLOODY_KNIFE)
st="\n Áãôéïî: \n\n“.. Summon Scrag (âìïïä)";
else
st="\n Áãôéïî: \n\n“.. Summon Scrag (blood)";
if (self.demon_blood>1)
st2="\n”.. Summon Fiend (2 ëéììó)";
else
st2="\n”.. Summon Fiend (2 kills)";
/*if (self.demon_blood>0)
{
if (self.demon_blood>1)
st2="\n”.. Summon Knight (1 ëéììó)\n•.. Summon Fiend (2 ëéììó)";
else
st2="\n”.. Summon Knight (1 ëéììó)\n•.. Summon Fiend (2 kills)";
}
else
{
if (self.demon_blood>1)
st2="\n”.. Summon Knight (1 kills)\n•.. Summon Fiend (2 ëéììó)";
else
st2="\n”.. Summon Knight (1 kills)\n•.. Summon Fiend (2 kills)";
}*/
/*if (self.demon_blood>2)
st3="\n.. Summon Hell Knight (3 ëéììó)";
else
st3="\n.. Summon Hell Knight (3 kills)";*/
if (self.demon_blood>3)
st3="\n•.. Summon Shambler (4 ëéììó)";
else
st3="\n•.. Summon Shambler (4 kills)";
CenterPrint6(self, st,st2,st3,"\n\n.. Îïôèéîç \n\nËîéæå Ëéììó: ", str1,"\^/" + ftos (MAX_KNIFE_BLOOD));
}
// Ignore enemy!
// Engage enemy!
//menu 2
//health
//frags
//status
//enemy
};
/*
** Warlock Profession -
** Hit an enemy with knife for blood, use that to summon a happy demon
*/
void() SummonThink =
{
if (self.heat == 0)
{
self.heat = 1;
stuffcmd(self.owner,"v_idlescale 0\n");
self.nextthink = time + 1.5;
return;
}
local entity oself;
oself = self;
self = self.owner;
custom_demon_create(oself.has_tesla);
spawnFOG(oself.origin);
self = oself;
dremove(self);
};
void(float inp) Menu_Demon_Input =
{
local float r;
local entity SummonTimer;
local float cost;
local entity te;
local float points;
self.demon_choice = 0; // reset demon choice var
if (inp == 10) // nothing
{
ResetMenu();
self.impulse = 0;
return;
}
if (inp == 1 && self.demon_one != world) // Come here!
{
if (!IsMonster(self.demon_one)) return;
local string st;
st=GetMonsterName(self.demon_one);
if (self.demon_one.enemy != world)
{
if (visible2(self.demon_one,self.demon_one.enemy))
{
sprint(self,PRINT_HIGH,"Your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH," is busy trying to kill!\n");
self.impulse=0;
return;
}
}
if (self.demon_one.goalentity == self)
{
sprint(self,PRINT_HIGH,"Your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH," is already trying to reach your position!\n");
self.impulse=0;
return;
}
self.demon_one.enemy=world;//
self.demon_one.goalentity=self;
self.demon_one.nextthink=time+0.1;
PutMonsterWalk(self.demon_one);
sprint(self,PRINT_HIGH,"You call your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH,".\n");
ResetMenu();
self.impulse=0;
return;
}
else if (inp == 2 && self.demon_one != world) // patrol
{
if (!IsMonster(self.demon_one)) return;
local string st;
st=GetMonsterName(self.demon_one);
if (self.demon_one.enemy != world)
{
if (visible2(self.demon_one,self.demon_one.enemy))
{
sprint(self,PRINT_HIGH,"Your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH," is busy tring to kill!\n");
self.impulse=0;
return;
}
}
self.demon_one.enemy=world;//
self.demon_one.oldenemy=world;////
self.demon_one.goalentity=self.demon_one;
self.demon_one.nextthink=time+0.1;
PutMonsterWalk(self.demon_one);
sprint(self,PRINT_HIGH,"Your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH," will patrol the zone now...\n");
ResetMenu();
self.impulse=0;
return;
}
else if (inp == 3 && self.demon_one != world) // stop there!
{
if (!IsMonster(self.demon_one)) return;
local string st;
st=GetMonsterName(self.demon_one);
if (self.demon_one.enemy != world)
{
if (visible2(self.demon_one,self.demon_one.enemy))
{
sprint(self,PRINT_HIGH,"Your ");
sprint(self,PRINT_HIGH,st);
sprint(self,PRINT_HIGH," is busy tring to kill!\n");
self.impulse=0;
return;
}
}
self.demon_one.enemy=world;//
self.demon_one.oldenemy=world;////
self.demon_one.goalentity=world;
self.demon_one.nextthink=time+0.1;
PutMonsterStand(self.demon_one);
ResetMenu();
self.impulse=0;
return;
}
else if (inp == 1) // scrag
{
self.demon_choice = 1;
ResetMenu();
self.impulse = 0;
}
else if (inp == 2) // knight
{
self.demon_choice = 2;
ResetMenu();
self.impulse = 0;
}
else if (inp == 3) // fiend
{
self.demon_choice = 3;
ResetMenu();
self.impulse = 0;
}
/*else if (inp == 4) // hell knight
{
self.demon_choice = 4;
ResetMenu();
self.impulse = 0;
}
else if (inp == 5) // shambler
{
self.demon_choice = 5;
ResetMenu();
self.impulse = 0;
}*/
else if (inp == 8) // unsummon
{
if (self.job & JOB_DEMON_OUT)
{
local string MName;
MName=GetMonsterName(self.demon_one);
teamprefixsprint(self.team_no, self);
teamsprint(self.team_no,self, self.netname);
teamsprint(self.team_no,self, " unsummons his ");
teamsprint(self.team_no,self, MName);
teamsprint(self.team_no,self, "\n");
kill_my_demon();
}
else return;
ResetMenu();
self.impulse = 0;
return;
}
else
return;
if (self.job & JOB_DEMON_OUT)
{
sprint(self, PRINT_HIGH, "You already have a monster summoned.\n");
//ResetMenu();
self.impulse = 0;
return;
}
#ifndef WARLOCK_TEST
if (self.demon_blood < 4 && self.demon_choice == 3)
{
sprint (self, PRINT_HIGH, "You need to kill 5 enemies with your knife to summon a shambler.\n");
//ResetMenu();
self.impulse = 0;
return;
} // temp
/* if (self.demon_blood < 3 && self.demon_choice == 4)
{
sprint (self, PRINT_HIGH, "You need to kill 4 enemies with your knife to summon a hell knight.\n");
//ResetMenu();
self.impulse = 0;
return;
} // temp*/
if (self.demon_blood < 2 && self.demon_choice == 2)
{
sprint (self, PRINT_HIGH, "You need to kill 2 enemies with your knife to summon a fiend.\n");
//ResetMenu();
self.impulse = 0;
return;
}
/*if (self.demon_blood < 1 && self.demon_choice == 2)
{
sprint (self, PRINT_HIGH, "You need to kill 1 enemies with your knife to summon a knight.\n");
//ResetMenu();
self.impulse = 0;
return;
} // temp*/
if (!(self.job & JOB_BLOODY_KNIFE) && self.demon_choice == 1)
{
sprint(self,PRINT_HIGH,"You have to get blood from an enemy to summon a scrag.\n");
//ResetMenu();
self.impulse = 0;
return;
}
#endif
ResetMenu();
//points = self.demon_blood;
// TEMP
points = 5;
if (self.demon_choice == 3)
self.demon_blood = self.demon_blood - 4;
else if (self.demon_choice == 2)
self.demon_blood = self.demon_blood - 2;
//else
// self.demon_blood = 0;
if (self.job & JOB_BLOODY_KNIFE && self.demon_choice == 1)
self.job = self.job - JOB_BLOODY_KNIFE; //- OfN - caused bug
if (self.current_weapon == WEAP_AXE && self.demon_choice == 1)
{
self.weaponmode = 0; // Remove blood on the knife
self.weaponmodel = "progs/v_knife.mdl";
}
stuffcmd(self,"v_idlescale 100000\n");
//r = random(); //Random summon sounds. :)
//if (r < 0.33)
sound (self, CHAN_WEAPON, "boss2/sight.wav", 1, ATTN_NORM);
//else if (r < 0.66)
// sound (self, CHAN_WEAPON, "wizard/widle2.wav", 1, ATTN_NORM);
//else
// sound (self, CHAN_WEAPON, "shambler/sdeath.wav", 1, ATTN_NORM);
SummonTimer = spawn ();
SummonTimer.classname = "timer";
SummonTimer.owner = self;
SummonTimer.nextthink = time + 1.5; //Small delays are cool
SummonTimer.think = SummonThink;
SummonTimer.has_tesla = points;
SummonTimer.heat = 0;
self.job_finished = time + 5; //Delay if summon goes bad SB reduced to 5
self.attack_finished = time + 2.1;
};
//====================================================//
//Returns a random name for a demon, or pulls it from one's localinfo
void(entity demon) custom_demon_name =
{
local string happy;
local float r;
// Why doesn't this work? When people set their own names,
// the demon's name gets corrupted. Do we need a strcpy()?
/*CH
has_camera 0 = Ignore and set name as 'demon'
1 = Using random name
2 = Failed infokey, get random
3 = Using Custom name
4 = Set name when called
*/
if (demon.has_camera == 3 || demon.has_camera == 4) //CH // SB - if we have a d already, use rand name
{
happy = infokey(demon.real_owner,"demon");
if (happy == string_null)
happy = infokey(demon.real_owner,"d");
if (happy == string_null)
demon.has_camera = 2;
else
demon.has_camera = 3;
}
if (demon.has_camera == 2)
{
//Make random name
r = random();
if ( demon.classname == "monster_demon1" )
{
//Make random name
if (r < 0.1)
happy = "The Fiend Lazarat";
else if (r < 0.2)
happy = "Lysanter of Blood";
else if (r < 0.3)
happy = "Childers Nightmare";
else if (r < 0.4)
happy = "Minion of Lesric";
else if (r < 0.5)
happy = "Archdemon Boris";
else if (r < 0.6)
happy = "Talon";
else if (r < 0.7)
happy = "Oathrender";
else if (r < 0.8)
happy = "The Fiend Roeder";
else if (r < 0.9)
happy = "The Fiend Warrek";
else
happy = "Mourning Breath";
}
else if ( demon.classname == "monster_army" )
{
if ( r < 0.1 )
happy = "F.Lee";
else if ( r < 0.2 )
happy = "A.Hoffman";
else if ( r < 0.3 )
happy = "J.Garcia";
else if ( r < 0.4 )
happy = "H.Dail";
else if ( r < 0.5 )
happy = "R.Gustafson";
else if ( r < 0.6 )
happy = "F.Gump";
else if ( r < 0.7 )
happy = "A.McNab";
else if ( r < 0.8 )
happy = "C.Ryan";
else if ( r < 0.9 )
happy = "K.Johnson";
else
happy = "W.Kerney";
}
else if ( demon.classname == "monster_shambler" )
{
if (r < 0.2)
happy = "Necrotopos";
else if (r < 0.4)
happy = "Gorgon";
else if (r < 0.6)
happy = "Ogroth";
else if (r < 0.8)
happy = "Krogoth";
else
happy = "Llama Crusher";
}
else if ( demon.classname == "monster_wizard" ) //- OfN -
{
if (r < 0.25)
happy = "Dark Spawn";
else if (r <0.5)
happy = "White Poison";
else if (r <0.75)
happy = "Lorgrath";
else happy = "Phitermos";
}
/*else if (demon.classname == "monster_knight" ) //- OfN -
{
if (r < 0.25)
happy = "Frannege";
else if (r <0.5)
happy = "Jenobahg";
else if (r <0.75)
happy = "Crainmerg";
else happy = "Biosenberg";
}
else if (demon.classname == "monster_hknight" ) //- OfN -
{
if (r < 0.25)
happy = "Sir Heinmenberg";
else if (r <0.5)
happy = "Sir Grigben";
else if (r <0.75)
happy = "Sir Tossendor";
else happy = "Sir Gennoveh";
}*/
demon.netname = happy;
demon.has_camera = 1;
}
if (demon.has_camera == 0)
happy = "demon";
if (demon.has_camera != 1)
demon.netname = happy;
};
void (float points) custom_demon_create =
{
local vector direction;
local float r;
local entity te;
local vector tmp1, tmp2;
local string happy, str1;
local float points;
//Play random summoning sound here
//r = random();
//if (r < 0.33)
sound (self, CHAN_VOICE, "ambience/thunder1.wav", 1, ATTN_NORM);
//else if (r < 0.66)
// sound (self, CHAN_WEAPON, "boss1/sight1.wav", 1, ATTN_NORM);
//else
// sound (self, CHAN_WEAPON, "boss1/out1.wav", 1, ATTN_NORM);
makevectors (self.v_angle);
v_forward_z = 0;
v_forward = normalize(v_forward) * 64;
newmis = spawn();
newmis.owner = newmis; //WK Self
newmis.real_owner = self;
if (self.demon_choice == 1)
{
newmis.classname = "monster_wizard";
#ifdef no_tf_monsters
newmis.mdl = "progs/wizard.mdl";
#else
newmis.mdl = "progs/tf_wiz.mdl";
#endif
}
/*else if (self.demon_choice == 2)
{
newmis.classname = "monster_knight";
newmis.mdl = "progs/knight.mdl";
}*/
else if (self.demon_choice == 2)
{
newmis.classname = "monster_demon1";
#ifdef no_tf_monsters
newmis.mdl = "progs/demon.mdl";
#else
newmis.mdl = "progs/tf_demon.mdl";
#endif
}
/*else
{
newmis.classname = "monster_hknight";
newmis.mdl = "progs/hknight.mdl";
}*/
else if (self.demon_choice == 3)
{
newmis.classname = "monster_shambler";
#ifdef no_tf_monsters
newmis.mdl = "progs/shambler.mdl";
#else
newmis.mdl = "progs/tf_sham.mdl";
#endif
}
// CHECK: why this was comented?
newmis.team_no = self.team_no; //Go team red! ;)
newmis.origin = self.origin + v_forward;
newmis.has_camera = 4;
custom_demon_name(newmis); //SB - Share and Enjoy - ceaf put health in here
//setorigin (newmis, self.origin + v_forward*50 + '0 0 16');
//setsize (newmis, VEC_HULL_MIN, VEC_HULL_MAX);
if (!CheckArea(newmis,self)) { //No room for el diablo
sprint(self,PRINT_HIGH,"Not enough room to summon creature!\n");
newmis.think = SUB_Remove;
newmis.nextthink = time + 0.1;
//self.job = self.job - (self.job & JOB_DEMON_OUT); // FIXME - This shouldn't be needed - OfN done
return;
}
if ( self.demon_choice == 1 )
{
#ifdef no_tf_monsters
setmodel (newmis, "progs/wizard.mdl");
#else
setmodel (newmis, "progs/tf_wiz.mdl");
#endif
setsize (newmis, '-16 -16 -24', '16 16 40');
setorigin (newmis, newmis.origin + '0 0 30');
}
/*else if ( self.demon_choice == 2 )
{
setmodel (newmis, "progs/knight.mdl");
//setsize (self, '-16 -16 -24', '16 16 40');
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
setorigin (newmis, newmis.origin + '0 0 30');
}*/
else if ( self.demon_choice == 2 )
{
#ifdef no_tf_monsters
setmodel (newmis, "progs/demon.mdl");
#else
setmodel (newmis, "progs/tf_demon.mdl");
#endif
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
setorigin (newmis, newmis.origin + '0 0 30');
}
/*else if ( self.demon_choice == 4 )
{
setmodel (newmis, "progs/hknight.mdl");
//setsize (self, '-16 -16 -24', '16 16 40');
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
setorigin (newmis, newmis.origin + '0 0 30');
}*/
else if (self.demon_choice == 3)
{
#ifdef no_tf_monsters
setmodel (newmis, "progs/shambler.mdl");
#else
setmodel (newmis, "progs/tf_sham.mdl");
#endif
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
setorigin (newmis, newmis.origin + '0 0 30');
}
//Test successful, so go ahead and finish summon
#ifndef no_tf_monsters
if (no_monstercolors)
newmis.skin=0;
else
newmis.skin=self.team_no;
#endif
newmis.ltime=time;
local string MName;
MName=GetMonsterName(newmis);
teamprefixsprint(self.team_no,self);
teamsprint(self.team_no,self,self.netname);
teamsprint(self.team_no,self," has summoned the ");
teamsprint(self.team_no,self,MName);
teamsprint(self.team_no,self," ");
teamsprint(self.team_no,self,newmis.netname);
teamsprint(self.team_no,self,"\n");
self.job = self.job | JOB_DEMON_OUT;
self.job_finished = time + 3; //Don't let em kill demon for 15 secs.
// SB 15 is tight; 10
// 10 is tight; 5
// OfN 5 is tight; 3 ;)
if (self.demon_choice==2)
sound (self, CHAN_BODY, "demon/sight2.wav", 1, ATTN_NORM);
newmis.velocity = v_forward * 10;// + '0 0 250';
newmis.angles = vectoangles(newmis.velocity);
if (newmis.flags & FL_ONGROUND)
newmis.flags = newmis.flags - FL_ONGROUND;
newmis.velocity = v_forward * 10;
newmis.movetype = MOVETYPE_TOSS;
newmis.solid = SOLID_SLIDEBOX;
newmis.takedamage = DAMAGE_AIM;
if (self.demon_choice==1)
{
newmis.velocity='0 0 0';
newmis.movetype = MOVETYPE_STEP;
}
/*if ( newmis.classname == "monster_hknight" )
{
newmis.health = HKNIGHT_HP; //WK 300
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
newmis.last_saveme_sound = 0;
newmis.th_stand = hknight_stand1;
newmis.th_walk = hknight_walk1;
newmis.th_run = hknight_run1;
newmis.th_melee = hknight_melee;
newmis.th_missile = hknight_magicc1;
newmis.th_pain = hknight_pain;
newmis.th_die = hknight_die;
newmis.think = walkmonster_start;
newmis.nextthink = time + 1;
//newmis.touch = Demon_JumpTouch;
//newmis.touch = SUB_Null;
sprint(self, PRINT_HIGH, "You summon a hell knight.\n");
}
else if ( newmis.classname == "monster_knight" )
{
newmis.health = KNIGHT_HP; //WK 300
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
newmis.last_saveme_sound = 0;
newmis.th_stand = knight_stand1;
newmis.th_walk = knight_walk1;
newmis.th_run = knight_run1;
newmis.th_melee = knight_atk1;
newmis.th_pain = knight_pain;
newmis.th_die = knight_die;
newmis.think = walkmonster_start;
newmis.nextthink = time + 1;
//newmis.touch = Demon_JumpTouch;
//newmis.touch = SUB_Null;
sprint(self, PRINT_HIGH, "You summon a knight.\n");
}*/
if ( newmis.classname == "monster_demon1" )
{
newmis.health = DEMON_HP; //WK 300
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
newmis.last_saveme_sound = 0;
newmis.has_tesla = 0; //CH determines if jello jump
newmis.has_sentry = 0; //CH stuck jump
newmis.th_stand = demon1_stand1;
newmis.th_walk = demon1_walk1;
newmis.th_run = demon1_run1;
newmis.th_die = custom_demon_die;
newmis.th_melee = Demon_MeleeAttack; // one of two attacks
newmis.th_missile = demon1_jump1; // jump attack
newmis.th_pain = demon1_pain;
newmis.th_fireball = demon1_fire1; //CH
newmis.think = walkmonster_start;
newmis.nextthink = time + 1;
//newmis.touch = Demon_JumpTouch;
//newmis.touch = SUB_Null;
sprint(self, PRINT_HIGH, "You summon a fiend.\n");
}
else if ( newmis.classname == "monster_shambler" )
{
newmis.health = SHAMBLER_HP;//750 + points * 350; //WK 300
newmis.armorclass = 0;// ofn- AT_SAVEEXPLOSION | AT_SAVEMELEE;
newmis.last_saveme_sound = 0;
newmis.has_tesla = points;
newmis.has_sentry = 0;
newmis.th_stand = sham_stand1;
newmis.th_walk = sham_walk1;
newmis.th_run = sham_run1;
newmis.th_die = custom_shambler_die;
newmis.th_melee = sham_melee; // one of two attacks
newmis.th_missile = sham_magic1;
newmis.th_pain = sham_pain;
//newmis.th_fireball = sham_fireball; //- OfN - this, uglyness apart, didn't work anyway
newmis.think = walkmonster_start;
newmis.nextthink = time + 1;
//newmis.touch = Demon_JumpTouch;
//newmis.touch = SUB_Null;
////newmis.real_owner.demon_blood = 0; marduk bug
sprint(self, PRINT_HIGH, "You summon a shambler.\n");
}
else
{
newmis.health = SCRAG_HP;
newmis.think =flymonster_start_go;// walkmonster_start;
newmis.th_stand = wiz_stand1;
newmis.th_walk = wiz_walk1;
newmis.th_run = wiz_run1;
newmis.th_missile = Wiz_Missile;
newmis.th_pain = Wiz_Pain;
newmis.th_die = wiz_die;
newmis.nextthink = time + 0.05;
//newmis.armorclass = 0; //- OfN - none AT_SAVESHOT; // kevlar
newmis.last_saveme_sound = 0; // ? oh that
//newmis.touch = SUB_Null;
sprint(self, PRINT_HIGH, "You summon a scrag.\n");
}
newmis.touch=MonsterTouch;
newmis.message = "XX"; // flag to identify monsters/army for sentry targetting
newmis.real_owner.demon_one = newmis;
newmis.max_health = newmis.health;
};
void () custom_demon_precache =
{
#ifdef no_tf_monsters
precache_model ("progs/demon.mdl");
#else
precache_model ("progs/tf_demon.mdl");
#endif
precache_model ("progs/h_demon.mdl");
precache_sound ("demon/ddeath.wav");
precache_sound ("demon/dhit2.wav");
precache_sound ("demon/djump.wav");
precache_sound ("demon/dpain1.wav");
precache_sound ("demon/idle1.wav");
precache_sound ("demon/sight2.wav");
precache_model ("progs/soldier.mdl");
precache_model ("progs/h_guard.mdl");
precache_model ("progs/gib1.mdl");
precache_model ("progs/gib2.mdl");
precache_model ("progs/gib3.mdl");
precache_sound ("soldier/death1.wav");
precache_sound ("soldier/idle.wav");
precache_sound ("soldier/pain1.wav");
precache_sound ("soldier/pain2.wav");
precache_sound ("soldier/sattck1.wav");
precache_sound ("soldier/sight1.wav");
#ifdef no_tf_monsters
precache_model ("progs/shambler.mdl");
#else
precache_model ("progs/tf_sham.mdl");
#endif
precache_model ("progs/s_light.mdl");
precache_model ("progs/h_shams.mdl");
precache_model ("progs/bolt.mdl");
precache_sound ("shambler/sattck1.wav");
precache_sound ("shambler/sboom.wav");
precache_sound ("shambler/sdeath.wav");
precache_sound ("shambler/shurt2.wav");
precache_sound ("shambler/sidle.wav");
precache_sound ("shambler/ssight.wav");
precache_sound ("shambler/melee1.wav");
precache_sound ("shambler/melee2.wav");
precache_sound ("shambler/smack.wav");
//Also use ambience/thunder1 for out of knife
precache_sound ("boss1/sight1.wav"); //Out of knife
precache_sound ("boss1/out1.wav"); //Out of knife
precache_sound ("boss2/sight.wav"); //Summon
// precache_sound ("wizard/widle2.wav"); //Summon - OfN cacheed on wizard.qc
precache_sound ("shambler/sdeath.wav"); //Summon
//------------------------------------//
/*precache_model ("progs/knight.mdl");
precache_model ("progs/h_knight.mdl");
precache_sound ("knight/kdeath.wav");
precache_sound ("knight/khurt.wav");
precache_sound ("knight/ksight.wav");
precache_sound ("knight/sword1.wav");
precache_sound ("knight/sword2.wav");
precache_sound ("knight/idle.wav");
//----------------------------------//
precache_model2 ("progs/hknight.mdl");
precache_model2 ("progs/k_spike.mdl");
precache_model2 ("progs/h_hellkn.mdl");
precache_sound2 ("hknight/attack1.wav");
precache_sound2 ("hknight/death1.wav");
precache_sound2 ("hknight/pain1.wav");
precache_sound2 ("hknight/sight1.wav");
precache_sound ("hknight/hit.wav"); // used by C code, so don't sound2
precache_sound2 ("hknight/slash1.wav");
precache_sound2 ("hknight/idle.wav");
precache_sound2 ("hknight/grunt.wav");
precache_sound ("knight/sword1.wav");
precache_sound ("knight/sword2.wav");*/
};
void () kill_my_demon;
void (entity player) kill_his_demon =
{
if (player.classname!="player") return;
local entity temp;
temp=self;
self=player;
kill_my_demon();
self=temp;
};
void () kill_my_demon =
{
local entity te;
local entity oself;
//WK Clean up demons
te = find(world, classname, "monster_demon1");
while (te)
{
if (te.real_owner == self) {
oself = self;
self = te;
//Must get... blood....
ThrowGib ("progs/h_demon.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib2.mdl", -70);
ThrowGib ("progs/gib3.mdl", -80);
sound (self, CHAN_VOICE, "demon/ddeath.wav", 1, ATTN_NORM);
self = oself;
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
sprint(self, PRINT_HIGH, "Your fiend is dead.\n");
self.job = self.job - (self.job & JOB_DEMON_OUT);
}
te = find(te, classname, "monster_demon1");
}
te = find(world, classname, "monster_army");
while (te)
{
if (te.real_owner == self)
{
oself = self;
self = te;
self.health = -100;
//Must get... blood....
ThrowGib ("progs/h_guard.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib2.mdl", -70);
ThrowGib ("progs/gib3.mdl", -70);
ThrowGib ("progs/gib2.mdl", -70);
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
// custom_grunt_die;
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
//-----------------------// NOT NEEDED
/*te.th_stand = SUB_Null;
te.th_run = SUB_Null;
te.th_missile = SUB_Null;
te.th_pain = SUB_Null;*/
//--------------------------//
/* if (self.martyr_enemy != world)
dremove(self.martyr_enemy);
if (self.demon_one != world)
dremove(self.demon_one);
if (self.demon_two != world)
dremove(self.demon_two);
*/
if (self.martyr_enemy != world)
#ifdef ARMY_DEBUG
RemoveWaypoint(self.martyr_enemy, "KillMyDemon() martyr", self);
#else
RemoveWaypoint(self.martyr_enemy, self);
#endif
//dremove(self.martyr_enemy);
if (self.demon_one != world)
#ifdef ARMY_DEBUG
RemoveWaypoint(self.demon_one, "KillMyDemon() demon_one", self);
#else
RemoveWaypoint(self.demon_one, self);
#endif
//dremove(self.demon_one);
if (self.demon_two != world)
#ifdef ARMY_DEBUG
RemoveWaypoint(self.demon_two, "KillMyDemon() demon_two", self);
#else
RemoveWaypoint(self.demon_two, self);
#endif
//dremove(self);// needed? to avoid false drown death bug_? nope
self = oself;
//grunt
sprint (self, PRINT_HIGH, "Your soldier is dead.\n");
self.job = self.job - (self.job & JOB_DEMON_OUT);
self.demon_one = world;
SetArmyTimer();
//TF_T_Damage(te, world, world, 4000, 0, 0);
}
te = find(te, classname, "monster_army");
}
/*te = find(world, classname, "monster_knight");
while (te)
{
if (te.real_owner == self)
{
oself = self;
self = te;
ThrowGib ("progs/h_knight.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib3.mdl", -30);
ThrowGib ("progs/gib3.mdl", -70);
sound (self, CHAN_VOICE, "knight/kdeath.wav", 1, ATTN_NORM);
//sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
self = oself;
//self.job = self.job - (self.job & JOB_DEMON_OUT);
sprint (self, PRINT_HIGH, "Your knight is dead.\n");
//TF_T_Damage(te, world, world, 4000, 0, 0);
}
te = find(te, classname, "monster_knight");
}
te = find(world, classname, "monster_hknight");
while (te)
{
if (te.real_owner == self)
{
oself = self;
self = te;
ThrowGib ("progs/h_hellkn.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib3.mdl", -30);
ThrowGib ("progs/gib3.mdl", -70);
sound (self, CHAN_VOICE, "hknight/death1.wav", 1, ATTN_NORM);
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
self = oself;
//self.job = self.job - (self.job & JOB_DEMON_OUT);
sprint (self, PRINT_HIGH, "Your hell knight is dead.\n");
//TF_T_Damage(te, world, world, 4000, 0, 0);
}
te = find(te, classname, "monster_hknight");
}*/
te = find(world, classname, "monster_shambler");
while (te)
{
if (te.real_owner == self)
{
oself = self;
self = te;
ThrowGib ("progs/h_shams.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib3.mdl", -30);
ThrowGib ("progs/gib3.mdl", -70);
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
self = oself;
//self.job = self.job - (self.job & JOB_DEMON_OUT);
sprint (self, PRINT_HIGH, "Your shambler is dead.\n");
//TF_T_Damage(te, world, world, 4000, 0, 0);
}
te = find(te, classname, "monster_shambler");
}
te = find(world, classname, "monster_wizard");
while (te)
{
if (te.real_owner == self)
{
oself = self;
self = te;
ThrowGib ("progs/h_wizard.mdl", -100);
ThrowGib ("progs/gib1.mdl", -10);
ThrowGib ("progs/gib3.mdl", -30);
ThrowGib ("progs/gib3.mdl", -70);
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
te.think = SUB_Remove;
te.touch = SUB_Null;
te.nextthink = time + 0.1;
self = oself;
sprint (self, PRINT_HIGH, "Your scrag is dead.\n");
//TF_T_Damage(te, world, world, 4000, 0, 0);
}
te = find(te, classname, "monster_wizard");
}
self.job = self.job - (self.job & JOB_DEMON_OUT);
self.demon_one = world;
self.summon_one = world;
self.summon_two = world;
};
void() MonsterTouch =
{
/* if (self.real_owner==other && self.health > 0) // if it is our monster
{
if (self.goalentity==other) // if it was following us
{
self.goalentity=self; //stop it
self.nextthink=time+0.1;
PutMonsterStand(self);
}
} */
};
//===================================================//
void (entity themonster) PutMonsterStand =
{
if (themonster.classname=="monster_shambler")
themonster.think=sham_stand1;
else if (themonster.classname=="monster_demon1")
themonster.think=demon1_stand1;
else if (themonster.classname=="monster_wizard")
themonster.think=wiz_stand1;
/*else if (themonster.classname=="monster_knight")
themonster.think=knight_stand1;
else if (themonster.classname=="monster_hknight")
themonster.think=hknight_stand1; */
};
void (entity themonster) PutMonsterWalk =
{
if (themonster.classname=="monster_shambler")
themonster.think=sham_walk1;
else if (themonster.classname=="monster_demon1")
themonster.think=demon1_walk1;
else if (themonster.classname=="monster_wizard")
themonster.think=wiz_walk1;
/*else if (themonster.classname=="monster_knight")
themonster.think=knight_walk1;
else if (themonster.classname=="monster_hknight")
themonster.think=hknight_walk1;*/
};
//============================================================================
// OfN - Called everytime a monster dies on die think, has_holo is set to 0
void (entity player) UpdateSummons =
{
// are we a player?
if (player.classname != "player")
{
RPrint("Non-player entity in UpdateSummons()\n");
return;
}
// are we a warlock?
if (!(player.job & JOB_WARLOCK))
{
RPrint("Non-warlock player in UpdateSummons()\n");
return;
}
// Update our first summon
if (player.summon_one != world)
{
if (!IsMonster(player.summon_one))
{
RPrint("Non-monster in .summon_one in UpdateSummons()\n");
return;
}
if (player.summon_one.has_holo == 0) // set to 0 on die thinks
player.summon_one = world;
}
// Update our second summon
if (player.summon_two != world)
{
if (!IsMonster(player.summon_two))
{
RPrint("Non-monster for .summon_two in UpdateSummons()\n");
return;
}
if (player.summon_two.has_holo == 0) // set to 0 on die thinks
player.summon_two = world;
}
};