Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 08/15/23 in all areas

  1. RO DPS Meter Always thought the game needed some way to quantify combat efficiency, so I built a dps meter. (tested on the latest revision) Do you think this could be useful on the server you are currently playing? Give me your thoughts!!
    1 point
  2. A simple converter that will convert item from database to use for client in 30 seconds. _________________________________________________________ >> Download (v.8.2) (30 Mar 2025) << >> Download (Item Preview Collection Sprites) (22 Feb 2025) << >> Source Code << >> English Tutorial << >> Thai Tutorial << >> Sprite Error Checker Tutorial << _________________________________________________________ Pros: Item description sync from database so it's get rid the problem that item description was not match with database. Full combo explanation. Full information explanation. Cons: Not had lore descriptions. Complex item script was take a bit time to read through. How to use: Paste your database files on '\rAthena item_db to itemInfo_Data\Assets', (File name can't be change) Open program and select languages then hit convert. Output files location is the same with program location. Credit @KingarteR resource name finder & mostly client files finder Example output: Link Output error? Try this:
    1 point
  3. 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
    1 point
  4. 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
  5. Marketplace link: rAthena Language Support - Visual Studio Marketplace This extension now lives in rAthena organization, my own fork has been archived. This extension provides rAthena-flavored Athena language syntax highlighting and code snippets and automatically highlights files with .rascript extension. Automatic rAthena script detection for .txt files is coming soon. The following is the non-exhaustive list of code snippets provided by Athena Language Support. * `defnpc`, `defnpcfloat`, `defwarp`, and `defshop` (In-game objects definition) * `deffunction` (Function definition) * `On:` event handler snippet * `for`, `while`, `do` flow control snippet report issues: https://github.com/rathena/vsce-rathena-language-support/issues Special thanks to @JoWei for the base extension for Atom.
    1 point
  6. The newest rAthena Version already provide it. https://github.com/rathena/rathena/blob/379009b31f8b50443c5b3b489c55e8d27205557a/sql-files/logs.sql#L114 Rynbef~
    1 point
  7. It's not the greatest implementation ever but I can show you the gist of it. In the struct mob.hpp, there is a new field in the struct mob_db: unsigned int pity; In mob.cpp, this value is initialized to 0 in mob_parse_dbrow, near the bottom (its exact position doesn't really matter) entry.pity = 0; Also in mob.cpp, in the method mob_dead under "player specific drop rate adjustments", we add bonus drop rate based on the pity value, if the item is a card. This is the part that is kind lackluster. // Increase the drop rate based on pity if it's a card if (it->type == IT_CARD) drop_rate = drop_rate * (50 + md->db->pity) / 50; The way this formula works is that the value "50" here is the number of kills required to double the drop rate of the card. On my server, cards drop at a rate of 1/200, so this feels kinda reasonable, but if you rate was, say, 1/1000, this would be way too high and you'd probably want to set this value to like 200 instead (make sure both numbers are set to the same value). For an optimal implementation this value should probably derive from the server's card drop rate in some way but I kinda hastily coded this one in. Also in Mob_dead, we need to make a slight change later on to increase or reset the pity based on if the card drops or not. // attempt to drop the item if (rnd() % 10000 >= drop_rate) { if (it->type == IT_CARD) { md->db->pity++; } continue; } // Reset the pity if the card drops if (it->type == IT_CARD) { md->db->pity = 0; } And that's really all there is to it, recompile the code and you have the pity system. Note that, as I mentioned when I first brought it up, the pity is shared among all players, and it also gets reset every time you reset the server. But for midrate servers, it does help make hunting for cards feel more tolerable. I haven't had to kill 1000 Santa Porings with no card drop since I implemented it.
    1 point
  8. It could happen a few small bugs u can fix later but should work without big issues. Update ur client, stop the server, change to renewal, recompile, check u have all databases for renewal on ur sql server and then run the server. To change from renewal to pre-renewal would not that easy. Rynbef~
    1 point
×
×
  • Create New...