Loop Script funktioniert fast... Hilfe

Tombery

Sarge
Ich hab von der mod Kaiser eine Maschiene gefunden die sich immer wiederholt also *Loop*, hab mir das in einem new game kopiert namens Probe, endlich hab ich ein script gefunden mit funktionierenden mover und die Maschiene leuft auf meine test map probe.

void start_power_feeder()
{
while (1) {
$arm1_pivot.rotateOnce('0 -180 0');
sys.waitFor ($arm1_pivot);
sys.trigger($arm_270);
sys.wait(6);
$arm1_pivot.rotateOnce('0 90 0');
sys.waitFor ($arm1_pivot);
sys.trigger($arm_middle);
sys.wait(6);
$arm1_pivot.rotateOnce('0 -90 0');
sys.waitFor ($arm1_pivot);
sys.trigger($arm_270);
sys.wait(6);
$arm1_pivot.rotateOnce('0 180 0');
sys.waitFor ($arm1_pivot);
sys.trigger($arm_90);
sys.wait(6);
}
}


void main ()
{
sys.wait(.5);
start_power_feeder();
}

nur der func_mover hat sachen eingetragen bekommen, http://img233.imageshack.us/my.php?image=lolprobedq0.jpg


wo das jetzt alles toll leuft denke ich mier das ich jetzt auch sowas in Quake4 ein Bauen kann, aber von wegen.....

Hab dann eine test map mamens lol in Quake4 gemacht wo man per trigger einen Stein mit einem mover von punkt A nach B versetzt, das leuft auch natürlich.

Aber dann wo ich meinen skript erweitere,so wie bei dem script oben *Probe* hab ich einen piep Ton und führt seine sache nur einmal aus und schmeisst mich ins menü, und der func_mover hat die gleichen sachen eingetragen bekommen wie bei probe.

dies ist mein script für Quake4 der normalerweise Loopen sollte.



void hoch()

{
while (1) {

$mover.time(3);

$mover.moveTo ( $point1);
sys.waitFor ($mover);

}

}

void main ()
{
sys.wait(.5);
hoch();
}




Ich weiss wirklich nicht wo der fehler liegt. Da leuft das ganze Teil in einer Test map in Doom3 problem los und bei einer eigenem Test map in Quake4 weiss ich nicht mehr weiter. Vielleicht hat sowas ja jemand schon gemacht oder hat etwas ahnung davon und könnte mir bei der sache helfen.

Schon mal dank vorraus
 

CruSAdeR

Maledict
Also hab noch nie was mit D3 oder Q4 Scripts gemacht, aber rein logisch würd ich sagen, dass man doch 2 verschieden Punkte braucht, zu denen sich der mover bewegt :) Dein teilt bewegt sich immer nur zu point1 und wenns schon da ist, passiert dann ja nix mehr. Oder seh ich da irgendwas falsch?
 

MacX

Light Guard
Also wenn ich dein Script da unten verwende wird der Vorgang auch ausgeführt, aber gleich darauf folgt ein 'runaway loop error'... mit sys.waitFrame() am Ende der while-Schleife folgt kein Error bzw. map läuft weiter.

Und den Rest hat [Crusader] schon gesagt... der func_mover geht zu point1 und dann passiert natürlich nichts mehr.

Edit:
Hab mal was kleines eingebaut... so läuft der mover immer wieder von point1 zu point2.
Am Anfang sind der Mover und Point1 an derselben Position, damit die kleine if-else Unterscheidung auch funktioniert ;)

Code:
void hoch()

{
while (1) {

	if( $mover1.getOrigin() == $point1.getOrigin() ) {
  $mover1.moveTo( $point2 );
  sys.waitFor( $mover1 );
	} else {
  $mover1.moveTo( $point1 );
  sys.waitFor( $mover1 );
	}
	sys.waitFrame();
}

}

void main ()
{
	sys.wait(.5);
	hoch();
}

Edit2:
Wobei ich anmerken muss, das ich das auch nur mit Doom3 getestet hab, aber es sollte eigentlich auch bei Q4 so funktionieren ( Hab ich bloß gerade nicht installiert ).

Edit3: Das ganze funktioniert natürlich auch, wenn der mover und point1 zum Anfang nicht auf derselben Position sind...
 

Tombery

Sarge
Danke Macshit, ich baue es nach, warscheinlich erst in doom3 dann in quake4 gleich für lern zwecke. Den 'runaway loop error' hatte ich auch gehabt.


Und Crusader, du hast recht das man 2 verschiedene Punkte braucht, nur hab ich vergessen zu erwähnen das der mover gleich zu point1 geht und das ich was verbunden habe zum mover, *mit bind*, normalerweise ist es so das der point1 zu point2 geht, das was sich bewegt später ist dann verbunden mit den mover.

Danke nochmal an euch beiden.
 

Tombery

Sarge
Das klappt wirklich, jetzt muss ich mir nur den script auf der zunge zergen lassen....

jetzt will ich den script nur noch verstehen, wofür z.b } else { steht, und das zeichen (==) scheint mir genauso wie das zeichen (//) also für eine beschreibung.

Jo Thx
 

MacX

Light Guard
Originally posted by Tombery@03.10.07, 14:59
Das klappt wirklich, jetzt muss ich mir nur den script auf der zunge zergen lassen....

jetzt will ich den script nur noch verstehen, wofür z.b  } else {  steht,      und das zeichen (==) scheint mir genauso wie das zeichen (//) also für eine beschreibung.

Jo Thx
Code:
if ( ... ) 
{
}
else 
{
}

ist eine Fallunterscheidung. Wenn die Bedingung die hinter if steht gegeben ist, dann werden die Anweisungen im Block ausgeführt.
Trifft die Bedingung nicht zu, dann wird das, was hinter else steht, ausgeführt.
Ich schreib das immer so:
Code:
if( Bedinung ) {
   Anweisung;
} else {
   Anweisung;
}

Zum 2ten:
'==' steht nicht für eine Beschreibung. Das ist ein Vergleichsoperator. Da kannst du überprüfen, ob der Linke mit dem Rechten Wert übereinstimmt.
Für Beschreibungen wird nur '//' oder ''/* ... */' benutzt.
 

Tombery

Sarge
AHA.

Ich hab mir } else { gleich von Shaderman erklären lassen und die beschreibung passt genau.
(wenn (if) bedingung nicht erfüllt wurde dann (else) führe anderen code aus).

Und jetzt tuh ich auch nichts mehr verwechseln mit '==' oder '//' ... ''/* ... */'


Danke nochmal für die Script Hilfe.
 

Tombery

Sarge
Ich wollt mich nochmal bei MacShit bedanken das ich hinterher hinbekommen habe das meine Plattformen durchgehend sich bewegen in meiner Map. Und das man auch etwas Grips braucht um da durch zu kommen.

Aber jetzt wirds lustig..... wenn man zu viele Movers durchgehend laufen lässt geht es schon mal an die FPS.

Jetzt möchte ich einige Movers durch Trigger Stoppen lassen, aber leider bekomme ich das nicht richtig hin.

Ich hab das mal so ausprobier in einer test map, aber das scheint ein faltscher befehl zu sein.





void stop()

{
$mover3.stop ( $mover3);
sys.waitFor ($mover3); //


}
 

MacX

Light Guard
Wie lautet denn die Fehlermeldung, wenn eine kommt?

Edit:
// Stops any translational movement.
scriptEvent void stopMoving();

Also versuchs mal mit stopMoving

Edit2: Hab mal was getestet, was bei mir zumindest Funktioniert.

Hier das Script:

Code:
void hoch() {
  sys.threadname("hoch_1");
	
	while (1) {

  if( $mover1.getOrigin() == $point1.getOrigin() ) {
  	$mover1.moveTo( $point2 );
  	sys.waitFor( $mover1 );
  } else {
  	$mover1.moveTo( $point1 );
  	sys.waitFor( $mover1 );
  }
	sys.waitFrame();
}

}

void StopMethod() {
	sys.killthread( "hoch_1" );
}

void main ()
{
	sys.wait(.5);
	thread hoch();
	sys.wait(5);
	StopMethod();
}

Das funktioniert so.
Wenn ich es noch besser hinkriege, editiere ich das hier rein.

Edit3: Habs mal mit stopMoving versucht... also das funktionierte bei mir nicht. Liegt wohl am Gültigkeitsbereich(?!), wenn nicht dann haut mich ( oder ich hab irgendeinen Fehler bei der Umsetzung gemacht ).
Aber ich finde sys.killthread auch irgendwie besser.

Gruß
MacX
 

Tombery

Sarge
Bei mir klappt das leider noch nicht, aber ich probier es morgen weiter hin.

In meiner Test map hab ich es zur Zeit so:



void hoch()

sys.threadname("hoch_1");

{
while (1) {

if( $mover1.getOrigin() == $point1.getOrigin() ) {
$mover1.moveTo( $point2 );
sys.waitFor( $mover1 );
sys.trigger($bridgeSlideShaft1snd_2);
} else {
$mover1.moveTo( $point1 );
sys.waitFor( $mover1 );
sys.trigger($bridgeSlideShaft1snd_2);
$mover1.time(2);//
$func_mover_1.accelTime(5);//
$func_mover_1.decelTime(5);//

}
sys.waitFrame();
}

}



void stop() {
sys.killthread( "hoch_1" );
}


void main ()
{
sys.wait(.5);
thread hoch();
sys.wait(5);
StopMethod();
}



und der Fehler ist: Error: file maps/lol.script, line 1: expected ';', found 'sys'
 

MacX

Light Guard
Der Fehler ist recht logisch.
In deiner ersten Zeile steht "void hoch()".
Doom 3 will dir sagen, das danach ein Semikolon fehlt.
Es wird eine Funktionsdeklaration erwartet.

Ok, kurz und knapp. Es muss so lauten:

Code:
void hoch()
{
sys.threadname( "hoch_1" );
...
}

Du hast die öffnende geschweifte Klammer, die ja den beginn des Funktionsblockes einleitet, nach sys.threadname( "...") gesetzt und das ist der Fehler.

So.
Als nächstes rufst du in main() die Funktion "StopMethod" auf.
Nun sollte dann eine Fehlermeldung kommen, das diese nicht gefunden werden kann.
Du musst "void stop()" noch in "void StopMethod()" umbenennen.

Funktions- und threadnamen sind natürlich dir überlassen, aber "stop()" halte ich für nicht geeignet, da es den Funktionsnamen schon gibt.

Das waren jetzt alle Fehler die ich da herausgesehen habe.
Müsste eigentlich klappen, wenn du das oben genannte korrigiert hast.

Gruß
MacX
 

Tombery

Sarge
Vielen dank Macshit, ich hab das hinbekommen.
Das mit den sys.threadname( "hoch_1" ); hab ich die klammern vergessen, und das mit dem StopMethod hat nicht zuerst geklapt,
er hatte mir immer irgend welche fehler angezeigt, und irgend was ist im haupt script später kaputt gegangen.


Irgend wann wusste ich nicht wo oben und unten war, dann hab ich den script gelöscht, und dann den genommen den ich ja hier rein geposdet habe, brauchte nur 2, 3 sachen umändern und schon gings, zuerst hatte ich das Call auch nicht bei (Stop) auf (StopMethod) umgeändert, hätte ich das vorher gemacht würde das auch am anfang auf anhieb funktionieren.

Und jetzt der Funktionierende Script, Eine Platte die Durchgend in bewegung ist und auch auf bestimmte Zeit sich Stoppen lässt.


void hoch()
{
sys.threadname("hoch_1");


while (1) {

if( $mover1.getOrigin() == $point1.getOrigin() ) {
$mover1.moveTo( $point2 );
sys.waitFor( $mover1 );
sys.trigger($bridgeSlideShaft1snd_2);
StopMethod else {
$mover1.moveTo( $point1 );
sys.waitFor( $mover1 );
sys.trigger($bridgeSlideShaft1snd_2);
$mover1.time(2);//
$func_mover_1.accelTime(5);//
$func_mover_1.decelTime(5);//

}
sys.waitFrame();
}

}



void StopMethod() {
sys.killthread( "hoch_1" );
}


void main ()
{
sys.wait(.5);
thread hoch();
sys.wait(5);
StopMethod();
}
 
Top