[Python] PyziUO - nuovo Script Engine per la uo.dll

Comprimi
Questa è una discussione evidenziata.
X
X
 
  • Ora
  • Visualizza
Elimina tutto
nuovi messaggi

  • CookieLover
    ha risposto
    Versione 0.3.0.8

    Ho modificato delle funzionalità perché mi sono accorto che non erano il massimo mentre scrivevo la documentazione.

    Lascia un commento:


  • CookieLover
    ha risposto
    Ho fixato un bug su UO.Distance, cercava il type al posto del serial. La versione è la stessa ma l'ho ricompilato.

    Lascia un commento:


  • CookieLover
    ha risposto
    Versione 0.3.0.7

    Modifiche:
    • aggiunto il comando UO.IgnoreItem(serial o item)
    • aggiunto il comando UO.ClearIgnoreList()
    • cambiata la funzionalità di UO.FindItem, non esiste più UO.FindItems (vedi sotto)
    • aggiunto il comando UO.FindType(type / array di types, container)
    • sto testando la questione UO.TileInit, UO.TileCnt, UO.TileGet
    • cambiata la uo.dll per supportare i client fino al 7.0.57.1, risolve anche il bug del UO.CliLang


    UO.FindItem / UO.FindType

    UO.FindItem

    Argomenti: serial [, container] (facoltativo)
    Cerca il singolo item partendo dal serial e riporta l'oggetto con le sue caratteristiche (ID, Type, Kind, X, Y, Z, Stack, Rep, Col).

    UO.FindType

    Argomenti: type o array di types [, container] (facoltativo)
    Cerca tutti gli items con quel/quei type(s) e riporta un generatore (una specie di lista).

    UO.IgnoreItem / UO.ClearIgnoreList

    UO.IgnoreItem

    Argomenti: serial / item
    Permette di ignorare un item, ovvero non trovarlo con UO.FindItem/UO.FindType.
    (La lista si resetta in automatico ad ogni istanza.)

    UO.ClearIgnoreList

    Argomenti: N/A
    Pulisce la lista degli item ignorati.


    Script per conoscere le proprie stats/res base senza undressare
    codice:
    totalvalue = {
        'Strength Bonus' : 0, 
        'Dexterity Bonus' : 0,
        'Intelligence Bonus' : 0
        }
    
    Hue = 80
    
    UO.OpenPaperdoll()
    UO.Wait(20)
    
    items = UO.FindType(0, UO.ContID)
    
    for itm in items:
        if itm is None: continue
        props = UO.GetPropList(itm.ID)
        UO.Wait(10)
        if props is None: continue
            
        for k,v in totalvalue.iteritems():
            if k in props.Keys:
                totalvalue[k] += int(props[k])
    
    s = 'Strength = {0}'.format(UO.Str - totalvalue['Strength Bonus'])
    d = 'Dexterity = {0}'.format(UO.Dex - totalvalue['Dexterity Bonus'])
    i = 'Intelligence = {0}'.format(UO.Int - totalvalue['Intelligence Bonus'])
    res = ['Energy Resist', 'Poison Resist', 'Cold Resist', 'Fire Resist',
           'Physical Resist']
           
    ResSpell = UO.GetSkill("Resisting Spells").Real
    resval = 0
    if 445 <= ResSpell < 550:
        resval = 5
    elif ResSpell < 700:
        resval = 10
    elif ResSpell < 850:
        resval = 20
    elif ResSpell < 1000:
        resval = 30
    elif ResSpell < 1100:
        resval = 40
    elif ResSpell < 1200:
        resval = 42
    elif ResSpell == 1200:
        resval = 44
        
    UO.SysMessage('======== Char Base Props ========', Hue)
    for stat in [s,d,i]:
        UO.SysMessage(stat, Hue)
    for r in res:
        UO.SysMessage('{0} = {1}'.format(r, resval), Hue)
    UO.SysMessage('===============================', Hue)
    Ultima modifica di CookieLover; 01-07-2017, 03:05.

    Lascia un commento:


  • CookieLover
    ha risposto
    Versione 0.3.0.6

    Ho fatto qualche modifica:
    • ora si può usare UO.Cast(spell) con il nome della spell invece dell'indice
    • si può cercare singoli item (UO.FindItem) e la lista totale degli item in un contenitore (UO.FindItems) con un array di tipi/seriali oltre che con il singolo id
    • ho tolto l'argomento per cercare solo item visibili o anche invisibili, visto che pare non servisse a nulla o non funzionasse (??)
    • ho aggiunto anche un modo per puntare la dll su un altro client nel caso ce ne fosse più di uno ma non l'ho ancora ben testato
    • ora si può scrivere le EventMacro con un solo argomento nel caso il secondo fosse 0
    • ora UO.LHandID e UO.RHandID sono settabili da script (prima per distrazione li avevo lasciati read-only)


    Esempio dell'array di UO.FindItem(s):

    codice:
    import clr
    clr.AddReference('System.Windows.Forms')
    from System import Array
    humantypes = Array[int]([0x190, 0x191])
    humans = UO.FindItems(humantypes, 0)
    if not humans is None:
         UO.HeadMsg("Ci sono {0} pg/npc umani nei dintorni".format(len(humans)), 50)
    Ultima modifica di CookieLover; 24-06-2017, 20:15.

    Lascia un commento:


  • MagnetoStaff
    ha risposto
    Originariamente inviato da Shun
    Ciao Cookie, volevo farti i complimenti per il gran lavoro e contributo.
    Ciao,
    mi aggiungo anch'io ai complimenti, bel lavoro

    Tra l'altro, come tu stesso dici, tanto PyziUO quanto Razor Enhanced utilizzano lo stesso engine IronPython: quindi - benchè immagino che gli script non saranno completamente intersambiabili tra i due sistemi... - penso che la maggior parte delle informazioni utili potranno essere condivise.

    Buon game davvero!
    Magneto

    Lascia un commento:


  • CookieLover
    ha risposto
    Originariamente inviato da Shun
    Ciao Cookie, volevo farti i complimenti per il gran lavoro e contributo.
    Ho delle domande, hai scritto che questo wrapper è di più alto livello rispetto ad easy uo, questo cosa implica? Mi spiego meglio gli script scritti con questo metodo sono "più lontani" rispetto a quelli in easy uo?
    Ovvero, dato che le istruzioni di alto livello vengono sempre poi tradotte in quelle di più basso livello, ti chiedo se il più alto livello di questo tool, corrisponde ad affrontare "più gradini" ad uno script per arrivare poi alle azioni da svolgere nel client.
    Grazie ancora, un saluto.
    Alto livello perché è più user friendly. Inoltre alcune cose che su easyuo devono essere create dall'utente sono di base ormai in tutti i linguaggi di programmazione "moderni", come lo split delle stringhe, le liste e i dizionari. Per fare un esempio semplice, su EasyUO una lista di oggetti è una stringa infinita di codici separati da underscore

    EasyUO

    codice:
    set %doors WOC_VOC_GPC_FPC_IPC_HPC_CPC_BPC_EPC_DPC_
    C#

    codice:
    List<string> doors = new List<string> { "WOC", "VOC, "GPC", "FPC", "IPC", "HPC", "CPC", "BPC", "EPC", "DPC" };
    Python

    codice:
    doors = ["WOC", "VOC, "GPC", "FPC", "IPC", "HPC", "CPC", "BPC", "EPC", "DPC"]
    Per lo Split:

    EasyUO

    String Split

    Python

    codice:
    res = "this|is|an|example".split('|')
    Una stringa definita dall'utente con dentro delle variabili deve seguire un iter di costruzione particolare

    EasyUO

    codice:
    set %msg La , #spc , tua , #spc , forza , #spc , è , #spc , #str , .
    Python

    codice:
    msg = 'La tua forza è ' + str(UO.Str) + '.'
    oppure

    codice:
    msg = 'La tua forza è %d.' % UO.Str
    oppure

    codice:
    msg = 'La tua forza è {0}.'.format(UO.Str)

    Lascia un commento:


  • Shun
    ha risposto
    Ciao Cookie, volevo farti i complimenti per il gran lavoro e contributo.
    Ho delle domande, hai scritto che questo wrapper è di più alto livello rispetto ad easy uo, questo cosa implica? Mi spiego meglio gli script scritti con questo metodo sono "più lontani" rispetto a quelli in easy uo?
    Ovvero, dato che le istruzioni di alto livello vengono sempre poi tradotte in quelle di più basso livello, ti chiedo se il più alto livello di questo tool, corrisponde ad affrontare "più gradini" ad uno script per arrivare poi alle azioni da svolgere nel client.
    Grazie ancora, un saluto.

    Lascia un commento:


  • carrasuperevil
    ha risposto
    Originariamente inviato da seel82
    Ma di che parli?
    Riescono a rosikare anche per un intera libreria aperta a tutti gli utenti del mondo

    Lascia un commento:


  • seel82
    ha risposto
    Ma di che parli?

    Lascia un commento:


  • ZeroCool_82
    ha risposto
    Originariamente inviato da seel82
    ...(a meno che non fai un injection al client)....
    Basta rivelare scottanti segreti Karasho!

    Lascia un commento:


  • CookieLover
    ha risposto
    Grazie, ora come ora il problema principale è sullo scan del journal

    Lascia un commento:


  • seel82
    ha risposto
    Originariamente inviato da CookieLover
    Sì, uso quello, ma non sapendo come trasformarlo in un event handler, lo uso come funzione che restituisce un booleano.
    Come eventhandler non credo puoi farlo (a meno che non fai un injection al client).

    Vedi se ti piace questa soluzione: https://pastebin.com/CFwpvf8W
    importi nello script la funzione IsKeyDown ed hai fatto

    Lascia un commento:


  • CookieLover
    ha risposto
    Originariamente inviato da seel82
    Magari lo utilizzi giá, ma te lo segnalo lo stesso:

    codice:
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    Permette di prendere i tasti premuti (con relative combinazioni).
    Usato opportunatamente puoi emulare al 100% easyuo/openeuo da questo pubto di vista (utilizzano proprio questa funzione). Ciao frankino
    Sì, uso quello, ma non sapendo come trasformarlo in un event handler, lo uso come funzione che restituisce un booleano.

    Lascia un commento:


  • seel82
    ha risposto
    Magari lo utilizzi giá, ma te lo segnalo lo stesso:

    codice:
    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    Permette di prendere i tasti premuti (con relative combinazioni).
    Usato opportunatamente puoi emulare al 100% easyuo/openeuo da questo pubto di vista (utilizzano proprio questa funzione). Ciao frankino

    Lascia un commento:


  • CookieLover
    ha risposto
    Finalmente sono riuscito a mettere le hotkey "come" su EasyUO, la nuova release ha l'esempio tra gli scripts (OnHotkey.py) che riporto qua:



    codice:
    while UO.CliLogged:
        while not UO.OnHotkey('f10', 'ctrl'):
            UO.Wait(1)
        UO.HeadMsg("Hai premuto ctrl+f10!", 30)
        break
    Altro esempio

    codice:
    while UO.CliLogged:
        if UO.OnHotkey('f10', 'ctrl'):
        	UO.HeadMsg("Hai premuto ctrl+f10!", 30)
        if UO.OnHotkey('A'):
        	UO.HeadMsg('Stoppo lo script...', 70)
        	break
        UO.Wait(1)
    Per la lista dei tasti disponibili vedere OnHotkey
    Ultima modifica di CookieLover; 15-06-2017, 21:38.

    Lascia un commento:

Sto operando...