TR/OyunModları yazma

From Multi Theft Auto: Wiki
Jump to navigation Jump to search

Bu kılavuz, uygun bir oyun modunun nasıl yazılacağına ilişkin süreci özetlemeye çalışır. MTA için komut dosyası yazmaya yeni başladıysanız, önce Main Page'daki diğer komut dosyası eğitimlerini kontrol etmek isteyebilirsiniz.

Giriş

Oyun modu, bir kez başlatıldığında tüm oynanışı kontrol eden bir kaynaktır. Bu, oyunculara ne yapacaklarını söylemeyi, oyuncuları ortaya çıkarmayı, takımlar oluşturmayı, oyuncuların kazanmak veya puan almak için ne yapmaları gerektiğini tanımlamayı ve çok daha fazlasını içerebilir. Örnek olarak Yarış ve Ölüm Maçı verilebilir.

"Uygun oyun modu" ne anlama geliyor?

Basitçe söylemek gerekirse, uygun bir oyun modu MTA'nın .map dosya sistemini tam olarak kullanan bir oyun modudur. Bu, oyun modu kodunun içinde oyuncuların veya arabaların konumları gibi haritaya özgü herhangi bir verinin kodlanmadığı anlamına gelir. Bunun yerine, oyun modu bu verileri tanımlayan .map dosyalarını yükleyebilmelidir. Bu şekilde oyun modu birden fazla haritaya sahip olabilir; ayrıca, insanlar MTA'nın harita düzenleyicisi ile oyun modu için .map dosyaları oluşturabilir, bu da kod yazmaktan çok daha kullanışlıdır.

"Uygun bir oyun modu" için bir örnek MTA:Yarış'tır. .map dosyası içinde birçok olasılıkla kullanıcı yapımı haritalara izin verir. Doğma noktalarını, nesneleri vb. değiştirmek için kullanıcının oyun modunun kendisini düzenlemesine gerek yoktur.

Map Dosyaları

Harita dosyaları genel olarak .map uzantılı XML'dir. Bir veya daha fazla belirli oyun modunu oynamak için bir ortam tanımlanır. Ancak oyunun kurallarını değiştirmemeleri gerekir - bunlar oyun modu tarafından tanımlanır.

Bir haritadaki her öğe .map dosyasındaki bir düğüme karşılık gelir. Doğma noktaları, nesneler ve araçlar gibi genel şeyler için standart sözdizimi vardır; ancak "özel", oyun moduna özgü bilgiler için kendi sözdiziminizi icat etmeniz gerekir.

Örneğin

Örnek olarak bir Bayrak Kapmaca oyun modunu farz edelim. Bu oyun modu için bir haritanın temel olarak doğma noktalarını ve bayrak konumlarını ve nihayetinde nesneleri ve araçları tanımlaması gerekir. Basitleştirilmiş harita dosyası şöyle görünebilir:

<map>
    <spawnpoint id="spawnpoint1" posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" rot="63.350006103516" model="0"/>
    <pickup id="Armor 1" posX="1911.083984375" posY="-1658.8798828125" posZ="885.40216064453" type="armor" health="50" respawn="60000"/>
    <flag posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" team="blue" />
    ...
</map>

Burada iki MTA elementleri görebilirsiniz - bir doğma noktası ve bir pikap. Daha da önemlisi, bu .map bayrağın konumunu ve rengini tanımlayan özel bir "bayrak" düğümüne sahiptir. doğma noktası ve pickup mevcut harici kaynaklar tarafından işlenebilir, özel öğeler oyun modu tarafından işlenmelidir.

Özetlemek gerekirse - MTA:Yarış'da gördüğümüz gibi toplu eşleyici girişi istiyoruz. Kullanıcılar oyun modu komut dosyasının kendisine hiç dokunmak zorunda KALMAMALI.

.map bilgilerini alma örneği

Yukarıda belirtildiği gibi, oyun modunuzun bir harita dosyasında tanımlanan özel elementleri alması ve bunları işlemesi gerekir. Aşağıda gösterildiği gibi bu oldukça kolaydır.

-- retrieve a table with all flag elements
local flagElements = getElementsByType ( "flag" )
-- loop through them
for key, value in pairs(flagElements) do
	-- get our info
	local posX = getElementData ( value, "posX" )
	local posY = getElementData ( value, "posY" )
	local posZ = getElementData ( value, "posZ" )
	local team = getElementData ( value, "team" )
	-- create an object according to the flag position
	createObject ( 1337, posX, posY, posZ )
	-- output the team that we created a base for
	outputChatBox ( "Base for team " .. team .. " created" )
end

getElementsByType işlevi, belirli bir türdeki tüm öğelerin bir tablosunu alır (tür, .map dosyasındaki düğüm adına karşılık gelir). Bu hem özel türler hem de yerleşik MTA türleri ("araç" veya "oyuncu" gibi) için çalışır. .map dosyasında ayarlanan xml niteliklerini almak için getElementData kullanılabilir. Bu basit örnekte, bayrağın bulunduğu yerde bir nesne oluşturulur ve sohbet kutusuna bir mesaj gönderilir. Gerçekte, harita yüklemesi sırasında elbette daha fazlasını yapmanız gerekecektir, örneğin bu durumda bayrağı alan oyuncuları tespit etmek için çarpışma şekilleri ayarlamak gibi.


Harita Yöneticisi

Yukarıdaki bölümü okuduktan sonra, bir oyun modunun her zaman iki bölümden oluşması gerektiği açık olmalıdır:

  • Her zaman aynı kalan oyun modu kaynağı
  • Oyun modu haritasına özgü bilgiler veren birçok farklı harita kaynağı

Artık her bir oyun modu için bir harita yükleyici yazmak yerine, Map manager oyun modlarını ve haritaları yüklemek için işlevler sağlar. Basitçe söylemek gerekirse, doğru komutu girdiğinizde (örneğin 'oyunmodu ctf ctf-italy'), 'ctf' ve 'ctf-italy' kaynaklarını başlatırken, 'ctf' kaynağına bir haritanın yüklendiğini bildirmek için bir olayı (onGamemodeMapStart) tetikleyecektir. 'ctf' kaynağı daha sonra 'ctf-italy'nin içerdiği bilgilere erişebilir ve oyuncuları vb. ortaya çıkarmaya başlayabilir.

Harita Yöneticisi nasıl kullanılır

Mapmanager hizmetini kullanmak için öncelikle gamemode kaynağınızın bu şekilde etiketlenmesi gerekir. Daha spesifik olarak, <info> etiketinin "type" niteliğini meta.xml içinde "gamemode" olarak ayarlayacaksınız. Ayrıca, "name" niteliğini kaynak adı yerine ASE'de gösterilecek kolay bir ada ("Bayrak kapmaca" gibi) ayarlayabilirsiniz.

<!-- meta.xml in "cowcatapult" gamemode -->
<meta>
    <info type="gamemode" name="Cow catapulting 2.0"/>
</meta>

Oyun modunuz özel haritalar yükleyecekse, aşağıdakiler için işleyiciler eklemelisiniz

  • onGamemodeMapStart
  • onGamemodeMapStop (herhangi bir boşaltma gerekliyse)

Bunlar, oyun modunuz için bir harita başlatıldığında veya durdurulduğunda tetiklenir ve harita kaynağını parametre olarak geçirir. Bu olaylar için işleyici işlevi içinde, kaynağın harita dosyalarından ve yapılandırma dosyalarından ihtiyacınız olan tüm bilgileri çıkarabilirsiniz.

Örneğin

function startCtfMap( startedMap ) -- startedMap contains a reference to the resource of the map
    local mapRoot = getResourceRootElement( startedMap )        -- get the root node of the started map
    local flagElements = getElementsByType ( "flag" , mapRoot ) -- get all flags in the map and store them in a table
    -- go on loading information like in the example above
    -- spawn players etc.
end
addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap)

Haritaları uyumlu hale getirme

Haritalar ayrı kaynaklardır. Bu, özel bir harita oluşturmak için oyun modu kaynağının düzenlenmesine gerek kalmaması için yapılır ve ayrıca haritaya özgü komut dosyalarını / yapılandırma dosyalarını onlarla birlikte paketlemenize olanak tanır.

Bir haritayı oyun modunuzla uyumlu hale getirmek için, kaynağının meta.xml dosyasını açın ve onu da etiketleyin: "tip" niteliği "harita" olarak ayarlanmalı ve "oyunmodu" niteliği haritanın birlikte çalıştığı oyun modu kaynak adlarının virgülle ayrılmış bir listesi (boşluksuz) olmalıdır.

<!--map's meta.xml-->
<meta>
    <info type="map" gamemodes="cowcatapult,assault,tdm"/>
</meta>

Her şeyi ayarladıktan sonra, adminler oyun modlarını başlatmak/durdurmak için bu iki komutu kullanacaktır: /gamemode gamemodeName [mapName] (isteğe bağlı parametre bir başlangıç haritası seçmeye izin verir, varsayılan değer yok) /changemap mapName [gamemodeName] (isteğe bağlı parametre haritanın hangi oyun moduyla başlatılacağını belirtir, varsayılan olarak geçerli olan oyun modudur)

Map manager kullanmak zorunda olmadığınız, ancak yararlı olabilecek birkaç erişim işlevini daha dışa aktarır.

başka ne yapmalısınız

Oyun modlarının kullanması/uyumlu olması gereken başka kaynaklar da vardır.

Yardımyöneticisi

Yardım yöneticisi, yardıma ihtiyaç duyduklarında oyuncular için standart arayüz olmalıdır. Oyun modunuzun yardımını görüntülemek için yardımyönetici'yi kullanırsanız, daha önce yardımcıyönetici'yi kullanan her oyuncu (örneğin diğer oyun modlarında) oraya nasıl ulaşacağını hemen bilecektir. Gerekirse, çalışan farklı kaynaklar için yardımı tek bir pencerede de görüntüler.

Yardım yönetci'yi kullanmanın temelde iki yolu vardır:

  • Oyun modunuzun nasıl kullanılacağını açıklayan basit bir metin sağlayın
  • Yardım yöneticisinden, yardım yöneticisi penceresinde kendi sekmesinde görüntülenecek bir GUI öğesi isteyin ve buna herhangi bir GUI öğesi eklemenize izin verin. Bu, kendi GUI'sine ihtiyaç duyan daha karmaşık bilgilerin görüntülenmesi gereken oyun modları için önerilen yoldur.

Nasıl yapılacağına ilişkin ayrıntılar için helpmanager help page 'nı okuyun.

Skor Tablosu

Skor Tablosu, o anda oyunda olan oyuncuları ve takımları gösterir. Haritaya özgü bilgiler sağlamak için özel sütunlar ekleyebilirsiniz. Örneğin, 'ctf' oyun modundaki 'puanlar' sütunu, oyuncunun öldürme veya ele geçirme yoluyla kazandığı puanları temsil edebilir. Her zamanki gibi, daha fazla bilgi için [Resource:Dxscoreboard|scoreboard help page]]'na bakın.

Harita döngüleyici

Harita döngüleyici, bir sunucuda hangi oyun modlarının ve haritaların oynanacağını kontrol eder. Örneğin, bir haritanın bir sonrakine geçene kadar arka arkaya kaç kez oynanacağını belirleyebilirsiniz. Bunu başarmak için harita döngüleyiciye oyun modunuzun ne zaman bittiğini söylemeniz gerekir (örneğin bir tur sona erdiğinde).