1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#include "object/objcollide.h"
#include "object/object.h"
#include "asteroid/asteroid.h"
#include "debris/debris.h"
#include "weapon/weapon.h"
#include "math/fvi.h"
#include "parse/scripting.h"
// placeholder struct for ship_debris collisions
typedef struct ship_weapon_debris_struct {
object *ship_object;
object *debris_object;
vec3d ship_collision_cm_pos;
vec3d r_ship;
vec3d collision_normal;
int shield_hit_tri;
vec3d shield_hit_tri_point;
float impulse;
} ship_weapon_debris_struct;
/**
* Checks debris-weapon collisions.
* @param pair obj_pair pointer to the two objects. pair->a is debris and pair->b is weapon.
* @return 1 if all future collisions between these can be ignored
*/
int collide_debris_weapon( obj_pair * pair )
{
vec3d hitpos;
int hit;
object *pdebris = pair->a;
object *weapon = pair->b;
Assert( pdebris->type == OBJ_DEBRIS );
Assert( weapon->type == OBJ_WEAPON );
// first check the bounding spheres of the two objects.
hit = fvi_segment_sphere(&hitpos, &weapon->last_pos, &weapon->pos, &pdebris->pos, pdebris->radius);
if (hit) {
hit = debris_check_collision(pdebris, weapon, &hitpos );
if ( !hit )
return 0;
Script_system.SetHookObjects(4, "Weapon", weapon, "Debris", pdebris, "Self",weapon, "Object", pdebris);
bool weapon_override = Script_system.IsConditionOverride(CHA_COLLIDEDEBRIS, weapon);
Script_system.SetHookObjects(2, "Self",pdebris, "Object", weapon);
bool debris_override = Script_system.IsConditionOverride(CHA_COLLIDEWEAPON, pdebris);
if(!weapon_override && !debris_override)
{
weapon_hit( weapon, pdebris, &hitpos );
debris_hit( pdebris, weapon, &hitpos, Weapon_info[Weapons[weapon->instance].weapon_info_index].damage );
}
Script_system.SetHookObjects(2, "Self",weapon, "Object", pdebris);
if(!(debris_override && !weapon_override))
Script_system.RunCondition(CHA_COLLIDEDEBRIS, '\0', NULL, weapon);
Script_system.SetHookObjects(2, "Self",pdebris, "Object", weapon);
if((debris_override && !weapon_override) || (!debris_override && !weapon_override))
Script_system.RunCondition(CHA_COLLIDEWEAPON, '\0', NULL, pdebris);
Script_system.RemHookVars(4, "Weapon", "Debris", "Self","ObjectB");
return 0;
} else {
return weapon_will_never_hit( weapon, pdebris, pair );
}
}
/**
* Checks debris-weapon collisions.
* @param pair obj_pair pointer to the two objects. pair->a is debris and pair->b is weapon.
* @return 1 if all future collisions between these can be ignored
*/
int collide_asteroid_weapon( obj_pair * pair )
{
if (!Asteroids_enabled)
return 0;
vec3d hitpos;
int hit;
object *pasteroid = pair->a;
object *weapon = pair->b;
Assert( pasteroid->type == OBJ_ASTEROID);
Assert( weapon->type == OBJ_WEAPON );
// first check the bounding spheres of the two objects.
hit = fvi_segment_sphere(&hitpos, &weapon->last_pos, &weapon->pos, &pasteroid->pos, pasteroid->radius);
if (hit) {
hit = asteroid_check_collision(pasteroid, weapon, &hitpos );
if ( !hit )
return 0;
Script_system.SetHookObjects(4, "Weapon", weapon, "Asteroid", pasteroid, "Self",weapon, "Object", pasteroid);
bool weapon_override = Script_system.IsConditionOverride(CHA_COLLIDEASTEROID, weapon);
Script_system.SetHookObjects(2, "Self",pasteroid, "Object", weapon);
bool asteroid_override = Script_system.IsConditionOverride(CHA_COLLIDEWEAPON, pasteroid);
if(!weapon_override && !asteroid_override)
{
weapon_hit( weapon, pasteroid, &hitpos );
asteroid_hit( pasteroid, weapon, &hitpos, Weapon_info[Weapons[weapon->instance].weapon_info_index].damage );
}
Script_system.SetHookObjects(2, "Self",weapon, "Object", pasteroid);
if(!(asteroid_override && !weapon_override))
Script_system.RunCondition(CHA_COLLIDEASTEROID, '\0', NULL, weapon);
Script_system.SetHookObjects(2, "Self",pasteroid, "Object", weapon);
if((asteroid_override && !weapon_override) || (!asteroid_override && !weapon_override))
Script_system.RunCondition(CHA_COLLIDEWEAPON, '\0', NULL, pasteroid);
Script_system.RemHookVars(4, "Weapon", "Asteroid", "Self","ObjectB");
return 0;
} else {
return weapon_will_never_hit( weapon, pasteroid, pair );
}
}
|