@@ -2769,13 +2769,10 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
2769
2769
br_matrix34 message_mat ;
2770
2770
LOG_TRACE ("(%p, %f)" , c , dt );
2771
2771
2772
- tCar_spec * car_spec ; // added for readability
2773
-
2774
2772
// v34 = 0;
2775
2773
// v35 = 0;
2776
2774
// v36 = 0x3F800000;
2777
2775
// v48 = 0x3F800347;
2778
- car_spec = (tCar_spec * )c ;
2779
2776
mat = & c -> car_master_actor -> t .t .mat ;
2780
2777
oldmat = & c -> oldmat ;
2781
2778
k = 0 ;
@@ -3040,7 +3037,7 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
3040
3037
BrVector3Set (& normal_force , 0.f , 0.f , 0.f );
3041
3038
BrVector3Set (& c -> omega , 0.f , 0.f , 0.f );
3042
3039
BrVector3Set (& c -> oldomega , 0.f , 0.f , 0.f );
3043
- if (c -> driver <= eDriver_non_car || car_spec -> max_force_rear == 0.0f ) {
3040
+ if (c -> driver <= eDriver_non_car || CAR ( c ) -> max_force_rear == 0.0f ) {
3044
3041
if (c -> driver <= eDriver_non_car ) {
3045
3042
PipeSingleNonCar (c );
3046
3043
}
@@ -3060,17 +3057,23 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
3060
3057
}
3061
3058
BrVector3Accumulate (& c -> v , & norm );
3062
3059
if (c -> driver >= eDriver_net_human ) {
3063
- BrVector3Scale (& normal_force , & normal_force , gDefensive_powerup_factor [car_spec -> power_up_levels [0 ]]);
3060
+ BrVector3Scale (& normal_force , & normal_force , gDefensive_powerup_factor [CAR ( c ) -> power_up_levels [0 ]]);
3064
3061
}
3065
3062
if (c -> driver < eDriver_net_human ) {
3066
3063
BrVector3Scale (& normal_force , & normal_force , 0.01f );
3067
3064
} else {
3068
3065
BrVector3Scale (& normal_force , & normal_force , 0.75f );
3069
3066
}
3070
- if (CAR (c )-> invulnerable
3071
- || (c -> driver < eDriver_net_human && (c -> driver != eDriver_oppo || PointOutOfSight (& c -> pos , 150.0f )))
3072
- || ((v_diff = (car_spec -> pre_car_col_velocity .v [1 ] - c -> v .v [1 ]) * gDefensive_powerup_factor [car_spec -> power_up_levels [0 ]]) >= -20.0f )
3073
- || CAR (c )-> number_of_wheels_on_ground >= 3 ) {
3067
+ if (
3068
+ #if defined(DETHRACE_FIX_BUGS )
3069
+ // `c` is only a `tCar_spec*` if the driver is an opponent or human, otherwise, it will be a `tNon_car_spec*`. The following code
3070
+ // assumes `c` is a `tCar_spec*`, causing invalid memory accesses
3071
+ c -> driver >= eDriver_oppo &&
3072
+ #endif
3073
+ (CAR (c )-> invulnerable
3074
+ || (c -> driver < eDriver_net_human && (c -> driver != eDriver_oppo || PointOutOfSight (& c -> pos , 150.0f )))
3075
+ || ((v_diff = (CAR (c )-> pre_car_col_velocity .v [1 ] - c -> v .v [1 ]) * gDefensive_powerup_factor [CAR (c )-> power_up_levels [0 ]]) >= -20.0f )
3076
+ || CAR (c )-> number_of_wheels_on_ground >= 3 )) {
3074
3077
CrushAndDamageCar (CAR (c ), & dir , & normal_force , NULL );
3075
3078
} else {
3076
3079
// Cops Special Forces is always stolen if destroyed!
@@ -3079,12 +3082,19 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
3079
3082
StealCar (CAR (c ));
3080
3083
v_diff = v_diff * 5.0f ;
3081
3084
}
3082
- for (i = 0 ; i < CAR (c )-> car_actor_count ; i ++ ) {
3083
- ts2 = (v_diff + 20.0f ) * -0.01f ;
3084
- TotallySpamTheModel (CAR (c ), i , CAR (c )-> car_model_actors [i ].actor , & CAR (c )-> car_model_actors [i ].crush_data , ts2 );
3085
- }
3086
- for (i = 0 ; i < COUNT_OF (CAR (c )-> damage_units ); i ++ ) {
3087
- DamageUnit (CAR (c ), i , IRandomPosNeg (5 ) + (v_diff + 20.0f ) * -1.5f );
3085
+ #if defined(DETHRACE_FIX_BUGS )
3086
+ // `c` is only a `tCar_spec*` if the driver is an opponent or human, otherwise, it will be a `tNon_car_spec*`. The following code
3087
+ // assumes `c` is a `tCar_spec*`, causing invalid memory accesses
3088
+ if (c -> driver >= eDriver_oppo )
3089
+ #endif
3090
+ {
3091
+ for (i = 0 ; i < CAR (c )-> car_actor_count ; i ++ ) {
3092
+ ts2 = (v_diff + 20.0f ) * -0.01f ;
3093
+ TotallySpamTheModel (CAR (c ), i , CAR (c )-> car_model_actors [i ].actor , & CAR (c )-> car_model_actors [i ].crush_data , ts2 );
3094
+ }
3095
+ for (i = 0 ; i < COUNT_OF (CAR (c )-> damage_units ); i ++ ) {
3096
+ DamageUnit (CAR (c ), i , IRandomPosNeg (5 ) + (v_diff + 20.0f ) * -1.5f );
3097
+ }
3088
3098
}
3089
3099
}
3090
3100
if (!noise_defeat ) {
@@ -3094,7 +3104,7 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
3094
3104
BrVector3InvScale (& tv , & tv , WORLD_SCALE );
3095
3105
BrMatrix34ApplyV (& bb , & tv , & c -> car_master_actor -> t .t .mat );
3096
3106
BrMatrix34ApplyV (& norm , & p_vel , & c -> car_master_actor -> t .t .mat );
3097
- CreateSparks (& pos , & bb , & norm , gCurrent_race .material_modifiers [gMaterial_index ].sparkiness , car_spec );
3107
+ CreateSparks (& pos , & bb , & norm , gCurrent_race .material_modifiers [gMaterial_index ].sparkiness , CAR ( c ) );
3098
3108
}
3099
3109
return k ;
3100
3110
} else {
0 commit comments