2001-07-23 20:52:47 +00:00
|
|
|
|
#include "defs.qh"
|
2001-07-17 05:58:10 +00:00
|
|
|
|
/*=======================================================//
|
|
|
|
|
// 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 =
|
|
|
|
|
{
|
2001-09-23 04:25:02 +00:00
|
|
|
|
local string str1,st,st3,st2;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
str1 = ftos(self.demon_blood);
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//if (self.job & JOB_BLOODY_KNIFE)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
// st2="<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
|
|
|
|
|
|
|
|
|
if (self.demon_one!=world)
|
|
|
|
|
{
|
|
|
|
|
custom_demon_name(self.demon_one);
|
|
|
|
|
st=GetMonsterName(self.demon_one);
|
|
|
|
|
CenterPrint6(self, self.demon_one.netname," <20>",st,"<EFBFBD>",
|
|
|
|
|
"\n\n <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n<EFBFBD>.. Come here, damn beast! \n<EFBFBD>.. Patrol the zone! \n<EFBFBD>.. Stop there! \n\n<EFBFBD><EFBFBD><EFBFBD> Unsummon! \n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: "
|
|
|
|
|
, str1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (self.job & JOB_BLOODY_KNIFE)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
st="\n <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n<EFBFBD>.. Summon Scrag (<28><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st="\n <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: \n\n<EFBFBD>.. Summon Scrag (blood)";
|
|
|
|
|
|
|
|
|
|
if (self.demon_blood>1)
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Fiend (2 <20><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Fiend (2 kills)";
|
|
|
|
|
|
|
|
|
|
/*if (self.demon_blood>0)
|
|
|
|
|
{
|
|
|
|
|
if (self.demon_blood>1)
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Knight (1 <20><><EFBFBD><EFBFBD><EFBFBD>)\n<EFBFBD>.. Summon Fiend (2 <20><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Knight (1 <20><><EFBFBD><EFBFBD><EFBFBD>)\n<EFBFBD>.. Summon Fiend (2 kills)";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (self.demon_blood>1)
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Knight (1 kills)\n<EFBFBD>.. Summon Fiend (2 <20><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st2="\n<EFBFBD>.. Summon Knight (1 kills)\n<EFBFBD>.. Summon Fiend (2 kills)";
|
|
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*if (self.demon_blood>2)
|
|
|
|
|
st3="\n<EFBFBD>.. Summon Hell Knight (3 <20><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st3="\n<EFBFBD>.. Summon Hell Knight (3 kills)";*/
|
|
|
|
|
|
|
|
|
|
if (self.demon_blood>3)
|
|
|
|
|
st3="\n<EFBFBD>.. Summon Shambler (4 <20><><EFBFBD><EFBFBD><EFBFBD>)";
|
|
|
|
|
else
|
|
|
|
|
st3="\n<EFBFBD>.. Summon Shambler (4 kills)";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-08-13 15:39:14 +00:00
|
|
|
|
CenterPrint6(self, st,st2,st3,"\n\n<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \n\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>: ", str1,"\^/" + ftos (MAX_KNIFE_BLOOD));
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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 entity SummonTimer;
|
|
|
|
|
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))
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH," is busy trying to kill!\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
self.impulse=0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (self.demon_one.goalentity == self)
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH," is already trying to reach your position!\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"You call your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH,".\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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))
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH," is busy tring to kill!\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH," will patrol the zone now...\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
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))
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Your ");
|
|
|
|
|
sprint(self,PRINT_HIGH,st);
|
|
|
|
|
sprint(self,PRINT_HIGH," is busy tring to kill!\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (self.job & JOB_DEMON_OUT)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (self.job & JOB_DEMON_OUT)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You already have a monster summoned.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//ResetMenu();
|
|
|
|
|
self.impulse = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef WARLOCK_TEST
|
|
|
|
|
|
|
|
|
|
if (self.demon_blood < 4 && self.demon_choice == 3)
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "You need to kill 5 enemies with your knife to summon a shambler.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//ResetMenu();
|
|
|
|
|
self.impulse = 0;
|
|
|
|
|
return;
|
|
|
|
|
} // temp
|
|
|
|
|
|
|
|
|
|
/* if (self.demon_blood < 3 && self.demon_choice == 4)
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "You need to kill 4 enemies with your knife to summon a hell knight.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//ResetMenu();
|
|
|
|
|
self.impulse = 0;
|
|
|
|
|
return;
|
|
|
|
|
} // temp*/
|
|
|
|
|
|
|
|
|
|
if (self.demon_blood < 2 && self.demon_choice == 2)
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "You need to kill 2 enemies with your knife to summon a fiend.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//ResetMenu();
|
|
|
|
|
self.impulse = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*if (self.demon_blood < 1 && self.demon_choice == 2)
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "You need to kill 1 enemies with your knife to summon a knight.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//ResetMenu();
|
|
|
|
|
self.impulse = 0;
|
|
|
|
|
return;
|
|
|
|
|
} // temp*/
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (!(self.job & JOB_BLOODY_KNIFE) && self.demon_choice == 1)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"You have to get blood from an enemy to summon a scrag.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//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;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (self.job & JOB_BLOODY_KNIFE && self.demon_choice == 1)
|
|
|
|
|
self.job = self.job - JOB_BLOODY_KNIFE; //- OfN - caused bug
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (self.current_weapon == WEAP_AXE && self.demon_choice == 1)
|
2001-07-17 05:58:10 +00:00
|
|
|
|
{
|
|
|
|
|
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)
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_WEAPON, "boss2/sight.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//else if (r < 0.66)
|
2001-07-23 20:52:47 +00:00
|
|
|
|
// sound (self, CHAN_WEAPON, "wizard/widle2.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//else
|
2001-07-23 20:52:47 +00:00
|
|
|
|
// sound (self, CHAN_WEAPON, "shambler/sdeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
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 float points;
|
|
|
|
|
|
|
|
|
|
//Play random summoning sound here
|
|
|
|
|
//r = random();
|
|
|
|
|
//if (r < 0.33)
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "ambience/thunder1.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//else if (r < 0.66)
|
2001-07-23 20:52:47 +00:00
|
|
|
|
// sound (self, CHAN_WEAPON, "boss1/sight1.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//else
|
2001-07-23 20:52:47 +00:00
|
|
|
|
// sound (self, CHAN_WEAPON, "boss1/out1.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
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');
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//setsize (newmis, VEC_HULL_MIN, VEC_HULL_MAX);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
if (!CheckArea(newmis,self)) { //No room for el diablo
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self,PRINT_HIGH,"Not enough room to summon creature!\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
newmis.think = SUB_Remove;
|
|
|
|
|
newmis.nextthink = time + 0.1;
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//self.job = self.job - (self.job & JOB_DEMON_OUT); // FIXME - This shouldn't be needed - OfN done
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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');
|
2001-07-23 20:52:47 +00:00
|
|
|
|
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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');
|
2001-07-23 20:52:47 +00:00
|
|
|
|
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
setsize (newmis, VEC_HULL2_MIN, VEC_HULL2_MAX);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
self.job = self.job | JOB_DEMON_OUT;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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)
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_BODY, "demon/sight2.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
newmis.velocity = v_forward * 10;// + '0 0 250';
|
|
|
|
|
newmis.angles = vectoangles(newmis.velocity);
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (newmis.flags & FL_ONGROUND)
|
|
|
|
|
newmis.flags = newmis.flags - FL_ONGROUND;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
newmis.velocity = v_forward * 10;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.movetype = MOVETYPE_TOSS;
|
|
|
|
|
newmis.solid = SOLID_SLIDEBOX;
|
|
|
|
|
newmis.takedamage = DAMAGE_AIM;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
if (self.demon_choice==1)
|
|
|
|
|
{
|
|
|
|
|
newmis.velocity='0 0 0';
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.movetype = MOVETYPE_STEP;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*if ( newmis.classname == "monster_hknight" )
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.health = HKNIGHT_HP; //WK 300
|
|
|
|
|
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You summon a hell knight.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
else if ( newmis.classname == "monster_knight" )
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.health = KNIGHT_HP; //WK 300
|
|
|
|
|
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You summon a knight.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}*/
|
|
|
|
|
if ( newmis.classname == "monster_demon1" )
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.health = DEMON_HP; //WK 300
|
|
|
|
|
newmis.armorclass = AT_SAVEFIRE; //AT_SAVESHOT | AT_SAVEFIRE;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You summon a fiend.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
else if ( newmis.classname == "monster_shambler" )
|
|
|
|
|
{
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.health = SHAMBLER_HP;//750 + points * 350; //WK 300
|
|
|
|
|
newmis.armorclass = 0;// ofn- AT_SAVEEXPLOSION | AT_SAVEMELEE;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You summon a shambler.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
newmis.health = SCRAG_HP;
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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;
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//newmis.armorclass = 0; //- OfN - none AT_SAVESHOT; // kevlar
|
2001-07-17 05:58:10 +00:00
|
|
|
|
newmis.last_saveme_sound = 0; // ? oh that
|
|
|
|
|
//newmis.touch = SUB_Null;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "You summon a scrag.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "demon/ddeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
self = oself;
|
|
|
|
|
te.think = SUB_Remove;
|
|
|
|
|
te.touch = SUB_Null;
|
|
|
|
|
te.nextthink = time + 0.1;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint(self, PRINT_HIGH, "Your fiend is dead.\n");
|
|
|
|
|
self.job = self.job - (self.job & JOB_DEMON_OUT);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
// 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
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "Your soldier is dead.\n");
|
|
|
|
|
self.job = self.job - (self.job & JOB_DEMON_OUT);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
|
|
|
|
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);
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "knight/kdeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
te.think = SUB_Remove;
|
|
|
|
|
te.touch = SUB_Null;
|
|
|
|
|
te.nextthink = time + 0.1;
|
|
|
|
|
self = oself;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//self.job = self.job - (self.job & JOB_DEMON_OUT);
|
|
|
|
|
sprint (self, PRINT_HIGH, "Your knight is dead.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//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);
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "hknight/death1.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
te.think = SUB_Remove;
|
|
|
|
|
te.touch = SUB_Null;
|
|
|
|
|
te.nextthink = time + 0.1;
|
|
|
|
|
self = oself;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//self.job = self.job - (self.job & JOB_DEMON_OUT);
|
|
|
|
|
sprint (self, PRINT_HIGH, "Your hell knight is dead.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//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);
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
te.think = SUB_Remove;
|
|
|
|
|
te.touch = SUB_Null;
|
|
|
|
|
te.nextthink = time + 0.1;
|
|
|
|
|
self = oself;
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
//self.job = self.job - (self.job & JOB_DEMON_OUT);
|
|
|
|
|
sprint (self, PRINT_HIGH, "Your shambler is dead.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//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);
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
te.think = SUB_Remove;
|
|
|
|
|
te.touch = SUB_Null;
|
|
|
|
|
te.nextthink = time + 0.1;
|
|
|
|
|
self = oself;
|
|
|
|
|
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
sprint (self, PRINT_HIGH, "Your scrag is dead.\n");
|
2001-07-17 05:58:10 +00:00
|
|
|
|
//TF_T_Damage(te, world, world, 4000, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
te = find(te, classname, "monster_wizard");
|
|
|
|
|
}
|
|
|
|
|
|
2001-07-23 20:52:47 +00:00
|
|
|
|
self.job = self.job - (self.job & JOB_DEMON_OUT);
|
2001-07-17 05:58:10 +00:00
|
|
|
|
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?
|
2001-07-23 20:52:47 +00:00
|
|
|
|
if (!(player.job & JOB_WARLOCK))
|
2001-07-17 05:58:10 +00:00
|
|
|
|
{
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|