RABBIT EVENT SİSTEMİ KURULUM REHBERİ DeltaSoft
Ekli dosyayı görüntüle 14496
- 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
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
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);
Dosya: DeltaSoft GameServer/GameServer/GameServerDlg.cpp
Constructor'da ekle:
Kod:
// RABBIT EVENT Sistemi
RabbitEventEnabled = true;
RabbitEventLastSpawn = 0;
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);
}
}
}
}
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());
}
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;
}
- 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
- 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)
- 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ç