@@ -10790,31 +10790,35 @@ void update_firing_sounds(object* objp, ship* shipp)
1079010790 // equality comparisons to -1 are correct here, -2 is valid and means a loop is active but the modder didnt specify an actual loop sound
1079110791
1079210792 if (swp->firing_loop_sounds[i] == -1 && trigger_down && !primaries_locked && selected && has_resources && burst_only_allowed && !dying) {
10793+ auto* pm = model_get(Ship_info[shipp->ship_info_index].model_num);
10794+ vec3d snd_pos, world_snd_pos;
10795+ vm_vec_avg_n(&snd_pos, pm->gun_banks[i].num_slots, pm->gun_banks[i].pnt);
10796+ vm_vec_unrotate(&world_snd_pos, &snd_pos, &objp->orient);
10797+ world_snd_pos += objp->pos;
10798+
1079310799 if (wip->start_firing_snd.isValid() && start_snd_played != wip->start_firing_snd) {
10794- if (objp == Player_obj)
10795- snd_play(gamesnd_get_game_sound(wip->start_firing_snd));
10796- else
10797- snd_play_3d(gamesnd_get_game_sound(wip->start_firing_snd), &objp->pos, &View_position);
10800+ snd_play_3d(gamesnd_get_game_sound(wip->start_firing_snd), &objp->pos, &world_snd_pos);
1079810801
1079910802 start_snd_played = wip->start_firing_snd;
1080010803 }
1080110804
10802- vec3d pos = model_get(Ship_info[shipp->ship_info_index].model_num)->view_positions[0].pnt;
10803-
1080410805 if (wip->linked_loop_firing_snd.isValid() && shipp->flags[Ship::Ship_Flags::Primary_linked])
10805- swp->firing_loop_sounds[i] = obj_snd_assign(shipp->objnum, wip->linked_loop_firing_snd, &pos , OS_PLAY_ON_PLAYER);
10806+ swp->firing_loop_sounds[i] = obj_snd_assign(shipp->objnum, wip->linked_loop_firing_snd, &snd_pos , OS_PLAY_ON_PLAYER);
1080610807 else if (wip->loop_firing_snd.isValid())
10807- swp->firing_loop_sounds[i] = obj_snd_assign(shipp->objnum, wip->loop_firing_snd, &pos , OS_PLAY_ON_PLAYER);
10808+ swp->firing_loop_sounds[i] = obj_snd_assign(shipp->objnum, wip->loop_firing_snd, &snd_pos , OS_PLAY_ON_PLAYER);
1080810809 else
1080910810 swp->firing_loop_sounds[i] = -2;
1081010811 }
1081110812
1081210813 if (swp->firing_loop_sounds[i] != -1 && (!trigger_down || primaries_locked || !selected || !has_resources || !burst_only_allowed || dying)) {
10814+ auto* pm = model_get(Ship_info[shipp->ship_info_index].model_num);
10815+ vec3d world_snd_pos;
10816+ vm_vec_avg_n(&world_snd_pos, pm->gun_banks[i].num_slots, pm->gun_banks[i].pnt);
10817+ vm_vec_unrotate(&world_snd_pos, &world_snd_pos, &objp->orient);
10818+ world_snd_pos += objp->pos;
10819+
1081310820 if (wip->end_firing_snd.isValid() && end_snd_played != wip->end_firing_snd) {
10814- if (objp == Player_obj)
10815- snd_play(gamesnd_get_game_sound(wip->end_firing_snd));
10816- else
10817- snd_play_3d(gamesnd_get_game_sound(wip->end_firing_snd), &objp->pos, &View_position);
10821+ snd_play_3d(gamesnd_get_game_sound(wip->end_firing_snd), &objp->pos, &world_snd_pos);
1081810822
1081910823 end_snd_played = wip->end_firing_snd;
1082010824 }
0 commit comments