50 float danger_old_time, danger_new_time;
55 if (danger_new_time < danger_old_time) {
75 weapon_hit(weapon_obj, pship_obj, world_hitpos, quadrant_num);
88 float blast = wip->
mass;
125 mc_info mc, mc_shield, mc_hull;
131 Assert( ship_objp != NULL );
138 Assert( weapon_objp != NULL );
154 if (dist < weapon_objp->phys_info.speed) {
158 int valid_hit_occurred = 0;
159 int quadrant_num = -1;
163 vec3d weapon_end_pos;
177 mc.
p1 = &weapon_end_pos;
179 memcpy(&mc_shield, &mc,
sizeof(
mc_info));
180 memcpy(&mc_hull, &mc,
sizeof(
mc_info));
202 int shield_collision = 0;
203 int hull_collision = 0;
212 float min_weapon_span;
223 if (weapon_flown_for < min_weapon_span) {
241 ignored_range = 0.0f;
244 float active_range = this_range - ignored_range;
248 if (ignored_range > 0.0
f) {
250 mc_shield.
p1 = &shield_ignored_until;
254 mc_shield.
p1 = &weapon_end_pos;
261 if (!shield_collision && weapon_flown_for + this_range > min_weapon_span) {
262 mc_shield.
p0 = &shield_ignored_until;
264 mc_shield.
p1 = &weapon_end_pos;
283 mc_shield.
p1 = &weapon_end_pos;
284 mc_shield.
hit_dist = (ignored_range + (active_range * mc_shield.
hit_dist)) / this_range;
287 if (shield_collision) {
312 if (!shield_collision) {
334 memcpy(&mc_hull, &mc_shield,
sizeof(
mc_info));
335 hull_collision = shield_collision;
340 shield_collision = 0;
347 if (shield_collision) {
356 if (quadrant_num >= 0) {
367 valid_hit_occurred = 1;
372 if (shield_collision && valid_hit_occurred)
374 memcpy(&mc, &mc_shield,
sizeof(
mc_info));
375 Assert(quadrant_num >= 0);
377 else if (hull_collision)
379 memcpy(&mc, &mc_hull,
sizeof(
mc_info));
380 valid_hit_occurred = 1;
386 (valid_hit_occurred))
388 vec3d warp_pnt, hit_direction;
396 if (
vm_vec_dot(&hit_direction, &warp_orient.
vec.fvec) < 0.0f)
398 valid_hit_occurred = 0;
403 if (next_hit && valid_hit_occurred) {
411 if ( valid_hit_occurred )
422 if(!ship_override && !weapon_override) {
423 if (shield_collision && quadrant_num >= 0) {
432 if(!(weapon_override && !ship_override))
436 if((weapon_override && !ship_override) || (!weapon_override && !ship_override))
453 valid_hit_occurred = 1;
460 return valid_hit_occurred;
472 object *
ship = pair->
a;
473 object *weapon_obj = pair->
b;
532 factor = 1.0f - (
float)exp( -exponent );
550 float time_to_max_error, time_to_exit_sphere;
551 float ship_speed_at_exit_sphere, error_at_exit_sphere;
564 error_at_exit_sphere = error_vel_mag * time_to_exit_sphere;
565 time_to_max_error = max_error / error_at_exit_sphere * time_to_exit_sphere;
573 limit_time = time_to_exit_sphere;
587 }
else if (hit_time > 200) {
597 if (limit_time > time_to_max_error) {
599 if (1000*time_to_max_error > 200) {
void mc_info_init(mc_info *mc)
int model_collide(mc_info *mc_info_obj)
int timestamp(int delta_ms)
#define SIF2_SURFACE_SHIELDS
#define MULTIPLAYER_CLIENT
#define MY_NET_PLAYER_NUM
char wing_status_wing_pos
weapon Weapons[MAX_WEAPONS]
float vm_vec_mag_quick(const vec3d *v)
#define PCM_WARPOUT_STAGE1
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
polymodel * model_get(int model_num)
weapon_info Weapon_info[MAX_WEAPON_TYPES]
char wing_status_wing_index
int check_inside_radius_for_big_ships(object *ship, object *weapon_obj, obj_pair *pair)
int get_quadrant(vec3d *hit_pnt, object *shipobjp)
virtual int getWarpOrientation(matrix *output)
struct vec3d::@225::@227 xyz
#define SF2_DONT_COLLIDE_INVIS
ai_info Ai_info[MAX_AI_INFO]
void update_danger_weapon(object *pship_obj, object *weapon_obj)
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
int reject_due_collision_groups(object *A, object *B)
float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target)
int auto_shield_spread_from_lod
void ship_apply_whack(vec3d *force, vec3d *hit_pos, object *objp)
script_state Script_system("FS2_Open Scripting")
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
void vm_vec_add2(vec3d *dest, const vec3d *src)
WarpEffect * warpout_effect
struct matrix::@228::@230 vec
bool auto_shield_spread_bypass
virtual int getWarpPosition(vec3d *output)
void vm_vec_scale(vec3d *dest, float s)
int ship_weapon_check_collision(object *ship_objp, object *weapon_objp, float time_limit=0.0f, int *next_hit=NULL)
void weapon_hit(object *weapon_obj, object *other_obj, vec3d *hitpos, int quadrant=-1)
float shield_impact_explosion_radius
void hud_shield_quadrant_hit(object *objp, int quadrant)
int danger_weapon_signature
int weapon_will_never_hit(object *obj_weapon, object *other, obj_pair *current_pair)
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
float vm_vec_dist(const vec3d *v0, const vec3d *v1)
#define SIF2_AUTO_SPREAD_SHIELDS
int collide_ship_weapon(obj_pair *pair)
#define MC_CHECK_SPHERELINE
float vm_vec_dist_squared(const vec3d *v0, const vec3d *v1)
int shield_impact_explosion_anim
object Objects[MAX_OBJECTS]
#define CHA_COLLIDEWEAPON
void vm_vec_copy_scale(vec3d *dest, const vec3d *src, float s)
void add_shield_point(int objnum, int tri_num, vec3d *hit_pos)
#define WIF2_PIERCE_SHIELDS
int RunCondition(int condition, char format='\0', void *data=NULL, class object *objp=NULL, int more_data=0)
void SetHookObjects(int num,...)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
float forward_accel_time_const
void RemHookVars(unsigned int num,...)
#define MULTIPLAYER_MASTER
SCP_vector< ship_info > Ship_info
void ship_apply_local_damage(object *ship_objp, object *other_obj, vec3d *hitpos, float damage, int quadrant, bool create_spark, int submodel_num, vec3d *hit_normal)
void shield_impact_explosion(vec3d *hitpos, object *objp, float radius, int idx)
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
void hud_wingman_status_start_flash(int wing_index, int wing_pos)
float estimate_ship_speed_upper_limit(object *ship, float time)
void ship_weapon_do_hit_stuff(object *pship_obj, object *weapon_obj, vec3d *world_hitpos, vec3d *hitpos, int quadrant_num, int submodel_num, vec3d hit_dir)
int multi_find_player_by_object(object *objp)
bool IsConditionOverride(int action, object *objp=NULL)
net_player Net_players[MAX_PLAYERS]
float ai_endangered_time(object *ship_objp, object *weapon_objp)
int ship_is_shield_up(object *obj, int quadrant)
void send_player_pain_packet(net_player *pl, int weapon_info_index, float damage, vec3d *force, vec3d *hitpos, int quadrant_num)
float auto_shield_spread_min_span
float vm_vec_normalize(vec3d *v)