Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: hendrixx poslato Decembar 25, 2024, 15:16:00 POSLE PODNE

Naslov: Attempted to read/write array element at negative index -1
Poruka od: hendrixx poslato Decembar 25, 2024, 15:16:00 POSLE PODNE
Naslov problema*: Attempted to read/write array element at negative index -1
Opis problema*: Kad god igrac proda/kupuje imovinu debug izbacuje "Attempted to read/write array element at negative index -1", takodje kad se jednom proda imovina igracu, ne moze vise da se proda drzavi, izbacuje if(GlobalImovinaIgracu[playerid]) return SendErrorMessage(playerid, "Ne mozes prodati firmu dok je u procesu prodaja igracu!");Pokušaj rešavanja*: Pokusao sam da nadjem po samp forumima i drugim forumima kako da resim ali mi nije bas najjasnije jer je uvek nesto drugo u pitanju
Deo programskog koda*:

else if(dialogid == dialog_PROPSELLDRZAVA )
{
    if( response )
{
        if( PlayerInfo[ playerid ][ xBRacun ] < 0 ) return SendErrorMessage( playerid, "Ne mozes da prodas imovinu dok ne izadjes iz minusa u banci." );
        new id = ChosenProperty[ playerid ];
if( GetNearestProperty( playerid ) != id ) return SendErrorMessage( playerid, "Niste pored svoje imovine!" );
if( strcmp( ImeIgraca( playerid ), II[ GetNearestProperty( playerid ) ][ iOwner ], true) == 0 )
{
WriteLog("log-sell", "Igrac %s je prodao imovinu ID %d na buy", ImeIgraca( playerid ), id);

        strmid( II[ GetNearestProperty( playerid ) ][ iOwner ], "Drzava", 0, strlen( "Drzava" ), 32);

    DajIgracuNovac( playerid, (II[ GetNearestProperty( playerid ) ][ iPrice ]/2) );
                II[ GetNearestProperty( playerid ) ][ iNeaktivnost ] = 0;
II[ GetNearestProperty( playerid ) ][ iOwned ] = 0;
II[ GetNearestProperty( playerid ) ][ iOnAuction ] = false;
  II[ GetNearestProperty(playerid) ][ iOwnerSQLID ] = -1;
PlayerPlaySound( playerid, 1058, 0, 0, 0 );
PropertyRefresh( GetNearestProperty( playerid ) );
SaveProperty( GetNearestProperty( playerid ) );

if( PlayerInfo[ playerid ][ xProperty ][ 0 ] == id )
{
        PlayerInfo[ playerid ][ xProperty ][ 0 ] = -1;
        PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] = 0;
sql_user_update_integer( playerid, "property_id_1", PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] );
}
    else if( PlayerInfo[ playerid ][ xProperty ][ 1 ] == id )
{
PlayerInfo[ playerid ][ xProperty ][ 1 ] = -1;
PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] = 0;
sql_user_update_integer( playerid, "property_id_2", PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] );
}
    else if( PlayerInfo[ playerid ][ xProperty ][ 2 ] == id )
{
PlayerInfo[ playerid ][ xProperty ][ 2 ] = -1;
PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] = 0;
sql_user_update_integer( playerid, "property_id_3", PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] );
}
}
else SendErrorMessage( playerid, "Ovo nije vase." );
    }
    if( !response )
{
        SendClientMessage( playerid, CRVENA, "(IMOVINA): Odustali ste od prodaje imovine drzavi." );
    }
}
else if(dialogid == dialog_PROPSELLTP )
{
    if( !response ) return 1;
    if( response )
{
        if( PlayerInfo[ playerid ][ xBRacun ] < 0 ) return SendErrorMessage( playerid, "Ne mozes da prodas imovinu dok ne izadjes iz minusa u banci." );
        new id = ChosenProperty[ playerid ], idigraca, cena, string[ 128 ], Float:Pos[ 3 ];
        if( sscanf( inputtext, "ui", idigraca, cena ) ) return ShowPlayerDialog( playerid, dialog_PROPSELLTP, DIALOG_STYLE_INPUT, D_NASLOV, "{FFFFFF}* U prazni prostor ispod unesite ID igraca i cenu imovina:", "Ponudi", "Odustani" );
            GetPlayerPos( idigraca, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ] );
if( !IsPlayerInRangeOfPoint( playerid, 3.0, Pos[ 0 ], Pos[ 1 ], Pos[ 2 ] ) ) return SendErrorMessage( playerid, "Igrac nije blizu vas");
if( cena < 1 ) return SendErrorMessage( playerid, "Cena ne moze biti manja od 1$!");
            if( idigraca == IPI ) return SendErrorMessage( playerid, "Pogresan ID." );
if( idigraca == playerid ) return SendErrorMessage( playerid, "Ne mozes sam sebi prodati kucu!");
if( PlayerInfo[ idigraca ][ xProperty ][ 0 ] != -1 && PlayerInfo[ idigraca ][ xProperty ][ 1 ] != -1 && PlayerInfo[ idigraca ][ xProperty ][ 2 ] != -1 ) return SendErrorMessage( playerid, "Igrac vec ima 3 imovine!");
            if( PlayerInfo[ idigraca ][ xLevel ] < II[ id ][ iLevel ] ) return SCMF( playerid, CRVENA, "(IMOVINA): Da bi ste tom igracu prodali ovu imovinu, on mora biti level {FFFFFF}(%d+).", II[ id ][ iLevel ] );
            SCMF( playerid, 0x33CCFFFF, "(IMOVINA): Ponudili ste igracu {FFFFFF}%s {33CCFF}imovinu po ceni od {FFFFFF}($%d).", ImeIgraca( idigraca ), cena );
GlobalProdaja[ idigraca ] = playerid;
GlobalCena[ idigraca ] = cena;
GlobalID[ idigraca ] = id;
GlobalImovinaIgracu[playerid] = true;
format( string, sizeof( string ), "{FFFFFF}* Igrac %s vam je ponudio da kupite njegovu imovinu za $%d.", ImeIgraca( playerid ), cena );
ShowPlayerDialog( idigraca, dialog_ACCEPTPROP, DIALOG_STYLE_MSGBOX, D_NASLOV, string, "Prihvati", "Odbij" );
    }
}
else if(dialogid == dialog_ACCEPTPROP)
{
    if( response )
{
        new id = GlobalID[ playerid ];
        if( PlayerInfo[ playerid ][ xNovac ] < GlobalCena[ playerid ] ) return SendErrorMessage( playerid, "Nemate dovoljno novca.");

if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 0 ] == id )
{
PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 0 ] = -1;
PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 0 ] = 0;
}
else if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 1 ] == id )
{
PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 1 ] = -1;
PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 1 ] = 0;
}
else if( PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 2 ] == id )
{
PlayerInfo[ GlobalProdaja[ playerid ] ][ xProperty ][ 2 ] = -1;
PlayerInfo[ GlobalProdaja[ playerid ] ][ xPropertySqlID ][ 2 ] = 0;
}

if( PlayerInfo[ playerid ][ xProperty ][ 0 ] == -1 )
{
PlayerInfo[ playerid ][ xProperty ][ 0 ] = id;
PlayerInfo[ playerid ][ xPropertySqlID ][ 0 ] = II[id][iSQLID];
}
    else if( PlayerInfo[ playerid ][ xProperty ][ 1 ] == -1 )
    {
    PlayerInfo[ playerid ][ xProperty ][ 1 ] = id;
PlayerInfo[ playerid ][ xPropertySqlID ][ 1 ] = II[id][iSQLID];
    }
    else if( PlayerInfo[ playerid ][ xProperty ][ 2 ] == -1 )
    {
    PlayerInfo[ playerid ][ xProperty ][ 2 ] = id;
PlayerInfo[ playerid ][ xPropertySqlID ][ 2 ] = II[id][iSQLID];
    }

WriteLog("log-sell", "Igrac %s je prodao imovinu ID %d igracu %s za %d", ImeIgraca( GlobalProdaja[ playerid ] ), id, ImeIgraca( playerid ), GlobalCena[ playerid ]);
            SCMF( playerid, 0x33CCFFFF, "(IMOVINA): Uspesno ste kupili imovinu od igraca {FFFFFF}%s {33CCFF}za {FFFFFF}($%d).", ImeIgraca( GlobalProdaja[ playerid ] ), GlobalCena[ playerid ] );

strmid( II[ id ][ iOwner ], ImeIgraca( playerid ), 0, strlen( ImeIgraca( playerid ) ), 255);
  II[ id ][ iOwnerSQLID ] = PlayerInfo[playerid][xID];
SaveProperty( id );
PropertyRefresh( id );

sql_user_update_property( playerid );
sql_user_update_property( GlobalProdaja[ playerid ] );

SCMF( GlobalProdaja[ playerid ], ZUTA, "(IMOVINA): Prodali ste kucu igracu {FFFFFF}%s {33CCFF}za {FFFFFF}($%d).", ImeIgraca( playerid ), GlobalCena[ playerid ] );
SendClientMessage( playerid, ZUTA, "(IMOVINA): Kupili ste kucu." );

DajIgracuNovac( GlobalProdaja[ playerid ], GlobalCena[ playerid ] );
DajIgracuNovac( playerid, -GlobalCena[ playerid ] );

GlobalProdaja[ playerid ] = -1;
GlobalCena[ playerid ] = -1;
GlobalID[ playerid ] = -1;
GlobalImovinaIgracu[GlobalProdaja[playerid]] = false;
GlobalImovinaIgracu[playerid] = false;
    }
    else if( !response )
{
SCMF( GlobalProdaja[ playerid ], ZUTA, "(IMOVINA): Igrac {FFFFFF}%s {DABB3E}je odbio vasu ponudu za kupovinu imovine.", ImeIgraca( playerid ) );
SendClientMessage( playerid, ZUTA, "(IMOVINA): Odbili ste ponudu.");

GlobalProdaja[ playerid ] = -1;
GlobalCena[ playerid ] = -1;
GlobalID[ playerid ] = -1;
    }
}





else if(dialogid == dialog_ACCEPTVEH )
{
    if( response )
{
            new seller = GlobalProdaja[ playerid ],
autoid = GlobalID[ playerid ];

if( seller == IPI  ) return SendErrorMessage( playerid, "Taj igrac je offline.");
if( carspawntimer == 1 ) return SCMF( playerid, ANTICHEAT, "(ANTICHEAT): Neko je spawnao/parkirao vozilo pre vas. Pokusajte za 3 sekunde. (Anticrash)");

            new slot = -1;
for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
if( player_veh[ seller ][ vehicle_id ][ j ] != -1 && player_veh[ seller ][ vehicle_id ][ j ] == autoid  )
{
  slot = j;
break;
}
}
if( slot == -1 ) return SendErrorMessage( playerid, "To vozilo nije u vlasnistvu igraca koji vam ga je ponudio!");

if( !IsPlayerNearPlayer( 5.0, playerid, seller ) ) return SendErrorMessage( playerid, "Niste blizu igraca koji vam zeli prodati vozilo.");
if( PlayerInfo[ playerid ][ xNovac ] < GlobalCena[ playerid ] ) return SendErrorMessage( playerid, "Nemate dovoljno novca da kupite vozilo.");
if( !IsPlayerConnected( seller ) )
{
SendErrorMessage( playerid, "Taj igrac je offline.");
GlobalProdaja[ playerid ] = -1;
GlobalCena[ playerid ] = -1;
GlobalID[ playerid ] = -1;
return 1;
}

            slot = -1;
    for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] == -1 )
{
  slot = j;
break;
}
}
if( slot == -1 ) return SendErrorMessage( playerid, "Svi slotovi vozila su vam zauzeti." );

strmid( VehicleInfo[ autoid ][ vOwner ], ImeIgraca( playerid ), 0, strlen( ImeIgraca( playerid ) ), 24);
VehicleInfo[ autoid ][ vOwner_sqlID  ] = PlayerInfo[ playerid ][ xID ];
VehicleInfo[ autoid ][ v_owner_id ] = playerid;

new q[ 128 ];
mysql_format( mSQL, q, sizeof(q), "UPDATE `vehicles` SET `owner_sqlID` = '%d' WHERE `veh_id` = '%d' LIMIT 1",
VehicleInfo[ autoid ][ vOwner_sqlID ],
VehicleInfo[ autoid ][ vSqlID ] );

mysql_tquery( mSQL, q );

            for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
                if( player_veh[ seller ][ vehicle_id ][ j ] == autoid )
{
player_veh[ seller ][ vehicle_id ][ j ] = -1;
break;
}
            }

            for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
                if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] == -1 )
{
player_veh[ playerid ][ vehicle_id ][ j ] = autoid;
break;
}
            }

WriteLog("log-sell", "Igrac %s je prodao vozilo %s igracu %s za %d", ImeIgraca( seller ), GetVehicleNameEx( VehicleInfo[ autoid ][ vModel ] ), ImeIgraca( playerid ), GlobalCena[ playerid ]);

DajIgracuNovac( seller, GlobalCena[ playerid ] );
RemovePlayerFromVehicle( seller );

DajIgracuNovac( playerid, -GlobalCena[ playerid ] );
SendClientMessage( playerid, ZUTA, "(Vozilo): Uspesno ste kupili vozilo." );
SendClientMessage( seller, ZUTA, "(Vozilo): Uspesno ste prodali vozilo." );

        carspawntimer = 1;
SetTimer_("AntiSpawnCrash", 3000, 3000, 1);

GlobalProdaja[ playerid ] = -1;
GlobalCena[ playerid ] = -1;
GlobalID[ playerid ] = -1;
GlobalImovinaIgracu[GlobalProdaja[playerid]] = false;
GlobalImovinaIgracu[GlobalProdaja[seller]] = false;
    }
    else if( !response )
{
SCMF( GlobalProdaja[ playerid ], ZUTA, "(Vozilo): Igrac {FFFFFF}%s {DABB3E}je odbio vasu ponudu za kupovinu vozla.", ImeIgraca( playerid ) );
SendClientMessage( playerid, ZUTA, "(Vozilo): Odbili ste ponudu.");
GlobalProdaja[ playerid ] = -1;
GlobalCena[ playerid ] = -1;
GlobalID[ playerid ] = -1;
    }
}
else if(dialogid == dialog_VEHSELLDRZAVI )
{
    if( !response ) return 1;
if( response )
{
  new vehicleid = ChosenVehicle[ playerid ];
      if( !IsPlayerInVehicle( playerid, vehicleid ) ) return SendErrorMessage( playerid, "Morate biti u svom vozilu!");

WriteLog("log-sell", "Igrac %s je prodao vozilo %s na aukciju", ImeIgraca( playerid ), GetVehicleNameEx( VehicleInfo[ vehicleid ][ vModel ] ));

DajIgracuNovac( playerid, VehicleInfo[ vehicleid ][ vPrice ]/2 );
SCMF( playerid, ZUTA, "(Vozilo): Dobili ste {FFFFFF}($%d) {DABB3E}za ovo vozilo.", VehicleInfo[ vehicleid ][ vPrice ]/2 );

for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
if( player_veh[ playerid ][ vehicle_id ][ j ] == vehicleid )
{
  player_veh[ playerid ][ vehicle_id ][ j ] = -1;
break;
}
}

sql_vehicles_delete( vehicleid );
ResetVehicle( vehicleid );
SMG_DestroyVehicle( vehicleid );
SendClientMessage( playerid, ZUTA, "(Vozilo): Vase vozilo je uspesno prodano otpadu.");
}
}
else if(dialogid == dialog_VEHSELLTP )
{
    if( !response ) return 1;
if( response )
{
        new idigraca, string[ 128 ],
cena,
autoid = ChosenVehicle[ playerid ];

if( sscanf( inputtext, "ui", idigraca, cena ) ) return ShowPlayerDialog( playerid, dialog_VEHSELLTP, DIALOG_STYLE_INPUT, D_NASLOV, "{FFFFFF}* Unesite id igraca kome zelite da prodate vozilo i cenu.\nPrimer: 145 12003", "Potvrdi", "Odustani" );
if( !IsPlayerConnected( idigraca ) || idigraca == IPI ) return SendErrorMessage( playerid, "Nevaljan ID igraca.");
if( !IsPlayerNearPlayer( 5.0, playerid, idigraca ) ) return SendErrorMessage( playerid, "Taj igrac nije blizu vas !");
            if( idigraca == playerid ) return SendErrorMessage( playerid, "Ne mozes sam sebi prodati vozilo!");

            new slot = -1;
for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
if( (j+1) <= PlayerInfo[ playerid ][ xSlotoviVozila ] && player_veh[ playerid ][ vehicle_id ][ j ] != -1 && player_veh[ playerid ][ vehicle_id ][ j ] == autoid )
{
  slot = j;
break;
}
}
if( slot == -1 ) return SendErrorMessage( playerid, "Ovo vozilo nije u vasem vlasnistvu." );

            slot = -1;
    for( new j = 0; j < MAX_VEH_SLOT; j ++ )
{
if( (j+1) <= PlayerInfo[ idigraca ][ xSlotoviVozila ] && player_veh[ idigraca ][ vehicle_id ][ j ] == -1 )
{
  slot = j;
break;
}
}
if( slot == -1 ) return SendErrorMessage( playerid, "Svi slotovi vozila izabranog igraca su zauzeti." );

if( cena < ( VehicleInfo[ autoid ][ vPrice ]/2 ) ) return SendErrorMessage( playerid, "Cena mora biti veca od polovine kupljene.");

        if( !IsVehicleBajs( autoid ) ) {
if( PlayerInfo[ idigraca ][ xLevel ] < 3 ) return SendErrorMessage( playerid, "Igrac mora biti level 3+ da bi ste mu prodali vozilo." );
}

            SCMF( playerid, ZUTA, "(Vozilo): Ponudili ste igracu {FFFFFF}%s {DABB3E}vozilo po ceni od {FFFFFF}($%d).", ImeIgraca( idigraca ), cena );
GlobalProdaja[ idigraca ] = playerid;
GlobalCena[ idigraca ] = cena;
GlobalID[ idigraca ] = autoid;
GlobalImovinaIgracu[playerid] = true;
format( string, sizeof( string ), "{FFFFFF}* Igrac %s vam je ponudio da kupite njegovo vozilo marke %s za $%d.", ImeIgraca( playerid ), GetVehicleNameEx( VehicleInfo[ autoid ][ vModel ] ), cena );
ShowPlayerDialog( idigraca, dialog_ACCEPTVEH, DIALOG_STYLE_MSGBOX, D_NASLOV, string, "Prihvati", "Odbij" );
    }
}
Naslov: Odg: Attempted to read/write array element at negative index -1
Poruka od: daddyDOT poslato Decembar 25, 2024, 16:13:06 POSLE PODNE
U prvom dijalogu, provjeri koju vrijednost dobijaš za
[pawn]GetNearestProperty( playerid )[/pawn]

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.
Naslov: Odg: Attempted to read/write array element at negative index -1
Poruka od: Dragi poslato Decembar 25, 2024, 21:08:02 POSLE PODNE
Citat: daddyDOT poslato Decembar 25, 2024, 16:13:06 POSLE PODNEU prvom dijalogu, provjeri koju vrijednost dobijaš za
[pawn]GetNearestProperty( playerid )[/pawn]

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.

Pazi, ta funkcija vraca -1 ukoliko ne pronadje najblizu imovinu igracu. Ali sta je fazon, on ima proveru da li je vracena vrednost te funkcije poklapa s vrednoscu ChosenProperty odnosno, igraceve imovine, znaci da je -1 returnalo bi ga. Ili ja gresim? Osim ako njegova imovian nije vec -1, onda je to bugcina jer je dirao zabranjeno voce...

GlobalImovinaIgracu[playerid] se ne azurira na false, znaci da ti se neki deo koda ne ucitava kako treba, odnosno dialog_PROPSELLTP.

Nema tu sta da se prica, kako ti je receno, preistupi Debuggingu (isprintaj sve moguce i sve arraye u konzoli, sve sumnjivo da vidis vrednosti i otkrices gde je bug) i to ti je to, drugacije nema. Ovo se desilo zbog tvog cackanja inace...
Naslov: Odg: Attempted to read/write array element at negative index -1
Poruka od: hendrixx poslato Decembar 25, 2024, 21:20:49 POSLE PODNE
Citat: daddyDOT poslato Decembar 25, 2024, 16:13:06 POSLE PODNEU prvom dijalogu, provjeri koju vrijednost dobijaš za
[pawn]GetNearestProperty( playerid )[/pawn]

printaj je ili nešto slično. Ukoliko ta funkcija vraća -1, pa ti s tom vrijednošću pokušaš pristupiti nizu onda je to problem. Uglavnom problem je taj što ne postoji index -1 u nizu, nemoguće je pristupiti tom dijelu memorije.

Provericu ovo

Citat: Dragi poslato Decembar 25, 2024, 21:08:02 POSLE PODNEPazi, ta funkcija vraca -1 ukoliko ne pronadje najblizu imovinu igracu. Ali sta je fazon, on ima proveru da li je vracena vrednost te funkcije poklapa s vrednoscu ChosenProperty odnosno, igraceve imovine, znaci da je -1 returnalo bi ga. Ili ja gresim? Osim ako njegova imovian nije vec -1, onda je to bugcina jer je dirao zabranjeno voce...

GlobalImovinaIgracu[playerid] se ne azurira na false, znaci da ti se neki deo koda ne ucitava kako treba, odnosno dialog_PROPSELLTP.

Nema tu sta da se prica, kako ti je receno, preistupi Debuggingu (isprintaj sve moguce i sve arraye u konzoli, sve sumnjivo da vidis vrednosti i otkrices gde je bug) i to ti je to, drugacije nema. Ovo se desilo zbog tvog cackanja inace...

Ovako je bilo na ultimateu klot jos dok ga nisam ni pipnuo, nego sam ostavio za posle i sad sam se setio da ne valja, probao sam da dodam na mestima gde jos mislim da treba GlobalImovinaIgracu[playerid] na false ali to nije pomoglo, mozda nisam ni to uradio kako treba, printovacu pa testiram sa drugarima jos posle praznika ako ne nadjemo ovde resenje zajedno
Naslov: Odg: Attempted to read/write array element at negative index -1
Poruka od: Dragi poslato Decembar 25, 2024, 22:06:13 POSLE PODNE
Pa to ja kazem... Javi sta je bilo, ako ne uspes i ako na na ultimate postoji taj bug, onda ce mi biti lakse da resim to.