[6] [Storing Affects] Official sistemler serisi.

Kaptan Yosun

Discord: kaptanyosun
Site yetkilisi
Acemi Moderatör
Premium Üye
Mesaj
663
Çözümler
21
Beğeni
509
Puan
839
Ticaret Puanı
0
Bu seride doğrudan Metin2'den tersine mühendislik(reverse engineering) ile sökülmüş veya Metin2'ye sağdık kalınarak yazılmış sistemleri paylaşacağım.
Sistemler 2014'te sızdırılan kraizy.tgz arşivindeki mainline için yazılmıştır. Siz başka server dosyaları kullanıyorsanız aradığınız bazı kodları bulamayabilir veya birtakım hatalarla karşılaşabilirsiniz.

Sistem sahibi metin2.dev'den
Linkleri görebilmek için giriş yap veya kayıt ol.
'dir.
Sistemi aldığım asıl konu:
Linkleri görebilmek için giriş yap veya kayıt ol.


6- Storing Affects: Karakter üzerindeki her affecti kontrol edebilmenize olanak sağlayan sistem.
  • Metin2 bu sistemi Otomatik Av sistemiyle beraber şebnemlerin ve diğer potların sürlerini kontrol etmek için ekledi.
  • Bu sistem, [Loot Filter] sisteminin bir ön gereksinimidir.
Nasıl yapılır:

1 - Client/UserInterface/PythonPlayer.h dosyasını açın.
Bu kodu CPythonPlayer class'ının en sonuna ekleyin:
    protected:
        typedef std::vector<TPacketAffectElement> TAffectDataVector;
        TAffectDataVector    m_mapAffectData;
    public:
        void    AddAffect(DWORD dwType, TPacketAffectElement kElem);
        void    RemoveAffect(DWORD dwType, BYTE bApplyOn);
        int        GetAffectDataIndex(DWORD dwType, BYTE bApplyOn);
        TPacketAffectElement GetAffectData(DWORD dwType, BYTE bApplyOn);

2 - Client/UserInterface/PythonPlayer.cpp dosyasını açın.
CPythonPlayer::Clear fonksiyonunu bulun ve en altına bu satırı ekleyin:
    m_mapAffectData.clear();
Bu yeni fonksiyonları istediğiniz bir yere ekleyin:
void CPythonPlayer::AddAffect(DWORD dwType, TPacketAffectElement kElem)
{
    int iAffIndex = GetAffectDataIndex(dwType, kElem.bPointIdxApplyOn);
    if (iAffIndex != -1)
    {
        m_mapAffectData.at(iAffIndex) = kElem;
    }
    else
    {
        m_mapAffectData.push_back(kElem);
    }
}

void CPythonPlayer::RemoveAffect(DWORD dwType, BYTE bApplyOn)
{
    for (TAffectDataVector::iterator it = m_mapAffectData.begin(); it != m_mapAffectData.end(); ++it)
    {
        TPacketAffectElement elem = *it;
        if (elem.dwType == dwType && (bApplyOn == 0 || bApplyOn == elem.bPointIdxApplyOn))
        {
            m_mapAffectData.erase(it);
            break;
        }
    }
}

int CPythonPlayer::GetAffectDataIndex(DWORD dwType, BYTE bApplyOn)
{
    int ret = -1, i = 0;
    for (TAffectDataVector::iterator it = m_mapAffectData.begin(); it != m_mapAffectData.end(); ++it, ++i)
    {
        TPacketAffectElement elem = *it;
        if (elem.dwType == dwType && (bApplyOn == 0 || bApplyOn == elem.bPointIdxApplyOn))
        {
            ret = i;
            break;
        }
    }
    return ret;
}

TPacketAffectElement CPythonPlayer::GetAffectData(DWORD dwType, BYTE bApplyOn)
{
    TPacketAffectElement ret;
    memset(&ret, 0, sizeof(TPacketAffectElement));
    for (TAffectDataVector::iterator it = m_mapAffectData.begin(); it != m_mapAffectData.end(); ++it)
    {
        TPacketAffectElement elem = *it;
        if (elem.dwType == dwType && (bApplyOn == 0 || bApplyOn == elem.bPointIdxApplyOn))
        {
            ret = elem;
            break;
        }
    }
    return ret;
}

3 - Client/UserInterface/CPythonNetworkStreamPhaseGame.cpp dosyasını açın.
CPythonNetworkStream::RecvAffectAddPacket fonksiyonunda return'un üzerine ekleyin:
    CPythonPlayer::instance().AddAffect(rkElement.dwType, kAffectAdd.elem);
CPythonNetworkStream::RecvAffectRemovePacket fonksiyonunda return'un üzerine ekleyin:
    CPythonPlayer::instance().RemoveAffect(kAffectRemove.dwType, kAffectRemove.bApplyOn);

4 - Client/UserInterface/PythonPlayerModule.cpp dosyasını açın.
Fonksiyonu istediğiniz uygun bir yere ekleyin:
PyObject * playerCheckAffect(PyObject* poSelf, PyObject* poArgs)
{
    DWORD dwType;
    if (!PyTuple_GetUnsignedLong(poArgs, 0, &dwType))
        return Py_BadArgument();

    BYTE bApplyOn;
    if (!PyTuple_GetByte(poArgs, 1, &bApplyOn))
        return Py_BadArgument();

    int iAffIndex = CPythonPlayer::Instance().GetAffectDataIndex(dwType, bApplyOn);
    return Py_BuildValue("b", iAffIndex != -1);
}
void initPlayer() içinde en sona ekleyin:
        { "CheckAffect",                            playerCheckAffect,                            METH_VARARGS },

Bitti.

5 - Test etmek isterseniz:
Simyanın birinci sayfasının mı ikinci sayfasının mı aktif olduğunu test edelim:
if player.CheckAffect(chr.NEW_AFFECT_DRAGON_SOUL_DECK1, 0):
    print("Yasasin! Birinci sayfa aktif.")
elif player.CheckAffect(chr.NEW_AFFECT_DRAGON_SOUL_DECK2, 0):
    print("Olamaz! Ikinci sayfa aktif, dikkatli ol.")
else:
    print("Ejderha simyasi aktif degilken zayifsin...")
 
Son düzenleme:
Geri
Üst