Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, programuoju šiokį tokį mini žaidimuką su serveriu ir kilo toks klausimas. Tarkim noriu padaryt, kad žaidėjas galėtų atlikti kokį nors veiksmą tik kas kažkiek laiko. Norėdamas atlikti veiksmą, jis siunčia į serverį užklausą, serveris patikrina ar jam galima atlikti veiksmą ir gražina atsakymą į clientą, o toliau clientas daro ką reikia. Taigi, kaip reikia sukurti uždelsimą, kad serveris gavęs tą pačią užklausą dar nepasibaigus delsos laikui, ją atmestų ir neleistų vygdyti tam tkros komandos? Ar reiktų saugoti kažkokį paskutinės komandos užklausos laiką ar galima kaip nors kitaip tikrinti?

Redagavo Fantasya
Nuoroda į pranešimą
Dalintis kituose puslapiuose

1 variantas: kiekvieną kartą tikrint.

2 variantas: klientui gavus "bloga atsakymą", tiesiog užblokuoti pačiame kliente leidimą užklausai tam tikram laikui.

kad kiekviena karta reikia tikrinti, tai taip, bet kokiu pavidalu man reik issaugoti kintamaji ir kokia informacija jame patalpinti, kad galeciau zinoti ar jau galima leisti vygdyti kazkokia komanda ar ne?

 

o antro varianto tai nenoreciau rinktis. zinoma zaidima kuriu tik for fun, bet visvien norisi kurti, jog nebutu jokiu exploitu cliento puseje.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gali integer ,gali datetime priklauso nuo laiko kiek tau reik apriboti. O kalbant apie 2 variantą jokio exploito nebūtų, tiesiog apsisaugotum nuo bereikalingų užklausų į servo pusę :)

na taip, uzklausas uzblokuoti galima, kad bereikalingai servo nedroztu, bet siaip jei kokiam programeriui prades nagai nieztet, tai susisuks programele ir manipuliuos su savo pasigamintu clientu susizvejojes reikiamus packetus. reikia pasiruosti visiems atvejams :D aisku ta zaidima zaisiu tik as pats ar dar keletas mano draugu, bet programuoju ne del rezultato, o del tobulejimo programavime :)

 

o del datetime, tai man reiktu ivairiai. reiktu uzdelsi gal viena ar dvi sekundes, ejimui per koordinates zemelapyje ir siek tiek didesnius laiko tarpus ~15 sekundziu ivairiu ginklu naudojimui.

Redagavo Fantasya
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kas ieškos tas ras (kaip apeiti) :D O jeigu realiai žiūrint, tai neverta apkrauti tiek kliento tiek serverio bereikalingom apsaugom. Geriausias būdas apsisaugoti pasidaryti monitoringo sistemą ir stebėti tiek užklausų dažnumą, tiek žaidimo ekonomiką, tiek tikrinti gaunamus paketus. Tokiu atveju visada galima pastebėti kas išsiskiria iš minios :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Serveris pereina per visus zaidejus per tam tikra laiko tarpa, pvz. 600 ms. (ne fps zaidimui).

 

Zinoma, jis saugo kiekvieno zaidejo duomenis (visus timerius ir t.t.). Jei tau reikia 10 sekundziu delay, pasidarai kintamaji byte, ir jame kiekviena cikla didini ji, nuo 1 iki 10. Kai pasiekia 10, atlieki kazkoki veiksma ir nusiunti klientui atnaujinima, kad tas veiksmas jau ivyko ir ji reikia atvaizduoti.

 

Jei klientas siuncia uzklausa, patikrini, ar ja galima prideti (ar laikas nuo paskutinios uzklausos jau praejo). Jei galima, issiunti klientui paketa, kad atliktu visas reikiamas animacijas, ir serveryje uzstatai 'timeri'.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

o kokiu pavidalu ta timeri reiktu pasidaryti?

Pvz kiekvienas zaidejas turi savo objekta, kuriame yra funkcija tick() ar kazkas panasaus, kurioje visi laikai padidinami ir i ja kreipiasi pagrindine funkcija kas tam tikra laika (siuo atveju 600ms).

 

O pati ji atrodytu taip:

 

 

void Zaidejas::tick() {
if (sovimoLaikas > 0) {
	sovimoLaikas--;
	if (sovimoLaikas <= 0) {
		atliktiSovima();
		sovimoLaikas = 0;
	}	
}
}

 

 

Aisku, cia primityvus variantas, jei nori sudetingiau bet universaliau - darai uzduociu sistema, i kuria idejus koki tai veiksma ji atliktu po kazkiek laiko ir t.t., bet cia gerokai sudetingiau :)

Redagavo Plx
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...