Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/03/24 in all areas

  1. 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
    3 points
  2. Download Updated at 2023.08.05. Alternative download links: Client & Serverfiles + VDI + Extension Pack [40250] Reference Serverfile + Client + Src [15 Available Languages] My goal was to make a reference r40250 serverfile as official as possible compared to what GF had back when their files got leaked in early 2014. No new systems added, only bug fixes. While I spent several hours testing, there may still be bugs. Please report bugs to me so I can fix them in the future, I want to make this project as bug free as possible. Available languages: EN/DE/HU/FR/CZ/DK/ES/GR/IT/NL/PL/PT/RO/RU/TR Please read Languages.txt to learn how to change the default EN language. SSH for VM: root/123456789 MySQL: root/123456789 Ingame: admin/123456789 Aliases and it's commands: start cd /usr/metin2/server && sh start.sh close cd /usr/metin2/server && sh close.sh clean cd /usr/metin2/server && sh clean.sh backup cd /usr/metin2/server && sh backup.sh questcompile cd /usr/metin2/server/share/locale/english/quest && python2.7 make.py dbclean cd /usr/metin2/src/server/db/src && gmake clean dbdep cd /usr/metin2/src/server/db/src && gmake dep dbcompile cd /usr/metin2/src/server/db/src && gmake -j9 gameclean cd /usr/metin2/src/server/game/src && gmake clean gamedep cd /usr/metin2/src/server/game/src && gmake dep gamecompile cd /usr/metin2/src/server/game/src && gmake -j9 Please read Changelog.txt to find more about the changes I made. Special thanks to: @Mali for the clean and updated client & server src files. @Sanchez for the 2014 base client. @Veltor88 for the translate.lua pack. @Fazer for the locale_string pack I made a little video about installing the serverfile (vm) and changing the language: PS: I know it's pretty late in 2021 but better than ever Sincerely, TMP4
    2 points
  3. Hello guys, Since most people still use Notepad++, it will be useful to just a few people only. So, if you just start the VSCode and edit files, it'll f.cked your korean text. (LC_TEXT) (For me, it did) You should go to Preferences - Settings - Search for "encoding" and change the "UTF8" to "ISO 8859-1" (And disable auto guess encoding if it's enabled)
    2 points
  4. Download VDI ( FULLY UPDATED ) Alternative download links → SRC TAR (OUTDATED) or Client VS22 Source or CLIENT TMP4 BASE - Fully updated Updates List : #define ENABLE_AUTODETECT_INTERNAL_IP #define ENABLE_PROXY_IP #define ENABLE_PORT_SECURITY #define _IMPROVED_PACKET_ENCRYPTION_ // ��Ŷ ��ȣȭ ���� #define ENABLE_RING_OF_SECRETS #define __SKILL_COLOR_SYSTEM__ // Skill color system //#define __AUCTION__ #define __PET_SYSTEM__ #define __UDP_BLOCK__ #define ENABLE_ANTI_EXP #define BL_PARTY_POSITION #define __SEND_TARGET_INFO__ #define ENABLE_SEND_TARGET_INFO_EXTENDED #define ENABLE_WHISPER_RENEWAL #define ENABLE_DUEL_EFFECT #define BL_AUTOMATIC_OXEVENT #define ENABLE_EMOJI_SYSTEM #define __BL_ENABLE_PICKUP_ITEM_EFFECT__ #define ENABLE_PM_IN_GLOBAL_CHAT #define ENABLE_GLOBAL_CHAT #define __BL_KILL_BAR__ GAMEPLAY READY. Run & Enjoy DISCORD SERVER ( FOR QUESTIONS & IMPROVEMENTS ) Discord
    2 points
  5. M2 Download Center Download Here ( Internal ) Hi everyone, As title say, this is a wiki system but, InGame . This system was made by Kori . When i download it, the system had a bug on item bar, so, i've removed it . Screen of system: The system is open by pressing a key ( choosed for you ) . How to ? Well, 1º - Unpack your root . 2º- Search for archive game.py 3º- Open it and add: import uiwiki 4º - Search for: def __init__(self, stream): and add: self.wiki = uiwiki.AgeofPlatonWiki() 5º - Search for: onPressKeyDict[app.DIK_F5] and next add: onPressKeyDict[app.DIK_F9] = lambda : self.__OnWiki() Note: in here: [app.DIK_F9], F9 will be the key would you need to press to can view the system . You can change it , like you want. 6º - In the end of all ( game.py ) add this: def __OnWiki(self): if self.wiki.IsShow(): self.wiki.Hide() else: self.wiki.Show() 7º - Download the archive, add it to root, and pack it again . Download: Link Here Password: www.metin2dev.org Have fun ! Kind Regards, Grave
    2 points
  6. Hi, By pressing SHIFT + RIGHT CLICK on the items eligible for sale, an interface will appear showing you how much money you will receive and how many items you have selected. The selected items will have a special icon indicating that they have been selected. More information can be found in the README. [Hidden Content] [Hidden Content]
    2 points
  7. M2 Download Center Download Here ( Internal ) [Hidden Content]- Images & Video: Some Informations From Black: If you have a problem, you can send me a private message. You know me, I reply to all private messages
    2 points
  8. Download Other Mirros Download Here (GitHub) Download Here (Mega) Ship Defense is a dungeon accessible only in groups (minimum 2 players, maximum 8) in which players set sail for the new continent defending the ship’s mast from increasingly stronger and more numerous monsters until they defeat all three heads of the Hydra boss. Once the mission is complete, the participants will receive some rewards (determined by chance). Information Demonstration
    2 points
  9. Hello Guys, today I bring you a simple CMS for your metin2 server. User features: Register Login Player and Guild ranking Downloads Change email Change password Warehouse password Character password Unbugg character Recover account password Admin features: Add post Edit post Delete post Ban user permanent Ban user for days Unbann user Add coins to players Remove coins from players Some others things: Enable/Disable Lycan in Ranking (disabled by default) Enable and set max accounts per email (disabled by default) Enable/disable register Block user login on site if banned option to change website language easily Send emails with SMTP(PHPMailer) and more... Its made with slim framework v2 and raintpl, supports PHP 7.0.0+ All changes can be made in 'vendor/init.php'. Required PHP Modules: session json pdo pdo_mysql filter sockets - optional If you use apache its necessary to activate mod_rewrite for friendly url or you get a 404 error. (for others web servers you can check slim framework documentation to fix possible errors) For localhost tests: I've found in levmud website a link for localhost tests, it contains some modifications to not call google recaptcha and some small changes in index.php Direct link: [Hidden Content] (outdated) Production link: [Hidden Content] (v1.2.1) Demo: [Hidden Content] Backup: Metin2 Download Demo user: admin | password: !Admin1! You can change server responses to english in init.php (SERVER_LANG, 'en') but all HTML files are in portuguese. Its free to use, share and modify. I'm not the owner. Hope its useful for someone Update - new version! ## [1.2.1] - 2022-03-01 ### Changed - Account creation and Login moved to individual pages. - Improved 'TopClass' ranking. ### Added - New option 'ENABLE_CAPTCHA' in /vendor/init.php. (set to false for localhost tests) ### Fixed - Fixed error when trying to login with BLOCK_LOGIN_SITE_USER_BAN enabled. - Fixed the possibility to access "deleted" posts.
    2 points
  10. I noticed one bug with specular, probably every server has it, simply ymir bug. I've never played much metin but now it happened to me on the server so I searched searched but couldn't find anything then a guy named @rid gave me a fix no problem without paying and even wrote me that I can post it on the forum so here you are. [Hidden Content] Thanks @rid for share his fix.
    2 points
  11. M2 Download Center Download Here ( Internal ) Hello community, With the changes of the game, the items and mobs are now managed through a txt. And as there are problems in generating this txt and to manage the same, I decided I wanted to continue to manage the items and mobs by the database, since it is much easier to make changes and filter searches. Say this way will have 4 tables (item_proto, item_proto_WORK, mob_proto and mob_proto_WORK). The _WORK tables are where we do our updates, is basically just duplicate the original, the other 2 remaining are those that will be updated automatically by the game to read the txt generated by this converter. In my case, I have the file in the share / server conf folder (same folder as the item_proto.txt, item_names.txt, mob_proto.txt and mob_names.txt). Here is the conversion script (cproto.php): <?php /** * Item_proto and mob_proto converter * * */ // MySQL/DB Configuration $config["mysql_host"] = "192.168.5.100"; $config["mysql_user"] = "root"; $config["mysql_pass"] = ""; $config["player_db"] = "player"; $config["item_proto_work"] = "item_proto_WORK"; // Tabela de trabalho $config["mob_proto_work"] = "mob_proto_WORK"; // Tabela de trabalho // Output Configuration $config["prefix_output"] = ""; // Este prefixo é para debug apenas. Exemplo: metin2_ => metin2_item_proto.txt $config["item_output"] = array("{$config["prefix_output"]}item_names.txt", "{$config["prefix_output"]}item_proto.txt", "{$config["prefix_output"]}item_proto_test.txt"); $config["mob_output"] = array("{$config["prefix_output"]}mob_names.txt", "{$config["prefix_output"]}mob_proto.txt", "{$config["prefix_output"]}mob_proto_test.txt"); class Proto{ private static $dbCon = false; public static $targets = ""; public static function start(){ if(self::getTargets()){ self::convertTargets(); } } private static function output($string, $color, $restoreColor = true, $breakline = true){ switch($color){ case "red": $initColor = "033[31m"; break; case "green": $initColor = "033[32m"; break; default: $initColor = "033[0m"; } $out = $initColor.$string; if($restoreColor){ $out .= "033[0m"; } if($breakline){ $out .= "n"; } echo $out; } private static function write($file, $lines){ $fo = fopen($file, "w"); fwrite($fo, $lines); fclose($fo); } private static function connect(){ global $config; if(!self::$dbCon){ $c = @mysql_connect($config["mysql_host"], $config["mysql_user"], $config["mysql_pass"]) or die(self::output("Erro #1: Ocorreu um erro ao ligar à base de dados.", "red")); if($c){ self::$dbCon = true; self::output("Ligação à base de dados com sucesso.", "green"); } } } private static function getTargets(){ global $config; if($_SERVER["argc"] > 1){ $tmp = array(); foreach($_SERVER["argv"] as $k => $v){ if($v == "all"){ $tmp[] = $v; break; } if($v == "item" || $v == "mob"){ $tmp[] = $v; } } if(in_array("all", $tmp)){ self::$targets = "all"; }elseif(in_array("item", $tmp) && in_array("mob", $tmp)){ self::$targets = "all"; }else{ if(in_array("item", $tmp)){ self::$targets = "item"; } if(in_array("mob", $tmp)){ self::$targets = "mob"; } } if(in_array("all", $tmp) || in_array("item", $tmp) || in_array("mob", $tmp)){ return true; }else{ self::output("Erro #3: Argumento inválido.", "red"); } }else{ self::output("Erro #2: Precisas de especificar pelo menos um argumento.", "red"); } self::output("Item/Mob proto Converter", "green"); self::output("", "green"); self::output("Utilização: sh cproto.sh [args...]", "green"); self::output("Argumentos possíveis:", "green"); self::output(" item Converte apenas o {$config["item_proto_work"]}", "green"); self::output(" mob Converte apenas o {$config["mob_proto_work"]}", "green"); self::output(" all Converte tanto o item_proto como o mob_proto", "green"); return false; } private static function convertNumToString($target, $value){ $item_type = array(0=>"ITEM_NONE", 1=>"ITEM_WEAPON", 2=>"ITEM_ARMOR", 3=>"ITEM_USE", 4=>"ITEM_AUTOUSE", 5=>"ITEM_MATERIAL", 6=>"ITEM_SPECIAL", 7=>"ITEM_TOOL", 8=>"ITEM_LOTTERY", 9=>"ITEM_ELK", 10=>"ITEM_METIN", 11=>"ITEM_CONTAINER", 12=>"ITEM_FISH", 13=>"ITEM_ROD", 14=>"ITEM_RESOURCE", 15=>"ITEM_CAMPFIRE", 16=>"ITEM_UNIQUE", 17=>"ITEM_SKILLBOOK", 18=>"ITEM_QUEST", 19=>"ITEM_POLYMORPH", 20=>"ITEM_TREASURE_BOX", 21=>"ITEM_TREASURE_KEY", 22=>"ITEM_SKILLFORGET", 23=>"ITEM_GIFTBOX", 24=>"ITEM_PICK", 25=>"ITEM_HAIR", 26=>"ITEM_TOTEM", 27=>"ITEM_BLEND", 28=>"ITEM_COSTUME"); $item_limit = array(0=>"LIMIT_NONE", 1=>"LEVEL", 2=>"STR", 3=>"DEX", 4=>"INT", 5=>"CON", 6=>"PC_BANG", 7=>"REAL_TIME", 8=>"REAL_TIME_FIRST_USE", 9=>"TIMER_BASED_ON_WEAR"); $item_apply = array(0=>"APPLY_NONE", 1=>"APPLY_MAX_HP", 2=>"APPLY_MAX_SP", 3=>"APPLY_CON", 4=>"APPLY_INT", 5=>"APPLY_STR", 6=>"APPLY_DEX", 7=>"APPLY_ATT_SPEED", 8=>"APPLY_MOV_SPEED", 9=>"APPLY_CAST_SPEED", 10=>"APPLY_HP_REGEN", 11=>"APPLY_SP_REGEN", 12=>"APPLY_POISON_PCT", 13=>"APPLY_STUN_PCT", 14=>"APPLY_SLOW_PCT", 15=>"APPLY_CRITICAL_PCT", 16=>"APPLY_PENETRATE_PCT", 17=>"APPLY_ATTBONUS_HUMAN", 18=>"APPLY_ATTBONUS_ANIMAL", 19=>"APPLY_ATTBONUS_ORC", 20=>"APPLY_ATTBONUS_MILGYO", 21=>"APPLY_ATTBONUS_UNDEAD", 22=>"APPLY_ATTBONUS_DEVIL", 23=>"APPLY_STEAL_HP", 24=>"APPLY_STEAL_SP", 25=>"APPLY_MANA_BURN_PCT", 26=>"APPLY_DAMAGE_SP_RECOVER", 27=>"APPLY_BLOCK", 28=>"APPLY_DODGE", 29=>"APPLY_RESIST_SWORD", 30=>"APPLY_RESIST_TWOHAND", 31=>"APPLY_RESIST_DAGGER", 32=>"APPLY_RESIST_BELL", 33=>"APPLY_RESIST_FAN", 34=>"APPLY_RESIST_BOW", 35=>"APPLY_RESIST_FIRE", 36=>"APPLY_RESIST_ELEC", 37=>"APPLY_RESIST_MAGIC", 38=>"APPLY_RESIST_WIND", 39=>"APPLY_REFLECT_MELEE", 40=>"APPLY_REFLECT_CURSE", 41=>"APPLY_POISON_REDUCE", 42=>"APPLY_KILL_SP_RECOVER", 43=>"APPLY_EXP_DOUBLE_BONUS", 44=>"APPLY_GOLD_DOUBLE_BONUS", 45=>"APPLY_ITEM_DROP_BONUS", 46=>"APPLY_POTION_BONUS", 47=>"APPLY_KILL_HP_RECOVER", 48=>"APPLY_IMMUNE_STUN", 49=>"APPLY_IMMUNE_SLOW", 50=>"APPLY_IMMUNE_FALL", 51=>"APPLY_SKILL", 52=>"APPLY_BOW_DISTANCE", 53=>"APPLY_ATT_GRADE_BONUS", 54=>"APPLY_DEF_GRADE_BONUS", 55=>"APPLY_MAGIC_ATT_GRADE", 56=>"APPLY_MAGIC_DEF_GRADE", 57=>"APPLY_CURSE_PCT", 58=>"APPLY_MAX_STAMINA", 59=>"APPLY_ATTBONUS_WARRIOR", 60=>"APPLY_ATTBONUS_ASSASSIN", 61=>"APPLY_ATTBONUS_SURA", 62=>"APPLY_ATTBONUS_SHAMAN", 63=>"APPLY_ATTBONUS_MONSTER", 64=>"APPLY_MALL_ATTBONUS", 65=>"APPLY_MALL_DEFBONUS", 66=>"APPLY_MALL_EXPBONUS", 67=>"APPLY_MALL_ITEMBONUS", 68=>"APPLY_MALL_GOLDBONUS", 69=>"APPLY_MAX_HP_PCT", 70=>"APPLY_MAX_SP_PCT", 71=>"APPLY_SKILL_DAMAGE_BONUS", 72=>"APPLY_NORMAL_HIT_DAMAGE_BONUS", 73=>"APPLY_SKILL_DEFEND_BONUS", 74=>"APPLY_NORMAL_HIT_DEFEND_BONUS", 75=>"APPLY_PC_BANG_EXP_BONUS", 76=>"APPLY_PC_BANG_DROP_BONUS", 77=>"APPLY_EXTRACT_HP_PCT", 78=>"APPLY_RESIST_WARRIOR", 79=>"APPLY_RESIST_ASSASSIN", 80=>"APPLY_RESIST_SURA", 81=>"APPLY_RESIST_SHAMAN", 82=>"APPLY_ENERGY", 83=>"APPLY_DEF_GRADE", 84=>"APPLY_COSTUME_ATTR_BONUS", 85=>"APPLY_MAGIC_ATTBONUS_PER", 86=>"APPLY_MELEE_MAGIC_ATTBONUS_PER"); $mob_rank = array(0=>"PAWN", 1=>"S_PAWN", 2=>"KNIGHT", 3=>"S_KNIGHT", 4=>"BOSS", 5=>"KING"); $mob_type = array(0=>"MONSTER", 1=>"NPC", 2=>"STONE", 3=>"WARP", 4=>"DOOR", 5=>"BUILDING", 7=>"POLYMORPH_PC", 8=>"HORSE", 9=>"GOTO"); $mob_battletype = array(0=>"MELEE", 1=>"RANGE", 2=>"MAGIC", 3=>"SPECIAL", 4=>"POWER", 5=>"TANKER"); switch($target){ case "item_type": $target = $item_type; break; case "item_limit": $target = $item_limit; break; case "item_apply": $target = $item_apply; break; case "mob_rank": $target = $mob_rank; break; case "mob_type": $target = $mob_type; break; case "mob_battletype": $target = $mob_battletype; break; default: $target = ""; } return $target[$value]; } private static function getItemSubtype($type, $subtype){ if($type == 1){ if($subtype == 0){ return ""WEAPON_SWORD""; } elseif($subtype == 1){ return ""WEAPON_DAGGER""; } elseif($subtype == 2){ return ""WEAPON_BOW""; } elseif($subtype == 3){ return ""WEAPON_TWO_HANDED""; } elseif($subtype == 4){ return ""WEAPON_BELL""; } elseif($subtype == 5){ return ""WEAPON_FAN""; } elseif($subtype == 6){ return ""WEAPON_ARROW""; } elseif($subtype == 7){ return ""WEAPON_MOUNT_SPEAR""; } elseif($subtype == 8){ return ""WEAPON_NUM_TYPES""; } }elseif($type == 2){ if($subtype == 0){ return ""ARMOR_BODY""; } elseif($subtype == 1){ return ""ARMOR_HEAD""; } elseif($subtype == 2){ return ""ARMOR_SHIELD""; } elseif($subtype == 3){ return ""ARMOR_WRIST""; } elseif($subtype == 4){ return ""ARMOR_FOOTS""; } elseif($subtype == 5){ return ""ARMOR_NECK""; } elseif($subtype == 6){ return ""ARMOR_EAR""; } elseif($subtype == 7){ return ""ARMOR_NUM_TYPES""; } }elseif($type == 3){ if($subtype == 0){ return ""USE_POTION""; } elseif($subtype == 1){ return ""USE_TALISMAN""; } elseif($subtype == 2){ return ""USE_TUNING""; } elseif($subtype == 3){ return ""USE_MOVE""; } elseif($subtype == 4){ return ""USE_TREASURE_BOX""; } elseif($subtype == 5){ return ""USE_MONEYBAG""; } elseif($subtype == 6){ return ""USE_BAIT""; } elseif($subtype == 7){ return ""USE_ABILITY_UP""; } elseif($subtype == 8){ return ""USE_AFFECT""; } elseif($subtype == 9){ return ""USE_CREATE_STONE""; } elseif($subtype == 10){ return ""USE_SPECIAL""; } elseif($subtype == 11){ return ""USE_POTION_NODELAY""; } elseif($subtype == 12){ return ""USE_CLEAR""; } elseif($subtype == 13){ return ""USE_INVISIBILITY""; } elseif($subtype == 14){ return ""USE_DETACHMENT""; } elseif($subtype == 15){ return ""USE_BUCKET""; } elseif($subtype == 17){ return ""USE_CLEAN_SOCKET""; } elseif($subtype == 18){ return ""USE_CHANGE_ATTRIBUTE""; } elseif($subtype == 19){ return ""USE_ADD_ATTRIBUTE""; } elseif($subtype == 20){ return ""USE_ADD_ACCESSORY_SOCKET""; } elseif($subtype == 21){ return ""USE_PUT_INTO_ACCESSORY_SOCKET""; } elseif($subtype == 22){ return ""USE_ADD_ATTRIBUTE2""; } elseif($subtype == 23){ return ""USE_RECIPE""; } elseif($subtype == 24){ return ""USE_CHANGE_ATTRIBUTE2""; } elseif($subtype == 25){ return ""USE_BIND""; } elseif($subtype == 26){ return ""USE_UNBIND""; } elseif($subtype == 29){ return ""AUTOUSE_BOMB""; } elseif($subtype == 30){ return ""AUTOUSE_GOLD""; } }elseif($type == 5){ if($subtype == 0){ return ""MATERIAL_LEATHER""; } elseif($subtype == 1){ return ""MATERIAL_BLOOD""; } elseif($subtype == 2){ return ""MATERIAL_ROOT""; } elseif($subtype == 3){ return ""MATERIAL_NEEDLE""; } elseif($subtype == 4){ return ""MATERIAL_JEWEL""; } }elseif($type == 6){ if($subtype == 0){ return ""SPECIAL_MAP""; } if($subtype == 1){ return ""SPECIAL_KEY""; } if($subtype == 2){ return ""SPECIAL_DOC""; } if($subtype == 3){ return ""SPECIAL_SPIRIT""; } if($subtype == 4){ return ""SPECIAL_MAP""; } }elseif($type == 7){ if($subtype == 0){ return ""TOOL_FISHING_ROD""; } }elseif($type == 8){ if($subtype == 0){ return ""LOTTERY_TICKET""; } elseif($subtype == 1){ return ""LOTTERY_INSTANT""; } }elseif($type == 10){ if($subtype == 0){ return ""METIN_NORMAL""; } elseif($subtype == 1){ return ""METIN_GOLD""; } }elseif($type == 12){ if($subtype == 0){ return ""FISH_ALIVE""; } elseif($subtype == 1){ return ""FISH_DEAD""; } }elseif($type == 14){ if($subtype == 0){ return ""RESOURCE_FISHBONE""; } elseif($subtype == 1){ return ""RESOURCE_WATERSTONEPIECE""; } elseif($subtype == 2){ return ""RESOURCE_WATERSTONE""; } elseif($subtype == 3){ return ""RESOURCE_BLOOD_PEARL""; } elseif($subtype == 4){ return ""RESOURCE_BLUE_PEARL""; } elseif($subtype == 5){ return ""RESOURCE_WHITE_PEARL""; } elseif($subtype == 6){ return ""RESOURCE_BUCKET""; } elseif($subtype == 7){ return ""RESOURCE_CRYSTAL""; } elseif($subtype == 8){ return ""RESOURCE_GEM""; } elseif($subtype == 9){ return ""RESOURCE_STONE""; } elseif($subtype == 10){ return ""RESOURCE_METIN""; } elseif($subtype == 11){ return ""RESOURCE_ORE""; } }elseif($type == 16){ if($subtype == 0){ return ""UNIQUE_NONE""; } elseif($subtype == 2){ return ""UNIQUE_SPECIAL_RIDE""; } elseif($subtype == 3){ return ""UNIQUE_3""; } elseif($subtype == 4){ return ""UNIQUE_4""; } elseif($subtype == 5){ return ""UNIQUE_5""; } elseif($subtype == 6){ return ""UNIQUE_6""; } elseif($subtype == 7){ return ""UNIQUE_7""; } elseif($subtype == 8){ return ""UNIQUE_8""; } elseif($subtype == 9){ return ""UNIQUE_9""; } elseif($subtype == 10){ return ""USE_SPECIAL""; } }elseif($type == 28){ if($subtype == 0){ return ""COSTUME_BODY""; } elseif($subtype == 1){ return ""COSTUME_HAIR""; } } return 0; } private static function getFlags($flag, $method){ $antiflags = array(0=>"NONE", 1=>"ANTI_FEMALE", 2=>"ANTI_MALE", 4=>"ANTI_MUSA", 8=>"ANTI_ASSASSIN", 16=>"ANTI_SURA", 32=>"ANTI_MUDANG", 64=>"ANTI_GET", 128=>"ANTI_DROP", 256=>"ANTI_SELL", 512=>"ANTI_EMPIRE_A", 1024=>"ANTI_EMPIRE_B", 2048=>"ANTI_EMPIRE_C", 4096=>"ANTI_SAVE", 8192=>"ANTI_GIVE", 16384=>"ANTI_PKDROP", 32768=>"ANTI_STACK", 65536=>"ANTI_MYSHOP", 131072=>"ANTI_SAFEBOX"); $flags = array(0=>"NONE", 1=>"ITEM_TUNABLE", 2=>"ITEM_SAVE", 4=>"ITEM_STACKABLE", 8=>"COUNT_PER_1GOLD", 16=>"ITEM_SLOW_QUERY", 32=>"ITEM_UNIQUE", 64=>"ITEM_MAKECOUNT", 128=>"ITEM_IRREMOVABLE", 256=>"CONFIRM_WHEN_USE", 512=>"QUEST_USE", 1024=>"QUEST_USE_MULTIPLE", 2048=>"QUEST_GIVE", 4096=>"ITEM_QUEST", 8192=>"LOG", 16384=>"STACKABLE", 32768=>"32768", 65536=>"REFINEABLE", 131072=>"131072", 262144=>"ITEM_APPLICABLE"); $wearflags = array(0=>"NONE", 1=>"WEAR_BODY", 2=>"WEAR_HEAD", 4=>"WEAR_FOOTS", 8=>"WEAR_WRIST", 16=>"WEAR_WEAPON", 32=>"WEAR_NECK", 64=>"WEAR_EAR", 128=>"WEAR_SHIELD", 256=>"WEAR_UNIQUE", 512=>"WEAR_ARROW", 1024=>"WEAR_HAIR", 2048=>"WEAR_ABILITY"); switch($method){ case "af": $target = $antiflags; break; case "f": $target = $flags; break; case "wf": $target = $wearflags; break; default: $target = ""; } $str = """; for($i=17;$i>=0;$i--){ $pow = pow(2, $i); if($pow < $flag){ $str = " | ".$target[$pow].$str; $flag = $flag-$pow; }elseif($pow == $flag){ return """.$target[$pow].$str; } } return ""NONE""; } private static function convertTargets(){ global $config; self::connect(); self::output("Item/Mob proto Converter", "green"); self::output("", "green"); if(self::$targets == "all" || self::$targets == "item"){ self::output("A converter {$config["item_proto_work"]}...", "green"); $write = array("", "", ""); $write[0] .= "VNUM LOCALE_NAMEn"; $write[1] .= ""Vnum" "Name" "Type" "SubType" "Size" "AntiFlags" "Flags" "WearFlags" "ImmuneFlags" "Gold" "ShopBuyPrice" "RefinedVnum" "RefineSet" "AlterToMagicItemPercent" "LimitType0" "LimitValue0" "LimitType1" "LimitValue1" "ApplyType0" "ApplyValue0" "ApplyType1" "ApplyValue1" "ApplyType2" "ApplyValue2" "Value0" "Value1" "Value2" "Value3" "Value4" "Value5" "Specular" "GainSocketPercent" "AddonType"n"; $write[2] .= ""Vnum" "Name" "Type" "SubType" "Size" "AntiFlags" "Flags" "WearFlags" "ImmuneFlags" "Gold" "ShopBuyPrice" "RefinedVnum" "RefineSet" "AlterToMagicItemPercent" "LimitType0" "LimitValue0" "LimitType1" "LimitValue1" "ApplyType0" "ApplyValue0" "ApplyType1" "ApplyValue1" "ApplyType2" "ApplyValue2" "Value0" "Value1" "Value2" "Value3" "Value4" "Value5" "Specular" "GainSocketPercent" "AddonType"n"; $query = mysql_query("SELECT * FROM {$config["player_db"]}.{$config["item_proto_work"]} ORDER BY vnum ASC"); while($fetch = mysql_fetch_assoc($query)){ $type = self::convertNumToString("item_type", $fetch["type"]); $subtype = self::getItemSubtype($fetch["type"], $fetch["subtype"]); $antiflag = self::getFlags($fetch["antiflag"], "af"); $flag = self::getFlags($fetch["flag"], "f"); $wearflag = self::getFlags($fetch["wearflag"], "wf"); $immuneflag = (empty($fetch["immuneflag"])) ? ""NONE"" : ""{$fetch["immuneflag"]}""; $limittype0 = self::convertNumToString("item_limit", $fetch["limittype0"]); $limittype1 = self::convertNumToString("item_limit", $fetch["limittype1"]); $applytype0 = self::convertNumToString("item_apply", $fetch["applytype0"]); $applytype1 = self::convertNumToString("item_apply", $fetch["applytype1"]); $applytype2 = self::convertNumToString("item_apply", $fetch["applytype2"]); $write[0] .= "{$fetch["vnum"]} {$fetch["locale_name"]}n"; $write[1] .= "{$fetch["vnum"]} "{$fetch["name"]}" "{$type}" {$subtype} {$fetch["size"]} {$antiflag} {$flag} {$wearflag} {$immuneflag} {$fetch["gold"]} {$fetch["shop_buy_price"]} {$fetch["refined_vnum"]} {$fetch["refine_set"]} {$fetch["magic_pct"]} "{$limittype0}" {$fetch["limitvalue0"]} "{$limittype1}" {$fetch["limitvalue1"]} "{$applytype0}" {$fetch["applyvalue0"]} "{$applytype1}" {$fetch["applyvalue1"]} "{$applytype2}" {$fetch["applyvalue2"]} {$fetch["value0"]} {$fetch["value1"]} {$fetch["value2"]} {$fetch["value3"]} {$fetch["value4"]} {$fetch["value5"]} {$fetch["specular"]} {$fetch["socket_pct"]} {$fetch["addon_type"]}n"; $write[2] .= "{$fetch["vnum"]} "{$fetch["name"]}" "{$type}" {$subtype} {$fetch["size"]} {$antiflag} {$flag} {$wearflag} {$immuneflag} {$fetch["gold"]} {$fetch["shop_buy_price"]} {$fetch["refined_vnum"]} {$fetch["refine_set"]} {$fetch["magic_pct"]} "{$limittype0}" {$fetch["limitvalue0"]} "{$limittype1}" {$fetch["limitvalue1"]} "{$applytype0}" {$fetch["applyvalue0"]} "{$applytype1}" {$fetch["applyvalue1"]} "{$applytype2}" {$fetch["applyvalue2"]} {$fetch["value0"]} {$fetch["value1"]} {$fetch["value2"]} {$fetch["value3"]} {$fetch["value4"]} {$fetch["value5"]} {$fetch["specular"]} {$fetch["socket_pct"]} {$fetch["addon_type"]}n"; } for($i=0;$i<2;$i++){ self::output(" -> A escrever {$config["item_output"][$i]}...", "green"); self::write($config["item_output"][$i], $write[$i]); } self::output("{$config["item_proto_work"]} convertido com sucesso!", "green"); } if(self::$targets == "all" || self::$targets == "mob"){ self::output("A converter {$config["mob_proto_work"]}...", "green"); $write = array("", "", ""); $write[0] .= "VNUM LOCALE_NAMEn"; $write[1] .= ""Vnum" "Name" "Rank" "Type" "BattleType" "Level" "Size" "AiFlags" "MountCapacity" "RaceFlags" "ImmuneFlags" "Empire" "Folder" "OnClick" "St" "Dx" "Ht" "Iq" "MinDamage" "MaxDamage" "MaxHp" "RegenCycle" "RegenPercent" "MinGold" "MaxGold" "Exp" "Def" "AttackSpeed" "MoveSpeed" "AggressiveHpPct" "AggressiveSight" "AttackRange" "DropItemGroup" "ResurrectionVnum" "EnchantCurse" "EnchantSlow" "EnchantPoison" "EnchantStun" "EnchantCritical" "EnchantPenetrate" "ResistSword" "ResistTwoHanded" "ResistDagger" "ResistBell" "ResistFan" "ResistBow" "ResistFire" "ResistElect" "ResistMagic" "ResistWind" "ResistPoison" "DamMultiply" "SummonVnum" "DrainSp" "MobColor" "PolymorphItem" "SkillLevel0" "SkillVnum0" "SkillLevel1" "SkillVnum1" "SkillLevel2" "SkillVnum2" "SkillLevel3" "SkillVnum3" "SkillLevel4" "SkillVnum4" "SpBerserk" "SpStoneskin" "SpGodspeed" "SpDeathblow" "SpRevive"n"; $write[2] .= ""Vnum" "Name" "Rank" "Type" "BattleType" "Level" "Size" "AiFlags" "MountCapacity" "RaceFlags" "ImmuneFlags" "Empire" "Folder" "OnClick" "St" "Dx" "Ht" "Iq" "MinDamage" "MaxDamage" "MaxHp" "RegenCycle" "RegenPercent" "MinGold" "MaxGold" "Exp" "Def" "AttackSpeed" "MoveSpeed" "AggressiveHpPct" "AggressiveSight" "AttackRange" "DropItemGroup" "ResurrectionVnum" "EnchantCurse" "EnchantSlow" "EnchantPoison" "EnchantStun" "EnchantCritical" "EnchantPenetrate" "ResistSword" "ResistTwoHanded" "ResistDagger" "ResistBell" "ResistFan" "ResistBow" "ResistFire" "ResistElect" "ResistMagic" "ResistWind" "ResistPoison" "DamMultiply" "SummonVnum" "DrainSp" "MobColor" "PolymorphItem" "SkillLevel0" "SkillVnum0" "SkillLevel1" "SkillVnum1" "SkillLevel2" "SkillVnum2" "SkillLevel3" "SkillVnum3" "SkillLevel4" "SkillVnum4" "SpBerserk" "SpStoneskin" "SpGodspeed" "SpDeathblow" "SpRevive"n"; $query = mysql_query("SELECT * FROM {$config["player_db"]}.{$config["mob_proto_work"]} ORDER BY vnum ASC"); while($fetch = mysql_fetch_assoc($query)){ $rank = self::convertNumToString("mob_rank", $fetch["rank"]); $type = self::convertNumToString("mob_type", $fetch["type"]); $battletype = self::convertNumToString("mob_battletype", $fetch["battle_type"]); $ai_flag = (empty($fetch["ai_flag"])) ? "" : ""{$fetch["ai_flag"]}""; $setRaceFlag = (empty($fetch["setRaceFlag"])) ? "" : ""{$fetch["setRaceFlag"]}""; $setImmuneFlag = (empty($fetch["setImmuneFlag"])) ? "" : ""{$fetch["setImmuneFlag"]}""; $mob_color = (empty($fetch["mob_color"])) ? "0" : "{$fetch["mob_color"]}"; $write[0] .= "{$fetch["vnum"]} {$fetch["locale_name"]}n"; $write[1] .= "{$fetch["vnum"]} "{$fetch["name"]}" "{$rank}" "{$type}" "{$battletype}" {$fetch["level"]} {$fetch["size"]} {$ai_flag} {$fetch["mount_capacity"]} {$setRaceFlag} {$setImmuneFlag} {$fetch["empire"]} "{$fetch["folder"]}" {$fetch["on_click"]} {$fetch["st"]} {$fetch["dx"]} {$fetch["ht"]} {$fetch["iq"]} {$fetch["damage_min"]} {$fetch["damage_max"]} {$fetch["max_hp"]} {$fetch["regen_cycle"]} {$fetch["regen_percent"]} {$fetch["gold_min"]} {$fetch["gold_max"]} {$fetch["exp"]} {$fetch["def"]} {$fetch["attack_speed"]} {$fetch["move_speed"]} {$fetch["aggressive_hp_pct"]} {$fetch["aggressive_sight"]} {$fetch["attack_range"]} {$fetch["drop_item"]} {$fetch["resurrection_vnum"]} {$fetch["enchant_curse"]} {$fetch["enchant_slow"]} {$fetch["enchant_poison"]} {$fetch["enchant_stun"]} {$fetch["enchant_critical"]} {$fetch["enchant_penetrate"]} {$fetch["resist_sword"]} {$fetch["resist_twohand"]} {$fetch["resist_dagger"]} {$fetch["resist_bell"]} {$fetch["resist_fan"]} {$fetch["resist_bow"]} {$fetch["resist_fire"]} {$fetch["resist_elect"]} {$fetch["resist_magic"]} {$fetch["resist_wind"]} {$fetch["resist_poison"]} {$fetch["dam_multiply"]} {$fetch["summon"]} {$fetch["drain_sp"]} {$mob_color} {$fetch["polymorph_item"]} {$fetch["skill_level0"]} {$fetch["skill_vnum0"]} {$fetch["skill_level1"]} {$fetch["skill_vnum1"]} {$fetch["skill_level2"]} {$fetch["skill_vnum2"]} {$fetch["skill_level3"]} {$fetch["skill_vnum3"]} {$fetch["skill_level4"]} {$fetch["skill_vnum4"]} {$fetch["sp_berserk"]} {$fetch["sp_stoneskin"]} {$fetch["sp_godspeed"]} {$fetch["sp_deathblow"]} {$fetch["sp_revive"]}n"; $write[2] .= "{$fetch["vnum"]} "{$fetch["name"]}" "{$rank}" "{$type}" "{$battletype}" {$fetch["level"]} {$fetch["size"]} {$ai_flag} {$fetch["mount_capacity"]} {$setRaceFlag} {$setImmuneFlag} {$fetch["empire"]} "{$fetch["folder"]}" {$fetch["on_click"]} {$fetch["st"]} {$fetch["dx"]} {$fetch["ht"]} {$fetch["iq"]} {$fetch["damage_min"]} {$fetch["damage_max"]} {$fetch["max_hp"]} {$fetch["regen_cycle"]} {$fetch["regen_percent"]} {$fetch["gold_min"]} {$fetch["gold_max"]} {$fetch["exp"]} {$fetch["def"]} {$fetch["attack_speed"]} {$fetch["move_speed"]} {$fetch["aggressive_hp_pct"]} {$fetch["aggressive_sight"]} {$fetch["attack_range"]} {$fetch["drop_item"]} {$fetch["resurrection_vnum"]} {$fetch["enchant_curse"]} {$fetch["enchant_slow"]} {$fetch["enchant_poison"]} {$fetch["enchant_stun"]} {$fetch["enchant_critical"]} {$fetch["enchant_penetrate"]} {$fetch["resist_sword"]} {$fetch["resist_twohand"]} {$fetch["resist_dagger"]} {$fetch["resist_bell"]} {$fetch["resist_fan"]} {$fetch["resist_bow"]} {$fetch["resist_fire"]} {$fetch["resist_elect"]} {$fetch["resist_magic"]} {$fetch["resist_wind"]} {$fetch["resist_poison"]} {$fetch["dam_multiply"]} {$fetch["summon"]} {$fetch["drain_sp"]} {$mob_color} {$fetch["polymorph_item"]} {$fetch["skill_level0"]} {$fetch["skill_vnum0"]} {$fetch["skill_level1"]} {$fetch["skill_vnum1"]} {$fetch["skill_level2"]} {$fetch["skill_vnum2"]} {$fetch["skill_level3"]} {$fetch["skill_vnum3"]} {$fetch["skill_level4"]} {$fetch["skill_vnum4"]} {$fetch["sp_berserk"]} {$fetch["sp_stoneskin"]} {$fetch["sp_godspeed"]} {$fetch["sp_deathblow"]} {$fetch["sp_revive"]}n"; } for($i=0;$i<2;$i++){ self::output(" -> A escrever {$config["mob_output"][$i]}...", "green"); self::write($config["mob_output"][$i], $write[$i]); } self::output("{$config["mob_proto_work"]} convertido com sucesso!", "green"); } } } Proto::start(); ?> cproto.sh ROOT=$PWD cd $ROOT/share/conf && php -a cproto.php $1 $2 Commands: sh cproto.sh mob sh cproto.sh item sh cproto.sh all If you have any item / wrong mob, might give you problems when you start the game, however it is a good way to know they have something wrong in your item / mob proto and correct. The most common errors are the sets of types / subtypes and limits of items.
    2 points
  12. M2 Download Center Download Here ( Internal ) Scan: [Hidden Content] Download: [Hidden Content] May this will help for someone understand (why is useless) how hackshield works and how to run it in metin2.
    2 points
  13. Download Metin2 Download or Google Drive Don't forget to enable the serverlist image in root/intrologin.py by setting the FULL_BACK_IMAGE variable to True.
    1 point
  14. M2 Download Center Download Here ( Internal ) Hello since i was looking for this system and it was "hard" to find it because Sanii's page is gone, i had to put it together taking bits of code from here and there. It is full with all the fixes and working with armor and weapon costumes. With this system you can assign an .mse file to a Vnum via 1 single .txt file It is a nice system so everyone should be able to use it. Only thing left is to adapt it for Sash's/Wing's if someone want's to do that i can post it here. Have fun.
    1 point
  15. M2 Download Center Download Here ( Internal ) Hello, Here is the translation of translate.lua file (about 95%) Language available (and tested): Missing language: Translate AIO + Quest GF
    1 point
  16. M2 Download Center Download Here ( Internal ) [Hidden Content] [Hidden Content] VT: [Hidden Content]
    1 point
  17. M2 Download Center Download Here ( Internal ) Conversation between me and vegas: [21:18:22] ####:: VegaS are you here? [21:18:31] VegaS™: Yes. [21:19:09] ####: Man, some people sell your title system what was public on tur****. [21:22:14] ####:: [Hidden Content] [21:22:22] ####:: Here is this shit what he sell. [21:28:33] ####:: Shit all resellers , dude . [21:34:50] VegaS™: There are many whores in this area, so best bet would be to post this system because some hookers make money from him unjustly. So send them harlots that vegas has big dick and that will fuck all in the ass. This system has a crappy code, you can keep the recycle bin, is the first version of shit. I apologize for what my clients who bought this system, but I'll make updates to it and will be more advanced. I can not enter metin2dev this time because my account is suspended for a short period of time, but I will return very soon, remember that. Why has reached this release online? Since titlesystem first version had over 35 buyers from title and I sold at all retarded. But now these latest systems and will not sell than some people you know for a long time and know 100% that they are not whores. Latest systems are stored for each client, I know 100% who I was because when you reach for resellers or free. And remember one thing: - I Will never sell any system or any other things for Romanian people, if someone tries to sell it or mean it's fucking scammer, and if u see Something scammer who sell my works, you can report this to me. Soon it ready new website, where there will be all new systems sales and presentations. ^^ Go on metin2dev and post system and send them the message that I told you. (sorry for my english) Download: [Hidden Content] Have fun, scammer ^^ #request close topic, so much spam xD
    1 point
  18. Reversed From 23.0.7.0 Client part is from 2018 Official Root Console Command; Increases camera's max distance, disables character/horse's collision [Hidden Content]
    1 point
  19. M2 Download Center Download Here ( Internal ) [Hidden Content] Video: Images: Client Side is from 2018 official root. Of course I've made minor changes for slot marking and cheque(if app. checks) You have to add slot marking too. Mysql used to retrieve data during game launch, and to backup(default 1 hour, you can change at conf.txt)
    1 point
  20. M2 Download Center Download Here ( Internal ) Hello guys.. So much people got problem with this system then i do FULL TuT exclusive for metin2dev All is tested and all works TuT included in all FILES.. New Link: Pass: When you find some bug post it here.. I will try to fix it.. Have Fun //EnZi EDITED: #New Link UPDATE cmd_general.cpp - Added some new code char_battle.cpp - Added some new code ProtoReader.cpp - Added some new code questlua_pc - Repaired code item_proto - Query for navicat Quest added UP LINK UPDATED fixed quest: [Hidden Content]
    1 point
  21. M2 Download Center Download Here ( Internal 1001 ) Download Here ( Internal 1000 ) Hey M2DEV Today i will show you my new tool! Open gr2 file, use double click for input or change path, press enter. After changes go to File->Save or Save as.. Update: 1.0.0.1 1. Detect and show File Granny Tag 2. Now you have the opportunity to choose the output version Granny. [Hidden Content]
    1 point
  22. UPDATE: __BL_CLIP_MASK__ __BL_MOUSE_WHEEL_TOP_WINDOW__ __BL_SMOOTH_SCROLL__ Requirements: [Hidden Content] Note:
    1 point
  23. This is a video on how to use the tool. Is the tool in the video paid? I'm not sure right now, but there is another version of it. It's best to search for KingSora's tool; it's free and will accomplish your task. I'm not sure if it's allowed to post links from other forums here. EDIT M2-Koordinator: It is important that you back up your Atlas and review the structure before making any changes. If you encounter errors, try testing and learning multiple times. While there are tutorials available, they seem to have disappeared somehow.
    1 point
  24. Hello community, The values associated with movespeed are BYTE (255) by default, in this short guide I'll teach you how to change them to short (65535). Step by Step [Hidden Content]
    1 point
  25. M2 Download Center Download Here ( Internal ) Advanced Regen Editor I have worked in the past week on a new regen tool(made in C#-WPF) to make the life easier for the mappers/server owner between us. It is an advanced regen tool that includes all the basic functions + new ones such as: mob/group file viewer. Importing regen file. Remember information - Remember the last data entered such as direction, respawn time,count etc. Color Character by color(Mob-Red, Stone-Blue, Boss-turquoise, NPC-Belge, Group-Black). Add a character - Left click. Remove a character - right click on a character dot. Load MOB/Group information - select mob_names.txt/group.txt to view information on a data grid(shown on screen shots below). When choosing a group.txt make sure you have type field set on group. Ctrl Z Feature - Reverse action, that means that if you added a character it will be deleted and if you removed a character it will be added back. Separation of exported files - Files will be exported upon the type of the map character, if you had stone,boss and npc character then stone.txt,boss.txt and npc.txt will be generated. If you find any bugs, please reply here with the bug information in specific details. Please Like this thread if you find my tool useful! Ⓒ Metin2 Guild Wars. Version 1.0 Download Link: [Hidden Content] Update 06/10/2017: Zoom in/out feature has been added. View entities seperately feature has been added. Import regen bug has been fixed. Enjoy! Version 1.1 Download Link: [Hidden Content] Virustotal: [Hidden Content] Enjoy!!
    1 point
  26. Emoji in textline broken Fixed [Hidden Content]
    1 point
  27. M2 Download Center Download Here ( Internal ) Hi, I want to share a new "advanced" texture for manu today. I'm not a developer, I just changed the texture and I believe it's nice because I wanted to.
    1 point
  28. M2 Download Center Download Here ( Internal ) Hi there Devs, I have published a tutorial yesterday on a Hungarian forum, and I decided to share it here, too. So... I chose int type for the level variables (originally its unsigned char) because: its more than enough maximum level 2147483647 the damage done by the characters (and much more thing) is calculated via they levels, and the type of this variables is int This is why I recommend to use int type game/src char.cpp Search this: void CHARACTER::SetLevel(BYTE level) Then replace to this: void CHARACTER::SetLevel(int level) char.h Search this: void SetLevel(BYTE level); Then replace to this: void SetLevel(int level); Then search: BYTE level; (its under this: typedef struct character_point) And replace to this: int level; party.cpp Search this one: void CParty::P2PSetMemberLevel(DWORD pid, BYTE level) Then replace to this: void CParty::P2PSetMemberLevel(DWORD pid, int level) Then replace this: BYTE CParty::GetMemberMaxLevel() { BYTE bMax = 0; To this: int CParty::GetMemberMaxLevel() { int bMax = 0; Find this one: BYTE CParty::GetMemberMinLevel() { BYTE bMin = PLAYER_MAX_LEVEL_CONST; And replace to this: int CParty::GetMemberMinLevel() { int bMin = PLAYER_MAX_LEVEL_CONST; And then this: void CParty::RequestSetMemberLevel(DWORD pid, BYTE level) To this: void CParty::RequestSetMemberLevel(DWORD pid, int level) party.h Search this: BYTE bLevel; (its under typedef struct SMember) And replace to this: int bLevel; Then this ones: BYTE GetMemberMaxLevel(); BYTE GetMemberMinLevel(); To this: int GetMemberMaxLevel(); int GetMemberMinLevel(); And these: void RequestSetMemberLevel(DWORD pid, BYTE level); void P2PSetMemberLevel(DWORD pid, BYTE level); To: void RequestSetMemberLevel(DWORD pid, int level); void P2PSetMemberLevel(DWORD pid, int level); char_battle.cpp Find: struct FPartyTotaler { int total; And replace to: struct FPartyTotaler { long total; And this: struct FPartyDistributor { int total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, int total, DWORD iExp, int iMode) To this: struct FPartyDistributor { long total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, long total, DWORD iExp, int iMode) config.h Find this: extern BYTE PK_PROTECT_LEVEL; And replace to this: extern int PK_PROTECT_LEVEL; locale_service.cpp Change: BYTE PK_PROTECT_LEVEL To this: int PK_PROTECT_LEVEL constants.cpp Well, here you should decide how much is the maximum level you want. You should fill these tables with as much records, as the maximum level. (e.g if you want to have maximum level 300, you need to put 300 records to these tables) const DWORD exp_table_euckr[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_common[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_newcibn[PLAYER_EXP_TABLE_MAX + 1 ] const DWORD party_exp_distribute_table[PLAYER_MAX_LEVEL_CONST + 1] const int aiExpLossPercents[PLAYER_EXP_TABLE_MAX + 1] log.h Edit this: void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime); To this: void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime); log.cpp Replace this: void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime) To this: void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime) guild.h Replace this: typedef struct SGuildMemberPacketData { DWORD pid; BYTE grade; BYTE is_general; BYTE job; BYTE level; DWORD offer; BYTE name_flag; char name[CHARACTER_NAME_MAX_LEN+1]; } TGuildMemberPacketData; To this: typedef struct SGuildMemberPacketData { DWORD pid; BYTE byGrade; BYTE byIsGeneral; BYTE byJob; int byLevel; DWORD dwOffer; BYTE byNameFlag; } TGuildMemberPacketData; Then this: void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade); To this: void ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade); Then SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name); To this: SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name); And this: DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; BYTE level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy; To this: DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; int level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy; And then this: void LevelChange(DWORD pid, BYTE level); To this: void LevelChange(DWORD pid, int level); guild.cpp Find this: BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10); Replace to this: int level = (int)strtoul(row[4], (char**) NULL, 10); Then this: sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p", To this: sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p", Then replace the whole function: void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade) To this: void CGuild::ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.offer_exp = offer; cit->second.level = level; cit->second.grade = grade; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } } And replace this function too: void CGuild::LevelChange(DWORD pid, BYTE level) To this: void CGuild::LevelChange(DWORD pid, int level) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.level = level; TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = pid; gd_guild.offer = cit->second.offer_exp; gd_guild.grade = cit->second.grade; gd_guild.level = level; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); cit->second._dummy = 0; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } } Then this function: bool CGuild::OfferExp(LPCHARACTER ch, int amount) To this: bool CGuild::OfferExp(LPCHARACTER ch, int amount) { TGuildMemberContainer::iterator cit = m_member.find(ch->GetPlayerID()); if (cit == m_member.end()) return false; if (m_data.exp+amount < m_data.exp) return false; if (amount < 0) return false; if (ch->GetExp() < (DWORD) amount) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> Á¦°řÇĎ°íŔÚ ÇĎ´Â °ćÇčġ°ˇ ł˛Ŕş °ćÇčġş¸´Ů ¸ą˝Ŕ´Ď´Ů.")); return false; } if (ch->GetExp() - (DWORD) amount > ch->GetExp()) { sys_err("Wrong guild offer amount %d by %s[%u]", amount, ch->GetName(), ch->GetPlayerID()); return false; } ch->PointChange(POINT_EXP, -amount); TPacketGuildExpUpdate guild_exp; guild_exp.guild_id = GetID(); guild_exp.amount = amount / 100; db_clientdesc->DBPacket(HEADER_GD_GUILD_EXP_UPDATE, 0, &guild_exp, sizeof(guild_exp)); GuildPointChange(POINT_EXP, amount / 100, true); cit->second.offer_exp += amount / 100; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } SaveMember(ch->GetPlayerID()); TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = ch->GetPlayerID(); gd_guild.offer = cit->second.offer_exp; gd_guild.level = ch->GetLevel(); gd_guild.grade = cit->second.grade; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); return true; } And this function: void CGuild::SendListPacket(LPCHARACTER ch) To this: void CGuild::SendListPacket(LPCHARACTER ch) { /* List Packet Header Count (byte) [ ... name_flag 1 - Ŕ̸§Ŕ» ş¸ł»´ŔłÄ ľČş¸ł»´ŔłÄ name CHARACTER_NAME_MAX_LEN+1 ] * Count */ LPDESC d; if (!(d=ch->GetDesc())) return; TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData) * m_member.size(); pack.size += (CHARACTER_NAME_MAX_LEN + 1) * m_member.size(); TEMP_BUFFER buf; TGuildMemberPacketData mbData; buf.write(&pack,sizeof(pack)); char c[CHARACTER_NAME_MAX_LEN+1]; for (TGuildMemberContainer::iterator it = m_member.begin(); it != m_member.end(); ++it) { it->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = it->second.grade; mbData.byIsGeneral = it->second.is_general; mbData.byJob = it->second.job; mbData.byLevel = it->second.level; mbData.dwOffer = it->second.offer_exp; mbData.pid = it->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); strlcpy(c, it->second.name.c_str(), MIN(sizeof(c), it->second.name.length() + 1)); buf.write(c, CHARACTER_NAME_MAX_LEN+1 ); if ( test_server ) sys_log(0 ,"name %s job %d ", it->second.name.c_str(), it->second.job ); } d->Packet(buf.read_peek(), buf.size()); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { SendLoginPacket(ch, *it); } for (TGuildMemberP2POnlineContainer::iterator it = m_memberP2POnline.begin(); it != m_memberP2POnline.end(); ++it) { SendLoginPacket(ch, *it); } } Then this function: void CGuild::SendListOneToAll(DWORD pid) To this: void CGuild::SendListOneToAll(DWORD pid) { TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData); TGuildMemberPacketData mbData; char c[CHARACTER_NAME_MAX_LEN+1]; memset(c, 0, sizeof(c)); TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it!= m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (!d) continue; TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); cit->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; //buf.write(&(cit->second), sizeof(DWORD) * 3 +1); buf.write(&mbData, sizeof(TGuildMemberPacketData)); buf.write(cit->second.name.c_str(), cit->second.name.length()); buf.write(c, CHARACTER_NAME_MAX_LEN + 1 - cit->second.name.length()); d->Packet(buf.read_peek(), buf.size()); } } Then find this: SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name) And replace to this: SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name) common tables.h Find this: BYTE byLevel; Replace to this: int byLevel; Then this: BYTE level; To this: int level; And this: BYTE level; To this: int level; Then this: BYTE bLevel; (under typedef struct SPacketPartySetMemberLevel) To this: int bLevel; And then this: BYTE bLevel; (under typedef struct SPacketDGGuildMember) To this: int bLevel; lenght.h Then here set the maximum level: PLAYER_EXP_TABLE_MAX = 120, PLAYER_MAX_LEVEL_CONST = 120, db/src ClientManager.h Find this: struct TPartyInfo { BYTE bRole; BYTE bLevel; Replace to this: struct TPartyInfo { BYTE bRole; int bLevel; ClientManager.cpp Search this: pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE)); (its in the void CClientManager::SendPartyOnSetup(CPeer* pkPeer) function) and replace with this: pkPeer->Encode(&it_member->second.bLevel, sizeof(int)); ClientManagerPlayer.cpp Find this: "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d" Then replace to this: "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d" And find this: "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d" You will find it 2 times, replace both to this: "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d" client packet.h Find this: BYTE byLevel; Then replace to this: int byLevel; And this: BYTE byLevel; To this: int byLevel; PythonGuild.h Find this: BYTE byLevel; And replace to this: int byLevel; And finally, edit the level colum in the player table in the player database. Set its type from tinyint to smallint (or int, it depends how high is the maximum level) and expand its size to 3 (or higher). And then, here you are I also made a video while I made this, if you have free 42 minute, maybe worth to watch it (if you do, you are my guest for a beer (or something liquid :D)) [Hidden Content] If you have question(s)/problem(s)/remark(s), feel free to post it here, or send me a PM. Have a nice day, ~masodikbela
    1 point
  29. The client is freezing for a while(anywhere from a few ms to multiple seconds for slower PCs) when meeting a new NPC/enemy for the first time because that's when it registers, creates and loads the entity. Note: This is only a partial fix. Why is it partial? Because it only loads the static mobs and NPCs available in the map(npc, regen, boss, group and group_group), so it won't fix the problem for dynamic entities, like pets and mounts. It can be extended to load those as well, of course, but you'll have to take care of that on your own. Variant: A way of completely fixing this would be to create the instances and load their files after registering the path(in root->playerSettingModule->LoadGameNPC), BUT that would slow down the initial loading quite a bit, since it'll load ALL mobs/npcs/pets/mounts, even if most of them will never be used. There's advantages and drawbacks to both methods. Choose for yourself. Here's the link: [or] [Hidden Content] [or] [Hidden Content] Good luck! - Amun Edit: UPDATE 08/12/2022: 1. Refactored to use unordered_set from the beginning instead of creating a vector, then filtering unique entities by creating a set, and then moving them back to a vector. 2. Extended to load the full spectrum of entities(both static and dynamic), except for PC(which are loaded in loading phase), WARP, GOTO, and DOOR. They can be included by altering this block in char_manager.cpp: #ifdef ENABLE_ENTITY_PRELOADING //@Amun: or be specific, like if(ch->ispet, mount, whatever) if (!ch->IsPC() && !ch->IsGoto() && !ch->IsWarp() && !ch->IsDoor()) SECTREE_MANAGER::Instance().ExtendPreloadedEntitiesMap(lMapIndex, pkMob->m_table.dwVnum); #endif
    1 point
  30. Location: char_battle.cpp -> bool CHARACTER::Damage: Below: if (!GetSectree() || GetSectree()->IsAttr(GetX(), GetY(), ATTR_BANPK)) return false; Add: [Hidden Content] I've also linked the code to a game eventflag, so you can freely disable it by typing the following: And in the regen [data/dungeon/dragon_lair.txt]: r 170 160 15 15 0 0 150s 5000 1 8001 r 190 180 15 15 0 0 150s 5000 1 8001 r 170 160 15 15 0 0 150s 5000 1 8001 r 190 180 15 15 0 0 150s 5000 1 8001 r 170 160 15 15 0 0 150s 5000 1 8001 r 190 180 15 15 0 0 150s 5000 1 8001 r 170 160 15 15 0 0 150s 5000 1 8001 r 190 180 15 15 0 0 150s 5000 1 8001 HF.
    1 point
  31. I found it! Take it bro [Hidden Content] , i scan it for viruses is safe. Thank you!
    1 point
  32. M2 Download Center Download Here ( Internal ) Daily Event Winter will come in days so what do you think about daily(or in chosen day) event with Grinch?. Before Grinch spawn game will send 4 notices about time of spawn. After kill daily boss(Grinch in package with map) game will send announcement with info about player who made last hit and kill Grinch. Every participants on this map after kill Grinch will get VIP bonuses for chosen time. Every settings like spawn time, announcement time are easy configurable. If you want fix small bug with displaying time please change this line like bellow: change: ["ANNOUCEMENT_LINE_3"] = "TODAY! About %d:%d he will be on Daily Boss Map."; for: ["ANNOUCEMENT_LINE_3"] = "TODAY! About %02d:%02d he will be on Daily Boss Map."; Announcement and spawn conf: Time in quest dialogs are imported directly from settings in game. If you will set this event only in one day of week then Quest Scroll will hidden in other days. You can simple disable VIP bonuses if you want only drop reward. If you want it only in one day then simply change const value and choose own day. Download & Scan [Hidden Content] [Hidden Content]
    1 point
  33. M2 Download Center Download Here ( Internal ) Hello, As said in the title, here are the Granny 2.11.8 Exporters for 3ds Max 2018. I'm still trying to find for Maya, but for the time being I only have this. Download: [Hidden Content] VirusTotal: [Hidden Content] The installation is really obvious as of I won't give any support, it's just drag and drop in the installation folder. I'll also don't provide any 3ds Max 2018 download link, as it's still available on Autodesk website, just buy it, use education account or crack it. This might also not be very useful for some 3D Artists since it needs the client to also have Granny 2.11.8 (normal clients use 2.4 and almost everyone already use 2.9, to upgrade to 2.11.8 is just upgrade the lib, header file and dll). Credits: Found it on some Arabic forum non-metin2 related.
    1 point
  34. New version is out: 2.4.1 Changed: Changed how database connection work and queries were executed. Added: New option to enable/disable the page Header and Footer templates. New page for when the connection to the database has failed. (You can edit in: /template/default/offline.html) Timer to resend emails.(5min default, change in /vendor/init.php) Captcha verification in change password and email pages. Fixed: Fixed template path when the CMS were used in subfolders. Github download link: [Hidden Content]
    1 point
  35. M2 Download Center Download Here ( Internal ) Download And bell fan, more
    1 point
  36. M2 Download Center Download Here ( Internal ) This guide will walk you through each step of installing the necessary daemons for a Metin2 server on FreeBSD. Asking for help setting up Metin2 on the official FreeBSD forums is not permitted, I suggest if you have issues to ask in this forum only. You may not need to install cURL, it depends on whether or not you'll host your website on the same server and use things that require cURL (such as automatic paypal transactions). It's recommended to host your website on a separate web server and not share the IP with anyone then run it through CloudFlare. A guide will be posted soon in these forums on how to run your website through CloudFlare while preventing CloudFlare IP resolvers from functioning. However, if you do run your website on another server I would recommend hosting it in the same datacenter because you'll need to use Remote MYSQL to access your database. - For sake of simplicity I'll be using "ee editor" for this guide. Most new people don't like vi anyway. If you're already familiar with vi, feel free to use that to edit text inside files instead. - To transfer files to and from your server, use WinSCP. - To enter commands into your server, use PuTTy. Please note that when the system asks you for a password in PuTTy you won't see it as you type it on the screen, be precise! - Pressing the TAB key in PuTTy will auto-complete as much as possible in the directory you're in. Downloads Libs: [Hidden Content] 1. Updating Ports portsnap fetch extract portsnap update 2. Installing Python 2.7 cd /usr/ports/lang/python27 make -DBATCH install clean pro tip: Use the "-DBATCH" flag for a default installation of the port. Skip all those annoying prompts during installation. 3. Standard C++ Libraries fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.1-RELEASE/lib32.txz tar Jxpvf lib32.txz -C / rm lib32.txz Unrar "Libs.rar" and put the files in the "/usr/lib32" directory. 4. Compat7x Because Metin2 was originally meant to be run on FreeBSD 7, we need this so that it's compatible with FreeBSD 9. cd /usr/ports/misc/compat7x && make -DBATCH install clean pkg_add -r compat7x-amd64 5. Install & Configure MySQL 5.6 server cd /usr/ports/databases/mysql56-server make BUILD_OPTIMIZED=yes BUILD_STATIC=yes make WITH_XCHARSET=all install clean Now we make it start on each startup of the system. ee /etc/rc.conf Add a new line: mysql_enable="YES" Press ESC then save and close the file. service mysql-server start /usr/local/bin/mysqladmin -uroot password 'enterpassword' pro tip: "enterpassword" should be the password you choose, don't use "enterpassword" as your password. A long string of lower case and capital letters and numbers is the safest bet. Don't use words that can be found in a dictionary. Don't use passwords which are the same as other passwords of yours. You may not need to do this, but when I got an OVH server it messed up the installation of mysql (on 9.2). If you get an error about the mysql user account with the step above, just do this: pwd_mkdb -p /etc/master.passwd chown -R mysql /var/db/mysql && chgrp -R mysql /var/db/mysql Then repeat the step. 6. Adding your server files and Metin2 Database Extract your game.tar.gz containing all the Metin2 server files somewhere in your server. This is all you have to do to extract a .tar.gz file: tar -zxvf filename.tar.gz You should have your metin2 database inside of a tarball (.tar.gz file). For structure, it doesn't really matter as long as once you extract your tarball on your server it follows this file hierarchy: Now you should change the group and ownership of some files for your database: service mysql-server stop chown -R mysql /var/db/mysql && chgrp -R mysql /var/db/mysql service mysql-server start Setup an account for you to login to the database via Navicat and an account for your game cores to interact with your database using. For this example I'll use the username "rumor" for my account and "metin2" for the game core's account. Every password in this example will be "password" but please DO NOT use this as your password! If you have a static IP address and wish to restrict access to the database only to your IP, change the "%" sign to your IP. The "%" sign indicates that any IP address is allowed to connect to the database using the specified credentials. mysql -p Now enter the password you set with mysqladmin earlier... and you will see this prompt: mysql> This is where we set the actual permissions for the accounts up. GRANT ALL PRIVILEGES ON *.* TO 'rumor'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'metin2'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; quit pro tip: remember (or write down) this information because you will need it later. Setup your CONFIG files under each channel folder and the "auth" folder. All of these are found inside the Metin2 server files. PLAYER_SQL: localhost metin2 password player COMMON_SQL: localhost metin2 password common LOG_SQL: localhost metin2 password log The conf.txt file looks a little bit different and it's found in the "db" folder of your Metin2 server files. SQL_ACCOUNT = "localhost account metin2 password 0" SQL_PLAYER = "localhost player metin2 password 0" SQL_COMMON = "localhost common metin2 password 0" SQL_HOTBACKUP = "localhost hotbackup metin2 password 0" ~~~~ STOP HERE IF YOU'RE RUNNING YOUR WEB SERVER SOMEWHERE ELSE ~~~~ 7. Setting up web server for website and/or patcher Install nginx: cd /usr/ports/www/nginx make install clean Make sure these are selected with space bar: [X] HTTP_MODULE Enable HTTP module [X] HTTP_ADDITION_MODULE Enable http_addition module [X] HTTP_CACHE_MODULE Enable http_cache module [X] HTTP_GEOIP_MODULE Enable http_geoip module [X] HTTP_GZIP_STATIC_MODULE Enable http_gzip_static module [X] HTTP_IMAGE_FILTER_MODULE Enable http_image_filter module [x] HTTP_PERL_MODULE Enable http_perl module [X] HTTP_REALIP_MODULE Enable http_realip module [X] HTTP_REWRITE_MODULE Enable http_rewrite module [X] HTTP_STATUS_MODULE Enable http_stub_status module Press "Enter" when ready to continue. Install libtool cd /usr/ports/devel/libtool make install clean Install php5 cd /usr/ports/lang/php5 make config Make sure the following is selected with space bar then press "Enter": [X] FPM Build FPM version (experimental) Leave everything else default. then do this: make install clean ~~~~ If you need cURL support then do this, if not then skip this step: cd /usr/ports/lang/php5-extensions make config Make sure that the "CURL Support" is selected then press "Enter". Then do the installation and clean the directory: make -DBATCH install clean ~~~~ Time to configure your php.ini file... cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini Edit /usr/local/etc/php.ini in WinSCP using Notepad++. Firstly, set your "date.timezone" to the appropriate one. Choose from this list: [Hidden Content] Next, if you have something that needs to run large MYSQL queries you may run into some issues. Some website packages also can cause these problems. The issue is with memory usage. For security reasons there are limitations set on how much memory php is allowed to use. I suggest only modifying this IF you have problems loading memory-intensive pages. Just try to raise it a bit until it works, don't raise it to an excessively high number. I had to set mine to "512M" to make my queries work in my patcher. It can be set by just inputting numbers and they will be recognized as bytes, or you could use K, M, or G. memory_limit = 512M Installation of php-mysql5: cd /usr/ports/databases/php5-mysql make -DBATCH install clean If you've gotten this far, congratulations.. you're almost done! You need to create a folder for your website like this: mkdir /usr/local/www/nginx/domain.com Set the owner and permissions: chown www:www /usr/local/www/nginx/domain.com chmod 755 /usr/local/www/nginx/domain.com Customize this file to your needs and upload it to /usr/local/etc/nginx: If you're using cloudflare, uncomment the lines 38-57 by removing the "#". The reason for this is to ensure you get the real user IP in your logs rather than cloudflare's IP. If you want to allow directory listing.. ie: [url=[Hidden Content] to present a visitor with a list of files they can access/download then uncomment lines 63 and 73. You MUST change the domain name to your own! Now you need to enable startup of php-fpm and nginx whenever your server is booted: ee /etc/rc.conf Add these lines: php_fpm_enable="YES" nginx_enable="YES" Start your services: service php-fpm start service nginx start Upload your website files to /usr/local/www/nginx/domain.com
    1 point
  37. M2 Download Center Download Here ( Internal ) Hi, Im releasing my metin2 cms. Reason: few people made refund after paying me on paypal (i'm not using this stupid system for selling stuffs anymore) Features: Almost everything customizable in administration - no programming knowledge required Highly secured (CMS is using PDO driver instead of mysql_ function, bruteforce protection, anti flood protection) Responsive template (bootstrap) Almost every user actions on web are logged You can choose if you want to use classic php email function or SMTP server Built-in ticket system Referral system Coupons Itemshop - you can enable discount action, let users change quantity of item, add normal item / premium Easy to translate language (all strings are in 1 file) SEO friendly links (yoursite.com/team instead of yoursite.com?page=team) Automatic paypal payment script, paysafecard and amazon code payment scripts And many others... (see screenshots) Screenshots: [Hidden Content] I didn't implement installation script, so you must install it manually (tutorial in readme.txt) If you like my CMS, you can donate me on paypal - [Hidden Content] Don't remove my copyright, please. Download link: [Hidden Content] Scan: [Hidden Content] EDIT: Bugfix 1 - Rename file "inc/classes/securimage.class.php" to "Securimage.class.php" (first letter need to be uppercase)
    1 point
  38. Place this to season1/interface/oxevent and you can repack it with Eternexus: [Hidden Content]
    1 point
  39. You can, just not with Eternexus. Eternexus have some drawnbacks like it can extract only type0-1, and only latin characters in file name (= it can't extract property/season_x for example). A1 was packed with other, unsupported type by Ymir. For such files you can use the older Tim extractor. Download Here's the A1 unpacked: Download You can repack it with eternexus since it does not have any non-latin character.
    1 point
  40. M2 Download Center Download Here ( Internal ) Download Password: fuckspanishdev Hi guys, what happen to me in these days i was thinking to post a one of exclusive design that was made for my server in 2018 so i never used it i hope it would help. Important: is just a PSD file not a code if someone like to code it would be great Preview: Download Link
    1 point
  41. M2 Download Center Download Here ( Internal ) Download Here Useful to create in-game renders
    1 point
  42. @ASIKOO [Hidden Content]
    1 point
  43. M2 Download Center Download Here ( Internal ) /* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp * ---------------------------------------------------------------------------- */ Download: [Hidden Content] Virustotal: [Hidden Content]
    1 point
  44. M2 Download Center Download Here ( Internal ) Hello guys, I give you a new Npc "hunter girl" and if you like I'll be happy for like Download:
    1 point
  45. M2 Download Center Download Here ( Internal ) Hello guys, Today i have new model (Death guard) you can add it in Tower of demons. Download : Mega download Scan Virus : Virustotal
    1 point
  46. The post devil.dll was wrong for me too, look for another version. try this: [Hidden Content]
    1 point
  47. M2 Download Center Download Here ( Internal ) Lets skip all the boring part, this is my first map created with we so dont be too harsh DL: [Hidden Content]
    1 point
  48. M2 Download Center Download Here ( Internal ) Hello, some time ago I was selling a complete interface of Metin2 which I designed for a project in which it was closed. I sold it but as it was not my own idea, I propose to publish it free and thus not make money at the expense of the idea of another. I send the money back to those people that bought it from me. The original idea is from Evil-s, I just took the images from his web page design and trimmed them to my liking, I designed some elements from zero, but the idea and the textures are of him. I recommend buying his work which is much higher quality than mine and very cheap for what it is. It takes me a long time to design all this, even if it is not my idea or my textures, but it does not do me any good to have it for me without giving it any use, and I will not sell it for what I said before, so I hope you guys give it a good one use. Web page concept Login concept Select Character concept Create character concept Flags for select kingdom concept Autopatcher concept First concept of the user interface ingame Second concept of the user interface ingame The interface has some graphic mistakes, but i cant fix them all cause i need to see them ingame. Dont delete the layer that says "Curvas" and "Brillo" from the psd, its important. There are just the PSD archives, if you have Photoshop, extract the images, if you know python, implement the images on the metin2 client . This thread its for avanced users that know how to code a new interface, its not just dowload and install. If you guys have luck, someone will do the code and then sell it or just release it. Download Credits: Evil-s Edited by: LovePlay, with the help of SeMa, Shang, Paci and R1Z
    1 point
  49. Very nice but download not work
    1 point
×
×
  • 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.