Jump to content

Saber Throw Speed Mod


Recommended Posts

I honestly think the base animation for saber throw sucks. The animation for it is basically the player holding out their stretched arm while the saber just spins forward and then comes back like a Frisbee. It's actually lame for the most part.

 

Maybe someone could make new animations based on the saber throw from The Force Unleashed:

 

4125912-5824352901-41246.gif

 

I love how there are two versions. Luke has a super fast one, and the Hoth stalker has a slow one, but yet it still looks faster than the Jedi Academy saber throw.

Smoo, J450N, Kuhe and 3 others like this
Link to comment

Hi there !

 

i was hoping that there is a way to speed up saber throw,its a bit floaty and easy to dodge.Would this just be a animation mod or a value change 

If it's the velocity of the throw you have to edit the code. If your using Visual Studio just edit this in wp_saber.cpp

		if ( self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1
			|| self->client->ps.saberEntityState == SES_RETURNING
			|| VectorCompare( saber->s.pos.trDelta, vec3_origin ) )
		{//control if it's returning or just starting
			float	saberSpeed = 500;//FIXME: based on force level? // Edit, saberSpeed = 500 // change the 500 to what ever number you want.
			float	dist;
			gentity_t *enemy = NULL;

			AngleVectors( fwdangles, forward, NULL, NULL );

You can also search for "saberSpeed" it will give you everything speed related.

J450N and Smoo like this
Link to comment

SaberBlade83 thank you so much !! i really appreciate your fast response !

 

can i still edit the code on mac ? (i know this may seem a silly question) 

 

also where is the w_saber.cpp file located ?

 

again thank you for your time

you can edit code on any os so long as you have a text editor, not sure what you need to compile in mac though

J450N likes this
Link to comment
  • 10 months later...

I've been spending the last 3 days trying to change the saber spin speed and nothing works, and there is nothing in the codes that references this at all. The code here changes the flight speed, but I'm try to change the rotation speed.... absolutely no where to be found and I'm at a complete loss.

Link to comment

Oh yeah that's a good point! I actually got it now! It was hard to find at first because it wasn't easily identifiable at first, but it did relate to force levels. I changed a lot more than that too actually, cause I like doing experiments with the code. Here are alterations I made under wp_saber.cpp (for Single Player, I haven't tested Multiplayer yet).

 

Here I enabled a 4th level for lightsaber throwing, and also changed the range of distance for them altogether:

//NOTE: keep in synch with table below!!!
int saberThrowDist[NUM_FORCE_POWER_LEVELS] =
{
    0,//none
    250,    //256,
    500,    //400,
    750,    //400
    1000
};

//NOTE: keep in synch with table above!!!
int saberThrowDistSquared[NUM_FORCE_POWER_LEVELS] =
{
    0,//none
    62500,    //65536,
    250000,    //160000,
    562500,    //160000
    1000000
};

Here is the main thing that I was looking for that I couldn't find at first, which affects the spinning speed:

switch ( self->client->ps.forcePowerLevel[FP_SABERTHROW] )
{//FIXME: make a table?
default:
case FORCE_LEVEL_1:
    saber->s.apos.trDelta[1] = 600;
    break;
case FORCE_LEVEL_2:
    saber->s.apos.trDelta[1] = 800;
    break;
case FORCE_LEVEL_3:
    saber->s.apos.trDelta[1] = 1200;
    break;
case FORCE_LEVEL_4:
    saber->s.apos.trDelta[1] = 2000;
    break;
}

And then this next one is the most I've screwed with... here I made changes to speeds, added the 4th level behavior, and also decided to make it so it continues cutting the wall without returning to your hand. I also made it so level 3 and 4 sabers will continue spinning when returning to your hand!

void WP_RunSaber( gentity_t *self, gentity_t *saber )
{
    extern        qboolean returnDamage;
    vec3_t        origin, oldOrg;
    vec3_t        saberMins = { -3.0f,-3.0f,-3.0f };
    vec3_t        saberMaxs = { 3.0f,3.0f,3.0f };
    trace_t        tr;

    VectorCopy( saber->currentOrigin, oldOrg );
    // get current position
    EvaluateTrajectory( &saber->s.pos, level.time, origin );
    // get current angles
    EvaluateTrajectory( &saber->s.apos, level.time, saber->currentAngles );

    // trace a line from the previous position to the current position,
    // ignoring interactions with the missile owner
    int clipmask = saber->clipmask;
    if ( !self || !self->client || self->client->ps.SaberLength() <= 0 )
    {//don't keep hitting other sabers when turned off
        clipmask &= ~CONTENTS_LIGHTSABER;
    }
    gi.trace( &tr, saber->currentOrigin, saber->mins, saber->maxs, origin,
        saber->owner ? saber->owner->s.number : ENTITYNUM_NONE, clipmask, (EG2_Collision)0, 0 );

    VectorCopy( tr.endpos, saber->currentOrigin );

    if ( self->client->ps.SaberActive() )
    {
        if ( self->client->ps.saberInFlight || (self->client->ps.weaponTime&&!Q_irand( 0, 100 )) )
        {//make enemies run from a lit saber in flight or from me when I'm attacking
            if ( !Q_irand( 0, 10 ) )
            {//not so often...
                AddSightEvent( self, saber->currentOrigin, self->client->ps.SaberLength()*3, AEL_DANGER, 100 );
            }
        }
    }

    if (tr.startsolid)
    {
        tr.fraction = 0;
    }
    gi.linkentity(saber);
    //if (tr.fraction != 1)
    //{//touch push triggers?
    //    WP_SaberImpact(self, saber, &tr);
    //}

    if (saber->s.pos.trType == TR_LINEAR)
    {//home
        //figure out where saber should be
        vec3_t    forward, saberHome, saberDest, fwdangles = { 0 };

        VectorCopy(self->client->ps.viewangles, fwdangles);
        if (self->s.number)
        {
            fwdangles[0] -= 8;
        }
        else if (cg.renderingThirdPerson)
        {
            fwdangles[0] -= 5;
        }
        if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_1
            || self->client->ps.saberEntityState == SES_RETURNING
            || VectorCompare(saber->s.pos.trDelta, vec3_origin))
        {//control if it's returning or just starting
            float    saberSpeed = 500;
            float    dist;
            gentity_t *enemy = NULL;
            AngleVectors(fwdangles, forward, NULL, NULL);
            if (self->client->ps.saberEntityDist < 100)
            {//make the saber head to my hand- the bolt it was attached to
                VectorCopy(self->client->renderInfo.handRPoint, saberHome);
            }
            else
            {//aim saber from eyes
                VectorCopy(self->client->renderInfo.eyePoint, saberHome);
            }
            VectorMA(saberHome, self->client->ps.saberEntityDist, forward, saberDest);
            if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 && self->client->ps.saberEntityState == SES_LEAVING)
            {
                if (self->enemy &&
                    !WP_SaberValidateEnemy(self, self->enemy))
                {//if my enemy isn't valid to auto-aim at, don't autoaim
                }
                else
                {
                    //pick an enemy
                    enemy = WP_SaberFindEnemy(self, saber);
                    if (enemy)
                    {//home in on enemy
                        float enemyDist = Distance(self->client->renderInfo.handRPoint, enemy->currentOrigin);
                        VectorCopy(enemy->currentOrigin, saberDest);
                        saberDest[2] += enemy->maxs[2] / 2.0f;//FIXME: when in a knockdown anim, the saber float above them... do we care?
                        self->client->ps.saberEntityDist = enemyDist;
                        //once you pick an enemy, stay with it!
                        saber->enemy = enemy;
                        //FIXME: lock onto that enemy for a minimum amount of time (unless they become invalid?)
                    }
                }
            }
            //Make the saber head there
            VectorSubtract(saberDest, saber->currentOrigin, saber->s.pos.trDelta);
            dist = VectorNormalize(saber->s.pos.trDelta);
            if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 && self->client->ps.saberEntityState == SES_LEAVING && !enemy)
            {
                if (dist < 200)
                {
                    saberSpeed = 400 - (dist * 2);
                }
            }
            else if (self->client->ps.saberEntityState == SES_LEAVING && dist < 50)
            {
                saberSpeed = dist * 2 + 30;
                if ((enemy && dist > enemy->maxs[0]) || (!enemy && dist > 24))
                {//auto-tracking an enemy and we can't hit him
                    if (saberSpeed < 120)
                    {//clamp to a minimum speed
                        saberSpeed = 120;
                    }
                }
            }
            if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_2 && self->client->ps.saberEntityState == SES_RETURNING && !(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))
            {//FIXME: if returning, move faster?
                qboolean returnDamage = 3.0f;
                self->client->ps.saberEntityState = SES_LEAVING;
                saberSpeed = 800;
                if (dist < 200)
                {
                    saberSpeed -= 400 - (dist * 2);
                }
            }
            if (self->client->ps.forcePowerLevel[FP_SABERTHROW] > FORCE_LEVEL_3 && self->client->ps.saberEntityState == SES_LEAVING && !enemy)
            {
                saberSpeed = 800;
            }
            VectorScale(saber->s.pos.trDelta, saberSpeed, saber->s.pos.trDelta);
            VectorCopy(saber->currentOrigin, saber->s.pos.trBase);
            saber->s.pos.trTime = level.time;
            saber->s.pos.trType = TR_LINEAR;
        }
        else
        {
            VectorCopy(saber->currentOrigin, saber->s.pos.trBase);
            saber->s.pos.trTime = level.time;
            saber->s.pos.trType = TR_LINEAR;
        }
        if (self->client->ps.saberEntityState == SES_RETURNING && !(self->client->ps.saber[0].saberFlags&SFL_RETURN_DAMAGE))//type != SABER_STAR )
        {//if it's heading back, point it's base at us
            fwdangles[0] += SABER_PITCH_HACK;
            saber->s.apos.trType = TR_INTERPOLATE;
            VectorClear(saber->s.apos.trDelta);
        }
    }
}

Hopefully this helps out with others wanting to edit lightsaber throwing more. :) I'm still very new to this (as well as coding in general) and I'm learning as I go, so it might be a bit messy lol. This code was originally based off a combination of custom OpenJK source code and Jedi Academy: Enhanced, before I made these changes that is.

 

The next things we need that would be cool is to have custom trail effects for specifically throwing the lightsaber, that way it can have a cool spinning look to it. Maybe even a way to throw a 2nd lightsaber? I'm sure these two things are possible, but haven't figured them out yet.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...