Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
KO Developers Platformuna Hoşgeldin!
Seris

Basit Süre Sistemi

Önerilen Mesajlar

Merhabalar,

Knight online source işine 2 senedir ilgileniyorum bu süre olayını halen kavrayamadım yani mantığını çözemedim yani 2 saniye de 1 exp verme olayını yapmaya çalışıyorum öğrenmek amacıyla saçma sapan şeyler oluyor.

UNIXTIME ile yapmaya çalışıyorum internetten bi ton video izliyorum yok abi olmuyor 2 saniye önemli de değil yani 10 sn de bir işlem yaptırmak istiyorum kod vermeyen abilerimiz mantığını söylerlerse veya detaylı bir makale verebilirse çok güzel olur şimdiden teşekkürler

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Merhabalar,

Knight online source işine 2 senedir ilgileniyorum bu süre olayını halen kavrayamadım yani mantığını çözemedim yani 2 saniye de 1 exp verme olayını yapmaya çalışıyorum öğrenmek amacıyla saçma sapan şeyler oluyor.

UNIXTIME ile yapmaya çalışıyorum internetten bi ton video izliyorum yok abi olmuyor 2 saniye önemli de değil yani 10 sn de bir işlem yaptırmak istiyorum kod vermeyen abilerimiz mantığını söylerlerse veya detaylı bir makale verebilirse çok güzel olur şimdiden teşekkürler



uint64 m_lLastExperienceRewardTime = 0; // User.h içerisine tanımlanacak

void CUser::Update(){
/* ... */ // Mevcut kod bloğu
if(UNIXTIME - m_lLastExperienceRewardTime >= 2){
ExpChange(200000);
m_lLastExperienceRewardTime = UNIXTIME;
}
}


Her 2 saniyede bir 200k experience verir.

İletiyi paylaş


Link to post
Sitelerde Paylaş

Birazdan deneyeceğim fakat

m_lLastExperienceTime = UNIXTIME;

bu işlem sıfırlıyor mu süreyi?
-- mesaja ek olarak --
uint64 m_lLastExperienceRewardTime = 0;

ve bu,verdiğiniz kod içerisinde yok neden tanımlanacak ?

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Birazdan deneyeceğim fakat

m_lLastExperienceTime = UNIXTIME;

bu işlem sıfırlıyor mu süreyi?
-- mesaja ek olarak --
uint64 m_lLastExperienceRewardTime = 0;

ve bu,verdiğiniz kod içerisinde yok neden tanımlanacak ?


(İlgileniyorsan) mantığı da şu;

UNIXTIME dediğimiz şey, 01/01/1970 00:00 tarihinden bu yana geçen saniye sayısıdır. An itibarı ile değeri 1510480883'tur (tabi ben bu postu yazana kadar bu değer artacaktır.) Öncelikle, yapmak istediğin şey için, son işlem zamanını saklayacak bir değişken tanımladık. Bu değişkenin adı m_lLastExperienceRewardTime. CUser::Update fonksiyonu periyodik olmasa dahi paket geldikçe çağrılan bir fonksiyon. En kötü ihtimalle, 10 saniyede bir(WIZ_SPEEDHACK_CHECK), ortalama 1.5 saniyede bir (WIZ_MOVE, WIZ_ROTATE), en iyi ihtimalle paket trafiğine bağlı olarak tetiklenir, 0.1 saniyeye kadar düşebilir tetiklenme süresi. Fonksiyonun en alt kısmında, UNIXTIME değerinden, m_lLastExperienceRewardTime değerini çıkarttık. Aradaki fark, bize son experience ödülünden bu yana geçen saniye sayısını verir. Eğer sonuç 2 veya daha fazla ise, oyuncuya ödülünü verip, m_lLastExperienceRewardTime değerini, yani son işlem değerini UNIXTIME olarak güncelledik. Olay bundan ibaret.

İletiyi paylaş


Link to post
Sitelerde Paylaş

Hocam yok şikayet demeyelim yani yapılıyor sağdan soldan kodlara bakıp yapabiliyorum sıkıntı olan mantığı çözmem farklı bir projem var mantığını çözmeden yapmam çok zor
-- mesaja ek olarak --
Hocam anladım fakat halen RewardTime ile verdiğiniz kod arasındaki bağı anlamadım yani verdiğiniz kodu,RewardTime nasıl okuyor nerden görüyor,yani onu nasıl baz alarak işlem yapıyor?

ve if(UNIXTIME - m_lLastExperienceTime >= 2){ burada vermiş olduğunuz işlem büyüktür işareti yerine == yaparsak daha mantıklı değil mi sekme olayları felan mı oluyor? ve UNIXTIME dan sonra gelen - nin olayı nedir ? sayarken 2-1-0 diye mi gidiyor yoksa 0-1-2 mi diye işlem yapıyor - olayı + koysak ne değişir?

Hocam çok uğraştırdığımın farkındayım fakat baya uğraştım bazı noktaları pekiştirmem gerekiyor bir projem var ufakta olsa benim için büyük bir öneme sahip o yüzden detaya indim biraz :)

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Hocam anladım fakat halen RewardTime ile verdiğiniz kod arasındaki bağı anlamadım yani verdiğiniz kodu,RewardTime nasıl okuyor nerden görüyor,yani onu nasıl baz alarak işlem yapıyor?

ve if(UNIXTIME - m_lLastExperienceTime >= 2){ burada vermiş olduğunuz işlem büyüktür işareti yerine == yaparsak daha mantıklı değil mi sekme olayları felan mı oluyor? ve UNIXTIME dan sonra gelen - nin olayı nedir ? sayarken 2-1-0 diye mi gidiyor yoksa 0-1-2 mi diye işlem yapıyor - olayı + koysak ne değişir?

Hocam çok uğraştırdığımın farkındayım fakat baya uğraştım bazı noktaları pekiştirmem gerekiyor bir projem var ufakta olsa benim için büyük bir öneme sahip o yüzden detaya indim biraz :)


Birincisi, 'hocam' kelimesi kadar dünyada nefret ettiğim bir kelime daha yoktur, bana karşı hitap ederken kullanmazsan mutlu olurum.

Diğer hususa gelecek olursak, 2. değişkenin de m_lLastExperienceRewardTime olması lazım. Düzelttim.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Birincisi, 'hocam' kelimesi kadar dünyada nefret ettiğim bir kelime daha yoktur, bana karşı hitap ederken kullanmazsan mutlu olurum.


Genel de bu ortamlarda hocam kelimesi kullanıldığı için dedim k.bakmayın nasıl hitap edeceğimi bilemedim :/

Alıntı
Diğer hususa gelecek olursak, 2. değişkenin de m_lLastExperienceRewardTime olması lazım. Düzelttim.


Bende ona takıldım zaten çözmeye çalışıyorum mantığını yok :) En büyük sorun buydu diğerini ben deneme yanılma ile yaparım çok teşekkür ediyorum ilginiz için :)

İletiyi paylaş


Link to post
Sitelerde Paylaş

UNIXTIME = 1510480883 dersek,
m_lLastExperienceTime başlangıçda 0 olacak.

sen UNIXTIME -m_lLastExperienceTime derken
1510480883 - 0 diyorsun. yani sonuc =1510480883
if(UNIXTIME - m_lLastExperienceTime >= 2)// ile sonuc2 den buyuk veya eşitmi diye kontrol ediyor. eğerki 2den büyük veya eşitse expini veriyor ve sonra
m_lLastExperienceTime değerini 1510480883 yapıyor.
her saniye UNIXTIME değeri ayrı bir thread'da otomatik olarak artmaktadır.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Hocam yok şikayet demeyelim yani yapılıyor sağdan soldan kodlara bakıp yapabiliyorum sıkıntı olan mantığı çözmem farklı bir projem var mantığını çözmeden yapmam çok zor
-- mesaja ek olarak --
Hocam anladım fakat halen RewardTime ile verdiğiniz kod arasındaki bağı anlamadım yani verdiğiniz kodu,RewardTime nasıl okuyor nerden görüyor,yani onu nasıl baz alarak işlem yapıyor?

ve if(UNIXTIME - m_lLastExperienceTime >= 2){ burada vermiş olduğunuz işlem büyüktür işareti yerine == yaparsak daha mantıklı değil mi sekme olayları felan mı oluyor? ve UNIXTIME dan sonra gelen - nin olayı nedir ? sayarken 2-1-0 diye mi gidiyor yoksa 0-1-2 mi diye işlem yapıyor - olayı + koysak ne değişir?

Hocam çok uğraştırdığımın farkındayım fakat baya uğraştım bazı noktaları pekiştirmem gerekiyor bir projem var ufakta olsa benim için büyük bir öneme sahip o yüzden detaya indim biraz :)


Hayır, == koyman daha mantıklı değil, yazdığım açıklamayı okumamışsın. CUser::Update fonksiyonunun periyodik olarak çağrılmadığından bahsettim sana, bazen 10 saniyede bir, bazen 1.5 saniyede bir tetikleniyor. Sen, aradaki farkı sabit olarak 2 saniye kontrol edersen, fonksiyon 5 saniye aralıkla tetiklendiğinde ne olacak?

2 senedir kaynak kodları ile uğraştığından bahsediyorsun ama kendini tam anlamıyla vermediğini görüyorum. Programlama, yazarak değil akılda kurarak yapılır. Kod yazmak, işin kolay kısmı. Çözmek istediğin bir problemi öncelikle program olarak düşünmeyip, gerçek hayatta olsa nasıl yapardım diye düşünmen lazım. Problemi kafanda çözdüktan sonra kodunu yazması en kolay kısmı.

m_lLastExperienceRewardTime'nin ilk değeri 0.

CUser::Update fonksiyonunun ilk kez çağrılışını izleyelim.

// UNIXTIME = 123456789
// m_lLastExperienceRewardTime = 0

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456789 - 0 = 123456789 >= 2 ? true.
ExpChange(200000);
m_lLastExperienceTime = UNIXTIME; // m_lLastExperienceTime = 123456789;
}

Aradan 1 saniye geçtikten sonra tekrar tetiklendiğini varsayalım.
// UNIXTIME = 123456790
// m_lLastExperienceTime = 123456789

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456790 - 123456789 = 1 >= 2 ? false.
ExpChange(200000); // çalışmayacak
m_lLastExperienceTime = UNIXTIME; // çalışmayacak
}

Aradan 5 saniye geçtikten(başlangıç zamanına göre) sonra tekrar tetiklendiğini varsayalım.
// UNIXTIME = 123456794
// m_lLastExperienceTime = 123456789

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456794 - 123456789 = 5 >= 2 ? true
ExpChange(200000);
m_lLastExperienceTime = UNIXTIME; // m_lLastExperienceTime = 123456794
}


Umarım açıklayıcı olmuştur.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Hayır, == koyman daha mantıklı değil, yazdığım açıklamayı okumamışsın. CUser::Update fonksiyonunun periyodik olarak çağrılmadığından bahsettim sana, bazen 10 saniyede bir, bazen 1.5 saniyede bir tetikleniyor. Sen, aradaki farkı sabit olarak 2 saniye kontrol edersen, fonksiyon 5 saniye aralıkla tetiklendiğinde ne olacak?

2 senedir kaynak kodları ile uğraştığından bahsediyorsun ama kendini tam anlamıyla vermediğini görüyorum. Programlama, yazarak değil akılda kurarak yapılır. Kod yazmak, işin kolay kısmı. Çözmek istediğin bir problemi öncelikle program olarak düşünmeyip, gerçek hayatta olsa nasıl yapardım diye düşünmen lazım. Problemi kafanda çözdüktan sonra kodunu yazması en kolay kısmı.

m_lLastExperienceRewardTime'nin ilk değeri 0.

CUser::Update fonksiyonunun ilk kez çağrılışını izleyelim.

// UNIXTIME = 123456789
// m_lLastExperienceRewardTime = 0

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456789 - 0 = 123456789 >= 2 ? true.
ExpChange(200000);
m_lLastExperienceTime = UNIXTIME; // m_lLastExperienceTime = 123456789;
}

Aradan 1 saniye geçtikten sonra tekrar tetiklendiğini varsayalım.
// UNIXTIME = 123456790
// m_lLastExperienceTime = 123456789

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456790 - 123456789 = 1 >= 2 ? false.
ExpChange(200000); // çalışmayacak
m_lLastExperienceTime = UNIXTIME; // çalışmayacak
}

Aradan 5 saniye geçtikten(başlangıç zamanına göre) sonra tekrar tetiklendiğini varsayalım.
// UNIXTIME = 123456794
// m_lLastExperienceTime = 123456789

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){ // 123456794 - 123456789 = 5 >= 2 ? true
ExpChange(200000);
m_lLastExperienceTime = UNIXTIME; // m_lLastExperienceTime = 123456794
}


Umarım açıklayıcı olmuştur.


Şimdi kavradım olayı aynen dediğiniz gibi *gerçek hayatta olsa nasıl yapardım* sözünü her kod yazdığımda hatırlayacağım çok beğendim sözü 2 senedir uğraşıyoruz fakat elimizden tutan yok öyle sağdan soldan gördüklerimizi deneme yanılma ile yapmaya çalışıyorum artık olayın temel mantığını anlamaya çalışarak yapacağım tekrardan ilginiz için teşekkürler

goto566 Açıklamanız için size de teşekkür ederim

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

uint64 m_lLastExperienceRewardTime = 0; // User.h içerisine tanımlanacak



void CUser::Update(){

/* ... */ // Mevcut kod bloğu

if(UNIXTIME - m_lLastExperienceRewardTime >= 2){

ExpChange(200000);

m_lLastExperienceRewardTime = UNIXTIME;

}

}

 


Her 2 saniyede bir 200k experience verir.

 

 


Reward yazmayı unutmuşsun mustafa.

 

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı

Reward yazmayı unutmuşsun mustafa.

 

 

 

Alıntı

Hocam anladım fakat halen RewardTime ile verdiğiniz kod arasındaki bağı anlamadım yani verdiğiniz kodu,RewardTime nasıl okuyor nerden görüyor,yani onu nasıl baz alarak işlem yapıyor?

ve if(UNIXTIME - m_lLastExperienceTime >= 2){ burada vermiş olduğunuz işlem büyüktür işareti yerine == yaparsak daha mantıklı değil mi sekme olayları felan mı oluyor? ve UNIXTIME dan sonra gelen - nin olayı nedir ? sayarken 2-1-0 diye mi gidiyor yoksa 0-1-2 mi diye işlem yapıyor - olayı + koysak ne değişir?

Hocam çok uğraştırdığımın farkındayım fakat baya uğraştım bazı noktaları pekiştirmem gerekiyor bir projem var ufakta olsa benim için büyük bir öneme sahip o yüzden detaya indim biraz 🙂

 

Alıntı


Birincisi, 'hocam' kelimesi kadar dünyada nefret ettiğim bir kelime daha yoktur, bana karşı hitap ederken kullanmazsan mutlu olurum.

Diğer hususa gelecek olursak, 2. değişkenin de m_lLastExperienceRewardTime olması lazım. Düzelttim.



Konuyu okumayı unutmuşsun resul. a

İletiyi paylaş


Link to post
Sitelerde Paylaş
Misafir
Bu konu kapalıdır ama konuya cevap yazmaya yetkiniz var görünüyor.

×
×
  • Yeni Oluştur...