Exemplo n.º 1
0
void commander_attack (edict_t *self)
{
	float r = random();
	float range = entdist(self, self->enemy);

	// short range attack
	if (range <= 128 && r <= 0.6)
	{
		self->monsterinfo.currentmove = &mytank_move_strike;
	}
	else
	{
		// try to teleport to enemy if we are not standing ground
		if (!(self->monsterinfo.aiflags & AI_STAND_GROUND))
		{
			if (TeleportNearTarget(self, self->enemy, 16.0))
			{
				if (r <= 0.5)
				{
					self->monsterinfo.currentmove = &mytank_move_strike;
					self->monsterinfo.attack_finished = level.time + 0.5;
					return;
				}

				// recalculate enemy distance
				range = entdist(self, self->enemy);
			}
		}

		// medium range attack
		if (range <= 512)
		{
			if (r <= 0.2)
				self->monsterinfo.currentmove = &mytank_move_attack_blast;
			else
				self->monsterinfo.currentmove = &mytank_move_attack_fire_rocket;
		}
		// long range attack
		else
		{
			self->monsterinfo.currentmove = &mytank_move_attack_blast;
		}
	}

	// don't call attack function for awhile
	self->monsterinfo.attack_finished = level.time + 2.0;
}
Exemplo n.º 2
0
void mytank_idle (edict_t *self)
{
	int		range;
	vec3_t	v;

	//GHz: Commanders teleport back to owner
	if ((self->s.skinnum & 2) && !(self->monsterinfo.aiflags & AI_STAND_GROUND))
	{
		VectorSubtract(self->activator->s.origin, self->s.origin, v);
		range = VectorLength (v);
		if (range > 256)
		{
			TeleportNearTarget (self, self->activator, 16);
		}
	}
	gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
	self->superspeed = false; //GHz: No more sliding
}
Exemplo n.º 3
0
void boss_tank_attack (edict_t *ent)
{
	int		damage, flash_number;
	vec3_t	forward, start;

	if ((flash_number=p_tank_getFirePos(ent, start, forward))==-1)
		return;

	ent->owner->client->idle_frames = 0; // you're not idle if you're attacking!

	// punch attack
	if (ent->owner->client->weapon_mode)
	{
		//begin attack
		if (ent->s.frame == TANK_FRAMES_START_PUNCH)
		{
			if (boss_findtarget(ent) && (entdist(ent, ent->enemy) > TANK_PUNCH_RADIUS))
			{
				if (TeleportNearTarget(ent, ent->enemy, 16))
					boss_locktarget(ent, 0, forward, start);
			}
			gi.sound (ent, CHAN_WEAPON, gi.soundindex ("tank/tnkatck4.wav"), 1, ATTN_NORM, 0);
		}
		else if (ent->s.frame == TANK_FRAMES_END_PUNCH)
			boss_punch(ent);
		return;
	}

	if (!flash_number) // not a firing frame
		return;

	damage = TANK_ROCKET_INITIAL_DAMAGE+TANK_ROCKET_ADDON_DAMAGE*ent->monsterinfo.level;

	fire_rocket(ent, start, forward, damage, TANK_ROCKET_SPEED, damage, damage);

	gi.WriteByte(svc_muzzleflash2);
	gi.WriteShort(ent-g_edicts);
	gi.WriteByte(flash_number);
	gi.multicast(start, MULTICAST_PVS);
}