Rotations Problem bei MoveObject

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hello,
    Habe eine Schranke/Barriere die nach oben geöffnet wird.


    Das Objekt hat ja eine Anfangs-Roatation will ich die Schranke öffnen, dann geht es völlig in die andere Richtung und geht sie wieder zu geht sie normal runter.
    Das Problem ist, dass beim ersten mal öffnen irgendwie etwas schief geht und er das Objekt komplett in die andere Richtung dreht.
    Was ist hier falsch???

    Code
    X = CreateDynamicObject(968, X, Y, Z, 0.000000, 90.000000, -98.799995, -1, -1, -1, 300.00, 300.00);


    C
    ocmd:machdasdingauf(playerid,params[])
    {
        new i = GetXPos(playerid);
    	if(i == -1) return 1;
    	switch(i)
    	{
    	    case 0: MoveDynamicObjectRot(X, 0.0,0.0,90.0, true);
    	}
    C
    stock Xzu (i)
    {
     	switch(i)
    	{
    		case 0: MoveDynamicObjectRot(X, 0.0,0.0,90, false);
    	}
    	return 1;
    }
    C
    stock MoveDynamicObjectRot(obj, Float:rX, Float:rY, Float:rZ, bool:open)
    {
    	new Float:x,Float:y,Float:z;
    	GetDynamicObjectPos(obj,x,y,z);
    	MoveDynamicObject(obj,x,y,z+((open)?(0.0001):(-0.0001)),0.0001,rX,rY,rZ);
    	return 1;
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Ich mein die Z Rotation (habe es geändert). Ich setzte laut der Logik den 3. Rotationswert auf +90.
    Mache ich dies, dreht sich die Schranke einmal um sich selber und rotiert sich dabei auf +90.


    Ich habe auch auf einmal ein Fehler, die Schranke geht nicht mehr zu, wenn man sich von der entfernt.


    Beim Öffnen setze ich


    C
    SetTimerEx("@X", 3000, 0, "ii", playerid, i);



    C
    @X(p,i);@checkZoneMaut(p,i)
    {
    	return (!IsPlayerConnected(p) || GetXPos(p) == -1) ? XZu(p,i) : SetTimerEx("@X", 3000, 0, "ii", p,i);
    }


    Warum schließt sie sich wieder nicht? (Wird bei XZu aufgerufen)


    C
    case 0: MoveDynamicObjectRot(X, 0.0,270.0,135.0, false);

    Wenn ich mich hiervon entferne müsste sie sich schließen

    C
    stock GetXPos(playerid)
    {
    	if(IsPlayerInRangeOfPoint(playerid,7.0, X, Y, Z)) return 0;
    	return -1;
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • @X(p,i);@checkZoneMaut(p,i)

    Jaa hier stimmt was nicht?


    @X ist das forward aber der public heißt hier checkZoneMaut?


    Entweder beides @X oder beides @checkZoneMaut ^^



    sonst wird er eig. nicht aufgerufen.

    Ja, das ist korrekt, allerdings entspricht dieses @ dem forward und public :D


    Das kann man darüber abkürzen.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Mein Fehler, kommt vom Copy Pasten :D
    Alles heißt jetzt X und es geht trotzdem nicht?
    Ist sonst echt alles richtig? Und wie kriege ich den Fehler behoben? die Erste Rotation ist komplett komisch danach dannach kann ich die Sache nicht so genau beobachten.
    @Kaliber dieses Problem hatten wir schon mal, dass die erste Rotation komplett komisch ist.


    Habe alle Sachen noch einmal verändert und genau geachtet, dass ich alles richtig umbenannt habe. Aber die Rampe geht nicht mehr zu.
    Ich nehme einfach, das CheckZoneMaut, was wir zusammen gemacht haben. (Was ich aus copy pasten irgendwie geschrottet habe)


    Rampe geht auf, erste Rotation ist völlig komisch, die Rampe geht beim entfernen des Radius nicht zu.




    C
    0.000000, 270, 135.000000

    Das ist die Objektrotation beim erstellen


    CSS
    ocmd:rampeauf(playerid,params[])
    {
        new i = GetZollMautPos(playerid);
    	if(i == -1) return 1;
    	SetTimerEx("@checkZoneMaut", 3000, 0, "ii", playerid, i);
    	return 1;
    }


    C
    stock GetZollMautPos(playerid)
    {
    	if(IsPlayerInRangeOfPoint(playerid,7.0, //...)) return 0;
    	if(IsPlayerInRangeOfPoint(playerid,7.0, //...) return 0;
    	return -1;
    }
    C
    stock MoveDynamicObjectRot(obj, Float:rX, Float:rY, Float:rZ, bool:open)
    {
    	new Float:x,Float:y,Float:z;
    	GetDynamicObjectPos(obj,x,y,z);
    	MoveDynamicObject(obj,x,y,z+((open)?(0.0001):(-0.0001)),0.0001,rX,rY,rZ);
    	return 1;
    }
    C
    @checkZoneMaut(p,i);@checkZoneMaut(p,i)
    {
    	return (!IsPlayerConnected(p) || GetZollMautPos(p) == -1) ? ZollMautzu(p,i) : SetTimerEx("@checkZoneMaut", 3000, 0, "ii", p,i);
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Entschuldigen Sie dies, dachte wäre alles drin :D
    MoveDynamicObjectRot siehst du im Beitrag davor, hast du übersehen.


    C
    stock ZollMautzu (p,i)
    {
     	switch(i)
    	{
    		case 0: MoveDynamicObjectRot(ZollMaut[i], 0,0.0,90, false);
    	}
    	return 1;
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Mach es mal so:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Also, mein Fehler... Ich habe 2 Objekte


    0.000000, 90.000000, -98.799995
    0.000000, 90.000000, 81.200004


    Beide müssen einfach nur um 90° verschoben werden (Z-Axe)
    Jetzt ist es so, dass das erste Objekt perfekt rotiert wird, aber sich nicht mehr schließt. Das zweite kommt verdreht in die Endposition schließt sich dafür aber


    Jetzt ist halt das Problem, dass die erste Rampe nicht schließt. Dieses Problem macht mir große Kopfschmerzen..



    C
    { //öffnen
        new i = GetZollMautPos(playerid);
    	if(i == -1) return 1;
    	MoveDynamicObjectRot(ZollMaut[i], 0,0.0,90, true);
    	SetTimerEx("@checkZoneMaut", 3000, 0, "ii", playerid, i);
    	return 1;
    }
    C
    @checkZoneMaut(p,i);@checkZoneMaut(p,i)
    {
    	return (!IsPlayerConnected(p) || GetZollMautPos(p) == -1) ? ZollMautzu(p,i) : SetTimerEx("@checkZoneMaut", 3000, 0, "ii", p,i);
    }




    C
    stock MoveDynamicObjectRot(obj, Float:rX, Float:rY, Float:rZ, bool:open)
    {
    	new Float:x,Float:y,Float:z;
    	GetDynamicObjectPos(obj,x,y,z);
    	MoveDynamicObject(obj,x,y,z+((open)?(0.0001):(-0.0001)),0.0001,rX,rY,rZ);
    	return 1;
    }
    C
    stock ZollMautzu (p,i)
    {
     	switch(i)
    	{
    		case 0: MoveDynamicObjectRot(ZollMaut[i], 0.000000, 270, 135.000000, false);



    Code
    stock GetZollMautPos(playerid)
    {
    	if(IsPlayerInRangeOfPoint(playerid,7.0,//Objekt 1)) return 0;
    	if(IsPlayerInRangeOfPoint(playerid,7.0,//Objekt 2)) return 1;
    	return -1;
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • und bei dem Schließen einfach das was bei 0 steht kopieren und die ursprünglichen Rotationen von Objekt 1 angeben....^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Danke, werde ich so ausprobieren.


    Ich habe zwei nebeneinander, sagen wir (x,y,z,):
    100, 100, 15
    100, 95, 15


    Ich will herausfinden, welche von den beiden (wenn er in beide steht z.b) am nähsten dran ist, dieser soll dann für GetZollMautPos eingesetzt werden.

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Pack das in ein Array:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hiermit holt er mir ja den, der am nächsten ist, muss ich davor die abfrage machen, ob er überhaupt in der Nähe von einen der Objekte ist?

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Er sagt mir, dass die normalen Objekte error 022: must be lvalue (non-constant) sind.

    C
    ZollMaut[0] = CreateDynamicObject



    Hier sagt er mir, dass ZollMaut bereits definiert ist. error 021: symbol already defined: "ZollMaut"

    C
    stock const Float:ZollMaut[][] = {


    In Zeile 1. kriege ich die Errors


    C
    tmp = GetPlayerDistanceFromPoint(playerid,ZollMaut[i][0],ZollMaut[i][1],ZollMaut[i][2]);
            if(tmp < dis) dis=tmp,idx=i;



    Code
    error 021: symbol already defined: "ZollMaut"
    error 001: expected token: ",", but found "["
    error 029: invalid expression, assumed zero
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Jaaa...sry, musst die Variable halt umbenennen :D


    Nenns halt...
    stock const Float:ZollMautPositions[][] = {

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Beitrag von Jameso ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fehler gefunden ().
  • https://prnt.sc/nql6y0 was mach ich falsch? Müsste doch so gehen oder nicht? Fehler trat auf, nachdem ich für i anstatt GetZollMaut  GetClosesZollMaut eingegeben habe.

    Code
    ocmd:(playerid,params[])
    { //Beim öffnen
        new i = GetClosestZollMaut(playerid);
        if(i == -1) return 1;
    C
    stock const Float:ZollMautPos[][] = {
        {X,Y,Z},
        {X,Y,Z},
    	{X,Y,Z},
    	{X,Y,Z},
    	{X,Y,Z},
    	{X,Y,Z}
    };
    C
    stock GetClosestZollMaut(playerid)
    {
        new Float:dis=9999.0,idx=-1;
        for(new i,Float:tmp; i<sizeof(ZollMaut); i++)
        {
            tmp = GetPlayerDistanceFromPoint(playerid,ZollMautPos[i][0],ZollMautPos[i][1],ZollMautPos[i][2]);
            if(tmp < dis) dis=tmp,idx=i;
        }
        return (dis < 7.0) ? idx : -1;
    }

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.