Morrowind&OblivionForum.de - PMM-Projects Network (http://www.morrowindforum.de/wbboard/index.php)
|- Oblivion Editor Help (http://www.morrowindforum.de/wbboard/board.php?boardid=54)
|-- Wie!!!! (Bewegte Transportmittel) (http://www.morrowindforum.de/wbboard/threadid.php?boardid=54&threadid=21348)


Geschrieben von Ivy am 29.01.2011, 20:56:

  Wie!!!!

In Adash gibt es ein sich bewegendes Boot.
In Nehrim mehrere sich bewegende Objektkonstruktionen.
Wie zur Hölle schaffe ich es das sich mein Boot bewegt?
Wer kennt das Geheimnis


__________________


Geschrieben von Garak am 29.01.2011, 22:01:

 

Ganz grundsätzlich. wenn man ein plugin kennt, das es kann, kann mans dort nachforschen... mit ein wenig erfahrung kann man (fast) jedes Script verstehen....

Ich nehme mal an, Dein problem ist, dass die setpos-Befehle die Kollision nicht mitnehmen - dazu braucht man nach einem Setpos die Befehlsfolge


disable
enable


direkt hintereinander, im selben frame. danach weiß Havok wieder, wo's lang geht


__________________
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


Geschrieben von Ivy am 09.02.2011, 10:47:

 

Ich hab Hier das adasch script seh aber nich durch...
-----------------------------------------------------------
scn zzzKap01Zwischenwelt04TriggerScript

short triggered
float posX01
float posX02
float posX02a
float posX03
short frame
short sayOnce
float timer

begin OnTriggerActor player

if (triggered == 0)
if (zzzKap01D.walkStage == 11)
zzzKap01FaehrmannRef.addItem "Torch02" 1
zzzKap01FaehrmannRef.equipItem "Torch02"
DisablePlayerControls
set triggered to 1
set zzzKap01D.walkStage to 12
endif
endif

end

begin GameMode
if (zzzKap01D.walkStage == 12)
if (zzzKap01DBoat01Ref.getPos x > 2992)

if (zzzKap01DBoat01Ref.getPos x < 5000 && sayOnce == 0)
zzzKap01FaehrmannRef.sayto player "zzzKap01FaehrmannTalk" 1
set timer to 13
set sayOnce to 1
endif

if (frame == 6)
zzzKap01DBoat01Ref.enable
set frame to 0
endif

set posX01 to zzzKap01DBoat01Ref.getPos x
set posX01 to posX01 - 5
zzzKap01DBoat01Ref.setPos x, posX01
zzzKap01DBoat01RealRef.setPos x, posX01
set frame to frame + 1

set posX02 to zzzKap01DPlayerStuhl0Ref.getPos x
set posX02 to posX02 - 5
zzzKap01DPlayerStuhl0Ref.setPos x, posX02

set posX02a to zzzKap01FaehrmannRef.getPos x
set posX02a to posX02a - 5
zzzKap01FaehrmannRef.setPos x, posX02a

set posX03 to zzzKap01DPlayerStuhlRef.getPos x
set posX03 to posX03 - 5
zzzKap01DPlayerStuhlRef.setPos x, posX03

if (frame == 5)
zzzKap01DBoat01Ref.disable
set frame to 6
endif

else
set zzzKap01D.walkStage to 13
zzzKap01DBoat01Ref.enable
endif
endif

if (sayOnce == 1)
if (timer > 0)
set timer to timer - getSecondsPassed
else
zzzKap01FaehrmannRef.sayto player "zzzKap01FaehrmannTalk" 1
set sayOnce to 2
set timer to 14
endif
endif

if (sayOnce == 3)
zzzKap01DPlayerStuhlRef.enable
set sayOnce to 4
endif

if (sayOnce == 2)
if (timer > 0)
set timer to timer - getSecondsPassed
else
EnablePlayerControls
StreamMusic "Data\Music\adash\02theme_bc.mp3"
player.removeItem "zzzKap01HerzUnschuldigen" 1
zzzKap01DPlayerStuhlRef.disable
set sayOnce to 3
endif
endif
end

--------------------------

scn zzzKap01ZwischenweltPlayerStuhlScript

short doOnce

float posX01
float posX02
float posX02a
float posX03
float posX04
short frame
float timer
float timerTalk

begin OnActivate

if (doOnce == 0)
DisablePlayerControls
set timer to 5
Activate
set doOnce to 1
endif

end

begin GameMode
if (doOnce == 1 && timer > 0)
set timer to timer - getSecondsPassed
endif

if (zzzKap01D.fmTalk < 13 && doOnce == 1)
if (timerTalk > 0)
set timerTalk to timerTalk - getSecondsPassed
else
if (zzzKap01D.fmTalk == 2)
set timerTalk to 7
elseif (zzzKap01D.fmTalk == 3)
set timerTalk to 15
elseif (zzzKap01D.fmTalk == 4)
set timerTalk to 15
elseif (zzzKap01D.fmTalk == 5)
set timerTalk to 10
elseif (zzzKap01D.fmTalk == 6)
set timerTalk to 12
elseif (zzzKap01D.fmTalk == 7)
set timerTalk to 14
elseif (zzzKap01D.fmTalk ==
set timerTalk to 16
elseif (zzzKap01D.fmTalk == 9)
set timerTalk to 13
elseif (zzzKap01D.fmTalk == 10)
set timerTalk to 7
elseif (zzzKap01D.fmTalk == 11)
set timerTalk to 14
elseif (zzzKap01D.fmTalk == 12)
set timerTalk to 17
endif
zzzKap01FaehrmannRef.sayto player "zzzKap01FaehrmannTalk" 1
endif
endif

if (doOnce == 1 && timer <= 0)
if (zzzKap01DBoat01Ref.getPos x > -18000)

if (frame == 6)
zzzKap01DBoat01Ref.enable
set frame to 0
endif

set posX01 to zzzKap01DBoat01Ref.getPos x
set posX01 to posX01 - 3
zzzKap01DBoat01Ref.setPos x, posX01
zzzKap01DBoat01RealRef.setPos x, posX01
set frame to frame + 1

set posX02 to zzzKap01DPlayerStuhl0Ref.getPos x
set posX02 to posX02 - 3
zzzKap01DPlayerStuhl0Ref.setPos x, posX02

set posX02a to zzzKap01FaehrmannRef.getPos x
set posX02a to posX02a - 3
zzzKap01FaehrmannRef.setPos x, posX02a

set posX03 to zzzKap01DPlayerStuhlRef.getPos x
set posX03 to posX03 - 3
zzzKap01DPlayerStuhlRef.setPos x, posX03

set posX04 to player.getPos x
set posX04 to posX04 - 3
player.setPos x, posX04

if (frame == 5)
zzzKap01DBoat01Ref.disable
set frame to 6
endif

else
activate player
set doOnce to 2
zzzKap01DBoat01Ref.enable
endif
endif
end

--------------------------------------------------------------
Ich befürchte ihr seht auch ich durch ODA oda....
Brauche hilfe


__________________


Geschrieben von Garak am 09.02.2011, 21:36:

 

langsam! wenn Du wirklich von fast 0 kommst musst Du das ganze erst mal aufsplitten in schmückendes beiwerk und wirklich wichtiges. Zunächst musst Du die einzelnen Funktionsblöcke isolieren - also immer die Bereiche zwischen BEGIN und END. im ersten reinkopierten Script hat Du zunächst einen Block mit

Begin OnTriggerActor player

der läuft genau dann, wenn der Spieler die passende Havokzone berührt (trigger sind eine eigene art von Havokkollisionen) (onTrigger Actor: wenn ein Actor (= NPC oder creature) die Triggerzohne berührt, "player" schränkt es auf eben diesen ein.) Der block legt den Spieler lahm, gibt dem Fährmann ne fackel und bezieht sich auf eine Variable auf einem anderen Objekt.

Begin Gamemode

läuft immer, wenn das spiel läuft und kein Menü angezeigt wird. der block läßt den Fährmann was sagen, bewegt insgesamt 4 referenzen in x-richtung, alle 6 frames zieht er die kollisionsrefrenz nach (disable in frame 5, enable in frame 6). Ich find es bizarr, dass die distanz nicht zeitabhängig berechnet wird - dieses boot fährt auf guten rechnern deutlich schneller Den Timer nutzt es aber, um den spruch vom Fährmann zu koordinieren und am ende die Spielerkontrollen wieder freizugeben. Falle für unerfhrene: GetSecondsPassed liefert nur ein mal pro scriptframe einen Sinvoolen wert - wenn man jetzt das tempo damit skalieren wolte UND den Sprechtimer machen will, muss man GetSecondsPassed 1x aufrufen und das ergebnis zwischenspiechern.


das 2.Script ist ähnlich, zählt aber noch eine Variable auf einem anderen Objekt hoch.


__________________
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

Powered by: Burning Board 1.1.1 © 2001 by WoltLab