MUSHClient plugins

by Ilyarin

Back to Mechanic's Corner.

Ilyarin2009-05-30 12:27:54
Right-click and save in your ./MUSHClient/worlds/plugins directory if you wish to use the Plugin Installer. (Note: If you are using multiple plugins, this is the easiest way to load and reload them simultaneously. If you are only going to use one, it may be faster to just install it manually.)

Current free plugins (donations accepted - many hours have gone into some of these plugins):
Debating
DemesneTrack
EnemyAlly
Forging
OrgTracker
Potionlist
Synergy

Current purchaseable plugins:
Aethercraft - Empath (5cr)
Aethercraft - Siphon (1cr)
Aethercraft - Turret (5cr)

---

Any plugins with customisable settings can be edited using the syntax C_S or C_SETTINGS.

How to use the Plugin Installer:

  1. In the same directory as you saved the Plugin_Installer.xml file, create a folder called "Cerberus".
  2. Place the .xml files of any plugins you wish to use directly into the Cerberus folder.
  3. Open MUSHClient, and load your (Lusternia) world.
  4. Go to File -> Plugins -> Add. Find the "Plugin_Installer.xml" file and open it.
  5. Your plugins should now be installed.
  6. Send the command "check_plugins" to install all plugins in the Cerberus folder.
  7. Send the command "reload_plugins" to reload all the plugins in the Cerberus folder (if synergy plugin is installed and set, this will link plugins together).



MUSHClient 4.41 -- Most of my plugins require the most uptodate version. This is it.
Unknown2009-05-30 14:53:19
I've had requests for scripts to track enemies' names, mostly from the CITYENEMIES/COMMUNEENEMIES list, and it's not my highest priority now, but it would be useful to have around. Even better would be a script to track your personal enemies and allies, so you can keep up with the reject/enemy or make aliases to re-enemy a group of people more easily in larger scale combat.
Shaddus2009-05-30 17:00:49
Know what I could really use? A plugin for potionlist. One that tracks what you're out of, as well as giving you a list of how many sips of each concoction you have left total, and possibly warns you if you have filled vials that are under say 20 months left.

Another would be something for alchemy.
Ronny2009-05-30 17:21:56
A script that will tell you how many new vials you need and pours your potions into the new vials if they are going to decay. Also takes into account things like vials having a maximum of 60 sips when pouring. biggrin.gif
Ilyarin2009-05-30 19:04:18
I'll work on the potionlist plugin tonight, with functionality for pouring vials as well. If I think of a good way to do the city/commune enemy tracker I'll do it too.
Shaddus2009-05-30 19:12:17
QUOTE (Ilyarin @ May 30 2009, 02:04 PM) <{POST_SNAPBACK}>
I'll work on the potionlist plugin tonight, with functionality for pouring vials as well. If I think of a good way to do the city/commune enemy tracker I'll do it too.

Can you make it prioritize the vials based on length of useage? Like if you have a 50 month vial, and a 100 month vial both half full, it pours the 50 into the 100?
Ilyarin2009-05-30 19:30:22
Yes. All of my plugins will contain settings and preferences that are highly customisable to the user.
Shaddus2009-05-30 19:32:35
QUOTE (Ilyarin @ May 30 2009, 02:30 PM) <{POST_SNAPBACK}>
Yes. All of my plugins will contain settings and preferences that are highly customisable to the user.

Will I get 25% off my purchases in Starbucks, void where prohibited?
Ilyarin2009-05-30 19:35:52
Sorry, Costa's my sponsor.
Anisu2009-05-30 23:32:10
QUOTE (Ilyarin @ May 30 2009, 09:04 PM) <{POST_SNAPBACK}>
If I think of a good way to do the city/commune enemy tracker I'll do it too.

Something i wrote when I first started using treant, not the best solution but just to show one way of doing it.
CODE
if not allegiancerecon then
   allegiancerecon = {}
end

function allegiancerecon_allyconvert(arg)
    allegiancerecon_allylist = string.gsub(arg, ", ", "|")
    SetVariable ("Allegiancerecon_orgallies", allegiancerecon_allylist)
end

function allegiancerecon_enemyconvert(arg)
    allegiancerecon_enemylist = string.gsub(arg, ", ", "|")
    SetVariable ("Allegiancerecon_orgenemies", allegiancerecon_enemylist)
end


     custom_colour="4"
   enabled="y"
   expand_variables="y"
   group="allegiancerecon2"
   keep_evaluating="y"
   match="\\b(?:@!Allegiancerecon_orgallies)\\b"
   regexp="y"
   repeat="y"
   sequence="100"
  >
  


     custom_colour="7"
   enabled="y"
   expand_variables="y"
   group="allegiancerecon2"
   keep_evaluating="y"
   match="\\b(?:@!Allegiancerecon_orgenemies)\\b"
   regexp="y"
   repeat="y"
   sequence="100"
  >
  


  
  



     enabled="y"
   group="allegiancerecon"
   lines_to_match="2"
   match="^Enemies of (.*?)\\:\\n(.*?)\\n$"
   multi_line="y"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  allegiancerecon_enemyconvert("%2")
  
     enabled="y"
   group="allegiancerecon"
   lines_to_match="2"
   match="^The following are ACTIVE citizens (.*?)\\:\\n(.*?).$"
   multi_line="y"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  allegiancerecon_allyconvert("%2")
  
Ilyarin2009-05-31 07:09:39
Weird. I actually tried that last night, and got "function too complex", because the enemy list was so long.
Anisu2009-05-31 08:59:47
QUOTE (Ilyarin @ May 31 2009, 09:09 AM) <{POST_SNAPBACK}>
Weird. I actually tried that last night, and got "function too complex", because the enemy list was so long.

Odd, Celest's enemy list or another org?

-edit- Hrm I just tested Celest and Serenwilde and they work for me.
Isuka2009-05-31 17:04:06
This may help with the dev on the potions plugin. What follows is my gear tracker, which I use to check quantities while curing and for displaying a custom display for all of my consumables. It's probably a bit more than you're looking for, and not in plugin form, but you should be able to use it as a reference.

For this, the only command you will need to use is gear. IR and PL are both sent for you, and using either command separately may screw with your quantities at this point.

Triggers and Aliases required.
CODE


group="pl_captures"
keep_evaluating="y"
match="^(\\d+).+(liniment|quicksilver|empty)\\s+(\\d+)\\s+(\\d+)$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="12"
sequence="100"
>
gear:add("potions","%2","%3","%4","%1")

group="pl_captures"
keep_evaluating="y"
match="^(\\d+).+a potion of (\\w+)\\s+(\\d+)\\s+(\\d+)$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="12"
sequence="100"
>
gear:add("potions","%2","%3","%4","%1")

group="pl_captures"
keep_evaluating="y"
match="^(\\d+).+an? (\\w+) (?:salve|potion|purgativ)e?\\s+(\\d+)\\s+(\\d+)$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="12"
sequence="100"
>
gear:add("potions","%2","%3","%4","%1")

group="pl_captures"
match="^(\\d+)\\s+.+\\s+the poison (\\w+)\\s+(\\d+)\\s+(\\d+)$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="12"
sequence="100"
>
gear:add("potions","%2","%3","%4","%1")

group="pl_captures"
match="^{79}$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
sequence="100"
>

group="pl_captures"
match="^Id\\s+Container\\s+Contents\\s+Sips\\s+Months\\s*$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
sequence="100"
>

group="pl_captures"
keep_evaluating="y"
match="^Total Containers\\: \\d+$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="14"
sequence="100"
>
gear:display()
EnableTriggerGroup("pl_captures", false)


group="rift_captures"
keep_evaluating="y"
match="^\\s+\\ (\\w+)(?:\\s+\\ (\\w+))?(?:\\s+\\ (\\w+))?$"
omit_from_log="y"
omit_from_output="y"
regexp="y"
send_to="12"
sequence="100"
other_text_colour="red"
other_back_colour="lightgrey"
>
gear:add("rift","%2","%1")
if "%3" ~= "" then gear:add("rift","%4","%3") end
if "%5" ~= "" then gear:add("rift","%6","%5") end





match="^(pl|potionlist)$"
enabled="y"
group="gear"
regexp="y"
send_to="12"
sequence="100"
>
EnableTriggerGroup("pl_captures")
Send("pl")


match="^gear$"
enabled="y"
group="gear"
regexp="y"
send_to="12"
sequence="100"
>
gear:reset("all")
Execute("ir")


match="^ir$"
enabled="y"
group="gear"
regexp="y"
send_to="12"
sequence="100"
>
Send("ir")

match="^OnPrompt$"
group="rift_captures"
regexp="y"
send_to="12"
keep_evaluating="y"
sequence="100"
>
EnableGroup("rift_captures",false)
Execute("pl")





From gear.lua
CODE

gear = gear or {
items = php:Table(),
empties = php:Table(),
decaying = php:Table()
}

function gear:safeChars(s)
s = s:gsub(" ","_")
s = s:gsub("","")
return s
end

function gear:init()
for k,v in pairs(GetVariableList()) do
if k:match("bsd_gear_+") then
k = k:sub(10)
self.items = tonumber(v)
end
end
display:message("GEAR: Initialized.")
end

-- Item quantity methods
function gear:add(type,name,amt,time,num)
name = gear:safeChars(name)
amt = tonumber(amt) or 1
local count
if name == "empty" then
gear:addEmpty(type,num)
Debug("Empty Added")
else
count = self.items or 0
count = count + amt
self.items = count
SetVariable("bsd_gear_"..name,count)
end
if time and tonumber(time) < tonumber(GetVariable("bsd_config_decaywarn")) then
gear:addDecay(type,num,time)
end
end

function gear:sub(name,amt)
name = gear:safeChars(name)
amt = tonumber(amt) or 1
local count = self.items or 0
count = count - amt
if count < 0 then count = nil end
self.items = count
SetVariable("bsd_gear_"..name,count)
end

function gear:set(type,name,amt,time,num)
amt = tonumber(amt)
name = gear:safeChars(name)
if name == "empty" then
gear:addEmpty(type,num)
Debug("Empty Added")
else
self.items = amt
SetVariable("bsd_gear_"..name,amt)
end
if time and tonumber(time) < tonumber(GetVariable("bsd_config_decaywarn")) then
gear:addDecay(type,num,time)
end
end

function gear:del(name)
name = gear:safeChars(name)
self.items = nil
end

function gear:reset(name)
if mygear and mygear then
for k,v in mygear:pairs() do
for _,val in pairs(v) do
val = gear:safeChars(val)
self.items = nil
DeleteVariable("bsd_gear_"..val)
end
end
display:message("GEAR: "..display:titleCase(name).." Reset.")
elseif name == "all" then
self.items = php:Table()
self.decaying = php:Table()
self.empties = php:Table()
for k,v in pairs(GetVariableList()) do
if string.find(k, "bsd_gear_") then DeleteVariable(k) end
end
display:message("GEAR: All Reset.")
elseif string.match("items decaying empties",name) then
for k,v in self:pairs() do
DeleteVariable("bsd_gear_"..k)
end
self = php:Table()
display:message("GEAR: "..display:titleCase(name).." Reset.")
end
end

function gear:has(name)
name = name:gsub(" ","_")
return self.items
end

function gear:addDecay(type,num,tl)
if not self.decaying then self.decaying = php:Table() end
self.decaying = tl
end

function gear:addEmpty(type,num)
if not self.empties then self.empties = php:Table() end
self.empties = true
end

function gear:printItem(name)
local count = gear:has(name) or 0

if count > 50 then color = "mediumspringgreen"
elseif count <= 50 and count > 0 then color = "goldenrod"
else color = "crimson"
end
local pname = display:titleCase(name)
local stg = ""

Tell(" ")
ColourTell(color,"",string.format("%-20s",pname))
ColourTell(color,"",string.format("%4s",count))
Tell(" ")
end

-- display method
function gear:display()
if not mygear then
Note("mygear not specificed")
return
end
if not mygearorder then
Note("mygearorder not specified")
return
end

local tmpitems = {}
for k,v in self.items:pairs() do
tmpitems = v
end

local printlists = {}
local rows = 0

-- process columns
for sk,sv in mygear:pairs() do
printlists = {}
local i = 1
for k,v in sv:pairs() do
printlists = "&&"..k
i = i + 1
for _,val in pairs(v) do
printlists = val
i = i + 1
tmpitems = nil
end
end
if i > rows then rows = i end
end

local cRow = 1
while cRow < rows do
for _,goK in pairs(mygearorder) do
if printlists then
local itm = printlists
if itm:match("^\\&\\&") then ColourTell("gold","",string.format("%-30s",display:titleCase(itm:sub(3))))
else gear:printItem(itm)
end
else
Tell(string.format("%-30s",""))
end
end
Note("")
cRow = cRow + 1
end
--Misc
if #tmpitems > 0 then
ColourNote("gold","","Misc")
for k,v in pairs(tmpitems) do
gear:printItem(k)
Note()
end
end
for k,v in self.empties:pairs() do
ColourNote("mediumorchid","","You currently have " .. v:count() .. " empty "..k..".")
end
end


From php.lua
, based on code gathered from Zarquan (with a counting addition added by me).
CODE

if not php then php = {} end

function php:Table(...)
local newTable,keys,values={},{},{}
newTable.pairs=function(self) -- pairs iterator
local count=0
return function()
count=count+1
return keys,values]
end
end
newTable.count=function(self) -- count return
return table.getn(keys)
end
setmetatable(newTable,{
__newindex=function(self,key,value)
if not self then table.insert(keys,key)
elseif value==nil then -- Handle item delete
local count=1
while keys~=key do count = count + 1 end
table.remove(keys,count)
end
values=value -- replace/create
end,
__index=function(self,key) return values end
})
return newTable
end


From char_lusternia_isuka.lua, which is my config file for isuka. Modifying this will alter the output and display order of the display function. Anything in your inventory and not listed in this config will be printed under a Misc. category. This is, by the way, -not- a complete list, but something specifically for Isuka's usage patterns.
CODE

mygear = php:Table()
mygear = php:Table()
mygear = {"arnica","calamus","chervil","coltsfoot","earwort","faeleaf","galingale","horehound","kafe","kombu","marjoram","merbloom","myrtle","pennyroyal","reishi","sparkleberry","wormwood","yarrow"}
mygear = {"coal", "gold", "iron", "leather", "platinum", "silver", "steel"}
mygear = {"ruby"}
mygear = {"mercury"}
mygear = {"spices","rope","wood"}

mygear = php:Table()
mygear = {"healing","mana","bromides"}
mygear = {"choleric","melancholic","phlegmatic","sanguine","fire","frost","love","antidote"}
mygear = {"mending","regeneration","liniment"}
mygear = {"allheale","quicksilver"}
mygear = {"anatine","anerod","calcise","chansu","charybdon","contortrin","crotamine","dendroxin","dulak","hadrudin","haemotox","ibululu","inyoka","mactans","mantakaya","mellitin","morphite","niricol","senso"}

mygearorder = {"rift","potions"}


From display.lua, this function is actually a placeholder that I haven't yet updated, but required for a couple of notes.
CODE
function display:message(s)
    Note(s)
end


Hope this helps. I spent quite a bit of time getting the output to look just the way I wanted (this being my third complete rewrite of gear.lua)
Isuka2009-05-31 17:10:08
Note that counts and IDs of decaying vials are displayed for you, if they exist, but I haven't re-implemented my auto-pour function yet, as it may still be buggy.

Also, I forgot to mention that this script saves your item counts as MUSH variables for persistence, under bsd_gear_item. The number of months remaining on a vial for it to be considered "about to decay" is saved as a mush variable as bsd_config_decaywarn
Ilyarin2009-05-31 20:50:41
Thanks, but I'm already beyond the part of collecting information from potionlist. I've finished the potion summary part of it, I am now going to work on pouring vials.
Ilyarin2009-07-30 10:50:01
A number of my plugins have received fundamental updates. Please reinstall them, as well as the Synergy plugin, to get the full functionality.
Ilyarin2009-07-31 17:28:09
A little bit of disorganisation on my part previously led to a fairly poor cohesion between plugins. I've now rectified this. These plugins should now be incredibly easy to install and the commands should be similar between them (barring the Forging module which I am currently bringing over to the new system at the moment). Look at the first post for information on how to install and use these plugins.

(Also, pin this please?)
Unknown2009-09-17 23:52:13
Using both OrgTracker and EnemyAlly causes some epic lulz(aka things break.)

Basically, this:

CODE
Ally 1
Roark Libertas is now one of your allies.


edit: ...neeeeeevermind.
Ilyarin2009-09-18 00:02:54
Anything I need to do...? Unless the plugin itself is sending "ally 1" then it's probably not related to the plugins. For some reason, ally lets you specify a player by their number. Seems like a bug.
Unknown2009-09-18 00:18:17
Retarded misunderstanding on my part. I thought the command was "ally 1-16", not "c_s ot ally 1-16."

tl;dr(what, one line?): I am stupid ignore everything I say