· 6 years ago · Mar 29, 2019, 05:14 PM
1#include <sourcemod>
2#include <sdktools>
3
4#pragma newdecls required
5
6char nomDb[64] = "roleplay";
7Database db;
8// tableau de steamid
9char s_PlayerSteamid[MAXPLAYERS+1][60];
10
11
12public Plugin myinfo =
13{
14 name = "RP-CSGO",
15 author = "Synchroneyes",
16 description = "Plugin CSGO",
17 version = "SM 1.10",
18 url = "https://synchroneyes.fr/"
19}
20
21
22
23public void OnPluginStart(){
24 connexionDB();
25
26 //On met tous les joueurs connecté comme étant déconnecté, en cas de crash serveur
27 SQL_FastQuery(db, "UPDATE rp_connexions SET etat = 'deconnecte', date_deconnexion = CURRENT_TIMESTAMP, date_connexion = date_connexion WHERE etat = 'connecte';");
28 CreateTimer(5.0, timerVerifJoueurs, 0, TIMER_REPEAT);
29
30}
31
32public Action timerVerifJoueurs(Handle timer, any data){
33 verifTousLesJoueurs();
34}
35
36public void verifTousLesJoueurs() {
37 for(int i = 1; i < MAXPLAYERS; i++)
38 verifJoueur(i);
39}
40
41
42public void verifJoueur(int client) {
43 // Si un joueur est deconnecté mais n'est pas marqué comme déconnecté
44 // Alors on le marque comme deconnecté
45 char steamid[60];
46 steamid = s_PlayerSteamid[client];
47 char query[2048];
48 char erreur[2048];
49
50 Format(query, sizeof(query), "SELECT * FROM rp_connexions WHERE steamid = '%s' AND etat = 'connecte';", steamid);
51 // On fait la requête
52
53 DBResultSet rQuery = SQL_Query(db, query);
54 SQL_GetError(db, erreur, sizeof(erreur));
55
56 if(SQL_GetRowCount(rQuery) != 0){
57 // On vérifie qu'il est bien déco
58 if(estDeco(steamid, client)) {
59 forceDeconnexion(client);
60 }
61 }
62}
63
64
65public bool verifJoueurConnexion(int client) {
66 // On récupère le steamID de la personne
67 char steamid[60];
68 // ON vérifie qu'on peut bien récuperer un steamid
69
70 if(!IsClientConnected (client))
71 return false;
72
73 if(!GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid), true))
74 return false;
75
76
77 s_PlayerSteamid[client] = steamid;
78
79 // On regarde en BDD si un joueur est déjà connecté
80 char query[2048];
81 char query2[2048];
82 char query3[2048];
83
84
85 char erreur[500];
86
87 Format(query, sizeof(query), "SELECT * FROM rp_connexions WHERE steamid = '%s' AND etat = 'connecte';", steamid);
88 // On fait la requête
89
90 DBResultSet rQuery = SQL_Query(db, query);
91 SQL_GetError(db, erreur, sizeof(erreur));
92
93 if(SQL_GetRowCount(rQuery) == 0){
94 // Il se connecte
95 Format(query2, sizeof(query2), "INSERT INTO rp_connexions SET steamid = '%s', etat = 'connecte';", steamid);
96 s_PlayerSteamid[client] = steamid;
97
98 } else {
99 // Il est déjà connecté
100 // On annule ses dernieres connections
101 Format(query2, sizeof(query2), "UPDATE rp_connexions SET etat = 'deconnecte', date_deconnexion = CURRENT_TIMESTAMP, date_connexion = date_connexion WHERE etat = 'connecte' AND steamid = '%s';", steamid);
102 Format(query3, sizeof(query3), "INSERT INTO rp_connexions SET steamid = '%s', etat = 'connecte';", steamid);
103
104 }
105
106 SQL_FastQuery(db, query2);
107 SQL_FastQuery(db, query3);
108
109 return true
110}
111
112// Quand le joueur se connecte sur le RP
113public void OnClientAuthorized(int client){
114 verifJoueurConnexion(client);
115}
116
117// Quand un joueur se déconnecte
118public void OnClientDisconnect(int client) {
119 forceDeconnexion(client);
120}
121
122
123public bool estDeco(char[] steamid, int idClient) {
124 if(StrEqual(s_PlayerSteamid[idClient], steamid, false)) {
125 // C'est que le joueur n'est pas deconnecte
126 return false;
127 }
128 // Le joueur est bien déconnecté
129 return true;
130}
131
132public void forceDeconnexion(int idClient) {
133 // On marque le joueur comme étant déconnecté
134
135 // On récupère l'ancien steamid
136 char steamid[64];
137 steamid = s_PlayerSteamid[idClient];
138
139 // On supprime le steamid
140 s_PlayerSteamid[idClient] = "";
141 // Et on update la DB
142 char query[2048];
143 Format(query, sizeof(query), "UPDATE rp_connexions SET etat = 'deconnecte', date_deconnexion = CURRENT_TIMESTAMP, date_connexion = date_connexion WHERE etat = 'connecte' AND steamid = '%s';", steamid);
144 SQL_FastQuery(db, query);
145
146}
147
148public void connexionDB(){
149 char erreur[255];
150 db = SQL_Connect(nomDb, true, erreur, sizeof(erreur));
151
152 if (db == null){
153 PrintToServer("Erreur lors de la connexion: %s", erreur);
154 }
155
156 SQL_Query(db, "CREATE TABLE IF NOT EXISTS `rp_connexions` ( `id` int(11) NOT NULL AUTO_INCREMENT, `steamid` varchar(60) NOT NULL, `etat` enum('connecte','deconnecte') NOT NULL, `date_connexion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `date_deconnexion` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`));");
157
158}