Neler yeni
XenForo Bannerlar

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Kod Oylama Sistemi [C++ Python]

Fatih Bulut

Süper Üye
Katılım
6 Kas 2021
Mesajlar
3,011
Tepkime puanı
4,532
Puanları
113
Yaş
31
Konum
Türkiye
Dc
fatihbulut

Oylama Akışı (60 saniye süreli):​

  1. GM /oylamaac yazar (veya NPC’den başlatır)
  2. Oy sayıları 0'lanır, oylama_aktif = 1 yapılır
  3. Her oyuncunun ekranına panel açılır (event_vote_open)
  4. Oyuncular 1 kez oy kullanabilir (/vote X)
  5. 60 saniye sonra oylama_bitir tetiklenir
  6. Kazanan seçenek belirlenir ve duyurulur
Bu fonksiyon, serverdan event_vote_open komutu geldiğinde, uiEventVote.py içindeki arayüzü çağırır ve gösterir.
  • Oyuna GM olarak gir
  • Komutu yaz: /oylamaac
  • Diğer oyuncuların ekranında panel açılmalı
  • Oyuncu bir seçeneğe tıkladığında: Panel kapanır/vote x komutu server’a giderChat ekranında "oy verdiniz" yazar.

    Oyuncuların ekranında şu şekilde görünür:
    OYLAMA SONUCU:
    1. Metin Yağmuru - 15 oy
    2. Boss Saldırısı - 9 oy
    3. 2x EXP - 22 oy
    Kazanan: 2x EXP (22 oy)​

  • Bu sayede oyuncular oylama sonucunu anlık olarak görebilir.​

Kod:
quest event_vote begin
    state start begin
        function get_winner()
            local oy1 = game.get_event_flag("oy1")
            local oy2 = game.get_event_flag("oy2")
            local oy3 = game.get_event_flag("oy3")

            if oy1 >= oy2 and oy1 >= oy3 then
                return "Metin Yağmuru", oy1
            elseif oy2 >= oy1 and oy2 >= oy3 then
                return "Boss Saldırısı", oy2
            else
                return "2x EXP", oy3
            end
        end

        when login begin
            if game.get_event_flag("oylama_aktif") == 1 then
                command("event_vote_open")
            end
        end

        when command "vote" begin
            local vote = tonumber(arg1)
            if game.get_event_flag("oylama_aktif") != 1 then
                chat("Şu anda aktif bir oylama yok.")
                return
            end

            if vote >= 1 and vote <= 3 then
                game.set_event_flag("oy"..vote, game.get_event_flag("oy"..vote) + 1)
                chat("Oy verdiğiniz için teşekkürler!")
            else
                chat("Geçersiz oy!")
            end
        end

        when 20011.chat."Oylamayı Elle Başlat" with pc.is_gm() begin
            say_title("GM Paneli")
            say("60 saniyelik oylamayı başlatmak istiyor musun?")
            local s = select("Evet", "Hayır")
            if s == 1 then
                notice_all("Oylama başladı! Etkinlik seçimini yapmayı unutma!")
                game.set_event_flag("oylama_aktif", 1)
                game.set_event_flag("oy1", 0)
                game.set_event_flag("oy2", 0)
                game.set_event_flag("oy3", 0)
                command("event_vote_open")
                timer("oylama_bitir", 60)
            end
        end

        when oylama_bitir.timer begin
            game.set_event_flag("oylama_aktif", 0)

            local kazanan, oy = event_vote.get_winner()
            notice_all("Oylama sona erdi!")
            notice_all("Kazanan etkinlik: "..kazanan.." ("..oy.." oy)")
        end
    end
end

Kod:
başa ekle //
ACMD(do_oylamaac);

komut yerine//
{ "oylamaac", do_oylamaac, GM_LOW_WIZARD },

cmd_general.cpp – Komut işlevi

Kod:
ACMD(do_oylamaac)
{
    // Sadece GM'ler kullanabilsin
    if (!ch || ch->GetGMLevel() < GM_LOW_WIZARD)
        return;

    // Quest flag'ları sıfırla (quest ile birlikte çalışır)
    quest::CQuestManager::instance().RequestSetEventFlag("oylama_aktif", 1);
    quest::CQuestManager::instance().RequestSetEventFlag("oy1", 0);
    quest::CQuestManager::instance().RequestSetEventFlag("oy2", 0);
    quest::CQuestManager::instance().RequestSetEventFlag("oy3", 0);

    // Tüm aktif oyunculara client komutu gönder: "event_vote_open"
    const DESC_MANAGER::DESC_SET& clientSet = DESC_MANAGER::instance().GetClientSet();
    for (const auto& desc : clientSet)
    {
        if (desc && desc->GetCharacter())
        {
            desc->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "event_vote_open");
        }
    }

    // Komutu yazan GM'ye bilgi ver
    ch->ChatPacket(CHAT_TYPE_INFO, "Oylama başlatıldı ve tüm oyunculara gönderildi.");
}

Pack//

Pack'in root/ klasörüne uiEventVote.py adlı yeni bir dosya ekle. İçeriği şu şekilde:

Kod:
import ui
import net
import chat

class EventVoteDialog(ui.Board):
    def __init__(self):
        ui.Board.__init__(self)
        self.SetSize(270, 180)
        self.SetCenterPosition()
        self.AddFlag("movable")
        self.AddFlag("float")

        self.titleBar = ui.TitleBar()
        self.titleBar.SetParent(self)
        self.titleBar.MakeTitleBar(270, "Etkinlik Oylaması")
        self.titleBar.Show()

        self.CreateVoteButtons()

    def CreateVoteButtons(self):
        self.voteOptions = [
            ("Metin Yağmuru", 1),
            ("Boss Saldırısı", 2),
            ("2x EXP", 3)
        ]

        for i, (text, vote_id) in enumerate(self.voteOptions):
            button = ui.Button()
            button.SetParent(self)
            button.SetPosition(30, 40 + i * 40)
            button.SetText(text)
            button.SetEvent(lambda v=vote_id: self.SendVote(v))
            button.Show()

    def SendVote(self, vote_id):
        net.SendChatPacket(f"/vote {vote_id}")
        chat.AppendChat(chat.CHAT_TYPE_INFO, f"{vote_id}. seçeneğe oy verdiniz. Teşekkürler!")
        self. Hide()

game.py içinde __ServerCommand_Build() fonksiyonunu bul.

Kod:
def __ServerCommand_Build(self):
    serverCommandList = {
        ...
    }

Buraya aşağıdaki satırı ekle:

Kod:
"event_vote_open" : self.__VotePanelOpen,

__ServerCommand_Build fonksiyonu altına veya dosyanın uygun yerine şu yeni metodu ekle:

Kod:
def __VotePanelOpen(self):
    import uiEventVote
    self.voteDialog = uiEventVote.EventVoteDialog()
    self.voteDialog.Show()
 

Benzer konular

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar