Code: Select all
gentity_t *weapon_gpg40_fire (gentity_t *ent, int grenType) {
gentity_t *m/*, *te*/; // JPW NERVE
trace_t tr;
vec3_t viewpos;
// float upangle = 0, pitch; // start with level throwing and adjust based on angle
vec3_t tosspos;
//bani - to prevent nade-through-teamdoor sploit
vec3_t orig_viewpos;
AngleVectors(ent->client->ps.viewangles, forward, NULL, NULL);
VectorCopy(muzzleEffect, tosspos);
// check for valid start spot (so you don't throw through or get stuck in a wall)
VectorCopy( ent->s.pos.trBase, viewpos );
viewpos[2] += ent->client->ps.viewheight;
VectorCopy( viewpos, orig_viewpos ); //bani - to prevent nade-through-teamdoor sploit
VectorMA( viewpos, 32, forward, viewpos);
//bani - to prevent nade-through-teamdoor sploit
trap_Trace( &tr, orig_viewpos, tv( -4.f, -4.f, 0.f ), tv( 4.f, 4.f, 6.f ), viewpos, ent->s.number, MASK_MISSILESHOT );
if( tr.fraction < 1 ) { // oops, bad launch spot ) {
VectorCopy( tr.endpos, tosspos );
SnapVectorTowards( tosspos, orig_viewpos );
} else {
trap_Trace (&tr, viewpos, tv(-4.f, -4.f, 0.f), tv(4.f, 4.f, 6.f), tosspos, ent->s.number, MASK_MISSILESHOT);
if( tr.fraction < 1 ) { // oops, bad launch spot
VectorCopy(tr.endpos, tosspos);
SnapVectorTowards( tosspos, viewpos );
}
}
VectorScale(forward, 2000, forward);
m = fire_grenade (ent, tosspos, forward, grenType);
m->damage = 0;
// Ridah, return the grenade so we can do some prediction before deciding if we really want to throw it or not
return m;
}