Zmud stuff

Posted by Penguin on Thu 30 May 2002 10:14 AM — 17 posts, 63,802 views.

#0
I'm not too sure with Zmud scripting cos I hardly use it.. but can anyone help me with the following terms?

#VAR light {%additem(%proper(%1),@light}

VA light ""
#t+ wholight
#wa 1000
#t- wholight

Maybe tell me what they do? Or how to replace them using VBscript? Thanks.
USA #1
Hmm... Well I don't know much about it either. I converted a 'time to reboot' script I use to it with some help, but found the commands inconsistant, buggy and in some cases not working even close to the way described. However I will take a shot at it...

#VAR light {%additem(%proper(%1),@light}:
Define a variable 'light' and
Places the proper name (i.e. sam -> Sam) in %1 into 'light'.

VA light "" - Sets the variable light to blank.
#t+ - Turns on the triggers in the wholight group.
#wa 1000 - Waits a bit.
#t- - Turns off the triggers in the wholight group.

Now doing this in MUSHClient...

The first bit becomes:
world.setvariable "light", ucase(mid(wildcard(1),1,1)) & mid(wildcard(1),2,len(wildcard(1))-1)

Or something close to this. Apparently MS doesn't think a command to change a name to its proper form was important enough to support directly. :p I don't know how your getting the value in the existing script but wildcard(1) is the equivalent of %1 in most cases.

The second part is complicated since there is no real wait command in MUSHClient in the sense of how ZMUD uses it, nor are triggers 'groupable', however since there appears to only be one in this instance (I assume):

world.setvariable "light", ""
world.enabletrigger "wholight", 1
world.addtimer ("lightwait", 0, 0, 1, "", 16388, "killtrigger")

The 16388 makes this a temporary and one shot timer.

And then another script as follows to execute the last bit:

  sub killscript (Timername)
    world.enabletrigger "wholight", 0
  end sub
Amended on Thu 30 May 2002 06:26 PM by Shadowfyr
#2
Theres another command linked to an alias called "light"
#FORALL {@light} {tell %lower(%i) (Light) %1}

I tried to do this by writing a script which goes like this:

Sub Light_Tell (AliasName, TriggerLine, arrWildcards)
shadowperson = world.GetVariable("light")
shadowperson = UCase(Left(person, 1)) & LCase(Mid(person, 2, Len(person)))
World.Send "tell" & shadowperson & "$BOLD$(Light) %1"
End Sub

This is accompanied by an alias "light *" which calls upon the script. However it doesn't seem to work... Do you know what might be wrong?
Australia Forum Administrator #3
Do you really need all the case conversion? Most MUDs won't mind if you send to an all lower-case name. From what I gather you are trying to do, you are making a list of people (trigger) and sending to all of those people (alias).

To make the list, you simply can append to a variable, like this:


sub NewPerson (sName, sLine, wildcards)

  world.setvariable "people", world.getvariable ("people") _
        & ", " & wildcards (1)

end sub


This will append to the list (obviously you need to clear it out sometime).

Now, to tell something to everyone in the list. Make an alias, eg.


<aliases>
  <alias
   name="TellAll"
   script="DoTellAll"
   match="tellall *"
   enabled="y"
  >
  </alias>
</aliases>


Put this in the script file ... 

sub DoTellAll (sName, sLine, wildcards)

  for each x in split (world.getvariable ("people"), ",")
    if trim (x) <> "" then
       world.send "tell " & x & " " & wildcards (1)
    end if 
  next

end sub


What this is doing is getting the contents of the variable "people", using "split" to break it up at the commas, using "for each" to walk the array output from "split", and then sending to the world, providing the name doesn't end up blank.
#4
Hmm. What I'm trying to do here is get a list of people from a 'who friend' list then send tells to each one of them. For example:

Loser the dwarf Warrior
Winner the elf Archer

I have a trigger: (\w) the (elf|dwarf) to try and set their names as variables.. but I can't connect everything(aliases, triggers, scripts) to make it work.
USA #5
Well.. The problem here is two fold. First is that most muds are not trigger friendly. If you have a prompt or something that contains 'fixed' (i.e. unchanging) an 'unique' information you can use a method that pulls all names from the list using * as the match pattern and turns that trigger off if it sees the unique features in your prompt. Most muds do not have such a unique prompt and the various list commands don't provide any easy way to identify the end of the list either.

Considering all these facts you can either do something like Gammon suggest, but 'hard code' the names into the script like so:

dim people
people = "loser winner sam fred ..."

or make the command that adds names to you friends list also execute a script to tack them onto a variable like Gammon suggested.

The third option is to add something unique to your prompt and use the * matching trick to read them all and disable the * trigger when you hit the prompt. If you do that then I assume from your example that you also have titles and maybe pre-titles (in front of the name). If you have both then:

sub Grabname (trigname, output, wildcards)
  dim temp, temp2
  temp = split(wildcards(1), " ")
  select case temp(1)
    case "xyzzy" 'Some unique word at the start of the prompt.
      world.enabletrigger "Grabname", 0
      exit sub
    case "celestial" 'The first pre-title
      temp2 = temp(2)
    case "..." 'Additional pre-titles
               'NOTE: if a pretitle has more than one word
               'then you need to grab temp(3) or at worst
               'temp(4) to get the name. For instance
               'The Lord x or The Lady x, would both
               'match on 'The' and return temp(3). Some
               'complex version could require a mess of
               'if-then statements to sort out after the
               'first word is matched, but that's life. ;)
    case else 'No pretitle, just take the name
      temp2 = temp(1)
  end select
  world.send "tell " & temp2 & " " & world.getvariable("Message")
end sub

This assumes you can A) can set your prompt to start with some specific word that will never be in a name or pre-title and B) that you set up an alias that calls a script to enable the trigger that calls Grabname and sends the actual command to list them. You may also want to make the trigger omit from output, so you will only see the results of the command and not the entire list as it is read. If however you have no pretitles at all then you can eliminate the case statement completely and simply check the first temp(1) value for a name or the prompt, which would be:
sub Grabname (trigname, output, wildcards)
  dim temp
  temp = split(wildcards(1), " ")
  if temp(1) = "xyzzy" then
    world.enabletrigger "Grabname", 0
  else
    world.send "tell " & temp(1) & " " & world.getvariable("Message")
  end if
end sub

which is much shorter, but can't handle any change that may later be made that adds pre-titles to the mud.
Amended on Fri 31 May 2002 08:59 PM by Shadowfyr
Australia Forum Administrator #6
Quote:

Hmm. What I'm trying to do here is get a list of people from a 'who friend' list then send tells to each one of them. For example:

Loser the dwarf Warrior
Winner the elf Archer

I have a trigger: (\w) the (elf|dwarf) to try and set their names as variables.. but I can't connect everything(aliases, triggers, scripts) to make it work.


You need a trigger that matches on:


(\w+) the (silvan|sindar|dwarf|dunedain|dunlending|eorling|hobbit)


This is initially disabled. Then you make an alias "getfriends" or whatever, that enables that trigger, and does a "who friends". The alias can also add a 2-second timer (or whatever) to disable the trigger again when its time is up (or use another trigger to look for something at the end of the who list, if there is such a thing).

The trigger adds names to the list, as I described earlier.
#7
Hmm.. the names don't seem to be registering as variables. When I type 'whofriends' my alias to call the script:

sub NewPerson (sName, sLine, wildcards)
world.enabletrigger "NameTrigger", 1
world.send "who friend"
world.setvariable "people", world.getvariable ("people") _
& ", " & wildcards (1)
end sub

If I go to World Properties -> Scripting -> Variables, under people it has a few commas instead of their names. I have added a trigger as suggested by Nick, which is labeled "NameTrigger" in the above script. Can anyone figure out what is wrong?
#8
Oh yeah and a minor adjustment to the trigger: I'm using two wildcards instead of one now, because behind the name and race lies their title.
It now looks like this:
* the the(silvan|sindar|dwarf|dunedain|dunlending|eorling|hobbit)*

Am I allowed to use '*' at the start? Do I need to edit my scriptfile now that there are two wildcards?
Australia Forum Administrator #9
This line needs to go in the trigger, not the alias. It is done for every matching person:


world.setvariable "people", world.getvariable ("people") _ 
           & ", " & wildcards (1) 


And no, you don't need to change the script, the person will still be wildcard 1.
#10
The variable 'people' still appear as commas only. I dont know what is wrong. I'll paste my aliases/triggers/scripts.

Trigger: Total friends: *
Label: DisableNameTrigger
Script: Disable_NameTrigger

Sub Disable_NameTrigger (AliasName, TriggerLine, arrWildcards)
World.enabletrigger "NameTrigger", 0
End Sub

Trigger: * the (silvan|sindar|dwarf|dunedain|dunlending|eorling|hobbit) *
Send: world.setvariable "people", world.getvariable ("people") _
& ", " & wildcards (1)
Label: NameTrigger

Alias: whofriends
Label: WhoFriends
Script: NewPerson

sub NewPerson (sName, sLine, wildcards)
world.enabletrigger "NameTrigger", 1
world.send "who friend"
end sub

Alias: tellall *
Label: TellFriends
Script: DoTellAll
sub DoTellAll (sName, sLine, wildcards)

for each x in split (world.getvariable ("people"), ",")
if trim (x) <> "" then
world.send "tell " & x & " " & wildcards (1)
end if
next

end sub

I believe the error lies right in the trigger or something, since the names of my friends are not registered.
#11
It seems that the (silvan|sindar|dwarf|dunedain|dunlending|eorling|hobbit) part isn't working. I added a small trigger, "* the silvan *" to change the color to yellow. It colored my silvan friend who appeared in the who list. However when I changed it to "* the (hobbit|silvan) *" neither my hobbit friend nor my silvan friend got colored. A bug maybe?
#12
Woo! I managed to get it somewhat working.. changed the trigger to "* the *" instead of the (hobbit|dwarf|...) thing. Only problem now is that the tells I send to my friends have a , behind them(except for the last guy on the list). For example:

tell Winner, test
tell Loser, test
tell Hahaha test

And so only the tell to Hahaha is registered. How do I get rid of the commas?

My script to send tells is the same as before.

sub DoTellAll (sName, sLine, wildcards)

for each x in split (World.getvariable ("people"))
if trim (x) <> "" then
world.send "tell " & x & " " & wildcards (1)
end if
next

end sub
#13
Quote:

for each x in split (World.getvariable ("people"))


could be:

for each x in split (World.getvariable ("people"), ",")


this will use the comma as the primary point to seperate the names instead of a space
#14
WOO!! I managed to it working now!!! Bwahahahahaha! Thanks everyone:) There's still something minor though. Now when I type my alias to get variables again it adds on to the list variables. like for example, if Winner was on and I already set him as a variable. Then when Loser logs on and I try to get a new list.. instead of just adding Loser to the list and sending tells to Loser, I send tells to Winner, Loser then Winner again. Is there anyway to clear the list first without having to do it manually by going to world properties -> scripting -> variables?
Canada #15
Change this subroutine to what I have provided:

sub NewPerson (sName, sLine, wildcards)
  world.setvariable "people", Empty     ' Clear the list of friends in this variable.
  world.enabletrigger "NameTrigger", 1
  world.send "who friend"
end sub
#16
Yay! Finally got it all done:) Thanks for all your help and for being so patient with me, especially Nick. Really appreciate it:)