Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 02/19/24 in all areas

  1. 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.99GB, after BGM it reaches 3.33GB Screenshots Requirements Server Up & Running with ‎‏‏‎ PACKETVER=20220406 Visual C++ Redistributables DirectX Runtime Features Includes latest RoEnglishRE - 30/mar/2024 Custom Lua Support jRO Enchantment Display Includes rsu-kro-rag-lite (kRO updater) - v4.2.2.1316 Includes iRO's Setup.exe, thanks to relzz! Includes AzzyAI 1.54 Includes a basic 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) 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.
    7 points
  2. 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.
    5 points
  3. 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
  4. 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
  5. I was reading this topic yesterday and discovered that most of the requests were not added. Therefore, I am making my debut here to share with you the updated @autoattack function. Added Commands: @autoattack - display all @autoattack commands. @autoattack on/off @autoattack list @autoattack +monsterID @autoattack -monsterID #Edit If you use [ @autoattack on ] without adding monster targets will attack all the monsters (DEFAULT setting.) Auto-attack can be toggled on or off using the @autoattack on/off command. Specific mobs can be added or removed from the target list using @autoattack +<mobID> or @autoattack -<mobID> respectively. Since I'm using the latest version, applying the patch shouldn't be a problem.(I also removed the struct warnings from the map_session_data). Attached(Updated): atcommand[remix]
    3 points
  6. Hello. Your script is looking good, great start. You can test this one, maybe you learn something, I tried doing what you requested. //Converts ratio to return actual number with decimals. //10000=100% 1000=10% 100=1% 10=0,1% 1=0,01% function script F_ConvertRatio { .@n = getarg(0); if (.@n%100 && .@n > 100 && .@n < 1000 && atoi(charat(""+.@n, 1)) == 0 || .@n < 10) .@n2$ = .@n/100 + (.@n%100?",0"+.@n%100:""); else if (.@n%100 && .@n > 9 && .@n < 1000 && atoi(charat(""+.@n, getstrlen(""+.@n)-1)) == 0) .@n2$ = .@n/100 + "," + (.@n%100)/10; else .@n2$ = .@n/100 + (.@n%100?","+.@n%100:""); return .@n2$; } prontera,113,246,5 script Rafa da Rifa 1_F_PUBGIRL,{ cutin "job_dancer_eir01", 0; mes "[" + strnpcinfo(1) + "]"; mes "Você quer participar da minha rifa?"; mes "Ai, que pergunta, né? É claro que quer!"; mes "Pelo generosíssimo valor de ^0000FF" + F_InsertComma($@raffle_cost) + "z^000000, você concorre a"; mes "" + $@raffle_prize_qty + " [<ITEM>" + getitemname($@raffle_prize_id) + "<INFO>" + $@raffle_prize_id + "</INFO></ITEM>]."; next; if (isnpccloaked()) goto S_Restarting; .@i = rand(20,40); mes "[" + strnpcinfo(1) + "]"; mes "Você precisa tirar o número ^FF0000" + .@i + "^000000 pra ganhar ^00FF00" + getitemname($@raffle_prize_id) + "^000000."; mes "Mas primeiro, preciso dos ^0000FF" + F_InsertComma($@raffle_cost) + "z^000000."; mes "O que me diz?"; next; if(select("Tá OK! Lá vamos nós...", "Não, obrigad" + (Sex?"o":"a") + ".") == 2) { mes "[" + strnpcinfo(1) + "]"; mes "Não tá confiante?"; close3; } if (Zeny < $@raffle_cost) { mes "[" + strnpcinfo(1) + "]"; mes "Você não tem o zeny para participar?"; close3; } if (checkweight(1301,1) == 0) { mes "[" + strnpcinfo(1) + "]"; mes "Você tá com uma mochila bem pesada em..."; mes "Como você vai receber o prêmio desse jeito?"; close3; } if (isnpccloaked()) goto S_Restarting; Zeny -= $@raffle_cost; mes "[" + strnpcinfo(1) + "]"; mes "O número do prêmio é ^FF0000" + .@i + "^000000."; if (rand(10000) > $@raffle_chance) { .@l = rand(.@i-19,.@i+19); showdigit .@l; mes "Você tirou o número ^0000FF" + .@l + "^000000."; mes "Não foi dessa vez. Mas e se você tentar de novo?"; mes "Aliás, aqui está o seu prêmio de consolação!"; getitem $@raffle_consol_id, rand($@raffle_consol_min,$@raffle_consol_max); close3; } showdigit .@i; mes "Você tirou o número ^0000FF" + .@i + "^000000."; mes "... Peraí, você ganhou? É isso mesmo, produção?"; mes "Hoje é o seu dia!"; getitem $@raffle_prize_id, $@raffle_prize_qty; announce "" + strnpcinfo(1) + " : Parabéns! " + strcharinfo(0) + " recebeu " + $@raffle_prize_qty + " " + itemlink($@raffle_prize_id) + " na Rifa!", bc_all; specialeffect2 EF_PROVIDENCE; donpcevent strnpcinfo(3)+"::OnStart"; close3; S_Restarting: mes "[" + strnpcinfo(1) + "]"; mes "Nossa, essa rifa acabou bem quando estávamos conversando."; mes "Você vai ter que tentar a sorte na nova rifa."; close3; OnInit: bindatcmd "rifa",strnpcinfo(3)+"::OnGM", 99, 99; setarray .rifas, //Cada linha é uma rifa diferente //<grand prize>,<grand prize amount>,<consolation prize>,<consolation min amount>,<consolation max amount>,<cost>,<win chance 1~10000>, 970 , 30 , 7136 , 1, 20, 40000 , 100, 12264, 5 , 7135 , 1, 20, 100000, 100, 12928, 5 , 678 , 1, 10, 100000, 200, 7938 , 100, 7939 , 1, 50, 100000, 100, 6962 , 1 , 7139 , 1, 20, 150000, 125, 7620 , 10 , 984 , 1, 15, 150000, 125, 7619 , 10 , 985 , 1, 15, 200000, 200, 12412, 1 , 6259 , 1, 40, 300000, 40, 23546, 1 , 1061 , 1, 400, 500000, 200, 6635 , 1 , 23044, 1, 10, 600000, 50; // 1200000 = 20 minutos OnTimer1200000: OnStart: stopnpctimer; cloakonnpc strnpcinfo(0); sleep 10000; .@r = rand(getarraysize(.rifas)/7) *7; $@raffle_prize_id = .rifas[.@r]; $@raffle_prize_qty = .rifas[.@r+1]; $@raffle_consol_id = .rifas[.@r+2]; $@raffle_consol_min = .rifas[.@r+3]; $@raffle_consol_max = .rifas[.@r+4]; $@raffle_cost = .rifas[.@r+5]; $@raffle_chance = .rifas[.@r+6]; announce "A Rafa gostaria de convidar a todos a participarem de sua Rifa, na biblioteca ao oeste de Prontera!", bc_all; cloakoffnpc strnpcinfo(0); initnpctimer; sleep 5000; announce "" + strnpcinfo(1) + " : O grande prêmio é " + ($@raffle_prize_qty>1?$@raffle_prize_qty+"x ":"") + itemlink($@raffle_prize_id) + "! E o prêmio de consolação é " + itemlink($@raffle_consol_id) + " " + $@raffle_consol_min + "~" + $@raffle_consol_max + "x!", bc_all; npctalk "Este aqui é um prêmio especial que aparece só de vez em quando, então se eu fosse você, eu participaria!"; end; OnGM: message strcharinfo(0), "Esses são comandos especiais que apenas você ADMs e GMs podem usar."; switch(select("Cancelar", "^0000FFVer rifa atual^000000", "^0000FFVer rifas^000000", "^0000FFIniciar nova rifa^000000")) { case 1: end; case 2: if (isnpccloaked()) { message strcharinfo(0), "RIFA EM PROCESSO DE REINICIAR"; end; } mes "^0000FFPrêmio:^000000"; mes "^0000FF[<ITEM>" + getitemname($@raffle_prize_id) + "<INFO>" + $@raffle_prize_id + "</INFO></ITEM>] " + $@raffle_prize_qty + "x^000000"; mes "^FF0000Consolação:^000000"; mes "^FF0000[<ITEM>" + getitemname($@raffle_consol_id) + "<INFO>" + $@raffle_consol_id + "</INFO></ITEM>] " + $@raffle_consol_min + "~" + $@raffle_consol_max +"x^000000"; mes "Preço: " + F_InsertComma($@raffle_cost) + "z"; mes "Chance do prêmio: " + F_ConvertRatio($@raffle_chance) + "%"; mes "Iniciada faz " + (getnpctimer(0)/1000) + " segundos."; close; case 3: .@size = getarraysize(.rifas)/7; for( .@i = 0; .@i < .@size; .@i++ ) { .@r = .@i * 7; mes "^0000FFRifa " + (.@i+1) + " - Prêmio:^000000"; mes "^0000FF[<ITEM>" + getitemname(.rifas[.@r]) + "<INFO>" + .rifas[.@r] + "</INFO></ITEM>] " + .rifas[.@r+1] + "x^000000"; mes "^FF0000Consolação:^000000"; mes "^FF0000[<ITEM>" + getitemname(.rifas[.@r+2]) + "<INFO>" + .rifas[.@r+2] + "</INFO></ITEM>] " + .rifas[.@r+3] + "~" + .rifas[.@r+4] +"x^000000"; mes "Preço: " + F_InsertComma(.rifas[.@r+5]) + "z"; mes "Chance do prêmio: " + F_ConvertRatio(.rifas[.@r+6]) + "%"; if (.@i < .@size-1) { if(select("Ver outra rifa","Fechar") == 1) clear; else break; } } close; case 4: donpcevent strnpcinfo(3)+"::OnStart"; end; } } prontera,115,246,3 script Rifa#raffle_board 2_BULLETIN_BOARD,{ mes "^0000FFGrande prêmio da Rifa:^000000"; mes "^0000FF[<ITEM>" + getitemname($@raffle_prize_id) + "<INFO>" + $@raffle_prize_id + "</INFO></ITEM>] " + $@raffle_prize_qty + "x^000000"; mes " "; mes "^FF0000Prêmio de Consolação:^000000"; mes "^FF0000[<ITEM>" + getitemname($@raffle_consol_id) + "<INFO>" + $@raffle_consol_id + "</INFO></ITEM>] " + $@raffle_consol_min + "~" + $@raffle_consol_max +"x^000000"; mes " "; mes "Preço: " + F_InsertComma($@raffle_cost) + "z"; close; } Using initnpctimer and stopnpctimer you can automate the raffle change. Example: OnInit: // set the first raffle when the server starts. initnpctimer; //start the timer end; OnTimer60000: //after 60 seconds this part will trigger //change the raffle array to new values. stopnpctimer; //erase the old timer initnpctimer; //start the timer again from 0 end;
    3 points
  7. I have updated custom weapon part, but didnt finalized yet, maybe need some changes for information in iteminfo.lua generated for weapon type part. Will update later on. And also shadow weapon part, maybe.
    3 points
  8. I'm glad that people enjoyed reading it. When I started, I figured that maybe I'd somehow find a way to allow rebirth for the classes that couldn't do it (always my pet peeve with the original game), I never figured it would turn into this. Still, my journey is probably nearing its end. I know I've said that before, but with any project there does come a time when you have to say "it's done!". At a certain point, there's simply not much you can add any more that meaningfully adds to the game. And I've pretty much run out of stuff I can feasibly add. There are no more maps I can harvest from Renewal. I've used almost every distinct weapon sprite in the game. There aren't really that many more skills that can be added without compromising the identity of the classes. For a few months, updates on the server have slowed as we've approached something resembling "stability". However, there remains one final frontier to tackle, and that's Guild War. I've always considered Guild War to kind of be the glue that holds Ragnarok Online together as a game. Ragnarok (at least PRE-RE) does not really have any story of defined goal. Sure, you can grind your way to max level, and my server does include significantly expanded end-game content in the form of the past, but ultimately the grind on its own can feel a little hollow at times. One of my beta testers who is new to the game asked me "sure, we can kill some of these bosses now, but what do we really need their items for other than to kill more bosses?". Of course, we all know the answer is "TO CRUSH OUR ENEMIES WITH AN IRON FIST!". Ragnarok Online is an incredibly complex game with a nearly infinite number of possible builds you can make, but the complex interplay of these builds can only shine when they're pitted against each other. The War of Emperium is an incredibly deep and interesting mode that takes all of the elements of the game and gives them their own unique and interesting way to shine. It is also an absolute nightmare to balance. I'm not actually talking about the actual gameplay balance of the mode itself. That is a concern too, of course, but it's something I've had in mind since the very beginning when designing and tweaking skills, so I don't think it should actually be too bad. No, what I'm talking about are the rewards from the mode that serve as the incentive to play it. On the official servers, the main incentive to play WOE is to get the God Items. The God Items are deliberately monstrously overpowered, which is (somewhat) balanced out by the fact that you need rare items from many different castles to assemble them. (As an aside, I see that in recent patches the god items have actually been nerfed, but to me Mejingjord will always give +40 STR). This is a problem for smaller servers, though, because you need a massive population to run War of Emperium with many castles at once. What a lot of small servers do is they only open one castle at a time. This works well, but it makes the god items impossible to get, which, to be honest, is probably a good thing because they're so gamebreaking, but it also kind of feels lame since most of the other rewards are fairly common things that you can get easily. No one is really that excited by slotted chainmail anymore. It was clear from the start that Guild War was going to need new, exclusive rewards. This was not easy, because I already added a ton of new items to the game. Clearly, the rewards from the guild war have to be good enough that you actually want them, but not so strong that gaining control of the guild castles quickly becomes an insurmountable advantage. This is a very delicate balance. Beyond this, there's the question of how to distribute the rewards. If we're adding new weapons, different classes equip different weapon types. We don't want to intentionally favour certain classes or builds by mainly adding good equipment for a single class. Each castle can spawn 2 distinct treasure boxes, which are unique to that castle. If only one castle is used, this gives us a total of 16 item slots to work with, which is not even enough for 1 of every weapon type in the game (and we want some lesser rewards like eluniums and OCAs as well). 1 castle isn't enough. My clue for how to handle this came from the classes in the game. The game has 10 base classes: Swordman, Acolyte, Mage, Archer, Thief, Merchant, Taekwon, Ninja, Gunslinger, and Summoner. We can pair these up two classes to a castle, which allows for roughly one box per class. This sounds pretty good! Under this scheme, 5 castles would be needed, which would presumably be available on a rotating schedule. We're getting somewhere, but there's just one more problem. There are four different guild war realms, Prontera, Geffen, Al De Baran, and Payon (for now, we're leaving War of Emperium 2 out of the equation). It seems to make sense to pick one castle from each. But what about the fifth castle? Well, clearly a sane person would just pick a second castle from one of the realms, but you should know by now that's not going to happen. No, of course the answer is that we're going to create a totally new fifth castle in its own realm. The cats have been disrespected for too long, so it's finally time for Malangdo to get its own guild castle. Well, maybe "totally new" is overselling it a bit. It's more like a "significantly altered version of a castle that already exists". Of the castles I didn't pick, the castle with by far the most interesting layout was payg_cas04, so this will become the basis for malg_cas01. To the map editor! There's a few things I like about this layout, but I think the most interesting thing about it has got to be this Emperium room. It's huge, there's two routes you can take, you can snipe across the gaps, and there are little barriers that protect you in certain areas. The coolest thing about it though are those double entry warps at the top! Spamming spells and traps on warp points is a super strong strategy in WoE, so having a second warp in to the emperium room is a huge deal. However, in payg_cas04, only one of the warps is actually used! This won't do, so the first thing we needed to do was to add a new route that could let you get to the second warp point. Looking at the layout of the castle, which I wasn't planning to change too drastically, there was really only one feasible place that could lead to a new warp, and that's this corridor here at the bottom of this map (the red square indicates where the warp would go). So this is where the new route would start. However, this is actually the first interior room in the castle, the warp on the far left leads to another interior room, so clearly this can't just skip you right to the emperium room. A totally new room is needed that leads to the emperium room. I decided to keep things fairly simple. The new room is a kind of back hallway that leads to a storage room, with a staircase leading down to the emperium room. Rather deliberately, this room kinda sucks for the attackers. It's super narrow, and it's very easy to trap the one-cell passage by that little barricade, or camp behind it. You can hide in the storage room to avoid someone walking through the hallway with Sight and try to slip past, but it's not hard to check the storage room since it has only one exit. However, having a second route that leads to the emperium room is already very powerful, as the defenders now need to cover both routes if they don't just want to try to hold the final room. I think there's an interesting strategy tradeoff if this route is clearly worse than the other route. Do you check it less often because clearly people won't take the bad route? Then that kind of makes it actually the good route, because you might encounter much less opposition that way. In any case, I think this layout is interesting. Of course, I couldn't just slap in a new room and call it a day, I also had to Malangdo up the place. It now has much more of a tropical theme. Interestingly, there are actually some GATing errors on this map (the GAT defines where you can and can't walk). There's a wall on the lower side of this map that you can simply walk through on the official servers, as well as a few misplaced snipe tiles. I fixed them. Still, it kind of made me feel good in a way to know that the original map creators are human too. I also retextured the entire map and replaced all of the objects with Malangdo-themed ones, which no one will probably ever notice because you really don't have time to sit and enjoy the scenery in the middle of guild war. Putting all that food on those plates is a huge pain! Oh well. I feel like if you can't tell that I made something, it means I probably did a good job of it. The gold standard is for it to look like something that could have been in the game originally. I also continue to be impressed by the ingenuity of the original level designers. Did you know that those apples on the table beside the bananas are actually christmas tree ornaments from Lutie? You'd never guess. So we have our new map, all that remains is to rig it up to work in the game. Surprisingly, Rathena provides space in agit_controller for you to insert your own custom guild castles. Has anyone other than me ever used this? Adding the new castle is surprisingly easy, you just have to remember to put it into castle_db. And here we are! Shh, no one give away my awesome hiding spot. Oh, and of course, Malangdo also needs its own Guild Dungeon! Luckily, we happen to have an unused cat-themed dungeon left over in lasagna dungeon! It's like I planned it all along! This place also plays the unused track 175. Now let's all enjoy Cat on Bullet. Only one question remains. How the heck do we actually get here? Well, the first couple screenshots may have given a clue. See, it's an intentional balancing mechanic that the guild realms aren't just inside the town. The necessity to walk back to the entrance to the guild castle increases the length of time it takes the attackers to respawn, compared to the defenders who can simply warp into the castle. So we need a spot that takes a little bit of time to walk to. How about the otherwise pointless boat in the middle of Malangdo? (I don't apologize for this dialogue). And there we have it, 5 castles (or four castles and one cattsle). All that remains is the rewards. Here's a taste of a few of them (there's actually 30 new equipment items in total) Which one do you think is the most gamebreaking? (Incidentally, "Finale" mentioned in the Dancer weapon is Amp. Someone complained that calling it Amp made no sense, which is true). Actually, a key element of this is that most of the gear is significantly restricted in terms of which classes can use it, so even if an item like the Light Manteau maybe outclasses the Heavenly Wings (Dex +1, 3 Def), the fact that only a few classes can use it prevents it from making the other item useless. In any case, they're not really out of line with a lot of the gear that's already in the game (and I don't think they're nearly as bad as a lot of the nonsense that was added in renewal), but they are probably things you would actually want, which of course is the point. Anyway, that wraps it up for this time. it might be a long time before another update, if there even is one, but I hope everyone has enjoyed reading this thread.
    3 points
  9. Work perfectly by copy externalsettings file from rdata.grf to myfile.grf, thx to 4144. Load Costum lua file instead of iteminfo*.lub is missing with 2021-11-17_Ragexe client.
    3 points
  10. 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!
    2 points
  11. Before I saw a few of servers having issue because of groups.yml that written incorrectly, which can makes server couldnt start (stuck at reading groups.yml), or account cannot login because of group ID didnt exist (cant be read by rathena emulator). So I hope this helps, Commands Generator. The list of commands are parsed directly from doc/atcommands.txt so if there is any updates of commands, it should be automatically added too. Let me know if you have any suggestion or improvement ideas for any of this generator.
    2 points
  12. Hello! If you're here it likely means you want to learn, or learn more about, your Ragnarok Art Tools. Feel free to browse the entire post for bits of information you want. This guide will show the basics of how to run most applications and where to officially download them from. To avoid virus and scams please follow only the links posted in thie guide & by the official rAthena crew. Requirements : A Computer with at least 32 GB of space & 2 GB of RAM (4GB Recommended). Latest Ragnarok Client for data.grf (Download here or RMS here) Latest rAthena trunk Photo Editing software (Gimp, Photoshop, Illustrator, Paint, etc.) Act Editor GRF Editor Notepad++ (or anther text editor) Optional Requirements : Photo Manipulation Sofware (ImageMagick) Now that we got a few things to get us started let's get editing... Section 1 - Installation STEP ONE : Understanding Software (Learn the tools) i1.1.0 Before we get starter we are going to open up and make sure we have an understanding of our tools we want to use. in this example we will be using GIMP 2.10 as our editor of choice. It's free & open-sourced. Once we've download Gimp, & have run it for the first time, we are going to now see a screen that looks similar to the one below... This layout is quite similar to most GNU programs. The tools are on the Left and the stats/properties are on the right. Let's start with the tools. Starting at the top left and moving right we have the default Move Tools, Shaped Select Tool, Free Select Tool & the Magic Select Tools. These are usually going to be the primary tools you will want to use for editing. The Move tools allow you to move and allign the images, frames, or selections. This is very simple way to crop out areas of an image you don't want or need. The Shaped & Free select tools will be used to select specific areas we want to manipulate. This is great for choosing set spots that we might need to change the colour of, or even just remove completely from the frame. And finally, for this example, we have our Magic Select tools. These are especially important for colour manipulation & photo editing as it will allow us to select an exact pixel-point selection around, or of, an object. You will likely use these tools frequently when editing for Ragnarok Online. That's the basics of GIMP, for now. Moving on, we have the basics of GRF editing. GRF Editor is a gret tool used to extract & read files from Gravity made files. We will use GRFE to extract and import our images we want. In the image below we have opened a dara.grf and are ready to view the files. GRFE is going to be used in this example primarily for extracting images & adding new ones in. On the top we have our Menu. For this first part we are going to navigate to Tools and select Settings. In here we will be presented with the settings menu. We are not going to touch on all the options here, instead, we will just do the translation so we can see where we are adding/removing files to and from. Go ahead and select the "Tree Behaviour" tab. You'll see some radio boxes here. We want to Check the last one. It should say "Translate paths in the tree". This will turn make most of the titles with ASCII characters into plain English. Close and relaunch the application for this to take effect. Our GRFE will now read like this so we cans ee where we want to make changes easier. Now you can find everything much easier. For this example moving forward, we will be editing the Hylozoist monster. to extract just that mosnter, hold SHIFT and click with your mouse the files you want to extract. Right click and hit "Extract". It should automatically pop up with the extracted files. It will be where ever the GRF is and extracted into a /data folder. Once we've made changes to the file we can simply drag these files back into the GRF exactly how it is. So take the entire /data folder and drag it into the witespace of GRFE. Save (CTRL+S) and wait for it to pack everything together. You've now made your first change to the GRF. ...... But did we really? We didn't actually make any changes to the file, just yet. We'll need Act Editor (actOR) to unpack the sprites out of the .act/.spr files now. To make things easier first right click the .ACT file and click "Open with...". We will associate the Act Editor with the .act files in Windows so it's quicker to open later. Once open we will have a window similar to this: At the top we have our Menu where we can do just about everything the application allows. The very bottom we have the frames. These are all the different images used in the actor. This will show all the angles and directions it can face. The center shows the actor at it's current (or final) state after the changes and on the right of that we have the stats window for each sprite. This is where we can manipulate the directions, angles, animation playing, state of the animation, and much more. Sounds compliacted but it's really simple. Just get a feel for everything and you will learn to understand how everything works over time. At the bottom, where we have our sprites, we can right click any one of them and another menu will appear. This is how we will extract an individual frame for editing using the "Export" button. Select where you want to extract it and we can start editing the image. I've went ahead and extracted all the images for this example. We will make colour changes to start. With the images now extracted we can open them up using our photo editing software, GIMP. We're in and ready to start editing! In this example I'm going to use the Colour Select tool and change the threhold to be higher, or lower, depending how much of the colours I want to take over. At threshold of 15 it select a small portio of the colours I want. I will increase this to 30 and see how I like it next. 15 Threshold 30 Threshold It looks like 30 is strong enough for what I want to achieve. With this selection we can now change only those bits of the image. Go ahead and select "Colors" from the menu. Many options, yes. For now we just want to change the "Temperature" of the selection to be different. Select "Split view" and we can see the changes before we apply them to save time. Making the image hot worked for what I need to do. Now I can hit apply and save this image, just make this change to all the frames you want and save them using the "Export" option (CTRL+SHIFT+E by default). Replace the file and DO NOT CHANGE THE FORMAT AT ALL. Ragnarok has a very specific format that requires the following settings to be EXACT or it won't read: -format bmp -alpha off -type palette -colors 255 -depth 8 -compress none BMP3: Without those settings it won't read. So don't change anything if you can avoid it. Once all changes are made we can repack it into the Actor Editor. So get actOR ready loaded with the sprite you are editing. Inside the editor we can now go back to the bottom and select the frame we just edited. We want to, this time, select "Replace" and this will take the image we have and put it in the exact same position as we left it in. This is important so we don't mess around with the placement of the image. Once we've processed this for all the frames we can take a look at our final product with the Play button. It looks good! (For the example) Now this sprite was a bad colour choice for editing simply because the RED we changed was actually a transparency colour for Ragnarok Online. There are, if I recall correctly, 3 colours of transparency in Ragnarok. Red, Blue and Purple. This is the primary one (Purple): Save your Actor file and we are ready to open the GRFE again to import the newly changed sprite. Simply drag and drop the files and hit save! That's it! You've made your first edit and packed it back into the GRF for use in-game. STEP TWO : Headgears & Implementation (Custom Headgears) a1.2.0 We've got a headgear all spited out and tucked into an actor file in the GRF. Ready. To. Go. Now what? Well.... It's time to add... The Code. That's right. I said it. Artists have to code just as much as coders have to art. To start, we're going to extract a few default files from the data.grf we downloaded earlier. The files we want are: data\lua files\datainfo\accessoryid.lub data\lua files\datainfo\accname.lub data\luafiles514\lua files\datainfo\accessoryid.lub data\luafiles514\lua files\datainfo\accname.lub data\luafiles514\lua files\datainfo\accname_eng.lub The accessoryid.lub is where we will add the "ACCESSORY_IDs" that are in the item_db_equip.yml file of our server. We will go through this next. Inside your rAthena trunk you will find the file item_db_equip.yml which we are going to open and examine. Notice inside we have a structure. This is what the server reads in order to tell the client what item to display and when. Follow this structure exactly as it is and do not change any of the syntax or else nothing will work. Our layout is telling the server take a;; ACCESSORY_IDs based on their ACCESSORY_NAME followed by their ID. ACCESSORY_IDs = { ACCESSORY_GOGGLES = 1, ACCESSORY_CATTYHAIRBAND = 2, ACCESSORY_GLASS = 3, ... Notice each item is separated by a comma then proceeds to the next line. However, at the end, there is a break in the comma streak. ... ACCESSORY_Chocolat_Rabbit_Hair = 2369, ACCESSORY_Cookie_PinkRibbon = 2370 } This is telling the server that is the end of the file and it has reached thelast headgear. We're going to edit from here by adding a comma to this ending, extending it to our new headgears. We also want to take into consideration the updates of the future. This game is always being added on to and it's important to not conflict our numbers with possible future updates. We're going to give our future updates a good distance in headgears, with the highest possible limit we think we'll reach for ourselves. In this example we will give future devs up to Accessory ID 9999 and we will claim anything above 10,000. File structure must remain the same: - Id: 30000 AegisName: Majora_Mask2 Name: Majora's Mask Type: Armor Locations: Costume_Head_Mid: true ArmorLevel: 1 EquipLevelMin: 1 View: 10000 Inside /data/lua files/datainfo/accessoryid.lub: ... ACCESSORY_Chocolat_Rabbit_Hair = 2369, ACCESSORY_Cookie_PinkRibbon = 2370, ACCESSORY_Majora_Mask2 = 10000 } Inside /data/lua files/datainfo/accname.lub and/or accname_eng.lub: ... [ACCESSORY_IDs.ACCESSORY_Chocolat_Rabbit_Hair] = "_Chocolat_Rabbit_Hair", [ACCESSORY_IDs.ACCESSORY_Cookie_PinkRibbon] = "_Cookie_PinkRibbon", [ACCESSORY_IDs.ACCESSORY_Majora_Mask2] = "_Majora_Mask2" } Save those and repack them into the Custom.grf (or data.grf if you're using that). That's it for the GRF section. Onward to the Client files now. Open up /CustomRO/System/itemInfo.lua and we are going to edit near the bottom. Last item in the list. A new item. The item info we are entering in must surpass the tieminfo that is going to exist as well. Let's jump right to 60,000 in this example: ... ClassNum = 0, costume = false }, [60000] = { unidentifiedDisplayName = "Majora's Mask", unidentifiedResourceName = "Majora_Mask2", unidentifiedDescriptionName = { "Can be identified by using a ^990099Magnifier^000000." }, identifiedDisplayName = "Majora's Mask", identifiedResourceName = "Majora_Mask2", identifiedDescriptionName = { "Description", "_______________________", "DEX +1", }, slotCount = 4, ClassNum = 0, costume = true } Save and we're done with the itemInfo.lua file. So we've got Server files save and Client files asved. Lastly we need to do the Sprites for the client. The art portion. Let's go ahead and open up GRF Editor and import those files we created. The file structure for each file is below. The sprite and texture files we want are: (Example name is Majora_Mask2) Some characters are not displayed correctly in the text. data majorabw\sprite\_’AIU\Majora_Mask2.act data majorabw\sprite\_’AIU\Majora_Mask2.spr data majorabw\sprite\_€¬¬¯‡,r\3ý\3ý_Majora_Mask2.act data majorabw\sprite\_€¬¬¯‡,r\3ý\3ý_Majora_Mask2.spr data majorabw\sprite\_€¬¬¯‡,r\¨c\¨c_Majora_Mask2.act data majorabw\sprite\_€¬¬¯‡,r\¨c\¨c_Majora_Mask2.spr data majorabw\texture\A_A£AII’„AI«§\collection\Majora_Mask2.bmp data majorabw\texture\A_A£AII’„AI«§\item\Majora_Mask2.bmp Save the GRF and it's now ready to use your new item in-game! Section 2 - Additional Resources actOR : Actor Editor (Bulk Export) a2.1.0 Editing in Actor is very easy. Scripting it is just as easy! In this step we are going to discuss and go through various methods of exporting and importing images using actOR. To start we want to create an export script. We'll call it "export.cs" to start. Open a Notepad or Code editor and paste the following inside: using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Media.Imaging; using ErrorManager; using GRF.FileFormats.ActFormat; using GRF.FileFormats.SprFormat; using GRF.FileFormats.PalFormat; using GRF.Image; using GRF.Image.Decoders; using GRF.Graphics; using GRF.Core; using GRF.IO; using GRF.System; using GrfToWpfBridge; using TokeiLibrary; using TokeiLibrary.WPF; using Utilities; using Utilities.Extension; using Action = GRF.FileFormats.ActFormat.Action; using Frame = GRF.FileFormats.ActFormat.Frame; using Point = System.Windows.Point; namespace Scripts { public class Script : IActScript { public const int Magnify = 2; public object DisplayName { get { return "Export"; } } public string Group { get { return "Custom"; } } public string InputGesture { get { return "{Scrips.Export}" ; } } public string Image { get { return "scale.png"; } } public void Execute(Act act, int selectedActionIndex, int selectedFrameIndex, int[] selectedLayerIndexes) { // Script for extraction string basepath = @"C:\GRFsprites"; var name = act.LoadedPath; var outputFolder = GrfPath.Combine(basepath, Path.GetFileNameWithoutExtension(name)); if (Directory.Exists(outputFolder)) { var files = Directory.GetFiles(outputFolder); if (files.Length > 0) { if (!ErrorHandler.YesNoRequest("Do you want to replace the existing extracted files?", "Possible overwrite")) return; } } for (int i = 0; i < act.Sprite.Images.Count; i++) { var image = act.Sprite.Images[i].Copy(); var ext = ".bmp"; if (image.GrfImageType == GrfImageType.Bgra32) { ext = ".png"; } var output = GrfPath.Combine(basepath, Path.GetFileNameWithoutExtension(name), String.Format("{0:0000}", i) + ext); GrfPath.CreateDirectoryFromFile(output); image.Save(output); } Utilities.Services.OpeningService.OpenFolder(GrfPath.Combine(basepath, Path.GetFileNameWithoutExtension(name))); } public bool CanExecute(Act act, int selectedActionIndex, int selectedFrameIndex, int[] selectedLayerIndexes) { return true; } } } Save that as "exprot.cs" and make sure the file type is changed to be a .CS file. Inside actOR select "Scripts" in the menu at the top and navigate to "Open scritps folder". Simply paste the export.cs script inside this folder and actOR will do the rest by linking it with a DLL file. Close and reload actOR for changes to take effect. If all worked well you should see a new menu called "Custom" and it will have the export script inside it. Select Export with your active sprite file open and it will extract all the images included in it to your C:/ drive with the folder named after the sprite. You can now extract all images with one click! This is perfect and will save you so much time Rgnarok BMP : Converting to BMP (Ragnarok Compatible BMP) a2.2.0 Oh noe! I made all my files in .png and not .bmp! How can I fix this? I have over 9,000 files! Ever done that? I have. It really sucks. Kind of. There's a way through it without starting all over from scratch or going deep into your files and resaving them all as BMP one by one... In this section we'll go through how to mass-convert all your files to be copatible with Ragnarok Online's file format. Start by downloading ImageMagick from their website and installing it. You'll maybe want (maybe need) "Legacy Tools" which can be checked during the installation process. After installation you will likely have no visuals on how to operate this application. There is no drag-and-drop process for bulk operations. That would be quite complicated to code as well. BUt that's oaky. We have all the tools necessary built into both Linux and Windows operating systems already. The Terminal! (CMD) Open up your terminal. With ImageMagick they have now built in commands that we can execute from the terminal. This is going to prove very useful for the fastest and most effective conversion. This is partly because it skips all UI lag and extra garbage in an application. It processes this directly without any middle-man. The file format we mentioned earlier is actually going to be very useful in filling out our command. To go over that again we have the following format to deal with: A Bitmap image with no alpha channel processed under the palette layer with 255 colours at an 8 depth with no compression on a BMP3 level. Broken down we can take their aspects from that description and put it into a line of code. Simple right? I knew you got it! Change the directory to match your directory and enter in the following command to conver your first image: (Highlighted areas are what you will change) magick mogrify "C:/Users/Rivers/Desktop/Input/prt_12A01.png" -format bmp -alpha off -type palette -colors 255 -depth 8 -compress none BMP3:"C:/Users/Rivers/Desktop/output/prt_12A01.bmp" Let's break that down, again. In short. - magick mogrify is the command to tell our computer what program we need to use. Every command must start with this. - format bmp sets the intial format we want to change the file type to. We must declare this first. - alpha off will disable the alpha channel. Very necessary to avoid bad transparency issues. (Ragnarok Transparency runs on colours) - type palette will change the layer we are operating on to the palette layer. This is our primary layer to work in when editing sprites and textures. - colors 255 is going to set that maximum colours allowed for the final format. If this is 256 it will not work. - depth 8 is going to set the bit depth to 8-bit which is the only size readable by Ragnarok for most things. This is because in 2002 code was much more limited in what it could possibly do. - compress none will remove any compression. Ragnarok can't read compressed files. - BMP3:"C:/Location" is going to be the final piece of the code that will set the file type one final time to be a BMP3 and save it in the location we designate. Now that we have a better understanding we can learn from this while we continue to make all the images pixel perfect and compatible in the GRF. Bulk Editing Images : Batch Image Manipulation (Bulk Edit) a2.3.0 In this part of the guide we will go through how to edit multiple files with a single modification. This is called Batch Image Manipulation. There's even a great plugin we're going to use that is built for GIMP. The plugin is called Batch image Manipulation Plugin or BIMP for short. So in this section we will cover how to download, install, and user BIMP. If you missed it, here's the download link for BIMP: https://alessandrofrancesconi.it/projects/bimp/ Installing BIMP Here's where things get slightly trickier. Follow the exact paths moving forward and you'll be bulk editing in no time. Run BIMP installer. A window similar to this will appear: Once you're at the window to select installation destination you'll need to navigate to and select the directory exactly as is below: %AppData%\Roaming\GIMP If it continues without requesting to select a destination then you're good to go! After installation is done you can launch GIMP and navigate to the top menu: File > Batch Image Manipulation Plugin This will be the primary window you need to operate in. As you can see here there are many options you can play around with, including the very popular "Watermark" feature which will add a watermark to all your images for you. This will save so much time later on. That's just about it for this part of the guide. Happy editing! Keep posted for more updates to this section. Want to see something specific? Leave a comment and I'll do what I can!
    2 points
  13. I fixed the hyperlink color, along with the brush selection and the search brush (same download link as before). As for the 4 GB limit, that's a structural limit with GRF files and there's nothing that can be done about it unless Gravity updates their file format. For more context, the file table offset is defined as an unsigned integer and the entries within the file table are also defined as unsigned integers. Four bytes of data cannot go beyond 4294967295; if they do, they'll wrap back to 0 and starts corrupting data in your GRF. I'm afraid this is technically impossible. If your GRF reached 5+ GB in size, then it means you've lost data within your GRF without you knowing about it. As I mentioned above, if you go past 4 GB with your file offsets, the data wraps back to 0. The fact that your GRF loads means that the file table offset was indeed beyond the limit and is probably written right in the middle of your GRF instead of at the end of it. The file table has overwritten some of your files within your GRF and some indexes are linking to invalid data (and not by a small amount, about 1/5th of your GRF is unreadable). When that happens, the client won't be able to decompress the data as it won't be a valid zlib entry, and it will attempt to read from the next GRF listed.
    2 points
  14. Version 1.0.0

    187 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
    2 points
  15. 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
    2 points
  16. Alright, i got my own excel, you can modify the excel by drag it down the row to generate more level if you want.. Here i will share to you guys. job_exp (base) 1-1000.xls job_exp (job) 1-255.xlsstatpoint (1 - 1000).xls After that you can use this link to convert excel to yaml, hen copy it : https://tableconvert.com/excel-to-yaml Then you can go to db/re/job_exp.yml then paste what you needed. Sorry i cant share my own yml, dont ask me! Sorry for bad english
    2 points
  17. View File [MobOnly] Illusion Teddy Bear/Labyrinth and Custom Issgard Dun/Frozen scale Field ***Include Abyss Lake4**** -IllusionTeddy Bear/Labyrinth base on https://www.divine-pride.net/ (Include Drops Table) -No Portal -Issgard Dun/Frozen scale Field are custom to fit my server. (Custom Drops Table) Install : Put Mob and mob skill to rathena\db\import PutNpcfiles (Custom.txt) to rathena\npc\custom add new line npc: npc/custom/Custom.txt at rathena\npc\scripts_custom.conf Submitter dekspyware Submitted 03/16/24 Category Scripts Video Content Author dekspyware  
    1 point
  18. thank you sir. it work like a charm now ^^
    1 point
  19. Yeah, I didn't tried the weapon part before this and thanks for the respond. I've fix the refinable part. But for the description, this is just multiple generator so u can edit all of it at iteminfo. Actually I add the script in description because its easier to edit by searching the scripts part. But, Ive added that part too. Enjoy. I didn't understand. Do you mean its generating item_db yml without scripts, or wont generate item_db.yml at all ?
    1 point
  20. 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. //.*
    1 point
  21. 1- DESCARGAR NUESTRO EMULADOR Lo primero que necesitaremos es nuestro emulador rAthena ultima revisión y para ello debemos descargar Tortoise SvN aqui: https://tortoisesvn.net/downloads.html Una vez descargamos el Tortoise Svn nos vamos al escritorio y creamos una carpeta con nombre rAthena, a dicha carpeta le damos click derecho y elegimos la opcion SVN Checkout... Se abrirá la ventana de CheckOut y en el URL of repository colocamos https://github.com/rathena/rathena/trunk y en Revision ponemos HEAD Al darle Ok, el programa empezara a descargar el emulador a la carpeta rAthena, si todo salio bien habrás descargado con éxito tu emulador con la ultima revisión del repositorio. 2- CREAR NUESTRO SERVIDOR Una vez descargado el emulador, necesitaremos crear nuestra base de datos SQL en nuestro ordenador, con las credenciales del servidor, para ello vamos a necesitar el programa MySql Nos dirigimos a este link https://dev.mysql.com/downloads/installer/ y elegimos la opción mas pesada de 420 MB. Al momento de instalarlo nos irán saliendo las opciones de configuración, en la de High Availability marcamos la primera opción, Standalone MySQL Server y le damos next En la Opcion Type and Networkimg elegimos Development Computer y NO TOCAMOS ABSOLUTAMENTE MAS NADA DENTRO DE ESTA CONFIGURACION! le damos Next y entraremos en el Methodo de Autenticacion, aqui solamente marcamos Use Legacy y le damos al Next En Account & Roles, para el password de Root pondremos como pasword ragnarok en minúsculas, ragnarok es la que contraseña que viene por defecto en el inter athena conf del emulador. En Windows Service dejamos todo como esta y le damos next En la siguiente ventana, le damos a EXECUTE para que se empiezen a aplicar todas las configuraciones, Cuando todos los ganchos están en verde indica que se instalo bien tu servidor, En este punto, tienes instalado tu servidor local en tu computadora y esta corriendo. 3- DESIGNAR EL NOMBRE CORRECTO DE NUESTRO SERVIDOR ROOT EN LOS COMPONENTES DEL SERVIDOR Ya que tenemos nuestro servidor Root en la computadora, nos vamos a nuestro folder de emulador rAthena, buscamos la carpeta conf, y dentro encontraremos el archivo inter_athena, como este es un archivo de texto le damos a editar, y nos vamos a la parte de Global SQL Settings En la linea 31, en login_server_id reemplazamos ragnarok por root, pues root es el servidor SQL que instalamos en nuestro ordenador, y deberá quedar así: // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: root login_server_pw: ragnarok login_server_db: ragnarok login_codepage: login_case_sensitive: no En la parte de ipban_db_id también cambiamos el ragnarok y ponemos root, debera quedar asi: ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: root ipban_db_pw: ragnarok ipban_db_db: ragnarok ipban_codepage: En el char_server_id reemplazamos ragnarok y ponemos root, debera quedar asi: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: root char_server_pw: ragnarok char_server_db: ragnarok El map_server_id también le reeplazamos el ragnarok y le ponemos el nombre root ya que este es el nombre dado por nuestro servidor sql, deberá quedar asi: // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: root map_server_pw: ragnarok map_server_db: ragnarok Por ultimo pero no menos importantes los logs, en log_db_id reemplazamos ragnarok por root, debiendo quedar así: // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: root log_db_pw: ragnarok log_db_db: ragnarok log_codepage: log_login_db: loginlog CHAR_ATHENA Ya que terminamos de ajustar el inther athena conf, nos vamos al char_athena conf, esta parte es importante porque aquí seteamos el mapa de inicio de nuestros personajes creados. Eliges el mapa de inicio de tus novice para renewal o pre renewal.. Te recomiendo usar una data renewal si vas a usar un punto de partida renewal, NO PUEDES ser renewal sin data renewal pues se te pondra la pantalla negra cuando logees tu char... mas adelante te enseñare como configurar tu emulador para renewal o pre-renewal Dentro de char_athena también desactivamos algo bastante molesto llamado pincode, solo basta encontrar la linea que dice pincode_enabled y ponemos no, deberá quedar así: //=================================== // Pincode system //=================================== // NOTE: Requires client 2011-03-09aragexeRE or newer. // A window is opened before you can select your character and you will have to enter a pincode by using only your mouse. // Default: yes pincode_enabled: no LOGIN_ATHENA Aquí solo necesitamos ajustar una sola cosa! y es el poder Habilitar la creación de nuestro personaje con _M o _F En la linea 54 de este file ponemos yes en la opcion "//Can you use _M/_F to make new accounts o the server? Debera quedar así: // Can you use _M/_F to make new accounts on the server? // Note: This only works if client side password encryption is not enabled. new_account: yes terminamos las configuraciones del emulador por ahora. 4- GESTIONAR NUESTRA BASE DE DATOS Una vez configurado el inter_athena.conf char_athena.conf y login_athena.conf necesitaremos un programa para crear nuestra BASE DE DATOS, yo recomiendo altamente el programa HeidiSQL por su facilidad de uso, este es el primero que use cuando empece a crear servers, y nunca me ha fallado. Link de descarga aqui: https://www.heidisql.com/download.php Una vez tenemos Instalado Heidi!, procedemos a crear la base de datos de nuestro servidor, elegimos Nueva, Aquí Lo importante es mantener el usuario root ya que ese es el nombre de nuestro servidor de datos sql, en contraseña debemos poner ragnarok en minuscula, pues es la clave que elegimos al instalar mysql y son las claves de los componentes que vienen por defecto en el inter_atena.conf. Al nombre de la sesión le puedes poner el que mas te guste, yo lo dejare en unnamed para guiarlos mejor. Cuando la tenemos creada le damos a abrir, hacemos click derecho sobre Unnamed o el nombre de sesion que le hayas dado, eliges crear nuevo, y le das click a base de datos. Es MUY MUY IMPORTANTE que el nombre de la base de datos sea ragnarok pues es el mismo nombre que tienen los componentes del server en el inter_atena.conf que previamente configuramos ok? Una vez creada la base de datos ragnarok la seleccionamos y nos vamos a la pestaña archivo Al abrir la pestaña archivo seleccionamos cargar archivo SQL, y se nos abrirá la ventana de exploración, en la cual elegimos rAthena, luego sql-files y elegimos main y logs con control, una vez seleccionados main y logs le damos a abrir. Una vez abiertas dirígete a la pestaña main, y ejecutala dandole click al triangulo azul, veras como se van cargando las tablas en la base de datos ragnarok Una vez terminada de cargar las main, selecciona la de logs y procede con lo mismo, click al triangulo para ejecutar, la tabla logs es importante ya que esta registra los movimientos de items, objetos comandos, en fin es como una bitacora que ni so se carga el emulador se la pasara enviando warnings. Otros sql-files que podrias cargar dentro de la db ragnarok serian el roulette_default_data por si quieres implementar la ruleta en tu servidor, pero los premios y requisitos de la ruleta se configuran en esa misma tabla y no en scripts. Cuando se ha cargado todo, presiona f5, esto recargara las tablas, en pocas palabras actualizara o refrescara heidi y MAGIA puedes ir a la tabla login, y luego a la pestaña datos, la account_id 1 es del sistema y esa no la puedes ocupar para tu char, alli van a parar los chars que creas en tu server, para ser ADMIN con todos los comandos debes ponerte 99 el el group id. Ya tenemos servidor, y base de datos. 5- COMPATIBILIZAR EL EJECUTABLE Y COMPILAR NUESTRO EMULADOR Antes de Encender nuestro emulador debemos configurarlo y luego compilarlo. El cliente o ejecutable que recomiendo es 2018-06-20eRagexeRE.exe pues es el que considero mas estable, este ejecutable lo puedes descargar en el post de MathReaper Para compatibilizar el exe con el emulador debes ir a tu carpeta rAthena y elegir la carpeta SCR, (ya estamos en territorios de alto riesgo), dentro de la carpeta scr nos vamos a la carpeta config y abrimos packets.hpp Para tener una mejor experiencia editando estos archivos, recomiendo el programa notepad++ lo puedes descargar aqui: https://notepad-plus-plus.org/downloads/ al abrir packets.hpp encontraremos la linea que tiene asignada la versión del exe #ifndef PACKETVER /// Do NOT edit this line! To set your client version, please do this instead: /// In Windows: Add this line in your src\custom\defines_pre.hpp file: #define PACKETVER YYYYMMDD /// In Linux: The same as above or run the following command: ./configure --enable-packetver=YYYYMMDD #define PACKETVER 20200401 #endif en el #define PACKETVER 20200401 debemos cambiar y asignar el exe que les recomendé en este caso el 20180620 el texto deberá quedar así #ifndef PACKETVER /// Do NOT edit this line! To set your client version, please do this instead: /// In Windows: Add this line in your src\custom\defines_pre.hpp file: #define PACKETVER YYYYMMDD /// In Linux: The same as above or run the following command: ./configure --enable-packetver=YYYYMMDD #define PACKETVER 20180620 #endif Para Evitar la Black Screen del Exe al seleccionar tu personaje deberás editar y agregar tu packet version en el siguiente archivo: SCR/CUSTOM/ defines_post.hpp defines_pre.hpp si lo vas a hacer pre renwal editas el defines_pre.hpp si lo vas a hacer renewal entonces edintas el defines_post.hpp // Copyright (c) rAthena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder #ifndef CONFIG_CUSTOM_DEFINES_PRE_HPP #define CONFIG_CUSTOM_DEFINES_PRE_HPP /** * rAthena configuration file (http://rathena.org) * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ **/ #define PACKETVER 20180620 #endif /* CONFIG_CUSTOM_DEFINES_PRE_HPP */ RENEWAL O PRE? El emulador viene RENEWAL por defecto, si queremos ser pre renewal tenemos que ir a la carpeta SCR de nuestro rAthena, luego a la carpeta config y abrimos renewal.hpp Una vez abierto lo único que debemos hacer es comentar la parte que dice #define Renewal, comentar no es mas que colocar dos slashes // al inicio del define de renewal! como muestra la imagen para deshabilitar todas las características de renewal solo basta con dejar el texto asi: //#define Renewal COMPILACION Una vez hecho todos estos cambio debemos compilar nuestro emulador! Para compilar el emulador necesitas tener instalado el Visual Studio Community, lo podrás conseguir en este link: https://visualstudio.microsoft.com/es/downloads/ Al momento de instalarlo deberás elegir las herramientas C+ yo recomiendo la universal windows platform development y desktop developtment with C++. el resto nisiquiera la vamos a mirar. Una vez tenemos el Visual Instalado nos vamos a la carpeta de nuestro emulador y abrimos la solución, de nombre rAthena.sln Una vez Abierta la solución!, ASEGURATE DE ELEGIR RELEASE como lo muestro en la IMAGEN y no Debug, luego click derecho en Solución rAthena y click a Compilar Solución, ahora deberás esperar que se compilen todos los proyectos Si tu compilación fue exitosa tendrás correctos todos los resultados Ya puedes abrir tu emulador, para ello ve a la carpeta rAthena y abre individualmente los proyectos loginserv charserv y mapserv Si quieres ahorrarte el trabajo de abrir siempre los 3 componentes del server cada vez que inicies tu emulador, abre solamente runserver, lamentablemente esto viene bugeado, y no se ha corregido, por lo cual tuve que editarlo para que funcionara, si lo quieres, PUEDES DESCARGAR ESTOS CON TODA CONFIANZA Y METERLOS EN TU CARPETA RATHENA, Reemplazando los que vienen por defecto, con esto podras abrir el emulador usando solo runserver. pero necesitaras estos 2 archivos que voy a poner aqui abajo: runserver.bat y serv.bat Si seguiste bien todas las indicaciones, tendrás abierto un emulador optimo y sin ningún error!. 6- CREAR NUESTRO CLIENTE Y DIFFEAR NUESTRO EXE PARA EMPEZAR A JUGAR NUESTRO EMULADOR Antes que nada necesitas el KRO COMPLETO, EL JUEGO RAGNAROK , Lo puedes descargar aquí mismo, Nuestro administrador Akkarin nos compartió el ultimo cliente en este topic: Una ves terminado de descargar y extraer el KRO Limpio, necesitaras crear los archivos de tu propio cliente, Estos archivos del cliente son los GRF y la Data Traducida que tiene Archivos Luas, Descripcion de Objetos, Quests, Entre Otros, y son los que deberás exportar a tu Ragnarok Limpio. Tengo a Disposición un RAR Limpio, con los archivos necesarios y básicos para un cliente, consta de 2 GRF's uno llamado Custom y Otro llamado Pal, tambien tiene un exe pre difeado que puedes usar para ir testeando tu servidor. Si tu servidor va a ser Pre Renewal, con los items, mapas, y descripciones de pre renewal deberas bajar este rar de mi unidad Drive: - https://drive.google.com/file/d/1M8gvEWnumjPwNwzXLrACBYYAqE3ptoRp/view?usp=sharing Si tu servidor va a ser RENEWAL con la descripcion de items, y mapas renewal deberas bajar este rar de mi unidad Drive: https://drive.google.com/file/d/18Pn4Zw0q_-yBTkE9n30JN8hGLGmL6iyo/view?usp=sharing Al descargar y extraerse, lo único que deberás hacer copiarlo todo y pegarlo a la carpeta del ro limpio. TODO LO QUE TE PIDA REEMPLAZAR LO REEMPLAZAS! estos archivos podrás editarlos o preservarlos por si quieres crear un instalador para tu usuarios. Si tienes el emulador encendido, puedes intentar entrar a tu servidor ejecutando el exe pre diffeado que acabas de pegar en tu ragnarok limpio, el de nombre 2018-06-20eRagexeRE_patched que te incluí en el RAR, Si te sale THE EXE HAS CHANGED al principio, cierra y vuelve a abrir, esto pasa una sola vez y te indica que el ejecutable que se usa es el de tu servidor y no el de Kro, Cuando abras podrás crear tu personaje, lo que indica que estas en el servicio correcto. Si quieres diffear tu propio ejecutable deberás descargar nemo Patcher en este Link: https://gitlab.com/4144/Nemo/ En imput exe file subes el ejecutable que hayas descargado, recuerda que debe ser la misma versión que definiste en tu emulador, en output es donde se va a generar el ejecutable diffeado, pones Load Client y se cargaran todos los parches posibles para el exe. Algunos diff Recomendados y Otros necesarios para que el cliente arranque sin problemas son: @ Bug Fix (Recommended) Allow close cutin by pressing esc key Allow space in guild name Always Load Client Plugins [Experimental] Always Show Resurrection Button Always Use Email for Char Deletion Always load Korea ExternalSettings lua file Cancel to Login Window (Recommended) Change RecommendedQuestInfoList*.lub path aqui escribes system\OngoingQuestInfoList Change character display deletion time from actual date to relative date Change minimal screen resolution limit Change new char name field height AQUI PONES 17 esto muestra el nombre correctamente al momento de crear tu personaje Chat Flood Remove Limit Custom Window Title aqio pones el nombre que le quieres dar a tu ventana de ragnarok Disable 1rag1 type parameters (Recommended) Disable Help Message on Login (Recommended) Disable Swear Filter Disconnect to Login Window Enable /who command (Recommended) Enable DNS Support (Recommended) Enable Effect for all Maps [Experimental] Enable Emblem hover for BG Enable Monster Tables Enable Multiple GRFs (Recommended) solo el recommended Enable Shortcut All Item Enable Title Bar Menu botones en tu ventana de ragnarok Enable guild while in clan si quieres guild mientras estas en clan, deberas modificar el script de clans en rathena para pasar este filtro Enforce Official Login Background Extend Chat Box Extend Chat Room Box Extend Npc Dialog Box Extend PM Box Fix Camera Angles (Recommended) Fix Homunculus attack AI Fix achievement counters for each type of achievement Por si habilitaras achievements Fix act delay for act files with many frames Fix item description bug Hide build info in client (Recommended) Hide packets from peek (Recommended) Hide zero date (1969-01-01) in guild members window Ignore /account: command line argument Ignore Lua Errors --- esto lo puedes desactivar cuando tengas tu cliente terminado Ignore Missing Palette Error --- esto lo puedes desactivar cuando tengas tu cliente terminado Ignore Resource Errors --- esto lo puedes desactivar cuando tengas tu cliente terminado Increase Headgear ViewID Ponle 4000, asumiento que meteras hat custom, ragnarok ya supero las 2000 IDS Increase Zoom Out 75% o max como quieras Increase hair style limit for human only in game (old) Load Custom lua file instead of iteminfo*.lub (Recommended) aqui debes poner System/iteminfo.lua Only First Login Background Read msgstringtable.txt (Recommended) Remove Gravity Ads (Recommended) Remove Gravity Logo (Recommended) Remove Hourly Announce (Recommended) Remove Serial Display (Recommended) Remove wrong chars from cash shop Restore Cash Shop Icon Restore Login Window (Recommended) Show Register Button boton de redireccion al enlace de registro de chars que hayas puesto en tu sclientinfo Show Replay Button aqui se reproduciran las partidas que grabes en tu ragnarok Skip License Screen Skip some hidden menu icon buttons si desactivaste botones este parche hara que se acomoden los espacios vacios entre botones ocultos Translate Client (Recommended) Use Ascii on All LangTypes (Recommended) Use Default Web Browser In Cashshop Use Default Web Browser for URL Use Normal Guild Brackets (Recommended) Use Official Cloth Palettes Necesario para que se muestren las paletas de colores Use Plain Text Descriptions (Recommended) Use Ragnarok Icon Use Tilde for Matk Los Diff que de ningún modo debes activar: Always Call SelectKoreaClientInfo() (Recommended) Aunque Diga recomended NO LO HABILITES Change Walk To Delay Incomodo, acelera la resuesta de clicks hara que camines hacia un npc aun despues de abrir su dialogo HKLM To HKCU NO LO HABILITES Skip Service Selection Screen NO LO HABILITES si rompes el protocolo de seleccion de servicio no podras abrir el select char window EDICIÓN DE GRF Y SCLIENTINFO El programa para editar tu grf sera GRF EDITOR de Tokei, este programa es el equivalente a un arma forjada por el mismo Hefesto, así recuerda darle un upvote si llegas a descargarlo Con este programa abres tu Custom.grf y podrás visualizar los archivos del GRF de tu servidor, recuerda que siempre que vayas a aplicar un cambio, deberás tener el exe del ragnarok cerrado. En la carpeta data de tu Custom.grf se encuentra el sclientinfo.xml, en el campo Display editas El nombre del servidor que se mostrara cuando abras tu ejecutable, podrás asignar o remover las ropas de game master, tambien podrás cambiar el link del web de registro al que te dirige el boton register. Si vas a subir tu emulador a un host deberas editar el sclientinfo y poner la ip en donde esta montado tu servidor. El orden de lectura de los GRF se asigna en un archivo llamado Data.ini y el orden debera ir asi: [Data] 1=custom.grf 2=palette.grf 3=rdata.grf 4=data.grf Como ha notado, el grf de palettes está aislado, si bien no es muy pesado, esta lleno de miles de archivos pals, si llegaras a descargar las paletas de kamishi te recomiendo usar un grf exclusivo de paletas y no mezclarlo con tu custom pues estanos hablado de mas de 40mil archivos que tomaran bastante tiempo en empaquetarse. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- Montar el Servidor a un Host Hasta Este Punto de la guía! ya tienes tu Servidor Local, Tu Emulador Funcional sin errores, Tu cliente con Exe y GRF custom. Para Montar tu emulador a un host recomiendo el programa WinSCP https://winscp.net/eng/download.php Abres Winscp y colocas las credenciales que te entrego tu proveedor de servicios Host Pasas el Emulador a la carpeta raiz de tu host Cambias los datos de tu char_athena.conf en este file editas el // Login Server IP y el // Character Server IP pones la ip del host. Edita tambien el // Server Communication username and password. Porque el default S1 Y P1 todos lo conocen, este debe coinicidir con la de tu main sql. En login_athena.conf no se editan ips. pero puedes volver a habilitar o deshabilitar la creacion de chars usando _M o _F, esto por si quieres que los registros sean únicamente por Control Panel // Can you use _M/_F to make new accounts on the server? // Note: This only works if client side password encryption is not enabled. new_account: no En map_athena.conf Colocas el mismo server comunication username y password que tienes en tu sql y en tu char_athena.conf, el default es S1 y P1 pero tu elige uno que nadie conozca. // Interserver communication passwords, set in account.txt (or equiv.) userid: passwd: En inter_athena.conf Aqui no se editan ips ni puertos, aquí solamente se se colocan las credenciales de las _db: y _pw: correspondientes a las que tienes creadas en la base de datos de tu proveedor de servicios. // MySQL Login server login_server_ip: 127.0.0.1 login_server_port: 3306 login_server_id: root login_server_pw: login_server_db: login_codepage: login_case_sensitive: no ipban_db_ip: 127.0.0.1 ipban_db_port: 3306 ipban_db_id: root ipban_db_pw: ipban_db_db: ipban_codepage: // MySQL Character server char_server_ip: 127.0.0.1 char_server_port: 3306 char_server_id: root char_server_pw: char_server_db: // MySQL Map Server map_server_ip: 127.0.0.1 map_server_port: 3306 map_server_id: root map_server_pw: map_server_db: // MySQL Log Database log_db_ip: 127.0.0.1 log_db_port: 3306 log_db_id: root log_db_pw: log_db_db: log_codepage: log_login_db: loginlog Abrir y Compilar tu emulador remotamente Para abrir tu emulador cargado al host, necesitaras un programa llamado Putty que puedes descargar aqui https://www.putty.org/ Al abrirlo en el campo Host Name or IP adress colocas la Ip de tu host y le das OPEN Ya estas dentro de tu vps, y el te va a solicitar el user y el password que te proporciono el Host, debes tener cuidado al colocar el password porque no se van a mostrar los typing en la consola. Al entrar exitosamente tendras un display de los comandos preparados por su proveedor, generalmente son ON, OFF, PREPARAR, COMPILAR etc. Con los que puedes arrancar, detener, reiniciar o compilar el emulador que tienes cargado en el host. Deberas compilar y iniciar el emulador después de haber editado los confs con los datos del host. Aqui vemos el trabajo de compilación mediante vps Aqui vemos como ha iniciado el servidor, debe estar lleno de status y no errores Aqui un logeo exitoso Recuerda editar tu sclientinfo y ponerle la ip de tu provedor de host.
    1 point
  22. Yo me hice una mini guía para poder seguir cada vez que tenía que hacerlo, espero te sirva xd, ojo que algunas configuraciones están basadas en mi PC, debes ajustar los valores a tus necesidades @Franko Instala Subsistema de Linux Comando para activar instalar WSL, se agrega el flag -d para indicar que quiero instalar Debian wsl --install -d Debian Crear un archivo .wslconfig en C:\Users\YOUR_USER_HERE con lo siguiente dentro # Settings apply across all Linux distros running on WSL 2 [wsl2] # Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB memory=8GB # Sets the VM to use six virtual processors processors=6 # Sets amount of swap storage space to 8GB, default is 25% of available RAM swap=3GB # Turn off default connection to bind WSL 2 localhost to Windows localhost # localhostforwarding=true # Disables nested virtualization nestedVirtualization=false [experimental] autoMemoryReclaim=gradual sparseVhd=true networkingMode=mirrored firewall=true dnsTunneling=true autoProxy=true Para cambiar la contraseña del usuario root en WSL2, puedes seguir estos pasos: Abre el Símbolo del sistema como administrador. Escribe el comando wsl.exe -u root, esto abrirá una terminal de WSL como usuario root. Escribe el comando passwd. Ahora te pedirá la nueva contraseña de root. Ya dentro del WSL Debian corres el siguiente comando: sudo nano /etc/wsl.conf [boot] systemd=true Reiniciamos WSL para que haga efecto el cambio Instala Dependencias sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install git make tmux htop gcc mariadb-client mariadb-server zlib1g-dev libpcre3-dev build-essential libmariadb-dev-compat cmake gdb -y Configuramos Mysql Entramos a la consola de MySQL sudo systemctl start mysql sudo mysql_secure_installation sudo mysql -u root Creamos los usuarios y asignamos contraseñas - CAMBIA LO QUE TENGAS QUE CAMBIAR AQUÍ CREATE USER 'rathenausr'@'%' IDENTIFIED BY 'dietpi'; GRANT ALL PRIVILEGES ON *.* TO 'rathenausr'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; DROP DATABASE IF EXISTS rathenadb; CREATE DATABASE IF NOT EXISTS rathenadb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; DROP DATABASE IF EXISTS rathenalog; CREATE DATABASE IF NOT EXISTS rathenalog DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON rathenadb.*TO 'rathenadbusr'@'localhost' IDENTIFIED BY 'dietpi'; FLUSH PRIVILEGES; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON rathenalog.* TO 'rathenadbusr'@'localhost'; FLUSH PRIVILEGES; Agregamos el contenido a las base de datos sudo mysql -u root -proot rathenadb < main.sql sudo mysql -u root -proot rathenadb < web.sql sudo mysql -u root -proot rathenalog < logs.sql sudo mysql -u root -proot rathenadb < roulette_default_data.sql sudo mysql -u root -proot rathenadb < item_db.sql sudo mysql -u root -proot rathenadb < item_db2.sql sudo mysql -u root -proot rathenadb < item_db_re.sql sudo mysql -u root -proot rathenadb < item_db2_re.sql sudo mysql -u root -proot rathenadb < item_db_equip.sql sudo mysql -u root -proot rathenadb < item_db_etc.sql sudo mysql -u root -proot rathenadb < item_db_usable.sql sudo mysql -u root -proot rathenadb < item_db_re_equip.sql sudo mysql -u root -proot rathenadb < item_db_re_etc.sql sudo mysql -u root -proot rathenadb < item_db_re_usable.sql sudo mysql -u root -proot rathenadb < mob_db.sql sudo mysql -u root -proot rathenadb < mob_db2.sql sudo mysql -u root -proot rathenadb < mob_db_re.sql sudo mysql -u root -proot rathenadb < mob_db2_re.sql sudo mysql -u root -proot rathenadb < mob_skill_db.sql sudo mysql -u root -proot rathenadb < mob_skill_db2.sql sudo mysql -u root -proot rathenadb < mob_skill_db_re.sql sudo mysql -u root -proot rathenadb < mob_skill_db2_re.sql sudo mysql -u root -proot rathenadb < extended_vending.sql Agregamos S1 y P1, y una cuenta in-game admin sudo mysql -u root use rathenadb UPDATE login set `userid` = "s1", `user_pass` = "p1" where `account_id` = 1; INSERT INTO `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`, `web_auth_token`, `web_auth_token_enabled`) VALUES (2000000, 'tester', 'tester', 'M', '[email protected]', 99, 0, 0, 0, 0, NULL, '', NULL, 0, '', 0, 0, 0, NULL, 0);
    1 point
  23. This is the actual fix, I just found out today but @_Terraseemed to see it first. Version 1.2 is out, waiting for admin approval. Also some fix on selecting the first option on size, race, element type is fixed.
    1 point
  24. 1 point
  25. Okay I ve cleaned up the code a bit and add additional checks and returns. Idk if rA able to use big integer in SQL. So changed everything to use Integer. When the time is over and the function CheckEventBan is called it will deleted directly now. To cleanup the database. Pls delete the database and add the new with normal integer. If u ban a player check if they added to the database. EventBan.txt Rynbef~
    1 point
  26. Here is an example. I haven't tested. EventBan.txt U can use a command to ban player from event in minutes. Different events can have different IDs. And u have a function u can call to check if player is banned or not. Rynbef~
    1 point
  27. Por nada, compañero sureño
    1 point
  28. rAthena compatible Client and Hexed is attached Full Client: http://rofull.gnjoy.com/RAG_SETUP_211105.exe (from: http://nemo.herc.ws/downloads) rAthena server https://github.com/rathena/rathena (master branch) I used the translation present in this repository https://github.com/llchrisll/ROenglishRE (master branch) I left a hexed patched with Nemo to help those who don't know how to do full diff. http://nemo.herc.ws/clients/2021-11-03_Ragexe_1635926200 I also used the latest version of opensetup http://nn.ai4rei.net/dev/opensetup You don't need to do anything, just compile the rAthena server which is already compatible with version 20211103 (packetver) Ragnarok.7z
    1 point
  29. File Name: [email protected] File Submitter: keitenai File Submitted: 1 Dec 2017 File Category: Src Modification Content Author: keitenai Updated: 31 July 2022 Information: @ resist will check the current values of resistance from each Element / Race / Size / Class. Thanks to @Santafe for the idea of this command. 1. Download the Diff file. 2. Patch the diff to your rAthena 3. Recompile your server. 4. RUN THE SERVER! Compatible with: rAthena 97b5f3b ( as of July 31, 2022 ) Download : keitenai_@resist_command_V2.diff
    1 point
  30. Probably my most ambitious and personal project. I often met on my way interesting places in the world of RO, to which it was impossible to get. Then I began to find such places with the help of the BrowEdit program and make them available for visiting. As the project expanded, I decided to allow shooting and use skills from the hills on the maps, where this feature was disabled, add plants and trees, create comfortable climbs and so on. I suggest you watch a promo video that clearly explains my idea. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. At the moment, almost ready the locations of the Schwartzwald and Arunafeltz for the release, there is a reserve for many other locations. Since the appearance of the video, there have been some changes, so the final result may be different. Below I attach screenshots from BrowEdit "before" and "after" and gif files with changes of territories on the finished mini-maps. Some screenshots of my work: From the important places are opened: the airport in Veins, the left exit from Einbroch, the northern Einbroch railway station on Ein_Field04, the industrial zone on Ein_Field02, the border post between Ein_Field04 and Ein_Field05, the fortress on the map of Yuno_Field12, the alternative entrance to the tower of Thanatos on Hu_Field01, the arch with a fountain on Ein_Fild09, the bridge in Lhz_Field02, the road from Ra_Fild06 to Ein_Field03 and more. Mini-maps changes (if any map is missing, it means everything is fine with it): .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. P>S> Since the map of Ein_Field05 won in the nomination of the most extended territory - a small comic video showing progress in its honor: .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. CODE: Warps lines below: //===== eAthena Script ======================================= //= New Warps for AMP //===== By: ================================================== //= w0wZukuBg //===== Current Version: ===================================== //= 1.0 //===== Compatible With: ===================================== //= eAthena SVN //===== Description: ========================================= //= New Warps for AMP //===== Additional Comments: ================================= //= The NPC's were born. [w0wZukuBg] //============================================================ //======================================================= // ein_fild //======================================================= ein_fild02,134,123,0 warp newein01 1,1,ein_fild02,118,134 ein_fild02,121,131,0 warp newein02 1,1,ein_fild02,137,123 ein_fild02,223,137,0 warp newein03 1,1,ein_fild02,223,148 ein_fild02,223,145,0 warp newein04 1,1,ein_fild02,220,137 ein_fild02,186,226,0 warp newein05 1,1,ein_fild02,204,224 ein_fild02,201,224,0 warp newein06 1,1,ein_fild02,183,229 ein_fild04,385,181,0 warp newein07 1,1,ein_fild05,36,185 ein_fild05,33,185,0 warp newein08 1,1,ein_fild04,382,181 ein_fild05,35,167,0 warp newein09 1,1,ein_fild04,382,181 ein_fild05,120,292,0 warp newein10 1,1,ein_fild05,120,300 ein_fild05,120,297,0 warp newein11 1,1,ein_fild05,120,289 ein_fild06,231,81,0 warp newein12 1,1,ein_fild06,231,67 ein_fild06,231,70,0 warp newein13 1,1,ein_fild06,231,84 ein_fild03,245,55,0 script Lift-E02 139,2,2,{ OnTouch: mes "Lift up?"; next; if(select("Yes","Stay")==1) warp "ein_fild03",201,41; close; } ein_fild03,204,43,0 script Lift-E01 139,2,2,{ OnTouch: mes "Lift down?"; next; if(select("Yes","Stay")==1) warp "ein_fild03",248,53; close; } //======================================================= // ra_fild //======================================================= ra_fild09,362,76,0 warp newra01 1,1,lhz_fild01,15,79 lhz_fild01,12,79,0 warp newra02 1,1,ra_fild09,359,76 //======================================================= // ra_fild -> ein_fild //======================================================= ein_fild03,19,181,0 warp newraein01 1,1,ra_fild06,374,223; ra_fild06,377,223,0 warp newraein02 1,1,ein_fild03,22,181; //======================================================= // hu_fild //======================================================= hu_fild02,378,244,0 warp newhu01 1,1,hu_fild03,22,253 hu_fild03,19,253,0 warp newhu02 1,1,hu_fild02,375,244 hu_fild02,378,194,0 warp newhu03 1,1,hu_fild03,22,205 hu_fild03,19,205,0 warp newhu04 1,1,hu_fild02,375,194 hu_fild02,375,303,0 warp newhu05 1,1,hu_fild03,22,308 hu_fild03,19,308,0 warp newhu06 1,1,hu_fild02,372,303 hu_fild02,378,125,0 warp newhu07 1,1,hu_fild03,22,129 hu_fild03,19,129,0 warp newhu08 1,1,hu_fild02,375,125 //======================================================= // ve_fild //======================================================= ve_fild03,327,294,0 warp newve01 1,1,ve_fild04,34,322 ve_fild04,31,322,0 warp newve02 1,1,ve_fild03,324,294 ve_fild03,316,251,0 warp newve03 1,1,ve_fild04,42,295 ve_fild04,39,295,0 warp newve04 1,1,ve_fild03,312,251 //======================================================= // einbroch //======================================================= einbech,50,223,0 warp neweinb01 1,1,einbech,50,230 einbech,50,227,0 warp neweinb02 1,1,einbech,50,220 einbech,37,223,0 warp neweinb03 1,1,einbech,37,230 einbech,37,227,0 warp neweinb04 1,1,einbech,37,220 //======================================================= // veins //======================================================= veins,296,335,0 warp newve05 1,1,veins,290,342 veins,293,342,0 warp newve06 1,1,veins,275,352 veins,278,352,0 warp newve07 1,1,veins,296,332 //======================================================= // lighthalzen //======================================================= lighthalzen,241,163,0 warp newlhzs01 1,1,lighthalzen,265,163 lighthalzen,262,163,0 warp newlhzs02 1,1,lighthalzen,238,163 lighthalzen,282,327,0 warp newlhzs03 1,1,lhz_fild01,278,19 lhz_fild01,278,16,0 warp newlhzs04 1,1,lighthalzen,282,324 //======================================================= // juperos_ //======================================================= juperos_01,96,220,0 warp newjup01 1,1,juperos_01,152,183 juperos_01,149,185,0 warp newjup01-1 1,1,juperos_01,93,217 //======================================================= // jawaii //======================================================= jawaii,138,182,4 script Stairs#ja1 111,{ mes "[Stairs]"; mes "Want to go up or go down?"; next; switch(select("Up","Down")) { case 1: warp "jawaii",136,183; close; case 2: warp "jawaii",140,180; close; } close; }
    1 point
  31. It won't influence the individual rates. What he provides is more or less just a poll. I think there is no direct way to overwrite rates directly for an individual player. But what you could do is set the rates of your server to default and use status changes to give each player an exp and drop bonus according to his choice to basically get the effect of different rates. - script RateSelect -1,{ OnSetRate: OnPCLoginEvent: switch(individual_rate) { case 1: .@exp_rate_bonus = .low_rate_exp_bonus; .@drop_rate_bonus = .low_rate_drop_bonus; break; case 2: .@exp_rate_bonus = .mid_rate_exp_bonus; .@drop_rate_bonus = .mid_rate_drop_bonus; break; case 3: .@exp_rate_bonus = .high_rate_exp_bonus; .@drop_rate_bonus = .high_rate_drop_bonus; break; default: mes "Select your preferred server rate for this character."; mes "BE CAREFUL: YOU CAN'T CHANGE IT AFTERWARD!" individual_rate = select("Low Rate:Mid Rate:High Rate"); close2; goto OnSetRate; } sc_start SC_EXPBOOST, INFINITE_TICK, .@exp_rate_bonus, 10000, SCSTART_NOICON; sc_start SC_ITEMBOOST, INFINITE_TICK, .@drop_rate_bonus, 10000, SCSTART_NOICON; end; OnInit: .low_rate_exp_bonus = 100; .mid_rate_exp_bonus = 19900; .high_rate_exp_bonus = 199900; .low_rate_drop_bonus = 100; .mid_rate_drop_bonus = 19900; .high_rate_drop_bonus = 199900; }
    1 point
  32. short description There are 3 different generations of laboratory monsters: 1. Egnigem, Wickebine, Laurell, Errende, Josephina, Kavach, Armeyer 2. Seyren, Eremes, Kathryne, Margaretha, Cecil, Howard 3. Randel, Gertie, Celia, Chen, Trentini, Alphoccio, Flamel I collect them, correct mistakes, add every possible class to each monster, recolor them in 3 official color sets and improve their aura. As a basis, I took the logic of the first implemented sprites at lhz_dun01-03 If you compare the following kRO sprites with corrections in the changelog you will notice that the logic has ceased to be respected and the sprites do not even have sounds! LINK TO FILE: https://mega.nz/file/tGFCxRSL#y5S8uLWw0cMCrLt059ycmZSeeFY1oLYTSVJwa0BoEWs [DONE] 1st class 2nd class advanced class 3rd class 3rd japan edition class 4th class latest expanded classes previous versions of some classes custom extended classes The total number of sprites in the pack: all classes from novice to 4th class (with different types of weapons) x 3 official color sets = 600 sprites changelog: (!) Below are the non-clean gifs recorded using GifCam.exe over the Act Editor (!) So these can brake or accelerate and do not serve as an accurate image. These gifs are added just for reference For clarity, the background of the laboratory is taken, and the sprites are shown in transparent blue 969F9EE7 and with improved aura Seyren Windsor Eremes Guile Kathryne Keyron Margaretha Sorin Cecil Damon Howard Alt-Eisen Randel Lawrence Gertie Wie Celia Alde Chen Lio Trentini Ilaria Alphoccio Basil Flamel Emure Egnigem Chenia Wickebine Tres Laurell Weinder Errende Ebecee Josephina Kavach Icarus Armeyer Dinze
    1 point
  33. Voy a retomar este proyecto, por si hay alguien que se apunta, me estoy montando una aplicación para acelerar las traducciones usando la API de Deepl. Mandarme MP y os mando repo. Y nos vamos coordinando. A ver si para este final de año lo tenemos todo completo
    1 point
  34. View File Manage @alootid - @alootid2 Introduction: Due to the limitation of alootid that can only loot up to 10 items by default. (can change at /src/). However players are always greedy, they want to loot almost everything, but not every items, so 10 slots can't fill their desires. So this custom manager are introduced. It help player to setup different combination of alootid settings. (Different hunting monster/maps could switch to different settings) player no longer worry what their previous alootid settings was. player can switch/save any settings whenever they want. alootid settings could be auto loaded when they join the game. * In short, just a macro to use to the alootid atcommand. To make it less confusing to player, disable the alootid and start using alootid2 instead. Usage: @alootid2 list @alootid2 <save/add/remove> <#> <item1> ... <item10> @alootid2 <load/clear/reset> <#> @alootid2 set <#> name <name> @alootid2 set <#> autoload <1/0> Example: chatbox: @alootid2 save 3 609 608 607 Usage: @alootid2 save <3> - save successfully. chatbox: @alootid2 load 1 Your autolootitem list has been reset. Autolooting item: 'Green_Herb'/'Green Herb' {511} Autolooting item: 'Apple'/'Apple' {512} Autolooting item: 'Banana'/'Banana' {513} Autolooting item: 'Grape'/'Grape' {514} Autolooting item: 'Carrot'/'Carrot' {515} Usage: @alootid2 load <2> - loaded successfully. chatbox: @alootid2 list <1> - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510 <2> - 511, 512, 513, 514, 515 (autoload upon login) <3> - 609, 608, 607 Usage: @alootid2 list - found 3 settings. Preview: Submitter Emistry Submitted 09/15/2019 Category Utilities Video Content Author Emistry  
    1 point
  35. 1 point
  36. It'll have to be an A record since the CNAME is just routing you from another host. YOu'll need a separate IP address for that listing there and add it to the DNS records.
    1 point
  37. Sorry, my mistake. You must enter the domain name you got here. That would be that happyragnarok.wuaze.com domain in that box.
    1 point
  38. 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.
    1 point
  39. Não estou ciente de nenhum sistema existente no emulador R-athena ou em algum NPC personalizado que permita aos jogadores invocar um monstro que lute ao seu lado por um determinado período de tempo. Embora o jogo tenha vários recursos, como pets, mercenários, homúnculos e plantas dos alquimistas, nenhum deles se comporta da maneira que você descreve. No entanto, pode ser possível criar um item personalizado para fazer isso. Se você estiver interessado em desenvolver esse recurso, sugiro que entre em contato com a comunidade de desenvolvedores do emulador R-athena. Eles podem fornecer informações sobre como criar um item personalizado ou até mesmo desenvolver o recurso para você, mediante pagamento. Espero que isso ajude. Boa sorte!
    1 point
  40. Hey there everyone, long time no see! So it's been a very long time since I have been on these boards and I do miss it all. Feeling a little nostalgia looking through all of these, I decided to release them all to the public, completely free. Going in no particular order after the first few, they are just my favorites. I hope you guys love them as I have. Sanctum Main town oriented map. My absolute favorite and latest work (When I was mapping). The idea I had for this was a chunck of a mountain broke off and landed here, subsequently creating a waterfall from atop and surrounding the town. Giving it protection and a perfect center for life. I never got around to finishing the outside of the map, I don't even know what I thought for the surroundings, perhaps just trees. Sanctum In And here is the inside map for Sanctum. The first picture is the general area where various NPC's can be placed. The second picture is where I planned to use a script to automatically place anyone who wished to vend in the one walkable/edited Gat. It would cycle through and remove those vending for a prolonged period of time and also anyone not vending at all. Guild Base This map was designed for the top guilds or just those who hold castles to have a domain of their own. The first picture is just a hangout spot for anyone in the guild. The second picture is for any combat/training/monster summoning to be done. The third picture is for the guild master where special NPC's can be placed as the server owners desire. Novice Starter Grounds PvP Valkyrie A little small for a PvP map but I enjoyed making it and like how it turned out. Trinity The first main town I made some time back around 2010. Don't judge me on some of the rookie mistakes I made with lighting and such haha. The following Trinity ___ maps are connected via a warp on the edges of the map. Trinity In Trinity Courtyard Before the Sanctum maps, this was my favorite creation. I just liked the feel of this one. Trinity Vending Similar to the Sanctum In vending idea, I wanted to limit vending to only those tiles with the colored objects on it. Trinity Port Anexus A simple instance based map with a boss at the end. Another one of my earlier works. Works The beginnings of my templates map. I would urge any current mapper to use this technique to create unique model compilations and copy it over to the map in progress. I have used this to create a forest that looks completely customized in a matter of minutes. Well there they are, open to any and all. I hope to hear your feedback on these! Thanks, Truly ~
    1 point
  41. Are you using Renewal? cause if yes, here's the reason for that. - Id: 1115 AegisName: EDDGA Name: Eddga Level: 65 Hp: 947500 BaseExp: 198000 JobExp: 148500 MvpExp: 99000 Attack: 1509 Attack2: 776 Defense: 166 MagicDefense: 70 Str: 92 Agi: 80 Vit: 103 Int: 66 Dex: 90 Luk: 85 AttackRange: 1 SkillRange: 10 ChaseRange: 12 Size: Large Race: Brute Element: Fire ElementLevel: 1 WalkSpeed: 300 AttackDelay: 872 AttackMotion: 1344 DamageMotion: 432 DamageTaken: 10 <!-- Reason for that 5k damage, since on the official kRO MVP's were buffed with this flag. Just change it to 100 instead of 10 --> Ai: 21 Class: Boss Modes: Mvp: true MvpDrops: - Item: Tiger's_Skin Rate: 5000 - Item: Tiger_Footskin Rate: 1000 - Item: Flame_Heart Rate: 3000 Drops: - Item: Fire_Brand Rate: 150 - Item: Smoking_Pipe Rate: 250 - Item: Honey Rate: 10000 - Item: Katar_Of_Raging_Blaze Rate: 500 - Item: Tiger_Footskin Rate: 250 - Item: Elunium Rate: 2300 - Item: Krieg Rate: 100 - Item: Eddga_Card Rate: 1 StealProtected: true This pretty much solves your problem. Have Fun ?
    1 point
  42. If you want to be on the safe side, don't forget to change this to char_athena.conf. // Restrict certain class from being created. (Only functional on 20151001aRagexe or later) // 0: No character creation is allowed // 1: Only novice is allowed to be created (pre-renewal default) // 2: Only summoner is allowed to be created // 3: Both novice and summoner can be created (renewal default) // Uncomment to customize the restriction //allowed_job_flag: 1
    1 point
  43. 1505 downloads

    Askald This mas is public so don't try to sell it or make it your property. It is my first map, i am pretty happy with the result and i will probably make some more. Contact You can found me on discord : Sloth#6226 Github : https://github.com/SlothBM/ Crédit I would like to thank the Borf discord community for helping me with a few issues. Want to support my work ?
    Free
    1 point
  44. //return; // remove this part end; OnInit
    1 point
  45. My Collectibles I just decided to put my released scripts in here organization purposes and easier access for others who might want to add them to their servers. I will keep on releasing my scripts, both Free and Paid, whenever it is ready! You can also visit my gitlab for access of these files: https://github.com/pajodex/ScriptCollections So here are my script collection!! Free Release: ------- Not mine but I modified these then released with permission from author -------- Paid Release: I hope you enjoy these scripts! Feel free to comment / suggest / or react on whichever script. Hoping to release more of these soon! ~ Have a good day~ SHOW CASE:
    1 point
  46. Version v1.0.0.600

    7931 downloads

    Easy to use & feature packed NPC Script Editor for RO emulator(s). Has a built in plug-in system, so anyone can write their own plugin to extend this editor's feature. Now optimized for performance and support NPC Script Parsing / Syntax / Error checking (F6) right in the editor to speed up your coding.
    Free
    1 point
  47. Version v12.0.0.1-FINAL (Silent)

    366 downloads

    XRay Client 2008-05-28a v12.0.0.1-FINAL (Silent version). Doesn't show the XRay announcement when log in.
    Free
    1 point
  48. there are 2 CMP ECX,0F423F what i said was the guide not for newbie, we need learn assembly first I have followed these instructions, step by step but fail because the different packet, and idk assembly ofcourse http://www.eathena.ws/board/lofiversion/index.php/t266410.html
    1 point
  49. Hi, for this matter you got 2 choices. -Recompile server with pre-renewal formulas overall by commenting this line in renewal.h, #define RENEWAL and recompile. It well turn your server into part pre-renewal for several formulas unless you comment out the rest on it. or -Go in the source code, pc.c, and change the following line, sp += (low < 100) ? (2 + (low - 1) / 10) : (16 + 4 * ((low - 100) / 5)); for sp += ( 1 + (low + 9) / 10 ); and recompile the server which will make server use pre-renewal formulas for status point calculations while keeping the rest of the renewal settings.
    1 point
×
×
  • Create New...