Create Object Problem

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
  • Guten Tag,


    ich möchte InGame in der Lage sein als Officer eine Straßensperre zu erstellen. Daher denke ich muss ich den Create Object Befehl benutzen. Dennoch ist mein Problem wie ich die Rotationen Float:rX, Float:rY und Float:rZ herausbekommen kann. Eine Idee?


    Ebenfalls ist mein Problem, dass ich nicht weiß wie ich später diese wieder InGame verschwinden lassen kann. Gibt es da einen Befehl?

  • new Float:rX,Float:rY,Float:rZ;
    GetPlayerPos(playerid,yX,rY,rZ);


    /e zum entfernen der Straßensperren, benutz einfach die DestroyObjects Funktion.


    Danke, aber durch GetPlayerPos bekommt man doch nicht die Rotation oder?

  • Hier haste nen ganzes Teil
    Habe 2 Funktionen


    die erste, wo 5 kleine Sperren erstellt werden.
    oder die zweite, wo 5 kleine, aber richtig miese Straßensperren erstellt werden.


    Die erste:


    bei den new's:
    new Sperrebit[MAX_PLAYERS];
    new Sperre[MAX_PLAYERS][5];


    Bei OnPlayerDisconnect noch:
    DestroyObject(Sperre[playerid][0]);
    DestroyObject(Sperre[playerid][1]);
    DestroyObject(Sperre[playerid][2]);
    DestroyObject(Sperre[playerid][3]);
    DestroyObject(Sperre[playerid][4]);
    Sperrebit[playerid]=0;


    bei OnPlayerCommandText:
    if (strcmp( cmdtext,"/sperre", true )==0)
    {
    if(!IsACop(playerid))
    {
    SendClientMessage(playerid, COLOR_YELLOW,"Sie Haben keine Berechtigung");
    return 1;
    }
    if(Sperrebit[playerid]==0)
    {
    if(!IsPlayerInAnyVehicle(playerid))
    {
    new Float:x,Float:y,Float:z,Float:a;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    GetXYInFrontOfPlayer(playerid,x,y,2.0);
    Sperre[playerid][0] = CreateObject(1228,x,y,z-0.5,0,0,a+90);
    Sperre[playerid][1] = CreateObject(1228,x+2.0 * floatsin(-a+90, degrees),y+2.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperre[playerid][2] = CreateObject(1228,x+4.0 * floatsin(-a+90, degrees),y+4.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperre[playerid][3] = CreateObject(1228,x-2.0 * floatsin(-a+90, degrees),y-2.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperre[playerid][4] = CreateObject(1228,x-4.0 * floatsin(-a+90, degrees),y-4.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperrebit[playerid]=1;
    SendClientMessage(playerid, COLOR_YELLOW,"Straßensperre erstellt!");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED,"Du kannst keine Straßensperre erstellen wenn du in einem Auto bist!");
    }
    }
    else
    {
    DestroyObject(Sperre[playerid][0]);
    DestroyObject(Sperre[playerid][1]);
    DestroyObject(Sperre[playerid][2]);
    DestroyObject(Sperre[playerid][3]);
    DestroyObject(Sperre[playerid][4]);
    Sperrebit[playerid]=0;
    SendClientMessage(playerid, COLOR_YELLOW,"Straßensperre abgebaut!");
    }
    return 1;
    }


    Die zweite, und damit richtig miese.


    bei den new's:
    new Sperrungbit[MAX_PLAYERS];
    new Sperrung[MAX_PLAYERS][5];


    Bei OnPlayerDisconnect noch:
    DestroyObject(Sperrung[playerid][0]);
    DestroyObject(Sperrung[playerid][1]);
    DestroyObject(Sperrung[playerid][2]);
    DestroyObject(Sperrung[playerid][3]);
    DestroyObject(Sperrung[playerid][4]);
    Sperrungbit[playerid]=0;


    Bei OnPlayerCommandText:
    if (strcmp( cmdtext,"/sperrung", true )==0)
    {
    if(!IsACop(playerid))
    {
    SendClientMessage(playerid, COLOR_YELLOW,"Sie Haben keine Berechtigung");
    return 1;
    }
    if(Sperrungbit[playerid]==0)
    {
    if(!IsPlayerInAnyVehicle(playerid))
    {
    new Float:x,Float:y,Float:z,Float:a;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    GetXYInFrontOfPlayer(playerid,x,y,2.0);
    Sperrung[playerid][0] = CreateObject(2976,x,y,z-0.5,0,0,a+90);
    Sperrung[playerid][1] = CreateObject(2976,x+2.0 * floatsin(-a+90, degrees),y+2.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperrung[playerid][2] = CreateObject(2976,x+4.0 * floatsin(-a+90, degrees),y+4.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperrung[playerid][3] = CreateObject(2976,x-2.0 * floatsin(-a+90, degrees),y-2.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperrung[playerid][4] = CreateObject(2976,x-4.0 * floatsin(-a+90, degrees),y-4.0 * floatcos(-a+90, degrees),z-0.5,0,0,a+90);
    Sperrungbit[playerid]=1;
    SendClientMessage(playerid, COLOR_YELLOW,"Straßensperre erstellt!");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED,"Du kannst keine Straßensperre erstellen wenn du in einem Auto bist!");
    }
    }
    else
    {
    DestroyObject(Sperrung[playerid][0]);
    DestroyObject(Sperrung[playerid][1]);
    DestroyObject(Sperrung[playerid][2]);
    DestroyObject(Sperrung[playerid][3]);
    DestroyObject(Sperrung[playerid][4]);
    Sperrungbit[playerid]=0;
    SendClientMessage(playerid, COLOR_YELLOW,"Straßensperre abgebaut!");
    }
    return 1;
    }



    Hoffe es hilft.
    PS: Die zweite, da kommt nichtmal nen Panzer drüber, habe es getestst,
    das ist sooo übel dieses Objekt.


    MfG
    TBB

  • Das würde aber ohne einen Zusatz am ende des Scriptes nicht funktionieren (zumindest das erste - Soweit bin ich)


    EDIT: Habe diesen gefunden und nutze ihn mal :)


    GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
    {
    new Float:a;
    GetPlayerPos(playerid, x, y, a);
    GetPlayerFacingAngle(playerid, a);
    if (GetPlayerVehicleID(playerid))
    {
    GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
    }
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
    }


    EDIT #2: Damit funktioniert es perfekt, bin gerade am testen meines eigenen Scriptes :)

    Einmal editiert, zuletzt von GiS ()

  • Ich habe nun mein eigenes Script:


    dcmd_roadblock(playerid, params[])
    {
    new blockid;

    if(sscanf(params, "i", blockid)) return SendClientMessage(playerid, COLOR_GREY, "VERWENDUNG: /roadblock [ItemID]");
    else if(blockid > 3 || blockid < 1) return SendClientMessage(playerid, COLOR_GREY, "Wähle zwischen Roadblock 1 und 3.");
    else
    {
    if(!IsPlayerInAnyVehicle(playerid))
    {
    new Float:X, Float:Y, Float:Z, Float:angle;

    GetPlayerPos(playerid, Float:X, Float:Y, Float:Z);
    GetPlayerFacingAngle(playerid, Float:angle);
    GetXYInFrontOfPlayer(playerid, Float:X, Float:Y, 2.0);

    if(blockid == 1)
    {
    CreateObject(1228, Float:X, Float:Y, Float:Z-0.5,0,0,angle+90);
    }
    else if(blockid == 2)
    {
    CreateObject(1283, Float:X, Float:Y, Float:Z-0.5,0,0,angle+90);
    }
    else
    {
    CreateObject(1238, Float:X, Float:Y, Float:Z-0.5,0,0,angle+90);
    }
    }
    }
    return 1;
    }


    und des Zusatz an Ende:


    GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
    {
    new Float:a;
    GetPlayerPos(playerid, x, y, a);
    GetPlayerFacingAngle(playerid, a);
    if (GetPlayerVehicleID(playerid))
    {
    GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
    }
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
    }


    Dennoch spawnen die Objecte immernoch ein bischen zu hoch. Was ist flasch`?


    EDIT: Manche Object sind weiterhin zu hoch oder niedrig. Liegt das an den Objecten oder is doch ein Fehler im Script?

    Einmal editiert, zuletzt von GiS ()

  • Die Objekte haben unterschiedliche Mittelpunkte. Soll heissen, daß Objekt 1 sein "Zentrum" unten liegt und bei Objekt 2 z.B. das "Zentrum" genau in der Mitte des Objekts ist. Du musst halt das für jedes Objekt selber anpassen. Z.B. mit Z+1 oder Z-0.5 usw.