q2wf-portable/b_supplydepot.c

266 lines
7.4 KiB
C

#include "g_local.h"
#define newSupplyDepot self->supply
void SP_SupplyDepot(edict_t *self);
void supplydepot_explode (edict_t *self);
/*
=================
Supply Depot
=================
*/
void SupplyThink (edict_t *self)
{
edict_t *other;
int x;
int contents;
other = NULL;
x = 0;
contents = (int)gi.pointcontents(self->s.origin);
if (contents & CONTENTS_SOLID)
{
safe_cprintf(self->owner, PRINT_HIGH, "Your supply depot was in a bad map position, so it was removed.\n");//5/99
supplydepot_explode (self);
return;
}
while ((other = findradius(other, self->s.origin, 16)) != NULL)
{
if (other->client)
{
x = 0;
// other->DrunkTime=0;
// other->disease= 0;
// other->lame = 0;
//destroy depot for bots if enemy is using it
if ((self->wf_team != other->wf_team) && (self->owner->bot_client))
{ supplydepot_explode (self);
return;
}
if ((self->wf_team != other->wf_team) && (self->owner))
safe_cprintf(self->owner, PRINT_HIGH, "Enemies are using your depot!\n");
if (other->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]<other->client->pers.max_bullets)
{
x =1;
other->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]+= 1;
}
if (other->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]<other->client->pers.max_shells)
{
x=1;
other->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]+= 1;
}
if (other->client->pers.inventory[ITEM_INDEX(FindItem("grenades"))]<other->client->pers.max_grenades)
{
x=1;
other->client->pers.inventory[ITEM_INDEX(FindItem("grenades"))]+= 1;
}
if (other->client->pers.inventory[ITEM_INDEX(FindItem("rockets"))]<other->client->pers.max_rockets)
{
x=1;
other->client->pers.inventory[ITEM_INDEX(FindItem("rockets"))]+= 1;
}
if (other->client->pers.inventory[ITEM_INDEX(FindItem("slugs"))]<other->client->pers.max_slugs)
{
x=1;
other->client->pers.inventory[ITEM_INDEX(FindItem("slugs"))]+= 1;
}
if (other->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]<other->client->pers.max_cells)
{
x=1;
other->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]+= 1;
}
}
}
if (x ==1)
gi.sound(self, CHAN_ITEM, gi.soundindex("misc/w_pkup.wav"), 1, ATTN_NORM, 0);
self->nextthink = level.time + 0.2;
}
// Creator destroyed it
void supplydepot_explode (edict_t *self)
{
edict_t *blip = NULL;
int i;
//42 bot supply clear itemnode owner
if (self->owner->bot_client)
for (i=1, blip=g_edicts+i ; i < globals.num_edicts ; i++,blip++)
{
if (blip->owner == self->owner)
{
if (!strcmp(blip->classname, "item_depotspot") )
{
blip->owner = NULL;
}
}
}
//42 end clear item owner
gi.WriteByte (svc_temp_entity);
if (self->waterlevel)
gi.WriteByte (TE_ROCKET_EXPLOSION_WATER);
else
gi.WriteByte (TE_ROCKET_EXPLOSION);
gi.WritePosition (self->s.origin);
gi.multicast (self->s.origin, MULTICAST_PVS);
make_debris(self);
self->takedamage = DAMAGE_NO;
if (self->owner) safe_cprintf(self->owner, PRINT_HIGH, "Supply Depot Off.\n");
if ((self->owner) && (self->owner->supply))
self->owner->supply = NULL;
T_RadiusDamage(self, self->owner, self->dmg, NULL, self->dmg_radius, MOD_DEPOT);
G_FreeEdict(self);
}
// some other player blew it up
void supplydepot_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
edict_t *blip = NULL;
int i;
//42 bot supply clear itemnode owner
if (self->owner->bot_client)
for (i=1, blip=g_edicts+i ; i < globals.num_edicts ; i++,blip++)
{
if (blip->owner == self->owner)
{
if (!strcmp(blip->classname, "item_depotspot") )
{
blip->owner = NULL;
}
}
}
//42 end clear item owner
gi.WriteByte (svc_temp_entity);
if (self->waterlevel)
gi.WriteByte (TE_ROCKET_EXPLOSION_WATER);
else
gi.WriteByte (TE_ROCKET_EXPLOSION);
gi.WritePosition (self->s.origin);
gi.multicast (self->s.origin, MULTICAST_PVS);
make_debris(self);
self->takedamage = DAMAGE_NO;
if (self->owner)
{
safe_cprintf(self->owner, PRINT_HIGH, "Supply Depot Destroyed.\n");
if (self->owner->supply)
self->owner->supply = NULL;
}
// T_RadiusDamage(self, self->owner, self->dmg, NULL, self->dmg_radius, MOD_DEPOT);
T_RadiusDamage(self, attacker, self->dmg, NULL, self->dmg_radius, MOD_DEPOT_EXPLODE);
G_FreeEdict(self);
}
void SP_SupplyDepot(edict_t *self)
{
if ( newSupplyDepot )
{
supplydepot_explode(newSupplyDepot);
return;
}
// cells for laser ?
if (!self->bot_client)
{
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Cells"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 cells for a Supply Depot.\n");
return;
}
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Bullets"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 bullets for a Supply Depot.\n");
return;
}
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Shells"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 shells for a Supply Depot.\n");
return;
}
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Rockets"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 rockets for a Supply Depot.\n");
return;
}
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Grenades"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 grenades for a Supply Depot.\n");
gi.dprintf("you only have %d grenades.\n",self->client->pers.inventory[ITEM_INDEX(FindItem("Grenades"))] );
return;
}
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Slugs"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 slugs for a Supply Depot.\n");
return;
}
safe_cprintf(self, PRINT_HIGH, "Supply Depot on.\n");
}
newSupplyDepot = G_Spawn ();
VectorCopy(self->s.origin,newSupplyDepot->s.origin);
newSupplyDepot->s.origin[2] += 40;
newSupplyDepot->classname="depot";
newSupplyDepot->takedamage=DAMAGE_AIM;
newSupplyDepot->movetype= MOVETYPE_TOSS;
newSupplyDepot->mass = 200;
newSupplyDepot->solid = SOLID_BBOX;
//newSupplyDepot->clipmask=MASK_ALL;
newSupplyDepot->deadflag =DEAD_NO;
newSupplyDepot->clipmask = MASK_SHOT;
newSupplyDepot->model = self->model;
newSupplyDepot->s.modelindex = gi.modelindex ("models/objects/dmspot/tris.md2");
newSupplyDepot->s.skinnum = 1;
newSupplyDepot->solid = SOLID_BBOX;
newSupplyDepot->noteamdamage = true; //Don't let teammates damage it
newSupplyDepot->wf_team = self->wf_team;
VectorSet (newSupplyDepot->mins, -32, -32, -24);
VectorSet (newSupplyDepot->maxs, 32, 32, -16);
newSupplyDepot->s.frame =0;
newSupplyDepot->waterlevel = 0;
newSupplyDepot->watertype=0;
newSupplyDepot->health= 100;
newSupplyDepot->max_health =100;
newSupplyDepot->gib_health = -80;
newSupplyDepot->die = supplydepot_die;
newSupplyDepot->owner = self;
newSupplyDepot->dmg = 150;
newSupplyDepot->dmg_radius = 160;
// newSupplyDepot->touch = SupplyTouch;
newSupplyDepot->think =SupplyThink;
newSupplyDepot->nextthink = level.time +1;
VectorClear (newSupplyDepot->velocity);
gi.linkentity (newSupplyDepot);
if (!self->bot_client)
{
self->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]-= 10;
self->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]-= 10;
self->client->pers.inventory[ITEM_INDEX(FindItem("grenades"))]-= 10;
self->client->pers.inventory[ITEM_INDEX(FindItem("rockets"))]-= 10;
self->client->pers.inventory[ITEM_INDEX(FindItem("slugs"))]-= 10;
self->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]-= 10;
if (self->client) gi.centerprintf (self,"Supply Depot set!\nNote: 10 of each ammo has been\ndrained into the Supply Depot to be\nreplicated\n");
}
}