Sosyal açıldı! Bir göz at → Hemen gir →

PROSEDÜR +Banka +Sund Sistemi NPC Yanına Çağır Kaynak KODU - *********

Silinen üye 471

KY Cezalı Üye
KAYIT
7 Eyl 2023
Mesajlar
753
Çözümler
2
Tepki puanı
574
+banka ve +sund NPC Spawn Sistemi
Oyuncuların Yanına Geçici NPC Çağırma Sistemi



Sistem Özellikleri

  • +sund komutu: Sundries NPC (genel eşya satıcısı) spawn eder
  • +banka komutu: Banka NPC (depo erişimi) spawn eder
  • Süre: 30 saniye sonra otomatik silinir
  • Cooldown: 30 saniye bekleme süresi
  • Maliyet: Ayarlanabilir (varsayılan: 100,000 coins)
  • Pozisyon: Oyuncunun 2 birim yanında spawn olur
  • Güvenlik: Event room'larda kullanılamaz
  • GM Ayrıcalığı: GM'ler cooldown'dan muaf



⚙️ KURULUM ADIMLARI



ADIM 1: Define.h Düzenlemesi

Dosya: GameServer/Define.h
Konum: Dosyanın sonuna ekleyin

C++:
// =====================================================
// SUMMON MERCHANT SYSTEM - NPC Çağırma Sistemi
// =====================================================
#define LAST_SUMMON_SUNDRIES_TIME    30000   // 30 saniye cooldown
#define PRIVATE_SUNDIRES_NPC          13007  // Sundries NPC ID
#define LAST_SUMMON_BANKA_TIME        30000   // 30 saniye cooldown
#define PRIVATE_BANKA_NPC             16096  // Banka NPC ID





ADIM 2: User.h Düzenlemesi

Dosya: GameServer/User.h
Konum: Sınıf değişkenlerinin olduğu bölüme ekleyin (yaklaşık satır 154 civarı)

Arama: ULONGLONG m_iLastExchangeTime satırını bulun
Altına ekleyin:

C++:
    ULONGLONG m_iLastExchangeTime, m_surallinfotime;
    ULONGLONG m_iLastSummonSundriesTime;  // +sund cooldown
    ULONGLONG m_iLastSummonBankaTime;     // +banka cooldown




ADIM 3: GameServerDlg.h Düzenlemesi

Dosya: GameServer/GameServerDlg.h
Konum: Public değişkenler bölümüne ekleyin (yaklaşık satır 1280 civarı)

Arama: uint8 m_byWeather; satırını bulun
Üstüne ekleyin:

C++:
    uint8 m_byWeather;
  
    // Summon Merchant System
    bool FarmSundriesStatus;
    uint32 FarmSundriesCoins;
    bool FarmBankaStatus;
    uint32 FarmBankaCoins;





ADIM 4: GameServerDlg.cpp Düzenlemesi

Dosya: GameServer/GameServerDlg.cpp
Konum: CGameServerDlg::LoadConfigSettings() fonksiyonunda

Arama: m_byWeather = ini.GetInt("TIMER", "WEATHER", 1); satırını bulun
Üstüne ekleyin:

C++:
    // Summon Merchant System Settings
    FarmSundriesCoins = ini.GetInt("USER_SUNDRIES_SUMMON", "SUMMON_COINS", 100000);
    FarmSundriesStatus = ini.GetBool("USER_SUNDRIES_SUMMON", "STATUS", true);
  
    FarmBankaCoins = ini.GetInt("USER_BANKA_SUMMON", "SUMMON_COINS", 100000);
    FarmBankaStatus = ini.GetBool("USER_BANKA_SUMMON", "STATUS", true);
  
    m_byWeather = ini.GetInt("TIMER", "WEATHER", 1);





ADIM 5: ChatHandler.cpp Düzenlemesi

Dosya: GameServer/ChatHandler.cpp
Konum: CUser::Chat() fonksiyonunda, diğer komutların olduğu yere ekleyin

Arama: Diğer chat komutlarının olduğu bölümü bulun (örn: if (chatstr.compare("+party") == 0))
Altına ekleyin:

C++:
    // =====================================================
    // +sund KOMUTU - Sundries NPC Spawn
    // =====================================================
    if (chatstr.compare("+sund") == 0)
    {
        // Sistem aktif mi kontrol et
        if (!g_pMain->FarmSundriesStatus)
        {
            g_pMain->SendYesilNotice(this, "Sundries Summon : Sunucuda Aktif Degildir");
            return;
        }
      
        // Event room kontrolü
        if (GetEventRoom() > 0)
        {
            g_pMain->SendYesilNotice(this, "Sundries Summon : Burada Summon Merchant Kullanilamaz");
            return;
        }
      
        // Cooldown kontrolü (GM'ler muaf)
        if (UNIXTIME2 - m_iLastSummonSundriesTime < LAST_SUMMON_SUNDRIES_TIME && !isGM())
        {
            g_pMain->SendYesilNotice(this, "Sundries Summon : Tekrar Sundries Cikarabilmek Icin Bir Sure Beklemelisiniz");
            return;
        }
      
        // Para kontrolü ve kesme
        if (g_pMain->FarmSundriesCoins > 0)
        {
            if (GetCoins() < uint32(g_pMain->FarmSundriesCoins))
            {
                g_pMain->SendYesilNotice(this, "Sundries Summon : Sundries Cikarmak Icin Yeterli Paraniz Yok");
                return;
            }
            GoldLose(uint32(g_pMain->FarmSundriesCoins), true);
        }
      
        // NPC spawn et
        g_pMain->SpawnEventNpc(PRIVATE_SUNDIRES_NPC, false, GetZoneID(),
                               GetX() + 2.0f, GetY(), GetZ() + 2.0f,
                               1, 1, 30);
      
        g_pMain->SendYesilNotice(this, "Sundries Summon : Sundries 30 Saniye Sonra Silinecektir");
        m_iLastSummonSundriesTime = UNIXTIME2;
        return; //*********
    }

    // =====================================================
    // +banka KOMUTU - Banka NPC Spawn
    // =====================================================
    if (chatstr.compare("+banka") == 0)
    {
        // Sistem aktif mi kontrol et
        if (!g_pMain->FarmBankaStatus)
        {
            g_pMain->SendYesilNotice(this, "Banka Summon : Sunucuda Aktif Degildir");
            return;
        }
      
        // Event room kontrolü
        if (GetEventRoom() > 0)
        {
            g_pMain->SendYesilNotice(this, "Banka Summon : Burada Summon Merchant Kullanilamaz");
            return;
        }
      
        // Cooldown kontrolü (GM'ler muaf)
        if (UNIXTIME2 - m_iLastSummonBankaTime < LAST_SUMMON_BANKA_TIME && !isGM())
        {
            g_pMain->SendYesilNotice(this, "Banka Summon : Tekrar Banka Cikarabilmek Icin Bir Sure Beklemelisiniz");
            return;
        }
      
        // Para kontrolü ve kesme
        if (g_pMain->FarmBankaCoins > 0)
        {
            if (GetCoins() < uint32(g_pMain->FarmBankaCoins))
            {
                g_pMain->SendYesilNotice(this, "Banka Summon : Banka Cikarmak Icin Yeterli Paraniz Yok");
                return;
            }
            GoldLose(uint32(g_pMain->FarmBankaCoins), true);//*********
        }
      
        // NPC spawn et
        g_pMain->SpawnEventNpc(PRIVATE_BANKA_NPC, false, GetZoneID(),
                               GetX() + 2.0f, GetY(), GetZ() + 2.0f,
                               1, 1, 30);
      
        g_pMain->SendYesilNotice(this, "Banka Summon : Banka 30 Saniye Sonra Silinecektir");
        m_iLastSummonBankaTime = UNIXTIME2;
        return;
    }




ADIM 6: server.ini Ayarları

Dosya: server.ini
Konum: Dosyanın sonuna ekleyin

INI:
# =====================================================
# SUMMON MERCHANT SYSTEM - NPC Çağırma Sistemi
# =====================================================

[USER_SUNDRIES_SUMMON]//*********
STATUS = 1              ; 1=Aktif, 0=Kapalı
SUMMON_COINS = 100000   ; Spawn maliyeti (coins)

[USER_BANKA_SUMMON]
STATUS = 1              ; 1=Aktif, 0=Kapalı
SUMMON_COINS = 100000   ; Spawn maliyeti (coins)

STATUS: Sistemi açıp kapatır (1=Açık, 0=Kapalı)
SUMMON_COINS: NPC spawn etmek için gereken coin miktarı
Not: 0 yaparsanız ücretsiz olur



ADIM 7: Veritabanı Ayarları

Veritabanı: GAMEDB
Tablo: K_NPC

NPC'lerin veritabanında tanımlı olduğundan emin olun:

SQL:
-- Sundries NPC kontrolü
SELECT * FROM K_NPC WHERE sSid = 13007;

-- Banka NPC kontrolü
SELECT * FROM K_NPC WHERE sSid = 16096;

Eğer NPC'ler veritabanında yoksa, client'ınızdaki NPC ID'leri kullanın veya yeni NPC ekleyin.
NPC ID'lerini değiştirmek için Define.h dosyasındaki değerleri güncelleyin:
C++:
#define PRIVATE_SUNDIRES_NPC          [SIZIN_NPC_ID]
#define PRIVATE_BANKA_NPC             [SIZIN_NPC_ID]



TEST ETME

1. Derleme
  • GameServer projesini derleyin (Build Solution)
  • Hata alırsanız, tüm adımları kontrol edin

2. Oyun İçi Test
  1. Oyuna giriş yapın
  2. Chat'e +sund yazın
  3. Sundries NPC yanınızda spawn olmalı
  4. 30 saniye bekleyin, NPC otomatik silinmeli
  5. Tekrar +sund yazın (cooldown mesajı almalısınız)
  6. 30 saniye sonra tekrar deneyin (başarılı olmalı)
  7. Aynı testleri +banka için yapın

3. Kontrol Listesi
TestBeklenen Sonuç
+sund komutuNPC spawn olur
30 saniye beklemeNPC otomatik silinir
Cooldown30 saniye içinde tekrar kullanılamaz
Para kesmeBelirlenen miktar kesilir
Event roomEvent room'da kullanılamaz
GM testiGM cooldown'dan muaf



ÖZELLEŞTİRME

Cooldown Süresini Değiştirme
Define.h dosyasında:
C++:
#define LAST_SUMMON_SUNDRIES_TIME    60000   // 60 saniye
#define LAST_SUMMON_BANKA_TIME        60000   // 60 saniye

NPC Süresini Değiştirme
ChatHandler.cpp dosyasında, SpawnEventNpc fonksiyonunun son parametresini değiştirin:
C++:
g_pMain->SpawnEventNpc(PRIVATE_SUNDIRES_NPC, false, GetZoneID(),
                       GetX() + 2.0f, GetY(), GetZ() + 2.0f,
                       1, 1, 60);  // 30 yerine 60 saniye

Ücretsiz Yapma
server.ini dosyasında:
INI:
SUMMON_COINS = 0   ; Ücretsiz

Farklı NPC Ekleme
Aynı mantıkla +repair, +upgrade gibi komutlar ekleyebilirsiniz:

C++:
// Define.h
#define PRIVATE_REPAIR_NPC 12345

// ChatHandler.cpp
if (chatstr.compare("+repair") == 0)
{
    // Aynı kontroller...
    g_pMain->SpawnEventNpc(PRIVATE_REPAIR_NPC, false, GetZoneID(),
                           GetX() + 2.0f, GetY(), GetZ() + 2.0f,
                           1, 1, 30);
}



❗ SORUN GİDERME

[ACCORDION]
[ACCORDION-ITEM="NPC Spawn Olmuyor"]
  • server.ini'de STATUS = 1 olduğundan emin olun
  • NPC ID'lerin K_NPC tablosunda olduğunu kontrol edin
  • SpawnEventNpc fonksiyonunun kodunuzda olduğunu doğrulayın
  • Event room'da olmadığınızdan emin olun
[/ACCORDION-ITEM]

[ACCORDION-ITEM="Derleme Hatası Alıyorum"]
  • Tüm header dosyalarını kontrol edin
  • Define.h'ın doğru include edildiğinden emin olun
  • Değişken isimlerinin doğru yazıldığını kontrol edin
  • Noktalı virgülleri kontrol edin
[/ACCORDION-ITEM]

[ACCORDION-ITEM="Cooldown Çalışmıyor"]
  • User.h'da değişkenlerin tanımlı olduğunu kontrol edin
  • UNIXTIME2 makrosunun tanımlı olduğundan emin olun
  • m_iLastSummonSundriesTime değişkeninin 0'a initialize edildiğini kontrol edin
[/ACCORDION-ITEM]

[ACCORDION-ITEM="NPC Hemen Kayboluyor"]
  • SpawnEventNpc fonksiyonunun son parametresini kontrol edin (30 saniye)
  • NPC'nin m_sDuration değerinin doğru set edildiğini kontrol edin
[/ACCORDION-ITEM]
[/ACCORDION]



TEKNİK DETAYLAR

Kod Akışı
Kod:
1. Oyuncu +sund yazar
   ↓
2. ChatHandler.cpp kontrolleri yapar
   ↓
3. Para kesilir (GoldLose)
   ↓
4. SpawnEventNpc çağrılır
   ↓
5. NpcThread::_AddNPC NPC oluşturur
   ↓
6. NPC m_bIsEventNpc = true olarak işaretlenir
   ↓
7. m_sDuration = 30 saniye set edilir
   ↓
8. 30 saniye sonra NPC otomatik silinir

Güvenlik Kontrolleri
  1. Sistem Durumu: FarmSundriesStatus kontrolü
  2. Event Room: GetEventRoom() > 0 kontrolü
  3. Cooldown: UNIXTIME2 - m_iLastSummonSundriesTime kontrolü
  4. Para: GetCoins() < FarmSundriesCoins kontrolü
  5. GM Muafiyeti: isGM() kontrolü



EK ÖNERİLER

  • VIP Sistemi: VIP oyuncular için cooldown azaltabilirsiniz
  • Level Sınırı: Belirli level'den sonra kullanılabilir yapabilirsiniz
  • Zone Sınırı: Sadece belirli zonelarda kullanılabilir yapabilirsiniz
  • Daily Limit: Günlük kullanım limiti ekleyebilirsiniz
  • Log Sistemi: Kullanımları loglayabilirsiniz



 
Moderatör tarafında düzenlendi:

goksu516

Premium Üye
KAYIT
26 Eyl 2021
Mesajlar
790
Çözümler
12
Tepki puanı
167
Tavsiye olarak çağırılan bu npclerin pkzonelerde kesilememesini ekleyebilirsin.
Np veriyorsa npc sürekli çağırıp keserler.
 
Anasayfa Kayıt ol Giriş yap
Üst Alt