Szerző Téma: Alapok II - Az Objectek  (Megtekintve 4091 alkalommal)

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Dátum: 2014. május 31. - 14:31:04 »
+2 Show voters
Bevezetõ
Sziasztok. Mivel már nagyon rég volt, hogy publikáltam az Alapok I-et (kiemelteknél látható) úgy gondoltam folytatom ezt tovább és megpróbálok továbbra is segítséget nyújtani a kezdõ scripterek számára, akik most kezdték eme szkriptelési nyelvet. Ezekrõl az \"Alapok\" sorozatról annyit kell igazából tudni, hogy megpróbálom olyan fõbb témakörökre bontani a tutorialokat amik a SA:MP-ban tényleg fontosak és alap dolgok és a leírásaim által legyen egy átlátható útmutató ahhoz, hogy jobban megértsék a kezdõk egy szervernek az alapköveit a nagy függvény és eljárás rengetegben. Leszögezném, hogy én nem újramagyarázom az adott témakörhöz tartozó függvényeket/eljárásokat hanem bemutatnám azokat a mûveleteket az adott témakörbõl amelyek egy alapkövei egy játékmódnak.. :)
Mik az objectek?
Az objectek, vagy magyarul objektumok informatikai értelmezése a valóság mintájára alkotott tárgyak tömkelege. (Wikipédia szerint :D ). Én ezt inkább úgy mondanám, hogy egy adott játékban lévõ tárgyak, épületek és minden egyes kis elem összessége jelenti az objektumokat. A San Andreasnak is vannak objektumai ahogy minden játéknak is, mivel ha nem volnának akkor csak egy üres tér volna, az meg már nem játék. Nos a San Andreasból adódóan a SA:MP (San Andreas Multi Player - ebbõl is láthatjuk hogy a San Andreas objektumaira épülõ multiplayer ) is használ objektumokat. Ezeknek az objektumoknak van egy listájuk amit ide kattintva nézhettek meg. Nos, ha láttok egy pályát ami nincs benne az alap San Andreasba azokat nevezzük \"map\" -nak, amelyet egy illetõ alkotott több objetkumot összekovácsolva. A mapokat aztán publikálják is, amit itt tudtok elérni és, ha majd legörgettek elmagyarázom, hogyan lehet ezeket berakni a saját szerverünkbe.

Kis plusz információ (akit nem érdekel az olvasson tovább a következõ alponthoz): Mivel az objektumok nem csak úgy vannak maguktól azt\' kész, ezeket grafikus gárdából álló emberek készítik. Mivel ilyet tanulok ezért elmondhatom, hogy igazán nehéz feladat. Az egész egy szoborfaragáshoz hasonlítható, van egy tömb azt az illetõk különbözõ programok segítségével alakítják (Legnépszerûbb 3D Max, de vannak ennél bonyolultabbak is) az így kapott \"szobrot\" vagy \"objektumot\" pedig, hogy egyszerûen mondjam: \"megfestik\". Ez a festés úgy történik, hogy ráraknak egy fényképet, ezt materialnak nevezik. Ezt a materialt kétféle  módon készítik az elsõ az, hogy megtetszik nekik pl egy fal színe, lefotózzák, felrakják gépre és a képet méretezve rárakják az adott objektumra. A másik, az amit például egy rajzfilmnél is látható, hogy õk készítik el ezt az anyagmintát mondjuk egy képszerkesztõvel (photoshop) és ezt használva borítják rá a kész objektumra, így lesz a rajzfilmeknek például kellemes hatásuk amelyek a régi rajzolt rajzfilmekre emlékeztetnek (legalábbis engem). Az így kapott munkát importálják az adott játék grafikus motorjába (az objektek összessége alkotja a grafikus motort) és így történik az is, hogy mi tudunk menni CJ házához missziózni. Ezt csak érdekességképp írtam le, hogy lássátok milyen nehéz mûvelet egy object készítése.


Érdekességek:


- Mappolás terén az emberi kreativitás határtalan ami a SA:MP-ot illeti. Vannak borzasztó jó mapperek is akik több hónapot beleölve foglalkoznak akár egy adott munkával, hogy az minél reálisabb vagy szebb esetleg kidolgozottabb legyen. Véleményem szerint a mi fórumunkon is vannak nagyon jó mapperek, de vannak olyanok is akik szerintem bátran ki lehet jelenteni a legjobbak. Õket még a külföldi nagy \"anyafórum\" is elismeri, ilyen például : Lusta vagy Jackob.


-A Sampfórumon eddigi ittlétem alatt minden évben van/volt pályakészítõ liga, amelyen összemérhetik az emberek mappolási tudásukat, amelyeket bírók osztályoznak. A gyõztes megkapja a kellõ elismerést és tiszteletet valamint egy ranghoz is jut, amelyen mindenki láthatja, hogy õ lett a nyertes. A jelenlegi mapper liga is tart a finálé van, így innen is sok sikert szeretnék kívánni a résztvevõknek.




MTA

Hogyan készítsünk mapot objetkebõl?

Bármilyen meglepõ is, de a SA:MP-hoz nem jár külön pályák készítéséhez való program. Ezt az emberek általában MTA-ban (a San Andreas másik multiplayer ágazatában) szokták megtenni amiben van külön lehetõség direkt erre a feladatra. Az MTA-t innen tudjátok letölteni.

A mappoláshoz nem igazán fûznék hozzá semmit ugyanis a youtube videók tömkelege áll elõttetek ahhoz, hogy megnézzétek, hogyan is kell csinálni + MTA -ban is van egy alap tutorial hozzá ami segít nektek. Ez egy viszonylag jó videó a mappolásról:
https://www.youtube.com/watch?v=DJT4WF3ssK4

Ha közösen akartok mappolni barátaitokkal akkor
itt egy remek leírás arról, hogy hogyan tudjátok beüzemelni szervereteket és hozzá tartozik az MTA feltelepítése is.

Ha esetleg többet akartok foglalkozni az MTA-val a fórum alfórumainál megtaláljátok.


Kész map konvertálása

Az MTA-ban másképp vannak a függvények, mint SA:MP-ba így ez az objekteknél sincs másképp. Ha kész van a mappunk azt át kell konvertálni, hogy a SA:MP is elfogadja. Ehhez nem kell semmilyen programot letöltenünk, elég, ha felmegyünk az internetre és használjuk egy adott weblap segítségét.
Ide kattintva máris elérhetitek az oldalt, beillesztitek az elmentett mappotok fájlját kiválasztjátok az adott paraméternél melyiket részesítenétek elõnyben és már máris kész az átkonvertált fájl!



SA:MP

SA:MP objektek

Nos, úgy vélem bõven elég volt, hogy hogyan kell külsõ programmal mappolni, de mivel mi SA:MP-al foglalkozunk akkor beszéljünk róla. A SA:MP-nak valóban nincs külsõ programja amivel lehetne mappolni, de függvényeink azok biza\' vannak és használni is tudjuk õket. Sokatokban felmerül a kérdés, hogy miért kell függvény az objektekhez ha nem lehet vele mappolni, erre egy egyszerû választ tudok adni: mi van akkor ha nem mappolásra kell? Ha nem arra kell a függvények tökéletesek feladatuk ellátására. Lentebb példákkal fogom illusztrálni, hogy milyen esetben tökéletes a használatuk. No, de ahhoz, hogy mappoljunk ismernünk kell a függvényeket amikkel lehetõségünk akad rá. Szerencsére a fórum tagjai voltak olyan kedvesek, hogy lefordították õket angolról magyarra is, így
ide kattintva el is érhetitek õket, de leszögezném, hogy a függvényekhez kapcsolódnak eljárások is! Azokat itt éritek el.

Gondolom logikus, de megemlítem: A SA:MP objecteket nem kell konvertálni, mivel a SA:MP saját függvényeibõl épül fel így azokat a \"rendszer\" elfogadja.


Mit kell tudni a SA:MP objektekrõl? Buktató

A SA:MP-ban a kezdõk számára van egy nagy buktató része a dolognak, ezért gondoltam segítek azzal, hogy erre szánok egy fejezet címet. :)


Szóval ez igazán lényeges dolog: Ha létrehozunk egy objectet annak lesz object
ID-ja és lesz object MODEL idja.

Az object ID: Ez jelöli az eddig létrehozott objectek közül az új object helyét. Ezt egyszerûen úgy lehet elmagyarázni, ha példát alkalmazunk mellé: Van eddig 5 létrehozott objected, létrehozol egy újat az lesz a hatodik, ennek az utolsó objectnek az ID-ja 6 lesz, mivel ez a hatodik object. Ha újat hozol létre annak már 7 lesz mert az a hetedig object.

A Model ID : Ez a model ID jelöli azt, hogy egy adott objektumnak melyik modelje. Minden objectnek más a modelje és ez különbözteti meg õket. Hogy jobban megértsétek: Van CJ háza ami mondjuk a 20-as model ID, és van egy sima fal ami mondjuk a 125-ös modelid. A két object különbözik, mert az egyik egy ház a másik csak egy fal. Ha mi a falat akarjuk létrehozni akkor ahhoz a 125-ös modelid-t fogjuk írni.

Nos, ebbõl adódóan vannak olyan függvények ahol object ID-t kér és vannak olyan függvények ahol Model ID-t. Az Object és Model ID is az objectek megkülönböztetésére szolgál, csak a lista (amit fent linkeltem az objectID-rõl) teljesen más közöttük ezért meg kell nézni mindig jól a függvény paraméterét, hogy melyiket kéri tõlünk, így biztosan a kívánt objektumot kapjuk meg.


Ez a buktató amit sokan elkövettek, mint hiba aztán csak néztek, mint a moziba, hogy miért nem az adott objectet kapták meg, legalábbis saját esetembõl kiindulva.


Leggyakrabban használt függvények

Bár azt mondtam, hogy nem a függvények bemutatásáról fog szólni, hanem a használatukról, ám gondoltam megemlítek pár
nagyon fontos függvényt az objectek kezelésére röviden pár mondatban. Még mielõtt elkezdeném elmondanám azt amit az Alapok I-ben, hogy nem csak ezeket a \"fontos object függvényeket\" kell tudni, hanem az összeset, mert lehetséges, hogy nektek több függvényt kellesz használnotok és többet kellesz összekombinálnotok ahhoz hogy elérjétek a kívánt eredményt, és ez a PAWN nyelv szépsége, hogy kis dolgok összességébõl alkotni egy nagyot. Ha hiányzik egy kis fogaskerék akkor a nagy is szétesik, mint az óra, ezért ne legyetek restek tanuljátok meg az összeset, mert különben nem tudjátok, majd elkészíteni amit szeretnétek.

Szóval amelyek szerintem a legalapabbak és legfontosabbak:


CreateObject - Ennek a segítségével tudjuk létrehozni az objecteketet |
Magyar leírás | Angol leírás

DestroyObject - Ezzel tudjuk kitörölni egy létrehozott objectünket (! Figyelem nem alap objectet, hanem amit mi hoztunk létre) |
Magyar leírás | Angol leírás

MoveObject - Ez a függvény segít a már létrehozott objectjeink mozgatásában |
Magyar leírás | Angol leírás

StopObject - Ezzel állítjuk le az object mozgatását |
Magyar leírás | Angol leírás

AttachObjectToPlayer - Hozzácsatolhatunk Objectet a játékoshoz |
Magyar leírás | Angol leírás

Objectek gyakorlatban lévõ használata

Elérkeztünk szépen lassan ide is. Bemutatnék pár olyan dolgot az objectekkel, amelyek észrevételeim szerint nagyon sokszor merülnek fel az objectekkel kapcsolatban itt fórumon.


Figyelem: Egyes példákat nem én készítettem, csupán magyarázatot írok hozzájuk. A példák tesztelve voltak.


Sorompó készítés



#include <a_samp> // A SA:MP alap könyvtára, errõl beszéltem Alapok I-ben
#define PRESSED(%0) \\
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))  // Errõl nem volt szó, szóval egy kis gyorstalpaló: Ez a definálás szolgál arra, hogy megtudjuk, hogy ha lenyomunk egy gombot melyik az. Definálás egyik formája az Alapok I-ben volt szó róla, hogy máshogy is fel lehet használni õket
new sorompo; // Ez a változó szolgál arra, hogy az objectet könnyebben tudjuk kezelni az egyes paramétereknél
forward close(); // A timerhez tartozó eljárás. Alapok I-ben bõvebben van szó róla.
 
public OnFilterScriptInit() // Filterscript betöltõdésekor
{
        print(\"\\n--------------------------------------\");
        print(\" Betöltött a Filterscript\");
        print(\"--------------------------------------\\n\");
        sorompo = CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Itt tesszük egyenlõvé a változót az objectel, ezzel felruházva rá az object értékeit így egyszerûbben lehet lesz, majd kezelni az adatokat, nem kellesz folyamatosan kiírni a createobjectet mindenhová.
        CreateObject(1250,1543.5999800,-1490.0999800,13.6000000,0.0000000,0.0000000,0.0000000); // Társítottak az objectekhez egy másikat, hogy szebben nézzen ki, igazából haszna nincs csak szebbé és reálisabbá teszi azt.
        return 1;
}
public OnFilterScriptExit() // Filterscript leállítása, ha leállítja valaki, de nem játszik közre most a sorompóhoz
{
        return 1;
}
 
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)  // Használjuk azt a függvényt amely arra szolgál, hogy lekérdezi a lenyomott billentyûzeteket
{
        if(IsPlayerInRangeOfPoint(playerid, 5.0, 1543.5000000, -1490.5999800, 14.5000000)) // Ellenõrizzük hogy az illetõ a sorompó közelében tartózkodik-e
        {
                if(PRESSED(KEY_HANDBRAKE)) // Ha lenyomta a spacet (ami a handbreake - kézifék ) vagy amire az illetõ állította be. Megjegyzés: Csak a SA:MP által engedélyezett gombokat lehet lekérdezni, nem az összeset (olvassatok bõvebben utána az eljárásnak és ott le van szépen írva)
                {
                MoveObject(sorompo, 1543.5, -1490.5999, 14.5, 1, 0, 0, 90); // Elmozdítjuk az objectet - Jelen esetben felnyitódik
                SetTimer(\"close\", 4000, false);  // Beállítunk egy idõzítõt, amely során 4 másodperc múlva újra lezáródik
                }
        }
        return 1;
}
public close() // Az idõzítõhöz tartozó eljárás - Ez akkor lép fel, amikor az idõzítõ elindul, jelen esetbe amikor megnyomta az illetõ a gombot
{
        MoveObject(sorompo, 1543.5000000 ,-1490.5999800, 14.5000000, 1,  0, 270, 90); // 4 másodperc eltelte után az objectet visszamozgatjuk eredeti poziciójába
        return 1;
}

 

Útlezárás - Ezt én dobtam össze fél perc alatt, mentést nem tartalmaz, mivel szerintem még a kezdõk számára ez bonyolult így csak az alap dolgokat mutatom meg rajta. A filterscript tartalmazza a ZCMD-t mint parancsfeldolgozó, errõl az Alapok I-ben tudtok olvasni bõvebben. Tökéletes példa az alap funkciók (függvények más néven) használatáról :)


CMD:utlezaras(playerid, params) // Ez a parancs amit beírnak elõjön a feladat
{
  new Float:X, Float:Y, Float:Z; // Létrehozunk három változót amibe a koordinátákat mentjük majd
                GetPlayerPos(playerid, Float:X, Float:Y, Float:Z); // Lekérdezzük a játékos pozícióját és elmentjük a koordináták értékét a változókba
                CreateObject(978,Float:X,Float:Y,Float:Z, 0.0, 0.0, 96.0); // Létrehozzuk az objectet a megadott koordinátákkal
                return 1; // És ennyi kész is az útlezárásunk, végtelenül egyszerû mûvelet
}

 

Konkrétan erre a kettõre emlékeztem, de hozzászólás formájában még ajánljatok sablon példákat amik sokat merültek fel és megírom õket.


Streamer Plugin

Bár lehet, hogy sokan nem hallottak róla, de ez a SA:MP object, jármû és hasonló kezelés során a leghasznosabb plugin.  Bár be fogom linkelni kurta leírását, de egy kis magyarázatot én is fûznék hozzá: Ez a plugin arra való, hogy kikorrigálja a rendes objectekkel való hibákat.


A rendes objectek limitálva vannak, nagy számba laggot okoznak, ez abból adódik, hogy folyamatosan látszódnak és nem csak a játékos tartományában. A streamer pluginnal viszont ezt korrigálja, bármennyi objectet létrehozhatunk és ugyan arra épül fel, mint a manapság modern nagy Open-Word-os játékoknál is. A játékos köré képzeljünk egy kört, ebben a körben megjelenítõdnek objectek amiket a játékos láthat, ha arrébb megy és az adott object kiesik a player látószögös körébõl akkor törlõdnek az objectek ezzel elérve azt, hogy memóriát szabadítanak fel és így bármennyit létre lehet hozni belõlük. Ez a streamer plugin nyitja is és ezért is nagyon hasznos, amiért hála Incognitonak a készítõnek!


Kurta leírásáért
kattints ide

Hivatalos leírásért
pedig ide



SA:MP In Game Map Editorok

Bár azt mondtam, hogy SA:MP-ban nem lehet mappolni, ám az emberi kreativitás is határtalan :D Nem önfényezés céljából írom, csak a témához kapcsolódik, több embernek köztük nekem is sikerült függvények összekovácsolásából megírni egy olyan filterscriptet amely során elérhetõvé váltak az MTA Mappolási funkciói 1-2  plusz extrával, vagyis lehet létrehozni objecteket, menteni, törölni, object lista van, editelni rajtuk, streamer plugint használ és hasonló finomságok. Persze meg kell említeni, hogy közel sem olyan pontos, mint azt MTA, de legalább úgy-ahogy 80% SA:MP tetõ alá tudtuk hozni.


Mivel másnak nem tudom milyen a munkája, mert nem próbáltam, de a sajátomról tudom, hogy minden extra megvan rajta és viszonylag friss a többi elõdhöz képest ezért merem ajánlani egy kipróbálásra, ha esetleg nem megy az MTA. A témáról
itt tudtok olvasni



KÖZÖS

Több object betöltése szerverünkbe

Ezt útóljára hagytam, mivel mindkettõnél ugyan az a metódus. Az MTA-nal megkapjuk az objecteket konvertáláskor, SA:MP-nál meg elkészítjük mi õket szóval megvannak mindkét esetbe a objektumok. A  kérdés az, hogy hogyan lehetséges õket betölteni.


Két megoldását tudom az objectek betöltésének:



1. OnGameModeInit/Filterscript betöltésekor
2. Fájlból való betöltés

 

1. OnGameModeInit/Filterscript betöltésekor

Ez az egyszerûbb metódus, amikor betölt a filterscript / gamemode alatta csak hozzá kell adni az objectek létrehozását és meg is van!:D


Igy néz ki, ha nem logikus:




public OnGameModeInit()
{
print(\"\\n--------------------------------------\");
print(\" Gamemode Betoltve utána objectek\");
print(\"--------------------------------------\\n\");
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // A fenti példákból szedtem az objectet
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Igy nincs logikája, de a ti objectjeiteknek mások lesznek a koordinátái
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Azokat pontosan így berakjátok
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // És Gamemodeotok betöltésével be fogja õket tölteni
return 1; // Vagy Filterscriptel
}

 

Ez az egyszerû megoldás én ezt javasolnám.


Fájlból való betöltés

Ez nehezebb, de leírom, hogy legyen egy alternatíva is: Object lérehozáskor le kell menteni az adatokat egy lementõvel amelyek az adatokat fájlba írják. Ezek után kell egy betöltõ ami kiolvassa a fájlból az adatokat, majd létrehoz objecteket a fájlban szereplõ adatokkal.


Én ezeket így csináltam meg:




stock Objecttolt(filename[])
{
        if(!fexist(filename)) printf(\"Az adott fájl nem létezik, hozd létre ezzel a címmel (objectek - és txt legyen), ha nem hozza létre autómatikusan!\");
                new
        buff[256],
        object,
        WorldID,
                IntID,
                Float: X,Y,Z, rX, rY, rZ,
                szamlalo,
                File:opened = fopen(\"objectek.txt\", io_read);
       if(opened)
                {
                   while(fread(opened, buff))
                   {
                                    unformat(buff,\"dffffffdd\", object, X, Y, Z, rX,rY,rZ,WorldID, IntID);
                                        printf(\"%d, %f, %f, %f, %f, %f, %f, %d, %d\", object, X, Y, Z, rX,rY,rZ, WorldID, IntID );
                                        CreateDynamicObject(object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID, IntID, -1, 200.0);
                                    szamlalo++;
                                   }
                                   fclose(opened);
        }
                return 1;
}
stock Objectment(filename[],object,Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ, WorldID, IntID)
{
   new File:opened,
   sorok[256];
   format(sorok,sizeof(sorok), \"%d %f %f %f %f %f %f %d %d \\r\\n\", object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID,IntID);
   opened = fopen(filename, io_append);
   fwrite(opened, sorok);
   fclose(opened);
   return 1;
}

 

Adatok mentésénél pedig így néz ki:



Objectment(\"objectek.txt\",GetPVarInt(playerid,\"omodelid\"),Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ,WorldID,IntID);

 

Aki erre bõvebben kíváncsi az töltse le, lesse meg :)


Kezdõknek nem ajánlott maradjanak nyugodtan az elsõnél, jobb megoldás az, ez csak alternatív felvázolás, de ezt is ritkán alkalmazzák :)




Végszó

Elnézést, hogy hosszúra sikeredett de minõségi tartalmat akartam legyártani, ahol jól érthetõen magyarázok ezért ehhez sok sor kellett. Remélem kialakult bennetek egy átfogó vélemény, ha esetleg hibát / ötletet akartok javasolni vagy esetleg kérdésetek merült fel írjatok nyugodtan és bõvítek és válaszolok rájuk. Kösz, hogy elolvastátok :)


Üdv

RusH!
« Utoljára szerkesztve: 2014. július 03. - 12:24:52 írta RusH. »

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #1 Dátum: 2014. május 31. - 15:59:43 »
0 Show voters
Gyönyörû ! Ilyen leírás hiányzik! ;) Nagyon szép lett, le a kalappal!

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #2 Dátum: 2014. május 31. - 18:20:13 »
0 Show voters
Köszönöm szépen próbálok minõséget produkálni, csak sajnos nagyon kevés szabadidõm akad gépezésre és akkor általában kikapcsolódásra használom :)
Amúgy pár helyesírási hiba javítva + a vége felé az elsietett részt átfogalmaztam kissé + erõsen gondolkozok a 0.3c e és hasonló modifikált objectekrõl egy kis alfejezetet szánni, bár nem tudom, hogy az a témakörhöz kapcsolódik avagy sem?

Nem elérhető Loren

  • 1401
  • Ex Moderátor
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #3 Dátum: 2014. május 31. - 18:42:51 »
0 Show voters
Nagyon szép leírás, gratulációm RusH!

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #4 Dátum: 2014. május 31. - 18:44:24 »
0 Show voters
Thanks, remélem ilyen a kezdõknek és a célközönségnek is :)

Alapok II - Az Objectek
« Válasz #5 Dátum: 2014. május 31. - 22:03:03 »
0 Show voters
Köszi, RusH.! ^-^

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #6 Dátum: 2014. június 01. - 18:20:15 »
0 Show voters
Szívesen vagy nem tudom mit írjak rá :D

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #7 Dátum: 2014. május 31. - 14:31:04 »
0 Show voters
Bevezetõ
Sziasztok. Mivel már nagyon rég volt, hogy publikáltam az Alapok I-et (kiemelteknél látható) úgy gondoltam folytatom ezt tovább és megpróbálok továbbra is segítséget nyújtani a kezdõ scripterek számára, akik most kezdték eme szkriptelési nyelvet. Ezekrõl az \"Alapok\" sorozatról annyit kell igazából tudni, hogy megpróbálom olyan fõbb témakörökre bontani a tutorialokat amik a SA:MP-ban tényleg fontosak és alap dolgok és a leírásaim által legyen egy átlátható útmutató ahhoz, hogy jobban megértsék a kezdõk egy szervernek az alapköveit a nagy függvény és eljárás rengetegben. Leszögezném, hogy én nem újramagyarázom az adott témakörhöz tartozó függvényeket/eljárásokat hanem bemutatnám azokat a mûveleteket az adott témakörbõl amelyek egy alapkövei egy játékmódnak.. :)
Mik az objectek?
Az objectek, vagy magyarul objektumok informatikai értelmezése a valóság mintájára alkotott tárgyak tömkelege. (Wikipédia szerint :D ). Én ezt inkább úgy mondanám, hogy egy adott játékban lévõ tárgyak, épületek és minden egyes kis elem összessége jelenti az objektumokat. A San Andreasnak is vannak objektumai ahogy minden játéknak is, mivel ha nem volnának akkor csak egy üres tér volna, az meg már nem játék. Nos a San Andreasból adódóan a SA:MP (San Andreas Multi Player - ebbõl is láthatjuk hogy a San Andreas objektumaira épülõ multiplayer ) is használ objektumokat. Ezeknek az objektumoknak van egy listájuk amit ide kattintva nézhettek meg. Nos, ha láttok egy pályát ami nincs benne az alap San Andreasba azokat nevezzük \"map\" -nak, amelyet egy illetõ alkotott több objetkumot összekovácsolva. A mapokat aztán publikálják is, amit itt tudtok elérni és, ha majd legörgettek elmagyarázom, hogyan lehet ezeket berakni a saját szerverünkbe.

Kis plusz információ (akit nem érdekel az olvasson tovább a következõ alponthoz): Mivel az objektumok nem csak úgy vannak maguktól azt\' kész, ezeket grafikus gárdából álló emberek készítik. Mivel ilyet tanulok ezért elmondhatom, hogy igazán nehéz feladat. Az egész egy szoborfaragáshoz hasonlítható, van egy tömb azt az illetõk különbözõ programok segítségével alakítják (Legnépszerûbb 3D Max, de vannak ennél bonyolultabbak is) az így kapott \"szobrot\" vagy \"objektumot\" pedig, hogy egyszerûen mondjam: \"megfestik\". Ez a festés úgy történik, hogy ráraknak egy fényképet, ezt materialnak nevezik. Ezt a materialt kétféle  módon készítik az elsõ az, hogy megtetszik nekik pl egy fal színe, lefotózzák, felrakják gépre és a képet méretezve rárakják az adott objektumra. A másik, az amit például egy rajzfilmnél is látható, hogy õk készítik el ezt az anyagmintát mondjuk egy képszerkesztõvel (photoshop) és ezt használva borítják rá a kész objektumra, így lesz a rajzfilmeknek például kellemes hatásuk amelyek a régi rajzolt rajzfilmekre emlékeztetnek (legalábbis engem). Az így kapott munkát importálják az adott játék grafikus motorjába (az objektek összessége alkotja a grafikus motort) és így történik az is, hogy mi tudunk menni CJ házához missziózni. Ezt csak érdekességképp írtam le, hogy lássátok milyen nehéz mûvelet egy object készítése.


Érdekességek:


- Mappolás terén az emberi kreativitás határtalan ami a SA:MP-ot illeti. Vannak borzasztó jó mapperek is akik több hónapot beleölve foglalkoznak akár egy adott munkával, hogy az minél reálisabb vagy szebb esetleg kidolgozottabb legyen. Véleményem szerint a mi fórumunkon is vannak nagyon jó mapperek, de vannak olyanok is akik szerintem bátran ki lehet jelenteni a legjobbak. Õket még a külföldi nagy \"anyafórum\" is elismeri, ilyen például : Lusta vagy Jackob.


-A Sampfórumon eddigi ittlétem alatt minden évben van/volt pályakészítõ liga, amelyen összemérhetik az emberek mappolási tudásukat, amelyeket bírók osztályoznak. A gyõztes megkapja a kellõ elismerést és tiszteletet valamint egy ranghoz is jut, amelyen mindenki láthatja, hogy õ lett a nyertes. A jelenlegi mapper liga is tart a finálé van, így innen is sok sikert szeretnék kívánni a résztvevõknek.




MTA

Hogyan készítsünk mapot objetkebõl?

Bármilyen meglepõ is, de a SA:MP-hoz nem jár külön pályák készítéséhez való program. Ezt az emberek általában MTA-ban (a San Andreas másik multiplayer ágazatában) szokták megtenni amiben van külön lehetõség direkt erre a feladatra. Az MTA-t innen tudjátok letölteni.

A mappoláshoz nem igazán fûznék hozzá semmit ugyanis a youtube videók tömkelege áll elõttetek ahhoz, hogy megnézzétek, hogyan is kell csinálni + MTA -ban is van egy alap tutorial hozzá ami segít nektek. Ez egy viszonylag jó videó a mappolásról:
https://www.youtube.com/watch?v=DJT4WF3ssK4

Ha közösen akartok mappolni barátaitokkal akkor
itt egy remek leírás arról, hogy hogyan tudjátok beüzemelni szervereteket és hozzá tartozik az MTA feltelepítése is.

Ha esetleg többet akartok foglalkozni az MTA-val a fórum alfórumainál megtaláljátok.


Kész map konvertálása

Az MTA-ban másképp vannak a függvények, mint SA:MP-ba így ez az objekteknél sincs másképp. Ha kész van a mappunk azt át kell konvertálni, hogy a SA:MP is elfogadja. Ehhez nem kell semmilyen programot letöltenünk, elég, ha felmegyünk az internetre és használjuk egy adott weblap segítségét.
Ide kattintva máris elérhetitek az oldalt, beillesztitek az elmentett mappotok fájlját kiválasztjátok az adott paraméternél melyiket részesítenétek elõnyben és már máris kész az átkonvertált fájl!



SA:MP

SA:MP objektek

Nos, úgy vélem bõven elég volt, hogy hogyan kell külsõ programmal mappolni, de mivel mi SA:MP-al foglalkozunk akkor beszéljünk róla. A SA:MP-nak valóban nincs külsõ programja amivel lehetne mappolni, de függvényeink azok biza\' vannak és használni is tudjuk õket. Sokatokban felmerül a kérdés, hogy miért kell függvény az objektekhez ha nem lehet vele mappolni, erre egy egyszerû választ tudok adni: mi van akkor ha nem mappolásra kell? Ha nem arra kell a függvények tökéletesek feladatuk ellátására. Lentebb példákkal fogom illusztrálni, hogy milyen esetben tökéletes a használatuk. No, de ahhoz, hogy mappoljunk ismernünk kell a függvényeket amikkel lehetõségünk akad rá. Szerencsére a fórum tagjai voltak olyan kedvesek, hogy lefordították õket angolról magyarra is, így
ide kattintva el is érhetitek õket, de leszögezném, hogy a függvényekhez kapcsolódnak eljárások is! Azokat itt éritek el.

Gondolom logikus, de megemlítem: A SA:MP objecteket nem kell konvertálni, mivel a SA:MP saját függvényeibõl épül fel így azokat a \"rendszer\" elfogadja.


Mit kell tudni a SA:MP objektekrõl? Buktató

A SA:MP-ban a kezdõk számára van egy nagy buktató része a dolognak, ezért gondoltam segítek azzal, hogy erre szánok egy fejezet címet. :)


Szóval ez igazán lényeges dolog: Ha létrehozunk egy objectet annak lesz object
ID-ja és lesz object MODEL idja.

Az object ID: Ez jelöli az eddig létrehozott objectek közül az új object helyét. Ezt egyszerûen úgy lehet elmagyarázni, ha példát alkalmazunk mellé: Van eddig 5 létrehozott objected, létrehozol egy újat az lesz a hatodik, ennek az utolsó objectnek az ID-ja 6 lesz, mivel ez a hatodik object. Ha újat hozol létre annak már 7 lesz mert az a hetedig object.

A Model ID : Ez a model ID jelöli azt, hogy egy adott objektumnak melyik modelje. Minden objectnek más a modelje és ez különbözteti meg õket. Hogy jobban megértsétek: Van CJ háza ami mondjuk a 20-as model ID, és van egy sima fal ami mondjuk a 125-ös modelid. A két object különbözik, mert az egyik egy ház a másik csak egy fal. Ha mi a falat akarjuk létrehozni akkor ahhoz a 125-ös modelid-t fogjuk írni.

Nos, ebbõl adódóan vannak olyan függvények ahol object ID-t kér és vannak olyan függvények ahol Model ID-t. Az Object és Model ID is az objectek megkülönböztetésére szolgál, csak a lista (amit fent linkeltem az objectID-rõl) teljesen más közöttük ezért meg kell nézni mindig jól a függvény paraméterét, hogy melyiket kéri tõlünk, így biztosan a kívánt objektumot kapjuk meg.


Ez a buktató amit sokan elkövettek, mint hiba aztán csak néztek, mint a moziba, hogy miért nem az adott objectet kapták meg, legalábbis saját esetembõl kiindulva.


Leggyakrabban használt függvények

Bár azt mondtam, hogy nem a függvények bemutatásáról fog szólni, hanem a használatukról, ám gondoltam megemlítek pár
nagyon fontos függvényt az objectek kezelésére röviden pár mondatban. Még mielõtt elkezdeném elmondanám azt amit az Alapok I-ben, hogy nem csak ezeket a \"fontos object függvényeket\" kell tudni, hanem az összeset, mert lehetséges, hogy nektek több függvényt kellesz használnotok és többet kellesz összekombinálnotok ahhoz hogy elérjétek a kívánt eredményt, és ez a PAWN nyelv szépsége, hogy kis dolgok összességébõl alkotni egy nagyot. Ha hiányzik egy kis fogaskerék akkor a nagy is szétesik, mint az óra, ezért ne legyetek restek tanuljátok meg az összeset, mert különben nem tudjátok, majd elkészíteni amit szeretnétek.

Szóval amelyek szerintem a legalapabbak és legfontosabbak:


CreateObject - Ennek a segítségével tudjuk létrehozni az objecteketet |
Magyar leírás | Angol leírás

DestroyObject - Ezzel tudjuk kitörölni egy létrehozott objectünket (! Figyelem nem alap objectet, hanem amit mi hoztunk létre) |
Magyar leírás | Angol leírás

MoveObject - Ez a függvény segít a már létrehozott objectjeink mozgatásában |
Magyar leírás | Angol leírás

StopObject - Ezzel állítjuk le az object mozgatását |
Magyar leírás | Angol leírás

AttachObjectToPlayer - Hozzácsatolhatunk Objectet a játékoshoz |
Magyar leírás | Angol leírás

Objectek gyakorlatban lévõ használata

Elérkeztünk szépen lassan ide is. Bemutatnék pár olyan dolgot az objectekkel, amelyek észrevételeim szerint nagyon sokszor merülnek fel az objectekkel kapcsolatban itt fórumon.


Figyelem: Egyes példákat nem én készítettem, csupán magyarázatot írok hozzájuk. A példák tesztelve voltak.


Sorompó készítés



#include <a_samp> // A SA:MP alap könyvtára, errõl beszéltem Alapok I-ben
#define PRESSED(%0) \\
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))  // Errõl nem volt szó, szóval egy kis gyorstalpaló: Ez a definálás szolgál arra, hogy megtudjuk, hogy ha lenyomunk egy gombot melyik az. Definálás egyik formája az Alapok I-ben volt szó róla, hogy máshogy is fel lehet használni õket
new sorompo; // Ez a változó szolgál arra, hogy az objectet könnyebben tudjuk kezelni az egyes paramétereknél
forward close(); // A timerhez tartozó eljárás. Alapok I-ben bõvebben van szó róla.
 
public OnFilterScriptInit() // Filterscript betöltõdésekor
{
        print(\"\\n--------------------------------------\");
        print(\" Betöltött a Filterscript\");
        print(\"--------------------------------------\\n\");
        sorompo = CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Itt tesszük egyenlõvé a változót az objectel, ezzel felruházva rá az object értékeit így egyszerûbben lehet lesz, majd kezelni az adatokat, nem kellesz folyamatosan kiírni a createobjectet mindenhová.
        CreateObject(1250,1543.5999800,-1490.0999800,13.6000000,0.0000000,0.0000000,0.0000000); // Társítottak az objectekhez egy másikat, hogy szebben nézzen ki, igazából haszna nincs csak szebbé és reálisabbá teszi azt.
        return 1;
}
public OnFilterScriptExit() // Filterscript leállítása, ha leállítja valaki, de nem játszik közre most a sorompóhoz
{
        return 1;
}
 
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)  // Használjuk azt a függvényt amely arra szolgál, hogy lekérdezi a lenyomott billentyûzeteket
{
        if(IsPlayerInRangeOfPoint(playerid, 5.0, 1543.5000000, -1490.5999800, 14.5000000)) // Ellenõrizzük hogy az illetõ a sorompó közelében tartózkodik-e
        {
                if(PRESSED(KEY_HANDBRAKE)) // Ha lenyomta a spacet (ami a handbreake - kézifék ) vagy amire az illetõ állította be. Megjegyzés: Csak a SA:MP által engedélyezett gombokat lehet lekérdezni, nem az összeset (olvassatok bõvebben utána az eljárásnak és ott le van szépen írva)
                {
                MoveObject(sorompo, 1543.5, -1490.5999, 14.5, 1, 0, 0, 90); // Elmozdítjuk az objectet - Jelen esetben felnyitódik
                SetTimer(\"close\", 4000, false);  // Beállítunk egy idõzítõt, amely során 4 másodperc múlva újra lezáródik
                }
        }
        return 1;
}
public close() // Az idõzítõhöz tartozó eljárás - Ez akkor lép fel, amikor az idõzítõ elindul, jelen esetbe amikor megnyomta az illetõ a gombot
{
        MoveObject(sorompo, 1543.5000000 ,-1490.5999800, 14.5000000, 1,  0, 270, 90); // 4 másodperc eltelte után az objectet visszamozgatjuk eredeti poziciójába
        return 1;
}

 

Útlezárás - Ezt én dobtam össze fél perc alatt, mentést nem tartalmaz, mivel szerintem még a kezdõk számára ez bonyolult így csak az alap dolgokat mutatom meg rajta. A filterscript tartalmazza a ZCMD-t mint parancsfeldolgozó, errõl az Alapok I-ben tudtok olvasni bõvebben. Tökéletes példa az alap funkciók (függvények más néven) használatáról :)


CMD:utlezaras(playerid, params) // Ez a parancs amit beírnak elõjön a feladat
{
  new Float:X, Float:Y, Float:Z; // Létrehozunk három változót amibe a koordinátákat mentjük majd
                GetPlayerPos(playerid, Float:X, Float:Y, Float:Z); // Lekérdezzük a játékos pozícióját és elmentjük a koordináták értékét a változókba
                CreateObject(978,Float:X,Float:Y,Float:Z, 0.0, 0.0, 96.0); // Létrehozzuk az objectet a megadott koordinátákkal
                return 1; // És ennyi kész is az útlezárásunk, végtelenül egyszerû mûvelet
}

 

Konkrétan erre a kettõre emlékeztem, de hozzászólás formájában még ajánljatok sablon példákat amik sokat merültek fel és megírom õket.


Streamer Plugin

Bár lehet, hogy sokan nem hallottak róla, de ez a SA:MP object, jármû és hasonló kezelés során a leghasznosabb plugin.  Bár be fogom linkelni kurta leírását, de egy kis magyarázatot én is fûznék hozzá: Ez a plugin arra való, hogy kikorrigálja a rendes objectekkel való hibákat.


A rendes objectek limitálva vannak, nagy számba laggot okoznak, ez abból adódik, hogy folyamatosan látszódnak és nem csak a játékos tartományában. A streamer pluginnal viszont ezt korrigálja, bármennyi objectet létrehozhatunk és ugyan arra épül fel, mint a manapság modern nagy Open-Word-os játékoknál is. A játékos köré képzeljünk egy kört, ebben a körben megjelenítõdnek objectek amiket a játékos láthat, ha arrébb megy és az adott object kiesik a player látószögös körébõl akkor törlõdnek az objectek ezzel elérve azt, hogy memóriát szabadítanak fel és így bármennyit létre lehet hozni belõlük. Ez a streamer plugin nyitja is és ezért is nagyon hasznos, amiért hála Incognitonak a készítõnek!


Kurta leírásáért
kattints ide

Hivatalos leírásért
pedig ide



SA:MP In Game Map Editorok

Bár azt mondtam, hogy SA:MP-ban nem lehet mappolni, ám az emberi kreativitás is határtalan :D Nem önfényezés céljából írom, csak a témához kapcsolódik, több embernek köztük nekem is sikerült függvények összekovácsolásából megírni egy olyan filterscriptet amely során elérhetõvé váltak az MTA Mappolási funkciói 1-2  plusz extrával, vagyis lehet létrehozni objecteket, menteni, törölni, object lista van, editelni rajtuk, streamer plugint használ és hasonló finomságok. Persze meg kell említeni, hogy közel sem olyan pontos, mint azt MTA, de legalább úgy-ahogy 80% SA:MP tetõ alá tudtuk hozni.


Mivel másnak nem tudom milyen a munkája, mert nem próbáltam, de a sajátomról tudom, hogy minden extra megvan rajta és viszonylag friss a többi elõdhöz képest ezért merem ajánlani egy kipróbálásra, ha esetleg nem megy az MTA. A témáról
itt tudtok olvasni



KÖZÖS

Több object betöltése szerverünkbe

Ezt útóljára hagytam, mivel mindkettõnél ugyan az a metódus. Az MTA-nal megkapjuk az objecteket konvertáláskor, SA:MP-nál meg elkészítjük mi õket szóval megvannak mindkét esetbe a objektumok. A  kérdés az, hogy hogyan lehetséges õket betölteni.


Két megoldását tudom az objectek betöltésének:



1. OnGameModeInit/Filterscript betöltésekor
2. Fájlból való betöltés

 

1. OnGameModeInit/Filterscript betöltésekor

Ez az egyszerûbb metódus, amikor betölt a filterscript / gamemode alatta csak hozzá kell adni az objectek létrehozását és meg is van!:D


Igy néz ki, ha nem logikus:




public OnGameModeInit()
{
print(\"\\n--------------------------------------\");
print(\" Gamemode Betoltve utána objectek\");
print(\"--------------------------------------\\n\");
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // A fenti példákból szedtem az objectet
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Igy nincs logikája, de a ti objectjeiteknek mások lesznek a koordinátái
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // Azokat pontosan így berakjátok
CreateObject(968,1543.5000000,-1490.5999800,14.5000000,0.0000000,270.0000000,90.0000000); // És Gamemodeotok betöltésével be fogja õket tölteni
return 1; // Vagy Filterscriptel
}

 

Ez az egyszerû megoldás én ezt javasolnám.


Fájlból való betöltés

Ez nehezebb, de leírom, hogy legyen egy alternatíva is: Object lérehozáskor le kell menteni az adatokat egy lementõvel amelyek az adatokat fájlba írják. Ezek után kell egy betöltõ ami kiolvassa a fájlból az adatokat, majd létrehoz objecteket a fájlban szereplõ adatokkal.


Én ezeket így csináltam meg:




stock Objecttolt(filename[])
{
        if(!fexist(filename)) printf(\"Az adott fájl nem létezik, hozd létre ezzel a címmel (objectek - és txt legyen), ha nem hozza létre autómatikusan!\");
                new
        buff[256],
        object,
        WorldID,
                IntID,
                Float: X,Y,Z, rX, rY, rZ,
                szamlalo,
                File:opened = fopen(\"objectek.txt\", io_read);
       if(opened)
                {
                   while(fread(opened, buff))
                   {
                                    unformat(buff,\"dffffffdd\", object, X, Y, Z, rX,rY,rZ,WorldID, IntID);
                                        printf(\"%d, %f, %f, %f, %f, %f, %f, %d, %d\", object, X, Y, Z, rX,rY,rZ, WorldID, IntID );
                                        CreateDynamicObject(object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID, IntID, -1, 200.0);
                                    szamlalo++;
                                   }
                                   fclose(opened);
        }
                return 1;
}
stock Objectment(filename[],object,Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ, WorldID, IntID)
{
   new File:opened,
   sorok[256];
   format(sorok,sizeof(sorok), \"%d %f %f %f %f %f %f %d %d \\r\\n\", object, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, WorldID,IntID);
   opened = fopen(filename, io_append);
   fwrite(opened, sorok);
   fclose(opened);
   return 1;
}

 

Adatok mentésénél pedig így néz ki:



Objectment(\"objectek.txt\",GetPVarInt(playerid,\"omodelid\"),Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ,WorldID,IntID);

 

Aki erre bõvebben kíváncsi az töltse le, lesse meg :)


Kezdõknek nem ajánlott maradjanak nyugodtan az elsõnél, jobb megoldás az, ez csak alternatív felvázolás, de ezt is ritkán alkalmazzák :)




Végszó

Elnézést, hogy hosszúra sikeredett de minõségi tartalmat akartam legyártani, ahol jól érthetõen magyarázok ezért ehhez sok sor kellett. Remélem kialakult bennetek egy átfogó vélemény, ha esetleg hibát / ötletet akartok javasolni vagy esetleg kérdésetek merült fel írjatok nyugodtan és bõvítek és válaszolok rájuk. Kösz, hogy elolvastátok :)


Üdv

RusH!
« Utoljára szerkesztve: 2014. július 03. - 12:24:52 írta RusH. »

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #8 Dátum: 2014. május 31. - 15:59:43 »
0 Show voters
Gyönyörû ! Ilyen leírás hiányzik! ;) Nagyon szép lett, le a kalappal!

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #9 Dátum: 2014. május 31. - 18:20:13 »
0 Show voters
Köszönöm szépen próbálok minõséget produkálni, csak sajnos nagyon kevés szabadidõm akad gépezésre és akkor általában kikapcsolódásra használom :)
Amúgy pár helyesírási hiba javítva + a vége felé az elsietett részt átfogalmaztam kissé + erõsen gondolkozok a 0.3c e és hasonló modifikált objectekrõl egy kis alfejezetet szánni, bár nem tudom, hogy az a témakörhöz kapcsolódik avagy sem?

Nem elérhető Loren

  • 1401
  • Ex Moderátor
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #10 Dátum: 2014. május 31. - 18:42:51 »
0 Show voters
Nagyon szép leírás, gratulációm RusH!

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #11 Dátum: 2014. május 31. - 18:44:24 »
0 Show voters
Thanks, remélem ilyen a kezdõknek és a célközönségnek is :)

Alapok II - Az Objectek
« Válasz #12 Dátum: 2014. május 31. - 22:03:03 »
0 Show voters
Köszi, RusH.! ^-^

Nem elérhető SnooP

  • 1798
  • SnooP
    • Profil megtekintése
Alapok II - Az Objectek
« Válasz #13 Dátum: 2014. június 01. - 18:20:15 »
0 Show voters
Szívesen vagy nem tudom mit írjak rá :D

Alapok II - Az Objectek
« Válasz #14 Dátum: 2014. szeptember 05. - 11:42:31 »
0 Show voters
Hasznos kis leírás, nagyon szép lett :) Szerintem a SA:MP Editorról is szólhattál volna pár szót, nekem jobban bejön mint az MTA editora. De azért remek leírás lett :)  :thumbsup:

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal