Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 11/08/23 in Posts

  1. I just wanted to stop in to say thanks to the Dev team for continuing to support this great game after all these years. RO was a very important game to me in my youth and to see that the community is still active after all this time is amazing. Back in the old days, I always considered running my own server, but I only finally bit the bullet on it recently. I never suspected that the entire server backend would be open-source! As such, I modded the bejeezus out of it. For starters, my server is PRE-RE, however, I backported almost all of the new content from Renewal into it. Here is my Doram character in Malangdo. It's actually pretty easy to pull renewal content into PRE-RE, since they use the same server backend. To pull renewal enemies into pre-re is as simple as grabbing them from db/re's mob-db and mob-skill-db and pulling them into pre-re's mob-db / mob-skill-db. Of course, renewal enemies have slightly different stats, in particular their "max attack" is their "matk" value and their def and mdef values are usually way too high, but that's easily fixed with SDE. Ditto for items and cards, using item-db. As far as the maps are concerned, they're already all in the game, they just don't have warps, so you just need to grab the npc/warps files from renewal and pull them into pre-re. Many renewal dungeons are instances, so you can either pull the instance into pre-re, or do what I did and turn the instance dungeons into normal dungeon floors by adding warps and recreating their mob tables. As for the Doram, it's fairly easy to add them too, I'll probably make a post explaining how to do it at some point. The main thing you have to do is remove your service_korea folder from your prere grf file, which will allow the one from renewal that allows the creation of Doram to be used instead. Then there's a flag in the server settings somewhere that you have to modify so the server won't reject character creation requests for Doram. I'll write up something on this later. The biggest thing I added by far is the ability to rebirth as Super Novice, Star Gladiator, Soul Linker, Ninja, Gunslinger, and Summoner. It always annoyed me that the classes added after the first 12 never got the ability to rebirth, so I did it myself. It's not possible (or at least I can't figure out how to do it) to add new classes to the game since class sprites are hardcoded in the client file, so instead the way I did this is that when you rebirth as one of the new classes, it unlocks a new "quest skill" which is a pre-requisite for their transcendent abilities. The game also checks to see if you have this skill when it determines if you are transcendent (say, for equipping transcendent only armor or getting the 25% max hp / sp bonuses), and it also uses it to force you to the transcendent exp tables. I'd love to share the code for this, but there's so many code changes that it probably can't be done without me just zipping up my entire codebase, which is also somewhat out of date. By I encourage other intrepid coders to experiment! A reborn Ninja's new skill tree. Note the presence of a few Kagerou skills, despite the fact that he is a still a Ninja. The "reborn" skill in the bottom left is the new quest skill that makes this possible. For Ninja / Gunslinger / Star Gladiator / Soul Linker, they get a few skills from their next job as transcendent skills, with many alterations (for example, Soul Linker gains Espa and Eswhoo, but they don't require spirit energy to use, since it's not available. In exchange they have much less power). Summoner gets his post level 100 skills as transcendent skills, since the max level cap is 99. Super Novice gets to become Expanded Super Novice. I also added the ability for Novices to use bows, which required me to make a custom animation for this. The dream of Bow Super Novice is finally real! Beyond this, I also added like a hundred new pets. They all have custom portraits and speech lines. I put up a guide on how to add custom pets elsewhere on the forum if you want to do this. This poor Lunatic is NOT ready for what's about to happen. And then I manually rebalanced the effect of every card in the game and manually tweaked the exp and drop rates of almost every monster in the game. My server is technically 10x, but the beginning feels like 5x or so, while the late game feels more like 20x, because lategame monsters give more exp. I also fixed a ton of bugs and made a number of enhancements, for example if you use the whodrops command, it now shows exact matches first, so if you do "whodrops boots" you actually see slotted boots now! At this point, there's probably some room for debate as to whether or not this game is still Ragnarok Online or something else entirely, but I'm having fun with it. The only problem is that now my regular job seems boring by comparison. Having complete control over the codebase for one of the best games of all time is pretty much impossible to top. Oh well. Everyone reaches the pinnacle of their career sooner or later. I'm sorry if this sounded like a giant advertisement. Actually, my server will probably never be open to the general public. However, where my code is easily distributable I'll probably make some of it available. I've already put up a couple topics sharing some of the files I've written, and I'll probably try to put up a few more once everything is adequately tested (I've also crashed my server about a hundred times already).
    1 point
  2. There´s a new method of upscaling imagens using Artificial Inteligence, based on Deep learning. Here´s the results of my tests with it (called ESRGAN) And there is another AI model that change animations to 60 FPS (Called DAIN) Original (about 10 fps)-> 60 fps (gif aproximation to post here)-> And the two methods can be combined: Its possible to make a 4k Remake of ragnarok with this?
    1 point
  3. This has been a request that I think everyone has made at one point or another, but I initially looked at it and said "too complicated". Well, today I decided to finally code the thing. Basically, this is an adjustment to the Reset NPC that gives you the option to only reset your current class, leaving your previous classes untouched. This requires code changes to support it, and you'll have to recompile your server afterwards. A quick caveat, though this includes code to support third and fourth classes (for Renewal), that code is untested. It's similar to the second class logic so it should work, but if you have some kind of weird issue it's probably there. In pc.cpp, find the pc_resetskill method Find this line: int i, skill_point=0; Replace it with this: int i, j, k, l, baseClass, secondTransClass, thirdClass, currentClass, skid, skill_point = 0; bool previousClassSkill, isSecondClass = false, isThirdClass = false, isFourthClass = false; Find this line: if( flag&4 && (sd->class_&MAPID_UPPERMASK) != MAPID_BARDDANCER ) return 0; Insert this below it (don't replace the code above). If your server has fourth classes, uncomment that line. baseClass = pc_mapid2jobid(sd->class_ & MAPID_BASEMASK, sd->status.sex); secondTransClass = pc_mapid2jobid(sd->class_ & MAPID_UPPERMASK | JOBL_UPPER, sd->status.sex); thirdClass = pc_mapid2jobid(sd->class_ | JOBL_THIRD, sd->status.sex); currentClass = pc_mapid2jobid(sd->class_, sd->status.sex); if ((sd->class_ & MAPID_BASEMASK) != sd->class_ && (sd->class_ & MAPID_BASEMASK | JOBL_UPPER) != sd->class_ && (sd->class_ & MAPID_BASEMASK | JOBL_BABY) != sd->class_) isSecondClass = true; if ((sd->class_ | JOBL_THIRD) == sd->class_ && (sd->class_ & MAPID_BASEMASK) != sd->class_ && (sd->class_ & MAPID_UPPERMASK) != sd->class_) isThirdClass = true; //if ((sd->class_ | JOBL_FOURTH) == sd->class_ && (sd->class_ & MAPID_BASEMASK) != sd->class_ && (sd->class_ & MAPID_UPPERMASK) != sd->class_ && (sd->class_ | JOBL_THIRD) != sd->class_) isFourthClass = true; currentClass = pc_class2idx(currentClass); baseClass = pc_class2idx(baseClass); secondTransClass = pc_class2idx(secondTransClass); thirdClass = pc_class2idx(thirdClass); Find this line if (lv == 0 || skill_id == 0) continue; What you need to add next depends on your version of eathena. If you are on latest, which has the new skill tree, add this below that line: if (flag & 16) { previousClassSkill = false; if (baseClass != currentClass) { std::shared_ptr<s_skill_tree> firstTree = skill_tree_db.find(baseclass); if (tree != nullptr && !tree->skills.empty()) { for (const auto &it : tree->skills) { skid = skill_get_index(it.first); if (skid == skill_id) previousClassSkill = true; } } } if (isThirdClass) { std::shared_ptr<s_skill_tree> secondTree = skill_tree_db.find(secondTransClass); if (tree != nullptr && !tree->skills.empty()) { for (const auto &it : tree->skills) { skid = skill_get_index(it.first); if (skid == skill_id) previousClassSkill = true; } } } if (isFourthClass) { std::shared_ptr<s_skill_tree> thirdTree = skill_tree_db.find(thirdClass); if (tree != nullptr && !tree->skills.empty()) { for (const auto &it : tree->skills) { skid = skill_get_index(it.first); if (skid == skill_id) previousClassSkill = true; } } } } If you are on an older version, which has the old form of skill_tree, add this below that line instead: if (flag & 16) { previousClassSkill = false; if (baseClass != currentClass) { for (j = 0; j < MAX_SKILL_TREE && (skid = skill_tree[baseClass][j].skill_id) > 0; j++) { if (skid == skill_id) previousClassSkill = true; } } if (isThirdClass) { for (k = 0; k < MAX_SKILL_TREE && (skid = skill_tree[secondTransClass][k].skill_id) > 0; k++) { if (skid == skill_id) previousClassSkill = true; } } if (previousClassSkill) continue; } We're pretty much done with pc_resetskill, but if you want, you can add this to the comment at the top of the method, as the final line: * if flag&16, Only reset skills that the current class can learn Almost done with code changes, now we just need to add the script function. The remainder of the changes are in script.cpp: First, find the definitions of the script functions by searching for this: struct script_function buildin_func[] And add the following line somewhere, ideally below the one for resetskill BUILDIN_DEF(resetskillcurrentonly, "?"), Now add this method somewhere, ideally below resetskill but it can in theory go anywhere. /** * Reset player's skill, leaving previous classes untouched * resetskillcurrentonly({<char_id>}); **/ BUILDIN_FUNC(resetskillcurrentonly) { TBL_PC* sd; if (!script_charid2sd(2, sd)) return SCRIPT_CMD_FAILURE; pc_resetskill(sd, 17); return SCRIPT_CMD_SUCCESS; } With this done, you can recompile the client and everything should be set. Now all you need is the new version of the resetnpc script below and you'll have the new functionality. Man, this was a lot harder than it should have been. Rathena should really just add this option by default. resetnpc.txt
    1 point
  4. I believe you are using old client, just do ctrl+alt delete then cancel and it should work
    1 point
×
×
  • Create New...