Timer Triggers (Help needed for version 2)

Posted by Valhart on Sat 04 Aug 2001 11:34 AM — 4 posts, 17,818 views.

#0
Current script is as follow:


sub OnSpell (strTriggerName, strTriggerLine, aryWildcards)
dim chant
dim spellname
dim minutes

  ' spell chant was from previous trigger
  chant = world.GetVariable ("LastSpellName")

  ' work out spell duration based on chant
  Select Case chant
      Case "Voluntas ferrum!"
           minutes = 15
           spellname = "IW"
      Case "Voluntas movimas!"
	   minutes = 16
	   spellname = "PfH"
      Case "Rubber"
           minutes = 4
           spellname = "MiPR"
      Case "Major kretsz rex xero"
           minutes = 4
           spellname = "MaPR"
      Case "Air"
	   minutes = 4
	   spellname = "MiXR"
      Case "Major lossa aiir"
	   minutes = 4
	   spellname = "MaXR"
      Case "Flesh and Blood"
	   minutes = 4
	   spellname = "MiHR"
      Case "grrrwm grrrwm"
	   minutes = 4
	   spellname = "MaHR"
      Case Else
           minutes = 0
           spellname = "Unknown spell"
  End Select

  call NewSpell (spellname, aryWildcards (1), minutes)
end sub

sub NewSpell (spellname, target, minutes)

dim number

' get a unique number

  number = world.GetUniqueNumber

' Flags: 
'    1 = enabled
'    4 = one shot (once only)
' 1024 = replace any of same name

' add a timer to go off after the appropriate time

  world.AddTimer "SpellTimer_" & number, 0, minutes - 1, 30, "",  _
                 1 + 4 + 1024,  "OnSpellTimer"

' remember when the spell expires, the target and the spell name
   
  world.setvariable "SpellTimer_Time_" & number, _ 
DateAdd ("n", minutes, Now)
  world.setvariable "SpellTimer_Name_" & number, target
  world.setvariable "SpellTimer_Spellname_" & number, spellname

end sub

sub OnSpellTimer (strTimerName)
dim splitname
dim spellname
dim mylist
dim number
dim i
dim character

splitname = split (strTimerName, "_")

number = CInt (splitname (1))  ' find our unique number

mylist = world.GetVariableList

' scan variables list to find timer number

if not IsEmpty (mylist) then
  for i = lbound (mylist) to ubound (mylist)
    splitname = split (mylist (i), "_")
    if ubound (splitname) = 2 then
      if splitname (0) = "spelltimer" and splitname (1) = "name" then
        if CInt (splitname (2)) = number then
          ' work out character name
          character = world.GetVariable (mylist (i))
          spellname = world.GetVariable _ 
              (splitname (0) & "_SpellName_" & splitname (2))
          ' tell them time is up
          world.send "party say " & spellname & " spell on " _
                     & character & ", left 30 seconds (DANGER)"
          ' delete associated variables
          world.deletevariable splitname (0) & "_Name_" & splitname (2)
          world.deletevariable splitname (0) & "_Time_" & splitname (2)
          world.deletevariable splitname (0) & "_SpellName_" & splitname (2)
                end if
      end if  ' found a spelltimer variable
    end if    ' split into 3 pieces
  next        ' end of loop
End If        ' have any variables

end sub

sub OnSpellQuery (thename, theoutput, thewildcards)
dim mylist
dim i
dim splitname
dim spellname
dim endtime
dim timeleft
dim character

mylist = world.GetVariableList


if not IsEmpty (mylist) then
  for i = lbound (mylist) to ubound (mylist)
    splitname = split (mylist (i), "_")
    if ubound (splitname) = 2 then
      if splitname (0) = "spelltimer" and splitname (1) = "name" then
         endtime = CDate (world.GetVariable _
                           (splitname (0) & "_Time_" & splitname (2)))
         spellname = world.GetVariable _ 
             (splitname (0) & "_SpellName_" & splitname (2))
         character = world.GetVariable (mylist (i))
         timeleft = DateDiff("s", Now, endtime)
	 if timeleft > 0 then
           world.send "party say " & spellname & " spell on " _
                      & character & ", left " _
                      & timeleft & " seconds (TIMER)"
         end if  
      end if  ' found a spelltimer variable
    end if    ' split into 3 pieces
  next        ' end of loop
End If        ' have any variables

end sub



Requirements:

I am looking forward to do a OnSpellQuery that lets me use a command of report X, where X is the alias 'spellname' to report. It's really too spamming when i used over four spells on a target and i want to see the time remaining. ^_^

If by doing the method above, how do I go about doing a report where which spell is up, which spell is not. (I am getting the hang of it but I am still greenhorn)

Sorry for the trouble I caused and really hope that I will have a good nifty script to call upon. Many thanks!
Australia Forum Administrator #1
You would just change it slightly to test for the spell name which you pass down as a wildcard to the alias. eg. the alias could be:


Match on: Report *


That * will be passed down as wildcard 1, so just change as shown in bold:



sub OnSpellQuery (thename, theoutput, thewildcards)
dim mylist
dim i
dim splitname
dim spellname
dim endtime
dim timeleft
dim character

mylist = world.GetVariableList


if not IsEmpty (mylist) then
  for i = lbound (mylist) to ubound (mylist)
    splitname = split (mylist (i), "_")
    if ubound (splitname) = 2 then
      if splitname (0) = "spelltimer" and splitname (1) = "name" then
         endtime = CDate (world.GetVariable _
                           (splitname (0) & "_Time_" & splitname (2)))
         spellname = world.GetVariable _ 
             (splitname (0) & "_SpellName_" & splitname (2))
         if spellname = thewildcards (1) then
           character = world.GetVariable (mylist (i))
           timeleft = DateDiff("s", Now, endtime)
           if timeleft > 0 then
             world.send "party say " & spellname & " spell on " _
                        & character & ", left " _
                        & timeleft & " seconds (TIMER)"
            end if  
        end if
      end if  ' found a spelltimer variable
    end if    ' split into 3 pieces
  next        ' end of loop
End If        ' have any variables

end sub




As for reporting on whether the spell is still going, when the timer fires the variables are deleted, so it only ever reports on spells that are still active.
Amended on Sat 04 Aug 2001 10:27 PM by Nick Gammon
#2
funny that when using this new script, i lost the ability to call all spells and duration on all spells, what happen? Can I have a spell timer that report one spell and one on all queries with two different alias and how do I initiate a trigger to respond to another players like

Admonius says, 'Report IW.'

Valhart (party say): IW spell on Admonius, left XX seconds (Timer)

Thanks for the help again. ^_^
Amended on Sun 05 Aug 2001 04:30 AM by Valhart
Australia Forum Administrator #3
Well, you could change the line I added to read something like this:


if spellname = thewildcards (1) or thewildcards (1) = "all" then


Then just say: report all

To tell the other players you could make a trigger like this:


Match on: Admonius says, 'Report *'
Label: PlayerReport
Script: OnSpellQuery


... and change "world.note" to "world.send" and add the word "say" in front of the message.