Pretraga

Pritisnite Enter za pretragu ili Escape za zatvaranje

Zaključano

sistem promo koda

Započeo Glozx
pre 1 nedelju
89
pregleda
22
postova
Ova tema je zaključana. Samo moderatori i administratori mogu odgovarati.
Glozx.skripter
Rookie
pre 1 nedelju
M Ө M Σ N Z I wrote on February 23, 2026, 8:06 pm:
Glozx.skripter wrote on February 23, 2026, 8:02 pm:
M Ө M Σ N Z I wrote on February 23, 2026, 7:51 pm:

2026 godina i jos se koristi Y_INI

pa sta drugo bolje Y_INI neko dini

Jesi nekad cuo za mysql

iam mysql ali koristim ga za neke druge stvari cuvanje atmova kuca itd

Momenzi Scripter
Made Man
20
pre 1 nedelju
Glozx.skripter wrote on February 23, 2026, 8:22 pm:
M Ө M Σ N Z I wrote on February 23, 2026, 8:06 pm:
Glozx.skripter wrote on February 23, 2026, 8:02 pm:
M Ө M Σ N Z I wrote on February 23, 2026, 7:51 pm:

2026 godina i jos se koristi Y_INI

pa sta drugo bolje Y_INI neko dini

Jesi nekad cuo za mysql

iam mysql ali koristim ga za neke druge stvari cuvanje atmova kuca itd

Dva razlicita storage-a very nice bro ( dosta serem moj ti je savjet prebaci sve na jedan storage jer ovako pola stvari tamo pola onamo, mislim kako hoces moj savjet jedan storage i pici dalje i jos jedna stvar mysql je dosta brzi u odnosu na y_ini. ).

Pikaboot je besplatna, open-source platforma za strimovanje muzike. Bez reklama, bez zaključanih funkcija i bez kompromisa sa kvalitetom zvuka ( 24-bit FLAC ).

Foxyyy
Made Man
34
pre 1 nedelju

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, "{FF0000}Greška: {FFFFFF}Kod nije ispravan!");
        return 1;
    }
    new mojeIme[MAX_PLAYER_NAME];
    GetPlayerName(playerid, mojeIme, sizeof(mojeIme));
    if (strcmp(mojeIme, kreatorIme, true) == 0) {
        SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Ne možete iskoristiti vlastiti promo kod!");
        return 1;
    }
    // da ne bi duplo dao nagradu ako netko brzo 2x /promo
    if (PlayerInfo[playerid][pPromo] == 1) return 1;

    PlayerInfo[playerid][pNovac] += PROMO_NAGRADA_KORISNIK;
    GivePlayerMoney(playerid, PROMO_NAGRADA_KORISNIK);
    PlayerInfo[playerid][pPromo] = 1;
    SacuvajIgraca(playerid);
    new str[128];
    format(str, sizeof(str), "{00FF00}Promo: {FFFFFF}Uspješno ste iskoristili kod i dobili %d$!", PROMO_NAGRADA_KORISNIK);
    SendClientMessage(playerid, -1, str);

    // kreatoru 5k - ako je online daj odmah, ako nije update u bazi pa kad se uloguje ima
    new kreatorId = -1;
    for (new i = 0; i < MAX_PLAYERS; i++) {
        if (!IsPlayerConnected(i)) continue;
        GetPlayerName(i, mojeIme, sizeof(mojeIme));
        if (strcmp(mojeIme, kreatorIme, true) == 0) {
            kreatorId = i;
            break;
        }
    }
    if (kreatorId != -1) {
        GivePlayerMoney(kreatorId, PROMO_NAGRADA_KREATOR);
        PlayerInfo[kreatorId][pNovac] += PROMO_NAGRADA_KREATOR;
        SacuvajIgraca(kreatorId);
        format(str, sizeof(str), "{00FF00}Promo: {FFFFFF}Neko je iskoristio vaš kod! Dobili ste %d$.", PROMO_NAGRADA_KREATOR);
        SendClientMessage(kreatorId, -1, str);
    } else {
        new query[256], escaped_ime[MAX_PLAYER_NAME * 2];
        mysql_escape_string(kreatorIme, escaped_ime);
        format(query, sizeof(query),
            "UPDATE %s SET %s = %s + %d WHERE %s = '%s'",
            MYSQL_TABELA_IGRACA, MYSQL_KOLONA_NOVAC, MYSQL_KOLONA_NOVAC, PROMO_NAGRADA_KREATOR,
            MYSQL_KOLONA_IME, escaped_ime);
        mysql_tquery(MYSQL_CONNECTION, query);
    }
    return 1;
}

YCMD:promo(playerid, params[], help)
{
    if (PlayerInfo[playerid][pPromo] == 1)
        return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Već ste iskoristili promo kod!");
    if (PlayerInfo[playerid][pLevel] < PROMO_MIN_LEVEL_ISKORISTI)
        return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Morate biti nivo 3 ili veći!");
    new uneseniKod[32];
    if (sscanf(params, "s[32]", uneseniKod))
        return SendClientMessage(playerid, -1, "{33CCFF}Koristi: {FFFFFF}/promo [kod]");
    if (Promo_JePrazan(uneseniKod))
        return SendClientMessage(playerid, -1, "{FF0000}Greška: {FFFFFF}Unesite kod!");
    format(TempPromoUneseni[playerid], 32, "%s", uneseniKod);
    mysql_tquery(MYSQL_CONNECTION, "SELECT kod, kreator_ime FROM promo_aktivni WHERE id = 1", "OnPromoProvjera", "i", playerid);
    return 1;
}

Glozx.skripter
Rookie
pre 1 nedelju
sparrowww.aMx wrote on February 23, 2026, 8:43 pm:

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)

da ali ne znam ja taj mysql koristiti koristim za firme neke tako stvari kuce stanoven is spec

ne znam ja najbolje sa skriptanjem trenutno pravim mod drugu msm nece biti nista spec ali iam dobrih ideja cai i ono uzimam sa ovog foruma cak sam i od tebe jednu vio za presretaca uradio sam slicno ugl hvatas onog ko prekoraci brzinu ako ne stane salje mu automatski tiket ako ne radi ispravljacu ali ne bitno ugl hvala na savetu

anzor
Rookie
17
pre 1 nedelju

Pustite momka. Ako nemate ništa pametno za pisati, zanemarite ovaj post. Svako radi kako mu je lakše. MYSQL ili INI... Neće on praviti server sa 150k linija da bi mu MYSQL toliko pomagao. Vjerovatno je momak napisao najbolje što zna i možda je upravo očekivao od vas da ga ispravite u kodu, a ne da mu nabrajate takve gluposti.

Momenzi Scripter
Made Man
20
pre 1 nedelju
anzor wrote on February 23, 2026, 9:10 pm:

Pustite momka. Ako nemate ništa pametno za pisati, zanemarite ovaj post. Svako radi kako mu je lakše. MYSQL ili INI... Neće on praviti server sa 150k linija da bi mu MYSQL toliko pomagao. Vjerovatno je momak napisao najbolje što zna i možda je upravo očekivao od vas da ga ispravite u kodu, a ne da mu nabrajate takve gluposti.

Radi ovakvih kao ti ljudi pogresno nauce da rade (joooj pa de nemoj ga, pa nemoj ovo nemoj ono) brate svaka kritika mozda nekad bude od pomoci. Nemoj misliti da nekog mrzim samo kazem onako kako jest, ako je momak pocetnik neka se nauci barem kako treba.

Pikaboot je besplatna, open-source platforma za strimovanje muzike. Bez reklama, bez zaključanih funkcija i bez kompromisa sa kvalitetom zvuka ( 24-bit FLAC ).

RomaNn
Made Man
pre 5 dana

Pozdrav @Glozx ,

Kolko sam ja shvatio ovo je skripta koju si ti podelio sa nama.

Ovaj podforum je Pitanja i Pomoc. Svoju skriptu mozes podeliti ovde
Sa svim slikama i sve.

Tema ide lock.

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava