Damit andere nicht auf die Idee kommen Likes dafür abzugreifen, mach ich ein Sammelpost von den System von Blackdragon aka Mali
Habe versucht mit ihn in Kontakt zu tretten was leider nicht möglich ist zumindest für mich
Ich habe nicht den ganzen Content vom ihm hier reingeposted aber zumindest viele Systeme / Releases die euch bereichern können
Mir ist auch der evtl Hate egal, ich will nur, dass seine Arbeit gewürdigt wird und hier keiner Likes geiern kann der seine Arbeit 1:1 reposted
Github:
Bitte melden Sie sich an, um diesen Link zu sehen.
Discord:
blackdragonx61#3810
Youtube:
Bitte melden Sie sich an, um diesen Link zu sehen.
Added 20.05.2023
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
It's an old bug. You probably fixed it with another method, here is the reversed ver.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
GetTimeString used for ranking window
Bitte melden Sie sich an, um dieses Bild zu sehen.
Be sure your PyTuple_GetUnsignedLong working without problem.
- ///@@@PythonApplicationModule.cpp:
- ///Add
- PyObject* appGetLocalTime(PyObject* poSelf, PyObject* poArgs)
- {
- DWORD dwTime;
- if (!PyTuple_GetUnsignedLong(poArgs, 0, &dwTime))
- return Py_BuildException();
- const time_t time = static_cast<time_t>(dwTime);
- struct tm *t = localtime(&time);
- if (!t)
- return Py_BuildNone();
- PyObject* dict = PyTuple_New(6);
- PyTuple_SetItem(dict, 0, PyInt_FromLong(t->tm_year + 1900));
- PyTuple_SetItem(dict, 1, PyInt_FromLong(t->tm_mon + 1));
- PyTuple_SetItem(dict, 2, PyInt_FromLong(t->tm_mday));
- PyTuple_SetItem(dict, 3, PyInt_FromLong(t->tm_hour));
- PyTuple_SetItem(dict, 4, PyInt_FromLong(t->tm_min));
- PyTuple_SetItem(dict, 5, PyInt_FromLong(t->tm_sec));
- return dict;
- }
- PyObject* appGetTimeString(PyObject* poSelf, PyObject* poArgs)
- {
- DWORD dwTime;
- if (!PyTuple_GetUnsignedLong(poArgs, 0, &dwTime))
- return Py_BuildException();
- const time_t time = static_cast<time_t>(dwTime);
- struct tm* t = localtime(&time);
- if (!t)
- return Py_BuildValue("s", "ERROR");
- char buf[256];
- snprintf(buf, sizeof(buf), "%04d/%02d/%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
- return Py_BuildValue("s", buf);
- }
- ///Add to initapp
- { "GetLocalTime", appGetLocalTime, METH_VARARGS },
- { "GetTimeString", appGetTimeString, METH_VARARGS },
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Adjust Position is currently used by Alastor:
Bitte melden Sie sich an, um dieses Bild zu sehen.
_________________________
Added 13.03.2023
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Thanks to Bitte melden Sie sich an, um diesen Link zu sehen. for informing me.
Added 11.03.2023
Bitte melden Sie sich an, um diesen Link zu sehen.
- ///@@@PythonWindowManagerModule.cpp:
- PyObject * wndMgrAddFlag(PyObject * poSelf, PyObject * poArgs)
- {
- UI::CWindow * pWin;
- if (!PyTuple_GetWindow(poArgs, 0, &pWin))
- return Py_BuildException();
- char * pszFlag;
- if (!PyTuple_GetString(poArgs, 1, &pszFlag))
- return Py_BuildException();
- if (pszFlag && *pszFlag)
- {
- if (!stricmp(pszFlag, "movable"))
- pWin->AddFlag(UI::CWindow::FLAG_MOVABLE);
- else if (!stricmp(pszFlag, "limit"))
- pWin->AddFlag(UI::CWindow::FLAG_LIMIT);
- else if (!stricmp(pszFlag, "dragable"))
- pWin->AddFlag(UI::CWindow::FLAG_DRAGABLE);
- else if (!stricmp(pszFlag, "attach"))
- pWin->AddFlag(UI::CWindow::FLAG_ATTACH);
- else if (!stricmp(pszFlag, "restrict_x"))
- pWin->AddFlag(UI::CWindow::FLAG_RESTRICT_X);
- else if (!stricmp(pszFlag, "restrict_y"))
- pWin->AddFlag(UI::CWindow::FLAG_RESTRICT_Y);
- else if (!stricmp(pszFlag, "float"))
- pWin->AddFlag(UI::CWindow::FLAG_FLOAT);
- else if (!stricmp(pszFlag, "not_pick"))
- pWin->AddFlag(UI::CWindow::FLAG_NOT_PICK);
- else if (!stricmp(pszFlag, "ignore_size"))
- pWin->AddFlag(UI::CWindow::FLAG_IGNORE_SIZE);
- else if (!stricmp(pszFlag, "rtl"))
- pWin->AddFlag(UI::CWindow::FLAG_RTL);
- else if (!stricmp(pszFlag, "ltr"))
- pWin->RemoveFlag(UI::CWindow::FLAG_RTL);
- else if (!stricmp(pszFlag, "not_move"))
- pWin->RemoveFlag(UI::CWindow::FLAG_MOVABLE);
- else if (!stricmp(pszFlag, "not_capture"))
- pWin->AddFlag(UI::CWindow::FLAG_NOT_CAPTURE);
- else
- TraceError("Unknown window flag %s", pszFlag);
- }
- return Py_BuildNone();
- }
____________________________________
Added 27.02.2023
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Use this tool:
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
This is an archiver I've created, and it looks quite stable so far.
The PackMakerLite (PML) supports type 0-1-2-3-4-5-6.
As a summarize, the metin2 types are handled like this:
- Type 0 - only storage (no encryption/compression; it can be read fully from the .epk)
- Type 1 - compressed - lzo(file)
- Type 2 - compressed and encrypted - xtea(lzo(file))
- Type 3 - encrypted with Panama - you must save an .iv key server-side in the panama/ folder. (content readable only after auth phase) The official used it only for patch2.
- Type 4 - encrypted with a mix of ciphers (cshybridcrypt) - you must save a .dat key server-side in the package/ folder. (content readable only after auth phase) Practically all the metin2_patch files.
- Type 5 - like type 4, but a server-side map/<map_name> is also provided. (content readable only after accessing the <map_name> map as a player) The official used it only for the catacomb data.
- Type 6 - compressed and encrypted - xtea(snappy(file))
Usage:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Its settings (xtea keys, extensions, pack types to use) can be changed inside PackMakerLite.json:
Bitte melden Sie sich an, um dieses Bild zu sehen.
You can actually integrate the tool in the menu context (running the .reg files) for packing folders and unpacking .eix files:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Remove "--nolog" from the .bat files if you want to see the logs again.
Last but not least: since the client handles all the filenames in lowercase, this tools automatically converts them as well.
Thanks also to:
- blackdragonx61 / Mali - type4-5 extract code / type 6 compress code
- metin2team - type6 extract code
By martysama0134
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
_______________________________________________
Added 19.02.2023
Bitte melden Sie sich an, um diesen Link zu sehen.
It is also an important for proto sharers.
- Reversed from 23.0.6.0
Bitte melden Sie sich an, um dieses Bild zu sehen.
That dwUnkFlag is actually DWORD dwAIFlag -> DWORD dwAIFlag[2].
This is only client-side, you have to change server & dump_proto etc.
- ///@@@PythonNonPlayer.h:
- enum EClickEvent
- {
- ...
- };
- ///Add
- enum EAIFlags
- {
- AIFLAG_AGGRESSIVE = 0,
- AIFLAG_NOMOVE = 1,
- AIFLAG_COWARD = 2,
- AIFLAG_NOATTACKSHINSU = 3,
- AIFLAG_NOATTACKJINNO = 4,
- AIFLAG_NOATTACKCHUNJO = 5,
- AIFLAG_ATTACKMOB = 6,
- AIFLAG_BERSERK = 7,
- AIFLAG_STONESKIN = 8,
- AIFLAG_GODSPEED = 9,
- AIFLAG_DEATHBLOW = 10,
- AIFLAG_REVIVE = 11,
- AIFLAG_HEALER = 12,
- AIFLAG_COUNT = 13,
- AIFLAG_NORECOVERY = 14,
- AIFLAG_REFLECT = 15,
- AIFLAG_FALL = 16,
- AIFLAG_VIT = 17,
- AIFLAG_RATTSPEED = 18,
- AIFLAG_RCASTSPEED = 19,
- AIFLAG_RHP_REGEN = 20,
- AIFLAG_TIMEVIT = 21,
- AIFLAG_ELEMENT_BUFF_NONE = 26,
- AIFLAG_ELEMENT_BUFF_FIRE = 27,
- AIFLAG_ELEMENT_BUFF_ICE = 28,
- AIFLAG_ELEMENT_BUFF_ELECT = 29,
- AIFLAG_ELEMENT_BUFF_WIND = 30,
- AIFLAG_ELEMENT_BUFF_EARTH = 31,
- AIFLAG_ELEMENT_BUFF_DARK = 32,
- AIFLAG_MAX = 34 // 23.0.6.0
- };
- //Find
- DWORD dwAIFlag;
- ///Change
- DWORD dwAIFlag[2];
- //Find
- const char* GetMonsterName(DWORD dwVnum);
- ///Add
- bool IsAIFlag(DWORD dwVnum, int iFlagIndex);
- ///@@@PythonNonPlayer.cpp:
- ///Add
- bool CPythonNonPlayer::IsAIFlag(DWORD dwVnum, int iFlagIndex)
- {
- const CPythonNonPlayer::TMobTable* c_pTable = GetTable(dwVnum);
- if (!c_pTable)
- return false;
- if (iFlagIndex < 0 || iFlagIndex >= EAIFlags::AIFLAG_MAX)
- return false;
- return IS_SET(c_pTable->dwAIFlag[iFlagIndex >> 5], 1 << (iFlagIndex & 0x1F));
- }
- ///@@@PythonNonPlayerModule.cpp:
- ///Add
- PyObject* nonplayerIsAIFlagByVID(PyObject* poSelf, PyObject* poArgs)
- {
- int iVirtualID;
- if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID))
- return Py_BuildException();
- int iIndex;
- if (!PyTuple_GetInteger(poArgs, 1, &iIndex))
- return Py_BuildException();
- CInstanceBase* pInstance = CPythonCharacterManager::Instance().GetInstancePtr(iVirtualID);
- if (!pInstance)
- return Py_BuildValue("b", false);
- CPythonNonPlayer& rkNonPlayer = CPythonNonPlayer::Instance();
- return Py_BuildValue("b", rkNonPlayer.IsAIFlag(pInstance->GetVirtualID(), iIndex));
- }
- ///Add to initNonPlayer
- { "IsAIFlagByVID", nonplayerIsAIFlagByVID, METH_VARARGS },
- //Find
- PyModule_AddIntConstant(poModule, "ON_CLICK_EVENT_VEHICLE", CPythonNonPlayer::ON_CLICK_EVENT_VEHICLE);
- ///Add
- PyModule_AddIntConstant(poModule, "AIFLAG_AGGRESSIVE", CPythonNonPlayer::EAIFlags::AIFLAG_AGGRESSIVE);
- PyModule_AddIntConstant(poModule, "AIFLAG_NOMOVE", CPythonNonPlayer::EAIFlags::AIFLAG_NOMOVE);
- PyModule_AddIntConstant(poModule, "AIFLAG_COWARD", CPythonNonPlayer::EAIFlags::AIFLAG_COWARD);
- PyModule_AddIntConstant(poModule, "AIFLAG_NOATTACKSHINSU", CPythonNonPlayer::EAIFlags::AIFLAG_NOATTACKSHINSU);
- PyModule_AddIntConstant(poModule, "AIFLAG_NOATTACKJINNO", CPythonNonPlayer::EAIFlags::AIFLAG_NOATTACKJINNO);
- PyModule_AddIntConstant(poModule, "AIFLAG_NOATTACKCHUNJO", CPythonNonPlayer::EAIFlags::AIFLAG_NOATTACKCHUNJO);
- PyModule_AddIntConstant(poModule, "AIFLAG_ATTACKMOB", CPythonNonPlayer::EAIFlags::AIFLAG_ATTACKMOB);
- PyModule_AddIntConstant(poModule, "AIFLAG_BERSERK", CPythonNonPlayer::EAIFlags::AIFLAG_BERSERK);
- PyModule_AddIntConstant(poModule, "AIFLAG_STONESKIN", CPythonNonPlayer::EAIFlags::AIFLAG_STONESKIN);
- PyModule_AddIntConstant(poModule, "AIFLAG_GODSPEED", CPythonNonPlayer::EAIFlags::AIFLAG_GODSPEED);
- PyModule_AddIntConstant(poModule, "AIFLAG_DEATHBLOW", CPythonNonPlayer::EAIFlags::AIFLAG_DEATHBLOW);
- PyModule_AddIntConstant(poModule, "AIFLAG_REVIVE", CPythonNonPlayer::EAIFlags::AIFLAG_REVIVE);
- PyModule_AddIntConstant(poModule, "AIFLAG_HEALER", CPythonNonPlayer::EAIFlags::AIFLAG_HEALER);
- PyModule_AddIntConstant(poModule, "AIFLAG_COUNT", CPythonNonPlayer::EAIFlags::AIFLAG_COUNT);
- PyModule_AddIntConstant(poModule, "AIFLAG_NORECOVERY", CPythonNonPlayer::EAIFlags::AIFLAG_NORECOVERY);
- PyModule_AddIntConstant(poModule, "AIFLAG_REFLECT", CPythonNonPlayer::EAIFlags::AIFLAG_REFLECT);
- PyModule_AddIntConstant(poModule, "AIFLAG_FALL", CPythonNonPlayer::EAIFlags::AIFLAG_FALL);
- PyModule_AddIntConstant(poModule, "AIFLAG_VIT", CPythonNonPlayer::EAIFlags::AIFLAG_VIT);
- PyModule_AddIntConstant(poModule, "AIFLAG_RATTSPEED", CPythonNonPlayer::EAIFlags::AIFLAG_RATTSPEED);
- PyModule_AddIntConstant(poModule, "AIFLAG_RCASTSPEED", CPythonNonPlayer::EAIFlags::AIFLAG_RCASTSPEED);
- PyModule_AddIntConstant(poModule, "AIFLAG_RHP_REGEN", CPythonNonPlayer::EAIFlags::AIFLAG_RHP_REGEN);
- PyModule_AddIntConstant(poModule, "AIFLAG_TIMEVIT", CPythonNonPlayer::EAIFlags::AIFLAG_TIMEVIT);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_NONE", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_NONE);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_FIRE", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_FIRE);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_ICE", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_ICE);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_ELECT", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_ELECT);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_WIND", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_WIND);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_EARTH", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_EARTH);
- PyModule_AddIntConstant(poModule, "AIFLAG_ELEMENT_BUFF_DARK", CPythonNonPlayer::EAIFlags::AIFLAG_ELEMENT_BUFF_DARK);
Usage:
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Petit exemple. Juste une partie c ++:
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
If you do not add vnum to portal.txt, that portal will not have any level limit.
________________________________________________________________________________________________________
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
You must add these:
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
"Hello boys and girls!
With this small release you will be able to check every single affects on your character. The official server implemented this with their autohunt system to check the duration of taus and other potions.
I had to do the same for the dragon soul I have decided to make it. After a small trip in the official binary, I figured out my solution, here it is:
1.0.) Open the Client/UserInterface/PythonPlayer.h file.
1.1.) Then paste the following code to the end of the CPythonPlayer class:
(By unknown reason they put this into the CPythonItem class, idk why. tbh idc)
- 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.0.) Now open the Client/UserInterface/PythonPlayer.cpp file.
2.1.) Jump to the function by name: CPythonPlayer::Clear and add the following line into the function(my advice: to the bottom as always):
2.2.) And last paste these anywhere you want:
- 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.0.) Next, open the Client/UserInterface/CPythonNetworkStreamPhaseGame.cpp file.
3.1.) Extend this function: CPythonNetworkStream::RecvAffectAddPacket with this:
3.2.) Do the same into the CPythonNetworkStream::RecvAffectRemovePacket function with this:
4.0.) Open the Client/UserInterface/PythonPlayerModule.cpp file.
4.1.) Add this new function to the module:
- 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);
- }
- { "CheckAffect", playerCheckAffect, METH_VARARGS },
How to check if the first or the second deck of the dragon soul is activated?
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Thanks for sharing, as always!
You could also check the position realtime while the player is in range so it updates faster.
Bitte melden Sie sich an, um dieses Bild zu sehen.
- /// 1. @ UserInterface/PythonMiniMap.cpp
- // Search @ void CPythonMiniMap::RenderAtlas
- const auto& PartyInfo = it->second;
- __GlobalPositionToAtlasPosition(PartyInfo->lX - m_dwAtlasBaseX, PartyInfo->lY - m_dwAtlasBaseY, &PartyInfo->fScreenX, &PartyInfo->fScreenY);
- // Replace with
- long xPos = PartyInfo->lX;
- long yPos = PartyInfo->lY;
- CInstanceBase* pkInst = CPythonCharacterManager::Instance().GetInstancePtrByName(pPartyMemberInfo->strName.c_str());
- if (pkInst)
- {
- TPixelPosition kInstPos;
- pkInst->NEW_GetPixelPosition(&kInstPos);
- xPos = kInstPos.x + m_dwAtlasBaseX;
- yPos = kInstPos.y + m_dwAtlasBaseY;
- }
- __GlobalPositionToAtlasPosition(xPos - m_dwAtlasBaseX, yPos - m_dwAtlasBaseY, &PartyInfo->fScreenX, &PartyInfo->fScreenY);
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
You can do things like these with it:
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
- POWERSHARD_CHEST has 30% chance contains material.
- ELEGANT_POWERSHARD_CHEST has 60% chance contains material.
- LUCENT_POWERSHARD_CHEST has 100% chance contains material(5x).
- Old rare bonus items(71051 & 71052) disabled.
- Use the gui to add rare bonuses.
- There are now 2 new items to change rare bonuses: ORISON & SMALL_ORISON
- SMALL_ORISON has 10% chance to change rare bonuses.
- ORISON has 100% chance to change rare bonuses.
- For more information, check the images and the video.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.
It's uses config.ini and locale_list.txt from official client.
The language option is stored in the loca.cfg file. It's a silly name, but I did it because it's official did as well. You can change file name.
Target Framework: .NET Framework 4.8
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Reversed from 22.2.7.0 Official Binary.
+ Football Metin Stone From 22.5.7.0:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Functions were in different modules, I gathered them on a single module.
Do not forget to get proto and other files for metin stones from official packs.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
- Reversed from 22.2.7.0
- Client part is from 2018 official root
List of functions:
- EnableFlash
- DisableFlash
- GetButtonImageWidth
- GetButtonImageHeight
- SetAlwaysToolTip
- SetButtonScale
- SetButtonDiffuseColor
- IsDIsable
Be careful about IsDIsable, it's actually IsEnable.
They use like this:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Includes empire and job too, but not in the gui. You can edit gui for that. I didn' try.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Reversed from 22.2.7.0 Official Binary
Client part is from 2018 Official Root.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Client side is from 2018 official root.
It checks the status of the channel from db and gets the port and addr.
It also checks if that map exists in that channel(config).
Bitte melden Sie sich an, um diesen Link zu sehen.
Reversed From 22.5.7.0
- ///@@@UserInterface/PythonApplication.cpp:
- //Find
- void CPythonApplication::Abort()
- {
- ...
- }
- ///Change
- void CPythonApplication::Abort()
- {
- TraceError("============================================================================================================");
- TraceError("Abort!!!!\n\n");
- PyThreadState* tstate = PyThreadState_GET();
- if (tstate)
- {
- for (PyFrameObject* frame = tstate->frame; frame; frame = frame->f_back)
- {
- PyCodeObject* f_code = frame->f_code;
- if (!f_code || !f_code->co_filename || !f_code->co_name)
- continue;
- const char* filename = PyString_AsString(f_code->co_filename);
- const char* funcname = PyString_AsString(f_code->co_name);
- TraceError("filename=%s, name=%s", filename, funcname);
- }
- }
- PostQuitMessage(0);
- }
OLD:
0131 12:59:00866 :: ============================================================================================================
0131 12:59:00867 :: Abort!!!!
NEW:
0131 12:59:00866 :: ============================================================================================================
0131 12:59:00867 :: Abort!!!!
0131 12:59:00867 :: filename=root/black_test.py, name=__LoadWindow
0131 12:59:00867 :: filename=root/black_test.py, name=__init__
0131 12:59:00867 :: filename=root/black_test.py, name=<module>
0131 12:59:00867 :: filename=root/system.py, name=_process_result
0131 12:59:00867 :: filename=root/system.py, name=__pack_import
0131 12:59:00867 :: filename=root/introLogin.py, name=Open
0131 12:59:00867 :: filename=root/networkModule.py, name=__ChangePhaseWindow
0131 12:59:00867 :: filename=root/uiPhaseCurtain.py, name=OnUpdate
0131 12:59:00867 :: filename=root/prototype.py, name=RunApp
0131 12:59:00867 :: filename=root/prototype.py, name=<module>
0131 12:59:00867 :: filename=root/system.py, name=Run
0131 12:59:00867 :: filename=root/system.py, name=execfile
0131 12:59:00867 :: filename=root/system.py, name=RunMainScript
0131 12:59:00867 :: filename=root/system.py, name=<module>
0131 12:59:00867 :: filename=<string>, name=<module>
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Anyway now you can sell shop items with sockets and attrs at shopex.
New price types.
New sorting options
Every Item can have different price type.
price_type: 1:Gold 2:Second Coin 3:Item 4:EXP
sort: Asc,Desc,Vnum,Price,Name,Type
Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
- Reversed from 22.2.7.0 Official Binary.
- Client part is from 2018 Official Root.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
I'm not saying "This is better, you must use this" etc.
I'm only giving you what official has.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
- Mouse wheel moves relative to the top window, not the window the mouse is pointing to.
- Reversed from 22.2.7.0 Official Binary.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
I revised it. Maybe someone would like to use it. Sorry for py and gui
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
It's working without serverside.
For tooltip:
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Hi, folks!
With this guide you will be able to combine textlines with images, like rubinum does.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Usage is simple:
The files are located in the icon pack, so basically the code will load from icon/{GIVEN_PATH}.tga - in the sample the path for the X is: icon/emoji/key_x.tga
Here are the images from rubinum client:
Bitte melden Sie sich an, um diesen Link zu sehen.
Howto:
- 1.) Open EterLib/TextTag.h and add the new tags into the enum there:
- TEXT_TAG_EMOJI_START, // |E
- TEXT_TAG_EMOJI_END, // |e ex) |Epath/filename|h
- 2.1.) Open the EterLib/TextTag.cpp and extend the GetTextTag function with the following statements:
- else if (*cur == L'E') // emoji |Epath/emo|e
- {
- tagLen = 2;
- return TEXT_TAG_EMOJI_START;
- }
- else if (*cur == L'e') // end of emoji
- {
- tagLen = 2;
- return TEXT_TAG_EMOJI_END;
- }
- 2.2.) Extend the GetTextTagOutputString function with the following statements:
- else if (tag == TEXT_TAG_EMOJI_START)
- hyperlinkStep = 1;
- else if (tag == TEXT_TAG_EMOJI_END)
- hyperlinkStep = 0;
- 2.3.) Repeat the 2.2. in the GetTextTagInternalPosFromRenderPos function:
- else if (tag == TEXT_TAG_EMOJI_START)
- hyperlinkStep = 1;
- else if (tag == TEXT_TAG_EMOJI_END)
- hyperlinkStep = 0;
- 2.4.) Repeat again in the GetTextTagOutputLen function too:
- else if (tag == TEXT_TAG_EMOJI_START)
- hyperlinkStep = 1;
- else if (tag == TEXT_TAG_EMOJI_END)
- hyperlinkStep = 0;
- 3.1.) Open EterLib/GrpTextInstance.h and add the following line at the top of the file where the includes are:
- #include "GrpImageInstance.h"
- 3.2.) Add the following struct below of the SHyperlink struct:
- struct SEmoji
- {
- short x;
- CGraphicImageInstance * pInstance;
- SEmoji() : x(0)
- {
- pInstance = NULL;
- }
- };
- 3.3.) Below of the m_hyperlinkVector declaration declare a new variable:
- std::vector<SEmoji> m_emojiVector;
- 4.1.) Open EterLib/GrpTextInstance.cpp and add the following line at the top of the file, where the includes are:
- #include "ResourceManager.h"
- 4.2.) In the CGraphicTextInstance::Update function add the following below of this line: m_hyperlinkVector.clear();
- if (m_emojiVector.size() != 0)
- {
- for (std::vector<SEmoji>::iterator itor = m_emojiVector.begin(); itor != m_emojiVector.end(); ++itor)
- {
- SEmoji & rEmo = *itor;
- if (rEmo.pInstance)
- {
- CGraphicImageInstance::Delete(rEmo.pInstance);
- rEmo.pInstance = NULL;
- }
- }
- }
- m_emojiVector.clear();
- 4.3.) This is a bit complicated, so first of all look for this line:
- else // ľĆ¶řżÜ ´Ů¸Ą ÁöżŞ.
- This is the else for the Arabic codepage, I could not test it, so I didn't make it to arab rtl style.
- 4.4.) Add the following below of this line: std::wstring hyperlinkBuffer;
- SEmoji kEmoji;
- int emojiStep = 0;
- std::wstring emojiBuffer;
- 4.5.) Replace this:
- if (hyperlinkStep == 1)
- hyperlinkBuffer.append(1, wText[i]);
- With this:
- if (hyperlinkStep == 1)
- hyperlinkBuffer.append(1, wText[i]);
- else if (emojiStep == 1)
- emojiBuffer.append(1, wText[i]);
- 4.6.) Then add the new processor for the new tags:
- else if (ret == TEXT_TAG_EMOJI_START)
- {
- emojiStep = 1;
- emojiBuffer = L"";
- }
- else if (ret == TEXT_TAG_EMOJI_END)
- {
- kEmoji.x = x;
- char retBuf[1024];
- int retLen = Ymir_WideCharToMultiByte(GetDefaultCodePage(), 0, emojiBuffer.c_str(), emojiBuffer.length(), retBuf, sizeof(retBuf) - 1, NULL, NULL);
- retBuf[retLen] = '\0';
- char szPath[255];
- snprintf(szPath, sizeof(szPath), "icon/%s.tga", retBuf);
- if (CResourceManager::Instance().IsFileExist(szPath))
- {
- CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(szPath);
- kEmoji.pInstance = CGraphicImageInstance::New();
- kEmoji.pInstance->SetImagePointer(pImage);
- m_emojiVector.push_back(kEmoji);
- memset(&kEmoji, 0, sizeof(SEmoji));
- for (int i = 0; i < pImage->GetWidth() / (pSpaceInfo->width-1); ++i)
- x += __DrawCharacter(pFontTexture, dataCodePage, ' ', dwColor);
- if (pImage->GetWidth() % (pSpaceInfo->width - 1) > 1)
- x += __DrawCharacter(pFontTexture, dataCodePage, ' ', dwColor);
- }
- emojiStep = 0;
- emojiBuffer = L"";
- }
- 4.7.) Add the following code to the end of the CGraphicTextInstance::Render function:
- if (m_emojiVector.size() != 0)
- {
- for (std::vector<SEmoji>::iterator itor = m_emojiVector.begin(); itor != m_emojiVector.end(); ++itor)
- {
- SEmoji & rEmo = *itor;
- if (rEmo.pInstance)
- {
- rEmo.pInstance->SetPosition(fStanX + rEmo.x, (fStanY + 7.0) - (rEmo.pInstance->GetHeight() / 2));
- rEmo.pInstance->Render();
- }
- }
- }
- 4.8.) Add the following into the CGraphicTextInstance::Destroy function:
- if (m_emojiVector.size() != 0)
- {
- for (std::vector<SEmoji>::iterator itor = m_emojiVector.begin(); itor != m_emojiVector.end(); ++itor)
- {
- SEmoji & rEmo = *itor;
- if (rEmo.pInstance)
- {
- CGraphicImageInstance::Delete(rEmo.pInstance);
- rEmo.pInstance = NULL;
- }
- }
- }
- m_emojiVector.clear();
Have fun Bitte melden Sie sich an, um dieses Bild zu sehen.
Sorry for arab players Bitte melden Sie sich an, um dieses Bild zu sehen., for sure they have also developers, so let's go guys, finish it Bitte melden Sie sich an, um dieses Bild zu sehen.
If you have problem, maybe I made a mistake in the guide of missed out something, just leave a comment below.
PS.: Sometimes the code tag of the board puts an extra invisible character mostly the end of the lines, if your IDE cries for syntax error, but it seems correct, check that part of the file with notepad++, it will show a ?(question mark) where the problem is.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
c++11 is enough.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.Includes winter and day-night change.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
- Now you can open shops directly.
- There is no need to adjust the coordinates when adding a new shop. Automatically adjusted according to the shop names.(remote_shop_names.txt)
-
For new shop:
- locale/xx/remote_shop_names.txt
- Add npc vnums to input_main.cpp (_arrShopNpcVnum)
npc vnum = player.shop(npc_vnum)
Bitte melden Sie sich an, um dieses Bild zu sehen.
Special thanks to Tatsumaru for taskbar Icons Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
You can think of it as the lite version. More features are likely to come in the future.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
+ Mount Restrict
+ Start and Win Effects
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
Client Side is from 2018 official root.
Of course I've made minor changes for slot marking and cheque(if app. checks)
You have to add slot marking too.
Mysql used to retrieve data during game launch, and to backup(default 1 hour, you can change at conf.txt)
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Right click Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
The client part is from 2018 official root.
Do not forget to add slot marking.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.
The client part is from 2018 official root.
Includes net.SendItemCombinationPacketCancel(), which was added later.
Don't forget to add the slot marking.
Bitte melden Sie sich an, um diesen Link zu sehen.
Bitte melden Sie sich an, um diesen Link zu sehen.
This is for those who use the official character select window.
There is only the source part.
You can check the 2018 root for the pack side.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.