annuncio

Comprimi
Ancora nessun annuncio.

[RabaEUOforVBNET] Scriptare Ultima Online con Visual Basic .NET

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

  • [RabaEUOforVBNET] Scriptare Ultima Online con Visual Basic .NET

    Ciao a tutti,
    dopo vari santi giù dal calendario, sembra che finalmente il codice funzioni come deve

    Chi di voi usa OpenEUO, si ricorderà che il programma è fatto di due parti fondamentali:
    - openeuo.exe è il parser che esegue gli script
    - uo.dll è la libreria dinamica che accede al client di Ultima Online
    Bene, essendo uo.dll una qualunque (o quasi) Dynamic Linking Library, si può accedere ad essa in teoria da qualunque linguaggio, e non soltanto da Lua..

    a che serve questo coso? Presto detto!
    - Supporto completo del debugger integrato nell'IDE
    - Accesso all'intero framework .NET compresa l'intera gerarchia di classi System.*, codice managed
    - Potete scrivere i vostri script in Visual Basic .NET, un linguaggio semplice da imparare e ancora più potente di Lua
    - Licenza MIT: potete rilasciare i vostri script come sorgenti o come binari precompilati
    - Esecuzione all'interno della CLI di .NET (ho fatto qualche prova semplice: gli script girano alla velocità della luce rispetto al vecchio EasyUO)
    - Supporto del Designer integrato nell'IDE di VB.NET : potete finalmente disegnare l'interfaccia grafica con il punta e clicca senza dover scrivere tonnellate di codice ripetitivo (che palle)

    IMHO questi sono soltanto alcuni dei vantaggi più evidenti di questa soluzione...


    EDIT: AGGIORNATO 16/12/2012

    Di recente Microsoft ha rilasciato la versione 2012 del compilatore Visual Studio Express for Desktop, e siccome sembra funzionare bene (debugger compreso) con uo.dll, ho aggiornato RabaEUOdotNET come soluzione per VS2012, per cui VS2008 non è più né richiesto né supportato

    Contemporaneamente ho uploadato le release 0.5 sia di RabaEUOdotNET sia di RabaEUOforVBNET, tra le novità introdotte di recente:

    1) la classe OCR contiene una funzione di mia implementazione che legge il gump di Animal Lore e restituisce i dati letti
    codice:
    dim pet as RabaEUOforVBNET.Libs.OCR.PetStats =  RabaEUOforVBNET.Libs.OCR.GetPetStats()
    2) nuova classe BuffDebuff che legge il gump delle icone e restituisce lo stato (attivo / non attivo / ecc.)
    2) nuova classe TileFlags che restituisce in un formato leggibile per gli umani lo stato dei flag del comando TileGet

    Se volete provare RabaEUOforVBNET, vi rimando al post originale che ho fatto sul forum di OpenEUO in cui trovate i link per scaricare il tutto:
    http://www.easyuo.com/forum/viewtopic.php?f=37&t=49465


    ciao a tutti, Raba
    Ultima modifica di marcorc; 16-12-2012, 11:45.

  • #2
    puoi spiegare meglio qual'è la procedura per aggiungere le dll al progetto? ho provato ad aggiungere i riferimenti in visual basic 2008 ma ricevo un errore riguardo alla compatibilità delle librerie.
    ____________________________________________________________________

    Il p Fengyr
    ____________________________________________________________________
    : algander#6292

    Commenta


    • #3
      Originariamente inviato da fengyr Visualizza il messaggio
      puoi spiegare meglio qual'è la procedura per aggiungere le dll al progetto? ho provato ad aggiungere i riferimenti in visual basic 2008 ma ricevo un errore riguardo alla compatibilità delle librerie.
      Asd, quando ricevi un errore potresti dirmi qual è il messaggio che ti esce, che faccio prima?

      Scusa il ritardo nella risposta, in questi giorni loggo poco... dunque, come ti ho detto sarebbe meglio che mi indicassi per bene che tipo di errore ottieni Tirando a indovinare, il messaggio che ottieni potrebbe essere dovuto al fatto che Visual Basic 2008 di default, se lo usi su un sistema operativo a 64 bit tipo Vista o Seven, compila l'eseguibile a 64 bit: però le librerie uo.dll e RabaEUOdotNET.dll sono compilate a 32 bit, da cui il conflitto e l'inevitabile spetasciamento del programma. Se il problema è questo, per ovviare si fa presto: in Visual Basic 2008 vai

      - nel menu Tools -> apri Options -> apri Projects and Solutions -> aggiungi una spunta alla voce "Show advanced build configurations" (questo ti permette di vedere tutte le voci di menu, anche quelle che di default sono nascoste)

      - ora vai nel menu Build e sotto Build e Publish dovresti vedere "Configuration Manager" -> clicca la voce Configuration Manager, ti si apre una finestra

      - nella finestra scegli la build che stai realizzando (Debug o Release) , clicca sulla tendina "Active solution platform" -> scegli "New" e dove vedi "Type or select the new platform" seleziona x86

      In questo modo stai specificando al VB che, anche su un sistema operativo a 64 bit, vuoi che il tuo eseguibile generato esca a 32 bit. Garantisco che non è un problema, a meno che tu non voglia scriptare un server intero . Se il problema è questo, ricordati di fare questo passaggio per ogni nuovo programma che realizzi usando il wrapper RabaEUOforVBNET: è sufficiente che tu imposti questa cosa una volta sola ogni volta che crei un nuovo progetto, salvi, l'impostazione rimane.

      Ricordati anche sempre di copiare entrambi i file .dll (uo.dll e RabaEUOdotNET.dll) nella cartella dove si trova l'eseguibile che stai generando, dovrebbe essere un percorso del tipo:
      C:\Users\"nome del tuo utente"\Documents\Visual Studio 2008\Projects\"nome della tua soluzione"\"nome della tua soluzione"\bin\x86\Debug, altrimenti il wrapper non le trova e restituisce errore.

      Fammi sapere se sei riuscito a risolvere, se il problema è un altro vediamo se riusciamo a identificarlo


      p.s. sto provando il wrapper con uno scriptino abbastanza tosto (che vorrei rifilare ai miei gildati come cavie ) e per ora funziona anche meglio del previsto: bachi seri per ora non ne ho trovati, al massimo un paio di fix per la versione 0.2 che pubblicherò a breve

      Commenta


      • #4
        sì, sono su win 7 64bit, con visual basic 2008 express 3.5 sp1 in italiano.

        ho seguito la procedura che hai descritto...
        -soluzione attiva x86 aggiunta
        -creo un nuovo progetto e copio le dll in ..\bin\x86\Debug

        ma ricevo sempre il solito messaggio:

        impossibile aggiungere riferimento a: "~percorso". Verificare che il file sia accessibile e che l'assembly o il componente COM sia valido.
        Ultima modifica di fengyr; 17-08-2012, 20:11.
        ____________________________________________________________________

        Il p Fengyr
        ____________________________________________________________________
        : algander#6292

        Commenta


        • #5
          Per Fengyr (e per tutti gli altri):

          Scusa un'altra volta il ritardo nella risposta Ho letto ora il tuo PM perchè sono stato via un paio di giorni e ti rispondo qui perchè è un problema che riguarda la maggior parte degli utenti:

          La libreria RabaEUOdotNET.dll non ti funziona perchè al momento è linkata dinamicamente, per risolvere al momento basta che installi il "Visual C++ 2008 SP1 Redistributable Package", lo trovi nel link che ho addato al post iniziale qui sopra (ho editato il messaggio)

          Thx 1.000.000 per la segnalazione!!!! Al più presto rilascerò una nuova versione della libreria che non richiederà il Redistributable Package installato

          Commenta


          • #6
            nessun problema, controllo piu spesso il forum che icq e credimi anch'io non sono celere nelle risposte quindi non mi aspetto diversamente...
            comunque anche installato il package il problema si continua a presentare, come ti ho detto in icq ho:

            preso il progetto di esempio
            controllato che la soluzione attiva fosse in x86, provato sia debug che release
            aggiunto le librerie direttamente senza usare i riferimenti

            e praticamente l'unico codice che ho aggiunto consiste nella form:
            codice:
            Public Class Form1
            
                Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            
                    Dim REUO As RabaEUOforVBNET = New RabaEUOforVBNET
                    REUO.SysMessage("Libreria caricata correttamente")
                End Sub
            
                Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                    Dim REUO As RabaEUOforVBNET = New RabaEUOforVBNET
                    REUO.SysMessage("Hello world!")
                End Sub
            End Class
            il debugger mi sputa questo:
            Impossibile caricare la DLL 'RabaEUOdotNET.dll': Impossibile avviare l'applicazione specificata. La configurazione della modalità affiancata dell'applicazione non è corretta. Consultare il registro degli eventi applicazioni o utilizzare lo strumento da riga di comando sxstrace.exe per ottenere ulteriori informazioni. (Eccezione da HRESULT: 0x800736B1).
            ____________________________________________________________________

            Il p Fengyr
            ____________________________________________________________________
            : algander#6292

            Commenta


            • #7
              Originariamente inviato da fengyr Visualizza il messaggio
              il debugger mi sputa questo:
              Ho controllato anche su Google, il codice di errrore che ottiene è proprio legato al fatto che RabaEUOdotNET.dll (versione linkata dinamicamente) non trova le librerie di runtime corrette: il problema è che di VC++ 2008 Redistributable Package ne esistono molte versioni perchè oltre a quella che ti ho indicato, ci sono svariati bug fixes da installare. Windows Update te li installa in automatico se vuoi, ma poi dovresti verificare di avere pure le versioni di debug ecc... inutilmente incasinato

              Per ovviare al problema, ho compilato al volo una prima versione di RabaEUOdotNET.dll linkata staticamente:
              http://bit.ly/OE1O8W
              L'ho provata un attimo sul mio PC e funziona bene senza restituire errori, ma non ho fatto troppa attenzione ai parametri di configurazione del compilatore, per cui è meglio che la provi e mi dici

              Basta che:
              1) clicchi il link e scarichi lo zip
              2) lo decomprimi
              3) copi il file RabaEUOdotNET.dll che c'è dentro nella directory di debug (o release) dove c'è il tuo eseguibile VB, al posto della vecchia RabaEUOdotNET.dll Dovresti accorgerti che sono diverse perchè questa è di 22k, quella vecchia era di circa 60k (cancellala pure se ti funziona la nuova). Se non ho fatto casino con i parametri del compilatore, stavolta non dovresti avere rogne. Fammi sapere , pls

              Ciao e thx 1000 per il feedback!

              Commenta


              • #8
                ho cercato pure io e sospettavo la stessa cosa ma adesso... finalmente funziona!

                mi metto subito al lavoro, intanto controllo se le variabili rispondono tutte ma sono sicuro che tutto funzionerà grazie!

                edit: quando uso i bottoni nella form e chiudo la form in esecuzione compare un access violation in debugger e mi indica la solita riga:
                codice:
                Protected Overrides Sub Finalize()
                
                        Dim close = REUONetClose()  <---
                        If close = False Then
                sta tentando di accedere a memoria protetta.


                il bottone è semplicemente questo

                codice:
                    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                        Dim REUO As RabaEUOforVBNET = New RabaEUOforVBNET
                        textboxX.Text = REUO.CharPosX
                        TextBoxY.Text = REUO.CharPosY
                        TextBoxZ.Text = REUO.CharPosZ
                    End Sub
                questo di seguito sono riuscito a "risolverlo" compilando in release, mentre il bottone presenta ancora problemi

                e ancora, voglio per esempio controllare le coordinate e refreshare il form ma ricevo spesso delle access violation random durante l'esecuzione:

                codice:
                Public Class Form1
                
                    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                        Me.TopMost = True
                        Timer1.Interval = 500
                        Timer1.Enabled = True
                        Dim REUO As RabaEUOforVBNET = New RabaEUOforVBNET
                        Me.Text = REUO.CharName
                    End Sub
                
                    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
                        Dim REUO As RabaEUOforVBNET = New RabaEUOforVBNET
                        textboxX.Text = REUO.CharPosX
                        TextBoxY.Text = REUO.CharPosY
                        TextBoxZ.Text = REUO.CharPosZ
                    End Sub
                End Class
                cosa sto sbagliando?
                Ultima modifica di fengyr; 20-08-2012, 12:59.
                ____________________________________________________________________

                Il p Fengyr
                ____________________________________________________________________
                : algander#6292

                Commenta


                • #9
                  Originariamente inviato da fengyr Visualizza il messaggio
                  ho cercato pure io e sospettavo la stessa cosa ma adesso... finalmente funziona!
                  ma ricevo spesso delle access violation random durante l'esecuzione
                  ASD! Thx di nuovo per aver fatto da beta tester
                  Come ti ho detto, più gente collauda sta cosa e meglio è, perchè anche se cerco di starci attento, qualche bug mi scappa lo stesso

                  Per gli errori di access violation: asd, np, anzi è un buon segno perchè funziona finalmente come deve
                  Mi spiego: questo non è un bug della libreria, da come ho capito io è proprio VB.NET che è fatto così. L'access violation nasce dal fatto che crei più istanze contemporaneamente della classe RabaEUOforVBNET: mentre il VB può istanziare tutti gli oggetti che vuole, uo.dll (la libreria sottostante) ha uno stack condiviso, e imho l'accesso contemporanea da parte di più istanze diverse lo incasina miserabilmente.
                  Per risolvere, basta uno accorgimento semplicissimo: creare un'unica istanza di RabaEUOforVBNET, e usare sempre quella.

                  Per farti un esempio, io ho risolto così:

                  - creo il form con il designer grafico, dove inserisco i bottoni e l'interfaccia grafica
                  - inserisco il mio codice in classi del VB (si creano cliccando con il tasto destro sul project e facendo Add -> New Item -> Class

                  ovviamente devi avere un minimo di pratica con il modello a oggetti del VB: di norma (salvo per esempio i metodi shared) VB richiede che tu istanzi la classe che vuoi usare, quindi per esempio se hai creato una classe "Fengyr", nel posto più opportuno devi scrivere qualcosa del tipo

                  codice:
                  dim fengyrInstance as Fengyr = New Fengyr
                  e poi invocare i metodi con
                  codice:
                  fengyrInstance.nomedelmetodo(parametri vari....)
                  - per la classe RabaEUOforVBNET, faccio invece così:

                  1) creo un Modulo con tasto destro su project -> Add -> New item -> Module

                  cos'è un Modulo? E' una "specie" di classe, che però non richiede di essere istanziata (qualcosa di vagamente simile a una classe static) perchè contiene solo variabili e procedure

                  2) dentro al modulo, fuori da tutte le procedure, scrivo
                  codice:
                  public REUO as RabaEUOforVBNET
                  public è una parola riservata che crea un variabile pubblica, cioè visibile al di fuori del modulo: in pratica crei una variabile globale che è visibile da qualsiasi punto del programma!

                  3) creo una piccola procedura chiamata InitGlobalVariables fatta così

                  codice:
                  public sub InitGlobalVariables()
                  
                      REUO = new RabaEUOVBNET
                  
                  end sub
                  questa procedura ha il semplice scopo di assegnare la variabile globale REUO

                  4) ricordati che la sub InitGlobalVariables va chiamata per prima! Perciò nel codice del form nella sub "_Load" scrivi
                  codice:
                  private sub MioForm_Load (ecc.. ecc..)
                  
                     InitGlobalVariables()
                  
                  end sub
                  5) a questo punto, se si fanno le cose come si vede, da qualsiasi punto del programma puoi accedere alla variabile REUO e scrivere, per esempio

                  codice:
                  REUO.Msg("Hello World" & chr(13))
                  chr(13) è il carattere di fine riga

                  Spero di essere riuscito a spiegarmi Nel caso abbia fatto confusione, dimmi e ti posto un esempio più dettagliato, nel frattempo preparo un tutorial con un esempio completo
                  ciao

                  Commenta


                  • #10
                    perfetto provo subito grazie!

                    a parte script semplici in visual basic la mia conoscenza del linguaggio è praticamente nulla, mi pareva strano comunque che dovessi dichiarare ogni volta che facevo una nuova sub l'istanza della libreria... in ogni caso mi sto documentando e farò sicuramente approfondimenti sui moduli


                    edit: ho creato il modulo e ora i messaggi sono spariti, grazie ancora! ^^
                    Ultima modifica di fengyr; 20-08-2012, 18:49.
                    ____________________________________________________________________

                    Il p Fengyr
                    ____________________________________________________________________
                    : algander#6292

                    Commenta


                    • #11
                      per adesso sta procedendo molto bene, i primi giorni mi sono sbizzarrito con il designer per le interfacce ed ho fatto i miei progressi, poi mi sono rimesso un pò sulla teoria del vb.net per chiarire la sintassi e capire strutture, classi e moduli :P

                      sto lavorando alle mie prime librerie ma come ti ho già accennato un qualche problema con getitem e scanitem, mi sembra di aver capito che vadano gestiti come metodi e a vedere nella tua libreria ci sono già delle strutture predisposte ma mi manca come collegare il tutto

                      altra curiosità che mi stuzzica molto è riguardo a quelle librerie per lavorare sui pacchetti di cui ti ho parlato, darklotus che ti ha dato delle dritte sul forum di easyuo ha pubblicato un progetto con quelle dll quindi credo tu sappia di cosa sto parlando.


                      se oggi ci sei fatti vivo su icq, oggi fino alle 19 ci sono quasi sicuramente, sono quasi sempre invisibile ma se ti vedo loggare ti contatto
                      ____________________________________________________________________

                      Il p Fengyr
                      ____________________________________________________________________
                      : algander#6292

                      Commenta


                      • #12
                        UP!
                        Aggiornato il wrapper alla versione 0.2
                        Ho modificato parecchio il codice in Visual Basic, per cui gli esempi che avevo postato non funzionano più...se siete interessati magari posso postare un paio di tutorial, ciao

                        Commenta


                        • #13
                          Ciao,
                          era un po' che non postavo update...
                          Ho rilasciato sul forum di OpenEUO la versione 0.3 di questo wrapper, vedi sopra nel post iniziale

                          Ci sono alcune novità interessanti, per esempio il supporto dell'OCR per leggere il testo dei gump, compreso quello dei pet che si apre usando Animal Lore (quest'ultima è un'implementazione mia, per cui se trovate bug o malfunzionamenti postate che provo a fixare, grazie )

                          Il codice è cambiato parecchio, i vecchi esempi postati nel thread non funzionano più. Nel file compresso .zip che si scarica dal forum di OpenEUO trovate un esempio aggiornato...
                          Per qualsiasi dubbio, postate

                          'notte
                          Raba

                          Commenta


                          • #14
                            UP!!

                            Come ho scritto nel post iniziale, ho aggiornato la soluzione a Visual Studio 2012 Express for Desktop Edition, d'ora in poi chi fosse interessato deve usare quello!

                            Ho uppato anche le release 0.5 di RabaEUOdotNET e RabaEUOforVBNET che contengono alcune novità (vedi post iniziale per i dettagli)
                            Chi volesse provare questo wrapper non ha che da andare al link al sito di OpenEUO che si trova nel post iniziale
                            N.B. dalla versione 0.1 il codice è cambiato parecchio, i vecchi esempi nel thread non funzionano più

                            Commenta


                            • #15
                              Ciao.

                              Per utilizzare la DLL si necessita per forza dell'uso di VS 2012? Io col 2010 e col C# quale devo usare? Grazie.


                              Kaos nel cuore

                              Commenta

                              Sto operando...
                              X