Monaco RP - Script template

Započeo Slade, April 14, 2023, 23:54:46 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Naziv: Monaco RP - Script template


Izvorni (Skripter): realnaith


Slike: GitHub Repo


Skripter: Slade (Danis)


Download: GitHub Repo


Scan: //


Dodatno:

Iz dosade sam skinuo myserver i počeo da radim na modu. Malo sam fakat i posvetio pažnje pa sam napravio neke stvari u TD-ovima (dealership, char registration) koje su mi i oduzele malo vremena. Kod u nekim segmentima može bolje, poput zajedničkih update funkcija, umjesto da se parametri TD-ova ažuriraju samo po potrebi, ali nije ni loš. Potrebno je završiti dealership sistem (uvezati potvrdom ugovora kupovinu vozila i dodjelu istog igraču) te naravno car ownership sistem sam od sebe (lock vozila, parking, lociranje itd). Mod ima već kreirano čuvanje i funkciju za isto (kao i loadanje).
Mod koristi ORM bazirano čuvanje u SQLu (core je bio ini) pomoću kojeg je omogućeno početnicima koji ne razumiju sql da lako dodaju/spreme neki podatak u neku tabelu, primjer je tu na korisnicima, kao i spremanju/učitavanju vozila.
Kod je separiran u fajlove, ili kao što se kod nas kaže, "modularan  :D", svaki fajl ima hookuje ono što mu treba, doduše neki su fajlovi samo biblioteke nekih handlera, dok handleri sami po sebi rade uglavnom neovisno od gamemode-a (osim ako su potrebni neki podatci o igraču).

Ako je ko voljan završiti nedovršeno (otvoriti PR na repou sa izmjenama), nastaviti raditi (forkati/cloneati repo), feel free to do it!
Kada uhvatim vremena možda i sam završim ako ništa ovo započeto, a možda bude i nekog versioninga.

Hvala na kontribuciji, nadam se da ce neko nastaviti ovo dalje i napraviti nesto brutalno, kad vec mi oldtajmeri nemamo volje xD

Vrhunski. 8)

Šta očekivati od tebe brt, veoma dobro za nekoga ko želi pokrenuti nešto ili naučiti nešto novo..
svaka čast i nadam se iskreno da će biti koji update još


Hvala vam :D Gledat cu da ako nista WIP stvari vremenom azuriram, a mozda bude i versioninga


odlicno odradjeno

melem batoo
Sunce greje lagano šetam se po Voždovcu
Moja kučka i ja, furam je na povodcu
Zove se Lola i nije nešto lepa
Ali meni daće lapo kada dokopa se repa
Rođena na ulici, dolazi iz geta
I zato je gangsta kučka, a ne starleta
Zahvaljujući njoj meni dignuta je đoka
Krov je spušten, vožnjica od bloka do bloka
I ako glumiš mangupa jebaće ti mamicu
U tašni nema lak za nokte, ali ima palicu
Odrasla na Medaku, iz huda je sestra
Nijedna Snoopova kučka nije tol'ko gangsta
Za nju sam 'Pac, ona moja je Madonna
Ako znaš još neku takvu javi mi preko fona
I kada njesra izbije ona ne vata pištolja
Već nabada na prvu jer je gangsta drolja



Dobar
#ROBY
#ONLINE !
----- NIKAD PORAZ SAMO LEKCIJA! -----


Citat: realnaith poslato April 15, 2023, 00:06:45 PRE PODNE
Hvala na kontribuciji, nadam se da ce neko nastaviti ovo dalje i napraviti nesto brutalno, kad vec mi oldtajmeri nemamo volje xD

Vrhunski. 8)

Ako si ti oldtajmer ja sam Nikola Tesla.
skazy42O

Reborn - Developer & Owner
- www.reborn-ogc.com

Koncept je dobar. Svidja mi se sto kroz primjere zelite pomoci pocetnicima u skriptanju.

Medjutim, svi pocetnici bi trebali da uce ispravno da pisu kod od pocetka. Razlog tome je da kasnije ne bi morali da se odvikavaju od losih navika (kao sto sam ja morao, kao sto su svi koji su pocetli nesto ranije sa skriptanjem morali zbog nedostatka zainteresovanosti tada iskusnijih skriptera da pomognu na pravi nacin, cast izuzecima).

Par primjera cu navesti:

1. "E_PLAYERS" enum je totalno nepotreban. Ako vec zelis da radis modularan mod u PAWNu postoje static global varijable kojima je scope jedan fajl. Recimo da imamo modul karaktera - "character". Modul karaktera bi trebao da sadrzi neke base statistike karaktera (recimo): novac u dzepu, level, exp. Varijable koje ce cuvati novac, level i exp napravi u scope fajla (static) i napravi getter funkcije za svaku stvar koju zelis share izmedju modula. Prednost ovoga je sto getter funkcija moze u sebi da sadrzi logiku koju bi, bez iste, morao da ponavljas kroz svaki fajl.

2. "bool:Auth(playerid, level)" imena funkcija su bitna. Ime funkcije treba da opisuje ono sto funkcija radi. Ova funkcija provjerava da li je igracev "AdminLevel" veci od zadanog levela. Mnogo bolje ime funkcije bi bilo npr. "IsPlayerAuthorized(playerid, adminLevel)".

3. Tagovi. Da bi simulirali neki type-checking sistem u PAWNu postoje tagovi (neki od njih su npr. PlayerText, Text3D, Text). Prelaskom na open.mp includeove (stdlib) vidjecete da je 90% "magicnih" brojeva tagovano. Dobar primjer u ovom modu bi bila funkcija "GetPlayerMoneyEx(playerid, pay_type = 0)". Parametar "pay_type" bi bio idealan clan da se taguje. Recimo:
enum e_PAY_TYPE {
PAY_TYPE_POCKET,
PAY_TYPE_BANK
};

GetPlayerMoneyEx(playerid, e_PAY_TYPE:pay_type = PAY_TYPE_POCKET) {
//....
}

Razlog je to sto cete kad-tad doci u situaciju da se zapitate da li je 0 novac u dzepu ili novac u banci. Ovo je pogotovo slucaj kada radite na code-base koji je nekoliko desetina (ili stotina) hiljada linija.

4. Izbjegavajte nazivanje funkcije sa sufixima kao sto su "Ex". "Ex" je los sufix i ne govori nam nista o tome sta funkcija konkretno radi. Primjer: "PlayerNameEx(playerid)" -> "ReturnPlayerNameEx(playerid)".

5. Macro:

#define PRESSED(%0) \
    ( newkeys & %0 == %0 && oldkeys & %0 != %0 )

Ovaj kod je nepravilan. Iako se vama cini da je ovo "(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))" uzasno zbog zagrada - zagrade su tu sa razlogom.
Praktican primjer:

#define MULTIPLY(%0,%1) %0*%1

new result = ADD(4 + 1, 2); // Ocekujemo: (4+1)*2=5*2=10, a dobicemo: 4+1*2=4*2=8.

// Fix:
#define MULTIPLY(%0,%1) (%0)*(%1)


6. Jos se zelim dotaci ORM-a. ORM je, iako nefleksibilan, ok za jednostavne queryje. Svakako, novi skripteri ne bi trebali da koriste ovo ako ne znaju osnove MySQL-a. I kada naucite osnove onda cete znati zasto je SQL superiorniji od INI cuvanja. Nazalost, ovo sto si ti predlozio (koriscenje sistema sa kojim nisu upoznati) dovodi do onih databaza schema koje ima 90% servera (svi znamo o cemu pricam).

Ovo je sada trenutno u trendu sa bazom sql, pa preporucujem svima koji rade ove godine, krenite ovim projektom jer dovoljno ima za pocetak i za zavrsetak.
Odlican posao...sve pohvale! 8)

i am king!

Citat: // xunder poslato April 16, 2023, 01:55:17 PRE PODNE
Koncept je dobar. Svidja mi se sto kroz primjere zelite pomoci pocetnicima u skriptanju.

Medjutim, svi pocetnici bi trebali da uce ispravno da pisu kod od pocetka. Razlog tome je da kasnije ne bi morali da se odvikavaju od losih navika (kao sto sam ja morao, kao sto su svi koji su pocetli nesto ranije sa skriptanjem morali zbog nedostatka zainteresovanosti tada iskusnijih skriptera da pomognu na pravi nacin, cast izuzecima).

Par primjera cu navesti:

1. "E_PLAYERS" enum je totalno nepotreban. Ako vec zelis da radis modularan mod u PAWNu postoje static global varijable kojima je scope jedan fajl. Recimo da imamo modul karaktera - "character". Modul karaktera bi trebao da sadrzi neke base statistike karaktera (recimo): novac u dzepu, level, exp. Varijable koje ce cuvati novac, level i exp napravi u scope fajla (static) i napravi getter funkcije za svaku stvar koju zelis share izmedju modula. Prednost ovoga je sto getter funkcija moze u sebi da sadrzi logiku koju bi, bez iste, morao da ponavljas kroz svaki fajl.

2. "bool:Auth(playerid, level)" imena funkcija su bitna. Ime funkcije treba da opisuje ono sto funkcija radi. Ova funkcija provjerava da li je igracev "AdminLevel" veci od zadanog levela. Mnogo bolje ime funkcije bi bilo npr. "IsPlayerAuthorized(playerid, adminLevel)".

3. Tagovi. Da bi simulirali neki type-checking sistem u PAWNu postoje tagovi (neki od njih su npr. PlayerText, Text3D, Text). Prelaskom na open.mp includeove (stdlib) vidjecete da je 90% "magicnih" brojeva tagovano. Dobar primjer u ovom modu bi bila funkcija "GetPlayerMoneyEx(playerid, pay_type = 0)". Parametar "pay_type" bi bio idealan clan da se taguje. Recimo:
enum e_PAY_TYPE {
PAY_TYPE_POCKET,
PAY_TYPE_BANK
};

GetPlayerMoneyEx(playerid, e_PAY_TYPE:pay_type = PAY_TYPE_POCKET) {
//....
}

Razlog je to sto cete kad-tad doci u situaciju da se zapitate da li je 0 novac u dzepu ili novac u banci. Ovo je pogotovo slucaj kada radite na code-base koji je nekoliko desetina (ili stotina) hiljada linija.

4. Izbjegavajte nazivanje funkcije sa sufixima kao sto su "Ex". "Ex" je los sufix i ne govori nam nista o tome sta funkcija konkretno radi. Primjer: "PlayerNameEx(playerid)" -> "ReturnPlayerNameEx(playerid)".

5. Macro:

#define PRESSED(%0) \
    ( newkeys & %0 == %0 && oldkeys & %0 != %0 )

Ovaj kod je nepravilan. Iako se vama cini da je ovo "(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))" uzasno zbog zagrada - zagrade su tu sa razlogom.
Praktican primjer:

#define MULTIPLY(%0,%1) %0*%1

new result = ADD(4 + 1, 2); // Ocekujemo: (4+1)*2=5*2=10, a dobicemo: 4+1*2=4*2=8.

// Fix:
#define MULTIPLY(%0,%1) (%0)*(%1)


6. Jos se zelim dotaci ORM-a. ORM je, iako nefleksibilan, ok za jednostavne queryje. Svakako, novi skripteri ne bi trebali da koriste ovo ako ne znaju osnove MySQL-a. I kada naucite osnove onda cete znati zasto je SQL superiorniji od INI cuvanja. Nazalost, ovo sto si ti predlozio (koriscenje sistema sa kojim nisu upoznati) dovodi do onih databaza schema koje ima 90% servera (svi znamo o cemu pricam).


1. Slazem se, ali gamemode je izmjenio tok par puta pa shodno tome nisam od pocetka se vodio time konceptom, na kraju krajeva, spomenuo sam descriptionu da je kod podjeljen u fajlove (not really modular, vec da tako kazu kod nas haha), nisam zamislio mod da radi na pokusaj koncepta OOP-a in first hand, samo sam koristio hooks da podjelim u fajlove.
2. U potpunosti se slazem, naming nije bas bio idealan iskreno, ali mi je lakse bilo kucati Auth nego IsPlayerAuthorized npr, na generalno team based projektima naming je vazan tako da se slazem, cas posla za replace tho
3. Znam za tagove, medjutim generalno pay type sam zamislio kao koncept, ali ga nikad nisam zavrsio, niti uvezao sa dealershipom sto je bio plan, sistem kupovine pa i samog kesiranja nije gotov, pa samim time ni to kao part of it
4.Zab sam vec sta radi taj funcion ali mislim da je ime without underscore, u svakom slucaju ljepse mi je zvucalo nego ReturnPlayerNameWithoutUnderscore
5. Ovo je ostalo sa izvornog moda
6. Agree, ali gledajuci strukturalno na trenutne sisteme kojih i nema puno, dovoljni su insert update i delete query-i, slazem se i da omogucavanjem jos lakseg sql koristenja nece nekome pruziti detaljniji i bolji uvod u sql, samo sam koristio ORM jer se ne koristi, query bi svakako rucno konstruisao da sam trebao da joinujem nesto, etc..