Çözüldü [İstek] Shutdown sonrası zindan içinde olan kullanıcıları atmak

Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

DeadLyEscaPe

Üye
Üye
Mesaj
403
Çözümler
27
Beğeni
98
Puan
454
Ticaret Puanı
0
Merhabalar. Bu fikri bir arkadaşımdan almıştım. Shutdown komutundan sonra zindan içerisinde kanal farketmeksizin ne kadar kullanıcı varsa kendi köylerine göndermesini ve sonrasında 10 saniye sayarak sunucuyu kapatmasını istiyorum. Bunu sağlıklı bir şekilde nasıl yazabilirim? Kendimce birkaç deneme yaptım fakat başaramadım. Fikirlerinizi bekliyorum, teşekkürler.

Not: Bunu quest üzerinden yapmak gerek diye düşünüyorum. /shutdown komutunu cmdchat ile verebilir miyiz? Çünkü zindan aşamaları hala karakterde duruyor olacak. Shutdown gerçekleşmeden önce tüm zindan verilerini de sildirmek gerek.
 
Çözüm
Bana kalırsa bunu c++ tarafında yapmak daha pratik ve daha mantıklı.
Aşağıdaki kodu inceleyebilirsin:
C++:
    // zindandan çıkar
    else if(*pSec == 5) // 5 saniye kala..
    {
  
        LPCHARACTER ch = quest::CQuestManager::instance().GetCurrentCharacterPtr();
        if(ch->GetMapIndex() == 41 ||  // Mavi 1.köy (örnek)
            ch->GetMapIndex() == xx || // zindan1
            ch->GetMapIndex() == xx || // zindan2
            ch->GetMapIndex() == xx || // zindan3
            ch->GetMapIndex() == xx    // zindan4
            )
        {
            #include "questmanager.h"
            #include "start_position.h"
            ch->ChatPacket(CHAT_TYPE_INFO, "..sunucu kapatiliyor. Sehre isinlaniyorsun.");
            BYTE bEmpire =...
letter ile yapabilirsiniz. önce timer atarsınız. timer çalışınca zindandaki oyuncuları köylere gönderir daha sonra command fonksiyonu ile shutdown çektirirsiniz.
 
letter ile yapabilirsiniz. önce timer atarsınız. timer çalışınca zindandaki oyuncuları köylere gönderir daha sonra command fonksiyonu ile shutdown çektirirsiniz.

Bu şekilde aklıma gelmişti ama köye gönderdiğimizde örneğin bir zindanda pc.setqf("xxx", 1) almışsa bir karakter onu when logout ile çıkışa pc.delqf("xxx") eklediğimde köye giderken bu qf silinir mi? Bundan emin olamadığım için üşenmiştim es geçmiştim dediğinizi yapmayı.
 
Zindandan atılacağı için questleri sıfırlanır çok büyük ihtimalle. Ekstra birşey yapmanıza gerek yok. Normalde zindandan çıkınca nasıl sıfırlanıyorsa, köye gönderdiginizde de sıfırlanır bence.
 
Estağfurullah. Sorun yaşarsanız kodlamada bilgim olduğu kadar yardımcı olurum. İnşallah sorunsuz yazabilirsiniz kodu
 
Bana kalırsa bunu c++ tarafında yapmak daha pratik ve daha mantıklı.
Aşağıdaki kodu inceleyebilirsin:
C++:
    // zindandan çıkar
    else if(*pSec == 5) // 5 saniye kala..
    {
  
        LPCHARACTER ch = quest::CQuestManager::instance().GetCurrentCharacterPtr();
        if(ch->GetMapIndex() == 41 ||  // Mavi 1.köy (örnek)
            ch->GetMapIndex() == xx || // zindan1
            ch->GetMapIndex() == xx || // zindan2
            ch->GetMapIndex() == xx || // zindan3
            ch->GetMapIndex() == xx    // zindan4
            )
        {
            #include "questmanager.h"
            #include "start_position.h"
            ch->ChatPacket(CHAT_TYPE_INFO, "..sunucu kapatiliyor. Sehre isinlaniyorsun.");
            BYTE bEmpire = ch->GetEmpire();
            ch->WarpSet(g_start_position[bEmpire][0], g_start_position[bEmpire][1]);
          
        }
        --*pSec;
        return passes_per_sec;
    }
    // zindandan çıkar - end

krvoyny.gif


Böylelikle tek tek questlerle uğraşmaya gerek kalmadan yapabilirsin. Ayrıca denildiği gibi, daha sonrasında zindanı devam ettiren ekstra bir quest vb. yoksa zindandan çıktığı an veriler zaten sıfırlanır. Şeytan kulesi gibi..
Kodda çok detaya girmedim eğer bir sorun olursa belirtebilirsin.
 
Çözüm
Bana kalırsa bunu c++ tarafında yapmak daha pratik ve daha mantıklı.
Aşağıdaki kodu inceleyebilirsin:
C++:
    // zindandan çıkar
    else if(*pSec == 5) // 5 saniye kala..
    {
 
        LPCHARACTER ch = quest::CQuestManager::instance().GetCurrentCharacterPtr();
        if(ch->GetMapIndex() == 41 ||  // Mavi 1.köy (örnek)
            ch->GetMapIndex() == xx || // zindan1
            ch->GetMapIndex() == xx || // zindan2
            ch->GetMapIndex() == xx || // zindan3
            ch->GetMapIndex() == xx    // zindan4
            )
        {
            #include "questmanager.h"
            #include "start_position.h"
            ch->ChatPacket(CHAT_TYPE_INFO, "..sunucu kapatiliyor. Sehre isinlaniyorsun.");
            BYTE bEmpire = ch->GetEmpire();
            ch->WarpSet(g_start_position[bEmpire][0], g_start_position[bEmpire][1]);
         
        }
        --*pSec;
        return passes_per_sec;
    }
    // zindandan çıkar - end

krvoyny.gif


Böylelikle tek tek questlerle uğraşmaya gerek kalmadan yapabilirsin. Ayrıca denildiği gibi, daha sonrasında zindanı devam ettiren ekstra bir quest vb. yoksa zindandan çıktığı an veriler zaten sıfırlanır. Şeytan kulesi gibi..
Kodda çok detaya girmedim eğer bir sorun olursa belirtebilirsin.

Çok teşekkürler. Zindan için 41 yerini nasıl yapacağım? 1120000 and 1129999 gibi mi?
 
Kullandığım map 112 ama zindan olunca 4 hane daha geliyor ya onu da kapsar mı onu demek istemiştim.
Şimdi anladım, muhtemelen o 4 haneyle beraber yazman gerekir. Onu denemedim maalesef.
CONFIG dosyasında nasıl ekliyse o şekilde yaz.
 
Bana kalırsa bunu c++ tarafında yapmak daha pratik ve daha mantıklı.
Aşağıdaki kodu inceleyebilirsin:
C++:
    // zindandan çıkar
    else if(*pSec == 5) // 5 saniye kala..
    {
 
        LPCHARACTER ch = quest::CQuestManager::instance().GetCurrentCharacterPtr();
        if(ch->GetMapIndex() == 41 ||  // Mavi 1.köy (örnek)
            ch->GetMapIndex() == xx || // zindan1
            ch->GetMapIndex() == xx || // zindan2
            ch->GetMapIndex() == xx || // zindan3
            ch->GetMapIndex() == xx    // zindan4
            )
        {
            #include "questmanager.h"
            #include "start_position.h"
            ch->ChatPacket(CHAT_TYPE_INFO, "..sunucu kapatiliyor. Sehre isinlaniyorsun.");
            BYTE bEmpire = ch->GetEmpire();
            ch->WarpSet(g_start_position[bEmpire][0], g_start_position[bEmpire][1]);
         
        }
        --*pSec;
        return passes_per_sec;
    }
    // zindandan çıkar - end

krvoyny.gif


Böylelikle tek tek questlerle uğraşmaya gerek kalmadan yapabilirsin. Ayrıca denildiği gibi, daha sonrasında zindanı devam ettiren ekstra bir quest vb. yoksa zindandan çıktığı an veriler zaten sıfırlanır. Şeytan kulesi gibi..
Kodda çok detaya girmedim eğer bir sorun olursa belirtebilirsin.
Nereye eklenti yapılcak acaba :3
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst