zMUD stuff
Home zMUD stuff Areas Eq EQdb WellStuffs

 

Updated 980905, and has had visitors since 980807

This page currently contains:

Triggers:

Keeping track of groupmembers Rescuetriggs(File) Automagic healing(File) Welltriggs Autopeek

Keeping track of active spells Improved automagic healing Improved peeking(File)

Paths:

Speedwalks

About the triggers

None of those triggers have been cut directly from my files, there may be typos and settings that interfear with them working. Try changing the general setting "exapnd vars" to true and see if U can figure out what the trigger is supposed to do with what i write downhere, before bugging me about "nonworking triggers". The ideas behind those triggers and the way they have been made works excellently for me :)

I've been getting tons of questions about this stuff lately, and i am usually quite happy to help. Do keep in mind that this is meant as a help for you to create your own setups rather than the triggermakers guide to life, the universe and everything. Try and read and understand about what the triggers try to do, rather than just downloading and buggin me when they dont work :)

Keeping track of groupmembers

The best way i've found sofar to keep track of ones group makes use of the lists that are a part of zMUD. The lists are regular text variables wich use the character "|" to split the text string into several strings. You could create such a list by typing:

#var Testlist {Tjohej|Tjohopp}

But to improve the usefulness of those list there are a couple of built in functions in zMUD that makes use of this feature. The ones we are concerned with are %additem (adds a string to a list) and %ismember (returns true if a string is a member of the list).

The way to check who is in group would be using the group command and to make sure the list is resetted each time you type group this is how i do it:

#action {Your group consists of:} {#var Grupplista { }}

#action {%d. ~[%d %w/%w~] (%1)%s~[*~%H*~%M*~%V~]}

           {#if (@Namn<>%1) {#var Grupplista %additem(@Grupplista,%1)}}

This trigger needs the variable Namn, wich is the current chars name to exclude itself from the grouplist.

Rescuetriggs

General triggers for rescues would be the normal switch, the retreat switch, the backstab switch and the murder switch. To enhance them one should limit ones rescues to the members of ones group and this of course means you need to keep track of them for instance the way described above. So the basics are:

#action {'(%w), I will get you for trying to * me!'}

            {#if (%ismember(%1,@Grupplista)) {resc %1}}

#action {notices (%w)'s retreat and launches a swift attack}

            {#if (%ismember(%1,@Grupplista)) {resc %1}}

#action {thinks that (%w) deserves punishment.}

            {#if (%ismember(%1,@Grupplista)) {resc %1}}

You group might have other buffer chars who protect ppl, and if so you also need:

#action {(%w) heroically rescues %w.}

            {#if (%ismember(%1,@Grupplista)) {resc %1}}

You will also want to deal with failed rescs. Since the message for failed rescs dont tell you who you failed to resc you need to keep track of that yerself. One way of doing it is to make a variable used in an alias like this:

#alias resc {rescue %1;#var LastResc {%1}}

#action {You fail the rescue.} {resc @LastResc}

Now those triggers will deal with most situations, and them with the peeker last in group and protected by you will deal with 95% of the situations. They dont deal with silent switchers and with mobs entering room and hitting groupmembers not protected tho. There is of course a way to fix that as well but you need to make sure you dont spam yerself with rescues since that will make for slow next resc. The way i did this was to make a variable with all interesting types of hitting, taken from gags, and then checking if the word after the hit was a groupmember:

#var SlagTyper {annihilates|atomizes|hits|massacres|obliterates|pulverizes|

                    slashes|ultraslays|ULTRASLAYS***|vaporizes}

As i recall there was som kind of problem with the *** after ULTRASLAY due to it beeing a Wildcard thingie, but i dont quite recall how i solved that.

To not spam out the rescues i do a check that the guy who is gonna get resced dont already have one coming. Now note that this means that if you resced this guy much earlier, but still haven't resced any1 since, he wont get a rescue! So you either remove the last part of the if () and play it spammy, or be aware that this way of doing it dosen't cover 100% of the rescues. One way to increase accuracy might be to set lastresc to none as soon as U recive exps. There surely are other ways.

#action {@SlagTyper (%w)} {#if (%ismember(%1,@Grupplista) AND

                                         (%1<>@LastResc)) {resc %1}}

Hold shift and click Here to download a zipped .mud file that should contain most of those autorescs.

Since i wrote this i've chatted with Garfire on the subject and he came up with the excellent suggestion to fix some problems with this way of doing things. Since Lastresc needs to be updated or the char who got the last switch wont be protected and since this lastrescupdate can screw with the fix for failed rescs U modify the rescue alias to:

#alias resc {rescue %1;#var Lastresc %1;#var Failresc %1}

And add the updatetriggs ought to be like:

#action {But nobody is fighting} {#var Lastresc None}

#action {Banzai! To the rescue...} {#var Lastresc None}

And then just change the "You fail the rescue trigger" to resc Failresc instead of Lastresc. And you should reset the lastresc when U stop fighting as well.

Automagic healing

Priests are one of the most essential types of groupmembers, and the way a priest heals can make a group great or have it killed off in notime. Triggers for autohealing shouldn't be overestimated but they are almost a necessity for grouphealing in PGs and helps making good safety for buffers in long time xpgroups. There are a bunch of different ways of doing this but the most often used command is group. This type of triggers need to be quite settable, since you use different healing in different groups and for different targets. The need for "settability" makes the need for variables rather big.

First we want to make the group list show at a set time:

#action {Your group consists of:} {#wait @Checktime;group}

Checktime is the time in miliseconds that goes until ya do the next group. Since one combat pulse is 3 secons you might wanna set it to 3000 for goodpaced healing.Be aware that this trigger uses the same pattern as grouplistmaking, and thus might want to be added in there.

Now for the bufferhealing. Depending on type of group and targets buffer mig want trues or miracles and at different levels of hploss. I use buttons to set different healing types, and try to adjust myself to what other pr:s are doing using the "@Buffer <value>%" syntax. The trigger can look something like:

#action {%d. ~[%d %w/%w~] @Buffer%s~[%s(%d)~%H*~%M*~%V~]}

            {#Colo Green;#if (%1<@Heallimit) {@healspell @Buffer}}

So for this one to work you need to have the proper values in the Buffer, Heallimit and Healspell variables. Buffer is of course the tank, healspell would be yer type of healing as in yer mira or true alias and heallimit would be depending on you beeing on backupmira, primarymira or trueing. There is also a color thing that i use to separate buffers line in group from the others, for better visibility.

Since trueing is done without regard to the other healers an alias to set you in trueing mode might look like this:

#alias truemode {#var Heallimit 70;#var Healspell true;gtf emote is now doing trues if @buffer goes under @Heallimit%, and is checking condition at @Checktime ms intervall.}

The miracle is depenedant on other priests, since the one with the highest %age mana would be the one to take next mira. Thus U need to keep switching between primary mira and backupmira. Alias might look like:

#alias setmiralev {#var Heallimit %1;#var Healspell mira;gt Is doing miracle with @Buffer @Heallimit% limit.}

Now to make your char adapt to other pr:s using the same syntax you might want the trigger:

#action {tells the group, '*@Buffer (%d)~%} {#if (%1>29) {setmiralev 20}}

This would make you go down to backupmira if any1 else claims the miracle by setting their limit to a value higher than 29. To further automatize things you could make one of the groups pr:s check who has the next miracle for instance like this:

#action { Present: %d Missing: %d} {#if (@SkaTellaMiraer) {tell @HighestPr Your mana is the best, U do next mira (AutoMessage);#var SkaTellaMiraer 0}}

#action {@Buffer looks renewed and cured!} {#var Skatellamiraer 1}

#action {Your group consists of:} {#var HighestPr None;#var HighestPrMana 0}

#action {%d. ~[%d Pr/Pr~] (%w)%s~[*~%H%s(*)~%M *~%V~]} {#if (%2>@HighestPrMana) {#var HighestPr %1;#var HighestPrMana %2}}

To give any effect tho this trigger you need to switch to the new level automagically so the following triggers would be needed as well:

#action {You try to tell yourself something.} {setmiralev 33}

#action {tells you 'Your mana is the best, U do next mira (AutoMessage)'} {setmiralev 33}

Now to deal with group U can use the same principles, and just exclude the buffer from them:

#action {%d. ~[%d %w/%w~] (%w)%s~[%s(%d)~%H*~%M*~%V~]} {#if (%2<@GHeallimit AND %1<>@Buffer) {true %1}}

This one just needs Gheallimit to know what %age to heal group.

Hold shift and click Here to download a zipped .mud file that should contain autoheal on buffer and group, without autochanges tho.

Improved automagic healing

I've recently mucked about with my pr triggers to make em better, since there has been a bit of a problem with afkpr:s and miracling. I also wanted my pr to work gpows when needed, instead of going for 10 trues before getting back to buffer. To do this you need to work yer way through the grouplist and decide what to do after, since that is the only way to get all the information needed. So i made two triggers that extract information from grouplist, one to check the pure pr:s mana:

#action {%d. ~[%d Pr/Pr~] (%w)%s~[*~%H%s(*)~%M *~%V~]} {#if (%2>@HighestPrMana) {#var HighestPr %1;#var HighestPrMana %2} ;#var Prlist {%additem(@Prlist,%1)}}

What this one does is to figure out wich pr has the highest mana %agewize, and saves that name and value. The value is saved to compare with the next pr wich means at the end U'll have the name of the pr with the highest %age. I also threw in a list, Prlist, to keep track of what pr:s were in the group. And then we have one trigger to check groups hps:

#action {%d. ~[%d *~] (%w)%s~[%s(*)~%H*~%M *~%V~]} {#if (%1<>@buffer) {#if (%2<@LowestHps) {#var LowestHpchar %1;#var LowestHps %2}} {#Colo Green;#if (%2<@Heallimit) {#var Bheal 1}};#if (%2<@Gheallimit) {#math Gpowcount {@Gpowcount+1}}}

Note that this one only works on damaged ppl, since it wants a space after the "[" by hps and thus dont work to use as a grouplistmaker. Now here we have three posible conditions, if the char we currently pass is the buffer, we need to do him first, thus if he has under his limit hps we set the variable Bheal to true (1). Now if it isen't the buffer we wanna find out if this char has lower hitpoints than the others in group, thus we do the same type of work we did on prmana, by keeping track of the char with lowest hps name. Finally if he is under groupheallimit (Gheallimit) we wanna add him to the count of how many ppl are to later decide wether a gpow is what we should cast.

Those two triggers are rather variableheavy, and both of them needs initialisations:

#action {Your group consists of:} {#var Prlist { };#var Bheal 0;#var Gpowcount 0;#var HighestPr None;#var HighestPrMana 0;#var Lowesthps 100;#var LowestHpChar None;#wait @Checktime;group}

This trigger resets the list of pure pr:s, sets bufferheal to false, sets number of groupmembers under gheallimit to 0, and initialises the lowhp highpr counters. It also has the regular "wait and do group again" commands. With those three triggers we got the information we need and now is the time to act on it:

#action {%sPresent: %d Missing: %d} {#if (@Bheal) {@Healspell @Buffer} {#if (@Gpowcount>3) {gpow} {#if (@Lowesthpchar<>None AND @Lowesthps<@Gheallimit) {true @Lowesthpchar}}};#if (@HighestPr=@Namn AND @Healspell=mira) {setmiralev 33} {#if (@Healspell=mira) {setmiralev 20}};#NOP #if (@SkaTellaMiraer) {tell @HighestPr mhp 33;#forall @Prlist {#if (%i<>@HighestPr) {tell %i mhp 20}};#var SkaTellaMiraer 0}}

This one looks a lot more complicated than it really is, since i included a #NOPed example of how you could use it to run afkpr:s while using miras. What it does is simply checking if the buffer needs heal first, and if so does it, otherwize if more than 3 groupmembers need healing (under Gheallimit) it does a gpow if neither of those are the case, it throws a true on the guy with the lowest hps, if needed. After the healing is done, it also checks if you are using miracles and if your char (Namn) had the highest mana%age, and if so claims the mira, if U are using miracles, but your char isen't the highest, it goes for backup at 20%. Finally we have the #NOPed stuff, wich needs another trigger, to know when to reset the other pr:s by setting Skatellamiraer to true, and will whenever that is true, tell the highest guy to mhp 33 (set miralimit 33) and the other pr:s to mhp 20 (go for backup at 20%). You might wanna modify the prlist to exclude your own char if U use this last bit, to avoid telling yerself. This trigger also need an alias called setmiralev wich looks like this:

#alias {setmiralev} {#if (@Heallimit<>%1) {gtf emote is now doing @healspell at @buffer %1%};#var Heallimit %1}

This one obviously checks to see if there was a change in limit, and if so reports it to group with gtf (to avoid spam gtellog), and then sets the new limit. The trigger to tell when to set all pr:s would of course be:

#action {@Buffer looks renewed and cured!} {#var Skatellamiraer 1}

This of course means that after the buffer gets a mira, you will check next time group command comes what pr should do the next one.

Those triggers are a bit messy and especially the telling thingie should be used with caution. If U want to use something like this i'd suggest using an AFKlist, wich U edit manually, and only tell to those added. Of course none of Burnings good pr:s play afk, but with the lack of pr:s today one is often forced to use them, and in those cases those triggs can be helpful. The Pr-running triggs can of course be run by any char, but a fighting type might find the constantgrouping a tad hard to do, due to BSwaitstates etc. The healing part, wich always does buffer first, and gpows if needed, and if not those, a true on the guy with the lowest hps should be rather useful tho and could easily be isolated from here.

To improve things further, U might wanna do the group loop only when in a fight, but i'll leave that one to yer own imagination :)

Welltriggs

The well is the best and definitly the most demanding area on the mud. The number of triggers wich would be useful for it is just about endless, but two things you cant do without. Triggers for the storm that knocks ya up against a wall and triggers for the stalactites.

Stalactites:

#action {@Leader's group leaves (%w).} {#var walkdir %1}

#action {A stalactite dislodges from the ceiling and plummets to the ground, narrowly} {stand;@walkdir;follow @leader}

Storm:

#action {You feel a slight movement in the air, and you can hear a storm brewing afar.} {rest}

#action {A raging tempest races through the room, leaving devastation in its wake.} {stand}

There are a bunch of other stuff that is useful for welling, like autocuring injections, hallucinations, rp:ing wierds, summoning from trapdoors etc etc and i might add on here later on.

Autopeek

Lots of ppl use the gtell channel for their peek info but i prefear using tell leader, since it mainly just spams group. Theese triggers can easily be modified to deal with either of course.

The basic idea is to have two types of peek triggers, one that just gets toggled on as long as you are peeking, and one that controls the peekinfogatherer. If we call the first one autopeek and the other one peekinfoget the triggers could look this way:

#action {^As you peek (%w) you see the following:} {#var Peekinfo {Dir %1:};#t+ peekinfogatherer}

#action {(*)} {#var Peekinfo {%additem(%1,@peekinfo)}} peekinfogatherer

#action {$} {#t- peekinfogatherer;#forall {@peekinfo} {tell @leader %i}} peekinfogatherer

So what this one does, is to initialize Peekinfo with dir X and activate peekinfogatherer. The peekinfogatherer has one trigger wich simply takes everything it can find and adds each line to the list peekinfo, and one trigger wich turns the gathering off when it encounters an empty line ($=empty line). Once that empty line is found, it tells the leader all of the lines it saw, with the Dir X: first.

Hold shift and click Here to download a zipped .mud file that should contain this type of autopeek. Dont forget to set leader tho :)

Keeping track of active spells

There are several ways to keep track of what utility spells you have on ya, from the recast and endmessage to checking affects or keeping track of time it has been up. My favorite is to recast as spells go out, but there is a bit of a problem with that one of course. You need to make sure U can recast spell, since many utility spells are not castable while in fight, and no spells are while sleeping ). Now another thing that needs to work is to recast spells on loosing concentration, wich can be done by keeping track of last spell you tried to cast. Examples of aliases could look like

#alias {arm} {cast 'arm' %1;#alias lastspell {arm %1}}

#alias {pb} {cast 'plasma bolt' %1;#alias lastspell {pb}}

Note that i dont add target on offensive spells, to avoid silly misstakes on lost conces. Usually the pb alias would be worked without target of course. The trigger to control recasting would look like

#action {You lost your concentration} {lastspell}

Now to keep track of if this char is fighting or sleeping i use two Boolean variables, called Fighting and Sleeping. So to start it off i set them to #var Fighting 0;#var Sleeping 0. Then at TICKCOUNTER 5 sec... i set sleeping to 1 before i go to sleep. And when i do an assist, i set Fighting to 1. So basically those triggers should keep track of chars sleepingmode

#action {TICKCOUNTER 5 seconds to tick} {#var Sleeping 1;sleep;save}

#action {TICKCOUNTER tick tock} {#var Sleeping 0;wake}

And for fighting i modified my assist alias, that i use in my assist triggs

#alias {aa} {#var Fighting 1;assist @buffer}

#action {You receive %d experience points.} {#var Fighting 0}

The reason i use my alias here is that if U use the "You join the fight" thingie, u might miss some spells in between there. Now all ya need to do is to set up yer recasts to check if you are fighting or sleeping for instance like this:

#action {The detect invisible wears off.} {#if (@Fighting OR @Sleeping) {#var Skakastas {%additem(@Skakastas,cast 'detect i')}} {det}}

Now you know what to cast when ya wake up or fight ends, since it has been added to the list Skakastas, thus we just execute them at wakeup and at end of fight and the wakeuptrigg looks like:

#action {TICKCOUNTER: tick tock} {#var Sleeping 0;#colo Cyan;wake;#TS 75;#if (@Fighting=0) {#forall {@Skakastas} {%i};#var Skakastas { }}}

This example is a tad ugly, since it tries to execute it even if there is nothing in Skakastas, but that can be fix with an additional contition of course.

The reason why this way is better than for instance loading a list with the spells U have on aff, and checking it each tick, is that this way the spells are kept up at all times. The time way of solving it needs some other chack, since it could be recasted in fight/when sleeping.

Improved peeking

The peektriggs posted on this page has one major problem, the tellspam they create, both for the triggerer and for the leader. I've been trying to fix this for some time without coming up with a good enough solution but now i think i have. The idea is to create a list with two types of items, first is the Substitution and second is the Pattern_to_substitute. Then as i go through this list i either make the Sub the next replacementitem or search Peekinfo for the Pattern_to_substitute.

So what you do at the end of peekgrabbing (the $ trigger) is to add this stuff before telling leader peekinfo. This trigger is not a cut and paste, so test it a lot until it works for you, the idea does anyways :)

#var RaknaLista 0;#forall @Peeksublista {#math Raknalista {@Raknalista+1};#if (%mod(@Raknalista,2)=0) {#if (%ismember(%i,@Peekinfo)) {#var Peekinfo {%replace(@Peekinfo,%i,|@CurrentSub)}}} {#var CurrentSub {%i}}

I've not experimented much with this yet, but you should note the | i place before CurrentSub, wich means my Subs currently remove the newline in tells, wich might not be a good idea if you just want to shorten mob names. Also note the =0 i added to make it work, since it dosen't seem like the #math is preformed at the ; but at the end of the command somehow.

Now to show an example of this you could have a Peeksublista looking like this:

#var peeksublista {(Sanc)|...Glowing with a bright light!}

Wich would make the following peektext:
Map the tiny lumberjocker is here.
...Glowing with a bright light!
Get switched to be told as: "Map the tiny lumberjocker is here.(Sanc)" instead of in two lines.

I'll prolly get back to this one later, but meanwhile, shift Here is a file of this type of peeking.

Speedwalks

Those speedwalks were put here on the summer of 1998. U might wanna test em before running em with important chars since paths tend to get outdated :)

.tohaon .3wn3wswswn3w
From outside west gate to intersection by haon duor.

.toygg .3wn3wswswn3w9ws2w2sws2wnwnwn
From outside west gate to Yggdrasil.

.totar .2w7s2w3s11w4sw
Ofcol obelisk to Tarsis i belive.

.toarach .3wn3wswswn12ws3wu2neusewswsd2eun2swes
From outside west gate to Elder Wormkin of Arachnos.

.toargo .3nd5nund3n
From ultima obelisk to argo (trolls).

.toench .3wnwne2nw2nwne2nwne3sesw2se2swse2s9wnn
From king obelisk to enchanted forest.

.tolag .2s3w7sw2sw3ses2ws2wn2w
From TS to Lagamore.

.tomahn .3wnwnennwnnwne3se2swswssde4se2su
From king obelisk to Mahn-tor (not tested lately).

.tolost .sus5d2e2nes2enw
From Elemental Canyon obelisk to Lost Temple.

.totomb .7seu2nw2n2ws
From Solace obelisk to intersection by Amazonas and Tombs of Tomahukken.

.totaon .3wn3wswswn3wse2sw2ses4w3s7e7n3w
From outside west to first fly-needed room on the way to Taon.

.totaon2 .3w6s2u3e4n4w3u3e2n3ue
From .totaon up to the top, gatekeeper beeing su.

.todemon .3wn3wswswn3wse2sw2se2sesen
From outside west gate to Demon city with Kerjim etc d.

And here are some from Zzz:

-Druid Forest- from ms, 7wn3wsw7n

-Earth Sea- from ms, 7wn3wswswn12ws2w2sen

-Gnome Village- from ms, s3w7sw2sw3s2e

-Inglestone- from ofcol, 2w7s2w3s11wnw5nw

-Kender Village- from ofcol, 2w7s2w3s8w2nen

-City of Alchor- from Sundhaven, travel south and open the southern

gate, then 4swse2sw2sws2w2n

-Skorns- from Elven Village, 2sw2s2es2e2n

-Varak-ki- from ms, 6e8n2wne2n