How did you support multiclass? (Mudlet)

My goal this weekend is to finish learning my second class, and set up my combat for it. I suppose I just have a couple of questions regarding how some of you coded multiclass.
1.) Did you make a separate mudlet profile for each class? My OCD tells me to do this, but I know it would be a pain when I make small tweaks/updates/misc. triggers/etc.
2.) I use SVO, so how did you handle the need for two different versions (one for each class)?
3.) Any advice, tricks, etc. that you used or found helpful for the process?
Thanks!
Comments
-
I switched to wsys in preparation. Took me about a month to get everything changed over, but it was well worth it. If you decide to go this route, hit me up. I have two or three scripts that make it run fabulously.
Tip: Run enable/disable alias groups on class change. This allows you to use the same alias keys to do the same thing despite being different syntaxes.0 -
I have not multiclassed yet, but I would write my code that checks my class with gmcp.Char.Status.class OR turn on and off groups of folders based on your class.
E.G.
if gmcp.Char.Status.class == "Magi" then
send("staffstrike "..target.." left air")
else
send("combo "..target.." sdk ucp ucp")
end
OR
if gmcp.Char.Status.class == "Magi" then
enableTrigger("Magi Class Triggers")
disableTrigger("Monk Class Triggers")
end
That way you can use the same basic packages for each, make sure you make it all in one subfolder, then when you make any big changes you can just export the folders (aliases, scripts, buttons, timers and triggers), zip them, then install them on the new profile.
You could also just uninstall svof on the package manager and install the new class each time. Your settings are saved in a seperate file, so it shouldn't be too much of an issue.2 -
I don't fight or hunt as my second class, so it's mostly not a problem for me, but I'm waiting on svof's multiclass branch which should be any day now?Huh. Neat.0
-
Before multiclass, I built my own system to run alongside server-side curing because Svo did a lot of things that I didn't like; some things flat out didn't work properly when I made the switch to using server-side curing (before Svo actually had a server-side mode) so I've been gradually replacing them with my own implementations. When multiclass came around, I ended up creating a system where each class has its own set of modes. Each mode has its own distinct set of affliction priorities, sip configurations, defence priorities, and defup and keepup configurations. I've also recently updated my affliction priority switching system so I can add class-specific swaps in.
When I just had dual cutting Paladin, I had aliases that would set the two venoms to use, aliases to set which limb (if any) I'm targetting, etc. then an alias that would actually attack (using the values that were set with the other aliases). That attack alias had optional modifiers for combining extra things that can be done off-balance/in combination with doubleslash, such as d to lay rite of demons, h to lay rite of healing, i for intimidate, etc.
Multiclass was then just a natural extension of that. The alias to pick venoms became an alias to pick dual afflictions (for dual aff classes), with some additions to handle non-venom afflictions like impatience; then each class determines how it needs to handle them - alchemist uses them as they are for truewrack, Bard converts to a combination of a song and a venom, dual cutting and serpent converts them both to venoms, and sword and shield converts them to a combination of a venom and shield attack.
Each class has its own namespace, and part of that is an 'attack' function, which will take that optional modifier the attack alias recognises. The base attack alias calls a general function which looks like this:
antonius.attacks.attack = function (modifier, queue) local queue = queue == nil and true or queue local commands = nil if antonius.ubermode.enabled then commands = antonius.ubermode.attack(modifier) elseif ssc.isdragon() then commands = antonius.attacks.dragon(modifier) elseif antonius.class() == "Paladin" then commands = antonius.paladin.attack(modifier) elseif antonius.class() == "Bard" then commands = antonius.voicecraft.attack(modifier) elseif antonius.class() == "Runewarden" then commands = antonius.runewarden.attack(modifier) elseif antonius.class() == "Priest" then commands = antonius.priest.attack(modifier) elseif antonius.class() == "Alchemist" then commands = antonius.alchemist.attack(modifier) elseif antonius.class() == "Serpent" then commands = antonius.serpent.attack(modifier) elseif antonius.class() == "Blademaster" then commands = antonius.blademaster.attack(modifier) end commands = antonius.get_commands(commands) if commands and #commands > 0 then send("setalias atk " .. table.concat(commands, "/"), false) if queue then if not ssc.inslowcuringmode() then antonius.queueing.queue("eqbal", "add", "atk", true) else sendAll("atk", false) end end else antonius.echo("No commands.") end end
As you can see, each class has its own namespace, and each of those namespaces has an attack function which takes the modifier and returns a list of commands to run. It passes that list to another function (antonius.get_commands) which just appends common things to the start such as STAND, switching parry, vaulting onto my mount, getting vials or pipes out of containers, etc. Here's an example of one of those class namespaces:
antonius.runewarden = antonius.runewarden or {} antonius.runewarden.modifiers = { i = "intimidate &tar", c = "contemplate &tar" } antonius.runewarden.attack = function(modifier) local commands = {} if antonius.target.adventurer and antonius.items.lists.inv["252324"] then table.insert(commands, "drop Neldoreth") table.insert(commands, "order Neldoreth kill " .. antonius.target.name) end local affs = antonius.runewarden.affs() local wieldcommands = antonius.wielding.wield(antonius.wielding.lookup.dwcleft, antonius.wielding.lookup.dwcright, nil, false) table.insertAll(commands, wieldcommands) if antonius.target.shield and antonius.target.rebounding then table.insert(commands, "raze " .. antonius.target.name) elseif antonius.target.shield or antonius.target.rebounding then table.insert(commands, "wield right " .. antonius.wielding.lookup.battleaxe) table.insert(commands, "razeslash " .. antonius.target.name .. " " .. affs.left) else table.insert(commands, "doubleslash " .. antonius.target.name .. " " .. antonius.targetting.bodypart .. " " .. affs.left .. " " .. affs.right) end if modifier and modifier ~= "" and antonius.runewarden.modifiers[modifier] then table.insert(commands, antonius.runewarden.modifiers[modifier]) elseif antonius.target.adventurer and not antonius.attacks.engaged and not ssc.inslowcuringmode() then table.insert(commands, "engage &tar") end return commands end antonius.runewarden.affs = function() return {left = antonius.envenom.afftovenom[antonius.attacks.left], right = antonius.envenom.afftovenom[antonius.attacks.right]} end
2 -
Austere said:I switched to wsys in preparation. Took me about a month to get everything changed over, but it was well worth it. If you decide to go this route, hit me up. I have two or three scripts that make it run fabulously.
Tip: Run enable/disable alias groups on class change. This allows you to use the same alias keys to do the same thing despite being different syntaxes.0 -
I use a trigger and an alias along with a few variables to enable and disable my combat aliases and reflexes. I don't have enough patience to log in and log out every time I (rarely, since I depend on lucrescent nuts so far) want to play my second class.
And you won't understand the cause of your grief...
...But you'll always follow the voices beneath.
0 -
Zuko said:Austere said:I switched to wsys in preparation. Took me about a month to get everything changed over, but it was well worth it. If you decide to go this route, hit me up. I have two or three scripts that make it run fabulously.
Tip: Run enable/disable alias groups on class change. This allows you to use the same alias keys to do the same thing despite being different syntaxes.
Beyond that, you're going to miss gotop, ndb, and the queue system. Wsys' queue is nicer in a lot of ways, it just takes some getting used to and it does have it's limitations0 -
-
I know @Keneanung's been working on multiclass support for svof. Not sure exactly what the status is, but it sounds like there's likely to be a version available for testing pretty soon.0
-
I have two mudlet profiles. This way I don't have to worry about misfiring triggers or aliases, etc. It takes me a moment to switch between classes, but it's not like I'm going to need to switch class right before or during combat. You can't even switch while having been in combat recently.
Never really saw the point of trying to run it off of one profile.0 -
I have started svof multiclass private beta with a few people and will be slowly expanding the list, when the major issues they found are fixed.
My Bashing script: http://achaeabashingScript.github.io/Bashing/
GMCP documentation: https://github.com/keneanung/GMCPAdditions
svof github site: https://github.com/svof/svof and documentation at https://svof.github.io/svof5 -
Shirszae said:I use a trigger and an alias along with a few variables to enable and disable my combat aliases and reflexes. I don't have enough patience to log in and log out every time I (rarely, since I depend on lucrescent nuts so far) want to play my second class.0
Hail, Stranger!
Categories
- 6K All Categories
- 3K Everything Achaea
- 1.5K North of Thera
- 21 Archives of the Terraformer
- 246 The Matsuhama Arena
- 873 The Golden Dais of Creation
- 283 The Scarlattan Theatre
- 145 The Blank Canvas
- 1.9K Getting Help
- 392 General Questions
- 251 Quick Class Questions
- 1.3K Tech Support
- 299 Client Help
- 459 Curing Systems and Scripts
- 829 Off-Topic
- 250 The Wander Inn
- 579 The Universal Membrane
- 286 Class Discussions
- 286 Individual Class Sections
- 20 Alchemist
- 9 Apostate
- 29 Blademaster
- 9 Depthswalker
- 12 Druid
- 4 Infernal
- 20 Jester
- 19 Magi
- 31 Monk
- 10 Occultist
- 7 Paladin
- 7 Priest
- 28 Runewarden
- 18 Sentinel
- 26 Serpent
- 19 Shaman
- 9 Sylvan