zMud to MUSHclient Script Conversion

Posted by Kerowyn on Wed 29 Aug 2007 07:43 PM — 25 posts, 99,523 views.

USA #0
Hello, I'm Kerowyn, a leader of a clan (Disciples of Hasson) on Aardwolf.

Many of my clan members use MUSHclient. I have used zMud for years, so don't have much knowledge of it. I may download it and install it on my Linux workstation (Kubuntu with Wine) to become more knowledgeable.

Anyway, I am also the webmaster for our clan and run an eGroupWare site with a knowledgebase. I post handy zMud scripts within it (among other things) and of course the first thing that the MUSHclient users want is for me to convert the zMud script to MUSHclient.

I'm no programmer (as I've said many, many times). I can read through most code and I understand the logic and can usually figure out the syntax (with help from online resources of course), but my time is limited.

So, is there any "easy" way for me to convert zMud scripts to one of the four(4) MUSHclient scripting languages?

If you want an example, I can post a simple/short script I have for automatically donating gold to the clan coffers when you level or successfully finish a quest.

Thanks in advance for any advice you can give me!

USA #1
First off: MUSHclient supports 8 languages, and you don't need any of them for the triggers you mentioned. Well, depending on how complicated the level one is.

The easy one is the quest trigger. Copy everything from <triggers> to </triggers>, inclusive. Then open up the trigger menu with ctrl-shift-8 and click the paste button on the lower right corner.
<triggers>
  <trigger
   enabled="y"
   match=".* tells you 'As a reward, I am giving you \d+ quest points and (\d+) gold.'"
   regexp="y"
   sequence="100"
   send_to="1"
  >
  <send>clandonate %1</send>
  </trigger>
</triggers>

For the level trigger, it depends on what you want to do. You can donate a certain amount per level, for total levels, for you and your whole clan, per tier, whatever. To get at the basics of trigger making, take a look at the "Getting Started" section of the forums. If you just want the answer spit back like I gave for the quest gold donation, please explain a bit more exactly what you want donated on level.

I've been working on a plugin to convert zmud scripts to MUSHclient, but to be honest, I'm not familiar with zmud scripting at all. The scripting language of zmud is completely horrid. I'm somewhat dyslexic, so trying to read a 300 character line is just not going to happen.
USA #2
I am Venificius on Aardwolf, and I can convert most zMud scripts to mushclient, and will do them in Lua, as it is the most cross-platform, and needs no other programs installed to use, due to its integration.

You can e-mail me the scripts and I will take a look at them, if you'd like. Onoitsu2@yahoo.com

And Shaun, as for dealing with a 300 character line, I too am dyslexic BUT I just break it down line by line, and add returns where a bracket opening starts, and after an end one, and attempt to make it one command/function per line.
Then I break down the triggers and aliases, and start my conversions from there.

Laterzzz,
Onoitsu2
USA #3
To be honest, it's not worth my time or effort to break down the zmud scripts. By the time I've sorted out the branches of ifs, figuring out that some things have 1-3 sets of brackets depending on what you are doing/declaring, I could have written something from scratch to do the same thing. I tried converting Bejito's moonbot script. I gave up and made my own script which worked much better than the mess I had made off of Bejito's script. I pretty much took a script that worked very well in one client and had turned it into a script which spat out random garbage in another client, in spite of trying to be extremely careful in breaking it down.
USA #4
Thank you so much for such fast replies. Also thanks for the other to convert the script(s). I'm going to post the text from the donate script here because it's very short and I think somewhat simple.

#CLASS {donate}
#ALIAS settax {taxrate=%prompt( @taxrate, "Enter percentage to donate from 1-100");doncounttrue=%prompt( @doncounttrue, "Enter number of levels/pup before you donate");#IF (@doncount>@doncounttrue) {doncount=0}}
#VAR goldperlevel {9095}
#VAR taxrate {25}
#VAR doncount {0}
#VAR totdonate {0}
#VAR doncounttrue {1}
#VAR donateamount {47149}
#TRIGGER {^You receive (%d) gold} {#ADD goldperlevel %1}
#TRIGGER {^You get (%d) gold coins} {#ADD goldperlevel %1}
#TRIGGER {^You raise a level!!} {#ADD totdonate @goldperlevel;#ADD doncount 1;#MATH donateamount @totdonate*@taxrate/100;#IF (@doncount==@doncounttrue) {clandon @donateamount;doncount=0;totdonate=0};#IF (@doncounttrue=0) {doncount=0;totdonate=0};goldperlevel=0}
#TRIGGER {^Congratulations hero. You have increased your powers!} {#ADD totdonate @goldperlevel;#ADD doncount 1;#MATH donateamount @totdonate*@taxrate/100;#IF (@doncount==@doncounttrue) {clandon @donateamount;doncount=0;totdonate=0};#IF (@doncounttrue=0) {doncount=0;totdonate=0};goldperlevel=0}
#CLASS 0


Do you think I should look into using MUSHclient instead of zMud?

Can it do the multiple windows? I have a separate window for each chat/talk channel that automatically pops up when something new comes across.

USA #5
I'll add the option to donate into my gains monitoring script.

Pretty much you just need two variables set. GetVariable( varname ) returns the value stored, and SetVariable( varname, value ) stores the value. Anything else can by modified depending on what language you are using.

for Lua:
^You receive (%d) gold
<triggers>
  <trigger
   enabled="y"
   match="^You receive (\d+) gold"
   regexp="y"
   sequence="100"
   send_to="12"
  >
  <send>SetVariable( "donateamount", GetVariable( "donateamount" ) + %1 )</send>
  </trigger>
</triggers>
USA #6
Multiple windows can be somewhat hard to manage for MUSHclient depending on what you are doing with them. I have a plugin on my webpage http://biggs.is-a-geek.net/~balaam which puts channel captures to a different window. I'm planning on getting it to split to user defined windows per channel at some point soon, but it's going to be hard to get them to pop up on command.

This is one of the reasons talk about designing a new client from the ground up have been discussed. I would love to have a window with its own tabs which can hold channel captures.
USA #7
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on Wednesday, August 29, 2007, 9:22 PM -->
<!-- MuClient version 3.74 -->

<!-- Plugin "ClanLevelDonateLUA" generated by Plugin Wizard -->

<muclient>
<plugin
   name="ClanLevelDonateLUA"
   author="Onoitsu2"
   id="e6992b64478eb9a68d6182b9"
   language="Lua"
   purpose="Automatically Donates Gold To the Clan based upon % of gold earned per level/pup"
   save_state="y"
   date_written="2007-08-29 21:20:54"
   requires="3.74"
   version="1.0"
   >
</plugin>


<!--  Triggers  -->

<triggers>
  <trigger
   enabled="y"
   group="donate"
   ignore_case="y"
   match="^You (?:get|receive) (\d+) gold(\scoins)?"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  <send>SetVariable("goldperlevel",tonumber(GetVariable("goldperlevel")) + tonumber("%1"))</send>
  </trigger>
  <trigger
   enabled="y"
   group="donate"
   ignore_case="y"
   match="^(You raise a level\!\!|Congratulations hero\. You have increased your powers\!)"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  <send>SetVariable("totdonate",tonumber(GetVariable("totdonate")) + tonumber(GetVariable("goldperlevel")))
SetVariable("doncount",tonumber(GetVariable("doncount")) + 1)

SetVariable("donateamount",tonumber(GetVariable("totdonate") * tonumber(GetVariable("taxrate")) / 100)
if GetVariable("doncount") == GetVariable("doncounttrue") then
  Send("clandon " .. GetVariable("donateamount"))
  SetVariable("doncount",0)
  setVariable("totdonate",0)
elseif GetVariable("doncounttrue") == "0" then
  SetVariable("doncount",0)
  setVariable("totdonate",0)
  SetVariable("goldperlevel",0)
end -- if</send>
  </trigger>
</triggers>

<!--  Aliases  -->

<aliases>
  <alias
   match="^settax$"
   enabled="y"
   group="donate"
   omit_from_command_history="y"
   regexp="y"
   send_to="12"
   ignore_case="y"
   sequence="100"
  >
  <send>taxrate = tonumber(GetVariable("taxrate"))
doncounttrue = tonumber(GetVariable("doncounttrue"))
doncount = tonumber(GetVariable("doncount"))
if taxrate == nil then taxrate = 0 end
if doncounttrue == nil then doncounttrue = 1 end
if doncount == nil then doncount = 0 end

repeat
  taxrate = tonumber(utils.inputbox("Enter percentage to donate from 1-100","Please Enter Tax Rate To Donate At",taxrate))
  if taxrate == nil or taxrate &lt; 1 then
    if taxrate == nil then taxrate = "nil" end -- if
    utils.msgbox(taxrate .. " is an invalid percentage, please enter a number between 1-100.\nPlease enter another 

value...","Invalid Number Entered","ok","!") end -- if
until taxrate ~= nil and taxrate &gt; 0

repeat
  doncounttrue = tonumber(utils.inputbox("Enter the number of levels/pups before you donate","Please Enter Number Of 

Levels/Pups Till You Donate"))
  if doncounttrue == nil or doncounttrue &lt; 0 then
    if doncount == nil then doncounttrue == nil end -- if
    utils.msgbox(doncounttrue .. " is an invalid number of levels/pups.\nPlease enter a positive number","ok","!") end -- if
  elseif doncount &gt; doncounttrue then doncount = 0 end -- if
until doncounttrue ~= nil and doncounttrue &gt; -1

SetVariable("taxrate",taxrate)
SetVariable("doncounttrue",doncounttrue)
SetVariable("doncount",doncount)</send>
  </alias>
</aliases>
</muclient>


You can copy that ENTIRE section and paste it into notepad, or any other true text editor, and save it as a FILENAME.xml, and load that into mushclient and it will get the job done. I even added error checking for invalid inputs, just cause I am always cautious like that. And there are a few other ways to accomplish this task, rather than always saving and converting from mushclient variables and back and saving immediately, but since this might be part of a larger system I wanted it to work standalone, since I don't know the rest of the "script" to be.

Hope this helps :)

-Onoitsu2
USA #8
Here's a version of settax that won't let you enter 101% tax and will let you set the tax to 0 if you don't want to donate anything. It will also deny level entries of 2.31 and other non integers.
<aliases>
  <alias
   match="settax"
   enabled="y"
   group="donate"
   omit_from_command_history="y"
   send_to="12"
   ignore_case="y"
   sequence="100"
  >
  <send>taxrate = tonumber(GetVariable("taxrate")) or 0
doncounttrue = tonumber(GetVariable("doncounttrue")) or 1
doncount = tonumber(GetVariable("doncount")) or 0

taxrate = tonumber(utils.inputbox("Enter percentage to donate from 1-100","Please Enter Tax Rate To Donate At",taxrate))
while ( taxrate or -1 ) < 0 or taxrate > 100 do
  taxrate = tonumber(utils.inputbox(taxrate .. " is an invalid percentage, please enter a number between 0-100."))
end

doncounttrue = tonumber( utils.inputbox( 
      "Enter the number of levels/pups before you donate","Please Enter Number Of Levels/Pups Till You Donate"))
while ( doncounttrue or -1 ) > 0 or doncounttrue % 1 ~= 0 do
  doncounttrue = tonumber(utils.inputbox(doncounttrue .. " is an invalid number of levels/pups.  Please enter a positive integerer"))
end

SetVariable("taxrate",taxrate)
SetVariable("doncounttrue",doncounttrue)
SetVariable("doncount",doncount)</send>
  </alias>
</aliases>
Amended on Thu 30 Aug 2007 05:02 AM by Shaun Biggs
USA #9
While I'm at it... here's how to prevent you from donating half a gold coin, or 0 gold if you set the tax to 0.
<send>SetVariable("totdonate",tonumber(GetVariable("totdonate")) + tonumber(GetVariable("goldperlevel")))
SetVariable("doncount",tonumber(GetVariable("doncount")) + 1)

SetVariable("donateamount",math.floor(tonumber(GetVariable("totdonate") * tonumber(GetVariable("taxrate")) / 100))
if GetVariable("doncount") == GetVariable("doncounttrue") then
  if GetVariable("donateamount") > 0 then
    Send("clandon " .. GetVariable("donateamount"))
  end
  SetVariable("doncount",0)
  setVariable("totdonate",0)
elseif GetVariable("doncounttrue") == "0" then
  SetVariable("doncount",0)
  setVariable("totdonate",0)
  SetVariable("goldperlevel",0)
end -- if</send>
Amended on Thu 30 Aug 2007 05:07 AM by Shaun Biggs
USA #10
Hrm... Also, since Onoitsu wisely had the triggers capture only numbers, there is really no point in all of the tonumber() calls within the triggers' send field. Lua passes a nil value if the variable isn't a number, which will cause the same error if you don't follow it with an 'or 0' or some other error trapping number.

The other problem here is that this does not take into account gold autosplit with your group mates, so depending on if you are the more likely to get the last hit or not, the amount donated may be lower or higher than expected. Campaign and GQ gold is also skipped over... But they are easily captured in the same manor as the first trigger listed.
Amended on Thu 30 Aug 2007 05:21 AM by Shaun Biggs
USA #11
Wow! You two have really gone to town with this script. I very much appreciate it.

Since I have a four-day weekend coming up, I will have time to experiment with MUSHclient.

Do you know if it's all right to have MUSHclient and zMUD installed on the same computer? If so, then it will be easier to test.

Again, thanks for all your efforts.
USA #12
It is perfectly safe to install both Mushclient and zMud on the same system, as safe as zMud itself is to install on a system. I say it this way, because I have had an older version of zMud, and its elicense scheme actually kill something in my windows system to where it would not boot any longer. Thankfully I was using a 2 drive method, and all progs and user files were on the 2nd drive, and windows itself was on its own section, so nothing was lost, but still pissed me off to no end.

-Onoitsu2
#13
What We really need is a room sw database. I know zmud has one somewhere.



is in Kerowyn's clan and a user of my bro Onoitsu2's scripts


Kerowyn and Onoitsu2 scripts will work on mushclient using wine on linux i should know i tested it for Onoitsu2 on my linux box and it work pretty well i must add :)
Amended on Sat 01 Sep 2007 06:52 AM by Slarin
#14
Ono, could I get you to troubleshoot an already converted plugin? It's a conglomeration of Ninja's and Atreidess' monitoring script. Problem is that it fires off about every 3 minutes automatically spamming results.

If you could either fix it to do the hourly report + on level report...or even just the on level/quest report I'd be forever grateful.

I'll shoot it to your email.
USA #15
Quote:
It's a conglomeration of Ninja's and Atreidess' monitoring script.

Mine is almost finished and so far it works much better than I had hoped when I started... except for a minor issue with crashing if you kill a gq mob and don't win the gq. As soon as I get that stable, I will release mine. Or I can email it to you if you don't mind that bit of annoyance here and there.
#16
Oh man, that would be great.

Ono (Venificius on aard) was helping clean out the bugs on the script NeoFryBoy posted on here. I was positive we had it but it falls apart after a day or two for some reason. If you need a tester for your script let me know.

I'm loving your quest mob/quest reporter/level timers and would love to get my hands on more of your handiwork.

Oh, my email is cam_revard@yahoo.com
USA #17
Ok, finally finished debugging that gq loss part. Really pathetically stupid error I don't care to admit to making :p Anyway, I've released a beta version on my website http://biggs.is-a-geek.net/~balaam/ under GainMonitor. I have not gotten around to adding any neat things like double xp tracking, voluntary clan taxing and the like, but it works. It even recognizes when you are in note mode and won't do that annoying "gt quest time" thing everyone else seems to enjoy putting into their notes. Instead, it displays the information to the screen only. Colours are also customizable, as is where each information type is displayed.
#18
Shaun Biggs,

If you wouldn't mind, would you be willing to post your moon tracking plug-in that you created in here? I'm relatively new to Mushclient and so I'm not very good at scripting just yet. I have been trying to do the same thing you said (and convert Bejito's Moonbot script from Zmud to MC), but I haven't really been able to do it.

I admit that part of the problem is that I was never great at coding in Zmud either (aside from basic triggers and aliases), so I don't really fully understand even how the moon class works. I've spent quite a bit of time just reading through that code and trying to display it in such a way as to make sense, but there are far too many nested if statements and commands I don't understand.

If you'd like I can post the moonbot script to this forum. The script itself (for Zmud) can be found at http://mud.alhena.org/scripting/moonbot.zip

I would really appreciate your help. That might actually be a good plug in to add to Venificius's Aardwolf Plugin Zip File. You, Nick, and Venificius have really made my transition to Mushclient a real joy. I've become somewhat dependent on the forum to get things to work and I absolutely love the code you guys have come up with. Thanks so much



USA #19
Sorry, my site went down for quite a while, and now I'm having a rather hard time getting my old host name back. This is also an old version, I don't have access to the new version while I'm at work.

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on Thursday, May 17, 2007, 9:30 AM -->
<!-- MuClient version 4.05 -->

<!-- Plugin "moonbot" generated by Plugin Wizard -->

<muclient>
<plugin
   name="moonbot"
   author="Balaam"
   id="2349913955dd86427355ad5e"
   language="Lua"
   purpose="moon phase tracker"
   save_state="y"
   date_written="2007-05-17 09:28:14"
   requires="4.05"
   version="1.0"
   >
</plugin>

<!--  Get our standard constants -->

<include name="constants.lua"/>

<!--  Triggers  -->

<triggers>
  <trigger
   enabled="y"
   group="moons"
   match="--&gt; TICK &lt;--*"
   name="moontick"
   send_to="12"
   sequence="100"
  >
  <send>for i,v in pairs(moons) do
  if moons[i].now ~= nil then
    moons[i].now = (v.now+1) % v.cycle
  end
end
if countdown == nil then
  countdown, countdowndur = nextunion()
else
  countdown = countdown - 1
  if countdown &lt; 1 then
    countdown, countdowndur = nextunion()
    ColourNote("lime", "black", "Three moons are up for "..countdowndur.." ticks!" )
  end
end</send>
  </trigger>
  <trigger
   enabled="y"
   group="moons"
   match="^You notice the (black|grey|white) moon fall in the (ea|we)st.$"
   name="moonsetting"
   regexp="y"
   script="moonsetting"
   sequence="100"
  >
  </trigger>
</triggers>

<!--  Aliases  -->

<aliases>
  <alias
   match="moon:plot"
   enabled="y"
   group="moontracker"
   send_to="12"
   sequence="100"
  >
  <send>if (moons.black.now == nil ) or
   (moons.grey.now == nil ) or
   (moons.white.now == nil ) then
  Note( "The cycle of one or more moons is unknown.")
else
  plotdata={white={},grey={},black={}}
  for i = 0,69 do
    for m,t in pairs(plotdata) do
      table.insert(t, ((moons[m].now + i ) % moons[m].cycle) &lt; moons[m].up)
    end
  end
  for i,t in pairs(plotdata) do
    local temp = "["
    for _,v in ipairs(t) do
      if v then
        temp = temp.."O"
      else
        temp = temp.."."
      end
    end
    print(temp.."] "..i)
  end
end</send>
  </alias>
  <alias
   match="moon:union"
   enabled="y"
   group="moontracker"
   send_to="12"
   sequence="100"
  >
  <send>print(nextunion())</send>
  </alias>

  <alias
   match="moon:print"
   enabled="y"
   group="moontracker"
   send_to="12"
   sequence="100"
  >
  <send>Note( "Black="..(moons.black.now or "nil")..
        " Grey="..(moons.grey.now or "nil")..
	" White="..(moons.white.now or "nil") )
  </send>
  </alias>
  
  <alias
   match="moon:tick"
   enabled="y"
   group="moontracker"
   send_to="12"
   sequence="100"
  >
  <send>tickgag = not tickgag
  SetVariable( "tickgag", tostring(gagmoon) )
  local temp = "n"
  if tickgag then temp = "y" end
  SetTriggerOption( "moontick", "omit_from_output", temp )
  ColourNote( "white", "black", "Tick gagging set to ",
              "lime",  "black", tostring(tickgag) )
  </send>
  </alias>

  <alias
   match="^moon(bot)?:help"
   send_to="12"
   regexp="y"
   enabled="y"
  >
  <send>  OnPluginInstall()
  ColourNote( "white", "black", "moonbot:help ",
              "lime",  "black", ": You just typed it.  Look what happened." )
  ColourNote( "white", "black", "moon:plot    ",
              "lime",  "black", ": show the moon cycle" )
  ColourNote( "white", "black", "moon:union   ",
              "lime",  "black", ": show time until next union of 3 moons" )
  ColourNote( "white", "black", "moon:tick    ",
              "lime",  "black", ": turn tick gagging on or off" )
  </send>
  </alias>
  
</aliases>

<!--  Script  -->
<script>
<![CDATA[
tickgag = GetVariable( "tickgag" )
if tickgag == nil then
  tickgag = false
else
  tickgag = gagmoon == "true"
  SetTriggerOption( "moontick", "omit_from_output", "y" )
end

moons={black={now=nil,cycle=50,up=13},
       grey={now=nil,cycle=30,up=8},
       white={now=nil,cycle=65,up=17}}

function moonsetting( tname, tstr, wildcards )
  local moon = wildcards[1]
  moons[moon].now = moons[moon].up - 2
end-- moonsetting

function printmoons()
  Note( "Black="..(moons.black.now or "nil")..
        " Grey="..(moons.grey.now or "nil")..
	" White="..(moons.white.now or "nil") )
end

function nextunion()
  if (moons.black.now == nil ) or
     (moons.grey.now == nil ) or
     (moons.white.now == nil ) then
    return nil,nil
  else
    local offset = 0
    while ((moons.white.now + offset) % moons.white.cycle >= moons.white.up) or
          ((moons.black.now + offset) % moons.black.cycle >= moons.black.up) or
          ((moons.grey.now + offset) % moons.grey.cycle >= moons.grey.up) do
      offset = offset + 1
    end
    local duration = 1
    while ((moons.white.now + offset + duration) % moons.white.cycle < moons.white.up) and
          ((moons.black.now + offset + duration) % moons.black.cycle < moons.black.up) and
          ((moons.grey.now + offset + duration) % moons.grey.cycle < moons.grey.up) do
      duration = duration + 1
    end
    return offset,duration
  end
end -- nextunion()

function OnPluginInstall()
  ColourNote( "white", "black", "Plugin ",
              "lime",  "black", GetPluginName(),
              "white", "black", " Version:",
              "lime",  "black", tostring(GetPluginInfo (GetPluginID(), 19)),
              "white", "black", " installed." )
end -- OnPluginInstall

function OnPluginClose()
  ColourNote( "white", "black", "Plugin ",
              "lime",  "black",  GetPluginName(),
	      "white", "black", " closed." )
end -- OnPluginClose

]]>
</script>

</muclient>
Amended on Sun 20 Jan 2008 04:16 AM by Shaun Biggs
USA #20
I cannot apologize enough for the formatting nightmare that is my previous post. Apparently IE doesn't like to display the xml in a way I could just copy/paste like Firefox does. I will check it over when I am at home to make sure that I correctly fixed my posting of the plugin.

Also, on an important note if you are concerned about integrating this with Bejito's plugin... Bejito and I think completely in the opposite direction. We have our counters starting in different places and the iterators count in different directions. Version 1.0 of mine works well (to be honest, I like Bejito's better), but don't expect them to integrate at all. That's what I've been doing with version 2.0 :)
Amended on Fri 18 Jan 2008 04:34 PM by Shaun Biggs
#21
Thanks Shaun so much!...I really appreciate your help. The script looks and works great. Please post version 2 of the moonbot script whenever you do finish working on it, but this version definitely does everything I wanted it to. Bejito's script had a couple other features like refreshing other people's moon scripts, but I don't need those features anyway.

Again, I can't thank you enough for your help.

For anyone else trying to use this script:

I had a little trouble at first getting it to work, but then I realized that as Shaun mentioned in his last post, IE messes up the formatting when pasting. Thus, IE was reading "&lt;" and "&gt;" and pasting them into the forum as "<" and ">" (which was causing the following error: Element name must start with letter or underscore, but starts with " " (problem in this file)).

To correct this, simply go through the code and replace all "<" and ">" not associated with a keyword flag with "&lt;" or "&gt;" respectively.

A useful post about that (and some other useful information) can be found at http://www.gammon.com.au/forum/?id=7123.

Thanks again, Shaun.
USA #22
I fixed my post, so the script currently up should work by pasting it into a text file. I also managed to butt up against the 6000 character limit a few times trying to trim down the file.

Interfacing with Bejito's script is getting entertaining, since we apparently count in opposite directions, as well as using different number sets. Yay modular arithmetic! Anyway, here is the history part of my current version:

Version 2.0

version history:

2.0    - Redid how ticks were tracked.  No more problems with writing notes
       - Added a commented function at the bottom.  Uncomment it if you leave
         the world open but disconnected for long periods of time.
       - Added length of time until next junction in moon:union
       - Hey, I made a graph!
1.1    - Added command to clear the timing data
       - Cleaned up the display of moon:union 
1.0    - Basic functions of moonbot implemented.
USA #23
One thing I would like to see is communication between other users of this plugin, even if it does not work with the zmud version. I have not looked at the numbers in either plugin, but don't think it would be too hard to do a conversion when reporting, I mean you cracked the "pathing" using different numbers.

I would have converted the original plugin, but I pay no attention to the moons, as I am not even a multi-class nor a tier, so don't enchant things.

-Onoitsu2
USA #24
It's not hard to convert back and forth, I think the formula is just ( length_up - current_time) mod total_cycle, I just need to test it to make sure. And if I have it use Bejito's reporting as a standard (he was first, after all), then anyone using my plugin will be able to talk to each other and zMUD users' scripts.

I just need testing time. I got a new job a few months ago, and between training, then vacation, and now travel... well, there has not been terribly much time for mudding.