Add settings option for "sfx_on_idle" which allows you to play a custom SFX alongside an Idle emote (#744)
* Add an "sfx_on_idle" FL packet flag, UNFORTUNATELY servers have to go out of their way to support this feature due to clients below 2.10 fucking spamming sfx for 2.10 otherwise * Revert feature flag, implement a method that works regardless of server instead * Revert "Revert feature flag, implement a method that works regardless of server instead" This reverts commit c14b4fb2a1bbf2796db4a26e83609ba743826655. * Stop using FL packet, but make SFX on Idle a client-side setting to reduce confusion and reliance on servers for a client feature to a minimum. This reverts commit 687e64e37839b77923c93d13f971ee6750bd4330. * Update src/aooptionsdialog.cpp Co-authored-by: stonedDiscord <Tukz@gmx.de> Co-authored-by: oldmud0 <oldmud0@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									d9bdb7e6bc
								
							
						
					
					
						commit
						cf91cc03f8
					
				@ -535,6 +535,9 @@ public:
 | 
			
		||||
  // Get whether to opt out of player count metrics sent to the master server
 | 
			
		||||
  bool get_player_count_optout();
 | 
			
		||||
 | 
			
		||||
  // Get if sfx can be sent to play on idle
 | 
			
		||||
  bool get_sfx_on_idle();
 | 
			
		||||
 | 
			
		||||
  // Whether opening evidence requires a single or double click
 | 
			
		||||
  bool get_evidence_double_click();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -112,6 +112,9 @@ private:
 | 
			
		||||
  QLabel *ui_category_stop_lbl;
 | 
			
		||||
  QCheckBox *ui_category_stop_cb;
 | 
			
		||||
 | 
			
		||||
  QLabel *ui_sfx_on_idle_lbl;
 | 
			
		||||
  QCheckBox *ui_sfx_on_idle_cb;
 | 
			
		||||
 | 
			
		||||
  QWidget *ui_callwords_tab;
 | 
			
		||||
  QWidget *ui_callwords_widget;
 | 
			
		||||
  QVBoxLayout *ui_callwords_layout;
 | 
			
		||||
 | 
			
		||||
@ -466,6 +466,20 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app)
 | 
			
		||||
  ui_gameplay_form->setWidget(row, QFormLayout::FieldRole, ui_category_stop_cb);
 | 
			
		||||
 | 
			
		||||
  row += 1;
 | 
			
		||||
 | 
			
		||||
  ui_sfx_on_idle_lbl = new QLabel(ui_form_layout_widget);
 | 
			
		||||
  ui_sfx_on_idle_lbl->setText(tr("Always Send SFX:"));
 | 
			
		||||
  ui_sfx_on_idle_lbl->setToolTip(
 | 
			
		||||
      tr("If the SFX dropdown has an SFX selected, send the custom SFX alongside the message even if Preanim is OFF."));
 | 
			
		||||
 | 
			
		||||
  ui_gameplay_form->setWidget(row, QFormLayout::LabelRole, ui_sfx_on_idle_lbl);
 | 
			
		||||
 | 
			
		||||
  ui_sfx_on_idle_cb = new QCheckBox(ui_form_layout_widget);
 | 
			
		||||
 | 
			
		||||
  ui_gameplay_form->setWidget(row, QFormLayout::FieldRole, ui_sfx_on_idle_cb);
 | 
			
		||||
 | 
			
		||||
  row += 1;
 | 
			
		||||
 | 
			
		||||
  ui_evidence_double_click_lbl = new QLabel(ui_form_layout_widget);
 | 
			
		||||
  ui_evidence_double_click_lbl->setText(tr("Evidence Double Click:"));
 | 
			
		||||
  ui_evidence_double_click_lbl->setToolTip(
 | 
			
		||||
@ -1199,6 +1213,7 @@ void AOOptionsDialog::update_values() {
 | 
			
		||||
  ui_sticker_cb->setChecked(ao_app->is_sticker_enabled());
 | 
			
		||||
  ui_continuous_cb->setChecked(ao_app->is_continuous_enabled());
 | 
			
		||||
  ui_category_stop_cb->setChecked(ao_app->is_category_stop_enabled());
 | 
			
		||||
  ui_sfx_on_idle_cb->setChecked(ao_app->get_sfx_on_idle());
 | 
			
		||||
  ui_blank_blips_cb->setChecked(ao_app->get_blank_blip());
 | 
			
		||||
  ui_loopsfx_cb->setChecked(ao_app->get_looping_sfx());
 | 
			
		||||
  ui_objectmusic_cb->setChecked(ao_app->objection_stop_music());
 | 
			
		||||
@ -1286,6 +1301,7 @@ void AOOptionsDialog::save_pressed()
 | 
			
		||||
  configini->setValue("demo_logging_enabled", ui_log_demo_cb->isChecked());
 | 
			
		||||
  configini->setValue("continuous_playback", ui_continuous_cb->isChecked());
 | 
			
		||||
  configini->setValue("category_stop", ui_category_stop_cb->isChecked());
 | 
			
		||||
  configini->setValue("sfx_on_idle", ui_sfx_on_idle_cb->isChecked());
 | 
			
		||||
  configini->setValue("evidence_double_click", ui_evidence_double_click_cb->isChecked());
 | 
			
		||||
  QFile *callwordsini = new QFile(ao_app->get_base_path() + "callwords.ini");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1886,18 +1886,11 @@ void Courtroom::on_chat_return_pressed()
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(f_desk_mod);
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(ao_app->get_pre_emote(current_char, current_emote));
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(current_char);
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(ao_app->get_emote(current_char, current_emote));
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(ui_ic_chat_message->text());
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(f_side);
 | 
			
		||||
 | 
			
		||||
  QString f_pre = ao_app->get_pre_emote(current_char, current_emote);
 | 
			
		||||
  int f_emote_mod = ao_app->get_emote_mod(current_char, current_emote);
 | 
			
		||||
  QString f_sfx = "1";
 | 
			
		||||
  int f_sfx_delay = get_char_sfx_delay();
 | 
			
		||||
 | 
			
		||||
// EMOTE MOD OVERRIDES:
 | 
			
		||||
  // Emote_mod 2 is only used by objection check later, having it in the char.ini does nothing
 | 
			
		||||
  if (f_emote_mod == 2) {
 | 
			
		||||
@ -1944,13 +1937,33 @@ void Courtroom::on_chat_return_pressed()
 | 
			
		||||
  // Custom sfx override via sound list dropdown.
 | 
			
		||||
  if (!custom_sfx.isEmpty() || ui_sfx_dropdown->currentIndex() != 0) {
 | 
			
		||||
    f_sfx = get_char_sfx();
 | 
			
		||||
    // We have a custom sfx but we're on idle emotes.
 | 
			
		||||
    // Turn them into pre so the sound plays if client setting sfx_on_idle is enabled.
 | 
			
		||||
    if (ao_app->get_sfx_on_idle() && (f_emote_mod == IDLE || f_emote_mod == ZOOM)) {
 | 
			
		||||
      // We turn idle into preanim, but make it not send a pre animation
 | 
			
		||||
      f_pre = "";
 | 
			
		||||
      // Set sfx delay to 0 so the sfx plays immediately
 | 
			
		||||
      f_sfx_delay = 0;
 | 
			
		||||
      // Set the emote mod to preanim so the sound plays
 | 
			
		||||
      f_emote_mod = f_emote_mod == IDLE ? PREANIM : PREANIM_ZOOM;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(f_pre);
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(current_char);
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(ao_app->get_emote(current_char, current_emote));
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(ui_ic_chat_message->text());
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(f_side);
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(f_sfx);
 | 
			
		||||
  packet_contents.append(QString::number(f_emote_mod));
 | 
			
		||||
  packet_contents.append(QString::number(m_cid));
 | 
			
		||||
 | 
			
		||||
  packet_contents.append(QString::number(get_char_sfx_delay()));
 | 
			
		||||
  packet_contents.append(QString::number(f_sfx_delay));
 | 
			
		||||
 | 
			
		||||
  QString f_obj_state;
 | 
			
		||||
 | 
			
		||||
@ -2118,12 +2131,16 @@ void Courtroom::reset_ui()
 | 
			
		||||
  ui_screenshake->set_image("screenshake");
 | 
			
		||||
  ui_evidence_present->set_image("present");
 | 
			
		||||
 | 
			
		||||
  if (!ao_app->is_stickysounds_enabled()) {
 | 
			
		||||
  // If sticky sounds is disabled and we either have SFX on Idle enabled, or our Preanim checkbox is checked
 | 
			
		||||
  if (!ao_app->is_stickysounds_enabled() && (ao_app->get_sfx_on_idle() || ui_pre->isChecked())) {
 | 
			
		||||
    // Reset the SFX Dropdown to "Default"
 | 
			
		||||
    ui_sfx_dropdown->setCurrentIndex(0);
 | 
			
		||||
    ui_sfx_remove->hide();
 | 
			
		||||
    custom_sfx = "";
 | 
			
		||||
  }
 | 
			
		||||
  // If sticky preanims is disabled
 | 
			
		||||
  if (!ao_app->is_stickypres_enabled())
 | 
			
		||||
    // Turn off our Preanim checkbox
 | 
			
		||||
    ui_pre->setChecked(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2555,7 +2572,7 @@ void Courtroom::handle_emote_mod(int emote_mod, bool p_immediate)
 | 
			
		||||
  switch (emote_mod) {
 | 
			
		||||
  case PREANIM:
 | 
			
		||||
  case PREANIM_ZOOM:
 | 
			
		||||
    // Emotes 1, 2 and 6 all play preanim that makes the chatbox wait for it to finish.
 | 
			
		||||
    // play preanim that makes the chatbox wait for it to finish.
 | 
			
		||||
    play_preanim(false);
 | 
			
		||||
    break;
 | 
			
		||||
  case IDLE:
 | 
			
		||||
@ -2563,8 +2580,6 @@ void Courtroom::handle_emote_mod(int emote_mod, bool p_immediate)
 | 
			
		||||
    // If immediate is not ticked on...
 | 
			
		||||
    if (!p_immediate)
 | 
			
		||||
    {
 | 
			
		||||
      // Play the sound effect if one was sent to us
 | 
			
		||||
      play_sfx();
 | 
			
		||||
      // Skip preanim.
 | 
			
		||||
      handle_ic_speaking();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1228,6 +1228,12 @@ bool AOApplication::get_player_count_optout()
 | 
			
		||||
      .startsWith("true");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool AOApplication::get_sfx_on_idle()
 | 
			
		||||
{
 | 
			
		||||
  return configini->value("sfx_on_idle", "false").value<QString>()
 | 
			
		||||
      .startsWith("true");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool AOApplication::get_evidence_double_click()
 | 
			
		||||
{
 | 
			
		||||
  return configini->value("evidence_double_click", "true").value<QString>()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user