Index: src/game/g_combat.c =================================================================== --- src/game/g_combat.c (Revision 8374) +++ src/game/g_combat.c (Arbeitskopie) @@ -753,6 +753,7 @@ vec3_t cur_loc; /* The current location of the projectile. */ vec3_t impact; /* The location of the target (-center?) */ vec3_t temp; + vec3_t tracefrom; /* sum */ trace_t tr; /* the traceing */ float acc; /* Accuracy modifier for the angle of the shot. */ float range; /* ?? @todo */ @@ -801,12 +802,13 @@ defined by the fireDef_t. This is not really the impact location, but rather the 'endofrange' location, see below for another use.*/ VectorMA(cur_loc, range, dir, impact); + VectorCopy(cur_loc, tracefrom); /* Do the trace from current position of the projectile to the end_of_range location.*/ /* FIXME: This trace doesn't seam to hit any func_breakable - why?? */ /* mins and maxs should be set via lm_t don't they? */ - tr = gi.trace(cur_loc, NULL, NULL, impact, ent, MASK_SHOT); + tr = gi.trace(tracefrom, NULL, NULL, impact, ent, MASK_SHOT); /* _Now_ we copy the correct impact location. */ VectorCopy(tr.endpos, impact); @@ -867,6 +869,13 @@ break; } + if (!fd->bounce && fd->throughWall) { + if (tr.fraction == 1.0) + break; + VectorMA(tr.endpos, 1, dir, tracefrom); + continue; + } + /* bounce is checked here to see if the rubber rocket hit walls enough times to wear out*/ bounce++; if (bounce > fd->bounce || tr.fraction >= 1.0) Index: src/game/q_shared.h =================================================================== --- src/game/q_shared.h (Revision 8374) +++ src/game/q_shared.h (Arbeitskopie) @@ -1023,6 +1023,7 @@ qboolean launched; qboolean rolled; /**< Can it be rolled - e.g. grenades */ qboolean reaction; /**< This firemode can be used/selected for reaction fire.*/ + qboolean throughWall; /**< allow the shooting throw a wall */ byte dmgtype; float speed; vec2_t shotOrg; Index: src/qcommon/scripts.c =================================================================== --- src/qcommon/scripts.c (Revision 8374) +++ src/qcommon/scripts.c (Arbeitskopie) @@ -99,6 +99,7 @@ {"impsnd", V_STRING, offsetof(fireDef_t, impactSound), 0}, {"bodysnd", V_STRING, offsetof(fireDef_t, hitBodySound), 0}, {"bncsnd", V_STRING, offsetof(fireDef_t, bounceSound), 0}, + {"throughwall", V_BOOL, offsetof(fireDef_t, throughWall), MEMBER_SIZEOF(fireDef_t, throughWall)}, {"sndonce", V_BOOL, offsetof(fireDef_t, soundOnce), MEMBER_SIZEOF(fireDef_t, soundOnce)}, {"gravity", V_BOOL, offsetof(fireDef_t, gravity), MEMBER_SIZEOF(fireDef_t, gravity)}, {"launched", V_BOOL, offsetof(fireDef_t, launched), MEMBER_SIZEOF(fireDef_t, launched)},