Komutlarla uğraşırken bilinmesi gerekenler

Berksama

Sudan Çıkmış
Mesajlar
6
En iyi cevaplar
0
Beğeniler
3
Puanları
60
Genelde pek çok kişi komutları kullanmak istiyor ama yardım komutunun açıklamasından anlamayabiliyor veya komutlarda kullanılan ögeleri bilemeyebiliyor ve başkalarından gördüklerini kopyalamakla sınırlı kalıyor. Bu durumda olmamak için komutların sözdizimlerini bilmek ve bunun yanında dediğim gibi sözdiziminden de önce bazı kavramları bilmek gerekiyor. Bu kavramları açıklayarak devam ediyorum.

Tick: Oyunun içindeki bir zaman birimidir. Saniyenin 1/20'sine karşılık gelir.
(Bu tanım oyun tick'i içindir. Redstone tick'leri 1/10 saniye yani 2 oyun tick'i sürer. Redstone ile çalışılmadığı sürece tick her zaman oyun tick'ini kast eder.)
Entity
Entity varlık diye çevrilebilir. Entity ne olur onu açıklamaya gelince oyunda bloklar ve partiküller dışında görebileceğiniz her şey demek biraz eksik de olsa basit bir açıklama olur.
1. görselde pek çok entity var ve 2. görselde F3+B basılarak bu entity'lerin hitbox'ları gösteriliyor.

Hitbox: Entity'lerin kapladığı hacmi gösteren geometrik şekiller. Vurarak zarar verebildiğimiz entity'ler aslında hitbox'larının herhangi bir yerine vurarak zarar alırlar.



Eşya çerçevesi, çite taktığımız ip, xp küreleri gibi şeyler de entity'dir.
144766


144767


144768

Son 3 ekran görüntüsünde görüldüğü gibi; yerde duran eşyalar, atıldığı hallerinde (daha bloğa çarpıp patlamamış olan) olan Splash Potion'lar da Lingering Potion'lar da entity'dir. Ayrıca Lingering Potion'lar patlayınca bir iksir bulutu oluşturur (hitbox'u ve kapladığı alan zamanla daralıyor ve iksir etkisini o buluta girerek alıyorsun) ve bu bulut da entity'dir.

Koordinatlar
Komutlardaki koordinatlar genel kavramdan pek de farklı değil. Belirli bir konumun başka bir konuma göre gösterimi oluyor.
Oyunda koordinat gösteriminde kullanılan 3 doğrultu var, X, Y ve Z doğrultuları. X doğrultusu doğu-batı, Y doğrultusu yukarı-aşağı, Z doğrultusu kuzey-güney yönlerindedir.
144769

Yün blokları X doğrultusunu, glazed terracota blokları Y doğrultusunu, terracota blokları Z doğrultusunu gösteriyor.
Mavi bloklar pozitif yönü, kırmızı bloklar negatif yönü gösteriyor.
144770

Örneğin, burada farklı bir açıdan bakmam bu yönleri değiştirmiyor(oyuncuya bağlı değiller). Yönleri F3 basarak görebiliyorsunuz.
144771

Towards positive X diyor yani baktığım yönde gidersem X artar
Yün blokları X doğrultusunu
Mavi bloklar pozitif yönü
144772

Öncekinde X 5.51 idi ancak pozitif yönde ilerleyince 6.3 oldu, yani beklediğimiz gibi arttı.
144773

Oyuncuyu üst üste 2 ayrı blok olarak düşünürsek oyuncunun koordinatlarını veren kısım oyuncuyu temsil eden alttaki blok olacaktır o da oyuncunun ayaklarının olduğu yer.
Yeşil terracota bloğundaki ilk konum (8.314, 10, -13.527)

144774

Magenta terracota bloğundaki son konum (10.286, 12, -15.561)

yer değiştirmemizi göstermek için koordinatları yazıyorum
ilk (8.314, 10, -13.527)
son (10.286, 12, -15.561)
yer değiştirmede her doğrultudaki değerlerin farkı kendi arasında olacak ve son konumdan ilk konum çıkarılacak
yer değiştirme (1.972, 2, -2.034)
yani oyuncu X doğrultusunda pozitif gitmiş, Y doğrultusunda da pozitif gitmiş ama Z doğrultusunda negatif gitmiş oluyor
144775

2 blok arasındaki gidişi göstermek için arkadaki gibi blokları yerleştirdim
yani bu da +X +Y ve -Z yönlerinde gittiğimizi doğruluyor

Şimdi ise blokların koordinatlarının gösterimi
144776

Buradaki koordinatlar hep tam sayı olmuş çünkü bloğun köşesindeyim. Blokların (çoğunun) tüm kenarları 1 birim uzunluktadır. Yani bloğun tam orta noktası küpün yüzlerine 0.5 birim uzaklıkta ve yüzlerdeki karelerin orta nokları da kenarlara 0.5 birim uzaklıkta. O zaman benim bloğun ortasında durmam için X doğrultsunuda 0.5 blok pozitif yönde ve Z doğrultusunda 0.5 birim negatif yönde gitmem gerek(arkaya bakarak yönleri ve doğrultuları bilebilirsin).
144777

Şu anda bloğun tam ortasında duruyorum ve beklediğimiz gibi oldu öncekine göre X değerimiz 0.5 arttı Z değerimiz 0.5 azaldı.

Blokların koordinatları o bloğun X olarak en düşük, Y olarak en büyük ve Z olarak ise en küçük değerine sahip köşesinin/noktasının koordinatıdır.
144778

F3 basıp bir bloğa bakarak onun koordinatlarını öğrenebiliriz.
Bu bloğun üzerinde durmam demek onun 1 blok üstünde ayaklarımın olması demek yani üstünde durursam Y değerim 6 olacak. X ve Z değerleri bu bloğun değerleri en küçük olan köşesine ait (yukarıda bahsedildiği gibi) yani o zaman bu bloğun ortasında durursam X değerim 7 değerinden 0.5 fazla olarak 7.5 olmalı. Z değerim ise -14 değerinden 0.5 fazla olarak -13.5 olmalıdır.
144779

Tam olarak ortasında duramasam da beklediğimiz değerlere yakın durdum.

Benim koordinatlarımı gösteren XYZ kısmının altında "Block:" şeklinde yazan koordinatlar var o ayağımızın olduğu alttaki bloğun(oyuncuyu üst üste 2 blok olarak düşünmüştük yine öyle düşünerek) koordinatı yani oyuncunun ayağı havada olduğu için(evet boş olan bloklar aslında hava diye blok ile dolu) o ayağımızın içinde olduğu hava bloğunun koordinatları (7, 6, -14) şeklinde oluyor. Bu koordinatlar o bloğun X olarak en düşük, Y olarak en yüksek, Z olarak en düşük değerlere sahip olduğu noktanın koordinatları.
144780

Magenta terracota bloğunun koordinatları (10, 6, -13) önceki görsellerde baktığım yeşil terracota bloğunun koordinatları ise (7, 5, -14) idi.
Son konumun koordinatlarından ilk konumunkini çıkararak ne kadar gidildiğine bakalım.
(10 - 7, 6 - 5, -13 - (-14))
(3, 1, 1)
144781

144782

Şimdi yeşil terracota bloğunun yerine komut bloğu koyuyorum ve komut bloğunun üstüne de kumtaşı.
144783

Kumtaşının koordinatları (7, 6, -14) komut bloğu da 1 altında olduğundan X ve Z değerleri aynı Y değeri 1 az yani (7, 5, -14).
Şimdi koordinatları kullanarak bir komut örneği göstereceğim bu komutu bilmenize şimdilik gerek yok tek bilmeniz gereken bu komut ile koordinat verip o koordinattaki bloğu istediğiniz bloğa çevirebiliyor olmanız.
Komut bloğundaki komut:
Kod:
setblock 7 6 -14 stone
Komut bloğu çalışınca verdiğimiz koordinattaki blok taş olacak.
144784

Şimdi komut bloğundaki komutu değiştirip koordinatların kullanımının başka bir şeklini göstereceğim.
Değiştirmek istediğimiz bloğun koordinatı (7, 6, -14) komut bloğunun (yani komutun çalıştığı yerin, bunu diyorum çünkü komutlar entity'lerin koordinatlarında da çalıştırılabiliyor) koordinatı (7, 5, -14)
Burada son konum komut ile eylemi (blok değiştirme) gerçekleştireceğimiz konum (yani konulacak bloğun olacak konum). İlk konum ise komutun çalıştığı konum (bu durumda komut bloğunun konumu).
Çıkarma yapılınca sonuç (0, 1, 0)
Bu şu demek: Komut bloğundan X olarak 0 git, Y olarak +1 git, Z olarak 0 git.
Bu sefer komut bloğu prismarine bloğu koyacak koordinatlar ve koyulacak blok için komutun son hali:
setblock -0 -+1 -0 prismarine
Komutun şu anki haliyle ilgili demem gereken iki şey var. Öncelikle 0 yazmak yerine boş bırakabilirisiniz, ikinci olarak da pozitif olarak gidilecekse başına + koymayın (örneğin burada direkt "1" yazın) öyle çalışmaz (işaret sadece negatiflere koyuluyor).
Şimdi komut bloğunu çalıştıralım.
144785

Yine komut bloğu 1 üstündeki bloğu değiştirdi. Koordinat gösterimi 3 şekilde oluyor:
1) Direkt sayıları vererek
2)Komutun çalıştırıldığı konuma göre bağıl olarak (- işareti ile)
3)Komutun çalıştırıldığı entity'nin baktığı yöne göre (bu da ^ işareti ile oluyor bunu daha entity'lerde komut çalıştırmayı göstermeden anlatamam)

Not: - işareti Alt Gr + Ü ile elde edilebilir.

Komut Bloğu Türleri(Ayarlamaları)
Komut blokları aktifleşme şekillerine göre iki, rengine göre üç, çalışma koşullarına göre iki tane türe sahip.
Aktifleşme şekillerine göre türler: needs redstone(redstone ile aktifleştirilmeli), always active.
Always active için açıklama yapmam gerektiğini düşünüyorum yanlış anlaşılmalar olabiliyor. Always active evet her zaman aktif diye çevriliyor ama aktif ile denmek istenen sürekli çalışma değil redstone anlamında aktifleştirilme.
Bu yazının konusu redstone olmasa da bu konuya değinmeden sıkıntı olacağını düşünüyorum kısaca anlatayım.
144786

Bu düğmeye basarsam, purpur bloğu güçlendirilir(direkt olarak redstone sinyali almaya güçlendirme deniliyor) ve redstone mekaniklerine uyacak şekilde yanlarındaki blokları aktifleştirir(güçlendirilmiş bloklar yanlarındaki güçlendirilmemiş blokları aktifleştirebilir). Purpur bloğu da dropper olsaydı düğmeye basmak onu güçlendirecekti ve redstone sinyali aldığı için aktifleşecekti ve çalışacaktı ve yine yanlarındaki blokları aktifleştirecekti böylece 2 dropper da çalışacaktı. Yani; güçlendirilmiş direkt redstone sinyali alan, aktifleştirilmiş ise redstone sinyali alıp almaması önemli olmadan çalışma potansiyeli bulunduran bloklara deniyor.
Güçlendirilmiş bloklarin hepsi aynı zamanda aktifleştirilmiştir ama bir blok güçlendirilmeden aktifleştirilebilir(yanındaki blok güçlendirilmiş olabilir ya da komut bloğunda olduğu gibi always active seçeneği işaretlenmiştir)
Düğmeye basınca purpur bloğu güçlendirilmiş ve aktifleşmiş oluyor ama redstone bu bloğun işine yaramadığından bir şey olmuyor.
Komut bloğundaki always active de bu şekilde: Komut bloğu güçlendirilmiş olmadan aktifleştiriliyor(yani always active ayarındaki bir komut bloğunun yanına redstone ile çalışan bir blok koysanız komut bloğu bu blokları aktifleştirmez).

Evet, konumuza dönelim always active komut bloğunu her zaman aktif tutuyor. Yani her zaman çalışma potansiyeli var.
Renklerine göre türler:
Impulse
, Chain, Repeat
Impulse:
Aktifleştiğinde sadece 1 kere çalışır. Aktifleşmesinden 1 tick sonra çalışır.
Repeat: Aktif olduğu sürece her tick çalışır. Yani her saniye 20 kere çalışması demek.
Chain: Chain komut blokları adından da anlaşılabileceği gibi zincirleme çalışır. Tek başlarına çalışmazlar. Aktif ise arkasındaki komut bloğunun çalışıp çalışmadığını kontrol eder, eğer arkasındaki komut bloğu çalışmış ise kendisi de çalışır.
Chain komut bloğumuzun arkasında bir impulse komut bloğu olsun. Impulse komut bloğu ve chain komut bloğunun ikisi de aktif ediliyor sonrasında olacak olaylar:
Impulse komut bloğu çalışır
Chain komut bloğu aktif olduğu için arkasındaki bloğun çalışmasını kontrol eder ve çalıştığını görür kendisi de çalışır.

Bu sefer chain komut bloğumuzun arkasında repeat komut bloğu olsun ve ikisi de aktifleşsin. Bu durumda olacak olaylar:
Repeat komut bloğu aktifleşti ve ilk tick'inde çalıştı
Chain komut bloğu aynı tick içinde arkasındaki komut bloğunu kontrol etti ve çalıştığını gördü çalıştı
Repeat komut bloğu hala aktif olduğu için 2. tick'te yine çalışıyor.
Chain komut bloğu bir daha kontrol ediyor yine çalışıyor
...

Yani chain komut bloklarının arkasına repeat komut bloğu koyarsak, chain komut blokları da her tick (saniyede 20 kere) çalışır. Çünkü arkasındaki komut bloğunu hep kontrol ediyor ve o saniyede 20 kere çalışıyor her çalışmasında chain de çalışacağından o da 20 kere çalışmış oluyor.
Çalışma koşullarına göre komut blokları: unconditional, conditional
Conditional: Koşullu demek. Aktifleşmişse arkasındaki komut bloğunu kontrol ettirir. Eğer arkasındaki komut bloğu eyleminde başarılı olmuşsa çalışır, başarısız ise çalışmaz.
Örneğin; arkasındaki komut bloğu (4,3,5) koordinatındaki bloğu taş yapsın. Eğer komut bloğu çalışıp o bloğu taş yapmaya çalıştıysa ama o blok zaten taş idiyse komut bloğu başarısız olmuş olur ve conditional ayardaki komut bloğu çalışmaz. O blok taş olmasaydı, komut bloğu çalışınca başarılı olacaktı ve conditional olan komut bloğumuz çalışabilecekti.

Unconditional: Koşulsuz demek. Çalışmak için arkasındaki komut bloğunun başarısına bakmaz, aktifleşmişse renginin özelliğine göre çalışır.

Target Selector

Komutları kullanırken entity'ler ile çalışmak gerekebiliyor ki aslında çok sık kullanıyoruz. Komut bloklarına hangi entity'lerde çalışacaklarını belirtmek için target selectors(hedef belirticiler diye çevirebiliriz) kullanılır. Entity belirtme yöntemlerinin hepsine target selector denir.
Target selector'ların temelini anlatırken 4 entity kullanacağım:
A adında bir köylü
B adında bir köylü
A adında bir inek
B adında bir inek

Target Selector Variable

Target selector variable'lar hedef belirtirken kullandığımız ana değişkenlerdir, daha kesin belirtme yapmak istediğimizde bu değişkenin kapsadığı entity'ler arasından istediğimiz özelliklerde filtreleriz.
Oyunda 1.15.2 sürümünde 5 tane target selector variable bulunmakta.
Bunlar:
@e aksi belirtilmedikçe bütün entity'leri seçer
@a aksi belirtilmedikçe bütün oyuncuları seçer
@r aksi belirtilmedikçe rastgele bir oyuncu seçer
@p aksi belirtilmedikçe komutun çalıştığı yere en yakın oyuncuyu seçer
@s komutun çalıştırıldığı entity'dir (funciton, trigger ya da execute kullanıyorken geçerli ancak diğer durumlarda hiçbir işe yaramaz, yeri gelince ben belirttiğim şeyleri hatırlatıp anlatacağım)


Şimdi örnek vererek göstereyim.
147905


Bu komutta @e yerine yazacağımız entity'ler seçilecek ve (8, 6, -13) koordinatına ışınlanacaklar (tabi aslında ortalanıp 8.5, 6, -12.5 koordinatlarına ışınlanacaklar, bu ortalamadan da bahsedeceğim)
Şu an çalıştırılırsa(görüldüğü üzere redstone gerek aktifleşmesi için ve 1 kere çalışacak çünkü Impulse türünde) bütün entity'leri seçip girilen koordinata ışınlayacak.
147906

Bütün entity'ler ışınlandı.
Şimdi diyebilirsiniz, bu şekilde entity seçmek çok işe yaramaz hepsini seçiyor ben sadece bazılarında çalıştırmak istiyorum. Burada target selector arguments denilen ve daha kesin seçimler yaptıran elemanlar devreye giriyor.

Target Selector Argument

Örneğin; diyelim ki ben sadece köylüleri ışınlamak yani komutumu köylülerde çalıştırmak istiyorum.
Öncelikle köylüleri kapsayan tek target selector variable'ımız @e, ancak bu şu an tüm entity'leri kapsıyor bunu nasıl çözebiliriz.
Target selector variable'ımızı yazdım: @e
Şimdi köylü bir entity türü, entity türlerini belirten argument'ımız type ve köylünün türü villager olarak geçiyor.
Target selector'ın yeni hali: @e[type=minecraft:villager] sadece villager yazsak da çalışırdı ancak bunun oyunun içinden bir entity olduğunu dışarıdan eklenen bir entity olmadığını belirtmek için önemli (entity'lerin başka özelliklerini kontrol ederken tam doğru yazmamak hataya sebep olabilir, o yüzden buna dikkat etmek gerekiyor)
Komutumuzu değiştirip çalıştıralım.
Beklentimiz: A ve B adlarındaki köylülerin ışınlanması ineklerin ise ışınlanmaması.
Sonuç:
147907

Beklentimiz ile sonucumuz uyuştu, şimdi ise sadece adı A olan entity'leri ışınlamayı deneyelim.
Entity'lerin adını kontrol eden argument name argument'idir.
Target selector'ımız: @e[name=A]
Beklentimiz: Komutun entity'lerin diğer özelliklerine bakılmadan sadece A adındakilerin(A adındaki köylümüz ve A adındaki ineğimiz) üzerinde çalışıp, onların ışınlanması.
Sonuç:
147908

Hemen yanlarına gidip adlarının A olduğunu gösteremesem de(1.9 sürümünden beri entity'lerin çoğu collision denen bir kurala sahip, bu kuraldaki entity'ler kendi hitbox'ları içinde başka entity varsa onları ittiriyor, o yüzden birbirlerini hemen itecekleri için gösteremem) oraya ışınlananların adları A çünkü bunu belirttik.
Şimdi ise birden fazla özellik için arayalım
Adı B olan ve türü inek olan entity üzerinde çalışsın istiyoruz.
Target selector: @e[name=B,type=minecraft:cow]
Farklı argument'leri(birazdan göreceksiniz aynı argument türünü tekrar kullanabilirisinz o da başka argument sayılabilir) beraber kullanırken sadece aralarına virgül koyup tek başlarına kullanıyormuş gibi kullanabilirsiniz.
Komutu o şekilde düzenleyip çalıştırıyorum ve sonuç:
147910

Target selector'un mantığı için son bir şey kaldı onun dışında yapmanız gerekenler target selector için kullanılabilir argument'leri ve neyi kontrol ettiklerini öğrenmeniz.
Geriye kalan son şey bir durumun tam tersini kontrol etmemiz.
Örneğin ben adı B olmayan ve türü köylü olmayan entity'ler seçilsin istiyorum.
Bu durumda target selector'umuz: @e[type=!minecraft:villager,name=!B]
Şu anda bu dünyada 5 entity var:
Oyuncu (ben)
A adındaki köylü
B adındaki köylü
A adındaki inek
B adındaki inek

Bu belirttiğimiz duruma uyan entity'ler 2 tane
Oyuncu
A adındaki inek

Bu uymama durumu nasıl oluyor onu göstereyim:
A adındaki köylü (köylü olduğu için uymadı)
B adındaki köylü (hem köylü olduğu için hem de adı B olduğu için uymadı ancak en az bir tanesi uymasa da yeterliydi)
B adındaki inek (adı B olduğu için uymadı)

Komutu buna göre düzenleyip çalıştırıyorum ve sonuç:
147911


Target selector'ların çalışması ile ilgili her şey bu kadar geriye kalan yukarıda da bahsettiğim gibi diğer argument'leri öğrenmek.
Referans olarak tüm argument'ler ve neyi kontrol ettiklerini yazıyorum.

Target Selector Argument'leri ve Seçim Kriterleri
Java Edition 1.15.2 sürümünde geçerli olanlar

ArgumentSeçim Kriteri
x, y, zkoordinat
distanceuzaklık
dx, dy, dzkoordinatta yönelim
scoresskor değerleri
tagsahip olunan tag'ler
team... adındaki takım (üyeleri)
limitseçilecek entity sayısı (üst limit)
sort (limit ile beraber kullanılıyor)entity arama yöntemi
leveldeneyim seviyesi (büyü basarken kullanılan seviye)
gamemodeoyun modu
x_rotationdüşey dönme [0, 270] aralığında değerler, daha büyük değerse aralığa sığacak şekilde mod 271 alınır
y_rotationyatay dönme [-90, 90] aralığında değerler, daha büyük değerse aralığa sığacak şekilde mod 181 alınır
typeentity türü
nbtNBT
advancementadvancement
predicatepredicate

Argument'ler ile ilgili bazı notlar:

x, y, z sadece kendilerinin aynı doğrultuda kalan dx, dy, dz halleri ile beraber çalışıyor ve tersi de geçerli
x ve dx tek kullanılamaz beraber olmak zorunda. y ve dy ; z ve dz de aynı şekilde.
scores kullanımı diyelim ki mana ve para adında iki scoreboard objective'i var. Biz oyuncuda mana 55 ve daha büyük iken, para ise tam 300 iken kontrol edilsin istiyoruz: scores={mana=55..,para=300}
sort argument'inin kullanımı: komutun çalıştığı yere en uzak 2 üst limiti ile köylü seçtirmek istiyorum @e[type=minecraft:villager, limit=2, sort=furthest]
sort argument'i için geçerli değerler; nearest(en yakın), random(rastgele), furthest(en uzak) arbitrary(sıralama için bir kural atama, anlamına getiriyor execute ile arka arkaya entity çalıştırmalar yapıyorsanız işe yarayabilir)
x_rotation entity'lerin kafasını düşeyde oynatmasıyla yaptığı açılardır
0 iken tam güneye

90 iken batıya
180 iken kuzeye
270 iken doğuya
bakar
y_rotation entity'lerin kafasını yatayda oynatmasıyla yaptığı açılardır
90 iken aşağı
-90 iken yukarı
0 iken ise tam ortaya bakar

Gösterim ve diğer konularla ilgili notlar
Birden fazla skoru kontrol ederken araya konan virgül, target selector argument'leri arasına konan virgül ve NBT tag'leri arasına konan virgüller boşluk bırakarak da konabilir çalışmalarını etkilemez.

Şu anlık bu kadar ancak daha anlatılacak çok kısım var onları da zamanla eklerim.
 


Ekli dosyalar

  • 1579093578638.png
    1579093578638.png
    472.3 KB · Görüntüleme: 163
Son düzenleme:

yiğit45

Ağaç Yumruklayıcı
Mesajlar
13
En iyi cevaplar
0
Beğeniler
0
Puanları
80
Ruh hali
Başarılı bir analtım olmuş! Başarınızın devamını dilerim. :1:

FakeGazor_
 

Üst