Server Taraflı Efsun Botu

ezentere

Üye
Üye
Mesaj
92
Çözümler
3
Beğeni
28
Puan
429
Server Taraflı Efsun Botu
Alıntıdır. Aldığım yerde sanii'ye ait olduğu ve bir kaç eksiği olduğu söylendi.
Ben Ekledim sorunsuz bir biçimde efsun atıyor. Fakat bende bot çalışır vaziyette iken ışınlandığımda efsundaki itemler envantere düşüyor ama efsun atmaya devam ediyor onda sorun yok benim sorunum envantere düşmesinde acaba eksikliği bumu yoksa benmi ekleyemedim bilmiyorum. Sizden ricam fixlerini konu altında paylaşabilir misiniz? Konuyada ekleriz güzel bir içerik olmuş olur.

VT::
Linkleri görebilmek için giriş yap veya kayıt ol.


9610_9c4ef459b1885765795215ce7ac32d44.png
 

Dosya Eklentileri

  • C_Sanii_Switchbot (1).rar
    53,1 KB · Gösterim: 265
Bu sistemi daha önce incelemediğim için kesin bir şey söyleyemem.
Işınlanma sürecinde python guileri sıfırlanıyor. Bu yüzden efsun botu üzerinde gözükmüyor olabilir. Eğer yapılabilirse server tarafından cliente packet gönderip ışınlandığında itemin eklenmesi sağlanabilir
 
Bu sistemi daha önce incelemediğim için kesin bir şey söyleyemem.
Işınlanma sürecinde python guileri sıfırlanıyor. Bu yüzden efsun botu üzerinde gözükmüyor olabilir. Eğer yapılabilirse server tarafından cliente packet gönderip ışınlandığında itemin eklenmesi sağlanabilir
İndirip inceleme şansınız var mı peki ?
 
Şuan baktım ama bu dediğim şey eklenmiş. Event çalıştığı sürece cliente packet gönderip güncellemeyi yaptırıyor.
Bu kısımda bi sorun yok demek ki
 
Bu sorunu yaşayan başka kişilerde varsa büyük ihtimal genel bir sorundur. Ne yazık ki ekleyip deneyecek kadar zaman ayıramam. :(
Sitemizde ki kullanıcılardan kullanan olursa belki yanıt verirler.

Kodlarda bi kısım dikkatimi dikkat çekti;
WarpSet fonksiyonuna şöyle bir kod eklettirmiş.
C++:
    CSwitchbotManager::Instance().SetIsWarping(GetPlayerID(), true);

    if (p.wPort != mother_port)
    {
        CSwitchbotManager::Instance().P2PSendSwitchbot(GetPlayerID(), p.wPort);
    }

Buda şurayı çalıştırıyor.
C++:
void CSwitchbotManager::P2PSendSwitchbot(DWORD player_id, WORD wTargetPort)
{
    CSwitchbot* pkSwitchbot = FindSwitchbot(player_id);
    if (!pkSwitchbot)
    {
        sys_err("No switchbot found to transfer. (pid %d source_port %d target_port %d)", player_id, mother_port, wTargetPort);
        return;
    }

    pkSwitchbot->Pause();
    m_map_Switchbots.erase(player_id);

    TPacketGGSwitchbot pack;
    pack.wPort = wTargetPort;
    pack.table = pkSwitchbot->GetTable();

    P2P_MANAGER::Instance().Send(&pack, sizeof(pack));
}

Buda input_db.cpp'de şu kısımı çalıştırıyor.
C++:
void CInputP2P::Switchbot(LPDESC d, const char* c_pData)
{
    const TPacketGGSwitchbot* p = reinterpret_cast<const TPacketGGSwitchbot*>(c_pData);
    if (p->wPort != mother_port)
    {
        return;
    }

    CSwitchbotManager::Instance().P2PReceiveSwitchbot(p->table);
}

Sonra efsunlamayı yeniden başlatıyor;
C++:
void CSwitchbotManager::P2PReceiveSwitchbot(TSwitchbotTable table)
{
    CSwitchbot* pkSwitchbot = FindSwitchbot(table.player_id);
    if (!pkSwitchbot)
    {
        pkSwitchbot = new CSwitchbot();
        m_map_Switchbots.insert(std::make_pair(table.player_id, pkSwitchbot));
    }

    pkSwitchbot->SetTable(table);
}

Özetlemek gerekirse ışınlanınca efsun botunu durduruyor ve tekrardan oyuna girdiğinizde başlatıyor.
Efsun botuna eklenen itemler ise envanterden bağımsız veritabanına kayıt ettiriyor.

Kodlara göz gezdirdiğimde tam olarak bu soruna neden olan kısımı bulamadım. Pratikte her şeyin düzgün çalışması gerekiyor
 
Konusu açılmışken client srcye eklerken kodlarda bi düzenleme yaptınız mı ? Ben eklerken client srcde hatalar aldım. Yabancı bi forumda araştırdım ve c++11 sürümünde çalıştıgını söylemişler o hatayı alanlar
 
Bu sorunu yaşayan başka kişilerde varsa büyük ihtimal genel bir sorundur. Ne yazık ki ekleyip deneyecek kadar zaman ayıramam. :(
Sitemizde ki kullanıcılardan kullanan olursa belki yanıt verirler.

Kodlarda bi kısım dikkatimi dikkat çekti;
WarpSet fonksiyonuna şöyle bir kod eklettirmiş.
C++:
    CSwitchbotManager::Instance().SetIsWarping(GetPlayerID(), true);

    if (p.wPort != mother_port)
    {
        CSwitchbotManager::Instance().P2PSendSwitchbot(GetPlayerID(), p.wPort);
    }

Buda şurayı çalıştırıyor.
C++:
void CSwitchbotManager::P2PSendSwitchbot(DWORD player_id, WORD wTargetPort)
{
    CSwitchbot* pkSwitchbot = FindSwitchbot(player_id);
    if (!pkSwitchbot)
    {
        sys_err("No switchbot found to transfer. (pid %d source_port %d target_port %d)", player_id, mother_port, wTargetPort);
        return;
    }

    pkSwitchbot->Pause();
    m_map_Switchbots.erase(player_id);

    TPacketGGSwitchbot pack;
    pack.wPort = wTargetPort;
    pack.table = pkSwitchbot->GetTable();

    P2P_MANAGER::Instance().Send(&pack, sizeof(pack));
}

Buda input_db.cpp'de şu kısımı çalıştırıyor.
C++:
void CInputP2P::Switchbot(LPDESC d, const char* c_pData)
{
    const TPacketGGSwitchbot* p = reinterpret_cast<const TPacketGGSwitchbot*>(c_pData);
    if (p->wPort != mother_port)
    {
        return;
    }

    CSwitchbotManager::Instance().P2PReceiveSwitchbot(p->table);
}

Sonra efsunlamayı yeniden başlatıyor;
C++:
void CSwitchbotManager::P2PReceiveSwitchbot(TSwitchbotTable table)
{
    CSwitchbot* pkSwitchbot = FindSwitchbot(table.player_id);
    if (!pkSwitchbot)
    {
        pkSwitchbot = new CSwitchbot();
        m_map_Switchbots.insert(std::make_pair(table.player_id, pkSwitchbot));
    }

    pkSwitchbot->SetTable(table);
}

Özetlemek gerekirse ışınlanınca efsun botunu durduruyor ve tekrardan oyuna girdiğinizde başlatıyor.
Efsun botuna eklenen itemler ise envanterden bağımsız veritabanına kayıt ettiriyor.

Kodlara göz gezdirdiğimde tam olarak bu soruna neden olan kısımı bulamadım. Pratikte her şeyin düzgün çalışması gerekiyor

Sorunum acemiliğimden olsa gerek ki benden kaynaklıymış. Bu mesajını biraz incelemek istedim input_db.cpp de aradım ama o kodu bulamadım normalde input_p2p.cpp yerine db yazmışsınız. Bende input_db yi detaylı inceledim ve hatamın bu dosyada olduğunu farkettim.

Benden bu yapılması istenmiş:
C++:
[...]

void CInputDB::ItemLoad(LPDESC d, const char * c_pData)
{
    [...]
  
                case INVENTORY:
                case DRAGON_SOUL_INVENTORY:
#ifdef ENABLE_SWITCHBOT
                case SWITCHBOT:
#endif
    [...]
}

Bense böyle yapmışım:
C++:
                case INVENTORY:
                case DRAGON_SOUL_INVENTORY:
                    item->AddToCharacter(ch, TItemPos(p->window, p->pos));
                    break;
#ifdef ENABLE_SWITCHBOT
                case SWITCHBOT:
#endif

Bunu böyle değiştirdiğimde sorunum ortadan kalktı:
C++:
                case INVENTORY:
                case DRAGON_SOUL_INVENTORY:
#ifdef ENABLE_SWITCHBOT
                case SWITCHBOT:
#endif
                    item->AddToCharacter(ch, TItemPos(p->window, p->pos));
                    break;
 
Yaptığım ufak bi yazım yanlışı yüzünden sorununuzu çözmenize sevindim :)
Bende şimdi yazdığım mesajıma tekrardan baktım. input_p2p yerine input_db yazmışım. :)
Elle yazınca böyle ufak tefek kusurlar oluyor. Kusura bakmayın :oops:

Ekte verdiğiniz dosyaları inceledikten sonra o mesajı yazdıydım. Kodları okuyunca sizin yaşadığınız soruna neden olan bi boşluk görememiştim. Hatta bu sorunun yaşanmaması için özel olarak bir sürü kod yazılmış. Sizle de o kısımları paylaştım zaten.

Sitemizde sürekli yardım konuları açılıyor. Sistem eklerken veya sistemlerle alakalı sorunlarda benim kendi dosyalarıma ekleyip ona göre yanıt vermemim imkanı yok. Bunun en büyük nedeni çok fazla zaman gitmesi ve fileslerin artık farklı olması. Bende bilgim dahilince kodları okuyup anlamaya çalışıyorum ve ona göre de yol göstermeye :D
 
acaba server taraflı çalıştırınca ne farkı oluyor?

bence efsun atlamasının önüne geçilebilir, efsunların 1 ms süre ile değiştirilmesi sağlanabilir..

lag da yapacağını düşünmüyorum, hiç değilse benim server filesim de:rolleyes:
 
acaba server taraflı çalıştırınca ne farkı oluyor?

bence efsun atlamasının önüne geçilebilir, efsunların 1 ms süre ile değiştirilmesi sağlanabilir..

lag da yapacağını düşünmüyorum, hiç değilse benim server filesim de:rolleyes:

Evet efsun atlamasının önüne geçiliyor ve oldukça hızlı efsun atıyor.
Ama konuyu alıntıladığım forumda bir arkadaşın bana ilettiği kadarıyla, 2 hesap ile efsun atarken serverdaki cpu değerlerini izlediğini ve bu değerlerle karşılaştığını belirtti. Yani yanlışım varsa düzeltin ama 2000+ kullanıcılı bir server'da oldukça lag'a sebebiyet verebilir.
0qGgBP.png
 
İşlemler arasına kısa süreli limit koyarak bunun önüne geçilebilir
 
kurmaya çalıştığımda şöyle bir hata alıyorum nedenini bilen varmı acaba?

Syserr:
0424 14:52:03252 ::
networkModule.py(line:208) SetSelectCharacterPhase
system.py(line:130) __pack_import
system.py(line:110) _process_result
introSelect.py(line:30) <module>
system.py(line:130) __pack_import
system.py(line:110) _process_result
interfaceModule.py(line:50) <module>
system.py(line:130) __pack_import
system.py(line:110) _process_result
uiSwitchbot.py(line:14) <module>
system.py(line:137) __pack_import

networkModule.SetSelectCharacterPhase - <type 'exceptions.TypeError'>:__pack_import() takes at most 4 arguments (5 given)

0424 14:52:03252 :: ============================================================================================================
0424 14:52:03252 :: Abort!!!!
 
kurmaya çalıştığımda şöyle bir hata alıyorum nedenini bilen varmı acaba?

Syserr:
0424 14:52:03252 ::
networkModule.py(line:208) SetSelectCharacterPhase
system.py(line:130) __pack_import
system.py(line:110) _process_result
introSelect.py(line:30) <module>
system.py(line:130) __pack_import
system.py(line:110) _process_result
interfaceModule.py(line:50) <module>
system.py(line:130) __pack_import
system.py(line:110) _process_result
uiSwitchbot.py(line:14) <module>
system.py(line:137) __pack_import

networkModule.SetSelectCharacterPhase - <type 'exceptions.TypeError'>:__pack_import() takes at most 4 arguments (5 given)

0424 14:52:03252 :: ============================================================================================================
0424 14:52:03252 :: Abort!!!!
Sistemi bilmiyorum ama hatada fazla değer geldiğini söylüyor istersen bir yardım konusu aç oradan bakalım burası kirlenmesin.
 
Geri
Üst