Example #1
0
//-----------------------------------------------------
static void turretG2_turnoff( gentity_t *self )
//-----------------------------------------------------
{
	//[CoOp]
	//what if the turret is part of a custom map that lets you turn on/off the turrets?
	//we should turn off when we are told to turn off, dont continue going after the enemy.
	//the "if ( self->enemy == NULL )" was used to prevent spamming the shutdown noise as well, so we need a new way to detect if we are off
	if(self->s.frame == 0 ||//dont turn off if we are already off
		self->enemy == NULL) //Fixes shutdown noise being spammed...not sure what [BugFix376]
		//robo's fix above does...but it doesnt fix it from spamming
	//if ( self->enemy != NULL ) //CoOp
	//if ( self->enemy == NULL ) //basejka
	//[/CoOp]
	{
		// we don't need to turnoff
		return;
	}
	if ( (self->spawnflags&SPF_TURRETG2_TURBO) )
	{
		TurboLaser_SetBoneAnim( self, 4, 5 );
	}
	// shut-down sound
	if ( !(self->spawnflags&SPF_TURRETG2_TURBO) )
	{
		G_Sound( self, CHAN_BODY, G_SoundIndex( "sound/chars/turret/shutdown.wav" ));
	}
	
	// make turret play ping sound for 5 seconds
	self->aimDebounceTime = level.time + 5000;

	// Clear enemy
	self->enemy = NULL;
}
Example #2
0
static void turretG2_turnoff( gentity_t *self ) {
	if ( self->enemy == NULL ) {
		// we don't need to turnoff
		return;
	}
	if ( (self->spawnflags&SPF_TURRETG2_TURBO) ) {
		TurboLaser_SetBoneAnim( self, 4, 5 );
	}
	// shut-down sound
	if ( !(self->spawnflags&SPF_TURRETG2_TURBO) ) {
		G_Sound( self, CHAN_BODY, G_SoundIndex( "sound/chars/turret/shutdown.wav" ) );
	}

	// make turret play ping sound for 5 seconds
	self->aimDebounceTime = level.time + 5000;

	// Clear enemy
	self->enemy = NULL;
}
//----------------------------------------------------------------
static void turretG2_fire ( gentity_t *ent, vec3_t start, vec3_t dir )
//----------------------------------------------------------------
{
    vec3_t		org, ang;
    gentity_t	*bolt;

    if ( (trap_PointContents( start, ent->s.number )&MASK_SHOT) )
    {
        return;
    }

    VectorMA( start, -START_DIS, dir, org ); // dumb....

    if ( ent->random )
    {
        vectoangles( dir, ang );
        ang[PITCH] += flrand( -ent->random, ent->random );
        ang[YAW] += flrand( -ent->random, ent->random );
        AngleVectors( ang, dir, NULL, NULL );
    }

    vectoangles(dir, ang);

    if ( (ent->spawnflags&SPF_TURRETG2_TURBO) )
    {
        //muzzle flash
        G_PlayEffectID( ent->genericValue13, org, ang );
        WP_FireTurboLaserMissile( ent, start, dir );
        if ( ent->alt_fire )
        {
            TurboLaser_SetBoneAnim( ent, 2, 3 );
        }
        else
        {
            TurboLaser_SetBoneAnim( ent, 0, 1 );
        }
    }
    else
    {
        G_PlayEffectID( G_EffectIndex("blaster/muzzle_flash"), org, ang );
        bolt = G_Spawn();

        bolt->classname = "turret_proj";
        bolt->nextthink = level.time + 10000;
        bolt->think = G_FreeEntity;
        bolt->s.eType = ET_MISSILE;
        bolt->s.weapon = WP_BLASTER;
        bolt->r.ownerNum = ent->s.number;
        bolt->damage = ent->damage;
        bolt->alliedTeam = ent->alliedTeam;
        bolt->teamnodmg = ent->teamnodmg;
        bolt->dflags = (DAMAGE_NO_KNOCKBACK|DAMAGE_HEAVY_WEAP_CLASS);		// Don't push them around, or else we are constantly re-aiming
        bolt->splashDamage = ent->splashDamage;
        bolt->splashRadius = ent->splashDamage;
        bolt->methodOfDeath = MOD_TARGET_LASER;//MOD_ENERGY;
        bolt->splashMethodOfDeath = MOD_TARGET_LASER;//MOD_ENERGY;
        bolt->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER;
        //bolt->trigger_formation = qfalse;		// don't draw tail on first frame

        VectorSet( bolt->r.maxs, 1.5, 1.5, 1.5 );
        VectorScale( bolt->r.maxs, -1, bolt->r.mins );
        bolt->s.pos.trType = TR_LINEAR;
        bolt->s.pos.trTime = level.time;
        VectorCopy( start, bolt->s.pos.trBase );
        VectorScale( dir, ent->mass, bolt->s.pos.trDelta );
        SnapVector( bolt->s.pos.trDelta );		// save net bandwidth
        VectorCopy( start, bolt->r.currentOrigin);
    }
}
//-----------------------------------------------------
void finish_spawning_turretG2( gentity_t *base )
{
    vec3_t		fwd;
    int			t;

    if ( (base->spawnflags&2) )
    {
        base->s.angles[ROLL] += 180;
        base->s.origin[2] -= 22.0f;
    }

    G_SetAngles( base, base->s.angles );
    AngleVectors( base->r.currentAngles, fwd, NULL, NULL );

    G_SetOrigin(base, base->s.origin);

    base->s.eType = ET_GENERAL;

    if ( base->team && base->team[0] && //g_gametype.integer == GT_SIEGE &&
            !base->teamnodmg)
    {
        base->teamnodmg = atoi(base->team);
    }
    base->team = NULL;

    // Set up our explosion effect for the ExplodeDeath code....
    G_EffectIndex( "turret/explode" );
    G_EffectIndex( "sparks/spark_exp_nosnd" );

    base->use = turretG2_base_use;
    base->pain = TurretG2Pain;

    // don't start working right away
    base->think = turretG2_base_think;
    base->nextthink = level.time + FRAMETIME * 5;

    // this is really the pitch angle.....
    base->speed = 0;

    // respawn time defaults to 20 seconds
    if ( (base->spawnflags&SPF_TURRETG2_CANRESPAWN) && !base->count )
    {
        base->count = 20000;
    }

    G_SpawnFloat( "shotspeed", "0", &base->mass );
    if ( (base->spawnflags&SPF_TURRETG2_TURBO) )
    {
        if ( !base->random )
        {   //error worked into projectile direction
            base->random = 2.0f;
        }

        if ( !base->mass )
        {   //misnomer: speed of projectile
            base->mass = 20000;
        }

        if ( !base->health )
        {
            base->health = 2000;
        }

        // search radius
        if ( !base->radius )
        {
            base->radius = 32768;
        }

        // How quickly to fire
        if ( !base->wait )
        {
            base->wait = 1000;// + random() * 500;
        }

        if ( !base->splashDamage )
        {
            base->splashDamage = 200;
        }

        if ( !base->splashRadius )
        {
            base->splashRadius = 500;
        }

        // how much damage each shot does
        if ( !base->damage )
        {
            base->damage = 500;
        }

        if ( (base->spawnflags&SPF_TURRETG2_TURBO) )
        {
            VectorSet( base->r.maxs, 64.0f, 64.0f, 30.0f );
            VectorSet( base->r.mins, -64.0f, -64.0f, -30.0f );
        }
        //start in "off" anim
        TurboLaser_SetBoneAnim( base, 4, 5 );
        if ( g_gametype.integer == GT_SIEGE )
        {   //FIXME: designer-specified?
            //FIXME: put on other entities, too, particularly siege objectives and bbrushes...
            base->s.eFlags2 |= EF2_BRACKET_ENTITY;
        }
    }
    else
    {
        if ( !base->random )
        {   //error worked into projectile direction
            base->random = 2.0f;
        }

        if ( !base->mass )
        {   //misnomer: speed of projectile
            base->mass = 1100;
        }

        if ( !base->health )
        {
            base->health = 100;
        }

        // search radius
        if ( !base->radius )
        {
            base->radius = 512;
        }

        // How quickly to fire
        if ( !base->wait )
        {
            base->wait = 150 + random() * 55;
        }

        if ( !base->splashDamage )
        {
            base->splashDamage = 10;
        }

        if ( !base->splashRadius )
        {
            base->splashRadius = 25;
        }

        // how much damage each shot does
        if ( !base->damage )
        {
            base->damage = 5;
        }

        if ( base->spawnflags & 2 )
        {   //upside-down, invert r.mins and maxe
            VectorSet( base->r.maxs, 10.0f, 10.0f, 30.0f );
            VectorSet( base->r.mins, -10.0f, -10.0f, 0.0f );
        }
        else
        {
            VectorSet( base->r.maxs, 10.0f, 10.0f, 0.0f );
            VectorSet( base->r.mins, -10.0f, -10.0f, -30.0f );
        }
    }

    //stash health off for respawn.  NOTE: cannot use maxhealth because that might not be set if not showing the health bar
    base->genericValue6 = base->health;

    G_SpawnInt( "showhealth", "0", &t );
    if (t)
    {   //a non-0 maxhealth value will mean we want to show the health on the hud
        base->maxHealth = base->health;
        G_ScaleNetHealth(base);
        base->s.shouldtarget = qtrue;
        //base->s.owner = MAX_CLIENTS; //not owned by any client
    }

    if (base->s.iModelScale)
    {   //let's scale the bbox too...
        float fScale = base->s.iModelScale/100.0f;
        VectorScale(base->r.mins, fScale, base->r.mins);
        VectorScale(base->r.maxs, fScale, base->r.maxs);
    }

    // Precache special FX and moving sounds
    if ( (base->spawnflags&SPF_TURRETG2_TURBO) )
    {
        base->genericValue13 = G_EffectIndex( "turret/turb_muzzle_flash" );
        base->genericValue14 = G_EffectIndex( "turret/turb_shot" );
        base->genericValue15 = G_EffectIndex( "turret/turb_impact" );
        //FIXME: Turbo Laser Cannon sounds!
        G_SoundIndex( "sound/vehicles/weapons/turbolaser/turn.wav" );
    }
    else
    {
        G_SoundIndex( "sound/chars/turret/startup.wav" );
        G_SoundIndex( "sound/chars/turret/shutdown.wav" );
        G_SoundIndex( "sound/chars/turret/ping.wav" );
        G_SoundIndex( "sound/chars/turret/move.wav" );
    }

    base->r.contents = CONTENTS_BODY|CONTENTS_PLAYERCLIP|CONTENTS_MONSTERCLIP|CONTENTS_SHOTCLIP;

    //base->max_health = base->health;
    base->takedamage = qtrue;
    base->die  = turretG2_die;

    base->material = MAT_METAL;
    //base->r.svFlags |= SVF_NO_TELEPORT|SVF_NONNPC_ENEMY|SVF_SELF_ANIMATING;

    // Register this so that we can use it for the missile effect
    RegisterItem( BG_FindItemForWeapon( WP_BLASTER ));

    // But set us as a turret so that we can be identified as a turret
    base->s.weapon = WP_TURRET;

    trap_LinkEntity( base );
}