#S3maphore - Music Management from 2090

1 messages · Page 3 of 1

sly helm
#

conditionally adding/removing tracks isn't really a thing it does, the idea is more to just make additional playlists for, say, specific times of day, or weather patterns, etc

#

I suppose maybe you could, though. I’ve been kinda wanting a way to integrate playlists with all the events it uses better

#

There is quite a bit it will let you do that’s only exposed to other scripts, and not so much playlists. Like the weatherChanged event, etc

sly helm
#

I have an idea, but I need to nap on it first.

grave garden
#

Fair. I'll explore it.

#

In my brain if the weather changes, the song finishes, and the next song will be from the "snow" or "rain" playlist before returning to normal rotation.

sly helm
#

That's definitely a thing you could do, using the special playlist would allow that

sly helm
#

Any playlist devs around who'd like to help me close out 0.55 on this lovely saturday morning:


---@param levelRule NumericPresenceMap
function PlaylistRules.combatTargetLevelDifference(levelRule)
    if not PlaylistRules.state.isInCombat then return false end

    if not S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] then S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] = {} end

    local currentCombatTargetsCache = S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey]

    if currentCombatTargetsCache and currentCombatTargetsCache[levelRule] ~= nil then
        return currentCombatTargetsCache[levelRule]
    end

    local FightingActors = PlaylistRules.state.combatTargets

    local result = false
    for _, actor in pairs(FightingActors) do
        local targetLevel = combatTargetLevelCache[actor.id] or actor.type.stats.level(actor)
        if not combatTargetLevelCache[actor.id] then combatTargetLevelCache[actor.id] = level end

        if levelRule.absolute then
            --- So a negative level difference, would indicate that the target is a higher level than the player
            --- whereas a positive one, indicates the player themselves is stronger
            --- 
            local levelDifference = MyLevel.current - targetLevel.current
        elseif levelRule.relative then
        else
            error(
                ('table %s for combatTargetLevelDifference rule does not contain either the relative OR absolute fields! You broke it!'):format(levelRule)
            )
        end
    end

    ::MATCHED::

    currentCombatTargetsCache[levelRule] = result

    return result
end
#

I'm adding the combat level difference rule from MUSE so we can get more granular control over combat playlists.

#

My question is, how do you think of this current form?

local seriousLevelDifference = {
  absolute = {
    min = -10,
    max = 0,
  },
  relative = {
    min = 0.50,
    max = 1.5,
  }
}

Where a negative number indicates YOUR level is that much lower, or a positive one indicates you are stronger, with either the relative or absolute rulesets.

#

I could invert it, I'm not sure if the negation is too unintuitive or not

clear spear
#

Is it possible for me to region lock music without setting it's priority to region?

sly helm
#

being associated with a region doesn't really have anything to do with using a specific priority

#

But you should still set its priority to Region because the priority levels are tiered from least to most specific, so if you use some other priority it'll probably trigger conflicts

#

What's the idea, there?

clear spear
#

I have my night music set up and I want to set up music for eastern Vvardenfell that gets overwritten by the night music in terms of priority

sly helm
#

oh, yeah, there's a dedicated priority level for time of day

clear spear
#

Is it more or less specific than region

sly helm
#

TimeOfDay is the most specific one (300) before battle playlists start

#

But really, it should be fine even if they use the same priority, and the night playlists register later

clear spear
#

Alright

clear spear
#

Does Molag Amur have a weird region ID? My ashlands music works everywhere its set to except for Molag Amur

sly helm
#

the region's actually called molag mar region

#

looking back at my code, I see one of the regions I check for in ashlands playlist is molag amur region, but I think this is just something I copied from either MUSE or DM without verifying it actually existed or made any sense (there were a few of those instances tbh)

#

all vanilla regions:

#

UESP refers to it as molag amur and I know that NPCs in-game do too...

#

But uhh...

#

todd ?

#

Seems like todd.

clear spear
#

Yeah todd

steel gyro
#

don't worry, TR has its own baggage with region names, I always check the CS lol. I guess just an artifact of design vs implementation and people changing their minds

#

also I think in vanilla all the regions are named "[something] region" except sheogorad which is just sheogorad (iirc, it's been a while since I went through)

clear spear
clear spear
sly helm
#

That sheogorad one fucked me up too lol.

clear spear
#

Or however you spell

sly helm
#

I'm reasonably sure that it is. Ronik made some changes to my TR/PC playlists during the last TR launch and I think we still us ethat

sly helm
#

Alright, level difference rules are implemented now, like so:

---@type LevelDifferenceMap
local hlaaluLevelRequirement = {
    --absolute = { min = 0, max = 5 },
    relative = { min = 0.5, max = 2.0 }
}
#

I don't really have much skin in this whole levelDifference game as it's a level of specificity I have no interest in applying to playlists myself, but I'll verify whether any extant MUSE playlists actually leveraged this before pushing it

sly helm
#

gotta make sure I didn't screw this logic up too badly but we got ourselves a stat rule, here:

---@param statThreshold StatThresholdMap decimal number encompassing how much health the target should have left in order for this playlist to be considered valid
function PlaylistRules.dynamicStatThreshold(statThreshold)
    if not PlaylistRules.state.isInCombat then return false end

    if not S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] then S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] = {} end

    local currentCombatTargetsCache = S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey]

    if currentCombatTargetsCache and currentCombatTargetsCache[statThreshold] ~= nil then
        return currentCombatTargetsCache[statThreshold]
    end

    local result = false
    --- Iterate every actor
    --- Confirm all of them fall within the threshold
    --- if any one of them does not pass, then, bail on the whole thing
    for _, actor in pairs(PlaylistRules.state.combatTargets) do
        local actorStatCache = S3maphoreGlobalCache[actor.id] or {}
        if not S3maphoreGlobalCache[actor.id] then S3maphoreGlobalCache[actor.id] = actorStatCache end

        for _, statName in ipairs { 'fatigue', 'health', 'magicka', } do
            if statThreshold[statName] then
                local stat = actorStatCache[actor.id][statName] or actor.type.stats.dynamic[statName](actor)
                if not actorStatCache[actor.id][statName] then actorStatCache[actor.id][statName] = stat end

                local normalizedStat = stat.current / stat.base

                if normalizedStat < (statThreshold[statName].min or 0.0) or normalizedStat > (statThreshold[statName].max or HUGE) then
                    goto FAILED
                end
            end
        end
    end

    ::FAILED::

    currentCombatTargetsCache[statThreshold] = result

    return result
end
#

I have quite a bad feeling about the performance implications of using this one

#

YOLO

#

it could be considered dumb to allow this for magicka/fatigue but the caching strategy the mod leverages depends upon most playlist rules being provided tables, and this is absolutely non-negotiable for combatTarget rules since it's impossible to avoid looping over them all to validate whatever the rule is, so I figured why not

#

now we're getting serious:


---@type NumericPresenceMap
local hlaaluFactionData = {
    hlaalu = { min = 1 },
}

---@type LevelDifferenceMap
local hlaaluLevelRequirement = {
    --absolute = { min = 0, max = 5 },
    relative = { min = 0.5, max = 2.0 }
}

---@type StatThresholdMap
local hlaaluStatRange = {
    health = { min = 0.75 }
}

---@type ValidPlaylistCallback
local function hlaaluFactionRule()
    return Playback.state.isInCombat
        and Playback.rules.combatTargetFaction(hlaaluFactionData)
        and Playback.rules.dynamicStatThreshold(hlaaluStatRange)
        and Playback.rules.combatTargetLevelDifference(hlaaluLevelRequirement)
end
#

(fighing a hlaalu target whom is either within half or twice your level and has at least 75% health)

#

((these changes will not be made to MUSE hlaalu, I just test everything in Balmora))

#

oh, but uhm....

#

Righ.

#

Because the enemy's stats will change throughout the fight.

#

Aw jeez rick

#

level, id, type, vampirisim state, this kinda thing you can cache all you want and it's no big deal, but....

#

Well, I suppose my only option is to simply not cache them and if it causes performance issues that's like... not my problem

#

double yolo

#

I guess maybe you could posssssssiiiiiibbblyyyy try doing caching on a per-actor, per-stat basis, but by the point it's even possible to check the cache you're already two loops deep so it's not likely to help anything

#

We have onHit events now!

#

I could invalidate the cache when the actor is struck

#

aaaaahhhh but wait, should I do that?

#

uhhhh

#

mmmmmhhhh, kuyondo did do that MR to cache some userdatas internally so

#

triple yolo

#

oh but then that means I have to pull in the built-in actor script as well

#

that one's not a yolo moment, however, so we stay at yolo^3

#

but wait then if this rule can change per-frame during combat and potentially change the playlist, then....

#

aw jeez rick

#

so then this rule would also have to be able to toggle the internal combat state in order to actually return back to explore music, and then once the actor has died/fled it'll also revert to explore music, but we could arrive at a situation whereupon someone has passed this dynamicStat rule due to low health and then an explore playlist kicks in and then another battle playlist rolls up

#

We have now arrived at yolo^4

#
function PlaylistRules.dynamicStatThreshold(statThreshold)
    if not PlaylistRules.state.isInCombat then return false end

    if not S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] then S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] = {} end

    local currentCombatTargetsCache = S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey]

    if currentCombatTargetsCache and currentCombatTargetsCache[statThreshold] ~= nil then
        return currentCombatTargetsCache[statThreshold]
    end

    --- Iterate every actor
    --- Confirm all of them fall within the threshold
    --- if any one of them does not pass, then, bail on the whole thing
    local result = false
    for _, actor in pairs(PlaylistRules.state.combatTargets) do
        local actorStatCache = S3maphoreGlobalCache[actor.id] or {}
        if not S3maphoreGlobalCache[actor.id] then S3maphoreGlobalCache[actor.id] = actorStatCache end

        for _, statName in ipairs { 'fatigue', 'health', 'magicka', } do
            local statRange = statThreshold[statName]
            if statRange then
                local stat = actorStatCache[statName] or actor.type.stats.dynamic[statName](actor)
                if not actorStatCache[statName] then actorStatCache[statName] = stat end

                local normalizedStat = stat.current / stat.base

                if normalizedStat < (statRange.min or 0.0) or normalizedStat > (statRange.max or HUGE) then
                    PlaylistRules.state.isInCombat = false
                    goto FAILED
                end
            end
        end
    end

    result = true

    ::FAILED::

    currentCombatTargetsCache[statThreshold] = result

    return result
end
#

So every actor has to match this rule, if any single one of them fails it, we deem you not to be in combat and then explore playlists will take over until one of them dies and the state is updated. Depending on when exactly this happens you could still arrive in a position where you're not in combat, momentarily, the battle track finishes, an explore playlist kicks in for a short while, and then someone dies and battle kicks back in

#

.....There's no good way to dig myself out of this hole

#

but this is about as good as it is going to get, I think

#

Not going to block 0.55 on this madness any more than I already have

#

It is quite frustrating however that there is a decent change this rule will be triggering garbage collection more often as a result, however, so, make sure you hit 'em hard

#

every strike means more allocations 😄

#

ooohhhh but wait wait wait

#

the global cache with the cache key for the entire set of combat targets is what needs cleared, not the per-actor cache containing the dynamicStat userdatas

#

YAAAAAYYYYY no GC!

#

let's see how horrifically expensive this makes it

#

hm

#

Yea, seems fine. I guess.

#

This is terrible, but it works.

sly helm
sly helm
#

and here's you a combat target type rule:



function PlaylistRules.combatTargetType(targetTypeRules)
    if not PlaylistRules.state.isInCombat then return false end

    if not S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] then S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] = {} end

    local currentCombatTargetsCache = S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey]

    if currentCombatTargetsCache and currentCombatTargetsCache[targetTypeRules] ~= nil then
        return currentCombatTargetsCache[targetTypeRules]
    end

    local result = false
    --- Iterate over all fighting actors
    --- If any one fails the comparison, bail on the whole thing
    for _, actor in pairs(PlaylistRules.state.combatTargets) do
        local targetIsNPC = types.NPC.objectIsInstance(actor)
        if targetIsNPC then
            result = targetTypeRules.npc ~= nil
            print(result)
            if not result then goto FAILED end
        else
            local creatureRecord = actor.type.records[actor.recordId]
            local creatureType = validCreatureTypes[creatureRecord.type]
            result = targetTypeRules[creatureType] ~= nil
            print(result, creatureType, creatureRecord.type)
            if not result then goto FAILED end
        end
    end

    ::FAILED::

    currentCombatTargetsCache[targetTypeRules] = result

    return result
end
#

some poor guy on Nexus sent me an IDPresenceMap with like 500 undead creature names in it, so I didn't just make this one up

#

I been doing this for like four hours straight now though so ima play some diablo and chill

jagged badger
#

4 yolos deep! hes a madman

sly helm
#

Surprisingly, the hit from the target caches being cleared doesn't... seem to be problematic

#

But I have a relatively high-end machine, so I'm not sure.

#

It's low enough I can't really even see the spike too clearly when it happens, since it's literally only one frame, so perhaps it is indeed gucci

sly helm
#

Okay, so here's ourselves a vampire rule:



---@param vampireTypes VampireTypes
---@return boolean
function PlaylistRules.vampireClanTarget(vampireTypes)
    if not PlaylistRules.state.isInCombat or core.API_REVISION < onHitAPIRevision then return false end

    if not S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] then S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey] = {} end

    local currentCombatTargetsCache = S3maphoreGlobalCache[PlaylistRules.combatTargetCacheKey]

    if currentCombatTargetsCache and currentCombatTargetsCache[vampireTypes] ~= nil then
        return currentCombatTargetsCache[vampireTypes]
    end

    local result = false
    for _, actor in pairs(PlaylistRules.state.combatTargets) do
        local actorStatCache = S3maphoreGlobalCache[actor.id] or {}
        if not S3maphoreGlobalCache[actor.id] then S3maphoreGlobalCache[actor.id] = actorStatCache end

        for _, clanName in ipairs(vampireTypes) do
            local activeSpells = actorStatCache.spells or actor.type.activeSpells(actor)
            if not actorStatCache.spells then actorStatCache.spells = activeSpells end

            if activeSpells:isSpellActive(('vampire blood %s'):format(clanName)) then
                result = true
                goto MATCHED
            end
        end
    end

    ::MATCHED::

    currentCombatTargetsCache[vampireTypes] = result

    return result
end
#

and, uh, I think that's the remainder of the MUSE rules to apply. Hopefully.

#

Maybe.

#

I sure as hell hope so 😅

#

Heya,
Here shortly the latest dev build of the mod should be finished compiling in GitLab.
Would you mind downloading it for me please and confirming it actually works as expected?
I made this change as you requested, it's a pretty solid idea IMO and I didn't even bother adding a config option to enable/disable this behavior.

So, if you transition playlists while another is running, then, when the current track is over it will immediately roll into the new playlist, without respecting silenceParams.

If you're already in an "intermission" with no music playing, all the playlist logic is halted and you'll have to wait for it to finish.
Not 100% sure how I feel about that myself but that's how it should be working, anyway.

#

uuhhhhh. Hm

#

I see a design flaw here but whatever, I'm going to bed. 😄

fiery steppe
#

hewwo, I noticed that if a filename is too long when editing the playlist files in notepad++, the latter parts of the name aren't coloured. Does that mean that lines in the playlist files can't be too long?

jagged badger
cold lake
# sly helm Heya, Here shortly the latest dev build of the mod should be finished compiling...

hello
it just works
silence settings are pretty flawless
I also tried the fallback feature, it's actually pretty nice, you dont need vanilla tracks stuffed across every folder, or you can include ambient palettes like in skyrim

I couldnt confirm the intermission logic the way you described it. when transitioning into another playlist while another is still going, it will play a silence track after, wait for it to be over, and only then play a track from another playlist. it also waits for intermission to be over even if you transitioned into a playlist that is supposed to skip the previous track (like from the wilderness into balmora with overworld override playlist setting checked). maybe it's fine, let the intermission be unskippable no matter what? I dont think people are gonna notice. makes for easier testing too

cold lake
#

btw what are those
_ENV = _ENV
and
local hlaaluFactionData = { hlaalu = { min = 1 }, }

sly helm
#

Meh, it was kinda late, I suspect I might've done it wrong.

sly helm
#

_ENV makes your IDE aware the built-in environment each playlist has access to, which includes Tilesets, the PlaylistPriority file, and some of the built-in functions it provides to playlists now

#

This is why you may have seen in some playlists, they look like this now:

---@type ValidPlaylistCallback
local function hlaaluCellRule()
    return not Playback.state.isInCombat
        and (
            Playback.rules.cellNameExact(HlaaluCatacombNames)
            or Playback.rules.cellNameMatch(HlaaluCellNames)
        )
end

Instead of playback being a parameter passed into the function (which it still is for backward compatibility), I use it from the environment. You also don't have to require 'doc.playlistPriority anymore for this reason

#

I noticed like every single playlist ever was doing this so I figured out a way to minimize the boilerplate and keep them focused strictly on what the playlist wants to bee doing

fiery steppe
#

It's cause notepad++ has syntax highlighting, and the highlighting stops if the line is too long

#

So I thought maybe that was because lua has some limit on line length or something

sly helm
#

oh, no, most languages have a style checker that'll do that (80 chars is pretty common)

#

But it's mostly a sanity/cleanliness thing

fiery steppe
#

Hm ok

#

Thanks

sly helm
#

absolutely!

#

Feel free to ask if you have any questions about the new rules too, I've added a bunch of stuff in latest version

fiery steppe
#

Thanks

sly helm
#

And there are some bugs fixed that screwed up a few in the nexus version

fiery steppe
#

Hm wait

#

So playlists are folder only? You can't set an area to play two specific tracks?

sly helm
#

Oh, you totally can!

#

See the TR/PC module

#

But most people tend to prefer folder-based so they're more easily extendable

fiery steppe
#

Ah ok

sly helm
#

    {
        id = 'Tamriel Rebuilt - Port Telvannis',
        priority = PlaylistPriority.CellMatch,
        randomize = true,

        tracks = {
            'Music/MS/general/TRairdepths/Dreamy athmospheres 1.mp3',
            'Music/MS/general/TRairdepths/Dreamy athmospheres 1.mp3',
            'Music/MS/region/Telvanni Isles/Port Telvannis.mp3',
        },

        isValidCallback = function()
            return Playback.rules.cellNameMatch(PortTelvannisPatterns)
        end,
    },
fiery steppe
#

If two different playlist files give tracks to the same area, will those override?

sly helm
#

I'm gonna transition the TR/PC ones to folder-based with fallback tracks in next release so I don't think any built in ones will work this way, but its totally a thing

fiery steppe
#

cause if that also works idk why you would need folders to extend

#

Hm ok

sly helm
#

Well it's just annoying to have to edit the playlist file itself to add new songs to Port Telvannis, for example

#

Instead of just smacking new tracks into music/ms/region/telvanni isles/

fiery steppe
#

I think I understand yeah

#

For mod users who don't want to learn to write the text files

sly helm
# fiery steppe If two different playlist files give tracks to the same area, will those overrid...

They will, but you get a lot of control over this.
Depending on how the rule is structured, they might not.

For example, let's say one has a rule that checks you're in combat, AND the area you're in, and the other checks you're NOT in combat, but in the same area. These two won't conflict and everything will be fine.

If the rules are BOTH true at the same time, then, one of two things happens:

  1. Whichever playlist has a LOWER priority value, will take precedence.
  2. If they BOTH have the SAME priority level, then, whichever playlist loaded later will take precedence
#

a good example of this happening is the Anvil and nine divines temples playlists you see here.

#

About a week ago, someone reported to me the normal Anvil playlist, overrides the temple one - and they totally do conflict.

#

So literally all I did to fix it was bump the temple playlist lower in the order, it now has a higher registrationOrder, and it always wins against the normal anvil playlist.

#

Most of the playlist modules are built with this in mind, so they tend to use the same priority levels. In some rare cases if you have one module conflicting with another, you can decrement the priority used in your playlist to override it, eg PlaylistPriority.CellMatch - 1, etc

fiery steppe
#

Hmmm I see

#

I will probably run by my playlist files here when they're done

sly helm
#

Hell yeah! We can optimize em or tweak em however you like

fiery steppe
#

If you're in a cell that had trackA and trackB, and trackB is playing, and you then move into a cell that has trackB and trackC, will trackB continue playing? Assuming you have the options of overriding music on

#

Thanks :3

sly helm
#

Huh.

#

Interesting thought.

#

Well, nothing is actually built with the idea that you could have the same track in multiple playlists tbh

#

So if you have the overrideMusic thing enabled, AND it picks the same track, it'll start them over

#

That's easy to buff out, though.

sly helm
#

I just realized you've never been able to disable the vanilla explore playlist. todd

#

Has that really not broken on anyone? It uses the BattleActive setting inappropriately

#

So should accidentally disable both builtins

fiery steppe
#

Might be worth changing that if possible

sly helm
#

Of course it is 😄

#

What's your use case, though

sly helm
#

Okay so all the technical aspects for the next version are now pretty much done.
Finally, we'll need:

  1. Update existing playlists to use fallbacks/level rules (I think some of the MUSE playlists are currently incorrectly-implemented due to lacking the level rule)
  2. Make playlists for this: https://www.nexusmods.com/morrowind/mods/46229
  3. Make playlists for better music system redone

And we'll call that 0.6!

Nexus Mods :: Morrowind

Quickly create province-specific battle and explore soundtracks for Tamriel Rebuilt and Project Tamriel's province mods by dragging and dropping music into folders.

fiery steppe
cold lake
#

now you can just use fallback playlists for that

#

will the new version require openmw 0.50 and are the playlists from an old mod version gonna be compatible?

sly helm
#

Yeah, I've preserved back-compat across all versions

#

The dynamicStat rule requires .50 but if you're on an api revision that's too early it'll just never work, so the mod itself is still fine for .49

sly helm
#

It's true that you can use fallback playlists for that now, but there can still be exceeedingly rare cases where two playlists run the same track and have different interrupt modes

#

I kept feeling like something wasn't quite right about implementing that change - it's that you would have to manually set an interrupt mode OR disable the "allow tracks to finish" setting in order for a second playlist to run the same song and also trigger that same song to restart

#

incredibly rare scenario, but still could happen, so fuck it

#

so rare, in fact, I'm skeptical that it would ever actually happen in practice - either you'd have to have a manual interrupt mode set to INTERRUPT.Other, or have two playlists where one uses a battle priority and another uses Explore, and they both share a track

fiery steppe
#

hm

#

sorry maybe it was something else that made me think that was a problem

#

some mistake in the setup of playlist files

#

I should actually finish my own files before passing judgement on whether yours work

sly helm
#

hah! No worries, I forgot 😅

#

I was just thinkin about it and wanted to explain further since I misinformed you.

grave garden
#

So, does anyone just have a list of all dungeons configured to be used in a playlist? I'm not sure where to start, but I have some tracks I want to use as generic "dugeon music" in all occassions, and another set of tracks that I want to play in Red Mountain.

#

I still plan (though haven't looked into how, sorry, that's my fault, you already explained but I've been busy) to have secondary (Daggerfall) tracks added to the list during storms (but not forced to play,) and I'd love a set of rules that make music less common at night.

#

Lastly and related to one of my other questions but not part of this: you have a "finish current track" feature, can that be used to delay combat music start? So that even if combat starts the current track must finish? I don't know if that would be useful, but maybe if a fight ends before the song changes it just picks from the regular list.

sly helm
sly helm
#

Normally the interrupt mode is automatically assigned, but you can set one manually in your playlist.
So if you set your battle playlists to use INTERRUPT.Me, then, they won't forcefully interrupt explore tracks.

#

to have secondary (Daggerfall) tracks added to the list during storms (but not forced to play,)
This straight-up isn't a thing right now. You'd have to make another playlist for specific weather patterns, and maybe set a really long silence duration on it if you want it to play irregularly.

#

and I'd love a set of rules that make music less common at night.
Same answer, although this one is much easier to do considering how playlists are built.

sly helm
#

That'll be neat, but not for the upcoming release. It wouldn't be too hard to accomplish, though, so maybe in the next update after the one I'm working on now.

grave garden
#

But this stuff still works in the current version, just to make sure I follow you?

#

I think I'm gonna set those up this morning, if God permits, but I do apologize that I'm asking questions about questions you've answered and I haven't yet thoroughally read. I just plan to go through all your notes at once my pieces are together.

sly helm
#

Relax. 🙂

#

Yeah, the weather stuff does still work!

#

I'm going to change the underlying implementation since it no longer needs to be mwscript-based n 0.50 but the way playlists use it won't be any different

#

Playback.state.weather == 'clear' etc

fiery steppe
#

How does s3maphore interact with mods that add musicians?

jagged badger
fiery steppe
jagged badger
# fiery steppe Animated Morrowind and Ashlander Dombrists

Hmm I haven't made it out to an ashlander camp yet but I'm assuming they won't interact at all, one is music and the other is sound. It mght be a good idea to make a very quiet playlist for the camps. There's a new sound bank just released (AMAR) that does a nice job of quiet ambient desert music

fiery steppe
#

so I was assuming there must be something

sly helm
#

The behavior with mwscript music isn't any different than how the built-in music script handles it (because that's ultimately what it is)

jagged badger
#

Can you set playlist rules based on sound files playing? Like storybook music when Mr Fry is reading me my bedtime 36 Lessons. Just curious

sly helm
#

For the most part, nothing will happen when mwscript has requested a song play. However, if a playlist change occurs, which will mostly only happen if you get into a fight or a “special”-level track plays, then playlists with higher interrupt modes will override it.

#

Playlist files are just straight up Lua scripts (in player scope), so for the most part it can have rules based on anything the API itself is capable of.

#

Generally speaking it’s only limited by your willingness to write Lua 😄
the playlist rules and state are just a convenient means to operate the thing.

jagged badger
#

Haha cool I see

fiery steppe
#

how come the telvanni muse playlists have a different condition set-up for playing than the other house playlists?

sly helm
#

Sorry, I'm not sure what you mean - the original versions all use cellNameMatch and combatTargetExact

#

The hlaalu one presently is using combatTargetFaction, since that's the one I've been testing with and haven't applied it to the others yet, though.

#

Here's redoran:


---@type ValidPlaylistCallback
local function redoranEnemyRule(playback)
    return playback.state.isInCombat
        and playback.rules.combatTargetExact(RedoranEnemyNames)
end
--- some cell names

---@type ValidPlaylistCallback
local function redoranCellRule(playback)
    return not playback.state.isInCombat
        and playback.rules.cellNameMatch(RedoranCellNames)
end
        -- explore
        isValidCallback = function(playback)
            return not playback.state.isInCombat
                and playback.rules.cellNameMatch(TelvanniMatches)
        end

      -- combat
      isValidCallback = function(playback)
            return playback.state.isInCombat
                and playback.rules.combatTargetExact(TelvanniCombatTargets)
        end,
#

if you mean that the Telvanni playlists have the functions inlined into the table versus the others which don't, that was just an oversight in tweaking the playlists a while ago.

fiery steppe
#

so I could simplify that one by making it like the others?

sly helm
#

I mean, I guess so

#

Not necessarily a ton of reason to, though, it's a purely theoretical performance improvement. And my improvement I mean, like, nanoseconds

#

Some synthetic tests have shown localizing functions that way can make them run marginally faster, but I never benched it in openmw

fiery steppe
#

right yeah

#

it does also make it faster to write

#

if you're copy pasting stuff

#

also it satisfies my autism and I'm only doing this for fun anyways

sly helm
#

Hey no judgement - now that I've noticed it I'm gonna apply it too todd

fiery steppe
#

lol

#

thanks

#

also, is there any difference between having an extra TombCellExclusions thingy in Muse Tombs.lua, and just having the same cells listed in the disallowed = {} part of TombCellMatches ?

sly helm
#

Explicit cell names are faster than string matching the cell names, but adding narsis, catacombs: should work, yeah.

#

I avoid using matches whenever humanly possible.

#

I think maybe there was one particular catacombs cell I actually wanted the tombs set to run in, but I forget.

fiery steppe
#

hm I see

#

thanks

#

but that muse tomb playlist doesn't check for combat...?

#
local function TombCellRule(playback)
    return not playback.state.isInCombat
        and not playback.rules.cellNameExact(TombCellExclusions)
        and playback.rules.cellNameMatch(TombCellMatches)
end
#

would that look like this?

#

if I wanted to add that combat exclusion?

sly helm
#

yeah.

#

Good catch

fiery steppe
#

thanks

fiery steppe
#

hm do you happen to know if there's a way to remove nerevar rising from the default explore tracks without removing it from the main menu?

#

or I guess can you use s3maphore to play tracks on the main menu?

#

hm also it seems like in your muse sixth house playlist, the theManHimselfRule function isn't being called

#

ms/combat/dagoth ur just has isvalidcallback = sixthhouseenemyrule

sly helm
#

I fixed that a while ago.

#

If you're digging around in/tweaking playlists this much you should use a development build from my site

#

You.... could use it to play music on the main menu, I suppose.

#

But there's no way to remove nerevar rising from the normal explore list unless you delete it from the explore/ folder, or hardcode the track listing in the explore playlist.

#

Probably easiest just to skip the track when it comes on tbh.

fiery steppe
#

or rather override it with that

sly helm
#

It should be pretty easy to make a small mod on top of this that plays whatever on the main menu

#

tbh it never even occurred to me that's something you might want to do, but it's absolutely posisble

fiery steppe
#

thanks

fiery steppe
#

hm I think I finished my playlist files though they don't seem to work yet

#

compressed because otherwise discord embeds them all

#

lemme know if you can see if I made any mistakes

#

I'm going to bed now

#

thanks

sly helm
#

I have tilesets built-in for all these btw

#

missed some braces

#
---@type ValidPlaylistCallback
local function TelvanniCellRule(playback)
    return not playback.state.isInCombat
        and (
            playback.rules.cellNameMatch(TelvanniCellNames)
---            or playback.rules.cellNameExact(TelvanniCatacombNames)
        )
end

TelvanniCellNames is undefined, so this will just make the whole mod blow up when it's loaded.

fiery steppe
#

Ah, thanks

sly helm
#

They look good though

#

You're using an older format though

#

tl;dr - don't bother to require 'doc.PlaylistPriority' and playback doesn't need to be a function parameter. For example:


---@type ValidPlaylistCallback
local function TelvanniCellRule()
    return not Playback.state.isInCombat
        and (
            Playback.rules.cellNameMatch(TelvanniCellNames)
---            or playback.rules.cellNameExact(TelvanniCatacombNames)
        )
end
#

less boilerplate.

fiery steppe
#

Thanks

#

I will have to fix them tomorrow

#

Good night

#

And thank you for the help

sly helm
#

no probs, I posted fixed versions of the other two anyway

#

I couldn't quite tell what you were going for with the telvanni one though

fiery steppe
#

It was just meant to be the same logic as the other houses

#

Actually I had another question

#

I assume that music set to play in the Bitter Coast will play in eg Seyda Neen, but will it also play in Seyda Neen interiors?

sly helm
#

Good catch.

#

No.

#

That occurred to me a couple days ago.

#

Tbh I don't even use the region rule

#

I thought I removed it, until I saw some people actually using it

#

    {
        -- 'Project Cyrodiil - Abecean Shores/Brennan Bluffs',
        id = 'ms/region/cyrodiil brennan bluffs',
        priority = PlaylistPriority.Region,
        randomize = true,

        isValidCallback = function()
            return Playback.state.self.cell.region == 'gilded hills region'
        end,
    },
#

The problem is that interior cells tend not to have regions, so, I'll need to track the current region in PlaybackState manually.

#

Which is pretty easy to do I just didn't realize I needed to

fiery steppe
#

Oh ok

#

I was just gonna add an or clause to the rule so that it also plays in certain interiors

sly helm
#

well I had a plan do it, basically you'd do return Playback.state.lastRegion == 'someRegionId

#

OR return someTable[Playback.state.lastRegion]

fiery steppe
#

ah

#

if you track regions, will that break on teleporting? like if you're standing on Azura's Coast and recall into Caius' house, will it think Caius' house is on Azura's Coast?

sly helm
#

If I do it that way, yeah.

#

I could try to determine the proper region by checking load doors but I'm a little skeptical of whether that's the "safest" way to do it

#

I'd kind of prefer being slightly inaccurate to possibly having to load unloaded cells just to check their regions

fiery steppe
fiery steppe
#

wait nvm I see the missing braces

sly helm
#

this one missed an opening brace

#

and this one

#

(it's an array, so you need two at the beginning, one to start the array, and one to start the playlist)

fiery steppe
#

yeah

sly helm
#

The MUSE playlists from this mod were kinda mid so I took some liberties and improved them

#

In my install there is literally one cell in the entire world with traders in the name, so it was somewhat pointless to recreate that one perfectly

fiery steppe
#

hm well my playlists still don't seem to work

#

if I'm trying to play a specific sound file, do I need the file extension in the name of the track in the playlist file?

#

it keeps fading tracks in and out, which makes me think the conditions are working but not the sound files

sly helm
#

yeah, if you're specifying tracks manually it does require the extension

#

There are at least a dozen or more possible audio file types so it doesn't try to guess

fiery steppe
#

ah ok

sly helm
#

making good progress doing soule sounds but there are, uh

#

50? Cell-based playlists in here alone

#

and boy some of these are... interesting

#

a lot of these MUSE playlists don't even make sense tbh

#

at least partially

fiery steppe
#

if one playlist file doesn't work, it only breaks that one, not all of them, right?

sly helm
#

Eh, not necessarily. Check your F10 for emitted errors.

#

If the validCallback a playlist specifies does something nasty, like, you feed some rule a variable that doesn't exist, it'll throw on every frame and break the whole mod.

fiery steppe
#

it's not emitting any errors as far as I can tell

sly helm
#

when you do reloadlua, failures in loading a specific module will come up toward the end

#

Just before it says N playlists loaded! Ready to play music!

#

That also happens at game start but easier to reloadlua and just see where the logs end up

#

A couple other ways to debug a playlist include:

  1. In the settings menu for the mod, every registered playlist will show up in the enable/disable playlists section. if you see it here, it's registered. If the name is greyed out, no tracks have been found in your VFS.
  2. If you think a playlist should be running, but it's not, open the console and do this:
luap
view(I.S3maphore.getCurrentPlaylist())

This'll show you what playlist is currently supposed to be playing based on which one's rule is matching. It will probably wait until whatever track finishes to start running, if a different playlist is currently supposed to be active

fiery steppe
#

ok, thanks

#

sorry, had to do some biology homework, will try doing those things now

#

hm well it doesn't seem to be giving any errors in the log after "Ready to play music!"

#

and the playlists show up in the scripts menu, though I can't click the disable button for any of them?

#

it doesn't care that there's commas in the filenames for the songs, right?

fiery steppe
#

when I try the getcurrentplaylist command it just says it's explore

#

ah, but it's the explore of my regions playlist, not the vanilla explore playlist

#

I think

#

yes cause it has the region priority, whereas the vanilla one has 1000 priority

fiery steppe
#

I'm gonna send the whole mod, cause it would seem by the previous two things that it's some problem with the track files

#

ah file exceeds discord limits uh

#

oh uh I think I see the issue. I let id = the filename for the track thinking if that's how it works with folders it must be so for files as well, but files must be in the tracks field?

#
---@type S3maphorePlaylist[]
return {
    {
        id = 'KM Ascadian Isles',
        tracks = 'km/mwor/01 Roads Heading East.mp3',
        tracks = 'km/mwor/27 Those Who Walk the Third Way.mp3',
        priority = PlaylistPriority.Region,
        randomize = true,
        isValidCallback = AscadianIslesRegionsRule,
    },
}
#

would this be correct?

#

just as an example

#

or does each track need it's own playlist?

#

or do they need to be in a string[] ?

#
---@type S3maphorePlaylist[]
return {
    {
        id = 'KM Ascadian Isles',
        tracks = string [
            'km/mwor/01 Roads Heading East.mp3',
            'km/mwor/27 Those Who Walk the Third Way.mp3'
        ]
        priority = PlaylistPriority.Region,
        randomize = true,
        isValidCallback = AscadianIslesRegionsRule,
    },
}```
#

like this?

jagged badger
sly helm
#

I'm not really sure it's so different at all tbh

#

It has a shitton of playlists but it's not really.. unique in that way?

sly helm
#

Your track paths are wrong, that's all.

#

        tracks = {
            'music/aa22/tew_aa_3.mp3',
        },

tracks need to specify the music directory

#

using the id field to specify the track paths doesn't:


    {
        id = 'ms/cell/special/fort frostmoth',
        priority = PlaylistPriority.CellExact,
        randomize = true,

        isValidCallback = frostmothRule,
    },
fiery steppe
#

oki doki, thanks

#

can I have both files and a folder in the tracks variable?

sly helm
#

nope

#

But you can do this:



    {
        id = 'ms/region/lan orethan',
        priority = PlaylistPriority.Region,
        randomize = true,

        fallback = {
            playlists = {
                'ms/region/alt orethan region',
            },
            tracks = {
                'music/ms/general/trairdepths/dreamy athmospheres 1.mp3',
                'music/ms/general/trairdepths/dreamy athmospheres 2.mp3',
            },
            playlistChance = 0.60,
        },

        isValidCallback = function()
            return Playback.rules.region(OrethanRegions)
        end,
    },
#

where the id is a folder, and fallback can refer to other tracks OR playlists to run

#

although in this case it doesn't really matter that the id is actually a folder or not, it's just fairly close to what you're doing

fiery steppe
#

hm ok

#

but that's prerelease

sly helm
#

You should use it regardless

#

The next update is pretty much entirely finished except soule sounds so there's no reason not to

#

Plus there are numerous bugs in the nexus version which have been fixed and additional playlist rules

fiery steppe
#

ok

sly helm
#

fallback.tracks are added onto the main tracklist during playlist registration, fallback playlists are selected randomly

fiery steppe
#

do u know when it will be released?

sly helm
#

After however long it takes me to 50 more of these playlists and do some very minor documentation updates

#

Not very

fiery steppe
#

I just wanna have a finished working version first, I'll look at adding the fallback stuff later

#

I also will need to add TR integration and I wanna play with some weird conditioning anyways

#

priority takes a number, so no ' around it, right?

sly helm
#

Yeah, but you really shouldn't be setting priority numbers explicitly

fiery steppe
#

hm ok

#

I have a playlist for the sixth house and one for the ash citadels in specific. I removed the ash citadels from the sixth house cell list, but I felt like I should make sure it still has higher priority, and the general sixth house one has to be faction priority because it must override tracks set to play in any cave or dwemer ruin

#

but I suppose I can just let them both be faction

#

yeah I'm just being overly cautious

#

how come some arrays end with a comma and others don't?

sly helm
#

Well, what you can do is increment the priorities if you need to, that works fine

#

eg PlaylistPriority.Faction - 1

#

That's the safest way to do it because the enums may or may not change at some point

sly helm
#

Lua allows trailing commas so it doesn't hurt anything

fiery steppe
#

oki doki

#

thanks

fiery steppe
#

hm ok so testing again, two of the lua files now work, while the others don't
they can all be toggled on and off in the scripts menu, and the log throws no errors, but only mentions three of the playlists (two of which are the ones working)

EDIT: also the only two working ones seem to default to 'no' for playlist state in the scripts menu

#

if I try the command for which playlist is currently playing it returns nil (I disabled the explore playlist for testing)

sly helm
#

maybe I should make it throw explicitly if one of the fields is the wrong type.

#

the dagoth ur playlist has tracks as a string, not an array

#

the dwemer playlist looks fine.

#

have you enabled debug messages?

#

Your dwemer one registers, for me:


[01:30:34.691 I] L@0x1[scripts/s3/music/core.lua]:    [ S3MAPHORE ]: reading playlist file playlists/km dwemer.lua
[01:30:34.692 I] L@0x1[scripts/s3/music/core.lua]:    [ S3MAPHORE ]: table: 0x5d3d716ab4a0 {
[01:30:34.692 I]   1 = table: 0x5d3d76fb1e20 {
[01:30:34.692 I]     tracks = table: 0x5d3d76fb1e70 {
[01:30:34.692 I]       1 = music/km/mwor/19 Brass of the Deep Folk.mp3,
[01:30:34.692 I]       2 = music/km/mwor/22 Kagrenacs Fixation.mp3,
[01:30:34.692 I]     },
[01:30:34.692 I]     randomize = true,
[01:30:34.692 I]     isValidCallback = function: 0x5d3d72dbd4a0,
[01:30:34.692 I]     id = KM Dwemer Playlist,
[01:30:34.692 I]     priority = 600,
[01:30:34.692 I]   },
[01:30:34.692 I] }

And it plays, too:

[01:37:23.656 I] L@0x1[scripts/s3/music/core.lua]:    [ S3MAPHORE ]: Track changed! Current playlist is: KM Dwemer Playlist Track: music/km/mwor/19 Brass of the Deep Folk.mp3
[01:37:24.671 I] Playing "music/km/mwor/19 brass of the deep folk.mp3"
#

I'm pretty confident you'll have something going on in your logs that indicates what's happening, especially if you enable debug messages.

#

It might just be throwing and dying making it that far down the playlist chain due to the dagoth playlist's tracks not being set up properly.

#

I can add some type checking to the loader.

fiery steppe
#

I see

#

thanks

fiery steppe
#

I did have debug messages enabled but it didn't give any error emssages as far as I can tell. but you're probably right it was the dagoth ur file breaking things since the non-working ones are after it alphabetically, and the working ones are before it.

#

yes! everything seems to be working now! thank you 😊

fiery steppe
#

Should I avoid naming my condition functions the same thing as the ones present in other playlist lua files, or does that not matter? wait nvm, I assume that them being local means they don't override

sly helm
#

Exactly! Yeah.
The main thing to keep in mind is that the id must be unique.

#

If two playlists share an id, whichever loads later will override the other.

fiery steppe
#

thanks

fiery steppe
#

Hm if you had the ability to exclude tracks from a playlist or fallback playlist, one could more easily and cleanly make that mod that disables Nerevar Rising during exploration

sly helm
#

I still think that's kind of a weird use case, but, I'll go ahead and add this for the next version anyway because I need it to exclude silence tracks.

fiery steppe
#

:0

#

thanks

sly helm
#

After all, it wouldn't be a good, solid update if we didn't feature creep the hell out of it todd

fiery steppe
#

xP

#

I wasn't expecting you to add it this update tbh

sly helm
#

to be perfectly honest I probably wouldn't have but I keep seeing the silence tracks pop up while I'm in cyrodiil and there's just no other way to deal with them unless I ask whomever the author is to remove the silence tracks from cyrodiil. But then that leaves MWSE users out, so it's easier to just smack in an exclusion table in the playlists

#

FWIW I have a three day weekend from work so the next build will definitely be pushed before/on Tuesday

#

All I really need to do now is finish Soule Sounds, which is mostly done, and I'm super excited to finish it

#

Apparently MWSE users are super hyped on Soule Sounds in general

fiery steppe
#

hm that doesn't not make sense. if it has more conditions than muse, and it has a bunch of music that fits well within the game because it's also made by Soule

sly helm
#

I’m not convinced they do fit well tbh just because I’ve never heard them.

#

It’s sort of a mishmash of a bunch of things Soule composed for a bunch of different games

fiery steppe
#

Oh I see

analog moat
#

Eep, i need to figure out how to make my own playlist for this, the limited TR music in Narsis is driving me nuts and i really want to add in kvetching mananauts stuff, seems very daunting though

sly helm
#

That's disappointing 🙁

#

Playlists are incredibly easy to make.

#

plus, there are already playlists for TR/PC anyway.

analog moat
#

my head hurts from looking at the playlist creation instructions at least 😭

analog moat
sly helm
#

yeah I think the docs are a little....

#

wall of text-y

sly helm
#

so for example the TR stuff looks like this

#

Which mod are you trying to add, Morrow Winds of Resdaynia, or?

#

That one does already work if you install it properly. But I'm not exactly sure what the best recommendation is to make since I don't know exactly what mod we're looking at

analog moat
#

You're saying i can just use the MUSE version of it and make it work somehow?

sly helm
#

S3maphore 0.6 has been released!
This, uh... This changelog is pretty big.
--- Documented playlist environment -> No more requiring the same crap in every playlist you don't actually need
--- New rules -> fightingVampires, dynamicStat (only on .50, always false on 0.49), combatTargetFaction, exteriorGrid, combatTargetLevelDifference,combatTargetType (for making undead/npc/deadra playlists), and localMerchantType
--- New playlist state -> nearestRegion and currentGrid, both used in the the region and exteriorGrid rules respectively
--- Loads of bugfixes
--- New Playlists -> Better Music System Redone, Provincial Music, Soule Sounds (first take on this one, more expansion to do)
--- New Playlist Features -> track exclusions, built-in silence tracks, and fallback tracks/playlists to mix and match your favorites without duping a bunch of files everywhere.
See the full (massive) 0.6 changelog for full details.
https://www.nexusmods.com/morrowind/mods/56836

Nexus Mods :: Morrowind

S3maphore is a replacement both for OpenMW's built-in music management system and Dynamic Music, with a focus on flexibility and performance. Your music, like you'd never get it anywhere e

sly helm
analog moat
#

ohhh

sly helm
#

If you want to use it in TR regions you need to extend the existing playlists yourself using the new fallback feature, or just copy tracks around

#

Changing the playlists is hella easy

#

Most of the TR stuff uses the same fallback table:


---@type PlaylistFallback
local TRFallbackData = {
    tracks = {
        'music/ms/general/trairdepths/dreamy athmospheres 1.mp3',
        'music/ms/general/trairdepths/dreamy athmospheres 2.mp3',
    },
    playlistChance = 0.60,
}
#

Some of them, like alt orethan, have their own:


    {
        id = 'ms/region/lan orethan',
        priority = PlaylistPriority.Region,
        randomize = true,

        fallback = {
            playlists = {
                'ms/region/alt orethan region',
            },
            tracks = {
                'music/ms/general/trairdepths/dreamy athmospheres 1.mp3',
                'music/ms/general/trairdepths/dreamy athmospheres 2.mp3',
            },
            playlistChance = 0.60,
        },

        isValidCallback = function()
            return Playback.rules.region(OrethanRegions)
        end,
    },
#

To add some of the morrow winds stuff you just pick one of the folders it uses to store music in, and add it in fallback.playlists. Like this:

        fallback = {
            playlists = {
                'ms/region/alt orethan region',
                'ms/cell/public/hlaalu',
            },
            tracks = {
                'music/ms/general/trairdepths/dreamy athmospheres 1.mp3',
                'music/ms/general/trairdepths/dreamy athmospheres 2.mp3',
            },
            playlistChance = 0.60,
        },
analog moat
#

Does 0.6 require 0.50?

sly helm
#

A couple of the new rules do but the mod itself does not.

vital grotto
#

Congrats on the new release, sounds great!

inner crypt
#

@sly helm, is this a residual git file from your repo?

[16:30:03.191 E] Failed to load audio from "music/ms/cell/empire/.gitkeep": Failed to open input
analog moat
#

@sly helm thank you for the help, i managed to make it work 🙇‍♀️

fiery steppe
#

need to update my playlists now to work with the newest version of s3maphore lol but yeah

#

but I added TR stuff, so relevant playlists play in the new regions and towns, and added an indoril playlist

#

alos congrats s3ctor on the release :3

cold lake
#

Never priority makes the playlist play everywhere, when the only rule is being outside of combat
I had to give the fallback playlist priority Explore + 1 for it to work as intended

errant fulcrum
#

Oop that was meant for the search bar.

sly helm
sly helm
sly helm
# fiery steppe alos congrats s3ctor on the release :3

Thanks!
I'm looking forward to working on something else for a bit 😅
I'd be lying if I said i'm not a little burnt out on this mod. But of course I'm still open to requests, just excited to do something different.

gaunt hatch
#

Hey S3ctor. Just downloaded the mod today. Thanks for making this.

I’m having an issue with the Redoran music not playing in Ald-ruhn, and the Redoran combat music isn’t playing at all. I looked at the script, and it seems like it’s not complete; it’s missing the TR Redoran settlements, whereas Hlaalu or the Empire aren’t. I’m not familiar with the code, so I could be mistaken.

sly helm
#

heya, can you go into ald-run and try this in the console, one at a time:

luap
view(I.S3maphore.getCurrentPlaylist()))
#

I believe the ald-ruhn playlists should be working, but they have a special character in them I might've forgotten to account for.

#

I feel like maybe I reintroduced an old bug forgetting why I did things a certain way 😅

gaunt hatch
#

This is what I got:

userdata: 0x031164bdc0 {
priority = 1000,
playOneTrack = false,
randomize = true,
isValidCallback = function: 0x03231d0298,
interruptMode = 0,
active = true,
tracks = table: 0x03231d2898,
cycleTracks = true,
registrationOrder = 0,
id = Explore,
}

fiery steppe
#

hey I think there's an oversight in the redoran combat playlist rule

#

it says hlaalu = { min = 1 }, instead of redoran

#

also the muse regions playlist still has local PlaylistPriority = require 'doc.playlistPriority' ?

fiery steppe
#

also also if you want a list of the TR Redoran settlements, I made one for myself I can send over if u want

fiery steppe
#

does playback.rules.region use the actual in-game shown name for a region? or the editor ID name for the region?

cold lake
#

an id

fiery steppe
#

thanks

cold lake
cold lake
fiery steppe
sly helm
#

I fixed this once already but I changed the inner syntax of the match rule.

sly helm
sly helm
fiery steppe
#

was there a change to the way combat music works? for some reason my playlists seem to break the combat music

inner crypt
#

@sly helm, with combat music disabled, when a combat starts I get:

[16:34:38.257 E] L@0x1[scripts/s3/music/core.lua] eventHandler[S3maphoreClearTargetCache] failed. Lua error: [string "scripts/s3/music/playlistrules.lua"]:40: table index is nil
[16:34:38.257 E] stack traceback:
[16:34:38.257 E]     [string "scripts/s3/music/playlistrules.lua"]:40: in function 'clearGlobalCombatTargetCache'
[16:34:38.257 E]     [string "scripts/s3/music/core.lua"]:932: in function <[string "scripts/s3/music/core.lua"]:930>
[16:34:38.257 E]     [C]: in ?
#

on a recent OpenMW 0.50

fiery steppe
#

oh I see maybe it's not my fault

gaunt hatch
inner crypt
#

and this variant:

[17:03:08.429 E] L@0x1[scripts/s3/music/core.lua] eventHandler[OMWMusicCombatTargetsChanged] failed. Lua error: [string "scripts/s3/music/playlistrules.lua"]:40: table index is nil
[17:03:08.429 E] stack traceback:
[17:03:08.429 E]     [string "scripts/s3/music/playlistrules.lua"]:40: in function 'clearGlobalCombatTargetCache'
[17:03:08.429 E]     [string "scripts/s3/music/playlistrules.lua"]:47: in function 'clearCombatCaches'
[17:03:08.429 E]     [string "scripts/s3/music/core.lua"]:523: in function <[string "scripts/s3/music/core.lua"]:516>
[17:03:08.429 E]     [C]: in ?
sly helm
#

I've seen this one, yeah. It only recently started popping up when I did some more extended combat testing... Oh well, easy fix

sly helm
sly helm
#

I haven't observed the issue mym reported here to have any effect on combat music playback, so you probably have something else going on.

#

The only breaking change in .60 and onward is that isValidCallback is no longer an optional field

#

Which sounded lke a neat thing to do at first but after reflecting on it for a while I decided that having playlists with literally no conditions at all was kind of pointless

sly helm
#

Anyhow, I've pushed 0.62 which corrects the string matching and the issue Mym mentioned to Nexus, so... hopefully everything should be good now.
Hopefully. todd

gaunt hatch
#

Hey again. I was checking out Dank’s Region playlists, and they don’t appear to be working. I saw in the Posts section that the new updates may’ve broken them. Is that the case?

Edit: Never mind. I figured it out. I had to rename the path to the folders.

fiery steppe
#

heeej I posted the s3maphore mod I had been working on

#

someone told me the download had no music files included, if someone could download this and double check that would be nice. Everything is there if I download it myself

jagged badger
fiery steppe
#

If you just want the tracks I really recommend buying the albums on Mananaut's bandcamp

fiery steppe
fiery steppe
#

hej, I noticed there's a condition for time of day mentioned in the docs, how do I actually use this condition?

#

I assume it's like a thing that you put in the isValidCallback function

#

And I assume it needs some kind of variable that tells it what time is true and what time is false, but I dunno how to format that variable

fiery steppe
#

oh wait it elaborates on it later, sorry

sly helm
#

lol do you still need help?

#

There are actually two ways to do it, but I generally recommend Playback.rules.timeOfDay instead of Playback.state.timeOfDay, that one is kinda weird

fiery steppe
#

I have it set up like this:```
local DayTimeHours = {8.5, 21.5}

and then later:```
---@type ValidPlaylistCallback
local function StirkIsleDayRule()
    return not Playback.state.isInCombat
        and Playback.state.cellIsExterior
        and Playback.rules.region(StirkIsleRegions)
        and Playback.state.timeOfDay(DayTimeHours)
end

---@type ValidPlaylistCallback
local function StirkIsleNightRule()
    return not Playback.state.isInCombat
        and Playback.state.cellIsExterior
        and Playback.rules.region(StirkIsleRegions)
        and not Playback.state.timeOfDay(DayTimeHours)
end```
sly helm
#

oh, so, timeOfDay is like the only one that doesn't accept a table

#

also it only accepts whole numbers

#

so: not Playback.state.timeOfDay(8, 21)

fiery steppe
#

thanks

#

was about to write saying I figured that out

#

I assume I can use two different variables then

sly helm
#

For sure.

#

I could probably get away with not rounding the hours down, but I wanted it work vaguely like how the GameHour global variable does, so I just made it round

fiery steppe
#

makes sense

#

is there a way to check the race of combat targets?

#

the races don't seem listed under targettype in s3maphoreTypes.lua

sly helm
#

Yeah, types has nothing to do with races

#

You can do it, but you'd have to loop over Playback.state.combatTargets yourself, pretty much

fiery steppe
#

oof

#

thanks either way

sly helm
#

I could add a race rule, it wouldn't be too big of a deal

#

Just not something I considered before really

fiery steppe
#

that would be nice C:

#

actually, while you're at it, can I ask for something else?

fiery steppe
#

it would be great if there were more global tilesets. Like bloodmoon barrows and velothi jump out as missing to me, and maybe the different types of imperial ruins

#

and if they were more differentiated

#

like either tilesets.cave should be split into each cave tilesets, or there should be separate ones for each cave type

#

like in Mananaut's Cyrodiil albums there's music for Cyrodilic caves, so they should only play in Project Cyrodiil caves

#

I can do all that myself, but it would be more convenient to have them all globally

#

also I think there's an oversight in tilesets.cave ; t_cyr_cavegc_i_tunnelayltrns_01 reads to me like a tile for transitioning from cave into ayleid ruin. Just from looking at the name though, I haven't verified it

sly helm
#

Feel free to make those changes in the builtin file and I can replace them

#

there probably should be more tilesets. for the most part they're just generated using delta_plugin and doing some regex shenanigans

fiery steppe
#

ah I see

#

thanks

#

when I said I'd do it myself I meant I was gonna add them locally

fiery steppe
#

oh also, the mummies in the Ashlander tomb caves, those are activators, so they won't show up in a static check, right?

fiery steppe
#

no pressure btw. since you said you were a little tired of working on s3maphore. it's not really that important, I can just implement the combat tracks differently

cold lake
#

the real kicker is how do you get level difference rule for battle music to work inside the built-in playlist so the explore music doesnt stop (it's giving Music stopped: NPLS)
oh I had to make sure explore playlists can run in combat mode

sly helm
fiery steppe
#

I didn't realise

fiery steppe
#

I'll try and take a look at them when I get home today

sly helm
#

I legitimately don't know if they are/should be different tilesets. lol

fiery steppe
#

well for my purposes they would need to be I think

#

actually hm

#

they might not need to

fiery steppe
#

is it possible to call other playlists for a fallback playlist?

sly helm
#

What do you mean?

fiery steppe
#

like if I want to put explore as a fallback, instead of making a playlist that plays the explore folder, it would just play all the tracks indicated in the explore folder. So that if someone modified the explore playlist, those would carry over to any fallback playlists?

#

but it doesn't really matter

sly helm
#

Uh.. I think what you want is doable, but I'm honestly kinda confused by the way you described it. Here:


        fallback = {
            playlists = {
                'ms/region/alt orethan region',
            },
            tracks = {
                'music/ms/general/trairdepths/dreamy athmospheres 1.mp3',
                'music/ms/general/trairdepths/dreamy athmospheres 2.mp3',
            },
            playlistChance = 0.60,
        },

So this is one of the tamriel rebuilt playlists, fallback.playlist is not necessarily folder names but playlist ids

#

So if you have multiple playlists there, and those each have their own fallback.playlists etc those'll be taken into account, and you can reuse the same set across multiple playlists if you want to

#

if you override some playlist such as explore then if explore is used as a fallback whichever one loaded last will be used etc

fiery steppe
#

hm thanks

fiery steppe
#

how did you make the lists of staticIDs for the tileset rules?

#

I tried copying from xedit and from the CS, but neither of those let you copy paste editor IDs

#

and I'm not typing them manually
EDIT: Nvm I did it semi-manually

fiery steppe
#

they're 'in_bm_tomb' etc, and 'furn_bm_t_torchstand' for the braziers

#

both caves and barrows also use 'terrain_rock_bm'

#

there's also non-ice BM caves 'in_BM_cave2_00'

median dagger
#

I'm a little confused, does morrowind play MP3s? A lot of these mods seem way too small in file size to be playing music files

#

Do you dl this mod and the music seperately?

jagged badger
#

But none of it comes packaged

jagged badger
median dagger
jagged badger
# median dagger Is there a list of the music mods/files compatible?

i feel like ive seen one but i cant find it now.. the download has playlist folders ("01 Tamriel Rebuilt" is for the Tamriel Rebuilt soundtrack etc.) so if you just search on nexus for each of those names all that stuff will work.
Tamriel Rebuilt
Project cyrodiil
Muse
Vindsvept Solstheim
Songbook of the North
Nordic Lands
Better Music System Redone
Provincial Music
Soule Sounds
and at least two other modders have made s3maphore repacks which come with their own music
Danke's S3maphore addon
and Kvetching Mananaut Music

median dagger
jagged badger
fiery steppe
#

hej s3ctor

#

I think I'm just going to implement that combat music by different conditions than race, mostly because I just changed my mind, but also because you said you were burnt out, and I don't wanna add to that

sly helm
#

hah! That's super nice of you. Don't worry about it tho ^-^

#

I'll get around to it eventually

#

Probably not very long actually, as I realized I introduced a nasty bug with that commit that prevents restarting the same track.

#

Single-track playlists just.. don't really work now. 😄

#

so I have to push out a minor version bump soon, one way or the other. Fortunately, only the one guy has reported it

fiery steppe
#

oooooh

#

that's what was causing that

#

I think I noticed it in some PC interiors where I had accidentally typoed the name of one of the tracks so there was only one track. But at first I thought it was because PC had tagged the interiors as not having repeated music somehow and S3maphore not overriding that. But the single track thing makes more sense

#

actually, I have a different bug that I wanted to report

#

the 'current playlist' toggler in the scripts settings menu seems to have broken with the 0.6 release. It only shows the Battle and Explore playlists, despite all of my playlists working fine when walking around

sly helm
#

Have you grabbed the latest version? I don't think I fixed it, but I did notice that happen.

fiery steppe
#

I have the one that's most recent on nexus

#

0.62

sly helm
#

ah, yeah

inner crypt
#

recent error:

[14:15:08.203 E] L@0x1[scripts/s3/music/core.lua] onFrame failed. Lua error: [string "scripts/omw/music/helpers.lua"]:174: attempt to call field 'isValidCallback' (a nil value)
[14:15:08.203 E] stack traceback:
[14:15:08.203 E]     [string "scripts/omw/music/helpers.lua"]:174: in function 'getActivePlaylistByPriority'
[14:15:08.203 E]     [string "scripts/s3/music/core.lua"]:712: in function <[string "scripts/s3/music/core.lua"]:678>
[14:15:08.203 E]     [C]: in ?
#

hundreds of them

sly helm
sly helm
#

Thanks, pal! I'll get this patch release out for you guys as soon as I can. I should hit the ground again tonight. Been moving nonstop since Tuesday morning. So tired of driving. Need code. 😭

prime hamlet
#

Curious issue: how do I prevent Daedric shrine playlist playing in certain cells? I think the cell I'm working in (league) has been flagged somewhere as a shrine (maybe by delta plugin) and now only Daedric shrine music from the DOO mod is playing. Any tips on whether is there a way to undo what happened?

#

could someone point me in the direction of a guide I'd like to see if I can make my own playlist for s3maphore

sly helm
#

There's a guide of sorts on the stash page! Although it's more like the Lua done than a guide... Can still get you where you want

prime hamlet
sly helm
#

No, the install's perfectly fine.

#

But I can tell you're using an older version from the logs.

#

I bet the shrine playlist is matching your cell name for some reason. What's the name of your cell?
Also if you go in the console and do:

luap
I.S3maphore.getCurrentPlaylist()

It should say which is active.

#

The uh, no language files found thing is something it used to spam people with really bad. That's for the track display menu

prime hamlet
#

Cell is Port Uvirith, Maritime League.

The luap command in console brings up this? userdata: 0x01b8c42eaea0

sly helm
#

Oh, uh, oops

#

Add .id onto that

prime hamlet
#

ah yields ms/cell/daedric

sly helm
#

Oooohhhhh

#

Okay I see.

#

This one's one of the tileset rules.

#

So, uh. You have something from this list in that cell.

#

There are a bunch of ways we could deal with this, you could remove the daedric thing, maybe my tileset sucks and you're now showing me there's not all Daedric things in there lol, maybe I can just exclude this cell if that's intentional/artistic kinda thing.

#

There's about 400 things in this list but they all have dae in em.

#

I can check the cell with tes3cmd if it's trouble to check

prime hamlet
#

Ah that makes sense, yeah I installed a daedric area with a portal to later stage quests. and there are a few assets on your list here.

sly helm
#

Cell exclusion it is, that shit looks cool as fuck

prime hamlet
#

Thanks S3ctor, how does cell exclusion work?

sly helm
#

Well, I've been procrastinating doing the next update and there are some very bad (and easy to fix) bugs in the current release

#

If you wanna do it yourself I'm going to add a cellNameExact rule to 03 Muse Expansion Playlists/Muse Daedric.lua

#

Otherwise I'll just ping you here in a couple hours or whatever when I finish.

#
---@type IDPresenceMap
local excludedCells = {
['port uvirith, maritime league'] = true,
}

---@type ValidPlaylistCallback
local function daedricTilesetRule()
    return not Playback.state.cellIsExterior
        and not Playback.rules.cellNameExact(excludedCells)
         and Playback.rules.staticExact(Tilesets.Daedric)
end
fiery steppe
#

If you'd like, I have two other places I found while playing, that you can add to that exclusion:
'mudan-mul egg mine' (OAAB Grazelands adds daedric stuff somewhere in here, I think, but I can't actually find it in-game)
'narsis, catacombs: depths' (there's a daedric statue in one part of this cell, but the other narsis catacomb cells don't have daedric stuff and IMO they should all share the same music)

gaunt hatch
#

Just figured I’d log this here: Ilunibi does not play the Sixth House music expansion; it plays the vanilla soundtrack. I have the New Ilunibi mod.

prime hamlet
prime hamlet
#

ahh

sly helm
#

One of their devs specifically asked me to do it this way, for basically this reason, but I can't remember the exact details.

sly helm
#

It's a bit trickier with the daedric tileset though cause mod compatibility is sorta the point of the tileset rules existig to begin with

scenic estuary
#

oh sweet. alright, no s3maphore TR interior music in almas thirr uwu

sly helm
#

Ah okay I see the TR playlists also need updated for the new interior compatible region thing

#

Gosh, I can't believe I published it like this. 😅

#

Somewhat pointless to have fixed region playlists for interiors if I wasn't actually gonna use it. Oh well! This'll be easy

scenic estuary
#

It's an amazing mod, every mod needs touch ups and that's OK!
I do think it's worth making a seperate save file with only s3maphore, use the console to setspeed 1000, turn on tgm, turn off tcl, and zoom around as many places as possible and open countless interiors as possible

sly helm
#

Well the hard part now is honestly that there are so many playlists 😄

#

I think now that I have done soule sounds and better music system redone and everything it's around 200

scenic estuary
#

i think these are the vivec songs that come with s3maphore (?) either way, custom music doesnt play in the sewer areas of vivec, im in the foreign quarter sewers and yeeeeahhhhhhh

sly helm
#

Is it only that sewer area?

scenic estuary
#

yuppers

#

everything else is gud

sly helm
#

Oh, y'know what

#

---@type CellMatchPatterns
local VivecMatches = {
    allowed = {
        'vivec',
    },

    disallowed = {
        'sewers',
        'underworks',
    },
}

This one's actually not a bug!

#

Although, I'll be honest with you, I have no idea why the MUSE playlists are all structured like this

#

Almost every single one of them manually excluded sewers/underworks type areas and I just kinda copied it into my playlists

#

You can just delete lines 10 and 11 from Muse Vivec.lua if you want em to work there

radiant flare
#

I haven’t taken a super close look at all the playlist structures but what other ways are cells detected ? Is everything by name and/or region/cell pattern?

sly helm
#

I try to avoid using fuzzy matches when possible cause they're technically the slowest

radiant flare
#

Yeah I’ve been doing most by static since that covers localisations and modded areas and such but not the most ideal

sly helm
#

There are tileset rules, and I have like six or seven baked in tilesets for a bunch of stuff (the BM one needs some work), many are done by exact names, and there are match rules too

#

plus you can also go region

#

I could add pretty much whatever, but since porting all the MUSE stuff over was one of the big goals copying all that stuff just happened first

sly helm
#

The cell ids should not change in localization cases.

#

But they're nasty and technical (for exteriors) so i shied away from supporting them at first

#

I could add a cellId rule if you want.

#

You can also go by grid coordinates. Which would be about as good as cell Ids, I guess, but easier to use

#

I could bundle some extra tilesets in too. The doc folder has all the existing ones, and that table propagates out to playlists, so it's easy to add new ones. I just didn't know what to add.

radiant flare
sly helm
#

omg I was just messing with the stupid region names like yesterday

radiant flare
#

Yeah … I saw merlord’s comments on that in Ashfall’s code and decided to NOPE right out of that

#

Haven’t been in the modding community long enough to have to update for every big TR release but still 36vehks

sly helm
#

as implemented the grid rule is too slow to be used at this scale but I can fix that

radiant flare
#

What was it, anthirin and bal foyen or something? Those names swapped a year or so ago and there are still mods that haven’t been updated for that

sly helm
#

I'll have to import this from SSS and rejig the grid rules to use this so they hash nicely

radiant flare
#

Sweet I’ll take a look

#

Want to do everything I can to make sure Sun’s Dusk can run on a Gameboy 36vehks

sly helm
#

szudzik is evil math algorithm to convert exterior grid coords into a single number and back

#

handy if you wanna do big hashset with grid coords in it

radiant flare
#

Yeah there are … lots of those haha

#

Calculating the player’s distance to around 120 coordinates wasn’t ideal, just something I threw together but think that’s been optimised since so yeah thank you I’ll see if I can find anything

scenic estuary
#

for the next update: narsis plays music fine but not shipal-shin?

sly helm
#

hm.

#

Yeah, 15 Provincial Music has this region, but not 01 Tamriel Rebuilt Playlists

#

Aw, shit. I thought I updated all these already.

#

I guess it was just PC.

#

What works nearby?

scenic estuary
#

narsis

scenic estuary
#

another note for future update: "The Purple Lantern" needs to have tavern soundtrack rather than narsis interior soundtrack~

#

and for some reason, this pawnbroker's shop has tavern music xddddd****

scenic estuary
#

hlormaren exterior runs bitter coast playlist fine, interiors dont

sly helm
#

Not because I don't know what is going on, I just don't understand why the taverns playlist is like that.

#

The original MUSE one has a looooot of locations. It always includes pawnbrokers.

#

I'd rather not change them functionally for the purists but tbh this is one place I would maybe be willing to. I don't get it.

scarlet pulsar
sly helm
#

prolly just wait tbh.

#

He told me yesterday he's gonna make a playlist for it

#

If you go up to the top of this thread, though, on the st4sh, I have docs for making playlists

#

If you can kinda-sorta read Lua + JSON it doesn't take very long to convert these at all. I haven't seen the MUSE playlist yet

scarlet pulsar
# sly helm prolly just wait tbh.

Ah Gotcha. I assumed support would come eventually but I've been trying to poke around in different Lua mods to get more familiar with them and have a better grasp of what's possible with Lua.

sly helm
#

Well, S3maphore's a really good place to start, especially if you use an IDE, you'll get completions for everything

scarlet pulsar
sly helm
#

Playlist rules are built on like the simplest building blocks I can possibly give you, most are like this:

---@type ValidPlaylistCallback
local function daedricTilesetRule()
    return not Playback.state.cellIsExterior
        and Playback.rules.staticExact(Tilesets.Daedric)
end
#

Playback.state is "what is happening right now?" Playback.rules is, "this playlist needs to match some specific rule"

#

There's state for being underwater, outdoors, in combat, etc

scarlet pulsar
scarlet pulsar
sly helm
#

Yea totally.

#

There actually is a ton of S3maphore functionality that goes entirely untapped as of right now

#

When I made it I went way out of my way to port all the Dynamic Music/MUSE modules I could find, but past that I honestly just don't really have time to make playlists as much as I want to

#

SOOOO the playlists I ship are accurate to MUSE/DM, but I don't necessarily always use it to its fullest potential for the sake of accuracy.

scarlet pulsar
sly helm
#

I go outta my way to err just slightly more vanilla to annoy people into making more dependent mods todd

#

only half joking

radiant flare
#

Oh is someone making a playlist? I was gonna throw something together quick or grab a list of all the cells from the jsons in the MUSE folders

sly helm
#

yeah, scipio and I got that on lock

radiant flare
#

Word thank you

sly helm
#

I'll buzz him about it and see what's up though I'm not sure what his schedule is, I just know he said he'd make one

fiery steppe
prime hamlet
# sly helm There actually is a *ton* of S3maphore functionality that goes entirely untapped...

Could it do some of the following? These are some of the mechanics I've been thinking of in for later stage implementation

  • Playing specific "intro" theme to an area on first visit.
  • After first visit - move to play a different track when entering the same area again.
  • Play specific track during certain script events
  • Loop a piece of music during decision events e.g. PC gets told to do X. Journal update. "I must do X or not". Track to repeat untill X is completed or PC leaves cell.
  • Play certain tracks when in dialogue with certain NPCs.
radiant flare
#

If you end up going with an efficient way of tracking the first time a player enters a cell ^ please let me know yagrwut

prime hamlet
#

is it not a thing yet?

radiant flare
#

Probably, I haven't looked at the docs but it's more of a problem with storing that data efficiently

prime hamlet
#

Kinda reminds me of the Breath of the Wild Zelda series the "Hero's Journey" menu mode which is basically a replayable log which plots on the map everywhere the player has been and or died on a particular save.

jagged badger
sly helm
#

Death, Scripted events, visiting a cell for the first time, you can do all that with special playlists

#

H3 tracks visited cells onFrame and stores the ids in a hashset, it uh... was easy

scenic estuary
#

vanilla music plays in the grazelands
i'd assume it'd use telvanni music right?

#

OR MAYBE SHEOGORAD

sly helm
# scenic estuary vanilla music plays in the grazelands i'd assume it'd use telvanni music right?

There's a playlist for grazelands, I did verify the region name is correct:


    {
        id = 'ms/region/grazelands region',
        priority = PlaylistPriority.Region,
        randomize = true,

        isValidCallback = function()
            return not Playback.state.isInCombat
                and Playback.state.cellIsExterior
                and Playback.state.nearestRegion == 'grazelands region'
        end,
    },

Morrow Winds of Resdaynia has grazelands tracks, maybe you just don't have any?

scenic estuary
#

huh maybe

swift prawn
sly helm
swift prawn
# sly helm Try replacing `00 Core/Playlists/builtin.lua` with this.

Seems to work! Before I applied it I wanted to see if I could reproduce the errors. I struggled for a while but turns out these errors started if I died and used console resurrect and then resumed the game. But I can confirm that with your edit this no longer occurs 🙂

sly helm
#

Does the death playlist still work okay?

swift prawn
#

What is that? If I can hear the death soundtrack when I die?

swift prawn
sly helm
#

okay cool cool that was exactly what I was hoping to hear 👍

cerulean lantern
#

Hey, I'm having a bit of an issue with s3maphore+better music system redone, the only track that plays in most cities and shops is the smith music and I have no idea how to fix it
For now I've just stopped using it since I don't really understand Lua but I am wondering if there's an easy fix somewhere? Mod works great otherwise, amazing job 👍

cloud shell
#

Is there a playlist that I can add that overhauls all of Vvardenfell without having to install 10 different expansions? Like the TR soundtrack that covers the whole mainland?

sly helm
#

nope

#

although you may like soule sounds

#

But there's not necessarily an all-in-one way to do t

wind quiver
#

Can I get some help? I installed Tamriel Rebuilt Soundtrack but nothing plays when I'm in Old Ebonheart when I think it's suppose to play music from 'MS/cell/ImperialCity'

sly helm
#

Try grabbing a dev build off my site, I think that's one of the single-track playlists that's broken in the nexus release

wind quiver
#

That did it thanks

#

This mod is amazing btw

sly helm
#

Thanks! Glad that fixed it 💜

wind quiver
#

So now I added music to the MUSE Empire folders, mainly for legion forts but it also seems to overwrite TR's music for Old Ebonheart. Trying to lower it's priority, I read you can configure it's playlist, so I went there to edit the line by -1 to -10
priority = PlaylistPriority.Faction -1,
Is that how you're suppose to do it? It still doesn't go back to playing the right music for me.

sly helm
#

There are a couple ways you could handle this case

#

Old ebonheart is gonna be this one:


    {
        id = 'ms/cell/imperialcity',
        priority = PlaylistPriority.CellMatch,
        randomize = true,

        fallback = TRFallbackData,

        isValidCallback = function()
            return Playback.rules.cellNameMatch(ImperialPatterns)
        end,
    },

Faction is a much more specific rule than CellMatch, so one way would be to set Empire to priority = PlaylistPriority.CellMatch + 1, in the empire playlist

#

you could also use fallback to combine both playlists together if you wanted to.

sly helm
wind quiver
#
  • 1 means it would be lower priority then? I didn't know that
#

In any case that did the trick, again thanks so much

sly helm
#

Yea it can be kinda confusing, lower numbers mean it's higher priority.

vital grotto
#

I believe I accidentally got a minor story spoiler for the Vivec Lighthouse Keeper mod, when S3maphore made || what must've been creepy daedric or sixth house music play inside. Presumably due to specific objects in some hidden section of the building || 🤣

swift prawn
#

Hello. I'm getting some weird permanent silence after the first Vivec soundtrack has finished playing. Enabled s3maphore debug log and it looks a bit weird.

In these logs, I started in Vivec (with the perma silence). Tried going to Ebonheart to trigger the music there and it worked. Went back to Vivec, after Empire Exloration finished it started playing the Vivec music as you'd expect. But after finishing it never played anything again.

swift prawn
#

Hi. An update on the above.

I had the new MUSE - Temple files but not the playlist. Now since there is a playlist uploaded by Scipio this music is now being played in Vivec and it works fine.

I realized the vivecpalace is just for that interior now. But the same issue happens there, it just plays once, then permanent silence. Maybe this is completely intended but looks like the debug log seems to process the "playlist" of just this one track but it can't find a different track to play and just stops? (Looks like it keeps looking for tracks but at the same time the proc for silence may trigger.. until it repeats the "looking" and then reprocs silence)

sly helm
#

my gitlab page has been hosting stale files on occasion lately so lmk if this archive doesn't resolve it for you

swift prawn
west sundialBOT
#

Try replacing 00 Core/Playlists/builtin.lua with this.

Attachment(s)
sly helm
#

oh my I apologize

#

I can't update any of my mods atm as i'm currently building a new website 🙁
But I'm almost done!

swift prawn
#

No problem. I'll patiently wait for the official update 🙂

cloud shell
#

So i finally decided to download a bunch of muse expansions for vvardenfell, I don't know if I'm doing something wrong, but I'm still getting freaking "caprice" or "over the next hill" while fighting for my life inside a 6th house base, despite having downloaded a muse expasion for the 6th house, daedric, tombs, etc, is there a way to avoid that?, My load order is:
S3maphore 00 core
S3maphore 01 TR
s3maphore 03 Muse Expansion
Then all the muse expansions

Am I doing something wrong?

sly helm
#

Those are both explore tracks, so it sounds like you have battle music disabled completely.
But the sixth house playlist from MUSE has explore and battle tracks, so I think you also don't have them installed properly.

cloud shell
#

current playlist should be set to "explore"?

#

as for the installation, I just did what I do with every mod, point the location in the cfg, and put it bellow s3maphore

#

ok battle music is working now, I disabled and re enabled the setting and it worked, but it keeps playing vanilla explore songs when not in combat, the muse ones are not showing, i reload the save and always a vanilla song starts

sly helm
#

The playlist shown in the settings menu is only for turning them off completely, it doesn't mean whatever you may be thinking.

sly helm
#

Unfortunately the main means to diagnose this is that options menu... But it's bugged at the moment. If the wrong playlist is running, it either doesn't have the playlist, or it doesn't have tracks.

#

I'll try to take a look at the options menu soon, it's been a really busy season 😓

swift prawn
#

I'm also at loss of how to get things to "just work" without having to read documentations and manually edit files myself.

I only used the MUSE packs & Tamriel Rebuilt music tracks so far and when I walked into Red Mountain hearing the vanilla soundtrack there just felt out of place. So I found the "Better Music System Redone" pack and that amongst others it had 3 tracks for Red Mountain that sounds more fitting to the atmosphere. Ok so I've copied over the tracks to the right place. I then fethed the playlist for the same music pack included with the S3maphore install.

Start the game. Red Mountain tracks are playing. Nice!

But I can't see a playlist for Better Music.... in the S3maphore options.. Ok? W/e I guess its probably fine.

I start digging for some of the new tracks added. There's a track for Ghostgate.mp3. Cool. I'm already here. Problem: It never plays. Doesn't play whether I am outside or inside Ghostgate. Instead the MUSE Temple tracks plays (like they did before I added Better Music yadayada).

BUT now inside the Redoran Tower of Dusk all tracks were replaced by some tavern/inn 1 2 3 tracks ..!?

I check the Better Music playlist file. But its not making me the wiser. There's a couple lines for ms/cell/ghostgate which I assume is to permit or disallow tracks. Nothing about taverns and inn tracks though.

What I expected is that any additional playlists+music I add will also be possible to be played at the locations. But they seem mutually exclusive? When installing S3maphore with BAIN it looks like you could select all options if you want all music.

So what I think is happening is the Tower of Dusk contains NPCs that sell Sujamma and then S3maphore thinks it is an Inn and matches for a very specific Inn/Tavern condition? But its just not really an Inn in Ghostgate...

#

[21:04:27.611 I] Loading cell Ghostgate, Tower of Dusk Lower Level [21:04:27.795 I] L@0x1[scripts/s3/music/core.lua]: [ S3MAPHORE ]: Track Skip: [21:04:27.795 I] Did Change Playlist: true [21:04:27.795 I] Transitioned from interior to exterior: true [21:04:27.795 I] Force transition for friendly cell: false [21:04:27.795 I] Force Transition for hostile cell: true [21:04:27.795 I] Force Overworld Transition: false [21:04:27.795 I] Cell is hostile: false [21:04:31.687 I] L@0x1[scripts/s3/music/core.lua]: [ S3MAPHORE ]: Track changed! Current playlist is: ms/cell/taverns Track: music/ms/cell/taverns/inn3.mp3 [21:04:32.656 I] Playing "music/ms/cell/taverns/inn3.mp3"

#

"Current playlist is: ms/cell/taverns" <--- This playlist isn't in the options.

sly helm
#

Yes, the options menu is bugged.

#

Playlists are currently mutually exclusive.

#

That's not a problem with how the mod is designed though, the playlists themselves just need updated.

#

If you add music to folders that are being loaded by playlists, that works. Like.

#

Just add 03 Muse Expansion. Most of the MUSE playlists actually come out of there. Almost every MUSE mod will use those and almost only those. I'm personally not at all a fan of BMSR and while the playlists have some bugs, I'd just skip it entirely

#

The way the original BMSR mod works is by overriding a bunch of the original playlists, so, it's kind of always going to be somewhat incompatible with others

#

As I recall the taverns playlist also is set up to be mutually exclusive with others, but I could probably tweak the priorities so that taverns plays nice with others. I've implemented it accurately, but I get complaints about it fairly regularly and don't even really like the way it works too much myself.

#

It's too high-priority and it includes a bunch of weird stuff, like pawnbrokers.

swift prawn
#

Yeah I ended up just adding the 3 Red Mountain tracks and deleted the rest 🙃 . Thanks for the tips I will listen in.

sly helm
#

Hehe. I'll rework the docs soon, I know they kinda suck for like, just figuring out how to use the thing. 😅

wind quiver
#

Just cool to finally have drag-and-drop functionality like the MWSE users do. I became numb to Music/Explore following me wherever I went

swift prawn
#

I'm trying to get more silence in my game without having to disable all music. I read this option like 10 times but I am still not sure what it does.

If I set it to 1.0 will all playlists "that do not define their own silence rules" contineously play silence?

Also if all my playlists have predefined silence rules, am I "screwed" and cannot change this without becoming a script kiddie?

Even if so, I'm not sure its going to become how I want it to be... I'd like for silence to carry over to other cells as if it is included as a "finish previous track". Right now there is a new track every single time my game makes a cell change, so I never have actual silence when I am playing the game... only if I go afk or stand still for a long time.

So if this could be implemented: finish previous track = include silence

sly helm
#

Playlists require zero actual scripting whatsoever, I've done everything humanly possible to make the system usable for people who have no idea what they're doing, so, please, don't be scared of it.

#

The setting is how likely a silence track is to play between real ones.

#

1.0 means every single time a song finishes, then, a silence track always plays no matter what. Not continuous silence, just a silence track.

#

I guess, erm.... Hm.

#

Yyyyyeeeeeeeeaaaaa I think I can add a setting for that.

#

What kinda areas you playing in where track changes happen this much? Is it, like, going in and out of cities?

#

It's... Semi intentional silence tracks are overriden by playlist changes, but.... Eh.

#

I guess in retrospect that kinda sucks. Very subjective. Guess it has to be a setting.

swift prawn
#

I think the worst case scenario is when you are in combat with something that you also managed to outrun by entering another cell where the combat ends. Here the combat music stops and playlist kicks in. But if I move back just a little bit into the previous cell, combat music restarts and a new region track is started if I yet again move out. This sometimes happens naturally when just going about your business at the edges of cells.

Another example is entering and re-entering interiors. I understand the override (I think), but it seems to happen even without overrides.

Combat is also inconsistent to me. Maybe it is because playlists are handling combat differently in various regions et.c? I sometime can successfully get silence to carry over when I enter combat. But elsewhere combat would either end the silence track or trigger combat track & start a new region track (rinse and repeat).

I might look into editing the files. I'm not really scared of it. Its just a matter of convenience.

sly helm
#

I'm honestly not even sure off the dome if I actually applied any silence rules anywhere or not.

#

I think .... Maybe I did for PC and nothing else because PC specifically already ships silence tracks which really annoyed me.

#

I'd have to think some about what exactly to... Do? About the combat-at-edge-of-cells thing.

#

That's actually just totally normal behavior, it... Actually is supposed to work that way, but .. yeah I mean I can see why you wouldn't want that.

swift prawn
#

https://www.youtube.com/watch?v=1oGat03ODFI

Here is a specific scenario where I have no idea what is going on. I tried to keep the video short and straight to the point but its still a 5 minute endeavour. I enter Eight Plates, that with Beautiful Cities of Morrowind comes with a special track that overrides the current music / playlist with a 32 second silent track. This seems to always work and I guess is just as intended.

If I leave Eight Plates the silence remains. Even though the log says a new playlist and track is playing. Nothing is actually playing. I tried entering combat in this state, with no combat music being activated. I run all the way back into Eight Plates and leave again. The log now updates that combat track is active. But still no music. Even when combat ends, log says returning to exploration track - yet no still no music.

Music only starts playing after an arbitrary random period. Its as if a silence track is instead being played. But why then does the log says it is playing music and why does F8 do nothing and furthermore why does this happen still while disabling silence tracks?

  • Pressing F8 returns a track changed log entry, but there is no actual music played.
  • Toggling Finish Previous Track did not change the behavior in the video.
  • Toggling Enable Silence Tracks did also not change anything in this scenario.
swift prawn
#

So I still don't feel like I can do anything customization wise. With all this said I hope this is seen as constructive feedback and I do appreciate that the music addon. Its still an improvement over the barebones vanilla / openmw defaults.

sly helm
#

Nothing you're experiencing has anything to do with builtin playlists anyway, though.

#

I did already mention, a vast majority of playlists do not have silence settings. Maybe PC has then, but everything you need right now is already in the frontend.

#

Can you tell me what exactly it is you want? I'm just confused.

#

You've changed so many settings and given me so many scenarios I don't understand exactly what your goal even is.

#

I see.

#

So in this video you go into right plates while S3maphore has completely paused music playback. It is not doing anything.

#

Something in eight plates is using mwscript to play a song during this time and S3maphore doesn't touch it. You go outside, the silence "track" finishes and falls over to Hlaalu.

#

Yeah you just have insanely aggressive silence settings that are working 100% as you asked them to.

#

I can't touch mwscripted music playback by design, so it can be a little confusing.

scenic estuary
#

some of the ashlander camps in TR have no TR music inside the yurts. was just taking a peak in ishanuran camp

scenic estuary
#

no music in morvayn manor in vanilla either

#

shouldnt s3maphore have a feature where, if you transition cells and it detects only vanilla songs from the base game are available, it ought just use the last used track?

sly helm
#

I'm just slightly confused.

#

I mean, yes, but, it shouldn't generally be changing tracks in those cases anyway.

umbral grotto
#

Hey @sly helm, does S3maphore support the Temple and Telvanni MUSE expansions natively? Or do they need patches? The Temple expansion page mentions a S3maphore patch, but seems to imply that it needs the MUSE 2 mod to work as well, and I'm kinda confused...

#

I'd prefer to just use your mod, of course (great work, by the way)

scenic estuary
#

hey s3ctor i noticed the s3maphore gitlab is scheduled for deletion in 2 days, everything alright ?

wind quiver
jagged badger
scenic estuary
#

thank u dubiousnpc :))))

#

OH did you make that odai lifeblood of balmora patch yet?

jagged badger
scenic estuary
#

Mkayyyy

carmine pollen
#

Posted this in the troubleshooting chat, thought I'd ask here as well

cerulean niche
#

I have a similar issue on the starwind modlist

#

long periods of silence with music not starting again until I go to a new cell or reload save etc

#

even after setting "enable silence tracks" to no in the options menu

analog moat
#

How do i access the s3maphore dev build?

lime crater
#

Specifically, when I enter certain towns in TR (like Old Ebonheart), it plays the "dreamyatmosphere" fallback track, then has absolute silence until I leave the cell (triggering more music) or reload (again, triggering more music).

#

I haven't fooled with any of the settings beyond the mod's (very helpful) toggles in OpenMW's UI, which I only discovered while searching for a way to fix this problem. I installed S3maphore > TR Soundtrack > Project Cyrodiil Music.

karmic stump
#

And while an issue with s3maphore is theoretically possible, this is likely a playlist issue. And unfortunately e.g. Tamriel Rebuilt OST mod for Dynamic Music that these playlists have been taken from, has not updated in a little bit

lime crater
analog moat
#

I'm having the opposite problem where the game will only play beacon of cyrodiil in firewatch no matter what i do

#

i deleted the beacon of cyrodiil mp3 and the track still plays sadcat

topaz wing
#

Is Replaygain support possible, or this has to be supported by the engine first?

lime crater
karmic stump
#

If you look for ---@type S3maphorePlaylist[] lines - there'll be a return statement with a playlist definition below them, some only have fallbacks, others have specific songs defined

regal eagle
#

Hello! Is it possible to make S3maphore mod to play Morrowind theme (Nerevar Rising) at the beginning of game? (on the ship at Seyda Neen), it plays exploration music instead. Or somehow delay start of mod work until the end of starting theme? I looked into playlists, all I understood is that they're strictly locational, which means as soon PC exit ship, music will stop

jagged badger
#

and i would be interested to see it if you manage it :)
i had the same idea but never got around to it since starting my playthrough

regal eagle
#

I'm no way a programmer, the best I can do is to solve some small math problem in c++

#

tho, i tried to write (copypaste) something, it doesn't work tho

#
---@type CellMatchPatterns
local StartingCell = {
    allowed = {
        'Imperial Prison Ship',
    },

    disallowed = {},
}

---@type ValidPlaylistCallback
local function startGameCellRule(playback)
    return not playback.state.isInCombat
        and playback.rules.cellNameMatch(StartingCell)
end

local PlaylistPriority = require 'doc.playlistPriority'

---@type S3maphorePlaylist[]
return {
    {
        id = 'StartGame',
        priority = PlaylistPriority.CellMatch,

        tracks = {'Music\Explore\Morrowind Title.mp3',},
        
        isValidCallback = startGameCellRule,
    },
}
#

I haven't found any example of how to make special music, so I assumed I need to use CellMatch

regal eagle
#

tbh I dunno how to even check if I'm going into the right direction, I can't make this work

local PlaylistPriority = require 'doc.playlistPriority'

---@type S3maphorePlaylist[]
return {
    {
        id = 'Game Start Mus',
        tracks = {'Music/Explore/Morrowind Title.mp3',},
        priority = PlaylistPriority.Special,
        isValidCallback = function(playback)
            return playback.state.self.cell.id == 'Imperial Prison Ship'
        end,
    },
}
regal eagle
#

...

#

be my adhd cursed for giving me inability to read through documentation

#

I made it work by just changing name of cell to all lowercase

#

If I had a nickel for every time i fck up my code by doing something small, stupid, yet, crucial - I could've buy a new GPU. That's a lot, and makes me feel shameful... but hey, at least it works

jagged badger
#

Yup, can't argue with results. Failure is how we learn 🤷

glass magnet
#

Hello @sly helm , is there a way for the songs to loop? For example, I am using the Tamriel Rebuild soundtrack with S3maphore and I would like for the song in Firewatch (Beacon of Cyrodiil) to keep looping after it finishes playing (maybe its a bug or something, but whenever the song finishes, I get no other music and the only way to fix that is to either go to another region or reload)

topaz wing
sly helm
# glass magnet Hello <@656242784050741248> , is there a way for the songs to loop? For example,...

It's a bug, it will be fixed in the next release.

You can try now if you like!
https://dreamweave-mp.github.io/S3ctors-S3cret-St4sh/s3maphore/
https://dreamweave-mp.github.io/S3ctors-S3cret-St4sh/h3lp_yours3lf/

Hit the dev button on both pages.

I wanted to avoid it for a long time but the next version will depend on h3lp yours3lf like pretty much all my other mods, as, I simply duplicated too much code between them and it was breaking things on both sides.

I know I haven't been in here taking care of you guys lately, but, I promise I'm in the middle of a major rewrite of pretty much all my stuff at once.

Pretty much everything is going to be updated soonish. Check back in a few days for the official 🙂

Modern music management for OpenMW, inspired by MUSE and Dynamic Music.

Various helper modules for OpenMW-Lua to improve performance and overall API ergonomics.

glass magnet
#

thank you 🫡

bright saffron
sly helm
#

Mh. It's probably the fact that I use LZMA zips.

sly helm
#

But anyway

#

I'll have to fix it in the site I guess. Sorry.

#

Archives are too big to be posted here

#

use another tool to extract them like 7-zip

bright saffron
sly helm
#

strange, I'd have expected the builtin to be able to handle LZMA. Oh well

bright saffron
#

Cheers, I’ll make due for now with the faulty music, but anytime u are able to fix it, I’ll be glad :D. Right now yes it seems Old Ebobheart track and also Indoril settlement track is playing only once.

sly helm
#

Just try 7-zip

#

That should be all you need

#

the archives are not broken

bright saffron
#

So I just copy replace the files in the mod folder? Sorry Im not super well versed in this stuff

bright saffron
#

Ok I think I got it nvm, followed the website notes

#

Ok I think I messed up, I pasted the stuff over the old s3 congig lines, and now it cant find the mod anymore

bright saffron
#

Yeah, I dont think Im able to do this, do I overwrite the old s3 lines in the config or not? I pasted this stuff just in the end of it, now it finds the .esp files in the launcher but OpenMW wont launch. I think I will just wait it out until the official fix comes.

frigid smelt
#

anyone else have to un-fuck themselves after a total-overhaul update wiped their s3maphore settings?

#

I'm pretty sure all I did was add more .mp3s into certain folders, I don't think I actually edited any configs. could the umo install script have wiped my mp3s?

wind quiver
#

You should always backup your modified folders

#

Updating the modlist will outright replace what you had before

frigid smelt
#

dang so it not only overwrites present files but it also erases files it's not expecting?

karmic stump
#

That's kinda normal behaviour for deploy tools - otherwise a file that is already there may screw something up.

#

I actually don't know if it takes backups before hand

#

you may be better off asking in #momw-general

frigid smelt
#

I basically only added a handful of Oblivion/Skyrim tracks to my overworld exploration folder, that's basically all I wanted. but I forget where that is I guess I'll check documentation. strangely some tracks I added to dungeon exploration seem untouched.

karmic stump
#

yeah, not really sure

frigid smelt
#

I realized what I did before I updated, and none of it is actually wiped by the update tool

#

I simply made this folder CustomTracks and all I had to do was re-add it to data files in the launcher, then it appends it to the default music folder which S3maphore already picks up by default 👍🏽

sonic light
#

Hey, I just installed s3maphore and was trying to use the core + MUSE, but I'm not hearing any music at all

#

Not sure what's going on. Followed installation instructions to a T

#

Is there a step I could be missing?

#

I see a line in the logs that says it's ready to play, but it wont play anything

rapid tangle
#

Did you install it on nexus?

sonic light
jagged badger
#

Nice!

fiery steppe
#

hej, I wanted to add translation files for the tracks my S3maphore addon adds, but I have a large amount of playlists, a lot of which share tracks. Going by the official addons, it seems like there's a translation file for each playlist, however it would be a lot simpler for me to just have a translation file per folder of music files. Is this possible currently? Or do I have to make a translation file for each playlist?

regal eagle
#

How can I check info about current cell and track is playing? Trying to settle (EHEMsquat) in St Delyn Waist North Two, but there's tomb (music fitting for creepy place) music is playing (actually, it randomly playing in all Vivec city)

#

It's not tomb music, it's a track that supposed to play only in Vivec Temple, but it plays in a whole Vivec city, especially all interiors

#

welp... that was awkward. Just had to install patch from MUSE - Temple mod

drifting mountain
#

Recently updated to the dev version, as to fix the bug that caused certain tracks to not loop. Ever since however, a number of my MUSE tracks have stopped working. This is the error in the debug log. Its the same for Ashlanders and 6th House, their playlists failed to load. This didn't happen in the previous version of the mod (.62). In .63s root folder, the playlists that are said to be missing do have lua files. Other MUSE tracks, like Hlaalu, Redoran, Daedric, are all working fine.

lime crater
#

I've been getting a bit nerdy with my playlists--tried writing one of my own to play within Tribunal temples specifically. Only problem is, it doesn't seem to be working. Explore music alone plays. Can anyone tell what the trouble with my code is?

I am not a programmer. Comp Sci 101 from college in 2012 being stretched to its limits here. xD

fiery steppe
rigid valve
# sly helm It's a bug, it will be fixed in the next release. You can try now if you like!...

I was asking around everywhere about issues with multiple of my Modlists in OpenMW 0.51.0 and S3maphore, banging my head for a few weeks trying to figure out why soundtracks for Imperial locations such as Old Ebonheart only play a song once and then never again
I ultimately came to the conclusion that OpenMW 0.51.0 left S3maphore's "Silence" feature in a seemingly non-functional state

I then eventually did more digging and found this sub channel here
It seems like this has been a bug for a while

I wonder if it came about in 0.51.0 or earlier

#

and I wonder how along the next release that fixes this is

sly helm
#

Actually the patch was done in December or something

#

I fixed it like a day after the first report, but I don't remember when that was.

#

It is unrelated to any changes in OpenMW; the latest builds of S3maphore also require h3lp yours3lf which is also on my site

#

It's Modathon, so, keep an eye on the page 😉

sly helm
sly helm
#

Displayable names will be kept, just, not localizations

#

Also cloud you should know next update removes the require function from playlists

#

most playlists can be fixed by simply deleting the require lines

fiery steppe
#

I see, thanks

#

actually I don't see. What is the require function? I don't remember it. I didn't look that thoroughly but couldn't see it being used by me either

rigid valve
#

wabbajack auto install and Nexus Mod Installer got me fucked up and too comfortable

I don't know how I'm going to figure out how to Install these Dev Builds

trying to remove the mod for the POTI version in MO2 and then install the dev build ones
not sure if I use the OpenMW launcher
or figure out how to add them to MO2

rigid valve
#

I clicked append and added all the directories

but they dont show up accept for the S3maphore esp

#

and they are still highlighted so I dont think they are apart of the content list

#

I disabled the mod in MO2 aswell

sly helm
#

You're making this really conplicated

#

Just install it using mo2

#

The openmw launcher setup looks correct but if you use MO2 already just stick to that

#

The archive from my site is the exact same one you already installed, it's just newer

rigid valve
#

I've gotten too spoiled and it's been a while since I've installed a mod directly

sly helm
#

I don't understand your question

#

MO2 does this for you

#

Just drag stuff into MO2 and enable it

#

The ESP needs to be loaded before mods that depend on it, so it can't be just anywhere

rigid valve
#

the mod says you have to alter the cfg file

sly helm
#

Literally every mod works that way

#

MO2 does it for you

#

That's why nothing was loaded in the openmw launcher

sly helm
#

I guess POTI is probably using Kezyma's MO2 plugin which is set up so you never have to use OpenMW's launcher. It's pretty handy!

#

So like when you download a mod and check it off in MO2, that edits the config file for you. Same thing, just different ways to do it

rigid valve
#

I appreciate the help

sly helm
#

Nah I'm not frustrated lol I'm just a little short in text, I apologize!

#

I have an MO2 button on there too but unfortunately it doesn't work with mainline MO2 yet

#

I saw recently silarn was posting about implementing modl:// support tho so maybe soonish

rigid valve
sly helm
#

Yea you basically just have to drag the archives into mo2

#

I kinda have forgotten myself over time 😅

#

Can't even really use MO2 (easily) on my setup unfortunately

#

You might wanna ask in the POTI discord which playlists they use tho

#

I genuinely can't answer that for you and some of them are shitpost playlists lol

#

You don't wanna turn all of them on

#

Such as BBL Drizzy and Bgi Inor

rigid valve
#

yea alot of them know how to help with random shit aswell like stupid questions
so I just have to annoy them

#

its a big discord

sly helm
#

Question is only stupid if left unanswered 🙂

rigid valve
#

boneyard

sly helm
#

Yea I used to chill over there on and off a couple years ago

#

They've been around for a minute

#

I used to like, uh, what was it ..

#

Capital Punishment?

#

But I think I might be the only person left that unironically likes Fallout 3

#

They discontinued it in uhhhhhh 2024? I think

#

The owner is pretty chill too I know he creeps around here all the time

rigid valve
#

uuuuuuu didn't realize they had a fallout modlist

#

yea clayby's pretty chill
too much gardening he does

sly helm
#

Yea they have a Skyrim one too

#

Like actual literal farming? That's neat!

#

I don't have the patience for that.

rigid valve
#

yea he has this big ass garden and I dont understand how he has the time to play video games and shit

sly helm
#

It's a very zen thing, I used to do a lot with my grandpa growing up

karmic stump
#

We get chiken photos from him from time to time :P

sly helm
#

You do a little at a time, you know

rigid valve
sly helm
#

I'll tell ya big gardening secret

#

You just go out and pee on it all the time

#

I'm being dead fucking serious

rigid valve
#

Ill @ that to Clayby dont worry

sly helm
#

We had killer tomatoes

#

I don't like dealing with chickens, though, they're...

#

Problematic little creatures, they are

karmic stump
#

Raptors

#

literally

#

I won't ever forget when I first saw a chicken hunting a mouse

rigid valve
sly helm
#

Violent little buggers.

#

Yup

#

Bro already knows

#

Saves on the water bill too.

#

Idk where he's from but here they'll arrest you for catching rainwater

#

They get real picky about that

#

Gotta take the small wins

karmic stump
#

Dry climate?

sly helm
#

It is unreasonably humid here for where we are geographically

#

I don't really know why it's a thing tbh

#

But I do know there was a big kerfuffle about it like ten years ago when they raided some old woman's house about it

#

Like ten cops escorting an 80 year old lady out of her house type beat

#

But there's a lotta rain too

#

The hard part is the soil cuz it's very rocky

weak bridge
#

I was alerted to the pee convo; garden pissers unite 🫡

karmic stump
#

Depends. In some areas it's about "water table replenishment" but never made much sense to me, what with all the pavements actually blocking the water absorbtion, etc. In some others - it's cause of rainwater quality, but also is silly imo

sly helm
#

#

I actually am working on starting my garden today

#

But the yard is just, it's bad

#

The whole house is rather decrepit and unkempt

weak bridge
#

I got my peppers and tomatoes planted out last week, finally done with the frost and I couldn't be happier

karmic stump