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
  • Hallihallo, wieder ein Problemchen :P


    und zwar möchte ich das ein Object unter/hinter einem Auto erstellt wird und dann langsam hoch fährt (nach 30 Sekunden hinter das Auto) - bei meinem jetzigem Code spawnt das Object direkt, ohne sich überhaupt zu bewegen.


    for(new i = 0; i<sizeof(pCar); i++)
    {
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    if(IsPlayerInRangeOfPoint(playerid, 15.0, vPos[0], vPos[1]-2, vPos[2]))
    {
    Object[playerid] = CreateObject(1632, vPos[0], vPos[1], vPos[2]-2.6, 0, 0, vPos[3]+180);
    MoveObject(Object[playerid], vPos[0], vPos[1], vPos[2], 30000, 0, 0, vPos[3]+180);
    ObjectErstellt[playerid] = 1;
    return 1;
    }
    else return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Fahrzeug!");
    }
    ?(

  • for(new i = 0; i<sizeof(pCar); i++)
    {
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    if(IsPlayerInRangeOfPoint(playerid, 15.0, vPos[0], vPos[1]-2, vPos[2]))
    {
    Object[playerid] = CreateObject(1632, vPos[0], vPos[1], vPos[2]-2.6, 0, 0, vPos[3]+180);
    MoveObject(Object[playerid], vPos[0], vPos[1], vPos[2]-0.01, 0.001, 0, 0, vPos[3]+180);
    ObjectErstellt[playerid] = 1;
    return 1;
    }
    else return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Fahrzeug!");
    }


    Falls es zu schnell geht, mach das 0.001 kleiner, also zu 0.0001.


  • Habs jetzt so das es der Zeit entspricht. Hätte jetzt jedoch gerne noch, das die ObjectID (also das Object xD) immer hinter dem Fahrzeug erstellt wird, egal wie das Fahrzeug steht - was müsste ich ändern?


    for(new i = 0; i<sizeof(pCar); i++)
    {
    new Float:vPos[4];
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    Object[b][ra_x] = vPos[0],Object[b][ra_y] = vPos[1],Object[b][ra_z] = vPos[2],Rampe[b][ra_a] = vPos[3];
    if(IsPlayerInRangeOfPoint(playerid, 15.0, Object[b][ra_x], Object[b][ra_y]-2, Object[b][ra_z]))
    {
    ObjectID[playerid] = CreateObject(1632, Object[b][ra_x], Object[b][ra_y]+8, Object[b][ra_z]-3.0, 0, 0, Object[b][ra_a]+0);
    MoveObject(ObjectID[playerid], Object[b][ra_x], Object[b][ra_y]+8, Object[b][ra_z]-1.0, 0.06, 0, 0, Object[b][ra_a]+0);
    SetTimer("BuildObj", 30000, false);
    ObjectOwner[playerid] = playerid;
    return 1;
    }
    else return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Fahrzeug!");
    }



  • Dann müsste es ja theoretisch so (eingebunden) funktionieren, oder?


    for(new i = 0; i<sizeof(pCar); i++)
    {
    new Float:vPos[4];
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    Object[b][ra_x] = vPos[0],Object[b][ra_y] = vPos[1],Object[b][ra_z] = vPos[2],Object[b][ra_a] = vPos[3];
    GetVehicleZAngle(pCar[i], vPos[3]);
    vPos[0] = (8.0 * floatsin(-vPos[3], degrees));
    vPos[1] = (8.0 * floatcos(-vPos[3], degrees));
    if(IsPlayerInRangeOfPoint(playerid, 15.0, Object[b][ra_x], Object[b][ra_y]-2, Object[b][ra_z]))
    {
    ObjectID[playerid] = CreateObject(1632,Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-3.0, 0, 0, Object[b][ra_a]+0);
    MoveObject(ObjectID[playerid], Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-1.0, 0.06, 0, 0, Object[b][ra_a]+0);
    SetTimer("BuildObj", 30000, false);
    ObjOwner[playerid] = playerid;
    return 1;
    }
    else return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Laster!");
    }


    Praktisch nämlich nicht ^^


    Edit: auch mit -8.0 nicht

  • Die Berechnung ist durcheinander und hat eigentlich keine Auswirkung mehr auf das Objekt:
    for(new i = 0; i<sizeof(pCar); i++)
    {
    new Float:vPos[4];
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    vPos[0] = (-8.0 * floatsin(-vPos[3], degrees));
    vPos[1] = (-8.0 * floatcos(-vPos[3], degrees));
    Object[b][ra_x] = vPos[0],Object[b][ra_y] = vPos[1],Object[b][ra_z] = vPos[2],Object[b][ra_a] = vPos[3];
    if(IsPlayerInRangeOfPoint(playerid, 15.0, Object[b][ra_x], Object[b][ra_y]-2, Object[b][ra_z]))
    {
    ObjectID[playerid] = CreateObject(1632,Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-3.0, 0, 0, Object[b][ra_a]+0);
    MoveObject(ObjectID[playerid], Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-1.0, 0.06, 0, 0, Object[b][ra_a]+0);
    SetTimer("BuildObj", 30000, false);
    ObjOwner[playerid] = playerid;
    return 1;
    }
    else return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Laster!");
    }



  • Dann bekomm ich die Nachricht: "Du bist nicht nah genug am Laster"


    Edit: dadurch das ich vPos den Object[b ][Koordinaten] zuordne die ich für die Koordinaten zum Object Createn nehme ..

  • Du kannst dann entweder den Range erhöhen, oder du berechnest die Position erst nach der Range Abfrage. Eigentlich hatte ich gedacht 15 reicht als Range.


    for(new i = 0; i<sizeof(pCar); i++)
    {
    new Float:vPos[4];
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    if(IsPlayerInRangeOfPoint(playerid, 15.0, vPos[0], vPos[1], vPos[2]))
    {
    vPos[0] = (-8.0 * floatsin(-vPos[3], degrees));
    vPos[1] = (-8.0 * floatcos(-vPos[3], degrees));
    Object[b][ra_x] = vPos[0],Object[b][ra_y] = vPos[1],Object[b][ra_z] = vPos[2],Object[b][ra_a] = vPos[3];
    ObjectID[playerid] = CreateObject(1632,Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-3.0, 0, 0, Object[b][ra_a]+0);
    MoveObject(ObjectID[playerid], Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-1.0, 0.06, 0, 0, Object[b][ra_a]+0);
    SetTimer("BuildObj", 30000, false);
    ObjOwner[playerid] = playerid;
    return 1;
    }
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Laster!");



    EDIT: Ich habe den Fehler gerade entdeckt, das return war in der Schleife, somit hat es beim ersten Fahrzeug aufgehört. Die Berechnung lasse ich trotzdem mal so, ist ressourcenschonender. Code ist abgeändert, sollte jetzt klappen.


  • Beim Test erschien erstmal nichts, hab dann ein Checkpoint mit den Koordinaten des erstellten Objects anzeigen lassen, welcher mich hierhin führt. Das Object schwebt weiter oben.

  • Ahh, du hast den Code nicht richtig übernommen. Da habe ich natürlich nicht explizit darauf geachtet.
    for(new i = 0; i<sizeof(pCar); i++)
    {
    new Float:vPos[4];
    GetVehiclePos(pCar[i], vPos[0], vPos[1], vPos[2]);
    GetVehicleZAngle(pCar[i], vPos[3]);
    if(IsPlayerInRangeOfPoint(playerid, 15.0, vPos[0], vPos[1], vPos[2]))
    {
    vPos[0] += (-8.0 * floatsin(-vPos[3], degrees));
    vPos[1] += (-8.0 * floatcos(-vPos[3], degrees));
    Object[b][ra_x] = vPos[0],Object[b][ra_y] = vPos[1],Object[b][ra_z] = vPos[2],Object[b][ra_a] = vPos[3];
    ObjectID[playerid] = CreateObject(1632,Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-3.0, 0, 0, Object[b][ra_a]+0);
    MoveObject(ObjectID[playerid], Object[b][ra_x], Object[b][ra_y], Object[b][ra_z]-1.0, 0.06, 0, 0, Object[b][ra_a]+0);
    SetTimer("BuildObj", 30000, false);
    ObjOwner[playerid] = playerid;
    return 1;
    }
    }
    return SendClientMessage(playerid, COLOR_ERRORTEXT, "Du bist nicht nah genug am Laster!");