Inside3D!
     

RL Kickback
Goto page Previous  1, 2, 3  Next
 
Post new topic   Reply to topic    Inside3d Forums Forum Index -> QuakeC Programming
View previous topic :: View next topic  
Author Message
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Mon Oct 01, 2007 9:17 pm    Post subject: Reply with quote

Quote:
The only problem is the direction in which the player (attacker)moves varies. Is there a way to make the player move backwards?


Yes. Change the line to this:

Code:

makevectors (attacker.angles);
attacker.velocity = attacker.velocity - v_forward * 200;

_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Mon Oct 01, 2007 11:17 pm    Post subject: Reply with quote

Nice! You da man!
I want to learn so, what do those lines mean in laymans terms?
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Mon Oct 01, 2007 11:46 pm    Post subject: Reply with quote

Well, makevectors() will create v_forward, v_up and v_right vectors.
As v_forward/up/right are global vectors, if you call a function that uses a v_forward without a makevectors() for example, v_forward will be the direction you (or other client) are facing. That's why W_FireLightning don't need to call makevectors() because it is called every frame in PlayerPreThink(), and called once in W_Attack().

And that's why attacker.velocity is using v_forward, just to make the attacker go backwards. And the attacker is goind backwards because the line is this:

Code:

attacker.velocity = attacker.velocity - v_forward * 200;


If you change the minus (-) to plus (+), the attacker will go forward, and notice that there's no v_back, v_left, nor v_down. Just use negative values like the attacker velocity.
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Wed Oct 03, 2007 3:30 am    Post subject: Reply with quote

Thanks for the lesson.

Rocket Jump is all messed up now Crying or Very sad
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Sajt



Joined: 16 Oct 2004
Posts: 1026

PostPosted: Wed Oct 03, 2007 4:13 am    Post subject: Reply with quote

Use .v_angle in the call to makevectors, not .angles.

angles is the one used for drawing player.mdl, and usually only includes a third of the player's pitch angle.
_________________
F. A. Špork, an enlightened nobleman and a great patron of art, had a stately Baroque spa complex built on the banks of the River Labe.
Back to top
View user's profile Send private message
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Wed Oct 03, 2007 4:40 am    Post subject: Reply with quote

Sajt: no need to change makevectors() 'cuz we don't want to make an attacker when firing a rocket downward and hitting an enemy make the attacker fly upwards, so let makevectors() use self.angles, then the attacker will go more backwards than upwards.

redrum: Replace the makevectors() and attacker.velocity stuff by this:

Code:

if (targ != attacker)
{
   makevectors (attacker.angles);
   attacker.velocity = attacker.velocity - v_forward * 200;
}


This will make you rocket jump normally, as T_RadiusDamage() calls T_Damage() on various entities at the same time, it'll be calling T_Damage() to yourself(attacker), but with half damage that when hitting an enemy. So it will check if the target(targ) is not yourself, if the target is yourself, then it will ignore that 2 lines.
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Wed Oct 03, 2007 6:19 pm    Post subject: Reply with quote

Problem is that I have the code in weapons.qc now (W_FireRocket () ).
So it gets called when the weapon fires.
I had it in client.qc before and the code was being called when I pressed the button (didn't have the effect I was looking for especially with the sniper rifle which has a long delay).
In weapons.qc it doesn't recognize "attacker" or "targ".

So, either I get weapons.qc to understand "attacker" and "targ" or I need a way to call the actual weapon firing in client.qc.
Is there a way to do that?
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Wed Oct 03, 2007 11:04 pm    Post subject: Reply with quote

It's obvious that in weapons.qc it doesn't recognize "attacker" or "targ", nor in client.qc.

"attacker" and "targ" are not global entities, they're only used in Killed(), ClientObituary(), T_RadiusDamage() and T_Damage().

But what do you want to do exactly?


Take a look at T_MissileTouch(), that is called when a rocket hits something. You'll see a T_Damage() and a T_RadiusDamage() call.

It looks like this:

Code:

T_Damage (other, self, self.owner, damg );


"other" will be "targ", "self" will be "inflictor", and "self.owner" will be "attacker". They're recognized in T_Damage() only.

Notice that T_Damage() in T_MissileTouch() is only called in an entity that has health, if the entity is a player, it will call if he's not dead and when the rocket hits the player, not the ground or some other wall/ceiling near him.

See T_RadiusDamage():

Code:

T_RadiusDamage (self, self.owner, 120, other);


"self" will be "inflictor", "self.owner" will be "attacker", and "other" will be "ignore" (only used in T_RadiusDamage(), this entity will be ignored to call T_Damage()).

That is, T_RadiusDamage() will ignore the "other", because if the rocket hits a player directly, it will be calling T_Damage(), if you change "other" to "world" in T_RadiusDamage, it will be calling T_Damage() twice at the same entity.

Hope this helps. Smile
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
Chris



Joined: 05 Aug 2006
Posts: 78

PostPosted: Wed Oct 03, 2007 11:22 pm    Post subject: Reply with quote

excuse it if the code is not perfect I'm typing this from memory at work..

add:

makevectors (self.v_angle);

self.velocity = self.velocity + v_forward * -200;

self being in reference to the player. Put this in one of your weapon's fire functions.
Back to top
View user's profile Send private message MSN Messenger
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Thu Oct 04, 2007 12:22 am    Post subject: Reply with quote

Yeah, but we don't want the player to go backwards when firing a weapon, we want the player to go backwards when another player takes damage, that's why these lines are in T_Damage().
But, redrum, if you change mind, you can use the code that Chris posted.
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Thu Oct 04, 2007 2:43 am    Post subject: Reply with quote

Orion, I do want the player to move backward when the shot is fired.
Is there a way, in client.qc, to say:
if (player does not shoot a rocket at himself)?

Chris, thanks but I already have the code in weapons.qc.
The effect works fine with the exception of rocket jumping.
The kickback adversely affects the rocket jump.

So I want to create code that says:

Code:
If (I do not fire a rocket at myself)
        makevectors (self.v_angle);
        self.velocity = self.velocity - v_forward * 200;


So that when i do fire a rocket at myself (rocket jump) the kickback code will not be executed.
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Thu Oct 04, 2007 2:55 am    Post subject: Reply with quote

Now I see.


Add this at W_FireRocket(), between the velocity stuff:

Code:

if (cankick)
{
// velocity codes here
}


Now add this before T_MissileTouch():

Code:

float cankick;


Now add this at the very bottom of T_MissileTouch(), before remove(self):

Code:

cankick = FALSE;
if (vlen(self.owner.origin - self.origin) > 160)
   cankick = TRUE;


This will create a global float called "cankick", and it will check the length between the rocket's origin and your origin.

Man, what a hard work you gave me! Shocked
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Thu Oct 04, 2007 3:47 am    Post subject: Reply with quote

Sorry Laughing
Keepin' you on your toes!
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Orion



Joined: 12 Jan 2007
Posts: 414
Location: Brazil

PostPosted: Thu Oct 04, 2007 2:43 pm    Post subject: Reply with quote

Redrum, there's some mistakes in the code above... I think all the code is a mistake, because it is pretty imprecise, you have to delete the code I posted from T_MissileTouch().

But this code I'll give is the best solution, your problems are over! Very Happy

Add this to W_FireRocket() before the if (cankick), and replace if (cankick) with the code below:

Code:

traceline (self.origin, self.origin + v_forward*160, FALSE, self);
if (trace_fraction == 1)
{
// velocity stuff here
}


Let me explain.
traceline() will trace an invisible line between a point to another, in this case, the line will be traced between your current position plus 160 forward units in the direction you're facing.
160 units is the size of the area of effect of a grenade or rocket, you see 120 in T_RadiusDamage() calls, but in T_RadiusDamage() itself at combat.qc, you'll see that findradius() will search for damageable entities in a sphere of the size of the amount of damage plus 40 units.

trace_fraction in the fraction of the line, that is, if you're close to a wall, probably you'll be less than 160 units away, so the traceline() knows that the rocket you'll fire will hurt yourself, giving you a momentum velocity, and no kickback will be given.
If you're less than 160 units away from a wall, trace_fraction will be less than 1, it could be 0.6, 0.3, or so.

You can reduce the 160 in traceline() if you want the RL to don't kickback only when rocket jumping.

FALSE in traceline() means that the line won't go through players or monsters. TRUE means that the line will go through players or monsters.

And the last "self", is the entity that will be ignored by the line.
_________________
There's no signature here. Stop looking for one.
Back to top
View user's profile Send private message
redrum



Joined: 28 Mar 2007
Posts: 367
Location: Long Island, New York

PostPosted: Thu Oct 04, 2007 7:36 pm    Post subject: Reply with quote

Beautiful explanation. That's how us noobs learn stuff!
Thanks.
_________________
Welcome to the Overlook Hotel 69.113.123.178:27500
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic    Inside3d Forums Forum Index -> QuakeC Programming All times are GMT
Goto page Previous  1, 2, 3  Next
Page 2 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2004 phpBB Group