ATM System? Wie Bearbeite ich Objecte InGame und Speicher diese dann?

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 ich habe ein Dynamisches ATM System geschrieben nun hab ich aber das Problem..
    der ATM wird ja dort erstellt wo ich stehe ..
    Wie kann ich das mit diesem SAMP Editor machen es gibt ja sowas wo man InGame bewegen kann und dann
    wenn man speichert die Position gespeichert wird allerdings habe ich mich noch nie mit der Funktion auseinandergesetzt
    weil ich davon keine Ahnung habe würde mich sehr freuen wenn mir jemand dabei helfen könnte so sieht man sys bis jetzt aus:
    Und das Label ..:: Bank Automat ::.. wird nicht angezeigt ATM wird aber erstellt und Speichert / Lädt auch will halt nur das wenn man
    den Atm erstellt ihn noch z.B. mit /editatm an dem man ganz nah dran ist bearbeiten kann. und halt das das Label angezeigt wird.
    Sowas meine ich:

    ocmd:createatm(playerid, params[])
    {
    if(!isAdmin(playerid, 3))return
    SendClientMessage(playerid, 0xC30000FF, "Dein Adminrang ist zu niedrig.");
    new Float:xc, Float:yc, Float:zc;
    GetPlayerPos(playerid, xc, yc, zc);



    new id=getFreeAtmID();
    aInfo[id][a_x]=xc;
    aInfo[id][a_y]=yc;
    aInfo[id][a_z]=zc;
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query),
    "INSERT INTO atm (a_x, a_y, a_z, atmObjekt) VALUES ('%f', '%f', '%f', 2942)",
    xc, yc, zc);
    mysql_function_query(dbhandle, query, true, "OnATMCreated", "i", id);
    return 1;
    }



    //ATM SYS:
    enum atmEnum{
    Float:a_x,
    Float:a_y,
    Float:a_z,
    a_id,
    Text3D:a_text,
    atmObjekt
    }
    new aInfo[100][atmEnum];



    public OnAtmsLoad()
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeAtmID();
    aInfo[id][a_x]=cache_get_field_content_float(i, "a_x", dbhandle);
    aInfo[id][a_y]=cache_get_field_content_float(i, "a_y", dbhandle);
    aInfo[id][a_z]=cache_get_field_content_float(i, "a_z", dbhandle);
    aInfo[id][a_id]=cache_get_field_content_int(i, "id", dbhandle);
    updateAtm(id);
    }
    return 1;
    }



    updateAtm(id)
    {
    new string[128];
    if(aInfo[id][a_text])
    {
    Delete3DTextLabel(aInfo[id][a_text]);
    }
    if(!strlen(aInfo[id][a_id]))
    {
    format(string,sizeof(string), "..:: Bank Automat ::..");
    CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);
    aInfo[id][a_text]=Create3DTextLabel(string, 0xFFA000FF, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 10, 0, 1);
    }
    else
    {
    format(string,sizeof(string), "..:: Bank Automat ::..");
    CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);
    aInfo[id][a_text]=Create3DTextLabel(string, 0xFFA000FF, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 10, 0, 1);
    }
    return 1;
    }



    public OnATMCreated(id)
    {
    aInfo[id][a_id]=cache_insert_id();
    }
    getFreeAtmID()
    {
    for(new i=0; i<sizeof(aInfo); i++)
    {
    if(aInfo[i][a_id]==0)return i;
    }
    return 0;
    }


    //ATMS laden:
    new query2[128];
    format(query2, sizeof(query2), "SELECT * FROM atm");
    mysql_function_query(dbhandle, query2, true, "OnAtmsLoad", "");



    So sieht der Code zurzeit aus

  • EditObject (um den Editor zu aktivieren) und OnPlayerEditObject http://wiki.sa-mp.com/wiki/OnPlayerEditObject_DE um zu untersuchen, ob es gespeichert, abgebrochen oder bewegt wurde. Natürlich wenn es gespeichert wurde die Koprdinaten und Id sowie Rotation auch noch in der MySQL DB speichern ;)

  • Wenn ich ehrlich sein soll ich weiß nicht genau wie ich das anstellen soll das ich dann genau das ATM Object editiere und so abspeichere bin neu im Scripting bereich könnte mir da jemand helfen

  • Wenn ich ehrlich sein soll ich weiß nicht genau wie ich das anstellen soll das ich dann genau das ATM Object editiere und so abspeichere bin neu im Scripting bereich könnte mir da jemand helfen

    Wenn du neu bist verwendest du am besten einen Mapeditor und stellst dir die Automaten damit hin. Dann nimmst du dir die gesamten Koordinaten und machst eine Schleife durch.
    Dann fragst du ab "IsPlayerInRangeOfPoint" vom Automaten und machst dann deine Aktion durchführen.

  • 1.)
    Entferne das hier aus updateAtm:
    CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);


    2.)
    Füge beim Befehl das hier hinzu:
    aInfo[id][a_objectID] = CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);
    EditObject(playerid, aInfo[id][a_objectID]);


    3.)
    Füge im enum hinzu:
    a_objectID,


    4.)
    Bei http://wiki.sa-mp.com/wiki/OnPlayerEditObject:
    new id = -1;
    for(new i = 0; i < sizeof(aInfo); i++)
    {
    if(aInfo[id][a_objectID] == objectid) break;
    }
    if(id == -1) return 1;
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    Beachte auch diese Response Types: http://wiki.sa-mp.com/wiki/ObjectEditionResponesTypes
    Den obigen Code kannst du beim Update (?) und Final nutzen, beim Cancel musst du das Objekt löschen und einen DELETE auf die Datenbank machen.



    Eventuell musst du noch eine Spielervariable anlegen, damit du weißt, dass der Spieler gerade eine ATM erstellt, und dies bei OnPlayerEditObject abfragen.


    Versuche hiermit mal, wie weit du kommst. Bei Fragen kannst du natürlich gerne nachfragen.

  • Beitrag von ReborN ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Jeffry war schneller ().
  • C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(605) : error 029: invalid expression, assumed zero
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(605) : warning 213: tag mismatch
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(605) : error 001: expected token: "]", but found "break"
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(607) : error 078: function uses both "return" and "return <value>"

    public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
    {
    new Float:oldX, Float:oldY, Float:oldZ,
    Float:oldRotX, Float:oldRotY, Float:oldRotZ;
    GetObjectPos(objectid, oldX, oldY, oldZ);
    GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    if(!playerobject) // If this is a global object, move it for other players
    {
    if(!IsValidObject(objectid)) return;
    MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
    }



    if(response == EDIT_RESPONSE_FINAL)
    {
    new id = -1;
    for(new i = 0; i < sizeof(aInfo); i++)
    {
    if(aInfo[id][a_objectID?] == objectid) break;//ERROR 605 ZEILE
    }
    if(id == -1) return 1;//ERROR 607 ZEILE
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    }



    if(response == EDIT_RESPONSE_CANCEL)
    {
    // Spieler hat abgebrochen
    if(!playerobject) // Objekt ist kein Player-Objekt
    {
    SetObjectPos(objectid, oldX, oldY, oldZ);
    SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    }
    else
    {
    SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
    SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
    }
    }
    }



    @Jeffry

  • C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(607) : error 078: function uses both "return" and "return <value>"
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(608) : warning 202: number of arguments does not match definition
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(629) : warning 209: function "OnPlayerEditObject" should return a value



    public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
    {
    new Float:oldX, Float:oldY, Float:oldZ,
    Float:oldRotX, Float:oldRotY, Float:oldRotZ;
    GetObjectPos(objectid, oldX, oldY, oldZ);
    GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    if(!playerobject) // If this is a global object, move it for other players
    {
    if(!IsValidObject(objectid)) return;
    MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
    }



    if(response == EDIT_RESPONSE_FINAL)
    {
    new id = -1;
    for(new i = 0; i < sizeof(aInfo); i++)
    {
    if(aInfo[id][a_objectID] == objectid) break;
    }
    if(id == -1) return 1;//ERROR 607 ZEILE
    updateAtm(id);//WARNING 608
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    }



    if(response == EDIT_RESPONSE_CANCEL)
    {
    // Spieler hat abgebrochen
    if(!playerobject) // Objekt ist kein Player-Objekt
    {
    SetObjectPos(objectid, oldX, oldY, oldZ);
    SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    }
    else
    {
    SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
    SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
    }
    }
    }//WARNING 629

  • public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
    {
    new Float:oldX, Float:oldY, Float:oldZ,
    Float:oldRotX, Float:oldRotY, Float:oldRotZ;
    GetObjectPos(objectid, oldX, oldY, oldZ);
    GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    if(!playerobject) // If this is a global object, move it for other players
    {
    if(!IsValidObject(objectid)) return 1;
    MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
    }

    if(response == EDIT_RESPONSE_FINAL)
    {
    new id = -1;
    for(new i = 0; i < sizeof(aInfo); i++)
    {
    if(aInfo[id][a_objectID] == objectid) break;
    }
    if(id == -1) return 1;
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    }

    if(response == EDIT_RESPONSE_CANCEL)
    {
    // Spieler hat abgebrochen
    if(!playerobject) // Objekt ist kein Player-Objekt
    {
    SetObjectPos(objectid, oldX, oldY, oldZ);
    SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    }
    else
    {
    SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
    SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
    }
    }
    return 1;
    }


    Die Warnung in Zeile 608 kommt, da du anscheinend etwas beim updateAtm geändert hast, im Funktionskopf.

  • Beitrag von PabloEscobarYo ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fail^^ ().
  • Speichert irgendwie nicht ^^




    //EDIT:
    C:\Users\**\Desktop\SELFMADE\gamemodes\selfmade.pwn(5324) : warning 202: number of arguments does not match definition




    Ich hab bei updateatm(id) , updateatm(id,playerid)


    hinzugefügt.. vielleicht deswegen? aber wenn ich dort id,playerid hinzufüge kommt nen error undefined symbol playerid aber bei den anderen abfragen wo ich id,playerid einfüge nicht

  • Deinem gelöschten Post habe ich zuvor das hier entnommen:



    CreateObject sollte aus der Funktion raus.
    updateAtm(id)
    {
    new string[128];
    if(aInfo[id][a_text])
    {
    Delete3DTextLabel(aInfo[id][a_text]);
    }
    if(!strlen(aInfo[id][a_id]))
    {
    format(string,sizeof(string), "..:: Bank Automat ::..");
    aInfo[id][a_text]=Create3DTextLabel(string, 0xFFA000FF, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 10, 0, 1);
    }
    else
    {
    format(string,sizeof(string), "..:: Bank Automat ::..");
    aInfo[id][a_text]=Create3DTextLabel(string, 0xFFA000FF, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 10, 0, 1);
    }
    return 1;
    }


    Und das hier sollte in den Befehl (/createatm):
    aInfo[id][a_objectID] = CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);
    EditObject(playerid, aInfo[id][a_objectID]);


    Bitte nimm dir etwas mehr Zeit und arbeite die Vorschläge sorgfältig durch, so ein System schreibst du ja schließlich nicht in 5 Minuten.

  • Hab das jetzt so allerdings nach nem Server Restart ist das Object weg das 3DTextLabel wird erstellt wo man den befehl genutzt hat


    Hab das ganze jetzt so zurzeit:

    ocmd:createatm(playerid, params[])
    {
    if(!isAdmin(playerid, 3))return
    SendClientMessage(playerid, 0xC30000FF, "Dein Adminrang ist zu niedrig.");
    new Float:xc, Float:yc, Float:zc;
    GetPlayerPos(playerid, xc, yc, zc);



    new id=getFreeAtmID();
    aInfo[id][a_x]=xc;
    aInfo[id][a_y]=yc;
    aInfo[id][a_z]=zc;
    aInfo[id][a_objectID] = CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);
    EditObject(playerid, aInfo[id][a_objectID]);
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query),
    "INSERT INTO atm (a_x, a_y, a_z, atmObjekt) VALUES ('%f', '%f', '%f', 2942)",
    xc, yc, zc);
    mysql_function_query(dbhandle, query, true, "OnATMCreated", "i", id);
    return 1;
    }



    public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
    {
    new Float:oldX, Float:oldY, Float:oldZ,
    Float:oldRotX, Float:oldRotY, Float:oldRotZ;
    GetObjectPos(objectid, oldX, oldY, oldZ);
    GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    if(!playerobject) // If this is a global object, move it for other players
    {
    if(!IsValidObject(objectid)) return 1;
    MoveObject(objectid, fX, fY, fZ, 10.0, fRotX, fRotY, fRotZ);
    }



    if(response == EDIT_RESPONSE_FINAL)
    {
    new id = -1;
    for(new i = 0; i < sizeof(aInfo); i++)
    {
    if(aInfo[id][a_objectID] == objectid) break;
    }
    if(id == -1) return 1;
    updateAtm(id);
    //In Datenbank abspeichern
    new query[256];
    format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    }



    if(response == EDIT_RESPONSE_CANCEL)
    {
    // Spieler hat abgebrochen
    if(!playerobject) // Objekt ist kein Player-Objekt
    {
    SetObjectPos(objectid, oldX, oldY, oldZ);
    SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    }
    else
    {
    SetPlayerObjectPos(playerid, objectid, oldX, oldY, oldZ);
    SetPlayerObjectRot(playerid, objectid, oldRotX, oldRotY, oldRotZ);
    }
    }
    return 1;
    }

  • Füge vor updateAtm(id); bei OnPlayerEditObject das hier ein, damit die Koordinaten übertragen werden und das Label geändert wird:
    aInfo[id][a_x] = fX;
    aInfo[id][a_y] = fY;
    aInfo[id][a_z] = fZ;


    Bein OnAtmsLoad, nach updateAtm(id);:
    aInfo[id][a_objectID] = CreateObject(2942, aInfo[id][a_x], aInfo[id][a_y], aInfo[id][a_z], 0.0, 0.0, 96.0);


    Eventuell solltest du auch die Rotationen speichern, sofern die geändert werden.

  • format(query, sizeof(query), "UPDATE atm SET a_x = '%f', a_y = '%f', a_z = '%f' WHERE id = '%d'", fX, fY, fZ, aInfo[id][a_id]);
    Heißt deine Primary Key Spalte in der Tabelle "atm" auch "id"? Das solltest du sonst natürlich anpassen, auf deinen Bezeichner.

  • Das passt.
    Wird dir etwas im MySQL Log ausgegeben, wenn du die ATM anlegst, bzw. deren Position veränderst?


    Wenn nein, dann schalte bitte mal den Debug Modus an, je nach Plugin:
    mysql_debug(1);
    oder:
    mysql_log(LOG_ALL);
    Und poste dann, was dir dort ausgegeben wird.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen