- Mesaj
- 662
- Çö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
Sistemi aldığım asıl konu:
6- Storing Affects: Karakter üzerindeki her affecti kontrol edebilmenize olanak sağlayan sistem.
1 - Client/UserInterface/PythonPlayer.h dosyasını açın.
2 - Client/UserInterface/PythonPlayer.cpp dosyasını açın.
3 - Client/UserInterface/CPythonNetworkStreamPhaseGame.cpp dosyasını açın.
4 - Client/UserInterface/PythonPlayerModule.cpp dosyasını açın.
Bitti.
5 - Test etmek isterseniz:
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.
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: