273 lines
6.4 KiB
C++
273 lines
6.4 KiB
C++
|
/*
|
||
|
=============================
|
||
|
ewmultiplayer.qc
|
||
|
coded by
|
||
|
Michael Rogers a.k.a Xsniper
|
||
|
ssj_xsniper@yahoo.com
|
||
|
http://www.xsniper.net/
|
||
|
|
||
|
Description:
|
||
|
This file contains code for the different multiplayer modes
|
||
|
in EW. Mainly Flood Co-op mode.
|
||
|
=============================
|
||
|
*/
|
||
|
|
||
|
void(float delaytime) delay_xsniper;
|
||
|
void() FloodCoop;
|
||
|
void(entity spot) create_demon_portal;
|
||
|
//==========================================================================
|
||
|
//General Multiplayer Code Below
|
||
|
|
||
|
//Show info_player_deathmatch starting points
|
||
|
void() ShowSpawnSpots =
|
||
|
{
|
||
|
local entity spot, spotlight;
|
||
|
local float spotcount;
|
||
|
|
||
|
//initialize spotcount
|
||
|
spotcount = 0;
|
||
|
|
||
|
//find an info_player_deathmatch
|
||
|
spot = find(world, classname, "info_player_deathmatch");
|
||
|
|
||
|
while(spot != world)
|
||
|
{
|
||
|
if (spot.classname == "info_player_deathmatch")
|
||
|
{
|
||
|
spotlight = spawn();
|
||
|
setorigin(spotlight,spot.origin);
|
||
|
setmodel (spotlight, "progs/s_bubble.spr");
|
||
|
spotlight.solid = SOLID_NOT;
|
||
|
spotlight.movetype = MOVETYPE_NONE;
|
||
|
|
||
|
//make it glow purple
|
||
|
spotlight.glow_size = 250;
|
||
|
spotlight.glow_red = 0.6;
|
||
|
spotlight.glow_green = 0;
|
||
|
spotlight.glow_blue = 1;
|
||
|
|
||
|
//increment spotcount
|
||
|
spotcount = spotcount + 1;
|
||
|
}
|
||
|
spot = nextent(spot);
|
||
|
}
|
||
|
|
||
|
//couldn't find a spot
|
||
|
if (spotcount == 0)
|
||
|
bprint("Couldn't Find A Spawn Spot\n");
|
||
|
};
|
||
|
|
||
|
//Message Of The Day
|
||
|
void() CheckMOTD =
|
||
|
{
|
||
|
//print a difficulty msg when first starting the game or after beating the game on single player
|
||
|
if (cvar("deathmatch") == 0)
|
||
|
{
|
||
|
if ((self.motd_count < 6) && (self.motd_time < time)) // 6 == seconds MOTD will display
|
||
|
{
|
||
|
self.motd_time = time + 1;
|
||
|
self.motd_count = self.motd_count + 1;
|
||
|
//check for start map or ending map
|
||
|
if (mapname == "start")
|
||
|
PrintDifficulty();
|
||
|
else if (mapname == "ending")
|
||
|
PrintDifficulty();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//new ending battle stuff
|
||
|
if (mapname == "ewend" && num_bots == 0)
|
||
|
{
|
||
|
//spawn a few angel bots to fight off the demons
|
||
|
delay_xsniper(4);
|
||
|
delay_xsniper(9);
|
||
|
delay_xsniper(14);
|
||
|
num_bots = 3;
|
||
|
}
|
||
|
|
||
|
//don't display message if we aren't in deathmatch
|
||
|
if (cvar("deathmatch") == 1)
|
||
|
{
|
||
|
if ((self.motd_count < 10) && (self.motd_time < time)) // 10 == seconds MOTD will display
|
||
|
{
|
||
|
self.motd_time = time + 1;
|
||
|
self.motd_count = self.motd_count + 1;
|
||
|
centerprint(self, "Flood Co-op Mode\n");
|
||
|
|
||
|
//check for bot spawnage
|
||
|
if (num_bots < parm10 && self.motd_count > 1)
|
||
|
{
|
||
|
//make sure we have admin status to prevent overflow of bots
|
||
|
if (self.admin == 1)
|
||
|
{
|
||
|
//create a bot and increment num_bots
|
||
|
xsniper();
|
||
|
num_bots = num_bots + 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//display message for co-op mode
|
||
|
if (cvar("coop") > 0)
|
||
|
{
|
||
|
if ((self.motd_count < 10) && (self.motd_time < time)) // 10 == seconds MOTD will display
|
||
|
{
|
||
|
self.motd_time = time + 1;
|
||
|
self.motd_count = self.motd_count + 1;
|
||
|
centerprint(self, "Single Player Co-op Mode\n");
|
||
|
|
||
|
//check for bot spawnage
|
||
|
if (num_bots < parm10 && self.motd_count > 1)
|
||
|
{
|
||
|
//make sure we have admin status to prevent overflow of bots
|
||
|
if (self.admin == 1)
|
||
|
{
|
||
|
//create a bot and increment num_bots
|
||
|
xsniper();
|
||
|
num_bots = num_bots + 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() CheckPlayMode =
|
||
|
{
|
||
|
//check for Flood Co-op Mode
|
||
|
if (cvar("deathmatch") == 1 || mapname == "ewend")
|
||
|
FloodCoop();
|
||
|
};
|
||
|
|
||
|
//===========================================================================
|
||
|
//Flood Co-op Mode Code Below
|
||
|
|
||
|
void() reset_spawn_spot =
|
||
|
{
|
||
|
local entity spot;
|
||
|
|
||
|
//check for info_portal_start's
|
||
|
spot = find(world, classname, "info_portal_start");
|
||
|
|
||
|
if (spot != world)
|
||
|
{
|
||
|
//rename this spot so players can use it again
|
||
|
spot.classname = "info_player_deathmatch";
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() reset_old_spots =
|
||
|
{
|
||
|
local entity spot;
|
||
|
|
||
|
//check for info_player_deathmatch's
|
||
|
spot = find(world, classname, "info_player_deathmatch");
|
||
|
|
||
|
while(spot != world)
|
||
|
{
|
||
|
if (spot.classname == "info_player_deathmatch")
|
||
|
spot.oldspot = 0;
|
||
|
spot = nextent(spot);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() find_portal_spawn_spot =
|
||
|
{
|
||
|
local entity spot;
|
||
|
local float spotcount;
|
||
|
|
||
|
//initialize spotcount
|
||
|
spotcount = 0;
|
||
|
|
||
|
//find an info_player_deathmatch
|
||
|
spot = find(world, classname, "info_player_deathmatch");
|
||
|
|
||
|
while(spot != world)
|
||
|
{
|
||
|
if (spot.classname == "info_player_deathmatch" && spot.oldspot != 1)
|
||
|
{
|
||
|
//set up angles
|
||
|
makevectors(spot.angles);
|
||
|
|
||
|
//lets clear the area before we spawn in
|
||
|
create_explosion((spot.origin - (v_right * 20)),0.1,0,100);
|
||
|
create_explosion((spot.origin + (v_right * 20)),0.2,0,100);
|
||
|
create_explosion((spot.origin - (v_forward * 20)),0.3,0,100);
|
||
|
create_explosion((spot.origin + (v_forward * 20)),0.4,0,100);
|
||
|
|
||
|
//found a spot, so create a demon portal here
|
||
|
create_demon_portal(spot);
|
||
|
//set this spot to our old spot
|
||
|
spot.oldspot = 1;
|
||
|
//reset any old portal spawn spots
|
||
|
reset_spawn_spot();
|
||
|
//rename this spot so players can't use it anymore
|
||
|
spot.classname = "info_portal_start";
|
||
|
//remove the delay entity
|
||
|
remove(self);
|
||
|
return;
|
||
|
}
|
||
|
else if (spot.classname == "info_player_deathmatch" && spot.oldspot == 1)
|
||
|
spotcount = spotcount + 1;
|
||
|
spot = nextent(spot);
|
||
|
}
|
||
|
|
||
|
//we've used all the spots before so reset them and recall this function
|
||
|
if (spotcount > 0)
|
||
|
{
|
||
|
reset_old_spots();
|
||
|
self.nextthink = time + 1;
|
||
|
self.think = find_portal_spawn_spot;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bprint("Couldn't Find A Spawn Spot\n");
|
||
|
|
||
|
//reset num_portals
|
||
|
num_portals = 0;
|
||
|
|
||
|
//remove the delay entity
|
||
|
remove(self);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() delay_portal =
|
||
|
{
|
||
|
local entity delayholder;
|
||
|
|
||
|
//create a delay entity and put it into the world
|
||
|
delayholder = spawn();
|
||
|
delayholder.solid = SOLID_NOT;
|
||
|
delayholder.movetype = MOVETYPE_NONE;
|
||
|
setorigin (delayholder, self.origin);
|
||
|
setmodel (delayholder, "");
|
||
|
|
||
|
//set up its thinking
|
||
|
if (mapname == "ewend")
|
||
|
delayholder.nextthink = time + 8;
|
||
|
else
|
||
|
delayholder.nextthink = time + 6;
|
||
|
delayholder.think = find_portal_spawn_spot;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
==================
|
||
|
FloodCoop
|
||
|
|
||
|
This is the main controlling function when in
|
||
|
Flood Co-op mode. It will spawn new demon portals
|
||
|
if there are none in the game.
|
||
|
==================
|
||
|
*/
|
||
|
void() FloodCoop =
|
||
|
{
|
||
|
//check to see if there are any portal's in the world
|
||
|
if (num_portals == 0) //no portals so make one
|
||
|
{
|
||
|
//increment num_portals
|
||
|
num_portals = num_portals + 1;
|
||
|
delay_portal();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|