Jump to content

Sonitex

Premium
  • Posts

    521
  • Joined

  • Days Won

    12
  • Feedback

    100%

Everything posted by Sonitex

  1. 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.
  2. They are inside metinstone folders at monster/monster2.
  3. 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)
  4. 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.
  5. char_item.cpp bool IS_SUMMONABLE_ZONE(int map_index)
  6. 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.
  7. You are missing one of these functions in CHARACTER class: IsCombOpen() IsOpenMailBox() isSashOpened() Check both char.h and char.cpp for these
  8. 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.
  9. 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.
  10. 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.
  11. 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
  12. 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
  13. 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.
  14. 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
  15. 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.
  16. 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.
  17. Heya, is it a dungeon instance or just a normal map?
  18. Sonitex

    Render Map

    M2 Download Center Download Here ( Internal ) Download Here Useful to create in-game renders
  19. 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
  20. 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
  21. I have added usage example in the main post
  22. 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
×
×
  • 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.