Hi!
Óránként van ugye fizetés .. lefut, viszont hibát ír, [ERROR] cache_get_value_name: invalid row index \'X\'
new STRING[ 128 ]; format( STRING, sizeof( STRING ), \"SELECT * FROM users WHERE PayCheck != \'0\'\" );
mysql_tquery( MHandle, STRING, \"MakePays\", \"d\", 0 );
forward MakePays( playerid );
public MakePays( playerid )
{
new rows, STRING[ 128 ], NAME[ 24 ], PAY;
cache_get_row_count( rows ), printf( \"%d\", rows );
for( new i; i != rows; i ++ )
{
cache_get_value_name( i, \"PlayerName\", NAME );
cache_get_value_name_int( i, \"PayCheck\", PAY );
mysql_format( MHandle, STRING , sizeof( STRING ), \"UPDATE bank_accounts SET Balance=Balance+%d WHERE Owner=\'%s\' && Disabled=0 LIMIT 1\", PAY, NAME ), mysql_query( MHandle, STRING );
mysql_format( MHandle, STRING , sizeof( STRING ), \"UPDATE users SET PayCheck=\'0\' WHERE PlayerName=\'%s\' LIMIT 1\", NAME ), mysql_query( MHandle, STRING );
for( playerid; playerid < MAX_PLAYERS; playerid ++ )
{
if( CompareEx( NAME, PlayerName( playerid ) ) )
{
if( IsPlayerConnected( playerid ) )
{
SendFormatMessage( playerid, -1, \"[{f3ff4a} SZERVER {ffffff}] Fizetésed átutalva a bankszámládra! ( {f3ff4a}$%s{ffffff} )\", FormatNumber( PAY ) );
}
}
}
}
return 1;
}
for( new i; i != rows; i ++ )
Az \' i \' változónak nincs kezdőértéke, habár azt hiszem erre a pawno is errort ír. Nyílván ha nincs kezdőérték akkor nem tudja, melyik sorból kell kiszedni.
for( playerid; playerid < MAX_PLAYERS; playerid ++ )
{
if( CompareEx( NAME, PlayerName( playerid ) ) )
{
if( IsPlayerConnected( playerid ) )
{
SendFormatMessage( playerid, -1, \"[{f3ff4a} SZERVER {ffffff}] Fizetésed átutalva a bankszámládra! ( {f3ff4a}$%s{ffffff} )\", FormatNumber( PAY ) );
}
}
}
Ezzel meg annyi a probléma, hogy a MAX_PLAYERS értékig fut le, ami alapesetben 1000, viszont ha átírtad, 30-50-80 stb. akkor is egészen nagy. Illetve le sem állítod, tehát ha pl. a 0-ás IDjű játékosnál teljesül a feltétel, akkor a többi (n-1)-szor lefutás fölösleges. Próbáld meg úgy, hogy IsPlayerConnected, és hogyha igaz értékkel tér vissza, akkor fentvan azt már tudod kezelni. Kicsit hasonló az eljárás, csak ebben az esetben csak annyiszor fut le a keresési ciklus ahány játékos van a szerveren, vagyis ( GetPlayerPoolSize = legnagyobb ID a szerveren, kis prioritásoknál nagyon hasznos. ), illetve az értékkel return-olok is ami megszakítja a ciklust.
GetPlayerIdFromName(playername[])
{
for(new i = 0, j = GetPlayerPoolSize(); i < j; i++)
if(!strcmp(playername,GetPlayerName(i)) return i;
return -1;
}
A fenti kód lefut az összes játékoson akik fentvannak egészen a legmagasabb ID-ig, nyílván 1-2 \"üres tick\" lehet, mivel a játékos ID-je lehet magasabb is mint a playerszám, viszont a playerszám nem lehet nagyobb az ID-nél :D ( vagyis n-1 mivel 20 játékosnál 19 a legnagyobb ID de ez lényegtelen mert csak összezavarlak vele :D ) És ha megtalálta az ID-t akkor visszatér vele. Ez ugyanúgy müködik mint a te esetedben, viszont ott nem szakítsa meg a ciklust ha teljesel a feltétel, illetve a feltétel túl nagy.
A lenti kóddal lekérdezed az ID-t a név alapján. Ha nincs fent akkor az érték -1 lesz, és ha az érték -1 returnol tehát kihagyja.
new id = GetPlayerIdFromName(NAME);
if( id == -1) return 1;
SendClientMessage(playerid,-1,\"Megjött a fizud te$$$$$$$$$$$$$$$$$$\");
pInfo[id][pBank] = pInfo[id][pBank] + MONEY;
Remélem azért érthető, eléggé rosszul magyarázok, ha van valami kérdésed csak írj!
Rég volt, hogy pawnoztam ezek szerint :D A javahoz vagyok szokva ott pedig ilyen alattomos hibák mint pl. az \" int i = 0;\" szokott hiba lenni és órákig keresem :) De ezek szerint pawnoban ez elhanyagolható.
Viszont az érdekes hiba, mert logikailag működnie kellene.
new STRING[ 128 ]; format( STRING, sizeof( STRING ), \"SELECT * FROM users WHERE PayCheck != \'0\'\" );
mysql_tquery( MHandle, STRING, \"MakePays\", \"d\", 0 );
Ez pontosan hogyan hívódik meg? Timerrel gondolom, de küld el azt is, úgy átláthatóbb.
Esetleg próbáld meg az eredményeket kiiratni konzolba, így nyomon tudod követni, hogy hol van a hiba.