[Editor1] Darians Fragen zum Scripting

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hallo Leute!

In den Eigenschaften eines Moduls kann man doch einstellen, daß man komplett ohne in anderen Spielen erworbene Gegenstände anfangen muß.

In den Skripten des Modules gibt es da den Punkt "UnAcquireItem" oder so.
Welches Skript muß ich da eintragen, daß der Charakter das Modul ohne Gegenstände beginnen muß? :)
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Nein, so einfach ist das nicht. Du mußt ein Skript schreiben, das OnClientEnter ausgeführt wird.
OnUnAquireItem bedeutet nichts weiter, als daß das Skript, das Du da einträgst, immer dann ausgeführt wird, wenn ein Spieler einen Gegenstand verliert. Genauso wird das o.g. Skript bei OnClientEnter immer dann ausgeführt, wenn ein Spieler das Spiel betritt.
Du mußt nun selbst ein Skript schreiben, das einem SC, der das Modul zum ersten Mal betritt, alle Gegenstände abnimmt. Das könnte z.B. so aussehen:
Code:
void main()
{
    object oClient = GetEnteringObject();

    //Wenn oClient kein SL ist und ihm noch nicht alles abgenommen wurde...
    if (!GetIsDM(oClient) && !GetLocalInt(oClient, "iEntered"))
    {
        //Alle Ausruestung aus dem Inventar zerstoeren...
        object oItem = GetFirstItemInInventory(oClient);
        while (oItem != OBJECT_INVALID)
        {
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(oClient);
        }

        //Alle ausgeruesteten Gegenstaende zerstoeren...
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARMS, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_ARROWS, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BELT, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOLTS, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BOOTS, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_BULLETS, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTRING, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_NECK, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oClient));
        DestroyObject(GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oClient));

        //Alles Geld zerstoeren...
        AssignCommand(oClient, TakeGoldFromCreature(GetGold(oClient),
            oClient, TRUE));

        //SC markieren, damit ihm beim naechsten Laden des Spiels nicht wieder
        //alles abgenommen wird.
        SetLocalInt(oClient, "iEntered", TRUE);
    }
}
Hiernach hat der SC überhaupt nichts mehr, nicht 'mal mehr Klamotten. :D :rolleyes:
 
Zuletzt bearbeitet:

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hmmm... *grübel*

Danke! Ich probier´s mal aus.

Wenn ich nicht klarkomme, melde ich mich wieder. :shine:

[flüster]Ich und scripten...[/flüster] :rolleyes: :D
 

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hmmm... *grübel*

Wenn es mir die Zeit erlauben sollte, würde ich gerne mal wieder ein bißchen an meinem Modul weiterbasten, das nur schon etwa seit einem halben Jahr unangetastet auf der Festpallte staubte... :c:

Nur: Scripten kann ich immer noch nur in Ansätzen. :rolleyes:
[flüster]Wer kann mir das nur beibringen? Ich revanchiere mich auch mit Gitarre- Unterricht...[/flüster]

Erstens:
Diesmal möchte ich, daß, wenn man einen Gegenstand untersucht, automatisch ein Tagebucheintrag erstellt wird. Ich nehme an, ich muß das OnDisturbed- Event verwenden? Alles andere erscheint mir unpassend...

Und gleich Frage zwei:
Es sollte möglich sein, daß es mehrere Gegenstände gibt, die diesen tagebucheintrag bewirken. Allerdings reicht es ja, egal welchen davon man als erstes untersucht, daß der Eintrag nur einmal, beim ersten mal, in´s Tagebuch rutscht.

Wie geht sowas?
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
zu 1.) Auf das Untersuchen eines Gegenstandes kann man nicht reagieren, aber wenn man einen Gegenstand in sein Inventar aufnimmt, kann man etwas machen. Das wäre das OnAquireItem Event.
Code:
void main()
{
    // Gegenstand, der aufgenommen wurde
    object oItem = GetModuleItemAcquired();

    // Charakter, der den Gegenstand aufgenommen hat
    object oAcquiredBy = GetModuleItemAcquiredBy();

    // TAG des Gegenstandes
    string sTag = GetTag(oItem);

    // Ist der TAG von oItem gleich dem des gesuchten Gegenstandes?
    if (sTag == "TAG des Gegenstandes")
    {
        // Diese beiden Variablen dienen nur zur Veranschaulichung,
        // sind aber eigentlich ueberfluessig. Die Werte koennen direkt in den
        // Befehl zum generieren des Tagebucheintrages eingetragen werden.
        string szPlotID = "Quest ID, die im Tagebuch festgelegt wurde";
        int nState = 1; // Die Nummer des entsprechenden Eintrags im Tagebuch

        // Tagebucheintrag generieren
        AddJournalQuestEntry(szPlotID, nState, oAcquiredBy);
    }
}

zu 2.) Das ist auch kein Problem. Man müßte entweder alle Tags berücksichtigen (sauber) oder allen Gegenständen den selben Tag geben (dreckig). Hier die saubere Variante...
Code:
void main()
{
    // Gegenstand, der aufgenommen wurde
    object oItem = GetModuleItemAcquired();

    // Charakter, der den Gegenstand aufgenommen hat
    object oAcquiredBy = GetModuleItemAcquiredBy();

    // TAG des Gegenstandes
    string sTag = GetTag(oItem);

    // Ist der TAG von oItem gleich dem des gesuchten Gegenstandes?
    if (sTag == "TAG des ersten Gegenstandes" ||
        sTag == "TAG des zweiten Gegenstandes" ||
        sTag == "TAG des dritten Gegenstandes" /* usw. */)
    {
        // Diese beiden Variablen dienen nur zur Veranschaulichung,
        // sind aber eigentlich ueberfluessig. Die Werte koennen direkt in den
        // Befehl zum generieren des Tagebucheintrages eingetragen werden.
        string szPlotID = "Quest ID, die im Tagebuch festgelegt wurde";
        int nState = 1; // Die Nummer des entsprechenden Eintrags im Tagebuch

        // Tagebucheintrag generieren
        AddJournalQuestEntry(szPlotID, nState, oAcquiredBy);
    }
}
Der einzige Unterschied liegt bei der IF-Anweisung.
 
Zuletzt bearbeitet:

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hmmm... *grübel*

Hm. Schwierig. Eine aufgespießte Leiche kann ich schlecht in´s Inventar aufnehmen. :D

Dann muß ich mir was anderes einfallen lassen. :c:
Kann man Tagebucheinträge z.B. auslösen, wenn ich eine Begegnung (normal nur für auftauchende Feinde) oder einen Auslöser (normalerweise Gebietswechsel) platziere? Wahrscheinlich nicht.
Hm. Grübel.
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Ja, das geht problemlos. Du kannst einfach das OnEnter-Event des Auslösers benutzen.

Was die aufgespießte Leiche angeht, so kannst Du da das OnUsed-Event benutzen.
 

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hmmm... *grübel*

Dann... gehen ja quasi beide Möglichkeiten!!! :eek:

Cool. :)

Geht da eines von Deinen Beispiel- Scripten?
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Nein, die müßten abgeändert werden, je nachdem, ob Du einen Auslöser oder ein Placeable (z.B. die aufgespießte Leiche) benutzen möchtest.
 

Sir Darian

Ritter des Helm
Registriert
01.04.2000
Beiträge
33.906
Hmmm... *grübel*

So. Schieb.

Meine Scripting Fähigkeiten haben sich in der Zwischenzeit keinen Deut verbessert. :D :c:

Ich habe mal irgendwo auf NWVault gelesen, es gäbe richtige Bibliotheken mit allen möglichen Skripen.
Die sind wohl recht allgemein gehalten und lassen sich anscheinend gut individualisieren.
Natürlich sind da nicht alle möglichen Fälle gescriptet, aber so grundlegende Scripte. So eine Art "Freqently Used Scripts" soll das sein

Leider habe ich weder mit Google noch auf NWVault selber was dazu gefunden.

Weiß da jemand von Euch was dazu? :)
 

Lokadamus

Buddelmagier
Registriert
01.03.2000
Beiträge
4.861

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Es gibt im offiziellen Scripting-Forum eine Endless List of HomeBrew Functions, wo man sicher für jede Gelegenheit etwas passendes findet. Solche Pakete habe ich bisher aber noch nicht gesehen, aber ich hab' auch noch nie danach gesucht. Erfahrungsgemäß dauert es länger, sich in fremden Code einzuarbeiten, als ihn selbst zu schreiben (wenn man's kann) ;). So hab' ich inzwischen schon meine eigene Sammlung. :)
 
Oben