[6] [Storing Affects] Official sistemler serisi

Kaptan Yosun

Moderatör
Moderatör
Geliştirici
Yardımsever Üye
Mesaj
1.274
Çözümler
46
Beğeni
1.818
Puan
1.339
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 yılında 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:
Genişlet Daralt Kopyala
    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:
Genişlet Daralt Kopyala
    m_mapAffectData.clear();
Bu yeni fonksiyonları istediğiniz bir yere ekleyin:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
    CPythonPlayer::instance().AddAffect(rkElement.dwType, kAffectAdd.elem);
CPythonNetworkStream::RecvAffectRemovePacket fonksiyonunda return'un üzerine ekleyin:
Genişlet Daralt Kopyala
    CPythonPlayer::instance().RemoveAffect(kAffectRemove.dwType, kAffectRemove.bApplyOn);

4 - Client/UserInterface/PythonPlayerModule.cpp dosyasını açın.
Fonksiyonu istediğiniz uygun bir yere ekleyin:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
        { "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:
Genişlet Daralt Kopyala
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...")
 
Uyarı: Bu konu açıldığından bu yana baya zaman geçmiş.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.
Geri
Üst