Evo tvoj sistem isti prebacen u myqsl i riješeni ovi problemi iznad koje sam napisao i ostali drugi, pregledaj kod i svoj pa tako ces najlakse uocit neke propuste itd, nije tesko za 30 min se moze napisati sve fino, nema ovdje ni 200 linija.
/*
promo sistem mysql verzija
trebas YCMD, sscanf, mysql plugin (blueg r41 ili sta vec koristis)
u enum pInfo moras imat pLevel pNovac pAdmin pPromo
u tabeli igraca kolona PromoIskoriscen INT default 0
kad ucitavas igraca iz baze stavi PlayerInfo[playerid][pPromo] = ono iz kolone PromoIskoriscen
sql za tabelu jednom pokrenes:
CREATE TABLE IF NOT EXISTS promo_aktivni (
id INT PRIMARY KEY DEFAULT 1,
kod VARCHAR(32) NOT NULL,
kreator_ime VARCHAR(24) NOT NULL,
datum BIGINT UNSIGNED NOT NULL
);
ako nemas kolonu u players: ALTER TABLE players ADD COLUMN PromoIskoriscen INT DEFAULT 0;
ispod prilagodis connection i nazive tabela/kolona
gettime() trebas imat negdje (unix timestamp) ili u query stavi 0 umisto gettime() za datum
*/
#define MYSQL_CONNECTION MySQL // tvoja mysql varijabla
#define MYSQL_TABELA_IGRACA "players"
#define MYSQL_KOLONA_IME "Ime" // kolona di je ime igraca
#define MYSQL_KOLONA_NOVAC "Novac"
#define MYSQL_KOLONA_PROMO "PromoIskoriscen"
// cijene i leveli
#define PROMO_CENA_IZRADE 20000
#define PROMO_NAGRADA_KORISNIK 100000
#define PROMO_NAGRADA_KREATOR 5000
#define PROMO_MIN_LEVEL_KREIRANJE 5
#define PROMO_MIN_LEVEL_ISKORISTI 3
// za callbackove treba negdje drzat podatke jer je async
new TempPromoKod[MAX_PLAYERS][32];
new TempPromoKreator[MAX_PLAYERS][MAX_PLAYER_NAME];
new TempPromoUneseni[MAX_PLAYERS][32];
// provjera jel string prazan ili samo razmaci
stock Promo_JePrazan(const string[]) {
new i = 0;
while (string[i] == ' ' || string[i] == '\t') i++;
return string[i] == '\0';
}
// ---------- kreiranje koda ----------
forward OnPromoObrisanZaInsert(playerid);
public OnPromoObrisanZaInsert(playerid) {
if (playerid == INVALID_PLAYER_ID || !IsPlayerConnected(playerid)) return 1;
// sad ubacujemo novi kod u bazu, escape da ne bi sql injection
new query[256], escaped_kod[64], escaped_ime[MAX_PLAYER_NAME * 2];
mysql_escape_string(TempPromoKod[playerid], escaped_kod);
mysql_escape_string(TempPromoKreator[playerid], escaped_ime);
format(query, sizeof(query),
"REPLACE INTO promo_aktivni (id, kod, kreator_ime, datum) VALUES (1, '%s', '%s', %d)",
escaped_kod, escaped_ime, gettime()); // gettime = unix time, ako nemas stavi 0
mysql_tquery(MYSQL_CONNECTION, query, "OnPromoKreiran", "i", playerid);
return 1;
}
forward OnPromoKreiran(playerid);
public OnPromoKreiran(playerid) {
if (playerid == INVALID_PLAYER_ID || !IsPlayerConnected(playerid)) return 1;
new str[180], ime[MAX_PLAYER_NAME];
GetPlayerName(playerid, ime, sizeof(ime));
format(str, sizeof(str),
"{00FF00}PROMO: {FFFFFF}Igrač %s je platio %d$ i napravio kod: {FFFF00}%s",
ime, PROMO_CENA_IZRADE, TempPromoKod[playerid]);
SendClientMessageToAll(-1, str);
SendClientMessage(playerid, -1, "{00FF00}Promo kod je uspješno kreiran i sačuvan.");
return 1;
}
YCMD:napravipromokod(playerid, params[], help)
{
if (PlayerInfo[playerid][pLevel] < PROMO_MIN_LEVEL_KREIRANJE)
return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Morate biti nivo 5 ili veći da napravite promo kod!");
if (GetPlayerMoney(playerid) < PROMO_CENA_IZRADE)
return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Izrada koda košta 20.000$!");
new kod[32];
if (sscanf(params, "s[32]", kod))
return SendClientMessage(playerid, -1, "{33CCFF}Koristi: {FFFFFF}/napravipromokod [kod]");
if (Promo_JePrazan(kod))
return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Kod ne smije biti prazan!");
GivePlayerMoney(playerid, -PROMO_CENA_IZRADE);
PlayerInfo[playerid][pNovac] -= PROMO_CENA_IZRADE;
SacuvajIgraca(playerid);
format(TempPromoKod[playerid], 32, "%s", kod);
GetPlayerName(playerid, TempPromoKreator[playerid], MAX_PLAYER_NAME);
// jedan aktivni kod pa prvo brisemo pa insert
mysql_tquery(MYSQL_CONNECTION, "DELETE FROM promo_aktivni WHERE id = 1", "OnPromoObrisanZaInsert", "i", playerid);
return 1;
}
// ---------- iskoristavanje koda ----------
forward OnPromoProvjera(playerid);
public OnPromoProvjera(playerid) {
if (playerid == INVALID_PLAYER_ID || !IsPlayerConnected(playerid)) {
cache_delete();
return 1;
}
if (!cache_num_rows()) {
SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Trenutno nema aktivnih promo kodova!");
cache_delete();
return 1;
}
new kodDb[32], kreatorIme[MAX_PLAYER_NAME];
cache_get_row(0, 0, kodDb, sizeof(kodDb));
cache_get_row(0, 1, kreatorIme, sizeof(kreatorIme));
cache_delete();
if (strcmp(TempPromoUneseni[playerid], kodDb, true) != 0) {
SendClientMessage(playerid, -1, "{...
... (content truncated)