Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 03/28/23 in all areas

  1. Version 1.0.0

    143 downloads

    Please note that you can download the full version of the sprite set from this link. The file is large and cannot be uploaded to the forum. You can download my sprites rework [FOR FREE] and not for resale! [DOWNLOAD] https://mega.nz/file/taQwkKwL#ikVnLwKyX52rymVMlaAqxFMd8YHsC2itTyk3GxmAjtc
    Free
    18 points
  2. Note: This map was made during my Browedit tutorial. * If you are interested to learn how to develop your own custom RO Map, please check the link below. prontera v0.1 Very simple prontera map with custom texture. Image 1 Image 2 Image 3 Thanks for Downloading. speedrun_prt.grf
    17 points
  3. Heya, This tool parses replay files (rrf) and outputs a readable format. It is used to gather data from official replay files by extracting NPC dialogues, quest status, skill cast time, after-cast delay, etc. Say you want to replicate an official instance, you would get a replay of it and then extract the data using this tool. You'll be able to follow along the mes dialogues, the next statements, etc, when making the actual script. You can save a lot of time doing so. It is a tool I've been using heavily for many years now and it was made to fit my needs, so some stuff may not seem very useful to you. Because of this, I'm making the project public so you're free to add more features/information as you see fit. The source for the Replay format as far as I'm aware is from Dia (from Divine Pride), so huge thanks on that side. Download: https://github.com/Tokeiburu/Rrf-Parser/releases Git repo: https://github.com/Tokeiburu/Rrf-Parser Some replays may not work as this tool was made specifically for kRO replays (and I've been removing support for older versions throughout the years). How it works Change the replay path to your replay and click "Parse Replay" to start the process. Once that's done, you should get the output shown above. Choose the parsing options on the left if you don't want to include useless data. It may be useful for some though. The [output] options are files generated in your folder\output\file.txt. Main output NPC scripts. All the NPCs that have been seen (in order) will be put there with a pre-made script. It will also show "npc_avail" for some very specific NPCs. On kRO, some NPCs don't actually have a view ID but are actually characters with a style. This is what npc_avail is for (though it's not something rAthena supports at the moment). For example: 1@exnw,12,107,3 script ³ªÀÌÆ® ¿öÄ¡#nw3 npc_avail[4306,0,21,7,0,0,0,0,0,0,0],{ end; } Which corresponds to: p.job,p.sex,p.head,p.headpalette,p.weapon,p.shield,p.accessory,p.accessory2,p.accessory3,0,p.bodypalette Equipment. The next entry in the main output is the player equipment with the @item2 command to remake the gears quickly. This only includes equipped items. The other pieces of equipment in the inventory are not included there. Monster spawned. This part will include all the monsters that have spawned and it will not show them more than once. Packet output. That is the main part of the parsed script. It will give you the script lines, cutins, and much more. It will detect cloakoffnpcself, but don't trust the output blindly either. Sometimes kRO just hides a NPC for dumb reasons. Though usually it should be accurate. Parsing options Most of the fields are self-explanatory, so I'll only go over those that aren't. Show raw packets. Outputs the packets in hexadecimals rather than a readable format. Revert instance names. Looks for ###1@name in map names and reverts it back to the original map name. This also changes NPC names that got converted such as something#ins_0o1 to something#ins. Generic packet. This one contains pretty much everything not included in the other options. UnitWalk packet. This one is disabled by default, but you might consider turning it on if you're doing newer instances because kRO uses those a lot lately. When a NPC moves, it will be shown there. mob_data.conf A special file is generated alongside the replay in the output folder called "mob_data.conf" (though it's not a real libconf format). The mob_data.conf file contains data gathered from the mobs inside the replay such as mob level, speed, damage motion, attack motion, boss type, skills used and mob drops. As far as mob drops go however, be careful as the tool makes a lot of estimation there. For example: Mob Death: 148 Drops: 1000364,135 Dropped: 2 The above means the mob has been killed 148 times, and only one drop has been seen (1000364). The estimated drop rate is 1.35%. A drop is defined as an item dropped alongside the unit_dead packet. So it may be wrong, or if the mob is looter type, you'll get a bunch of invalid results. Though usually it's a fair estimation. Tool > Translation helper So if you put the following as the input: select("¾îµð·Î °¡¸é µÇÁÒ?:"); // TICK: 19263 ms, INTERVAL: 0, FORMAT: 0:19 mes "[¸¶¶÷]"; // TICK: 19746 ms, INTERVAL: 433, FORMAT: 0:19 mes "¾ÆÀÌ»þ°¡ ¾îµð¼­ »ì¾ÒÁö? ¾Æ! ÀÌ <NAVI>[À­ÂÊ]<INFO>wolfvill,99,178,0,101,0</INFO></NAVI>¿¡ °¡¸é ¾ÆÀÌ»þÀÇ ÁýÀÌ ÀÖ¾î¿ä."; // TICK: 19746 ms, INTERVAL: 0, FORMAT: 0:19 next; // TICK: 19746 ms, INTERVAL: 0, FORMAT: 0:19 mes "[½ºÄ«´Ï¾Æ]"; // TICK: 20129 ms, INTERVAL: 0, FORMAT: 0:20 mes "ÇÏÁö¸¸ ¸»Çصµ ¼Ò¿ë ¾øÀ» °É¿ä? ¼³µæÇÑ´Ù¸é, ´ç½Å¿¡ ´ëÇÑ ³» »ý°¢µµ ¹Ù²ÙÁÒ."; // TICK: 20129 ms, INTERVAL: 0, FORMAT: 0:20 npctalk "½ºÄ«´Ï¾Æ, ¸ðÇè°¡´ÔÀº ³× »ý°¢À¸·Î °¡Ä¡°¡ Æò°¡µÇ´Â ºÐÀÌ ¾Æ´Ï¼Å.", "¸¶¶÷#wms01"; // TICK: 20129 ms, INTERVAL: 0, FORMAT: 0:20 npctalk "´©°¡ ¹¹·¡? ÀßÇØÁÙ °Å¶ó°í.", "½ºÄ«´Ï¾Æ#wms01"; // TICK: 20129 ms, INTERVAL: 0, FORMAT: 0:20 next; // TICK: 20129 ms, INTERVAL: 0, FORMAT: 0:20 mes "[¸¶¶÷]"; // TICK: 20479 ms, INTERVAL: 33, FORMAT: 0:20 mes "¸ðÇè°¡´Ô, ±×·³ ´Ù³à¿À¼¼¿ä! ³ªµµ À̸¸ °¥°Ô!"; // TICK: 20479 ms, INTERVAL: 0, FORMAT: 0:20 setquest 17510; // State = 1, Time = 0 // TICK: 20479 ms, INTERVAL: 0, FORMAT: 0:20 close; // TICK: 20480 ms, INTERVAL: 1, FORMAT: 0:20 You would get the following as the output: 어디로 가면 되죠? [마람] 아이샤가 어디서 살았지? 아! 이 [윗쪽]에 가면 아이샤의 집이 있어요. <NAVI>[윗쪽]<INFO>wolfvill,99,178,0,101,0</INFO></NAVI> [윗쪽] next; [스카니아] 하지만 말해도 소용 없을 걸요? 설득한다면, 당신에 대한 내 생각도 바꾸죠. 스카니아, 모험가님은 네 생각으로 가치가 평가되는 분이 아니셔. 누가 뭐래? 잘해줄 거라고. next; [마람] 모험가님, 그럼 다녀오세요! 나도 이만 갈게! setquest 17510; close; It extracts the content and puts them in Korean for easier google/papago translate copy paste. The "select" content will be extracted, same for <NAVI> and a few other annoying cases where you end up spending more time removing the tags than actually translating. Tool > Replay simulation This one is meant to "transform" a replay into a script so that you can view it on your own server. The input account ID is your account id, on the test server you'll be on. This is required for the script to work correctly. You will get an output similar to - script REPLAY_SIMULATION -1,{ end; OnTimer1: attachrid(2000012); sendpacket("ff09620006aa010000000000002c0100000000040000008928000000000000000000000000000000000000000000000000000000000000000000000000000024472500000000000000ffffffffffffffff000000b9ccb8aebecf23657031385f7776"); sendpacket("ff09600006a9010000000000002c0100000000040000008828000000000000000000000000000000000000000000000000000000000000000000000000000023c72500000000000000ffffffffffffffff000000b8b6b6f723657031385f7776"); sendpacket("ff09620006ab010000000000002c0100000000000000008b28000000000000000000000000000000000000000000000000000000000000000000000000000023c71500000000000000ffffffffffffffff000000c0ccb9c7b8b123657031385f7776"); end; OnInit: initnpctimer; end; } Then load the script and your character will redo what the replay file was doing. You'll probably have to put your character where the replay starts as otherwise some weird stuff is gonna happen. You'll also need the following script command as well: BUILDIN_DEF(sendpacket,"s"), BUILDIN_FUNC(sendpacket) { const char *input = script_getstr(st,2); struct block_list *bl = map_id2bl(st->rid); unsigned char buf[10000]; int len = strlen(input); int i; for (i = 0; i < len; i += 2) { sscanf(&input[i], "%2hhx", &buf[i/2]); } if (!bl) { npc_timerevent_stop(map_id2nd(st->oid)); st->state = END; return SCRIPT_CMD_FAILURE; } clif_send(buf, len / 2, map_id2bl(st->rid), SELF); return SCRIPT_CMD_SUCCESS; } Notes This is a tool I do not plan on spending a whole lot of time on. It would be a nightmare to maintain in the first place. I will add requested features if any for a short time, but it would be much easier to add such features yourself if you are planning to use this as a base for your own needs. If you want to handle a new packet, simply go in RrfParser\Packet\PacketDecoder.cs and add it as you want. Only those I needed were handled. The display timers are both useful and annoying. Once I'm done with a script, I usually run a quick regex to wipe out all comments and that solves that problem. //.*
    14 points
  4. This is such a minor tweak that I don't even really think it's worth creating a topic for, but my testers reported that this makes the game feel significantly smoother. This change attempts to address a desync issue when attacking. When clicking on a monster that is hostile and is also moving towards you, sometimes your character will fail to begin attacking because the client thinks it is within range to attack, but the character is actually too far away to attack on the server side. It's especially common with monsters that move fast. With this tweak, this situation should no longer happen. The change is in unit.cpp: Find this comment: // Player tries to attack but target is too far, notify client Add this line immediately afterwards: clif_fixpos(src); // synchronize the player's position with the client Don't change anything else. The finished code block should look like this. if(sd && !check_distance_client_bl(src,target,range)) { // Player tries to attack but target is too far, notify client clif_fixpos(src); // synchronize the player's position with the client clif_movetoattack(sd,target); return 1; Then just recompile the code and test it out. Everyone I had test it said it felt instantly noticeable. This does increase the number of packets being sent so this may cause a very minor increase to network traffic, but based on the number of packets that are typically sent back and forth I don't think the effect is very significant.
    13 points
  5. Version 1.0.0

    194 downloads

    Hello everyone! Happy New Year! Here are my handmade gifts, custom maps for you: 2024: navayo (+nav_beach, nav_in01, nav_in02) https://rathena.org/board/topic/116200-showcase-navayo/ anrydrago https://rathena.org/board/topic/124265-showcase-miniquest-anry-dragon/ 2023: x_base https://rathena.org/board/topic/140494-showcase-x-base/ crimea https://rathena.org/board/topic/132870-showcase-crimea/ barcode https://rathena.org/board/topic/116040-showcase-barcode/ ice2xlake https://rathena.org/board/topic/124194-showcase-ice-twice-lake/ lv_beach https://rathena.org/board/topic/116553-showcase-love-beach/ yavin1b https://rathena.org/board/topic/116300-showcase-yavin1b/ mystvil https://rathena.org/board/topic/117187-showcase-mystical-vil/ crystal https://rathena.org/board/topic/116079-showcase-crystal/ 1@scp087 https://rathena.org/board/topic/116223-showcase-scp-087/ mag_dun03_ https://rathena.org/board/topic/127185-showcase-magma-dungeon-lvl-3/ b_book(1,2,3,4) https://rathena.org/board/topic/116491-showcase-four-battle-books/ The size of attachments (30mb) on rAthena does not allow to add map resources. You can find the full materials here: https://mega.nz/folder/8atXmYgC#yJEL_ssWj8D8XwmpgInYiQ ~ Keep calm and use it on your server ~ ~ Don't claim my work as yours please and etc ~ ~ Any requests/reports - https://rathena.org/board/profile/47250-w0wzukubg/ Thanks, Zuku ~
    Free
    12 points
  6. Froggo Rö Folder This is a simple RO folder that contains everything you need to run a 2022-04-06 client, the latest publicly available. I have cleaned and compressed the data.grf file to reduce its size from 3.47GB to 2.44GB. I have also compressed the official_data.grf file from 1.24GB to 477MB. Before BGM, the Rö folder has a total size of 2.96GB, after BGM it reaches 3.30GB Screenshots Requirements Server Up & Running with ‎‏‏‎ PACKETVER=20220406 Visual C++ Redistributables DirectX Runtime Features Includes latest RoEnglishRE - 16/mar/2024 Custom Lua Support jRO Enchantment Display Includes rsu-kro-rag-lite (kRO updater) - v4.2.2.1316 Includes opensetup - v3.1.0.627 Includes iRO's Setup.exe, thanks to relzz! Includes AzzyAI 1.55 Includes Packet Viewer Download click here to download a .zip file of this ro-folder Extra Warp Profile for 2022-04-06 used for FroggoClient.exe (mirror) 2022-04-06 Vanilla Ragexe Client Login Screen Creator Official Ragnarok Complete Installer (08/Jan/2024)(mirror) Froggö Ro Folder Gitlab's Repo FAQ Why am I getting CHARACTER_INFO size error when trying to log in? Possible reasons: You are using outdated rAthena which doesn't work with 2022-04-06 client. You haven't set correct PACKETVER or done it with mistakes (skill issue ). You haven't recompiled rAthena. You haven't restarted server after recompilation. Why am I getting errors about MSVCP140.dll, VCRUNTIME140.dll when executing FroggoClient.exe? You haven't installed Visual C++ Redist, check requirements section, if problem persists, try installing this too Visual C++ Redist for VS 2012u4 What is official_data.grf ? official_data.grf is from the ROResourceCollection project, which brings many items, mobs and npc files from other RO Regions and merges it into one convenient grf. Why does the Setup.exe opens instead of the FroggoClient.exe? In your Windows registry there is no data about your selected graphic card, to fix it, just set up your settings in Setup.exe and click on OK, be aware to don't select DirectX9, stay on DirectX7 What was removed from the data.grf? Several unnecessary files were removed from the data.grf . These included residual files such as thumbs.db and stray BMP Screenshots. However, the majority of the cleanup was performed in the mob and npc sprite folders. In these folders, some .spr files contained sprites (images) that were not utilized in their corresponding .act files. For example, the monster katrinn's .spr file contained approximately 140 images, but only 6 of them were actually used. In total, out of nearly 90,000 collective images, around 9,400 were removed alv.
    11 points
  7. Need the latest kRO Install folder for your private server? Look no further! ----> Download <---- Latest: 2023-04-04 Installation: Official kRO Updated: 04/04/2023 Download Link: https://mega.nz/folder/jUsDgRxQ#ttLmLjPY9p9cfU5_ShWVCw Package contains RSU RO Patcher Lite for kRO and kRO RE by [Ai4rei] This package is maintained by [Akkarin] Note: Due to continued abuse of my webservers, the files have been moved to MEGA. You can download an extractable .zip of an installed kRO directory, or you can download the official installer from kRO's website. Note: If you require older maps that are compatible with 2021 and older clients, download the 2021 .zip. A fan of this topic? Hit the rep button
    11 points
  8. Version 1.8.4.7

    49488 downloads

    Hey everyone, This is a GRF tool I started to develop for my own personnal use, but I thought I'd share it since I've upgraded the UI. Its primary goal is to be easy to use while offering a wide variety of options and customizations. The software is quite stable and can handle large operations easily. How to install Download the zip archive provided from the download link at the bottom of this description or directly from there : http://www.mediafire.com/?aflylbhblrzpz0h Install the application with GRF Editor Installer.exe; if you are missing a .NET Framework you will be prompted to download it. Once you are done, you can start the program from the link on your desktop. Key features Overall speed is faster (or at least equal) than any GRF tool. Common operations : add, delete, merge, extract, preview, save. Undo and redo for any operation. It can open any GRF file. Clean and very interactive interface. Saving formats supported : 0x200, 0x103 and 0x102 (through the Settings page) and conversion to the Thor format. Instant filter and search options (example : "map .gat"). File association and context menus integration for .grf, .gpf, .rgz and .thor (through the Settings page). Can rebuild separated images into one file easily. Drag and drop (with the ALT key, can be modified in the Settings page). This is a big part of the software; most of the items can be moved around within the application itself or from/to Windows Explorer. Tools Sprite editor : a simple sprite editor with powerful features. Semi-transparent images can be added, you can easily change the order or replace images, etc. This tool can convert images in the wrong type by showing you multiple solutions (merging a new palette, dithering the image by using current palette, using the closest color, and a few more). Grf validation : allows you to validate a GRF with multiple settings. It can detect corrupted GRF entries, invalid sprites, empty files, non-GRF files, duplicate files and a lot more. Flat maps maker : generates flat maps from .gat and .rsw files. Useful to generate WoE maps or to fasten up the loading time. Patch maker : generates a GRF patch based on two different GRFs. Hash viewer : shows the hash code (both CRC32 and MD5) for files. Image converter : converts an image to any format requested (BMP, PNG, JPG, TGA). GrfCL : used to create batch files (.bat) which can automate tasks on GRF files. See the content in GrfCL.rar in the download for more information. This tool can be customized from the sources as well. Palette recolorer : creates new sprites by changing their colors (this tool is now deprecated). Client database editor : allows modifications of the database client files (txt and lua) with easy and simple tools. Work in progress. Grf encryption The encryption feature has been enabled again. It's similar to what it used to be and it has been tested on client versions ranging from 2012-08-01 to 2014-02-05. Some error messages will be displayed if necessary. If you have an issue, copy the error message (with the code, if there's one) and send me the client executable with the cps.dll file generated by GRF Editor. There shouldn't be compatibility issues anymore though! Thor files Thor files are patches used by Thor Patcher ( http://thor.aeomin.net/ ). Because of their similarity with the GRF file structure, they have been integrated within GRF Editor. The primary utility of this feature is that it allows you to add encrypted files to a Thor patch. All the other options can be achieved by using Thor Maker. You'll find the necessary steps below, but test your patches before sending them off to players (I've done a lot of testing on my end, but better be safe). If you're using SecureGRF, then make a new GRF, add the files and encrypt it. In GRF Editor, open the encrypted GRF you just made, use "Save as" and name the new file with a .thor extension. That's it, if you want to change the output directory, click on the root node of the project and select the tab "Container options". You can select the output mode and the GRF to merge the patch with. Simply save again if you change these properties. If you're using GRF Editor's encryption, then make a new Thor file (File > New > New Thor) and add the files you want to patch it with. Right-click on the files you want to encrypt and use Encryption > Encrypt. Technical stuff Requires .Net Framework 3.5 (SP1) Client Profile to run (3.5 or more will work as well). Automatically converts file name encoding to their proper values (you can change the encoding). Data virtualization is used as much as possible to preview files, meaning the files aren't completely loaded. Right-clicking an item will bring up the available options with that file. Preview file formats : txt, log, xml, lua, lub, bmp, png, tga, jpp, db, ebm, pal, gnd, rsw, gat, rsm, str, spr, act, imf, fna and wav. Services are "crash ready", meaning that you will be warned about a failed operation and no work will be lost (the application won't close and crash). It tries to continue operating even if it meets unsual conditions. Operations can be cancelled by clicking on the button near the progress bar. The warning level can be changed to avoid messages like "Please select a folder first." When prompted with an error, use Ctrl-C to copy the current dialog's content. Some screenshots! 1) Previewing an act file, while showing the search feature 2) Preview of a model file (rsm) 3) Preview of GrfCL with the MakeGrf command 4) Preview of maps 5) Preview of Grf validation 6) Search feature (press Ctrl-F or Ctrl-H to bring up within a text editor) Got a feedback? I'd gladly hear you out and fix issues you have with the program.
    Free
    11 points
  9. Hello, I'm sharing this project, since this might help someone who need to generate this easily. Right now, this project support custom file generator for : 1. Custom headgear. 2. Custom robe/garment. 3. Custom weapon. 4. Custom NPC. The required file generated depends on which generator that you used. The scenario on how to generate for custom headgear file : 1. Maybe extract data\texture\유저인터페이스\item\ folder and u will have the listed one .BMP that u want to add. 2. Select all the item u want to add, right click mouse and right click, copy as path. Then open notepad, paste it. 3. Get the only .BMP in list, so replace your directory path and replace all with blank/nothing . And lastly the " with blank/nothing. So the result is as below. Copy all of it, insert in https://x-files.amirazman.my/customfilegenerator and change your : - Starting ItemID you want it to start with. Make sure the itemID is supported by your client. - Starting AccessoryID that you didnt use yet. Also make sure the final accessoryID didnt reach the maximum of your client can support/set. - Defense, so you can set all the defense in bulk. - Weight. - Slots. - Script. Insert any scripts or anything that you can replace all easily later on in itemdb and also custom_iteminfo.lua (yes, its generated inside the description). - Item Type for now only support headgears and costume headgears, I will add another item types soon if possible (yes, its generated inside the description). And click Generate. Download, extract, add it in your System folder and server file or create a patch or anything. You can access to this simple project here : https://x-files.amirazman.my/customfilegenerator. Let me know if you having issues and I'll update it if possible & have some leisure time to play with.
    10 points
  10. The last few years, I've been poundering a certain matter: Why is Ragnarok Online so difficult to get into for new people? A few answers come to mind but there's one factor most people seem to agree on: Finding any sort of accurate information on this game is a nightmare. Basically, unless you're already in the know, it's really difficult to sort out good guides and databases from bad ones. Nevermind the hundreds of guides made for defunct servers that were full of customs, even the "good" sources of information in Ragnarok are often divergent and dubious. And so, I set out on a personal project: Improving the way this game is presented to new people. A daunting task, but one that must be accomplished. If we wish to see the game continuing to thrive as it enters its 3rd decade of life. For starters, I begun by reaching for the lowest hanging fruit I could think: The in-game skill translations. Of course, although I call this a low hanging fruit, it was an enormous task nonetheless. And so I present the community with my work, the initial release of my Improved Pre-Renewal Skill Translation and Tooltips. These are "translations" in name only. I didn't care to look at the official, original or korean descriptions at all. My starting point was llchrisll's skill translation file for Pre-Renewal. From there, I compared the content of the tooltip against RateMyServer, iROwiki/classic/ and my own knowledge. But that's not everything. I went and double checked the code for every skill, in order to make sure it was accurate. The damage formulas for every skill, the success chance of every debuff, what stats and gear work or do not work for a given skill, what other skills interact with, the scaling per level on skills, the whole works. Almost every single skill in Pre-Renewal was revised and compared against these sources to see which one was most accurate. To my surprise, I found that all three could be wrong. And this happened A LOT. If you trusted in-game tooltips, you were being lied to. Like, more than half of the time. When information was not incomplete, it was wrong half of the time. You trust iROwiki? That's a little better but your understanding of the game was basically fanfiction compared to reality. RateMyServer descriptions? Surprisingly they were the closest to reality a few times but they often had outdated descriptions that didn't match the game at Ash Vacuum episode. But enough talk, it's better that I show you just how wrong everything really was. With pictures! Bowling Bash is such a rich skill! There's so much to talk about! Any experienced player could write a paragraph or two about how this skill works. But the tooltip? Didn't even have any information about Skill Scaling per level? I'm sure we could improve this a whole lot if we tried... Now this is more like it! It mentions a bunch of key aspects of Bowling Bash, such as how it hits twice, has gutterlines, how they can be removed and mentions the invisible cast time that so many people don't even know about. Not to mention I've fixed the line breaks, so that words are not cut in half. Just for this skill? Of course not, line breaks were done to every skill. I can't guarantee it will stay nice and pretty on different font but I did try to leave a little margin for error. Next, let's take a look at a favorite of mine: Soul Breaker. See? This is the sort of 'fanfiction' I was talking about. Literal lies present on this tooltip! This is one of the tooltips I'm most proud about, and a perfect example of how I want to make information accessible to new players. Soul Breaker is a skill most people aren't really sure how it works, but with just a tiny page, you can quickly reference every single important fact about Soul Breaker. The colors make it so easy to understand! Next, let's look at some example where iROwiki was completely wrong: Okay, this is another poo one. No useful information at all. What do extra skill levels do? Let's check iROwiki: Okay that makes sense, it IS a strip skill similar to Rogue's. Let's check the source code to be sure... skill.cpp case GS_DISARM: rate = sstatus->dex / (4 * (7 - skill_lv)) + sstatus->luk / (4 * (6 - skill_lv)); rate = rate + status_get_lv(src) - (tstatus->agi * rate / 100) - tstatus->luk - status_get_lv(target); break; Well well well, what do we have here? iROwiki is lying? More likely than you think! The DEX difference does not matter in this case. Instead, Disarm cares about the gap between the Levels. After about 40 minutes of testing and making sure I got my facts right, I was then able to write the only accurate description for this skill that matches its current implementation. So yeah, this pattern repeated itself a lot over the months. Some classes are worse than others. Going over Star Gladiator and Bard/Dancer skills was a huge chore. Some more examples: And well, since you can never have too many examples, have a big collage of them. This release includes everything I could think about that was relevant for Pre-Renewal: -Base Classes -Second Classes -Trans Classes -Expanded Classes -Quest Skills -Item Skills -Homunculus Skills -Guild Skills -Mercenary Skills Of course, I'm just a single guy and this is a huge file of text. There's no doubt typos, inconsistencies, and breaking of standards. I tried to follow llchrisll's translation formation but haven't done enough revisions to work all the problems yet. Still, it's ready to be used and tested. Let me know here any and all typos and mistakes you find! skilldescript.lub
    9 points
  11. [UPDATE]: Since Innova (4Game) closed my project and I can no longer open new projects, this is my parting gift to the rAthena community. You can download my sprites rework [FOR FREE] and not for sale! [DOWNLOAD] https://mega.nz/file/taQwkKwL#ikVnLwKyX52rymVMlaAqxFMd8YHsC2itTyk3GxmAjtc Hi all! I improved the NPC images (1190 sprites up to episode 18.1) using a neural network (ESRGAN) and made new HD sprites. Want to show you my final work! ? What do you thinking about it?
    8 points
  12. A great many things have changed during this recent maintenance of our forums. Forum Software Upgrade First and foremost, we have upgraded our forums to the latest version of IPS Community Suite. This brings with it a number of new features and improvements including an updated anti-spam service, a number of updates to the Editor, and a new way to embed content from other sites. We have also added a new feature that allows you to easily share content from our forums to your social media accounts. More Updates! Various 3rd-Party plugins have been updated to mitigate bugs and to ensure compatibility with the new version of the forums. If you notice any issues with the forums, please let us know in the Forum Issues sub-forum.. forum forum. Forum Themes The default IPS nasty white theme has been removed. The Dark theme is now the only option, for the benefit of your eyes, and so I don't have to update two themes when I change something. The forum upgrade has reverted some of our custom changes to the Dark theme, such as various layout template changes, links being removed, buttons being moved to somewhere else, etc. Some of them will return, while others will not. The link for Account Credit will return when Paypal has approved our application_id, which was another new change I wasn't prepared for (because some of us don't like to read changelogs before updating...). Username Logins A number of older features within IPS have been deprecated and will be removed at a future date. One of these is the ability to allow username logins. Let's face it, it's a security risk. On Thursday 8th June, we will be removing the ability to login with your username. This will destroy your forum cookies, ending your sessions, forcing you to re-login. You will need to use your email address and password to login to the forums again. Merch and Tickets IPS are changing the way the IP.Commerce system works. This will affect the way we handle donations and subscriptions. We will be working on this over the next few weeks and will let you know when we have a solution in place. The long-and short of it is that they are removing support for physical products and the forum support ticket system in a future version. rA Merch hasn't existed on the forums for about a year (the link in the navigation goes to our Tee-Spring store, which no one has ever purchased from) so that isn't an issue. The support tickets are often ignored as it's just a bunch of users trying to get help with their rA server, which is not what they were originally designed for. We Moved We actually migrated hosts. Still with OVH, but a shiny new VM with tonnes more resources, all for almost the same price as the old one. The Crowdfunding descriptions are now slightly wrong, as we don't have the same costs for the listed products/services, although the total amount each month is ~$3 less. I'm not decreasing them, however, as the IPS license renewal still comes out of my pocket at a hefty $120/6mo. Traffic is still filtered through CloudFlare. rA Gaming Guilds & Teams At the back-end of last year, I asked you guys in our Discord server what your thoughts were on an rA Guild in various MMOs and a team for some MOBAs via a brief survey. The results were mixed, but in-all there was some good feedback. We will be opening up a few new channels in Discord over the coming weeks with information on where to find our guilds in whichever games we decide to play. We will also be looking for some Guild Leaders to represent us in games that rA Staff don't play. Please wait for further announcements on this. I think that's all? Probably. Akky out~
    8 points
  13. Version 1.0.0

    2242 downloads

    This custom pack was made by Katan in mid-2009, I just made some changes and updates for the new clients. Custom Mobs by Max Dragon Fixed Reploid Bugs Thanks and good luck with your server!
    Free
    8 points
  14. War Declaration System A system which allows guild leaders to declare a war against other guilds. You can only start attacking opposing guild when both guilds will declare each other as enemies. There will be an announcement when guild leaders sets a guild as an antagonist and another announcement saying that both guilds have agreed to declare war on each other. Once both guilds declared war, they can attack each other outside PVP, GvG, BG, Castle Maps, and Towns.. meaning on fields/dungeons only. This should add up some spice on guild vs guild match ups on a server. I'm open for some suggestions for improvement of this system! Cheers! [ Video: ]
    7 points
  15. View File Upscaled npc sprites Please note that you can download the full version of the sprite set from this link. The file is large and cannot be uploaded to the forum. You can download my sprites rework [FOR FREE] and not for resale! [DOWNLOAD] https://mega.nz/file/taQwkKwL#ikVnLwKyX52rymVMlaAqxFMd8YHsC2itTyk3GxmAjtc Submitter Balfear Submitted 09/20/23 Category NPC Sprites Video https://youtu.be/gt8JM0Y5pwM Content Author Gravity / Balfear  
    7 points
  16. I hope you all enjoy this cute little map! You can see the video showcase here: You can preview the screenshot here: This map is free to be modified as you wish! sponge_bob.zip
    7 points
  17. Sorry for my English, I'm using google translator! At the beginning of the year I started "working" on upscaling the ragnarok sprites. The method consists of using a tool to upscale the image and after making some changes in the ACT to play this image into the game. The result made me happy, I like the way it looks... There are people who don't like it and that's okay. From the beginning I faced some problems with the "compatibility" of the sprites, which cause anomalies in the client's HUD, we tried some solutions and, unfortunately, we could not REALLY solve the problem. I came to share with you the solution we adopted, in the future I hope to be able to make this work the way I would like. I'll leave the upscale I made in the game's base classes, so you can see the result better. https://www.mediafire.com/file/9srbjuf2fj7in8o/1-1_Class_MilleniumUpscale.zip/file these are some of the problems we encountered this diff basically removes the display of sprites in skill and equipment tabs this is the solution that was provided by @Secret (thanks for that) A possible solution would be to modify the default display frame from frame 0 to a higher number (frame 200, for example). But this requires knowledge of hex and I don't know how to do it Warp hide sprites.rar For those who have doubts about how to upscale, in this video I teach how I do it, I don't know if it's the best way, but I do it like this.
    7 points
  18. Hello people, its been a long time huh? Well I've been away from RO community for some years already, but recently I've been requested to work on some hairstyles, the idea was to rework some of the janky still beloved custom hairstyles, however things happened and this project will not go further, so I'm here to share what was done so far. Keep in mind that those are the spr and act files with the palette adapted for a specific server use, so I do not assure that it will fully work on your server, I'll leave the pngs public on my DeviantArt soon, so you can grab the heads and pack yourself if you know how to use the ACT Edtior. Also I want to note that the heads are not all mine since I've worked to fix the work of other authors, you don't need my permission to use it on your server, but as always, don't put a paywall behind the work posted here and don't try to sell or claim the job done yours. Now lets go for the screenshots and files. Here a sample of every hairstyle: Some Comparisons (New on the top, Old on the bottom): (here the new is on the bottom and the old on the top) Anf of course the DOWNLOAD: data.zip < This is a Data folder with the hairs inside, remember to rename the number to the macthing hair on your server or you'll replace the wrong ones! The names on the folder does not match with the 84 pack, so even if you use it, make sure to give the proper ids. And to finish, thank you for passing by and checking out my work, I barely visit this forum anymore so keep in mind that I'll not give support by this topic or DMs here. I also got permission to make these files public so please lets avoid the drama. See ya!
    7 points
  19. Afternoon everyone! Many moons ago we migrated our wiki content to Github in an effort to alleviate resources on our VM, increase our data's stability and in-general, significantly reduce the number of things that could go wrong. That was the plan. The plan worked well enough on all three counts above, however, Github Wiki's have this wonderful knack of not doing what they're supposed to when you need them to be helpful. For example, users needing special permissions to push new content to it (until very recently this has been "maintainer" access only), which means everyone has to rely on rA Staff to update the Wiki, which we evidently haven't had much time for. Now there's a new kid on the block; User-Guides! Guides from the Wiki will slowly be migrated to our new User Guides site (which you can help with, if you want to), which is a HTML website hosted using Github Pages, automatically generated from Markdown files that are stored in a Github Repository. Neat, huh! View the site at https://rathena.github.io/user-guides/ Because this new guide platform is built on a git repo, it means that anyone can contribute to it by opening a Pull Request. I've written some guidance here: https://github.com/rathena/user-guides/blob/master/CONTRIBUTING.md "What about all those guides on the forums" I hear you ask. Let's face it, 20% of them don't make any sense, 30% of them are inaccurate, 90% of them are outdated, 100% of them are developed with either bias towards specific software tools or just badly written due to language barriers or laziness. Far too often are links to out-of-date guides re-posted on the forums and in Discord, and we can't keep them updated because they're forum posts so only Mods can edit them (which is not what they're here for). From now on, well-written guides are to be posted to the User Guides repo. Guides posted on these forums will result in a message being sent to the author stating why we're going to hide the thread and then give a link to this post. What can you NOT post to User Guides? rAthena is a software emulation project. As such, guides pertaining to 3rd Party Tools or software will not be approved. This includes "How-To's" regarding the client, which is not actually within the scope of the rAthena project. We don't want to be sued ?, thanks. We have a new channel in Discord called #user-guides for discussions related to this area of the project. We would be very happy to see you helping our effort to migrate and write good, informative guides for our community to use and keep updated for years to come! Next we'll be working on doing something very similar to our source's /doc/ directory! Akky~
    7 points
  20. Version 1.0.1

    349 downloads

    Sunken Tower instance with infinite floors. The mob scaling is using custom values as I don't know how it is in kRO. Currently, the additional exp scaling and mob ATK scaling does not work without changing the source code. I will not be providing support for that.
    Free
    7 points
  21. 7 points
  22. Version 1.2.5

    10815 downloads

    Heya, This tool is an action file editor, it edits Act and Spr files. You will find similarities with ActOR in its design, but it should be much more enjoyable to edit animations ;]. Special thanks to Nebraskka for testing this software in its early days. All the suggestions and feedbacks made this software much better. How to install Download the zip archive provided from the download link at the bottom of this description or directly from there : http://www.mediafire.com/file/uoymx2vni249mlu Install the application with Act Editor Installer.exe; if you are missing a .NET Framework you will be prompted to download it. Once you are done, you can start the program from the link on your desktop. Key features The software has many, many features available. It would take too long to describe each one of them, so I've only focussed on the more impotant ones. You can undo and redo everything, scripts included. You can edit and add sounds easily. Powerful and easy to use palette editor. Sprite types have been abstracted - you don't have to worry or care about that. Animation speed can be changed easily. Most components have a drag and drop feature. Advanced scripting engine (C# language). The scripts can also be used to customize the software menus. Error checking when saving the act/spr to avoid invalid files. The sprite version will be automatically downgraded if RLE compression is not available. Frame interpolation (inbetweening/tweening) is possible via the Animation menu. Prompts you with an image converter dialog if the added image is invalid. Allows advanced edition for actions and frames via their respective menus. You can load files from GRFs directly (and save in the GRFs directly as well). Technical stuff Requires .Net Framework 3.5 (SP1) Client Profile to run (3.5 or more will work as well). When prompted with an error, use the "Copy exception" button to copy the debugging info. I will need this to fix the issue you're encountering. The editor's primary window The interface is really straightforward and similar to ActOR. I'll only focus on new elements! Rendering mode : This option changes the behavior of how layers are rendered. If you use 'Editor', you'll clearly see all the pixels when zooming in. If you use 'Ingame', it will use a linear scaling instead, which is closer to what the client does. References : These allow you to know where your item will be positionned (the yellow marker is the anchor, see below). Color mask : To edit the color of a layer, simply click on the color rectangle. You can also drag and drop the colors between different layers to quickly modify many of them. Common shortcuts : You can manipulate layers by using common shortcuts. More can be found from the Edit menu. These below are only the primary ones. Ctrl-A : Select all layers. Ctrl-C : Copy the selected layers. Ctrl-V : Paste the copied layers. Ctrl-X : Cut the selected layers. Alt-C : Copy current action. Alt-V : Paste current action. Advanced action and frame editions These expose all the available methods of the editor. You can remove a range of frames or copy a frame 10 times very quickly and easily. This dialog is found in Action/Frame > Advanced edit... Anchors You can edit anchors from the editor directly. Anchors are points that connect frames together, from different act files. Here's an example without and with anchors : This is mostly useful when you're using reference sprites (on the right panel). Clicking on the anchor button will let you choose where to attach the sprite (this is set semi-automatically for you though). You can edit those from the Anchors menu, but it is recommended to start from a pre-existing act to avoid doing this tedious process. Palette editor The palette editor allows you to quickly recolor sprites with an intuitive interface. Only indexed images can be edited (it's a palette editor after all) and three modes are available. The gradient mode changes an existing gradient to another color while keeping the original saturation and brightness of the colors - this makes the gradients blend in better. If there are no gradient (usually because it's a custom sprite), there's always the Adjust color mode. This one changes all color from a specified range to another one (Photoshop has a similar feature, which does work better). You can click on the image (on the left) to automatically select the palette indexes. These will be highlighted for a few seconds to show you what you're about to edit. Interpolation (tweening) This script can be accessed via Animation > Interpolate frames. This process fills the images between two frames by detecting the changes applied to the layers. Here's a simple example of how it can be used : Script engine The script engine can be accessed via Scripts > Script Runner. This is a big feature of Act Editor, it allows you to automate all your work with the act and much more. Click on the Help button for guides and available methods (don't hesitate to try out a script; if an error occurs the act will be reversed to its previous state). The documentation doesn't cover all of the available options and methods for obvious reasons (the .net framework is huge). Doc example : The language used by the script engine is C#. If you're not familiar with it, simply check out the script samples (Scripts > Open scripts folder)! I won't go into details here, questions can be asked in the support thread regarding addiotional features and methods. If you believe your script should be added in the program, send it to me and I'll probably add it. Customizable The settings dialog allows you to modify all colors in the editor easily. You'll also find the sound resources (GRFs and folders) that can be set up in the Sound tab. The Shell integration tab can associate the .act files with the software to edit them more easily. Don't hesitate to give me a feedbacks or suggestions!
    Free
    7 points
  23. In this section we are going to go through the steps to getting you set up with your very own server computer to run Ragnarok Online (and other games). Requirements : A Computer with at least 128 GB of space & 4 GB of RAM (8GB Recommended). Latest rAthena (Download here) Your own pre-made private client. (Not covered in this topic) Stable Internet connection. Ubuntu Bootable drive. (This guide was made using UBUNTU 22.04 LTS) Download Rufus if you don't have a bootable drive made. (Not Portable) Some time to process all of this information. Replace 127.0.0.1 with your Public IPv4 address. Wired Internet connection Optional Requirements : A Domain name SSL Certificates 32 GB Free Space (we will format it) Windows 10 ISO (x64) PRE-GAME SETUP Very Minimum system requirements : Operating System : Windows 95 to 11 CPU : Pentium II, 400MHz (or better) Memory (RAM) : 128 MB (or higher) Hard Disk Space : 7.2 GB (after system installation) Monitor Resolution : 640 x 480 (or higher) Video Card : Any with 3D Acceleration & at least 16MB on-board RAM Sound Card : DirectSound (or compatible with 3D Sound Effect Support) Internet Connection : 56 kbps (or faster) DirectX : 8.1 (or newer) Recommended System specifications : Operating System : Windows 10 CPU : Intel® Core™ i3-1305U Processor - 10M Cache, up to 4.50 GHz (or better) Memory (RAM) : 2 GB (or higher) Hard Disk Space : 128 GB (after system installation) Monitor Resolution : 1080x 720 (or higher) Video Card : Any with 3D Acceleration & at least 16MB on-board RAM Sound Card : DirectSound (or compatible with 3D Sound Effect Support) Internet Connection : 10 MB/ps (or faster) DirectX : 8.1 (or newer) ...... Now that we got a few things to get us moving let's get started... Section 1 - Installation STEP ONE: Making the Bootable (Rufus booter) i1.1.0 Once you've downloaded Rufus (here if still need) you will run it. You will a simple window with a basic user interface. Simple click "Boot selection" and make sure "Disk or ISO image" is selected. We will continue by clicking "SELECT" and choosing the Ubuntu disk image we downloaded earlier. The "Device" will be the USB drive we're making bootable: The default "cluster size" we'll leave as default. The "Volume Label" is what we will name the USB (optional). With that we're ready to click "START"! Here is what mine looks like at the end of it. STEP TWO: Setting up the OS (Ubuntu 22.04) i1.2.0 Upon booting up, you'll want to select "Try or Install Ubuntu". After this it will load up the start up interface. Follow the linear steps to install your new operating system. (NOTE: Ubuntu Pro is optional) We will do a normal installation for our example. After selecting the driver and location, you will need to create your user account. This is very important as it will contain information used further into the guide. Make sure you can remember your credentials. Getting used to the system will be beneficial for you. For this guide, we will navigate to your app menu located by default in the bottom left corner. STEP THREE: Preparing the Server (Adding Utilities & Libraries) i1.3.0 Here we are going to download a few necessary packages and then we will be able to simply update them whenever we need to using our update and upgrade commands. First thing's first. Let's update & upgrade our system. Type inside your terminal the following command: sudo apt update && sudo apt upgrade -y This will update and upgrade the system. Next we will need to install some packaged to run the server. Still inside the terminal, we will enter the following commands: sudo apt update && sudo apt upgrade -y sudo apt install build-essential zlib1g-dev libpcre3-dev -y sudo apt install libmariadb-dev libmariadb-dev-compat -y sudo apt install software-properties-common apt-transport-https -y sudo add-apt-repository ppa:ondrej/php -y sudo apt-get install php phpmyadmin mysql-server mysql-client git make gcc libmysqlclient-dev zlib1g-dev libpcre3-dev -y sudo apt-get install g++ From here we are ready to download rAthena. (If you have it downloaded manually and have a custom directory already ready for it, go ahead and upload it now. If not, follow these next couple steps to download and set the directory.) In this example, we are going to make the rAthena folder inside our Documents folder so we can find it easily. In your terminal enter in the following command to change to your documents directory: (replace the name with your user.) cd /home/raguser/Documents The terminal should now read something along the lines of: raguser@RagServer:~/Documents$ This is where we will create the rAthena directory. We will pull the rAthena trunk to a custom location we will name using the terminal. To do this we must enter in: git clone https://github.com/rathena/rathena.git ~/rAthena This will now clone the rAthena repository to the directory we specified as rAthena inside the Documents folder. Now we need to update the repo to make sure we have the latest files. Change directory using the cd command and entering in the new folder we just created: cd rAthena And pull the latest updates from the repository to ensure we have the correct version: git pull We now have a fully functional rAthena that is ready to be set up with our packet information, SQL database, our website, and more. In the next section we will cover how to set up the SQL server using PMA (phpmyadmin) right from the desktop browser! STEP FOUR: PMA & SQL (Setting up the database) i1.4.0 Now that we have a fresh rAthena installed, it's time to check MySQL to see if it installed correctly at the start. This may not be installed by default so follow the commands if you don't have it. To check the status of MySQL enter in your terminal the following command: service mysql status This will tell you what the status of your MySQL is. If this fails, install MySQL using: sudo apt-get install php phpmyadmin mysql-server mysql-client git make gcc You will want to select apache2 to install. Now we will have full access to MySQL! We need to start our first launch of SQL to get thigns started. To access SQL enter in: sudo mysql -u root -p This will access MySQL as the root user after you enter the password. (The password is the one you set up earlier when initially installing MySQL) Once authenticated and inside we can create a database and populate it with our server account. Creating the database is done using a few simple inputs. Enter in & modify the following details: CREATE DATABASE ragserver; CREATE USER 'raguser'@'localhost' IDENTIFIED BY 'StrongPassword'; CREATE USER 'raguser'@'%' IDENTIFIED BY 'StrongPassword'; GRANT ALL PRIVILEGES ON ragserver. * TO 'raguser'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'localhost' WITH GRANT OPTION; This created the database 'ragserver' and added 'raguser' to the database with full access. Next we need to make the logs and grant privileges to raguser on it. To do this enter in: CREATE DATABASE log; GRANT ALL ON log.* TO raguser@localhost; Now we can leave by entering in: quit This next part of this step is a little more complicated, but very simple to do. rAthena has a database in their files that we are going to pull the columns and rows from so we don't have to manually construct it ourselves piece by piece. Thankfully we can execute it all in two simple commands: mysql -u raguser -p ragserver < /home/raguser/rAthena/sql-files/main.sql mysql -u raguser -p log < /home/raguser/rAthena/sql-files/logs.sql And finally we are going to insert the first player account of our database. To do so we much enter & modify the following details. (This can always be changed later.) sudo mysql -u raguser -p Inside MySQL enter the following lines: INSERT INTO `ragserver`.`login` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `group_id`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`, `character_slots`, `pincode`, `pincode_change`, `vip_time`, `old_group`) VALUES ('20000000', 'admin', 'adminPassword', 'M', '[email protected]', '99', '0', '0', '0', '0', '2022-02-20 00:00:00', '', '2022-02-20', '9', '', '0', '0', '0'); (You can always change this later in the PMA window in the next steps.) It's time to check our SQL to make sure it looks as good as we think. To do this we are going to need to go to your favourite web browser and enter in the following website ( your website! ) http://127.0.0.1/phpmyadmin/ And we're in! Here inside PMA you will find all the accounts and database information. You can load item and mob databases directly to here and read from here instead of the traditional rAthena directory. There are many things to control inside here, especially if you're troubleshooting. (You also have an App icon in your menu.) STEP FIVE: Getting Green (Online) i1.5.0 Great! You're this far. Not much more to do from here. We're going to now navigate to your rAthena directory and edit the "char_athena.conf" script located in: /home/raguser/rAthena/conf/char_athena.conf Open the file with any text editor, the default one will work. Inside this file, near the top, will be the lines that show your Name & Password. These are for your Login database we set up earlier for phpMyAdmin (PMA). Search for and change the values to a random name and password: // Server Communication username and password. userid: s1 passwd: p1 For this step it is recommended to use random password generator of some sort. This never needs to be entered in manually anywhere. You can copy-paste it everywhere in this guide. In this example we are changing it to: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now the Server's username and password are set, we can change the "inter_athena.conf" file so that the server can read our database we set up. Navigate to: /home/raguser/rAthena/conf/inter_athena.conf This is where we are going to change some access information so the server can read through our MySQL login we made earlier. Find and change: // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: raguser login_server_pw: StrongPassword login_server_db: ragserver login_codepage: login_case_sensitive: yes ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: raguser ipban_db_pw: StrongPassword ipban_db_db: ragserver ipban_codepage: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: raguser char_server_pw: StrongPassword char_server_db: ragserver // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: raguser map_server_pw: StrongPassword map_server_db: ragserver // MySQL Web Server web_server_ip: 127.0.0.1 web_server_port: 3306 web_server_id: raguser web_server_pw: StrongPassword web_server_db: ragserver // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: raguser log_db_pw: StrongPassword log_db_db: log log_codepage: log_login_db: loginlog The last location we need to navigate to are our map server configurations. For this we will navigate to: /home/raguser/rAthena/conf/map_athena.txt Change the username and password for the server. It's the same as earlier: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now add (or uncomment) the following lines: char_ip: 127.0.0.1 char_port: 6121 map_ip: 127.0.0.1 map_port: 5121 In this part of the step we will configure the client to match your packet version. First we need to ensure "make" is installed. Enter in: sudo apt install make We'll need to give execution access to the configure file. Enter inside the rAthena directory (cd /home/raguser/rAthena) : sudo chmod a+x ./configure Then we are going to configure the server packet to match the client we downloaded. ./configure --enable-packetver=YYYYMMDD The YYYMMDD is your client version for your server.exe. Our example is going to be 20211103: ./configure --enable-packetver=20211103 Once you've done that we're all ready to get the green light. Let's test it out! Let's make a clean slate! Enter in the command while still inside your rAthena directory: make clean Now let's start constructing the server: make server After that's done loading, let's give execution access to the start files & servers: sudo chmod a+x login-server && sudo chmod a+x char-server && sudo chmod a+x map-server Time to start it up! (Make sure you're inside the rAthena directory) To start the server: sudo ./athena-start start To stop the server: sudo ./athena-start stop To restart the server: sudo ./athena-start restart To check the status: sudo ./athena-start status We're online! EXTRA STEPS (OPTIONAL) STEP SIX: DNS. (Mask your IP) i1.6.0 So many of you, like myself, would like to mask your IP address and the best way to do this is to use a domain name service to mask our IP. But does this mean you can't find my IP? No. This does not mean your IP is hidden completely. It just means people have an easier way of accessing your website on a more reliable and trusted connection. In this part of the guide we will go through the process of obtaining and setting up the DNS on your personal dedicated server. Let's start by understanding what DNS means. I'll be quick. What this is telling is, is that we can now take one thing (our IP) and mask it with another thing (domain name). That's short enough. Now some might be wondering... "Don't I need a website and a host for all of that?" The answer is Yes. We set that all up in the previous steps of this guide. You're all ready good to go. The first step is to navigate to your favourite (and trusted) domain name service provider. There are many out there that a simple google search can discover. In this example we are going to use Domain.com. It's affordable, takes Paypal, and has everything we need neatly displayed. Right in the middle of the landing page, you'll notice a search bar. It's large and ahrd to miss. This is where you will type your domain name you want to look for. Don't worry about attaching the endings onto it (.com, .net, etc) as it will give you a list of all the available ones. Purchasing a domain will create an account for you using the details entered in during the billing process. The basic domain I purchased costs slightly more because it's a ".net", which holds a premium standard these days. You don't need to worry about protection and SSL either. We will be managing that all from the server computer as well. For free. Once you find a domain name that fits what you want to achieve and your account was successfully created, it's time to navigate to your email and verify the website. This process is necessary to get the site online. We are now authenticated and ready to move onto the next part of this step. Now that we have a domain, what do we do now? How do we ge this domain name we now own onto mask your personal address? Keep following along. We're almost there! To confirm we have everything, in case there was an issue before, we're going run, in the terminal, the command: sudo apt update && sudo apt upgrade -y && sudo apt install apache2 -y Next we'll need a couple library files for the server to read the data. The following command will give us those libraries: sudo apt install php libapache2-mod-php php-mysql -y Now that we made some changes, it's always good to verify things are still where we left them. Let's verify PHP again to make sure it's the same version as before (8.2.2) php -v Earlier we made a web server. Now it is time to configure it! Enter in and customise the name: sudo mkdir /var/www/customName sudo chown -R raguser /var/www/customName This creates a folder and gives us full ownership of it inside the webserver directory. The custom name is for security measures. This is where we will upload our website and all the web files later. First we need to make a configuration file to run it properly. To do that we must enter in and adjust the name of: sudo nano /etc/apache2/sites-available/customName.conf An empty screen will appear. This is what we want. Now we can populate it with all the information necessary to maintain the web server. I recommend pasting this into a notepad and changing the values as needed. You will need your web site name, user name,custom folder name we made moments ago and your public IP address (v4). Change the values and paste it in to the blank page: <VirtualHost *:80> ServerName localhost ServerAlias kingsman-gaming.net ServerAdmin [email protected] DocumentRoot /var/www/customName ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> Now the website is almost ready. We've given it instructions where to go. All we have to do now is verify it and enable scripts for the site to operate. Let's start by reloading our web server. sudo systemctl reload apache2 You may have to reload the apache2 service. If this appears simply run the command again: sudo systemctl reload apache2 This will appear a couple times through this part. Next we need to enable the default script. To do this we will run a command called "a2dissite". What this does is uses system links to run the website and disaables them when needed. Once enabled, we can set and forget even after reboots. sudo a2dissite 000-default Now we're going to do the same thing, except for the config file we just created above. The name must be exact: sudo a2ensite customName Let's test the config to see if it throws any errors: sudo apache2ctl configtest It looks like we got an error! It reads: If you encounter this, it's a simple fix! Enter the command to edit the following file: sudo nano /etc/apache2/apache2.conf Now we need to go to the bottom of the page and insert (at the very bottom) : ServerName localhost And now we want to reload the apache2 service one more time: sudo systemctl reload apache2 Finally, we must route our public IP to the domain name. This is done in that DNS menu on our domain host website. Let's navigate back to Domain.com and set this up. Here we want to edit (or add if it's not here) the "A record" that points to the host configured IP address. We will simply click edit to change the existing record and have it reflect (and edit to match your public IP) the values below: A @ 127.0.1.1 And to prepare things for the next steps, we are going to navigate to back to our basic domain settings and make sure the settings reflect the following: (Auto-renew optional) This is telling us all the options are disabled. We won't be needing any of them supplied by the host. That's it for this part! Our web server is ready for a website to be added and for the DNS to be redirected in our network settings. In the next step we will go through securing the website with a security certificate. It's free and easy to set up. STEP SEVEN: Getting SSL Certified (HTTPS) i1.7.0 In this step we're going to get that SSL set up. Currently when we access our website it says HTTP. We are going to make it say HTTPS. Start by registering to SSL For Web. It's free and easy to set up. After registering, we're going to go right to the top right and click the create button. You will be given two options. DNS & HTTP. We are going to select DNS to continue. You'll also need to enter your domain name to continue. This is where it gets a little more complicated, so follow closly. You will be given two codes to enter into your DNS register. To find this, you will navigate to where you purchased the domain name and modify the existing DNS service to include these values. Simple, right? In our example we used Domain.com. So we will continue using them. Log in and navigate to your domain. On the left side panel you will have some options. Select the one that says DNS & Nameservers. You will get a window like this: We are going to click DNS Records. This is where we will enter those values SSL generated for us. Go back to the SSL page and copy the first value on the left. This is a challenge domain for your domain name. Go back to your DNS records and enter in a new record. The record type we want is TXT. Paste inside the "Name" box the value we jsut copied. Go back to SSL and copy the value on the left. This is going to be pasted in the "Content" box. Set the value to 1/2 hour and hit confirm. Finally go back and verify that it worked. (It can take up to 30 minutes to fully work, but is usually quicker dependingon the service.) There is a status checker so you don't need to submit every time. Use the scroll bar to go to the right and check the status. Now that we have the green light and a security certificate is added to the domain, we can download the certificates and add them to the server. There are two main types of certificate for use and a bundled version. All we need in this example is the Certificate and Private Key. Now that we have them, how do we add them? Leave this page open for now, as we will need it shortly, and navigate back to your terminal. We're going to enter a few commands to get things set up on our dedicate server. Enter in to edit your certificate file: (rename to your website) sudo nano /etc/ssl/certs/kingsman-gaming.net.crt Then paste your certificate value that was given to you. We're looking for the Certificate. It now looks good to save! (CTRL-X, then enter Y to confirm) Now we must give it the key to the certificate. Enter in and edit the file: sudo nano /etc/ssl/private/kingsman-gaming.net.key We want to populate it with the key that SSLForWeb gave us. Go ahead and paste that in, then save the file. The last certificate we're going to add is the CA bundle. This will be used in the later steps, but let's add it now since we're here. Create a new file and give it adifferent name. In this example we jsut added ca. to it: sudo nano /etc/ssl/certs/kingsman-gaming.net.ca.crt Certificates are added and ready to go. Here we will go back to our server config file we made earlier and set it up for SSL encryption. Open: sudo nano /etc/apache2/sites-available/customName.conf We want to change the values to reflect: <VirtualHost *:443> SSLEngine on SSLCertificateKeyFile /etc/ssl/private/kingsman-gaming.net.key SSLCertificateFile /etc/ssl/certs/kingsman-gaming.net.crt ServerName localhost ServerAlias kingsman-gaming.net ServerAdmin [email protected] DocumentRoot /var/www/customName ErrorLog ${APACHE_LOG_DIR}/kingsman-gaming.net_error.log CustomLog ${APACHE_LOG_DIR}/kingsman-gaming.net_access.log combined <Directory /var/www/customName> Options FollowSymlinks AllowOverride All Require all granted </Directory> </VirtualHost> Then enable SSL to run scripts: sudo a2enmod ssl Let's break that down.... <VirtualHost *:80> is set to a standard, non-secured, port. We updated this to a secure port to allow the security certificates through. We added three lines to the top. These lines will be read first and indicate we are turning the SSL Engine ON, setting the Certificate Key file to our private ssl folder, and setting the Standard Certificate file to our certificate folder. And at the bottom we added some additional options for some System Links, Overrides, and Permission granting. Now the server can read all the security changes we made! Once we save that file we are going to enable the SSL scripts in the server. This was done simply with one command. With all this done, we have only one more step left to complete before we can fully set up SSL on the server. We need to allow our SSL access through the firewall. We can do this very easily with the following commands: sudo ufw allow 443 Your firewall should now appear with these ports for all of default Ragnarok services: (Check out open allowed services with sudo ufw status) 443 ALLOW Anywhere 5121 ALLOW Anywhere 6121 ALLOW Anywhere 6900 ALLOW Anywhere 3306 ALLOW Anywhere 80 ALLOW Anywhere 22 ALLOW Anywhere 21 ALLOW Anywhere If you don't ahve an active firewall you can enable it with: sudo ufw enable With all this added, we are now going to check the syntax for the apache2 configuration to make sure it's still "OK" and restart the apache2 service: sudo apache2ctl -t sudo systemctl restart apache2 Common issue after this step: This is caused because the SSL scripts have to be passed through the system still. To do this we can enter in two commands to set this up: sudo a2enmod ssl sudo systemctl restart apache2 That's it for this step! We now have an SSL connection for our webserver. In the next section we will go through various methods of setting up the File Transfer Protocol (FTP) for our webserver. This is great for setting up files from your server for others to download. Users can download files directly from the web server. STEP EIGHT: File Trasnfer Protocol (FTP) i1.8.0 We're going to enable this on our server to allow users to download various files we set up in the download folder. Let's start by making that folder. Change directory to your web directory. We modified it earlier above: cd /var/www/kingsman/ Now create a directory: mkdir download We now have a folder where we will be adding out downloadable files. Let's get the libraries ready for the web server. Enter in: sudo apt-get update && sudo apt-get install openssh-server It will be a linear installation. Once it completes we can check the status of it: sudo systemctl status ssh If it failed to start load it again with: sudo systemctl start ssh Once we set the configs we're all ready to go. Edit the file: sudo nano /etc/ssh/sshd_config These settings will be added at the very bottom of this document. Scroll to the bottom, add & edit the following values: Match User raguser ForceCommand internal-sftp PasswordAuthentication yes ChrootDirectory /var/www/kingsman/download PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no Save the document and exit. (CTRL + X then Y & Enter) Restart SSH with: sudo systemctl restart ssh We now have a fully functional FTP server attached to the web server. Now to get links for your files, you'll need to understand how the folders work in the web server. This part is completely ignored in the link you will generate: /var/www/kingsman/ Your link will be the default web address, so let's start with that: https://kingsman-gaming.net/ That's the start. Now we need to add our download folder. We know the default location is /var/www/kingsman/ directory, so this means kingsman-gaming.net is that location. To add the downloads folder we simply just separate it with a " / " and add the download directoy, exactly how it's spelt,in the file hierarchy: So /var/www/kingsman/download becomes: https://kingsman-gaming.net/download/ You can add as many directories as you can fit into the web address search bar and break off from the download folder to download other parts of the site. You'll add the file name to the link for which ever file you want to download. For example, I want to download VLRO.zip: https://kingsman-gaming.net/download/vlro.zip Now we have a place players can download our server from. Simply upload your files inside this download folder and send the link to your players to download. In the next step we will go through how to create a launchable version of Windows 10 wil your Ragnarok Online server set up on it. We will also go through various tools that will be useful to development. STEP NINE: Emulating Windows 10, Ragnarok & RO Tools (QEMU/KVM) i1.9.0 In this step we will be going through how to build and run a virtual machine based on Windows 10 operating system with our Ragnarok Online server installed onto it. Make sure to download Windows 10 ISO while we work. This will save some time later. You may also want to consider moving it to a new directory inside your Documents folder. We'll be doing this for our example moving forward, as well. Start by check that your system is Virtualization Ready. Enter in the terminal: egrep -c '(vmx|svm)' /proc/cpuinfo If your system is Virtualization Ready it will appear with a number greater than 0. My number came out as 16, so we're good to check if the system is supported. To do this enter in: kvm-ok If the system does not have the checker, you can enter this command to enable it: sudo apt install cpu-checker -y Now that we found out we can support virtualization it's time to install it, along with the librarfies neeeded to run it. Enter the following command to run all of this in one go: sudo apt install qemu-kvm virt-manager virtinst libvirt-clients bridge-utils libvirt-daemon-system -y We're going to run two more commands to make sure we have the virtualization daemon. Enter in: sudo systemctl enable --now libvirtd sudo systemctl start libvirtd Now check the status of to make sure it's online and everything is green:\ sudo systemctl status libvirtd Everything looks good so far! Before we can run the program we need to give our user specific permissions to access the daemon. To do this we will enter in: sudo usermod -aG kvm $USER sudo usermod -aG libvirt $USER We are now ready to launch! You can start the application in the application menu using the icon it supplies. (It can take a minute to populate) If you can't find it, or it hasn't appeared yet, you can manually run it with the command: sudo virt-manager You should now have a window that looks like this: If you experience an error trying to connect after finishing up to this part of the step and it reads something along the lines of: Unable to connect to libvirt qemu:///system.Verify that the 'libvirtd' daemon is running. Error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied It is recommended to restart your computer and try connecting. Sometimes after the installation it won't have all permissions set properly. A full restart of the system can resolve this. Now that we are set up, it's time to create a virtual machine! Go ahead and click the New Machine button at the top left. We're going to select Local install media from the list and select the ISO file we downloaded at the start of this step. (If you didn't donwload it before, now is a good time to. While you're waiting you can reflect over the steps you've went through to get this far. It is good to understand the system and how you got here.) We'll want to click "Browse..." and a new window will appear. Here we have our default filesystem directory. This is a default directory that is given with the application. We don't have files in this folder so we won't focus on this. At the bottom left, there's green " + ". Click it. Now we are presented with options for renaming the pool, changing the type of file it is, and setting the target path for where to read and write data. We are only going to focus on two of these options in this step. Name & Target Path. We'll give it the name "DiskImages", though you can name it anything you want, and we want to select the path to be the folder we created inside our Documents which holds the Windows 10 ISO. We now have a link to this folder inside the KVM. If we select it, we can now see the Windows 10 64 bit ISO is there. We will click it and Choose Volume. The applicatiion will likely guess that it is Windows 11, so we need to uncheck that box and change it from an 11 to a 10. Change to Press Forward and agree to the promt. You can click the Don't Ask button for future changes. Now we must set the amount of RAM and Cores to use. We can change this any time after shutting the virtual machine down. For now, we will use the default 8G and 4 Cores. (Recommend: 3G RAM or more, 2 cores or more for this setup) The next part of this step is to create the virtuale machine's hard drive. To do this we need to let the VMM do a rather long process to the 32 GB of space that will add a system file to a size we pre-determine, and it will allow us to boot Windows 10 off that space and dedicate it a hard drive to store files. It sounds complicated, but it's really simple to do. It just takes some time if you have larger spaces to work with. Moving forward, we much select "Enable Storage for this virtual machine" and we will then go to the bottom and select "Create a dusk image for the virtual machine" and click "Forward". If we get asked to grant search permissions for the path. Click YES. Now we are ready to create the Windows 10 disk space. Double check the information is correct, mainly the Windows 10 operating system doesn't say Windows 11. It will launch automatically for the first time on Finish. You will now be able to set up your emulated Windows 10. (If you encounter...) ERROR: If you experience an error, roughly like the one I created above, it's possible that the QEMU user does not have access to this directory still. You can manuall add this access very easily. Enter in the command to check the permissions, first: The output should look close to this: This is showing us that our QEMU is not here on the list. Let's add it: sudo setfacl -m u:libvirt-qemu:rx /home/raguser/RagDisk Now if we run the command to check it again: sudo getfacl -e /home/raguser/RagDisk We can see that the user is added successfully. Finally, Restart the Virtualization library and you're ready to continue on to the next parts of this step: sudo systemctl restart libvirtd You should be ready to launch now! We've got Windows 10 running and Updated as much as it can get. We're going to install a few necessary applications to run our programs and the game itself. Download the following files from the following (trusted) sources: -Microsoft Direct X Runtime -Visual C++ Redistributable for Visual Studio 2015 -.NET 6.0 or 7.0 -(Optional) RO Tools List With everything installed, and the system fully rebooted for good measure, we're ready to get started with the game installation. STEP TEN: Setting up rAthena Source (Game Files) i1.10.0 Now it's time to get rAthena set up so we can get players connecting to the server. First thing's first! Organise and familiarise yourself with the files. This is where you will be spending lots of your time. This will be an ongoing process once you complete these steps. In this guide, it will give you some organization pointers. Take your time with this and get used to how you lay things out. You will navigate back and forth a lot during a maintenance. If you have not already downloaded rAthena we will go ahead and do that now. The following commands will change your directory to the root for your profile, next it will make a "Server" folder for you to operate in, and finally it will download the rAthena trunk to that directory. Finally we will enter that directory to process the remaining steps. cd sudo mkdir Server git clone https://github.com/rathena/rathena.git ~/rAthena cd rAthena To update rAthena to the latest verison we need to process a git-pull while inside the rAthena diretory. git pull Now we've got rAthena's latest trunk and all the updates! It is important to get a good, or at least an okay, understanding of how rAthena has all their files organized. Things are in a specific place and named specific things for a reason. If you move or rename a file or folder it will cause you many problems. Source files are where you will make changes that will affect the entire game and the way it functions. Be very careful when editing these files and stay within the lines of the cave if you don't know what you're doing. Config files are where you will make the majority of changes to your server. This is where things like Drop rates, EXP rates, and all your Server settings will be located. In the continued steps below, we will go through how to set up the remainder of the server. It's time to create a database for all the player accounts to be saved to. To get started be sure you've followed the previous steps for setting up PMA (phpMyAdmin). Now that we have access to MySQL we can start by entering in some commands to give us access to the databases involved. Open the terminal and enter in the following: (Note: You set the username and password earlier) CREATE DATABASE ragserver; CREATE USER 'raguser'@'localhost' IDENTIFIED BY 'StrongPassword'; CREATE USER 'raguser'@'%' IDENTIFIED BY 'StrongPassword'; GRANT ALL PRIVILEGES ON ragserver. * TO 'raguser'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON * . * TO 'raguser'@'localhost' WITH GRANT OPTION; This created the database 'ragserver' and added 'raguser' to the database with full access. Next we need to make the logs and grant privileges to raguser on it. Enter in: CREATE DATABASE log; GRANT ALL ON log.* TO raguser@localhost; Now we can leave by entering in: quit Majoirty of the database is set up now! This next step is a little more complicated, but very simple to do. rAthena has a database in the server files that we are going to pull the columns and rows from so we don't have to manually construct it ourselves piece by piece. Thankfully we can execute it all in two simple commands: mysql -u raguser -p ragserver < /home/raguser/rAthena/sql-files/main.sql mysql -u raguser -p log < /home/raguser/rAthena/sql-files/logs.sql Now we have an almost-fully functional database for the server. It's time to create the first account! Back to the terminal, we are going to enter and log in to MySQL again: sudo mysql In MySQL enter in: (Before submitting this to the database, we are going to change the Login Name, User Name, Password, & Email) INSERT INTO `ragserver `.`login` (`account_id`, `userid`, `user_pass`, `sex`, `email`, `group_id`, `state`, `unban_time`, `expiration_time`, `logincount`, `lastlogin`, `last_ip`, `birthdate`, `character_slots`, `pincode`, `pincode_change`, `vip_time`, `old_group`) VALUES ('20000000', 'admin', 'adminPassword', 'M', '[email protected]', '99', '0', '0', '0', '0', '2022-02-20 00:00:00', '', '2022-02-20', '9', '', '0', '0', '0'); Great! You're this far. Not much more to do from here. Navigate in WinSCP/FileZilla (or other FTP access app) and go to your directory: /home/raguser/Server/rAthena/conf/char_athena.conf Inside this, near the top, will be the lines that show your Name and Password. These are for your Login database we set up earlier for PMA. If you haven't changed these yet, do so now. I recommend a random generator for the values. A simple Google search for this will help. Search for and change the values to a random name and password: // Server Communication username and password. userid: s1 passwd: p1 These values must reflect what is inside the login database or the server won't be able to connect. Do not share these values. With anyone. Now the Server's username and password are set, we can navigate to: /home/raguser/rAthena/conf/inter_athena.conf This is where we are going to change some access information so the server can read through our MySQL login we made earlier.Find and change: // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: raguser login_server_pw: StrongPassword login_server_db: ragserver login_codepage: login_case_sensitive: yes ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: raguser ipban_db_pw: StrongPassword ipban_db_db: ragserver ipban_codepage: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: raguser char_server_pw: StrongPassword char_server_db: ragserver // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: raguser map_server_pw: StrongPassword map_server_db: ragserver // MySQL Web Server web_server_ip: 127.0.0.1 web_server_port: 3306 web_server_id: raguser web_server_pw: StrongPassword web_server_db: ragserver // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: raguser log_db_pw: StrongPassword log_db_db: log log_codepage: log_login_db: loginlog The last locations we need to navigate to are our map server & subnet configurations. Navigate to: /home/raguser/rAthena/conf/map_athena.txt Change the username and password for the server. It's the same as earlier: userid: 4Xy3NAKxnl3sk6Aj passwd: 79y59S3m8lWmMDMS Now add (or uncomment) the following lines: char_ip: 127.0.0.1 char_port: 6121 map_ip: 127.0.0.1 map_port: 5121 And finally adjust the subnet to match your server's IP address. This step can be a little tricky if you don't understand how a subnet works. So simply follow below and replace x.x.x.x with your server's IP address: subnet: 255.0.0.0:127.0.0.1:127.0.0.1 subnet: 255.0.0.0:x.x.x.x:x.x.x.x Excellent! You're near the end. It's time to configure the client to your packet version. Let's give execution access to the configure file: sudo chmod a+x ./configure Then we are going to configure the server: ./configure --enable-packetver=YYYYMMDD The YYYMMDD is your client version for your server.exe. An example of how this looks is: ./configure --enable-packetver=20211103 Congratulations on making it to the end of setting up your server. It's time to start it up now! Let's make a clean slate! Enter in: make clean Then let's start constructing that server. Enter in: make server After that's done loading, let's give execution access to the start files & servers: sudo chmod a+x login-server && sudo chmod a+x char-server && sudo chmod a+x map-server Time to start it up! (Make sure you're inside the rAthena directory) To start the server: ./athena-start start To stop the server: ./athena-start stop To restart the server: ./athena-start restart To check the status: ./athena-start status That's it for this step. If you followed up to here you'll have a all server files downloaded and ready on the server side with a database ready to accept logs and registrations. In this next step we will go through the systemd.service files to get your server running automatically when the system restart or if it crashes. STEP ELEVEN: Setting up UFW (Firewall) i1.11.0 When setting up the firewall, we want to make sure we know exactly what ports we are adding in before we add them. This will save us from having to deny thema ccess later. Let's gather the ports we know of for all the services we've set up thus far. We know of our Web ports, which should be automatically added when installed, but sometimes this isn't the case. We've also got the FTP ports for the download servers, if we want to use them. There's also the PMA & SSH ports. Are you writing this down? sudo ufw allow 443 sudo ufw allow 80 sudo ufw allow 20/tcp sudo ufw allow 21 sudo ufw allow 22 sudo ufw allow 3306 sudo ufw allow 6900 sudo ufw allow 5121 sudo ufw allow 6121 sudo ufw allow 8888 Sometimes you might still get some issues with the firewall blocking you. You may be required to let the firewall know what type of conneciton to allow, either TCP or UDP; but what is TCP/UDP you might ask? Very simply put... TCP means Transmission Control Protocol which runs a more reliable connection, however, it can lack in transfer speed. UDP means User Datagram Protocol and it has a much faster transfer rate of data, but can be unreliable in sending said data. What does this mean for you? You can choose to do UDP all accross the board since Ragnarok uses small packets of data compared to a much larger scale game. Just my recommendation. However, if you want absolute data transfer at the highest success rate to avoid lost packets and data, then do TCP. Still confused? Do both in the firewall. An example of what the command will look like for adding TCP/UDP: sudo ufw allow 5121/udp sudo ufw allow 5121/tcp Now that we've got an understanding of the firewall and the ports we have added we can now relax knowing the firewall will protect us from majority of threats. STEP TWELVE: Setting & Forgetting (Auto-Start scripts) i1.12.0 I hate when the server crashes. But you know what's worse? When it doesn't come back up until an admin turns it on. In this step we will go through the simple setup process to get your server ready to start when you load your system and reboot if it crashes. Start by opening up the terminal and entering in the following command to create a new system.service file: sudo nano /etc/systemd/system/ro-login.service This will create a system service file which we will enable later to start automatically. Inside these service files will be a series of commands that will allow the server to boot up automatically when it experiences an outage for a speificied amount of time & when starts the system after a reboot. Populate the file and edit the values to match your rAthena directory and User Login name: [Unit] Description=Ragnarok Login-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/rAthena/login-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target We are going to do this two more times. Once for Character Server & another for the Map Server. sudo nano /etc/systemd/system/ro-char.service Populate with: [Unit] Description=Ragnarok Character-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/Server/rAthena/char-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target And now: sudo nano /etc/systemd/system/ro-map.service Populate with: [Unit] Description=Ragnarok Map-Server After=syslog.target network.target mysqld.service [Service] WorkingDirectory=/home/raguser/rAthena User=raguser ExecStart=/home/raguser/Server/rAthena/map-server ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=15s [Install] WantedBy=multi-user.target We will now start them all and check their status: sudo systemctl start ro-char sudo systemctl start ro-map sudo systemctl start ro-login sudo systemctl status ro-char sudo systemctl status ro-map sudo systemctl status ro-login Once we have the Green light on the status we can go ahead and enable the scripts to automatically start on boot. Enter in: sudo systemctl enable ro-char sudo systemctl enable ro-map sudo systemctl enable ro-login That's it! You're set to boot up automatically after a crash and upon system restart. Well done! Section 2 - After-Installation Now that we've got everything set up this far, we can continue maintaining & updating what we've started. Continue below to learn more on how to maintain the server after you've set it up. Requirements : Latest NEMO release An executable update from NEMO's website Latest FluxCP from rAthena STEP ONE: FluxCP (Registration & Logins) i2.1.0 Everyone needs to register somehow, right? We're mostly all aware of the high risks with enabling registration via "_M/_F", if you're not... In short: Don't use it if you're opening the server to the public. It can enable botters, spammers, & hackers the ability to just create infinite accounts and continue their schemes easier. With FluxCP we can help avoid this by limiting the amount of registrations allowed per person. Let's dive into it now. Gather your resources! You'll need to download the latest FluxCP by clicking that link. If you missed it, here's the link again: https://github.com/rathena/FluxCP This is where we will manage all the registrations to the game as well as many other fun functions we will get into later. For now download & extract this entire directory into your webserver. I put mine in the primary (root) directory of my webserver. That's the folder we created earlier with the custom name we provided. In this example we used "kingsman" as the custom name. The folder path is: /var/www/customName Our final output will look like not include the folder. This means we must drag all the contents into the root directory of the webserver. Now we should look like this at after extraction: Enter the config folder first. This is where we will be doing all the work for setting up this control panel. Inside the config folder you will have 31 files to select from. We're only going to work in two of these for this step. Open servers.php and you will see a set up similar to earlier where we added some settings for rAthena configs. They are the exact same configs. Go ahead and add that in there exactly as you did in the configs earlier. Now that we have our config looking good, let's scroll down towards the bottom and edit our rates to reflect that of our server's. This will display the rates set up in your databse as well so players can use that to search drop rates on your server. Change accordingly! That's it for the servers.php! Save that & move to the next file. Let's now open up application.php and edit the first few lines we see. We want to change the base URI to be blank. This will set it to the root directory where we hold the control panel. Server Address is going to remain localhost since we are running it on the localhost. And finally we need a storng password to gain access to the administration panel to set it up. 'ServerAddress' => 'localhost', // This value is the hostname:port under which Flux runs. (e.g., example.com or example.com:80) 'BaseURI' => '', // The base URI is the base web root on which your application lies. 'InstallerPassword' => 'superduperstrongpassword,man', // Installer/updater password. Save that and open your website now! You'll likely get several permission errors. Copy waht they say for you to do, it will be a sudo chmod command giving access to the logs. This is necessary to proceed to the next part. Add sudo before each command or it won't work. You'll need to enter your password into the control panel shown after granting permissions to FluxCP. After the password is successfully added it will update your PMA database with all the new information for FluxCP's registration and logins. Your panel should look like this by default now: You now have a palce where you can register and manage accounts! Navigate through the application.php file to change some various settings like your control panel name and what is displayed. You can also adjust the ports if they are different during the previous set up. STEP TWO: My First EXE (Making an Executable) i2.2.0 Now that we've got everything set up on the server-side of things it's time to work on the client-side of things now. Let us start first by making an executable. this will be the CustomRO.exe that players will use to run the game. Launch NEMO and give it a moment to load up. In a compact form, this is waht you'll see. What this is showing us is that we can Load a client, which we downloaded from the "Requirements" section above, we can apply patches, select the recommended patches, select previously loaded patches, load a pre-saved profile, and save an existing setup as a profile to load later. for this example we are going to use the current recommended version in rAthena's trunk. This is version "2021-11-03". We are presented with a file that will launch a terminal to download the latest executable. It will look similar to this: Now we have the executable ready to be patched. Back inside NEMO, we want to browse to that file we just downloaded and select it. You can change the saved outpute file name here or rename it anytime later. Here we will change it now. Click "Load Client" and a list of patches will populate. Now we want to "Select Recommended" patches given for for the executable. To apply these patches simply click the "Apply Selected" button and it will pack it for you. Brose the patches and select any patches that will help you or you might use in the future. For this example we are changing the Client Title name, the ItemInfo.lub or ItemInfo.lua and a majority of other changes that will allow the client to read LUA files over LUB files. Take your time going through the list. It will take a while the first time around. With all the patches applied we now have en executable in our output folder. But it came with other files, what do I do with those? You only need the custom executable we made (CustomRO.exe). This is going to be sent to the players and the rest will be removed from the client folder You're now ready to send this to other players! STEP THREE: My First Patcher (Making a Patcher) i2.3.0 We've got a client executable and it's fully patched the way we like. This is a great start! Now it's tie to send players an update. Through the patcher. But we don't have one yet! In this example we will go through the steps to creating a patcher using Thor Patcher from rAthena download section. Your extracted package should reflect similar to this: We want to enter the Configuration folder and edit the config.ini file located inside. Inside this config file are the lines necessary to connect the client to the server and send files from the server to the client. In the first few mines we'll edit the values to reflect our server values: The IP can be our website, this example is jsut a localhost address. Remote config file we will leave as default. Status file we can name server.dat. This can be anything, however. The custom GRF we have for our server, listed as number 0= in the data.ini. Finally our custom client executable we made earlier. Further down the page we have the title of the patcher. This can be anything. And lastly our notice page which will have a brief text description for the updates on the patcher front page. Save that and we're ready to launch the config generator. Drag the config into your .../Thor_Patcher/Patcher folder and it you're ready to copy them to your CustomRO client files. When compelte you'll have a patcher similar to this: You're made your Patcher now, well done! STEP FOUR: My First Patch (Making a Patch) i2.4.0 Keeping organised is key to staying sane. Let's start off by making a couple folders. A Patches folder & a data folder. It should look like this now: Patches/data This should look familiar. It's the same set up as the GRF. We will now be able to drag all the files we want to patch into this directory. One more folder we want to make is going to be the Output folder. This is where all the patches will be saved. There will be two more options to deal with. We want to set compression to HIGH and in the Options tab we want to set the file type to ACSII. It should reflect the below image. Once that's set we can click "Generate" to make the first patch. It will be create in the Output folder we selected. That's all there is too it! You've created your first patch. STEP FIVE: Sending The Patch (Sending Patches) i2.5.0 We now have it all. The Patcher & The Patch. Things are great. But how do we send it to players withing them having to redownload the entire GRF? Great question! In this next step we will cover how to add the patch to the webserver and get it ready for players to recieve when they load their patchers. In step i2.3.0 we covered how to set the patcher up in the web server. This is the file structure we will continue to follow moving forward. Let's open open up our file browser for accessing the server trunk, if needed, or it you're running your own system you can also navigate to the web server folder. The directories are the same either way. /var/www/custom/patch/ This is the directory we wil be working in regarding the patcher. It should now represent the image below: Let's break this down first... We have: The data folder. This is where we will add the patches into after we name them. The Background image. This will be a back ground image for the patcher to load. You can even leave this transparent if you want. Our main.ini is where we will configure the settings for the patcher. We will go through this soon. The notice page will be need to be updated with each news change. This is a very simple text edit. Keep it short and simple. Our patch list text file is where we will add the patches. The format will be discussed soon. Our Style sheet. This is the style arrangements for the pages. We usually don't need to modify this unless we know what we're doing. First thing to do after we have a patch made is to give it a name. What do you ask? A very specific name. In this example we will follow a date format with a part value in the event of more than one patch in a day. Our name in this example will be the date followed by a version number, or update number. 24012024-1 This well tell me that the patch was set for today and it's the first path released of that day. Now we can edit the plist.txt and add this patch into the list. Inside the patch list we will enter in the exact namme of the patch. Including the ending. Our names will start with an index number first. This is the order at which the patcher will read the patches. The index starts at 0 and is followed by a SPACE and then the item name. 1 24012024-1.thor Save and it's ready to load through the patcher! Finally we need to tell the website to send patches to players. Open up the main.ini file with a text editor. We're going to modify the line that asks for a website address. Search for "file_url=" ad edit that to be your website. Save and it's ready to go! That's pretty much it for uploading patches to the server. You're all set to start updating players with new content! STEP SIX: Adding/Removing Maps (map_cache.dat) i2.6.0 Got a enw map you want to try out or is your current map not up to date with your pathing? In this step we're going to add maps to the map_cache.dat, remove maps if needed and update the list with our new maps. First start by downloading the Map Cache Editor from the trusted rAthena source: HERE You'll be presented with a window that looks like this: What we want to do next is download our map_cache.dat from the server trunk: rAthena/db/map_cache.dat Once downloaded it will be able to drag and drop that file into this window. We now are presented with a list of maps. From here what we want to do is drag and drop all our map's .gat files from our GRFs into this window. this will update the walkable paths for the map. This is especially important when you cannot walk on certain maps due to old GAT configurations, It still thinks there are structures in the way. To delete a map you can select it and click delete. Simple as that. Save the Map Cache and reupload it to your server. That's it! Nice and quick. Section 3 - Optional Options Things are running now, yeah? That's great to hear. Sometimes they may require additional software, maybe another step or two, or maybe you need something else for it all to work. Below are some steps that are completely optional but might just help you out in some situations. STEP ONE: Forwarding a Router (Port Forwarding) o3.1.0 Understanding what port forwarding is will be an important start to not having your network breached. In this step we will go through the basics of forwarding your port through your router. The user interface (menus) will look different for each router brand, however, the concept will remain the same universally. Check your router software for updates before making any changes. Let's begin! Accessing the Router To access the router we want to first ensure we are connected to the internet using it. Next we will open the trouter software through our web-browser. To access that page we will have to enter the local domain IP to gain access to the initial menu. In your address bar enter in: 192.168.1.1 If this DOES NOT work try entering in: 192.168.0.1 My basic Netgear modem has a menu that looks like this. I'm going to want to click into Advanced Settings & open up the Port Forwarding option. We are now presented with a window similar to this. It will give us all options for forwarding our ports. Let's get an understanding of what's here before we continue... We will select between Forwarding and Triggering. Since we don't need to trigger a port we will focus only on Forwarding it. There are many types of services that might be precompiled in your router. For our Ragnarok Online server will be making a custom service. It's not as hard as it sounds, don't worry! The device IP we want to connect is a little different. It has to be exactly what device you have the server under. Let's navigate to the device list on the router. This will be under the "basic" settings, usually. It shows here I have 3 devices listed. An Amazon Fire stick, My cell phone and a PC I built specifcally for this guide. That's exactly what we are looking for, too! It looks like the device I am forwarding resides under the IP ending with 7. Okay, so we now understand where the ports are going to and waht device has them. So it's time to make that custom service we spoke of earlier. This interface has a button, making it very convenient to start. We're going to go ahead and click the "Add Custom Service" button. With the custom port window we can now add our ports for Ragnarok to run. We will need to process this 1 number of times as we have more than one port for Ragnarok Online services. The ports we need to add are: 3306, 6900, 5121, 6121, 8888 Make sure to select the proper device for it to work as we want it to. After they are all applied, it will represent something similar to this: That's it! Your ports are now open & ready for users to connect through to. Make sure firewalls are enabled at all times. STEP TWO: Automatic Server Backups (World Runner) o3.2.0 This script will automatically save your server to your server_backup folder every 24 hours. This time is completely adjustable in time and destination. I originally made this for Minecraft hence the name World Runner. Open the terminal and enter in the command: sudo nano /etc/systemd/system/worldrunner.service This will create a service script we will set to run on start up. Inside this document we are going to add int the following script and change the destination values to match our back up folder destination: [Unit] Description=This will copy the Server folder to a back-up location [Service] Restart=always RuntimeMaxSec=1d User=raguser ExecStart=cp -r /home/raguser/Server/rAthena /var/www/raguser/Documents/server_backups/ RemainAfterExit=yes [Install] WantedBy=multi-user.target Now we want to enable it on start-up: sudo systemctl enable worldrunner If you're having issues with it executing properly we can simply grant permissions to the file to do so: sudo chmod 600 /etc/systemd/system/worldrunner.service We now have the trunk backing up now, but what about the SQL server? For that we need to edit a default file structure in Ubuntu called Cron. Cron can hold automated tasks on a timer, or schedule, just like what we want to do for backing up MySQL. Enter in the terminal: sudo nano /etc/crontab You'll be presented with a window simial to this: As you can see here they are displaying each value for the job. First digits represents Minutes and the second digits represents Hours. These are the two we'll primarily need for daily backups to occur. At the very bottom we are going to add the following line: (NOTE: Include your password after the -p. My password is "69SuperStrongPass69" so the password section will look like -p69SuperStrongPass69 ) 0 0 * * * root mysqldump -u raguser -p69SuperStrongPass69 --all-databases | gzip > /home/raguser/Documents/Rag_SQL/ragserver_`date +%d%m%Y-%H:%M:%S`.sql.gz This will set the back up time to be at Midnight each night using the PMA login we set up earlier, backing up our ragserver database into a zip file at the directory ~/Documents/Rag_SQL. NOTE: Avoid use of these symbols in the password field: ) ( ' ` Finally we need to restart the service for it to take effect: sudo /etc/init.d/cron restart That's all there is to it! Keep up to date with the latest changes & updates to this guide. Want to see something included? Suggest it below!
    6 points
  24. Heya, I've been receiving messages about people selling NovaRO's decrypted GRFs and honestly... that's beyond stupid. The server is already closed down, anyone buying this is getting straight up scammed. You could have just asked. I put the key attached down there. I'm too lazy to upload the GRFs though, you'll have to find that yourself (or if someone want to host it and link it below, go ahead). Plus, we released installers without the files encrypted on accident multiple times, so it's not like these files weren't already accessible to begin with. nova.grfkey
    6 points
  25. 1. rathena/src/map/script.hpp Search: HAT_EF_MAX Replace: /* Custom Hateffects */ HAT_EF_arcane_aura_A, HAT_EF_arcane_aura_B, HAT_EF_gluttony_aura_A, HAT_EF_gluttony_aura_B, HAT_EF_MAX = 9999 2. rathena/src/map/script_constants.hpp Search: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); Replace: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); /* Custom Hateffects */ export_constant(HAT_EF_arcane_aura_A); export_constant(HAT_EF_arcane_aura_B); export_constant(HAT_EF_gluttony_aura_A); export_constant(HAT_EF_gluttony_aura_B); 3. Compile you Server. 4. Copy in you Data/texture/effect/(arcane_aura) and (gluttony_aura) Data(Example_Auras).zip 5. Data/luafiles514/lua files/hateffectinfo/hateffectinfo.lub Search: HAT_EF_efst_C_20th_Anniversary_Hat = 176 } Replace: HAT_EF_efst_C_20th_Anniversary_Hat = 176, HAT_EF_arcane_aura_A = 177, HAT_EF_arcane_aura_B = 178, HAT_EF_gluttony_aura_A = 179, HAT_EF_gluttony_aura_B = 180 } resourceFileName: route effect(Data/effect/name you effect folder/name you str file.str) IsIgnoreRiding: if true when mounting a mount or asking for hateffect will not go up, it will ignore this action isRenderBeforeCharacter: If true when using hateffect it will be over the character. hatEffectPos: Position the Y anchor (up and down) of the hateffect hatEffectPosX: Positions hateffect X anchor (left right) isAdjustPositionWhenShrinkState: always true isAdjustSizeWhenShrinkState: always true Search: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } Replace: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_A] = { resourceFileName = "arcane_aura\\arcane_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_B] = { resourceFileName = "arcane_aura\\arcane_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_A] = { resourceFileName = "gluttony_aura\\gluttony_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_B] = { resourceFileName = "gluttony_aura\\gluttony_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } 6. Add Script NPC: rathena\npc\custom\hateffect.txt (Use command @efc in game) - script HATEFFECT -1,{ OnHatEffect: if(getgmlevel()>= 80){ input .@number; if (.@number < 1) end; if (.@number >= 301) end; for(.@i = 1; .@i < 300; ++.@i) hateffect .@i,false; hateffect .@number,true; end; } OnInit: bindatcmd "efc",strnpcinfo(3)+"::OnHatEffect"; end; } 7. Add npc in rathena\npc\scripts_custom.conf npc: npc/custom/hateffect.txt 8. (OPTIONAL) Add Hateffect in item: Example: - Id: 2301 AegisName: Cotton_Shirt Name: Cotton Shirt Type: Armor Buy: 10 Weight: 100 Defense: 1 Locations: Armor: true ArmorLevel: 1 Refineable: true Script: | hateffect HAT_EF_arcane_aura_A,true; hateffect HAT_EF_arcane_aura_B,true; UnEquipScript: | hateffect HAT_EF_arcane_aura_A,false; hateffect HAT_EF_arcane_aura_B,false; Update: My project all Auras. (09/27/2023) - Pack Auras: My Project All Auras Too my project Ragnarok Online Pre-Renewal(Offline) and guide for easy update. - Data Folder + Server: Google Drive or MediaFire - Client RO: Google Drive or MediaFire Guide for start server and Play: 0. Dowloand Client RO and Update. 1. Download Data Folder + Server 2. Copy all files C:/MyServer/Client (In folder Ragnarok Onmline). 3. Run C:/MyServer/UwAmp/UwAmp.exe 4. Start Server C:/MyServer/rathena/runserver.exe Enjoy!!! Gluttony Aura: Arcane Aura: Credits: LCDTheOG Fros
    6 points
  26. RO DPS Meter Always thought the game needed some way to quantify combat efficiency, so I built a dps meter. (tested on the latest revision) Do you think this could be useful on the server you are currently playing? Give me your thoughts!!
    6 points
  27. Version 1.1.0

    235 downloads

    Hi, Just dropping some random scripts on my drive. Enjoy! Script Info: https://maxion-1.gitbook.io/ragnarok-landverse-whitepaper/beginner-guide/pets-system NOTE: This is only a replication attempt. This doesn't have the pet combination UI as per the link showing. This will use NPC Shop UI instead. This is NOT limited to pet combination, you can be creative and change this to item tier combination if you wish. If you know how to read and basic scripting knowledge, then you can edit this script without problem. Use at your own risk.
    Free
    6 points
  28. Heya, GRF Editor has undergone some big updates in the background in its new release (1.8.5.7) : The .net framework has changed from 3.5 to 4.0. It has been compiled as x64 instead of x86. The cps/lzma libraries have also been recompiled to x64. Another VC++ library is now required: Microsoft Visual Studio C++ 2022 (x64), which can be downloaded here https://aka.ms/vs/17/release/vc_redist.x64.exe A warning will be given if the VC++ library is missing, so it shouldn't be a problem. The preview for RSM/RSM2/RSW files have been remade from scratch based on BrowEdit 3. It now uses OpenGL instead of WPF 3D. While WPF 3D had good performance, it was way too limited in its options, so this change was a must (shaders weren't even possible...). Though, the performance now is somewhat unknown. If it causes too many issues, I'll add an option to revert back to WPF 3D. The new map renderer should be much more accurate to what is shown ingame: Lightmap/shadowmap is now supported. Lub effects are visible. RSM1 animations can be previewed. Maps are animated by default. Fixed a lot of transparency issues (still not perfect, but it's a huge improvement). Many new features were added for rendering. A skymap option was added but that one is still in its early stage. While the preview is focussed, F11 can bring the renderer to fullscreen. Water is now rendered I usually don't write an update post, but I did this time because I'm wary of potential issues. I'll leave here some previews:
    6 points
  29. Version 1.0.0

    291 downloads

    Good day! I've been an observer since the beginning of time and I want to share this script hoping that it will help fellow human beings who need it. This was a paid script of mine and I hired @sader1992 to help me finish it in 2020. I'm hoping someone will improve the code in the near future with other stuff to give another flavor for Endless Tower. This works with the latest version of rAthena. Requirement: Y'all need this patch for +damage to work setunitdata script command monster stat recaulculation fixes #3968 About the script: It is simply Endless Tower with Easy, Veteran, Nightmare, Hell & Torment Difficulties. You can edit the values I pre-assigned: This part is for the difficulty settings and adding stats to the monsters: This part is for the rewards: It gives #INSTANCEPOINTS and EXP depending on the difficulty you're on. I assigned a monster (1613 : metalling) to show us that the stats boost really works: PS: I'm also integrating this to other instances. Maybe I'll post it if people requests it.
    Free
    6 points
  30. These are some examples, I have more than 30 bosses ready, 80 different monsters like mobs and mini boss, between wings, weapons, etc. If you liked it, don't forget to like it, thank you all.
    6 points
  31. Version 1.2

    674 downloads

    I just updated the existed one by raPalooza~ to include the K and M indicator. DarkBreath is there too. The K is light green like a frog and the M is red wine like frog's blood Used font is PixelOperator 8
    Free
    5 points
  32. Hello friends of rAthena, I came to share the CD of Brazil Ragnarok Online that was distributed at the time. (I remember coming to Sucrilhos) In case anyone wants to study or try to make an Old Times Root. Episode of Niflheim (EP-6), Released in Brazil in 2004. Promotional video of the time that was released. Credit: LevelUpGames/Gravity Download
    5 points
  33. Version 1.0.0

    61 downloads

    [Event] Chess 1.0 By: MihaSenpai About: Hello Everynyan! My name is Mihael and I hope you are all well. I recently found these files in a personal repository and decided to share them with you. The .ZIP Contains the files: Script: NPC programmed for two players to participate in a game of chess. Map: Files containing the original Map of the event. Sprites: Files containing the event's ORIGINAL NPC Sprites. Hope you like it. If you have any questions, you can contact us here on the Forum or via Discord. A belated Happy 2024 to everyone.
    Free
    5 points
  34. How to use it? 1. Patch your diff file. 2. Change the item type in itemdb to charm. In the below example I've used an item from item_db_etc.yml and changed the type to charm. Then add a script part with the bonus that you want the item to have and reload itemdb. - Id: 670 AegisName: Gold_Coin_Moneybag Name: Bag of Gold Coins Type: Charm Buy: 100000 Weight: 400 Script: | bonus bAllStats,10; Without the charm item: With the charm item: Enjoy! Item Charm v1.0.1.diff
    5 points
  35. In this tutorial we are going to use Chocolatey Package Manager to help us install all the needed components without using the browser to click here, click there, unzip this, unzip that. We are going to use some plain commands, all righty? You can follow the tutorial with this video Install Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) Disable confirmation for each installation choco feature enable -n allowGlobalConfirmation Installing Packages choco install git mariadb visualstudio2022community notepadplusplus Install Visual Studio Open Visual Studio Installer Select Desktop Development with C++ and its following components: MSVC v143 - VS 2022 C++ x64/x86 Just-in-Time-debugger C++ tools for Windows IntelliCode C++ AddressSanitizer Windows SDK vcpkg package manager You can also choose to do the minimal setup if you want, although this is not recommended. Minimal Setup: MSVC v143 - VS 2022 C++ x64/x86 Windows SDK Clone rAthena Repository We will only clone the master branch, that will save us space and download time. git clone https://github.com/rathena/rathena.git -b master OPTIONAL STEP Cloning the ro-folder project git clone https://gitlab.com/sapitosucio/ro-folder Create Databases and user We access the MariaDB console mysql -u root We create the database rathenadb DROP DATABASE IF EXISTS rathenadb; CREATE DATABASE IF NOT EXISTS rathenadb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; We create the database rathenalog DROP DATABASE IF EXISTS rathenalog; CREATE DATABASE IF NOT EXISTS rathenalog DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; We create users and grant permissions on the databases rathenadb and rathenalog Remember to change the froggopass to anything you want, don't forget the password. GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON rathenadb.*TO 'rathenadbusr'@'localhost' IDENTIFIED BY 'froggopass'; FLUSH PRIVILEGES; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON rathenalog.* TO 'rathenadbusr'@'localhost'; FLUSH PRIVILEGES; We exit the MariaDB console exit Once the database is created, we can populate it with tables; cd rathena/sql-files Get-Content main.sql | mysql -u root rathenadb Get-Content web.sql | mysql -u root rathenadb Get-Content logs.sql | mysql -u root rathenalog Get-Content roulette_default_data.sql | mysql -u root rathenadb Get-Content item_db.sql | mysql -u root rathenadb Get-Content item_db2.sql | mysql -u root rathenadb Get-Content item_db_re.sql | mysql -u root rathenadb Get-Content item_db2_re.sql | mysql -u root rathenadb Get-Content item_db_equip.sql | mysql -u root rathenadb Get-Content item_db_etc.sql | mysql -u root rathenadb Get-Content item_db_usable.sql | mysql -u root rathenadb Get-Content item_db_re_equip.sql | mysql -u root rathenadb Get-Content item_db_re_etc.sql | mysql -u root rathenadb Get-Content item_db_re_usable.sql | mysql -u root rathenadb Get-Content mob_db.sql | mysql -u root rathenadb Get-Content mob_db2.sql | mysql -u root rathenadb Get-Content mob_db_re.sql | mysql -u root rathenadb Get-Content mob_db2_re.sql | mysql -u root rathenadb Get-Content mob_skill_db.sql | mysql -u root rathenadb Get-Content mob_skill_db2.sql | mysql -u root rathenadb Get-Content mob_skill_db_re.sql | mysql -u root rathenadb Get-Content mob_skill_db2_re.sql | mysql -u root rathenadb Add S1, P1 and a new admin account We access the MariaDB console again mysql -u root We select the rathenadb database use rathenadb We add the user S1 and the password P1 UPDATE login set `userid` = "froggos1", `user_pass` = "froggop1" where `account_id` = 1; Create a GM Lvl 99 account (Optional). INSERT INTO `login` VALUES (2000000, 'test', 'test', 'M', '[email protected]', 99, 0, 0, 0, 0, NULL, '', NULL, 0, '', 0, 0, 0, NULL, 0); Exit the MariaDB console exit Conf Folder In import\inter_conf.txt login_server_id: rathenadbusr login_server_pw: froggopass login_server_db: rathenadb ipban_db_id: rathenadbusr ipban_db_pw: froggopass ipban_db_db: rathenadb char_server_id: rathenadbusr char_server_pw: froggopass char_server_db: rathenadb map_server_id: rathenadbusr map_server_pw: froggopass map_server_db: rathenadb web_server_id: rathenadbusr web_server_pw: froggopass web_server_db: rathenadb log_db_id: rathenadbusr log_db_pw: froggopass log_db_db: rathenalog In import\map_conf.txt userid: froggos1 passwd: froggop1 In import\char_conf.txt userid: froggos1 passwd: froggop1 pincode_enabled: no In src/custom/defines_pre.hpp We need to declare the packetver in our emulator, and the packetver is based on the RO client of your choosing, in this tutorial, we are using a 2022-04-06 client to connect, so that's what we declare, remember the format (YYYYMMDD) #define PACKETVER 20220406 Remember to compile and restart server after changing the source code!
    5 points
  36. Updated to 1.8.6.6, this update mostly targets the map rendering: Added/fixed the RSM2 to RSM1 option when right-clicking a RSM2 file. The "anim" option will keep the rotation key frames, but it is not a perfect conversion; the scale/texture/offset key frames cannot be converted. The "flat" option will remove any kind of animation but will always be a perfect match with the original. I know this feature isn't that useful anymore since most clients support RSM2 files just fine, but I still hear people wanting to downgrade RSM2 files. You'll need to set the scale to (-1,1,1) in BrowEdit if you want to keep original model direction. Added the "Downgrade" option when right-clicking a RSW file. This will set the version of the RSW to 0x201 and GND to 0x107. All RSM2 files inside the RSW file will be converted to RSM1 and added to your GRF. The RSM2 models are also placed in their correct positions after conversion. Fixed the FPS counter. Added a "minimap" option to create minimaps: Added a face culling option to reflect the client's behavior more accurately. Added a copy/paste feature meant for BrowEdit 3 by using shift-left-click: Please keep your drama/trolling out of this thread, thank you. This forum is primarily dedicated towards developers, not players. I'd refer you to RMS, reddit or your own server forum instead.
    5 points
  37. Ultimate HQ Office Useful for Utility NPC's, Quests NPC's and some other NPC's Discord Channel: https://discord.gg/AhBjDJnEW3
    5 points
  38. Prontera Revamp! A fresh new look of Prontera with an elevated center and castle. Discord Channel: https://discord.gg/AhBjDJnEW3
    5 points
  39. Hi!! I know we dont have newer/recent guides about how ADD a custom skill or change/modify skills, into Pre-Re/Renewal. So I'm sharing my work with you! Its a full guide in how create custom skills, change, re-write, ADD, etc. ALSO how put animations/sounds or change animations/sounds. I hope this help someone!!! Its all by myself. NOTE: the guide is in .cpp file, so if you dont have NOTEPAD++, I recommend download that. https://notepad-plus-plus.org/downloads/ (\_/) (^3^) (_____)0 If you think i deserve it, try buy me a Carro___ a COFFEE!. BUY ME A COFFEE: https://ko-fi.com/bunny62174 EDIT. /)/) ( . .) ( づ♡LINK OF THE GUIDE: //I update the GUIDE sometimes, with a few info's about some specific things. Check the item 12.0 to see *Guide updated, inserted new info/sources 09/14 *Guide updated, new info. New WAV formula. 09/21 *Guide updated, Unity layout Code. 09/22 *Guide updated, Tips about Skill .str effects and re-use/re-work old/new skills animations 09/28 *Guide updated, more details about Splash Sources 10/07 *Guide updated, more details and Help Infos. 10/16
    5 points
  40. Deposit System Do your server has so many headgear? Usually after new headgear is released especially when the new one has better benefit, Previous Headgear used by Player is now useles right? This System is inspired on the ROM Adventure Book, Where Player can Deposit un-used Item, but Player will be still has benefited from it, instead lying around somewhere uselessly. Video Deposit System.mp4
    5 points
  41. Version 2.0

    92 downloads

    vCP (Version 2.0) The vCP (Version 2.0) is a point-based voting system designed for the game Ragnarok. This version of the system has undergone significant updates to enhance security, ensure compatibility with the latest PHP version (8.2.1), and improve code organization. Features Point-Based Voting: Players can earn points by voting and then exchange them for items that will be delivered directly to their in-game accounts. Installation Access install/index.php and fill out the installation form. Upon completion, the system will create all the necessary infrastructure for its operation. Common Errors and Solutions: Error when altering the login table: Check if the "vcp_pontos" field does not exist in the table. If it exists, you can delete it and attempt the installation again. Error when writing the configuration file: If you encounter this error, it may be due to insufficient writing permissions in the "inc" folder. Ensure that your account has the necessary permissions. Key Improvements In this version 2.0, the following improvements have been implemented: Introduction of the vCP class instance: An instance of the vCP class has been introduced to improve code organization and maintenance. Code improvements in files: The code has been enhanced to make it more secure and robust. Practices such as input sanitization using htmlspecialchars have been adopted. Updated Charset: The charset has been changed to UTF-8, ensuring support for special characters. Sql class improvements: The Sql class has been improved to make it more robust and secure. Transition to MySQLi: The system now utilizes the MySQLi extension for database communication, enhancing query security and efficiency. How to Contribute If you wish to contribute to this project or report issues, feel free to open issues or pull requests. Contributions are welcome! Conclusion The Point-Based Voting system for Ragnarok is an excellent way to encourage player participation and increase competitiveness among servers. Additionally, it provides a richer and more diverse gaming experience. The system's installation is simple and quick and can be carried out through the install/index.php file. License This project is licensed under the MIT License. Please refer to the LICENSE file for more details. Github: https://github.com/felipemike/vcp
    Free
    5 points
  42. Version 1.0.0

    140 downloads

    Allow you to use autoloot sets. @lootset <id> - switch autoloot configurations. @lootconfig - call configuration menu. Configs: .alootset = 10; // Amount of allowed sets .alootsize = 10; // Should be the same as AUTOLOOTITEM_SIZE, you can edit this in \src\config\core.hpp
    Free
    5 points
  43. Yet another Mining System Inspired by Mir4 Mining, I have worked the details to be as close to the source found in internet. Player can't mine a Mine that another Player is already mining. Progress of Mining can be canceled by trying to walk away. Progress of Mining while be canceled when Player received damage. Progress of Mining while be canceled when Player can't carry the item gained from Mine. When The Mine is exhausted it will hide away and move / re-spawn in different place. The default drop item (Dark Steel) replaced by Phracon Common Mine (Gray/White): 25-30 Dark Steel Uncommon (Green): 35-40 Dark Steel Rare (Blue): 45-60 Dark Steel Epic (Red): 100-150 Dark Steel Legendary (Yellow): 150-200 Dark Steel Script configuration has been made easy to understand and modify .mine_drop = 1010; // Phracon .miner_distance = 2; .mine_distance = 7; /* * minetype(<index>,"<Name>",<MaxHP>,<Drop Min Amount>,<Drop Max Amount>); */ minetype(0, "Common", 3, 25, 30); minetype(1, "Uncommon", 200, 35, 40); minetype(2, "Rare", 300, 45, 60); minetype(3, "Epic", 400, 100, 150); minetype(4, "Legendary", 500, 150, 200); /* * minespawn("<map name>",<Common Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>,<Epic Amount>); * minespawn("<map name>",<Common Amount>,<Uncommon Amount>,<Rare Amount>,<Epic Amount>,<Legendary Amount>); * * Example: * minespawn("anthell01", 50, 25, 12, 5, 2); * - this will spawn listed Mine below in map "anthell01": * - 50 Common Mine * - 25 Uncommon Mine * - 12 Rare Mine * - 5 Epic Mine * - 2 Legendary Mine */ minespawn("anthell01", 50, 25, 12, 5, 2); In Game Record ... Can be expanded further like, Reduction Timer or Drop amount bonus when using certain equip or like setting different item, rate and amount that can be set in configuration..
    5 points
  44. Version 1.0.0

    248 downloads

    I'm sharing this skin because it might helps someone who want to explore and edit elurair skin easier, and not a lot of people share or release Elurair skin in rAthena forum. 1. Download Elurair Patcher from Ai4rei website : http://ai4rei.net/p/skal and extract it. 2. Extract this uploaded file elurair-valkyrie_skin.zip and add it in Elurair Patcher folder. 2. Use builder.exe in builder folder to create Elurair.exe. Target Patcher file elurair.exe, Configuration file elurair.Chaos92.ini. 3. Tick compile, and add all the skin files in skin_valkyrie folder. Maybe purge existing skins if you want to replace with your own skin. 4. Insert Icon file and Window Title (optional) and then click 'Build'. 5. Use the web files and upload if needed. *** To run Elurair Patcher, you need .inf generated from here : http://ai4rei.net/make/patch.inf/<desired numeric id>. For example, to start from patch number 0, you can open the link : https://ai4rei.net/make/patch.inf/0 . And include the .inf file in the same folder with Elurair.exe. Things that you need to replace depends on your setup. InfFile=patch.inf PakFile=main.grf WebList=patch_main.txt WebPath=/data/ WebSite=patch.example.com And also all the ActionData= in the elurair.Chaos92.ini if needed. I include web files folder too just incase this might help you (without main.inf, you can generate it yourself as told above). The ONLY files that you need in client folder after 'Build' Elurair.exe : - inf file - elurair.exe (no problem to rename it) - media folder (contains media for the skin) - your own client files Documentation & example for elurair settings you can found in elurair.default.ini. Website Elurair : http://ai4rei.net/p/skal . Discord NN (Creator of Elurair Patcher) : http://ai4rei.net/p/discord . Not all the resources for the skin are created by me. Video source : https://steamcommunity.com/sharedfiles/filedetails/?id=1964715704 . Skin file compiled and released by Chaos92. rAthena Profile : https://rathena.org/board/profile/6755-chaos92 . Facebook Page : https://www.facebook.com/hostingmalaya . Can contact me via links above for web hosting & services. Wanna treat me some coffee ? https://www.buymeacoffee.com/chaos92 .
    Free
    5 points
  45. Version 1.0.0

    90 downloads

    Check the video showcase of this map below
    Free
    5 points
  46. Version 4.1

    2205 downloads

    A NPC that allow your Characters to Switch Build from time to time. Players are able to save his current status build , so that he/she can switch back to the saved build whenever he/she want. Players no need to keep memorize their status build upon changed. Configuration : // maximum build player can store (0 = disable) .max_build = 3; // check player weight limit before switching stat (0 = disable) .check_weight_limit = 1;
    Free
    5 points
  47. Version 1.0.0

    179 downloads

    This is a simple function I'm using for custom box/egg items to allow players selecting an item. Example usage: - Id: 100717 AegisName: Fluffy_Semi_Long_Box Name: Costume Fluffy Semi-long Hair Type: DelayConsume Buy: 10 Weight: 100 Script: | callfunc("muh_eggpick","Fluffy_Semi_Long_Box",420036,420037,420038,420039,420040,420041,420042,420043);
    Free
    5 points
  48. Version 1.0.0

    148 downloads

    Sprite simples, para quem quiser.
    Free
    4 points
  49. Unfortunately, hat effects were implemented on the map_session_data (player) on the emulator, while it should have been on the unit_data structure instead, which is shared by all object types. So you'll need a lot of modifications to get this working on monsters. If you apply the changes below, you'll be able to add a hat effect with this command: monster "prontera", 154, 182, "--ja--", 1002, 1; hateffect 12, true, $@mobid; Changes: diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 991b5b1b8..f2fece16d 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -1733,7 +1733,7 @@ int clif_spawn( struct block_list *bl, bool walking ){ if (sd->status.robe) clif_refreshlook(bl,bl->id,LOOK_ROBE,sd->status.robe,AREA); clif_efst_status_change_sub(bl, bl, AREA); - clif_hat_effects(sd,bl,AREA); + clif_hat_effects(bl, bl, true, AREA); } break; case BL_MOB: @@ -1745,6 +1745,7 @@ int clif_spawn( struct block_list *bl, bool walking ){ clif_specialeffect(&md->bl,EF_BABYBODY2,AREA); if ( md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC ) clif_summon_init(*md); + clif_hat_effects(bl, bl, true, AREA); } break; case BL_NPC: @@ -1756,6 +1757,7 @@ int clif_spawn( struct block_list *bl, bool walking ){ clif_specialeffect(&nd->bl,EF_BABYBODY2,AREA); clif_efst_status_change_sub(bl, bl, AREA); clif_progressbar_npc_area(nd); + clif_hat_effects(bl, bl, true, AREA); } break; case BL_PET: @@ -5104,7 +5106,7 @@ void clif_getareachar_unit( map_session_data* sd,struct block_list *bl ){ if ( tsd->status.robe ) clif_refreshlook(&sd->bl,bl->id,LOOK_ROBE,tsd->status.robe,SELF); clif_efst_status_change_sub(&sd->bl, bl, SELF); - clif_hat_effects(sd,bl,SELF); + clif_hat_effects(&sd->bl, bl, true, SELF); } break; case BL_MER: // Devotion Effects @@ -5122,6 +5124,7 @@ void clif_getareachar_unit( map_session_data* sd,struct block_list *bl ){ clif_specialeffect_single(bl,EF_BABYBODY2,sd->fd); clif_efst_status_change_sub(&sd->bl, bl, SELF); clif_progressbar_npc(nd, sd); + clif_hat_effects(&sd->bl, bl, true, SELF); } break; case BL_MOB: @@ -5139,6 +5142,7 @@ void clif_getareachar_unit( map_session_data* sd,struct block_list *bl ){ clif_monster_hp_bar(md, sd->fd); } #endif + clif_hat_effects(&sd->bl, bl, true, SELF); } break; case BL_PET: @@ -21184,53 +21188,46 @@ void clif_navigateTo(map_session_data *sd, const char* mapname, uint16 x, uint16 /// Send hat effects to the client (ZC_HAT_EFFECT). /// 0A3B <Length>.W <AID>.L <Status>.B { <HatEffectId>.W } -void clif_hat_effects( map_session_data* sd, struct block_list* bl, enum send_target target ){ +void clif_hat_effects(struct block_list* src, struct block_list* bl, bool enable, enum send_target target ){ #if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - map_session_data *tsd; - struct block_list* tbl; - - if( target == SELF ){ - tsd = BL_CAST(BL_PC,bl); - tbl = &sd->bl; - }else{ - tsd = sd; - tbl = bl; - } - - nullpo_retv( tsd ); - - if( tsd->hatEffects.empty() || map_getmapdata(tbl->m)->getMapFlag(MF_NOCOSTUME) ){ + struct unit_data* ud; + + if (!src || !bl || !(ud = unit_bl2ud(bl))) return; - } - + + if (ud->hatEffects.empty() || map_getmapdata(src->m)->getMapFlag(MF_NOCOSTUME)) { + return; + } + struct PACKET_ZC_EQUIPMENT_EFFECT* p = (struct PACKET_ZC_EQUIPMENT_EFFECT*)packet_buffer; - - p->packetType = HEADER_ZC_EQUIPMENT_EFFECT; - p->packetLength = (int16)( sizeof( struct PACKET_ZC_EQUIPMENT_EFFECT ) + sizeof( int16 ) * tsd->hatEffects.size() ); - p->aid = tsd->bl.id; - p->status = 1; - - for( size_t i = 0; i < tsd->hatEffects.size(); i++ ){ - p->effects[i] = tsd->hatEffects[i]; - } - - clif_send( p, p->packetLength, tbl, target ); + + p->packetType = HEADER_ZC_EQUIPMENT_EFFECT; + + p->packetLength = (int16)( sizeof( struct PACKET_ZC_EQUIPMENT_EFFECT ) + sizeof( int16 ) * ud->hatEffects.size() ); + p->aid = bl->id; + p->status = enable; + + for (size_t i = 0; i < ud->hatEffects.size(); i++) { + p->effects[i] = ud->hatEffects[i]; + } + + clif_send(p, p->packetLength, src, target); #endif } -void clif_hat_effect_single( map_session_data* sd, uint16 effectId, bool enable ){ +void clif_hat_effect_single( struct block_list* bl, uint16 effectId, bool enable ){ #if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - nullpo_retv( sd ); - - struct PACKET_ZC_EQUIPMENT_EFFECT* p = (struct PACKET_ZC_EQUIPMENT_EFFECT*)packet_buffer; - - p->packetType = HEADER_ZC_EQUIPMENT_EFFECT; - p->packetLength = (int16)( sizeof( struct PACKET_ZC_EQUIPMENT_EFFECT ) + sizeof( int16 ) ); - p->aid = sd->bl.id; - p->status = enable; - p->effects[0] = effectId; - - clif_send( p, p->packetLength, &sd->bl, AREA ); + nullpo_retv(bl); + + struct PACKET_ZC_EQUIPMENT_EFFECT* p = (struct PACKET_ZC_EQUIPMENT_EFFECT*)packet_buffer; + + p->packetType = HEADER_ZC_EQUIPMENT_EFFECT; + p->packetLength = (int16)( sizeof( struct PACKET_ZC_EQUIPMENT_EFFECT ) + sizeof( int16 ) ); + p->aid = bl->id; + p->status = enable; + p->effects[0] = effectId; + + clif_send( p, p->packetLength, bl, AREA ); #endif } diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 1bf10b262..f6ba450b2 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -801,8 +801,8 @@ void clif_item_repair_list(map_session_data *sd, map_session_data *dstsd, int lv void clif_item_repaireffect(map_session_data *sd, int idx, int flag); void clif_item_damaged(map_session_data* sd, unsigned short position); void clif_item_refine_list(map_session_data *sd); -void clif_hat_effects( map_session_data* sd, struct block_list* bl, enum send_target target ); -void clif_hat_effect_single( map_session_data* sd, uint16 effectId, bool enable ); +void clif_hat_effects(struct block_list* src, struct block_list* bl, bool enable, enum send_target target); +void clif_hat_effect_single(struct block_list* bl, uint16 effectId, bool enable); void clif_item_skill(map_session_data *sd,uint16 skill_id,uint16 skill_lv); diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 1cb25fad6..c2e9b2cc2 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -2220,10 +2220,6 @@ bool pc_authok(map_session_data *sd, uint32 login_id2, time_t expiration_time, i // Initialize BG queue sd->bg_queue_id = 0; -#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - sd->hatEffects = {}; -#endif - sd->catch_target_class = PET_CATCH_FAIL; // Check EXP overflow, since in previous revision EXP on Max Level can be more than 'official' Max EXP diff --git a/src/map/pc.hpp b/src/map/pc.hpp index c37cd4fb5..3f4ceb943 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -922,10 +922,6 @@ public: short setlook_head_top, setlook_head_mid, setlook_head_bottom, setlook_robe; ///< Stores 'setlook' script command values. -#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - std::vector<int16> hatEffects; -#endif - struct{ int tid; uint16 skill_id; diff --git a/src/map/script.cpp b/src/map/script.cpp index 027587945..72a1382f1 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -24268,39 +24268,31 @@ BUILDIN_FUNC(recalculatestat) { BUILDIN_FUNC(hateffect){ #if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - map_session_data* sd; - - if( !script_rid2sd(sd) ) - return SCRIPT_CMD_FAILURE; - - int16 effectID = script_getnum(st,2); - bool enable = script_getnum(st,3) ? true : false; - - if( effectID <= HAT_EF_MIN || effectID >= HAT_EF_MAX ){ - ShowError( "buildin_hateffect: unsupported hat effect id %d\n", effectID ); - return SCRIPT_CMD_FAILURE; - } - - auto it = util::vector_get( sd->hatEffects, effectID ); - - if( enable ){ - if( it != sd->hatEffects.end() ){ - return SCRIPT_CMD_SUCCESS; - } - - sd->hatEffects.push_back( effectID ); - }else{ - if( it == sd->hatEffects.end() ){ - return SCRIPT_CMD_SUCCESS; - } - - util::vector_erase_if_exists( sd->hatEffects, effectID ); - } - - if( !sd->state.connect_new ){ - clif_hat_effect_single( sd, effectID, enable ); - } - + int16 effectID = script_getnum(st,2); + bool enable = script_getnum(st,3) ? true : false; + + // This is unecessary and annoying half the time + //if( effectID <= HAT_EF_MIN || effectID >= HAT_EF_MAX ){ + // ShowError( "buildin_hateffect: unsupported hat effect id %d\n", effectID ); + // return SCRIPT_CMD_FAILURE; + //} + + struct block_list* bl; + bool send = true; + + if (script_hasdata(st, 4)) { + bl = map_id2bl(script_getnum(st, 4)); + } + else { + bl = map_id2bl(st->rid); + map_session_data* sd = BL_CAST(BL_PC, bl); + + if (sd && sd->state.connect_new) { + send = false; + } + } + + unit_hateffect(bl, effectID, enable, send); #endif return SCRIPT_CMD_SUCCESS; } @@ -27566,7 +27558,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(adopt,"vv"), BUILDIN_DEF(getexp2,"ii?"), BUILDIN_DEF(recalculatestat,""), - BUILDIN_DEF(hateffect,"ii"), + BUILDIN_DEF(hateffect,"ii?"), BUILDIN_DEF(getrandomoptinfo, "i"), BUILDIN_DEF(getequiprandomoption, "iii?"), BUILDIN_DEF(setrandomoption,"iiiii?"), diff --git a/src/map/unit.cpp b/src/map/unit.cpp index f90529926..f57fcde6c 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -2964,6 +2964,9 @@ void unit_dataset(struct block_list *bl) ud->attackabletime = ud->canact_tick = ud->canmove_tick = gettick(); +#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) + ud->hatEffects = {}; +#endif } /** @@ -3461,10 +3464,6 @@ int unit_free(struct block_list *bl, clr_type clrtype) sd->qi_display.clear(); -#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) - sd->hatEffects.clear(); -#endif - if (sd->achievement_data.achievements) achievement_free(sd); @@ -3645,6 +3644,14 @@ int unit_free(struct block_list *bl, clr_type clrtype) break; } } + + + if (ud) { +#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) + ud->hatEffects.clear(); +#endif + } + map_deliddb(bl); @@ -3656,6 +3663,39 @@ int unit_free(struct block_list *bl, clr_type clrtype) return 0; } + +void unit_hateffect(struct block_list* bl, int16 effectID, bool enable, bool send) +{ + struct unit_data* ud; + map_session_data* sd; + + if (!bl || !(ud = unit_bl2ud(bl))) + return; + + sd = BL_CAST(BL_PC, bl); + auto it = util::vector_get(ud->hatEffects, effectID); + + if (enable) { + if (it != ud->hatEffects.end()) { + return; + } + + ud->hatEffects.push_back(effectID); + } + else { + if (it == ud->hatEffects.end()) { + return; + } + + util::vector_erase_if_exists(ud->hatEffects, effectID); + } + + if (send || !enable) { + clif_hat_effect_single(bl, effectID, enable); + } +} + + static TIMER_FUNC(unit_shadowscar_timer) { block_list *bl = map_id2bl(id); diff --git a/src/map/unit.hpp b/src/map/unit.hpp index cfd932615..0964d7438 100644 --- a/src/map/unit.hpp +++ b/src/map/unit.hpp @@ -65,6 +65,9 @@ struct unit_data { int32 group_id; std::vector<int> shadow_scar_timer; +#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO) + std::vector<int16> hatEffects; +#endif }; struct view_data { @@ -115,6 +118,7 @@ bool unit_run(struct block_list *bl, map_session_data *sd, enum sc_type type); int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir); TIMER_FUNC(unit_delay_walktoxy_timer); TIMER_FUNC(unit_delay_walktobl_timer); +void unit_hateffect(struct block_list* bl, int16 effectID, bool enable, bool send); // Causes the target object to stop moving. int unit_stop_walking(struct block_list *bl,int type); You'll be able to use hat effects on NPCs as well. Goodluck. Edit: Updated diff to fix an error with the script function. hateffects.diff
    4 points
  50. Version 1.0.2

    4041 downloads

    Heya, This is a tool to edit mapcache files for rAthena (db/(pre-)re/map_cache.dat). It is already part of Server Database Editor as a sub tool, but I've made it a tool on its own instead. It was made to fix the issue with WeeMapCache not assigning the water tiles properly. Otherwise, it's pretty much the same interface, but easier to use. The most recent version will always be found from the mediafire link below: http://www.mediafire.com/file/tjlnooebx6am673 Source files: https://github.com/Tokeiburu/Mapcache-Editor
    Free
    4 points
×
×
  • Create New...