Beispiel #1
0
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);
	}
}
Beispiel #2
0
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);
}