1095 lines
31 KiB
Plaintext
1095 lines
31 KiB
Plaintext
' Example of coding script routines for MUSHclient in VBscript
|
|
|
|
option explicit
|
|
|
|
' ----------------------------------------------------------
|
|
' Error codes returned by various functions
|
|
' ----------------------------------------------------------
|
|
|
|
const eOK = 0 ' No error
|
|
const eWorldOpen = 30001 ' The world is already open
|
|
const eWorldClosed = 30002 ' The world is closed, this action cannot be performed
|
|
const eNoNameSpecified = 30003 ' No name has been specified where one is required
|
|
const eCannotPlaySound = 30004 ' The sound file could not be played
|
|
const eTriggerNotFound = 30005 ' The specified trigger name does not exist
|
|
const eTriggerAlreadyExists = 30006 ' Attempt to add a trigger that already exists
|
|
const eTriggerCannotBeEmpty = 30007 ' The trigger "match" string cannot be empty
|
|
const eInvalidObjectLabel = 30008 ' The name of this object is invalid
|
|
const eScriptNameNotLocated = 30009 ' Script name is not in the script file
|
|
const eAliasNotFound = 30010 ' The specified alias name does not exist
|
|
const eAliasAlreadyExists = 30011 ' Attempt to add a alias that already exists
|
|
const eAliasCannotBeEmpty = 30012 ' The alias "match" string cannot be empty
|
|
const eCouldNotOpenFile = 30013 ' Unable to open requested file
|
|
const eLogFileNotOpen = 30014 ' Log file was not open
|
|
const eLogFileAlreadyOpen = 30015 ' Log file was already open
|
|
const eLogFileBadWrite = 30016 ' Bad write to log file
|
|
const eTimerNotFound = 30017 ' The specified timer name does not exist
|
|
const eTimerAlreadyExists = 30018 ' Attempt to add a timer that already exists
|
|
const eVariableNotFound = 30019 ' Attempt to delete a variable that does not exist
|
|
const eCommandNotEmpty = 30020 ' Attempt to use SetCommand with a non-empty command window
|
|
const eBadRegularExpression = 30021 ' Bad regular expression syntax
|
|
const eTimeInvalid = 30022 ' Time given to AddTimer is invalid
|
|
const eBadMapItem = 30023 ' Direction given to AddToMapper is invalid
|
|
const eNoMapItems = 30024 ' No items in mapper
|
|
const eUnknownOption = 30025 ' Option name not found
|
|
const eOptionOutOfRange = 30026 ' New value for option is out of range
|
|
const eTriggerSequenceOutOfRange = 30027 ' Trigger sequence value invalid
|
|
const eTriggerSendToInvalid = 30028 ' Where to send trigger text to is invalid
|
|
const eTriggerLabelNotSpecified = 30029 ' Trigger label not specified/invalid for 'send to variable'
|
|
const ePluginFileNotFound = 30030 ' File name specified for plugin not found
|
|
const eProblemsLoadingPlugin = 30031 ' There was a parsing or other problem loading the plugin
|
|
const ePluginCannotSetOption = 30032 ' Plugin is not allowed to set this option
|
|
const ePluginCannotGetOption = 30033 ' Plugin is not allowed to get this option
|
|
const eNoSuchPlugin = 30034 ' Requested plugin is not installed
|
|
const eNotAPlugin = 30035 ' Only a plugin can do this
|
|
const eNoSuchRoutine = 30036 ' Plugin does not support that subroutine (subroutine not in script)
|
|
const ePluginDoesNotSaveState = 30037 ' Plugin does not support saving state
|
|
const ePluginCouldNotSaveState = 30037 ' Plugin could not save state (eg. no state directory)
|
|
const ePluginDisabled = 30039 ' Plugin is currently disabled
|
|
const eErrorCallingPluginRoutine = 30040 ' Could not call plugin routine
|
|
const eCommandsNestedTooDeeply = 30041 ' Calls to "Execute" nested too deeply
|
|
const eCannotCreateChatSocket = 30042 ' Unable to create socket for chat connection
|
|
const eCannotLookupDomainName = 30043 ' Unable to do DNS (domain name) lookup for chat connection
|
|
const eNoChatConnections = 30044 ' No chat connections open
|
|
const eChatPersonNotFound = 30045 ' Requested chat person not connected
|
|
const eBadParameter = 30046 ' General problem with a parameter to a script call
|
|
const eChatAlreadyListening = 30047 ' Already listening for incoming chats
|
|
const eChatIDNotFound = 30048 ' Chat session with that ID not found
|
|
const eChatAlreadyConnected = 30049 ' Already connected to that server/port
|
|
const eClipboardEmpty = 30050 ' Cannot get (text from the) clipboard
|
|
const eFileNotFound = 30051 ' Cannot open the specified file
|
|
const eAlreadyTransferringFile = 30052 ' Already transferring a file
|
|
const eNotTransferringFile = 30053 ' Not transferring a file
|
|
const eNoSuchCommand = 30054 ' There is not a command of that name
|
|
const eArrayAlreadyExists = 30055 ' That array already exists
|
|
const eBadKeyName = 30056 ' That name is not permitted for a key
|
|
const eArrayDoesNotExist = 30056 ' That array does not exist
|
|
const eArrayNotEvenNumberOfValues = 30057 ' Values to be imported into array are not in pairs
|
|
const eImportedWithDuplicates = 30058 ' Import succeeded, however some values were overwritten
|
|
const eBadDelimiter = 30059 ' Import/export delimiter must be a single character, other than backslash
|
|
const eSetReplacingExistingValue = 30060 ' Array element set, existing value overwritten
|
|
const eKeyDoesNotExist = 30061 ' Array key does not exist
|
|
const eCannotImport = 30062 ' Cannot import because cannot find unused temporary character
|
|
|
|
|
|
' ----------------------------------------------------------
|
|
' Flags for AddTrigger
|
|
' ----------------------------------------------------------
|
|
|
|
const eEnabled = 1 ' enable trigger
|
|
const eOmitFromLog = 2 ' omit from log file
|
|
const eOmitFromOutput = 4 ' omit trigger from output
|
|
const eKeepEvaluating = 8 ' keep evaluating
|
|
const eIgnoreCase = 16 ' ignore case when matching
|
|
const eTriggerRegularExpression = 32 ' trigger uses regular expression
|
|
const eExpandVariables = 512 ' expand variables like @direction
|
|
const eReplace = 1024 ' replace existing trigger of same name
|
|
const eTemporary = 16384 ' temporary - do not save to world file
|
|
|
|
' ----------------------------------------------------------
|
|
' Colours for AddTrigger
|
|
' ----------------------------------------------------------
|
|
|
|
const NOCHANGE = -1
|
|
const custom1 = 0
|
|
const custom2 = 1
|
|
const custom3 = 2
|
|
const custom4 = 3
|
|
const custom5 = 4
|
|
const custom6 = 5
|
|
const custom7 = 6
|
|
const custom8 = 7
|
|
const custom9 = 8
|
|
const custom10 = 9
|
|
const custom11 = 10
|
|
const custom12 = 11
|
|
const custom13 = 12
|
|
const custom14 = 13
|
|
const custom15 = 14
|
|
const custom16 = 15
|
|
|
|
' ----------------------------------------------------------
|
|
' Flags for AddAlias
|
|
' ----------------------------------------------------------
|
|
|
|
' const eEnabled = 1 ' same as for AddTrigger
|
|
const eIgnoreAliasCase = 32 ' ignore case when matching
|
|
const eOmitFromLogFile = 64 ' omit this alias from the log file
|
|
const eAliasRegularExpression = 128 ' alias is regular expressions
|
|
' const eExpandVariables = 512 ' same as for AddTrigger
|
|
' const eReplace = 1024 ' same as for AddTrigger
|
|
const eAliasSpeedWalk = 2048 ' interpret send string as a speed walk string
|
|
const eAliasQueue = 4096 ' queue this alias for sending at the speedwalking delay interval
|
|
const eAliasMenu = 8192 ' this alias appears on the alias menu
|
|
' const eTemporary = 16384 ' same as for AddTrigger
|
|
|
|
' ----------------------------------------------------------
|
|
' Flags for AddTimer
|
|
' ----------------------------------------------------------
|
|
|
|
' const eEnabled = 1 ' same as for AddTrigger
|
|
const eAtTime = 2 ' if not set, time is "every"
|
|
const eOneShot = 4 ' if set, timer only fires once
|
|
const eTimerSpeedWalk = 8 ' timer does a speed walk when it fires
|
|
const eTimerNote = 16 ' timer does a world.note when it fires
|
|
const eActiveWhenClosed = 32 ' timer fires even when world is disconnected
|
|
' const eReplace = 1024 ' same as for AddTrigger
|
|
' const eTemporary = 16384 ' same as for AddTrigger
|
|
|
|
' ----------------------------------------------------------
|
|
' Example showing iterating through all triggers with labels
|
|
' ----------------------------------------------------------
|
|
sub showtriggers
|
|
|
|
dim mylist
|
|
dim i
|
|
|
|
mylist = world.GetTriggerList
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.note mylist (i)
|
|
next
|
|
End If
|
|
|
|
end sub
|
|
|
|
' -----------------------------------------------
|
|
' Example showing iterating through all variables
|
|
' ------------------------------------------------
|
|
sub showvariables
|
|
|
|
dim mylist
|
|
dim i
|
|
|
|
mylist = world.GetVariableList
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.note mylist (i) & " = " & world.GetVariable (mylist (i))
|
|
next
|
|
End If
|
|
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing iterating through all aliases with labels
|
|
' ---------------------------------------------------------
|
|
sub showaliases
|
|
|
|
dim mylist
|
|
dim i
|
|
|
|
mylist = world.GetAliasList
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.note mylist (i)
|
|
next
|
|
End If
|
|
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world open
|
|
' ---------------------------------------------------------
|
|
sub OnWorldOpen
|
|
world.note "---------- World Open ------------"
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world close
|
|
' ---------------------------------------------------------
|
|
sub OnWorldClose
|
|
world.note "---------- World Close ------------"
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world connect
|
|
' ---------------------------------------------------------
|
|
sub OnWorldConnect
|
|
world.note "---------- World Connect ------------"
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world disconnect
|
|
' ---------------------------------------------------------
|
|
sub OnWorldDisconnect
|
|
world.note "---------- World Disconnect ------------"
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on an alias
|
|
'
|
|
' This script is designed to be called by an alias: ^teleport(.*)$
|
|
'
|
|
' This alias should have "regular expression" checked.
|
|
'
|
|
' It is for teleporting (going to) a room by number
|
|
'
|
|
' The room is entered by name and looked up in the variables
|
|
' list.
|
|
' ---------------------------------------------------------
|
|
sub OnTeleport (thename, theoutput, thewildcards)
|
|
|
|
dim sDestination
|
|
dim sRoomList
|
|
dim sHelp
|
|
dim iSubscript
|
|
dim iRoom
|
|
|
|
sDestination = Trim (thewildcards (1))
|
|
|
|
' if nothing entered echo possible destinations
|
|
if sDestination = "" then
|
|
world.note "-------- TELEPORT destinations ----------"
|
|
|
|
' find list of all variables
|
|
sRoomList = world.GetVariableList
|
|
|
|
if not IsEmpty (sRoomList) then
|
|
|
|
' loop through each variable, and add to help if it starts with "teleport_"
|
|
for iSubscript = lbound (sRoomList) to ubound (sRoomList)
|
|
if Left (sRoomList (iSubscript), 9) = "teleport_" then
|
|
if sHelp <> "" then
|
|
sHelp = sHelp & ", "
|
|
end if
|
|
sHelp = sHelp & Mid (sRoomList (iSubscript), 10)
|
|
end if ' variable starts with "teleport_"
|
|
next ' loop through sRoomList
|
|
|
|
end if ' having at least one room
|
|
|
|
' if no destinations found, tell them
|
|
if sHelp = "" then
|
|
sHelp = "<no rooms in teleport list>"
|
|
end if ' no destinations found in list
|
|
world.note sHelp
|
|
exit sub
|
|
|
|
end if ' no destination supplied
|
|
|
|
' get contents of the destination variable
|
|
iRoom = world.GetVariable ("teleport_" & lCase (sDestination))
|
|
|
|
' if not found, or invalid name, that isn't in the list
|
|
if IsEmpty (iRoom) or IsNull (iRoom) then
|
|
world.note "******** Destination " & sDestination & " unknown *********"
|
|
exit sub
|
|
end if
|
|
|
|
world.note "------> Teleporting to " & sDestination
|
|
world.send "@teleport #" & cstr (iRoom)
|
|
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on an alias
|
|
'
|
|
' This script is designed to be called by an alias: ADD_TELEPORT * *
|
|
'
|
|
' This alias should NOT have "regular expression" checked.
|
|
'
|
|
' It is for adding a room to the list of rooms to teleport to (by
|
|
' the earlier script).
|
|
'
|
|
' eg. ADD_TELEPORT dungeon 1234
|
|
'
|
|
' ---------------------------------------------------------
|
|
sub OnAddTeleport (thename, theoutput, thewildcards)
|
|
|
|
dim sDestination
|
|
dim iRoom
|
|
dim iStatus
|
|
dim sCurrentLocation
|
|
|
|
' wildcard one is the destination
|
|
sDestination = Trim (thewildcards (1))
|
|
|
|
' if nothing entered tell them command syntax
|
|
if sDestination = "" then
|
|
world.note "Syntax: add_teleport name dbref"
|
|
world.note " eg. add_teleport LandingBay 4421"
|
|
exit sub
|
|
end if
|
|
|
|
' wildcard 2 is the room to go to
|
|
iRoom= Trim (thewildcards (2))
|
|
|
|
if not IsNumeric (iRoom) then
|
|
world.note "Room to teleport to must be a number, you entered: " & iRoom
|
|
exit sub
|
|
end if
|
|
|
|
' add room and destination location to variable list
|
|
iStatus = world.SetVariable ("teleport_" & sDestination, iRoom)
|
|
|
|
if iStatus <> 0 then
|
|
world.note "Room name must be alphabetic, you entered: " & sDestination
|
|
exit sub
|
|
end if
|
|
|
|
world.note "Teleport location " & sDestination & "(#" _
|
|
& iRoom & ") added to teleport list"
|
|
|
|
end sub
|
|
|
|
|
|
' ------------------------------------------
|
|
' Example showing a script called by a timer
|
|
' -------------------------------------------
|
|
sub OnTimer (strTimerName)
|
|
world.note "Timer has fired!"
|
|
end sub
|
|
|
|
|
|
' --------------------------------------------
|
|
' Example showing a script called by a trigger
|
|
' Should be connected to a trigger matching on: <*hp *m *mv>*
|
|
' (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>)
|
|
' it may need to be changed depending on the MUD prompt format).
|
|
' --------------------------------------------
|
|
sub OnStats (strTriggerName, trig_line, arrWildCards)
|
|
|
|
dim iHP
|
|
dim iMana
|
|
dim iMV
|
|
|
|
iHP = arrWildCards (1)
|
|
iMana = arrWildCards (2)
|
|
iMV = arrWildCards (3)
|
|
|
|
world.Note "Your HP are " & iHP
|
|
world.Note "Your Mana is " & iMana
|
|
world.Note "Your movement points are " & iMV
|
|
|
|
end sub
|
|
|
|
' --------------------------------------------
|
|
' Example showing an alias used to test lag
|
|
' Should be connected to an alias matching on: lag
|
|
' --------------------------------------------
|
|
sub OnLagTest (strAliasName, strOutput, arrWildCards)
|
|
World.Send "@pem/silent me=PING: " & now()
|
|
end sub
|
|
|
|
' --------------------------------------------
|
|
' Example showing a trigger used as part of the lag test
|
|
' Should be connected to a trigger matching on: PING: *
|
|
' Set trigger to: Omit from log file, Omit from output
|
|
' --------------------------------------------
|
|
Sub OnPing (strTriggerName, strOutput, arrWildCards)
|
|
Dim CurrentTime, PingTime, Elapsed
|
|
CurrentTime = Now ()
|
|
PingTime = arrWildCards (1)
|
|
Elapsed = DateDiff ("s", PingTime, CurrentTime)
|
|
World.SetStatus "Lag: " & Elapsed & " seconds."
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world connect
|
|
' This script turns logging on for this world.
|
|
' ---------------------------------------------------------
|
|
Sub OnWorldConnectWithLogging
|
|
Dim FileName
|
|
|
|
FileName = Replace (World.Worldname, " ", "") ' Remove spaces from file name
|
|
|
|
' Add other editing here if you have weird characters in your mud names.
|
|
|
|
FileName = FileName & ".txt"
|
|
if World.OpenLog (FileName, True) = eOK then ' true means append to any existing log file
|
|
World.WriteLog "--- Log Opened " & Now () & " ---" ' make note in log file
|
|
World.Note "Opened log file" & FileName ' make note in world window
|
|
end if
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example showing running a script on world disconnect
|
|
' This script turns logging off for this world.
|
|
' ---------------------------------------------------------
|
|
Sub OnWorldDisconnectWithLogging
|
|
|
|
if World.IsLogOpen then
|
|
World.Note "Closing log file" ' note in world window we are closing the log
|
|
World.WriteLog "--- Log Closed " & Now () & " ---" ' note in log file
|
|
World.CloseLog ' close log file
|
|
end if
|
|
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Subroutine to be called to repeat a command.
|
|
'
|
|
' Call from the alias: ^#([0-9]+) (.+)$
|
|
' Regular Expression: checked
|
|
'
|
|
' Example of use: #10 give sword to Trispis
|
|
' This would send "give sword to Trispis" 10 times
|
|
' --------------------------------------------
|
|
Sub OnRepeat (strAliasName, strOutput, arrWildCards)
|
|
Dim i
|
|
For i = 1 to arrWildCards (1)
|
|
World.Send arrWildCards (2)
|
|
next
|
|
End Sub
|
|
|
|
|
|
' --------------------------------------------
|
|
' Subroutine to be called to gag a player
|
|
'
|
|
' Call from the alias: gag *
|
|
' Regular expression: no
|
|
' Label: lblGag
|
|
' Script: OnGag
|
|
'
|
|
' Example of use: gag twink
|
|
'
|
|
' This updates a trigger "lblGag"
|
|
' --------------------------------------------
|
|
Sub OnGag (strAliasName, strOutput, arrWildCards)
|
|
|
|
Dim trMatch
|
|
Dim trResponse
|
|
Dim trFlags
|
|
Dim trColour
|
|
Dim trWildcard
|
|
Dim trSoundfilename
|
|
Dim trScriptname
|
|
Dim iStatus
|
|
|
|
' If trigger already exists, see who it matches on, then delete it
|
|
If world.IsTrigger ("lblGag") = eOK Then
|
|
world.GetTrigger "lblGag", trMatch, trResponse, trFlags, _
|
|
trColour, trWildcard, trSoundfilename, trScriptname
|
|
world.DeleteTrigger "lblGag"
|
|
trMatch = trMatch & "|" ' Separate names by | ("or" symbol)
|
|
End If
|
|
|
|
' Add new person to list of names to match on
|
|
trMatch = trMatch & LCase (Trim (arrWildCards (1))) ' add new name to list
|
|
|
|
' Add our new trigger to trigger list
|
|
world.AddTrigger "lblGag", trMatch, "", _
|
|
eEnabled + eOmitFromLog + eOmitFromOutput + eIgnoreCase + eTriggerRegularExpression, _
|
|
NOCHANGE, 0, "", ""
|
|
|
|
' Tell the user what we did
|
|
world.Note "Added " & arrWildcards (1) & " to list of gags"
|
|
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Example of copying a file in a subroutine
|
|
'
|
|
' This might be used on a "connect" to change your web page to indicate
|
|
' you are connected to a MUD, then use a similar one to copy a different
|
|
' file to indicate you are disconnected.
|
|
' --------------------------------------------
|
|
Sub CopyFile
|
|
Const ForReading = 1
|
|
Const ForWriting = 2
|
|
|
|
Dim fso, tf, contents
|
|
|
|
Set fso = CreateObject("Scripting.FileSystemObject")
|
|
|
|
Set tf = fso.OpenTextFile("c:\file_connected.htm", ForReading)
|
|
contents = tf.ReadAll
|
|
tf.Close
|
|
|
|
Set tf = fso.OpenTextFile("c:\index.htm ", ForWriting, True)
|
|
tf.Write (contents)
|
|
tf.Close
|
|
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Example showing iterating through all worlds
|
|
' --------------------------------------------
|
|
sub ShowWorlds
|
|
|
|
dim mylist
|
|
dim i
|
|
|
|
mylist = world.GetWorldList
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.note mylist (i)
|
|
next
|
|
End If
|
|
|
|
end sub
|
|
|
|
' --------------------------------------------------
|
|
' Example showing sending a message to another world
|
|
' --------------------------------------------------
|
|
|
|
sub SendToWorld (name, message)
|
|
dim otherworld
|
|
|
|
set otherworld = world.getworld (name)
|
|
|
|
if otherworld is nothing then
|
|
world.note "World " + name + " is not open"
|
|
exit sub
|
|
end if
|
|
|
|
otherworld.send message
|
|
|
|
end sub
|
|
|
|
' --------------------------------------------
|
|
' Subroutine to be called remember which way you walked.
|
|
'
|
|
' Call from the alias: keypad-*
|
|
' Send: %1
|
|
'
|
|
' --------------------------------------------
|
|
Sub OnKeypadDirection (strAliasName, strOutput, arrWildCards)
|
|
world.setvariable "direction", arrWildcards (1)
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Trigger to count experience points.
|
|
' Match on: You are awarded * experience points for the battle.
|
|
' --------------------------------------------
|
|
|
|
dim gTotalExperience ' this is a global variable
|
|
gTotalExperience = 0 ' initialise it
|
|
|
|
Sub OnExperience (strTriggerName, strOutput, arrWildCards)
|
|
gTotalExperience = gTotalExperience + arrWildCards (1)
|
|
World.SetStatus "Experience earned is now: " & CStr (gTotalExperience)
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Subroutine to discard the speedwalk queue.
|
|
'
|
|
' Call from the alias: DISCARD
|
|
'
|
|
' --------------------------------------------
|
|
Sub OnDiscardQueue (strAliasName, strOutput, arrWildCards)
|
|
world.discardqueue
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Subroutine to replace one name with another (Name1 with Name2)
|
|
'
|
|
' Call from the trigger:
|
|
'
|
|
' Match on: Name1
|
|
' Send: <nothing>
|
|
' Regular Expression: checked
|
|
' Ignore case: checked
|
|
' Omit from output: checked
|
|
' Omit from log: checked
|
|
' Label: NameChange
|
|
' Script: OnNameChange
|
|
'
|
|
' --------------------------------------------
|
|
sub OnNameChange (strTriggerName, trig_line, arrWildCards)
|
|
dim strChangedLine
|
|
|
|
strChangedLine = world.Replace (trig_line, "Name1", "Name2", true)
|
|
strChangedLine = world.Replace (strChangedLine, "name1", "Name2", true)
|
|
world.note strChangedLine
|
|
world.writelog strChangedLine
|
|
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' Alias to gag players automatically
|
|
'
|
|
' Call from the alias: GAG *
|
|
'
|
|
' eg. GAG twerp
|
|
'
|
|
' It maintains a list of gagged players in the
|
|
' variable "gaglist" (which you can edit in the
|
|
' world configuration screen if you need)
|
|
'
|
|
' You may need to change the text of the trigger
|
|
' match slightly. (eg. add "tells")
|
|
'
|
|
' --------------------------------------------
|
|
|
|
sub OnGag (thename, theoutput, thewildcards)
|
|
dim sName
|
|
dim sList
|
|
dim flags
|
|
|
|
sName = Trim (thewildcards (1))
|
|
|
|
' do nothing if no name
|
|
if sName = "" then exit sub
|
|
|
|
' get existing list
|
|
sList = world.GetVariable ("gaglist")
|
|
|
|
' if empty create new one, otherwise add to end
|
|
if IsEmpty (sList) then
|
|
sList = sName
|
|
else
|
|
slist = sList + "|" + sName
|
|
end if
|
|
|
|
' remember gag list for next time
|
|
world.SetVariable "gaglist", sList
|
|
|
|
' addtrigger flags
|
|
' 1 = enabled
|
|
' 2 = omit from log file
|
|
' 4 = omit from output
|
|
' 16 = ignore case
|
|
' 32 = regular expression
|
|
' 1024 = replace existing trigger of same name
|
|
|
|
flags = 1 + 2 + 4 + 16 + 32 + 1024
|
|
|
|
World.addtrigger "gag", "^(" + sList + ") (says|pages)", _
|
|
"", flags, -1, 0, "", ""
|
|
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' ShowOptions
|
|
'
|
|
' Lists options set in MUSHclient.
|
|
'
|
|
' Type: /ShowOptions
|
|
'
|
|
' To change an option do something like this:
|
|
'
|
|
' /world.setoption "max_output_lines", 2000
|
|
' /world.setoption "mud_can_remove_underline", 1
|
|
'
|
|
' --------------------------------------------
|
|
|
|
sub ShowOptions
|
|
dim mylist
|
|
dim i
|
|
|
|
mylist = world.GetOptionList
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.note mylist (i) + " = " + cstr (world.GetOption ( mylist (i)))
|
|
next
|
|
End If
|
|
End Sub
|
|
|
|
' --------------------------------------------
|
|
' MXP callbacks
|
|
' --------------------------------------------
|
|
|
|
' --------------------------------------------
|
|
' MXP startup
|
|
'
|
|
' Called when MXP is activated.
|
|
' --------------------------------------------
|
|
|
|
sub OnMXPStartUp
|
|
world.note "MXP started up"
|
|
end sub
|
|
|
|
' --------------------------------------------
|
|
' MXP shutdown
|
|
'
|
|
' Called when MXP is deactivated.
|
|
' --------------------------------------------
|
|
|
|
sub OnMXPShutDown
|
|
world.note "MXP shut down"
|
|
end sub
|
|
|
|
|
|
' --------------------------------------------
|
|
' Errors/warnings/information/messages
|
|
'
|
|
' Called by MXP when there is an error or warning etc.
|
|
'
|
|
' Level is:
|
|
' E - error
|
|
' W - warning
|
|
' I - information
|
|
' A - all other
|
|
'
|
|
' Number is the error number (see forum for details)
|
|
'
|
|
' Line is the line number in the output window
|
|
'
|
|
' Message is the text of the message
|
|
'
|
|
' Return true to suppress the message from appearing in
|
|
' the MXP debug window, false to allow it to appear.
|
|
' --------------------------------------------
|
|
|
|
function OnMXPError (level, number, line, message)
|
|
|
|
' display warnings and errors in the output window
|
|
if level = "W" or level = "E" then
|
|
world.NoteColourName "white", "red"
|
|
world.Note level + "(" + cstr (number) + ")[ " + cstr(line) + "]: " + message
|
|
end if
|
|
|
|
' suppress error number 20001 from the debug window
|
|
if number = 20001 then OnMXPError = true
|
|
|
|
end function
|
|
|
|
' --------------------------------------------
|
|
' MXP start tag
|
|
'
|
|
' Called when a server-defined, or built-in tag is encountered
|
|
' (eg. <color fore=red back=blue> )
|
|
'
|
|
' Name is tag name (lowercase), eg. "font"
|
|
'
|
|
' Args is the argument list (eg. "fore=red back=blue")
|
|
'
|
|
' Mylist is the argument list, parsed into an array, eg.
|
|
' Array item 0 : fore=red
|
|
' Array item 1 : back=blue
|
|
'
|
|
' Unnamed arguments are preceded by an argument number.
|
|
' eg. <color red blue> would give:
|
|
'
|
|
' Array item 0 : 1=red
|
|
' Array item 1 : 2=blue
|
|
'
|
|
'
|
|
' Return true to suppress the tag from having an effect
|
|
' otherwise return false to allow it to act.
|
|
' --------------------------------------------
|
|
function OnMXPStartTag (name, args, mylist)
|
|
|
|
dim i
|
|
|
|
world.AppendToNotepad "MXP", "Opening tag: " + name + vbCRLF
|
|
|
|
if not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
world.AppendToNotepad "MXP", "Arg " + cstr (i) + " = " + mylist (i) + vbCRLF
|
|
next
|
|
End If
|
|
|
|
' ignore tag <rdesc>
|
|
if name = "rdesc" then OnMXPStartTag = true
|
|
|
|
end function
|
|
|
|
' --------------------------------------------
|
|
' MXP set variable
|
|
'
|
|
' This is called when MXP sets a variable.
|
|
'
|
|
' Name - variable name (always preceded by "mxp_")
|
|
' Contents - what it is being set to.
|
|
' --------------------------------------------
|
|
sub OnMXPvariable (name, contents)
|
|
world.note "Var " + name + " set to " + contents
|
|
end sub
|
|
|
|
' --------------------------------------------
|
|
' MXP end tag
|
|
'
|
|
' This is called when an MXP end tag is processed
|
|
' (eg. </color>
|
|
'
|
|
' Name - tag name (lowercase) (eg. "color")
|
|
' Text - text between start and end tag
|
|
' eg. <send>Go West</send>
|
|
' When the </send> is received Text will be "Go West"
|
|
'
|
|
' --------------------------------------------
|
|
sub OnMXPEndTag (name, text)
|
|
world.AppendToNotepad "MXP", "Closing tag: " + name + vbCRLF
|
|
end sub
|
|
|
|
' ---------------------------------------------------------
|
|
'
|
|
' See if memberName is in listName
|
|
'
|
|
' eg. if IsMember ("spell_list", "fiery blast") then
|
|
' ... do something ...
|
|
'
|
|
'
|
|
' ---------------------------------------------------------
|
|
Function IsMember (listName, memberName)
|
|
dim ListContents
|
|
dim theList
|
|
dim WantedMember
|
|
dim i
|
|
|
|
' Default to not found
|
|
IsMember = False
|
|
|
|
' Fix up member to remove surrounding spaces and make lower case
|
|
WantedMember = Trim (LCase (memberName))
|
|
|
|
' Can't find blank items
|
|
If WantedMember = "" Then
|
|
Exit Function
|
|
End If
|
|
|
|
' Get list
|
|
ListContents = World.GetVariable (listName)
|
|
|
|
' If no list, the member can't be in it
|
|
If IsEmpty (ListContents) or IsNull (ListContents) then
|
|
Exit Function
|
|
End If
|
|
|
|
' Split list at commas
|
|
theList = split (ListContents, ",")
|
|
|
|
' Loop through list, seeing if wanted member is in it
|
|
If Not IsEmpty (theList) then
|
|
For i = lbound (theList) to ubound (theList)
|
|
If theList (i) = WantedMember then
|
|
IsMember = True
|
|
Exit Function
|
|
End If ' end of found it
|
|
Next ' end of loop
|
|
End If ' end of any items in list
|
|
|
|
End Function
|
|
|
|
' ---------------------------------------------------------
|
|
'
|
|
' Add memberName to listName
|
|
'
|
|
' eg. AddItem "spell_list", "fiery blast"
|
|
'
|
|
' Note - it is up to you to test if the item is already
|
|
' in the list (using IsMember) or it will be added
|
|
' twice.
|
|
'
|
|
'
|
|
' ---------------------------------------------------------
|
|
Sub AddItem (listName, memberName)
|
|
dim ListContents
|
|
dim theList
|
|
dim NewMember
|
|
dim i
|
|
|
|
' Get existing list
|
|
ListContents = World.GetVariable (listName)
|
|
|
|
' Make sure new member is lower case with no spaces around it
|
|
NewMember = Trim (LCase (memberName))
|
|
|
|
' Don't add blank items
|
|
If NewMember = "" Then
|
|
Exit Sub
|
|
End If
|
|
|
|
' Need comma after previous member, if any
|
|
If ListContents <> "" Then
|
|
ListContents = ListContents & ","
|
|
End If
|
|
|
|
' Add new item
|
|
ListContents = ListContents & NewMember
|
|
|
|
World.SetVariable listName, ListContents
|
|
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
'
|
|
' Delete memberName from listName
|
|
'
|
|
' eg. DeleteItem "spell_list", "fiery blast"
|
|
'
|
|
'
|
|
' ---------------------------------------------------------
|
|
Sub DeleteItem (listName, memberName)
|
|
dim ListContents
|
|
dim theList
|
|
dim WantedMember
|
|
dim i
|
|
dim NewContents
|
|
|
|
' Fix up member to remove surrounding spaces and make lower case
|
|
WantedMember = Trim (LCase (memberName))
|
|
|
|
' Can't delete blank items
|
|
If WantedMember = "" Then
|
|
Exit Sub
|
|
End If
|
|
|
|
' Get list
|
|
ListContents = World.GetVariable (listName)
|
|
|
|
' If no list, the member can't be in it
|
|
If IsEmpty (ListContents) or IsNull (ListContents) then
|
|
Exit Sub
|
|
End If
|
|
|
|
' Split list at commas
|
|
theList = split (ListContents, ",")
|
|
|
|
' New contents are empty now
|
|
NewContents = ""
|
|
|
|
' Loop through list, copying across all but delete item
|
|
If Not IsEmpty (theList) then
|
|
For i = lbound (theList) to ubound (theList)
|
|
If theList (i) <> WantedMember then
|
|
If NewContents <> "" Then
|
|
NewContents = NewContents & ","
|
|
End If
|
|
NewContents = NewContents & theList (i)
|
|
End If ' end of not deleted item
|
|
Next ' end of loop
|
|
End If ' end of any items in list
|
|
|
|
' Store new list contents
|
|
World.SetVariable listName, NewContents
|
|
|
|
End Sub
|
|
|
|
|
|
' ---------------------------------------------------------
|
|
'
|
|
' Delete the entire list called listName
|
|
'
|
|
' eg. DeleteList "spell_list"
|
|
'
|
|
'
|
|
' ---------------------------------------------------------
|
|
Sub DeleteList (listName)
|
|
|
|
World.DeleteVariable listName
|
|
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example of opening another world from an alias.
|
|
'
|
|
' Alias: openworld *
|
|
' Label: OpenWorld
|
|
' Script: OpenWorld
|
|
' ---------------------------------------------------------
|
|
Sub OpenWorld (thename, theoutput, thewildcards)
|
|
dim otherworld
|
|
dim filename
|
|
|
|
filename = "worlds\" & thewildcards (1) & ".mcl"
|
|
set otherworld = world.open (filename)
|
|
|
|
if otherworld is nothing then
|
|
world.note "Could not open world file " & filename
|
|
else
|
|
otherworld.activate
|
|
end if
|
|
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example of toggling from one world to the next
|
|
'
|
|
' Alias: toggle
|
|
' Label: ToggleWorld
|
|
' Script: ToggleWorld
|
|
' ---------------------------------------------------------
|
|
Sub ToggleWorld (thename, theoutput, thewildcards)
|
|
dim mylist
|
|
dim i
|
|
dim thisworld
|
|
dim otherworld
|
|
|
|
thisworld = 0
|
|
|
|
' get list of worlds
|
|
mylist = world.GetWorldList
|
|
|
|
' find which world we are
|
|
If not IsEmpty (mylist) then
|
|
for i = lbound (mylist) to ubound (mylist)
|
|
If world.WorldName = mylist (i) then
|
|
thisworld = i
|
|
End If
|
|
next
|
|
End If
|
|
|
|
' find next world, wrap around at end of list
|
|
if thisworld = ubound (mylist) then
|
|
thisworld = 0
|
|
else
|
|
thisworld = thisworld + 1
|
|
End If
|
|
|
|
' get reference to next world
|
|
set otherworld = world.GetWorld (mylist (thisworld))
|
|
|
|
' activate it
|
|
If not (otherworld is nothing) then
|
|
otherworld.activate
|
|
End If
|
|
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Example of going to another world
|
|
'
|
|
' Alias: world *
|
|
' Label: GoToWorld
|
|
' Script: GoToWorld
|
|
' ---------------------------------------------------------
|
|
Sub GoToWorld (thename, theoutput, thewildcards)
|
|
dim mylist
|
|
dim i
|
|
dim otherworld
|
|
|
|
' get list of worlds
|
|
mylist = world.GetWorldList
|
|
|
|
i = cint (thewildcards (1))
|
|
|
|
if i < 0 or i > ubound (mylist) then
|
|
world.note "You do not have a world number " & i
|
|
exit sub
|
|
End If
|
|
|
|
' get reference to next world
|
|
set otherworld = world.GetWorld (mylist (i))
|
|
|
|
' activate it
|
|
If not (otherworld is nothing) then
|
|
otherworld.activate
|
|
End If
|
|
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Alias to enable all triggers
|
|
'
|
|
' Alias: enable_triggers
|
|
' Label: EnableTriggers
|
|
' Script: EnableTriggers
|
|
' ---------------------------------------------------------
|
|
|
|
Sub EnableTriggers (thename, theoutput, thewildcards)
|
|
world.setoption "enable_triggers", 1
|
|
End Sub
|
|
|
|
' ---------------------------------------------------------
|
|
' Alias to disable all triggers
|
|
'
|
|
' Alias: disable_triggers
|
|
' Label: DisableTriggers
|
|
' Script: DisableTriggers
|
|
' ---------------------------------------------------------
|
|
|
|
Sub DisableTriggers (thename, theoutput, thewildcards)
|
|
world.setoption "enable_triggers", 0
|
|
End Sub
|
|
|
|
world.note "Scripting enabled - script file processed"
|
|
|