Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Klausimas del script


Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1188 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Taigi, norėčiau paklausti,

kaip reiktų padaryti, jog 00:00 būtų atnaujinama informacija.

Tarkim šiandien pražaistas laikas?

 

Taip pat norėčiau paklausti ar visų SQL versijų pagrindinės komandos vienodos?
Ir kuom skiriasi 33 versija ir 41 versija...
 

Už pagalbą galiu atsilyginti +REP

Nuoroda į komentarą
Dalintis per kitą puslapį

42 minutes prieš, #Dziastin# parašė:

Taigi, norėčiau paklausti,

kaip reiktų padaryti, jog 00:00 būtų atnaujinama informacija.

Tarkim šiandien pražaistas laikas?

 

Taip pat norėčiau paklausti ar visų SQL versijų pagrindinės komandos vienodos?
Ir kuom skiriasi 33 versija ir 41 versija...
 

Už pagalbą galiu atsilyginti +REP

1. Timeris

2. https://github.com/pBlueG/SA-MP-MySQL/releases

Nuoroda į komentarą
Dalintis per kitą puslapį

Na tai visų pirma pasidaryk timerį, užteks tokio (OnGameModeInit) funkcijoje:

SetTimer("Resetinimas", 60000, true);

Ir tada taip:

f_public: Resetinimas()
{
    new 
    	Hours,
        Minutes
    ;
    gettime(Hours, Minutes);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    	if(Hours == 00 && Minutes == 00)
      	{
            mysql_query("UPDATE `zaidejai` SET `zaidMinutes` = '0'");
            zaidInfo[i][prazaista] = 0;
      	}
    }
    return 1;
}
      

Ir viskas, cikle pasikeisk savo mysql kintamuosiuos, ir veiks.

Jeigu nori cikle taip pat gali pasidaryti daugiau duomenų kuriuos nori nuskaityti į 0 žaidėjui.

Nuoroda į komentarą
Dalintis per kitą puslapį

Nuo 33 versijos atsirado ORM sistema, tai 33 ir 41 versijos funkcijos iš principo nesiskiria, jos vienodos. Tačiau 41 versija yra labiau ištobulinta nei 33, turinti papildomų funkcionalumų, logiška, taip?

Visos funkcijos: https://github.com/pBlueG/SA-MP-MySQL/wiki

 

prieš 2 valandas(-ų), script79 parašė:

Na tai visų pirma pasidaryk timerį, užteks tokio (OnGameModeInit) funkcijoje:


SetTimer("Resetinimas", 60000, true);

Ir tada taip:


f_public: Resetinimas()
{
    new 
    	Hours,
        Minutes
    ;
    gettime(Hours, Minutes);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    	if(Hours == 00 && Minutes == 00)
      	{
            mysql_query("UPDATE `zaidejai` SET `zaidMinutes` = '0'");
            zaidInfo[i][prazaista] = 0;
      	}
    }
    return 1;
}
      

Ir viskas, cikle pasikeisk savo mysql kintamuosiuos, ir veiks.

Jeigu nori cikle taip pat gali pasidaryti daugiau duomenų kuriuos nori nuskaityti į 0 žaidėjui.

Neturi logikos tavo skriptas. Iš vienos pusės kaip ir teisinga, bet tu to nesuvokdamas taip padarei, todėl gavosi labai blogai.

 

Visų pirma, tai ciklą reikėtų sukti iki GetPlayerPoolSize(), paimant paskutinio žaidėjo ID. Įsivaizduok, jei MAX_PLAYERS nustatyta į 100, o vidurnaktį, serveryje žaidžia tik 10 žaidėjų? Tai vietoj to, kad ciklą suktum kelis kartus mažiau, tu to nedarai ir suki jį visiškai be reikalo.

Ir išvis, protingiausia būtų naudoti Y_Less iterator (aka foreach) biblioteką, kad apskritai išvengti bereikalingo ciklo sukimo ir būtų iteruojama tik per egzistuojančius žaidėjus, tr. priemones ir pan.

Antras dalykas, tai tavo ciklas ne to, kad suksis bereikalingai dėl MAX_PLAYERS, tai jis dar suksis ir kiekvieną valandą, nes serverio laiką tu tikrini ciklo viduje. Ciklas turėtų būti if statement viduje ir būti sukamas tik tuomet, kai yra 00:00. Ir šiaip, nerekomenduočiau tikrinti ar minutės lygios 0, kadangi tu serverį gali paleisti, sakykim, 15:32, timeris nuo to laiko ir pradės veikti ir vykdys nurodytą funkciją kas valandą, kas reiškia, kad tavo nuresetinimas niekada net neįvyks, nes tuo metu, kai funkcija tikrins serverio laiką ir bus 0 valandų, tai minučių bus ne 0, o 25-40.

Ir trečias, turbūt pats blogiausias dalykas (tuo pačiu ir teisingiausias, bet panaudotas labai blogoj vietoj), yra tai, kad mysql updaty query tu siunti kiekvieną kartą sukdamas ciklą - naudojant prieš tai buvusį pavyzdį su MAX_PLAYERS - 100 kartų. Tragiška, baisu. Ko tu turbūt nesupranti yra tai, kad taip, užtenka vieną kartą išsiųsti tokią užklausą 

UPDATE `players` SET `some_value` = 0

ir ji atnaujins absoliučiai visų įrašų `some_value` reikšmes, nereikia nurodyti žaidėjo ID ar žaidėjo vardo. Taip, kad galutinis kodas, atrodytų šitaip:

forward Timer();
public Timer()
{
	int h;
	gettime(h);

	// tikrinam tik valandas
	if (h == 0)
	{
		// update query siunčiam tik vieną kartą
		mysql_tquery(connection, "UPDATE `players` SET `some_value` = '0'");

		// iteruojam per prisijungusius žaidėjus
		foreach (new player : Player)
		{
			playerDB[ player ][ some_value ] = 0;
		}
	}
}

 

Redaguota , nario MartynasK
Nuoroda į komentarą
Dalintis per kitą puslapį

prieš 22 valandas(-ų), script79 parašė:

Na tai visų pirma pasidaryk timerį, užteks tokio (OnGameModeInit) funkcijoje:


SetTimer("Resetinimas", 60000, true);

Ir tada taip:


f_public: Resetinimas()
{
    new 
    	Hours,
        Minutes
    ;
    gettime(Hours, Minutes);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    	if(Hours == 00 && Minutes == 00)
      	{
            mysql_query("UPDATE `zaidejai` SET `zaidMinutes` = '0'");
            zaidInfo[i][prazaista] = 0;
      	}
    }
    return 1;
}
      

Ir viskas, cikle pasikeisk savo mysql kintamuosiuos, ir veiks.

Jeigu nori cikle taip pat gali pasidaryti daugiau duomenų kuriuos nori nuskaityti į 0 žaidėjui.

Nieko gero nebus su tokiu kodu, jis nors ir įsikels ką tu parašei jam tai neveiks ir išmes klaidų. Realiai tai ką parašė @MartynasK būtų geriausiai padaryti, plius. Gale kodo nieko nepamiršai? Toks jausmas lyg būtum šitą kodą iš kokio GM paėmęs ir numetęs lyg pats padarytum, na nieko nesakau. Bet tiesiog jei žmogus nežino kaip ką daryt tai bent iki pabaigos paaiškink. Nes pvz.: 

mysql_query("UPDATE `zaidejai` SET `zaidMinutes` = '0'");
            zaidInfo[i][prazaista] = 0;
      	}
    }
    return 1;
}

Jo modas nesupras nei “prazaista” nei “zaidejai” nei “zaidMinutes” ir nei “zaidInfo”. Tokiu atveju galėjai nepatingėt parašyt, kad žmogus pasikeistų mysql lentelių pavadinimą jei ne toks pats ir susikūrtų naują column “zaidMinutes” ir t.t. Žodžiu labai sunkiai tu čia pakūrei. Viską galima buvo paprasčiau padaryt. Būčiau žalias tai nesuprasčiau nei kur nei ką kelt ir vistiek nors būtum tu jam šitą kodą normaliai paaiškinęs kur ką įkelt jis jam neveiktų del nepabaigtų esminių dalykų.

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1188 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...