Variable in Include benutzen irgendwie möglich?

  • Hey,
    Ich möchte gerne eine "Plugin-Funktion" für mein Spiel schreiben. Das ganze soll so funktionieren, dass es im Multiplayer einen Plugn-Ordner gibt , in dem der Serveradmin ein *.au3 Script einfügen kann und so den Server beliebig erweitern kann. Mein Problem: Es sollen von allen Scripts im Plugin-Ordner die Funktionen ins Hauptscript eingebunden werden. Natürlich per Include (gibt wohl kaum etwas anderes !?).
    Mein Script:

    [autoit]

    Func Server_IncludePlugins()
    Dim $Plugin_anzahl = 0
    $search = FileFindFirstFile(@ScriptDir & "\plugins\*.*")
    While 1
    $Plugin = FileFindNextFile($search)
    If $Plugin = "" Then
    Return $Plugin_anzahl
    Else
    If StringInStr($Plugin, ".au3") Then
    #include '<plugins'&$Plugin&'>'
    $Plugin_anzahl = $Plugin_anzahl + 1
    EndIf
    EndIf
    WEnd
    EndFunc ;==>Server_IncludePlugins

    [/autoit]

    Mein Problem: In den <> bei einem Include dürfen keine Variablen verwendet werden. Irgendwie blöd, denn das schmeißt mein Plugin-Vorhaben komplett über den Haufen. Weiß jemand eine Lösung oder eine Alternative?

    Lg V8II

    Einmal editiert, zuletzt von V8II (6. Juli 2011 um 22:22)

  • Weil ich einfach viel zu neidisch bin, den Quelltext herzugeben =)


    EDIT: HM ich kanns natürlich manuell machen :
    Datei auslesen, und per Execute die Befehle selber ausführen. Ist aber recht umständlich ... mal sehen.

  • Wie darf man sich so ein Plugin denn vorstellen? Kannste da mal ein Beispiel posten? Wenn es sich nur um zusätzliche Daten handelt, also vielleicht ein neue Spielfigur mit bestimmten Attributen, eine neue Karte der Spiellandschaft oder ähnliches, ist dafür ja kein Script notwendig, sondern viel mehr eine Schnittstelle im Hauptprogramm, dass nach neuen Grafiken und/oder ini Datein usw. im Pluginverzeichnis sucht.

    Includen kannst du jedenfalls nichts mehr wenn ein Script erstmal kompiliert ist, du kannst höchstens neue Teilprogramme kompilieren die dann per run aufgerufen werden (dazu müsstest du einen autoit compiler beilegen), oder aber wie du selbst schon vorgschlagen hast mit execute usw. die Codezeilen der Plugin.au3 ausführen. Beides sind eher unschöne und vermutlich auch nicht zielführende Lösungen.

  • Zitat

    Datei auslesen, und per Execute die Befehle selber ausführen. Ist aber recht umständlich ... mal sehen.


    Execute unterstützt nur einzeilige Befehlsreihen. Und wenn du versuchst das zu umgehen, replizierst du im Grunde nur einen AutoIt Interpreter mit AutoIt. Irgendwie sinnlos...
    Du könntest eine Art API für dein Script zur Verfügung stellen, um es mit externen Programmen zu steuern.

  • Ich habe eine fette UDF geschrieben, die es ermöglicht viele Sachen im Spiel zu kontrollieren und zu steuern, sie ist allerdings noch nicht fertig. Die Befehle die in der UDF stehen werde ich dann bekanntgeben, man kann allerdings beinahe alles steuern. Diese Befehle können in den Plugins natürlich benutzt werden ...

    Winziger Ausschnitt aus der UDF:

    Spoiler anzeigen
    [autoit]

    Func SkillsGetDmg()
    $sklvl1 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 1)
    $sklvl2 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 2)
    $sklvl3 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 3)
    $sklvl4 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 4)
    Dim $skilldmg[4]
    $skilldmg[0] = (4 + ($sklvl1 * 3)) / 8
    $skilldmg[1] = (8 + ($sklvl2 * 5)) / 8
    $skilldmg[2] = (14 + ($sklvl3 * 7)) / 8
    $skilldmg[3] = (20 + ($sklvl4 * 12)) / 8
    Return $skilldmg
    EndFunc ;==>SkillsGetDmg

    [/autoit] [autoit][/autoit] [autoit]

    Func SkillsGetManaUsage()
    $sklvl1 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 1)
    $sklvl2 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 2)
    $sklvl3 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 3)
    $sklvl4 = _RegRead("HKEY_CURRENT_USER\Software\KM\skill", 4)
    Dim $Usage[4]
    $Usage[0] = 15 + (2 * $sklvl1)
    $Usage[1] = 25 + (2 * $sklvl1)
    $Usage[2] = 35 + (2 * $sklvl1)
    $Usage[3] = 45 + (2 * $sklvl1)
    Return $Usage
    EndFunc ;==>SkillsGetManaUsage

    [/autoit]

  • Execute unterstützt nur einzeilige Befehlsreihen. Und wenn du versuchst das zu umgehen, replizierst du im Grunde nur einen AutoIt Interpreter mit AutoIt. Irgendwie sinnlos...
    Du könntest eine Art API für dein Script zur Verfügung stellen, um es mit externen Programmen zu steuern.


    Sorry ich weiß Doppelposts sind nicht erwünscht ...

    Ich gedenke alle zeilen einzeln auszulesen und auszuführen ...

  • Hi,
    1. Wenn das ein Game Server wird: Warum speicherst du denn den Fortschritt immer sofort in der Registry? Das wird dich später gewaltig Rechenzeit kosten.
    Man sollte alle Daten unbedingt im Server lassen und nur rund alle 10 Minuten die Daten auf die Festplatte schreiben.
    2. Was sollen wir mit diesem Codeschnipsel? Prahlen kannst du wenn alles fertig ist.
    3. Ich würde dir Empfehlen: Deine Plugins in einer, vom Server, interpretierbaren Sprache schreiben. Im Klartext, du kannst einen kleinen Phraser schreiben der dann dementsprechend die Befehle ausführt und die hast keinen Stress mit den includes (die eh nicht möglich sind :D )

  • Zitat

    1. Wenn das ein Game Server wird: Warum speicherst du denn den Fortschritt immer sofort in der Registry?

    Tue ich nicht. Die beiden Befehle die ich gezeigt habe werden beim Start ausgeführt.

    Zitat

    2. Was sollen wir mit diesem Codeschnipsel? Prahlen kannst du wenn alles fertig ist.

    Es hat nur jemand nach dem grundsätzlichen Aussehen gefragt ... Prahlen wollte ich nicht sorry.

    Zitat

    3. Ich würde dir Empfehlen: Deine Plugins in einer, vom Server, interpretierbaren Sprache schreiben. Im Klartext, du kannst einen kleinen Phraser schreiben der dann dementsprechend die Befehle ausführt und die hast keinen Stress mit den includes (die eh nicht möglich sind :D )

    Gute Idee.

  • Meine Frage nach einem Beispiel Plugin hast du mir mit dem UDF Ausschnitt nicht wirklich beantwortet. Du zeigst hier ja lediglich was dein Script eben für Funktionen hat, nicht wie so ein Plugin dein Hauptscript erweitern soll.

    Was man btw theoretisch machen kann um ein kompiliertes Script nachträglich zu verändern und mit neuem Quellcode zu versehen wäre folgendes:

    1. original Quellcode muss in einer Datei vorhanden sein, meinetwegen verschlüsselt
    2. Quellcode wird von der Updateroutine entschlüsselt und mit neuem plugin Code ergänzt
    3. Ein beigelegter Autoitcompiler erzeugt aus dem neuen Quellcode String eine neue Programm exe
    4. Das alte Programm deinstalliert sich, also löscht die eigene exe, benennt die neue exe um und startet diese
    5. fertig ist das neu compilierte und erweiterte Programm.

    Am problematischten wird wohl Schritt 2 sein, da es ja nicht damit getan ist neue Funktionen in den Quellcode zupacken, diese müssen schliesslich auch irgendwo aufgerufen werden, das heisst es müssen auch bestehende Funktionen des original Quellcodes erweitert/verändert werden, oder man ersetzt schlichtweg bestehende Funktionen komplett durch den neuen Code. Das ganze hat dann aber eigentlich weniger mit einem Plugin zutun, sondern stellt vielmehr ein intelligentes platzsparendes Updatesystem dar, bei dem nur kleine Bestandteile statt der kompletten exe heruntergeladen werden müssen (sinn mal dahingestellt).

    Ich bin mir aber sehr sicher, dass es für dein Problem viel einfachere Lösungen gibt. Solange du weder dein Script/Spiel posten noch sonstwie nähere Angaben machen kannst/willst sehe ich aber eine geringe Chance, dass wir dir dabei helfen können.

    EDIT:
    Warum du so Dinge wie Skills (was auch immer das im einzelnen sein mag) in der Registry anstatt in Dateien speicherst ist mir btw auch nicht klar. Ini Dateien sind da sicher die bessere Lösung.

  • Zitat

    Ich bin mir aber sehr sicher, dass es für dein Problem viel einfachere Lösungen gibt. Solange du weder dein Script/Spiel posten noch sonstwie nähere Angaben machen kannst/willst sehe ich aber eine geringe Chance, dass wir dir dabei helfen können.

    Ich denke auch ,dass es einfachere Lösungen gibt und die Chance, dass ich noch einmal eure Hilfe brauchen werde ist wohl ziemlcih groß. :rolleyes:

    Zitat

    EDIT:
    Warum du so Dinge wie Skills (was auch immer das im einzelnen sein mag) in der Registry anstatt in Dateien speicherst ist mir btw auch nicht klar. Ini Dateien sind da sicher die bessere Lösung.

    Ich habe ein Test-programm gemacht wo ich die Schnelligkeit von RegWrite und IniWrite überprüft habe und RegWrite war hier deutlich schneller. Außerdem denke ich, dass es sicherer ist ...

  • Zitat

    Ich habe ein Test-programm gemacht wo ich die Schnelligkeit von RegWrite und IniWrite überprüft habe und RegWrite war hier deutlich schneller. Außerdem denke ich, dass es sicherer ist ...


    Die Registry sollte man nicht mit so etwas zumüllen... Die Diskussion hatten wir hier aber schon mal.

  • Wieso?
    Hat das irgendwelche Folgen?
    Hast du eventuell den Link zur Diskussion?
    Lg V8II

  • Anstelle von ini read/write und co. kann man btw auch ein eigenes Speicherformat "erfinden" und eigene lese und schreib Methoden entwickeln. Kombiniert mit Verschlüsselung ist auch die Sicherheit vor manuellen Veränderungen gegeben, was du in der Registry ja btw auch nicht hast, also nur trügerische Sicherheit. Aber lassen wir das, denn es hat vermutlich weniger mit deinem Pluginsystem zutun, wo wir beim Thema wären was eines deiner Plugins denn nun eigentlich verändern/ermöglichen soll. Ich kann mir derzeit nichts darunter vorstellen und nicht nachvollziehen warum du dafür Autoitcode benötigst.

  • Zitat

    Das kann z.B. ggf. den Computer verlangsamen. Aber ein ganz anderes Problem wird hier genannt.

    Okay danke.

    Zitat


    Anstelle von ini read/write und co. kann man btw auch ein eigenes Speicherformat "erfinden" und eigene lese und schreib Methoden entwickeln. Kombiniert mit Verschlüsselung ist auch die Sicherheit vor manuellen Veränderungen gegeben, was du in der Registry ja btw auch nicht hast, also nur trügerische Sicherheit. Aber lassen wir das, denn es hat vermutlich weniger mit deinem Pluginsystem zutun, wo wir beim Thema wären was eines deiner Plugins denn nun eigentlich verändern/ermöglichen soll. Ich kann mir derzeit nichts darunter vorstellen und nicht nachvollziehen warum du dafür Autoitcode benötigst.

    Schon dabei!
    LG V8II