Skip to content

v1.8.4 - #930

Merged
miredirex merged 25 commits into
masterfrom
dev
Oct 22, 2026
Merged

v1.8.4#930
miredirex merged 25 commits into
masterfrom
dev

Conversation

@miredirex

@miredirex miredirex commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog

miredirex and others added 25 commits October 5, 2026 19:04
…#917)

Fixes #863

The animation graph descriptor (which variable indices get synced) was cached per actor once and never recomputed
Known issue: with two game instances on one machine, the second one
can crash at startup. ENB Helper SE can't open its log file because
the first instance has it open, so it throws during init. That's a
bug in KiLoader itself
Remote actors were shown a fixed 300 ms behind. Each now has a
`PlaybackClock` that plays the owner's timeline back by the snapshot
interval plus measured jitter, using network receive times so local
stutters don't inflate it. Late snapshots are briefly extrapolated and
corrected smoothly; teleports snap. Snapshots carry the owner's capture
tick and are relayed by the server immediately and unreliably, at most
8 actors per message: ~30 Hz for players, mounts and actors in combat,
~10 Hz for other NPCs
The server can send a spawn request for a placed actor while its cell is still loading
Owners stamp snapshots with their synchronized clock, which was resynced
using the time the sync message was processed rather than when it
arrived. An owner stall during a sync left their timeline behind, which
froze their actors on other clients for seconds
When an NPC left combat its owner dropped from ~30 to ~10 snapshots
per second, but the snapshot interval was averaged over a 3 s window,
so playback kept running out of snapshots and extrapolating for 2-3 s.
The interval now also takes the average of the newest 4 gaps when
that is longer, which cuts the stutter to under a second with little
change elsewhere.
Adaptive interpolation (more responsive movement for players and NPCs)
* skyrim_ui: allow repositioning network debug stats to any screen corner

Adds a debug_anchor setting (persisted, defaults to top-left) and a
'Network Stats Position' dropdown in Settings > Debug, mirroring the
existing party anchor pattern. Fixes #399.

* Fix swapped bottom anchor labels and simplify DebugComponent

* Rename PartyAnchor to ScreenCorner and position debug stats via CSS classes
* Add Ukrainian translation for Skyrim Together UI

* Update uk.json

Added ukranian translation

* Update transloco-root.module.ts

* Fix spelling of 'Гельген' in uk.json
The standalone admin tool was never built and the `one_ui` Angular
prototype was abandoned in 2021. With the tool gone, `AdminProtocol`
only served `AdminService`, which pushed every server log line to admin
sessions
`recastnavigation` was required in 2021 but no target ever linked it.
`ActorSpawnedEvent` was orphaned when `EntityService` was removed in
60f9eab and has never been triggered or handled
…rs (#920)

* Guarantee BSAnimationGraphManager ref-count Release with std::unique_ptr and deleter which releases the reference. This was not previously done on early returns in TESObjectREFR save/load variables, and never in DrawAnimDebugView.

* Fix BSAnimationGraphManager::Release to use delete instead of calling dtor. This passes flag 1 to the dtor and frees the memory via game delete operator, while before flag was 0 and memory not freed.

* Fix: forgot to get rid of manual Release call in LoadAnimationVariables

* Replace unique_ptr graph manager handle with BSTSmartPointer

Port trimmed versions of CommonLibSSE's BSTSmartPointer and BSIntrusiveRefCounted into BSCore

---------

Co-authored-by: Daniil Zakharov <miredirex@gmail.com>
* Several dialog & subtitle improvements in the way Scenes / Cutscenes work in a party.

If the cutscene design is that all party members (or all inrange) play the scene, the Leader's dialog actions would step on and cancel the copies running in the party members. This would mess up the scene phase timing, causing the members to race ahead and abort actions of the Leader, potentially hanging the scene. Found with the Finn/Carbos scene in Enderal.

If the cutscene design is only the person(s) who trigger the scene play the scene, and the scene is triggered by a non-Leader, no one except the scene-initiator got any dialog. This is an uncommon case; usually the start of a scene triggers a quest stage change that brings everyone into the scene, or the scene is just random encounter / idle chatter that is just fine to sync to just the triggering player.

Because scenes that don't trigger quest stage changes but also would be desirable to sync are rare, and because there is no good way to distinguish them from scenes where syncing the audio will cause dialog cancels and timing problems, this case is left as unsolved, have to live with it.

There is some logic to trigger scenes in the rest of the party when one starts the scene. This solves some cases. In others, there are scene start conditions that just stop the scene again. Best known example is the Companions Brotherhood quest stage C02. Unless the entire party stands on the tiny hotspot where the initiator triggers the scene, it just stops again.

It's not perfect, but the selected (surviving experiment) solution is:
1) Try to trigger the scene for  the entire party, which often works.
2) Each party member plays the scene to themselves, generally with decent audio sync. The party Leader is still controlling the NPCs and motion / animation sync handles most cases.
3) If the scene triggers TaskDialogues (those NPC dialogues where you answer with a menu pick), that dialog is individual to the SceneMaster (they who triggered), so that is synced to party (PlayersInRange).
4) Only flaw known is AI packages.

Subtitle sync follows the same rules as Dialogue sync.

AI package handling is left for a future iteration, since it also is tricky. Current state: AI packages only run on Leader, so if Member triggers a scene, the AI packages doesn't run. If it is anything of consequence (more than "look at player", say, having to do something and then interact with player), the scene will get stuck and Leader will have to take over. If Leader is close, NPC will just switch to Leader. If farther away or not in scene, Leader will have to get closer, possibly having to unlock the Leader with the EPC (EnablePlayerControls) console command.

For the next round, the two big options I see for fixing AI is for
1. SceneMaster to take ownership of NPCs in-scene. They can be released at end of scene, or just wait for a cell change.
2. Find a way to reactivate AI on "remote" NPCs for the duration of the scene, This sounds more fragile.

* Delete #if 0 code, failed attempt to handle TaskDialogue "goodbye" lines.

Getting the failed attempt out of the code, but keeping the commit so you can it was attempted, but there's not enough info.

* Skip remote voice lines and subtitles for scenes played locally

This is a new approach: every client plays a quest's scenes itself, so relaying the owner's
scene lines made other clients stop their own copy of the line,
ending the scene phase early and letting members race ahead or hang.
Dialogue and subtitle messages now carry the `GameId` of the scene a
line belongs to, and receivers skip lines from a scene they are
playing too. Lines from the player dialogue menu, or from a scene
that isn't playing on the receiver, still play. Subtitles needed the
same skip: only the speaker's own line ending hides a subtitle, so a
remote one arriving after that would stay on screen.

---------

Co-authored-by: Daniil Zakharov <miredirex@gmail.com>
Slow time from a constant effect spell comes from a scripted ability,
like Enderal's MQ01 visions. Every client's scripts add and remove it
on their own player, so the synced copy landed on the other players'
local player, where nothing removed it, and left them stuck in slow
motion. Skip syncing slow time from constant effect spells.
…scenes (#848)

Let party members advance quests without duplicating stages

Members advancing quests (not only the leader) introduced duplicate
quest triggers: members' scripts often reach the same stage on their
own, and a stage relayed mid-scene can push another client's copy of
the scene past its own scripts (MQ01's vision ended before it began).

The server now tracks the stages each party's quests reached since
they started and relays a stage only once. Starting or stopping a
quest resets its tracking.

The leader holds a member's stage only while an upcoming phase of a
playing scene checks it or a later stage, and later stages queue
behind it. Scenes that only end or repeat on the stage don't count,
otherwise they stall (MQ105's sprint trial repeats until stage 140).
Every frame the leader releases a held stage once the current
phase's dialogue is done and its completion conditions would pass
with it, so a member picking a dialogue option doesn't deadlock the
leader's scene. Held stages apply in order once nothing checks them,
each after the fragments of the stages before it finish
(TESQuestStageItemDoneEvent), since a scene those start may wait on
the next one.

---------

Co-authored-by: Daniil Zakharov <miredirex@gmail.com>
)

Dialogue and subtitle messages now carry the sender's scene phase. A
member's copy of a scene can get stuck in a phase waiting on an AI
package of an NPC the leader owns, since packages only complete on the
client running that NPC's AI. Receivers used to skip every line from a
scene they were also playing, so a stuck copy went silent for the rest
of the scene. Now a member skips a line only if its copy is at or past
the sender's phase, or is behind but not stuck.

(more details in the PR)
1.6.1170 used to be built in a fork by reverting the 1.7 port and
patching the version string. It's now an xmake option instead.
A remote player's NPC is loaded from the owner's change form. The engine's
spell list loader stores a null entry for every spell or shout our form ID
hook can't resolve, e.g. one from a mod this client doesn't have. When that
player's character enters combat, the combat inventory adds the NPC's shouts
without a null check and crashes (SkyrimSE+0x811CF7, ID 44882).

Remove null entries from the spell list after deserializing, and log each
form ID that fails to resolve so reports name the missing mod.

Co-authored-by: absol89 <absol89@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@miredirex
miredirex marked this pull request as ready for review October 22, 2026 10:59
@miredirex
miredirex merged commit 54b3a85 into master Oct 22, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants