Leaderboard


Popular Content

Showing most liked content since 01/24/2017 in all areas

  1. 20 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 *** I am absolutely not responsible for you replacing your core with a Beta-revision. This is clearly undergoing development and had not enough testing to be labeled as stable. Please do not use it in production envirionments unless you're sure what you're doing (and even so it's madness). It's meant for testing purpose. Our main goal is to achieve a stable core. As soon as patches come in, I'll tidy up the patchlog. 1.) 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! * revisioned the unique class and added a ton of possibilities to it! More down below! + Added the functionality to create unique-groups + Temp-Variables for quests * upgraded all libs and 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! * Revisioned the Makefiles and gave the source a new, easier structure * Removed all external dependencies - you won't need them, just install them by ports. No External-folder necessary! * Partial implementation of the wolfman (claws etc. are added, needs review) - removed boost dependency (no boost lib needed yay) 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! 2.) What needs testing? There is a lot of stuff to test! In this earlier BETA-stage I won't give out the source code. I will do so once I've made sure the core runs well enough to be released in public. Though 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. 3.) 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. The 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. Download: Here Download (source code): Here Password for both archives is: vanilla 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 Best Regards Vanilla
  2. 11 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
  3. 8 likes
    Congratulations to the following winners: @Adrian2 @Crystal™ @Magickid @Lufbert @DiviDi @mogulul @galet @flatik @Legend @MrLibya @DarkFire
  4. 5 likes
    Hey, guys I was working on a new interface, and I wanted to know what do you think about this method of changing the channels.
  5. 5 likes
    Here u go for it: https://mega.nz/#!DMZXhBqb!0wNpKJkSv3HbDFflB76pmx4AuZ2h8rgMsKuD-7i6cxE Unpacked by Raicon (thx) This file just contains the metin2_patch_10th
  6. 4 likes
    Hello guys, a friend learned me how to use World Editor and gave me some objects (not used here ). This is my first map ever made. Can you rate this ? (1-10) 1- metin2 oficial maps , 10 - metin2 global maps The map it`s not ready, is just the town ready. If i`ll finish it , i will put it on download. This map may be a kind of map1 map , but different. (too much map in this sentece) PS : I`m glad if someone of you may give me some free objects. And sorry for my english [OLD] - v1.0 -> 1-3% of the whole map [Latest] - v2.0 -> 40-45% of the whole map
  7. 4 likes
    Catch the repaired model, animations now work properly on the model. I edited the mesh, and I corrected a rigging in many places (the hook-up model of the bone). https://mega.nz/#!r4FniRTA!g2C2KgVbdjNIJ4yBLV5_kkl_1OlQ4iRzpyIZag1TEWo   scan In the photo I marked more visible fixes:
  8. 4 likes
    Hi! I found some old files from 2013-2014, this edited ymir mushrooms was there. I took original ymir mushroom and just added some bones and made simply animations. I made it in more textures. You need new granny! (2,9+) Enjoy Mushroom metin.rar
  9. 4 likes
    Hi, I'v been working on a small tool since last week that helps,make it faster and easier to modify & add new item names/icons into item_names/item_list files. It is now finished, and i'd like to share it with the community and get feedback from you for any bugs you have encountered. What can you do with this program? Add item name record into item_name(example screen shot below). Add item record into item_list(example screen shot below). Save logs of every action made. Once insert item button has been clicked,it has a check if an item vnum already exist, if so, nothing happens. ** By having a log file that stores info of every of your action by the tool, you can track your last changes with the exact date and time. this is pretty useful i can say. Example of inserting new item name: Example of inserting new item icon: Log file: ############################ Author: © Metin2 Factory Date: 09/02/2017 ############################ This application will allow you to easily add new item names/icons. How to use: 1.Open the file metin2_file_editor.exe 2.Click on browse and select one of the following files: a.item_names.txt b.item_list.txt Type the vnum of the new item and fill the rest of the fields. Enjoy! Please, like this topic if you find it useful. Metin2 File Editor.rar
  10. 4 likes
    clang-devel should be installed just via ports. It should work in FreeBSD < 10. c++14 needs the newer clang version. If you're on one of the older compilers like gcc 4.2 it most likely won't work. Also you need devel/libc++ and devel/libcxxrt To build you then only need security/googletest, security/cryptopp, graphics/devil (only jpg needed, all else is not needed), devel/gmake, devel/makedepend and database/mariadb101-client (or any other mysql client for the lib). These are all the dependencies. I've gathered them together into a list. Note that every additional port should be compiled with clang instead of gcc! You cannot use gcc-compiled libs in a clang-project. First install: - lang/clang-devel (you don't need to use the devel-version of clang, you can just install one of the most recent versions) - devel/libc++ - devel/libcxxrt - devel/gmake (should already be installed by one of the ports above) - devel/makedepend And then add the following to /etc/make.conf: CC = clang-devel CPP = clang-cpp-devel CXX = clang++-devel CFLAGS += -stdlib=libc++ After that you can start installing the dependencies: - security/googletest - security/cryptopp - graphics/devil (note: Only jpg needed) - databases/mariadb101-client (no server needed, only the client. You can also use mysql if you wish to, we only need the client lib) If everything is installed, make sure you rebuild the Depend-File. For this you can just cd into the source directory and remove it. Then you can just execute the following command: gmake depend After that you'll have everything you need. You can build the sources. gmake debug|release|all Note that you can either choose to compile debug, release or all. You can also use install if you specified a path in your Makefile. This way the created binary will be pushed into a directory once it's finished.
  11. 3 likes
    quest get_skill_group begin state start begin when login or levelup with pc.get_level() >= 5 and pc.get_skill_group() == 0 begin send_letter("Choose your path"); end -- when when button or info with pc.get_level() >= 5 and pc.get_skill_group() == 0 begin local ways_per_job = { [0] = {"Body", "Mental"}, [1] = {"Blade-Fight", "Archery"}, [2] = {"Weaponry", "Black Magic"}, [3] = {"Dragon Force", "Healing Force"} }; say_title("Choose your path:[ENTER]") say(string.format("Congratulazions %s,", pc.get_name())) say("you've reached level 5, this means you are now") say("able to obtain access to tour hidden skills.[ENTER]") say("Choose the path you want to take:[ENTER]") table.insert(ways_per_job[pc.get_job()], "No, I'll choose later."); local skill_select = select_table(ways_per_job[pc.get_job()]); if (skill_select ~= table.getn(ways_per_job)) then say_title("Choose your path:[ENTER]") say(string.format("You've selected %s.", ways_per_job[pc.get_job()][skill_select])) say("Are you sure of it?[ENTER]") if (select("Yes, I'm sure of it.", "No, I'll choose later.") == 1) then pc.set_skill_group(skill_select); pc.clear_skill(); else send_letter("Choose your path"); end -- if/else else send_letter("Choose your path"); end -- if/else end -- when end -- state end -- quest
  12. 3 likes
    https://mega.nz/#!mNBhERhC!Cw5ewv6ncfp7aj2hijvDq7oEzZ8AGeYsNRfefVhSEcI I didn't follow the new patchfiles, so this is the whole pack folder unpacked.
  13. 3 likes
    Hi all, In this “how to” I’m explaining to you what is a cluster, why it’s important and how to applicate to Metin2 server to grant High Availability. If you grant the High Availability correctly, you will have a very high uptime, very close to 100% and you can make maintenance safely, without taking the game offline for more than 5 minutes. High Availability A good service need to be always available for users. There is no excuse; in any case, your application must be always available and fully functional for your users. Manteinance, human errors, force majeure, hardware and software problems must not include a disservice, called “downtime”. So, you will need to ensure that your services are High Availability. Today, there are a lot of ways to make an application “High Available”, and it’s not necessary to pay a lot. To deepen the discussion, read the corresponding wikipedia page https://en.wikipedia.org/wiki/High_availability Cluster To make your service High Available, you’ll need to put your applications on a cluster. A cluster is a group of systems that do the same thing. This is necessary to always have at least a working system, if another fails. So you need to create at least 2 machines with the same data and software, synchronized between them, with the appropriate software and techniques. To deepen the discussion, read the corresponding wikipedia page https://en.wikipedia.org/wiki/Computer_cluster So, for which application I need a cluster? To run a Metin2 server, you will need a webhost for your website, a patch server for your client updates, a mysql server (Oracle MySQL, MariaDB, Percona) and a Metin2 game server. All of this servers could be clustered. For webhost, patch server (similar to webhost, but only with the webserver like apache or nginx) and MySQL server you will find a lot of type of cluster and many guide to implement it. Choose what you prefer. The best type of cluster for that servers are Active-Active balanced cluster: This picture explain how to made an Active-Active balanced cluster for webhost, patch server but also for MySQL server, with multi-master replication. So, you need 2 or more machine for MySQL, webhost and patch server, 2 load balancer (or a cheapest DNS balancer) and a failover IP or failover dns. With this configuration, customers or applications will connect to your active load balancer (pointed by a failover IP or domain name) that divides traffic into each node of cluster. This is a double advantage: you can increase the performance and the availability. When you need shutdown a node, or just a problem, you will have another node ready, without disservice and without any manual change. While, when you have all the node up&running, you can use the power of each node in the same time. Webhost & patch server Webhost and patch server are easy to configure: you need only to configure the filesystem replication on each machine. You need only the document root syncronized for each machines and point your domain to your load balancer. You can user the simple rsync, a NFS server (obligatorily in HA MySQL For MySQL, it’s a little bit complicated. The data in the databases are changed very frequently and must be accessible in the same ways for each node. So you need a special cluster created specially for your RDBMS. Each RDBMS have its cluster software. All of this RDBMS is compatible with Metin2 game server (mysql or mysql fork): Oracle MySQL: the original MySQL RDBMS bought by Oracle some years ago. The cluster software (distributed by Oracle) is called MySQL Cluster MariaDB: A fork of MySQL created by the original developers of MySQL, before the acquisition by Oracle. Its cluster software is Galera Cluster. Galera cluster is installed by default from MariaDB 10.1. Check this guide to install MariaDB: Install MariaDB instead MySQL Percona for MySQL: replacement of MySQL with better performance. Use XtraDB instead old InnoDB for storage engine. Its cluster software is Percona XtraDB cluster With those multi-master replication, you can connect your application (website, game server) on a load balancer and take advantage of multiple MySQL servers. Metin2 game server Now you are ready to configure your metin2 game server cluster. After configured MySQL cluster server, and connected correctly to your webhost and game server, you have to find a technique to maintain your server files updated from your changes and guild flags (mark). For metin2, we can’t create an Active-Active balanced cluster, like webhost or mysql. We need to create an active-passive cluster, because all players need to be connected on the same host, for a limitation of Metin2. So there will be only one active node, that they will use your users, and one or more passive node, started but unreachable from player. In this configuration you can’t balance the traffic, but in case of DDoS, you can switch to the secondary node (that become active) and continue the service. Be careful! This is not a method to block DDoS attacks! Choose a good DDoS protection. To sync your file server, I suggest you to use rsync. It’s easy to configure and light. Configure at crontab an rsync command to copy personalized guild flags on mark directory for each node of cluster. In this case, you don’t need to use the --delete option. For the remaining part of fileserver, it’s sufficient to add on your administration panel a function that sync your changes on other nodes. Use rsync with --delete option and be sure to make a sync every time you make a change. After resync, it could be necessary to restart game server on passive node first (to check if there are some problem and to prepare the node for switch), and nextly, after a graceful shutdown from game, you can restart your active game server to apply the changes. Be careful when you create rsync command and when you use it. If you use --delete option, you could erase some important data. When you create the rsync command, choose the correct options and exclude files that you don’t need to sync, like logs, pid etc. The last things is to manage the switch automatically and also manually. The cheapest and easiest way is to buy a failover dns service, that switch automatically the assignment of domain name to active game server IP. You can use DynDNS managed dns, DNS Made Easy Failover, Incapsula Load balancing/failover. This is the best final solution: This is only an example; you can personalize based on your competence, time and money. You can buy different VPS and load balancer, or you can take 2 (or more) dedicated server with an hypervisor to create much VM. To grant the best of availability, you should assign Site 1 to a different datacenter than Site 2, if it’s possible on different city. Costs The High Availability could be more expensive than a single powerful machine, but it’s not properly true. With double servers you can permit to buy cheapest machines. So the price is not always doubled. Take load balancer from cloud provider or take DNS load balancer plan from DynDNS managed dns, DNS Made Easy Failover, Incapsula Load balancing/failover. You can also took webhost and patch server from a shared hosting provider, to save something. To help you to choose the best provider for your, visit this list: List of hosting providers for Metin2 Conclusion and tips This configuration could be difficult and more expensive to implement and maintain, but if you choose the best solution, you can optimize all, and pay the same that you pay before. It’s most important to configure correctly all the systems to optimize the machines and pay less. Find some expert to help you, and you could pay less and increase the quality. Create a test system. In this way, you can test all the thing on safely before commit on production. You can do software maintain for maximum of 5 minutes. Do the best for your users and you will be rewarded.
  14. 3 likes
    There you go, uiCharacter.py and characterwindow.py for you to compare with yours. characterwindow.py uicharacter.py
  15. 3 likes
  16. 3 likes
    I did not use the BSD-functions. I use c++ standards. Lots of stuff can be handled via std-lib. Since c++11 there's a lot of new features. For example I replaced the boost::unordered_map with std::unordered_map. This also ensures cross-compatibility since you can build libc also on unix-systems. Also the security issues were SQL injections most of the time. For example the auth-messenger. But it's not limited to sql injections since there also were a few things not coded correctly with which you'd possibly crash the core. Most of them is already public so nothing too new. @galet Clientside you can just change the pong like you want to. There's nothing needed, unless you want to change the pong via config files there too (which shouldn't be done). The reason I implement this on the source is for people who just want to change those things on-the-fly and maybe release a updated binary. Or you just want to have the possibilities without messing with the core. It's more simple, the client part should be done too of course but that's not one of those things I'd do. I think I'll write a guide on how to change the encryption, e. g. xtea to AES regarding the client. This way they everyone can implement those things in their own client.
  17. 3 likes
    I won't make a big project for the client. But I will do some few things like python 3.6 and I also will release a guide + source download for those things. But nothing like the core^^ Additionally I'm planning on gathering information for the next version of the core. Please share some feedback if you have and tell me what you'd like to see in the next revision. Few things I can already mention: - Option to switch compression algorithms. You'll be able to switch from lzo to lz4 and backwards by CONFIG - Option to switch encryption algorithms. You'll be able to switch from xtea to CAST-128 or AES and vice versa (does only work with enhanced security disabled) - Option to setup pong and other stuff via CONFIG. Of course some stuff does only work with enhanced security disabled. - Option to enable/disable custom MySQL-functions for passwords (so you can use e. g. salt for better security) - Ingame Elevation with a standard passphrase (enabled by default!) The next release focuses on stability and security. The goal is to add more diversity when it comes to encryptions and hardening your server. With custom passphrases and stuff you'll be able to switch to other implementations easily. Also the custom password functions will further protect the passwords even when an attacker gets insight on the database. Of course the core will also be able to use a custom phrase to further lengthen the password and making it more difficult for attackers to retrieve the original strings. Let me hear your thoughts EDIT: Btw. I tried to fix every bug that's been made public. But I'm not 100% sure I got everything. That's why I'm asking you kindly to revise the core and see if there's anything unstable before I brand it as a stable one. That's why It's called a BETA
  18. 2 likes
    I'm currently building a new itemshop (Web + ingame). What do you think of this and how is your opinion to my idea to use the client design of Metin2 for this? Video of the current state:
  19. 2 likes
    Hello ! 1. All elements in one file, the .sub fetch them, I don't know why they're using it, but back in 2004 (and a bit later), the icons used to have the same system. 2. I don't really know, I have the same question, probably for specificities... ? 3. Can't see any differences so far, I should do some tests but now, I don't know either... 4. Only used for screenshots (yup) as far as I know you can remove the whole lib and it's dependancies, then replace it using devil screenshot method instead. You're welcome
  20. 2 likes
    Aufm Pc gefunden. Serverside und Clientside Querys müsst ihr euch selbst erstellen. hf https://mega.nz/#!TtAUEBDY!p41uwe2pcpb-EmiINMh-cR87Uk2GNXgFyV-Rgt5N_iw
  21. 2 likes
    Hi, I'd like to share my client * client based on (2k10) with 40k binary * root is compatible with python 2.7 * client weight ~ 630MB * maps in two folders: outdoor and indoor * added many features (few needs source that i've included) Changelog: Screens: DOWNLOAD
  22. 2 likes
    Map 1 ( Pyungmoo / Joan / Yongan ) Screen Video Presentation ( Low quality ) https://www.youtube.com/watch?v=gdIyPHwReP0 Interested? ( Write on skype )
  23. 2 likes
  24. 2 likes
    I dont know if cluster will help.But maybe are to many calls to the same table.Spliting DB will help but i never did that. Check this topic :
  25. 2 likes
    I dont know about ur serverfiles but that mysql usage is very bad. Try add more ram.Clear logs. look mine :
  26. 2 likes
    « Unknown column 'bind' in 'field list' » you dont have field on database. Go design mode and add it
  27. 2 likes
    Happy new year (and a big thank you)! Do you guys remember 'the good old times'? I think of this time the forum had only 385 members. It was the time everything started - back in 2014. And now - approx. 3 years later - we're still there! We're still... THERE! Yes, you are right! We're still here! Now with 11.111 members - okay, maybe a bit more now, but we had these members at 16:32 GMT+1 today - we'll soon switch to year 2017. As a big 'Thank you!' to all of you and a New Year present we want to do a giveaway with all our members which were here in the last 3 years. Okay.. Also the newer ones will get their chance, but not everyone might be chosen for this... We will give away 11x VIP rank on this forum - all you need to do is to enter the giveaway on our small giveaway page. But please don't be upset if you don't understand the requirements - it's a mystery for us, too. We want to thank all of you for your confidence in us, for your loyalty, for your effort to make this a great place to be. We also want to wish all of you a Happy New Year and we hope we still see you in the next 3 years. This giveaway will be open until the 31th January 2017. You can take part on this page. Sincerely, metin2dev.org Administration ... and always remember: We are a community!
  28. 2 likes
    __________________________________________________________________________________________________________ DownloaD https://mega.nz/#!lEwEQQTC!oxpbafnREClOWYula2MWCfYZvSgsa4kvUaunInkaPUY ScaN https://www.virustotal.com/pl/file/3871bf1c7fdf52d047be2beb9b56c3c1c1aad1afec89b4c0ba53fdf285a120ce/analysis/1484219366/
  29. 2 likes
    Can you rate this gif pls ? ^^
  30. 2 likes
    https://up.harajgulf.com/do.php?id=1445249 download from here.
  31. 2 likes
    https://www.youtube.com/watch?v=cXSEjQ-j3wc&feature=youtu.be done
  32. 2 likes
    Download: www.lynx3d.tk
  33. 2 likes
  34. 2 likes
    Hello i made this for Koowlon2 server. Can you rate it ?
  35. 2 likes
  36. 2 likes
    Story: Over time I learned that the SetEvent function can cause weird problems in Metin2, maybe you have this bug or maybe not, I actually encountered this problem and found the fix. How to trigger the bug: 1. Use this quest for a test: quest test begin state start begin when 9003.chat."quest test" begin say("Hey we are doing a test here") local o = select("option 1","option 2") if o == 1 then return elseif o == 2 then return end end end end 2. Now you click on the NPC, choose "quest test" option and don't click on any option(1,2) 3. /transfer your_character with another GM account 4. The character who clicked on "quest test" option and didn't choose any of the sub-options (1 or 2 ) will now have an invisible stucked window on the center and can't click on the ground or click the area in the center of the screen(where the quest ui was before teleportation) How to fix it: 1. Go to uiQuest.py 2. In def MakeQuestion find the SetEvent functions and edit them as below: def MakeQuestion(self, n): global entire_questbutton_number global entire_questpage_number global cur_questpage_number entire_questpage_number = ((n-2)/7)+1 entire_questbutton_number = n if not self.board: return self.btnAnswer = [self.MakeEachButton(i) for i in xrange (n)] import localeInfo self.prevbutton = self.MakeNextPrevPageButton() self.prevbutton.SetPosition(self.sx+self.board.GetWidth()/2-164, self.board.GetHeight()/2-16) self.prevbutton.SetText(localeInfo.UI_PREVPAGE) #self.prevbutton.SetEvent(self.PrevQuestPageEvent, 1, n) # buggy self.prevbutton.SAFE_SetEvent(self.PrevQuestPageEvent, 1, n) # unbuggy self.nextbutton = self.MakeNextPrevPageButton() self.nextbutton.SetPosition(self.sx+self.board.GetWidth()/2+112, self.board.GetHeight()/2-16) self.nextbutton.SetText(localeInfo.UI_NEXTPAGE) #self.nextbutton.SetEvent(self.NextQuestPageEvent, 1, n) # buggy self.nextbutton.SAFE_SetEvent(self.NextQuestPageEvent, 1, n) # unbuggy if cur_questpage_number != 1: cur_questpage_number = 1 Note: After that you should check for other SetEvent functions (comment them and see if the bug still happens) Info: The bug has something to do with the function arguments Other locations where this bug caused problems: intrologin.py - can cause the arrow keys,enter,esc to not work in the select character phase
  37. 2 likes
    Hi everyone, In this thread I will show you how to use the compiled python files in the client. First of all we need to download Python 2.2 or 2.7 Python 2.2 download Python 2.7 download Let's start the tutorial: 1. Rename system.py to main.py or to anything you want, it doesn't matter. 2. Change these stuffs in main.py: Search for this: filename = name + '.py' Replace with this: filename = name + '.pyc' Search for this: newmodule = _process_result(compile(pack_file(filename,'r').read(),filename,'exec'),name) Replace with this: newmodule = _process_result(marshal.loads(pack_file(filename,'rb').read()[8:]),name) Search for this: RunMainScript("prototype.py") Replace with this: RunMainScript("prototype.pyc") 3. Create a new file called system.py 4. Copy this to system.py: import pack import imp import marshal data = pack.Get('main.pyc') if data == None: raise IOError, 'Error happened...' if data[:4] != imp.get_magic(): raise ImportError, 'Error happened...' exec marshal.loads(data[8:]) 5. Let's continue with the compiling. Download this file and put to the Python 2.2 or 2.7 folder. Create a new folder called files and put all .py files from the root and the main.py to the folder. Drop the downloaded Compiler.py to the python.exe and wait few seconds, now it will compile the files. After the compiling finished copy back the .pyc files to the root and delete the old .py files. 6. Copy the system.py to the root. (Example picture) 7. Pack the root.eix/epk If you have any question or suggestion please just reply to this topic. Kind Regards, Sanchez
  38. 2 likes
    I attach my signature, im not a professional designer, but i did my best. I didnt understand that about "Winter", but here it is. Size: 600x300 Here a image of the "¿.psd?" file. I hope more people try do this, i cant do something better because i dont know, but i want see great designs here!
  39. 2 likes
  40. 1 like
    Post here u locale_interface.txt and i Quote what are change ..
  41. 1 like
    dl (granny 2.9): https://mega.nz/#!O4dFgB7S!_GTf0Cta3nIV346iyI0x-J1LMz9DzE7RNWkiXtEA0Gk
  42. 1 like
    Hello Metin2Dev ! Thats a gift for all of you ! Review: DOWNLOAD HERE !
  43. 1 like
    I go through the topic without lengthening it. PİCTURES :::: DOWLOAD :::: ---- http://s9.dosya.tc/server/s0xy57/HeraDesign-ZIRH-SILAH.rar.html
  44. 1 like
    thanks for reply. i dont need mysql log anymore because i found what causes high usage of mysql. i used this query when i warp and when i close shop. select * from INFORMATION_SCHEMA.PROCESSLIST where db = 'player' i found that when i warp and when i close my shop there is a control on mysql and it causes high mysql usage. now i have to modify this code. thanks all for your help up to here. any idea how i modify this code? this code is: void CHARACTER::RefreshGift() { char szSockets[1024] = { '\0' }; char *tempSockets = szSockets; for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++) { tempSockets += sprintf(tempSockets, "socket%d", i); if (i<ITEM_SOCKET_MAX_NUM - 1) tempSockets += sprintf(tempSockets, ","); } char szAttrs[1024] = { '\0' }; char *tempAttrs = szAttrs; for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; i++) { if (i < 7) tempAttrs += sprintf(tempAttrs, "attrtype%d,attrvalue%d", i, i); else tempAttrs += sprintf(tempAttrs, "applytype%d,applyvalue%d", i - 7, i - 7); if (i<ITEM_ATTRIBUTE_MAX_NUM - 1) tempAttrs += sprintf(tempAttrs, ","); } #ifdef __CHANGE_LOOK_SYSTEM__ SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id,vnum,count,unix_timestamp(date_add),replace(reason,' ','_'),replace(`from`,' ','_'),%s,%s,dwLookVnum from player_gift where owner_id = %d and status = 'WAIT' ORDER BY date_add ", szSockets, szAttrs, GetPlayerID())); #else SQLMsg * pkMsg(DBManager::instance().DirectQuery("SELECT id,vnum,count,unix_timestamp(date_add),replace(reason,' ','_'),replace(`from`,' ','_'),%s,%s from player_gift where owner_id = %d and status = 'WAIT' ORDER BY date_add ", szSockets, szAttrs, GetPlayerID())); #endif SQLResult * pRes = pkMsg->Get(); m_mapGiftGrid.clear(); grid = M2_NEW CGrid(15, 8); grid->Clear(); int page = 1; if (pRes->uiNumRows>0) { AddGiftGrid(page); MYSQL_ROW row; while ((row = mysql_fetch_row(pRes->pSQLResult)) != NULL) { int col = 0; TGiftItem item; memset(&item, 0, sizeof(item)); str_to_number(item.id, row[col++]); str_to_number(item.vnum, row[col++]); str_to_number(item.count, row[col++]); str_to_number(item.dwDateAdd, row[col++]); strlcpy(item.szReason, row[col++], sizeof(item.szReason) - 1); strlcpy(item.szFrom, row[col++], sizeof(item.szFrom) - 1); for (int i = 0; i < ITEM_SOCKET_MAX_NUM; i++) str_to_number(item.alSockets[i], row[col++]); for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; i++) { str_to_number(item.aAttr[i].bType, row[col++]); str_to_number(item.aAttr[i].sValue, row[col++]); } #ifdef __CHANGE_LOOK_SYSTEM__ str_to_number(item.dwLookVnum, row[col++]); #endif const TItemTable * item_table = ITEM_MANAGER::instance().GetTable(item.vnum); if (!item_table) continue; int iPos = AddGiftGridItem( page, item_table->bSize); if (iPos < 0) { page++; grid->Clear(); iPos = AddGiftGridItem(page, item_table->bSize); if (iPos < 0) { sys_err("iPos <0"); break; } } item.pos = iPos; m_mapGiftGrid[page].push_back(item); } M2_DELETE(grid); } if(GetGiftPages()>0) ChatPacket(CHAT_TYPE_COMMAND, "gift_info %d", GetGiftPages()); } #endif
  45. 1 like
    https://mega.nz/#!DMZXhBqb!0wNpKJkSv3HbDFflB76pmx4AuZ2h8rgMsKuD-7i6cxE
  46. 1 like
    Thousands of thanx ! My respect for you!
  47. 1 like
    Thank you guys! We were kinda giving up as all of us were busy with university/working/personal stuff, but we decided to give another try and already redesigned some part of it. I can't say anything for sure yet but we are on the duty!
  48. 1 like
    Check your build process, if your metin2client is builded with v120_xp\x86 you have to build python with same options, if that dosen't work you should change the includes directory from Extern to the Python 2.7.13 folder
  49. 1 like
    Hi guys, i know you cant understand my language (the guys from germany 2 xD <3) but all what you have to know is: > I have a Gift for you Just look the Video and wait for the Download. If you like it so Like the Video, you can Subscribe if you wane see / more. Share it with your Friends, and have fun with the map Later <3 Ly It's a Littel gift, i hope you Like it. iAce,
  50. 1 like