DarkyTheAngel
Membru-
Posts
1.005 -
Joined
-
Last visited
Never
Content Type
Profiles
Forums
News
Documentation
Everything posted by DarkyTheAngel
-
Sau sa invete PAWN.
-
E clar.Modifici: format ( string , sizeof ( string ) , "(({4BB3F9}Admin {F81414}%s{FFFFFF}: %s ))" , sendername , result ) ; Cu asta: format ( string , sizeof ( string ) , "(({4BB3F9}Owner {F81414}%s{FFFFFF}: %s ))" , sendername , result ) ;
-
[SQLite] Crearea unui sistem de inregistrare/logare.
DarkyTheAngel replied to DarkyTheAngel's topic in Tutoriale
Scriu acest tutorial de ieri-seara si nu fac chestia asta pentru "respect".Si chiar nu am de lucru la CS_0.3x . -
Salut.Am vazut ca Rimmon a inceput sa posteze cateva tutoriale despre SQLite, asa ca m-am gandit sa postez si eu un tutorial in care va arat cum sa faceti un sistem de inregistrare/logare pe SQLite.Prima data incepeti cu includerile.In cazul de fata, o sa folosesc doar fisierele a_samp.inc, zcmd.inc si YSI\y_ini.inc: #include " a_samp " #include " zcmd " #include " YSI\y_ini " Acum ca am facut asta, o sa va intrebati de ce am adaugat si y_ini.L-am adaugat fiindca fisierul y_ini contine stock-ul strcpy iar ca sa nu il mai adaug in acest tutorial, am inclus y_ini.Ca sa fie mai usor de explicat si pentru a nu irosi ceva linii, o sa definesc dialog-urile si functile pe care le voi folosi in acest tutorial: #define SPD ShowPlayerDialog #define SCM SendClientMessage #define DIALOG_REGISTER ( 2012 ) #define DIALOG_LOGIN ( 2013 ) #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1])))) Acum ca am facut si asta, trebuie sa facem si datele jucatorului (new-urile): enum PlayerData { Nume [ MAX_PLAYER_NAME ] , Bani , Scor , Ucideri , Decese } ; new P_DATA [ MAX_PLAYERS ] [ PlayerData ] , bool: Logat [ MAX_PLAYERS ] , DB:Conturi ; Daca a-ti facut toate astea, putem trece la urmatorul pas, acesta fiind pasul care tine de baza de date: public OnFilterScriptInit ( ) { new string [ 756 ] ; Conturi = db_open ( "Conturi.db" ) ; strcat ( string , "CREATE TABLE IF NOT EXISTS `Jucatori`" , 756 ) ; strcat ( string , "(`ID` INTEGER PRIMARY KEY AUTOINCREMENT ,\ `Nume` TEXT ,\ `Parola` TEXT ,\ `Bani` NUMERIC ,\ `Scor` NUMERIC , " , 756 ) ; strcat ( string , "`Ucideri` NUMERIC ,\ `Decese` NUMERIC ) " , 756 ) ; db_free_result ( db_query ( Conturi , string ) ) ; return ( 1 ) ; } Daca vreti sa faceti sistemul de inregistrare in modul de joc, schimbati OnFilterScriptInit cu OnGameModeInit.La acest "callback", se va crea baza de date/se va deschide baza de date.Pentru a functiona corect, la final cand modul de joc/scriptul se inchide, trebuie sa inchideti si baza de date: public OnFilterScriptExit ( ) { db_close ( Conturi ) ; return ( 1 ) ; } Aici povestea se repeta.Schimbati OnFilterScriptExit cu OnGameModeExit daca aveti "gamemode" si nu "filterscript".Acum ca am facut si baza de date, trebuie sa facem ca atunci cand un jucator se conecteaza, sa ii apara dialogul de inregistrare/logare.Cum facem asta? Simplu.La "callback"-ul OnPlayerConnect trebuie sa verificam daca jucatorul exista in baza de date sau nu: public OnPlayerConnect ( playerid ) { new Query [ 256 ] , pNume [ MAX_PLAYER_NAME ] , DBResult:Result ; Logat [ playerid ] = false ; GetPlayerName ( playerid , pNume , MAX_PLAYER_NAME ) ; strcpy ( P_DATA [ playerid ] [ Nume ] , DB_Escape ( pNume ) , MAX_PLAYER_NAME ) ; format ( Query , 256 , "SELECT * FROM `Jucatori` WHERE `Nume` = '%s'" , P_DATA [ playerid ] [ Nume ] ) ; Result = db_query ( Conturi , Query ) ; if ( db_num_rows ( Result ) > 0 ) SPD ( playerid , DIALOG_LOGIN , DIALOG_STYLE_PASSWORD , "Logheaza-te" , "Introdu parola in casuta de mai jos:" , "O.K" , "" ) ; else SPD ( playerid , DIALOG_REGISTER , DIALOG_STYLE_PASSWORD , "Inregistreaza-te" , "Introdu parola in casuta de mai jos:" , "O.K" , "" ) ; db_free_result ( Result ) ; return ( 1 ) ; } Acum ca am trecut si de acest pas cu succes, trebuie sa facem ca atunci cand jucatorul se deconecteaza, sa ii se salveze datele.Presupun ca va intrebati "CUM?!" deci am sa va arat cum se poate face asta.Prima data trebuie sa verificam daca jucatorul este logat (de asta se ocupa "bool: Logat"): public OnPlayerDisconnect ( playerid , reason ) { if ( Logat [ playerid ] ) { new Query [ 256 ] ; format ( Query , sizeof ( Query ) , "UPDATE `Jucatori` SET `Bani` = '%d' ,`Scor` = '%d' , `Ucideri` = '%d' , `Decese` = '%d' WHERE `Nume` = '%s'" , GetPlayerMoney ( playerid ) , GetPlayerScore ( playerid ) , P_DATA [ playerid ] [ Ucideri ] , P_DATA [ playerid ] [ Decese ] , P_DATA [ playerid ] [ Nume ] ) ; db_free_result ( db_query ( Conturi , Query ) ) ; } return ( 1 ) ; } Acum se salveaza datele jucatorului.Trebuie sa mai facem si "Uciderile" si "Decesele" jucatorului.Pentru a realiza acest lucru, avem nevoie de public-ul (callback-ul) OnPlayerDeath: public OnPlayerDeath ( playerid , killerid , reason ) { P_DATA [ playerid ] [ Decese ] ++ ; if ( killerid != INVALID_PLAYER_ID ) { P_DATA [ killerid ] [ Ucideri ] ++ ; } return ( 1 ) ; } Dupa ce am facut si asta, cred ca trebuie sa facem si ultimul pas (pasul final), cel care consta il salvarea si generarea datelor jucatorului.Pentru a realiza asta, ne vom folosi de public-ul OnDialogResponse.Folosindune de acesta, vom mai verifica daca parola introdusa este corecta/gresita sau daca parola introdusa de jucator este "null" adica daca jucatorul nu a introdus nimic: public OnDialogResponse ( playerid , dialogid , response , listitem , inputtext [ ] ) { if ( dialogid == DIALOG_REGISTER ) { if ( !response || isnull(inputtext ) ) return SPD ( playerid , DIALOG_REGISTER , DIALOG_STYLE_PASSWORD , "Inregistreaza-te" , "Introdu parola in casuta de mai jos:" , "O.K" , "" ) ; new Query [ 256 ] ; format ( Query , sizeof ( Query ) , "INSERT INTO `Jucatori` ( `Nume` , `Parola` , `Bani` , `Scor` , `Ucideri` , `Decese` ) VALUES ( '%s' , '%s' , '%d' , '%d' , '%d' , '%d' )" , P_DATA [ playerid ] [ Nume ] , DB_Escape ( inputtext ) , 0 , 0 , 0 , 0 ) ; db_free_result ( db_query ( Conturi , Query ) ) ; SCM ( playerid , -1 , "Te-ai inregistrat cu succes." ) ; Logat [ playerid ] = true ; return ( 1 ) ; } if ( dialogid == DIALOG_LOGIN ) { if ( !response || isnull ( inputtext ) ) return SPD ( playerid , DIALOG_LOGIN , DIALOG_STYLE_PASSWORD , "Logheaza-te" , "Introdu parola in casuta de mai jos:" , "O.K" , "" ) ; new Query [ 256 ] , DBResult:Result ; format ( Query , sizeof ( Query ) , "SELECT `Bani` , `Scor` , `Ucideri` , `Decese` FROM `Jucatori` WHERE `Nume` = '%s' AND `Parola` = '%s'" , P_DATA [ playerid ] [ Nume ] , DB_Escape ( inputtext ) ) ; Result = db_query ( Conturi , Query ) ; if ( db_num_rows ( Result ) ) { new Field [ 30 ] ; db_get_field_assoc ( Result , "Bani" , Field , 30 ) ; P_DATA [ playerid ] [ Bani ] = strval ( Field ) ; ResetPlayerMoney ( playerid ) ; GivePlayerMoney ( playerid , strval ( Field ) ) ; db_get_field_assoc ( Result , "Scor" , Field , 30 ) ; P_DATA [ playerid ] [ Scor ] = strval ( Field ) ; SetPlayerScore ( playerid , strval ( Field ) ) ; db_get_field_assoc ( Result , "Ucideri" , Field , 30 ) ; P_DATA [ playerid ] [ Ucideri ] = strval ( Field ) ; db_get_field_assoc ( Result , "Decese" , Field , 30 ) ; P_DATA [ playerid ] [ Decese ] = strval(Field); Logat [ playerid ] = true ; } else { SPD ( playerid , DIALOG_LOGIN , DIALOG_STYLE_PASSWORD , "Logheaza-te" , "Parola gresita.Introdu parola in casuta de mai jos:" , "O.K" , "" ) ; } db_free_result ( Result ) ; return ( 1 ) ; } return ( 0 ) ; } Cam asta a fost tot.Dar, ca sa nu primiti erori la compilare, adaugati stock-ul DB_Escape la final de script: stock DB_Escape ( text [] ) { new ret[ MAX_INI_ENTRY_TEXT * 2 ] , ch , i , j ; while ( ( ch = text [ i++ ] ) && j < sizeof ( ret ) ) { if ( ch == '\'' ) { if ( j < sizeof ( ret ) - 2 ) { ret [ j++ ] = '\'' ; ret [ j++ ] = '\'' ; } } else if ( j < sizeof ( ret ) ) { ret [ j++ ] = ch ; } else { j++ ; } } ret [ sizeof ( ret ) - 1 ] = '\0' ; return ret ; } Daca a-ti urmat toti pasii corect (de la cap la coada) ar trebuii sa functioneze corect sistemul de inregistrare/logare.O zi buna!
-
if(strcmp(cmd, "/fuelcars", true) == 0) // by Darksone { if(IsPlayerConnected(playerid)) { if(PlayerInfo[playerid][pAdmin] >= 3) { for(new c=0;c<CAR_AMOUNT;c++) { Gas[c] = GasMax; } SendClientMessage(playerid, COLOR_GREY, " All cars filled with Fuel ! "); } else { SendClientMessage(playerid, COLOR_GREY, " You are not an Admin ! "); return 1; } } return 1; }
-
Fisierul y_ini se gaseste in libraria YSI, adica vine la pachet cu libraria.
-
Fa-ti update la includeri.
-
#include " streamer "
-
//______________________________________________________________________________ #include " a_samp" //______________________________________________________________________________ public OnPlayerCommandText ( playerid , cmdtext [ ] ) { if ( strcmp ( "/radio" , cmdtext , true , 10 ) == 0 ) { #define SPD ShowPlayerDialog SPD ( playerid , 90 , DIALOG_STYLE_LIST , "{F81414}Radio PcSNeT:" , "{3399ff}\n{3399ff}1){FFFFFF}ProFM\n{3399ff}2){FFFFFF}Radio Party\n{3399ff}3){FFFFFF}Radio Greu de Difuzat\n{3399ff}4){FFFFFF}Radio Gangsta Manele\n{3399ff}5){FFFFFF}Radio AzNetGalati" , "Select" , "Exit" ) ; return ( 1 ) ; } if ( strcmp ( "/stopradio" , cmdtext , true , 10 ) == 0 ) { StopAudioStreamForPlayer ( playerid ) ; return ( 1 ) ; } return ( 0 ) ; } //______________________________________________________________________________ public OnDialogResponse ( playerid , dialogid , response , listitem , inputtext [ ] ) { switch ( dialogid ) { case 90 : { if ( !response ) { return ( 1 ) ; } switch ( listitem ) { case 1 : { PlayAudioStreamForPlayer ( playerid , "http://stream.profm.ro:8012/profm.mp3" ) ; } case 2 : { PlayAudioStreamForPlayer ( playerid , "http://live.activeradio.ro:9000/listen.pls" ) ; } case 3 : { PlayAudioStreamForPlayer ( playerid , "http://http://www.aznetgalati.tk:8800" ) ; } case 4 : { PlayAudioStreamForPlayer ( playerid , "http://live.radiogangsta.ro:8800" ) ; } } return ( 1 ) ; } } return ( 0 ) ; } //______________________________________________________________________________
-
Nu trebuie neaparat sa convertesti culoarea.Poti sa o definesti in felul urmator: #define L "{9DFF00}" Iar cand o sa o folosesti, faci in felul urmator: #define SCM SendClientMessage SCM ( playerid , -1 , ""L"Lightblue" ) ;
-
public OnPlayerUpdate ( playerid ) { if ( GetPlayerScore ( playerid ) == 1 ) return GivePlayerWeapon ( playerid , 26 , 500 ) ; // 26 reprezinta id-ul armei pe care o primeste jucatorul respectiv. // 500 reprezinta gloantele armei pe care o primeste jucatorul respectiv. return ( 1 ) ; }
-
Daca exemplul a fost dat pe callback-ul OnPlayerConnect, oare unde trebuie sa pui codul :shocked:? EDIT: Iar atunci cand un jucator se deconecteaza, codul trebuie pus la OnPlayerDisconnect.
-
Ca sa iti arate cand intra un jucator, foloseste asta.
-
Adica asta ?
-
#include " a_samp " // Fisierul 'a_samp.inc'. #include " streamer " // Fisierul 'streamer.inc'. public OnFilterScriptInit ( ) // Publicul 'OnFilterScriptInit'. { // Acolada de deschidere. // Aici trebuie pus codul obiectelor. return ( 1 ) ; // Intoarcerea valorii 1 ('true'). } // Acolada de inchidere. public OnFilterScriptExit ( ) return ( 1 ) ; // Publicul 'OnFilterScriptExit'.
-
De unde v-a venit ideea ca am sa il public ? Mai sus am mentionat ca o sa deschid un server cu el.Deci, cum v-am promis ca o sa postez poze cu sistemul bancar, cel de apartamente, cel de case si cel de "walk", am si facut-o: [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375]
-
Bravo, chiar ca arata super .
-
Succes cu el.Cred ca e mult de munca, fiind un server RPG .
-
Pai scriptul are in jur de 15.000 - 20.000 linii.O sa mai pun poze cu sistemul de apartamente, sistemul de case si inca cateva si o sa pun si 2 - 3 poze din script.
-
Salut.M-am gandit sa imi deschid un server (nu l-am terminat, inca) si as avea nevoie de cateva pareri/critici.Deci, sa incept.Tot server-ul este facut pe SQLite (sistemul de administrare/sistemul de donator) in combinatie cu Y_ini (sistemul bancar).Deci, ca urmare, server-ul este 60% SQLite si 40% Y_ini.Server-ul dispune de un sistem de inregistrare/logare destul de complex (dupa parerea mea): [img width=500 height=375] [img width=500 height=375] Mai dispune si de un sistem de AFK/BRB.Nu este unul destul de avansat, dar este suficient pentru a satisface "nevoile" jucatorului: [img width=500 height=375] [img width=500 height=375] Este un server de tip Freeroam combinat cu putin RPG (sistemul de nivel care se vede in coltul din dreapta) deci dispune de un sistem de generare al vehiculelor si al armelor: [img width=500 height=375] [img width=500 height=375] Cum orice server are asa zisul "hold system", m-am gandit sa imi fac si eu unul dar folosind mSelection: [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] De asemenea, modul de joc mai contine si un sistem de "vehicle control": [img width=500 height=375] [img width=500 height=375] Sistemul de administrare folosit pe server este unul unic (contine si un sistem de donator) facut intr-un procent de 80% de mine: [img width=500 height=375] Mai contine si un "rampages system" scriptat de Rock si usor modificat de mine, un sistem de nivele scriptat de mine in totalitate (se poate observa in a doua poza, in coltul din dreapta al ecranului), un sistem de prajituri (ultima poza) si multe alte chestii: [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] [img width=500 height=375] M-ai contine multe alte chestii dar imi e lene sa le postez, deci faceti-va o parere doar din ce v-am dat pana acum .
-
Probabil este de la modul tau de joc.Eu l-am testat si apar textdraw-urile.
-
Da-mi linia 1139.
-
Daca esti asa de "disperat", nu o sa te ajute nimeni.
