C# Kütüphane Belirli Zamanlarda Random Komutunu Çalıştırma

Bu konuyu okuyanlar

CapScroLL

Müdavim
Katılım
22 Ağustos 2014
Mesajlar
3,657
Reaksiyon puanı
2,682
Puanları
113
Yaş
26
Merhabalar, Unturned için RocketMod'da matematik soruları plugini yazıyorum. İlk pluginim olduğu için takıldığım kısımlar oldu, en sonunda tamamen kaldım. Plugin belirli aralıklarda rastgele 2 sayı oluşturup bunları oyun içerisinde duyuracak, oyuncular sayıların toplamını doğru şekilde yazıp ödül kazanacaklar. Ama plugin rastgele sayıları yalnızca ilk çalıştığında oluşturuyor, yani süreklilik yok. Daha önce C# kütüphane oluşturmadım, randomu bir oyun içi komuta bağlayıp belirli aralıklarda konsoldan komutu çalıştırarak rastgele sayıları yenileyip, oyunculara duyurmak mantıklı görünüyor, belki de tek yol... Eğer başka yolu varsa aydınlatırsanız sevinirim, kodları uzun ve karmaşık tutmak istemiyorum.
 

kmurat

Müdavim
Katılım
8 Şubat 2014
Mesajlar
8,486
Çözümler
3
Reaksiyon puanı
3,709
Puanları
113
Tüm Programlama dillerinde Time modülü yada ona benzer isimli bir modül olur. Zamanlamayı onunla ve sonsuz döngü içinde yaparsın.
 

CapScroLL

Müdavim
Katılım
22 Ağustos 2014
Mesajlar
3,657
Reaksiyon puanı
2,682
Puanları
113
Yaş
26
Tüm Programlama dillerinde Time modülü yada ona benzer isimli bir modül olur. Zamanlamayı onunla ve sonsuz döngü içinde yaparsın.
Teşekkürler hocam, zamanlama kısmını tamamladım üstelik kullanıcılar için isteğe özel zaman ayarlama ekledim ama takıldığım son nokta kaldı...
Komut girildiğinde eğer soru bilinmişse eklentinin yanıtı "Şuan bir soru yok!" olmalı, bunun için soru bilindiğinde eklenti zamanlamaya dönüp sürenin dolmasını beklemeli ama nasıl yapacağımı bilemedim, uykusuzluktan mıdır bilemiyorum ama şuan hiç bir fikrim yok... Direkt istediğim mesajı yazdırsam oyuncular hata mesajını aldığı halde ödülü de alacaklar. Kodları bırakayım bir bak istersen, iş mantığa düştü onu da kuramadım bir türlü.
(Kullanıcının girdiği süre: Configuration.Instance.Interval)

C#:
        public void ExecuteCommandcevapla(IRocketPlayer cevaplayan, string[] cevap)
        {
            
            if (cevap.Length > 0)
            {
                if (cevap[0] == toplam.ToString())
                {
                    string dogrucevap = Translate("mathquestions_dogru_cevap", toplam.ToString());
                    UnturnedChat.Say(cevaplayan, dogrucevap);

                    string kazananiduyur = Translate("mathquestions_kazanan_duyuru", cevaplayan, toplam.ToString());
                    UnturnedChat.Say(kazananiduyur);
                }

                else
                {
                    UnturnedChat.Say(cevaplayan, Translate("mathquestions_yanlis_cevap"));
                }
            }
            else
            {
                UnturnedChat.Say(cevaplayan, Translate("mathquestions_hatali_parametre"));
            }
        }
 

kmurat

Müdavim
Katılım
8 Şubat 2014
Mesajlar
8,486
Çözümler
3
Reaksiyon puanı
3,709
Puanları
113
İki adet else var. Else tüm diğer seçenekler geçersizse son seçenek olabilir.
 

CapScroLL

Müdavim
Katılım
22 Ağustos 2014
Mesajlar
3,657
Reaksiyon puanı
2,682
Puanları
113
Yaş
26
Şöyle bir çözüm buldum, "bool cooldown;" Oluşturup oyuncular bildiğinde bunu true yaptırıyorum, eğer cooldown true ise oyuncuya bekleme süresi olduğu mesajını gönderiyorum ardından otomatik soru sormanın süresi geldiğinde yani zamanlayıcı aktif olduğunda cooldown'u false yapıyor, böylece döngü haline giriyor. C# bilgim if else, random ve değişkenlerden ibaret, gereksiz veya uzun yollu kodlar kullanmış olabilirim ama hem bu proje hem sizin sayenizde yeni bilgiler edindim, sorun çözülmüştür teşekkürler.

Komut kısmının güncel hali:
C#:
        //CevaplaCommand
        [RocketCommand("cevapla", "question plugin", "<cevap>", AllowedCaller.Both)]
        public void ExecuteCommandcevapla(IRocketPlayer cevaplayan, string[] cevap)
        {
            if (cevap.Length > 0)
            {
                if (CoolDown == true)
                {
                    string cooldown = Translate("mathquestions_cooldown", Configuration.Instance.Interval.ToString());
                    UnturnedChat.Say(cevaplayan, cooldown);
                }
                if (cevap[0] == ototoplama.ToString() && CoolDown == false)
                {
                    MathQuestions.ExecuteDependencyCode("Uconomy", (IRocketPlugin plugin) =>
                    {
                        Uconomy Uconomy = (Uconomy)plugin;
                        Uconomy.Database.IncreaseBalance(cevaplayan.Id.ToString(), Configuration.Instance.GiveMoney);
                        {
                            string dogrucevap = Translate("mathquestions_true_reply", Configuration.Instance.GiveMoney.ToString(), Uconomy.Configuration.Instance.MoneyName, Uconomy.Database.GetBalance(cevaplayan.Id.ToString()));
                            UnturnedChat.Say(cevaplayan, dogrucevap);
                            string winnerduyuru = Translate("mathquestions_broadcast_winner", cevaplayan, ototoplama.ToString(), Configuration.Instance.GiveMoney.ToString(), Uconomy.Configuration.Instance.MoneyName);
                            UnturnedChat.Say(winnerduyuru);
                            CoolDown = true;
                        }
                    });
                }

                    if (cevap[0] != ototoplama.ToString() && CoolDown == false)
                    {
                        UnturnedChat.Say(cevaplayan, Translate("mathquestions_wrong_reply", ototoplama.ToString()));
                    }
            }
            else
            {
                UnturnedChat.Say(cevaplayan, Translate("mathquestions_attention"));
            }
        }
 

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
Şöyle bir çözüm buldum, "bool cooldown;" Oluşturup oyuncular bildiğinde bunu true yaptırıyorum, eğer cooldown true ise oyuncuya bekleme süresi olduğu mesajını gönderiyorum ardından otomatik soru sormanın süresi geldiğinde yani zamanlayıcı aktif olduğunda cooldown'u false yapıyor, böylece döngü haline giriyor. C# bilgim if else, random ve değişkenlerden ibaret, gereksiz veya uzun yollu kodlar kullanmış olabilirim ama hem bu proje hem sizin sayenizde yeni bilgiler edindim, sorun çözülmüştür teşekkürler.


Iki sorum olacak hocam

Bu plugin nasil bir plugin tam olarak? Unturned sanirim oyun.. Oyun icin GUI tabanli bir plugin mi yapiyorsun? Bu konuda biraz bilgi verirsen sevinirim..

Ikinci sorum ise, multi-threading calisirsa kodunun düzgün calismama ihtimali var. Arkaplanini bilmedigim icin net bir sey söyleyemiyorum ama bu plugin multi-threading ile cagrilinca hatalar olusacak (mesela race condition hatasi olur. Bir thread atiyorum true yaptirirken digeri false yaptiracak ve diger thread yanlis sonucla yürüyecek.. gibi). Bu tür seylere karsi monitor, semaphore (IPC), mutex, lock gibi seyler kullanman gerek.
 

CapScroLL

Müdavim
Katılım
22 Ağustos 2014
Mesajlar
3,657
Reaksiyon puanı
2,682
Puanları
113
Yaş
26
Iki sorum olacak hocam

Bu plugin nasil bir plugin tam olarak? Unturned sanirim oyun.. Oyun icin GUI tabanli bir plugin mi yapiyorsun? Bu konuda biraz bilgi verirsen sevinirim..

Ikinci sorum ise, multi-threading calisirsa kodunun düzgün calismama ihtimali var. Arkaplanini bilmedigim icin net bir sey söyleyemiyorum ama bu plugin multi-threading ile cagrilinca hatalar olusacak (mesela race condition hatasi olur. Bir thread atiyorum true yaptirirken digeri false yaptiracak ve diger thread yanlis sonucla yürüyecek.. gibi). Bu tür seylere karsi monitor, semaphore (IPC), mutex, lock gibi seyler kullanman gerek.
Unturned Unity tabanlı, sistemi Minecraft, DayZ karışımına benzeyen ücretsiz bir oyun. Server açabiliyorsunuz ve C# İle yazılan Rocketmod ile serverda plugin vb. özellikler kullanabiliyorsunuz. Eklenti yazmak için C# class projesi açıp Rocketmod'un ve oyunun UnityEngine kütüphanelerini içeri aktarıp yazdığınız eklentide Rocketmod ile bağlantı kuruyorsunuz. Rocketmod'un hazırladığı kodlar ile oyunun motorundan server yazılım odasına rahat ve geniş bir şekilde erişebiliyorsunuz. Ben terimleri çok iyi bilmediğim için anlatımım yanlış veya anlamsız olabilir, isterseniz altta linkini verdiğim rehberlere bakabilirsiniz. Eğer C# Bilginiz iyi ise plugin sayısını artırabilirsiniz, Türkiye'de bu oyuna ilk plugin yazan benim galiba çünkü pluginleri yapanların arasında hiç Türk yok, oyunun kitlesi daha çok yapmak yerine hazırı seçmeyi seviyor. Pluginlerin linkini alta bırakıyorum. Ayrıca NuGet'te Rocket'in kurucusu fr34kyn01535'in yanında Enes Sadık Özbek Diye bir hocamızın adı yazıyor, Rocket için şunları uygulamış ama ne yazık kiplugin geliştirmemiş;
RocketMod'da aşağıdakileri yaptım:
  • * RocketMod çekirdek kütüphanelerini yazdım * 100'den fazla kod satırı 700'den fazla komisyona katkıda bulundu
  • * EF Core ve NHibernate entegrasyonları
  • * UnityEngine entegrasyonu
  • * JavaScript ve Lua gibi çeşitli betik dilleri için bağlantılar eklendi
  • * Çeşitli DevOps görevleri ve ayarları proje yönetimi ve geliştirici araçları
  • * AppVeyor CI ve CD entegrasyonları (NuGet'e otomatik dağıtımı ile)
  • * Contribute Unit testleri
RocketMod Hakkında
İlk Eklenti Tutorial
Pluginler

Bahsettiğiniz olay mantıklı, önlem olarak try-catch kullandım. Yalnızca bir zamanlayıcı var ve bu zamanlayıcı try-catch blogu arasında kullanıcının istediği süreye göre kendini tekrarlıyor.
 
Son düzenleme:

ertan2002

Asistan
Katılım
9 Aralık 2008
Mesajlar
346
Reaksiyon puanı
112
Puanları
43
Ayrintili cevap icin tesekkürler hocam :) Ben de daha önce bir plugin sistemi yazdim ve GUI tabanli. Acikcasi pek örnegi yoktu baya bir ugrastirmisti özellikle Dll hell konusu sikinti cikariyordu. MAF ve MEF kullandim bunun yaninda bir arkadas da ek olarak DI plugini ekledi (unity olmasi lazim ama unity 3d ile karistirma). Oyunlarla pek ilgim yok, ancak zamaninda ders icin bir oyun tasarlamistik kinect kullanarak.. Burda videosu var

http://human-ist.unifr.ch/sites/human-ist.unifr.ch/files/WhiteHatSniper_video.mp4 . (videodaki kisi arkadasin arkadasi.. ) Kinect kamera bize eklem boyutunda koordinatlar sunuyor. Oyunumuz bu koordinatlara göre silahi kontrol ediyor. Ayrica sesle kontrol de mümknü (ancak video cekilirken calismamis)

Race Condition icin cözümünüzü anladim ancak cok kötü bir cözüm. Bunu yayinlarsaniz da baya bir elestiri alirsiniz haberiniz olsun. En basitinden yapmak istiyorsaniz bir tane static object olusturun ve locklamak istediginiz yerde onu kullanin

burdaki örneklere bakabilirsin
 

CapScroLL

Müdavim
Katılım
22 Ağustos 2014
Mesajlar
3,657
Reaksiyon puanı
2,682
Puanları
113
Yaş
26
Ayrintili cevap icin tesekkürler hocam :) Ben de daha önce bir plugin sistemi yazdim ve GUI tabanli. Acikcasi pek örnegi yoktu baya bir ugrastirmisti özellikle Dll hell konusu sikinti cikariyordu. MAF ve MEF kullandim bunun yaninda bir arkadas da ek olarak DI plugini ekledi (unity olmasi lazim ama unity 3d ile karistirma). Oyunlarla pek ilgim yok, ancak zamaninda ders icin bir oyun tasarlamistik kinect kullanarak.. Burda videosu var

http://human-ist.unifr.ch/sites/human-ist.unifr.ch/files/WhiteHatSniper_video.mp4 . (videodaki kisi arkadasin arkadasi.. ) Kinect kamera bize eklem boyutunda koordinatlar sunuyor. Oyunumuz bu koordinatlara göre silahi kontrol ediyor. Ayrica sesle kontrol de mümknü (ancak video cekilirken calismamis)

Race Condition icin cözümünüzü anladim ancak cok kötü bir cözüm. Bunu yayinlarsaniz da baya bir elestiri alirsiniz haberiniz olsun. En basitinden yapmak istiyorsaniz bir tane static object olusturun ve locklamak istediginiz yerde onu kullanin

burdaki örneklere bakabilirsin
Oyun ders için olmasına rağmen başarılı görünüyor, ellerinize sağlık. Önerinizi dikkate aldım şimdi örneklere bakıyorum, dediğim gibi C#'ta başlangıç düzeyindeyim. Bu eklentiyi sadece "/answer a" yazıldığında sunucunun "Cevabınız a" dediği tutorial videosunu izleyerek yaptım, zaten ondan başka hiç bir tutorial videosu yok... Sayenizde önemli bilgiler ediniyorum, tekrardan teşekkür ederim.
 
Üst