Anasayfa
UO Sunucular
Forumlar
Profilim
UO-Developer.COM
Nesnelere Giriş

Gerçek komut dosyası oluşturmaya ilk bakışınız...

Her şeyden önce, SPHERE sisteminin nesne yapısını anlamanız gerekir. Şimdi, SPHERE görünür bir şeyle etkileşime girdiği için, bu nesnelerin çoğunun anlaşılması nispeten daha kolaydır. Ama önce, nesne yönelimli programlama hakkındaki bu basit gerçeği anlamalısınız (eminim ki siz programcıların bildiği ve korktuğu bir terim):

NESNE YÖNELIMLI KOMUT DOSYASI, NESNELER ETRAFINDA ORTALANIR.

İşte bir SPHERE betiğinde kullanabileceğiniz nesnelerin bir listesi:

SRC :
Bir olayın kaynağı. Bir öğe hasar görmüşse, ona zarar veren SRC'dir. Bir oyuncuya vurulursa, SRC oyuncuya vuran kişidir. Bir öğeye çift tıklanırsa, SRC öğeye çift tıklayan oynatıcıdır. Daha sonra göreceğimiz gibi, SRC'ye sahip olmayan tek etkinlik, iyi nedenlerle @Timer'dir.

Genellikle fonksiyonlarda SRC'nin her zaman fonksiyonları çağıran kişi olmadığını, ancak varsayılan nesne olduğunu unutmayın (I veya sadece boş bir şey, örneğin: <I.NAME> veya <NAME> aynı şeydir.</NAME></I.NAME>

ACT :
Başvurulan karakter tarafından gerçekleştirilen son nesne, örneğin o karakter tetikleyici @ItemDclick, ACT, oyuncunun çift tıkladığı öğedir.

TARG :
Karakter tarafından hedeflenen nesne.

CONT :
Nesnenin kabı.

TOPOBJ :
Bir nesne, konteynerler içinde birkaç konteynere gömülürse, bu her zaman dünyaya gelmeden önce en üst düzey konteynerdir. Bir eşya bir oyuncunun sırt çantasına gömülüyse, TOPOBJ oyuncudur.

ACCOUNT :
Açıkçası bir oyuncunun hesabı.

REGION :
Bir oyuncunun bulunduğu mevcut bölge/alan.

SECTOR :
Dünya 64'e 64 döşeme sektörüne bölünmüştür (varsayılan olarak, ancak MAPx ayarlarını ayarlayarak bunu değiştirebilirsiniz (bunun için sphere.ini bölüme bakın). Bu, oyuncunun şu anki sektörüdür.

SERV :
Serv.save, serv.allclients vb. gibi sunucu komutlarını çağırmak için kullanılır.

LASTNEWITEM :
NEWITEM/NEWDUPE işlevlerinden oluşturulan son öğe.

LASTNEWCHAR :
NEWNPC/NEWDUPE işlevleri tarafından oluşturulan son karakter.

LINK :
Bir öğenin LINK özelliğinde başvurulan nesne.

UID.x :
UID'si X'e eşit olan nesne.

FINDLAYER.X :
X katmanındaki nesne.

FINDID.x :
Başvurulan kapsayıcıdaki x. nesne.

FINDCONT. X :
Kapsayıcıda kimliği x olan ilk nesne.

FINDTYPE.x :
Kapsayıcıda TYPE X olan ilk nesne.

NEW :
NEWITEM/NEWNPC/NEWDUPE işlevlerinden oluşturulan daha yeni nesne.

OBJ :
Kullanmak için ayarlamanız gereken boş bir nesne değişkeni,

örneğin:
OBJ = <FINDLAYER.layer_bankbox>
OBJ.SAY HEHE
banka kutusuna hehe dedirtecek.

NOT: OBJ global bir değişkendir, bu nedenle diğer komut dosyalarına müdahale edebilir.
Belirli bir komut dosyasında kullanılmadığında onu sıfıra geri döndürmek en iyisidir.

REFx :
Bu, referansın yerel olması ve diğer komut dosyalarıyla etkileşime girmemesi dışında OBJ ile aynı şekilde çalışır. 'x', 1 ile 65535 arasında bir sayıdır ve aynı anda ihtiyaç duyduğunuz kadar nesneye başvurmanıza olanak tanır
REF1 = <FINDLAYER.layer_bankbox>).</FINDLAYER.layer_bankbox>
FILE :
Geçerli FILE nesnesinde file komutlarını çağırın.

DB :
Bkz. MySQL

PARTY.MEMBER.x :
Atıfta bulunulan partinin x. parti üyesi.

GUILD.MEMBER.x :
Atıfta bulunulan loncanın x. lonca üyesi.

Gördüğünüz gibi, yapabileceklerimiz oldukça sınırlı. Aslında, pek sayılmaz. Mevcut betik sistemiyle, SPHERE ile akla gelebilecek hemen hemen her şeyi yapabilirsiniz. Yavaş çalışabilir veya gecikmeli olabilir, ancak yapılabilir. Bu son beş olay (içinde x olanları) karmaşıktır ve henüz bunları nasıl kullanacağınızı bilmenizi beklemiyorum.

Artık nesneleri bildiğimize göre, bu nesnelerin özelliklerine nasıl erişeceğimizi ve her şeyden önce bu nesnelere bir şeyler yapmayı bilmemiz gerekiyor: Nesnelerin özelliklerine erişmek için nokta operatörünü (.) kullanırız.

Mesela:
SRC.STR
ACT.MOREP
SRC.ACT.MOREP
SRC.TARG.HITS
SRC.DAMAGE {1 5} 01 <ACT>
SERV.NEWITEM i_gold
NEW.AMOUNT 10000
SRC.TARG.KILL
CONT.KILL
FINDLAYER.layer_backpack.FINDID.i_gold.AMOUNT
Tüm bunların ne işe yaradığını henüz anlamanızı beklemiyorum, ancak bu bölümün sonunda anlayacaksınız.

Bazı notlar :

NESNELERİN öge olmadığını da anlamalısınız, birisi NESNE dediğinde muhtemelen tablodakilerden bir karakter/öğe bazılarını kastetmektedir. Nesneler ayrıca REFERENCE olarak da adlandırılabilir.

Örneğin ACT. STR 100 referansı ACT'dir.

İşte SPHERE komut dosyası oluşturmanın bir sonraki ilkesi:

TÜM EYLEMLER, NESNELERI TANIMLAYAN OLAYLAR VEYA IŞLEVLER TARAFINDAN TETIKLENIR

Orada öylece duran bir SPHERE betiğinde hiçbir şey olmaz. Bir senaryonun yürütülmesi için bir oyuncu veya oyundaki başka bir şey, bir öğeye veya karaktere bir şey yapmalıdır. Örneğin, vurulmak, vurulan kişi üzerinde @GetHit senaryosunu yürütür ve vuran kişi üzerinde @Hit. Bir öğenin üzerine basıldığında, öğe üzerindeki @Step komut dosyası ve oynatıcıdaki @ItemStep komut dosyası yürütülür. Bir öğeye çift tıklandığında, öğe üzerinde @DClick yürütülür ve oynatıcıda @ItemDClick yürütülür.

Oyuncu, öğe'ye çift tıklayan kişiyse, SRC olur. Bir öğeyi hedeflerse, @Targon_Item senaryoda oyuncu SRC'dir ve hedeflediği öğe SRC'dir. TARG.

Böyle bir olaya atıfta bulunuyoruz:
ON=@Dclick
Bu satırı takip edince, oyuncu öğeyi tıkladığında olmasını istediğimiz her şey olacaktır.

Bir sonraki bölümde hem olayların hem de nesnelerin kullanımına ilişkin örnekler göreceğiz.
[b] Karar [/b]
Birinin bana bu senaryoyu gösterdiği harika bir gündü. Bu aslında 37. sürümündeki yeni betik sistemini test eden betikti. O zamanlar SPHERE, SPHERE bile değildi. Adı "Grayworld" idi ve menasoft.com'daydı. Aslında, web sitesinde eskiden sahip oldukları Yönetici SSS'de olduğuna inanıyorum.

İşte burada, 56b formatına güncellendi:
[TYPEDEF T_VEND_MACHINE]
// Başka bir tetikleyici.
// Otomat makinesi.

ON=@DCLICK
IF (<SRC.RESTEST 10 i_gold>)
SERV.NEWITEM={ i_HAM 1 i_fruit_apple 1 i_bread_loaf 1 i_bacon_slice 1 i_RIBS_COOKED 1 i_SAUSAGES 1}
SRC.BOUNCE <NEW.UID> // Çantana koy.
SRC.CONSUME 10 i_gold
SRC.MESSAGE That will be 10 Gold Thank Thee.
SOUND 0F7
ELSE
MESSAGE You lack 10 Gold to pay.
ENDIF
RETURN 1
Bu komut dosyasını dosyalarınızdan birine yerleştirin ve sunucunuzu yeniden senkronize edin. Bunun gibi test tetikleyicileri için spheretrig.scp'yi kullanmayı seviyorum. Şimdi, oyunda .set yazın t_vend_machine yazın ve herhangi bir öğeyi (kapı gibi) hedefleyin. Sonra çift tıklayın ve ne olduğunu izleyin. "Yeterli altın yok" mesajını alırsanız, kendinize biraz i_gold ekleyin ve tekrar deneyin.

Bu basit küçük senaryonun sonucunu gördünüz mü? Tartıştığımız çok şey var ve hatta tartışmadığımız daha da fazlası var. İlk olarak, bu garip IF yapısının kullanımını fark edebilirsiniz. Bunu tekrar tekrar kullanacaksınız, bu yüzden dikkat edin! IF yapısı şöyle görünür:
IF (1 or 0)
//Eğer 1 ise bu satırları çalıştırın
ELIF (1 or 0)
// İlki 1 değilse, ancak bu 1 ise bu satırları yürütün
// İhtiyaç duyduğunuz kadar ELIF'e sahip olabilirsiniz
ELSE
// Yukarıdakilerden hiçbiri 1 değilse çalıştır
ENDIF
Her zaman, IF'nizi bir ENDIF ile eşleştirin. Ortada ne olduğu önemli değil. Sekiz yüz ELIF'e ve bir ELSE'ye sahip olabilirsiniz. Ancak her zaman IF'nizin bir ENDIF ile bir yerde eşleştirildiğinden emin olun. Aslında bunlar, bu yapının sadece iki gerekli parçası. ELSE ve ELIF tamamen isteğe bağlıdır ve bunları sadece ihtiyaç duyulduğunda kullanmalısınız.

Peki nedir bu 1 veya 0 olayı? Oraya sadece 1 veya 0 yazıyorsam, komut dosyamda bana nasıl yardımcı olur? Aslında, oraya IF 1 veya 0 yazmayacaksınız ve bu, eşdeğerlik testi operatörlerini tanıtmak için mükemmel bir zaman.

İşte buradalar:

== eşittir
!= eşit değil
> büyüktür
< daha az
<= küçüktür veya eşittir
>= büyüktür veya eşittir


1 = Doğru
0 = Yanlış

İnanılmaz derecede önemli olduğu için bu tabloyu kalın harflerle yazdım. Ve işte başka bir SPHERE prensibi:

IF deyiminde == ve = sözcüklerini birbirinin yerine kullanmayın. SPHERE aslında buna izin verir, ancak kafanız karışır ve = demek istediğiniz yerde == kullanırsınız ve bunun tersi de geçerlidir.

Aşağıda, IF deyiminde eşdeğerlik işleci kullanma örneği verilmiştir:
IF (<SRC.STR> == 75)
Bunu "src.str 75'e eşitse" olarak okuyun. İlginç bir şey bilmek ister misiniz? Dahili olarak, eğer SRC. STR aslında 75'e eşittir, SPHERE parantez içindeki TÜM kısmı 1 ile değiştirecektir. 75'e eşit değilse, SPHERE bu parçayı 0 ile değiştirecektir. 1 ve 0 buradan geliyor.

Şimdi, etraftaki parantezlerin < > <SRC.STR> orada ne yaptığını</SRC.STR> merak ediyor olabilirsiniz. Aslında bu, SPHERE komut dosyası oluşturmada en zor kavramlardan biridir. Parantezler < > , "İçinde ne varsa o şeyin gerçek değeriyle değiştirin" anlamına gelir. Bu, herhangi bir test yapılmadan önce yapılır. SRC deyin. STR 71 olarak ayarlandı. SPHERE'in bu IF ifadesini basitleştirmek için attığı adımlar şunlardır:

1.
IF (<SRC.STR> == 75)
2.
  IF (71 == 75) 
3.
IF (0)
Yukarıdaki örnek komut dosyasında şu ifadeye sahip olduğumuza dikkat edin:
<SRC.RESTEST 10 i_gold>
"RESTEST de neyin nesi?" RESTEST, fonksiyon dediğimiz şeydir. Parametreleri bu durumda bir miktar ve bir öğe kimliği alır ve bir değer döndürür. SPHERE işlevinin tamamını <SRC.RESTEST 10="" i_gold=""> bu değerle değiştirir.</SRC.RESTEST> RESTEST, oyuncunun belirtilen miktardan daha fazla belirtilen eşya miktarına sahip olup olmadığını kontrol eder.

Oyuncunun 10'a eşit veya daha büyük bir i_gold miktarı var mı? fonksiyonun sorduğu şeydir. Dahili olarak SPHERE "Evet" der ve onu 1 ile değiştirir veya "Hayır" ile değiştirir ve 0 ile değiştirir.

Oyuncunun sırt çantasında 9 gold olduğunu varsayalım. IF deyiminin sadeleştirilmesi şu şekildedir:

1.
IF (<SRC.RESTEST 10 i_gold>)
2.
IF (0)
Daha sonraki bölümlerde kendi fonksiyonlarımızı nasıl tanımlayacağımızı, onlara parametreler vereceğimizi ve bir değer döndürmelerini nasıl sağlayacağımızı göreceğiz...

Umarım şimdi IF ifadesi hakkında genel bir anlayışa sahipsinizdir. İşte analiz etmeniz için daha karmaşık bir örnek:
IF (<SRC.STR> > 60)
SRC.SYSMESSAGE Your strength is greater than 60.
ELIF (<SRC.STR> > 40)
SRC.SYSMESSAGE Your strength is greater than 40, but less than 60.
ELIF (<SRC.STR> > 20)
SRC.SYSMESSAGE You are a weakling with between 20 and 40 strength.
ELSE
SRC.SYSMESSAGE Start lifting weights because your strength is less than 20!
ENDIF
Bu ne işe yarıyor? İlk olarak, SPHERE IF ifadesine bakar ve SRC'nin değeridir. STR 60'tan büyük mü? Cevabınız hayır ise, SPHERE bunu 0 ile değiştirir ve ilk ELIF'e atlar. SRC'nin değeridir. STR 40'tan büyük mü? Değilse, bir sonrakine atlar. SRC'nin değeridir. STR 20'den büyük mü? Değilse, daha fazla ELIF arar. Onları bulamazsa, yukarıdaki hiçbir şey doğru olmadığı için ELSE ifadesine atlar.

SYSMESSAGE, başvurulan nesnenin ekranının köşesine bir mesaj yazdırır. Bu durumda, bu SRC'dir. Daha önce, MESSAGE işleviyle ilgili bir örnek gördünüz. İletiyi, başvurulan nesnenin üzerine yazdırır. Nesne daha yakın bir kapsayıcının içindeyse, en üstteki kapsayıcı nesnesine bir SYSMESSAGE yapar. Bu, sırt çantasındaki bir öğeye mesaj komutu verilirse ve sırt çantası açılmazsa, oyuncunun mesajı ekranının köşesinde göreceği anlamına gelir.

SYSMESSAGE [metin]
MESSAGE [metin]
RESTEST [amount] [item]
NEWITEM [item]
BOUNCE // Karakterin sırt çantasına bir eşya koy

İlk beş işleviniz. Tebrikler. Aslında, daha önceki bir senaryoda başka bir tane gördünüz! Ne olduğunu hatırlıyor musun?

SAY [metin]

Bu, elbette, nesnenin verilen metni söylemesine böylece herkesin duyabilmesine neden olur. MESSAGE ve SYSMESSAGE ile metin tek bir istemciye özeldir. MESAJ metni yalnızca SRC tarafından görülebilir. Başka bir deyişle, LINK. MESAJ veya SRC. TARG. MESSAGE, LINK veya SRC üzerinden bir mesaj gösterecektir. Sadece SRC'nin görebileceği TAARG.

Son olarak, senaryonun sonundaki bu tuhaf RETURN 1 nedir?

RETURN çeşitli şekillerde kullanılır. Bir olay komut dosyası söz konusu olduğunda, 1 döndürüseniz, varsayılan eylemin gerçekleşmesini engeller. Örneğin, bunu oyundaki bir öğeye koyar ve çift tıklarsanız, aslında öğeyi de kullanmaya çalışmaz. Sadece çift tıklama komut dosyasını çalıştırır. Bir oyuncu için eşyayı kullanıyormuş gibi görünebilir, ancak biz daha iyi biliyoruz. Bunu RETURN 0 olarak değiştirirseniz, öğeyi de kullanmaya çalışır, bu öğeyle ne yapacağı hakkında hiçbir fikri olmadığını fark eder ve Bu öğeyi nasıl kullanacağınızdan emin değilsiniz veya bunun gibi bir şey söyler. Her iki durumda da, komut dosyası bir RETURN deyimi görür görmez sona erer. RETURN 1 ve RETURN 0 arasındaki ayrım karakter olaylarında daha da belirgindir ve bunu o zaman belirtmek için çaba göstereceğim.[/metin][/item][/item][/amount][/metin][/metin]

UO-Dev SPONSOR

Paylaş

XFacebook

Önceki / Sonraki

Faydalı mı?

Bu içerik size yardımcı oldu mu?

UO-Dev SPONSOR

Henüz yorum yapılmamış. Yorum yazabilmek için giriş yapmanız gerekir.

Üyelerin oylama ortalaması (10 dışında) :

Henüz Oylanmamış

Oylar: 0

Paylaş

XFacebook

Önceki / Sonraki

Faydalı mı?

Bu içerik size yardımcı oldu mu?