FOR, özyinelemeli bir function oluşturmanın güçlü bir yoludur ve özyinelemeleriniz üzerinde daha basit bir denetim düzeyi sağlar.
Kullanım:
[FUNCTION for_display]
FOR X 1 20
SYSMESSAGE <LOCAL.X> // Geçerli for sayısını sysmessage ile iletir.
ENDFORDöngü, 1'den başlayıp 20'de biten 20 kez dönecektir. X, geçerli FOR sayısını içeren değişkendir. Herhangi bir değişken bildirilmezse, sayıya kullanılarak erişilebilir.<LOCAL._FOR>
LOCAL._FOR veya sayı olarak bildirdiğiniz herhangi bir şeyi değiştirmek, döngünün davranışını değiştirmez. Ancak FOR döngülerini onlara farklı döngü değişkenleri vermeden "yığarsanız", en içteki döngünün ardıllarının döngü değişkenlerinin üzerine yazacağını ve genellikle tüm döngü öğelerinin tamamen karışmasına yol açacağını unutmayın.
FORCHARLAYER
FORCHARLAYER başka bir FOR döngüsü türüdür. Temel olarak, bir karakterin belirtilen katmanında depolanan her bir öğe arasında döngü yapmanıza izin verir. Bu, FINDLAYER.x'i bir döngüde kullanmaya alternatif olarak bir karakterdeki tüm büyü rünlerini veya hafıza öğelerini manipüle etmek istediğinizde yararlı olabilir.
Burada dikkat edilmesi gereken bir şey, döngünün içindeyken varsayılan nesnenin geçici olarak döngüdeki öğeye değiştirileceğidir. Aşağıdaki örnekte görebileceğiniz gibi, orijinal varsayılan nesneye (karakter) bir referans saklamalıyız, böylece ona döngü içinden referans vermeye devam edebiliriz:
[FUNCTION get_mitems_names]
REF1 = <UID> // varsayılan nesneyi REF1'de saklayın
FORCHARLAYER 30
REF1.SYSMESSAGE <NAME> is a memory item in layer <LAYER>
ENDFOR FORCHARMEMORYTYPE FORCHARMEMORYTYPE çok kullanışlı bir FOR döngüsü türüdür. Deneyim sistemleri ve bazı oyuncu ve NPC öldürme sistemleri için kullanmak isteyebilirsiniz. Belirli bir bayrağa sahip bir karakterdeki her bellek öğesi arasında döngü oluşturur.
Örneğin, bir karakterin aşağıdaki adlara ve flaglara sahip 4 bellek öğesi vardır:
Ellessar 02000
Sorea 022bc
Introvert 0740d
Enrath 0c40d
[FUNCTION get_harmedby_mems]
REF1 = <UID> // FORCHARLAYER'da olduğu gibi, varsayılan nesne döngü içinde değişir
FORCHARMEMORYTYPE memory_harmedby // 00010=memory_harmedby bayrağı ile bellek öğeleri arasında döngü
REF1.SYSMESSAGE There is a memory item with name <NAME>, uid <UID>, flags <COLOR> and one of its flag is also 00010.
Ekranınızda şunları görürsünüz:
[code] There is a memory item with name Ellessar, uid 04f000001, flags 02000 and one of its flag is also 02000.
There is a memory item with name Sorea, uid 04f000002, flags 022bc and one of its flag is also 02000.
There is a memory item with name Introvert, uid 04f000003, flags 0740d and one of its flag is also 02000.
</tt>Sadece üç mesaj olduğunu unutmayın, çünkü "Enrath" hafıza öğesi 02000 bayrağına sahip değildir.FORCHARS
FORCHARS bir nesnenin belirli bir yarıçapı içindeki tüm mobilleri (çevrimiçi oynatıcı ve NPC) kontrol etmek için kullanabileceğiniz bir FOR döngüsüdür.
Doğru sözdizimi FORCHARS x'tir. Burada x, döngünün kapsayacağı döşemelerdeki yarıçaptır.
• FORCHARS 2, 2 döşeme yarıçapı içindeki herhangi bir cep telefonunu kontrol eder.
• FORCHARS 18, ekranınızın içindeki alanı kontrol eder.
• FORCHARS 6144 tüm dünya haritasını kontrol ederdi.
FORCHARS kullanan bir işlev örneği:
[FUNCTION kill_vendors]
FORCHARS 6144 // tüm haritayı kontrol eder
IF (<BRAIN> == brain_vendor) // bu fonksiyon içinde ne yapılacağına ilişkin argüman
KILL // action****
ENDIF
ENDFORTüm FOR döngülerinde olduğu gibi, belirli oyuncularla/npc'lerle (veya FORITEMS söz konusu olduğunda, öğelerle) kısıtlıyorsanız, döngünün içinde neye göre hareket edileceğini döngü içinde belirlemeniz gerekir. Aksi takdirde eylemi döngünün yarıçapı içindeki tüm çevrimiçi oyuncular/npc'ler üzerinde gerçekleştirir.Bu durumda, döngü herhangi bir Satıcı npc'si olup olmadığını kontrol eder ve onları öldürür.
FORCLIENTS ve FORPLAYERS
FORCLIENTS ve FORPLAYERS FOR döngüleridir. Her ikisi de belirli bir yarıçaptaki bir client/oynatıcıyı etkilemek için kullanılır. Yarıçapı ayarlamazsanız, yarıçap 18 varsayılan olarak kullanılır. FORCLIENTS yalnızca oturum açmış oyuncu karakterlerine etki ederken, FORPLAYERS, oturumu kapalı olsa bile her bir oyuncu karakterine etki eder.
Kullanım:
[FUNCTION radius_players]
FORCLIENTS 25
IF (<ACCOUNT.PLEVEL> <= 1) // Yalnızca oturum açmış oyuncuları etkiler. Personeli etkilemez.
SAY I am here!
ENDIF
ENDFOR FORCONT FORCONT bir tür FOR döngüsüdür. Bir container içindeki her öğe arasında döngü oluşturur. Döngünün içindeki varsayılan nesne, şu anda döngüye alınmakta olan öğe olacaktır.
Kullanım:
[FUNCTION rem_spellbooks]
FORCONT <FINDLAYER.21.UID> 10 // <FINDLAYER.21.UID> - UID of a container, 10 - how many subcontainers the function goes through, if set 0, it affects only items in container with UID********
IF (<BASEID> == i_spellbook)
REMOVE
ENDIF
ENDFOR FORCONTID FORCONTID, FORCONT'a benzer şekilde çalışan bir FOR döngüsüdür. Ancak yalnızca belirli bir BASEID'ye sahip öğeler arasında geçiş yapar. FORCONT örneğinde olduğu gibi, döngüye alınacak alt kapsayıcı miktarını ayarlayabilirsiniz.
Kullanım:
[FUNCTION rem_spellbooks2]
FORCONTID i_spellbook 10
REMOVE
ENDFOR FORCONTTYPE Bu, FORCONTYPE ile neredeyse aynı olan başka bir FOR döngüsüdür. Tek fark, belirli bir BASEID'ye sahip öğeler arasında döngü yapmak yerine, belirli bir TYPE'a sahip öğeler arasında döngü yapmasıdır.
Büyü kitapları kaldırma örneğini takiben:
Kullanım:
[FUNCTION rem_spellbook3]
FORCONTTYPE t_spellbook
REMOVE
ENDFOR ÖRNEKLER Aşağıdakine benzer bir şey yapan komut dosyaları görmüş olabilirsiniz:
[FUNCTION removespawns]
FORITEMS 9999
IF (<BASEID> == i_worldgem_bit)
REMOVE
ENDIF
ENDFORBir bakışta, bu komut dosyası, tüm i_worldgem_bit (spawn) öğelerinizi sunucudan kaldırmak için kullanılabilecek oldukça kullanışlı bir komut dosyası gibi görünüyor. Çalıştırmayı denerseniz, sunucunuzun önemli ölçüde uzun bir süre durakladığını kesinlikle fark edeceksiniz (iyi doldurulmuş bir sunucuda, komut dosyasının çalışması için bir dakika bile bekleyebilirsiniz), sunucuda öğenin yalnızca birkaç örneğine sahip olsanız bile! Bunun olmasının nedeni, FORITEMS 9999'un 9999 döşeme yarıçapı içindeki her öğeden geçmesidir, bu nedenle yalnızca bir avuç öğeyi etkilemek istediğinizde kod yüzlerce veya binlerce kez döngüye girer!Bu sorunu çözmek için FORINSTANCES'a sahibiz. Bu, sunucuda bulunan belirli bir karakterin veya BASEID öğesinin tüm örneklerinde döngü yapacak özel bir döngüdür. Bu, FORITEMS/FORCHARS 9999 kullanımına göre aşağıdaki avantajları sunar:
• Sphere, komut dosyanızı yalnızca ilgilendiğiniz BASEID'ye sahip nesneler için çalıştıracaktır.
• Sphere, nesnenin kaç örneğinin var olduğunu bilir, bu nedenle döngüyü uygun bir zamanda iptal edebilir.
• Kutuların içindeki öğeler (örn. karakter sırt çantaları veya oyuncu bankaları) kaçırılmayacak.
Bunu akılda tutarak, yukarıdaki komut dosyası aşağıdaki şekilde yeniden yazılabilir:
[FUNCTION removespawns]
FORINSTANCES i_worldgem_bit
REMOVe
ENDFORŞimdi, bu komut dosyasını çalıştırdığınızda, yürütme süresinde önemli bir düşüş fark etmelisiniz.Not: Sphere'in hala peşinde olduğunuz nesnelere referansları dahili olarak araması gerektiğinden, iyi doldurulmuş sunucularda hala fark edilebilir bir duraklama olduğunu görebilirsiniz. Bu tür bir döngü kullanmanız gerekiyorsa, bunu idareli bir şekilde yapmalısınız ve bunu düzenli olarak kullanmanız gerekiyorsa, komut dosyalarınızı uygulamak için daha uygun bir yol bulmayı düşünebilirsiniz.
FORITEMS
FORITEMS, karakterlerin aksine ayarlanan yarıçap içindeki ÖĞELERİ kontrol etmesi dışında, FORCHARS ile hemen hemen aynı şekilde çalışır. Varsayılan obejct, etkilenebilecek öğeye ayarlanmıştır.
FORITEMS kullanan bir fonksiyonun temel bir örneği:
[FUNCTION Spawn_remover]
FORITEMS 6144 // bir kez daha tüm haritayı kontrol eder
IF (<TYPE> == t_spawn_char) //if this arguement is met*****
REMOVE //siler
ENDIF //IF argümanını sonlandırır
ENDFOR //FOR dongüsünü bitirir. FOROBJS FOROBJS, FORITEMS ve FORCHARS ile aynı şekilde çalışır, ancak bu döngünün belirtilen yarıçap içindeki hem karakterleri hem de öğeleri bulması dışında.

