.

MTA-SA Çalışan Bir Script Oluşturma - Ders 3

Merhabalar,
Bu dersimizin üçüncüsüdür. Basit ve özdür.

Tüm scriptler nerededir?
MTA Server klasörüne gidin ve aşağıdaki yolu izleyin:
server/mods/deathmatch/resources

Burada bir çok .zip dosyalarını göreceksiniz. Hepsi sıkıştırılmış bir dosyadır ve oyunu başlatıldığında hepsi sunucu tarafından yüklenecektir. Biz bu ders için "script3" kullanacağız.

Şimdi bu dizinin altında olmalıdır:
server/mods/deathmatch/resources/script3/

Meta Dosyası
Kaynaktaki dosyaları belirlemek için bir meta.xml oluşturulmuştur. Şimdi bir meta.xml dosyası oluşturalım. Bunun için notepad++ kullanabilirsiniz.

meta.xml dosyasına aşağıdaki kodları girin:


<meta>
     <info author="ZoRRoM" type="script" name="Can-Armor" description="Benim 3. scriptim" />
     <script src="ders_c.lua" type="client" />
     <script src="ders_s.lua" type="server" />
</meta>


Author= Script Yapımcısını belirtir
Type= Scriptin türünü belirtir
Name= Scriptin adını belirtir
Descripton= Scriptin açıklamasını belirtir


<meta> </meta>= meta dosyasını belirtir
<info/> tagında script ile ilgili bilgiler bulunur.
<script/> tagında oluşturacağımız scriptin yolu belirtilir.


Basit Bir Script Oluşturma
Yukarıda belirttiğimiz <script/> tagının yanına yazdığımız "ders_c.lua" ve "ders_s.lua" scriptin aranacağı konum olduğundan dolayı script ismide aynı olmalıdır. Bu nedenle meta.xml ile "ders_c.lua" ve "ders_s.lua"yı aynı klasöre oluşturun.

Şimdi bunu kopyalayıp ders_c.lua'nın içine yapıştırın:
Kod: (Client-Side)
addEventHandler("onClientResourceStart", resourceRoot,
    function()
        dersWindow = guiCreateWindow(368, 265, 223, 119, "#LUA Ders 3 ///  By ZoRRoM", false)
        guiWindowSetSizable(dersWindow, false)
guiSetVisible(dersWindow, false)

        canButon = guiCreateButton(10, 36, 86, 34, "Can", false, dersWindow)
        guiSetFont(canButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", canButon, canClick, false )


        armorButon = guiCreateButton(128, 36, 85, 34, "Armor", false, dersWindow)
        guiSetFont(armorButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", armorButon, armorClick, false )


        kapat = guiCreateButton(53, 88, 116, 21, "Kapat", false, dersWindow)
        guiSetFont(kapat, "default-bold-small")   
    end
)

function ackapa()
    if (guiGetVisible (dersWindow) == true) then
    guiSetVisible(dersWindow, false)
    showCursor(false)
    elseif (guiGetVisible (dersWindow) == false) then
    guiSetVisible(dersWindow, true)
    showCursor(true)
    end
end
bindKey ("L", "down", ackapa)

function kapatTusu()
        if source == kapat then
        guiSetVisible ( dersWindow,false )
        showCursor(false)
        end
    end
addEventHandler("onClientGUIClick",root,kapatTusu )

function canClick()
if (getPlayerMoney(source) >= 50) then
triggerServerEvent ( "canAl", localPlayer)
else
outputChatBox("#9c0000[Bilgi]; #185e1bMalesef ki paran yetersiz. Gerekli para 50$!", source, 255, 0, 0, true)
end
end

function armorClick()
if (getPlayerMoney(source) >= 60) then
triggerServerEvent ( "armorAl", localPlayer)
else
outputChatBox("#9c0000[Bilgi]; #185e1bMalesef ki paran yetersiz. Gerekli para 60$!", source, 255, 0, 0, true)
end
end

Şimdi de bunu kopyalayıp ders_s.lua'nın içine yapıştırın:
Kod: (Server-Side)
function can ()
if ( 200 > getElementHealth(source) ) then
takePlayerMoney ( source, 50 )
setElementHealth ( source, 200)
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true)
else
outputChatBox("#9c0000[Bilgi]; #185e1bZaten canın full!", source, 255, 0, 0, true)
end
end
addEvent ("canAl", true)
addEventHandler ( "canAl", getRootElement(), can )

function armor ()
if ( 100 > getPedArmor(source) ) then
takePlayerMoney ( source, 60 )
setPedArmor ( source, 100)
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true)
else
outputChatBox("#9c0000[Bilgi]; #185e1bZaten armorun full!", source, 255, 0, 0, true)
end
end
addEvent ("armorAl", true)
addEventHandler ( "armorAl", getRootElement(), armor )


Şimdi bunlar ne anlama geliyormuş bir bakalım...
İlk önce ders_c.lua;

Scriptin bu bölümü görüntü ile alakalıdır. Burada ilk önce panelin görüntüsünü oluşturacağız...
Kod: 
addEventHandler("onClientResourceStart", resourceRoot,
    function()
        dersWindow = guiCreateWindow(368, 265, 223, 119, "#LUA Ders 3 ///  By ZoRRoM", false)
        guiWindowSetSizable(dersWindow, false)
guiSetVisible(dersWindow, false)

        canButon = guiCreateButton(10, 36, 86, 34, "Can", false, dersWindow)
        guiSetFont(canButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", canButon, canClick, false )


        armorButon = guiCreateButton(128, 36, 85, 34, "Armor", false, dersWindow)
        guiSetFont(armorButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", armorButon, armorClick, false )


        kapat = guiCreateButton(53, 88, 116, 21, "Kapat", false, dersWindow)
        guiSetFont(kapat, "default-bold-small")   
    end
)


Kod: 
addEventHandler("onClientResourceStart", resourceRoot,
function()


addEventHandler ile scripte zaman ekliyoruz. Zaman ekimiz "onClientResourceStart". Yani bu script başlatıldığında. Ardından yeni bir function oluşturuyoruz.


Kod:
dersWindow = guiCreateWindow(368, 265, 223, 119, "#LUA Ders 3 ///  By ZoRRoM", false)
        guiWindowSetSizable(dersWindow, false)
guiSetVisible(dersWindow, false)

guiCreateWindow --> Pencere oluşturur.
Kullanımı --> guiCreateWindow(x koordinatı, y koordinati, x uzunluğu, y uzunluğu, "Pencereye yazılacak yazı", false)

guiWindowSetSizable --> Pencerenin uzunluğunun değiştirilememesi sağlar.
Kullanımı --> guiWindowSetSizable(pencerenin adı, false veya true yani sırasıyla "Değiştirilmesin" veya "Değiştirilsin")

guiSetVisible --> Pencerenin kapalı veya açık olmasını sağlar.
Kullanımı --> guiSetVisible(pencerenin adı,  false veya true yani sırasıyla "Açık" veya "Kapalı")

Satırları sırasıyla;
Bir pencere oluşturuyoruz ve adını dersWindow koyuyoruz.
Boyutunun değiştirilip, değiştirilemeyeceğini ayarlıyoruz.
Kapalı ve açık olduğunu ayarlıyoruz.





canButon = guiCreateButton(10, 36, 86, 34, "Can", false, dersWindow)
        guiSetFont(canButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", canButon, canClick, false )
guiCreateButton --> Buton oluşturur.
Kullanımı --> guiCreateButton(x koordinatı, y koordinatı, x uzunluğu, y uzunluğu, "Butona yazılacak yazı", false, neyin üzerinde olduğu)

guiSetFont --> Herhangi bir gui elementinin (pencere-buton-label...) yazı stilini değiştirir.
Kullanımı --> guiSetFont(guielementinin adı, "yazı stili")
Orijinal gui fontlarına buradan ulaşabilirsiniz.

onClientGUIClick --> Gui elementine tıklanıldığında anlamını taşır.
addEventHandler ( "onClientGUIClick", button ismi, butona tıklanıldığında yapılacak şeylerin olduğu function ismi, false )


Aynı şey aşağıdaki kodlar içinde geçerlidir;


Kod: 
armorButon = guiCreateButton(128, 36, 85, 34, "Armor", false, dersWindow)
        guiSetFont(armorButon, "default-bold-small")
addEventHandler ( "onClientGUIClick", armorButon, armorClick, false )


        kapat = guiCreateButton(53, 88, 116, 21, "Kapat", false, dersWindow)
        guiSetFont(kapat, "default-bold-small")


Kapat butonuna onClientGUIClick eklemedik. Aşağıda ekliyeceğiz...
Ardından kodu bitiriyoruz...




Scriptin bu bölümü Pencereyi açıp kapama ile ilgilidir. Burada açma kapama harfini ve kapatma butonunu ayarlıyacağız.
Kod:
function ackapa()
    if (guiGetVisible (dersWindow) == true) then
    guiSetVisible(dersWindow, false)
    showCursor(false)
    elseif (guiGetVisible (dersWindow) == false) then
    guiSetVisible(dersWindow, true)
    showCursor(true)
    end
end
bindKey ("L", "down", ackapa)

function kapatTusu()
        if source == kapat then
        guiSetVisible ( dersWindow,false )
        showCursor(false)
        end
    end
addEventHandler("onClientGUIClick",root,kapatTusu )


guiGetVisible --> Gui elementinin kapalı olup olmadığını alır.
Kullanımı --> guiGetVisible(gui elementinin adı)

showCursor --> Mouse ayarıdır. Mouseyi bu kod ile açıp kapatacağız.
Kullanımı --> showCursor (false veya true "kapalı veya açık"

bindKey --> Herhangi bir koda açıp kapamak için harf atamaya yarar.
Kullanımı --> bindKey ("Hangi tuşla açılacağı", "up - down - both (açıklaması aşağıda)", funciton adı)

up --> Basılan tuş serbest bırakıldığında işlev gerçekleşir.
down --> Tuşa basıldığında işlev gerçekleşir.
both --> Tuşa basıldığında veya bırakıldığında işlev gerçekleşir.


Kod: 
function ackapa() -- Function oluşturulur.
    if (guiGetVisible (dersWindow) == true) then -- Eğer dersWindow açıksa...
    guiSetVisible(dersWindow, false) -- dersWindow'u kapat.
    showCursor(false) -- Mouse'yi kapat.
    elseif (guiGetVisible (dersWindow) == false) then -- Yada dersWindow kapalıysa
    guiSetVisible(dersWindow, true) -- dersWindow'u aç.
    showCursor(true) -- Mouse'yi aç.
    end -- Kod bitirilir
end -- Kod bitirilir
bindKey ("L", "down", ackapa)



Kod: 
function kapatTusu() -- Yeni funtion oluşturulur.
        if source == kapat then -- Eğer değişken "kapat" ise
        guiSetVisible ( dersWindow,false ) -- dersWindow'u kapat.
        showCursor(false) -- Mouse'yi kapat
        end -- Kod bitirilir
    end -- Kod bitirilir
addEventHandler("onClientGUIClick",root,kapatTusu ) -- Herhangi bir şeye tıklayınca
Herhangi bir şeye tıklayınca ancak function içinde eğer değiken kapat ise dedik. Dikkat!


Scriptin bu bölümü yukarıda belirttiğimiz
Kod: 
addEventHandler ( "onClientGUIClick", canButon, canClick, false )

kodu ile ilgilidir. Oradaki function adına ne yazdıysanız buradaki function'un adıda aynı olmalıdır.

Kod:
function canClick()
if (getPlayerMoney(source) >= 50) then
triggerServerEvent ( "canAl", localPlayer)
else
outputChatBox("#9c0000[Bilgi]; #185e1bMalesef ki paran yetersiz. Gerekli para 50$!", source, 255, 0, 0, true)
end
end

getPlayerMoney --> Oyuncunun parasının kaç olduğunu alır.
Kullanımı --> getPlayerMoney(source)

triggerServerEvent --> LUA kodlamada kodlar ikiye ayrılmıştır. Bi server kodu, birde client kodu. Oyuncunun canını değiştirme kodu server eventi olduğu için, triggerServerEvent kullanıcağız. 

Peki bu ne işe yarar?
Bu kod sayesinde iki ayrı yerde bulunan farklı tipteki ( server - client ) kodları, tek kod içindeymişçesine birbirine bağlar. Yani server'da yapacağımız şey bu kodun içindeymiş gibi olacak.
Kullanımı --> triggerServerEvent ( "Karşı tarafa yollayacağımız isim. Bunun çalışması için karşı taraftada aynı isim kullanılmalıdır.", localPlayer)


Kod:
function canClick() -- Yeni bir funtion oluşturuyoruz.
if (getPlayerMoney(source) >= 50) then -- Eğer oyuncunun parası 50'den büyük veya 50'ye eşit ise
triggerServerEvent ( "canAl", localPlayer) -- Servere gönder
else -- Eğer oyuncunun parası 50'den büyük veya 50'ye eşit değil ise
outputChatBox("#9c0000[Bilgi]; #185e1bMalesef ki paran yetersiz. Gerekli para 50$!", source, 255, 0, 0, true) -- Chatbox'a yazı gönderir.
end -- Kodu bitiriyoruz.
end -- Kodu bitiriyoruz.

Aynı şey bu kod içinde geçerlidir;
Kod: 
function armorClick()
if (getPlayerMoney(source) >= 60) then
triggerServerEvent ( "armorAl", localPlayer)
else
outputChatBox("#9c0000[Bilgi]; #185e1bMalesef ki paran yetersiz. Gerekli para 60$!", source, 255, 0, 0, true)
end
end



Evet şimdi client bitti. Şimdi sıra ders_s.lua'da. Yani server-side'de...
Kod:
function can ()
if ( 200 > getElementHealth(source) ) then
takePlayerMoney ( source, 50 )
setElementHealth ( source, 200)
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true)
else
outputChatBox("#9c0000[Bilgi]; #185e1bZaten canın full!", source, 255, 0, 0, true)
end
end
addEvent ("canAl", true)
addEventHandler ( "canAl", getRootElement(), can )

getElementHealth --> Elementin canının kaç olduğunu alır.
Kullanımı --> getElementHealth(source)

takePlayerMoney --> Oyuncunun parasını alır.
Kullanımı --> takePlayerMoney ( source, alınacak para miktarı)

setElementHealth --> Elementin canını değiştirir.
Kullanımı --> setElementHealth ( source, miktar)

addEvent --> Client'de kullandığımız triggerServerEvent'i burada karşılar.
Kullanımı --> addEvent ("Client'den gönderdiğimiz isim adı", true)
Kullanımı --> addEventHandler ( "Client'den gönderdiğimiz isim adı", getRootElement(), function adı)



Kod: 
function can () -- Yeni bir funtion oluşturuyoruz ve adını koyuyoruz.
if ( 200 > getElementHealth(source) ) then Eğer 200, değişken olayı tetikleyenin (oyuncunun) canından fazlaysa
takePlayerMoney ( source, 50 ) -- Oyuncunun ... parasını al.
setElementHealth ( source, 200) -- Oyuncunun canını ... yap.
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true) -- Chatbox'a yazı gönder
else -- Eğer 200, oyuncunun canından az veya eşit ise
outputChatBox("#9c0000[Bilgi]; #185e1bZaten canın full!", source, 255, 0, 0, true) -- Chatbox'a yazı gönder
end -- Kodu bitiriyoruz.
end -- Kodu bitiriyoruz.
addEvent ("canAl", true) -- triggerServerEventi karşılar.
addEventHandler ( "canAl", getRootElement(), can ) -- triggerServerEvent buraya gönderildiğinde "can" adlı functionu başlat anlamı taşır.


Kod: 
function armor ()
if ( 100 > getPedArmor(source) ) then
takePlayerMoney ( source, 60 )
setPedArmor ( source, 100)
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true)
else
outputChatBox("#9c0000[Bilgi]; #185e1bZaten armorun full!", source, 255, 0, 0, true)
end
end
addEvent ("armorAl", true)
addEventHandler ( "armorAl", getRootElement(), armor )

getPedArmor --> Ped veya player'in canını alır. Kullanımına göre...
Kullanım --> getPedArmor(source)

setPedArmor --> Ped veya player'in canını değiştirir.
Kullanım --> setPedArmor( source, miktar)



Kod:
function armor () -- Yeni funciton oluşturuyoruz ve isim koyuyoruz.
if ( 100 > getPedArmor(source) ) then -- Eğer 100, oyunucun armorundan fazla ise
takePlayerMoney ( source, 60 ) -- Oyuncunun parasını alır.
setPedArmor ( source, 100) -- Armoru değiştirir.
outputChatBox("#9c0000[Bilgi]; #185e1bSatın Alındı!", source, 255, 0, 0, true) -- Chatbox'a yazı gönderir
else -- Eğer 100, oyunucun armorundan fazla değil veya eşit ise
outputChatBox("#9c0000[Bilgi]; #185e1bZaten armorun full!", source, 255, 0, 0, true) -- Chatbox'a yazı gönderir
end -- Kodu bitirir.
end -- Kodu bitirir.
addEvent ("armorAl", true) -- triggerServerEvent'i karşılıyoruz.
addEventHandler ( "armorAl", getRootElement(), armor ) -- triggerServerEvent buraya gönderildiğinde "armor" adlı functionu başlat anlamı taşır.



"ZoRRoM" arkadaşıma teşekkür ediyorum.

Önce ki derslere bakmak için;

Çalışan Bir Script Oluşturma Ders - 1: TIKLAYINIZ.

Çalışan Bir Script Oluşturma Ders - 2: TIKLAYINIZ.
Google+ Paylaş

Yazar Unknown

Oyun dünyasına ve web sitelerine düşkün bir genç.
    Blogger Comment
    Facebook Comment

3 yorum :

  1. Selamın Aleyküm
    Ders 4 ne zaman gelecek ?
    Birde sizden bişey istiyeceğim TCT kullanarak base yapıyorlar o baselerin girişlerine ve çıkışlarına marker koyuyorlar o marker lara gidince kapı açılıp kapanıyo acaba onun yapımını video ile anlatırmısınız?

    iyi günler...

    YanıtlaSil
    Yanıtlar
    1. Aleykum Selam,
      Öncelikle en altta belirtiğimiz gibi anlatım bir arkadaşıma ait. O ne zaman 4.dersi anlatırsa o zaman yayınlarız. İstediğiniz şeyi yapmayı bilmiyorum. Bilseydim anlatırdım. Kusuruma bakmayın.

      Sil
    2. önemli degil yinede sagolun

      Sil