| 2393 | } |
| 2394 | |
| 2395 | void collide_two_objects(object *A, object *B, vector *collision_point, vector *collision_normal, fvi_info *hit_info) { |
| 2396 | int collision_type; |
| 2397 | int a_num = A - Objects; |
| 2398 | int b_num = B - Objects; |
| 2399 | uint8_t a_good = 0, b_good = 0; |
| 2400 | uint8_t a_hittime_good = 1, b_hittime_good = 1; |
| 2401 | |
| 2402 | // Only do omega particle collisions if specifically allowed |
| 2403 | extern bool Enable_omega_collions; |
| 2404 | if (((A->type == OBJ_WEAPON) && (A->id == OMEGA_INDEX)) || ((B->type == OBJ_WEAPON) && (B->id == OMEGA_INDEX))) |
| 2405 | if (!Enable_omega_collions) |
| 2406 | return; |
| 2407 | |
| 2408 | ASSERT(CollisionResult[A->type][B->type] != RESULT_NOTHING); |
| 2409 | |
| 2410 | collision_type = COLLISION_OF(A->type, B->type); |
| 2411 | |
| 2412 | check_lg_inform(A, B); |
| 2413 | check_lg_inform(B, A); |
| 2414 | |
| 2415 | // mprintf( (0, "Object %d of type %d collided with object %d of type %d\n", A-Objects,A->type, B-Objects, B->type )); |
| 2416 | |
| 2417 | // COLLISION SCRIPT HOOK |
| 2418 | if (Game_mode & GM_MULTI) { |
| 2419 | ASSERT(!(A->flags & OF_DEAD)); |
| 2420 | ASSERT(!(B->flags & OF_DEAD)); |
| 2421 | |
| 2422 | // Make sure we have good scripts to call |
| 2423 | if (A->type == OBJ_PLAYER || A->type == OBJ_ROBOT || A->type == OBJ_POWERUP || A->type == OBJ_WEAPON || |
| 2424 | A->type == OBJ_BUILDING || A->type == OBJ_DOOR || A->type == OBJ_CLUTTER) |
| 2425 | a_good = 1; |
| 2426 | if (B->type == OBJ_PLAYER || B->type == OBJ_ROBOT || B->type == OBJ_POWERUP || B->type == OBJ_WEAPON || |
| 2427 | B->type == OBJ_BUILDING || B->type == OBJ_DOOR || B->type == OBJ_CLUTTER) |
| 2428 | b_good = 1; |
| 2429 | |
| 2430 | if (A->type == OBJ_PLAYER && (Players[A->id].flags & (PLAYER_FLAGS_DYING | PLAYER_FLAGS_DEAD))) |
| 2431 | a_good = 0; |
| 2432 | if (B->type == OBJ_PLAYER && (Players[B->id].flags & (PLAYER_FLAGS_DYING | PLAYER_FLAGS_DEAD))) |
| 2433 | b_good = 0; |
| 2434 | |
| 2435 | if (A->type == OBJ_POWERUP && A->effect_info->last_object_hit == b_num && |
| 2436 | (Gametime - A->effect_info->last_object_hit_time) < 1) { |
| 2437 | a_good = 0; |
| 2438 | a_hittime_good = 0; |
| 2439 | } |
| 2440 | |
| 2441 | if (B->type == OBJ_POWERUP && B->effect_info->last_object_hit == a_num && |
| 2442 | (Gametime - B->effect_info->last_object_hit_time) < 1) { |
| 2443 | b_good = 0; |
| 2444 | b_hittime_good = 0; |
| 2445 | } |
| 2446 | |
| 2447 | if (a_good && b_good) { |
| 2448 | DLLInfo.me_handle = A->handle; |
| 2449 | DLLInfo.it_handle = B->handle; |
| 2450 | DLLInfo.collide_info.point.x = collision_point->x; |
| 2451 | DLLInfo.collide_info.point.y = collision_point->y; |
| 2452 | DLLInfo.collide_info.point.z = collision_point->z; |
no test coverage detected