A bit late (as usual, I fear) to the start of November, I just released svof 33. This version features a single change by @Nylian which fixes touching passive tattoos on others during inking. Enjoy and if you want to contribute to the project as well, go ahead. If you need help for setup or locating the issue in the source code, I'll be happy to help.
Is there a way to stop trying to tattoo myself? I accidentally hit enter again and it started tattooing so I moved thinking it would stop but I ended up wasting some inks before I realised it was meant to keep restarting
There are some minor QoL features that are not in the command yet, like queueing a number of tattoos (though I'm not sure anybody ever used this), but yes, there was discussion to remove most of the svof inker functionality that is provided by the game itself now. Someone just has to do the legwork
Is there a way to stop trying to tattoo myself? I accidentally hit enter again and it started tattooing so I moved thinking it would stop but I ended up wasting some inks before I realised it was meant to keep restarting
@fashions for vodun/puppetry? Everyone makes their own but in essence its like Kai, only allowing skills with a certain number, would be useful for starters, no idea if there is a way to grab it from gmcp..
How do I adjust the functions called on defup/keepup? Say I have one of my class defences on keepup, but instead of straight up sending it I want to call a separate function. I wrap nearly all my abilities in these functions so I can update balance trackers, count how many times each ability was used, etc. I can't seem to find the action in the script anywhere, hoping I dont have to dig into this giant embedded file to accomplish it.
Also, the svo got hit by event doesn't seem to trigger for denizens, trying to work out a decent systematic way to determine which critter is hitting which group member.
Upon further inspection it does look like the behavior I'm trying to modify does live in the external referenced files. It is a basicdef function in this svo.dict.lua file. To make defup call my wrapper functions I'd have to supply replacement entries in this big dictionary file. I guess I'm stuck on a more elementary question then. How do I call a function that I've defined in mudlet's scripts interface from an externally loaded file like dict.lua?
To add to Vadi's point: If you add events, we can work on getting them into the main project. That means they don't get lost with an update and other people can use the changes as well.
So here is my plan: I'm adding a 'controlled balance loss' flag to all my wrapper functions. That way when I respond to a balance lost svo event, if I have the flag I can start a timer with a known value, if not I'll start one with a different color and a guessed value. That will get me well behaved timers until I can get these event raising hooks into a future svo version. Over time I should be able to make wrappers for most abilities, leaving only the various stuns and disruptions for uncontrolled balance loss timers.
Then, I'll clean up my balance/cooldowns/usage tracker to a release-able state and share it. To do that I'll have to fix my balances/abilities table alot. Right now I just hand-fill the balance times my character experiences for every action. I'll need to supply the 'standard' balance times for everything, then detect nimble/quick-witted/diadem/afflictions and apply multipliers to those standards for the timers. I'll also have to expand the table to include abilities outside of my own class. (so I probably need the class, trait and balance artefacts and a crap ton of lessons to accomplish this unless I get some help)
Once I have a functional tracker in circulation based on my current setup of wrappers, we build a toggle into svo that can swap between 'raise events instead of send' 'raise events and send' and 'send only', perhaps those toggles need to exist for every ability separately. I like the wrapper functions because one of the actions I'd like to do inside them is to swap between 'svo.doadd' and 'queue add' depending on my ping time. Or does svo already do that for me?
I also noticed another thing - 'homunculus look' is not triggering the homunculus balance loss event like it should, not sure why. maybe the resulting text from the look is throwing off the trigger.
While we're here, there is a bug in Priest SVOF in the "Failed Seek" trigger. It doesn't include "art" as an option, leading to errors when attempting to report someone couldn't be found. It should be as follows:
if svo.defc.dragonform then return end
if svo.locating and svo.locating.name then
if svo.locating.clan == "party" then
send(string.format(
"pt %s could not be located",
svo.locating.name
))
elseif svo.locating.clan == "art" then
send(string.format( "art %s could not be located",
I've been seeing people struggle with getting Svof setup for tinkering with. Would it be easier if all of the files were all inside Mudlet like in other systems? Given the much better editor, this makes more sense than it did in the past.
I've been seeing people struggle with getting Svof setup for tinkering with. Would it be easier if all of the files were all inside Mudlet like in other systems? Given the much better editor, this makes more sense than it did in the past.
A billion times yes.
Tharos, the Announcer of Delos shouts, "It's near the end of the egghunt and I still haven't figured out how to pronounce Clean-dat-hoo."
I'm trying to set up a kata tracker for Shukudo using gmcp to recognize form then to transition if kata count >= 12 (or 24 if in rain). How would I go about doing this?
So for the time being, multiclassing is a nightmare. The only thing I want to change when I switch classes is SVOF. Everything else, my aliases, triggers, scripts, everything, can stay the same. To do this with mudlet I have to have two different profiles, throw a whole bunch of stuff in to Modules, then install certain things that write files to disk per profile. For example, Zulah's GUI doesn't work as a module because it has files specific to a profile. SVO obviously doesn't either. This is really annoying. But..
Could I, theoretically, have multiple different class's SVOFs on one profile, then if I switch classes, deactivate one set, activate the other, restart mudlet, and call it good? Or will that mess up something I don't know about?
So for the time being, multiclassing is a nightmare. The only thing I want to change when I switch classes is SVOF. Everything else, my aliases, triggers, scripts, everything, can stay the same. To do this with mudlet I have to have two different profiles, throw a whole bunch of stuff in to Modules, then install certain things that write files to disk per profile. For example, Zulah's GUI doesn't work as a module because it has files specific to a profile. SVO obviously doesn't either. This is really annoying. But..
Could I, theoretically, have multiple different class's SVOFs on one profile, then if I switch classes, deactivate one set, activate the other, restart mudlet, and call it good? Or will that mess up something I don't know about?
@Dochitha can maybe explain how. Not sure how he handles it. I know he switches classes multiple times a day and never relogs to do so.
EDIT: I apologize for the formatting of this post. The spoiler thing seems to break and everything is falling apart so I've given up and am just leaving it like this.
If you remove the <CLASS> SVOF folder from your mudlet profile and stick it someplace else, on loading up it'll request a class folder. You can navigate to the folder you put it in and select the class you want.
It requires you to restart mudlet each time you switch class, but it works.
Add an "if/then" statement to every single class alias and trigger you have, that prompts off an alias or trigger, that checks whether your class variable is set to w/e class you're using (myclass = "whatever") and it'll only use whatever aliases and variables have that class.
I stuck it all into a spoiler cause it's spammy @Torinn (I gave up, clearly)
For example: my Achaea profile only has AK 4.1, Bashing, Current, Log, Map, Map downlods, svo, and ZulahGUI. I cut Depthswalker SVO and Blademaster SVO and stuck those into a separate folder. Every time I log into Achaea mudlet, it asks me for one of those because svo requires it (I think) and I just navigate to the folder and pick the class I'm using for the day.
Every alias and trigger I have looks like some variation of this:
if myclass == "blademaster" then
send("alleviate")
end
or this:
if myclass == "depthswalker" then
if matches[2] == "s" or matches[2] == "S" then
send("shadow manifest scythe")
elseif matches[2] == "d" or matches[2] == "D" then
send("shadow manifest dagger")
else
send("shadow manifest " .. matches[2])
end
end
Just need to make a trigger or alias that does something like this:
myclass = "depthswalker"
for example, I have something that triggers off of keneanung's bashing thingy that does this when it selects the attack type:
@Voli That is really helpful. Initially, do you install both DW and BM SVO packages, or just one?
Edit: I think I see. In my profile's folder on disk (C:/Users/<user>/.config/mudlet/profiles/<profile> there is a Priest svo folder. So you're saying you put that in its own folder with the other SVO as well, then it doesn't matter what SVO you have on your profile when you start up SVO will ask what you want to use and you point it to one or the other. Interesting!
So for the time being, multiclassing is a nightmare. The only thing I want to change when I switch classes is SVOF. Everything else, my aliases, triggers, scripts, everything, can stay the same. To do this with mudlet I have to have two different profiles, throw a whole bunch of stuff in to Modules, then install certain things that write files to disk per profile. For example, Zulah's GUI doesn't work as a module because it has files specific to a profile. SVO obviously doesn't either. This is really annoying. But..
Could I, theoretically, have multiple different class's SVOFs on one profile, then if I switch classes, deactivate one set, activate the other, restart mudlet, and call it good? Or will that mess up something I don't know about?
@Dochitha can maybe explain how. Not sure how he handles it. I know he switches classes multiple times a day and never relogs to do so.
I am using svo Runewarden as my profile, since I am mostly a runie nowadays. When I switch class, I'd detect my class and send defense upkeep into serverside curing based on the class. That's to handle defenses part.
On my triggers, I use a folder to contain all class related triggers. The folder itself is a filter, which has if myClass == "Alchemist" then return true end. < lua function. Using this, I use a folder to automatically enable or disable group of triggers without using enableTrigger or disableTrigger functions.
for Aliases, it's what others have posted, same key for different classes.
local case = {} case.alchemist = function () send("imbibe mayology") end case.runewarden = function () send("say I will pulp you") end
case[myclass]()
So I'd use a table to hold the commands I want to send for as a function, and then fire the function at the end. The same can be used for aliases with multiple combinations like ^play(h|g|q|a|v|w)$, along with multiple classes, I handle it this way:
local Runewarden = {} local Alchemist = {}
and do the same thing, assigning then with a function Runewarden.h = function () send("things") end
Then we need to know our class and call the functions based on class and matches[2]
class[mylass][matches[2]]() --assuming myclass is gmcp whatever your class is
I hope this makes sense, I am not a programmer so there could be more efficient way, I just don't like if else cos they are too noisy... So I learned to use table, more readable to me.
@Torinn I use the Blademaster install cause it gets mindnet while depthswalker does not. As the one I have installed.
It's a nice workaround if you don't know more sophisticated answers. The only reason I did it the way I did is cause the DEF list doesn't change. Fortunately, my way fixed that for me :P There may be other ways that are better to implement though
Comments
GMCP documentation: https://github.com/keneanung/GMCPAdditions
svof github site: https://github.com/svof/svof and documentation at https://svof.github.io/svof
GMCP documentation: https://github.com/keneanung/GMCPAdditions
svof github site: https://github.com/svof/svof and documentation at https://svof.github.io/svof
GMCP documentation: https://github.com/keneanung/GMCPAdditions
svof github site: https://github.com/svof/svof and documentation at https://svof.github.io/svof
Edit: Just running through git I'm seeing.... @battlerage, @monkpath, @monkstance, @monkfull, and @sunlight for grove users,
Also, the svo got hit by event doesn't seem to trigger for denizens, trying to work out a decent systematic way to determine which critter is hitting which group member.
Svof
Mudlet Discord join up
GMCP documentation: https://github.com/keneanung/GMCPAdditions
svof github site: https://github.com/svof/svof and documentation at https://svof.github.io/svof
So here is my plan:
I'm adding a 'controlled balance loss' flag to all my wrapper functions. That way when I respond to a balance lost svo event, if I have the flag I can start a timer with a known value, if not I'll start one with a different color and a guessed value. That will get me well behaved timers until I can get these event raising hooks into a future svo version. Over time I should be able to make wrappers for most abilities, leaving only the various stuns and disruptions for uncontrolled balance loss timers.
Then, I'll clean up my balance/cooldowns/usage tracker to a release-able state and share it. To do that I'll have to fix my balances/abilities table alot. Right now I just hand-fill the balance times my character experiences for every action. I'll need to supply the 'standard' balance times for everything, then detect nimble/quick-witted/diadem/afflictions and apply multipliers to those standards for the timers. I'll also have to expand the table to include abilities outside of my own class. (so I probably need the class, trait and balance artefacts and a crap ton of lessons to accomplish this unless I get some help)
Once I have a functional tracker in circulation based on my current setup of wrappers, we build a toggle into svo that can swap between 'raise events instead of send' 'raise events and send' and 'send only', perhaps those toggles need to exist for every ability separately. I like the wrapper functions because one of the actions I'd like to do inside them is to swap between 'svo.doadd' and 'queue add' depending on my ping time. Or does svo already do that for me?
I also noticed another thing - 'homunculus look' is not triggering the homunculus balance loss event like it should, not sure why. maybe the resulting text from the look is throwing off the trigger.
-- You'll notice the "art" section added.
Thanks!
Svof
Mudlet Discord join up
Svof
Mudlet Discord join up
Could I, theoretically, have multiple different class's SVOFs on one profile, then if I switch classes, deactivate one set, activate the other, restart mudlet, and call it good? Or will that mess up something I don't know about?
EDIT: I apologize for the formatting of this post. The spoiler thing seems to break and everything is falling apart so I've given up and am just leaving it like this.
If you remove the <CLASS> SVOF folder from your mudlet profile and stick it someplace else, on loading up it'll request a class folder. You can navigate to the folder you put it in and select the class you want.
It requires you to restart mudlet each time you switch class, but it works.
Add an "if/then" statement to every single class alias and trigger you have, that prompts off an alias or trigger, that checks whether your class variable is set to w/e class you're using (myclass = "whatever") and it'll only use whatever aliases and variables have that class.
I stuck it all into a spoiler cause it's spammy @Torinn (I gave up, clearly)
For example: my Achaea profile only has AK 4.1, Bashing, Current, Log, Map, Map downlods, svo, and ZulahGUI. I cut Depthswalker SVO and Blademaster SVO and stuck those into a separate folder. Every time I log into Achaea mudlet, it asks me for one of those because svo requires it (I think) and I just navigate to the folder and pick the class I'm using for the day.
Every alias and trigger I have looks like some variation of this:
or this:
Just need to make a trigger or alias that does something like this:
myclass = "depthswalker"
for example, I have something that triggers off of keneanung's bashing thingy that does this when it selects the attack type:
Edit: I think I see. In my profile's folder on disk (C:/Users/<user>/.config/mudlet/profiles/<profile> there is a Priest svo folder. So you're saying you put that in its own folder with the other SVO as well, then it doesn't matter what SVO you have on your profile when you start up SVO will ask what you want to use and you point it to one or the other. Interesting!
myClass = Gmcp.Char.Status.class
I have mine set to that event so I never have to worry about it
I dont use SVO but have 4 classes. And I recycle my aliases/macros with them so i do something similar.
If myClass == "Sentinel" then
send("doublestrike "..targetting.." "..target.." "..venom)
Elseif myClass == "Runewarden" then
sendAll("order entourage kill "..target, "doubleslash "..target.." "..targetting.." "..venom1.." "..venom2)
....
End
On my triggers, I use a folder to contain all class related triggers. The folder itself is a filter, which has
if myClass == "Alchemist" then return true end. < lua function.
Using this, I use a folder to automatically enable or disable group of triggers without using enableTrigger or disableTrigger functions.
for Aliases, it's what others have posted, same key for different classes.
local case = {}
case.alchemist = function () send("imbibe mayology") end
case.runewarden = function () send("say I will pulp you") end
case[myclass]()
So I'd use a table to hold the commands I want to send for as a function, and then fire the function at the end. The same can be used for aliases with multiple combinations like ^play(h|g|q|a|v|w)$, along with multiple classes, I handle it this way:
local Runewarden = {}
local Alchemist = {}
and do the same thing, assigning then with a function
Runewarden.h = function () send("things") end
Then we need to know our class and call the functions based on class and matches[2]
class.Alchemist = Alchemist
I hope this makes sense, I am not a programmer so there could be more efficient way, I just don't like if else cos they are too noisy... So I learned to use table, more readable to me.
It's a nice workaround if you don't know more sophisticated answers. The only reason I did it the way I did is cause the DEF list doesn't change. Fortunately, my way fixed that for me :P There may be other ways that are better to implement though