Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 21 von 27 « Erste ... 1014171819202122232425 ... Letzte »
Ergebnis 401 bis 420 von 538
  1. Homepage besuchen Beiträge anzeigen #401 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Funktioniert einwandfrei, danke!

    Zitat Zitat von Lehona Beitrag anzeigen
    Ich verstehe nicht, warum du hier mehr Variablen brauchst? Aber ich hätte mir das ca. so vorgestellt:

    Code:
    func string LinebreakText(var string text, var int view_width, var string font) {
        var int count; count = STR_SplitCount(text, " ");
        var int budget; budget = 0;
        var int k; k = 0;
        var string result; result = "";
    
        // Loop over all 'count' words
        repeat(k, count);
            var string word; word = STR_Split(text, " ", k);
            var int word_width; word_width = Print_GetStringWidth(word, font);
            
            // Add linebreak if word doesn't fit anymore
            if (budget + word_width) > view_width {
                result = ConcatStrings(result, Print_LineSeparator);
                budget = 0;
            }
    
            result = ConcatStrings(result, word);
            result = ConcatStrings(result, " "); // Add space back in
    
            budget += word_width;
    
        end;
        return result;
    };
    Gegeben einem String, einer maximalen Zeilenlänge und einem Font sollte das einen neuen String zurückgeben, der an den passenden Stellen einen Zeilenumbruch hat.
    Hab ich aber noch nicht getestet und es geht davon aus, dass zu Beginn keine Zeilenumbrüche in dem String enthalten sind.

  2. Homepage besuchen Beiträge anzeigen #402 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Bei jedem Buff legt man ja direkt einen Wert fest, wie lange der jeweilige Buff aktiv bleiben soll (durationMS). Nun möchte ich diesen Wert aber variabel machen. Ist der Buff noch aktiv, möchte ich die neue, nun vermutlich andere durationMS, der verbleibenden Zeit, die der Buff noch aktiv ist, einfach hinzufügen. LeGo bietet dafür anscheinend keine eigene Funktion. Wie setze ich das also am besten um bzw. ist das so mit den Buffs überhaupt ohne Weiteres möglich?

  3. Beiträge anzeigen #403 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Draxes Beitrag anzeigen
    Wir haben in Dirty Swamp die neue LeGo Version eingebaut und haben zusammen mit dem aktuellen SystemPack das Problem, dass die Leben- und Manaleiste permanent angezeigt werden (zumindest vermute ich, dass es an der Kombination aus LeGo und SystemPack liegt). Gibt es da schon andere Erfahrungsberichte, die das bestätigen können?

    Dazu hatten wir noch einige eigene Bars, die dadurch permanent sichtbar wurden nach einem Dialog/Charakterbildschirm, da diese nicht permanent geupdated wurden sondern nur manuell eingeblendet/ausgeblendet werden. Vielleicht kann man an dieser Stelle nochmal einhaken und eine Prüfung einbauen, ob die Bars vorher sichtbar waren und sie auch nur dann wieder anzeigen? Ansonsten zwingt es dazu, die Bars in einer Schleife selbst ein/auszublenden um so dieses Verhalten zu umgehen.
    Das konnte ich noch nicht so feststellen. Kannst du mal prüfen, ob es ohne SystemPack auch zu dem Problem kommt? Und wenn es tatsächlich an der Kombination mit dem SystemPack liegt, ob dessen Einstellungen zur dauerhaften Anzeige von HP-/Manabalken da eine Rolle spielen?

  4. Homepage besuchen Beiträge anzeigen #404 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Ich möchte diesen Beitrag noch mal hochschieben.

    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Bei jedem Buff legt man ja direkt einen Wert fest, wie lange der jeweilige Buff aktiv bleiben soll (durationMS). Nun möchte ich diesen Wert aber variabel machen. Ist der Buff noch aktiv, möchte ich die neue, nun vermutlich andere durationMS, der verbleibenden Zeit, die der Buff noch aktiv ist, einfach hinzufügen. LeGo bietet dafür anscheinend keine eigene Funktion. Wie setze ich das also am besten um bzw. ist das so mit den Buffs überhaupt ohne Weiteres möglich?
    Da die LeGo-Buffs diese Möglichkeit scheinbar bisher nicht bieten, wäre eine Funktion die das erlaubt mMn. eine nützliche Neuerung für das Paket.

  5. Beiträge anzeigen #405 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Ich möchte diesen Beitrag noch mal hochschieben.



    Da die LeGo-Buffs diese Möglichkeit scheinbar bisher nicht bieten, wäre eine Funktion die das erlaubt mMn. eine nützliche Neuerung für das Paket.
    Es gibt ja Buff_Refresh, was nicht ganz macht, was du möchtest, aber vielleicht fast?
    Code:
    func void Buff_Refresh(var int bh) {
    	if (!Hlp_IsValidHandle(bh)) { return; };
    	var lcBuff b; b = get(bh);
    
    	b.nextTickNr = 1;
    	b._endTime = TimerGT() + b.durationMS;
    };
    Vielleicht mal so ausprobieren:

    Code:
    func void Buff_AddTime(var int bh, var int addMS) {
    	if (!Hlp_IsValidHandle(bh)) { return; };
    	var lcBuff b; b = get(bh);
    
    	b._endTime += addMS;
    };
    Geändert von Milky-Way (07.08.2020 um 01:18 Uhr)

  6. Beiträge anzeigen #406 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Ich möchte diesen Beitrag noch mal hochschieben.



    Da die LeGo-Buffs diese Möglichkeit scheinbar bisher nicht bieten, wäre eine Funktion die das erlaubt mMn. eine nützliche Neuerung für das Paket.
    Ich habe den Post nicht vergessen, aber konnte dir da aus dem Gedächtnis heraus keine Lösung anbieten. Habe nochmal genauer in den Code geguckt, und folgende Bedingung muss erfüllt werden, damit ein Buff entfernt wird:

    Code:
    if (b.nextTickNr > b.durationMS/b.tickMS) { /* Remove Buff */ }
    Du kannst also einfach die durationMS erhöhen, um den Buff zu verlängern (zum Glück ganz intuitiv ). Es wäre schön, wenn du eine entsprechen Funktion (sie könnte Buff_ApplyOrAddDuration heißen) schreiben und hier mit uns teilen könntest. Dazu kannst du dich ganz einfach an der Buff_ApplyOrRefresh orientieren, nur dass du anstatt zu refresehen eben die durationMS erhöhst.

    Falls du dazu noch Fragen hast, meld dich - es wäre toll, wenn wir die Funktion dann in LeGo aufnehmen könnten

    Edit: Da war Milky aber fix - die _endTime ist allerdings nur für die Anzeige wichtig, du solltest also am besten die _endTime und durationMS modifzieren. Und dich entscheiden, ob du eine Zeit als Parameter nimmst oder davon ausgehst, dass man einfach die komplette Dauer des Buffs nochmal hinzufügt.

    Edit2: Normalerweise hat man vermutlich auch nicht das Handle des Buffs zur Hand, daher ist - vermute ich - eine NPC-Variable + Buff-Instanz sinnvoller als Parameter. Wie du von da an das Handle kommst siehst du ja in ApplyOrRefresh.
    Geändert von Lehona (07.08.2020 um 01:27 Uhr)

  7. Homepage besuchen Beiträge anzeigen #407 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Top. Vielen Dank euch beiden.
    Ich schaue mir das dann morgen mal genauer an und sobald ich eine funktionierende Funktion habe, werde ich sie hier zur Verfügung stellen.

  8. Homepage besuchen Beiträge anzeigen #408 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Hier die Funktion:

    Code:
    func int Buff_ApplyOrAddDuration(var C_NPC n, var int buff, var int timeMS) {
        var int bh; bh = Buff_Has(n, buff);
        if (bh) {
            var lcBuff b; b = get(bh);
            
            b._endTime   += timeMS;
            b.durationMS += timeMS;
    
        } else {
            
            buff_timeMS = timeMS;
            return Buff_Apply(n, buff);
        };
    };
    Habe sie getestet und konnte keine Probleme damit feststellen.
    Oberhalb von Buff_Apply habe ich noch die Variable buff_timeMS hinzugefügt und in der Buff_Apply
    Code:
    if (!b.durationMS) { b.durationMS = buff_timeMS; };
    Das soll dafür sorgen, dass man beim Buff keinen Wert festlegen muss. Sonst wird logischerweise der Buff, wenn der beim jeweiligen NPC nicht aktiv ist, mit dem in der Instance angegebenen durationMS-Wert erstellt. Mir ist da leider gerade keine andere Lösung eingefallen, ohne extra eine zusätzliche Funktion dafür zu schreiben, schöner wäre es natürlich, wenn man den Funktionsparameter timeMS einfach an Buff_Apply übergeben könnte, ohne die Funktion selbst zu verändern, ist das vielleicht sogar möglich?

    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Top. Vielen Dank euch beiden.
    Ich schaue mir das dann morgen mal genauer an und sobald ich eine funktionierende Funktion habe, werde ich sie hier zur Verfügung stellen.
    Geändert von Bloodfly91 (07.08.2020 um 19:46 Uhr)

  9. Beiträge anzeigen #409 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Vielen Dank schonmal für deine Mühen. Eine Kommunikation über globale Variablen sehe ich kritisch und möchte ich ungern in LeGo aufnehmen, allerdings habe ich auch deinen Anwendungsfall noch nicht ganz verstanden. Kannst du ein bisschen ausführen, wofür genau du das benutzt? Ich hätte angenommen, dass man einfach in der Buff-Instanz die durationMS auf die Dauer der ersten Applikation setzt, d.h. im Fall von Buff_Apply, wenn also noch kein Buff auf dem NPC vorhanden ist, der zusätzliche Zeit-Parameter ignoriert wird.


    Buff_Apply einen zusätzlichen Parameter zu geben wäre ein Breaking Change, den man nicht ohne weiteres (für bereits vorhandene Benutzer) einführen kann.

  10. Homepage besuchen Beiträge anzeigen #410 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Das mit der Variable dachte ich mir. Mein Plan ist, Regeneration über Zeit durch Lebensmittel. Jedes Nahrungsmittel oder zumindest so ziemlich jedes Nahrungsmittel hat einen anderen Zeitwert, wie lange es das Leben regeneriert. Die Dauer, die der Buff laufen soll, wird in den meisten Fällen also unterschiedlich sein. Das ist ein Problem, wenn der Buff noch nicht auf den jeweiligen NPC wirkt und ihm das erste mal per Buff_Apply zugewiesen wird. Läuft der Buff bereits, soll der neue Zeitwert der noch verbleibenden durationMS des Buffs also einfach hinzuaddiert werden.

    Als mögliche Lösung, um diese Funktion für jeden, der die Buffs benutzt, problemlos nutzbar zu machen und auf Variablen verzichten zu können, fällt mir nur ein, die Funktion Buff_Apply zu kopieren und etwas abzuändern.

    Edit:

    Hier die Version ohne Variablen. Eigentlich wollte ich das morgen machen, aber das wollte mir jetzt einfach keine Ruhe lassen.

    Code:
    func int Buff_Apply_Duration(var c_npc npc, var int buff, var int timeMS) {
            var int bh; bh = new(buff);
            var lCBuff b; b = get(bh);
            
            b.targetID = Npc_GetID(npc);
    
    
            b.durationMS = timeMS;
            b._startedTime = TimerGT();
            b._endTime = b._startedTime + b.durationMS;
        
            if (b.OnApply) {
                    bh;
                    MEM_CallByID(b.OnApply);
                    // Might have been deleted just now (would make little sense)
                    if (!Hlp_IsValidHandle(bh)) {
                        return -1;
                    };
            };
            b.nextTickNr = 1;
    
    
            if (!b.tickMS) { b.tickMS = b.durationMS+1; /* Increase by one so tickCount is zero */ };
    
    
            FF_ApplyExtDataGT(_Buff_Dispatcher, b.tickMS, -1, bh);
            
    
    
            if (Npc_IsPlayer(npc) && Buffs_DisplayForHero) {
                    /* Add this buff to the hero's bufflist, for display */
                    BuffList_Add(bh);
            };
            return bh;
    };
    Code:
    func int Buff_ApplyOrAddDuration(var C_NPC n, var int buff, var int timeMS) {
        var int bh; bh = Buff_Has(n, buff);
        if (bh) {
            var lcBuff b; b = get(bh);
            
            b._endTime += timeMS;
            b.durationMS += timeMS;
    
    
        } else {
    
    
            return Buff_Apply_Duration(n, buff, timeMS);
        };
    };
    Ich denke, eine Buff_Apply Funktion, die den Nutzer selbst bestimmen lässt, wie lange ein Buff laufen soll, ist ohnehin auch nützlich. So kann man den selben Buff mit unterschiedlicher Dauer mehrmals anwenden, ohne eine neue Instanz anlegen zu müssen. Vielleicht könnte man auch noch weitere Versionen der anderen Buff-Funktionen damit erstellen, zum Beispiel Buff_ApplyUnique_Duration. Falls das durch meine abgeänderte Buff_Apply_Duration-Funktion jetzt nicht zu unnötig kompliziert geworden ist und es nicht evtl. noch andere Methoden gibt, das Ganze kürzer / eleganter zu gestalten (was denke ich wahrscheinlich ist. ), und Interesse besteht, kann ich mich darum kümmern.

    Allerdings habe ich die Funktionen jetzt noch nicht ausführlich getestet und da ich ziemlich müde bin, kann es gut sein, dass da noch irgendwo ein Fehler drinnen ist. Ich schaue mir das morgen Ingame noch mal genauer an.
    Geändert von Bloodfly91 (07.08.2020 um 23:49 Uhr)

  11. Beiträge anzeigen #411 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Ich melde mich nochmal zurück bzgl meines Problems mit LeGo und meiner verwendung von Hashtables als Key-Value Storage für State welchen ich für Buffs verwende.

    Beim erstmaligen laden eines Saves gibts keine Probleme, aber sobald man ingame direkt nach dem laden (oder auch später) einen Spielstand (auch den aktuellen) wieder lädt, häufen sich im zSpy die folgenden Meldungen, in dem zspy log ab zeile 13371, direkt nach "Reset ALL the handles!". In einem Ladevorgang sind das 72! Stacktraces.
    Ich blicke leider nicht durch wie genau das zu stande kommt.


    Log: zSpyDefault.zip

    Code:
    -4-	07:02 Info:  0 Q: LeGo 2.7.1-N002 wird initialisiert.
    -4-	07:02 Info:  0 Q: Flags: PRINTS HOOKENGINE AI_FUNCTION FRAMEFUNCTIONS FOCUSNAMES RANDOM SAVES PERMMEM ANIM8 VIEW INTERFACE TIMER CONSOLECOMMANDS BUFFS
    -4-	07:02 Info:  0 Q: === PermMem::UnArchive ===
    -4-	07:02 Info:  0 Q: Reset ALL the handles!
    -2-	07:02 Fault: 0 Q: [start of stacktrace]
    -2-	07:02 Fault: 0 Q:         MEMINT_HANDLEERROR(2, 'MEM_Free: ptr is 0. Ignoring request.') +   62 bytes
    -2-	07:02 Fault: 0 Q:         MEM_WARN('MEM_Free: ptr is 0. Ignoring request.')              +   21 bytes
    -2-	07:02 Fault: 0 Q:         MEM_FREE_(0)                                                   +   27 bytes
    -2-	07:02 Fault: 0 Q:         _HT_DESTROY(1243163008)                                        +  137 bytes
    -2-	07:02 Fault: 0 Q:         HT_ARRAY_DELETE((instance)1243163008)                          +   21 bytes
    -2-	07:02 Fault: 0 Q:         MEM_CALLBYID(10797)                                            +  224 bytes
    -2-	07:02 Fault: 0 Q:         DELETE(74)                                                     +  180 bytes
    -2-	07:02 Fault: 0 Q:         [UNKNOWN]                                                      +637194866 bytes
    -2-	07:02 Fault: 0 Q:         _DELETEALL(74, 1243163008)                                     +   22 bytes
    -2-	07:02 Fault: 0 Q:         MEM_CALLBYID(10797)                                            +  224 bytes
    -2-	07:02 Fault: 0 Q:         MEM_CALL(_HT_FOREACH.FNC)                                      +   21 bytes
    -2-	07:02 Fault: 0 Q:         _HT_FOREACH(1245908664, _DELETEALL)                            +  222 bytes
    -2-	07:02 Fault: 0 Q:         _PM_RESET()                                                    +   35 bytes
    -2-	07:02 Fault: 0 Q:         _PM_UNARCHIVE()                                                +  256 bytes
    -2-	07:02 Fault: 0 Q:         _BR_LOADGAME()                                                 +   80 bytes
    -2-	07:02 Fault: 0 Q:         LEGO_INITALWAYS(12746151)                                      +  215 bytes
    -2-	07:02 Fault: 0 Q:         LEGO_INIT(12599715)                                            +  163 bytes
    -2-	07:02 Fault: 0 Q:         INITCUSTOMSCRIPTS()                                            +   51 bytes
    -2-	07:02 Fault: 0 Q:         INIT_GLOBAL()                                                  +   10 bytes
    -2-	07:03 Fault: 0 Q: [end of stacktrace]
    Der "nullptr" ist an dieser stelle "buck.array"

    Code:
    func void _HT_Destroy(var int ptr) {
    
    	var zCArray arr; arr = _^(ptr); var zCArray buck;
    	var int i; var int j; var int bucket; i = 0; j = 0;
    	repeat(i, arr.numAlloc/4);
    		bucket = MEM_ReadIntArray(arr.array, i);
    		if (bucket) {
    			buck = _^(bucket);
    			MEM_Free(buck.array); // <-- DAS HIER IST NULL
    			MEM_Free(bucket);
    		};
    	end;
    	MEM_Free(arr.array);
    	MEM_Free(ptr);
    };
    Geändert von Kirides (14.08.2020 um 20:01 Uhr)

  12. Beiträge anzeigen #412 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Ah, wenn man mit Ikarus ein Array erstellt, wird nicht direkt ein Buffer angelegt (und das ist gut so). Anstatt das selber zu Free'n hätte ich MEM_ArrayFree(bucket) verwenden sollen. Ich kann mir vorstellen, dass das das (????) Laden erheblich beschleunigen könnte.

    Edit: Implementiert und kann keine Stacktraces im zSpy mehr finden nach dem Laden.
    Geändert von Lehona (14.08.2020 um 20:55 Uhr)

  13. Beiträge anzeigen #413 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Kirides, du scheinst in deiner Mod-Installation Ninja zu verwenden. Beachte, dass die Änderung von Lehona noch nicht direkt von Ninja unterstützt wird (aktueller Stand 3f9d805). Falls du normal im Modkit skriptest, kannst du Ninja ja dafür deaktivieren.

    Die Änderung wird dann bald auch von Ninja unterstützt. Entweder wenn sich ein paar mehr Änderungen gesammelt haben oder spätestens wenn du etwas veröffentlichen willst und mich darum bittest ;)

  14. Beiträge anzeigen #414 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Kirides, du scheinst in deiner Mod-Installation Ninja zu verwenden. Beachte, dass die Änderung von Lehona noch nicht direkt von Ninja unterstützt wird (aktueller Stand 3f9d805). Falls du normal im Modkit skriptest, kannst du Ninja ja dafür deaktivieren.

    Die Änderung wird dann bald auch von Ninja unterstützt. Entweder wenn sich ein paar mehr Änderungen gesammelt haben oder spätestens wenn du etwas veröffentlichen willst und mich darum bittest
    Öhm... Nein, habe kein Ninja in meiner Mod-Installation (dafür aber union 1.0h, zum testen)
    Wie kommst du darauf?

    Also ich habe aktuell die Dev-branch Scripte von LeGo in meiner Mod installation, falls du darauf hinaus willst.

    Problematisch sollten die dev scripte aktuell nicht sein, da ich keine neue funktionalität verwende.

  15. Beiträge anzeigen #415 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    Wie kommst du darauf?
    Erste Zeile in deinem zSpy Log.

  16. Beiträge anzeigen #416 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Erste Zeile in deinem zSpy Log.
    Ohh, ja klar, den Log hatte ich ja in meiner "Play Test" Installation gemacht und nicht mit der MDK installation, kein Wunder. Ja - Dort war Ninja aktiv.


    EDIT:

    Nebenbei, wäre es möglich LeGo Buffs zu bekommen, welche eine "unbegrenzte" dauer haben? Bei diesen würde man dann z.B. über die OnTick Funktion auswerten können ob man einen Buff entfernen will.

    Aktuell kann man ja entweder direkt die lcBuff Instanz manipulieren oder eine enorm lange Dauer angeben ... beides nicht wirklich schön :/
    Geändert von Kirides (16.08.2020 um 16:28 Uhr)

  17. Beiträge anzeigen #417 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von Kirides Beitrag anzeigen
    Nebenbei, wäre es möglich LeGo Buffs zu bekommen, welche eine "unbegrenzte" dauer haben? Bei diesen würde man dann z.B. über die OnTick Funktion auswerten können ob man einen Buff entfernen will.

    Aktuell kann man ja entweder direkt die lcBuff Instanz manipulieren oder eine enorm lange Dauer angeben ... beides nicht wirklich schön :/
    Guter Vorschlag, ich schau mal, wie man das am schönsten unterbringt.

  18. Beiträge anzeigen #418 Zitieren
    Held Avatar von GiftGrün
    Registriert seit
    Jun 2011
    Ort
    Gewächshaus des Assassinen
    Beiträge
    5.010
     
    GiftGrün ist offline
    Hey, ich hab mal eine etwas allgemeinere Frage. Ikarus und LeGo sind ja sowas wie Modding-Frameworks (oder wie auch immer man das nennen soll), und da gerade einige Modder in einem anderen Spiel darüber diskutieren, wie man denn ein gemeinsam von der Community geschriebenes Modding-Framework (in C#) strukturieren sollte, wollte ich mal fragen, ob ihr da vielleicht ein paar Tipps hättet. Versionskontrollsysteme sind sowieso ein Muss, aber wie sollten sich die Modder, die an diesem Framework arbeiten wollen, diese Arbeit am besten aufteilen und wer muss auf was achten, um (möglichst dezentral) zu garantieren, dass da nichts von jemand anderem Geschriebenes kaputt geht?
    “Da ist auch noch ein anderer Geruch in der Luft, der Geruch von Feuern, die in der Ferne brennen, mit einem Hauch Zimt darin - so riecht das Abenteuer!”
    ― aus Walter Moers' "Die 13 1/2 Leben des Käpt'n Blaubär"

  19. Beiträge anzeigen #419 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline

    Cursor.d suggestion for more events

    Hello mud-freak, Lehona,
    Would it be possible to add into Cursor.d support for more events - KEY_RELEASED is one I think might be useful. Also I've been playing around a little bit and added event for double-click, not sure however how problematic this one might be. To find out if user double-clicked I am checking difference between first captured Timer() on KEY_RELEASED and second captured Timer() on KEY_PRESSED. If delta <= 300 then I consider event to be double-click. Here I don't know how Timer() behaves (can it overflow and start from 0 again? delta value 300 might be okay on my PC set, but wont work on others ...), so might be this cannot be implemented as easily as I imagined. Let me know your thoughts please
    Code:
    func void _Cursor_GetVal() {
        var _Cursor c; c = _^(Cursor_Ptr);
    
        Cursor_RelX = c.relX;
        Cursor_RelY = c.relY;
        Cursor_fX = addf(mulf(mkf(Cursor_RelX), mulf(MEM_ReadInt(Cursor_sX), mkf(2))), Cursor_fX);
        Cursor_fY = addf(mulf(mkf(Cursor_RelY), mulf(MEM_ReadInt(Cursor_sY), mkf(2))), Cursor_fY);
    
        Cursor_X = roundf(Cursor_fX);
        Cursor_Y = roundf(Cursor_fY);
        Cursor_Wheel = c.wheel;
    
        Cursor_KeyState(_@(Cursor_Left),  c.keyLeft);
        Cursor_KeyState(_@(Cursor_Right), c.keyRight);
        Cursor_KeyState(_@(Cursor_Mid),   c.keyMid);
    
    //--- Double-click
    
         var int t;
    
          var int doubleClick;
         var int doubleClickX;
          var int doubleClickY;
    
           if(Cursor_Left == KEY_PRESSED) {
                  if (doubleClick) {
                         doubleClick = 0;
    
                        if ((Timer() - t) <= 300)
                         && (doubleClickX == Cursor_X)
                         && (doubleClickY == Cursor_Y)
                         {
                                //Remove KEY_PRESSED event and execute event for double-click
                                Cursor_Left = KEY_UP;
                                Event_Execute (Cursor_Event, CUR_LeftDoubleClick);
                         };
                  };
           };
    
          if(Cursor_Left == KEY_RELEASED) {
                  t = Timer();
                  doubleClick = 1;
                  doubleClickX = Cursor_X;
                  doubleClickY = Cursor_Y;
           };
    
    //--- Key released
    
    if(Cursor_Left == KEY_RELEASED) {
                  Event_Execute(Cursor_Event, CUR_LeftReleased);
           };
           if(Cursor_Right == KEY_RELEASED) {
                  Event_Execute(Cursor_Event, CUR_RightReleased);
           };
           if(Cursor_Mid == KEY_RELEASED) {
                  Event_Execute(Cursor_Event, CUR_MidReleased);
           };
    ...

  20. Beiträge anzeigen #420 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.244
     
    Milky-Way ist offline
    Potenzieller Bug: Wenn ich nach dem "manuellen" (Bar_Hide(.)) Ausblenden der Bar das Spielmenü, Tagebuch, oder Statusbildschirm öffne und wieder schließe, dann ist die Bar wieder da. Hier scheint es eventuell einen Bug zu geben im Code, der die Bar im Menü ausblenden soll, wodurch nach Ende des Menüs auch bars wieder angezeigt werden, die vorher ausgeblendet waren. Ich nehme an, dass dieser Bug auch zur Anzeige der Bars führt, wenn ein neues Spiel gestartet oder ein Spielstand geladen wird.


    Ich nehme an, das Problem wird verursacht durch diese Funktion:
    Code:
    func void _Bar_Update() {
        var int status; status = _Bar_PlayerStatus();
        const int SET = 0;
        if (SET != status) {
            SET = status;
            if (SET) {
                foreachHndl(_bar@, Bar_Show);
            } else {
                foreachHndl(_bar@, Bar_Hide);
            };
        };
    };
    hier müsste man sich merken, welche Bars überhaupt geschlossen wurden (offen waren) bei else. Mir ist nicht klar, wie man das gut bewerkstelligen kann, da ja letztlich einfach für jede Bar
    Code:
    func void View_Close(var int hndl) {
        CALL__thiscall(getPtr(hndl), zCView__Close);
    };
    aufgerufen wird und man dort vermutlich nicht so einfach herausfindet, war bereits geschlossen war (?). Man bräuchte eine Funktion View_IsOpen und müsste sich das dann merken für jeden View (als zusätzliches Attribut oder in einer externen Liste?). Eine Engine-Funktion dafür habe ich auf die schnelle nicht gefunden, aber vielleicht reicht ja schon zCView.isOpen oder zCView.isClosed?



    (Übrigens scheinen in der Bars.d auch die Kommentare zu Bar_Hide und Bar_Show vertauscht)




    ---

    Wie das Problem bei mir aufgetreten ist:

    Ich habe ein Update von LeGo von Version 2.6 auf Version 2.7.1 durchgeführt. Nun werden bei mir zwei selbst-erstellte bars bei Spielstart (oder Laden eines alten Spielstands) angezeigt, obwohl sie eigentlich ausgeblendet sein sollten.


    Definition:
    Code:
    // DesertBar Varibles
    var int desertBarHandle;
    var int desertBar_hidden;
    const int AMBVAR_Desert_counter_MAX = 150;
    var int AMBVAR_Desert_counter;
    
    instance DesertBar(GothicBar){
    	x = Print_Screen[PS_X] - 100;
    	y = Print_Screen[PS_Y] - 40;
    	barTex = "Bar_Desert.tga";
    };

    In der Init Funktion der Welt wird die Bar erstellt, falls noch nicht vorhanden:
    Code:
    	if(!Hlp_IsValidHandle(desertBarHandle)) {
            desertBarHandle = Bar_Create(desertBar); // Unsere WuestenBar
    		Bar_SetMax(desertBarHandle, AMBVAR_Desert_counter_MAX);
    		Bar_SetValue(desertBarHandle, AMBVAR_Desert_counter_MAX);
    		Bar_Hide(desertBarHandle);
    		desertBar_hidden = TRUE;
    		AMBVAR_Desert_counter = AMBVAR_Desert_counter_MAX;
    		//View_Top(desertBarHandle);
    		PrintDebugg("Created desertBarHandle!");
    	};
    In einer sekündlich aufgerufenen Funktion schauen wir dann, ob die Bar angezeigt werden soll oder nicht:
    Code:
    	Print(IntToString(desertBar_hidden));
    	if desertBar_hidden == TRUE
    	&& ((SYSVAR_LOA_Current_World == WORLD_MAIN)
    		|| (SYSVAR_LOA_Current_World == WORLD_WUESTE)
    		|| (SYSVAR_LOA_Current_World == WORLD_DT))
    	{
    		if (((SYSVAR_LOA_Current_World == WORLD_MAIN)
    			&& (Npc_GetDistToWp(hero, "LOA_ST_202") < 5000
    			|| Npc_GetDistToWp(hero, "LOA_ST_163") < 4000
    			|| Npc_GetDistToWp(hero, "LOA_ST_138") < 5000
    			|| Npc_GetDistToWp(hero, "LOA_ST_124") < 5000)
    			&& (Npc_GetDistToWp(hero, "LOA_ST_TURM_14") > 3000)
    			&& (Npc_GetDistToWp(hero, "LOA_ST_018") > 1500))
    		|| (SYSVAR_LOA_Current_World == WORLD_WUESTE)
    		|| (SYSVAR_LOA_Current_World == WORLD_DT)){
    					Bar_Show(desertBarHandle); // WüsteBar zeigen, wenn in der Nähe der Wüste.
    					desertBar_hidden = FALSE;
    					PrintDebugg("show desertbar");
    					if AMBVAR_Tipps_Heat == FALSE{
    						AMBVAR_Tipps_Heat = TRUE;
    						Info(TOPIC_Tipps, "Hitze:");
    						Info(TOPIC_Tipps, " In besonders heißen Gebieten erleidet der Held Schaden durch Dehydrierung. Um das zu verhindern, muss der Held regelmäßig Wasser trinken. Falls ihm das Wasser ausgehen sollte, kann man leere Wasserflaschen in knietiefem Wasser oder an Brunnen wieder auffüllen.");
    					};
    		};
    	}else if desertBar_hidden == FALSE
    	&& (SYSVAR_LOA_Current_World == WORLD_MAIN)
    	{
    		if ((Npc_GetDistToWp(hero, "LOA_ST_202") > 4000
    		&& Npc_GetDistToWp(hero, "LOA_ST_163") > 3000
    		&& Npc_GetDistToWp(hero, "LOA_ST_138") > 5000
    		&& Npc_GetDistToWp(hero, "LOA_ST_124") > 3000)
    		|| Npc_GetDistToWp(hero, "LOA_ST_TURM_14") < 3000){
    			Bar_Hide(desertBarHandle); // WüsteBar verstecken, wenn nicht in der Nähe der Wüste.
    			PrintDebugg("hide desertbar");
    			desertBar_hidden = TRUE;
    		};
    	};
    	if (SYSVAR_LOA_Current_World != WORLD_MAIN)
    	&& (SYSVAR_LOA_Current_World != WORLD_WUESTE)
    	&& (SYSVAR_LOA_Current_World != WORLD_DT)
    	{
    		Bar_Hide(desertBarHandle); // WüsteBar verstecken, wenn nicht in der Nähe der Wüste.
    		PrintDebugg("hide desertbar");
    		desertBar_hidden = TRUE;
    	};

    Die Variable desertBar_hidden steht auf 1 zu Beginn dieser Funktion. Wenn ich die Variable über die Konsole auf 0 setze (call seti "desertbar_hidden" 0), dann verschwindet die Bar beim nächsten Aufruf dieser Funktion (das Spiel denkt, die Bar wäre da und entfernt sie, weil der Spieler gerade an einem Ort ist, an dem keine Bar angezeigt werden soll).


    Falls das kein allgemeines Problem ist, sondern mit anderen Änderungen von uns zusammenhängt, wäre ich bei der Suche für Hilfe dankbar. (Ich wüsste aktuell nicht, wo wir extern etwas an den Bars verändern und die Bars.d ist das LeGo-Original.)
    Geändert von Milky-Way (10.10.2020 um 23:29 Uhr)

Seite 21 von 27 « Erste ... 1014171819202122232425 ... Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide