Welcome to the Achaea Forums! Please be sure to read the Forum Rules.

How did you support multiclass? (Mudlet)

ZukoZuko Member Posts: 730 ✭✭✭✭✭ - Grand Achaean
Hey all!

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

  • AustereAustere TennesseeMember Posts: 2,283 @@ - Legendary Achaean
    edited February 2016
    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. 
  • MatiasMatias Member Posts: 73 ✭✭✭ - Distinguished
    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. 
    AustereMami
  • AustereAustere TennesseeMember Posts: 2,283 @@ - Legendary Achaean
    edited February 2016
    Oh my,  @Matias stole my edited idea! 

    Another decent idea if you want to stay svo is to use modules to link your core stuff through dropbox. I can help with this too!
    Matias
  • AhmetAhmet Wherever I wanna beMember Posts: 3,370 @@ - Legendary Achaean
    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.
  • AntoniusAntonius Member Posts: 4,926 @@ - Legendary Achaean

    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
    
    ExelethrilPiera
  • ZukoZuko Member Posts: 730 ✭✭✭✭✭ - Grand Achaean
    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. 
    Yeah, I'll probably give wsys a shot.. I just love the interface of SVO. But that shouldnt be a factor :D
  • ShirszaeShirszae Santo DomingoMember Posts: 3,264 @@ - Legendary Achaean
    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.

  • AustereAustere TennesseeMember Posts: 2,283 @@ - Legendary Achaean
    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. 
    Yeah, I'll probably give wsys a shot.. I just love the interface of SVO. But that shouldnt be a factor :D
    Even stock wsys doesn't really love multiclass. I had to write a function to remove defs from ss based on availability by class.  I don't care a bit too share my mc stuff though.  

    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 limitations
  • SzanthaxSzanthax San DiegoMember Posts: 1,906 @ - Epic Achaean
    profiles for every class in mudlet. SzanPriest... SzanSerp...

    I run into problems with defup though because sometimes it resets the serverside defences and stuff to the new class... sometimes it dont. :anguished: 



    Spas
  • EldEld Member Posts: 3,946 @@ - Legendary Achaean
    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.
  • SpasSpas Member Posts: 10
    edited February 2016
    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.
  • AhmetAhmet Wherever I wanna beMember Posts: 3,370 @@ - Legendary Achaean
    Keneanung said:
    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.
    Sign me up! :anguished: 

    Huh. Neat.
  • GamdenGamden Member Posts: 225 ✭✭✭ - Distinguished
    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.
    how do you switch your svo defups?

Sign In to Comment.