Neler yeni

KAYNAK KOD 🐰 RABBIT EVENT SİSTEMİ KURULUM REHBERİ DeltaSoft🐰

tades123

Yönetici
Katılım
10 Ocak 2025
Mesajlar
29
Tepkime puanı
3
Puanları
8

🐰 RABBIT EVENT SİSTEMİ KURULUM REHBERİ DeltaSoft🐰
1770226465949.png


🐰 RABBIT EVENT SİSTEMİ KURULUM REHBERİ 🐰

Ekli dosyayı görüntüle 14496

📋 SİSTEM ÖZELLİKLERİ
  • Her 1 dakikada Ronark Land'de otomatik rabbit spawn
  • Online userların %20'si kadar rabbit spawn (min 1, max 10)
  • Rabbit oyuncuyu takip eder
  • 60 saniye sonra kaybolur
  • Ödül: 50 TL + 100 NP
  • Sunucu açılışında otomatik aktif
  • +rabbitevent komutu ile açma/kapama

🔧 KURULUM ADIMLARI

1️⃣ ADIM 1: MAX_NPC Tanımını Ekle

Dosya: DeltaSoft GameServer/shared/globals.h

Bul:
Kod:
#define MAX_USER                5000

#define EVENTMAXROOM        10000

Değiştir:
Kod:
#define MAX_USER                5000
#define MAX_NPC                    3000

#define EVENTMAXROOM        10000

2️⃣ ADIM 2: GameServerDlg.h Değişkenleri

Dosya: DeltaSoft GameServer/GameServer/GameServerDlg.h

Bul (RABBIT EVENT bölümünü):
Kod:
    // RABBIT EVENT Sistemi
    bool RabbitEventEnabled;
    time_t RabbitEventLastSpawn;

Eğer yoksa ekle:
Kod:
    // RABBIT EVENT Sistemi
    bool RabbitEventEnabled;
    time_t RabbitEventLastSpawn;

Ayrıca komut handler'ını ekle:
Kod:
    COMMAND_HANDLER(HandleRabbitEventToggle);

3️⃣ ADIM 3: GameServerDlg.cpp Başlangıç Değerleri

Dosya: DeltaSoft GameServer/GameServer/GameServerDlg.cpp

Constructor'da ekle:
Kod:
    // RABBIT EVENT Sistemi
    RabbitEventEnabled = true;
    RabbitEventLastSpawn = 0;

4️⃣ ADIM 4: ServerStartStopHandler.cpp Ana Sistem

Dosya: DeltaSoft GameServer/GameServer/ServerStartStopHandler.cpp

Include'ların sonuna ekle:
Kod:
// MAX_NPC tanımı eğer globals.h'da yoksa
#ifndef MAX_NPC
#define MAX_NPC 3000
#endif

UpdateGameTime() fonksiyonunun sonuna ekle:
Kod:
    /* RABBIT EVENT - Her 1 dakikada Ronark Land'deki userlerin yanına spawn */
    if (RabbitEventEnabled)
    {
        time_t currentTime = time(nullptr);
      
        // Her 1 dakikada bir kontrol et
        if (currentTime - RabbitEventLastSpawn >= 60) // 60 saniye = 1 dakika
        {
            RabbitEventLastSpawn = currentTime;
          
            // Ronark Land'deki tüm userleri topla
            std::vector<CUser*> ronarkUsers;
          
            for (uint16 i = 0; i < MAX_USER; i++)
            {
                CUser* pUser = g_pMain->GetUserPtr(i);
                if (pUser == nullptr || !pUser->isInGame() || pUser->GetZoneID() != ZONE_RONARK_LAND)
                    continue;
                  
                ronarkUsers.push_back(pUser);
            }
          
            // Eğer Ronark Land'de user varsa
            if (ronarkUsers.size() > 0)
            {
                // User sayısının %20'si kadar rabbit spawn et (minimum 1, maksimum 10)
                int rabbitCount = std::max(1, std::min(10, (int)(ronarkUsers.size() * 0.2f)));
              
                // Rastgele userları seç
                std::random_shuffle(ronarkUsers.begin(), ronarkUsers.end());
              
                for (int i = 0; i < rabbitCount && i < (int)ronarkUsers.size(); i++)
                {
                    CUser* pTargetUser = ronarkUsers[i];
                  
                    // Userin etrafında 5-10 metre rastgele konum belirle
                    float userX = pTargetUser->GetX();
                    float userZ = pTargetUser->GetZ();
                  
                    // 5-10 metre arası rastgele mesafe
                    float distance = 5.0f + (rand() % 6); // 5-10 arası
                    float angle = (rand() % 360) * 3.14159f / 180.0f; // Rastgele açı
                  
                    float spawnX = userX + (distance * cos(angle));
                    float spawnZ = userZ + (distance * sin(angle));
                  
                    // Rabbit spawn et (ID: 9944, 60 saniye yaşasın, hedef oyuncuyu takip etsin)
                    CNpc* pRabbit = nullptr;
                    g_pMain->SpawnEventNpc(9944, true, ZONE_RONARK_LAND, spawnX, 0, spawnZ, 1, 0, 60, 0, pTargetUser->GetSocketID()); // socketID ile takip
                  
                    // Spawn edilen rabbit'i bul ve hedef oyuncuyu takip etmesini sağla
                    // Kısa bir bekleme sonrası rabbit'i bul (spawn işlemi asenkron olabilir)
                    Sleep(100); // 100ms bekle
                  
                    // Ronark Land'deki tüm NPC'leri kontrol et ve yeni spawn olan rabbit'i bul
                    for (uint16 npcId = NPC_BAND; npcId < MAX_USER + MAX_NPC; npcId++)
                    {
                        CNpc* pNpc = g_pMain->GetNpcPtr(npcId, ZONE_RONARK_LAND);
                        if (pNpc != nullptr && pNpc->GetProtoID() == 9944 && pNpc->m_oSocketID == pTargetUser->GetSocketID())
                        {
                            // Bu bizim yeni spawn ettiğimiz rabbit
                            pRabbit = pNpc;
                          
                            // Rabbit'in hedef oyuncuyu takip etmesini sağla
                            pRabbit->ChangeTarget(0, pTargetUser);
                          
                            // Rabbit'in hareket tipini takip moduna ayarla
                            pRabbit->m_byMoveType = 1; // Hareket edebilir
                            pRabbit->m_byInitMoveType = 1;
                          
                            break;
                        }
                    }
                  
                    // Bildirim gönder
                    std::string rabbitNotice = string_format("RABBIT EVENT: %s kisisinin yanina rabbit spawn olmustur! Rabbit seni takip ediyor! (50 TL + 100 NP odul)",
                        pTargetUser->GetName().c_str());
                    g_pMain->SendNotice(rabbitNotice.c_str(), Nation::ALL);
                  
                    // Hedef oyuncuya özel mesaj
                    std::string personalMessage = string_format("Bir rabbit yaninda spawn oldu ve seni takip ediyor! Onu oldurursen 50 TL + 100 NP kazanacaksin!");
                    g_pMain->SendHelpDescription(pTargetUser, personalMessage);
                  
                    // Console log
                    printf("[RABBIT EVENT] : -> %s kisisinin yanina rabbit spawn oldu ve onu takip ediyor. Konum: %.0f, %.0f\n",
                        pTargetUser->GetName().c_str(), spawnX, spawnZ);
                }
              
                // Genel bildirim
                std::string generalNotice = string_format("RABBIT EVENT: Ronark Land'de %d rabbit spawn oldu! Rabbit'ler hedeflerini takip ediyor! Kesene 50 TL + 100 NP!", rabbitCount);
                g_pMain->SendAnnouncement(generalNotice.c_str(), Nation::ALL);
              
                // Popup bildirimi (açık pembe renk)
                std::string rabbitSpawnPopup = string_format("RABBIT SPAWN!\n\n%d Rabbit spawn oldu!\n\nRabbit'ler hedeflerini takip ediyor!\nKacamazsin!\n\n50 TL + 100 NP odul!", rabbitCount);
                g_pMain->SendNoticeWindAll(rabbitSpawnPopup, 0xFFFFB6C1); // Açık pembe
              
                printf("[RABBIT EVENT] : -> Ronark Land'de %d rabbit spawn oldu. (%zu user online)\n", rabbitCount, ronarkUsers.size());
            }
        }
      
        // Her 5 saniyede bir mevcut rabbit'lerin hedeflerini güncelle
        static time_t lastRabbitUpdateTime = 0;
        if (currentTime - lastRabbitUpdateTime >= 5) // 5 saniye
        {
            lastRabbitUpdateTime = currentTime;
          
            // Ronark Land'deki tüm rabbit'leri bul ve hedeflerini güncelle
            for (uint16 npcId = NPC_BAND; npcId < MAX_USER + MAX_NPC; npcId++)
            {
                CNpc* pRabbit = g_pMain->GetNpcPtr(npcId, ZONE_RONARK_LAND);
                if (pRabbit == nullptr || pRabbit->GetProtoID() != 9944)
                    continue;
                  
                // Hedef oyuncuyu bul
                CUser* pTargetUser = g_pMain->GetUserPtr(pRabbit->m_oSocketID);
                if (pTargetUser != nullptr && pTargetUser->isInGame() && pTargetUser->GetZoneID() == ZONE_RONARK_LAND)
                {
                    // Rabbit'in hedefini güncelle
                    pRabbit->ChangeTarget(0, pTargetUser);
                }
            }
        }
    }

5️⃣ ADIM 5: Npc.cpp Ödül Sistemi

Dosya: DeltaSoft GameServer/GameServer/Npc.cpp

OnDeathProcess() fonksiyonunda, MANES EVENT kısmından sonra ekle:
Kod:
        // RABBIT EVENT BOSS REWARD SYSTEM
        if (GetProtoID() == 9944) // RABBIT Boss ID
        {
            // 50 TL + 100 NP ödülü ver
            pUser->GiveBalance(0, 50); // 0 KC, 50 TL
            pUser->SendLoyaltyChange("RABBIT", 100); // 100 NP
          
            // Oyuncuya bilgi ver
            std::string rewardMessage = string_format("Tebrikler %s! Seni takip eden Rabbit'i oldurdugün icin 50 TL + 100 NP kazandin!", pUser->GetName().c_str());
            g_pMain->SendHelpDescription(pUser, rewardMessage);
          
            // Sunucu genelinde duyuru yap
            std::string serverNotice = string_format("[RABBIT EVENT] %s oyuncusu takipci Rabbit'ini oldurdu ve 50 TL + 100 NP kazandi!", pUser->GetName().c_str());
            g_pMain->SendNotice(serverNotice.c_str(), Nation::ALL);
          
            // Rabbit öldürme popup bildirimi (pembe renk)
            std::string rabbitKillPopup = string_format("RABBIT OLDURULDU!\n\n%s\nkazandi!\n\nTakipci rabbit'ini oldurdu!\n50 TL + 100 NP odul!", pUser->GetName().c_str());
            g_pMain->SendNoticeWindAll(rabbitKillPopup, 0xFFFF69B4); // Pembe renk
          
            // Console'a log yaz
            printf("[RABBIT EVENT REWARD] : -> %s oyuncusu Rabbit oldurdu ve 50 TL + 100 NP aldi. Konum: %.0f, %.0f\n",
                pUser->GetName().c_str(), GetX(), GetZ());
        }

6️⃣ ADIM 6: ChatHandler.cpp Komut Sistemi

Dosya: DeltaSoft GameServer/GameServer/ChatHandler.cpp

InitServerCommands() fonksiyonunda komut tablosuna ekle:
Kod:
        { "rabbitevent",        &CGameServerDlg::HandleRabbitEventToggle,            "Toggle Rabbit Event System (Every 1 minute in Ronark Land)" },

Dosyanın sonuna komut handler'ını ekle:
Kod:
COMMAND_HANDLER(CGameServerDlg::HandleRabbitEventToggle)
{
    RabbitEventEnabled = !RabbitEventEnabled;
  
    std::string statusMessage = string_format("RABBIT Event Sistemi: %s (Her 1 dakikada Ronark Land'de spawn)",
        RabbitEventEnabled ? "ACIK" : "KAPALI");
  
    printf("[RABBIT EVENT] : -> %s\n", statusMessage.c_str());
    SendNotice(statusMessage.c_str(), Nation::ALL);
  
    // Popup bildirimi
    std::string popupMessage = string_format("RABBIT EVENT\n\nSistem: %s\n\nRonark Land'de her 1 dakikada\nrandom userlerin yanina spawn\n\n50 TL + 100 NP odul!",
        RabbitEventEnabled ? "ACILDI" : "KAPATILDI");
    SendNoticeWindAll(popupMessage, RabbitEventEnabled ? 0xFFFF69B4 : 0xFFFF0000); // Pembe/Kırmızı
  
    return true;
}

🎮 KULLANIM

  • Otomatik Başlatma: Sunucu açıldığında sistem otomatik aktif
  • Manuel Kontrol: +rabbitevent komutu ile açma/kapama
  • Rabbit ID: 9944 (database'de bu ID'ye sahip NPC olmalı)
  • Zone: Sadece Ronark Land (ZONE_RONARK_LAND)
  • Spawn Sıklığı: Her 1 dakika
  • Yaşam Süresi: 60 saniye
  • Ödül: 50 TL + 100 NP

⚠️ ÖNEMLİ NOTLAR

  • ZONE_RONARK_LAND tanımının doğru olduğundan emin olun
  • 9944 ID'li NPC database'de mevcut olmalı
  • GiveBalance ve SendLoyaltyChange fonksiyonları çalışır durumda olmalı
  • SendNoticeWindAll fonksiyonu popup bildirimleri için gerekli
  • Tüm Turkish karakterler ASCII'ye çevrildi (encoding sorunu olmaması için)

✅ TEST ETME

  • Sunucuyu başlat
  • Ronark Land'e git
  • 1 dakika bekle
  • Rabbit spawn olup olmadığını kontrol et
  • Rabbit'i öldür ve ödül gelip gelmediğini kontrol et
  • +rabbitevent komutu ile sistemi kapat/aç

🎯 SİSTEM BAŞARIYLA KURULDU!
 
Üst Alt