Yardım Oyunu güvenli kapatma yöntemi

  • Konuyu açan Konuyu açan Levelsiz
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 118
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

Levelsiz

Üye
Üye
Mesaj
26
Çözümler
1
Beğeni
0
Puan
66
Ticaret Puanı
0
Merhaba,

Oyunu kapatınca oyuncuların bulundukları son koordinatlar ve yaptıkları item al/ver işlemleri kaydedilmiyor. Son yapılan her türlü işlemin kaydedilmesi ve açıldığında kaldığın yerden devam edebilmek için ne yapmam gerekir.
 
Oyunu kapatmaktan kastın clienti mi kapatmak yoksa servere shutdown mu çekmek?
 
önce sunucuyu kapatmadan makine gücünü kapatıyorsun doğru mu anlıyorum? yani şöyle anlatıyım eğer sunucuyu artık hangi paneli kullanıyorsan oradan girip kapat komutu vermeden gidip makinanın gücünü kapatıyorsan birisinin gelip ensene sert birşey ile vurmasını ve ayıldığından o anki yerini ve durumunu açıklamasını istemek ile aynı şey. diğer durum ise komut ile sunucuyu kapattığın halde oyun save almıyor ise bu da sql e yazılan bir veride veya query de sorun olduğunu ortaya çıkarır.

shutdown komutu ile serverin gücünü kesmeyi kast ediyorum.
komut ile isede oyunu başlatırken sh shart.sh gibi komutlar giriyorsun onu kast ediyorum.
 
önce sunucuyu kapatmadan makine gücünü kapatıyorsun doğru mu anlıyorum? yani şöyle anlatıyım eğer sunucuyu artık hangi paneli kullanıyorsan oradan girip kapat komutu vermeden gidip makinanın gücünü kapatıyorsan birisinin gelip ensene sert birşey ile vurmasını ve ayıldığından o anki yerini ve durumunu açıklamasını istemek ile aynı şey. diğer durum ise komut ile sunucuyu kapattığın halde oyun save almıyor ise bu da sql e yazılan bir veride veya query de sorun olduğunu ortaya çıkarır.

shutdown komutu ile serverin gücünü kesmeyi kast ediyorum.
komut ile isede oyunu başlatırken sh shart.sh gibi komutlar giriyorsun onu kast ediyorum.
serverın gücünü kapatmıyorum, konsoldan kapat komutuyla kapatıyorum
 
Db bölümünde gözüne çarpan hiç syserr veye syslog gördün mü?
 
Kaybı önlemek için yapılması gerekenlerden kısaca bahsedeyim, sizin durumunuza belki bir faydası olur.

Oyun içinden GM karakterle /shutdown çekilip oyunun kapanması beklenir, kapandıktan sonra tercihen bir 10 dakika beklenir.
Oyun kapandıktan sonra Putty'den kapat, close veya sizde adı her neyse scripti çağrılır. (DİKKAT: Kapatma scriptinde ilk sırada auth olmalı, auth kapatma işleminin arkasında uzun bir sleep koyulur mesela sleep 5, sonrasında kanallar kapanır, en son olarak db kapatılır)

Bu düzende yaparsanız item, bilgi vs. kaybı yaşanmaz, oyunu açarken de start, başlat veya adı neyse scriptinin sıralaması önemlidir. Önce db açılır ve altına bir sleep 5 konur sonrasında kanallar açılır, en son auth açılır yani kapatma işinin tam tersi sırada. Yıllardır bu düzende hiç kayıp sorunu yaşamadım.
 
@Luigina 'dan alıntı.

CommonDefines.h veya service.h:
Genişlet Daralt Kopyala
// ekle

#define FLUSH_AT_SHUTDOWN

cmd_general.cpp:
Genişlet Daralt Kopyala
// Arat
struct SendDisconnectFunc

// Şu şekilde değiştir
struct SendDisconnectFunc
{
    void operator () (LPDESC d)
    {
        if (d->GetCharacter())
        {
#ifdef FLUSH_AT_SHUTDOWN
            d->GetCharacter()->SaveReal();
            DWORD pid = d->GetCharacter()->GetPlayerID();
            db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
            db_clientdesc->Packet(&pid, sizeof(DWORD));
#endif
            if (d->GetCharacter()->GetGMLevel() == GM_PLAYER)
                d->GetCharacter()->ChatPacket(CHAT_TYPE_COMMAND, "quit Shutdown(SendDisconnectFunc)");
        }
    }
};

cmd_gm.cpp:
Genişlet Daralt Kopyala
// Arat
ACMD(do_flush)

// Değiştir
ACMD(do_flush)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));
#ifdef FLUSH_AT_SHUTDOWN
    DWORD pid = 0;
    if(0 == arg1[0])
        pid = ch->GetPlayerID();
    else
        pid = (DWORD)strtoul(arg1, NULL, 10);

    if (pid != 0)
    {
        ch->SaveReal();
        db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
        db_clientdesc->Packet(&pid, sizeof(DWORD));
    }
#else
    if (0 == arg1[0])
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "usage : /flush player_id");
        return;
    }

    DWORD pid = (DWORD)strtoul(arg1, NULL, 10);

    db_clientdesc->DBPacketHeader(HEADER_GD_FLUSH_CACHE, 0, sizeof(DWORD));
    db_clientdesc->Packet(&pid, sizeof(DWORD));
#endif
}
 
Geri
Üst