49 while ((ent =
findradius(ent, self->s.origin, 1024)) != NULL) {
52 if (!(ent->svflags & SVF_MONSTER))
68 if (ent->max_health <= best->max_health)
85 self->enemy->owner =
self;
86 self->monsterinfo.aiflags |=
AI_MEDIC;
97 if (!self->oldenemy) {
100 self->oldenemy =
self->enemy;
102 self->enemy->owner =
self;
103 self->monsterinfo.aiflags |=
AI_MEDIC;
251 if (!(self->monsterinfo.aiflags &
AI_MEDIC)) {
256 self->oldenemy =
self->enemy;
258 self->enemy->owner =
self;
259 self->monsterinfo.aiflags |=
AI_MEDIC;
305 if (self->health < (self->max_health / 2))
308 if (
level.
time < self->pain_debounce_time)
311 self->pain_debounce_time =
level.
time + 3;
313 if (
skill->value == 3)
336 effect = EF_HYPERBLASTER;
343 VectorCopy(self->enemy->s.origin, end);
344 end[2] +=
self->enemy->viewheight;
345 VectorSubtract(end, start, dir);
353 VectorSet(self->mins, -16, -16, -24);
354 VectorSet(self->maxs, 16, 16, -8);
356 self->svflags |= SVF_DEADMONSTER;
395 void medic_die(edict_t *
self, edict_t *inflictor, edict_t *attacker,
int damage, vec3_t point)
400 if ((self->enemy) && (self->enemy->owner ==
self))
401 self->enemy->owner = NULL;
404 if (self->health <= self->gib_health) {
405 gi.sound(
self, CHAN_VOICE,
gi.soundindex(
"misc/udeath.wav"), 1, ATTN_NORM, 0);
406 for (n = 0; n < 2; n++)
408 for (n = 0; n < 4; n++)
419 gi.sound(
self, CHAN_VOICE,
sound_die, 1, ATTN_NORM, 0);
429 if (self->monsterinfo.aiflags &
AI_DUCKED)
434 self->monsterinfo.pausetime =
level.
time + 1;
440 if (
level.
time >= self->monsterinfo.pausetime)
480 self->enemy = attacker;
508 if (
visible(
self, self->enemy))
541 { 45.0, -9.2, 15.5 },
542 { 48.4, -9.7, 15.2 },
543 { 47.8, -9.8, 15.8 },
544 { 47.3, -9.3, 14.3 },
545 { 45.4, -10.1, 13.1 },
546 { 41.9, -12.7, 12.0 },
547 { 37.8, -15.8, 11.2 },
548 { 34.3, -18.4, 10.7 },
549 { 32.7, -19.7, 10.4 },
550 { 32.7, -19.7, 10.4 }
555 vec3_t offset, start, end, f, r;
560 if (!self->enemy->inuse)
568 VectorSubtract(start, self->enemy->s.origin, dir);
569 distance = VectorLength(dir);
575 if (angles[0] < -180)
577 if (fabs(angles[0]) > 45)
580 tr =
gi.trace(start, NULL, NULL, self->enemy->s.origin,
self, MASK_SHOT);
581 if (tr.fraction != 1.0 && tr.ent != self->enemy)
588 self->enemy->spawnflags = 0;
589 self->enemy->monsterinfo.aiflags = 0;
590 self->enemy->target = NULL;
591 self->enemy->targetname = NULL;
592 self->enemy->combattarget = NULL;
593 self->enemy->deathtarget = NULL;
594 self->enemy->owner =
self;
596 self->enemy->owner = NULL;
597 if (self->enemy->think) {
599 self->enemy->think(self->enemy);
602 if (self->oldenemy && self->oldenemy->client) {
603 self->enemy->enemy =
self->oldenemy;
612 VectorMA(start, 8, f, start);
615 VectorCopy(self->enemy->s.origin, end);
616 end[2] =
self->enemy->absmin[2] +
self->enemy->size[2] / 2;
619 gi.WriteByte(TE_MEDIC_CABLE_ATTACK);
621 gi.WritePosition(start);
622 gi.WritePosition(end);
623 gi.multicast(self->s.origin, MULTICAST_PVS);
667 if (self->monsterinfo.aiflags &
AI_MEDIC)
675 if (self->monsterinfo.aiflags &
AI_MEDIC) {
704 gi.soundindex(
"medic/medatck1.wav");
707 self->solid = SOLID_BBOX;
708 self->s.modelindex =
gi.modelindex(
"models/monsters/medic/tris.md2");
709 VectorSet(self->mins, -24, -24, -24);
710 VectorSet(self->maxs, 24, 24, 32);
713 self->gib_health = -130;
724 self->monsterinfo.melee = NULL;