Popular Content

Showing most liked content since 06/25/2017 in all areas

  1. 150 likes
    Hello metin2dev, Vanilla project is a project where I'm going to modify the source code just to enhance the capabilities of the gamecore, add small new stuff, bugfixing and making it more comfortable to use. Some of the goals are more performance and lesser dependencies on dif-files. This project reached a level where it's easy to use and offers tons of new features. Many bugs and exploits are fixed. Additionally, this gamefile is the only one released for everyone that's having so much features and still allows you to customize them to your needs! There are a lot of CONFIG-options where you can enable/disable systems and even tune them to your needs. You won't need difs anymore, you can just configure the gamefile as you want! It's the only gamefile released that's compiled with newer libraries and gcc 4.9.1 with even more optimization to enhance the speed and lower the file size of the gamefile. Also this game has the package-system disabled by default and lets you run the dbcache from mysql tables by default instead of txt-files! That allows you to easily upgrade your current gamefile without the need to create new directories or convert your proto's to txt! You just have to download the package I provided, extract it and to read the install instructions! I promise you there isn't much to read! Since the source code is written by YMIR and I respect their work I won't release the source code or give any peeks into it. current version: 2.4.1 Developed version: 2.5 Download: See second post! *FEATURE LIST* + removed the license functions so the server won't connect to a license server nor check if your server is valid + removed the time limitation so it won't even check the time limit. This crash issue is completely fixed. + merged all the exp tables to the "exp_table_common" which will be used by ANY locale. You can change the needed exp for 200 levels there. + Max_level can be raised in the CONFIG file to a maximum of 255. + status points will be given at any level. It depends now on Max_level so if you set max_level to 120 you'll get status points until level 120! + fixed vampirism effects so you won't loose hp when you make an overkill (suras may embrace this change) + exp bonus now works comulutative instead of just making a chance to get double exp. If you have 20% exp bonus in your items you'll get 20% more exp at any time. + Rewrote the version check. You can now set your server version in your CONFIG-file and let it check with the client version. If serverversion != clientversion the server will print a message and kick the player out + Raised the gold limit up to 999.999.999.999 + membuf-errors fixed! Now you have a optimized buffer length so it won't consume much RAM but still have enough to not kick players out. + you can now give priv_empire (or other priv's) up to 2000% at any time. + a lot of new quest functions, when triggers and CONFIG-options + more stability and performance especially since it's compiled with a newer gcc version + Optimization flags and linker optimization enabled + ip's beginning with 5. and 25. are now allowed by the internal ip-check + Items can now be sold for 0 gold + 6/7 bonus are now working + name-change works with every locale + gold overflow: Now resets the gold to the maximum value to fight against gold overflow + horse-table has new entries for up to level 51. Raising the level extends the horse-stats. + New error handling for bonus overflow. Now the bonus will be set to the maximum generating a warning in your syserr + player movement speed will be observerd by the server now and set down to the maximum value if it's too high. + Skills can now apply new bonuses! You can e. g. raise your int-attribute + Dbcache can now start without txt-files + If you're warped into a non-existing map or non-existing coordinates your coordinates will be resetted to map1 of your village; You won't need unstuckers anymore + adminpage_ip set to localhost by default so it'll only listen to itself to prevent attackings from API tool. Additionally it's disabled by default and you can enable it with a CONFIG-option. Say good bye to the API tool! + Tons of bug fixes even YMIR had! + Completely rebuild of the source with gcc4.9, cryptopp 5.6.2 and boost 1.55; new optimizations flags and C++11 are enabled to make the core much more faster and more stable! + Advanced spam protection installed! + Unknown packet headers will no longer lead to a disconnect though they'll get dropped + Second binary compiled with 4 inventory pages! + Added the new skill flags so they can use FIRE, ICE, ELEC and DARK + Anti-Exp in the game source + reload q corrected. Note! Still not recommended. But if it's crashing, it'll now notice you. *Gameplay changes* + HP/MP overflow fixed + yang limit raised to unsigned long long int! + Fixed a huge load of format errors that'd actually crash the core! + Speedhack limit fixed so you won't get teleported back when riding + item.remove() won't remove stacks anymore! It'll just reduce the amount of the stack by 1. It there's only one left, the item will be removed. + Bypass to createa guild under level 40 fixed! + Guild wars won't crash the core anymore! + immune bug fixed (completely!!!) + Anti-Overflow mechanism prevents people from receiving too much gold + prisma glass system enabled and fixed + 6/7 bonuses work + polymorph bug fixed + invisibility bug fixed + empire exploit fixed + belt system and dragon soul system enabled + level size raised up to a normal int + You can put items for 0 gold in a shop + Exp can go higher than long int. It's now unsigned long long int (which makes higher exp requirements possible) *New CONFIG-options* MAX_LEVEL_STATUS: unsigned int Forces a maximum level. If you level up higher than this, you'll receive no status points anymore. MAX_STATUS: unsigned int Sets a maximum of distributed status points. If you e. g. set it to 20, you can only raise your stat's by 20 each status. SERVER_CHECK: 1/0 Checks if the client version and the server version are the same. If not, the server will send a message to the client and kick him out after a few seconds. SERVER_VERSION: unsigned int There you can set the version of your server for the SERVER_CHECK. MAX_HT: unsigned int It's the same option than MAX_STATUS but only for the con-attribute. MAX_IQ: unsigned int It's the same option than MAX_STATUS but only for the int-attribute. MAX_ST: unsigned int It's the same option than MAX_STATUS but only for the str-attribute. MAX_DX: unsigned int It's the same option than MAX_STATUS but only for the dex-attribute. ATTR_ALWAYS_ADD: 1/0 If enabled you'll get 100% chance to add new attributes to you equipment. ATTR_ALWAYS_5_ADD: 1/0 If enabled you'll get 100% chance to add new attributes to you equipment. Counts only for 5th Bonus (blessing marble). ATTR_CHANGE_LIMIT: int You can set a limit time to change your attributes again. It's changed to seconds (set it to 1 to let the users switch only once per second their attributes). GUILD_MAX_LEVEL: int Sets the maximum guild level. You can raise it up to 50 since the exp-table is extended to handle up to 50. ITEM_OWNERSHIP_TIME: int If you drop an item, this option sets how long the item will be flagged as yours. MIN_ADDON_FKS: int Sets the minimum ability bonus dmg you can have. MAX_ADDON_FKS: int Sets the maximum ability bonus dmg you can have. MIN_ADDON_DSS: int Sets the minimum normal hit bonus dmg you can have. MIN_ADDON_DSS: int Sets the maximum normal hit bonus dmg you can have. SKILLBOOK_DELAY: int Sets the time limit for reading a book (e. g. if you read skill books you'll have to wait x seconds until you can read the same skill book again). SKILLBOOK_NEED_EXP: int Sets the exp you need for reading a book. SKILLBOOK_ALWAYS_BOOK: 1/0 Sets if every book will be handled as you'd have used a skillbook chance amplifier. GOLD_DROP_TIME_INTERVAL: int Sets how long you have to wait until you can drop gold again. SEQUENCE_CHECK: 1/0 Enables a check if the sequence table is the same than the client's one. SKILLBOOK_STEP_LEVELING: 1/0 Enables the need of more books for raising a skill (e. g. you need 2 books from m2 to m3). RAISE_EMPIRE_PRICES: 1/0 Enables the raise of prices if you buy items in another empire. HORSE_MAX_LEVEL: int Sets the maximum level of your horse (you still need to write quests or something like that to allow players to achieve the higher horse-levels). MARRIAGE_MAX_PERCENT: int Sets the maximum allowed percent of love points. Warning! If love points > 100 it'd lead into bugs with breaking the marriage. PC_MAX_MOVEMENT_SPEED: int Sets the maximum movement speed for players. PC_MAX_ATTACK_SPEED: int Sets the maximum attack speed for players. MOB_MAX_MOVEMENT_SPEED: int Sets the maximum movement speed for mobs. MOB_MAX_ATTACK_SPEED: int Sets the maximum attack speed for mobs. TAXES: int From 0 to 100. Sets the % how much taxes you have to pay while shopping. DYE_LEVEL: int Sets how many levels you have to get after you can change your hair color again. YANG_MAX: long long Sets the maximum gold you can carry. You can change it up to 999.999.999.999 gold. package_enable: 0/1 1 = enabled. Disabled by default. Enable to use the package-feature. log_level: 0/1/2 Sets the logging level. 0 means to logs will be entered in your database. 1 means that the most important tables (hack-logs for example) will be used 2 means that all logging tables will be used new_test_server: 0/1 Protects your test-server so the gamecore will check if accounts are written into gmlist before granting them implementor-privileges. new_gm_host_check: 1/0 Checks the gmhost and gmlist for the right ip before granting privileges. Disabled by default. adminpage_enable: 1/0 Enables the adminpage-features. Disabled by default (say bye bye to API tools) adminpage_no_localhost: 1/0 Disables the security feature which inserts localhost into your adminpage_ip so it'll only listen to localhost. item_floor_time: int Set the time how long a dropped item will be lying on the ground (by monsters) max_rank_points: long int Set the maximum rank points movement_speed: int Set the initial movement speed for players. belt_all_allow_items: 0/1 Allow Players to store every item in their belt inventory attr_rare_enable: 0/1 Allow the using of rare attributes (6th and 7th attributes). Default: ON. GOLD_DROP_TIME: int Sets the time how long dropped gold will lay on the ground until it's purged. ITEM_DROP_TIME: int Sets how long dropped items will lay on the ground intil it's purged. BELT_FORCE_SLOTS: int Forces to open up the given amount of slots in your belt inventory. If this value is higher than the grade of your belt, it'll open the given amount of slots. If it's lower, the amount your belt provides will be used. For example: You set 10. You've got a belt that opens 5 slots. 10 will be opened. Now you set 4 and still have the same belt. This time 5 slots will be opened. This does also work when no belts are weared. But be careful: Since there's also a clientside part the slots may appear to be locked but you can still put items into them trade_effect: 1/0 Enables a effect that'll occur when people are traing stuff. Enabled by default. ban_force_reason: 1/0 This lets the ban-command only work when you're giving a reason. Disabled by default. start_gold: long int Let's players start with a custom amount of gold. Default: 0. view_equip_for_all: 1/0 Let's player view equip of others! Disabled by default. view_equip_sp_cost: int Sets the cost of using view_equip. This is in % so if you type in 30 then it'll cost 30% of the players maximum sp. Default: 0. glass_enable: 1/0 Enables the prisma glass-system to print your items in the chat. Disabled by default. glass_needed: 1/0 Sets if you need a glass for using the prisma glass-system or not. Enabled by default. trade_effect_exchange_threshold: int Sets the threshold to create another effect when making an exchange. Default: 500000. This means, that every 500000 gold traded away there'll be another fly effect created trade_effect_shop_threshold: int Same as trade_effect_exchange_threshold; This points to buying items in shops. Default: 100000000. VERSIONCHECK_KICK_DELAY: int Default is 10. Sets the time until the player is kicked when a version mismatch is occured. Takes only effect if the versioncheck is enabled. EMOTION_WITHOUT_MASK: 1/0 Default is 0. Lets you define if you won't need a mask to use emotions. EMOTION_SAME_GENDER: 1/0 Default is 0. Lets you define if people will be able to use emotions on the same gender. Notice: This'd possibly look awkward because the animations doesn't match CHECK_SPEEDHACK_ENABLE: 1/0 Default is 1. Lets you define if you want to use the speedhack/synchack check. Warning! Make sure you only use this for debugging purpose! You can fine-tune the variables for the speedhack in your CONFIG, so this should normally not be touched! QUEST_TRIGGER_ENABLE: 1/0 Default is 1. Lets you define if you want to use the new execute-trigger. EXP_NEED_THRESHOLD: unsigned long long int Allows you to set the exp needed if your level is higher than the maximum level of the exp table SKILL_MASTER_UPGRADE: int Sets the minimum level when your skill can jump to master. If it's set to 1 for example, then it'd happen that your skill jumps to m1 at any level. SKILL_FORCE_MASTER: 1/0 Lets you define if your skill will definitely raise to m1 if it hits the minimum level for jumping. So if you're enabling this, then your skill will definitely (unless you set SKILL_MASTER_UPGRADE) raise to m1 when hitting 17. BUGFIX_SURA_MANASHIELD: 1/0 Default is disabled. Fixes the sura manashield so it'll now scale with the proper value instead of always removing a third of the damage. Warning! When activating, you'd nerf the skill! Otherwise people with over 100 iq could prevent every incoming damage and even heal themselves or cause crashes! *New questfunctions* item.get_attr_type(int index) item.get_attr_value(int index) item.set_attr(int ApplyType, int ApplyValue[, int index]) npc.get_level() game.mysql_real_escape_string(string query) game.mysql_query(string query) game.mysql_update_query(string query) pc.delayed_disconnect(int zeit) pc.get_mount_vnum() pc.set_level(int level) pc.send_effect(int id) pc.block_exp() pc.unblock_exp() item.equip() npc.select() pet.is_mine() pc.get_id() *New conf.txt options* TXT_STARTUP = 0/1 1 = enabled. Disabled by default. Enable to boot with txt-files instead of sql *New quest trigger* OnBuy (triggers on buying a item from players or npc's) OnDie (triggers on dying) *commands* /ban playername reason /unban playername full list of all allowed bonuses for skills: MAX_HP MAX_SP HP_REGEN SP_REGEN BLOCK HP SP ATT_GRADE DEF_GRADE MAGIC_ATT_GRADE MAGIC_DEF_GRADE BOW_DISTANCE MOV_SPEED ATT_SPEED POISON_PCT RESIST_RANGE CASTING_SPEED REFLECT_MELEE ATT_BONUS DEF_BONUS RESIST_NORMAL DODGE KILL_HP_RECOVER KILL_SP_RECOVER HIT_HP_RECOVER HIT_SP_RECOVER CRITICAL MANASHIELD SKILL_DAMAGE_BONUS NORMAL_HIT_DAMAGE_BONUS HT IQ ST DX STUN_PCT SLOW_PCT PENETRATE_PCT ATTBONUS_HUMAN STEAL_HP STEAL_SP MANA_BURN_PCT DAMAGE_SP_RECOVER RESIST_SWORD RESIST_TWOHAND RESIST_DAGGER RESIST_BELL RESIST_FAN RESIST_BOW RESIST_FIRE RESIST_ELEC RESIST_MAGIC RESIST_WIND REFLECT_CURSE POISON_REDUCE EXP_DOUBLE_BONUS GOLD_DOUBLE_BONUS ITEM_DROP_BONUS POTION_BONUS IMMUNE_STUN IMMUNE_SLOW IMMUNE_FALL CURSE_PCT STA ATTBONUS_WARRIOR ATTBONUS_ASSASSIN ATTBONUS_SURA ATTBONUS_SHAMAN ATTBONUS_MONSTER MAX_HP_PCT MAX_SP_PCT SKILL_DEFEND_BONUS NORMAL_HIT_DEFEND_BONUS RESIST_WARRIOR RESIST_ASSASSIN RESIST_SURA RESIST_SHAMAN ENERGY RESIST_CRITICAL RESIST_PENETRATE Thanks to: xP3NG3Rx for some quest functions Sphinx² & lollo_9_1 for the mysql-functions Lefloyd for the 2 new quest triggers .InyaProduction for some new quest functions Tim for the suggestion to include libs from a special path MartPwnS for helping with the src code on gcc48/gcc49 And especially thanks to you!
  2. 56 likes
    Hi, In this thread I'm going to show you how to make a game-client or client-game communication with packets, instead of using the old quest-client, client-quest communication. Lets start with the game-client, in this example I will send 1 variable to the client. First start with the HEADER, open your binary source and navigate to UserInterface/Packet.h. Now you will see many headers, create a new one, but search for an empty number. I will use 57, because its not used. GC means it's used for Game -> Client packet, it's just a prefix. HEADER_GC_METIN2DEV Now add the structure for the packet, this is most important part. Structure is the "body" of the packet, it contains the HEADER as BYTE and the other optional variables. As I said I just want to send one int type to the client, so add it. typedef struct command_metin2dev_packet { BYTE bHeader; int M2int; } TPacketGCMetin2Dev; Now navigate to UserInterface/PythonNetworkStream.cpp and add your header to the CMainPacketHeaderMap class. The first parameter of the Set is the HEADER, second is the size of the structure. We will use just static size packets in this tutorial, but the third argument can be dynamic size too. Set(HEADER_GC_METIN2DEV, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCMetin2Dev), STATIC_SIZE_PACKET)); Now navigate to UserInterface/PythonNtworkStreamPhaseGame.cpp and add the function to the switch. case HEADER_GC_METIN2DEV: ret = RecvM2DevPacket(); break; The name of the function will be RecvM2DevPacket: Now declarate the function, navigate to UserInterface/PythonNetworkStream.h and add it as public: bool RecvM2DevPacket(); Now add the receiver part of the code. Recv "picks" out xy bytes from the buffer and the return type of it is false if there was no data in the buffer by that size otherwise true, which means it was successful. xy = size of the structure bool CPythonNetworkStream::RecvM2DevPacket() { TPacketGCMetin2Dev Metin2DevGC; if (!Recv(sizeof(TPacketGCMetin2Dev), &Metin2DevGC)) { Tracen("Recv Metin2DevGC Packet Error"); return false; } } Now we are calling the BINARY_M2DEV_Test function in game.py and passing the received data. PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_M2DEV_Test", Py_BuildValue("(i)", Metin2DevGC.M2int)); This was the client-side of the game-client communication, lets start the server-side: First of all we need to add the header again, navigate to game/packet.h and add this: And the structure: typedef struct packet_metin2dev_packet { BYTE byHeader; int M2int; } TPacketGCMetin2Dev; Now navigate to game/char.cpp and create a function which sends the packet. void CHARACTER::SendMetin2DevPacket() { } Declare it in the game/char.h: void SendMetin2DevPacket(); Now lets add the content of the function. Create a new instance of the structure, set the values of it and send it to the client. void CHARACTER::SendMetin2DevPacket() { if (!GetDesc()) { return; } TPacketGCMetin2Dev Metin2DevGC; Metin2DevGC.byHeader = HEADER_GC_METIN2DEV; Metin2DevGC.M2int = GetPlayerID(); GetDesc()->Packet(&Metin2DevGC, sizeof(TPacketGCMetin2Dev)); } Now add the last function to game.py, this will be called by the binary: def BINARY_M2DEV_Test(self, M2int): import dbg dbg.LogBox(str(M2int)) Finally, lets check how it works: If you have any question or suggestion, please just reply to this topic. Kind Regards, Sanchez
  3. 30 likes
    Hello! I've created some Wallpapers for you! Original Logo by SquareEnix - Final Fantasy X These Wallpaper are full Vector Wallpapers, that means, you can scale it how you want, without quality loss! The standard Download mirror in this thread, just contains the non-vector Wallpaper in the resolution of 1920x1080. If you want a higher resolution, just write me a private message, with the reason, why you need one! I just want to mention, that the idea for these Wallpaper comes from "Plentakill", they are creating the same kind of Wallpaper, just for League of Legends! If you wanna see it, check their Channel on Youtube or use google! Wallpaper Preview (Version 1): http://i.epvpimg.com/wjYHh.jpg http://i.epvpimg.com/8aEic.png http://i.epvpimg.com/Bdi2b.jpg http://i.epvpimg.com/6dzkb.jpg Maybe there will come a version 2, with the male characters of Metin2! I just want to mention that one Wallpaper requires 8 hours of work and over 700 Shapes, and I am a lazy guy... so it will take its time for version 2. As a last resort, I ask you for your thought about the Wallpaper, please write feedback or critique, so i know what i have to change in version 2... And guys, please dont remove my copyright on the right-bottom corner! Download version 1 Best regards, Sora
  4. 28 likes
    Greetings! The new beta is finished! I'm proud to present r70140-BETA. This time a few things have changed. And in this revision, we have a lot of new stuff. That's the reason I want to make a BETA so everything's tested. In the following I'll provide the download link along with the things I'd love you to test. *** DISCLAIMER *** The core is marked as stable. Anyway, I'll make it clear that I'm not responsible if you use this core since I can't give a warranty that I fixed every single security breach that potentially could happen - that's totally impossible. But we all together made the source great and secure so every public issue is fixed by now. You can use it in production environments now. So... What's new? boot-trigger for quests With this you can execute commands, timers, and all the stuff you'd like to have just on boot-time! revisioning of the 'unique class' (+ a ton of posibilities) added the functionality to create unique-groups temp-Variables for quests upgraded all libs moved completely to the newest clang version fixed some big security issues in the source code fixed the ingame ban and unban commands unified tables and gave them a new way: unify! file clean-up revisioned the makefiles gave the source a new, easier structure removed all external dependencies just install them by ports.. No external-folder necessary! removed 'boost' dependency (no boost lib needed yay) partial implementation of the wolfman (claws etc. are added, needs review) And basically everything that has been offered in the earlier versions of the vanilla core. Nothing should be missing. And if you miss something, just feel free to tell me! What needs testing? There are few things I'd love you to test out: Please check if the core is vulnerable to any security breaches you may know (also the public ones, don't know if I missed something) Please test out the new features! I'd really love to know if the new unique-functions and the boot-trigger does the job. Explanation to new features: Unique with container support Unique has evolved! This time you have a few new possibilities. Don't know what unique is? Here's a short explanation: With the unique-questfunctions you can spawn or set mobs, npcs and now even players to have a unique name. This name is stored into a unique-container. You can access this container and get all the vid's by their unique name (also called: the key) So for example you can spawn a boss with a key. Later on you can check if this specific mob has been killed or not. Or you can set his hp on-the-fly. There's basically no limits! And now with the revised system you'll have even more options. The new unique system works with containers. By default there are two containers reserved: __DEFAULT__ and __CHARACTER__. The first one is for all the basic stuff. And the second one is reserved for players. Now, as you may have noticed, there's a default one which means that the container-stuff is optional. If you just use the unique functions without specifying a container, it'll just use the default stuff. But you CAN use your own containers just as you want to. You can create, delete and list all the containers running. There is a list with all the quest-functions down below. boot-trigger This is pretty self-explanatory. With this release you can use "when boot begin" to specify a block of code that will be executed once the core has been booted. temp-variables With the new temp-variables you can set and remove player-specific variables. They are stored in the core and not written to disk or database. So be careful because they might get dropped once the core shutdowns. It's just a quick storage for people who want to have something like a cache for quick access. new quest functions nil unique.spawn_unique(string key, int vnum, string pos=unused, string container=optional) nil unique.set_unique(string key, int vid, string container=optional) nil unique.purge_unique(string key, string container=optional) nil unique.kill_unique(string key, string container=optional) bool unique.is_unique_dead(string key, string container=optional) int unique.get_hp_perc(string key, string container=optional) nil unique.set_def_grade(string key, int def, string container=optional) nil unique.set_hp(string key, int hp, string container=optional) nil unique.set_max_hp(string key, int maxhp, string container=optional) int unique.get_vid(string key, string container=optional) bool unique.exists(string key, string container=optional) table unique.get_container_list() this prints out all the unique containers table unique.get_container_list(string key) this prints out all the vids in the unique-container "key" nil unique.remove_container(string key) removes a whole container (flushes it when called on standard containers) nil pc.temp_var_set(string key, string value) string pc.temp_var_get(string key) nil pc.temp_var_delete(string key) Thanks a lot for participating! If there are any questions, this is the topic related to it. Further releases will be made public here too! If you'd like to contribute, just post code additions here. Changelog Download Useful information: All necessary libs are included. If you're building your own vanilla binary you'll first have to move into every project of the Internal directory and rebuild the libs. The main makefile is not adapted yet, I was too lazy rev 70220 STABLE Core Sourcecode rev 70140 BETA Core Sourcecode Password for the binary archive is: vanilla Password for the source archive is: vanillamt2 Best Regards Vanilla
  5. 28 likes
    Hi guys, Running a server for a year and a half while a bunch of guys gets paid to destroy it by any means ends up giving you a good insight in what the word security really means. So, after being the target of almost every type of attack possible over the Internet, I think I am ready today to write a quick checklist on how your Metin2 server should be secured from criminal and disruptive behavior. I will divide it into several parts: ingame, website, server, staff. I will try to explain in brief how those attacks are executed, but the focus here is in how to defend from them effectively. I do not want this checklist to serve the purposes of hackers. But be aware; you are never 100% safe - it depends on how much your enemy is willing to work on it. So this should be taken as a bare minimum. And don't forget: the science of destruction evolves constantly. What is considered safe today, might not be so safe tomorrow. Disclaimer: This text reflects 5 years of experience managing a server's technical aspects. I do not do certain things (like quests) for a long time so excuse me for any mistakes I may be making here. Part 1 - Ingame bugs and exploits This part refers to threats that may realize through the game client or external software that acts through the game client. While often overlooked, sometimes these can be more dangerous to your server than any other type of attack. Keep an eye in your server's economy - the average price of items. If prices for a particular item or all of them change suddenly, there may be some obscure reason behind it. That is one of the reasons why we keep public and private statistics on the average market price of every item at WoM. One of the most common mistakes - and I commited this myself - when one wants to extensively edit everything is having an item give you more Yang when you NPC it than it costs to buy it from a shop. This gives unlimited Yang to whoever discovers it. There are even public bots which automate the process of buying and selling these items. The effect on the economy is devastating over a sufficient long period, not to mention that it's unfair that some people are infinitely rich and unbalance is never good for any MMORPG. Have your GM double check that no item can be sold for more than it costs. However, this is not the only way that a player can obtain access to unlimited resources. Badly written quests may allow players to obtain their rewards repeatedly by closing their clients while a quest dialog is open. One simple way to avoid this is to make sure that the commands which reward the player are the last in the code block before changing state. Now going into disruptive behaviour - the most annoying probably are the bugs which cause a server core to crash. The most famous is probably the number_ex bug. This causes several commands which depend on this function such as dice to be exploitable by using certain parameters. This bug is fixed in rev 40k and therefore in any game compiled from the source. If you are using 34k, the best you can do is use iMer's lib which provides several security enhancements. If you are using 2089, there are public diffs that patch this. Another bug exists in the war command in 34k and older which leads to a server crash. You cannot disable this command as it is used by the guild leaders to war other guilds. iMer's Lib takes care of this bug in 34k. Older and less known is the gold drop core crash bug present in 2089 and fixed -I believe- in 34k. Dropping huge amounts of gold or any other item which you can acquire in huge numbers in a map will cause the server to crash. I am not aware of public fixes for this exploit. Another favourite is the kickhack or sync position hack -partially fixed only in 40k- which allows a malicious user to disconnect other players at will. There are even videos of this being done in DE years ago. iMer's lib provides a fix for rev 34k. Finally, we have the long list of cheats which purely seek to gain advantage while playing. There are several client protection tutorials and services around this forum so I won't extend myself here about the subject. Part 2 - Server and OS Here we talk about the threats that affect your server and Operating System Part 2.1 Choosing and preparing your server There is no doubt at the moment of writing this that the french hosting company OVH provides the most cost-effective anti-ddos solution in the market. While many companies provide DDoS protection services, these cost several times as much as OVH offerings and this increase does not necessarily translate into a better protection. Therefore we will assume that you are renting either a dedicated server at OVH or a VPS at Eterhost as those are the ones I'm familiar with. Other providers or resellers may be configured in a different manner. Dedicated Server at OVH There are two flavors of the Anti-DDoS solution: Basic and Pro. Basic is free when renting a Kimsufi or Soyoustart server (cheap and intermediate OVH brands respectively). What it does is detect attacks directed at your IP address and route your traffic through the mitigation system during the attack. This is not enough to deter a dedicated hacker though - before the attack is detected, your server may be collapsed for a few minutes, and this can be repeated every hour by the attacker, as happened with one of the TEC attacks on WoM about 1 month ago. The PRO version comes with all the OVH proper (also known as professional) line of servers. It adds the ability to route traffic permanently through the mitigation system and provides you with a simple hardware firewall. This is what you should get if serious attacks are a concern, specifically an Enterprise line server (cheapest is at about 100€/month, VAT included) How to activate permanent mitigation on OVH Professional servers: - Open the new manager. If you don't know where this is, open the classic manager and click on "Home" and then below on the "Dedicated" icon. - Click on IP on the column at the left - Click the little wheel that appears at the right of your server's IP address - Select "Mitigation: permanent" How to set up the hardware firewall: - Click the wheel again and select "Activate firewall". Wait around a minute and then reload the page. - Click the wheel and select "Configure firewall" - You will be presented with the rules screen. You can add up to 20 rules to deny or allow specific ports on the firewall. Start by adding the allowed ports in the lower numbers and end with a global deny rule. Leaving a field blank in the "Add Rule" dialog will result in a wildcard; so if you leave the IP address field blank, this rule will affect all IPs. Adding an allow port port rule: click on Add Rule; choose rule priority; select protocol (TCP or UDP); select Accept; enter the port number. Adding a global deny: choose rule priority (must be higher than the allow port rules); select protocol (TCP or UDP); select Deny. Here is an example set of rules. We have added the SSH port and the game & auth ports, as well as 3306 so our website can connect to MySQL. You can specify the webserver's IP in the rule to prevent others from connecting to your database, although I personally prefer to do this at the software level with the pf firewall; in any case, port 3306 must not be public. "How do I connect with Navicat then?" Simple, use the SSH Tunnel option. This logs you in to SSH and then connects to the MySQL server as localhost. You must enter your server's SSH login details in the SSH, and your MySQL login details in the General tab, but remember we are connecting to localhost or that's what you must enter in hostname, NOT your server's public address, as MySQL doesn't see us as a remote user anymore. Regarding UDP: UDP is your enemy. Disable it completely as I did in the above ruleset. The official client previously used UDP to check on server status, but it's trivial to override it in python so it always shows "NORM" regardless of the result of servercheck. If you are using 40k or source, the check already uses TCP, but your ports must be lower than 32768 (or the source modified) for it to work. VPS at Eterhost Our VPS are always routed through the mitigation system. Hardware firewall can be activated and configured to your needs for 5€/month extra. Part 2.2 - Hardening SSH First things first: have your OS always updated to the current version. It is often recommended by experts to access your server through a non-administrative account (some operating systems such as CentOS even force you to create one at install), so that's what we will be doing. We will create a restricted user for our game server: adduser game We can leave everything as default except for the login group: enter "wheel" here. Users which are part of the wheel group can use the su command to gain administrator privileges. This allows us to completely block root from remote login. Now it's time to create a SSH key for our new user. This makes bruteforce virtually impossible. Finally, let's prevent login from root, and login without key: ee /etc/ssh/sshd_config Look for the "PermitRootLogin" line and leave it this way, uncommenting if necessary: PermitRootLogin no And next look for the "PasswordAuthentication" setting and edit it so it looks like this: PasswordAuthentication no Now let's restart ssh for changes to take effect: service sshd restart Warning: at this point, you should open a new putty window to test that you can login with the new user and key, and that you can use the su command to gain root privileges. Wrong settings may lock you out of your server. Once everything is working, upload your server files to /home/game. This is the home directory of the user - a bit like "My Documents" in Windows. Make sure you change permissions in the files so the "game" user can read and write them: chown -R game /home/game (this command must be run as root! only root can change someone else's permissions. To switch between the game and root account, you use the su (short for superuser) command: root# su game Password: (game user's password) game# su Password: (root user's password) root# Or: root# su game Password: (game user's password) game# exit root# Finally, it may be a good idea to install ssh-guard for extra security or change your SSH port if you don't like your logs being spammed by portscans. To change your SSH port, edit the Port line in /etc/ssh/sshd_config and restart the sshd service as indicated above. Remember to open the new port if you are using a firewall or you will lock yourself out of the server. Part 2.3 Software Firewall: pf At this point it's a good idea to add a second line of defense with the pf firewall. First we will create the /etc/pf.conf file following this sample config. ee /etc/pf.conf Make sure you enter the correct interface and all the ports which must be open: SSH and game ports in our case. Neither p2p ports or db core port should be open to the public! Under trusted_hosts, enter the IP address of your web server so it can connect to the database (We assume a typical set up of web server + game / db server here) instead of opening port 3306 to everyone. This firewall provides us with scrubbing and rate limiting capabilities which the hardware firewall doesn't. Next we will enable pf: kldload pf pfctl -e Check that everything is working fine and then add the following line to /etc/rc.conf to load pf on boot: pf_enable="YES"
  6. 26 likes
    Hi there Dev's, today I'm gonna show you and give you as well, if you want ofc, the old skill effects from Metin2 (M1 to G1). These effects are from the time when Metin2 was opened in .kr and .cn in 2005 and till the new patch. Since my last topic asking for these effects, I've finally managed to do it. So I'm gonna share with you. If you're trying to open an oldschool server, or not, these effects could be useful. Here's some prints. Body Warrior Berserk Dash Sword Spin Three-Way Cut Mental Warrior Spirit Strike (W) Sword Strike Weaponry Sura Dragon Swirl Black Magic Sura Spirit Strike (S) Dark Orb Blade-Fight Force Ninja Rolling Dagger Dragon Force Shaman Dragon's Strength Dragon's Roar Flying Talisman Healing Force Shaman Attack Up (effect on hand) This may be a shitty "release" for you but for me it ain't. I always wanted this and I've finally done it. Download Hope you like it.
  7. 24 likes
    Hello everyone. It's a good day to share an old code with you. First of all you need to know: I don't help to install it. Don't even take the contact with me about it. The whole code is written by me, and reversed from official binaries. At the beginning do a backup for your files(srcs+pys) and READ CAREFULLY the readme. W/o brain.exe please close this tab, or your browser, thank you for your understanding. Preview: Download.exe Enjoy & #h4v3fun, pngr
  8. 24 likes
    Hi everyone, Microsoft 3 years ago in 2011 released the first version of the Python Tools for Visual Studio and they are still working on it,. Now everybody thinking how is it better to use Visual Studio instead of Notepad++? My opinions are: Better Syntax highlighting IntelliSense Many useful options like these: Go To Definition, Find All References Visual Studio GUI is amazing, It's dream to work with it Example of the Syntax highlighting: Example of the Find All References: Example of the IntelliSense: How to download & install: Go to the Python Tools for Visual Studio Codeplex page and follow the tutorial or just follow these steps: 1. Download Visual Studio, Express version does not supported! 2. Install PTVS for for your Visual Studio version: 2010, 2012, 2013 3. Install Python 2.7 That's all, now you are ready to import the py files: Extract root, locale and uiscript or anything you wan't and separate them to folders. Example: Open Visual Studio and create a new project using the "From Existing Python code" option. On the next window add the path of the 3 folders. Now click on Next and select Python 2.7 from the dropdown list. That's all, now Visual Studio creating your new project with the added files. If you have any question or suggestion, please just reply to this topic. Kind Regards, Sanchez
  9. 21 likes
    Hi there devs, Probably the most of us know the problem when an image contains alpha/fully transparent parts but you can't click trough them and it would be very necessary to do so. This problem is very common with the taskbars, for example with the ilumina taskbar (you know when it looks like you are clicking the ground, but the image is still there but that part is transparent). Video: How to: EterPythonLib\PythonWindow.h EterPythonLib\PythonWindowManagerModule.cpp EterPythonLib\PythonWindow.cpp EterLib\GrpImageTexture.cpp EterLib\GrpImageInstance.h EterLib\GrpImageInstance.cpp By default it won't check the alpha value, so it means that you have to add manually the "alpha_sensitive" flag to the preferred windows/objects (also note that its only effective with an expandedImageBox object and it has some interference with the "float" flag (if both added to the same object)). For the usage check the video. If you have any question, remark, or anything that you like to ask or suggest, feel free to post it here, or send it in PM. Have a nice day, ~masodikbela
  10. 20 likes
    Hello, like the old topic ( >here< ) this topic is reserved for SHARES ONLY. If you're searching some specific files use our file request topic >here<. Additionally to this you can search for your files in the latest fully unpacked client: 17.0.7 whole unpacked client: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=84202 17.0.12 whole unpacked client: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=86090 17.1 updates only: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=86516 If you spam in here (which includes asking for files) you will get an infraction! Statistic (for the first 12 hours....): Hidden posts: 4 Warned posts: 3 Sincerly, .PolluX
  11. 19 likes
    Anti Wait Hack: Anti Safezone: Anti Ghostmode: Anti Wallhack: Anti Long name generator: #Update 1: -Clientside- -Serverside- Anti Mining Bot: Fishing without water fix Anti Colorful Shop Anti Drophack #Update 2: -Serverside- Anti Fish Bot Anti Guild Maker(low level) Activate Anti Teleport Hack -Clientside- Activate py inject protection Anti Anti Stun & Anti Visual GM Effect Anti Attackspeed & Anti Movespeed This thread subjects enough for general cheats For better bot and script cheat security change module or function names For this here basic tutorial for change net module name
  12. 17 likes
    Hello guys, here you can see my new work, I can not say when it will be finished cause i work realy much with Details and effects (with textures and Environment) so i hope you like this work. you can find solitary v1 here: here are some Screens from solitary v2: map size: 3 x 3 map atlas you can vote here for release the map if i finish it, subscribe for news my channel on YouTube: https://www.youtube.com/user/DesGameTV Ace,
  13. 16 likes
    I want share you critical effect UserInterface/InstanceBaseEffect.cpp open and search; else if (flag & DAMAGE_CRITICAL) { //rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot); //return; 숫자도 표시. } thus replaced; else if (flag & DAMAGE_CRITICAL) { rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot); //return; 숫자도 표시. } root/playersettingmodule.py open and search; #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DAMAGE_CRITICAL, "", "d:/ymir work/effect/affect/damagevalue/critical.mse") thus replaced; chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DAMAGE_CRITICAL, "", "d:/ymir work/effect/affect/damagevalue/critical.mse") effect; http://www.dosyaupload.com/9ii critical.7z
  14. 15 likes
    It's really long time i released some mobs, so today i will share with you my naga pack. It including 4 mobs with effects + 1 boss. I didn't make sound files, i have no time for it, maybe i make it during christmas. I will have a little free time then. You can use it how u want. You need granny 2.8+! I don't support old granny anymore. Download here
  15. 15 likes
    Hi there. While cleaning out "my closet", I found this thing I developed between 2014-2015 - maybe(?) - for my, at that moment, server. Since it's now closed, and I won't use it, I'm sharing it with you guys. Note: Didn't do the scrollbar, wasn't needed for me, so yeah. Now, let's start with opening your locale_game.txt and adding these lines: QUESTCATEGORY_0 Main Quests QUESTCATEGORY_1 Sub Quests QUESTCATEGORY_2 Collect Quests QUESTCATEGORY_3 Levelup Quests QUESTCATEGORY_4 Scroll Quests QUESTCATEGORY_5 System Quests Alright, now find your characterwindow.py (uiscript?) and you can either comment Quest_Page children or simply remove them all. Moving on to your interfaceModule.py find this line self.BINARY_RecvQuest(index, name, "file", localeInfo.GetLetterImageName()) and replace it with self.wndCharacter.questCategory.RecvQuest(self.BINARY_RecvQuest, index, name) Ok, then we are at the most, let's say, difficult part of this. Open your uiCharacter.py and just as you did in your characterwindow.py, remove or simply comment any single line related to quests. You can just search for these vars: self.questShowingStartIndex self.questScrollBar self.questSlot self.questNameList self.questLastTimeList self.questLastCountList Once you did that, you just: # Find these lines self.soloEmotionSlot = self.GetChild("SoloEmotionSlot") self.dualEmotionSlot = self.GetChild("DualEmotionSlot") self.__SetEmotionSlot() # And add the following import uiQuestCategory self.questCategory = uiQuestCategory.QuestCategoryWindow(self.pageDict["QUEST"]) # Find this def OnUpdate(self): self.__UpdateQuestClock() # Replace it with def OnUpdate(self): self.questCategory.OnUpdate() And we're done with the client-side. I attached some extra elements needed (such as the main python file (uiQuestCategory.py) and some image resources). Remember to edit the path linked to these images in that file. For the server-side... Well, screw it, uploaded it too. Too lazy to write. It has only a new quest function (q.getcurrentquestname()) and a few things to add in your questlib.lua. Btw, not sure if you have it, but if not, just add this extra function in ui.Button() (ui.py - class Button). def SetTextAlignLeft(self, text, height = 4): if not self.ButtonText: textLine = TextLine() textLine.SetParent(self) textLine.SetPosition(27, self.GetHeight()/2) textLine.SetVerticalAlignCenter() textLine.SetHorizontalAlignLeft() textLine.Show() self.ButtonText = textLine #Äù½ºÆ® ¸®½ºÆ® UI¿¡ ¸ÂÃç À§Ä¡ ÀâÀ½ self.ButtonText.SetText(text) self.ButtonText.SetPosition(27, self.GetHeight()/2) self.ButtonText.SetVerticalAlignCenter() self.ButtonText.SetHorizontalAlignLeft() Forgot the source part, fml, here it is. Add it to your questlua_quest.cpp. int quest_get_current_quest_name(lua_State* L) { CQuestManager& q = CQuestManager::instance(); PC* pPC = q.GetCurrentPC(); lua_pushstring(L, pPC->GetCurrentQuestName().c_str()); return 1; } void RegisterQuestFunctionTable() { luaL_reg quest_functions[] = { { "getcurrentquestname", quest_get_current_quest_name}, { NULL, NULL } }; CQuestManager::instance().AddLuaFunctionTable("q", quest_functions); } Now, finally, have fun and bye! questcategory.7z server-side.7z
  16. 15 likes
    Hello, I have created a little security addition for a while ago. It's creating random/dynamic module names in every client session(maybe better than chrmgrm2g, playerm2g2 or etc. lol). Here is 6 API as default("net", "chr", "chrmgr", "app", "pack", "player") and HowTo tutorial exist in rar archive. https://puu.sh/rxqI9/321ea530e0.7z Enjoy it.
  17. 14 likes
    Hi there devs, A few months ago I've made a solution for the well-known problems with the character select/logging out which is: once you are about to change character, the stats (ht, st, playtime, etc...) and parts (armor/head) don't update properly: you have to do it twice to see the correct values/items when a character is logging out from the game near to your character you can see a fast equipment change (the character is unequipping everything from him/herself) Explanation for the problems The usual coding video The fix GL for the setup and if you have further question(s), remark(s), or anything that you want to ask or suggest, feel free to post it here, or send it in PM. If you get error(s) please upload the affected (and edited) file(s) to http://pastebin.com/ and link it in your post, to make my work easier and probably I will be able to help you only in one post, so please spare me from asking basic requests like "Could you upload...". Thank you Have a nice day, ~masodikbela
  18. 14 likes
    Hello guys. I'm here with the v17.2 and the v17.3 patches. 17.3 New gaya gui files + npcs New fish event gui files New changelook gui file (I've got this 3 weeks ago :P) New party match gui files New ranking gui files Unpacked protos: DE, CZ and HU (XML + TXT) Dumped root files + builtins <!> INFORMATIONS ONLY <!> https://mega.nz/#!aNgABRjS!SUCh-DVHxvc5LWbTMow9VOcGKPAvZmtQjeiEDz6ynmg
  19. 14 likes
    Based on the github sourcecode this should be correct. bool CExchange::CheckSpace() { static CGrid s_grid1(5, INVENTORY_MAX_NUM / 5 / 4); // inven page 1 9 Rows a 5 Columns static CGrid s_grid2(5, INVENTORY_MAX_NUM / 5 / 4); // inven page 2 9 Rows a 5 Columns static CGrid s_grid3(5, INVENTORY_MAX_NUM / 5 / 4); // inven page 3 9 Rows a 5 Columns static CGrid s_grid4(5, INVENTORY_MAX_NUM / 5 / 4); // inven page 4 9 Rows a 5 Columns s_grid1.Clear(); s_grid2.Clear(); s_grid3.Clear(); s_grid4.Clear(); LPCHARACTER victim = GetCompany()->GetOwner(); LPITEM item; int i; const int perPageSlotCount = INVENTORY_MAX_NUM / 4; for (i = 0; i < INVENTORY_MAX_NUM; ++i) { if (!(item = victim->GetInventoryItem(i))) continue; BYTE itemSize = item->GetSize(); if (i < perPageSlotCount) // Notice: This is adjusted for 4 Pages only! s_grid1.Put(i, 1, itemSize); else if (i < perPageSlotCount * 2) s_grid2.Put(i - perPageSlotCount, 1, itemSize); else if (i < perPageSlotCount * 3) s_grid3.Put(i - perPageSlotCount * 2, 1, itemSize); else s_grid4.Put(i - perPageSlotCount * 3, 1, itemSize); } static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM); bool bDSInitialized = false; for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i) { if (!(item = m_apItems[i])) continue; BYTE itemSize = item->GetSize(); if (item->IsDragonSoul()) { if (!victim->DragonSoul_IsQualified()) return false; if (!bDSInitialized) { bDSInitialized = true; victim->CopyDragonSoulItemGrid(s_vDSGrid); } bool bExistEmptySpace = false; WORD wBasePos = DSManager::instance().GetBasePosition(item); if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false; for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++) { WORD wPos = wBasePos + i; if (0 == s_vDSGrid[wBasePos]) { bool bEmpty = true; for (int j = 1; j < item->GetSize(); j++) { if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM]) { bEmpty = false; break; } } if (bEmpty) { for (int j = 0; j < item->GetSize(); j++) { s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] = wPos + 1; } bExistEmptySpace = true; break; } } if (bExistEmptySpace) break; } if (!bExistEmptySpace) return false; } else { int iPos = s_grid1.FindBlank(1, itemSize); if (iPos >= 0) { s_grid1.Put(iPos, 1, itemSize); continue; } iPos = s_grid2.FindBlank(1, itemSize); if (iPos >= 0) { s_grid2.Put(iPos, 1, itemSize); continue; } iPos = s_grid3.FindBlank(1, itemSize); if (iPos >= 0) { s_grid3.Put(iPos, 1, itemSize); continue; } iPos = s_grid4.FindBlank(1, itemSize); if (iPos >= 0) { s_grid4.Put(iPos, 1, itemSize); continue; } return false; // No space left in inventory } } return true; } PS: If there are any errors please report them asap because i have no way to test this. Kind regards MartPwnS
  20. 13 likes
    Hi, I'd like to share a small fix about the messenger system. what exactly are we fixing? The main problem is when you remove any person from your list, the companion's messenger list is not refreshing until relog in. Webzen has fixed this situation with a small packet. That packet will provide to remove the name from the list. There is no part of Python because it's already done by Ymir. For serverside For client side Best Regards Ken
  21. 13 likes
    Hey. because i am at home (birthday wtf) and saw this thread: https://metin2dev.org/board/index.php?/topic/9352-preview-target-damage-system/&_fromLogin=1 i wanted to give you something, so i simply wrote the code for it: Target Sys: Server: char_battle.cpp: search for: void CHARACTER::SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageFlag) after: damageInfo.header = HEADER_GC_DAMAGE_INFO; damageInfo.dwVID = (DWORD)GetVID(); damageInfo.flag = DamageFlag; damageInfo.damage = Damage; add: PacketAround(&damageInfo, sizeof(TPacketGCDamageInfo)); return; client: PythonNetworkStreamPhaseGame.cpp: search for: bool CPythonNetworkStream::RecvDamageInfoPacket() replace: bool bTarget = (pInstTarget==m_pInstTarget); with: bool bTarget = true;
  22. 12 likes
    If anybody need it here u have it. Mega.co.nz : https://mega.nz/#!D15RCJiY!Xx10QJF6BLhHKZygwh8Jgh-DS2mnhWeSD1Ovokc8yUA Passwort : Metin35
  23. 11 likes
    Hi, everyone. Most people know when you are trying to connect the server with a lot of people, the server can not respond to you or something might go wrong. This example is same for warp too. Webzen did something about this too and I'd like to share it with you. What are exactly are we doing? If the client can not connect to the server, the client will wait one second to connect the server again. Open NetStream.cpp. Find Connect function and replace with this bool CNetworkStream::Connect(const CNetworkAddress& c_rkNetAddr, int limitSec) { Clear(); m_addr = c_rkNetAddr; m_sock = socket(AF_INET, SOCK_STREAM, 0); if (m_sock == INVALID_SOCKET) { Clear(); OnConnectFailure(); return false; } DWORD arg = 1; ioctlsocket(m_sock, FIONBIO, &arg); // Non-blocking mode if (connect(m_sock, reinterpret_cast<PSOCKADDR>(&m_addr), m_addr.GetSize()) == SOCKET_ERROR) { int error = WSAGetLastError(); // If something went wrong, the client will wait one second to connect the server again. // Of course, it will clear and setting up everything again. if (error != WSAEWOULDBLOCK) { Sleep(1000); Clear(); m_sock = socket(AF_INET, SOCK_STREAM, 0); if (m_sock == INVALID_SOCKET) { Clear(); OnConnectFailure(); return false; } ioctlsocket(m_sock, FIONBIO, &arg); if (connect(m_sock, reinterpret_cast<PSOCKADDR>(&m_addr), m_addr.GetSize()) == SOCKET_ERROR) { Tracen("error != WSAEWOULDBLOCK"); Clear(); OnConnectFailure(); return false; } } } m_connectLimitTime = time(NULL) + limitSec; return true; } Best Regards Ken
  24. 8 likes
    WorldEditor Pr-Pack Datei anzeigen Here a list of the files: 1.603 new Objects 337 HD textures 271 vegetations size of the file: 2.10 GB Demo Videos: if you use the files, or release it on another board so please take my YouTube Chanel as credits. Hochgeladen von Ace Hochgeladen 10.07.2017 Kategorie 3d Models  
  25. 7 likes
  26. 7 likes
    Hi, Metin2Dev Each version is compatible. information; root/uiSystemOption.py Open.. Search; Kod:self.tilingModeButtonList = [] Add; Kod:self.ctrlShadowQuality = 0 Search; Kod:self.tilingApplyButton=GetObject("tiling_apply") Add; Kod:self.ctrlShadowQuality = GetObject("shadow_bar") Search; Kod:self.ctrlSoundVolume.SetEvent(ui.__mem_func__(self.OnChangeSoundVolume)) Add; Kod: self.ctrlShadowQuality.SetSliderPos(float(systemSetting.GetShadowLevel()) / 5.0) self.ctrlShadowQuality.SetEvent(ui.__mem_func__(self.OnChangeShadowQuality)) Search; Kod: def OnChangeSoundVolume(self): pos = self.ctrlSoundVolume.GetSliderPos() snd.SetSoundVolumef(pos) systemSetting.SetSoundVolumef(pos) Add; Kod: def OnChangeShadowQuality(self): pos = self.ctrlShadowQuality.GetSliderPos() systemSetting.SetShadowLevel(int(pos / 0.2)) uiscript/SystemOptionDialog.py Open.. Search; Kod: { "name" : "tiling_apply", "type" : "button", "x" : 90+100, "y" : 185, "text" : uiScriptLocale.OPTION_TILING_APPLY, "default_image" : ROOT_PATH + "middle_Button_01.sub", "over_image" : ROOT_PATH + "middle_Button_02.sub", "down_image" : ROOT_PATH + "middle_Button_03.sub", }, Add; Kod: { "name" : "shadow_mode", "type" : "text", "x" : 30, "y" : 210, "text" : uiScriptLocale.OPTION_SHADOW, }, { "name" : "shadow_bar", "type" : "sliderbar", "x" : 110, "y" : 210, },
  27. 7 likes
    File Name: Map OX by Surinox File Submitter: Surinox File Submitted: 03 Sep 2014 File Category: Maps Click here to download this file
  28. 6 likes
    Hi, many people wrote about some new maps, dungeons etc... I have not so much free time, but when i have some i work hard. Here is new demon dungeon, something more darker! Dungeon will have 4 floors, size of the map is 4x4. Im not sure when i will be done with this map. Mobs and so still left and i have not much free time right now so i think i will finish it in 2 weeks. Here are some screens:
  29. 6 likes
    Hey, I have made a small function that will enable you to use an unlimited amount of arguments in server source code. For example look at the function do_item in cmd_gm.cpp, it gets 2 arguments : arg1 and arg2. Using my function you will be able to have as many arguments easier and in more convenient way. That means you can have 5,7 or even 20 arguments. Let's begin: Open utils.cpp and look for #include "stdafx.h" add below the following: #include <boost/algorithm/string/classification.hpp> // Include boost::for is_any_of #include <boost/algorithm/string/split.hpp> look for const char *first_cmd add above: void split_argument(const char *argument, std::vector<std::string> & vecArgs) { std::string arg = argument; boost::split(vecArgs, arg, boost::is_any_of(" "), boost::token_compress_on); } open utils.h and look for const char * first_cmd add above: extern void split_argument(const char *argument, std::vector<std::string> & vecArgs); That's all. How to use? Let's look for example in ACMD(do_item) method: Instead of char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); you can replace with: std::vector<std::string> vecArgs; split_argument(argument,vecArgs); And now you can access any of the arguments starting from index of 1. so for example if you type ingame the command /item 6001 10 vecArgs[1] is 6001 vecArgs[2] is 10 if you need to convert it to number, you can use as example: int iCount = 0; str_to_number(iCount, vecArgs[2].c_str()); If you need any assistance, write here a reply and ill do my best in helping you. Enjoy
  30. 5 likes
  31. 5 likes
    Hi there comunity, today I was a little bored and an idea came to mind, what if I made a replica of the interface from League of Legends for Metin2. So this is the result: I just want to know what do you think and if you think that I need to continue with it.
  32. 5 likes
    Hello to everyone, ok this is my first share so I hope you like it, well here I come with this Lindvior Set , ok icons are not complete but mayor part of them yes, only 2 icons remaining I think,ok see you next time. https://cloud.mail.ru/public/CDYL/YZExHRBjA Password: CriticalError Credits: mine
  33. 5 likes
    A small fix about a query of messenger system. When you remove any person on your list, the companion will continue to see your name on his list (when the companion relog in the game again). This query will remove both of them's contact in the database. Best Regards Ken
  34. 5 likes
  35. 5 likes
    This Serverfiles have the Lycan Unbugged. Versions Bin: 28249Game: 43360Db: 43370Language: Turkish (TR) Particulars Alchemy Dragon to work without bugsCustoms system to work perfectly, updatedBelts system running smoothlyFunctional Nemere tower and stableSkill table updated ProtoTable updated Player_IndexLocale.lua updatedSkill Power updatedLocale_string.txt updatedNew Character Added LycanAdded Lycan against defensesIncreased Slots of the NPC's Stores to 80Mysql eliminated logGuild can be up to 112 charactersGroup can have up to 14 charactersCover the permanent BraveryVouchers (50, 100, 500 and 1000 MD's) functionalAll Lycan Items addedEffect of Green and Purple Potion (when used) added12 slots in trade window to 24 slotsAnd more... Screens Downloads & Infos Game + DB VDI (made by TylerDurden / Passwords and Users inside the rar file) Client Fix for Pack (Put the two files in Pack inside Client) You have to use FreeBSD 9.2+Sql PW: maxmi33Acc: teste / sezer123In the folder Pack you will see two files: Server_Name.cfg > In this file you have to write the name of your serverServer_IP.cfg > In this file write the IP Credits Maxmi for made the Serverfiles and the ClientTyler Durden for made the UploadsMe for the translation to English and the reorganization of the Topic and the Links
  36. 4 likes
    Hi everyone, This is a funny project, the player can swim, fly, jump , and more with improvement in the future: Let's see video: Cordialy
  37. 4 likes
    Special thanks for design and help: [url=https://metin2dev.org/board/index.php?/profile/12872-legolasofficial/]LegolasOfficial[/url] Download: https://mega.nz/#!pBUj0IoC!tYUbK3liAC5fSxxWQ1sWjUKypNFphPergj4lDZxk6RQ
  38. 4 likes
    alle what you Need for create own solitary dungeon is on this pack mates i have show on the worldeditor tutorial 18 how to create it just leave a like for show me you like my work
  39. 4 likes
    Pack Mob With Effect v1 4 Mob & 1 Boss DOWNLOAD Password: www.betefilase.jimdo.com
  40. 4 likes
    Today i get this problem, when i enter in a party dungeon and someone of the party goes offline or warp in another map, the core crashed. I want give all my idea to fix that, i know that is not the best method to fix that but i think for someone can be useful. I tried to fix the problem with the tutorial on metin2dev with SetDungeon(NULL) in SetParty but without any results, the bug continue... This is my fix/idea: When someone goes offline all the members of the group will go to the own village and the core doesn't crash. Open party.cpp and replace your UpdateOfflineState function with this: void CParty::UpdateOfflineState(DWORD dwPID) { TPacketGCPartyAdd p; p.header = HEADER_GC_PARTY_ADD; p.pid = dwPID; memset(p.name, 0, CHARACTER_NAME_MAX_LEN+1); for (TMemberMap::iterator it = m_memberMap.begin(); it != m_memberMap.end(); ++it) { if (it->second.pCharacter && it->second.pCharacter->GetDesc()) { if (it->second.pCharacter->GetDungeon()) { LPDUNGEON dung=it->second.pCharacter->GetDungeon(); dung->ExitAllToStartPosition(); }else{ it->second.pCharacter->GetDesc()->Packet(&p, sizeof(p)); } } } }
  41. 4 likes
    Wow, you removed some parentheses, very useful contribution indeed.
  42. 4 likes
    Last Update, note, i will not release this on any board yet, just on youtube so show your Interesse. the way to boss: Status, green = finished / orange = not finished the minimap of solitary (the map will be released without minimap, cause is better without) number of chambers: 31 last pictures before the release: note, not all chambers are to see is just preview
  43. 4 likes
    News about the update - yep, I have some. I'm currently figuring out what's going on with the newer mysql libs. I'll tell you a long story and a tl;dr for everyone who is lazy to read. It's a really strange occurance. The game and db boot fine but I tried to upgrade to more recent mysql libraries. As soon as I'm using the new libraries, the connection values (host, etc.) have really weird characters. It looks like an encoding issue to me but it really does not make any sense since the characters occur even when I print debug messages long before any function from the library is called. I therefore decided to fix a warning that's been bugged me for a while and go for the all-utf8 stuff. Now every source and header file is converted into utf-8 with all the characters still remaining (except for one occurance where I had to short a function in empire_text_convert.cpp. So the core will still be stable but the conversion may need further testing, but I guess it'd work like before). The error with the weird characters still appeared but only at the first boot with the changes. Every new boot now seems to work fine, game and db connects perfectly. But since the error had occured at least once I'm not ready to ship. tl;dr: Weird bug with libmysqlclient that seems to be fixed, but needs further testing, then I'll ship For editing CONFIG and all the stuff you need to visit one of the basic tutorials about server configuring. You need to understand the parts of your serverfiles. You can think of the gamefile as the kernel of your server (though of course It's not a kernel, just for your imagination). While the serverfiles in it's whole is the system (with using scripts like quests and all that stuff) the core itself is the first thing your client will come in touch (of course only after the OS, etc..) when connecting to the server. It delegates and of course does the main job. That's why it's called a core. The dbcache does support the core and handles all the mysql stuff and does the caching job. Vanilla is NOT a serverfiles replacement, it's a core-replacement. It also is NOT a client modification at all. It only affects the core and is backward compatible with serverfiles and clients beginning from r34k (recommended: r40k). As soon as you understand the parts of your serverfiles and get a view on it's structure you're also able to adjust the CONFIG to your needs and fully unlock the possibilites vanilla core holds. But even without utilizing the CONFIG files you're having a lot of fixes and stuff that's not in the 40k source.
  44. 4 likes
    Draw metin2 in png format, I hope you enjoy it Photoshop CS6 project: password: luca17081998 fabbro chibi 1920x 1080 progetto photoshop cs6 password: luca17081998 Charon chibi 1920x 1080. PNG progetto photoshop cs6 password: luca17081998 draw ninja metin format PNG, 1920x 1080
  45. 4 likes
  46. 4 likes
  47. 4 likes
    Here a solution to hide all the useless error of Granny. Open UserInterface.cpp from UserInterface, after have doing the tutorial search: void GrannyError(granny_log_message_type Type, and comment the contents like it: //static void GrannyError(granny_log_message_type Type, // granny_log_message_origin Origin, // char const* File, // granny_int32x Line, // char const* Message, // void * UserData) //{ // TraceError("GRANNY: %s", Message); //} and a little down: // granny_log_callback Callback; // Callback.Function = GrannyError; // Callback.UserData = 0; // GrannySetLogCallback(&Callback); return 1; Regards, Vamos.
  48. 3 likes
    Hi to everyone!Today I've finish new map and i'm releasing something from it for free Here is Nephrite pillar "metin" for free. If you are interesting about full map, just write me a message on skype or here Download
  49. 3 likes
    Hello. Today I release something different from the usual, I want to share with you a very simple, clean and versatile GamePatcher, created entirely by me. It is common to say that I was inspired by various sources that I honestly do not even remember all. Unfortunately, it is code-free, as it is not my field, if someone wanted - time lost - try to make it "work" and code the project, it is free to do so. The GamePatcher is subdivided into sections, each editable as best you believe because the .psd you will find at the end of the post is free to be modified. - Technical Details - Each element with which the user interacts will have at least 3 phases Normal (User is not interacting with element) Hover (The user moves the mouse arrow over the element) Clicked (The user clicks on the element) Some elements have only two states and in the case of the LoadingBar we have both full and empty. - What contains the .rar file - - [PSD Cs6] Free GamePatcher_Thedanielx32: The .psd completely free and editable in every aspect. - [SCREEN] Free GamePatcher_Thedanielx32: Simply a visual feedback of .psd. * - READ ME: A file with the names of the fonts used and some technical details and not. - Show Steps: Image showing the various steps of interactive elements. * - Sliced Elements: Contains all the elements with which the user interacts subdivided one by one, and also contains a .psd backup file. (Expanded Folder in the spoiler below) [SPOILER="Cartella Sliced Elements Espansa"][/SPOILER] * Image also posted in this discussion Feel free to use it as you believe it best. I do not offer support as it is a free release for expert users, as long as you were planning to create the code, you can contact me and I'll be happy to help. If you are going to publish it to other sites outside of metin2dev.org, I just ask you to quote me. The graphics resource, as free, is not for sale. Download File .Rar https://www.mediafire.com/?53vq99dbfaa7vbz VirusTotal: https://www.virustotal.com/it/url/c55feee35b822c4af43544f9857b067ba278a040fcf7184728fe222519612316/analysis/1499264214/ - Thedanielx32
  50. 3 likes
    int pc_get_rank(lua_State* L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) { lua_pushnumber(L, 0); return 1; } char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT rank FROM player.player WHERE name='%s'", ch->GetName()); std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery(szQuery)); if (pMsg->Get()->uiNumRows > 0) { MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); int iRank = 0; str_to_number(iRank, row[0]); lua_pushnumber(L, iRank); return 1; } lua_pushnumber(L, 0); return 1; } You are not pushing the query return value, you're pushing 0 all the time. Not tested. Oh, and it is better to declare first the LPCHARACTER to avoid core crashes if it doesn't exists. PS: Where did you get the Dev member? In a bet?