Ergebnis 1 bis 20 von 506

Thema: +++ DynRPG - Das RM2k3-Plugin-SDK +++

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Ich hab ein kleines Problem, arbeite seit ein paar Tagen mit dem DynRPG und nun wollte ich ein kleines Plugin schreiben!
    Der Held soll bei jedem "normalen" Angriff und Abwehr-Befehl eine kleine Menge seiner MP wiederherstellen (Ich weiß das würde wahrscheinlich auch ohne DynRPG gehen, aber egal...^^)!
    Der Abwehr-Befehl regeneriert auch die MP, aber leider der "normale" Angriff nicht... :>!
    Hab erst gedacht es läge vll an der onDoBattlerAction-Methode, aber auch mit der onBattlerActionDone-Methode funktioniert es nicht >,>.

    Hier ist mal der Code:

    Code:
    bool onDoBattlerAction ( RPG::Battler * battler) {
        // MP Aufladen bei einem Angriff
        if (battler->action->basicActionId  == RPG::BA_ATTACK ) {
            battler->mp += 10;
        }
        // MP Aufladen bei Abwehr
        if (battler->action->basicActionId  == RPG::BA_DEFEND) {
            battler->mp += 10;
        }
        return true;
    }

  2. #2
    Erstmal:
    Sowohl onBattlerAction als auch onBattlerActionDone werden pro Charakter mehrfach in Folge ausgelöst. Wenn du eine Handlung genau ein mal abfragen willst, dann solltest du dies in onBattlerActionDone mit success == true machen.

    Code:
    bool onBattlerActionDone (RPG::Battler *battler, bool success)
    {
        if(success && !battler->isMonster() ) // Bei Helden, nur das eine mal nach dem die Handlung wirklich ausgeführt wurde
        {
            if(battler->action->kind == RPG::AK_BASIC &&
               (battler->action->basicActionId == RPG::BA_ATTACK ||
               battler->action->basicActionId == RPG::BA_DEFEND))
            {
                battler->mp = battler->mp + 10;
            }
        }
        return true;
    }
    Ob BA_ATTACK bei mir funktioniert kann ich derzeit nicht testen, da musste dich gedulden ;-)

  3. #3
    @Corti: onDoBattlerAction sollte eigentlich nicht mehrfach ausgeführt werden... Bist du sicher? Das hat nämlich auch keinen success-Parameter.

  4. #4
    Grad getested:

    Helden (BA_DEFEND):
    • onDo 1x
    • onDone 1x

    Monster (AK_SKILL):
    • onDo 11x
    • onDone 12x (davon 1 mal success)

    Immer abwechselnd onDo onDone(!success) ~ 11 mal in Folge, dann passiert die Handlung dann nach ner halben Sekunde kommt "onDone" mit Success.

  5. #5
    Interessante Eigenheit des Makers, ich dachte bisher dass nur onDone mehrmals kommt. Muss ich mal anschauen und berücksichtigen...

  6. #6
    Tja, man lernt nie aus. Btw. hattest du schon Zeit dir meinen Speicherzugriffsfehler anzusehen?

  7. #7
    Oje, ich hab noch nichtmal in die PM geschaut und so die liebe Geburtstagsüberraschung versäumt...!!

    Naja, zum Problem:

    1) Du überprüfst nicht ob ev != NULL, dadurch crashst du natürlich sofort weil im Titelscreen kein Event #1 vorhanden ist.
    2) doesEventPageExist funktioniert nicht weil ich einen Fehler gemacht habe.

    Du kannst derweil diese gefixte Version von doesEventPageExist verwenden:

    Code:
    bool doesEventPageExist(RPG::Event *event, int id) {
    		void **script;
    		asm volatile("call *%%esi" : "=a" (script), "=d" (RPG::_edx) : "S" (0x47A0D0), "a" ((**reinterpret_cast<void ****>(0x4CDD14))[15]), "d" (event->id) : "ecx", "cc", "memory");
    		NamedCatalogPtr<void *> pages;
    		pages.ptr = reinterpret_cast<NamedCatalog<void *> *>(script[5]);
    		return pages[id] != NULL;
    }

  8. #8
    Geil, dankeschööön =D

  9. #9
    @Corti MP wird immernoch nicht regeniert bei einem Angriff und wenn ich nun Abwehr ausführe crasht mir das Spiel XD


  10. #10
    Welche GCC-Version hast du?

  11. #11
    Uhm 4.6.1
    das spielt crasht auch nur wenn ich isMonster() abfrage :>

    Geändert von Tokio (13.02.2013 um 20:17 Uhr)

  12. #12
    Kann ich die DLL mal haben? isMonster kann nämlich eigentlich gar nicht crashen (außer "battler" wäre ein ungültiger Pointer), schon gar nicht mit Adresse 0x00000001, weil es nämlich nur den (nicht in der Dokumentation verzeichneten) ersten Member von jeder Makerklasse, nämlich vTable, mit einem Wert vergleicht.

    Wen es interessiert:
    Code:
    	bool Battler::isMonster() {
    		return vTable == reinterpret_cast<void **>(0x4BD35C);
    	}

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •