Space Engineers

Space Engineers

27 ratings
Programlanabilir Bloklar Giriş
By Metacortex
Space Engineerda Programlama C # ile yazılmış komut dosyalarını kullanan Programlanabilir Blok vasıtasıyla yapılır. Bu, otomatik madencilik gemileri, uzun menzilli oyuncu öldürücü torpidolar, gemi yapımı için otomatik kaynak kolları ve çok daha fazlası için kullanılabilmektedir.

Programlanabilir bloklar hakkında rehber görmediğim için bu rehberi hazırladım .Dileyen arakadaşlar SpaceEngineerTurkey grubu katılabilirler .
https://steamproxy.net/groups/Space-Engineers-TR
Daha detaylı programlanabilir blok rehberinide ilerde hazırlayacağım.

Editör erişimi
Bir komut dosyasını oyunda aynı anda sadece bir kişi düzenleyebilir. Birisi mevcut blok için bir editörü açtıktan sonra bir başkası o bloğun editörünü açmaya çalışırsa, editörün zaten açık olduğu bildirilecektir.

Ana yöntem
Editör ilk defa açıldığında, kod düzenleyicide void Main () yöntemi bulunur.Bu, komut dosyası yürütülürken çağrılacak olan giriş noktasıdır.Eğer Ana metodu kaldırırsanız ya da yeniden isimlendirirseniz komut dosyası çalışmayacak .Ana method harici Özel yöntemler veya değişkenler tanımlanabilir ve kullanılabilir.Bunun için Ana metod referansı olmadan çağırılır.

Değişken ömrü
Komut dosyaları içinde iki tür değişken vardır;bunlardan ilki Yerel değişkenlerdir(Kod bloklarının içindeki değer).Yerel değişkenler kod bloklarının içinde belirlenen değişkenin değerini kod bloğu içinde koruyacak fakat kod bloğu sonlandığında ise değeri kaybolacaktır.

{
//kod bloğu burası
// burdaki değer bir alttaki kod bloğuna ettki etmiyecek
}
{
//2. bir kod bloğu
// burdaki değer ise üsttekine etki etmeyecek
}
ikinci değişken türü ise global değişkenlerdir (bunlar kod bloğu dışındada geçerli) yani komut dosyasının ömrü(başlama ve bitme) boyunca geçerliliğini koruyacaktır.
Örneğin değişken değeri programın çalışması kod bloklarından bağımsız olarak değişkenin değerini koruması istenirse burada Global değişken kullanılmalıdır.“Remember & Exit” veya “Remember” tuşlarına bastıktan sonra, önceki komut dosyası üzerine yazılacak ve tüm Global değişkenler kaybolacaktır.Yeleşik depolama değişkenleri hariç Tüm Yerel ve global değişkenler kodları yeniden derlernirken değerlerini kaybedecakler veya varsayılan değerlerini döndüreceklerdir. Depolama değişkeni kaydetme ve yeniden derleme zamanları arasında ,veriyi dize(spring) olarak depolaması bakımından benzersiz benzersizdir.

Derlemek
“Kodu kontrol et(Check code)” düğmesine basıldığında ,Kod derlenecek ve derlemenin sonucu gösterilecektir.Derleme süreci iki adımdan oluşur; Birinci adım,editör içindeki kod dil hatalarına karşı C# derleyicisi tarafından derlenir.Derleme sırasında herhangi bir hata oluştuğunda, aşağıdaki iletişim kutusu görüntülenecektir:
"aaa" dizesi Main metodun(kod bloğu) öncesine yerleştirildi
Yani bu yanlış dil yapısı ve deleme başarısız oldu demektir.Hata iletişim kutusunda(Dialog) hata satır numurasaı vehata açıklaması gösterilecektir.Derlemeden sonra ikinci adımda, kod kabul edilmeyen ad uzayları ve türlerinin kullanımı sebebiyle kontrol edilir .Kontorlün başarısız olması durumunda iletişim (dialog) kutusunda [In this case System.IO.Directory was used to delete some directory. ]gözülecektir [System.IO.Directory bazı dizin(directory) silmek için kullanıldı].Bu hata bize "Komut dosyasında izin verilmeyen türün" kullanıldığını gösteriyor.Kontroller ve derleme doğrulanırsa ,iletişim kutusu derlemenin doğrulandığını gösterir ve kod kaydedilir.

Komut çalıştırma
“Çalıştır(run)” düğmesine basıldığında veya “Çalıştır(run)” terminal eylemi olarak atandığında, komut çalıştırılır.Şu an "Çalıştır(run)" manuel olarak çağrılmaktadır (Kullanıcının “Çalıştır” düğmesine basması veya terminal eylemi olarak eklemesi gerekiyor) .Komut dosyası,istemciden(uzaktaki bir sunucu veya ağdaki kaynakları kullanan bilgisayar) tetiklense bile yalnızca sunucuda(server) yürütülür.Herhangi sıradısı komut çalıştırma sırasında tüm istemciler programlanabilir blok arızası hakkında ayrıntılarıyla bilgilendirilecektir.Sıradışı komut çalıştırma sırasındaki bir durumda komut dosyası kullanıcı editörü açıp komutu değiştirmedikçe tekrar çalışmayacaktır.Bir zamanlayıcı bir eylem tarafından komutu durdurulmadan çalıştırılabir(bir argüman(değişken) girmeniz istenebilir).Daha sonra zamanlayıcı kendi kendine başlatılıyor veya tetikleniyor ya da komutlar vasıtasıyla başlatılıyor veya tetikleniyor(komut dosyası çökerse zamanlayıcı duracaktır).

Talimatların Sayma
Komut dosyası her çalıştırıldığında,her komut satırı sayılır.Komut dosyası limit değerden daha fazla komut çalıştırırsa ,çalıştırma durdurulur ve kullanıcı komut aşırı karmaşık olduğu için bilgilendirilir .Bu önlenen komut dosyaları oyunu dondurur.

Beyaz liste
Kodlarda izin verilen türler ve sınıflar kısıtlanmıştır.verildiğini görmek için Komut Dosyası Beyaz Listesine bakabilirsiniz.
http://www.spaceengineerswiki.com/Scripting_Whitelist
2
   
Award
Favorite
Favorited
Unfavorite
Basit Örnekler ve Bazı Programlama dili tanımları
-Bazı Tanımlar-
API(Application Programming Interface-Uygulama programlama Arayüzü)

Klâsik dillerde tamsayılar, kesirli sayılar, boolean, void, char gibi yalın veri tipleri ile string, array gibi bileşik veri tipleri ait olduğu programlama diline [gömülü (built-in-types)] öğelerdir

void anlam olarak boş demektir. Daha genel anlamda tipsiz demektir. Yani C dilinde int, char, float gibi tiplerimiz var. Şayet bir değişkenin tipi yoksa (veya belli değilse) o zaman void olur.
---
Alt ve Üst Tip Kimlikler
Bazı bloklar aynı tip olmasına karşın alt tip kimlikleri olarak farklı türlere ayrılabilmektedir .Örneğin kargo konteynırları aynı türdür fakar büyük,küçük ve orta boy olmak üzere 3 alt tipe ayrılmaktadır.
Kimlik belirleme üstte anlatılan için alttaki gibi gözükecekletir;(typeID=üsttipi,SubtypeID=alttipi)

<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockLargeContainer</SubtypeId>
</Id>
Medium is:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>SmallBlockMediumContainer</SubtypeId>
</Id>
And small is:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockSmallContainer</SubtypeId>
</Id>

Bu durumda, her türlü kargo konteynırı için tek bir sınıf IMyCargoContainer var.

BASİT BAZI ÖRNEK PROGRAMLAR
-SELAM DÜNYA
Space Engineers oyununda standart bir Merhaba Dünya programı şöyle yazılabilir.(HELLO WORLD bütün programlama dillerinde öğretilen ilk programdır)

public void Main()
{
Echo ("Hello, world!");
}

Bu program programlanabilir bloğa yazılıp çalıştırıldığında programlanabilir bloğun arayüzünde alt sağ tarağta merhaba dünya yazısı gözükecektir.

Pozisyonu BELİRLEME
Bu program, programlama blokunuzun dünyadaki konumunun mevcut GPS koordinatlarını gösterecektir.

public void Main()
{
var pos = Me.GetPosition();
Echo (pos.ToString());
}

SENSÖR KONTROLÜ
Bu eylemi sensörün "Setup Action" listesine koyarsanız,herhangi bir programlamaya gerek kalmadan bile bir kapıyı açmak veya başka bir eylemi tetiklemek için sensör kullanabilirsiniz.Bununla beraber bir sensör bir şey tespit etmediğinde bir eylem tetiklemek zor olacaktır ve zamanlayıcı bloklarla yapılamayacaktır.Bu program her 10 ticki kontrol eder(saniyede yaklaşık 6 kez) ve sensör bir şey algılamaz ise bu kapıyı kapatacaktır.Sensörler ,asteroidlerin sensör algılama alanına girdiğinde matkapların kapanması gibi başka amaçlarlada kullanılabilir.

List<MyDetectedEntityInfo> entity_list = new List<MyDetectedEntityInfo>();
public Program()
{
Runtime.UpdateFrequency = UpdateFrequency.Update10;
//This makes the program automatically run every 10 ticks.
}
public void Main()
{
var door_sensor = GridTerminalSystem.GetBlockWithName("Door Sensor 1") as IMySensorBlock;
door_sensor.DetectedEntities (entity_list);
if (entity_list.Count == 0)
{
var door = GridTerminalSystem.GetBlockWithName("Door 1") as IMyDoor;
door.ApplyAction ("Open_Off");
}
}

Bu kod bloğunu çalıştırmak için kullanılan sensör isim olarak Dorr Sensor 1 olarak adlandırılmalı ve kullnılan kapı ismide Door 1 olarak yazılmalıdır.Sensörü kapıyı açacak şekilde ayarlandığında kapı otomatik açılacak ve oyuncu sensörden ayrıldığında(uzaklaştığında) kapo kapanacaktır.

Derleme Hatası
-Method Name Expected: Parantez öncesinde yöntem adı eksik olabilir ya da köşeli parantez[] veya {} şeklindeki parantezler uyumsuz yerleştirilmiş olabilir.
Programlanabilir bloklar örnekler
Programlana bilir bloklarla diğer gridlere anten vasıtası ile veri gönderilebiliyor.

Her iki anteninde bulunduğu terminalde programlanabilir blokları gridlerini bulabilirsiniz.

Lazer anten daha basit olduğu için onu anlatacağım ,Lazer anteni tek bir antene bağlarsanız bu daha güven ve algılanamaz olur .


İleti gönderen Programlanabilir bloğunuzda, göndermek istediğiniz lazer anteni bulup anteni arayın. TransmitMessage (mesaj); İletiyi başarıyla gönderebilseydi, yöntem true döner.

public interface IMyLaserAntenna : IMyFunctionalBlock
{
/// <summary>
/// Bu kod antenin ortağıyla ilişkili programlanabilir bloğa bir mesaj gönderir
/// </summary>
/// <param name="message"></param>
bool TransmitMessage(string message);
}


Antenler, dinleyecek herkese yayın yaptıkları için biraz daha karmaşıktır. İletişimi kısıtlamak için iki seçenek vardır. Gönderen anten,(TransmitTarget enum )-İletim Hedefi sayımı ile kimlerin yayınlanacağını seçebilir:

[Flags]
public enum MyTransmitTarget
{
None = 0,
Owner = 1 << 0,
Ally = 1 << 1,
Neutral = 1 << 2,
Enemy = 1 << 3,
Everyone = Owner | Ally | Neutral | Enemy,
Default = Owner | Ally,
}


Bu bir bayrak sayımı(ENUMudur), yani öğeleri birleştirebilirsiniz. Sadece nötr ve müttefik antene göndermek istiyorsanız, OR(veya) ["|" ile belirtilen] alttaki şekildeki gibi yazılabilir

var target = MyTransmitTarget.Ally | MyTransmitTarget.Neutral.

Alıcı'nın müttefiklerden gelen veya nötr şebekelerdende gelen mesajları görmesini ve ayrıca düşman şebekelerinden gelen mesajları görmezden gelmesini seçebilirsiniz . Terminalde bunu yapılandırmanıza izin veren iki onay kutusu ve anten arayüzündeki yeni girişler vardır:

public interface IMyRadioAntenna : IMyFunctionalBlock
{
/// <summary>
/// Anten sistemine bağlı tüm PB'ye bir mesaj yayınlar.
/// Herhangi bir nedenle yayınlama başarısız olursa yanlış(FALSE) döndürür.
/// </summary>
/// <param name="message"></param>
/// <param name="target"></param>
bool TransmitMessage( string message, MyTransmitTarget target = MyTransmitTarget.Default );

/// <summary>
/// alttaki size ait olmayan dostça antenle gönderilen yayınları yok sayar
/// </summary>
bool IgnoreAlliedBroadcast { get; set; }

/// <summary>
/// Alttaki ise Nötr ve düşman anteni tarafından gönderilen yayınları yok sayar
/// </summary>
bool IgnoreOtherBroadcast { get; set; }
}

Her iki anten türü içinde,TransmitMessage aradığınızda, iletiniz sonraki onayın başlangıcı için sıraya konur.Bu her antenin saniye başına birkez ileteceğini gösterir.Aynı onaydan tekrar göndermeye çalışısranız TransmitMessage(iletişim mesajı) FALSE(yanlışı) döndürür.


Örnek alıcı komut dosyası

string password = "A702A9E2-4C2A-436B-B9C4-8F8D9221D72F";

void Main(string argument)
{
if (argument == password)
{
List<IMyWarhead> warheads = new List<IMyWarhead>();
GridTerminalSystem.GetBlocksOfType(warheads);
foreach (var warhead in warheads)
{
warhead.SetValue("Safety", true);
warhead.SetValue("DetonationTime", 3f);
warhead.ApplyAction("StartCountdown");
}

List<IMyRadioAntenna> antennas = new List<IMyRadioAntenna>();
GridTerminalSystem.GetBlocksOfType(antennas);
foreach (var antenna in antennas)
{
antenna.CustomName = "WARNING! SELF DESTRUCT IN 3 SECONDS";
antenna.SetValue("IsBroadcasting", true);
antenna.SetValue("Radius", 50000f);
return;
}
}

if (argument == "OpenHangar1")
{
var hangarGroup = GridTerminalSystem.GetBlockGroupWithName("Hangar 1");
List<IMyAirtightHangarDoor> doors = new List<IMyAirtightHangarDoor>();
hangarGroup.GetBlocksOfType(doors);

foreach (var door in doors)
{
door.SetValue("Open", true);
}
}
if (argument == "CloseHangar1")
{
var hangarGroup = GridTerminalSystem.GetBlockGroupWithName("Hangar 1");
List<IMyAirtightHangarDoor> doors = new List<IMyAirtightHangarDoor>();
hangarGroup.GetBlocksOfType(doors);

foreach (var door in doors)
{
door.SetValue("Open", false);
}
}
}

Örnek verici:

void Main(string argument)
{
var ant = GridTerminalSystem.GetBlockWithName("Antenna") as IMyRadioAntenna;
ant.TransmitMessage(argument, MyTransmitTarget.Everyone);
}
uzay mühendisleri Türkiye resim
Resim kendi montajımdır lütfen kullanacaksanızda beni bilgilendirin.
6 Comments
Rorschach 30 May, 2023 @ 3:00pm 
Custom Turret Controller koyup güneş paneline kamera bağlayıp bunları bağlarsan aim at sun seçeneği çıkıyor custom turret controllerdan onu aç o zaman sc siz kodsuz güneşi takip eden soların olur
Atlas 24 Jan, 2023 @ 9:44am 
Dostum eline sağlık, bir çoğu SE videosunda görüyorum adamların güneş panelleri bir rotora bağlı dönüyor. Benim keriz kafa yetmedi. Yardımcı olabilirmisin?
Metacortex  [author] 2 Sep, 2021 @ 6:47am 
Teşekkür ederim efendim
Bagoglu 2 Sep, 2021 @ 5:51am 
Eline sağlık kardeşim. Ne yazıkki rehber türkçe olduğu için pek ilgi görmemiş. Birisi ile anlaşıp ingilizce yayınlamanı dilerim. Teşekkürler
Metacortex  [author] 30 Nov, 2018 @ 3:53pm 
Uzun zamandır oyuna giremiyorum .Biraz yoğunum malesef . Şu sıralar yardımcı olamayacağın malesef kusura bakmayın.
Fenisle0n 29 Nov, 2018 @ 11:54am 
Sistem değiştimi programlanabilir bloc koyun inşa ettikten sonra eskisi gibi edit ve run tuşları kalkmış hayliyle atölyeden aldığım kodları da kullanamıyorum yardımcı olursanız sevinirim