Skip to content

quest-voiceover 1.12.1#10584

Merged
iProdigy merged 1 commit intorunelite:masterfrom
KevinEdry:update-quest-voiceover
Feb 17, 2026
Merged

quest-voiceover 1.12.1#10584
iProdigy merged 1 commit intorunelite:masterfrom
KevinEdry:update-quest-voiceover

Conversation

@KevinEdry
Copy link
Copy Markdown
Contributor

@KevinEdry KevinEdry commented Feb 12, 2026

Update quest-voiceover plugin to version 1.12.1.

Release: https://github.com/KevinEdry/runelite-quest-voiceover/releases/tag/v1.12.1

Bug Fixes

Several users reported that the plugin's database stops working after an internet disconnect and never recovers, even though the SQLite database is a local file that should work fine offline.

After inspecting the logs, the root cause was a chain of connection lifecycle bugs:

  1. Closed connection never gets re-created: When the connection was closed (e.g. during a network hiccup), closeConnection() closed it but didn't null the reference. On the next query, getConnection() saw a non-null (but closed) connection and returned it — so every subsequent query failed permanently.

  2. No connection health check: getConnection() only checked connection != null, never whether it was actually still open. A stale connection was returned as-is with no way to recover.

  3. Database file corruption on interrupted downloads: The download wrote directly to the live database file with REPLACE_EXISTING. If a download was interrupted mid-stream (as happens when internet drops), the file was left truncated/corrupt — breaking all queries until the next successful download.

Changes

  • Connection recovery: Null the connection reference after close, and add an isClosed() health check in getConnection() so stale connections are automatically detected and replaced.
  • Atomic downloads: Download the database to a temporary file first, then atomically move it into place. If the download fails at any point, the existing database remains intact and continues working.
  • Dependency verification: Updated verification-metadata.xml for RuneLite 1.12.17.

Hopefully thats enough context to give a good idea of the changes 🙏

@runelite-github-app
Copy link
Copy Markdown

@runelite-github-app
Copy link
Copy Markdown

Feedback:

  • Use of javax.sound.sampled.AudioSystem.getLine is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.FloatControl.setValue is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.open is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of java.lang.System.out is not allowed: system i/o, use a logger instead.
  • Use of javax.sound.sampled.SourceDataLine.start is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.BooleanControl$Type is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.stop is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.Control$Type is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.Line$Info is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.BooleanControl.setValue is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.DataLine$Info.<init> is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.BooleanControl is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.AudioFormat is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.Line is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.FloatControl is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.DataLine$Info is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.getControl is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.flush is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.close is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.DataLine is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.getMicrosecondPosition is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.AudioFormat.<init> is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.FloatControl$Type.MASTER_GAIN is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine.write is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.BooleanControl$Type.MUTE is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.FloatControl$Type is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.AudioSystem is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.SourceDataLine is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of java.lang.System.err is not allowed: system i/o, use a logger instead.
  • Use of javax.sound.sampled.SourceDataLine.drain is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead
  • Use of javax.sound.sampled.Control is not allowed: Use of javax.sound, use net.runelite.client.audio.AudioPlayer instead

A new scan will be automatically performed on the next push to the PR branch.


Internal use only: Reviewer details Maintainer details

@iProdigy iProdigy merged commit 01c43fe into runelite:master Feb 17, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants