prozac-qfcc/coop.qc

165 lines
3.5 KiB
C++

/*============================
coop.qc
This file handles all the
cooperative mode functions
============================*/
void() DroppedKeyThink =
{
// let the throwing player pick it up again
self.think = SUB_Null;
self.touch = key_touch;
self.owner = world;
};
void() DropKey =
{
if ((self.items & #IT_KEY1) || (self.items & #IT_KEY2))
{
newmis = spawn();
if (self.items & #IT_KEY1)
{
self.items = self.items - (self.items & #IT_KEY1);
newmis.items = #IT_KEY1;
if (world.worldtype == 0)
{
setmodel (newmis, "progs/w_s_key.mdl");
newmis.netname = "silver key";
newmis.noise = "misc/medkey.wav";
}
else if (world.worldtype == 1)
{
setmodel (newmis, "progs/m_s_key.mdl");
newmis.netname = "silver runekey";
newmis.noise = "misc/runekey.wav";
}
else if (world.worldtype == 2)
{
setmodel (newmis, "progs/b_s_key.mdl");
newmis.netname = "silver keycard";
newmis.noise = "misc/basekey.wav";
}
}
else if (self.items & #IT_KEY2)
{
self.items = self.items - (self.items & #IT_KEY2);
newmis.items = #IT_KEY2;
if (world.worldtype == 0)
{
setmodel (newmis, "progs/w_g_key.mdl");
newmis.netname = "gold key";
newmis.noise = "misc/medkey.wav";
}
else if (world.worldtype == 1)
{
setmodel (newmis, "progs/m_g_key.mdl");
newmis.netname = "gold runekey";
newmis.noise = "misc/runekey.wav";
}
else if (world.worldtype == 2)
{
setmodel (newmis, "progs/b_g_key.mdl");
newmis.netname = "gold keycard";
newmis.noise = "misc/basekey.wav";
}
}
newmis.owner = self;
newmis.touch = SUB_Null;
setorigin(newmis, self.origin + '0 0 16');
makevectors(self.v_angle);
newmis.velocity = normalize(v_forward) * 300 + '0 0 200';
newmis.movetype = #MOVETYPE_TOSS;
newmis.solid = #SOLID_TRIGGER;
newmis.deadflag = #TRUE;
setsize (newmis, '-16 -16 -24', '16 16 32');
newmis.think = DroppedKeyThink;
newmis.nextthink = time + 1.5;
}
else
{
sprint (self, #PRINT_HIGH, "You don't have a key\n");
}
};
/*==================================
DoorShouldOpen
This function is only for key doors in
coop mode 2.
It returns true if all players have keyed
the door.
==================================*/
float() DoorShouldOpen =
{
local entity ptr;
local float plyrcount;
local entity plyr1;
local entity plyr2;
if (coop != 2)
return #TRUE;
plyrcount = 0;
ptr = find(world, classname, "player");
while (ptr != world)
{
if (!(ptr.tf_items & self.items) && ptr.playerclass != #PC_UNDEFINED
&& ptr.solid != #SOLID_NOT
&& ptr.model != string_null)
{
plyrcount = plyrcount + 1;
if (plyrcount == 1)
plyr1 = ptr;
else if(plyrcount == 2)
plyr2 = ptr;
}
ptr = find(ptr, classname, "player");
}
if (plyrcount != 0)
{
if (plyrcount == 1)
{
bprint(#PRINT_HIGH, plyr1.netname);
bprint(#PRINT_HIGH, " needs");
}
else if (plyrcount == 2)
{
bprint(#PRINT_HIGH, plyr1.netname);
bprint(#PRINT_HIGH, " and ");
bprint(#PRINT_HIGH, plyr2.netname);
bprint(#PRINT_HIGH, " need");
}
else
{
bprint(#PRINT_HIGH, "More players need");
}
bprint(#PRINT_HIGH, " to unlock the ");
if (self.items & #IT_KEY1)
bprint(#PRINT_HIGH, "silver");
else
bprint(#PRINT_HIGH, "gold");
bprint(#PRINT_HIGH, " door\n");
return #FALSE;
}
bprint(#PRINT_HIGH, "The ");
if (self.items & #IT_KEY1)
bprint(#PRINT_HIGH, "silver");
else
bprint(#PRINT_HIGH, "gold");
bprint(#PRINT_HIGH, " door has been unlocked\n");
return #TRUE;
};