193 lines
5.0 KiB
C
193 lines
5.0 KiB
C
|
#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");
|
||
|
}
|