mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-27 22:22:01 +00:00
1915 lines
45 KiB
C++
1915 lines
45 KiB
C++
void () monster_dog;
|
|
void () monster_zombie;
|
|
void () monster_tarbaby;
|
|
void () monster_army;
|
|
void () monster_ogre;
|
|
void () monster_wizard;
|
|
void () monster_knight;
|
|
void () monster_demon1;
|
|
void () monster_enforcer;
|
|
void () monster_shalrath;
|
|
void () monster_shambler;
|
|
void () monster_fish;
|
|
|
|
void (vector jojo) spawn_ghoul;
|
|
|
|
|
|
|
|
float (float int) getperk =
|
|
{
|
|
if (self.perk1 == int)
|
|
return TRUE;
|
|
else if (self.perk2 == int)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
};
|
|
|
|
void(float stnum, float sttype, .float fieldname) clientstat = #232;
|
|
void() SetupStats =
|
|
{
|
|
//2 is ev_float
|
|
//32 is the first stat we are allowed to use
|
|
clientstat(32, 2, islot1);
|
|
clientstat(33, 2, islot2);
|
|
clientstat(34, 2, islot3);
|
|
clientstat(35, 2, islot4);
|
|
clientstat(36, 2, islot5);
|
|
clientstat(37, 2, islot6);
|
|
clientstat(38, 2, islot7);
|
|
clientstat(39, 2, islot8);
|
|
clientstat(40, 2, islot9);
|
|
clientstat(41, 2, islot10);
|
|
clientstat(42, 2, islot11);
|
|
clientstat(43, 2, islot12);
|
|
clientstat(44, 2, islot13);
|
|
clientstat(45, 2, islot14);
|
|
clientstat(46, 2, islot15);
|
|
clientstat(47, 2, islot16);
|
|
clientstat(48, 2, health);
|
|
clientstat(49, 2, max_health);
|
|
clientstat(50, 2, ammo_shells);
|
|
clientstat(51, 2, ammo_cells);
|
|
clientstat(52, 2, weight);
|
|
clientstat(53, 2, max_weight);
|
|
clientstat(54, 2, position);
|
|
clientstat(55, 2, rage);
|
|
clientstat(56, 2, regen);
|
|
clientstat(57, 2, missionbrief);
|
|
clientstat(58, 2, sneak);
|
|
clientstat(59, 2, perk2);
|
|
clientstat(60, 2, perk1);
|
|
clientstat(61, 2, current_slot);
|
|
clientstat(62, 2, team);
|
|
clientstat(63, 2, shadowtime);
|
|
clientstat(64, 2, start_time);
|
|
clientstat(65, 2, location);
|
|
clientstat(66, 2, map_obj);
|
|
clientstat(67, 2, map_ent1);
|
|
clientstat(68, 2, map_ent2);
|
|
clientstat(69, 2, map_ent3);
|
|
clientstat(71, 2, xslot1);
|
|
clientstat(72, 2, xslot2);
|
|
clientstat(73, 2, xslot3);
|
|
clientstat(74, 2, xslot4);
|
|
clientstat(75, 2, xslot5);
|
|
clientstat(76, 2, xslot6);
|
|
clientstat(77, 2, xslot7);
|
|
clientstat(78, 2, xslot8);
|
|
clientstat(79, 2, xslot9);
|
|
clientstat(80, 2, xslot10);
|
|
clientstat(81, 2, xslot11);
|
|
clientstat(82, 2, xslot12);
|
|
clientstat(83, 2, xslot13);
|
|
clientstat(84, 2, xslot14);
|
|
clientstat(85, 2, xslot15);
|
|
clientstat(86, 2, xslot16);
|
|
clientstat(87, 2, xslot17);
|
|
clientstat(88, 2, xslot18);
|
|
clientstat(89, 2, xslot19);
|
|
clientstat(90, 2, xslot20);
|
|
clientstat(91, 2, islot17);
|
|
clientstat(92, 2, islot18);
|
|
clientstat(93, 2, islot19);
|
|
clientstat(94, 2, islot20);
|
|
clientstat(95, 2, islot21);
|
|
clientstat(96, 2, islot22);
|
|
clientstat(97, 2, islot23);
|
|
clientstat(98, 2, islot24);
|
|
clientstat(99, 2, recoil);
|
|
clientstat(100, 2, skill_combat);
|
|
clientstat(101, 2, skill_doctor);
|
|
clientstat(102, 2, skill_sneak);
|
|
clientstat(103, 2, skill_science);
|
|
clientstat(104, 2, skill_speech);
|
|
clientstat(105, 2, announcercache);
|
|
clientstat(106, 2, radiation);
|
|
clientstat(108, 2, safezone);
|
|
clientstat(109, 2, connected);
|
|
clientstat(110, 2, steadyaim);
|
|
clientstat(111, 2, perk1timer);
|
|
clientstat(112, 2, perk2timer);
|
|
clientstat(113, 2, endinfo1);
|
|
clientstat(114, 2, endinfo2);
|
|
clientstat(115, 2, endinfo3);
|
|
clientstat(125, 2, timer);
|
|
clientstat(126, 2, popup);
|
|
clientstat(127, 2, score);
|
|
|
|
|
|
};
|
|
|
|
//assesses all current players
|
|
void() get_difficulty =
|
|
{
|
|
local entity te;
|
|
local float cr;
|
|
local string rating;
|
|
|
|
//challenge rating system
|
|
//
|
|
//0-24 level of difficulty
|
|
//0 = barely equipped players
|
|
//6 = 1 player using best arms and armor
|
|
|
|
challenge_rating = 0;
|
|
|
|
te = find (world, classname, "player");
|
|
while (te)
|
|
{
|
|
challenge_rating += GetItemThreatLevel(ToIID(te.islot1));
|
|
challenge_rating += GetItemThreatLevel(ToIID(te.islot1));
|
|
challenge_rating += GetItemThreatLevel(ToIID(te.islot3));
|
|
|
|
te = te.chain;
|
|
}
|
|
|
|
};
|
|
|
|
void() load_monster =
|
|
{
|
|
local float x, y, z;
|
|
|
|
/*
|
|
if (infokey(world, "total") == "one")
|
|
bprint(2, "test - one player\n");
|
|
|
|
if (infokey(world, "total") == "two")
|
|
bprint(2, "test - two players\n");
|
|
|
|
if (infokey(world, "total") == "three")
|
|
bprint(2, "test - three players\n");
|
|
|
|
if (infokey(world, "total") == "four")
|
|
bprint(2, "test - four players\n");*/
|
|
|
|
/*
|
|
if (infokey(world, "total") == "one" && random()<0.40)
|
|
return;
|
|
|
|
if (infokey(world, "total") == "two" && random()<0.30)
|
|
return;
|
|
|
|
if (infokey(world, "total") == "three" && random()<0.20)
|
|
return;
|
|
|
|
if (infokey(world, "total") == "four" && random()<0.10)
|
|
return;*/
|
|
|
|
|
|
if (self.waterlevel >= 2)
|
|
return;
|
|
|
|
x = random()*100;
|
|
y = random()*100;
|
|
|
|
|
|
if (world.map_obj == OBJ_DEADTOWN)
|
|
{
|
|
self.zone = 1;
|
|
monster_zombie();
|
|
}
|
|
else if (x <= world.map_ent1_percent)
|
|
{
|
|
self.zone = 1;
|
|
|
|
|
|
monster_army();
|
|
|
|
|
|
}
|
|
else if (y <= world.map_ent2_percent)
|
|
{
|
|
self.zone = 1;
|
|
|
|
if (world.map_ent2 == 1)
|
|
monster_dog();
|
|
if (world.map_ent2 == 2)
|
|
monster_zombie();
|
|
if (world.map_ent2 == 3 || world.map_ent2 == 4)
|
|
monster_army();
|
|
if (world.map_ent2 == 5 || world.map_ent2 == 6)
|
|
monster_ogre();
|
|
if (world.map_ent2 == 7)
|
|
monster_army();
|
|
if (world.map_ent2 == 8)
|
|
monster_demon1();
|
|
if (world.map_ent2 == 9)
|
|
monster_demon1();
|
|
if (world.map_ent2 == 10)
|
|
monster_enforcer();
|
|
if (world.map_ent2 == 11)
|
|
monster_shalrath();
|
|
if (world.map_ent2 == 12)
|
|
monster_shambler();
|
|
}
|
|
else
|
|
{
|
|
self.zone = 1;
|
|
|
|
if (random()<0.10)
|
|
monster_dog();
|
|
else if (random()<0.10)
|
|
monster_zombie();
|
|
else if (random()<0.10)
|
|
monster_army();
|
|
else if (random()<0.10)
|
|
monster_ogre();
|
|
else if (random()<0.10)
|
|
monster_army();
|
|
else if (random()<0.10)
|
|
monster_army();
|
|
|
|
|
|
}
|
|
};
|
|
|
|
//the big one
|
|
//randomly generates map information
|
|
//objective, monsters, etc
|
|
//1=dog, 2=ghoul, 3=soldier, 4=mutant, 5=scrag, 6=knight, 7=deathclaw,8=shalrath
|
|
|
|
void() map_startup =
|
|
{
|
|
local float r, x, t, e1, e2, e3, d;
|
|
local string savemap;
|
|
|
|
if (s_map_obj != 0)
|
|
return;
|
|
|
|
r = random();
|
|
|
|
get_difficulty();
|
|
d = challenge_rating;
|
|
|
|
|
|
localcmd("serverinfo total zero\n");
|
|
|
|
if (infokey(world, "objective") == "return")
|
|
world.map_obj = 0;
|
|
if (infokey(world, "objective") == "hostage")
|
|
world.map_obj = 1;
|
|
if (infokey(world, "objective") == "supplies")
|
|
world.map_obj = 2;
|
|
if (infokey(world, "objective") == "shadow")
|
|
world.map_obj = 3;
|
|
if (infokey(world, "objective") == "deadtown")
|
|
world.map_obj = 4;
|
|
if (infokey(world, "objective") == "destroy")
|
|
world.map_obj = 5;
|
|
if (infokey(world, "objective") == "defuse")
|
|
world.map_obj = 6;
|
|
|
|
if (infokey(world, "objective") == "hostage")
|
|
time_left = 600;
|
|
if (infokey(world, "objective") == "supplies")
|
|
time_left = 600;
|
|
if (infokey(world, "objective") == "shadow")
|
|
time_left = 600;
|
|
if (infokey(world, "objective") == "deadtown")
|
|
time_left = 600;
|
|
if (infokey(world, "objective") == "destroy")
|
|
time_left = 600;
|
|
if (infokey(world, "objective") == "defuse")
|
|
time_left = 600;
|
|
|
|
/*
|
|
if (world.map_obj == 0)
|
|
savemap = "return";
|
|
if (world.map_obj == 1)
|
|
savemap = "hostage";
|
|
if (world.map_obj == 2)
|
|
savemap = "supplies";
|
|
if (world.map_obj == 3)
|
|
savemap = "shadow";
|
|
if (world.map_obj == 4)
|
|
savemap = "deadtown";
|
|
if (world.map_obj == 5)
|
|
savemap = "destroy";
|
|
if (world.map_obj == 6)
|
|
savemap = "defuse";
|
|
|
|
|
|
localcmd("serverinfo objective ");
|
|
localcmd(savemap);
|
|
localcmd("\n");*/
|
|
|
|
x = 100;
|
|
t = floor(30+random()*30);
|
|
x -= t;
|
|
|
|
world.map_ent1_percent = t;
|
|
|
|
t = floor(15+random()*15);
|
|
x -= t;
|
|
|
|
world.map_ent2_percent = t;
|
|
world.map_ent3_percent = x;
|
|
|
|
if (challenge_rating < 2)
|
|
{
|
|
world.map_ent1 = 2 + ceil(random()*6);
|
|
world.map_ent2 = ceil(random()*8);
|
|
world.map_ent3 = ceil(random()*8);
|
|
}
|
|
else if (challenge_rating < 4)
|
|
{
|
|
world.map_ent1 = 2 + ceil(random()*8);
|
|
world.map_ent2 = 4 + ceil(random()*6);
|
|
world.map_ent3 = 6 + ceil(random()*4);
|
|
}
|
|
else
|
|
{
|
|
world.map_ent1 = 4 + ceil(random()*8);
|
|
world.map_ent2 = 6 + ceil(random()*6);
|
|
world.map_ent3 = 8 + ceil(random()*4);
|
|
}
|
|
|
|
if (world.map_obj == OBJ_HOSTAGE)
|
|
world.map_ent2 = 5;
|
|
if (world.map_obj == OBJ_SUPPLY)
|
|
world.map_ent2 = 5;
|
|
if (world.map_obj == OBJ_SHADOW)
|
|
world.map_ent1 = 5;
|
|
if (world.map_obj == OBJ_DEADTOWN)
|
|
{
|
|
world.map_ent1 = 3;
|
|
world.map_ent2 = 3;
|
|
world.map_ent3 = 8;
|
|
}
|
|
if (world.map_obj == OBJ_DESTROY)
|
|
world.map_ent2 = 5;
|
|
if (world.map_obj == OBJ_DEFUSE)
|
|
{
|
|
world.map_ent1 = 7;
|
|
world.map_ent2 = 16;
|
|
world.map_ent3 = 7;
|
|
}
|
|
s_map_obj = world.map_obj;
|
|
s_ent1 = world.map_ent1;
|
|
s_ent2 = world.map_ent2;
|
|
s_ent3 = world.map_ent3;
|
|
s_p1 = world.map_ent1_percent;
|
|
s_p2 = world.map_ent2_percent;
|
|
s_p3 = world.map_ent3_percent;
|
|
|
|
};
|
|
|
|
|
|
void() InitBodyQue;
|
|
|
|
void() sci_think;
|
|
void() hostage_pain;
|
|
void() hostage_think;
|
|
void() hostage_die;
|
|
void(entity stuff) spawn_zombie;
|
|
void() GameControl;
|
|
void() RespawnPlayer;
|
|
|
|
|
|
|
|
void () create_referees =
|
|
{
|
|
newmis = spawn ();
|
|
newmis.owner = self;
|
|
newmis.movetype = MOVETYPE_NONE;
|
|
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.velocity = VEC_ORIGIN;
|
|
newmis.touch = SUB_Null;
|
|
setorigin (newmis, '0 0 -300');
|
|
newmis.nextthink = (time + WEAPON_SHOTGUN);
|
|
newmis.think = GameControl;
|
|
newmis.classname = "referee";
|
|
};
|
|
|
|
void() main =
|
|
{
|
|
dprint ("main function\n");
|
|
|
|
// these are just commands the the prog compiler to copy these files
|
|
|
|
precache_file ("progs.dat");
|
|
precache_file ("gfx.wad");
|
|
precache_file ("quake.rc");
|
|
precache_file ("default.cfg");
|
|
|
|
precache_file ("end1.bin");
|
|
precache_file2 ("end2.bin");
|
|
|
|
precache_file ("demo1.dem");
|
|
precache_file ("demo2.dem");
|
|
precache_file ("demo3.dem");
|
|
|
|
//
|
|
// these are all of the lumps from the cached.ls files
|
|
//
|
|
precache_file ("gfx/palette.lmp");
|
|
precache_file ("gfx/colormap.lmp");
|
|
|
|
precache_file2 ("gfx/pop.lmp");
|
|
|
|
precache_file ("gfx/complete.lmp");
|
|
precache_file ("gfx/inter.lmp");
|
|
|
|
precache_file ("gfx/ranking.lmp");
|
|
precache_file ("gfx/vidmodes.lmp");
|
|
precache_file ("gfx/finale.lmp");
|
|
precache_file ("gfx/conback.lmp");
|
|
precache_file ("gfx/qplaque.lmp");
|
|
|
|
precache_file ("gfx/menudot1.lmp");
|
|
precache_file ("gfx/menudot2.lmp");
|
|
precache_file ("gfx/menudot3.lmp");
|
|
precache_file ("gfx/menudot4.lmp");
|
|
precache_file ("gfx/menudot5.lmp");
|
|
precache_file ("gfx/menudot6.lmp");
|
|
|
|
precache_file ("gfx/menuplyr.lmp");
|
|
precache_file ("gfx/bigbox.lmp");
|
|
precache_file ("gfx/dim_modm.lmp");
|
|
precache_file ("gfx/dim_drct.lmp");
|
|
precache_file ("gfx/dim_ipx.lmp");
|
|
precache_file ("gfx/dim_tcp.lmp");
|
|
precache_file ("gfx/dim_mult.lmp");
|
|
precache_file ("gfx/mainmenu.lmp");
|
|
|
|
precache_file ("gfx/box_tl.lmp");
|
|
precache_file ("gfx/box_tm.lmp");
|
|
precache_file ("gfx/box_tr.lmp");
|
|
|
|
precache_file ("gfx/box_ml.lmp");
|
|
precache_file ("gfx/box_mm.lmp");
|
|
precache_file ("gfx/box_mm2.lmp");
|
|
precache_file ("gfx/box_mr.lmp");
|
|
|
|
precache_file ("gfx/box_bl.lmp");
|
|
precache_file ("gfx/box_bm.lmp");
|
|
precache_file ("gfx/box_br.lmp");
|
|
|
|
precache_file ("gfx/sp_menu.lmp");
|
|
precache_file ("gfx/ttl_sgl.lmp");
|
|
precache_file ("gfx/ttl_main.lmp");
|
|
precache_file ("gfx/ttl_cstm.lmp");
|
|
|
|
precache_file ("gfx/mp_menu.lmp");
|
|
|
|
precache_file ("gfx/netmen1.lmp");
|
|
precache_file ("gfx/netmen2.lmp");
|
|
precache_file ("gfx/netmen3.lmp");
|
|
precache_file ("gfx/netmen4.lmp");
|
|
precache_file ("gfx/netmen5.lmp");
|
|
|
|
precache_file ("gfx/sell.lmp");
|
|
|
|
precache_file ("gfx/help0.lmp");
|
|
precache_file ("gfx/help1.lmp");
|
|
precache_file ("gfx/help2.lmp");
|
|
precache_file ("gfx/help3.lmp");
|
|
precache_file ("gfx/help4.lmp");
|
|
precache_file ("gfx/help5.lmp");
|
|
|
|
precache_file ("gfx/pause.lmp");
|
|
precache_file ("gfx/loading.lmp");
|
|
|
|
precache_file ("gfx/p_option.lmp");
|
|
precache_file ("gfx/p_load.lmp");
|
|
precache_file ("gfx/p_save.lmp");
|
|
precache_file ("gfx/p_multi.lmp");
|
|
|
|
// sounds loaded by C code
|
|
precache_sound ("misc/menu1.wav");
|
|
precache_sound ("misc/menu2.wav");
|
|
precache_sound ("misc/menu3.wav");
|
|
|
|
precache_sound ("ambience/water1.wav");
|
|
precache_sound ("ambience/wind2.wav");
|
|
|
|
// shareware
|
|
precache_file ("maps/start.bsp");
|
|
|
|
precache_file ("maps/e1m1.bsp");
|
|
precache_file ("maps/e1m2.bsp");
|
|
precache_file ("maps/e1m3.bsp");
|
|
precache_file ("maps/e1m4.bsp");
|
|
precache_file ("maps/e1m5.bsp");
|
|
precache_file ("maps/e1m6.bsp");
|
|
precache_file ("maps/e1m7.bsp");
|
|
precache_file ("maps/e1m8.bsp");
|
|
|
|
// registered
|
|
precache_file2 ("gfx/pop.lmp");
|
|
|
|
precache_file2 ("maps/e2m1.bsp");
|
|
precache_file2 ("maps/e2m2.bsp");
|
|
precache_file2 ("maps/e2m3.bsp");
|
|
precache_file2 ("maps/e2m4.bsp");
|
|
precache_file2 ("maps/e2m5.bsp");
|
|
precache_file2 ("maps/e2m6.bsp");
|
|
precache_file2 ("maps/e2m7.bsp");
|
|
|
|
precache_file2 ("maps/e3m1.bsp");
|
|
precache_file2 ("maps/e3m2.bsp");
|
|
precache_file2 ("maps/e3m3.bsp");
|
|
precache_file2 ("maps/e3m4.bsp");
|
|
precache_file2 ("maps/e3m5.bsp");
|
|
precache_file2 ("maps/e3m6.bsp");
|
|
precache_file2 ("maps/e3m7.bsp");
|
|
|
|
precache_file2 ("maps/e4m1.bsp");
|
|
precache_file2 ("maps/e4m2.bsp");
|
|
precache_file2 ("maps/e4m3.bsp");
|
|
precache_file2 ("maps/e4m4.bsp");
|
|
precache_file2 ("maps/e4m5.bsp");
|
|
precache_file2 ("maps/e4m6.bsp");
|
|
precache_file2 ("maps/e4m7.bsp");
|
|
precache_file2 ("maps/e4m8.bsp");
|
|
|
|
precache_file2 ("maps/end.bsp");
|
|
|
|
precache_file2 ("maps/dm1.bsp");
|
|
precache_file2 ("maps/dm2.bsp");
|
|
precache_file2 ("maps/dm3.bsp");
|
|
precache_file2 ("maps/dm4.bsp");
|
|
precache_file2 ("maps/dm5.bsp");
|
|
precache_file2 ("maps/dm6.bsp");
|
|
};
|
|
|
|
entity() SelectSpawnPoint;
|
|
|
|
void () RespawnPlayer =
|
|
{
|
|
local entity spot;
|
|
|
|
bprint(2, "test\n");
|
|
spot = SelectSpawnPoint ();
|
|
self.origin = spot.origin + '0 0 1';
|
|
self.angles = spot.angles;
|
|
|
|
self.deadflag = DEAD_NO;
|
|
self.takedamage = DAMAGE_AIM;
|
|
self.movetype = MOVETYPE_WALK;
|
|
self.solid = SOLID_NOT;
|
|
self.materialize = 200;
|
|
self.ghost = 0;
|
|
self.air_finished = time + 10;
|
|
self.view_ofs = '0 0 22';
|
|
self.health = self.max_health;
|
|
|
|
player_run();
|
|
};
|
|
|
|
void () ResetMap =
|
|
{
|
|
local entity te;
|
|
|
|
te = find(world, classname, "player");
|
|
while (te)
|
|
{
|
|
te.nextthink = time + 1;
|
|
te.think = RespawnPlayer;
|
|
|
|
te = find(te, classname, "player");
|
|
}
|
|
|
|
};
|
|
|
|
|
|
void () GameControl =
|
|
{
|
|
local float pcount, pdead, hcount, hdead, bcount;
|
|
local entity te, ze;
|
|
|
|
if (world.model == "maps/r_bunker.bsp")
|
|
return;
|
|
|
|
if (world.model == "maps/r_wastes1.bsp")
|
|
return;
|
|
|
|
if (random()<0.05)
|
|
sound (self, CHAN_AUTO, "ambience/gunfire1.wav", 0.75, ATTN_NONE);
|
|
else if (random()<0.05)
|
|
sound (self, CHAN_AUTO, "ambience/gunfire5.wav", 0.75, ATTN_NONE);
|
|
|
|
if (coop == 1) // Players vs Monsters
|
|
{
|
|
local float combat;
|
|
|
|
combat = 0;
|
|
|
|
if (random()*100<25);
|
|
get_difficulty();
|
|
|
|
te = find(world, classname, "monster");
|
|
while (te)
|
|
{
|
|
|
|
if (te.enemy != world && te.enemy.classname == "player" && te.health > 0)
|
|
combat = 1;
|
|
|
|
te = find(te, classname, "monster");
|
|
}
|
|
/*
|
|
if (musicplay == 0)
|
|
{
|
|
musicplay = 1;
|
|
musictrack = 1;
|
|
|
|
if (world.map_obj == OBJ_DEADTOWN)
|
|
musictrack = 2;
|
|
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
if (musictrack == 1)
|
|
stuffcmd(ze, "play music/battle_a\n");
|
|
if (musictrack == 2)
|
|
stuffcmd(ze, "play music/zombies\n");
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
|
|
}
|
|
else if (musicplay < 120)
|
|
musicplay = musicplay + 1;
|
|
else if (musicplay >= 120)
|
|
musicplay = 0;*/
|
|
|
|
te = find(world, classname, "player");
|
|
while (te)
|
|
{
|
|
|
|
if (te.health > 0 && te.team > 0)
|
|
pcount = pcount + 1;
|
|
if (te.health <= 0)
|
|
pdead = pdead + 1;
|
|
|
|
te = find(te, classname, "player");
|
|
}
|
|
|
|
if (pcount == 0 && self.timer > 5)
|
|
localcmd("restart\n");
|
|
|
|
|
|
if (endgame_timer > 0)
|
|
{
|
|
ze = find (world, classname, "monster");
|
|
while (ze != world)
|
|
{
|
|
remove(ze);
|
|
|
|
|
|
ze = find (ze, classname, "monster");
|
|
}
|
|
}
|
|
|
|
if (world.map_obj == OBJ_HOSTAGE || world.map_obj == OBJ_DEADTOWN)
|
|
{
|
|
time_left = time_left - 1;
|
|
|
|
te = find(world, classname, "rhostage");
|
|
while (te)
|
|
{
|
|
|
|
if (te.health > 0 && te.rescued == 0)
|
|
hcount = hcount + 1;
|
|
if (te.health <= 0)
|
|
hdead = hdead + 1;
|
|
|
|
te = find(te, classname, "rhostage");
|
|
}
|
|
|
|
hostages = hcount;
|
|
dead_hostage = hdead;
|
|
|
|
if (pcount == 0 && pdead > 0) //everyone died
|
|
{
|
|
announcer = "all players were slain";
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 1;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
if (endgame_timer == 5)
|
|
localcmd("restart\n");
|
|
|
|
sound (world, CHAN_BODY, "misc/menu3.wav", 1, ATTN_NONE);
|
|
}
|
|
else if (hdead > rescue + hcount) //hostages killed
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 2;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 5)
|
|
localcmd("restart\n");
|
|
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
else if (hcount == 0 && hdead <= rescue) //hostages rescued
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 3;
|
|
ze.ammo_shells = ze.ammo_shells + (5*rescue);
|
|
ze.endinfo1 = rescue;
|
|
ze.endinfo2 = hostages;
|
|
ze.endinfo3 = dead_hostage;
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
else if (time_left <= 0 && rescue > 0) //time ran out and at least one was rescued
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 4;
|
|
ze.ammo_shells = ze.ammo_shells + (5*rescue);
|
|
ze.endinfo1 = rescue;
|
|
ze.endinfo2 = hostages;
|
|
ze.endinfo3 = dead_hostage;
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer >= 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
else if (time_left <= 0 && rescue == 0) //time ran out and no rescues were made
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 5;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer >= 10)
|
|
localcmd("restart\n");
|
|
}
|
|
if (pcount == 0 && pdead > 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (hcount == 0 && hdead <= rescue)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (time_left <= 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
else if (world.map_obj == OBJ_DEFUSE)
|
|
{
|
|
time_left = time_left - 1;
|
|
|
|
bcount = 0;
|
|
|
|
te = find(world, classname, "bomb");
|
|
while (te)
|
|
{
|
|
if (self.owner.picking != 2)
|
|
bcount = bcount + 1;
|
|
|
|
te = find(te, classname, "bomb");
|
|
}
|
|
|
|
if (pcount == 0 && pdead > 0) //everyone died
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 1;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
|
|
}
|
|
else if (bcount == 0) //bombs defused
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 6;
|
|
ze.ammo_shells = ze.ammo_shells + 30;
|
|
|
|
|
|
stuffcmd(ze, "play music/victory\n");
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
|
|
if (endgame_timer == 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
else if (time_left <= 0) //time ran out
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 7;
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 5)
|
|
localcmd("restart\n");
|
|
}
|
|
if (pcount == 0 && pdead > 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (bcount == 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (self.timer >= 300)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (time_left <= 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
else if (world.map_obj == OBJ_SUPPLY)
|
|
{
|
|
time_left = time_left - 1;
|
|
|
|
if (pcount == 0 && pdead > 0) //everyone died
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 1;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
|
|
}
|
|
else if (time_left <= 0) //time ran out
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 8;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
|
|
}
|
|
else if (supplies == 0) //supplies secured
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 9;
|
|
ze.ammo_shells = ze.ammo_shells + 30;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer >= 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
if (pcount == 0 && pdead > 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (supplies == 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (time_left <= 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
else if (world.map_obj == OBJ_SHADOW)
|
|
{
|
|
time_left = time_left - 1;
|
|
|
|
if (pcount == 0 && pdead > 0) //everyone died
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 1;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
}
|
|
else if (commanders == 0) //commanders assassinated
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 10;
|
|
ze.ammo_shells = ze.ammo_shells + 40;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
else if (time_left <= 0) //time ran out
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 11;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
}
|
|
else if (called_in >= 5) //soldier radioed in
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 12;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
}
|
|
|
|
if (pcount == 0 && pdead > 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (called_in >= 5)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (time_left <= 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
else if (world.map_obj == OBJ_DESTROY)
|
|
{
|
|
time_left = time_left - 1;
|
|
|
|
if (pcount == 0 && pdead > 0 && called_in == 0) //everyone died
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 1;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
localcmd("restart\n");
|
|
|
|
}
|
|
else if (supplies == 0) //fuel tanks destroyed
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 13;
|
|
ze.ammo_shells = ze.ammo_shells + 30;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
else if (time_left <= 0) //time ran out
|
|
{
|
|
if (endgame_timer == 0)
|
|
{
|
|
ze = find (world, classname, "player");
|
|
while (ze != world)
|
|
{
|
|
ze.missionbrief = 3;
|
|
ze.announcercache = 14;
|
|
|
|
|
|
ze = find (ze, classname, "player");
|
|
}
|
|
}
|
|
if (endgame_timer == 10)
|
|
{
|
|
localcmd("serverinfo objective return\n");
|
|
changelevel ("r_bunker");
|
|
}
|
|
}
|
|
|
|
if (pcount == 0 && pdead > 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (supplies == 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
else if (time_left <= 0)
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
self.think = GameControl;
|
|
self.nextthink = time + 1;
|
|
return;
|
|
}
|
|
else if (coop == 0) // Players vs Players
|
|
{
|
|
t1alive = 0;
|
|
t1dead = 0;
|
|
t2alive = 0;
|
|
t2dead = 0;
|
|
|
|
pcount = 0;
|
|
pdead = 0;
|
|
|
|
bprint(2, "gc test\n");
|
|
|
|
te = find(world, classname, "player");
|
|
while (te)
|
|
{
|
|
|
|
if (te.health > 0)
|
|
pcount = pcount + 1;
|
|
if (te.health <= 0)
|
|
pdead = pdead + 1;
|
|
|
|
te = find(te, classname, "player");
|
|
}
|
|
|
|
if (pcount == 0 || (pcount == 1 && pdead == 0))
|
|
{
|
|
bprint(2, "^4** ^bTHE ROUND WILL NOT BEGIN UNTIL^b **\n");
|
|
bprint(2, "^4** ^bBOTH TEAMS HAVE ENOUGH PLAYERS^b **\n");
|
|
self.think = GameControl;
|
|
self.nextthink = time + 10;
|
|
return;
|
|
}
|
|
|
|
te = find(world, classname, "player");
|
|
while (te)
|
|
{
|
|
if (te.team == 1)
|
|
{
|
|
if (te.health > 0)
|
|
t1alive = t1alive + 1;
|
|
if (te.health <= 0)
|
|
t1dead = t1dead + 1;
|
|
}
|
|
if (te.team == 2)
|
|
{
|
|
if (te.health > 0)
|
|
t2alive = t2alive + 1;
|
|
if (te.health <= 0)
|
|
t2dead = t2dead + 1;
|
|
}
|
|
te = find(te, classname, "player");
|
|
}
|
|
|
|
if (t1alive > 0 && t2alive == 0) //team 1 has won
|
|
{
|
|
self.think = GameControl;
|
|
self.nextthink = time + 1;
|
|
|
|
if (endgame_timer == 0)
|
|
bprint(2, "^4** ^bTHE RANGERS HAVE WON!^b **\n");
|
|
if (endgame_timer == 1)
|
|
bprint(2, "^4** ^bTHIS MAP WILL RESTART^b **\n");
|
|
if (endgame_timer == 5)
|
|
ResetMap();
|
|
|
|
winningteam = 1;
|
|
sound (world, CHAN_BODY, "misc/yourturn.wav", 1, ATTN_NONE);
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
if (t2alive > 0 && t1alive == 0) //team 2 has won
|
|
{
|
|
self.think = GameControl;
|
|
self.nextthink = time + 1;
|
|
|
|
if (endgame_timer == 0)
|
|
bprint(2, "^4** ^bTHE RAIDERS HAVE WON!^b **\n");
|
|
if (endgame_timer == 1)
|
|
bprint(2, "^4** ^bTHIS MAP WILL RESTART^b **\n");
|
|
if (endgame_timer == 5)
|
|
ResetMap();
|
|
|
|
winningteam = 2;
|
|
sound (world, CHAN_BODY, "misc/yourturn.wav", 1, ATTN_NONE);
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
if (t2alive == 0 && t1alive == 0) //team 2 has won
|
|
{
|
|
self.think = GameControl;
|
|
self.nextthink = time + 1;
|
|
|
|
if (endgame_timer == 0)
|
|
bprint(2, "^4** ^bBOTH SIDES ARE DEFEATED!^b **\n");
|
|
if (endgame_timer == 1)
|
|
bprint(2, "^4** ^bTHIS MAP WILL RESTART^b **\n");
|
|
if (endgame_timer == 5)
|
|
ResetMap();
|
|
|
|
winningteam = 0;
|
|
sound (world, CHAN_BODY, "misc/yourturn.wav", 1, ATTN_NONE);
|
|
endgame_timer = endgame_timer + 1;
|
|
}
|
|
|
|
self.think = GameControl;
|
|
self.nextthink = time + 1;
|
|
return;
|
|
}
|
|
};
|
|
|
|
void () GameTimer =
|
|
{
|
|
local entity te, ze;
|
|
local float switched;
|
|
local float c, z;
|
|
|
|
|
|
switched = 0;
|
|
|
|
te = findradius(self.origin, 25000);
|
|
while (c < 300 && switched == 0)
|
|
{
|
|
if (te.classname == "raider" && te.enemy != world && te.processed == 0 && te.active == 0 && switched == 0)
|
|
{
|
|
te.active = 1;
|
|
te.processed = 1;
|
|
bprint(2, "it is now ");
|
|
bprint(2, te.netname);
|
|
bprint(2, "'s turn.\n");
|
|
te.maxspeed = 300;
|
|
switched = 1;
|
|
|
|
ze = findradius(self.origin, 25000);
|
|
z = 0;
|
|
while (z < 300)
|
|
{
|
|
if ((ze.classname == "player" || ze.classname == "raider") && ze != te)
|
|
{
|
|
ze.active = 0;
|
|
ze.maxspeed = 0;
|
|
}
|
|
z = z + 1;
|
|
ze = ze.chain;
|
|
}
|
|
}
|
|
if (te.classname == "player" && te.processed == 0 && te.active == 0 && switched == 0)
|
|
{
|
|
te.active = 1;
|
|
te.processed = 1;
|
|
bprint(2, "it is now ");
|
|
bprint(2, te.netname);
|
|
bprint(2, "'s turn.\n");
|
|
te.maxspeed = 300;
|
|
switched = 1;
|
|
|
|
ze = findradius(self.origin, 25000);
|
|
z = 0;
|
|
while (z < 300)
|
|
{
|
|
if ((ze.classname == "player" || ze.classname == "raider") && ze != te)
|
|
{
|
|
ze.active = 0;
|
|
ze.maxspeed = 0;
|
|
}
|
|
z = z + 1;
|
|
ze = ze.chain;
|
|
}
|
|
}
|
|
c = c + 1;
|
|
te = te.chain;
|
|
}
|
|
|
|
c = 0;
|
|
if (switched == 0) // no entities left, turn is over
|
|
{
|
|
bprint(2, "round is now over.\n");
|
|
|
|
te = findradius(self.origin, 25000);
|
|
while (c < 300)
|
|
{
|
|
if (te.classname == "player" || te.classname == "raider")
|
|
{
|
|
te.active = 0;
|
|
te.processed = 0;
|
|
te.maxspeed = 0;
|
|
}
|
|
|
|
c = c + 1;
|
|
te = te.chain;
|
|
}
|
|
}
|
|
|
|
self.think = GameTimer;
|
|
self.nextthink = time + 1;
|
|
};
|
|
|
|
void () create_timer =
|
|
{
|
|
newmis = spawn ();
|
|
newmis.owner = self;
|
|
newmis.movetype = MOVETYPE_NONE;
|
|
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.velocity = VEC_ORIGIN;
|
|
newmis.touch = SUB_Null;
|
|
setorigin (newmis, '0 0 -300');
|
|
newmis.nextthink = (time + 1);
|
|
newmis.think = GameTimer;
|
|
newmis.classname = "referee";
|
|
};
|
|
|
|
|
|
void () RecoilControl =
|
|
{
|
|
local entity te, ze;
|
|
local float switched;
|
|
local float c, z;
|
|
|
|
|
|
self.think = RecoilControl;
|
|
self.nextthink = time + 0.01;
|
|
|
|
te = find (world, classname, "player");
|
|
|
|
while (te)
|
|
{
|
|
|
|
//superstims: heal at an incredible rate!
|
|
if ((te.xregen > 0 && te.health < te.max_health) && random()<0.5)
|
|
{
|
|
te.health = te.health + 1;
|
|
te.xregen = te.xregen - 1;
|
|
|
|
if (te.health > te.max_health)
|
|
te.health = te.max_health;
|
|
}
|
|
|
|
//superstims: decay if not healing
|
|
|
|
if ((te.xregen > 0 && te.health >= te.max_health) && random()<0.05)
|
|
{
|
|
te.xregen = te.xregen - 1;
|
|
|
|
if (te.health > te.max_health)
|
|
te.health = te.max_health;
|
|
}
|
|
|
|
//steady aim: for living anatomy, and aimed shots by standing still
|
|
if (te.recoil != 0)
|
|
te.steadyaim = 6;
|
|
else if (te.recoil == 0 && te.steadyaim > 0)
|
|
te.steadyaim = te.steadyaim - 0.05;
|
|
|
|
|
|
if (te.steadyaim <= 0)
|
|
te.steadyaim = 0;
|
|
|
|
|
|
if (te.pain_finished < time && te.missionbrief == 6) // remove pain
|
|
te.missionbrief = 0;
|
|
else if (te.flash < time && te.missionbrief == 5) // remove flash
|
|
te.missionbrief = 0;
|
|
else if (te.currentmenu == "menu_none" && te.missionbrief == 4) // remove shop
|
|
te.missionbrief = 0;
|
|
if (te.velocity == '0 0 0')
|
|
{
|
|
if (te.attack == 0)
|
|
{
|
|
if (te.driftx >= 1)
|
|
te.driftx = te.driftx - 1;
|
|
if (te.driftx <= -1)
|
|
te.driftx = te.driftx + 1;
|
|
|
|
if (te.drifty >= 1)
|
|
te.drifty = te.drifty - 1;
|
|
if (te.drifty <= -1)
|
|
te.drifty = te.drifty + 1;
|
|
|
|
}
|
|
|
|
|
|
te.recoil = te.recoil - (0.10+(te.skill_combat*0.01));
|
|
}
|
|
else
|
|
{
|
|
if (te.attack == 0)
|
|
{
|
|
if (te.driftx >= 0.5)
|
|
te.driftx = te.driftx - 0.5;
|
|
if (te.driftx <= -0.5)
|
|
te.driftx = te.driftx + 0.5;
|
|
|
|
if (te.drifty >= 0.5)
|
|
te.drifty = te.drifty - 0.5;
|
|
if (te.drifty <= -0.5)
|
|
te.drifty = te.drifty + 0.5;
|
|
}
|
|
|
|
}
|
|
|
|
if (te.driftx > 250)
|
|
te.driftx = 250;
|
|
if (te.drifty > 250)
|
|
te.drifty = 250;
|
|
|
|
//support fire: going prone gives a -10 recoil bonus with this perk
|
|
if (getperk(1) && self.position == 2 && te.recoil > 3)
|
|
{
|
|
te.recoil = te.recoil - 0.20;
|
|
te.driftx = te.driftx * 0.5;
|
|
te.drifty = te.drifty * 0.5;
|
|
}
|
|
|
|
//prone: going prone gives a -5 recoil bonus
|
|
|
|
if (self.position == 2)
|
|
te.recoil = te.recoil - 0.05;
|
|
|
|
if (te.recoil <= 0)
|
|
{
|
|
te.recoil = 0;
|
|
te.driftx = 0;
|
|
te.drifty = 0;
|
|
}
|
|
|
|
te = find (te, classname, "player");
|
|
}
|
|
};
|
|
|
|
void () recoil_control =
|
|
{
|
|
newmis = spawn ();
|
|
newmis.owner = self;
|
|
newmis.movetype = MOVETYPE_NONE;
|
|
setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.velocity = VEC_ORIGIN;
|
|
newmis.touch = SUB_Null;
|
|
setorigin (newmis, '0 0 -300');
|
|
newmis.nextthink = (time + 1);
|
|
newmis.think = RecoilControl;
|
|
newmis.classname = "recoil";
|
|
};
|
|
|
|
entity lastspawn;
|
|
|
|
//=======================
|
|
/*QUAKED worldspawn (0 0 0) ?
|
|
Only used for the world entity.
|
|
Set message to the level name.
|
|
Set sounds to the cd track to play.
|
|
|
|
World Types:
|
|
0: medieval
|
|
1: metal
|
|
2: base
|
|
*/
|
|
//=======================
|
|
void() worldspawn =
|
|
{
|
|
local entity te;
|
|
local string x;
|
|
|
|
lastspawn = world;
|
|
InitBodyQue ();
|
|
coop = !cvar("deathmatch");
|
|
recoil_control();
|
|
create_referees();
|
|
SetupStats();
|
|
|
|
// custom map attributes
|
|
|
|
cvar_set ("skill", "3");
|
|
|
|
world.location = ceil(random()*5);
|
|
|
|
total_players = 0;
|
|
|
|
te = find (world, classname, "player");
|
|
while (te)
|
|
{
|
|
if (te.classname == "player")
|
|
total_players = total_players + 1;
|
|
|
|
te = find(te, classname, "player");
|
|
}
|
|
|
|
map_startup();
|
|
// the area based ambient sounds MUST be the first precache_sounds
|
|
|
|
// player precaches
|
|
W_Precache (); // get weapon precaches
|
|
|
|
// sounds used from C physics code
|
|
precache_sound ("demon/dland2.wav"); // landing thud
|
|
precache_sound ("misc/h2ohit1.wav"); // landing splash
|
|
|
|
// setup precaches allways needed
|
|
precache_sound ("player/plyrjmp8.wav"); // player jump
|
|
precache_sound ("player/land.wav"); // player landing
|
|
precache_sound ("player/land2.wav"); // player hurt landing
|
|
precache_sound ("player/drown1.wav"); // drowning pain
|
|
precache_sound ("player/drown2.wav"); // drowning pain
|
|
precache_sound ("player/gasp1.wav"); // gasping for air
|
|
precache_sound ("player/gasp2.wav"); // taking breath
|
|
precache_sound ("player/h2odeath.wav"); // drowning death
|
|
|
|
precache_sound ("radio/9_secure.wav"); // drowning death
|
|
precache_sound ("misc/talk.wav"); // talk
|
|
precache_sound ("player/teledth1.wav"); // telefrag
|
|
|
|
precache_sound ("items/inv1.wav");
|
|
precache_sound ("weapons/lock4.wav"); // ammo pick up
|
|
precache_sound ("weapons/pkup.wav"); // weapon up
|
|
precache_sound ("items/damage3.wav");
|
|
|
|
precache_sound ("misc/power.wav"); //lightning for boss
|
|
|
|
// player gib sounds
|
|
precache_sound ("player/gib.wav"); // player gib sound
|
|
precache_sound ("player/udeath.wav"); // player gib sound
|
|
precache_sound ("player/tornoff2.wav"); // gib sound
|
|
|
|
// player pain sounds
|
|
|
|
precache_sound ("player/pain1.wav");
|
|
precache_sound ("player/pain2.wav");
|
|
precache_sound ("player/pain3.wav");
|
|
precache_sound ("player/pain4.wav");
|
|
precache_sound ("player/pain5.wav");
|
|
precache_sound ("player/pain6.wav");
|
|
|
|
precache_sound ("boss1/sight1.wav");
|
|
|
|
// ax sounds
|
|
precache_sound ("weapons/knifehit.wav"); // ax swoosh
|
|
precache_sound ("weapons/ax1.wav"); // ax swoosh
|
|
precache_sound ("player/axhit1.wav"); // ax hit meat
|
|
precache_sound ("player/axhit2.wav"); // ax hit world
|
|
precache_sound ("weapons/brawl-1.wav"); // ax hit world
|
|
precache_sound ("weapons/brawl-2.wav"); // ax hit world
|
|
|
|
precache_sound ("player/h2ojump.wav"); // player jumping into water
|
|
precache_sound ("player/slimbrn2.wav"); // player enter slime
|
|
precache_sound ("player/inh2o.wav"); // player enter water
|
|
precache_sound ("player/inlava.wav"); // player enter lava
|
|
precache_sound ("misc/outwater.wav"); // leaving water sound
|
|
|
|
precache_sound ("player/lburn1.wav"); // lava burn
|
|
precache_sound ("player/lburn2.wav"); // lava burn
|
|
|
|
precache_sound ("misc/water1.wav"); // swimming
|
|
precache_sound ("misc/water2.wav"); // swimming
|
|
|
|
// Invulnerability sounds
|
|
precache_sound ("items/protect.wav");
|
|
precache_sound ("items/protect2.wav");
|
|
precache_sound ("items/protect3.wav");
|
|
|
|
precache_model ("progs/melee.mdl");
|
|
precache_model ("progs/guy.mdl");
|
|
precache_model ("progs/lay.mdl");
|
|
precache_model ("progs/prone.mdl");
|
|
precache_model ("progs/eyes.mdl");
|
|
precache_model ("progs/h_player.mdl");
|
|
precache_model ("progs/gib1.mdl");
|
|
precache_model ("progs/gib2.mdl");
|
|
precache_model ("progs/gib3.mdl");
|
|
|
|
precache_model ("progs/s_bubble.spr"); // drowning bubbles
|
|
precache_model ("progs/s_explod.spr"); // sprite explosion
|
|
precache_model ("progs/ammobox.mdl");
|
|
precache_model ("progs/ammobox2.mdl");
|
|
precache_model ("progs/stop.spr");
|
|
precache_model ("progs/healing.spr");
|
|
precache_model ("progs/heart.spr");
|
|
|
|
precache_model ("progs/v_disruptor.mdl");
|
|
precache_model ("progs/v_span.mdl");
|
|
precache_model ("progs/v_nail.mdl");
|
|
precache_model ("progs/v_rock.mdl");
|
|
precache_model ("progs/v_nail2.mdl");
|
|
precache_model ("progs/v_rock2.mdl");
|
|
precache_model ("progs/v_fist.mdl");
|
|
precache_model ("progs/v_knife.mdl");
|
|
precache_model ("progs/v_spear.mdl");
|
|
precache_model ("progs/v_usp.mdl");
|
|
precache_model ("progs/v_needler.mdl");
|
|
precache_model ("progs/v_10mmpistol.mdl");
|
|
precache_model ("progs/v_fnfal.mdl");
|
|
precache_model ("progs/v_smg.mdl");
|
|
precache_model ("progs/v_rangem.mdl");
|
|
precache_model ("progs/v_pipe.mdl");
|
|
precache_model ("progs/v_bozar.mdl");
|
|
precache_model ("progs/v_lsw.mdl");
|
|
precache_model ("progs/v_double.mdl");
|
|
precache_model ("progs/v_combat.mdl");
|
|
precache_model ("progs/v_mp9.mdl");
|
|
precache_model ("progs/v_g11.mdl");
|
|
precache_model ("progs/v_ak47.mdl");
|
|
precache_model ("progs/v_acr.mdl");
|
|
precache_model ("progs/v_deagle.mdl");
|
|
precache_model ("progs/v_blaster.mdl");
|
|
precache_model ("progs/v_srifle.mdl");
|
|
precache_model ("progs/v_night.mdl");
|
|
precache_model ("progs/v_handgren.mdl");
|
|
precache_model ("progs/v_jackhammer.mdl");
|
|
precache_model ("progs/v_rocket.mdl");
|
|
precache_model ("progs/v_pipe.mdl");
|
|
precache_model ("progs/v_gauss.mdl");
|
|
precache_model ("progs/v_carbine.mdl");
|
|
precache_model ("progs/v_plasma.mdl");
|
|
precache_model ("progs/v_scope1.mdl");
|
|
precache_model ("progs/v_scope2.mdl");
|
|
precache_model ("progs/v_chain.mdl");
|
|
precache_model ("progs/g_spear.mdl");
|
|
precache_model ("progs/g_knife.mdl");
|
|
precache_model ("progs/g_axe.mdl");
|
|
precache_model ("progs/g_wrench.mdl");
|
|
|
|
precache_model ("progs/junk1.mdl");
|
|
precache_model ("progs/junk2.mdl");
|
|
precache_model ("progs/hosfem.mdl");
|
|
precache_model ("progs/hosguy.mdl");
|
|
precache_model ("progs/handgren.mdl");
|
|
precache_model ("progs/plasma.mdl");
|
|
precache_model ("progs/ray.mdl");
|
|
precache_model ("progs/sneak.mdl");
|
|
precache_model ("progs/dead.mdl");
|
|
precache_model ("progs/hbar.spr");
|
|
precache_model ("progs/blast.mdl");
|
|
precache_model ("progs/ray.mdl");
|
|
precache_model ("progs/radio.spr");
|
|
|
|
|
|
precache_model ("progs/w_spear.mdl");
|
|
precache_model ("progs/w_span.mdl");
|
|
precache_model ("progs/w_knife.mdl");
|
|
precache_model ("progs/w_pipe.mdl");
|
|
precache_model ("progs/w_double.mdl");
|
|
precache_model ("progs/w_combat.mdl");
|
|
precache_model ("progs/w_axe.mdl");
|
|
precache_model ("progs/w_10mmpistol.mdl");
|
|
precache_model ("progs/w_usp.mdl");
|
|
precache_model ("progs/w_deagle.mdl");
|
|
precache_model ("progs/w_alien.mdl");
|
|
precache_model ("progs/w_mp9.mdl");
|
|
precache_model ("progs/w_jackhammer.mdl");
|
|
precache_model ("progs/w_rangem.mdl");
|
|
precache_model ("progs/w_g11.mdl");
|
|
precache_model ("progs/w_acr.mdl");
|
|
precache_model ("progs/w_ak47.mdl");
|
|
precache_model ("progs/w_night.mdl");
|
|
precache_model ("progs/w_srifle.mdl");
|
|
precache_model ("progs/w_gauss.mdl");
|
|
precache_model ("progs/w_carbine.mdl");
|
|
precache_model ("progs/w_laser.mdl");
|
|
precache_model ("progs/w_rocket.mdl");
|
|
precache_model ("progs/w_plasma.mdl");
|
|
precache_model ("progs/w_chain.mdl");
|
|
precache_model ("progs/w_bozar.mdl");
|
|
precache_model ("progs/money.mdl");
|
|
|
|
|
|
precache_model ("progs/grenade2.mdl");
|
|
precache_model ("maps/b_bh10.bsp");
|
|
precache_model ("maps/b_bh25.bsp");
|
|
precache_model ("maps/b_bh100.bsp");
|
|
precache_model ("progs/s_light.spr");
|
|
|
|
precache_sound ("misc/basekey.wav");
|
|
precache_sound ("misc/thud.wav");
|
|
precache_sound ("misc/exp1.wav");
|
|
precache_sound ("misc/exp2.wav");
|
|
precache_sound ("misc/exp3.wav");
|
|
precache_sound ("effects/openlock.wav");
|
|
precache_sound ("effects/miss.wav");
|
|
precache_sound ("effects/radio1.wav");
|
|
precache_sound ("effects/radio2.wav");
|
|
precache_sound ("effects/radio3.wav");
|
|
precache_sound ("effects/radio4.wav");
|
|
precache_sound ("effects/blip1.wav");
|
|
precache_sound ("effects/blip2.wav");
|
|
precache_sound ("effects/axe_hit1.wav");
|
|
precache_sound ("effects/axe_hit2.wav");
|
|
precache_sound ("effects/axe_swing.wav");
|
|
precache_sound ("effects/metal-1.wav");
|
|
precache_sound ("effects/metal-2.wav");
|
|
precache_sound ("effects/spear_hit1.wav");
|
|
precache_sound ("effects/spear_hit2.wav");
|
|
|
|
precache_sound ("misc/item1.wav");
|
|
precache_sound ("misc/item2.wav");
|
|
precache_sound ("items/r_item1.wav");
|
|
precache_sound ("items/r_item2.wav");
|
|
precache_sound ("items/locked.wav");
|
|
precache_sound ("items/lockpick1.wav");
|
|
precache_sound ("items/lockpick2.wav");
|
|
|
|
precache_sound ("radio/medic.wav");
|
|
precache_sound ("radio/grenade.wav");
|
|
|
|
precache_sound ("ambience/gunfire1.wav");
|
|
precache_sound ("ambience/gunfire5.wav");
|
|
|
|
|
|
precache_sound ("misc/hosdie1.wav");
|
|
precache_sound ("misc/hosdie2.wav");
|
|
precache_sound ("misc/rescued.wav");
|
|
precache_sound ("misc/beep1.wav");
|
|
precache_sound ("misc/beep2.wav");
|
|
precache_sound ("misc/r_tele4.wav");
|
|
precache_sound ("buttons/switch02.wav");
|
|
precache_sound ("buttons/switch04.wav");
|
|
precache_sound ("misc/secret.wav");
|
|
precache_sound ("player/levelup.wav");
|
|
precache_sound ("items/damage.wav");
|
|
precache_sound ("items/damage2.wav");
|
|
|
|
|
|
precache_sound ("player/prone1.wav");
|
|
precache_sound ("player/prone2.wav");
|
|
precache_sound ("player/prone3.wav");
|
|
precache_sound ("player/prone4.wav");
|
|
precache_sound ("player/gib1.wav");
|
|
precache_sound ("player/step1.wav");
|
|
precache_sound ("player/step2.wav");
|
|
precache_sound ("player/step3.wav");
|
|
precache_sound ("player/step4.wav");
|
|
precache_sound ("dog/dattack1.wav");
|
|
precache_sound ("dog/ddeath.wav");
|
|
precache_sound ("dog/dpain1.wav");
|
|
precache_sound ("dog/dsight.wav");
|
|
precache_sound ("dog/idle.wav");
|
|
precache_sound ("ogre/ak47.wav");
|
|
precache_sound ("weapons/10mmpistol.wav");
|
|
precache_sound ("weapons/ak112.wav");
|
|
precache_sound ("weapons/amr.wav");
|
|
precache_sound ("misc/bounce_1.wav");
|
|
precache_sound ("misc/bounce_2.wav");
|
|
precache_sound ("misc/bounce_3.wav");
|
|
precache_sound ("weapons/click.wav");
|
|
precache_sound ("weapons/deagle.wav");
|
|
precache_sound ("weapons/dks-1.wav");
|
|
precache_sound ("weapons/g11.wav");
|
|
precache_sound ("weapons/gauss.wav");
|
|
precache_sound ("weapons/gpull.wav");
|
|
precache_sound ("weapons/citykiller.wav");
|
|
precache_sound ("weapons/laser.wav");
|
|
precache_sound ("weapons/blaster.wav");
|
|
precache_sound ("weapons/moonlight-1.wav");
|
|
precache_sound ("weapons/moonlight-2.wav");
|
|
precache_sound ("weapons/needler.wav");
|
|
precache_sound ("weapons/bozar.wav");
|
|
precache_sound ("weapons/lsw.wav");
|
|
precache_sound ("weapons/amr.wav");
|
|
precache_sound ("weapons/greasegun.wav");
|
|
precache_sound ("weapons/mp9.wav");
|
|
precache_sound ("weapons/rangem.wav");
|
|
|
|
precache_sound ("weapons/tink1.wav");
|
|
precache_sound ("weapons/reload.wav");
|
|
|
|
precache_sound ("player/agdie1.wav");
|
|
precache_sound ("player/agdie2.wav");
|
|
precache_sound ("player/agdie3.wav");
|
|
precache_sound ("player/agdie4.wav");
|
|
precache_sound ("player/agdie5.wav");
|
|
precache_sound ("player/berserk.wav");
|
|
precache_sound ("player/headshot.wav");
|
|
precache_sound ("player/hit1.wav");
|
|
|
|
|
|
precache_sound ("contact/armor1.wav");
|
|
precache_sound ("contact/armor2.wav");
|
|
precache_sound ("contact/armor3.wav");
|
|
|
|
precache_sound ("player/paina.wav");
|
|
precache_sound ("player/painb.wav");
|
|
precache_sound ("player/yourturn.wav");
|
|
precache_model ("progs/bolt.mdl"); // for lightning gun
|
|
precache_model ("progs/bolt2.mdl"); // for lightning gun
|
|
precache_model ("progs/bolt3.mdl"); // for boss shock
|
|
precache_model ("progs/lavaball.mdl"); // for testing
|
|
precache_model ("progs/bomb.mdl");
|
|
precache_model ("progs/missile.mdl");
|
|
precache_model ("progs/grenade.mdl");
|
|
precache_model ("progs/spike.mdl");
|
|
precache_model ("progs/s_spike.mdl");
|
|
precache_model ("progs/backpack.mdl");
|
|
precache_model ("progs/zom_gib.mdl");
|
|
precache_model ("progs/v_light.mdl");
|
|
precache_model ("maps/crate.bsp");
|
|
|
|
//
|
|
// Setup light animation tables. 'a' is total darkness, 'z' is maxbright.
|
|
//
|
|
|
|
// 0 normal
|
|
lightstyle(0, "m");
|
|
|
|
// 1 FLICKER (first variety)
|
|
lightstyle(1, "mmnmmommommnonmmonqnmmo");
|
|
|
|
// 2 SLOW STRONG PULSE
|
|
lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");
|
|
|
|
// 3 CANDLE (first variety)
|
|
lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");
|
|
|
|
// 4 FAST STROBE
|
|
lightstyle(4, "mamamamamama");
|
|
|
|
// 5 GENTLE PULSE 1
|
|
lightstyle(5,"jklmnopqrstuvwxyzyxwvutsrqponmlkj");
|
|
|
|
// 6 FLICKER (second variety)
|
|
lightstyle(6, "nmonqnmomnmomomno");
|
|
|
|
// 7 CANDLE (second variety)
|
|
lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");
|
|
|
|
// 8 CANDLE (third variety)
|
|
lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");
|
|
|
|
// 9 SLOW STROBE (fourth variety)
|
|
lightstyle(9, "aaaaaaaazzzzzzzz");
|
|
|
|
// 10 FLUORESCENT FLICKER
|
|
lightstyle(10, "mmamammmmammamamaaamammma");
|
|
|
|
// 11 SLOW PULSE NOT FADE TO BLACK
|
|
lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");
|
|
|
|
// styles 32-62 are assigned by the light program for switchable lights
|
|
|
|
// 63 testing
|
|
lightstyle(63, "a");
|
|
|
|
if (infokey(world, "coop") == "0")
|
|
coop = 0;
|
|
if (infokey(world, "coop") == "1")
|
|
coop = 1;
|
|
};
|
|
|
|
void() StartFrame =
|
|
{
|
|
timelimit = cvar("timelimit") * 60;
|
|
fraglimit = cvar("fraglimit");
|
|
teamplay = cvar("teamplay");
|
|
deathmatch = !coop;
|
|
|
|
framecount = framecount + 1;
|
|
};
|
|
|
|
/*
|
|
==============================================================================
|
|
|
|
BODY QUE
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
entity bodyque_head;
|
|
|
|
void() bodyque =
|
|
{ // just here so spawn functions don't complain after the world
|
|
// creates bodyques
|
|
};
|
|
|
|
void() InitBodyQue =
|
|
{
|
|
bodyque_head = spawn();
|
|
bodyque_head.classname = "bodyque";
|
|
bodyque_head.owner = spawn();
|
|
bodyque_head.owner.classname = "bodyque";
|
|
bodyque_head.owner.owner = spawn();
|
|
bodyque_head.owner.owner.classname = "bodyque";
|
|
bodyque_head.owner.owner.owner = spawn();
|
|
bodyque_head.owner.owner.owner.classname = "bodyque";
|
|
bodyque_head.owner.owner.owner.owner = bodyque_head;
|
|
};
|
|
|
|
|
|
// make a body que entry for the given ent so the ent can be
|
|
// respawned elsewhere
|
|
void(entity ent) CopyToBodyQue =
|
|
{
|
|
bodyque_head.angles = ent.angles;
|
|
bodyque_head.model = ent.model;
|
|
bodyque_head.modelindex = ent.modelindex;
|
|
bodyque_head.frame = ent.frame;
|
|
bodyque_head.colormap = ent.colormap;
|
|
bodyque_head.movetype = ent.movetype;
|
|
bodyque_head.velocity = ent.velocity;
|
|
bodyque_head.flags = 0;
|
|
setorigin (bodyque_head, ent.origin);
|
|
setsize (bodyque_head, ent.mins, ent.maxs);
|
|
bodyque_head = bodyque_head.owner;
|
|
};
|
|
|
|
|