Drogen - nicht in der Nähe

  • Hey,


    Hab ein Problem mit meinem Drogensystem undzwar manchmal kann ich die Pflanze ernten aber manchmal steht dort du bist nicht in der Nähe?!?


    if(strcmp(Option, "Harvest", true) == 0)
    {
    if(Spieler[playerid][pGepflanzt] == 0)return SendClientMessage(playerid, COLOR_GREY, "Du hast keine Pflanze angepflanzt.");
    for(new i=1;i<MAX_PFLANZEN;i++)
    {
    if(Drogen[i][dErstellt] != 0)
    {
    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false))
    {
    if(!IsPlayerInRangeOfPoint(playerid, 5.0, Drogen[i][dPflanzeX], Drogen[i][dPflanzeY], Drogen[i][dPflanzeZ]))
    {
    SetPlayerCheckpointEx(playerid, Drogen[i][dPflanzeX], Drogen[i][dPflanzeY], Drogen[i][dPflanzeZ], 3.0, CP_DROGEN, INVALID_CHECKPOINT_TYPE);
    return SendClientMessage(playerid, COLOR_GREY, "Du bist nicht an deiner Pflanze.");
    }
    if(gettime() < Drogen[i][dPflanzenTimer])return SendClientMessage(playerid, COLOR_GREY, "Die Pflanze ist noch nicht reif!");
    new marihuana = randomex(1, 6), query[128];
    format(string, sizeof(string), "Du hast deine Pflanze geerntet und %d Gramm Marihuana erhalten.", marihuana);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    Spieler[playerid][pGepflanzt] = 0;
    Spieler[playerid][pMarihuana] += marihuana;
    format(query, sizeof(query), "DELETE FROM `script_drogen` WHERE `id`='%d'", Drogen[i][dID]);
    mysql_function_query(myCon, query, false, "", "");
    mysql_free_result();
    DestroyDynamicObject(Drogen[i][dPflanzeObject]);
    DestroyDynamic3DTextLabel(Drogen[i][dPflanzeText]);
    Drogen[i][dPflanzeText] = Text3D:INVALID_3DTEXT_ID;
    return 1;
    }
    }
    }
    }
    return 1;
    }


    Woran kann das liegen?
    Bitte um Hilfe.
    @Jeffry

  • Wird dir der Checkpoint dann trotzdem an der korrekten Position angezeigt?
    Wenn ja:


    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false))
    zu:
    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false) && strlen(Drogen[i][dBesitzer]))

    sigsmall_winter.png

  • Wird dir der Checkpoint dann trotzdem an der korrekten Position angezeigt?
    Wenn ja:


    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false))
    zu:
    if(!strcmp(GetName(playerid), Drogen[i][dBesitzer], false) && strlen(Drogen[i][dBesitzer]))

    Nein, beim ersten mal funktioniert alles richtig Checkpoint wird bei /seed harvest angezeigt aber wenn ich dann nochmal neu Anpflanze und wieder /seed harvest eingebe ist der Checkpoint immer noch an der ersten Stelle und dort muss ich meine Drogen dann auch ernten

  • Am Schluss setzt du nur "Drogen[ i ][dPflanzeText]" zurück.


    Das musst du aber auch noch für alle anderen variablen machen


    PAWN
    1. Drogen[i][dID] = 0;
    2. Drogen[i][dErstellt] = 0;
    3. Drogen[i][dBesitzer] = "";
    4. Drogen[i][dPflanzeObject] = 0;
    5. Drogen[i][dPflanzeX] = 0.0;
    6. Drogen[i][dPflanzeY] = 0.0;
    7. Drogen[i][dPflanzeZ] = 0.0;
    8. Drogen[i][dPflanzeText] = Text3D:INVALID_3DTEXT_ID;
  • Am Schluss setzt du nur "Drogen[ i ][dPflanzeText]" zurück.


    Das musst du aber auch noch für alle anderen variablen machen


    PAWN
    1. Drogen[i][dID] = 0;
    2. Drogen[i][dErstellt] = 0;
    3. Drogen[i][dBesitzer] = "";
    4. Drogen[i][dPflanzeObject] = 0;
    5. Drogen[i][dPflanzeX] = 0.0;
    6. Drogen[i][dPflanzeY] = 0.0;
    7. Drogen[i][dPflanzeZ] = 0.0;
    8. Drogen[i][dPflanzeText] = Text3D:INVALID_3DTEXT_ID;

    error 047: array sizes do not match, or destination array is too small



    Fehler hier:


    Drogen[i][dBesitzer] = "";

  • Ersetz das mit


    strdel(Drogen[i][dErstellt], 0, sizeof(Drogen[i][dErstellt]));

    error 001: expected token: "]", but found "-identifier-"
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"
    error 029: invalid expression, assumed zero
    fatal error 107: too many error messages on one line
    Jetzt kommt das.


  • Du kannst aus Enums keine Arraygrößen in diese Funktionen ziehen.
    Intern kannst du dir merken, dass du Spielernamen auf die Zeichenlänge des definierten Wertes MAX_PLAYER_NAME setzt.
    Dann würde die Funktion entsprechend so lauten: strdel(Drogen[i][dErstellt], 0, MAX_PLAYER_NAME ));


    Beachte dann, dass du "dErstellt" auch änderst:

    Code
    1. enum [...] {
    2. ...,
    3. dErstellt[MAX_PLAYER_NAME],
    4. ...
    5. }
  • Beitrag von Zim30 ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Du kannst es auch einfach so machen, dann spielt die Länge keine Rolle:
    Drogen[i][dBesitzer][0] = '\0';

    [14:22:58] [debug] AMX backtrace:
    [14:22:58] [debug] #0 002bb240 in TimestampToDate (Timestamp=2696, &year=@02ea4158 2016, &month=@02ea4154 12, &day=@02ea4150 28, &hour=@02ea414c 14, &minutex=@02ea4148 44, &second=@02ea4144 56, HourGMT=1, MinuteGMT=0) at C:\Users\bori\Desktop\samp037_svr_R2-1-1_win32\gamemodes\selfmadee.pwn:39098
    [14:22:58] [debug] #1 0018dcd8 in public LoadDrogen () at C:\Users\bori\Desktop\samp037_svr_R2-1-1_win32\gamemodes\selfmadee.pwn:26814
    [14:23:04] [connection] 91.21.149.234:58496 reque
    Wenn ich mich Ingame das erste mal einlogge kriege ich sofort ein Crash und das steht denne in der Log hier die entsprechenden Zeilen:
    format(string,sizeof(string)," ",Drogen[DrogenID][dBesitzer], pDay, pMonth, pYear, pHour, pMinute, pSecond);


    if(day > MonthTimes[month][IsLeapYear(year)])
    {
    day = 1;
    month ++;
    }


    Hier der ganze Stock von TimestampToDate & public LoadDrogen


    public LoadDrogen()
    {
    new rows, fields, count,string[256];
    cache_get_data(rows, fields);
    for(new i=0;i<rows;i++)
    {
    new DrogenID = cache_get_field_content_int(i, "id");
    if(DrogenID < MAX_PFLANZEN)
    {
    Drogen[DrogenID][dErstellt] = 1;
    Drogen[DrogenID][dID] = DrogenID;
    cache_get_field_content(i, "Besitzer", Drogen[DrogenID][dBesitzer], myCon, 32);
    Drogen[DrogenID][dPflanzeX] = cache_get_field_content_float(i, "PflanzeX");
    Drogen[DrogenID][dPflanzeY] = cache_get_field_content_float(i, "PflanzeY");
    Drogen[DrogenID][dPflanzeZ] = cache_get_field_content_float(i, "PflanzeZ");
    Drogen[DrogenID][dPflanzenTimer] = cache_get_field_content_int(i, "Timer");
    new pYear, pMonth, pDay, pHour, pMinute, pSecond;
    TimestampToDate(Drogen[DrogenID][dPflanzenTimer], pYear, pMonth, pDay, pHour, pMinute, pSecond, 1, 0);
    format(string,sizeof(string)," ",Drogen[DrogenID][dBesitzer], pDay, pMonth, pYear, pHour, pMinute, pSecond);
    Drogen[DrogenID][dPflanzeText] = CreateDynamic3DTextLabel(string,COLOR_WHITE,Drogen[DrogenID][dPflanzeX],Drogen[DrogenID][dPflanzeY],Drogen[DrogenID][dPflanzeZ],10.0);
    Drogen[DrogenID][dPflanzeObject] = CreateDynamicObject(19473, Drogen[DrogenID][dPflanzeX],Drogen[DrogenID][dPflanzeY],Drogen[DrogenID][dPflanzeZ]-1.0, 0, 0, 0, 0);
    count++;
    }
    }
    printf("[LOAD] Drogenpflanzen geladen: %d/%d", count, MAX_PFLANZEN);
    return 1;
    }


    stock TimestampToDate(Timestamp, &year, &month, &day, &hour, &minutex, &second, HourGMT, MinuteGMT = 0)
    {
    new tmp = 2;
    year = 1970;
    month = 1;
    Timestamp -= 172800;
    for(;;)
    {
    if(Timestamp >= 31536000)
    {
    year ++;
    Timestamp -= 31536000;
    tmp ++;
    if(tmp == 4)
    {
    if(Timestamp >= 31622400)
    {
    tmp = 0;
    year ++;
    Timestamp -= 31622400;
    }
    else break;
    }
    }
    else break;
    }
    for(new i = 0; i < 12; i ++)
    {
    if(Timestamp >= MonthTimes[i][2 + IsLeapYear(year)])
    {
    month ++;
    Timestamp -= MonthTimes[i][2 + IsLeapYear(year)];
    }
    else break;
    }
    day = 1 + (Timestamp / 86400);
    Timestamp %= 86400;
    hour = HourGMT + (Timestamp / 3600);
    Timestamp %= 3600;
    minutex = MinuteGMT + (Timestamp / 60);
    second = (Timestamp % 60);
    if(minutex > 59)
    {
    minutex = 0;
    hour ++;
    }
    if(hour > 23)
    {
    hour -= 24;
    day ++;
    }
    if(day > MonthTimes[month][IsLeapYear(year)])
    {
    day = 1;
    month ++;
    }
    if(month > 12)
    {
    month = 1;
    year ++;
    }
    return 1;
    }


    Könnte mir einer behiflich sein dabei?

  • Du musst bei Format auch immer ein gültiges Format angeben.


    format(string,sizeof(string)," ",Drogen[DrogenID][dBesitzer], pDay, pMonth, pYear, pHour, pMinute, pSecond);


    format(string,sizeof(string),"%s%i%i%i%i%i%i",Drogen[DrogenID][dBesitzer], pDay, pMonth, pYear, pHour, pMinute, pSecond);

    Einmal editiert, zuletzt von Zim30 ()

  • Nun geht das aber jedesmal wenn ich was anderes fixxe kommt schon wieder der nächste Fehler in der Log obwohl das vorher noch nie probleme gemacht hat ... Erstmal die MySQL Log:
    CMySQLResult::GetRowDataByName() - invalid row index ('0')
    Da steht das..
    Hier im Script der nächste Fehler:
    stock UpdatePlayerTacho(playerid)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new string[128],
    vehicleid,
    model,
    Float:CarHealth,
    CarHealthIni,
    Float:Tank,
    zone[36];
    vehicleid = GetPlayerVehicleID(playerid);
    model = GetVehicleModel(vehicleid);
    //GetVehiclePos(vehicleid, Vehicle[vehicleid][vehPosX2], Vehicle[vehicleid][vehPosY2], Vehicle[vehicleid][vehPosZ2]);
    if(IsAFahrrad(model))return 1;
    Tank = Vehicle[vehicleid][vehFuel];
    GetVehicleHealth(vehicleid, CarHealth);
    CarHealthIni = floatround((CarHealth - 250.0) / 7.5, floatround_floor);
    if(CarHealthIni < 0) CarHealthIni = 0;
    format(string, sizeof(string), "~g~%s", VehicleName[GetVehicleModel(vehicleid)-400]);
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][2], string);
    if(IsVehicleATruck(vehicleid) || IsVehicleAPilot(vehicleid) || IsVehicleABus(vehicleid) || IsVehicleABoat(vehicleid))
    {
    format(string, sizeof(string), "~g~Tank: ~w~-");
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][3], string);
    }
    else
    {
    format(string, sizeof(string), "~g~Tank: ~w~%.1f/%.0f ~g~L",Tank, VehicleData[GetVehicleModel(vehicleid)-400][vehMaxTank]);
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][3], string);
    }
    format(string, sizeof(string), "~g~Zustand: ~w~%d~g~%", CarHealthIni);
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][4], string); //HIER IST DER FEHLER..
    format(string, sizeof(string), "%d km/h", GetVehicleSpeed(vehicleid));
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][5], string);
    format(string, sizeof(string), "~g~KM-Stand:~w~ %.1f", Vehicle[vehicleid][vehKMStand]);
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][6], string);
    if(Tank <= 5.0)
    {
    PlayerPlaySound(playerid,1085,0.0,0.0,0.0);
    }
    if(GetPlayerCheckpointType(playerid) == CP_TYPE_BUS)
    {
    format(string, sizeof(string), "~g~%s", GetBusLinie(Spieler[playerid][pBusLinie]));
    PlayerTextDrawSetString(playerid, pTextJob[playerid][2], string);
    format(string, sizeof(string), "~g~Naechste Haltestelle:~w~ %s", GetNextDestination(playerid));
    PlayerTextDrawSetString(playerid, pTextJob[playerid][3], string);
    GetPlayer2DZone(playerid, zone, 36);
    format(string, sizeof(string), "~g~GPS: ~w~%s", zone);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][4], string);
    format(string, sizeof(string), "~g~Entfernung:~w~ %0.1f m", GetPlayerNextDistance(playerid));
    PlayerTextDrawSetString(playerid, pTextJob[playerid][5], string);
    }
    else if(GetPlayerCheckpointType(playerid) == CP_TYPE_TRUCK)
    {
    new xIDx = Spieler[playerid][pTruckItem];
    format(string, sizeof(string), "~g~%s", TRC[xIDx][trName]);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][2], string);
    format(string, sizeof(string), "~g~Naechstes Ziel:~w~ %s", Spieler[playerid][pPilotDestination]);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][3], string);
    GetPlayer2DZone(playerid, zone, 36);
    format(string, sizeof(string), "~g~GPS: ~w~%s", zone);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][4], string);
    format(string, sizeof(string), "~g~Entfernung:~w~ %0.1f m", GetPlayerDistanceFromPoint(playerid, Spieler[playerid][pCheckpointX], Spieler[playerid][pCheckpointY], Spieler[playerid][pCheckpointZ]));
    PlayerTextDrawSetString(playerid, pTextJob[playerid][5], string);
    }
    else if(GetPlayerCheckpointType(playerid) == CP_TYPE_PILOT)
    {
    new xIDx = Spieler[playerid][pPilotItem];
    format(string, sizeof(string), "~g~%s", PLT[xIDx][plName]);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][2], string);
    format(string, sizeof(string), "~g~Naechstes Ziel: ~w~%s", Spieler[playerid][pPilotDestination]);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][3], string);
    GetPlayer2DZone(playerid, zone, 36);
    format(string, sizeof(string), "~g~GPS: ~w~%s", zone);
    PlayerTextDrawSetString(playerid, pTextJob[playerid][4], string);
    format(string, sizeof(string), "~g~Entfernung:~w~ %0.1f m", GetPlayerNextPilotD(playerid));
    PlayerTextDrawSetString(playerid, pTextJob[playerid][5], string);
    }
    else
    {
    HideJobForPlayer(playerid);
    }
    }
    return 1;
    }
    Fehler ist mit nem Kommentar gekennzeichnet.


    Das steht auch noch in der Log:
    sscanf warning: String buffer overflow.


    Hoffe du hilfst nochmal bei den ganzen Fehlern.
    Oder ein anderer wäre sehr dankbar.


    @Jeffry

    Einmal editiert, zuletzt von RastaZopf. ()

  • Hier wird kein Cache ausgelesen?


    Da ist ein String, der in sscanf verwendet wird, zu klein.Sprich es wird zum Beispiel versucht in ein string[5] sowas wie "Guten Tag" zu schreiben. Das sind ja mehr als 5 Zeichen.

    Das mit dem String sollte jetzt gehen.
    PlayerTextDrawSetString(playerid, pTextSpeedo[playerid][4], string); //HIER IST DER FEHLER.. Das hier verstehe ich leider nicht...