Jump to content

Home

Sfl_stick_on_impact


keshire

Recommended Posts

//#define SFL_STICK_ON_IMPACT (1<<?)//if set, the saber will stick in the wall when thrown and hits solid architecture (good for sabers that are meant to be thrown).

 

If I wanted to code this back in how would I go about doing it?

 

 

entityStates?

 

entityState_t->eType and eFlags

 

ET_MISSLE //To turn saber into missle? Does saberInFlight already do this?

EF_MISSILE_STICK //when touches wall?

 

and maybe EV_MISSILE_STICK //for a nice sound.

 

Or am I simplifying it too much?

Link to comment
Share on other sites

Ok this is what I have so far.

 

if (saberHitWall && !(self->client->saber[rSaberNum].saberFlags & SFL_BOUNCE_ON_WALLS) && (self->client->ps.saberInFlight))

 

{

saberent->s.eFlags = EF_MISSILE_STICK;

}

 

So it sticks to the wall. Which is what I want. But it also keeps spinning. And never returns. The returning part I think I can solve. But How do I keep it from spinning?

 

After I get this maybe I can reinstate the .sab flag.

Link to comment
Share on other sites

I've seen references to it.

Also sabermoveback does it without the spin. As long as the return damage flag isn't set. But I don't think thats what I'm looking for. I want it stationary. Preferably with z axis pointed towards wall.

 

if ( saberent->s.saberInFlight )

 

{//spinning

BG_EvaluateTrajectory( &saberEnt->s.pos, level.time+50, saberOrg );

 

BG_EvaluateTrajectory( &saberEnt->s.apos, level.time+50, saberAngles );

}

Link to comment
Share on other sites

My best guess would be set the model orientation to be perpendicular to the surface you impacted against (I think that data is in the trace structure.) Also, you'll need to dig thru the cgame code, find the saber spinning code and make it turn off for your SFL_STICK_ON_IMPACT flag.

Link to comment
Share on other sites

Here we go this was what I was looking for. And yes I've tracked down the "companion code" in the cgame.

 

void WP_SaberPositionUpdate( gentity_t *self, usercmd_t *ucmd )

{ //rww - keep the saber position as updated as possible on the server so that we can try to do realistic-looking contact stuff

//Note that this function also does the majority of working in maintaining the server g2 client instance (updating angles/anims/etc)

Link to comment
Share on other sites

Ok. It sticks, Its pointed in the right direction, it stops spinning (also made the regular throw vertical instead of horizontal), it also uses the STICK_ON_IMPACT flag.

 

One problem, the saber hilt explodes because it only works with ET_MISSILE.

 

Can I reroute the ET_GENERAL flag to use EF_MISSILE_STICK?

 

any other suggestions?

 

 

 

Here's my problem

 

void G_RunStuckMissile( gentity_t *ent )

{

if ( ent->takedamage )

{

if ( ent->s.groundEntityNum >= 0 && ent->s.groundEntityNum < ENTITYNUM_WORLD )

{

gentity_t *other = &g_entities[ent->s.groundEntityNum];

 

if ( (!VectorCompare( vec3_origin, other->s.pos.trDelta ) && other->s.pos.trType != TR_STATIONARY) ||

(!VectorCompare( vec3_origin, other->s.apos.trDelta ) && other->s.apos.trType != TR_STATIONARY) )

{//thing I stuck to is moving or rotating now, kill me

G_Damage( ent, other, other, NULL, NULL, 99999, 0, MOD_CRUSH );

return;

}

}

}

// check think function

G_RunThink( ent );

}

Link to comment
Share on other sites

Well it was dieing while connected to a wall. I think my problem is that I never declared it as a stationary. So technically the saber itself is still moving. Funny thing is as I was scouring the source for my answer I came upon both the lasertrap and the detpack. Which use different code for each. Plus there's code that causes anything stuck to players to explode to. Time to do some experimenting tonight.

Link to comment
Share on other sites

Ok here's what I have. And I figure its beta.

 

if (saberHitWall && (self->client->saber[rSaberNum].saberFlags & SFL_STICK_ON_IMPACT))

 

{

saberent->s.eType = ET_MISSILE; //ET_MISSILE Makes it self destruct, ET_GENERAL doesn't work. Keshire

 

saberent->s.eFlags = EF_MISSILE_STICK;

 

saberent->s.eType = ET_GENERAL; //Look at me, After I stick I revert to a general again!

 

WP_SaberAddG2Model( saberent, self->client->saber[0].model, self->client->saber[0].skin );

 

saberent->s.modelGhoul2 = 127;

 

VectorClear( saberent->s.apos.trDelta );

VectorClear( saberent->s.pos.trDelta );

 

saberent->s.apos.trType = TR_STATIONARY;

saberent->s.pos.trType = TR_STATIONARY;

 

 

VectorCopy( saberent->r.currentOrigin, saberent->s.origin );

VectorCopy( saberent->r.currentOrigin, saberent->s.pos.trBase );

 

VectorClear( saberent->s.apos.trDelta );

VectorClear( saberent->s.pos.trDelta );

 

VectorCopy( saberent->s.angles, saberent->r.currentAngles );

VectorCopy( saberent->s.angles, saberent->s.apos.trBase );

 

}

 

 

Behavior:

 

Stays stuck until short amount of time, or longer if throw button is held down.

 

Small amount of movement by guiding saber.

 

Won't stick unless directly facing wall. Also kinda glitchy in certain stances.

 

Doesn't stick at all if using dual, unless one is off.

Link to comment
Share on other sites

saberent->r.svFlags &= ~(SVF_NOCLIENT);

saberent->s.eType = ET_MISSILE;

VectorClear( saberent->s.apos.trDelta );

saberent->s.apos.trType = TR_STATIONARY;

saberent->s.pos.trType = TR_STATIONARY;

VectorCopy( saberent->r.currentOrigin, saberent->s.origin );

VectorCopy( saberent->r.currentOrigin, saberent->s.pos.trBase );

VectorClear( saberent->s.pos.trDelta );

VectorClear( saberent->s.apos.trDelta );

VectorCopy( saberent->s.angles, saberent->r.currentAngles );

VectorCopy( saberent->s.angles, saberent->s.apos.trBase );

WP_SaberAddG2Model( saberent, self->client->saber[0].model, self->client->saber[0].skin );

saberent->s.modelGhoul2 = 127;

saberent->parent = self;

saberent->s.eFlags = EF_MISSILE_STICK;

self->client->ps.saberEntityState = 1;

trap_LinkEntity(saberent);

saberent->s.eType = ET_GENERAL;

}

 

Does this all look correct? I pulled most of it from the detpack code.

 

It does a jabbing motion at the wall. Going through the code, I think its hitting a wall turning to missile, sticking, turning to general (negating the stick), trying to head back to the owner but saying its still hitting a wall. All until the max throw time (6 seconds) is hit.

 

How do I make the stick permanent and turn off the saber's owner?

 

Would all this work better as a touch or thinking function?

 

Maybe add an altered MISSILE_STICK flag and code specific to the saber?

 

any suggestions?

Link to comment
Share on other sites

Ok I streamlined my code.

 

Made the neccessary changes to keep the sabermoveback from interfering. So it stays put. Only problem is it stays put until you manually remove it from the wall.

 

It also reorients itself to point at the person throwing it if they move. I'm sure this is sabermoveback at work again but I'll pinpoint it and correct it.

 

also the saberknockdown is doing some interfering too if you turn it off while stuck.

 

I'll figure out a way to re-implement the saber flag before I release it but at the moment I'm definately happy with it.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...