qboolean gekk_checkattack(edict_t *self) { if (!self) { return false; } if (!self->enemy || (self->enemy->health <= 0)) { return false; } if (gekk_check_melee(self)) { self->monsterinfo.attack_state = AS_MELEE; return true; } if (gekk_check_jump(self)) { self->monsterinfo.attack_state = AS_MISSILE; return true; } if (gekk_check_jump_close(self) && !self->waterlevel) { self->monsterinfo.attack_state = AS_MISSILE; return true; } return false; }
void gekk_jump_takeoff2(edict_t *self) { vec3_t forward; if (!self) { return; } gi.sound(self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0); AngleVectors(self->s.angles, forward, NULL, NULL); self->s.origin[2] = self->enemy->s.origin[2]; if (gekk_check_jump(self)) { VectorScale(forward, 300, self->velocity); self->velocity[2] = 250; } else { VectorScale(forward, 150, self->velocity); self->velocity[2] = 300; } self->groundentity = NULL; self->monsterinfo.aiflags |= AI_DUCKED; self->monsterinfo.attack_finished = level.time + 3; self->touch = gekk_jump_touch; }
void gekk_jump (edict_t *self) { if (self->flags & FL_SWIM || self->waterlevel) { return; } else { //if (random() > 0.8 && self->health < self->max_health) // self->monsterinfo.currentmove = &gekk_move_idle2; //else { if (random() > 0.5 && (range (self, self->enemy) >= RANGE_NEAR)) self->monsterinfo.currentmove = &gekk_move_spit; else if (random() > 0.8) self->monsterinfo.currentmove = &gekk_move_spit; // Knightmare- check for grenades and lasers else if (gekk_check_jump_hazard(self, false, gekk_check_jump(self))) self->monsterinfo.currentmove = &gekk_move_leapatk; else self->monsterinfo.currentmove = &gekk_move_spit; } } }
void gekk_swim (edict_t *self) { if (gekk_checkattack(self)) { // Knightmare- check for grenades and lasers if (!self->enemy->waterlevel && random() > 0.7 && gekk_check_jump_hazard(self, true, gekk_check_jump(self))) { water_to_land (self); } else { self->monsterinfo.currentmove = &gekk_move_swim_start; } } }