PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scripting Frage(n)



Huxley
03.11.2006, 09:18
Tach,

ich hab gestern mal mit der Umsetzung einer kleinen Mod-Idee angefangen, frage mich aber nun nach dem wälzen etlicher Tutorials und des Wiki, ob das überhaupt so möglich ist, wie ich das möchte...
Kann ich zählen wie viele Items in einem Container sind - wichtig: Egal welche!

Genauergesagt würde es mir reichen eine Funktion auszuführen, nachdem etwas in eine Kiste gelegt wurde. GetItemCount bezieht sich immer auf eine spezielle ObjectID - gibt es eine Variable für die ObjectID, die jedes Item umfasst?

Gorkon
03.11.2006, 11:11
Nein. Mit den normalen Skriptbefehlen von Oblivion funktioniert afaik das nicht, es gibt kein "generisches" Zählen bzw. etwas wie eine "IsEmpty"-Funktion für Container. Mir fällt so jetzt auch keine Möglichkeit ein, was entsprechendes zu basteln.

Im Oblivion Skript Extender (http://obse.silverlock.org/) gibt es eine Funktion GetNumItems, die zählt, wie viele verschiedene Items in einem Container liegen. Bei zehn Stahlpfeilen, drei Elfen-Langschwertern und einer daedrischen Axt würde z.B. "3" rauskommen. Geht aber nur, wenn man sich den OBSE installiert, und der geht afaik immer noch nicht mit der DV.

Huxley
03.11.2006, 11:36
Argh, das wäre genau, was ich brauchen würde... irgendwie habe ich mir schon gedacht, dass es nicht so einfach wird.

Vielleicht umreisse ich mal kurz, was es werden soll - vielleicht gibt`s ja alternative Ansätze.

Es wird ein Container innerhalb Bravils (öffentlich) hinzugefügt, auf den man als Diebesgildenmitglied Zugriff hat sobald man auch den ersten Hehler genannt bekommt - weiss grad nicht welcher Rang das ist, muss ich nachkucken -. Dorthinein kann man gestohlene Gegenstände packen, die dann sozusagen abgeholt werden, von denen die Seriennummern entfernt werden ;) und die man dann nach Ablauf von 24 Stunden dort wieder vorfindet - ohne Stolen-Flag.
Der Plan war zusätzlich zum Item einen raren Rohstoff mit abgeben zu müssen (Gold-, Silbernugget, reine Perle oder ähnliches), als Bezahlung für den Dienst - zumindest, wenn man nicht Gildenmeister ist. Die Bezahlung in der Form zum einen weil man so nicht einfach das Zeug mit Gold 'sauberkaufen' kann und zum anderen kommen die Sachen nun nicht soo oft vor, dass man jedes geklaute Bronze-Amulett damit waschen und normal verkaufen kann.
Gedacht ist das ganze primär für die eigene Ausrüstung des Chars.

Der Ablauf war wie folgt gedacht:
- Items (Objekt und Bezahlung) sind in der Kiste
- Kiste verschliesst sich für 24h
- Wenn die Kiste wieder geöffnet wird fehlt die Bezahlung, das Item hat Ownership player
- Wenn die Kiste leer ist wird alles zurückgesetzt

Ich erwarte hier natürlich nicht, dass mir jemand das Script schreibt, bitte nicht falsch verstehen. Im Gegenteil, ich will das ja selber machen. Aber da das nicht ganz so einfach scheint bin ich für Ideen dankbar. :)

Achja, OBSE hab` ich bereits wegen eines Mods zum Zauber löschen... das als Voraussetzung wäre rechtzufertigen würde das Mod was werden, denke ich. Von dem her kein Problem.

Gorkon
03.11.2006, 11:55
Hmm. Mit OBSE könnte das so klappen:

1. Checken, was an normalen "Bezahl-Items" in der Kiste ist mittels dem normalen "GetItemCount". Also jedesmal, wenn "GetItemCount" > 0 ist (für Perle, Nugget, ...), eine Variable eins rauf zählen.
2. Checken, ob außer dem Bezahlstuff noch mehr in der Kiste liegt. Ist der Fall, wenn "GetNumItems" größer ist als der eben ermittelte Wert an unterschiedlichen Bezahlsachen.
3. Kiste verschließen, ein Bezahl-Item abziehen, Flags löschen, nach 24 Stunden wieder öffnen lassen.

Wie kann man Flags löschen? Evtl. mit der "RemoveAllItems (http://cs.elderscrolls.com/constwiki/index.php/RemoveAllItems)"-Funktion. Laut Beschreibung löscht sie das Ownership-Flag. Du müßtest dann noch eine Dummy-Kiste an einen unzugänglichen Ort stellen und per RemoveAllItems die Items einmal dorthin verschieben und wieder zurück. Habe aber noch nie probiert, ob das gestohlene Items wirklich "sauber" macht.

*edit*
Das Hauptproblem ist wohl, der Kiste mitzuteilen, wasnn sie loslegen soll. Mit der GetNumItems-Funktion kann man das automatisieren. Allerdings könntest du das z.B. auch per Message-Box machen. Dazu müßtest du den OnActivate-Block überschreiben, und zwar folgendermaßen:
1. Wenn wir gerade nicht in der 24-Stunden-Löschperiode sind, Frage stellen: Kiste öffnen oder "Reinigung" starten?
1.1 Kiste öffnen -> "Activate" feuern.
1.2 Reinigen: Bezahlsachen checken. Wenn nix da, meckern. Wenn doch, loslegen.
2. Wenn wir schon in der 24-Stunden-Löschperiode sind, Message schicken ("Bitte warten :p").
Das wäre vermutlich der komfortabelste Weg. Ganz ohne OBSE.

Rung
03.11.2006, 12:04
Hm,

wenn Du dem Spieler erlauben würdest nur einen Gegestand hineinzulegen, wäre es etwas einfacher. Du könntest dem Inhalt des Containers eine Ref geben, die Du per Script abfragen kannst. Mit dieser Ref kannst Du dann arbeiten. (Ownership wechseln etc.)

EDIT: Hm, da war wohl jemand schneller. ;)

Huxley
03.11.2006, 12:32
@ Gorkon:
Jep, die Lösung per OBSE war auch das erste, das mir einfiel.
Flags sollte mal recht simpel mit 'SetOwnership' auf dem Spieler setzen können... probiert habe ich`s noch nicht, aber theoretisch müsste spätestens bei der nächsten Aktualisierung des Menübildchens dann die rote Hand auch verschwunden sein.

Mit Menu-Buttons habe ich schon bissi rumgespielt, hat aber dann ziemlichen "Waschmaschinen-Charakter" :D... mal kucken, ob das nicht eleganter zu lösen ist.

@ Rung:
Das wäre auch eine Möglichkeit - dem Spieler kann man das Bezahlitem ja auch aus dem eigenen Inventar verschwinden lassen, das muss ja nicht zwingend in die Kiste.
Über die Refs bin schon gestolpert, muss mir das aber nochmal durchlesen, um`s richtig zu blicken.

Aber nu` ist endgültig Feierabend, mal sehen, ob ich da heute Nachmittag weiterkomme. Danke!

P.S. Ich wollte mir mal ankucken wie der das bei "Artful Thievery" mit dem Spell gelöst hat, aber um da downzuloaden muss man sich nicht nur registrieren, sondern auch noch durch eine Gesichtskontrolle... :rolleyes:

Huxley
03.11.2006, 17:02
Aloha,

ich möchte Euch mal zeigen, was ich bisher habe, da ich ein Problem habe auf dessen Lösung ich scheinbar nicht alleine komme:

scn LauRoChestScript

short itemcount
short activated

begin OnActivate
set activated to 1
if activate > 0
activate
endif
End

begin MenuMode 1008
Message "In Menumode...", 2
if activated > 0
Message "Var activated: %.0f", activated, 2
; Ab hier wird es nicht mehr ausgeführt :-/
set itemcount to LauRoChest.GetNumItems
; ... oder hier...
Message "Items in Chest: %.0f", itemcount, 2
if itemcount > 0
Message "Counted %.0f", itemcount, 2
else
Message "Shit...", 2
endif
endif
Message "Script over...", 2
end

"activated" soll sicherstellen, dass der Code nur in diesem Container-Menu ausgeführt wird. Die ganzen Messages sind nur für mich zum debugging.
So recht kann ich mir nicht erklären, warum das Script nicht weiter ausgeführt wird.

Zum restlichen Setup:
Es handelt sich um einen hohlen Stein, der als neues Form das Script (LauRoChestScript) zugewiesen bekam. RefID des Steins ist "LauRoChest".
Platziert ist das ganze gegenüber von Skirvaahs (?) Haus in Bravil - praktisch halb in der Stadmauer.
OBSE 0.8 ist am Start.

Gehe ich recht in der Annahme, dass:
- das Script auch wirklich nur läuft, wenn dieses Container-menu offen ist?
- Das Script dauerhaft läuft, also Veränderungen beim GetNumItems direkt für das Script verfügbar wären?
- das eigentlich so laufen müsste... ich also schon auf dem richtigen Weg bin?


P.S. Hoffe mir wird das nicht als Doppelposting ausgelegt. :)

Edit:
Fehler gefunden: "set itemcount to LauRoChest.GetNumItems" geht so nicht, es muss sich auf eine Ref beziehen... also:
"set ContRef to Getself" (on activate) und "set itemcount to ContRef.GetNumItems" ... dann geht`s.