annuncio

Comprimi
Ancora nessun annuncio.

[EasyUO] UO Command Server

Comprimi
X
 
  • Filtro
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • [EasyUO] UO Command Server

    Ho scritto questo script per un numero infinito di ragioni che non sto qui ad elencare. Tra le altre (e vi assicuro che ce ne sono molte, prima fra tutte il fatto ke, giocando in emulazione da linux, molte opzioni di razor non funzionano) c'era la necessità di liberare un pò di spazio fra le hotkey della mia tastiera. Non pensavo che questo script si rivelasse COSI' utile... ora non posso più farne a meno...

    Ecco l'idea: scrivendo una frase in uo (come se si parlasse normalmente), questa verrà analizzata dallo script, che poi richiamerà una sub con lo stesso nome, se esiste. Tutte le frasi di comando devono cominciare con un punto (.), per distinguerle dal parlato normale.
    Troppo complesso? Ecco degli esempi per farvi intuire le potenzialità dello script:

    - Si potrebbe collegare al comando ".food" la spell create food, a ".lich" la spell lich form, perfino ".night" a nightside! Io ho mappato un sacco di incantesimi per i quali preferivo risparmiarmi hotkeys (tutte le magie di evocazione, tutte quelle di morph, diverse di utilità, alcune di "cura intelligente", nonkè un sacco di combo tipo exploflame, anche se lo script nn è proprio l'ideale in pvp per via di piccoli delay...)
    - Si potrebbero collegare a diversi comandi tutti vari gump di UO. Ad esempio: ".paperdoll" (apre il paperdoll), ".backpack" (apre il backpack), ".journal" (apre il journal), eccetera.
    - Si potrebbe collegare a ".lumberscorna" lo script di lumberscorna (occorrono piccole modifiche a lumberscorna stesso, ma nulla di eccezionale). Similmente si può impostare ".minerscorna".
    - Si potrebbe collegare ".recall 10" a "recall alla decima runa del runebook", se sapete come scriptarlo, o se avete già uno script che lo fa (notare come lo script interpreti correttamente anche il passaggio di argomenti alle sub).

    Insomma, non c'è davvero limite a ciò che ci si può inventare! Se sapete scriptare anche solo un pochettino, apprezzerete moltissimo questo script! Chi, invece, non sa scriptare, troverà estremamente semplice fare del buon sano "copia e incolla".

    Ecco come funziona.
    Lo script si divide in due parti:
    - CommandServer.txt: fa tutto il "lavoro sporco" dietro le quinte. E' il file che dovete avviare da EasyUO per far funzionare la magia.
    - Commands.txt: contiene tutte le sub da collegare al parlato di UO.
    Entrambi i file vanno scaricati nella cartella di EasyUO.

    Supponiamo, ad esempio, di voler collegare create food al comando ".food". Inseriamo il seguente codice in un punto qualsiasi del file "Commands.txt":
    codice:
    sub food ; Il nome della sub va scritto senza il punto - "sub .food" è errato.
       event macro 15 1 ; corrisponde a "CastSpell Create Food".
    return
    Supponiamo di voler aggiungere anche Lich Form, apri paperdoll e LumberScorna. Il file risultante sarà:
    codice:
    sub food ; Il nome della sub va scritto senza il punto - "sub .food" è errato.
       event macro 15 1 ; corrisponde a "CastSpell Create Food".
    return
    sub lich
       event macro 15 107 ; corrisponde a "CastSpell Create Lich Form".
    return
    sub paperdoll
       event macro 8 1 ; corrisponde a "Open Paperdoll".
    return
    sub lumberscorna
       call LumberScorna.txt
    return
    Questo codice è *davvero* banale! Chiunque sa scriptare lo sa! Chi non sa scriptare, può comunque dare un'occhiata alla documentazione di "event macro", per rendersi conto di quali codici utilizzare per altri incantesimi.

    A questo punto, per far funzionare tutto, aprite da EasyUO il file "CommandServer.txt" ed avviatelo ("Commands.txt" non va avviato: viene richiamato automaticamente). Vedrete comparire il messaggio "UO Command Server started".
    Ora vi basterà scrivere ".food" in UO per osservare il vostro pg che crea del cibo (o che, quantomeno, ci prova).
    Subito dopo scrivete ".lich", e lo vedrete provare a trasformarsi in Lich!

    Una volta avviato, CommandServer resterà in background fino a quando non lo interromperete. Sarà un supporto costante per il vostro gioco.

    Qui di seguito vi fornisco il codice di "CommandServer.txt", assieme ad una semplice versione di "Commands.txt", che ha alcuni incantesimi già mappati.

    Nota: Ho fatto alcune modifiche (soprattutto a "Commands.txt") perché le mie versioni degli script sono fortemente personalizzate. Se riscontrate errori, vi prego di comunicarmelo.


    Bug conosciuti:
    - A volte un comando viene eseguito due volte anzikè una. Non capisco il perché, ma ci sto lavorando...
    - Se una sub va in loop, l'intero server va in loop. Questo non è un bug dovuto al CommandServer, ma alle singole sub!!! Attenzione a non scrivere sub che si bloccano! Mettete sempre dei timeout, se sapete farlo!
    Ultima modifica di kusanagi97; 18-12-2008, 05:13.

  • #2
    CommandServer.txt

    codice:
    linespercycle 1000
    set %commandsFile Commands.txt ; aggiornare questa variabile se si vuole rinominare "Commands.txt"
    gosub main
    halt
    
    sub main
        namespace push
        namespace local main
        event exmsg #charid 3 0 UO Command Server started.
        
        set !jmax #jindex
        set !jmin ( !jmax + 1 )
        while #true
        {
            set !jmax #jindex
            if !jmin > !jmax
               continue
               
            for !j !jmin !jmax
            {
                scanjournal !j
                set !line #journal
                set !color #jcolor
                gosub parseLine !line !color
            }
            set !jmin ( !jmax + 1 )
            wait 1
        }
    
        namespace clear
        namespace pop
    return
    
    sub parseLine ; %line %color
        namespace push
        namespace local parseLineNs
        if #charname = !null
        {
           event exmsg #charid 3 0 UO Command Server cannot work if the status bar is closed.
           set !timeout ( #systime + 20000 )
           while ( #charname = !null ) && ( #systime < !timeout )
           {
           }
           goto ParseLine_return
        }
    
        set !line  %1
        set !color %2
        
        if ( !color <> 52 )
           goto parseLine_return
    
        set !searchfor ( #charname , : , _ )
        str pos !line !searchfor
        if #strres <> 1
           goto parseLine_return
    
        str pos !line :
        set !start ( #strres + 2 )
    
        str len !line
        set !length ( #strres - !start + 1 )
    
        str mid !line !start !length
        set !speech #strres
    
        str pos !speech #dot
        if #strres <> 1
           goto parseLine_return
    
        str len !speech
        set !length ( #strres - 1 )
        str mid !speech 2 !length
        set !command #strres
    
        gosub parseCommand !command
    
        parseLine_return:
        namespace clear
        namespace pop
    return
    
    sub parseCommand ; %commandLine
        namespace push
        namespace local parseCommandNs
        
        set !command %1
    
        for !argc 1 11
        {
            set !end 1000000
            str pos !command #spc
            if ( #strres > 1 )
               set !end ( #strres - 1 )
    
            str pos !command _
            if ( #strres > 1 ) && ( !end > #strres )
               set !end ( #strres - 1 )
    
            str len !command
            if ( #strres > 0 ) && ( !end > #strres )
               set !end #strres
    
            if ( !end = 1000000 )
               break
    
            str mid !command 1 !end
            set !arg . !argc #strres
            
            set !newstart ( !end + 2 )
            str len !command
            set !newlength ( #strres - !newstart + 1 )
            if !newlength < 1
               break
    
            str mid !command !newstart !newlength
            set !command #strres
        }
        set !argc ( !argc - 1 )
        call %commandsFile !argc !arg1 !arg2 !arg3 !arg4 !arg5 !arg6 !arg7 !arg8 !arg9 !arg10 !arg11
    
        namespace clear
        namespace pop
    return

    Commenta


    • #3
      Commands.txt

      codice:
      linespercycle 1000
      
      gosub _indirectInvokeEx %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12
      exit
      
      sub _indirectInvokeEx ; %argc(full) %subname %args[10]
          namespace push
          namespace local indirectInvoke_ , #random
      
          goto %1
      
          ; si arriva qui solo se la label non è riconosciuta (numero args errato)
          event exmsg #charid 3 0 ATTENZIONE! Il numero degli argomenti di _indirectInvokeEx è errato! Lo script andrà in pausa.
          pause
          goto out
      
          0:
              gosub %2
              goto out
          1:
              gosub %2 %3
              goto out
          2:
              gosub %2 %3 %4
              goto out
          3:
              gosub %2 %3 %4 %5
              goto out
          4:
              gosub %2 %3 %4 %5 %6
              goto out
          5:
              gosub %2 %3 %4 %5 %6 %7
              goto out
          6:
              gosub %2 %3 %4 %5 %6 %7 %8
              goto out
          7:
              gosub %2 %3 %4 %5 %6 %7 %8 %9
              goto out
          8:
              gosub %2 %3 %4 %5 %6 %7 %8 %9 %10
              goto out
          9:
              gosub %2 %3 %4 %5 %6 %7 %8 %9 %10 %11
              goto out
          10:
              gosub %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12
              goto out
          out:
      
          namespace clear
          namespace pop
      return #result
      
      sub _indirectInvoke
          gosub _indirectInvokeEx %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11
      return #result
      
      
      
      ;=====================================================
      ;= FUNZIONI INVOCABILI ===============================
      ;=====================================================
      
      ;===================
      ;= MENU E OPZIONI ==
      ;===================
      
      sub options
          event macro 8 0  	; Open Configuration
      return
      sub paperdoll
          event macro 8 1 	; Open Paperdoll
      return
      sub status
          ;event macro 8 2 	; Open Status [buggato!]
      return
      sub journal
          event macro 8 3 	; Open Journal
      return
      sub skills
          event macro 8 4 	; Open Skills
      return
      sub chat
          event macro 8 6 	; Open Chat
      return
      sub backpack
          event macro 8 7 	; Open Backpack
      return
      sub map
          event macro 8 8 	; Open Overview
      return
      sub party
          event macro 8 10 	; Open Party Manifest
      return
      sub spellbook
          event macro 8 5 	; Open Spellbook
      return
      sub magebook
          event macro 8 5 	; Open Spellbook
      return
      sub necrobook
          event macro 8 12 	; Open Necro Spellbook
      return
      sub palabook
          event macro 8 13 	; Open Paladin Spellbook
      return
      sub warbook
          event macro 8 14 	; Open Combat Book
      return
      sub bushidobook
          event macro 8 15 	; Open Bushido Spellbook
      return
      sub ninjabook
          event macro 8 16 	; Open Ninjutsu Spellbook
      return
      sub arcanistbook
          event macro 8 18 	; Open Spellweaving SpellBook
      return
      sub arcanebook
          event macro 8 18 	; Open Spellweaving SpellBook
      return
      sub swbook
          event macro 8 18 	; Open Spellweaving SpellBook
      return
      sub guild
          event macro 8 17 	; Open Guild
      return
      sub quest
          event macro 8 19 	; Open Questlog
      return
      sub run
          event macro 32 0  ; Always run
      return
      sub circletrans
          event macro 29 0  ; CircleTrans
      return
      sub bow
          event macro 18 0  ; CircleTrans
      return
      sub salute
          event macro 19 0  ; CircleTrans
      return
      
      
      
      ;======================
      ;= Skills and virtues =
      ;======================
      
      sub honor
          event macro 49  1 	; Invoke Honor Virtue
      return
      sub sacrifice
          event macro 49 	2 	; Invoke Sacrifice Virtue
      return
      sub valor
          event macro 49 	3 	; Invoke Valor Virtue
      return
      sub compassion
          event macro 49 	4 	; Invoke Compassion Virtue (Does Nothing)
      return
      sub justice
          event macro 49 	7 	; Invoke Justice Protection
      sub
      
      
      
      ;===========
      ;= Magie ===
      ;===========
      
      sub wraith
          gosub castSpell 116
      return
      sub beast
          gosub castSpell 106
      return
      sub lich
          gosub castSpell 107
      return
      sub vampire
          gosub castSpell 113
      return
      sub reaper
          gosub castSpell 609
      return
      sub voyage
          gosub castSpell 613
      return
      sub polymorph
          gosub castSpell 55
      return
      sub incognito
          gosub castSpell 34
      return
      
      sub creature
          gosub castSpell 39
      return
      sub air
          gosub castSpell 59
      return
      sub earth
          gosub castSpell 61
      return
      sub fire
          gosub castSpell 62
      return
      sub water
          gosub castSpell 63
      return
      sub daemon
          gosub castSpell 60
      return
      sub demon
          gosub castSpell 60
      return
      sub familiar ; %rowNumber
          set !argc  %0
          set !row   %1
          set !timeout ( #systime + 4000 )
          gosub castSpell 112
      
          if !argc = 0
             return
      
          set #contname 0
          while ( #systime < !timeout ) && ( #contname <> generic_gump )
          {
          }
          if #contname = generic_gump
          {
              set !x ( #contposx + 32 )
              set !y ( #contposy + 39 + !row * 21 )
              click !x !y mc
          }
      return
      sub minion
          gosub familiar 1
      return
      sub wisp
          gosub familiar 2
      return
      sub wolf
          gosub familiar 3
      return
      sub adder
          gosub familiar 4
      return
      sub bat
          gosub familiar 5
      return
      sub fey
          gosub castSpell 607
      return
      sub fiend
          gosub castSpell 608
      return
      
      
      
      sub food
          gosub castSpell 1
      return
      sub night
          gosub castSpell 5
      return
      sub trap
          gosub castSpell 12
      return
      sub untrap
          gosub castSpell 13
      return
      sub telekinesis
          gosub castSpell 20
      return
      sub lock
          gosub castSpell 18
      return
      sub unlock
          gosub castSpell 22
      return
      sub armor
          gosub castSpell 6
      return
      sub reflection
          gosub castSpell 35
      return
      sub protection
          gosub castSpell 14 #charid
      return
      sub circle
          gosub castSpell 601    ; Arcane Circle
      return
      
      
      
      ;=======================
      ;= Funzioni ausiliarie =
      ;=======================
      
      ; Queste funzioni non servono afar funzionare Commands.txt e CommandServer.txt,
      ; ma solo a semplificare la scrittura dei vari comandi.
      ; Possono essere rimosse senza alcun problema se non si desidera utilizzarle.
      ;
      ; DISLAIMER: Ve le fornisco "così come sono".
      ; Non fanno propriamente parte del CommandServer, quindi se volete
      ; utilizzarle fate pure, ma se non funzionano non chiedetemi assistenza.
      ; A caval donato non si guarda in bocca :)
      
      
      
      ;=================
      ;= waitForTarget =
      ;=================
      ; %1: timeout in millisecondi (5000 è il valore predefinito).
      ;
      sub waitForTarget ; timeout
          namespace push
          namespace local agWaitForTargetNs
      
          if %0 > 0
              set !timeout ( #systime + %1 ) ; custom timeot
          else
              set !timeout ( #systime + 5000 ) ; default timeout
      
          while ( #targCurs = 0 ) && ( #systime < !timeout )
          {
          }
          namespace clear
          namespace pop
      return
      
      ;================
      ;= selectTargetEx =
      ;================
      ; %1: Tipo di bersaglio ( 0 = nessuno; 1 = id; 2 = x_y; 3 = x_y_z ).
      ; %2: Id del bersaglio, oppure coordinata x.
      ; %3: Coordinata y.
      ; %4: Coordinata z.
      ;
      sub selectTargetEx ; %type %id_or_x %y %tz
          namespace push
          namespace local agSelectTargetNs
          set !type %1
          if !type >= 1
          {
              if !type >= 2
              {
                  set #ltargetkind 2
                  set #ltargetx %2
                  set #ltargety %3
                  if !type >= 3
                      set #ltargetz %4
              }
              else
              {
                  set #ltargetkind 1
                  set #ltargetid %2
              }
              ;gosub waitForTarget
              event macro 22 ; LastTarget
          }
          namespace clear
          namespace pop
      return
      
      sub selectTarget
          gosub selectTargetEx %0 %1 %2 %3
      return
      
      ;================
      ;= waitForSpell =
      ;================
      ;
      ; Eventi che suggeriscono la fine di una spell:
      ; - Abbassamento del mana
      ; - Comparsa del puntatore per bersagli
      ; - Un qualsiasi messaggio DI SISTEMA (e che non sia di chat)
      ; - Esaurimento timeout
      sub waitForSpell
          namespace push
          namespace local agWaitForSpellNs
      
          set !timeout ( #systime + 10000 )
          set !jmin #jindex
          set !oldmana #mana
      
          ;   [----------] 10 char per line
          set !sysMsgCheck $
              +You_have_n$
              +Your_conce$
              +You_cannot$
              +You_are_al$
              +Thy_spell_$
              +You_have_t$
              +This_spell$
              +You_must_w$
              +That_locat$
              +You_alread$
              +You_decide$
          ;   [----------] 10 char per line
      
          while ( #systime < !timeout ) && ( #targcurs = 0 )
          {
              set !newmana #mana
              if ( !newmana < !oldmana )
                  break
              set !oldmana !newmana
      
              set !jmax #jindex
              if !jmin <= !jmax
              {
                  for !j !jmin !jmax
                  {
                      scanjournal !j
                      set !line #journal
                      if The_spell_fizzles in !line
                          goto waitForSpell_return
      
                      str left !line 10
                      set !line #strres
                      if !line in !sysMsgCheck
                          goto waitForSpell_return
                  }
                  set !jmin ( !jmax + 1 )
              }
          }
          waitForSpell_return:
          namespace clear
          namespace pop
      return
      
      ;=============
      ;= castSpell =
      ;=============
      ;
      sub castSpell ; %spellId %target_x_or_id %target_y %target_z
          namespace push
          namespace local agCastSpellNs
          set !targetType ( %0 - 1 )
          set !spell      %1
          set !x          %2
          set !y          %3
          set !z          %4
      
          if !spell = spirit_speak  ; SpiritSpeak è come una spell!
              event macro 13 32     ; UseSkill SpiritSpeak
          else
              event macro 15 !spell ; CastSpell !spell
      
          gosub waitForSpell
          if !targetType > 0
              gosub selectTargetEx !targetType !x !y !z
      
          namespace clear
          namespace pop
      return

      Commenta


      • #4
        mitico!

        non l'ho ancora provato, ma già mi piace.....
        [Amdir]Firma Irregolare[/Amdir]

        Commenta


        • #5
          Quindi intendi poi dare dei pulsanti alla frase ".comando"?
          Ad esempio ".flame" bindato sul tasto 1 per tirare un flame?

          Commenta


          • #6
            In realtà l'idea era quella di *risparmiarsi* dei tasti. Non ha senso mettere ".flame" bindata ad un tasto quando si può mettere tranquillamente "CastSpell FlameStrike / WaitForTarg / LastTarget". Però nessuno ti impedisce di farlo, se vuoi
            Io l'ho dovuto fare con healing, xkè l'opzione "smart healing" di razor non mi funziona su linux, e volevo un tasto ke lanciasse "cure" se sono poisonato, "lesser heal" se sono lievemente ferito, "greater heal" se sono molto ferito.

            Le funzioni che trovo più comode sono ".recall x" (che recalla alla runa x del runebook principale), ".wisp" (che lancia summon familiar e poi preme da solo il pulsante adeguato) e tutti i vari ".lumberscorna", ".minerscorna", ".boydon", ".getbod", eccetera, che mi permettono di avviare gli script senza doverli aprire manualmente da easyuo.
            Un'altra cosa simpatica sarebbe ".loot", un comando che cerca cadaveri in un raggio di due tile, li skinna, preleva il loot e usa eventualmente le forbici sulle pelli.

            Non c'è davvero limite a cosa ci si può inventare! Basta saper scrivere una sub. Conto sul fatto che col tempo si crei una discreta libreria di subs disponibili per tutti. Io stesso ne pubblicherò di nuove al più presto!

            Commenta


            • #7
              Comandi ".recall", ".gate", ".journey"

              Ecco a voi i comandi per usare rapidamente un runebook. Per utilizzarli, dovete settare la variabile !book per assegnare a ciascun personaggio il suo runebook (si potrebbe pensare anche ad una procedura automatica per riconoscere il runebook, per esempio in base al nome del runebook stesso, ma io mi trovo meglio così).
              codice:
              ;--- Una funzione di supporto ---
              
              sub _runebook ; %command %runenr
                  set !command %1
                  set !runenr  %2
              
                  if #charname = Radagast
                     set !book ZSNCKMD      ; id del runebook predefinito per Radagast
                  if #charname = Lawrence
                     set !book ZJEKDND      ; id del runebook predefinito per Lawrence
                  if #charname = Leara
                     set !book ESVYDND      ; id del runebook predefinito per Leara
              
                  if !command = recall
                     set !spell 31
                  if !command = gate_travel
                     set !spell 51
                  if !command = sacred_journey
                     set !spell 210
              
                  if !runenr < 0 ; [no location]
                      gosub castSpell !spell
                  if !runenr = 0 ; [default location]
                      gosub castSpell !spell !book
                  if !runenr > 0 ; [default location]
                      gosub runebookClick !book !command !runenr
              return
              
              
              
              ;--- I comandi veri e propri ---
              
              sub recall ; %runenr
                  if %0 = 0
                     set %1 -1
                  gosub _runebook recall %1
              return
              sub gate ; %runenr
                  if %0 = 0
                     set %1 -1
                  gosub _runebook gate_travel %1
              return
              sub journey ; %runenr
                  if %0 = 0
                     set %1 -1
                  gosub _runebook sacred_journey %1
              return
              
              
              
              ;==============================
              ;= RunebookClick (funzione ausiliaria) =
              ;==============================
              ;
              ; %1: idRunebook
              ; %2: Pulsante (recall, gate_travel, sacred_journey, drop_rune, set_default, use_scroll, rename_book, close)
              ; %3: Indice della runa (da 1 a 16)
              ;
              ; ESEMPIO 1: gosub runebookClick %runebook recall 1
              ; ESEMPIO 2: gosub runebookClick %runebook drop_rune 2
              ; ESEMPIO 3: gosub runebookClick %runebook rename_book Casa
              ;
              ; Ve la fornisco "così com'è", bla bla bla...
              ; Dipende dalle funzioni ausiliarie già pubblicate nel post precedente.
              ;
              sub runebookClick ; %idRunebook, %pulsante, %indiceRuna
                  namespace push
                  namespace local runebookClickNs
              
                  set !timeout ( #systime + 3000 )
                  set !idRunebook %1
                  set !pulsante %2
                  set !runa %3
              
                  ; apri il runebook
                  set #contname 0
                  set #lobjectid !idRunebook
                  event macro 17    ; LastObject
              
                  ; attendi apertura runebook
                  while #contname <> generic_gump
                  {
                      if #systime > !timeout
                         goto runebookClick_return
                  }
              
                  if !pulsante <> rename_book ; cambia pagina
                  {
                      set !page ( ( !runa - 1 ) / 2 ) + ( ( !runa - 1 ) / 8 )
                      set !x ( #contposx + 140 + !page * 35 ) )
                      set !y ( #contposy + 195 )
                  }
                  click !x !y
              
                  ; attendi cambiamento di pagina
                  wait 10
              
                  ; gestisci ridenominazione runebook
                  if !pulsante = rename_book
                  {
                      msg !runa , $
                      goto runebookClick_return
                  }
              
                  ; gestisci secondo click
                  if ( !runa % 2 ) = 1            ; se la pagina è dispari
                      set !x ( #contposx + 140 )  ;   setta x di conseguenza
                  else                            ; altrimenti
                      set !x ( #contposx + 300 )  ;   setta x di conseguenza
              
                  if !pulsante = recall
                      set !y ( #contposy + 145 )
                  if !pulsante = gate_travel
                      set !y ( #contposy + 162 )
                  if !pulsante = sacred_journey
                      set !y ( #contposy + 180 )
                  if !pulsante = drop_rune
                      set !y ( #contposy + 118 )
                  if !pulsante = use_scroll
                  {
                      set !y ( #contposy + 70 )
                      set !x ( !x - 5 )
                  }
                  if !pulsante = set_default
                  {
                      set !y ( #contposy + 25 )
                      if ( !runa % 2 ) = 1
                          set !x ( #contposx + 165 )
                      else
                          set !x ( #contposx + 305 )
                  }
              
                  click !x !y
              
                  ; attendi eventuale spell
                  if ( !pulsante = recall ) || ( !pulsante = gate_travel ) || ( !pulsante = sacred_journey ) || ( !pulsante = use_scroll )
                  {
                      gosub waitForSpell
                      wait 10
                  }
                  ; chiudi book se necessario
                  if ( !pulsante = set_default )
                  {
                      wait 5
                      click !x !y r
                  }
              
                runeBookClick_return:
                  namespace clear
                  namespace pop
              return
              ESEMPI:
              - ".recall 2" vi recalla alla runa numero 2 del runebook.
              - ".recall 0" vi recalla nella runa predefinita del runebook.
              - ".recall", usato senza numero, lancia semplicemente recall.

              ".gate" e ".journey" funzionano in maniera simile.
              - ".gate 5" apre un gate alla runa numero 5 del runebook.
              - ".journey 0" lancia sacred journey sulla runa predefinita del runebook.


              Alcune note tecniche
              Colgo l'occasione per illustrare due caratteristiche extra dello script:
              - Le sub di comando possono usare tranquillamente variabili locali (quelle col punto esclamativo) senza dichiarare il namespace (è dichiarato immediatamente prima che vengano richiamate). Badate che questo vale solo quando la sub è invocata dal CommandServer! Se invocate una sub di comando da dentro un'altra vostra sub, allora dovete usare i namespace regolarmente, (oppure utilizzare la sub "_indirectInvoke", fornita all'inizio di Commands.txt).
              - Le sub che contengono caratteri di underscore (_) vengono ignorate dal CommandServer. Questo serve a facilitare la scrittura di routine di servizio. Le "funzioni ausiliarie" che vi ho postato non seguono questa convenzione perché sono state estratte dalla mia libreria personale, quindi normalmente non si trovano in Commands.txt.

              Commenta


              • #8
                bel lavoro complimenti... lo guardo subito.

                edit: a prima occhiata 'sti script mi ricordano certi progetti con file che finiscono con .cpp, .cpp, .h
                Ultima modifica di fengyr; 19-12-2008, 23:39.
                ____________________________________________________________________

                Il p Fengyr
                ____________________________________________________________________
                : algander#6292

                Commenta


                • #9
                  Le sub vengono richiamate due volte perchè manca deletejournal.
                  ICQ 222293462


                  Commenta


                  • #10
                    Si vede così tanto che programmo in c++?
                    LOL
                    Poteva essere anche Java... però ci hai preso in pieno!
                    Ah... complimenti per la signature...

                    -----

                    Stò testando con deletejournal (buon suggerimento, nn ci avevo pensato), ma non ottengo il comportamento desiderato.
                    - Con deletejournal a volte salto delle righe
                    - Senza deletejournal a volte ripeto una singola riga per due volte (niente loop, in ogni caso)

                    -----

                    Questo sistema è anche utilissimo per fare dei test. Sto tirando su delle utilità per BOD un pezzettino alla volta, testando ogni singola sub prima di passare avanti (non è ke questo ti ricorda certe cose strane tipo lo unit testing, fengyr? lol)

                    Inoltre ho realizzato sub per cercatesori e per una minima assistenza al targetting. Avete idea di quanto sia utile un semplice comando ".hideitems" che cancella dallo schermo ogni bersaglio clikkato, fino a che nn si preme ESC? Svuotare una cassa del tesoro non è mai stato così semplice...

                    -----

                    PS: Qualcuno mi da conferma se funziona tutto bene? Ripeto ke ho fatto alcune modifiche rispetto alla versione mia...
                    Ultima modifica di kusanagi97; 21-12-2008, 06:18.

                    Commenta


                    • #11
                      Senza deletejournal lo script rilegge due volte la stessa riga prima che questa venga sostituita con quella nuova, per questo avvia due volte la stessa macro. Penso che se aggiungi deletejournal dopo
                      codice:
                      gosub parseLine !line !color
                      non dovrebbe darti problemi.
                      ICQ 222293462


                      Commenta


                      • #12
                        Originariamente inviato da kusanagi97 Visualizza il messaggio
                        Si vede così tanto che programmo in c++?
                        ...
                        A ing. informatica ci fanno prendere 'certe' abitudini riguardo allo stile della scrittura... e a vedere come hai ordinato le cose mi è venuto in mente il C++ che tra l'altro sto studiando per il prossimo esame XD

                        cmq se ti interessa aggiungere una sub esterna per il journal scanning sul sito di EUO ci sono degli script interessanti di Kal, ti consiglio di darci un'occhiata anche solo per avere degli spunti.

                        ps: thx ^.^
                        Ultima modifica di fengyr; 22-12-2008, 19:41.
                        ____________________________________________________________________

                        Il p Fengyr
                        ____________________________________________________________________
                        : algander#6292

                        Commenta


                        • #13
                          Il problema con il journal probabilmente era dovuto ad una cattiva implementazione di una sub. Occorre sempre prestare molta attenzione quando non si chiudono correttamente i namespaces (ma non potevano fare lo stack automatico?).

                          Il deletejournal avrebbe eliminato la coda dei comandi ancora non letti. Preferisco invece mantenere questa coda intatta, in maniera da poter eseguire anche qualche elementare combo in combattimento (più che altro in pvm).

                          Commenta


                          • #14
                            sto imparando a scoprire le potenzialità dei tuoi script XD

                            è davvero interessante quello che hai fatto, adesso sto adattando il mio looter al tuo script appena sarà funzionante al 100% lo posterò...
                            EDIT:
                            usando però il command server mi sono accorto di un fatto, sul pc dove sono adesso (portatile con vista ) il controllo:
                            codice:
                                ... 
                                set !searchfor ( #charname , : , _ )
                                str pos !line !searchfor
                                if #strres <> 1
                                goto parseLine_return
                                ...
                            sembra dare sempre un valore di #strres non idoneo, non ho guardato attentamente i conti che fai, ma per far andare i comandi ho dovuto mettere a commento le ultime due righe citate.
                            inoltre il controllo per #jcolor è settato a 52 ma non tutti usano il colore predefinito per il testo (vedi me), sarebbe utile un controllo automatico x il colore del parlato

                            io ho risolto così, ho sostituito a gosub main:

                            codice:
                            msg Test colore speech$
                            set %jrnl #jindex
                            while #true
                               {
                               if #jindex > %jrnl
                                  {
                                  set %jrnl %jrnl + 1
                                  scanjournal %jrnl
                                  if Test_colore_speech in #journal
                                      {
                                      set %speechc #jcolor                      ;sostituisco %speechc a 52
                                      gosub main
                                      }
                                  }
                               }
                            lo so come stile non è granchè ma rende l'idea :P vedi te, magari lo potresti implementare nello script come sub di setup o altro... questa è giusto una soluzione rapida.
                            Ultima modifica di fengyr; 30-12-2008, 12:40.
                            ____________________________________________________________________

                            Il p Fengyr
                            ____________________________________________________________________
                            : algander#6292

                            Commenta


                            • #15
                              looter, è una versione MOLTO semplificata (quasi all'osso) del mio looter personale , notare che è possibile scegliere cambiando #true/#false nelle voci 'liste looting', è possibile inoltre aggiungere tramite type eventuali item mancanti che si vogliono lootare:

                              codice:
                              ;========
                              ;= LOOT =
                              ;========
                              ;
                              sub loot
                              findcorpse:
                              	Finditem YFM G_2
                                set %corpses #findcnt
                              
                              ;--------------------------------------------------------------------------------------------
                              ;Liste looting
                              set %lootagold #TRUE
                              set %lootaossa #TRUE
                              set %lootafeather #TRUE
                              set %lootafrecce #TRUE
                              
                              ; loot type section
                              set %frecce RWF
                              set %feather VLK
                              set %gold POF
                              set %bones IJK_TJK_BJK_UJK_LJK_FJK_RJK_EJK_ZIK_YIK_JJK_GJK_KJK_HJK_OJK_XIK_SJK_DJK_MJK_AJK_OZF
                              ;----------------------------------------------------------------------------------------
                              for %i 1 %corpses
                              {
                              gosub WeightSub
                              gosub findcorpse
                              if #result <> #false
                                 {
                                 gosub LootCorpse
                                 }
                                 wait 10
                                 }
                              }
                              return
                              ;-----------------------------------------------------------------------------------------
                              sub WeightSub
                              
                              set %WeightMax ( #maxweight + 50 )  ;dall'introduzione di ML il calcolo del peso massimo
                                                                  ;per gli umani su EUO non corrisponde.
                              if #Weight >= %WeightMax
                                 {
                                 while #Weight >= %WeightMax
                                       {
                                       Event exmsg #CharId 3 33 Quasi sovraccarico!
                                       wait 5s
                                       }
                                 }
                              return
                              ;------------------------------------------------------------------------------------------
                              sub FindCorpse
                              	Finditem YFM G_2
                                if #FindCnt < 1 || #FindDist > 2 || #FindType <> YFM
                              	return #false
                              	set %CorpseID #FindId
                              	set %CorpseType #FindType
                              	ignoreitem #findid
                                return %CorpseId
                              ;-------------------------------------------------------------------------------------------
                              sub LootCorpse
                              set #lobjectid %CorpseID
                              event macro 17 0
                              wait 10
                              gosub WeightSub
                              wait 5
                              _Looting:
                              if %lootagold = #TRUE
                                 {
                                 finditem %gold C_ , %CorpseID
                                 if #findkind <> -1
                                    {
                                    gosub MovetoBack #FindId #FindStack
                                    goto _Looting
                                    }
                                 }
                              if %lootaossa = #TRUE
                                 {
                                 finditem %bones C_ , %CorpseID
                                 if #findkind <> -1
                                    {
                                    gosub MovetoBack #FindId #FindStack
                                    goto _Looting
                                    }
                                 }
                              if %lootafeather = #TRUE
                                 {
                                 finditem %feather C_ , %CorpseID
                                 if #findkind <> -1
                                    {
                                    gosub MovetoBack #FindId #FindStack
                                    goto _Looting
                                    }
                                 }
                              if %lootafrecce = #TRUE
                                 {
                                 finditem %frecce C_ , %CorpseID
                                 if #findkind <> -1
                                    {
                                    gosub MovetoBack #FindId #FindStack
                                    goto _Looting
                                    }
                                 }
                              wait 10
                              return
                              ;---------------------------------------------------------
                              sub MovetoBack
                              wait 10
                              exevent drag %1 %2
                              wait 15
                              exevent dropc #backpackid
                              wait 10
                              return
                              Ultima modifica di fengyr; 30-12-2008, 13:03.
                              ____________________________________________________________________

                              Il p Fengyr
                              ____________________________________________________________________
                              : algander#6292

                              Commenta

                              Sto operando...
                              X