Skip to content

Commit 7cceae0

Browse files
committed
implement collision hooks
1 parent 2ae6377 commit 7cceae0

File tree

6 files changed

+101
-100
lines changed

6 files changed

+101
-100
lines changed

code/object/collidedebrisship.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -458,26 +458,24 @@ int collide_debris_prop(obj_pair* pair)
458458
bool has_submodel = (debris_hit_info.heavy_submodel_num >= 0);
459459
scripting::api::submodel_h smh(debris_hit_info.heavy_model_num, debris_hit_info.heavy_submodel_num);
460460

461-
// TODO PROP
462-
/*
463461
if (scripting::hooks::OnDebrisCollision->isActive()) {
464-
ship_override = scripting::hooks::OnDebrisCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, debris_objp} },
465-
scripting::hook_param_list(scripting::hook_param("Self", 'o', ship_objp),
462+
ship_override = scripting::hooks::OnDebrisCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, debris_objp} },
463+
scripting::hook_param_list(scripting::hook_param("Self", 'o', prop_objp),
466464
scripting::hook_param("Object", 'o', debris_objp),
467-
scripting::hook_param("Ship", 'o', ship_objp),
465+
scripting::hook_param("Ship", 'o', prop_objp),
468466
scripting::hook_param("Debris", 'o', debris_objp),
469467
scripting::hook_param("Hitpos", 'o', hitpos)));
470468
}
471469

472-
if (scripting::hooks::OnShipCollision->isActive()) {
473-
debris_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, debris_objp} },
470+
if (scripting::hooks::OnPropCollision->isActive()) {
471+
debris_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, debris_objp} },
474472
scripting::hook_param_list(scripting::hook_param("Self", 'o', debris_objp),
475-
scripting::hook_param("Object", 'o', ship_objp),
476-
scripting::hook_param("Ship", 'o', ship_objp),
473+
scripting::hook_param("Object", 'o', prop_objp),
474+
scripting::hook_param("Prop", 'o', prop_objp),
477475
scripting::hook_param("Debris", 'o', debris_objp),
478476
scripting::hook_param("Hitpos", 'o', hitpos),
479-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (debris_hit_info.heavy == ship_objp))));
480-
}*/
477+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (debris_hit_info.heavy == prop_objp))));
478+
}
481479

482480
if (!ship_override && !debris_override)
483481
{
@@ -591,26 +589,24 @@ int collide_asteroid_prop(obj_pair* pair)
591589
bool has_submodel = (asteroid_hit_info.heavy_submodel_num >= 0);
592590
scripting::api::submodel_h smh(asteroid_hit_info.heavy_model_num, asteroid_hit_info.heavy_submodel_num);
593591

594-
//Scripting support (WMC)
595-
// TODO PROP
596-
/*
592+
//Scripting support
597593
if (scripting::hooks::OnAsteroidCollision->isActive()) {
598-
ship_override = scripting::hooks::OnAsteroidCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, asteroid_objp} },
599-
scripting::hook_param_list(scripting::hook_param("Self", 'o', ship_objp),
594+
ship_override = scripting::hooks::OnAsteroidCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, asteroid_objp} },
595+
scripting::hook_param_list(scripting::hook_param("Self", 'o', prop_objp),
600596
scripting::hook_param("Object", 'o', asteroid_objp),
601-
scripting::hook_param("Ship", 'o', ship_objp),
597+
scripting::hook_param("Prop", 'o', prop_objp),
602598
scripting::hook_param("Asteroid", 'o', asteroid_objp),
603599
scripting::hook_param("Hitpos", 'o', hitpos)));
604600
}
605601
if (scripting::hooks::OnShipCollision->isActive()) {
606-
asteroid_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, asteroid_objp} },
602+
asteroid_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, asteroid_objp} },
607603
scripting::hook_param_list(scripting::hook_param("Self", 'o', asteroid_objp),
608-
scripting::hook_param("Object", 'o', ship_objp),
609-
scripting::hook_param("Ship", 'o', ship_objp),
604+
scripting::hook_param("Object", 'o', prop_objp),
605+
scripting::hook_param("Prop", 'o', prop_objp),
610606
scripting::hook_param("Asteroid", 'o', asteroid_objp),
611607
scripting::hook_param("Hitpos", 'o', hitpos),
612-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (asteroid_hit_info.heavy == ship_objp))));
613-
}*/
608+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (asteroid_hit_info.heavy == prop_objp))));
609+
}
614610

615611
if (!ship_override && !asteroid_override)
616612
{

code/object/collideshipship.cpp

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,30 +1649,25 @@ int collide_prop_ship(obj_pair* pair)
16491649
bool has_submodel = (prop_ship_hit_info.heavy_submodel_num >= 0);
16501650
scripting::api::submodel_h smh(prop_ship_hit_info.heavy_model_num, prop_ship_hit_info.heavy_submodel_num);
16511651

1652-
// TODO PROP
1653-
/*
16541652
if (scripting::hooks::OnShipCollision->isActive()) {
1655-
a_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{{A, B}},
1656-
scripting::hook_param_list(scripting::hook_param("Self", 'o', A),
1657-
scripting::hook_param("Object", 'o', B),
1658-
scripting::hook_param("Ship", 'o', A),
1659-
scripting::hook_param("ShipB", 'o', B),
1653+
a_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{{prop_objp, ship_objp}},
1654+
scripting::hook_param_list(scripting::hook_param("Self", 'o', prop_objp),
1655+
scripting::hook_param("Object", 'o', ship_objp),
1656+
scripting::hook_param("Prop", 'o', prop_objp),
1657+
scripting::hook_param("Ship", 'o', ship_objp),
16601658
scripting::hook_param("Hitpos", 'o', world_hit_pos),
1661-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (ship_ship_hit_info.heavy == A)),
1662-
scripting::hook_param("ShipBSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (ship_ship_hit_info.heavy == B))));
1659+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (prop_ship_hit_info.heavy == prop_objp))));
16631660

16641661
// Yes, this should be reversed.
1665-
b_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {A, B} },
1666-
scripting::hook_param_list(scripting::hook_param("Self", 'o', B),
1667-
scripting::hook_param("Object", 'o', A),
1668-
scripting::hook_param("Ship", 'o', B),
1669-
scripting::hook_param("ShipB", 'o', A),
1662+
b_override = scripting::hooks::OnPropCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, ship_objp} },
1663+
scripting::hook_param_list(scripting::hook_param("Self", 'o', ship_objp),
1664+
scripting::hook_param("Object", 'o', prop_objp),
1665+
scripting::hook_param("Ship", 'o', ship_objp),
1666+
scripting::hook_param("Prop", 'o', prop_objp),
16701667
scripting::hook_param("Hitpos", 'o', world_hit_pos),
1671-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (ship_ship_hit_info.heavy == B)),
1672-
scripting::hook_param("ShipBSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (ship_ship_hit_info.heavy == A))));
1668+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel && (prop_ship_hit_info.heavy == ship_objp))));
16731669

16741670
}
1675-
*/
16761671

16771672
if (!a_override && !b_override)
16781673
{

code/object/collideshipweapon.cpp

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,6 @@ static int prop_weapon_check_collision(object* prop_objp, object* weapon_objp, f
642642
Assert(propp->objnum == OBJ_INDEX(prop_objp));
643643

644644
int valid_hit_occurred = 0; // If this is set, then hitpos is set
645-
polymodel* pm = model_get(prinfo->model_num);
646645

647646
// total time is flFrametime + time_limit (time_limit used to predict collisions into the future)
648647
vec3d weapon_start_pos = weapon_objp->last_pos;
@@ -692,56 +691,52 @@ static int prop_weapon_check_collision(object* prop_objp, object* weapon_objp, f
692691
wp->collisionInfo = new mc_info; // The weapon will free this memory later
693692
*wp->collisionInfo = mc;
694693

695-
bool ship_override = false, weapon_override = false;
694+
bool prop_override = false, weapon_override = false;
696695

697696
// get submodel handle if scripting needs it
698697
bool has_submodel = (mc.hit_submodel >= 0);
699698
scripting::api::submodel_h smh(mc.model_num, mc.hit_submodel);
700699

701700

702-
// TODO PROP
703-
/*
704701
if (scripting::hooks::OnWeaponCollision->isActive()) {
705-
ship_override = scripting::hooks::OnWeaponCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, weapon_objp} },
706-
scripting::hook_param_list(scripting::hook_param("Self", 'o', ship_objp),
702+
prop_override = scripting::hooks::OnWeaponCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, weapon_objp} },
703+
scripting::hook_param_list(scripting::hook_param("Self", 'o', prop_objp),
707704
scripting::hook_param("Object", 'o', weapon_objp),
708-
scripting::hook_param("Ship", 'o', ship_objp),
705+
scripting::hook_param("Prop", 'o', prop_objp),
709706
scripting::hook_param("Weapon", 'o', weapon_objp),
710-
scripting::hook_param("Hitpos", 'o', mc->hit_point_world)));
707+
scripting::hook_param("Hitpos", 'o', mc.hit_point_world)));
711708
}
712-
if (scripting::hooks::OnShipCollision->isActive()) {
713-
weapon_override = scripting::hooks::OnShipCollision->isOverride(scripting::hooks::CollisionConditions{ {ship_objp, weapon_objp} },
709+
if (scripting::hooks::OnPropCollision->isActive()) {
710+
weapon_override = scripting::hooks::OnPropCollision->isOverride(scripting::hooks::CollisionConditions{ {prop_objp, weapon_objp} },
714711
scripting::hook_param_list(scripting::hook_param("Self", 'o', weapon_objp),
715-
scripting::hook_param("Object", 'o', ship_objp),
716-
scripting::hook_param("Ship", 'o', ship_objp),
712+
scripting::hook_param("Object", 'o', prop_objp),
713+
scripting::hook_param("Prop", 'o', prop_objp),
717714
scripting::hook_param("Weapon", 'o', weapon_objp),
718-
scripting::hook_param("Hitpos", 'o', mc->hit_point_world),
719-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel)));
720-
}*/
715+
scripting::hook_param("Hitpos", 'o', mc.hit_point_world),
716+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel)));
717+
}
721718

722-
if (!ship_override && !weapon_override) {
719+
if (!prop_override && !weapon_override) {
723720
weapon_hit(weapon_objp, prop_objp, &mc.hit_point_world, MISS_SHIELDS, &mc.hit_normal, &mc.hit_point, mc.hit_submodel);
724721
}
725722

726-
// TODO PROP
727-
/*
728-
if (scripting::hooks::OnWeaponCollision->isActive() && !(weapon_override && !ship_override)) {
729-
scripting::hooks::OnWeaponCollision->run(scripting::hooks::CollisionConditions{ {ship_objp, weapon_objp} },
730-
scripting::hook_param_list(scripting::hook_param("Self", 'o', ship_objp),
723+
if (scripting::hooks::OnWeaponCollision->isActive() && !(weapon_override && !prop_override)) {
724+
scripting::hooks::OnWeaponCollision->run(scripting::hooks::CollisionConditions{ {prop_objp, weapon_objp} },
725+
scripting::hook_param_list(scripting::hook_param("Self", 'o', prop_objp),
731726
scripting::hook_param("Object", 'o', weapon_objp),
732-
scripting::hook_param("Ship", 'o', ship_objp),
727+
scripting::hook_param("Prop", 'o', prop_objp),
733728
scripting::hook_param("Weapon", 'o', weapon_objp),
734-
scripting::hook_param("Hitpos", 'o', mc->hit_point_world)));
729+
scripting::hook_param("Hitpos", 'o', mc.hit_point_world)));
735730
}
736-
if (scripting::hooks::OnShipCollision->isActive() && !ship_override) {
737-
scripting::hooks::OnShipCollision->run(scripting::hooks::CollisionConditions{ {ship_objp, weapon_objp} },
731+
if (scripting::hooks::OnPropCollision->isActive() && !prop_override) {
732+
scripting::hooks::OnPropCollision->run(scripting::hooks::CollisionConditions{ {prop_objp, weapon_objp} },
738733
scripting::hook_param_list(scripting::hook_param("Self", 'o', weapon_objp),
739-
scripting::hook_param("Object", 'o', ship_objp),
740-
scripting::hook_param("Ship", 'o', ship_objp),
734+
scripting::hook_param("Object", 'o', prop_objp),
735+
scripting::hook_param("Prop", 'o', prop_objp),
741736
scripting::hook_param("Weapon", 'o', weapon_objp),
742-
scripting::hook_param("Hitpos", 'o', mc->hit_point_world),
743-
scripting::hook_param("ShipSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel)));
744-
}*/
737+
scripting::hook_param("Hitpos", 'o', mc.hit_point_world),
738+
scripting::hook_param("PropSubmodel", 'o', scripting::api::l_Submodel.Set(smh), has_submodel)));
739+
}
745740
}
746741

747742
return valid_hit_occurred;

code/scripting/global_hooks.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,23 @@ const std::shared_ptr<OverridableHook<CollisionConditions>> OnShipCollision = Ov
165165
{"Asteroid", "object", "The asteroid object with which the ship collided (only set for asteroid collisions)"},
166166
{"ShipB", "ship", "For ship-on-ship collisions, the same as \"Object\" (only set for ship-on-ship collisions)"},
167167
{"ShipBSubmodel", "submodel", "For ship-on-ship collisions, the submodel of \"ShipB\" involved in the collision, if \"ShipB\" was the heavier object"},
168+
{"Prop", "prop", "The prop object with which the ship collided (only set for prop collisions)."},
169+
{"PropSubmodel", "submodel", "The submodel of \"Prop\" involved in the collision."},
170+
{"Weapon", "weapon", "The weapon object with which the ship collided (only set for weapon collisions)"},
171+
{"Beam", "weapon", "The beam object with which the ship collided (only set for beam collisions)"}});
172+
173+
const std::shared_ptr<OverridableHook<CollisionConditions>> OnPropCollision = OverridableHook<CollisionConditions>::Factory("On Prop Collision",
174+
"Invoked when a prop collides with another object. Note: When two props collide this will be called twice, once "
175+
"with each prop as the \"Self\" parameter.",
176+
{{"Self", "object", "The object the prop collided with."},
177+
{"Object", "prop",
178+
"The prop that collided with \"Self\". Provided for consistency with other collision hooks."},
179+
{"Prop", "prop", "FFor prop-on-object collisions, the same as \"Object\"."},
180+
{"Hitpos", "vector", "The world position where the collision was detected"},
181+
{"PropSubmodel", "submodel", "The submodel of \"Prop\" involved in the collision, if \"Prop\" was the heavier object"},
182+
{"Debris", "object", "The debris object with which the prop collided (only set for debris collisions)"},
183+
{"Asteroid", "object", "The asteroid object with which the prop collided (only set for asteroid collisions)"},
184+
{"Ship", "ship", "The ship object with which the prop collided (only set for ship collisions)"},
168185
{"Weapon", "weapon", "The weapon object with which the ship collided (only set for weapon collisions)"},
169186
{"Beam", "weapon", "The beam object with which the ship collided (only set for beam collisions)"}});
170187

@@ -181,6 +198,7 @@ const std::shared_ptr<OverridableHook<CollisionConditions>> OnWeaponCollision =
181198
{"Debris", "object", "The debris object with which the weapon collided (only set for debris collisions)"},
182199
{"Asteroid", "object", "The asteroid object with which the weapon collided (only set for asteroid collisions)"},
183200
{"Ship", "ship", "The ship object with which the weapon collided (only set for ship collisions)."},
201+
{"Prop", "prop", "The prop object with which the weapon collided (only set for prop collisions)."},
184202
{"WeaponB", "weapon", "For weapon on weapon collisions, the \"other\" weapon."},
185203
{"Beam", "weapon", "The beam object with which the weapon collided (only set for beam collisions)"} });
186204

@@ -195,6 +213,7 @@ const std::shared_ptr<OverridableHook<CollisionConditions>> OnDebrisCollision =
195213
{"Hitpos", "vector", "The world position where the collision was detected"},
196214
{"Asteroid", "object", "The asteroid object with which the debris collided (only set for asteroid collisions)"},
197215
{"Ship", "ship", "The ship object with which the debris collided (only set for ship collisions)."},
216+
{"Prop", "prop", "The prop object with which the debris collided (only set for prop collisions)."},
198217
{"Weapon", "weapon", "The weapon object with which the debris collided (only set for weapon collisions)"},
199218
{"Beam", "weapon", "The beam object with which the debris collided (only set for beam collisions)"} });
200219

@@ -209,6 +228,7 @@ const std::shared_ptr<OverridableHook<CollisionConditions>> OnAsteroidCollision
209228
{"Hitpos", "vector", "The world position where the collision was detected"},
210229
{"Debris", "object", "The debris object with which the asteroid collided (only set for debris collisions)"},
211230
{"Ship", "ship", "The ship object with which the asteroid collided (only set for ship collisions)"},
231+
{"Prop", "prop", "The prop object with which the asteroid collided (only set for prop collisions)."},
212232
{"Weapon", "weapon", "The weapon object with which the asteroid collided (only set for weapon collisions)"},
213233
{"Beam", "weapon", "The beam object with which the asteroid collided (only set for beam collisions)"} });
214234

@@ -223,6 +243,7 @@ const std::shared_ptr<OverridableHook<CollisionConditions>> OnBeamCollision = Ov
223243
{"Hitpos", "vector", "The world position where the collision was detected"},
224244
{"Debris", "object", "The debris object with which the beam collided (only set for debris collisions)"},
225245
{"Ship", "ship", "The ship object with which the beam collided (only set for ship collisions)"},
246+
{"Prop", "prop", "The prop object with which the beam collided (only set for prop collisions)."},
226247
{"Asteroid", "object", "The asteroid object with which the beam collided (only set for asteroid collisions)"},
227248
{"Weapon", "weapon", "The weapon object with which the beam collided (only set for weapon collisions)"}});
228249

code/scripting/global_hooks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ extern const std::shared_ptr<Hook<ShipSourceConditions>> OnDebrisCreated;
4040
extern const std::shared_ptr<Hook<>> OnAsteroidCreated;
4141

4242
extern const std::shared_ptr<OverridableHook<CollisionConditions>> OnShipCollision;
43+
extern const std::shared_ptr<OverridableHook<CollisionConditions>> OnPropCollision;
4344
extern const std::shared_ptr<OverridableHook<CollisionConditions>> OnWeaponCollision;
4445
extern const std::shared_ptr<OverridableHook<CollisionConditions>> OnBeamCollision;
4546
extern const std::shared_ptr<OverridableHook<CollisionConditions>> OnDebrisCollision;

0 commit comments

Comments
 (0)