Sonitex
Premium-
Posts
521 -
Joined
-
Days Won
12 -
Feedback
100%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Everything posted by Sonitex
-
Python - keyboard call - Question
Sonitex replied to santa12's topic in Community Support - Questions & Answers
For that you can go to game.py and search for these at def __BuildKeyDict(self): You bind your event to the button there and create your new definition of the function in the same class: Normally any window is bound to an interface class (interfaceModule.py) so you would call your GUI from there. For example, here is a function StartExchange from game.py calling StartExchange function at interfaceModule.py (self.interface). And here is this the function from interface class calling exchange window functions. -
CHANGE METIN APPEARENCE
Sonitex replied to Coutter's topic in Community Support - Questions & Answers
They are inside metinstone folders at monster/monster2. -
There is no quest state trigger unless you make one by yourself. Instead you can go to questmanager.cpp and take a look at this function: void CQuestManager::SetEventFlag(const string& name, int value)
-
One possible problem is, transmutated weapon is not copied to the newly created item. Take a look at function called RefineWithScroll (or something similar) in char_item.cpp and add the missing part.
- 1 reply
-
- 1
-
SCROLL OF LOCATION / RETURN SCROLL
Sonitex replied to Coutter's topic in Community Support - Questions & Answers
char_item.cpp bool IS_SUMMONABLE_ZONE(int map_index)- 1 reply
-
- 3
-
Problem with hyperlinked item
Sonitex replied to Jimmermania's topic in Community Support - Questions & Answers
Item hyperlink is created by the following function inside PythonPlayerModule.cpp: PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs) And then when you click on the text, it triggers this function on python side, which creates the item tooltip: def MakeHyperlinkTooltip(self, hyperlink): These two are main functions that control item tooltip through hyperlink. Python function is used across the python files like uiChat, game and uiWhisper so you should check those files out as well. I hope this will help you out. -
[Problem] : battle pass
Sonitex replied to mohanad1111's topic in Community Support - Questions & Answers
You are missing one of these functions in CHARACTER class: IsCombOpen() IsOpenMailBox() isSashOpened() Check both char.h and char.cpp for these- 1 reply
-
- 1
-
State of Private Server Metin2?
Sonitex replied to NinjaForcePT's topic in Community Support - Questions & Answers
Ah that one, well as you can see that was almost 5 years ago. They did cancel most of P-Server footage on YouTube but that is about it. Did not cancel any server directly whatsoever. -
State of Private Server Metin2?
Sonitex replied to NinjaForcePT's topic in Community Support - Questions & Answers
That is new Where have they published this claim? Other than that, P-Server situation did not change much. Still getting more attention than Gameforge servers. -
Hey! "auto" keyword is only supported by higher C++ versions, I believe it was introduced in C++11. You can replace it with "TFormat" and you should be just fine. For future use, I would suggest to upgrade your C++ language standard as it makes thing much simpler when programming.
-
Heya, when a party member is assigned a role, it's tiny icon will be displayed in the beginning instead of predefined position. Inside party.py replace SetAffect function with the following: def SetAffect(self, affectSlotIndex, affectValue): if affectSlotIndex >= len(self.partyAffectImageList): return if affectValue > 0: self.partyAffectImageList[affectSlotIndex].Show() else: self.partyAffectImageList[affectSlotIndex].Hide() self.affectValueDict[affectSlotIndex] = affectValue self.__ArrangeAffectPosition() Add this function to the class: def __ArrangeAffectPosition(self): x_pos = 22 y_pos = 24 affectIndex = 0 for image in self.partyAffectImageList: if image.IsShow(): image.SetPosition(x_pos + 14 * affectIndex, y_pos) affectIndex += 1
-
Public Consultation - Trusted Third Party / Middleman
Sonitex replied to AZICKO's topic in Announcements
I get it from where you are coming from with this but you made it a lose-lose situation if you ask me. Not sure how much thought you put into these new rules but as there are no sellers, there are even fewer buyers which means overall less active members. Also, people that do have open topics rarely post anything (not all). Won't bother you with this anymore. I just think you had a good idea, but bad execution. Peace -
Public Consultation - Trusted Third Party / Middleman
Sonitex replied to AZICKO's topic in Announcements
Hey-ho! I would like to give my humble opinion about the middleman and the overall situation about buying/selling on the board. VegaS already covered every point on why middleman would not be such a good idea and since the board team would be the one doing it, it is the very reason why he wrote a mega paragraph about it (most likely haha). Long story short, a middleman would not solve the scamming problem, at least not entirely. Also, I am sure if you do just a little internet search you will get a rough idea about the seller. Even so, you can always ask in Discord and most of the times people respond with their experience with the seller. I think scamming is a long-gone problem. That being said, a much bigger problem is reselling/leaking sellers work which comes from the buyer’s side. I would suggest adding some more tools to the forum which will support both ends, buyers and sellers. A rating system where users would leave their opinion about the trade and rate overall experience. Maybe even append an average rating to the user’s profile so it would be easier for everyone to see if you belong to the angel's or devil's side. There are countless ideas on how to tackle this problem, but I would not go for the middleman variant. Some kind of automated process would fit much better. Also, I've seen other people complaining (including me) about your conditions to be a seller. It is quite interesting to me that no new seller has been allowed to make a topic since the new rules came by. At such a pace scamming/reselling/leaking problems will eventually disappear so I guess there is that. -
questlua_global.cpp int _spawn_mob_in_map(lua_State* L) { if (false == lua_isnumber(L, 1) || false == lua_isnumber(L, 2) || false == lua_isnumber(L, 3) || false == lua_isnumber(L, 4) || false == lua_isnumber(L, 5) || false == lua_isboolean(L, 6)) { lua_pushnumber(L, 0); return 1; } const DWORD dwVnum = static_cast<DWORD>(lua_tonumber(L, 1)); const size_t count = MINMAX(1, static_cast<size_t>(lua_tonumber(L, 2)), 10); const long lMapIndex = static_cast<long>(lua_tonumber(L, 3)); const long lX = static_cast<long>(lua_tonumber(L, 4)); const long lY = static_cast<long>(lua_tonumber(L, 5)); const bool isAggresive = static_cast<bool>(lua_toboolean(L, 6)); size_t SpawnCount = 0; const CMob* pMonster = CMobManager::instance().Get(dwVnum); if (NULL != pMonster) { const LPCHARACTER pChar = CQuestManager::instance().GetCurrentCharacterPtr(); for (size_t i = 0; i < count; ++i) { const LPCHARACTER pSpawnMonster = CHARACTER_MANAGER::instance().SpawnMob(dwVnum, lMapIndex, lX, lY, 0, true, -1, pMonster->m_table.bType == CHAR_TYPE_STONE, isAggresive); if (NULL != pSpawnMonster) { ++SpawnCount; } } sys_log(0, "QUEST Spawn Monster: VNUM(%u) COUNT(%u) isAggresive(%b)", dwVnum, SpawnCount, isAggresive); } lua_pushnumber(L, SpawnCount); return 1; } { "spawn_mob_in_map", _spawn_mob_in_map }, Quest part: local coordinates = { {8892, 14464}, {8835, 14276}, {8639, 14224}, {8570, 14292}, {8671, 14465}, {8825, 14688}, {8796, 14787} } local n = math.random(1, 7) -- Vnum Count MapIndex X Y IsAggressive -- Also add did this function to quest_functions file spawn_mob_in_map(VNUM, COUNT, MAP_INDEX, coordinates[n][1], coordinates[n][2], false) Try this
-
You are trying to execute another timer whose name already exists. You must first clear the first one, before setting a new one with the same name.
-
If you are setting quest flag from a different quest, "duration" variable is bound to that very specific quest. You may want to use setf function. pc.setf("biolog_quest_name", "duration", pc.getf("biolog_quest_name", "duration") * 0.7) If the problem still persists, it would be easier for us to see the quest.
-
Heya, is it a dungeon instance or just a normal map?
-
M2 Download Center Download Here ( Internal ) Download Here Useful to create in-game renders
- 1 reply
-
- 119
-
M2 Download Center Download Here ( Internal ) Hello, this archive has been made by a colleague of mine who is no longer active so I thought I might as well share it with you. It includes: Cryptoop DevIL1.7.99 DevIL1.8 Granny2.9.12 Granny2.11 Jpged9c Lz4 Lzo2 Miles6.5c Miles9.3 Python2.7 SpeedTreeRT1.6 SpeedTreeRT4.0 SpeedTreeSDK7.0 tbb Mega Download
-
In cases such as horse name postfix, you can do it directly in client source. In the following function, check if an instance is a horse and append the string to its name ('s Horse). void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData) In other cases where you must use a locale string as an argument, you either add multilingual data to the server or create a separate packet just for this locale string. Edit: There are also other ways like passing "[STRING_221]" as a string argument and on the client side you fetch a locale string with ID 221. This can be also useful for item and monster names
-
I have added usage example in the main post
-
Remove buff with login
Sonitex replied to Malbeth's topic in Community Support - Questions & Answers
Even better -
Remove buff with login
Sonitex replied to Malbeth's topic in Community Support - Questions & Answers
input_login.cpp void CInputLogin::Entergame(LPDESC d, const char * data) { [...] if (ch->GetMapIndex() >= DUNGEON_INDEX*10000 && ch->GetMapIndex() <= DUNGEON_INDEX*10010) { if(ch->IsAffectFlag(AFF_SHAMAN_SKILL)) RemoveAffect(AFF_SHAMAN_SKILL); } [...] } Edit DUNGEON_INDEX & AFF_SHAMAN_SKILL and you should be good to go -
Can you show cipher.h file?