Skip to content

Commit 3047a22

Browse files
authored
Better account for runtime gravity changes (#5130)
* better account for changing gravity * use `obj_used_list` * check should_be_dead
1 parent 9974457 commit 3047a22

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed

code/object/objcollide.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,3 +1042,28 @@ void obj_sort_and_collide(SCP_vector<int>* Collision_list)
10421042
}
10431043
obj_find_overlap_colliders(sort_list_y, sort_list_z, 2, true);
10441044
}
1045+
1046+
void collide_apply_gravity_flags_weapons() {
1047+
for (object* obj = GET_FIRST(&obj_used_list); obj != END_OF_LIST(&obj_used_list); obj = GET_NEXT(obj)) {
1048+
if (obj->type != OBJ_WEAPON || obj->flags[Object::Object_Flags::Should_be_dead])
1049+
continue;
1050+
1051+
weapon* wp = &Weapons[obj->instance];
1052+
weapon_info* wip = &Weapon_info[wp->weapon_info_index];
1053+
1054+
if (!wip->is_homing() || (wp->weapon_flags[Weapon::Weapon_Flags::No_homing])) {
1055+
// homing weapons dont get any gravity stuff
1056+
if (wip->acceleration_time <= 0.0f || Missiontime - wp->creation_time >= fl2f(wip->acceleration_time)) {
1057+
// if the weapon doesn't accelerate, or has finished accelerating...
1058+
if (The_mission.gravity == vmd_zero_vector || obj->phys_info.gravity_const == 0.0f) {
1059+
obj->phys_info.flags |= PF_CONST_VEL;
1060+
obj->phys_info.flags &= ~PF_BALLISTIC;
1061+
}
1062+
else {
1063+
obj->phys_info.flags |= PF_BALLISTIC;
1064+
obj->phys_info.flags &= ~PF_CONST_VEL;
1065+
}
1066+
}
1067+
}
1068+
}
1069+
}

code/object/objcollide.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,8 @@ int get_ship_quadrant_from_global(vec3d *global_pos, object *objp);
134134
int reject_due_collision_groups(object *A, object *B);
135135

136136
void init_collision_info_struct(collision_info_struct *cis);
137+
138+
// goes over weapons applying gravity-relevant flags
139+
// VERY IMPORTANT if gravity was just turned on or off
140+
void collide_apply_gravity_flags_weapons();
137141
#endif

code/parse/sexp.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13724,8 +13724,15 @@ void sexp_set_gravity_accel(int node)
1372413724
return;
1372513725

1372613726
float fl_accel = (float)(-accel) / 100.0f;
13727+
vec3d old_gravity = The_mission.gravity;
1372713728
The_mission.gravity = vm_vec_new(0.0f, fl_accel, 0.0f);
1372813729

13730+
if ((IS_VEC_NULL(&old_gravity) && !IS_VEC_NULL(&The_mission.gravity)) ||
13731+
(!IS_VEC_NULL(&old_gravity) && IS_VEC_NULL(&The_mission.gravity))) {
13732+
// gravity was turned on or turned off
13733+
collide_apply_gravity_flags_weapons();
13734+
}
13735+
1372913736
// do the multiplayer callback
1373013737
if (MULTIPLAYER_MASTER) {
1373113738
Current_sexp_network_packet.start_callback();
@@ -13740,7 +13747,13 @@ void multi_sexp_set_gravity_accel()
1374013747

1374113748
Current_sexp_network_packet.get_float(accel);
1374213749

13750+
vec3d old_gravity = The_mission.gravity;
1374313751
The_mission.gravity = vm_vec_new(0.0f, accel, 0.0f);
13752+
if ((IS_VEC_NULL(&old_gravity) && !IS_VEC_NULL(&The_mission.gravity)) ||
13753+
(!IS_VEC_NULL(&old_gravity) && IS_VEC_NULL(&The_mission.gravity))) {
13754+
// gravity was turned on or turned off
13755+
collide_apply_gravity_flags_weapons();
13756+
}
1374413757
}
1374513758

1374613759
// this function get called by send-message or send-message random with the name of the message, sender,

code/scripting/api/libs/mission.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,7 +1598,14 @@ ADE_VIRTVAR(Gravity, l_Mission, "vector", "Gravity acceleration vector in meters
15981598

15991599
if (ADE_SETTING_VAR && ade_get_args(L, "*o", l_Vector.GetPtr(&gravity_vec)))
16001600
{
1601+
vec3d old_gravity = The_mission.gravity;
16011602
The_mission.gravity = *gravity_vec;
1603+
1604+
if ((IS_VEC_NULL(&old_gravity) && !IS_VEC_NULL(&The_mission.gravity)) ||
1605+
(!IS_VEC_NULL(&old_gravity) && IS_VEC_NULL(&The_mission.gravity))) {
1606+
// gravity was turned on or turned off
1607+
collide_apply_gravity_flags_weapons();
1608+
}
16021609
}
16031610

16041611
return ade_set_args(L, "o", l_Vector.Set(The_mission.gravity));

0 commit comments

Comments
 (0)