Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 03/06/21 in all areas

  1. M2 Download Center Download Here ( Internal ) The new Metin2 client modified the way it loads the pack/Index file, while I can't be sure this changes are 100% identical to the official server, it work without a lot of issues. The second changes that the official server did, was changing the loading of Minimap waypoints (stored in locale/xx/map). You can find the two changes here: [Hidden Content] [Hidden Content] Good luck. (EDIT: I realzied later Penger already released the MarkInfo and I realized that after making this release lmao rip)
    6 points
  2. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Python-Code-Translator-2-to-3 Is a Python program that reads Python 2.x source code and applies a series of fixers to transform it into valid Python 3.x code that works on all versions (py2.x - py3.x). The standard library contains a rich set of fixers that will handle almost all code. A flexible and generic library, so it is possible to write your own fixers based on your purposes. Warning: This tool purpose wasn't for doing the transition to python3, is just for the IDE purpose. INSTALLATION [Hidden Content] USING Add your .py scripts to the modules folder. Run main.bat Take the output files and move them into your application. FIXERS print Converts the print statement to the print() function. Matching multiple formats, comments, and more. Exception handling Convert except to except BaseException, since BaseException is the base class for all built-in exceptions. Converts except X, T to except X as T. xrange Renames xrange() to range() and wraps existing range() calls with list. has_key Changed dict.has_key(key) to dict..contains__(key) dict Fixes dictionary iteration methods. dict.iteritems() is converted to dict.items(), dict.iterkeys() to dict.keys(), and dict.itervalues() to dict.values(). Similarly, dict.viewitems(), dict.viewkeys() and dict.viewvalues() are converted respectively to dict.items(), dict.keys() and dict.values(). It also wraps existing usages of dict.items(), dict.keys(), and dict.values() in a call to list. exec - TODO Converts the exec statement to the exec() function. apply - TODO Removes usage of apply(). For example apply(function, *args, **kwargs) is converted to function(*args, **kwargs). raise - TODO Converts raise E, V to raise E(V), and raise E, V, T to raise E(V).with_traceback(T). If E is a tuple, the translation will be incorrect because substituting tuples for exceptions has been removed in 3.0. You can use it together with Skeleton of Python modules for IDE, from @Takuma. Download: [hide][Hidden Content]]
    2 points
  3. The content in that topic can be visualized in a single gif: The problem with the "speedy effects" after maximizing a minimized client lies here: As you can see the elapsed time is measured since... well... the last time the effect got updated. You might say that hey, thats ok... well it would be, but if you take a look at the messy game loop inside PythonApplication.cpp you will notice that the call for effect updates is only present in the RenderGame function, which is a render function as its name implies it, and its only called when the game is rendering. And since the game doesn't render anything if its minimized, the time for the effects basically stops, and when the game starts rendering again, it will resume it from that point when it got minimized. You might rightfully say that okay, but that doesn't explain the reason why is it "speedy" for a long time, since the time difference should be huge for only one call, then it should return to normal because the m_fLastTime got updated at the end of the function. And at this point I'm officially out of definitive answers. The real reason might be one of the following: On the first "big" time difference after maximizing the client destabilizes the effect instance, messing up the emission/decorator update on a weird way, making the following n updates unstable as well. The custom timer class is more than weird, it has a "real time" mode and a "custom time" mode, but as I see only the "custom time" mode is used, which works like advancing the timer every time the main loop is called. Since the advancing is always called (its in the update part, not the render part) I somewhat doubt that this is the real reason. Using a different timer (potentially std::chrono) here in the effect update would quickly evaluate this case. In short, fixing it could be done by: Using a maximum value for the elapsed time (like it cant be larger than 1/60). This would solve the "speedy" issue, but would cause another bug, making some effects stay longer alive (if you minimize the client). Calling effect update even when the client is minimized. This would make the client use somewhat more resource when its minimized, but would still use way more less resource compared to the "fix" in that topic. Digging a bit more deeper, finding more accurate solutions. (The effects are stateless, or at least it really seems so, so it should mean that the effect should work with any given "elapsed time" at any point, but like I said this might be violated somewhere. The effects are not stateless, since the particle positions are based on the last position + elapsedTime * acceleration.)
    2 points
  4. V40 is out! New config option LOCALE You can now translate the program UI (and also more in the future) by generating the relative WorldEditorRemix_{}.dll file. To translate the program: [Hidden Content] Editing can be done by either notepad or vs editor: Result:
    2 points
  5. M2 Download Center Download Here ( Internal 2.9 ) Download Here ( Last Release ) 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: Its settings (xtea keys, extensions, pack types to use) can be changed inside PackMakerLite.json: You can actually integrate the tool in the menu context (running the .reg files) for packing folders and unpacking .eix files: Remove "--nolog" from the .bat files if you want to see the logs again. Command-line options get overwritten by JSON config options. 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
    1 point
  6. M2 Download Center Download Here ( Internal ) Download
    1 point
  7. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) There's just a smart python module which i did for fun, for a friend, no support for implementation. Enjoy. Github repository: [Hidden Content]
    1 point
  8. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) I would not recommend using this as it's missing many features, head over to Mali's release for an updated version. [Hidden Content]
    1 point
  9. M2 Download Center Download Here ( Internal ) Hey everybody, I have something special for you. This time I'm gonna show you how to change the appearance of your horses on the fly! *** Disclaimer (kinda) *** I hereby declare that the changes I made are all by myself. I did not steal from anyone. Therefore for this guide I am the author. If anyone wants to copy my guide and post it anywhere he's free to do as long as he mentions the original author. I do not provide or share the source code or anything else protected by copyright. If something breaks I'm not the one to blame at. Always make sure to test changes. Never implement them on production releases, always use test distributions before! If you find any flaws, may it be regarding security or something else you're free to tell me so. I'm learning, as we all do, so I'm in no way too proud to admit I'm making mistakes. I'll correct them as soon as possible of course. 1) Which files do we need to edit? - char.h - char.cpp - char_horse.cpp - questlua_horse.cpp - tables.h (in common) - ClientManagerPlayer.cpp (in db) 2) What are we planning to do? Simple problem: I for myself hate it to use thousands of seals, switch between them, maybe have bugs and I think it's not that good solved to use an additional "system" to let players ride pets. So what do we want to do? We want to make the appearance of horses variable, so players can for example use seals to change the appearance of their horses instead of mounting an additional "horse". So. How are we going to do this? Simple! We can just add a variable to our character class, so the gamefile will know what appearance the players horse is like. We only need to change a bit here and there and the magic will apply! 3) Adding the new variable and make it work First let's add a new variable to store the horse appearance. We'll do it with SQL, so when the player sets a horse appearance, it'll be saved. This is the "horse-variable" (yeah damn, I can invent cool and catchy names!). Open tables.h and add the following line into the struct of SPlayerTable (you can add it anywhere, I just added it beyond the declaration of sRandomSP) DWORD sHorse_appearance; Now we already can close tables.h and save it. Next open ClientManagerPlayer.cpp and find: "random_sp = %d, " and add below: "horse_appearance = %u, " Then scroll a little bit down and you'll find pkTab->sRandomSP, Add below: pkTab->sHorse_appearance, Next search for: "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime," And change this line to "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,horse_appearance,playtime," Then search for: str_to_number(pkTab->sRandomSP, row[col++]); And add below: str_to_number(pkTab->sHorse_appearance, row[col++]); Then search for exactly this: "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " and replace it with: "hp, mp, random_hp, random_sp, horse_appearance, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " And a few lines down to that we can find packet->player_table.sRandomSP, There we add: packet->player_table.sHorse_appearance, You can close ClientManagerPlayer.cpp now and open char.h. There we search for struct character_point and add below int iRandomSP; the following line: unsigned int horse_appearance; Let's close char.h and open char.cpp. Find tab.sRandomSP = m_points.iRandomSP; and add below: tab.sHorse_appearance = m_points.horse_appearance; Next find m_points.iRandomSP = t->sRandomSP; and add below again: m_points.horse_appearance = t->sHorse_appearance; That's all for the source part in this stage! You'll only have to add a new column called horse_appearance to your player-table (and player_deleted of course! ). Data type is unsigned int(6) default 0. You'd now be able to compile the gamefile and run it without any flaws. Nothing has changed yet, but this will come in the next part 4) Use our new variable In this part we'll create two functions, one gets the horse appearance and one sets it. Also we'll change our horse appearance function so the source will now redirect it to our new variable - if we set it. So the trick on this is, that normally the default value is 0. So if no vnum has been set the gamefile will instead use the normal horse_table like it did before. But if we set a vnum, it'll instead use that. Let's begin with the two new functions. Open char.h and add anywhere in public section (I added it below the GetHP() function): DWORD GetHorseAppearance() { return m_points.horse_appearance; } void SetHorseAppearance(DWORD vnum) { m_points.horse_appearance = vnum; } These are our new functions. We'll use them in the GetMyHorseVnum() function, but first we need to remove it's constness. In the same file find: virtual DWORD GetMyHorseVnum() const; and remove the const. So it looks like: virtual DWORD GetMyHorseVnum(); That's all we need now, we can just close char.h and move on to char_horse.cpp. Find DWORD CHARACTER::GetMyHorseVnum() const and remove it's constness: DWORD CHARACTER::GetMyHorseVnum() and at the beginning of the function we just add: if((DWORD horse_looks = GetHorseAppearance()) > 0) return horse_looks; Save it and close it. That's all Now, if you change the horse_appearance in your database, you'll notice the new horse appearance ingame! 5) Adding the questfunctions At last we want to be able to edit the horse appearance on the fly so we can use items like seals to set it. Open questlua_horse.cpp and add the following functions: int horse_set_appearance(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if(!ch) return 0; if (!lua_isnumber(L, 1)) { sys_err("wrong horse_appearance vnum"); return 0; } ch->SetHorseAppearance((DWORD)lua_tonumber(L, 1)); return 0; } int horse_get_appearance(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if(!ch) return 0; lua_pushnumber(L, ch->GetHorseAppearance()); return 1; } At last we add the new funcions to the horse_functions table at the end of the file: { "set_appearance", horse_set_appearance }, { "get_appearance", horse_get_appearance }, That's all! Close questlua_horse.cpp and compile! Now we can use the following quest functions: horse.set_appearance(DWORD vnum) = changes the horse apperance to the vnum provided horse.get_apperance() = returns a lua number representing the current horse appearance vnum Have fun playing with it!
    1 point
  10. For the available translations, they can be found in the same download link, specifically here. Maybe in future also here. Some of you are translating some languages. I've finished the IT one. How to change language? Like this:
    1 point
  11. V39 is out! Auto-Save option added New config option AUTO_SAVE_TIME Fixed some crashes like in save server attr button
    1 point
  12. Maybe a config option for this messagebox could be interesting. Other than that, a small message can be displayed right next to "Idle" on the bottom left of your screenshot.
    1 point
  13. There's no need to select another object to move it. You can do something weird like this: [Hidden Content] Selected tree + MouseWheel + 9|0 (SHIFT and CTRL for 10x and 100x speed multiply) ; # MouseWheel+9 move selected object x position (1x) (+asyncronous) ; # MouseWheel+0 move selected object y position (1x) (+asyncronous) ; # MW+RSHIFT+9|0 as above but *10x (+asyncronous) ; # MW+RCONTROL+9|0 as above but *100x (+asyncronous) As For the AutoSave feature, It will look like this: I need to think how frequent the automatic save should be done (5 minutes?), and whether or not this message should be displayed:
    1 point
  14. M2 Download Center Download Here ( Internal ) Hi! Christmas time is coming and there is a little gift for you! Spider dungeon with official textures for better use. Of course implement boss room from offi severs. In pack: 4x4 map Objects and effects property files textures !Don't reuopload to other forums... If I'll want, I'll upload it myself... THANKS! I haven't time to make video, so there is some screens: Download: Have fun!
    1 point
  15. Does anyone know if it goes with HXD ? I don't know how to compile the source in the virtual box and I still use game 28k with mc.txt Paylaşım için teşekkürler
    1 point
  16. (2.5) Questions & Answers specific rules Don't modify your thread (or reply to it) to mark it solved, and not explain the solution to the issue. For these who wants this, there're two simple methods: 1. Disable for all maps. [Hidden Content] 2. Disable for a specific map. # Search in CANNOT_SEE_INFO_MAP_DICT for: "metin2_map_devilsCatacomb" : False, # Add after: "metin2_your_map_name" : False,
    1 point
  17. I would do it like this, in a simple way, without useless code, as i said in another forum too. [Hidden Content]
    1 point
  18. Memory leaks are very important when we speak about reusing memory, it prevents the game to keep allocating new RAM over and over. WIth this simple fixes memory leaks on Metin2 will be fixed. 1. Server Open the file game/main.cpp Search this function: int main(int argc, char **argv) { After this add the following code: return 0; Now open the file db/Main.cpp. Search this function: int main() { After this add the following code: return 0; 2. Client Open the file UserInterface/UserInterface.cpp Search this function: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { After this add the following code: return 0; I hope it will works now, enjoy just 200MB for a complete client. Good luck.
    0 points
  19. Hi Dev's! I have a little interesting problem and i dont have any idea what is it.. Problem: (database syslog) What is the solution for this? Thank you in advance for your help! Best Regards
    0 points
  20. JA JA JA... WHAT A JOKE THIS SHIT IS... I BELIEVED IT , BASTARDS!!
    0 points
  21. DOESNT WORK... NOT START SERVER...
    0 points
  22. M2 Download Center Download Here ( Internal ) Hi, i share this mount, he has all manu animations SS: DL: [Hidden Content] Scan: [Hidden Content]
    0 points
×
×
  • 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.