-
Posts
265 -
Joined
-
Last visited
-
Days Won
29 -
Feedback
91%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by Owsap
-
-
M2 Download Center
( Internal )
( GitHub )
Hello, came by to share something simple yet helpful for players, someone requested me this feature that allows you to input money with k format on the pick money dialog window, this will enable you to input “1kk” instead of “1000000”
Hope it comes in handy for who is planning to use it.Spoiler- 124
- 1
- 1
- 1
- 1
- 1
- 3
- 1
- 27
- 4
- 72
-
A possible way to fix this issue is to change the scale of sash when the character is dead, at first I think all characters will be in the same position while laying down so adjusting the z position to -30 should do the trick and would be less weird.
@ InstanceBase.cpp /// 1. // Search @ void CInstanceBase::SetAcce m_GraphicThingInstance.SetScalePosition(fPositionX, fPositionY, fPositionZ); // Add above if (IsDead()) fPositionZ -= 30; @ char_battle.cpp /// 1. // Search @ void CHARACTER::Dead GetDesc()->SetPhase(PHASE_DEAD); // Add below LPITEM pkAcce = GetWear(WEAR_COSTUME_ACCE); if (pkAcce && pkAcce->IsEquipped()) this->UpdatePacket();
- 3
-
2 it is, thanks for all the votes.
- 1
-
41 minutes ago, FlasH said:
2 is more ez
Thanks for your vote
- 1
-
1 hour ago, Wizz said:
2 Better
2 takes the lead. Thanks for your opinion.
-
1 hour ago, Neyanir said:
I think 1
Thanks for your vote!
-
Hello community, I am wondering which locale file structure seems more user friendly and easier to manage. What's your opinion?
1.2.
- 1
-
M2 Download Center
( Internal )
( GitHub )
Hello community, this is my first tool shared on the forum, hope it helps a lot as it helped me.
I know @Mali61 has already shared the tool on the forum but mine is open source so you can change what ever you want.
The code is not the best but it does what it's supposed to, good uses.
Spoiler
Credits: @WLsj24 for setting up the base locale_string.txt for translations.- 115
- 2
- 4
- 2
- 2
- 1
- 35
- 5
- 69
-
11 hours ago, AltanOzkan said:
Is there anyway to do it faster.
There is, with a simple Python tool.
- 1
-
You can get a VPS SSD for as low as 2.5€, just search the web and you don't have to worry about anything else. A home laptop is not meant to be a home server but to answer your question you can use Microsoft Loopback Adapter of even Hamachi to setup a public connection and together allowing these connections in your Firewall, note that port forwarding is necessary on your router aswell, after all this is configured just use your public IP address to access your server and client.
-
- 3
-
Which system are you talking about?
-
You can also switch to SDK 10.0.16299.0
- 2
-
@ interfaceModule.py ''' 1. ''' # Search self.wndCharacter = uiCharacter.CharacterWindow() # Add below self.wndCharacter.BindInterface(self) @ uiCharacter.py ''' 1. ''' # Search @ def __init__(self): ui.ScriptWindow.__init__(self) # Add below self.interface = None ''' 2. ''' # Search def Show(self): self.__LoadWindow() # Add above def BindInterface(self, interface): from _weakref import proxy self.interface = proxy(interface) ''' 3. ''' # Search def Show(self): self.__LoadWindow() # Add below if self.interface: self.interface.HideAllQuestButton() ''' 4. ''' # Search def Close(self): if 0 != self.toolTipSkill: self.toolTipSkill.Hide() # Add below if self.interface: self.interface.HideAllQuestButton()
Not sure if this is what you really want but it will hide quest scrolls when opening the character window and show them again once closed.
- 1
-
On 9/26/2019 at 8:46 PM, Tatsumaru said:
I recently made a switchbot interface. It came out quite interesting, so i can boast:
Cool, I really liked that design, the gears give a very nice touch to it! Keep up the good work!
- 1
-
On 9/8/2019 at 3:00 PM, Zeph said:
You added quest or something to open shop in npc?
On 9/8/2019 at 2:34 PM, displayjokes said:Can you show me this function: bool CShopManager::Initialize(TShopTable * table, int size)
From your shop_manager.cpp in game>src please?
You must add the value 1 to OnClick column of your shop NPC in mob_proto.
Example:- 1
-
First of all I know this is kind useless but for the sake of enabling and disabling the flash effect in buttons I decided to use the standard flash function because I didn't know an easier way.
SpoilerEterPythonLib/PythonWindow.cpp
/// 1. // Search void CButton::Flash() { m_isFlash = true; } // Add below void CButton::EnableFlash() { m_isFlash = true; if (!m_overVisual.IsEmpty()) SetCurrentVisual(&m_overVisual); } void CButton::DisableFlash() { m_isFlash = false; if (!m_upVisual.IsEmpty()) SetCurrentVisual(&m_upVisual); } /// 2. // Search function void CButton::OnRender() // Replace with void CButton::OnRender() { if (!IsShow()) return; if (m_pcurVisual) { if (m_isFlash) { if (!IsIn() && !IsPressed()) { if (!m_overVisual.IsEmpty()) SetCurrentVisual(&m_overVisual); if (int(timeGetTime() / 500) % 2) return; } } m_pcurVisual->Render(); } PyCallClassMemberFunc(m_poHandler, "OnRender", BuildEmptyTuple()); }
EterPythonLib/PythonWindow.h
/// 1. // Search void Flash(); // Add below void EnableFlash(); void DisableFlash();
EterPythonLib/PythonWindowManagerModule.cpp
/// 1. // Search PyObject * wndButtonFlash(PyObject * poSelf, PyObject * poArgs) { UI::CWindow * pWindow; if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) return Py_BuildException(); ((UI::CButton*)pWindow)->Flash(); return Py_BuildNone(); } // Add below PyObject* wndButtonEnableFlash(PyObject* poSelf, PyObject* poArgs) { UI::CWindow * pWindow; if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) return Py_BuildException(); ((UI::CButton*)pWindow)->EnableFlash(); return Py_BuildNone(); } PyObject* wndButtonDisableFlash(PyObject* poSelf, PyObject* poArgs) { UI::CWindow * pWindow; if (!PyTuple_GetWindow(poArgs, 0, &pWindow)) return Py_BuildException(); ((UI::CButton*)pWindow)->DisableFlash(); return Py_BuildNone(); } /// 2. // Search { "Flash", wndButtonFlash, METH_VARARGS }, // Add below { "EnableFlash", wndButtonEnableFlash, METH_VARARGS }, { "DisableFlash", wndButtonDisableFlash, METH_VARARGS },
ROOT/ui.py
''' 1. ''' # Search def Flash(self): wndMgr.Flash(self.hWnd) # Add below def EnableFlash(self): wndMgr.EnableFlash(self.hWnd) def DisableFlash(self): wndMgr.DisableFlash(self.hWnd)
As for an example, here is a demonstration of the flash effect.
- 1
- 2
- 7
-
-
Nice work, reupload?
-
Nice work looks awesome
-
Spoiler
- 1
-
Nice work keep it up
-
Spoiler7 hours ago, .Elijah said:
Your tutorial is incompleted. (char_item part for RemoveSpecifyItem)
// char_item.cpp // Search: int CHARACTER::CountSpecifyItem(DWORD vnum) const { int count = 0; LPITEM item; for (int i = 0; i < INVENTORY_MAX_NUM; ++i) { // Replace with: int CHARACTER::CountSpecifyItem(DWORD vnum, int iExceptionCell) const { int count = 0; LPITEM item; for (int i = 0; i < INVENTORY_MAX_NUM; ++i) { if(i == iExceptionCell) continue; // char_item.cpp // Search: void CHARACTER::RemoveSpecifyItem(DWORD vnum, DWORD count) { if (0 == count) return; for (UINT i = 0; i < INVENTORY_MAX_NUM; ++i) { // Replace with: void CHARACTER::RemoveSpecifyItem(DWORD vnum, DWORD count, int iExceptionCell) { if (0 == count) return; for (UINT i = 0; i < INVENTORY_MAX_NUM; ++i) { if(i == iExceptionCell) continue; // char_item.cpp // Search: 2x if (CountSpecifyItem(prt->materials[i].vnum) < prt->materials[i].count) // Replace with: if (CountSpecifyItem(prt->materials[i].vnum, item->GetCell()) < prt->materials[i].count) // char_item.cpp // Search: 2x RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count); // Replace with: RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count, item->GetCell()); // char.h // Search: int CountSpecifyItem(DWORD vnum) const; void RemoveSpecifyItem(DWORD vnum, DWORD count = 1); // Replace with: int CountSpecifyItem(DWORD vnum, int iExceptionCell = -1) const; void RemoveSpecifyItem(DWORD vnum, DWORD count = 1, int iExceptionCell = -1);
It works the same but your way is cleaner, i just didn't feel the necessity of adding a new argument to the CountSpecificItem function, instead i differently added another way of counting the items. Anyway, thanks for making it more cleaner.
- 2
-
When item materials are removed from the refinment process the source item that is beeing refined also get's removed since it's apart of the required item list and this is what causes the game core to crash after any instance like warping.
In order to fix this, we can check the source item beeing refined by position, simply by creating a new argument for the function RemoveSpecifyItem with the source item's cell position.
char_item.cppSpoiler/// 1. // Search @ DoRefineWithScroll for (int i = 0; i < prt->material_count; ++i) { if (CountSpecifyItem(prt->materials[i].vnum) < prt->materials[i].count) { if (test_server) { ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®À» Çϱâ À§ÇÑ Àç·á°¡ ºÎÁ·ÇÕ´Ï´Ù.")); return false; } } for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count); // Replace with: for (int i = 0; i < prt->material_count; ++i) { DWORD material_count; if (prt->materials[i].vnum == item->GetVnum()) material_count = prt->materials[i].count + 1; else material_count = prt->materials[i].count; if (CountSpecifyItem(prt->materials[i].vnum) < material_count) { if (test_server) { ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®À» Çϱâ À§ÇÑ Àç·á°¡ ºÎÁ·ÇÕ´Ï´Ù.")); return false; } } for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count, item->GetCell()); /// 2. // Search @ DoRefine for (int i = 0; i < prt->material_count; ++i) { if (CountSpecifyItem(prt->materials[i].vnum) < prt->materials[i].count) { if (test_server) { ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®À» Çϱâ À§ÇÑ Àç·á°¡ ºÎÁ·ÇÕ´Ï´Ù.")); return false; } } for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count); // Replace with for (int i = 0; i < prt->material_count; ++i) { DWORD material_count; if (prt->materials[i].vnum == item->GetVnum()) material_count = prt->materials[i].count + 1; else material_count = prt->materials[i].count; if (CountSpecifyItem(prt->materials[i].vnum) < material_count) { if (test_server) { ChatPacket(CHAT_TYPE_INFO, "Find %d, count %d, require %d", prt->materials[i].vnum, CountSpecifyItem(prt->materials[i].vnum), prt->materials[i].count); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°³·®À» Çϱâ À§ÇÑ Àç·á°¡ ºÎÁ·ÇÕ´Ï´Ù.")); return false; } } for (int i = 0; i < prt->material_count; ++i) RemoveSpecifyItem(prt->materials[i].vnum, prt->materials[i].count, item->GetCell());
char.h
Spoiler/// 1. // Search void RemoveSpecifyItem(DWORD vnum, DWORD count = 1); // Replace with void RemoveSpecifyItem(DWORD vnum, DWORD count = 1, DWORD sourcePos = -1);
Preview of fix: https://metin2.download/picture/S6ACMRa2ZApJHEV6slZx8KU4OJO7E8B2/.gifv
- 6
Input K Format in Pick Money Dialog
in Features & Metin2 Systems
Posted
What's your method?