# Example of coding script routines for MUSHclient in PerlScript # ---------------------------------------------------------- # Error codes returned by various functions # ---------------------------------------------------------- my $eOK = 0; # No error my $eWorldOpen = 30001; # The world is already open my $eWorldClosed = 30002; # The world is closed, this action cannot be performed my $eNoNameSpecified = 30003; # No name has been specified where one is required my $eCannotPlaySound = 30004; # The sound file could not be played my $eTriggerNotFound = 30005; # The specified trigger name does not exist my $eTriggerAlreadyExists = 30006; # Attempt to add a trigger that already exists my $eTriggerCannotBeEmpty = 30007; # The trigger "match" string cannot be empty my $eInvalidObjectLabel = 30008; # The name of this object is invalid my $eScriptNameNotLocated = 30009; # Script name is not in the script file my $eAliasNotFound = 30010; # The specified alias name does not exist my $eAliasAlreadyExists = 30011; # Attempt to add a alias that already exists my $eAliasCannotBeEmpty = 30012; # The alias "match" string cannot be empty my $eCouldNotOpenFile = 30013; # Unable to open requested file my $eLogFileNotOpen = 30014; # Log file was not open my $eLogFileAlreadyOpen = 30015; # Log file was already open my $eLogFileBadWrite = 30016; # Bad write to log file my $eTimerNotFound = 30017; # The specified timer name does not exist my $eTimerAlreadyExists = 30018; # Attempt to add a timer that already exists my $eVariableNotFound = 30019; # Attempt to delete a variable that does not exist my $eCommandNotEmpty = 30020; # Attempt to use SetCommand with a non-empty command window my $eBadRegularExpression = 30021; # Bad regular expression syntax my $eTimeInvalid = 30022; # Time given to AddTimer is invalid my $eBadMapItem = 30023; # Direction given to AddToMapper is invalid my $eNoMapItems = 30024; # No items in mapper my $eUnknownOption = 30025; # Option name not found my $eOptionOutOfRange = 30026; # New value for option is out of range my $eTriggerSequenceOutOfRange = 30027; # Trigger sequence value invalid my $eTriggerSendToInvalid = 30028; # Where to send trigger text to is invalid my $eTriggerLabelNotSpecified = 30029; # Trigger label not specified/invalid for 'send to variable' my $ePluginFileNotFound = 30030; # File name specified for plugin not found my $eProblemsLoadingPlugin = 30031; # There was a parsing or other problem loading the plugin my $ePluginCannotSetOption = 30032; # Plugin is not allowed to set this option my $ePluginCannotGetOption = 30033; # Plugin is not allowed to get this option my $eNoSuchPlugin = 30034; # Requested plugin is not installed my $eNotAPlugin = 30035; # Only a plugin can do this my $eNoSuchRoutine = 30036; # Plugin does not support that subroutine (subroutine not in script) my $ePluginDoesNotSaveState = 30037; # Plugin does not support saving state my $ePluginCouldNotSaveState = 30037; # Plugin could not save state (eg. no state directory) my $ePluginDisabled = 30039; # Plugin is currently disabled my $eErrorCallingPluginRoutine = 30040; # Could not call plugin routine my $eCommandsNestedTooDeeply = 30041; # Calls to "Execute" nested too deeply my $eCannotCreateChatSocket = 30042; # Unable to create socket for chat connection my $eCannotLookupDomainName = 30043; # Unable to do DNS (domain name) lookup for chat connection my $eNoChatConnections = 30044; # No chat connections open my $eChatPersonNotFound = 30045; # Requested chat person not connected my $eBadParameter = 30046; # General problem with a parameter to a script call my $eChatAlreadyListening = 30047; # Already listening for incoming chats my $eChatIDNotFound = 30048; # Chat session with that ID not found my $eChatAlreadyConnected = 30049; # Already connected to that server/port my $eClipboardEmpty = 30050; # Cannot get (text from the) clipboard my $eFileNotFound = 30051; # Cannot open the specified file my $eAlreadyTransferringFile = 30052; # Already transferring a file my $eNotTransferringFile = 30053; # Not transferring a file my $eNoSuchCommand = 30054; # There is not a command of that name my $eArrayAlreadyExists = 30055; # That array already exists my $eBadKeyName = 30056; # That name is not permitted for a key my $eArrayDoesNotExist = 30056; # That array does not exist my $eArrayNotEvenNumberOfValues = 30057; # Values to be imported into array are not in pairs my $eImportedWithDuplicates = 30058; # Import succeeded, however some values were overwritten my $eBadDelimiter = 30059; # Import/export delimiter must be a single character, other than backslash my $eSetReplacingExistingValue = 30060; # Array element set, existing value overwritten my $eKeyDoesNotExist = 30061; # Array key does not exist my $eCannotImport = 30062; # Cannot import because cannot find unused temporary character # ---------------------------------------------------------- # Flags for AddTrigger # ---------------------------------------------------------- my $eEnabled = 1; # enable trigger my $eOmitFromLog = 2; # omit from log file my $eOmitFromOutput = 4; # omit trigger from output my $eKeepEvaluating = 8; # keep evaluating my $eIgnoreCase = 16; # ignore case when matching my $eTriggerRegularExpression = 32; # trigger uses regular expression my $eExpandVariables = 512; # expand variables like @direction my $eReplace = 1024; # replace existing trigger of same name my $eTemporary = 16384; # temporary - do not save to world file # ---------------------------------------------------------- # Colours for AddTrigger # ---------------------------------------------------------- my $NOCHANGE = -1; my $custom1 = 0; my $custom2 = 1; my $custom3 = 2; my $custom4 = 3; my $custom5 = 4; my $custom6 = 5; my $custom7 = 6; my $custom8 = 7; my $custom9 = 8; my $custom10 = 9; my $custom11 = 10; my $custom12 = 11; my $custom13 = 12; my $custom14 = 13; my $custom15 = 14; my $custom16 = 15; # ---------------------------------------------------------- # Flags for AddAlias # ---------------------------------------------------------- # my $eEnabled = 1; # same as for AddTrigger my $eIgnoreAliasCase = 32; # ignore case when matching my $eOmitFromLogFile = 64; # omit this alias from the log file my $eAliasRegularExpression = 128; # alias is regular expressions # my $eExpandVariables = 512; # same as for AddTrigger # my $eReplace = 1024; # same as for AddTrigger my $eAliasSpeedWalk = 2048; # interpret send string as a speed walk string my $eAliasQueue = 4096; # queue this alias for sending at the speedwalking delay interval my $eAliasMenu = 8192; # this alias appears on the alias menu my $eTemporary = 16384; # temporary - do not save to world file # ---------------------------------------------------------- # Flags for AddTimer # ---------------------------------------------------------- # my $eEnabled = 1; # same as for AddTrigger my $eAtTime = 2; # if not set, time is "every" my $eOneShot = 4; # if set, timer only fires once my $eTimerSpeedWalk = 8; # timer does a speed walk when it fires my $eTimerNote = 16; # timer does a world.note when it fires my $eActiveWhenClosed = 32; # timer fires even when world is disconnected # my $eReplace = 1024; # same as for AddTrigger # my $eTemporary = 16384; # same as for AddTrigger # ---------------------------------------------------------- # Example showing iterating through all triggers with labels # ---------------------------------------------------------- sub showtriggers { foreach $item (Win32::OLE::in ($world->GetTriggerList)) { $world->note($item); } } # end of showtriggers # ----------------------------------------------- # Example showing iterating through all variables # ------------------------------------------------ sub showvariables { foreach $item (Win32::OLE::in ($world->GetVariableList)) { ($key, $value) = ($item, $world->GetVariable ($item)); $world->note($key . " = " . $value) if (defined ($key)); } } # end of showvariables # ---------------------------------------------------------- # Example showing iterating through all aliases with labels # ---------------------------------------------------------- sub showaliases { foreach $item (Win32::OLE::in ($world->GetAliasList)) { $world->note($item); } } # end of showaliases # --------------------------------------------------------- # Example showing running a script on world open # --------------------------------------------------------- sub OnWorldOpen { $world->note ("---------- World Open ------------"); } # end of OnWorldOpen # --------------------------------------------------------- # Example showing running a script on world close # --------------------------------------------------------- sub OnWorldClose { $world->note ("---------- World Close ------------"); } # end of OnWorldClose # --------------------------------------------------------- # Example showing running a script on world connect # --------------------------------------------------------- sub OnWorldConnect { $world->note ("---------- World Connect ------------"); } # end of OnWorldConnect # --------------------------------------------------------- # Example showing running a script on world disconnect # --------------------------------------------------------- sub OnWorldDisconnect { $world->note ("---------- World Disconnect ------------"); } # end of OnWorldDisconnect # --------------------------------------------------------- # 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 { my ($thename, $theoutput, $wildcards) = @_; $sDestination = $world->trim ($world->GetAliasInfo ($thename, 101)); # if nothing entered echo possible destinations if ($sDestination eq "") { $world->note ("-------- TELEPORT destinations ----------"); foreach $item (Win32::OLE::in ($world->GetVariableList())) { ($key, $value) = ($item, $world->GetVariable ($item)); if (substr ($key, 0, 9) eq "teleport_") { $sHelp .= ", " if ($sHelp ne ""); $sHelp .= substr ($key, 9); } } # if no destinations found, tell them $sHelp = "" if ($sHelp eq ""); $world->note ($sHelp); return; } # no destination supplied # get contents of the destination variable $iRoom = $world->GetVariable ("teleport_" . lc ($sDestination)); # if not found, or invalid name, that isn't in the list if (!defined ($iRoom)) { $world->note ("******** Destination $sDestination unknown *********"); return; } $world->note ("------> Teleporting to $sDestination"); $world->send ("\@teleport #$iRoom"); } # end of OnTeleport # --------------------------------------------------------- # Example showing running a script on an alias # # This script is designed to be called by an alias: ^add_teleport(|\s*(\w*)\s*(\d*))$ # # This alias SHOULD 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 { my ($thename, $theoutput, $wildcards) = @_; # wildcard 2 is the room name $sDestination = $world->trim ($world->GetAliasInfo ($thename, 102)); # if nothing entered tell them command syntax if ($sDestination eq "") { $world->note ("Syntax: add_teleport name dbref"); $world->note (" eg. add_teleport LandingBay 4421"); return; } # wildcard 3 is where to go to $iRoom = $world->trim ($world->GetAliasInfo ($thename, 103)); # add room and destination location to variable list $iStatus = $world->SetVariable ("teleport_$sDestination", $iRoom); if ($iStatus != 0) { $world->note ("Room name must be alphabetic, you entered: $sDestination"); return; } $world->note ("Teleport location $sDestination (#$iRoom) added to teleport list"); } # end of OnAddTeleport # ------------------------------------------ # Example showing a script called by a timer # ------------------------------------------- sub OnTimer { my ($strTimerName) = @_; $world->note ("Timer $strTimerName has fired!"); } # end of OnTimer # -------------------------------------------- # 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 { my ($strTriggerName, $trig_line, $wildcards) = @_; $iHP = $world->GetTriggerInfo ($strTriggerName, 101); $iMana = $world->GetTriggerInfo ($strTriggerName, 102); $iMV = $world->GetTriggerInfo ($strTriggerName, 103); $world->Note ("Your HP are $iHP"); $world->Note ("Your Mana is $iMana"); $world->Note ("Your movement points are $iMV"); } # end of OnStats # -------------------------------------------- # Subroutine to be called to repeat a command. # # Call from the alias: ^#(\d+)\s+(.+)$ # Regular Expression: checked # # Example of use: #10 give sword to Trispis # This would send "give sword to Trispis" 10 times # -------------------------------------------- sub OnRepeat { my ($thename, $theoutput, $wildcards) = @_; $iCount = $world->GetAliasInfo ($thename, 101); # count of times $iCommand = $world->GetAliasInfo ($thename, 102); # what to send for ($i = 1; $i <= $iCount; $i++) { $world->Send ($iCommand); } } # end of OnRepeat # -------------------------------------------- # Example showing iterating through all worlds # -------------------------------------------- sub showworlds { foreach $item (Win32::OLE::in ($world->GetWorldList)) { $world->note($item); } } # end of showworlds # -------------------------------------------------- # Example showing sending a message to another world # -------------------------------------------------- sub SendToWorld { my ($name, $message) = @_; my $otherworld; $otherworld = $world->getworld ($name); if (!defined ($otherworld)) { $world->note("World " . $name . " is not open"); return; } $otherworld->send($message); } # -------------------------------------------- # Example trigger routine that just shows what was passed to it # -------------------------------------------- sub ExampleTrigger { my ($thename, $theoutput, @$wildcards) = @_; $world->note ("Trigger " . $thename . " fired."); $world->note ("Matching line was: " . $theoutput); for ($i = 1; $i <= 10; $i++) { $wildcard = $world->GetTriggerInfo ($thename, 100 + $i); $world->note ("Wildcard $i = $wildcard"); } } # -------------------------------------------- # Subroutine to be called remember which way you walked. # # Call from the alias: keypad-* # Send: %1 # # -------------------------------------------- sub OnKeypadDirection { my ($thename, $theoutput, $wildcards) = @_; $Direction = $world->GetAliasInfo ($thename, 101); $world->setvariable("direction", $Direction); } $world->note ("Scripting enabled - script file processed");