Jump to content

Eremit2

Active+ Member
  • Posts

    19
  • Joined

  • Last visited

  • Feedback

    0%

About Eremit2

Informations

  • Country
    Romania
  • Nationality
    Romanian

Recent Profile Visitors

687 profile views

Eremit2's Achievements

Collaborator

Collaborator (7/16)

  • Collaborator Rare
  • Very Popular Rare
  • First Post
  • One Year In
  • One Month Later

Recent Badges

439

Reputation

  1. Download Alternative download links → Google Drive An advanced item recovery system that mirrors the official server experience. Automatically caches the last 12 items sold to any NPC into a dedicated, interface grid, allowing instant repurchasing. The basis of the system should be solid, allowing for worry-free use. I was too lazy to add a confirmation popup for the purchase, but feel free to do it yourself if you want. Happy Easter!
  2. An intuitive interface optimization that dynamically scales item quantity numbers. Automatically zooms text size (x2) while holding the CTRL key for quick, crystal-clear visibility of item stacks, instantly reverting to normal when released. This version is a personal reinterpretation of the official system, it works differently from the official one, where enlarged pictures are used, instead of scaling existing pictures, which I did in this system. In the system I made, there is only the scaling part directly on CTRL in the game source, if you want in the config this can be done quite easily. Happy Easter! INSTALLATION UserInterface/Locale_inc.h Add: #define ENABLE_SLOT_TEXT_SIZE EterPythonLib/PythonWindow.h Search: DWORD m_dwWidthSummary; Add below: #ifdef ENABLE_SLOT_TEXT_SIZE bool m_bIsZoomed; #endif EterPythonLib/PythonWindow.cpp Search: CNumberLine::CNumberLine(PyObject * ppyObject) : CWindow(ppyObject) { m_strPath = "d:/ymir work/ui/game/taskbar/"; m_iHorizontalAlign = HORIZONTAL_ALIGN_LEFT; m_dwWidthSummary = 0; Add below: #ifdef ENABLE_SLOT_TEXT_SIZE m_bIsZoomed = false; #endif Search: CNumberLine::CNumberLine(CWindow * pParent) : CWindow(NULL) { m_strPath = "d:/ymir work/ui/game/taskbar/"; m_iHorizontalAlign = HORIZONTAL_ALIGN_LEFT; m_dwWidthSummary = 0; m_pParent = pParent; Add below: #ifdef ENABLE_SLOT_TEXT_SIZE m_bIsZoomed = false; #endif Search: CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strImageFileName.c_str()); CGraphicImageInstance * pInstance = CGraphicImageInstance::New(); pInstance->SetImagePointer(pImage); m_ImageInstanceVector.push_back(pInstance); m_dwWidthSummary += pInstance->GetWidth(); Replace with: #ifdef ENABLE_SLOT_TEXT_SIZE CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strImageFileName.c_str()); CGraphicExpandedImageInstance * pInstance = CGraphicExpandedImageInstance::New(); pInstance->SetImagePointer(pImage); pInstance->SetScale(m_bIsZoomed ? 2.0f : 1.0f, m_bIsZoomed ? 2.0f : 1.0f); m_ImageInstanceVector.push_back(pInstance); m_dwWidthSummary += pImage->GetWidth(); #else CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strImageFileName.c_str()); CGraphicImageInstance * pInstance = CGraphicImageInstance::New(); pInstance->SetImagePointer(pImage); m_ImageInstanceVector.push_back(pInstance); m_dwWidthSummary += pInstance->GetWidth(); #endif Search: void CNumberLine::OnRender() { for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { m_ImageInstanceVector[i]->Render(); } } Replace with: void CNumberLine::OnRender() { #ifdef ENABLE_SLOT_TEXT_SIZE bool bIsCtrlPressed = (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0; if (m_bIsZoomed != bIsCtrlPressed) { m_bIsZoomed = bIsCtrlPressed; for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { CGraphicExpandedImageInstance* pInstance = (CGraphicExpandedImageInstance*)m_ImageInstanceVector[i]; pInstance->SetScale(m_bIsZoomed ? 2.0f : 1.0f, m_bIsZoomed ? 2.0f : 1.0f); } OnChangePosition(); } #endif for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { m_ImageInstanceVector[i]->Render(); } } Search: void CNumberLine::OnChangePosition() { int ix = m_x; int iy = m_y; if (m_pParent) { ix = m_rect.left; iy = m_rect.top; } switch (m_iHorizontalAlign) { case HORIZONTAL_ALIGN_LEFT: break; case HORIZONTAL_ALIGN_CENTER: ix -= int(m_dwWidthSummary) / 2; break; case HORIZONTAL_ALIGN_RIGHT: ix -= int(m_dwWidthSummary); break; } for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { m_ImageInstanceVector[i]->SetPosition(ix, iy); ix += m_ImageInstanceVector[i]->GetWidth(); } } Replace with: void CNumberLine::OnChangePosition() { int ix = m_x; int iy = m_y; if (m_pParent) { ix = m_rect.left; iy = m_rect.top; } #ifdef ENABLE_SLOT_TEXT_SIZE int iCurrentWidthSummary = m_dwWidthSummary * (m_bIsZoomed ? 2 : 1); #endif switch (m_iHorizontalAlign) { case HORIZONTAL_ALIGN_LEFT: break; case HORIZONTAL_ALIGN_CENTER: #ifdef ENABLE_SLOT_TEXT_SIZE ix -= int(iCurrentWidthSummary) / 2; #else ix -= int(m_dwWidthSummary) / 2; #endif break; case HORIZONTAL_ALIGN_RIGHT: #ifdef ENABLE_SLOT_TEXT_SIZE ix -= int(iCurrentWidthSummary); #else ix -= int(m_dwWidthSummary); #endif break; } #ifdef ENABLE_SLOT_TEXT_SIZE if (m_bIsZoomed) { iy -= 4; ix += 4; } for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { m_ImageInstanceVector[i]->SetPosition(ix, iy); ix += (m_ImageInstanceVector[i]->GetWidth() * (m_bIsZoomed ? 2 : 1)); } #else for (DWORD i = 0; i < m_ImageInstanceVector.size(); ++i) { m_ImageInstanceVector[i]->SetPosition(ix, iy); ix += m_ImageInstanceVector[i]->GetWidth(); } #endif }
      • 2
      • Metin2 Dev
  3. A simple and fast solution should look like this: in char_battle.cpp: Search: #ifdef ENABLE_PET_PICKUP_ITEMS if (pkAttacker->HasPickupPet()) { pkAttacker->AutoGiveItemInstant(item); } else #endif Change with: #ifdef ENABLE_PET_PICKUP_ITEMS bool bIsFilterItem = (item->GetVnum() == 19 || item->GetVnum() == 71023 || item->GetVnum() == 71029); if (pkAttacker->HasPickupPet() && bIsFilterItem) { pkAttacker->AutoGiveItemInstant(item); } else #endif Search: if (ch->HasPickupPet()) { ch->AutoGiveItemInstant(item); } else Change with: bool bIsFilterItem = (item->GetVnum() == 19 || item->GetVnum() == 71023 || item->GetVnum() == 71029); if (ch->HasPickupPet() && bIsFilterItem) { ch->AutoGiveItemInstant(item); } else Change these vnums, or you cand add types, or subtypes or whatever you want. bool bIsFilterItem = (item->GetVnum() == 19 || item->GetVnum() == 71023 || item->GetVnum() == 71029); If you want to disable the auto gold pickup, search: #ifdef ENABLE_PET_PICKUP_ITEMS if (pkAttacker->HasPickupPet()) { isAutoLoot = true; } #endif And change isAutoLoot to false: isAutoLoot = false;
  4. Download Alternative download links → Google Drive A simple method to display the map and coordinates in the Teleportation Scroll. Easy to use, the system automatically detects the map coordinates and size, and for maps without an atlas (indoor maps) it informs the player that no preview is available.
      • 48
      • Metin2 Dev
      • Love
      • Good
      • Love
      • Flame
  5. Download Alternative download links → Google Drive New type for the mob_drop_item.txt drop system that allows items to drop based on your level. Easy to use: just set the variables level_min and level_max for the mob drop.
      • 67
      • Metin2 Dev
      • Love
      • Good
      • muscle
      • Flame
      • Love
      • Lmao
  6. Download Alternative download links → Google Drive A simple check for a safe or non-safe zone (non-PvP zone). Easily usable directly in the server source. Easily usable directly in quests.
      • 9
      • Love
      • Metin2 Dev
      • Good
  7. Download Alternative download links → Google Drive or Alternate_2 or Alternate_3 Official-style anti-experience ring. You can add multiple items with different durations. You can't gain experience, but you can read books and donate to the guild.
      • 19
      • Metin2 Dev
      • Love
      • Good
      • kekw
  8. Download Alternative download links → Google Drive Simple and configurable bonus system based on a character's alignment value. Allows adding bonus based on alignment grade in a simple way. Fully configurable with any number of thresholds or steps. Provides flexibility to reward or penalize players depending on their alignment.
      • 31
      • Love
      • Metin2 Dev
      • muscle
  9. Download Alternative download links → Google Drive A simple renewal that extends the classic pet system with modern improvements. Introduces a new pet type with support for various subtypes, allowing greater flexibility and customization. Removes the dependency on quests, making the entire system managed directly from the game source. Displays pet bonuses directly from item_proto, with clear highlighting in both inventory and taskbar. Greatly simplifies the addition of new pets, eliminating the hassle of quest scripting and making implementation straightforward.
  10. Download Alternative download links → Google Drive A simple and configurable system that allows pets to automatically pick up items and gold for the player. Supports picking up items directly in inventory, with proper handling of inventory limits. Fully compatible with party systems, ensuring proper item distribution among party members. Can be easily configured either for the item used to summon the pet or directly by the pet's vnum. Compatible with the classic pet system and easily adjustable for new modern pet systems. When the object is dropped, it is placed directly in the inventory (the pet does not have to be in front of the object to pick it up).
  11. Download Center Download (Google Drive) A secure and innovative login extension using temporary access keys. Allows instant account access without username and password, valid for a single session. The key resets automatically after each use, ensuring maximum security.
      • 21
      • Metin2 Dev
      • Love
      • Good
      • Lmao
  12. To make translations much easier for all languages, I thought it would be an interesting idea to load mob_names.txt separately from mob_proto. This way, the mob_names.txt file will be available inside each language folder (locale/ro, locale/en, locale/pt, locale/es, etc.) and will be loaded after mob_proto. Download Alternative download links → Google Drive or Alternate_2 or Alternate_3
      • 18
      • Metin2 Dev
      • Good
      • Love
  13. A modernized fishing timer system designed to improve clarity and usability, for the classic fishing system. It displays a clean countdown interface, using distinct icons and colors to clearly represent each fishing state, making the fishing process easier to track and more intuitive. Download Alternative download links → Google Drive
      • 41
      • Metin2 Dev
      • Good
      • Love
      • Love
      • muscle
  14. A simple and fast way to split items directly from your inventory. How it works: 1.Pick up an item 2.Hold SHIFT 3.Click on empty slots in your inventory Each click will split the item stack automatically, making inventory management much faster and easier. INSTALLATION uiinventory.py Search in def SelectEmptySlot: if player.SLOT_TYPE_INVENTORY == attachedSlotType: itemCount = player.GetItemCount(attachedSlotPos) attachedCount = mouseModule.mouseController.GetAttachedItemCount() Add below: if (app.IsPressed(app.DIK_LSHIFT) or app.IsPressed(app.DIK_RSHIFT)) and itemCount > 1: self.__SendMoveItemPacket(attachedSlotPos, selectedSlotPos, 1) mouseModule.mouseController.UpdateAttachedCount(itemCount-1) return mousemodule.py Search: def IsAttachedMoney(self): Add before: def UpdateAttachedCount(self, count): self.AttachedCount = count self.countNumberLine.SetNumber("") self.countNumberLine.Hide() if count > 1: self.countNumberLine.SetNumber(str(count)) self.countNumberLine.Show() PREVIEW
      • 6
      • Metin2 Dev
      • Love
      • Love
      • Good
  15. To make translations much easier for all languages, I thought it would be an interesting idea to load item_names.txt separately from item_proto. This way, the item_names.txt file will be available inside each language folder (locale/ro, locale/en, locale/pt, locale/es, etc.) and will be loaded after item_proto. INSTALLATION UserInterface/Locale_inc.h Add: #define ENABLE_ITEM_NAMES_SEPARATED_READ UserInterface/PythonApplication.cpp Search: char szItemProto[256]; Add after: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ char szItemNames[256]; #endif Search: snprintf(szItemProto, sizeof(szItemProto), "%s/item_proto", localePath); Add after: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ snprintf(szItemNames, sizeof(szItemNames), "%s/item_names.txt", localePath); #endif Search: if (!rkItemMgr.LoadItemTable(szItemProto)) { TraceError("LoadLocaleData - LoadItemProto(%s) Error", szItemProto); return false; } Add after: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ if (!rkItemMgr.LoadItemNames(szItemNames)) { Tracenf("LoadLocaleData - LoadItemNames(%s) Error", szItemNames); } #endif GameLib/ItemData.cpp Search: const char * CItemData::GetName() const { return m_ItemTable.szLocaleName; } Add after: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ void CItemData::SetItemNames(const std::string& name) { strncpy(m_ItemTable.szLocaleName, name.c_str(), sizeof(m_ItemTable.szLocaleName) - 1); m_ItemTable.szLocaleName[sizeof(m_ItemTable.szLocaleName) - 1] = '\0'; } #endif GameLib/ItemData.h Search: #include "../eterGrnLib/Thing.h" Add after: #include "../UserInterface/Locale_inc.h" Search: const char * GetSummary() const; Add after: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ void SetItemNames(const std::string& name); #endif GameLib/ItemManager.cpp Search: DWORD GetHashCode( const char* pString ) Add before: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ bool CItemManager::LoadItemNames(const char* c_szFileName) { const VOID* pvData; CMappedFile kFile; if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) { Tracenf("CItemManager::LoadItemNames(c_szFileName=%s) - Load Error", c_szFileName); return false; } CMemoryTextFileLoader kTextFileLoader; kTextFileLoader.Bind(kFile.Size(), pvData); CTokenVector kTokenVector; for (DWORD i = 0; i < kTextFileLoader.GetLineCount(); ++i) { if (!kTextFileLoader.SplitLineByTab(i, &kTokenVector)) continue; if (kTokenVector.size() < 2) continue; DWORD dwVnum = static_cast<DWORD>(atoi(kTokenVector[0].c_str())); std::string c_rstName = kTokenVector[1]; if (c_rstName.length() >= CItemData::ITEM_NAME_MAX_LEN) { c_rstName.resize(CItemData::ITEM_NAME_MAX_LEN - 1); } TItemMap::iterator f = m_ItemMap.find(dwVnum); if (f == m_ItemMap.end()) continue; CItemData* pkItemDataFind = f->second; pkItemDataFind->SetItemNames(c_rstName); } return true; } #endif GameLib/ItemManager.h Search: bool LoadItemTable(const char* c_szFileName); Add: #ifdef ENABLE_ITEM_NAMES_SEPARATED_READ bool LoadItemNames(const char* c_szFileName); #endif Place the item_names.txt file inside your locale directory, for example in the 'ro' or 'en' folder, or in the folder corresponding to the language. locale/ro/item_names.txt locale/en/item_names.txt locale/es/item_names.txt locale/pt/item_names.txt
      • 1
      • Love
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.