Wysłany: 2018-11-04, 19:33
JestemSuperLIKE
Początkujący grafik
Wiek: 27 Na forum: 3694 dni Posty: 133
Piwa : 6
Cze??. Mam problem z vID. W bazie mam vehicle_id. NRG ma vehicle_id = 1, a Elegy = 2, Sultan = 3. A jak r?cznie usuwam z bazy Elegy = 2. To zostaje mi NRG = 1 i Sultan = 3. A na serwerze pokazuje mi ze NRG ma 1 a Sultan 2. Jak wpisuje komend? /dell VID czyli /dell 2 to auto mi si? usuwa a z bazy danych nie usuwa si?. Jak to naprawi??
Pawn
enum vInfo
{
vID ,
vModel ,
Text3D : vLabel ,
};
new VehicleInfo [ MAX_VEHICLES ][ vInfo ];
new Veh [ MAX_VEHICLES ];
SetupVehicleTable ()
{
new query [ 1024 ];
strcat ( query , "CREATE TABLE IF NOT EXISTS `vehicles` (`vehicle_id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`vehicle_id`))" );
mysql_tquery ( g_SQL , query );
return 1 ;
}
forward LoadVehicle ();
public LoadVehicle ()
{
new rows = cache_num_rows ();
new id , loaded ;
new str [ 150 ];
if( rows )
{
while( loaded < rows )
{
cache_get_value_name_int ( loaded , "vehicle_id" , id );
VehicleInfo [ id ][ vID ] = CreateVehicle ( 522 , 0.0 , 0.0 , 0.0 , 0.0 , - 1 , - 1 , - 1 );
Veh [ VehicleInfo [ id ][ vID ]] = id ;
SetVehicleToRespawn ( VehicleInfo [ id ][ vID ]);
loaded ++;
format ( str , sizeof ( str ), "(UID: %d)" , VehicleInfo [ id ][ vID ]);
VehicleInfo [ id ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ id ][ vLabel ], VehicleInfo [ id ][ vID ], 0.0 , 0.0 , 1.0 );
}
}
printf ( "[Vehicle] %d loaded vehicles." , loaded );
return 1 ;
}
CreateVehicle_CV ( model , price , Float : posx , Float : posy , Float : posz , Float : posa , color1 , color2 )
{
new id , query [ 300 ], str [ 150 ];
VehicleInfo [ id ][ vID ] = CreateVehicle ( 522 , 0.0 , 0.0 , 0.0 , 0.0 , - 1 , - 1 , - 1 );
Veh [ VehicleInfo [ id ][ vID ]] = id ;
SetVehicleToRespawn ( VehicleInfo [ id ][ vID ]);
format ( query , sizeof ( query ), "INSERT INTO `vehicles` (`vehicle_id`) VALUES ('%d')" , id );
mysql_tquery ( g_SQL , query );
format ( str , sizeof ( str ), "(UID: %d)" , VehicleInfo [ id ][ vID ]);
VehicleInfo [ id ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ id ][ vLabel ], VehicleInfo [ id ][ vID ], 0.0 , 0.0 , 1.0 );
return VehicleInfo [ id ][ vID ];
}
DeleteVehicle ( vehicleID )
{
new query [ 100 ];
DestroyVehicle ( vehicleID );
mysql_format ( g_SQL , query , sizeof ( query ), "DELETE FROM `vehicles` WHERE `vehicle_id` = %d LIMIT 1" , VehicleInfo [ vehicleID ][ vID ]);
mysql_tquery ( g_SQL , query );
return 1 ;
}
SaveVehicle ( xvehid )
{
new query [ 612 ];
mysql_format ( g_SQL , query , sizeof query , "UPDATE `vehicles` SET `vehicle_name` = '%s' WHERE `vehicle_id` = %d LIMIT 1" , GetVehicleNameFromModel ( VehicleInfo [ xvehid ][ vModel ]), xvehid );
mysql_tquery ( g_SQL , query );
return 1 ;
}
CMD : dell ( playerid , params [])
{
new v_id ;
if( sscanf ( params , "d" , v_id )) return SendClientMessage ( playerid , - 1 , "" );
DeleteVehicle ( v_id );
return 1 ;
}
Albo trzeba da? SaveVehicle w OnGameModeExit albo jako? ?eby by?y takie same VID pojazd?w w bazie i na serwerze.
Wysłany: 2018-11-05, 00:15
silentus
#define true false
Wiek: 30 Na forum: 5282 dni Posty: 71
Nick w MP: .silent
Piwa : 1462
Kod:
VehicleInfo[id][vID] = CreateVehicle(522, 0.0, 0.0, 0.0, 0.0, -1, -1, -1); // vID = id pojazdu na serwerze (CreateVehicle())
Veh[VehicleInfo[id][vID]] = id; // Veh[vID] = ID pojazdu w bazie danych
SetVehicleToRespawn(VehicleInfo[id][vID]);
loaded++;
format(str, sizeof(str), "(UID: %d)", VehicleInfo[id][vID]); // formatujesz tak by UID by?o r?wne vID, ale vID to ID z CreateVehicle
Zamie? VehicleInfo[id][vID] na Veh[VehicleInfo[id][vID]] lub po prostu na id..ale ca?e to ?adowanie pojazd?w jest ?le napisane. U?ywasz id z bazy danych w tablicy VehicleInfo, ale ID z bazy danych b?d? ci?gle ros?y, mimo ?e stare pojazdy b?d? usuwane. Po jakim? czasie po prostu wielko?? id z bazy przekroczy wielko?? tablicy i wywali Ci invalid memory access.
?eby to zrobi? dobrze, musisz zrobi? tablic? pojazd?w, a przy tworzeniu pojazdu wyszukiwa? w niej wolnego miejsca i tam wsadza? tworzony pojazd, jego ID etc. Wtedy gdy masz tablic? na wszystkie pojazdy serwera (nie tylko te zapisane w bazie), dodajesz w niej np privVehID, kt?re domy?lnie ustawiasz na np. -1 (?eby oznaczy? w ten spos?b normalne pojazdy, nie zapisane w bazie).
Wtedy je?li np. privVehID != -1, to ID z bazy mo?esz wyci?gn?? w taki spos?b: privVeh[ Veh[ GetPlayerVehicleID(playerid)][privVehID] ][ID]
Oczywi?cie to tylko uog?lniony przyk?ad, nie mo?esz bezpo?rednio u?y? GetPlayerVehicleID bez wcze?niejszego upewnienia si?, ?e gracz jest w poje?dzie.
btw nie u?ywaj int(11) tylko po prostu int, przy liczbach to nie ma sensu a wr?cz dodaje zb?dnego nadmiaru, bo zmienia to tylko spos?b prezentowania liczby (11 cyfr).
Wysłany: 2018-11-05, 02:42
JestemSuperLIKE
Początkujący grafik
Wiek: 27 Na forum: 3694 dni Posty: 133
Piwa : 6
Zamieni?em. Z bazy pojazd o VID 1 wy?wietla Text3D a pojazd o VID 3 nie wy?wietla. Zrobi?em od nowa system tworzenia pojazd?w. Ca?y czas mam problem z tym vID. Nie wiem jak najlepiej to zrobi?. Mo?na by by?o zrobi? takie co? np. w bazie s? pojazdy o VID 1,2 i 4. Jak bym chcia? stworzy? pojazd to by poszuka?o wolne VID czyli 3. I by jeszcze w Text3D wy?wietla?o prawid?owo VID. Mo?na by stworzy? pojazd i zaparkowa? w salonie i potem kupi?. Co do tego kodu co najlepiej zrobi??
Pawn
#include <a_samp>
#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>
main (){}
#define MYSQL_HOST ""
#define MYSQL_USER ""
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE ""
new MySQL : g_SQL ;
enum vInfo
{
vID ,
vModel ,
Text3D : vLabel
};
new VehicleInfo [ MAX_VEHICLES ][ vInfo ];
public OnGameModeInit ()
{
Connect ();
SetupVehicleTable ();
mysql_tquery ( g_SQL , "SELECT * FROM `veh`" , "LoadVehicles" );
return 1 ;
}
public OnGameModeExit ()
{
new saved ;
if( cache_num_rows ())
{
while( saved < cache_num_rows ())
{
SaveVehicle ( saved );
saved ++;
}
}
printf ( "%d saved vehicles" , saved );
mysql_close ( g_SQL );
return 1 ;
}
Connect ()
{
new MySQLOpt : option_id = mysql_init_options ();
mysql_set_option ( option_id , AUTO_RECONNECT , true );
g_SQL = mysql_connect ( MYSQL_HOST , MYSQL_USER , MYSQL_PASSWORD , MYSQL_DATABASE , option_id );
if( g_SQL == MYSQL_INVALID_HANDLE || mysql_errno ( g_SQL ) != 0 )
{
print( "OFF SERVER!" );
SendRconCommand ( "exit" );
return 1 ;
}
else
{
print( "ON SERVER!" );
}
return 1 ;
}
SetupVehicleTable ()
{
new query [ 1024 ];
strcat ( query , "CREATE TABLE IF NOT EXISTS `veh` (`vehid` int, `vehmodel` int default '0', PRIMARY KEY (`vehid`), UNIQUE KEY `vehid_2` (`vehid`), KEY `vehid` (`vehid`))" );
mysql_tquery ( g_SQL , query );
return 1 ;
}
CreateVehicle_2 ( model )
{
new ID , query [ 512 ], str [ 512 ];
VehicleInfo [ ID ][ vID ] = CreateVehicle ( model , - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
VehicleInfo [ ID ][ vModel ] = model ;
SetVehicleToRespawn ( VehicleInfo [ ID ][ vID ]);
mysql_format ( g_SQL , query , sizeof ( query ), "INSERT INTO `veh` (`vehid`, `vehmodel`) VALUES ('%d', '%d')" , VehicleInfo [ ID ][ vID ], model );
mysql_tquery ( g_SQL , query );
format ( str , sizeof ( str ), "{0b62ed}VID: {00d820}%d" , VehicleInfo [ ID ][ vID ]);
VehicleInfo [ ID ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ ID ][ vLabel ], VehicleInfo [ ID ][ vID ], 0.0 , 0.0 , 1.0 );
return 1 ;
}
forward LoadVehicles ();
public LoadVehicles ()
{
new loaded , ID , str [ 512 ];
if( cache_num_rows ())
{
while( loaded < cache_num_rows ())
{
cache_get_value_int ( loaded , "vehid" , VehicleInfo [ ID ][ vID ]);
cache_get_value_int ( loaded , "vehmodel" , VehicleInfo [ ID ][ vModel ]);
VehicleInfo [ ID ][ vID ] = CreateVehicle ( VehicleInfo [ ID ][ vModel ], - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
SetVehicleToRespawn ( VehicleInfo [ ID ][ vID ]);
loaded ++;
format ( str , sizeof ( str ), "{0b62ed}VID: {00d820}%d" , VehicleInfo [ ID ][ vID ]);
VehicleInfo [ ID ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ ID ][ vLabel ], VehicleInfo [ ID ][ vID ], 0.0 , 0.0 , 1.0 );
}
}
printf ( "%d loaded vehicles" , loaded );
return 1 ;
}
SaveVehicle ( S_VID )
{
new query [ 512 ];
mysql_format ( g_SQL , query , sizeof ( query ), "UPDATE `veh` SET `vehid` = %d, `vehmodel` = %d WHERE `vehid` = %d LIMIT 1" , VehicleInfo [ S_VID ][ vID ], VehicleInfo [ S_VID ][ vModel ], VehicleInfo [ S_VID ][ vID ]);
mysql_tquery ( g_SQL , query );
return 1 ;
}
DeleteVehicle ( D_VID )
{
new query [ 512 ], ID , Veh [ MAX_VEHICLES ];
VehicleInfo [ ID ][ vID ] = DestroyVehicle ( D_VID );
Veh [ VehicleInfo [ ID ][ vID ]] = D_VID ;
mysql_format ( g_SQL , query , sizeof ( query ), "DELETE FROM `veh` WHERE `vehid` = %d LIMIT 1" , D_VID );
mysql_tquery ( g_SQL , query );
return 1 ;
}
CMD : stworz ( playerid , params [])
{
new model ;
if( sscanf ( params , "d" , model )) return SendClientMessage ( playerid , - 1 , "/stworz [MODEL ID]" );
CreateVehicle_2 ( model );
return 1 ;
}
CMD : usun ( playerid , params [])
{
new del_vid ;
if( sscanf ( params , "d" , del_vid )) return SendClientMessage ( playerid , - 1 , "/usun [VID]" );
DeleteVehicle ( del_vid );
return 1 ;
}
public OnPlayerSpawn ( playerid )
{
SetPlayerSkin ( playerid , 29 );
SetPlayerPos ( playerid , - 23.9678 , 30.5966 , 3.1172 );
SetPlayerFacingAngle ( playerid , 324.9064 );
return 1 ;
}
Wysłany: 2018-11-05, 18:45
silentus
#define true false
Wiek: 30 Na forum: 5282 dni Posty: 71
Nick w MP: .silent
Piwa : 1462
Pawn #include <a_samp>
#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>
main (){}
#define MYSQL_HOST ""
#define MYSQL_USER ""
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE ""
new MySQL : g_SQL ;
// wielko?? znak?w w enumie (a raczej pierwszego znaku) ma znaczenie - z ma?ej litery to s? tzw. weak enumy kt?re nie wymagaj? podawania tagu, s? "globalne"
// w tym przypadku lepiej miec strong enum kt?ry wymaga poprawnego tagu (E_VEH_INFO:) dzieki czemu nie beda sie klocily inne enumy z tym, np enum od gracza tez moze miec pole UID
enum E_VEH_INFO
{
UID ,
vModel ,
Text3D : vLabel
};
new VehicleInfo [ MAX_VEHICLES + 1 ][ E_VEH_INFO ]; // +1 bo ID pojazd?w zaczynaj? si? od 1 a nie od 0 i mo?e ich by? MAX_VEHICLES (2000)
new VehiclesCount = 0 ;
// Lepiej miec jedna glowna duza tablice do formatowania niz tworzyc nowe za kazdym razem, dostep do globalnych zmiennych jest o wiele szybszy
// ja u siebie mam tablice na ponad 2500 znakow zeby byl zapas
new fmtstr [ 1024 ];
public OnGameModeInit ()
{
Connect ();
SetupVehicleTable ();
mysql_tquery ( g_SQL , "SELECT * FROM `veh`" , "LoadVehicles" );
return 1 ;
}
public OnGameModeExit ()
{
new saved = 1 ;
if( VehiclesCount > 0 )
{
while( saved <= VehiclesCount )
{
SaveVehicle ( saved );
saved ++;
}
}
printf ( "%d saved vehicles" , saved );
mysql_close ( g_SQL );
return 1 ;
}
Connect ()
{
new MySQLOpt : option_id = mysql_init_options ();
mysql_set_option ( option_id , AUTO_RECONNECT , true );
g_SQL = mysql_connect ( MYSQL_HOST , MYSQL_USER , MYSQL_PASSWORD , MYSQL_DATABASE , option_id );
if( g_SQL == MYSQL_INVALID_HANDLE || mysql_errno ( g_SQL ) != 0 )
{
print( "OFF SERVER!" );
SendRconCommand ( "exit" );
return 1 ;
}
else
{
print( "ON SERVER!" );
}
return 1 ;
}
SetupVehicleTable ()
{
mysql_tquery ( g_SQL , "CREATE TABLE IF NOT EXISTS `veh` (`vehid` int AUTO_INCREMENT, `vehmodel` int default '0', PRIMARY KEY (`vehid`))" );
return 1 ;
}
CreateVehicle_2 ( model )
{
new ID ;
ID = CreateVehicle ( model , - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
if( ID < 0 || ID == INVALID_VEHICLE_ID )
return 0 ;
VehicleInfo [ ID ][ vModel ] = model ;
SetVehicleToRespawn ( ID );
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "INSERT INTO `veh` (`vehmodel`) VALUES (%d)" , model );
// lokalne query wykonujace sie w tym samym watku (blokuje watek), nie chcialo mi sie dorabiac do tego callbacka
new Cache : ch = mysql_query ( g_SQL , fmtstr );
VehicleInfo [ ID ][ UID ] = cache_insert_id ();
cache_delete ( ch );
VehiclesCount ++;
format ( fmtstr , sizeof ( str ), "{0b62ed}UID: {00d820}%d" , VehicleInfo [ ID ][ UID ]);
VehicleInfo [ ID ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ ID ][ vLabel ], ID , 0.0 , 0.0 , 1.0 );
return 1 ;
}
forward LoadVehicles ();
public LoadVehicles ()
{
new loaded , ID , model ;
if( cache_num_rows ())
{
while( loaded < cache_num_rows ())
{
cache_get_value_int ( loaded , "vehmodel" , model );
ID = CreateVehicle ( model , - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
cache_get_value_int ( loaded , "vehid" , VehicleInfo [ ID ][ UID ]);
VehicleInfo [ ID ][ vModel ] = model ;
SetVehicleToRespawn ( ID ); // ID jest indeksem tablicy VehicleInfo i jednoczesnie ID sampowego pojazdu, [UID] to unikalne id z bazy danych
loaded ++;
format ( fmtstr , sizeof ( fmtstr ), "{0b62ed}UID: {00d820}%d" , VehicleInfo [ ID ][ UID ]);
VehicleInfo [ ID ][ vLabel ] = Create3DTextLabel ( fmtstr , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ ID ][ vLabel ], ID , 0.0 , 0.0 , 1.0 );
}
}
printf ( "%d loaded vehicles" , loaded );
return 1 ;
}
// SaveVehicle uzywa sampowego ID (1-2000)
SaveVehicle ( S_VID )
{
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "UPDATE `veh` SET `vehmodel` = %d WHERE `vehid` = %d LIMIT 1;" , VehicleInfo [ S_VID ][ vModel ], VehicleInfo [ S_VID ][ UID ]);
mysql_tquery ( g_SQL , fmtstr );
return 1 ;
}
// DeleteVehicle uzywa UID z bazy danych
DeleteVehicle ( D_UID )
{
new ID = - 1 ; // Tu by?a niezla sieczka, po co ta tablica Veh[MAX_VEHICLES]?
// GetVehiclePoolSize() zwraca najwieksze ID pojazdu, dalej nie musimy sprawdzac bo wiadomo ze nie ma wiecej pojazdow
for(new i = 1 , j = GetVehiclePoolSize (); i <= j ; i ++)
{
if( VehicleInfo [ i ][ UID ] == D_UID )
{
ID = i ;
break;
}
}
if( ID == - 1 ) // nie znaleziono pojazdu o takim UID
return 0 ;
DestroyVehicle ( ID );
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "DELETE FROM `veh` WHERE `vehid` = %d LIMIT 1" , D_UID );
mysql_tquery ( g_SQL , fmtstr );
VehicleInfo [ ID ][ UID ] = - 1 ;
return 1 ;
}
CMD : stworz ( playerid , params [])
{
new model ;
if( sscanf ( params , "d" , model )) return SendClientMessage ( playerid , - 1 , "/stworz [MODEL ID]" );
CreateVehicle_2 ( model );
return 1 ;
}
CMD : usun ( playerid , params [])
{
new del_uid ;
if( sscanf ( params , "d" , del_uid )) return SendClientMessage ( playerid , - 1 , "/usun [UID]" );
DeleteVehicle ( del_uid );
return 1 ;
}
public OnPlayerSpawn ( playerid )
{
SetPlayerSkin ( playerid , 29 );
SetPlayerPos ( playerid , - 23.9678 , 30.5966 , 3.1172 );
SetPlayerFacingAngle ( playerid , 324.9064 );
return 1 ;
}
Wysłany: 2018-11-05, 20:47
JestemSuperLIKE
Początkujący grafik
Wiek: 27 Na forum: 3694 dni Posty: 133
Piwa : 6
Okej, dzia?a. Dzi?ki. A gdybym chcia? ?eby by?o maksymalnie np. 50 pojazd?w.
Mam to zamieni?
Pawn new VehicleInfo [ MAX_VEHICLES + 1 ][ E_VEH_INFO ];
na
Pawn ]new VehicleInfo [ 49 + 1 ][ E_VEH_INFO ];
Tak? I jeszcze jedno pytanie. Po co jest break?
Pawn
for(new i = 1 , j = GetVehiclePoolSize (); i <= j ; i ++)
{
if( VehicleInfo [ i ][ UID ] == D_UID )
{
ID = i ;
break;
}
}
Wysłany: 2018-11-05, 22:55
silentus
#define true false
Wiek: 30 Na forum: 5282 dni Posty: 71
Nick w MP: .silent
Piwa : 1462
Break "?amie" p?tle po prostu z niej wychodz?c, w tym momencie znale?li?my pojazd wi?c nie ma po co dalej sprawdza?.
Jak chcesz zrobi? okre?lon? liczb? prywatnych pojazd?w to trzeba to przerobi?.
Pawn #include <a_samp>
#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>
main (){}
#define MYSQL_HOST ""
#define MYSQL_USER ""
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE ""
new MySQL : g_SQL ;
#define MAX_PVEHS 50
enum E_PVEH_INFO
{
UID ,
vID ,
vModel ,
Text3D : vLabel
};
new pvehInfo [ MAX_PVEHS + 1 ][ E_PVEH_INFO ]; // tu zastosujemy ten sam patent, czyli ID priv?w zaczynaja si? od 1. Dzieki temu nie musimy ustawiac pvehID w VehicleInfo na -1 (bo nie kazdy pojazd moze byc privem)
new pvehsCount = 0 ;
// makro do sprawdzania czy priv istnieje
#define pvehExists(%0) (%0 > 0 && %0 < MAX_PVEHS+1 && pvehInfo[%0][UID] > 0)
// dane wszystkich pojazd?w na serwerze, je?li pojazd jest prywatny to w pvehID ma sw?j indeks w tablicy pvehInfo
enum E_VEHICLE_INFO
{
pvehID
};
new VehicleInfo [ MAX_VEHICLES + 1 ][ E_VEHICLE_INFO ];
// Lepiej miec jedna glowna duza tablice do formatowania niz tworzyc nowe za kazdym razem, dostep do globalnych zmiennych jest o wiele szybszy
// ja u siebie mam tablice na ponad 2500 znakow zeby byl zapas
new fmtstr [ 1024 ];
public OnGameModeInit ()
{
Connect ();
SetupVehicleTable ();
mysql_tquery ( g_SQL , "SELECT * FROM `veh`" , "LoadVehicles" );
return 1 ;
}
public OnGameModeExit ()
{
new saved = 1 ;
if( pvehsCount > 0 )
{
while( saved <= pvehsCount )
{
SaveVehicle ( saved );
saved ++;
}
}
printf ( "%d saved vehicles" , saved );
mysql_close ( g_SQL );
return 1 ;
}
Connect ()
{
new MySQLOpt : option_id = mysql_init_options ();
mysql_set_option ( option_id , AUTO_RECONNECT , true );
g_SQL = mysql_connect ( MYSQL_HOST , MYSQL_USER , MYSQL_PASSWORD , MYSQL_DATABASE , option_id );
if( g_SQL == MYSQL_INVALID_HANDLE || mysql_errno ( g_SQL ) != 0 )
{
print( "OFF SERVER!" );
SendRconCommand ( "exit" );
return 1 ;
}
else
{
print( "ON SERVER!" );
}
return 1 ;
}
SetupVehicleTable ()
{
mysql_tquery ( g_SQL , "CREATE TABLE IF NOT EXISTS `veh` (`vehid` int AUTO_INCREMENT, `vehmodel` int default '0', PRIMARY KEY (`vehid`))" );
return 1 ;
}
CreateVehicle_2 ( model )
{
new vid =- 1 , ID =- 1 ;
vid = CreateVehicle ( model , - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
if( vid < 0 || vid == INVALID_VEHICLE_ID )
return 0 ;
// trzeba znalezc wolny slot na prywatny pojazd
for(new i = 1 ; i < sizeof pvehInfo ; i ++)
{
if(! pvehExists ( i ))
{
ID = i ;
break;
}
}
if( ID == - 1 )
{
printf ( "ERROR brak miejsca na kolejne pojazdy, zwi?ksz MAX_PVEHS" );
return 0 ;
}
pvehInfo [ ID ][ vModel ] = model ;
pvehInfo [ ID ][ vID ] = vid ; // id sampowego pojazdu
VehicleInfo [ vid ][ pvehID ] = ID ; // "relacja" miedzy sampowym pojazdem a danymi prywatnego pojazdu
SetVehicleToRespawn ( vid );
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "INSERT INTO `veh` (`vehmodel`) VALUES (%d)" , model );
// lokalne query wykonujace sie w tym samym watku (blokuje watek), nie chcialo mi sie dorabiac do tego callbacka
new Cache : ch = mysql_query ( g_SQL , fmtstr );
pvehInfo [ ID ][ UID ] = cache_insert_id ();
cache_delete ( ch );
pvehsCount ++;
format ( fmtstr , sizeof ( str ), "{0b62ed}UID: {00d820}%d" , pvehInfo [ ID ][ UID ]);
pvehInfo [ ID ][ vLabel ] = Create3DTextLabel ( str , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( VehicleInfo [ ID ][ vLabel ], vid , 0.0 , 0.0 , 1.0 );
return 1 ;
}
forward LoadVehicles ();
public LoadVehicles ()
{
new loaded , vid , ID , model ;
if( cache_num_rows ())
{
while( loaded < cache_num_rows ())
{
cache_get_value_int ( loaded , "vehmodel" , model );
vid = CreateVehicle ( model , - 23.9678 , 30.5966 , 3.1172 , 324.9064 , - 1 , - 1 , - 1 );
// ladujemy pojazdy na starcie serwera wiec nie trzeba szukac wolnego id w tablicy pvehInfo tylko po prostu dodawac po kolei
cache_get_value_int ( loaded , "vehid" , pvehInfo [ loaded ][ UID ]);
pvehInfo [ loaded ][ vModel ] = model ;
pvehInfo [ loaded ][ vID ] = vid ;
VehicleInfo [ vid ][ pvehID ] = loaded ;
SetVehicleToRespawn ( vid );
loaded ++;
format ( fmtstr , sizeof ( fmtstr ), "{0b62ed}UID: {00d820}%d" , pvehInfo [ loaded ][ UID ]);
pvehInfo [ loaded ][ vLabel ] = Create3DTextLabel ( fmtstr , - 1 , 0.0 , 0.0 , 0.0 , 50.0 , 0 );
Attach3DTextLabelToVehicle ( pvehInfo [ ID ][ vLabel ], ID , 0.0 , 0.0 , 1.0 );
}
}
printf ( "%d loaded vehicles" , loaded );
return 1 ;
}
// SaveVehicle uzywa ID prywatnego pojazdu (indeks pvehInfo)
SaveVehicle ( pvehid )
{
if(! pvehExists ( pvehid ))
return 0 ;
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "UPDATE `veh` SET `vehmodel` = %d WHERE `vehid` = %d LIMIT 1;" , pvehInfo [ pvehid ][ vModel ], pvehInfo [ pvehid ][ UID ]);
mysql_tquery ( g_SQL , fmtstr );
return 1 ;
}
// DeleteVehicle uzywa ID prywatnego pojazdu
DeleteVehicle ( pvehid )
{
if(! pvehExists ( pvehid ))
return 0 ;
DestroyVehicle ( pvehInfo [ pvehid ][ vID ]);
mysql_format ( g_SQL , fmtstr , sizeof ( fmtstr ), "DELETE FROM `veh` WHERE `vehid` = %d LIMIT 1" , pvehInfo [ pvehid ][ UID ]);
mysql_tquery ( g_SQL , fmtstr );
pvehInfo [ pvehid ][ UID ] = - 1 ;
VehicleInfo [ pvehInfo [ pvehid ][ vID ]][ pvehID ] = - 1 ;
return 1 ;
}
CMD : stworz ( playerid , params [])
{
new model ;
if( sscanf ( params , "d" , model )) return SendClientMessage ( playerid , - 1 , "/stworz [MODEL ID]" );
CreateVehicle_2 ( model );
return 1 ;
}
CMD : usun ( playerid , params [])
{
new uid , del_uid =- 1 ;
if( sscanf ( params , "d" , uid )) return SendClientMessage ( playerid , - 1 , "/usun [UID]" );
// najpierw trzeba znalezc id priva po jego UID
for(new i = 1 ; i < sizeof pvehInfo ; i ++)
{
if( pvehExists ( i ) && pvehInfo [ i ][ UID ] == del_uid )
{
del_uid = i ;
break;
}
}
if( del_uid == - 1 )
return SendClientMessage ( playerid , - 1 , "Nie odnaleziono takiego pojazdu" );
DeleteVehicle ( del_uid );
return 1 ;
}
public OnPlayerSpawn ( playerid )
{
SetPlayerSkin ( playerid , 29 );
SetPlayerPos ( playerid , - 23.9678 , 30.5966 , 3.1172 );
SetPlayerFacingAngle ( playerid , 324.9064 );
return 1 ;
}
Wysłany: 2018-11-05, 23:39
JestemSuperLIKE
Początkujący grafik
Wiek: 27 Na forum: 3694 dni Posty: 133
Piwa : 6
Jak to naprawi??
Kod:
(130) : warning 213: tag mismatch
(130) : error 032: array index out of bounds (variable "VehicleInfo")
Mam jedno pytanie. Czy to jest dobry pomys? tworzy? to samo co np. VehicleInfo to b?d? pojazdy do kupienia a PrivInfo to b?d? prywatne pojazdy. Po kupnie pojazdu wysy?a zapytanie INSERT INTO ze to jest prywatny pojazd czyli UID, do kogo nale?y ten pojazd, modelid.
EDIT: Jeszcze mam taki problem. Po wpisaniu w dialogu model, price, color1 i color2,. pojazd Elegy si? tworzy ale mnie wsiada do pojazdu VID 1. I tak przez ca?y czas jak tworz? nast?pny pojazd.
Pawn
new tmp_var [ 3 ], Float : ppos [ 4 ], veh , xid ;
tmp_var [ 0 ] = GetPVarInt ( playerid , "xv_ao_model" );
tmp_var [ 1 ] = GetPVarInt ( playerid , "xv_ao_col1" );
tmp_var [ 2 ] = GetPVarInt ( playerid , "xv_ao_col2" );
GetPlayerPos ( playerid , ppos [ 0 ], ppos [ 1 ], ppos [ 2 ]);
GetPlayerFacingAngle ( playerid , ppos [ 3 ]);
veh = StworzPojazd ( tmp_var [ 0 ], strval ( inputtext ), ppos [ 0 ], ppos [ 1 ], ppos [ 2 ], ppos [ 3 ], tmp_var [ 1 ], tmp_var [ 2 ]);
xid = Veh [ veh ];
PutPlayerInVehicle ( playerid , veh , 0 );
new str [ 256 ];
format ( str , sizeof ( str ), "Pojazd %s (%d) zosta? utworzony z kolorami %d, %d" , GetVehicleNameFromModel ( VehicleInfo [ xid ][ vModel ]), VehicleInfo [ xid ][ vModel ], VehicleInfo [ xid ][ vColor1 ], VehicleInfo [ xid ][ vColor2 ]);
SendClientMessage ( playerid , - 1 , str );
format ( str , sizeof ( str ), "Identyfikator pojazdu: %d, Cena: $%d" , VehicleInfo [ xid ][ UID ], VehicleInfo [ xid ][ vPrice ]);
SendClientMessage ( playerid , - 1 , str );
DeletePVar ( playerid , "xv_ao_model" );
DeletePVar ( playerid , "xv_ao_col1" );
DeletePVar ( playerid , "xv_ao_col2" );
Tagi: mysql :: vid
Anonymous
Na forum: 245 dni
Posty: 1
Anonymous Koniecznie zajrzyj na: