Gangzone System

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
  • Ich heiße nicht nur iceberq, sondern euch auch herzlich willkommen zu diesem Thread :)


    Ich habe "versucht" ein Gangzone System einzubauen... hat nicht so geklappt wie erwartet..
    Zunächst habe ich mit einem Enum begonnen:
    enum gzEnum{
    Float:min_x,
    Float:min_y,
    Float:max_x,
    Float:max_y,
    Float:gzp_x, <- Diese Floats(gzp_x etc.) sind für ein Pickup und ein 3DLabel, welche ich mitten im Gebiet erstellen möchte, die den Besitzer des Gebietes angeben. Den Namen des Gebietes (in diesem Fall "Flugzeugfriedhof" sollte auch rein)habe ich aber vergessen...
    Float:gzp_y,
    Float:gzp_z,
    gz_name[MAX_PLAYER_NAME],
    gz_besitzer,
    gz_id,
    gzid_x
    }


    Hier werden unter OnGameModeInit alle Gebiete geladen:


    //GF Gebiete laden
    new gzquery[128];
    format(gzquery,sizeof(gzquery),"SELECT * FROM gz");
    mysql_function_query(dbhandle,gzquery,true,"OnGzLoad","");


    Mein Forward:
    forward OnGzLoad();


    der Public dazu:

    public OnGzLoad()
    {
    new num_fields,num_rows,string[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows;i++)
    {
    new id=getFreeGzID();
    gzInfo[id][min_x] = cache_get_field_content_float(i,"min_x",dbhandle);
    gzInfo[id][min_y] = cache_get_field_content_float(i,"min_y",dbhandle);
    gzInfo[id][max_x] = cache_get_field_content_float(i,"max_x",dbhandle);
    gzInfo[id][max_y] = cache_get_field_content_float(i,"max_y",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i,"gz_name",tmp_name,dbhandle);
    strmid(gzInfo[id][gz_name],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));
    gzInfo[id][gz_besitzer] = cache_get_field_content_int(i,"gz_besitzer",dbhandle);
    gzInfo[id][gz_id] = cache_get_field_content_int(i,"gz_id",dbhandle);
    gzInfo[id][gzid_x] = GangZoneCreate(gzInfo[id][min_x],gzInfo[id][min_y],gzInfo[id][max_x],gzInfo[id][max_y]);
    GangZoneShowForAll(gzInfo[id][gzid_x], fInfo[gzInfo[id][gz_besitzer]][f_gzcolor]);
    CreatePickup(1239,1,gzInfo[id][gzp_x],gzInfo[id][gzp_y],gzInfo[id][gzp_z],0);
    format(string,sizeof(string),"Gangzone der %s\nZum Erobern tippe /gf",fInfo[gzInfo[id][gz_besitzer]][f_name]);
    Create3DTextLabel(string,Ak,gzInfo[id][gzp_x],gzInfo[id][gzp_y],gzInfo[id][gzp_z],15,0,1);
    }
    return 1;
    }



    getFreeGzID()
    {
    for(new i=0; i<sizeof(gzInfo);i++)
    {
    if(gzInfo[i][gz_id]==0) return i;
    }
    return 0;
    }


    Ich habe in der Mysql Datenbank schon ein Gebiet zum Test eingefügt, jedoch wird dieses nicht geladen und ich bekomme in der mysql log Datei folgenden Fehler


    Die Datenbank:



    gz_besitzer steht in dem Fall für die Gang/Mafia, der das Gebiet gehört, in diesem Fall die LCN: (ach ja und ak steht für weiß.)

    //Fraktionen
    new fInfo[][fraktEnum] = {
    {"Zivilist", 1267.6949,1458.4530,10.8130,291.4855,0,0,Ak,Ak},
    {"LVPD", 2281.9646,2424.5161,3.4692,356.6202,0,0,Ak,Ak},
    {"La Cosa Nostra",937.8108,1733.3275,8.8516,271.5520,0,0,Ak,Dunkelblau},
    {"FBI",1039.2556,1013.7105,11.0000,332.4610,0,0,Ak,Ak},
    {"Da Nang Boys",2481.4900,1525.2753,11.7821,318.8811,0,0,Ak,Hellgrau},
    {"Rote Guerilla",1105.7994,-299.8442,74.5391,81.3161,0,0,Ak,Ak},
    {"Fahrschule",2199.4680,2719.3987,10.8203,16.0619,0,0,Ak,Ak},
    {"SAMD",1603.6674,1815.5087,10.8203,351.9129,0,0,Ak,Ak},
    {"Hitman",-932.7607,2026.6654,61.5907,222.0614,0,0,Ak,Ak}
    };


    Quellcode
    Quellcode bearbeiten

    • [21:27:42] [ERROR] CMySQLQuery::Execute[()] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id='1'' at line 1

    Ich weiß, dass ich in letzter Zeit viel störe, jedoch möchte ich ein komplettes Selfmade auf die Beine stellen(bin auch schon gut dabei) und kann es nicht akzeptieren, einfach das, was ich nicht blicke, aus nem fremden GF zu kopieren.. Hoffentlich könnt ihr mir helfen..


    MfG :/

  • der error in der mysql log sagt, dass du ein fehler im query hast bei where id, dass müsste ein anderes querys sein. nebenbei hast du dein code gedebugt mit print befehlen? eventuell wird kein eintrag geladen dann überprüfe den tabellennamen in deinem query, dass du gepostet hast.

  • Dein System sieht relativ gleich zu meinem aus

    public OnGFLoad(id)
    {
    new rows, fields,tmp[128];
    cache_get_data(rows, fields);
    GFInfo[id][xMin] = cache_get_row_float(0,0);
    GFInfo[id][xMax] = cache_get_row_float(0,2);
    GFInfo[id][yMax] = cache_get_row_float(0,3);
    GFInfo[id][yMin] = cache_get_row_float(0,1);
    GFInfo[id][ctfX] = cache_get_row_float(0,4);
    GFInfo[id][ctfY] = cache_get_row_float(0,5);
    GFInfo[id][ctfZ] = cache_get_row_float(0,6);
    GFInfo[id][OwnerID] = cache_get_row_int(0,7);
    GFInfo[id][Time] = cache_get_row_int(0,8);
    GFInfo[id][GfCooldown] = cache_get_row_int(0,9);
    GFInfo[id][KillsOwner] = cache_get_row_int(0,10);
    GFInfo[id][KillsAttacker] = cache_get_row_int(0,11);
    GFInfo[id][Attacker] = cache_get_row_int(0,12);
    GFInfo[id][gActive] = cache_get_row_int(0,15);
    GFInfo[id][gID] = cache_get_row_int(0,13);
    cache_get_row(0,14, tmp);format(GFInfo[id][Name], 128, "%s", tmp);
    new string2[128];
    //printf("%d | %s(%d)",id,GetFactionName(GFInfo[id][OwnerID]),GFInfo[id][OwnerID]);
    //printf("%d\n - %f - %f - %f - %f - OnGFLoad(%d)\nBesitzer: %s\nFarbe:%s\n%f - %f - %f ",GFInfo[id][gID],GFInfo[id][xMin],GFInfo[id][xMax],GFInfo[id][yMax],GFInfo[id][yMin],id,string,gz,GFInfo[id][ctfX],GFInfo[id][ctfY],GFInfo[id][ctfZ]);
    GFInfo[id][gID] = GangZoneCreate(GFInfo[id][xMin],GFInfo[id][yMin],GFInfo[id][xMax],GFInfo[id][yMax]);
    GFInfo[id][gPick] = CreatePickup(1314,1,GFInfo[id][ctfX],GFInfo[id][ctfY],GFInfo[id][ctfZ],0);
    format(string2,sizeof(string2),"Gangfight:\nOwner:%s\nBenutze '/ctf' zum einnehmen!",GetFactionName(GFInfo[id][OwnerID]));
    //printf("%s",string2);
    GFInfo[id][Owner] = Create3DTextLabel(string2,0x008080FF,GFInfo[id][ctfX],GFInfo[id][ctfY],GFInfo[id][ctfZ],10.0,0);
    //GFInfo[id][GZ] = GangZoneCreate(119.084594, -214.033096, 343.084594, -62.033096);
    return 1;
    }


    Das einzige Problem kann ich mir mit getfreegzid erklären

  • Mahlzeit

    eventuell wird kein eintrag geladen dann überprüfe den tabellennamen in deinem query, dass du gepostet hast.

    Also der Tabellenname stimmt überein.



    public OnGzLoad()
    {
    new num_fields,num_rows,string[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows;i++)
    {
    gzInfo[i][min_x] = cache_get_field_content_float(i,"min_x",dbhandle);
    gzInfo[i][min_y] = cache_get_field_content_float(i,"min_y",dbhandle);
    gzInfo[i][max_x] = cache_get_field_content_float(i,"max_x",dbhandle);
    gzInfo[i][max_y] = cache_get_field_content_float(i,"max_y",dbhandle);
    gzInfo[i][gzp_x] = cache_get_field_content_float(i,"gzp_x",dbhandle);
    gzInfo[i][gzp_y] = cache_get_field_content_float(i,"gzp_y",dbhandle);
    gzInfo[i][gzp_z] = cache_get_field_content_float(i,"gzp_z",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i,"gz_name",tmp_name,dbhandle);
    strmid(gzInfo[i][gz_name],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));
    gzInfo[i][gz_besitzer] = cache_get_field_content_int(i,"gz_besitzer",dbhandle);
    gzInfo[i][gz_id] = cache_get_field_content_int(i,"gz_id",dbhandle);
    new gz=GangZoneCreate(gzInfo[i][min_x],gzInfo[i][min_y],gzInfo[i][max_x],gzInfo[i][max_y]);
    GangZoneShowForAll(gz, fInfo[gzInfo[i][gz_besitzer]][f_gzcolor]);
    CreatePickup(1239,1,gzInfo[i][gzp_x],gzInfo[i][gzp_y],gzInfo[i][gzp_z],0);
    format(string,sizeof(string),"Gangzone der %s\nZum Erobern tippe /gf",fInfo[gzInfo[i][gz_besitzer]][f_name]);
    Create3DTextLabel(string,Ak,gzInfo[i][gzp_x],gzInfo[i][gzp_y],gzInfo[i][gzp_z],15,0,1);
    }
    return 1;
    }


    Habe es jetzt mal so geschrieben, bringt leider nichts... Bekomme immer noch denselben MySQL Fehler :(
    Trotzdem Danke schonmal


    MFG

  • Aktuell Code: Siehe meinen ersten Beitrag.


    Das erste Problem was mir aufgefallen ist:
    Du lädst gzp_x, gzp_y und gzp_z nicht aus der Datenbank. Somit können Pickup und 3DLabel nicht an der richtigen Stelle erstellt werden.



    Das zweite Problem, vermutlich:
    Du zeigst die Gang Zone dort mit GangZoneShowForAll an. Das bewirkt, dass beim Laden aus der Datenbank die GangZone für alle Spieler angezeigt wird.
    Zu dem Zeitpunkt dürfte aber noch kein Spieler auf dem Server sein, somit sieht diese auch niemand. Erstellt werden sollte sie eigentlich.


    Du musst daher noch bei OnPlayerConnect bzw. OnPlayerSpawn/OnPlayerRequestClass/OnPlayerRequestSpawn (je nach dem wo du willst) eine Schleife einbauen, die dem Spieler alle erstellten GangZones anzeigt.
    https://wiki.sa-mp.com/wiki/GangZoneShowForPlayer



    Noch als zusätzlicher Tipp:
    Bei getFreeGzID solltest du am Ende anstatt 0 z.B. -1 zurück geben und dies bei der Nutzung auch abfragen, ob "id" -1 ist, wenn ja, eine Fehlermeldung ausgeben.
    Sonst kann es passieren, wenn alle IDs voll sind, dass immer die ID 0 überschrieben wird.