Objekte aus Dialog erstellen

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
  • Hallo zusammen.
    Da ich nun ein größeres Problem habe, erstelle ich nun ein eigenes Thema dafür.


    Ich habe vor, dass ich Objekte aus einem Dialog erstellen kann. Dieses soll wie folgt aussehen.


    Ich gebe z.B. /test ein und ein Dialog erscheint, wo ich etwas auswähle.
    Das ganze sieht wie folgt aus:
    if (strcmp("/test", cmdtext, true, 10) == 0)
    {
    ShowPlayerDialog(playerid, DIALOG_GEBAEUDE, DIALOG_STYLE_LIST, "Einrichtung", "Küche\nWohnzimmer\nSchlafzimmer\nBadezimmer", "Auswaehlen", "Abbrechen");
    }
    switch(dialogid)
    {
    case DIALOG_GEBAEUDE:
    {
    if(response)
    {
    switch(listitem)
    {
    case 0:
    {
    new string[4000+1];
    for(new x;x<sizeof(EinrichtungObjeckte);x++)
    {
    format(string, sizeof(string), "%s%s\n", string, EinrichtungObjeckte[x][attachname]);
    }
    ShowPlayerDialog(playerid, DIALOG_GEBAEUDE_EINRICHTUNG, DIALOG_STYLE_LIST, \
    "{FF0000}Einrichtung", string, "Auswaehlen", "Beenden");
    }
    }
    return 1;
    }
    }
    Soweit so gut. Die Objekte habe ich mit Namen und ID in einem enum erstellt.
    new EinrichtungObjeckte[][ObjekteEnum] = {
    {2311, "Holztisch"},
    {2309, "Holzstuhl"}
    };
    Das ganze funktioniert auch soweit.
    Nun hänge ich ein wenig bei der Erstellung der Objekte. Ich möchte das man diese dann auch per EditObjekt verschieben kann. Nun hab ich leider überhaupt keinen Schimmer, wie ich das ganze angehen soll.
    Ich gebe zu, ich habe mir das Filterscript ospawner als Anhaltspunkt dazu genommen. Aber ich komme halt beim Erstellen nicht weiter, da dies dort doch ein wenig anders ist, wie ich es vor habe.


    Hoffe ihr wisst was ich meine und könnt mir helfen.


    P.S. Ich bitte euch mir jetzt nicht zu sagen, dass man das anders und so oder so machen kann. Ich möchte lediglich das System verstehen und dann zum späteren Zeitpunkt den Code optimieren.

  • Hier steht eiegendlich alles drine: http://wiki.sa-mp.com/wiki/EditObject
    wo genau kommst du den nicht weiter?


    edit:
    andere Interessante Wiki einträge:
    http://wiki.sa-mp.com/wiki/SelectObject - Den Spieler Objekte anklicken lassen damit er es löschen, editieren whatever kann.
    http://wiki.sa-mp.com/wiki/OnPlayerSelectObject - Welches Object hat der spieler angeklickt etc.
    http://wiki.sa-mp.com/wiki/CancelEdit - Editieren des Objektes abbrechen.
    http://wiki.sa-mp.com/wiki/EditPlayerObject - Editieren von Playerobjecten (ganz wichtig. Alle Streamer Onjecte sind im Grunde nur Player Objecte.)
    http://wiki.sa-mp.com/wiki/EditAttachedObject - Editieren von An Spieler /Fahrzeugen angebrachte Objecte.
    http://wiki.sa-mp.com/wiki/OnPlayerEditAttachedObject Alle Daten eines veränderten Attachted Objectes.
    http://wiki.sa-mp.com/wiki/OnPlayerEditObject Alle Daten eines verschobenen Objectes/SpielerObjectes

  • DIALOG_GEBAEUDE_EINRICHTUNG


    Naja, du machst das dann einfach so:


    case DIALOG_GEBAEUDE_EINRICHTUNG: {
    if(!response) return 1; //hier hat er auf Beenden geklickt
    const Float:distance = 5.0;
    new Float:p[4];
    GetPlayerPos(playerid,p[0],p[1],p[2]),GetPlayerFacingAngle(playerid,p[3]);
    p[0] += (distance * floatsin(-p[3], degrees)); //Damit das Objekt vor dem Spieler erstellt wird
    p[1] += (distance * floatcos(-p[3], degrees)); //Damit das Objekt vor dem Spieler erstellt wird
    new object = CreateObject(EinrichtungObjeckte[listitem][_:0],p[0],p[1],p[2],0,0,0);
    return EditObject(playerid, object);
    }


    Da wo ich _:0 geschrieben habe, musst du den Namen von deinem Enumerator Item einsetzen, also z.B. attachid oder was du da halt geschrieben hast :)


    new string[4000+1];


    Du kannst das genau bestimmen durch:


    new string[sizeof(EinrichtungObjeckte[]) * sizeof(EinrichtungObjeckte)];


    new EinrichtungObjeckte[][ObjekteEnum]


    und schreib das so:


    stock const EinrichtungObjeckte[][ObjekteEnum]


    Dann kannst du schneller auf die Werte zugreifen und nicht ausversehen mal verändern ;)


    mfg. :thumbup:


    //Edit: Code

    ast2ufdyxkb1.png


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

    Einmal editiert, zuletzt von Kaliber ()

  • Ok. Ich kann dir erstens anbieten dir heute nach der Arbeit ein wenig zu helfen.


    Zum anderen:

    if(response)
    {
    new obj=createObject(EinrichtungObjeckte[listitem][attachmodel],Koordinaten)//kenne dein Enum nicht, aber ich glaube das ist verständlich
    return 1;
    }

  • Da wo ich _:0 geschrieben habe, musst du den Namen von deinem Enumerator Item einsetzen, also z.B. attachid oder was du da halt geschrieben hast


    Also wenn ich das richtig verstanden habe, müsste das dann so aussehen:
    new object = CreateObject(EinrichtungObjeckte[listitem][ObjekteEnum],p[0],p[1],p[2],0,0,0);
    Da mault der aber rum, dass was mit dem array nicht stimmt.

    Zitat

    error 032: array index out of bounds (variable "EinrichtungObjeckte")


    Ich kann dir erstens anbieten dir heute nach der Arbeit ein wenig zu helfen.


    Wenn ich hier nicht weiter komme, komme ich da gerne drauf zurück. Obwohl wir ja heute Abend was anderes vor hatten. :D

  • gib mal dein enum rüber, dann kann ich das geneu sehen.


    zum anderen, gib in der variable die anzahl der einträge beim erstellen an:


    new EinrichtungObjeckte[2][ObjekteEnum] = {
    {2311, "Holztisch"},
    {2309, "Holzstuhl"}
    };


    andere Frage willst du Pro Kategorie eine neue Variable oder wie willst du die anderen Kategorien einbauen?


  • Nein, entweder du lässt die _:0 oder du schreibst da attachmodel oder attachid rein, den Namen halt, den du im Enum vergeben hast ^^


    Ups, danke dir ist mir auch gar nicht aufgefallen.

  • Nein, entweder du lässt die _:0 oder du schreibst da attachmodel oder attachid rein, den Namen halt, den du im Enum vergeben hast


    Ahh. Alles klar. Habs falsch verstanden. Funktioniert nun. Danke euch. :thumbup:


    Kaliber:
    Ich muss dich leider nochmal nerven. :whistling:
    Ist es eigentlich möglich, bei drehen eines Objekts den Winkel anzeigen zu lassen?

  • Ist es eigentlich möglich, bei drehen eines Objekts den Winkel anzeigen zu lassen?


    Wenn du mit "Winkel" die Rotations-Achsen meinst, dann natürlich :)


    new Text3D:label; //Oben ins Skript


    label = Create3DTextLabel("X: 0.0 | Y: 0.0 | Z: 0.0",0xFF4800FF,p[0],p[1],p[2]+2.5,20.0,0,0); //Dahin wo auch das Objekt erstellt wird


    //und unter OnPlayerEditObject
    new string[128];
    format(string,128,"X: %.02f | Y: %.02f | Z: %.02f",fRotX,fRotY,fRotZ);
    Update3DTextLabelText(label, 0xFF4800FF, string);


    mfg. :thumbup:

    ast2ufdyxkb1.png


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