Autor |
|
Hephaistos
Verschollen


Dabei seit: Februar 2003
Geschlecht: 
Herkunft: Wien
Beiträge: 2102
 |
|
Hi
Ich brauch mal wieder die Hilfe der Scripting Experten unter euch. Es ist folgendes, ich habe ein Object (Activator), das immer an der selben Stelle stehen soll, dazu muß ich es aber 90° um die Z-Achse und 90° um die y-Achse drehen (laut Object-Fenster im Editor).
Also hab ich ein Script erstellt, das zu beginn folgende Zeilen enthält.
if ( cellchanged == 1 )
"br_schalter"->positioncell, -993.083, 580.531, -156.460, 0, "Balmora, Residenz, Keller"
"br_schalter"->setangle z, 90
"br_schalter"->setangle y, 90
return
endif
Das Problem ist, das der Activater im Spiel immer gleich ausgerichtet ist. Gedreht zwar, aber völlig unabhängig davon welche Achsen oder Werte ich bei Setangle eingebe. Ich habe den Befehl setangle schon öfter verwendet, zwar immer nur als "setangle z" aber es hat immer wie geplant funktioniert.
Kennt jemand das Problem oder hat das vielleicht damit zu tun, daß ich dem Activater eine neue Mesh-Datei zugeordnet habe?
Kann ich ein Script eigentlich auch im Editor testen, oder muß ich dazu jedesmal das Spiel starten.
EDIT: 7.3.2003
Ich hätte da noch ein anderes Problem, daß aber inhaltlich in die selbe Sparte gehört:
Ich habe von Lady E. die Modells für Schaukästen heruntergeladen und verwende folgendes Script für die Bewegung des Deckels:
if ( br_deckelstatus_2 == 50 )
"br_deckel_2"->move z, 40
set br_deckeltimer to ( br_deckeltimer_2 + GetSecondsPassed )
if ( br_deckeltimer_2 >= 2.0 )
set br_deckelstatus_2 to 100
set br_deckeltimer_2 to 0.0
endif
endif
Leider bemerkt man nach wenigen Zyklen eine Abweichung von der Startposition. Usprünglich bin ich davon ausgegangen, daß die an dem nicht ganzzahligen Wert des Timers liegt und habe das Script daher umgeändert:
if ( br_deckelstatus_2 == 50 )
set br_deckeltimer_2 to ( br_deckeltimer_2 + GetSecondsPassed )
"br_deckel_2"->move z, 40
if ( br_deckeltimer_2 >= 1.0 )
set br_deckeltimer_2 to 0.0
set br_deckelcounter_2 to ( br_deckelcounter_2 + 1 )
endif
if ( br_deckelcounter_2 >= 2 )
set br_deckelstatus_2 to 100
set br_deckelcounter_2 to 0
endif
endif
Jetzt sollte die Bewegung über die Variable br_deckelcounter gesteuert werden, die immer einen ganzzahligen Wert hat, und daher genau auf die Ausgangsposition zurück fahren. Leider funktioniert das nicht.
Also hab ich den Befehl "positioncell" verwendet und dort die Ausgangsposition laut Editor eingegeben. Jetzt lieg ich aber erst so richtig daneben. Erst wenn die Z-Position im Befehl "Positioncell" um ca. 1.5 bis 2.0 größer ist lande ich ungefähr dort, wo ich hin will.
Kann mir bitte jemand erklären woran das liegt, oder ob das Problem bei Euch überhaupt auftaucht. Langsam geht mir der Editor nämlich wirklich am A...
Wo ich gerade dabei bin: Kann mir jemand ungefähr sagen wie groß 1.00 bei den Größe/Gewicht-werten der Rassen ist (ist 1.00 ca. 1,8 m oder 2,0 m, oder anders gefragt wieviel Unterschied ist "ein Kopf" größer oder kleiner).
Ist die Gewichtsangabe relativ zur Größe (d.h. 1.00 ist immer ein normal gebauter char.) oder eine absolute Größe (d.h. 1.00 bei einem großen Char. ist schlank, bei einem Kleinem stämmig).
Und noch eine Frage: Ich will, daß ein NPC den PC nach einem Gespräch begleitet bis ein bestimmter Bereich erreicht ist und dann ein Gespräch (Belohnung, Dank, Information,...) beginnt. Kann mir jemand sagen wie das geht. Oder kann mir jemand, der gerade in einer entsprechende Mission steckt, den Namen des NPC sagen (vielleicht find ich dort eine Lösung).
Schonmal Danke für die Antworten
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
Dieser Beitrag wurde von Hephaistos am 07.03.2003, 08:33 Uhr editiert.
|
|
05.03.2003, 08:30 |
|
iladrion
Craftsman
 

Dabei seit: September 2002
Geschlecht: keine Angabe
Herkunft:
Beiträge: 288
 |
|
hui, ne menge CS-Probs auf einmal...
zu setangle:
MW unterscheidet da zwischen zwei Grundsituationen bei den Winkeln, den Winkeln zu den Weltachsen und den Winkeln zu dem Koordinatensystem, das direkt am Objekt hängt. Dieses zweite Koordinatensystem ist fest am Objekt verankert, dh wenn der Gegenstand im Editor zu Beginn um zb 90° x gedreht ist, sind die beiden Koordinatensysteme ebenfalls zueinander verdreht. SetAngle und Rotate beziehen sich afaik auf dieses Objekt-bezogene Koord-System, das verwirrt (auch mich) ziemlich.
Das nächste Problem dabei ist, das der Ursprung dieses Objekt-bezogenen Koordinatensystems irgendwo liegen kann, nicht zwingend in der Mitte des Objekts. Es gibt einige Models in MW, die haben den zb ausserhalb des Körpers liegen. Die sind dann äusserst schwer zu drehen per script.
Das Du ein neues Mesh benutzt, sollte abgesehen von oben genanntem, unerheblich sein. Ich spiele auch grad sehr viel mit neuen meshes rum, und hab keine Probs damit, zumindest keine, die ich nicht auch mit Orig-Meshes hätte....
zu Rassenerschaffung: keine Ahnung...
zu NPC-Prob:
eigentlich brauchst Du nur nen Follow-AI-Paket ("NPCID"->AIFollow Player ... "), am besten ausgelöst per dialog, mit warte funktion und so. (das gibts in einigen Mods, in IOTD auch, aber der NPC ist da sehr kompliziert, also vielleicht erstmal was anderes anschauen.) Dann noch nen script an den NPC, das die distanz zu nem bestimmten Gegenstand mit unigue-ID misst ("NPCID"->GetDistance "OBJID"), den du dort postierst, wo das AI-Paket beendet werden soll, das Skript setzt ne Variable auf 1, die du vom dialog oder anderen Skripts abfragen kannst). dann lässt du den NPC dort warten ("NPCID"->AIWander ...") und gegebenenfalls nach Cellchange verschwinden. Soll er den Spieler noch anlabern, wenn der Ort erreicht ist, musst du Forcegreeting benutzen und im Dialog-Editor unter Greeting nen spezielles Greeting einbauen, das die oben gesetzte Var abfragt und diese danach auf nen anderen Wert (zb 2) setzt, damit das Greeting nich doppelt kommt.
Das war die Ultra-Kurzfassung, falls das unverständlich ist, muss ich nochmal nen längeren roman verfassen...
Ich hoffe es hilft dir ein wenig weiter
__________________ keep on modding...
|
|
07.03.2003, 09:34 |
|
Hephaistos
Verschollen


Dabei seit: Februar 2003
Geschlecht: 
Herkunft: Wien
Beiträge: 2102
 |
|
Wow, da hab ich ja einen richtigen Experten erwischt. VIELEN DANK.
Werd's gleich heute versuchen.
Allerdings hätte ich da noch eine Frage:
Zitat: dann lässt du den NPC dort warten ("NPCID"->AIWander ...") und gegebenenfalls nach Cellchange verschwinden
Wie kann ich den NPC verschwinden lassen? Einfach mit Positioncell ins "Nichts" setzen, oder gibt es eine elegantere Möglichkeit.
Vielleicht wär für ein Dummie wie mich doch ein längerer Roman ganz gut.
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
07.03.2003, 10:05 |
|
Garak
Admin
     

Dabei seit: Juli 2002
Geschlecht: 
Herkunft: Cardassia Prime
Beiträge: 9269
 |
|
Am elegantesten bekommst Du deinen NPC per disable los - einfach abschalten!
Was das Positionsproblem mit den Zyklen angeht, so hängt das meiner Erfahrung nach mit der Framerate zusammen, da die scripte und damit die Timer immer nur ein mal pro Bildaufbau bearbeitet werden und du damit nie reproduzierbar exakt 2 Sekunden = 80 Bewegungseinheiten mit Deinem Movebefehl hinbekommst. frag lieber die Position per Getposition ab - dabei wirst du zwar auch nie Pixelgenau positionieren können, aber wenigstens kann sich der fehler nicht aufschaukeln...
__________________ drei mal dürft ihr raten, wer grade seine Signatur geschrottet hat...geht aber wieder - allerdings solltet Ihr noch die Finger von den Avataren lassen 
|
|
07.03.2003, 10:22 |
|
iladrion
Craftsman
 

Dabei seit: September 2002
Geschlecht: keine Angabe
Herkunft:
Beiträge: 288
 |
|
Zitat: Original von Garak
Am elegantesten bekommst Du deinen NPC per disable los - einfach abschalten!
In scripting for dummies 5 steht drin, das disable das script, das am objekt hängt nicht stoppt, also noch nen stopscript "Name_des_NPC_script" hinzusetzen.
Aber vielleicht kannst du ihn ja auch einfach irgendwo hinstellen, und er erzählt einem dann, das es ja ganz nett war zusammen zu reisen, oder sowas. Das ist eh viel stimmiger.
__________________ keep on modding...
|
|
07.03.2003, 11:32 |
|
Hephaistos
Verschollen


Dabei seit: Februar 2003
Geschlecht: 
Herkunft: Wien
Beiträge: 2102
 |
|
Zitat: Orginal von Garak
frag lieber die Position per Getposition ab
Sorry, wenn ich mich jetzt selten dämlich anstelle, aber den Befehl hab ich in der Editor-Hilfe nicht gefunden.
Ich geh' mal davon aus, daß ich damit die genaue Position des Objekts bekomme, aber was mach ich dann damit? Wenn ich diese Position als Grundlage für die Bewegung benutze, schauckelt sich der Fehler doch trotzdem auf, oder?
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
07.03.2003, 12:27 |
|
Garak
Admin
     

Dabei seit: Juli 2002
Geschlecht: 
Herkunft: Cardassia Prime
Beiträge: 9269
 |
|
Sorry, ich meinte " GetPos " (alles screiben sie aus nur das nicht....versteh die Programmierer, wer will...). Und damit kannst du eine Abfrage machen, ob sich Dein Objekt an den zielkoordinaten oder höher bzw an den zielkoordinaten oder niedriger befindet - bei hohen framerates wird es genauer, bei niedrigen weniger genau, aber es wird verhindert, dass durch zufällige schwankungen eine Richtung bevorzugt wird und der deckel irgendwann ein Meter weiter oben schwebt...
@Iladrion: Stopscript greift imho nur bei global laufenden scripts, nicht bei objektbezogenen. also eher am anfang eines eventuellen scriptes auf dem NPC ninzufügen:
If (Getdisabled == 1)
Return
endif
Wenn Disable auch scripte stoppen wurde, hätten schon die strongholds ein problem, da dort auf jedem Bauteil ein script liegt, das die teile bei bedarf (globale Variable) An bzw wieder aus knipst... ist schon ganz gut so...
__________________ drei mal dürft ihr raten, wer grade seine Signatur geschrottet hat...geht aber wieder - allerdings solltet Ihr noch die Finger von den Avataren lassen 
|
|
07.03.2003, 13:15 |
|
Hephaistos
Verschollen


Dabei seit: Februar 2003
Geschlecht: 
Herkunft: Wien
Beiträge: 2102
 |
|
Okay, ich hab's jetzt gefunden, allerdings ....
"Returns the current world position of the object on the selected axis (X, Y, or Z) in float."
Hääää? Versteh' ich das Richtig, daß die genaue Position der Achse als Variable (muß ich die definieren, wenn ja wie?) ausgegeben wird?
Wenn ja: Dann mach ich also eine Abfrage, wenn die Varible größer ist als der z-Wert, dann bewegt sich das Objekt Z-Achse ins minus und umgekehrt, richtig?
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
|
|
07.03.2003, 13:43 |
|
Garak
Admin
     

Dabei seit: Juli 2002
Geschlecht: 
Herkunft: Cardassia Prime
Beiträge: 9269
 |
|
Nein, bewegen musst du das teil schon mit move
Getpos z liefert dir einfach die aktuelle z-Koordinate des objekts. was ich meinte was, dass Du die Zeitabfrage in Deinem Script ersetst, also statt
if ( br_deckelstatus_2 == 50 )
"br_deckel_2"->move z, 40
set br_deckeltimer to ( br_deckeltimer_2 + GetSecondsPassed )
if ( br_deckeltimer_2 >= 2.0 )
set br_deckelstatus_2 to 100
set br_deckeltimer_2 to 0.0
endif
endif
eher
if ( br_deckelstatus_2 == 50 )
if ( "br_deckel_2" -> getpos z < Zielposition)
"br_deckel_2"->move z, 40
else
set br_deckelstatus_2 to 100
endif
endif
Wobei für "Zielposition" einfach der Zahlenwert der gewünschten position stehen kann...
__________________ drei mal dürft ihr raten, wer grade seine Signatur geschrottet hat...geht aber wieder - allerdings solltet Ihr noch die Finger von den Avataren lassen 
Dieser Beitrag wurde von Garak am 08.03.2003, 15:51 Uhr editiert.
|
|
08.03.2003, 07:50 |
|
Hephaistos
Verschollen


Dabei seit: Februar 2003
Geschlecht: 
Herkunft: Wien
Beiträge: 2102
 |
|
Ah, jetzt ist alles klar. Werd' ich gleich ändern.
Vielen Dank!
Zitat: Orginal von Iladrion
In scripting for dummies 5 steht drin, ...
Ist das ein Scripting-Tut.? Wenn ja wo bekomme ich das, der Link funktioniert nämlich nicht.
__________________
Die Dummheit der Menschen und das Weltall sind unendlich, wobei ich mir beim Weltall noch nicht sicher bin.
Albert Einstein
Wenn die Klügeren nachgeben, regiert Dummheit die Welt.
Marie von Ebner-Eschenbach
Dieser Beitrag wurde von Hephaistos am 09.03.2003, 14:23 Uhr editiert.
|
|
08.03.2003, 10:13 |
|
|