helpmee :
yardımın için tesekkurler ogrenmeye calısıyorum bende fazla kapamasamda değişe değişse öğreniyorum bikac sorum olacak
bu dongu olayında dedigin gibi src kullanıyorum bende sureklı bunu cont ile değişmemde sphere üzerinde etkisi nedir ayrıca sphereyi neler kastırır örnek olarak verirsem bir eşyaya @click gibi triggerler verme bi eventte yada itemde neler sunucuyu yorar yada sorgulama sonucu ortaya kasma cıkarmı bana bu konu hakkında yardımcı olabilirsen sevinirim hocam
Şimdi şöyle söyleyim, SRC ve CONT'un döngü ile alakası yoktur, SRC, Source kelimesinin kısaltmasıdır yani Kaynak, Cont ise Container yani taşıyıcı (çanta) [Oyuncularda çanta oyuncu ile aynı kaynaktır]
IF döngüleri için şöyle düşünebilirsiniz, IF "eğer ..." demek, ELSE "değilse" demek, ELSEIF yada ELIF "Değilse ve eğer ..." demek.
Yani şöyle düşünelim;
Kod:
IF 1 > 2 //Eğer 1, 2den büyükse;
SAY HAMIT //Hamit de.
ELIF 1 < 2 //1, 2den büyük değilse ve eğer 1 ikiden küçükse;
SAY BATUHAN //Batuhan de.
ELSE //1, 2den büyük değilse ve 1, 2den küçükde değilse;
SAY HAMIT&BATUHAN //Hamit&Batuhan de.
ENDIF
Yani açıklamak gerekise, IF döngüsü IF ile başlayıp ENDIF ile biter, ELSEIF (ELIF) 1. if'in şartları uymuyorsa 2. bir sorgu yaratmaya yarar. ELSE ise bağlı olduğu "IF" içindeki tüm sorguları kontrol eder ve hiç birisine uymuyorsa devreye girer.
SRC, I, CONT, ARGO referansları ise, değişkendir; Örnek vermek gerekirse, bir item üzerinden kullanıcıya işlem yaptırırken Source kullanıcı olmadığı için "CONT" kullanırız çünkü Çantadan kullanıcıya ulaşırız.
On=@Hit altında ise
SRC hasarı alan kişi olurken
I yani <UID> ise hasarı veren kişidir.
ARGO ise kullanılan silahtır.
Yani @Hit altında SRC üzerinden işlem yaparsak hasar yiyen kişi üzerinden, UID üzerinden işlem yaparsak saldırıyı yapan kişi üzerinden, ARGO üzerinden işlem yaparsak ise kullanılan silah üzerinden işlem yapmış oluruz. Yukarda söylediğim gibi, burada da ARGO.CONT üzerinden işlem yaparsak yine UID yani hasarı veren üzerinden işlem yapmış oluruz.
Ama aynı durumu @GetHit altında düşünürsek;
SRC hasarı veren kişi
I yani <UID> hasarı alan kişidir.
Burada gördüğün gibi @Hit deki durumun tam tersi geçerli, yani SRC üzerinden işlem yaparsak brada hasarı veren kişi üzerinden işlem yaparken, UID üzerinden işlem yaparsak hasarı alan kişi üzerinden işlem yapmış oluruz.
Bunun gibi bir çok örnek var, kimi durumlarda SRC ile UID aynı kişi iken, kimi durumlarda böyle farklılıklar gösterir. Örneğin @Death altında SRC ve UID aynı kişidir.
Sphere'yi yormak konusunda, sphere'nin yorulması kolay değildir, ancak 100+ player gibi düşünürsek, her bir oyuncu her saniye 20-30 işlem yaparsa, mesela atıyorum ki her adımda kontrol ettirmek için bir kod yazdın ve düşün ki 100 oyuncunun aynı anda koştuğunu neredeyse saniyde 2-3 adıma denk gelebilir belki daha fazla, buda spere üzerinde aynı anda 300 sorgu demektir. Sphere'nin bulunduğu pc bu sorguları %100 kaldıramıyoras ve her 300 sorgudan anda 250 tanesini yapabiliyorsa, 50 50 50 50 birikip zaman geçtikce bu sorgu sayısı 10000 leri geçer ve sphereyi yorar, Pc her sorgudan sonra biraz daha az sorgu kaldırabileceği için 50 51 52 53 gib artarak birikir, ama tabiki günümüzdeki hostlların tamamı yaklaşık 10-15000 sorguya kadar kaldırabilecek kapasitede yani artık sorgu ile sphere yormak çok zor ancak imkansız değil, örnek vermek gerekirse önü açık bir WHILE döngüsü sunucuyu hemen yorabilir.
Örneğin;
Kod:
LOCAL.X=1
WHILE <DLOCAL.X> < 10
SYSMESSAGE X
ENDWHILE
Burada gördüğün gibi DLOCAL.X, 10dan küçük iken X yazdırmasını istedim, ancak LOCAL.X değerini hiç arttırmadığım için hep 10 dan küçük kalacak, buda demek oluyor ki bu döngü sonsuza kadar sürecek, bu nedenle bir süre sonra sphere donacak ve kapanacaktır.
Yani döngünün olması gereken;
Kod:
LOCAL.X=1
WHILE <DLOCAL.X> < 10
SYSMESSAGE X
LOCAL.X ++
ENDWHILE
Budur, burada her X yazmasından sonra LOCAL.X değerini 1 arttırması için ayarladım, böylece LOCAL.X 10a ulaştığı vakit sorgu duracaktır.
Tabi şimdi nasılsa sphere kasmaz diyipte tedbiri elden bırakmamak gerekir, örneğin basit yollarla yormaların önüne geçmek mümkün, bunların en kolay yolları;
- Aynı sorguları tek if altında toplamak.
- En çok kullanılanları ilk sıraya koymak.
En çok kullanılanları ilk sıraya koymaktan kastım ne, mesela atıyorm, eşyanın yerde olup olmadığını sorgulayacaksınız, yani çantanızda değilse kullanılmasını istemiyorsunuz, eğer bu sorguyu 10 tane iften sonra koyarsanız sphere önce öndeki 10 ifi kontrol edip sonra çantayı kontrol edecektir, ancak bunu ilk sorguya koyarsanız ilk sorgudan işlemi kesip sonraki 10 sorguyu görmezden gelecektir, buda boşa 10 sorgu kullanımından kurtarır.
Diğer yandna aynı sorgulardan kastım ise atıyorm ki @ItemClick altında bir çok item üzerinden işlem yapıyorsunuz,
Kod:
On=@ItemClick
IF ((<ACT.BASEID> == i_corpse) && (1 == 2))
ACT.MESSAGE HAMIT
ELIF ((<ACT.BASEID> == i_corpse) && (1 < 2))
ACT.MESSAGE BATUHAN
ELIF ((<ACT.BASEID> == i_corpse) && (1 > 2))
ACT.MESSAGE MUSTAFA
ELSE
ACT.MESSAGE ITEM
ENDIF
Yukardaki gibi yaparsak eğer, Katanaya tıkladığımızda önce 1==2, sonra 1<2 sonra 1>2 sorgularını kontrol edecek yani 3 adet sorgu kontrol ettikten sonra ELSE devreye girecektir. Fakat;
Kod:
On=@ItemClick
IF (<ACT.BASEID> == i_corpse)
IF (1 == 2)
ACT.MESSAGE HAMIT
ELIF (1 < 2)
ACT.MESSAGE BATUHAN
ELIF (1 > 2)
ACT.MESSAGE MUSTAFA
ENDIF
ELSE
ACT.MESSAGE ITEM
ENDIF
Şeklinde yaparsak (Dikkat ettiyseniz if içinde if kullandım) katana ya tkladığınızda sadece i_corpseye eşit olup olmadığını kontrol edecek, olmadığı için bu ifin içindeki IF sorguları devreye girmeden sadece tek bir sorgu ile ELSE altına geçecektir. Yani işlemimizi deminkine göre %66.6 hızlandırmış olduk.
mahsuni :
Tşşkrler xwerswoodx Bana cok yardimin dokundu bisey daha ogrenmeki istiyorum tek komutla playerlarin uzerindekki butun eventleri kaldirmak mumkunmu ?
Mümkün;
Bunun için helpmee nin söylediği FORPLAYERS biçilmiş kaftan, ancak arkadaşn ve bradaki bir çok kişinin atladığı bir nokta var ki, harita boyutu artık 6144 değil, yeni boyutu, 7168
Ancak şimdi tek bir player üzerinden başlayalım;
Kod:
[FUNCTION DELETEEVENTS]
ARGS=<EVENTS>
FOR 0 <EVAL <ARGV> - 1>
EVENTS -<ARGV[<DLOCAL._FOR>]>
ENDFOR
Bu komutu kullanan kişi üzerindeki tüm eventler kalkar, aynı şekilde .XDELETEEVENTS yazıp çıkan target ile bir oyuncu yada NPC hedef alınırsa, onun üzerindeki tüm eventleri kaldıracaktır.
Sunucudaki oyuncular üzerindeki eventleri kaldırmak içinse;
Kod:
[FUNCTION DELEVENTS]
FORPLAYERS 7168
DELETEEVENTS
ENDFOR
Gördüğün gibi yukarıda yazdığım function'ı sunucudaki herkes üzerinden kullandırdım böylece haritadaki herkes üzerinden silmiş olduk.