Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion code/ai/aiturret.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2013,7 +2013,9 @@ bool turret_fire_weapon(int weapon_num,

wp->target_num = turret->turret_enemy_objnum;
// AL 1-6-97: Store pointer to turret subsystem
wp->turret_subsys = turret;
wp->turret_subsys = turret;

turret_external_weapon_model_fired(turret, turret->turret_next_fire_pos);

if (scripting::hooks::OnTurretFired->isActive()) {
scripting::hooks::OnTurretFired->run(scripting::hooks::WeaponUsedConditions{ parent_ship , turret_enemy_objp, SCP_vector<int>{ turret_weapon_class }, wip->subtype == WP_LASER },
Expand Down Expand Up @@ -2099,6 +2101,18 @@ bool turret_fire_weapon(int weapon_num,
return true;
}

void turret_external_weapon_model_fired(ship_subsys *turret, int fire_pos)
{
model_subsystem *tp = turret->system_info;

if ( !(tp->flags[Model::Subsystem_Flags::Show_external_weapon_model]) || tp->turret_num_firing_points < 1 )
return;

// the point stays empty until the turret's post-firing animations complete and any
// weapon-reload animation has played; see update_turret_external_weapon_models()
turret->turret_external_weapon_state[fire_pos % tp->turret_num_firing_points] = TurretExternalWeaponState::EMPTY;
}

//void turret_swarm_fire_from_turret(ship_subsys *turret, int parent_objnum, int target_objnum, ship_subsys *target_subsys)
void turret_swarm_fire_from_turret(turret_swarm_info *tsi)
{
Expand Down Expand Up @@ -2154,6 +2168,9 @@ void turret_swarm_fire_from_turret(turret_swarm_info *tsi)
tsi->turret->last_fired_weapon_info_index = tsi->weapon_class;
tsi->turret->turret_last_fired = _timestamp();

// the firing point was incremented after the firing position was calculated above
turret_external_weapon_model_fired(tsi->turret, tsi->turret->turret_next_fire_pos - 1);

if (scripting::hooks::OnTurretFired->isActive()) {
scripting::hooks::OnTurretFired->run(scripting::hooks::WeaponUsedConditions{
&Ships[Objects[tsi->parent_objnum].instance],
Expand Down
22 changes: 17 additions & 5 deletions code/hud/hudtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7938,14 +7938,26 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
auto weapon_pm = model_get(display_model_num);
num_secondaries_rendered = 0;

// a weapon-reload animation replaces the slide-back reload visual: reloading
// points are hidden until the animation completes
bool anim_reload = !sip->animations.getAll(model_get_instance(sp->model_instance_num), animation::ModelAnimationTriggerType::WeaponReload, i, true).isEmpty();

for(k = 0; k < bank->num_slots; k++)
{
if (num_secondaries_rendered >= sp->weapons.secondary_bank_ammo[i])
break;

float reload_pct = sp->secondary_point_reload_pct.get(i, k);
if (reload_pct <= 0.0f)
continue;
float reload_slide_back = 0.0f;

if (anim_reload) {
if ( !timestamp_elapsed(sp->secondary_point_reload_stamp.get(i, k)) )
continue;
} else {
float reload_pct = sp->secondary_point_reload_pct.get(i, k);
if (reload_pct <= 0.0f)
continue;
reload_slide_back = (1.0f - reload_pct) * weapon_pm->rad;
}

model_render_params weapon_render_info;

Expand All @@ -7962,7 +7974,7 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)

vec3d slot_pnt;
matrix slot_orient;
ship_get_weapon_model_slot_transform(bank, k, (1.0f - reload_pct) * weapon_pm->rad, &slot_pnt, &slot_orient);
ship_get_weapon_model_slot_transform(bank, k, reload_slide_back, &slot_pnt, &slot_orient);

// We need to transform the position local to the model to be in "world" space relative to the rendered outline
vec3d world_position;
Expand Down Expand Up @@ -8006,7 +8018,7 @@ void HudGaugeHardpoints::render(float /*frametime*/, bool config)
renderCircle((int)draw_point.screen.xyw.x + position[0], (int)draw_point.screen.xyw.y + position[1], 10);
}
} else {
int external_model_instance = ship_get_external_weapon_model_instance(swp, i, display_model_num);
int external_model_instance = ship_get_external_weapon_model_instance(&swp->primary_bank_external_weapon[i], swp->primary_bank_weapons[i], display_model_num);

for ( k = 0; k < bank->num_slots; k++ ) {
model_render_params weapon_render_info;
Expand Down
Loading
Loading