View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002707 | FSSCP | turrets | public | 2012-09-04 10:53 | 2012-12-15 21:16 |
| Reporter | headdie | Assigned To | Valathil | ||
| Priority | normal | Severity | crash | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Platform | PC | OS | Windows | OS Version | XP SP2 |
| Product Version | 3.6.14 RC6 | ||||
| Summary | 0002707: crash using $Substitute: and Turrets | ||||
| Description | When using a weapon that uses the substitute table option on a ship turret the game runs fine until a turret using the weapon is fired where the game crashes to desktop with ASSERTION: "position != NULL" at weapons.cpp:4835 'Ship Name' is trying to fire a weapon that is not selected Freeing all existing models... while asking about it on HLP zookeeper identified the problem to be a bug in the game engine. | ||||
| Steps To Reproduce | add $Substitute: Maxim +period: 6 to a blob turret and run a mission where a turret fires the weapon. | ||||
| Additional Information | issue identified in 3.6.14 RC8 not RC6 as identified above as there is no RC8 option Substitute weapons seem to work fine on fighters original post http://www.hard-light.net/forums/index.php?topic=81865.msg1634018#msg1634018 link to $Substitute: in the wiki http://www.hard-light.net/forums/index.php?topic=81865.msg1634018#msg1634018 | ||||
| Tags | No tags attached. | ||||
|
|
|
|
|
|
|
|
Confirmed. Use the tbm and mission provided to reproduce. |
|
|
2707.patch (4,970 bytes)
Index: code/ai/aiturret.cpp
===================================================================
--- code/ai/aiturret.cpp (revision 9437)
+++ code/ai/aiturret.cpp (working copy)
@@ -1808,7 +1808,7 @@
// so we need to get the position info separately for each shot
ship_get_global_turret_gun_info(&Objects[parent_objnum], turret, turret_pos, turret_fvec, 1, NULL);
- weapon_objnum = weapon_create( turret_pos, &turret_orient, turret_weapon_class, parent_objnum, -1, 1);
+ weapon_objnum = weapon_create( turret_pos, &turret_orient, turret_weapon_class, parent_objnum, -1, 1, 0,0.0f, turret);
weapon_set_tracking_info(weapon_objnum, parent_objnum, turret->turret_enemy_objnum, 1, turret->targeted_subsys);
@@ -1927,7 +1927,7 @@
vm_vector_2_matrix(&turret_orient, &turret_fvec, NULL, NULL);
// create weapon and homing info
- weapon_objnum = weapon_create(&turret_pos, &turret_orient, tsi->weapon_class, tsi->parent_objnum, -1, 1);
+ weapon_objnum = weapon_create(&turret_pos, &turret_orient, tsi->weapon_class, tsi->parent_objnum, -1, 1, 0, 0.0f, tsi->turret);
weapon_set_tracking_info(weapon_objnum, tsi->parent_objnum, tsi->target_objnum, 1, tsi->target_subsys);
// do other cool stuff if weapon is created.
Index: code/network/multimsgs.cpp
===================================================================
--- code/network/multimsgs.cpp (revision 9437)
+++ code/network/multimsgs.cpp (working copy)
@@ -3327,7 +3327,7 @@
multi_set_network_signature( wnet_signature, MULTI_SIG_NON_PERMANENT );
}
- weapon_objnum = weapon_create( &pos, &orient, wid, OBJ_INDEX(objp), -1, 1);
+ weapon_objnum = weapon_create( &pos, &orient, wid, OBJ_INDEX(objp), -1, 1, 0, 0.0f, ssp);
if (weapon_objnum != -1) {
if ( Weapon_info[wid].launch_snd != -1 ) {
snd_play_3d( &Snds[Weapon_info[wid].launch_snd], &pos, &View_position );
@@ -8383,7 +8383,7 @@
ship_get_global_turret_info(objp, ssp->system_info, &pos, &dir);
// create the weapon object
- weapon_objnum = weapon_create( &pos, &orient, wid, OBJ_INDEX(objp), -1, 1);
+ weapon_objnum = weapon_create( &pos, &orient, wid, OBJ_INDEX(objp), -1, 1, 0, 0.0f, ssp);
if (weapon_objnum != -1) {
if ( Weapon_info[wid].launch_snd != -1 ) {
snd_play_3d( &Snds[Weapon_info[wid].launch_snd], &pos, &View_position );
Index: code/weapon/weapon.h
===================================================================
--- code/weapon/weapon.h (revision 9437)
+++ code/weapon/weapon.h (working copy)
@@ -611,7 +611,7 @@
// Passing a group_id of -1 means it isn't in a group. See weapon_create_group_id for more
// help on weapon groups.
-int weapon_create( vec3d * pos, matrix * orient, int weapon_type, int parent_obj, int group_id=-1, int is_locked = 0, int is_spawned = 0, float fof_cooldown = 0.0f);
+int weapon_create( vec3d * pos, matrix * orient, int weapon_type, int parent_obj, int group_id=-1, int is_locked = 0, int is_spawned = 0, float fof_cooldown = 0.0f, ship_subsys * src_turret = NULL);
void weapon_set_tracking_info(int weapon_objnum, int parent_objnum, int target_objnum, int target_is_locked = 0, ship_subsys *target_subsys = NULL);
// for weapons flagged as particle spewers, spew particles. wheee
Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp (revision 9437)
+++ code/weapon/weapons.cpp (working copy)
@@ -4870,9 +4870,13 @@
}
}
-inline size_t* get_pointer_to_weapon_fire_pattern_index(int weapon_type, ship* shipp) {
+inline size_t* get_pointer_to_weapon_fire_pattern_index(int weapon_type, ship* shipp, ship_subsys * src_turret) {
Assert( shipp != NULL );
ship_weapon* ship_weapon_p = &(shipp->weapons);
+ if(src_turret)
+ {
+ ship_weapon_p = &src_turret->weapons;
+ }
Assert( ship_weapon_p != NULL );
// search for the corresponding bank pattern index for the weapon_type that is being fired.
@@ -4897,7 +4901,7 @@
* @return Index of weapon in the Objects[] array, -1 if the weapon object was not created
*/
int Weapons_created = 0;
-int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_objnum, int group_id, int is_locked, int is_spawned, float fof_cooldown)
+int weapon_create( vec3d * pos, matrix * porient, int weapon_type, int parent_objnum, int group_id, int is_locked, int is_spawned, float fof_cooldown, ship_subsys * src_turret)
{
int n, objnum;
int num_deleted;
@@ -4931,7 +4935,7 @@
ship* parent_shipp = &(Ships[parent_objp->instance]);
Assert( parent_shipp != NULL );
- size_t *position = get_pointer_to_weapon_fire_pattern_index(weapon_type, parent_shipp);
+ size_t *position = get_pointer_to_weapon_fire_pattern_index(weapon_type, parent_shipp, src_turret);
Assertion( position != NULL, "'%s' is trying to fire a weapon that is not selected", Ships[parent_objp->instance].ship_name );
*position = ++(*position) % wip->weapon_substitution_pattern.size();
|
|
|
Attached a patch that fixes. Please review |
|
|
Yes. Valthils solution looks fine. Exactly, what I was going to do when I found the time to fix it and test it. |
|
|
Fix committed to trunk@9439. |
|
fs2open: trunk r9439 2012-12-15 16:47 Ported: N/A Details Diff |
Fix for Mantis 2707: Pass the firing turret to weapon_create so it knows where to look for when using $Substitute. |
Affected Issues 0002707 |
|
| mod - /trunk/fs2_open/code/ai/aiturret.cpp | Diff File | ||
| mod - /trunk/fs2_open/code/network/multimsgs.cpp | Diff File | ||
| mod - /trunk/fs2_open/code/weapon/weapon.h | Diff File | ||
| mod - /trunk/fs2_open/code/weapon/weapons.cpp | Diff File | ||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2012-09-04 10:53 | headdie | New Issue | |
| 2012-12-15 19:01 | MjnMixael | File Added: 2707-wep.tbm | |
| 2012-12-15 19:02 | MjnMixael | File Added: 2707.fs2 | |
| 2012-12-15 19:02 | MjnMixael | Note Added: 0014469 | |
| 2012-12-15 20:52 | Valathil | File Added: 2707.patch | |
| 2012-12-15 20:52 | Valathil | Assigned To | => Valathil |
| 2012-12-15 20:52 | Valathil | Status | new => assigned |
| 2012-12-15 20:53 | Valathil | Note Added: 0014478 | |
| 2012-12-15 20:53 | Valathil | Status | assigned => code review |
| 2012-12-15 21:09 | iss_mneur | Note Added: 0014479 | |
| 2012-12-15 21:16 | Valathil | Changeset attached | => fs2open trunk r9439 |
| 2012-12-15 21:16 | Valathil | Note Added: 0014480 | |
| 2012-12-15 21:16 | Valathil | Status | code review => resolved |
| 2012-12-15 21:16 | Valathil | Resolution | open => fixed |