Jump to content
metin2dev

Shogun

VIP
  • Content count

    1,208
  • Joined

  • Last visited

Everything posted by Shogun

  1. This thread is intended for requests of files which are not published in this forum already, with the exception of the official packs which have their own thread. Make sure you have used the search function before making your request and do not post your request twice.
  2. Hi guys, Since people are asking for a 34k client I have decided to release the World of Metin2 beta client from early last year. Many people have contributed to this release, namely the whole WoM team which as you may know is pretty big, but particularly Tim who created most of the scripts and the compiling stuff. Contents The package includes: bin folder: this is where you actually run the client. The client includes tim's granny 2.8 DLL and a .mix file that allows attacking on mounts made by Paylasici (DynamicPatcher.mix). Warning: metin2.bin may be identified by your antivirus as a threat. It's just packed with Themida. Why packed? because otherwise Tim's dll doesn't work. You will need to create the epk files first. A patch maker/uploader script is also included in this folder. data folder: the contents of the Eterpack archives, unpacked. Includes batch files to create the packs, an automatic XML generator (make_xml.py, configurable through make_xml.xml) and root/uiscript/locale pyc compiler. The data folders contain every official file (costumes pets etc) up to March 2013, and a few of our own. tools: includes FileArchiver, Tim's lz, and python22 (used by the compiling scripts). launcher: includes everything necessary to create your own official launcher Installation Unpack wherever you want Install Python2.7(if you don't have it already) and add your Python27 installation folder to the System Path Add the tools folder to the System Path Usage Edit the client to your liking and then run the appropiate make_*.bat file to compile the pack into the bin/pack folder. When done, make a copy of metin2.bin called metin2client.exe so you can test the client locally. Patch maker There is an official patch maker included under bin/make_patch.py configurable through Patch_config.txt, it will read an online crclist and a list of files / archives and create a zip file containing the updated archives (lz'ed) and the updated crclist. Syntax make_patch.py [-f filename] [-a packname] [-p patch (see PatchConfig.txt)] Example python make_patch.py -f pack/Index -a root -a uiscript -p patch_test Then you just need to upload this zip file to your patch root and unzip it. Regards World of Metin2 Client for metin2dev.org - Base.7z 95.9 MB https://mega.co.nz/#!WhpiVDBI!ipa7YoFKoo5Qnft7calTquWczM_WCScnyC3VQctUhNk World of Metin2 Client for metin2dev.org - Extra.7z 486.2 MB https://mega.co.nz/#!nhAV3RjY!e8ACrA-IwgwNk49vBAMBqa0ULf2tOZl5v8vcdLEpYZU
  3. To get the ball rolling on this forum, here is a real oldschool release, the original Metin2 client for the chinese Beta in 2004. download: https://mega.co.nz/#!IkZzDYhS!KXsSgEExVlcUzPF7bU03U7xrlXH1VPUMpGszXW1EJok
  4. The lost maps of Ymir

    Hi everyone, Today I bring you a collection of maps made by Ymir that were included at some point in an official client but were never used. The maps are: GM Guild Building Field Dungeon Ginseng Valley (b2) - Second version of Dragon Valley (Orcs area) Heavenly Valley (c2) - Third version of Dragon Valley (Orcs area) Dragon Timeattack 1 - Dungeon possibly used in Korea, used by SG for Dragon Timeattack event Dragon Timeattack 2 Dragon Timeattack 3 Test map - Actually a town EW02 - ? Guild Inside - Supposed to be the inside of a guild house Milgyo Pass & Sungzi - A collection of alternative maps for Nation War. Requires editing forked_road.txt in order to add them to this event. Siege - Three maps one for each kingdom, for a kingdom event You might also be interested in the Metin2 Korea Naga map available here The Lost maps of YMIR.zip 74.6 MB https://mega.co.nz/#!XtxVBSzZ!B3q_5Ol1VWgY5GxR4YkLHh8-89iLDrkMKZz_gYUG67k
  5. Since a new Ymir pack came out and there is no appropiate forum for this I open this thread so we can post the newest releases from our dear Ymir.
  6. Anti Exp Ring and Voodoo Armband

    Today I release two small quests made by me a long time ago. Goddess Doll The first is an anti-experience ring that prevents you from gaining exp from mobs when used. Using it again disables the effect. Be aware that the quest substracts the gained exp after it has been received so if the exp from a mob is enough to reach the next level, you will level up! quest exp_curse begin state start begin when 70210.use begin pc.setqf("lastexp",pc.get_exp()) syschat("You are under the curse of the goddess. You will gain no experience.") set_state(use) end end state use begin when 70210.use begin syschat("You lifted the curse of the goddess. You gain experience again.") set_state(start) end when login begin syschat("You are currently under the curse of the goddess and gain no experience.") end when kill or party_kill begin local current = pc.get_exp() local doll = pc.count_item(70210) if doll == 0 then syschat("The curse of the Goddess has lifted. You will gain Experience again.") set_state(start) end if current < pc.getqf("lastexp") then pc.setqf("lastexp",current) end if not npc.is_pc() then local dif = pc.get_exp()-pc.getqf("lastexp") pc.give_exp2(-dif) end end end end Voodoo Armband The Voodoo Armband is a fun item which lets you convert players into an ugly creature for a few minutes. quest polyplayer begin state start begin when 70111.use begin local start_count = pc.count_item(item.get_vnum()) -- to prevent usage of bugs only say_title("Voodoo Armband:") say("") say("Enter the name of the player you want to curse:") say("") local name = input() local vid = find_pc_by_name(name) if name == "" then return elseif name == pc.get_name() then say_title("Ring of Curse:") say("") say("You can not curse yourself.") say("") return elseif vid == 0 then say_title("Ring of Curse:") say("") say("This player is not online or does not exist.") say("") return elseif not pc.is_near_vid(vid, 50) then say_title("Ring of Curse:") say("") say("The player is too far away.") say("") return end if pc.count_item(item.get_vnum()) != start_count then return end local myvid = pc.select(vid) vnums = {2101, 20016, 20002, 11000, 5001, 992, 1301, 1303, 2191, 5161, 5162, 5163} i = number(1,12) pc.polymorph(vnums[i], 5*60) syschat("You have been cursed.") local victim = pc.get_name() pc.select(myvid) say_title("Voodoo Armband:") say("") say("The player "..victim.." is now cursed for 5 minutes.") say("") item.remove() end end end These items should be normally present in your client yet unused. If anybody needs I can post the item_proto entries etc.
  7. Dear community, Today I'd like to introduce a new toplist designed with the needs of the Metin2 server owners in mind: topmetin.org topmetin.org was created by a group of members of some of the biggest private servers and independent programmers and features an easily configurable language filter which lets you select up to 3 languages. English and your local language (if available) will be selected by default based on your IP geographical location. Another important feature which sets us appart from established contenders is Nocaptcha, the revolutionary recaptcha replacement which simplifies voting to the maximum. The ranked servers' websites are checked periodically to verify they are actually online (no more clicking on offline servers!). And last but not least, expert SEO techniques to drive the maximum traffic to your server. Of course, topmetin.org also features a Vote4Coins API and active admins who analyze the vote traffic to prevent abuse. But unlike other toplist projects which failed to make an impact in recent years, topmetin.org puts traffic first: Of course, the project counts also with admins which will control the vote flow to prevent abusing and answer any questions you have. Whether you have an upcoming project or an already established server, topmetin can help you gain new users. Sign up, set up a vote button or integrate our API: the choice is yours and all of them will increase your server's exposure. Schedule 19th February: advertised for the spanish community in metin2zone 27th Februray: advertised to the international community in metin2dev 1st March: advertised to the romanian community in freakplay 2nd March: advertised to the romanian community in just4metin Coming up: advertisement to the german, italian, polish community. Other countries will follow as we plan to support a good number of languages. There is no plan to monetize the toplist at the moment. Therefore there are no ads or premium accounts of any kind.
  8. Hi guys, Today I'm going to show you something very simple and effective that not many people do. By default, Metin2 graphics are like this. Notice the blurriness increasing as you move the camera position down: Close the game and open your graphics card control panel and in 3D Settings choose Anisotropic Filtering and 16x or whatever your card admits as maximum. You can lower it later if you suffer slow down: Blurriness is gone!
  9. Today I bring you another exclusive release from Tim. This time is the granny.dll compatible with Granny 2.8 models and new binaries. Included for completeness is the already public granny DLL for the old binaries, and the bulkconverter.exe tool. What can I do with this? You can use granny models from any Granny version up to 2.8 in your client. How do I use this? Just replace the original dll in your client. Please note, it only works on original, packed client binaries. A tool (bulkconverter.exe) is provided so you can easily convert your current models to 2.8 for best performance. Usage: bulkconverter foldername Will convert all the gr2 files found inside foldername to v2.8 Granny format. Regards granny28.zip
  10. In this forum you can find some of the biggest experts in Metin2 around the world. However, they don't work for you, so please be patient and don't bump your threads for an answer. They also didn't become experts by being spoonfed answers, so spend your time investigating your problem before asking others to do it. If you need extensive help, such as a quest written to your specs, you can find trustable paid services in the Services forum. State your problem as clearly as possible, include all related logs and error messages, and make sure you have searched in the forum and/or Google for an answer before opening a post.
  11. My latest ripped texture packs from TES: Oblivion. 512x512 size and ready to use in DDS format. Download https://mega.co.nz/#!d9hSELhT!30GtvVtMXv_epkgXLSmD_TZFAgU6mU-oPOdaW-tksRs
  12. Eterhost: your oppinion

    Hi everyone, I am starting soon a new hosting business with a couple of friends called Eterhost. Our idea is to sell ddos protected, managed vps for game servers and particularly Metin2 at an affordable price for The basic plan will offer: 1 core (AMD Opteron 4386) 4 GB RAM 150 GB Local Storage 20 GB Backup Storage 1 Gbps Bandwidth (Shared) VAC Pro DOS protection 2 IP addresses We can add to the features support which is familiar with both FreeBSD and Metin2. To get a better picture of the potential customers, I would like to ask you the following questions. I would appreciate if you spend a minute to answer them Are you considering changing your hosting provider at the moment? How much would you pay for such a system? Which payment methods do you prefer? Would you like to see any additional services offered? (Patch server for example) Thank you in advance!
  13. Speedtree 3 & 4

    Today I have some more goodies for mappers / modellers Speedtree is the software used by Metin2 to render trees and other kinds of vegetation. Many games such as Oblivion, Ragnarok 2, Gran Theft Auto IV... use Speedtree 4, while Metin2 uses the older Speedtree 3. It's possible to import Speedtree 4 models for Metin2 by loading and saving them with SpeedtreeCAD 3. A pic of the tool: In this pack you can find Speedtree CAD Lite 3 and Speedtree CAD 4 and their respective plugins for 3DSMAX. CAD http://ul.to/7tu5xyvm Plugins http://ul.to/76hxts40
  14. Hi guys, Running a server for a year and a half while a bunch of guys gets paid to destroy it by any means ends up giving you a good insight in what the word security really means. So, after being the target of almost every type of attack possible over the Internet, I think I am ready today to write a quick checklist on how your Metin2 server should be secured from criminal and disruptive behavior. I will divide it into several parts: ingame, website, server, staff. I will try to explain in brief how those attacks are executed, but the focus here is in how to defend from them effectively. I do not want this checklist to serve the purposes of hackers. But be aware; you are never 100% safe - it depends on how much your enemy is willing to work on it. So this should be taken as a bare minimum. And don't forget: the science of destruction evolves constantly. What is considered safe today, might not be so safe tomorrow. Disclaimer: This text reflects 5 years of experience managing a server's technical aspects. I do not do certain things (like quests) for a long time so excuse me for any mistakes I may be making here. Part 1 - Ingame bugs and exploits This part refers to threats that may realize through the game client or external software that acts through the game client. While often overlooked, sometimes these can be more dangerous to your server than any other type of attack. Keep an eye in your server's economy - the average price of items. If prices for a particular item or all of them change suddenly, there may be some obscure reason behind it. That is one of the reasons why we keep public and private statistics on the average market price of every item at WoM. One of the most common mistakes - and I commited this myself - when one wants to extensively edit everything is having an item give you more Yang when you NPC it than it costs to buy it from a shop. This gives unlimited Yang to whoever discovers it. There are even public bots which automate the process of buying and selling these items. The effect on the economy is devastating over a sufficient long period, not to mention that it's unfair that some people are infinitely rich and unbalance is never good for any MMORPG. Have your GM double check that no item can be sold for more than it costs. However, this is not the only way that a player can obtain access to unlimited resources. Badly written quests may allow players to obtain their rewards repeatedly by closing their clients while a quest dialog is open. One simple way to avoid this is to make sure that the commands which reward the player are the last in the code block before changing state. Now going into disruptive behaviour - the most annoying probably are the bugs which cause a server core to crash. The most famous is probably the number_ex bug. This causes several commands which depend on this function such as dice to be exploitable by using certain parameters. This bug is fixed in rev 40k and therefore in any game compiled from the source. If you are using 34k, the best you can do is use iMer's lib which provides several security enhancements. If you are using 2089, there are public diffs that patch this. Another bug exists in the war command in 34k and older which leads to a server crash. You cannot disable this command as it is used by the guild leaders to war other guilds. iMer's Lib takes care of this bug in 34k. Older and less known is the gold drop core crash bug present in 2089 and fixed -I believe- in 34k. Dropping huge amounts of gold or any other item which you can acquire in huge numbers in a map will cause the server to crash. I am not aware of public fixes for this exploit. Another favourite is the kickhack or sync position hack -partially fixed only in 40k- which allows a malicious user to disconnect other players at will. There are even videos of this being done in DE years ago. iMer's lib provides a fix for rev 34k. Finally, we have the long list of cheats which purely seek to gain advantage while playing. There are several client protection tutorials and services around this forum so I won't extend myself here about the subject. Part 2 - Server and OS Here we talk about the threats that affect your server and Operating System Part 2.1 Choosing and preparing your server There is no doubt at the moment of writing this that the french hosting company OVH provides the most cost-effective anti-ddos solution in the market. While many companies provide DDoS protection services, these cost several times as much as OVH offerings and this increase does not necessarily translate into a better protection. Therefore we will assume that you are renting either a dedicated server at OVH or a VPS at Eterhost as those are the ones I'm familiar with. Other providers or resellers may be configured in a different manner. Dedicated Server at OVH There are two flavors of the Anti-DDoS solution: Basic and Pro. Basic is free when renting a Kimsufi or Soyoustart server (cheap and intermediate OVH brands respectively). What it does is detect attacks directed at your IP address and route your traffic through the mitigation system during the attack. This is not enough to deter a dedicated hacker though - before the attack is detected, your server may be collapsed for a few minutes, and this can be repeated every hour by the attacker, as happened with one of the TEC attacks on WoM about 1 month ago. The PRO version comes with all the OVH proper (also known as professional) line of servers. It adds the ability to route traffic permanently through the mitigation system and provides you with a simple hardware firewall. This is what you should get if serious attacks are a concern, specifically an Enterprise line server (cheapest is at about 100€/month, VAT included) How to activate permanent mitigation on OVH Professional servers: - Open the new manager. If you don't know where this is, open the classic manager and click on "Home" and then below on the "Dedicated" icon. - Click on IP on the column at the left - Click the little wheel that appears at the right of your server's IP address - Select "Mitigation: permanent" How to set up the hardware firewall: - Click the wheel again and select "Activate firewall". Wait around a minute and then reload the page. - Click the wheel and select "Configure firewall" - You will be presented with the rules screen. You can add up to 20 rules to deny or allow specific ports on the firewall. Start by adding the allowed ports in the lower numbers and end with a global deny rule. Leaving a field blank in the "Add Rule" dialog will result in a wildcard; so if you leave the IP address field blank, this rule will affect all IPs. Adding an allow port port rule: click on Add Rule; choose rule priority; select protocol (TCP or UDP); select Accept; enter the port number. Adding a global deny: choose rule priority (must be higher than the allow port rules); select protocol (TCP or UDP); select Deny. Here is an example set of rules. We have added the SSH port and the game & auth ports, as well as 3306 so our website can connect to MySQL. You can specify the webserver's IP in the rule to prevent others from connecting to your database, although I personally prefer to do this at the software level with the pf firewall; in any case, port 3306 must not be public. "How do I connect with Navicat then?" Simple, use the SSH Tunnel option. This logs you in to SSH and then connects to the MySQL server as localhost. You must enter your server's SSH login details in the SSH, and your MySQL login details in the General tab, but remember we are connecting to localhost or 127.0.0.1: that's what you must enter in hostname, NOT your server's public address, as MySQL doesn't see us as a remote user anymore. Regarding UDP: UDP is your enemy. Disable it completely as I did in the above ruleset. The official client previously used UDP to check on server status, but it's trivial to override it in python so it always shows "NORM" regardless of the result of servercheck. If you are using 40k or source, the check already uses TCP, but your ports must be lower than 32768 (or the source modified) for it to work. VPS at Eterhost Our VPS are always routed through the mitigation system. Hardware firewall can be activated and configured to your needs for 5€/month extra. Part 2.2 - Hardening SSH First things first: have your OS always updated to the current version. It is often recommended by experts to access your server through a non-administrative account (some operating systems such as CentOS even force you to create one at install), so that's what we will be doing. We will create a restricted user for our game server: adduser game We can leave everything as default except for the login group: enter "wheel" here. Users which are part of the wheel group can use the su command to gain administrator privileges. This allows us to completely block root from remote login. Now it's time to create a SSH key for our new user. This makes bruteforce virtually impossible. Finally, let's prevent login from root, and login without key: ee /etc/ssh/sshd_config Look for the "PermitRootLogin" line and leave it this way, uncommenting if necessary: PermitRootLogin no And next look for the "PasswordAuthentication" setting and edit it so it looks like this: PasswordAuthentication no Now let's restart ssh for changes to take effect: service sshd restart Warning: at this point, you should open a new putty window to test that you can login with the new user and key, and that you can use the su command to gain root privileges. Wrong settings may lock you out of your server. Once everything is working, upload your server files to /home/game. This is the home directory of the user - a bit like "My Documents" in Windows. Make sure you change permissions in the files so the "game" user can read and write them: chown -R game /home/game (this command must be run as root! only root can change someone else's permissions. To switch between the game and root account, you use the su (short for superuser) command: root# su game Password: (game user's password) game# su Password: (root user's password) root# Or: root# su game Password: (game user's password) game# exit root# Finally, it may be a good idea to install ssh-guard for extra security or change your SSH port if you don't like your logs being spammed by portscans. To change your SSH port, edit the Port line in /etc/ssh/sshd_config and restart the sshd service as indicated above. Remember to open the new port if you are using a firewall or you will lock yourself out of the server. Part 2.3 Software Firewall: pf At this point it's a good idea to add a second line of defense with the pf firewall. First we will create the /etc/pf.conf file following this sample config. ee /etc/pf.conf Make sure you enter the correct interface and all the ports which must be open: SSH and game ports in our case. Neither p2p ports or db core port should be open to the public! Under trusted_hosts, enter the IP address of your web server so it can connect to the database (We assume a typical set up of web server + game / db server here) instead of opening port 3306 to everyone. This firewall provides us with scrubbing and rate limiting capabilities which the hardware firewall doesn't. Next we will enable pf: kldload pf pfctl -e Check that everything is working fine and then add the following line to /etc/rc.conf to load pf on boot: pf_enable="YES"
  15. Hey all, Today I will explain to you how to use different designs for your quest scrolls like WoM. Setting up the system 1) Copy your scroll designs to ui/game/quest/questicon in the client. I have attached the WoM scrolls as example. 2) Open uiCharacter.py and insert the code that appears between comments: if questCount > quest.QUEST_MAX_NUM: self.questScrollBar.Show() else: self.questScrollBar.Hide() for i in questRange[:questCount]: (questName, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(self.questShowingStartIndex+i) # start colored scrolls if questName[0] == '*': questName = questName[1:] elif questName[0] == '&': questName = questName[1:] elif questName[0] == '~': questName = questName[1:] elif questName[0] == '+': questName = questName[1:] # end colored scrolls self.questNameList[i].SetText(questName) self.questNameList[i].Show() self.questLastCountList[i].Show() self.questLastTimeList[i].Show()3) Open interfaceModule.py Replace this part: if locale.IsEUROPE(): btn.SetUpVisual(locale.GetLetterCloseImageName()) btn.SetOverVisual(locale.GetLetterOpenImageName()) btn.SetDownVisual(locale.GetLetterOpenImageName()) else: btn.SetUpVisual(buttonImageFileName) btn.SetOverVisual(buttonImageFileName) btn.SetDownVisual(buttonImageFileName) btn.Flash() # END_OF_QUEST_LETTER_IMAGE with this: if locale.IsSINGAPORE() or locale.IsEUROPE(): if name[0] == '*': btn.SetUpVisual("d:/ymir work/ui/game/quest/questicon/scroll_close_blue.tga") btn.SetOverVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_blue.tga") btn.SetDownVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_blue.tga") name = name[1:] elif name[0] == '~': btn.SetUpVisual("d:/ymir work/ui/game/quest/questicon/scroll_close_golden.tga") btn.SetOverVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_golden.tga") btn.SetDownVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_golden.tga") name = name[1:] elif name[0] == '&': btn.SetUpVisual("d:/ymir work/ui/game/quest/questicon/scroll_close_green.tga") btn.SetOverVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_green.tga") btn.SetDownVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_green.tga") name = name[1:] elif name[0] == '+': btn.SetUpVisual("d:/ymir work/ui/game/quest/questicon/scroll_close_purple.tga") btn.SetOverVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_purple.tga") btn.SetDownVisual("d:/ymir work/ui/game/quest/questicon/scroll_open_purple.tga") name = name[1:] else: btn.SetUpVisual(locale.GetLetterCloseImageName()) btn.SetOverVisual(locale.GetLetterOpenImageName()) btn.SetDownVisual(locale.GetLetterOpenImageName()) else: btn.SetUpVisual(buttonImageFileName) btn.SetOverVisual(buttonImageFileName) btn.SetDownVisual(buttonImageFileName) btn.Flash() # END_OF_QUEST_LETTER_IMAGEUsage After you modified your client, there will be 4 color codes that you can use at the start of your quest's title to enable the colored scroll: Blue (*), Golden (~), Green (&) and Purple (+). You also have to add the q.set_icon function containing the filename of the scroll picture. Here is an example of how to make a quest scroll blue: when login with game.get_event_flag("worldbookday") == 1 begin send_letter("*World Book Day") q.set_icon("scroll_open_blue.tga") local v=find_npc_by_vnum(20023) if v!=0 then target.vid("__TARGET__", v, "Soon") end endAnd it looks like this: That's all you can also add new codes easily or use your own quest scroll designs. Enjoy! questicon.zip
  16. You can post your favourite websites for design resources here. Textures CGTextures I will start with a great site for realistic textures which is CGTextures (http://cgtextures.com) which contains thousands of different surfaces and decals in very high resolutions, exhaustively sorted by categories. The textures up to 700x700 are free, for higher sizes you have to pay a small subscription free. Probably the biggest resource for seamless textures in the internet. Tools Paint.NET A great tool for simple image editing tasks. It's free and there are hundreds of plugins available for extending its features. http://www.getpaint.net/ Texture Maker 3 Advanced texture creation and editing tool. I found the Resampler tool in this program most useful for Metin2 textures as this allows you to convert a highly detailed texture into a less detailed ("zoomed out") texture. For example you can take a single flower texture with grass background and resample it into a full field of flowers. Download: http://ul.to/tobhsc1g UI Elements UICloud - http://ui-cloud.com/free-ui-elements/ UI Elements http://uielements.net/
  17. For those who are looking for a 2089 client: https://mega.co.nz/#!TtB2EaCa!Oo3_sS4KQdo6vfAhqVqbvP6MLGUCmSfuKjGenWx_cqA Enjoy.
  18. Metin2 db tables

    Since many people may need it, here's my complete official db structure for game 34k, including: - All Indexes and Options included - All auto increment values are set to 1 (except player that is set to 100 to avoid some issues) - Some non-fatal errors caused by original YMIR table structure are fixed 34k_official_db_structure.zip 69 KB https://mega.co.nz/#!SB1CzYyI!T8c_wILefEJBpYjNJXKW2BVaPzp2SRMjNuVDh2WEXkU Tables refine_proto (official, valid for all game revisions) object_proto (modified from official with smaller limits for buildings so they actually fit in your land) skill_proto (SG, has a couple of small differences in regards to GF) shop_item (SG)
  19. Full Monarch System

    The World of Metin2 Monarch System is composed of two parts. For the system to work fully you need to use db core 33820 or a compiled db where this bug is solved (look dif part at the end. If anybody wants to create difs for other revisions, you are welcome to do so.) Monarch Election Authors: Musicinstructor and me (Shogun) Usage: the election has 3 stages: Candidacy, Election and Crowning. All the stages can be started sucessively from the Archer Guardian NPC in town. - During Candidacy phase, all players over level 65 can apply for election by paying some Yang. Up to 8 players can apply per kingdom. - During Election phase, players will drop an item called Certificate of Loyalty (60004) which allows them to cast a vote. - Finally, you can finish the election, which will announce the winners automatically. The new King / Queen will receive a new Hwang Armor on login and the Angel's Blessing item. For the quest to work you need the following preparation: 1) Create an empty file share/data/monarch_election in your server with the touch command. 2) Fill the table player.monarch with some random values (use the PID of your GM for example). You can also use this table: DROP TABLE IF EXISTS `monarch`; CREATE TABLE `monarch` ( `empire` int(10) unsigned NOT NULL DEFAULT '0', `pid` int(10) unsigned DEFAULT NULL, `windate` datetime DEFAULT NULL, `money` bigint(20) unsigned DEFAULT NULL, PRIMARY KEY (`empire`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of monarch -- ---------------------------- INSERT INTO `monarch` VALUES ('1', '266', '2014-02-04 04:36:55', '0'); INSERT INTO `monarch` VALUES ('2', '188', '2013-11-07 20:10:00', '0'); INSERT INTO `monarch` VALUES ('3', '170', '2013-09-16 22:12:06', '0');3) Make sure 60004 exists in item proto and has a suitable icon for it. The quest Add this to locale.lua Add this also to questlib.lua Items for item_list.txt 60004 ETC icon/item/60002.tgaitem_proto.txt entries for the certificate, blessing and armors 60004 loyalty_certificate ITEM_UNIQUE UNIQUE_NONE 1 ANTI_GET | ANTI_DROP | ANTI_SELL | ANTI_SAVE | ANTI_GIVE | ANTI_PKDROP | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX LOG NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 604800 0 1 0 0 0 0 0 0 70021 ±ºÁÖÀÇ ÁõÇ¥ ITEM_QUEST 0 1 ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX NONE NONE NONE 0 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 11971 Ȳ»óÀü°© ITEM_ARMOR ARMOR_BODY 2 ANTI_ASSASSIN | ANTI_SURA | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11972 ȲÀÇ ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_SURA | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11973 ÁøȲ»ó°© ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_ASSASSIN | ANTI_MUDANG | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 11974 Ȳ»óÀÇ ITEM_ARMOR ARMOR_BODY 2 ANTI_MUSA | ANTI_ASSASSIN | ANTI_SURA | ANTI_DROP | ANTI_SELL | ANTI_GIVE | ANTI_STACK | ANTI_MYSHOP | ANTI_SAFEBOX ITEM_TUNABLE WEAR_BODY NONE 0 0 0 0 0 LEVEL 50 LIMIT_NONE 0 APPLY_MOV_SPEED 10 APPLY_RESIST_MAGIC 20 APPLY_ATTBONUS_HUMAN 15 0 350 0 24 0 100 100 3 0 Angel's Blessing Quest written by me and loosely based in the official quest used by Metin2 US. This is the item the Monarch can use to cast his powers, such as healing and attacking buffs which affect all the players from his kingdom in the same map; or summoning of different bosses and Guardians which only attack players from enemy kingdoms. It's an original YMIR item and the vnum is 70021. Instructions are included in the quest for the rookie kings/queens. Preparation: 1) Set MonarchHealGold event flag to an appropiate value (this is the cost of a monarch buff that heals everyone on the map) 2) Edit the list of bosses and their cost to your desires The quest: The function oh.takemonarchmoney() used in the angel's blessing quest is bugged on all official db cores. This is fixed in Vanilla Core 2.2+. For db 33820 here is a dif made by Paylasici: [UNSTRIPPED] db_r33820_32 000A30DD: 3B 20For db 40146 here's another dif made by PACIFICADOR db_r40146 000A5015: 3B 20 It is possible that something is missing in that case let me know here your answers are appreciated
  20. Hosting Reviews

    Hi all, there are many different hosters around the world so I think it would be a good idea if we share our experiences hosting our servers or websites with them. I will start with my own reviews: Softlayer: Best support, expensive, they respond to DMCA requests and null route for 4 h on attack. Leaseweb: Cheap, average support, they don't null route you if you are attacked but they have general host failures constantly. No FreeBSD-aware staff. Worldstream: Cheap and reliable hardware, decent support, they null route you for 24 hours in the event of an attack. Check out their specials for extremely cheap dedicated servers.
  21. Hi guys, Today I will show you how to keep your server up to date with the latest patches or upgrade to a new version. For this purpose, there exists a simple command line tool called freebsd-update. Although many people consider updating their operating system a nuisance, you should be aware that there are vulnerabilities being published constantly for whichever Operating System you use, so update it with all the critical updates, be it your server or your PC at home. Okay, now into the tutorial itself. First we will take a look at which are the currently supported releases of FreeBSD: Production (Legacy) Release: Legacy release is 8.4 (launched in June 2013) - this means this is the oldest version supported at the moment. Older versions do not get updates or security patches so it's a good idea to keep your FreeBSD installation at this minimum version. Production Release: The production release 9.3 (launched July 2014) is the recommended one as it's the release that the main development work is taking place on. Upcoming Release: Release 10.1 (November 2014) is still quite experimental and introduces some important changes. Installing the critical updates for your current version of FreeBSD This action is, in theory, similar to running Windows Update in the Microsoft OS, or "yum update" in a RedHat/CentOs machine: freebsd-update fetch install Will download and install all the system and kernel updates for your current version of FreeBSD (Just press page down when you get a list of the installed files - pointing this out as some may get stuck at this point) Upgrading to a newer version of FreeBSD Upgrading to a newer release of FreeBSD, which we suppose should be better, is a bit more adventurous: freebsd-update upgrade -r [release name] Where [release name] is the name of the release you want to upgrade to. This is composed by the version number and the branch name (CURRENT, RELEASE or STABLE). I recommend choosing the RELEASE branch, so for example, if we wanted to upgrade our 8.1 installation to 8.4 we would use: freebsd-update upgrade -r 8.4-RELEASE Note a reboot will be required at the end to boot into the new kernel (and you may be instructed to run commands after the reboot as well). Pay attention to instructions on screen! Three situations where beginners often get stuck here A survival guide for FreeBSD upgrades When asked if everything looks reasonable, pray and say yes If a configuration file is displayed, you are in the vi editor (unless you changed your default editor, but then you probably don't need this guide). vi is an abomination of nature, so we will exit from it with :q! If you are shown a long list of files, you are in the less text viewer, and you can exit and continue pressing these keys in order: '$ When you are asked to rebuild your ports, you can use pkg upgrade to just upgrade the binaries. Although I must confess I have no idea if this actually has the same effect, I haven't had any problems so far. If you really want to rebuild all ports you can do it this way: portsnap fetch update cd /usr/ports/ports-mgmt/portupgrade make install clean portupgrade -Raf
  22. Siege War

    This is my version of an official event from Metin2 Brazil known as "Guerra da Tocha" (Torch War) there: http://m2.ongame.com.br/eventos/1421-Guerra%20da%20Tocha Requirements Game 407 or higher, the three Castle maps, and fire Signal NPCs. This is part of official client but I can upload it if someone needs it. Most of the stuff is actually done by the siege command, I just made it more user friendly for both player & GM. Best used with my Monarch System Instructions To start the event, talk to the guardian with the bow in town. One of the three kingdoms will become under siege and must defend the Fire Signals on their castle. Players from the defending kingdom can join their castle using the teleporter in town or the Transport Gates found in common maps. Players from other kingdoms can join only from Transport Gates. Once in the castle map you will find a number of beacons or Fire Signals which can be destroyed by the attacking kingdoms. Defenders should prevent this from happening. Fire Signals can drop valuable items (in the official version, 66 armors, 75 weapons and Treasure Chest boxes) If after 30 minutes there is any Fire Signal remaining, the defenders will be able to attack it as well. The event ends when there are no more Signals and the winner is the kingdom which manages to destroy more of them. A video from the event: https://www.youtube.com/watch?v=tO6XpCAPpEM -- Siege War quest -- (c) by Shogun 2013-2014 quest siege begin state start begin when login with game.get_event_flag("siege_war") > 0 begin send_letter("Siege War") end when letter begin if game.get_event_flag("siege_war") > 0 then local empire = pc.get_empire() send_letter("Siege War") if game.get_event_flag("siege_war") != 4 and pc.get_level() > 59 then local gate_vnum = 20096 + empire local v=find_npc_by_vnum(gate_vnum) if v != 0 then target.vid("__TARGET2__", v, mob_name(gate_vnum)) elseif game.get_event_flag("siege_war") == empire and (pc.get_map_index() < 181 or pc.get_map_index() > 183) then local w=find_npc_by_vnum(9012) if w != 0 then target.vid("__TARGET__", w, mob_name(9012)) end end end else set_state(start) end end when __TARGET__.target.click or old_man.chat."To the Castle! Quick" with game.get_event_flag("siege_war") == pc.get_empire() begin target.delete("__TARGET__") if pc.get_level() > 59 then local name, pid, date, money = mgmt.monarch_state(pc.get_empire()) ----"123456789012345678901234567890123456789012345678901234567890"| say_title("Teleporter:") say("") say("Our monarch "..name.." has given instructions to take") say("every citizen of age to the Castle.") say("") say("Are you ready for the battle then?") say("") local main_set = select("Yes","No") if main_set == 2 then say_title("Teleporter:") say("") say("Then go pick up your weapons and hurry up.") say("") say(locale.empire_names[pc.get_empire()].." needs you.") say("") else local empire_castle = { {975200, 133000}, {977200, 185000}, {923900, 183600}, } pc.warp(empire_castle[pc.get_empire()][1], empire_castle[pc.get_empire()][2]) end else say_title("Teleporter:") say("") say("You are not strong enough for this battle.") say("") say("Come back when you reach level 60.") say("") end end when button or info begin addimage(20, 12, "siegewar.tga") say("") say("") say("") say_title("") if game.get_event_flag("siege_war") > 0 then if game.get_event_flag("siege_war") == 4 then ----"123456789012345678901234567890123456789012345678901234567890"| say("Hear me, "..locale.empire_names[pc.get_empire()].."s! One of the three castles") say("will soon fall under siege.") say("") say("When the time is ripe, the castle to be attacked will") say("be announced. Get your weapons ready!") elseif game.get_event_flag("siege_war") == pc.get_empire() then say(locale.empire_names[pc.get_empire()].."ns! Our castle is being attacked!") say("") say("Head to the Teleporter inmediately and help defend the Fire") say("Signals. After 30 minutes, we will be allowed to destroy") say("them ourselves. This is our only chance to win!") else say(locale.empire_names[pc.get_empire()].."s! Head inmediately to the "..locale.empire_names[game.get_event_flag("siege_war")].."n castle") say("and lay siege to it!") say("") say("You can access enemy castles from the Teleport Gates found") say("in every common map. Our objective is to destroy more Fire") say("Signals than our enemies.") end say("") say_reward("The winning kingdom will obtain a bonus.") say("") else say("Siege War has already ended.") say("") end end when 11001.chat."GM: Siege War" or 11003.chat."GM: Siege War" or 11005.chat."GM: Siege War" with pc.is_gm() begin say_title("Siege War:") say("") if game.get_event_flag("siege_war") == 4 then say("Currently the Siege War is being announced.") say("") say_reward("IMPORTANT: only start this event from ch99") say("") local s = select("Start Siege War","Exit this screen") if s == 1 then local kingdom = 1 local signals = 5 say_title("Siege War:") say("") say("Please select the number of beacons to spawn") say("") local s = select("Random","Select manually","Exit") if s == 1 then signals = number(5,10) elseif s == 2 then say_title("Siege War:") say("") say("Please enter a number from 5 to 10") say("") signals = input() if signals < 5 or signals > 10 then return end else return end say_title("Siege War:") say("") say("Please select which Castle will be the scenario") say("of the event.") say("") local s = select("Random","Select manually","Exit") if s == 1 then kingdom = number(1,3) elseif s == 2 then say_title("Siege War:") say("") say("Please select the kingdom") say("") kingdom = select("Shinsoo","Chunjo","Jinno","Exit") if kingdom == 4 then return end else return end command("siege "..kingdom.." "..signals) game.set_event_flag("siege_war",kingdom) end elseif game.get_event_flag("siege_war") > 0 then say("Currently "..locale.empire_names[pc.get_empire()].." is under siege.") say("") local s = select("Abort event","Remove scroll","Exit this screen") if s == 1 then syschat("Siege War has finished.") command("siege") game.set_event_flag("siege_war",0) elseif s == 2 then game.set_event_flag("siege_war",0) end else say("Siege War is not active at the moment.") say("") local s = select("Start Announcing","Exit this screen") if s == 1 then game.set_event_flag("siege_war",4) say_title("Siege War:") say("") say("Announce scroll for Siege War is now ON") say("") end end end -- w end --s end --q
  23. [Reference] Event flags

    Here are the event flags available up to Ymir's game 34083. Usage: /e eventflag value mob_dam [value] Set mobs damage (default 100) mob_gold, mob_gold_buyer [value] Set gold drop rate for free and premium* user (default 100) mob_gold_pct, mob_gold_pct_buyer [value] Set yang bomb drop rate for free and premium* user (default 100) mob_exp, mob_exp_buyer [value] Set experience rate for free and premium* user (default 100) mob_item, mob_item_buyer [value] Set item drop rate for free and premium* user arena_potion_limit [bool] Enable limit of potions that you can use in Musician's Yu-Hwan duel arena (thanks to TÜRK) arena_potion_limit_count [value] Number of potions that can be used if arena_potion_limit is true (thanks to TÜRK) eclipse [bool] Enable and disable night mode. gold_drop_limit_time [sec] Time in seconds before Yang can be dropped again (anti drop bot measure) guild_disband_delay [bool] Set a 24 hours waiting time after a guild is disbanded, for the members to join another guild. (Default: 1) (thanks to pedr0caz) guild_withdraw_delay [bool] Set a 24 hours waiting time after being kicked from a guild, for the player to join another guild. (Default: 1) (thanks to pedr0caz) hivalue_item_sell [bool] Value 1 enables sale of Blessing Marble and Perpetual Iron in shops. MonarchHealGold [yang] Amount of kingdom Yang required to cast Monarch Heal buff. personal_shop [tax %] Place a tax on private shop sales. The Yang goes to the Kingdom vault. 2006_drop [drop rate 1/x] Enable drop of Chinese New Year 2006 - Hexagonal Box (vnum 50037) 2007_drop [drop rate 1/x] Enable drop of Chinese New Year 2007 - Hexagonal Box (vnum 50043) dragon_boat_festival_drop [?] Enable drop of 50085 drop_moon [bool] Enable drop of moonlight boxes. Drop rate can NOT be changed! easter_drop [?] Enable/set drop of item 50160 to 50179 - Easter Egg (Thanks to miguelmig) football_drop [?] Enable/set drop of 50096 - Football Ball (World Cup GF event) (thanks to miguelmig) halloween_drop [?] Enable/set drop of 50095 - Pumpkin (thanks to miguelmig) hc_drop [drop rate 1/x] Drop rate of item 30178 - Gameforge event for the opening of Grotto of Exile (thanks to miguelmig) horse_skill_book_drop [drop rate 1/x] Set drop rate of Horse Skill books. kids_day_drop [drop rate 1/x] Drop rate of Puzzle box (50034) for low level players. kids_day_drop_high [drop rate 1/x] Drop rate of Puzzle Box (50034) for high level players. lotto_drop [drop rate 1/x] Enables drop of Lottery Tickets with unique numbers. The dropped ticket numbers can be found in player.lotto_list table for further processing. lotto_round [value] Choose a number to mark the lottery tickets with. This is useful if you want to run different Lottery events and make sure a ticket is not used twice. mars_drop [drop rate 1/x] Enable global drop of Perpetual Iron. newyear_fire [?] Enable drop of Chinese Fire Crackers (Chinese New Year event) newyear_mob [bool] Randomly spawns Hae-Tae in City 2 (Chinese New Year event) newyear_moon [?] Moon Paste event, enables drop of vnums 50016~50017~50018~50019 (Chinese New Year event) new_xmas_event [bool] Spawns the new christmas tree design in town. ramadan_drop [drop rate 1/x] Enable drop of bread (30315) for Gameforge Ramadan event. three_skill_item [drop rate 1/x] Set drop rate of Soulstones (from metins and bosses only) threeway_war_boss_count [value] Number of Elite Nine Tails that will be summoned for the winning Kingdom in Nation War. threeway_war_pass_idx [mapidx] Map index of Nation War pass map. This is filled automatically with a random map from the list in share/locale/whatever/forkedmapindex.txt; do not edit this event flag but change the txt file instead. threeway_war_sungzi_idx [mapidx] Map index of Nation War Sungzi map. This is filled automatically with a random map from the list in share/locale/whatever/forkedmapindex.txt; do not edit this event flag but change the txt file instead. valentine_drop [bool?] Enable drop of Chocolate and Roses whiteday_drop [?] Enable drop of items 50031 - 50032 xmas_boom [bool] Enable night mode, firework sound, and Event Helper (NPC selling fireworks) xmas_snow [bool] Enable snow. xmas_sock [drop rate 1/x] Enable drop of Christmas socks. xmas_song [bool] Play Christmas song everywhere. xmas_tree [0-3] Enable the original Christmas Tree NPC. 3 models available (1,2,3) * a premium user has an active exp/yang/drop bonus set through the account table (for noobs: the blue squares in the top left corner of the client) Note: "bool" means that it only accepts "false" (0) or "true" (any other number) as parameters. Yet unknown: fish_miss_pct gold_trade_cycle gold_trade_enable indepence_day japan_regen medal_part_drop user_dam user_dam_buyer crcdisconnect pre_event_hc refine_box guild_invite_limit refine_box_drop refine_box_low refine_box_mid refine_box_high drop_char_stone drop_char_stone.level_range dropevent.drop_char_stone drop_char_stone.percent_lv01_10 drop_char_stone.percent_lv11_30 drop_char_stone.percent_lv31_MX independence_day spawn_block_log threeway_war_choice threeway_war_kill_count threeway_war_dead_count xmas_santa guild_invite_limit manwoo fishevent poly update_refine_time If anybody knows their effect, or other event flags not listed here, please post and I will add it here
  24. Hi guys, Today I will show you how to use the popular Cloudflare solution to add an extra layer of security to your website. The best about it: it's free if you don't want to spend on the paid plans. I will assume that you already have a website online and working, and your own domain name (if you don't have one, I recommend EasyDNS). The first step will be to sign up on the Cloudflare website. Registration is straightforward so I won't go into details about it. Once your account is created, it's time to add your website on the Dashboard: Cloudflare will scan your current DNS records for the domain Once scanned, we can review our DNS records. You will be able to change them at any time later. Just for this feature alone, it's worth using the service: We can choose whether a domain or subdomain should be filtered through Cloudflare. When the little cloud is grey, Cloudflare will simply act as a DNS server forwarding users to your server. When it's orange, we gain a series of security and performance features, even with the free plan. One worth noting is that your IP becomes private so your real location and hosting provider cannot be found. This is a great privacy enhancement! ¿Is it worth paying for the paid plans? Depends. If you expect large attacks and don't have DDoS protection on your website host, you should go for the business plan definately. Otherwise, free or pro will do. ¿Why use it if I already have DDoS protection on my server? Well, some extra security isn't a bad idea. Usually DDoS mitigation systems such as those offered by OVH or Solarcom filter mostly Layer 4 attacks, while Cloudflare works better with Layer 7 attacks. Therefore they complement each other. The final step to let Cloudflare take control of our domain records is to change the name servers. This is usually done in the control panel of the provider where you bought your domain name, in my case EasyDNS: Finally your site is added but it will take some hours -might even be a day or two- before the name server and DNS changes are in effect, and it's time for me to stop writing this tutorial temporarily In the next post I will explain you which are the best settings to choose among the many offered by Cloudflare. To be continued.
  25. Sequence Table Patcher by Tyrar

    Since I noticed that most people don´t know it's possible to make your client and game unusable for others, here is a little explanation. I have also written a tool to help your create a new sequence table. The new sequence table is random and a sequences.bin file will be generated that you can use to patch your client and game binary later on. Technical blabber The client sends with each packet a byte from the table and checks that the response matches. When it doesn't, a SEQUENCE error will appear, a very known issue. For this reason, it's important that you patch both your client and server binaries! Download SequencePatcher.7z password: yolopvp Disclaimer This post and the tool are written by Tyrar @ epvp. I just translated it into english, except the more technical stuff where my knowledge of german isn't enough. For the original thread, refer to: http://www.elitepvpers.com/forum/metin2-pserver-guides-strategies/2924143-release-how-sequencetable-ndern.html
×