GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

DERS 1: LUA Temelleri (Meta, Function, Event, İlk Script)

Başlatan Oner, 19 Mayıs 2020, 20:59:18

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Oner

Bu rehberimde LUA'ya yeni başlamış kişilere LUA hakkında ve genel kodlama hakkında bilgiler vereceğim. Öncelikle Assembly gibi dillerin haricinde çoğu kodlama dilinin mantığı aynıdır, sadece yazımı farklıdır. Yani LUA öğrenerek diğer dilleri daha çabuk öğrenebilirsiniz. Önce LUA den bahsederek MTA'da nasıl script yazacağınızı göstereceğim.

MTA'daki tüm function ve eventler farklı olduğu için (anlatacağım) kodlama yapılırken hiç bir MTA scripterı LUA'nın resmi wikisini kullanmaz. Bunun yerine kodları alabileceğiniz ve detayları öğrenebileceğiniz MTA Wiki adresi bulunur. Script yazmadan önce scriptle ilgili temel şeyleri öğrenmelisiniz.

SCRIPT OLUŞTURMA
MTA Dizini > server > mods > deathmatch > resources bölümüne girin ve Türkçe karakter, boşluk veya değişik karakterler içermeyen bir klasör açın. Klasörün içinde script dosyalarınız, resimleriniz/videolarınız (opsiyonel, kullanılacaksa) olur. Ancak meta.xml dosyası olmazsa o script tanıtılmamış olacaktır.

META
Tüm scriptlerde gördüğünüz meta.xml dosyasıdır. Bu dosya yazılan scriptlerin tanıtılmasını sağlar.

<meta>
     <info author="Oner" name="İlk scriptim" description="Bu benim ilk scriptim" />
     <script src="client.lua" type="client" />
     <script src="server.lua" type="server" />
</meta>

Şimdi bu dosyada yazanları tanıyalım.

<meta>: meta dosyasının açıldığını ve kapandığını gösterir. Kodlamada bir şey kapatılmak için en sona aynı şey yazılarak / koyulur. Burada metayı kapatmak için </meta> kullandık.
Info Author (Opsiyonel: Script başkaları tarafından kullanılırsa yapımcısını göstermek için kullanılır.
Name: Scriptinize bir ad belirlemek için kullanılır.
Description: Scriptinize açıklama yazmak için kullanılır.
Metada daha fazlası var, sadece temel olarak yazdım. Detaylara MTA wikiden kısa bir araştırma sonucu ulaşabilirsiniz. Ayrıca meta tagları ve dosyalarınız haricindekiler (author, name vs.) koyulması şart değildir. Yani yorulmak istemezseniz şunu da yazıp bırakabilirsiniz:

<meta>
    <script src="client.lua" type="client" />
    <script src="server.lua" type="server" />
</meta>

Client dosyalarının sonuna type="client", server dosyalarının sonuna ise aynı şekilde type="server" yazılmalıdır. Böylece oyuna onun server yada client dosyası olduğu tanımlanır. (Client ve serverin anlamını anlatacağım.) Ayrıca scriptinizde resim, video veya .lua harici dosyalar kullandıysanız sunucu bunu algılamaz. Onu algılatmak için ise script alta <file src="konum"/> eklemeliyiz. Eğer dosyalarınız çıkmıyorsa bir klasör açıp dosyaları içine eklemeyi deneyin. Meta ise şöyle düzeltilecektir: <file src="klasoradi/resim.png"/> Artık meta kullanımını öğrenmiş olmalıyız, yavaş yavaş kodlamaya geçelim. Tabii ki direkt sistem yazamayacaksınız. Önce ne nedir, ne işe yarar onu öğreneceğiz.

FUNCTION VE EVENT
Script dosyanızın içerisinde bir scripti başlatmak için fonksiyon kullanılır. Fonksiyonun işlev anlamına geldiğini biliyorsunuzdur. MTA Wiki'den bir kod alıp function olarak kullanacağız. Şimdi karışık olarak kullanımı öğrenirken bir script yazacağız. Tek tek açıklayacağım, bu scriptin işlevi ise oyuncuya oyuna girdiğinde mesaj yazmak olacak. Dikkat, fonksiyonlarda Türkçe karakter ve değişik harfler, boşluk kullanılmaz.

Event ise gerçekleştirmek istenen eylemin başlangıcının nasıl tetikleneceğini belirtir. Örneği incelediğinizde daha iyi anlayacaksınız.

function hosgeldin()Burada fonksiyonumuzu çağırarak scripti başlattık.

oyuncuadi = getPlayerName(source)Evet, hoşgeldin mesajında oyuncunun adını vermesini istiyoruz. Bu yüzden denklem kullanıyoruz. Bu kod getPlayerName(source)'un -source işlemi gerçekleştiren oyuncu demektir- karşılığıdır ve ileride oyuncuadi nı kullanacağız.

outputChatBox ("==========================", source,255,255,255,true)
outputChatBox ("#CC0000 [STARFALL CnR] #009900 Aramıza hoş geldin, " ..oyuncuadi.. ".", source,255,255,255,true)
outputChatBox ("==========================", source,255,255,255,true)

Böyle yapma zorunluluğunuz yok ama görsellik için yaptım. Şimdi ise yazanları açıklayayım:

outputChatBox chate bir şey yazdırmaya yarar. Daha sonra () açıyoruz ve içerisine iki tane " koyarak araya gitmesini istediğimiz yazıyı yazıyoruz. Türkçe karakter ve benzeri bu bölgede serbesttir.
source ise bu yazılanın sadece en altta yazılacak -sonra göreceksiniz- eventi gerçekleştiren (yani oyuna giren) oyuncuya verilmesini sağlar. Başkalarına görünmesi için Görünürlük adlı MTA yazısına bakabilirsiniz.
255, 255, 255 yazısı ise rengi temsil eder. MTAnın ana rengi budur. Kalmasını tavsiye ederim çünkü tüm yazının rengini değiştirmektedir. Yazıda teker teker renk değiştirmek isterseniz "" ın arasındaki yazıda renk değişmesi istenen yerlere hex kodu koyabilirsiniz.
"#CC0000 [STARFALL CnR] #009900 Aramıza hoş geldin, "..oyuncuadi.. burada ise daha önceden oyuncuadi nı getPlayerName(source) -oyuncunun adını çekme-ye tanımlamıştık. Burada dikkat etmemiz gereken bunlarda belirtilen yeni nesnenin başına ve sonuna .. koymak. (..oyuncuadi.. şeklinde) Ayrıca bunu yazarken " " ın içine yazmamanız gerektiğini bilmelisiniz. Sonradan devam edecekseniz yeniden " " açarak cümleyi devam ettirebilirsiniz.
true nin Türkçe meali ise doğrudur, en sona true yazarsanız görünür, false yazarsanız görünmez.

Fonksiyonlarımızı bitirince ise sadece düz end yazarak bitirildiğini oyuna bildiriyoruz. Kod şöyle görünmeli:
function hosgeldin()
oyuncuadi = getPlayerName(source)
outputChatBox ("==========================", source,255,255,255,true)
outputChatBox ("#CC0000 [STARFALL CnR] #009900 Aramıza hoş geldin, " ..oyuncuadi.. ".", source,255,255,255,true)
outputChatBox ("==========================", source,255,255,255,true)

end

Ama hala bitmedi, henüz oyuncunun ne yaptığında bu mesajı görmesi gerektiğini ayarlamadık. End son anlamına gelse de bu fonksiyonun sonudur. Burada ise event devreye girer.
addEventHandler ( "onPlayerJoin", root, hosgeldin )yazarız, şimdi ise anlamlarına tek tek bakalım:

addEventHandler bir event eklemek için yapılması gerekeni anlatır.
onPlayerJoin ise oyuncunun sunucuya girişinde tetiklemesini sağlar
root ise hangi oyuncu katılırsa katılsın bu mesajı sadece kendisine vermesini sağlar. Source yaparsanız bu mesaj kendisine dahil kimseye gitmez.
hosgeldin yazarak ta fonksiyonumuzu belirtip kapatıyoruz.



function hosgeldin()
oyuncuadi = getPlayerName(source)
outputChatBox ("==========================", source,255,255,255,true)
outputChatBox ("#CC0000 [STARFALL CnR] #009900 Aramıza hoş geldin, " ..oyuncuadi.. ".", source,255,255,255,true)
outputChatBox ("==========================", source,255,255,255,true)

end
addEventHandler ( "onPlayerJoin", root, hosgeldin )

Çıktımız ise böyle, tabii bunun tetiklenmesi için oyuna tekrar girmemiz gerekiyor. Bu örnekte start yaptıktan sonra reconnect atmayı unutmamalısınız.

Ayrıca Sublime Text adlı programı da kullanmanızı öneririm. Daha iyi bir görünüm sağlar ve açılan tagları kapatmanızda yardım eder. Örneğin <meta> yazarsanız kendisi mesaj ekleyerek </meta> yazar. Aynısı başka diller için de geçerlidir.
Son düzenlenme: 19 Mayıs 2020, 21:05:20 Oner
Discord: Ascendency#7970

xSodyum

LessLethal06 - xSodyum

%80 Mapper

%40 Photoshop CS6

%3 Blender

%1 Pawn Coder(Pawn giriş)

%5 Lua(Giriş)

%60 BBCode

En çok ilgilendiğim legal birlik Fire Department

ghostemane

root herkesi temsil eder, getRootElement() doğrusudur.


Oner

Alıntı yapılan: ghostemane - 19 Mayıs 2020, 21:09:40
root herkesi temsil eder, getRootElement() doğrusudur.

Zaten rootun herkesi temsil ettiğini söylemiştim..

Discord: Ascendency#7970

Kleachynas

South Country Roleplay - Level 1 Helper
Grafik & Dizayn

Hattori


Oner

Discord: Ascendency#7970

Cowingwa


Impeccable


BuRMiLLaT

Konu hoş ve anlatım çok iyi olmuş bilgilendirici yani sağol bu konuda :)


ReveR

wuttt

BuRMiLLaT