void stalker_shoot_attack(edict_t *self) { vec3_t offset, start, f, r, dir; vec3_t end; float time, dist; trace_t trace; if (!self) { return; } if (!has_valid_enemy(self)) { return; } if (self->groundentity && (random() < 0.33)) { VectorSubtract(self->enemy->s.origin, self->s.origin, dir); dist = VectorLength(dir); if ((dist > 256) || (random() < 0.5)) { stalker_do_pounce(self, self->enemy->s.origin); } else { stalker_jump_straightup(self); } } AngleVectors(self->s.angles, f, r, NULL); VectorSet(offset, 24, 0, 6); G_ProjectSource(self->s.origin, offset, f, r, start); VectorSubtract(self->enemy->s.origin, start, dir); if (random() < (0.20 + 0.1 * skill->value)) { dist = VectorLength(dir); time = dist / 1000; VectorMA(self->enemy->s.origin, time, self->enemy->velocity, end); VectorSubtract(end, start, dir); } else { VectorCopy(self->enemy->s.origin, end); } trace = gi.trace(start, vec3_origin, vec3_origin, end, self, MASK_SHOT); if ((trace.ent == self->enemy) || (trace.ent == world)) { monster_fire_blaster2(self, start, dir, 15, 800, MZ2_STALKER_BLASTER, EF_BLASTER); } }
qboolean stalker_blocked (edict_t *self, float dist) { qboolean onCeiling; if(!has_valid_enemy(self)) return false; onCeiling = false; if(self->gravityVector[2] > 0) onCeiling = true; if(!onCeiling) { if(blocked_checkshot(self, 0.25 + (0.05 * skill->value) )) { return true; } if(visible (self, self->enemy)) { stalker_do_pounce(self, self->enemy->s.origin); return true; } if(blocked_checkjump (self, dist, 256, 68)) { stalker_jump (self); return true; } if(blocked_checkplat (self, dist)) return true; } else { if(blocked_checkshot(self, 0.25 + (0.05 * skill->value) )) { return true; } else if(stalker_ok_to_transition(self)) { self->gravityVector[2] = -1; self->s.angles[2] += 180.0; if(self->s.angles[2] > 360.0) self->s.angles[2] -= 360.0; self->groundentity = NULL; return true; } } return false; }
void stalker_shoot_attack (edict_t *self) { vec3_t offset, start, f, r, dir; vec3_t end; float time, dist; trace_t trace; if(!has_valid_enemy(self)) return; if(self->groundentity && random() < 0.33) { VectorSubtract (self->enemy->s.origin, self->s.origin, dir); dist = VectorLength (dir); if((dist > 256) || (random() < 0.5)) stalker_do_pounce(self, self->enemy->s.origin); else stalker_jump_straightup (self); } // FIXME -- keep this but use a custom one // if (!infront(self, self->enemy)) // return; AngleVectors (self->s.angles, f, r, NULL); VectorSet (offset, 24, 0, 6); G_ProjectSource (self->s.origin, offset, f, r, start); VectorSubtract(self->enemy->s.origin, start, dir); if(random() < (0.20 + 0.1 * skill->value)) { dist = VectorLength(dir); time = dist / 1000; VectorMA(self->enemy->s.origin, time, self->enemy->velocity, end); VectorSubtract(end, start, dir); } else VectorCopy(self->enemy->s.origin, end); trace = gi.trace(start, vec3_origin, vec3_origin, end, self, MASK_SHOT); if(trace.ent == self->enemy || trace.ent == world) monster_fire_blaster2(self, start, dir, 15, 800, MZ2_STALKER_BLASTER, EF_BLASTER); // else // gi.dprintf("blocked by entity %s\n", trace.ent->classname); }
qboolean stalker_blocked (edict_t *self, float dist) { qboolean onCeiling; // gi.dprintf("stalker_blocked\n"); if(!has_valid_enemy(self)) return false; onCeiling = false; if(self->gravityVector[2] > 0) onCeiling = true; if(!onCeiling) { if(blocked_checkshot(self, 0.25 + (0.05 * skill->value) )) { // gi.dprintf("blocked: shooting\n"); return true; } if(visible (self, self->enemy)) { // gi.dprintf("blocked: jumping at player!\n"); stalker_do_pounce(self, self->enemy->s.origin); return true; } if(blocked_checkjump (self, dist, 256, 68)) { // gi.dprintf("blocked: jumping up/down\n"); stalker_jump (self); return true; } if(blocked_checkplat (self, dist)) return true; } else { if(blocked_checkshot(self, 0.25 + (0.05 * skill->value) )) { // gi.dprintf("blocked: shooting\n"); return true; } else if(stalker_ok_to_transition(self)) { self->gravityVector[2] = -1; self->s.angles[2] += 180.0; if(self->s.angles[2] > 360.0) self->s.angles[2] -= 360.0; self->groundentity = NULL; // gi.dprintf("falling off ceiling\n"); return true; } // else // gi.dprintf("Not OK to fall!\n"); } return false; }