q2wf-portable/b_healingdepot.c

193 lines
5.0 KiB
C
Raw Normal View History

#include "g_local.h"
#define newHealingDepot self->supply
void SP_HealingDepot(edict_t *self);
void Remove_Player_Flames (edict_t *ent);
void healingdepot_explode (edict_t *self);
/*
=================
Healing Depot
=================
*/
void HealPlayer(edict_t *ent)
{
ent->disease= 0;
ent->lame = 0;
ent->superslow=0;
ent->Slower=0;
ent->DrunkTime=level.time - 1;
ent->client->blindBase = 0;
ent->client->blindTime = 0;
ent->cantmove = 0;
Remove_Player_Flames (ent);
}
void HealingDepotThink (edict_t *self)
{
edict_t *other;
int contents;
other = NULL;
contents = (int)gi.pointcontents(self->s.origin);
if (contents & CONTENTS_SOLID)
{
safe_cprintf(self->owner, PRINT_HIGH, "Your healing depot was in a bad map position, so it was removed.\n");//5/99
healingdepot_explode (self);
return;
}
while ((other = findradius(other, self->s.origin, 16)) != NULL)
{
if (other->client)
{
HealPlayer(other);
//Give some health
if (other->health < 100)
{
other->health += 5;
if (other->health > 100) other->health = 100;
}
//destroy depot for bots if enemy is using it
if ((self->wf_team != other->wf_team) && (self->owner->bot_client))
{ healingdepot_explode (self);
return;
}
if ((self->wf_team != other->wf_team) && (self->owner))
safe_cprintf(self->owner, PRINT_HIGH, "Enemies are using your healing depot!\n");
gi.sound(self, CHAN_ITEM, gi.soundindex("ctf/tech4.wav"), 1, ATTN_NORM, 0);
}
}
self->nextthink = level.time + 0.35;
}
void healingdepot_explode (edict_t *self)
{
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, "Healing 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_HEALINGDEPOT);
G_FreeEdict(self);
}
void healingdepot_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, "Healing Depot Destroyed.\n");
if ((self->owner) && (self->owner->supply))
self->owner->supply = NULL;
T_RadiusDamage(self, self->owner, self->dmg, NULL, self->dmg_radius, MOD_HEALINGDEPOT);
G_FreeEdict(self);
}
void SP_HealingDepot(edict_t *self)
{
/**** DEBUGGING ***/
//safe_cprintf(self, PRINT_HIGH, "Sorry - healing depot disabled while we are testing.\n");
//return;
/**** DEBUGGING ***/
if ( newHealingDepot )
{
healingdepot_explode(newHealingDepot);
return;
}
// cells for laser ?
if (self->client->pers.inventory[ITEM_INDEX(FindItem("Cells"))] < 10)
{
safe_cprintf(self, PRINT_HIGH, "Need 10 cells for a Healing Depot.\n");
return;
}
safe_cprintf(self, PRINT_HIGH, "Healing Depot on.\n");
newHealingDepot = G_Spawn ();
VectorCopy(self->s.origin,newHealingDepot->s.origin);
newHealingDepot->s.origin[2] += 40;
newHealingDepot->classname="healingdepot";
newHealingDepot->takedamage=DAMAGE_AIM;
newHealingDepot->movetype= MOVETYPE_TOSS;
newHealingDepot->mass = 200;
newHealingDepot->solid = SOLID_BBOX;
newHealingDepot->clipmask=MASK_ALL;
newHealingDepot->deadflag =DEAD_NO;
newHealingDepot->clipmask = MASK_SHOT;
newHealingDepot->model = self->model;
newHealingDepot->s.modelindex = gi.modelindex ("models/objects/dmspot/tris.md2");
newHealingDepot->s.skinnum = 2;
newHealingDepot->solid = SOLID_BBOX;
newHealingDepot->noteamdamage = true; //Don't let teammates damage it
newHealingDepot->wf_team = self->wf_team;
VectorSet (newHealingDepot->mins, -32, -32, -24);
VectorSet (newHealingDepot->maxs, 32, 32, -16);
newHealingDepot->s.frame =0;
newHealingDepot->waterlevel = 0;
newHealingDepot->watertype=0;
newHealingDepot->health= 100;
newHealingDepot->max_health =100;
newHealingDepot->gib_health = -80;
newHealingDepot->die = healingdepot_die;
newHealingDepot->owner = self;
newHealingDepot->dmg = 150;
newHealingDepot->dmg_radius = 160;
// newHealingDepot->touch = HealingTouch;
newHealingDepot->think =HealingDepotThink;
newHealingDepot->nextthink = level.time + 1;
VectorClear (newHealingDepot->velocity);
gi.linkentity (newHealingDepot);
self->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]-= 10;
if (self->client && !self->bot_client ) gi.centerprintf (self,"Healing Depot set!\n");
}