[Editor1] Tingil's Scripting Thread

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Mein erster Gedanke wäre, daß die vielleicht alle den Tag "smoke1" haben und daher nur das Objekt zerstört wird, das als erstes gefunden wird.
 

Scardon

Schlachtenwüter
Registriert
20.02.2002
Beiträge
1.271
Nein, darauf hab ich schon geachtet. Ich hab jetzt auch gerade versucht, jedem Objekt beim OnDeath-Skript zu befehlen, das nächste Objekt zu zerstören, aber irgendwie will es nicht so recht klappen.
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Eine andere Variante wäre, im OnHeartbeat-Skript der Smoke-Objekte sowas zu machen:
Code:
void main()
{
    if (GetLocalInt(GetModule(), "iDuvikSaved"))
    {
        DestroyObject(OBJECT_SELF);
    }
}
 

Scardon

Schlachtenwüter
Registriert
20.02.2002
Beiträge
1.271
Das funktioniert leider auch nicht. Die Rauchsäulen sind sowohl da, wenn die Variable 0 und der Ork am Leben ist, als auch, wenn ich ihn getötet habe und iDuvikSaved 1 ist.
 

Milena

Senior Member
Registriert
05.09.2003
Beiträge
180
Das OnDeath Skript beim Ork könnte nicht klappen, weil du bei der Kreatur nicht "kein entgültiger Tod" angekreuzt hast. Sobald nämlich die sterbende Kreatur verschwindet, löst sich sozusagen auch das Skript auf.
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
NSC-Kleriker und spontanes Zaubern

Bekanntermaßen kann man mit der Funktion GetHasSpell abfragen, wie oft eine Kreatur einen bestimmten Zauber wirken kann. Was mir nicht bekannt war (was aber durchaus Sinn macht) ist, daß diese Funktion bei Klerikern die Möglichkeit zum spontanen Zaubern berücksichtigt. Wenn ich z.B. einen Kleriker habe, der 6 Zauber des 0. Grades vorbereitet hat, aber keiner davon "Kleinere Wunden heilen" ist und ich ihn...

GetHasSpell(SPELL_CURE_MINOR_WOUNDS);

...ausführen lasse, bekomme ich trotzdem "6" zurückgeliefert, weil er diese 6 Zauber spontan umwandeln könnte.

So weit so gut, aber wie bekomme ich diesen NSC jetzt dazu, dies per ActionCastSpellAtObject auch wirklich zu tun? Wenn ich ihn jetzt nämlich z.B. mit...

ActionCastSpellAtObject(SPELL_CURE_MINOR_WOUNDS, GetPCSpeaker());

...loslegen lasse, macht er überhauptnichts.

ActionCastSpellAtObject(SPELL_CURE_MINOR_WOUNDS, GetPCSpeaker(), METAMAGIC_ANY, TRUE);

...macht er hingegen anstandslos, also an etwas anderem, als daß er diesen Zauber nicht explizit vorbereitet hat, liegt es offensichtlich nicht, nur kann es nicht Sinn der Sache sein, daß ich den Kleriker mit letzterem Befehl zaubern lasse. Wie bekomme ich den Kleriker nun also dazu, den Zauber wirklich umzuwandeln?
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Alle Kreaturen in einer Area durchgehen

Wieder 'mal ein Problem von mir: Mit GetFirstInPersistentObject und GetNextInPersistentObject kann man ja bekanntermaßen alle Objekte in einer AoE oder einen Trigger durchgehen. Also fällt mir eigentlich kein Grund ein, warum das nicht auch mit handelsüblichen Areas funktionieren sollte, doch scheinbar stoßen diese Funktionen da an ihre Grenzen, denn sonst würde folgende Funktion funktionieren:
Code:
void DoMythImladrisHeartbeat(object oArea = OBJECT_SELF)
{
    SendMessageToAllPCs(GetName(oArea) + ": Heartbeat");

    effect eEffect;
    object oTarget = GetFirstInPersistentObject(oArea);
    while (oTarget != OBJECT_INVALID)
    {
        SendMessageToAllPCs(GetName(oArea) + ": Processing " + GetName(oTarget));

        // Suche nach einem Mythal-Effekt
        eEffect = GetFirstEffect(oTarget);
        while (GetIsEffectValid(eEffect) && GetEffectCreator(eEffect) != oArea)
        {
            eEffect = GetNextEffect(oTarget);
        }

        // Mythal-Effekt gefunden?
        if (GetIsEffectValid(eEffect))
        {
            // Unsichtbarkeit aufheben
            RemoveInvisibilityEffects(oTarget);
        }
        else
        {
            EnterMythImladris(oTarget);
        }

        oTarget = GetNextInPersistentObject(oArea);
    }
}
Um zu überprüfen, ob die Funktion überhaupt korrekt aufgerufen wird, habe ich, wie man sehen kann, oben den Areanamen ausgeben lassen und das funktioniert auch einwandfrei. Doch scheint...

oTarget != OBJECT_INVALID

...nach...

object oTarget = GetFirstInPersistentObject(oArea);

...immer FALSE zu sein. Habe ich irgendeinen Fehler in meiner Funktion übersehen, oder funktionieren die GetInPersistentObject-Funktionen tatsächlich nicht mit Areas? :confused:
Wenn letzteres der Fall ist, gibt es eine elegante Alternative, um alle Kreaturen in einer Area durchzugehen? :hae:


Edit: Habe gerade die GetObjectInArea-Funktionen entdeckt... damit hätte sich das hier wohl erledigt. :rolleyes:
Mein Problem im Beitrag vor diesen habe ich allerdings immernoch. ;)
 
Zuletzt bearbeitet:
Oben