Leaderboard
Popular Content
Showing content with the highest reputation on 04/19/23 in Posts
-
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. //.*5 points
-
We here at rAthena believe that the users have the right to know what our team believes this project should be. rAthena Goals: Emulation AccuracyOur top priority of this project should be put towards creating an experience that matches that of the official servers. Right now, we are far from reaching that goal, but with focus on this particular issue, and with the help of people like you, we can close the gap between the official servers and ourselves. While this may never reach 100% accuracy due to constantly changing aspects in official servers, we could definitely do better than where we are right now. StabilityWhile we continue to fix bugs and add additional new content, it is extremely important that we remain focused on creating a project you can rely on to manage itself while you are away from your server. We want you to feel comfortable walking away knowing that you won't come back to a downed server. Resource ConsumptionCode speed and resource reduction should remain a lower priority as accuracy and stability are more important than saving some memory or process time. A successful project requires this understanding. Sometimes we may improve code that we come across during fixing other bugs or re-writing sections of code, but at this time, we should not focus on finding and fixing some of the more resource consuming portions of code. CustomizationWe're "core" developers. We develop a platform for people to build off of. Out of the box, we aim to maintain parity with AEGIS, and beyond that, we will provide tools and support (as long as it doesn't detract from the core!) for people aiming to customize beyond that. Anything our users make and wish to have added to the public source also needs to be approved and improved on an individual basis. If you're looking to start up a server project which follows the above principles, then rAthena is the project for you.1 point
-
Buenas. Para solucionar lo del crash cuando abres la ventana de skills, necesitas modificar un archivo que se llama skilltreeview, esta en tu carpeta data/luafiles514/lua files/skillinfoz. Lo de los comandos, necesitas habilitar el Group en tu base de datos para poder obtener dichos comandos o en su defecto, agregar los comandos al group.yml en tu carpeta conf de tu emulador. Te recomiendo leer mucho de este foro para poder aplicar dichos cambios. Si gustas, puedes agregarme en Discord, y te puedo explicar por DM lo que necesites.1 point
-
storage skill i think ? Investigating in the discord of rAthena I found the answer. FIXED. diff --git a/src/custom/defines_post.hpp b/src/custom/defines_post.hpp index 253b8cdbf..4c10c0623 100644 --- a/src/custom/defines_post.hpp +++ b/src/custom/defines_post.hpp @@ -9,6 +9,8 @@ * For detailed guidance on these check http://rathena.org/wiki/SRC/config/ **/ - +#ifdef OFFICIAL_GUILD_STORAGE +#undef OFFICIAL_GUILD_STORAGE +#endif #endif /* CONFIG_CUSTOM_DEFINES_POST_HPP */ thanks to @Secrets another solution is... "for pre-re" db/pre-re/guild_skill_tree.yml - Id: GD_GUILD_STORAGE MaxLevel: 5 db/pre-re/skill_db.yml - Id: 10016 Name: GD_GUILD_STORAGE Description: Guild Storage Expansion MaxLevel: 5 Flags: IsGuild: true thanks to Aglao for the complementary information.1 point
-
prontera,158,173,4 script Coin Trader 860,{ // ---------------------- // - Core Code // ---------------------- cutin "kafra_08",2; mes "[" + .colors$[1] + .npc_name$ + .colors$[0] + "]"; mes "What would you like to do today?"; set .@trade_type, select("- Coins -> Zeny:- Zeny -> Coins"); mes "Very well. Here is the list on how much each coin is worth:"; for (set .@a, 0; .@a < getarraysize(.coin_id); set .@a, .@a + 1) { mes .colors$[3 + .@a] + getitemname(.coin_id[.@a]) + .colors$[0] + ": " + .coin_to_zeny_format$[.@a] + "z"; set .@coin_menu$, .@coin_menu$ + (.@coin_menu$ == "" ? "" : ":") + .colors$[3 + .@a] + getitemname(.coin_id[.@a]) + .colors$[0]; } mes "Tell me, what coin would you like to exchange?"; next; set .@coin_choice, select(.@coin_menu$) - 1; next; mes "[" + .colors$[1] + .npc_name$ + .colors$[0] + "]"; switch(.@trade_type) { case 1: // Coins -> Zeny mes "How much coins would you like to give up?"; input .@amount; if (.@amount <= 0) { // Invalid Number? mes .colors$[2] + "Please Input a number greater than 0:"; cutin "",255; close; } else if (countitem(.coin_id[.@coin_choice]) < .@amount) { mes .colors$[2] + "I'm sorry, you do not have " + .@amount + " " + getitemname(.coin_id[.@coin_choice]) + (.@amount == 1 ? "" : "s"); cutin "",255; close; } else { // Ok! Checks Passed, Let's Trade! if(Zeny >= 2000000000) goto L_FullZeny; //Checks to see if the player has more than 1.8b set Zeny,Zeny + (.coin_to_zeny[.@coin_choice] * .@amount); delitem .coin_id[.@coin_choice],.@amount; cutin "",255; break; } case 2: // Zeny -> Coins mes "How much coins would you like?"; input .@amount; if (.@amount <= 0) { // Invalid Number? mes .colors$[2] + "Please Input a number greater than 0:"; cutin "",255; close; } else if (!checkweight(.coin_id[.@coin_choice],.@amount)) { // Will it Make Char Overweight? mes .colors$[2] + "I'm Sorry, but you can't carry this due to weight restrictions"; cutin "",255; close; } else if (Zeny < .coin_to_zeny[.@coin_choice] * .@amount) { mes .colors$[2] + "I'm sorry, you do not have enough zeny..."; cutin "",255; close; } else { // Checks OK! Let's trade! set Zeny, Zeny - (.coin_to_zeny[.@coin_choice] * .@amount); getitem .coin_id[.@coin_choice], .@amount; cutin "",255; } } mes "[" + .colors$[1] + .npc_name$ + .colors$[0] + "]"; mes "Pleasure doing business with you."; close2; cutin "", 255; close; L_FullZeny: next; mes "[" + .colors$[1] + .npc_name$ + .colors$[0] + "]"; mes "I'm sorry, but I can't allow you to exchange Coins into Zeny when you have over 1.8b zeny."; close; // ---------------------- // - Soft Code // ---------------------- OnInit: // Store NPC Name set .npc_name$, "Coin Master"; // Storing Colours // Order of Array: Default Text, NPC Name, Error, coin_type1, coin_type2, coin_type3, coin_type4, etc... // Note: If you plan on adding additional coins, simply add a new color here setarray .colors$[0],"^000000", "^336699", "^550000", "^996633", "^666666", "^FFFF66", "^99CCCC"; // Set Coin Item ID's // In Order coin_id1, coin_id2, coin_id3, coin_id4, etc... setarray .coin_id[0],674, 671, 675, 670; // Coin -> Zeny Value // Change the Value you want the coins to be worth | Order: Mithril Coin, Gold Coin, Silver Coin, Bag of Gold Coin setarray .coin_to_zeny[0],1000000,10000000,200000000,1000000000; // Currency Formatted String of Zeny | Order: Bronze Coin, Gold Coin, Platinum Coin, Mithril Coin setarray .coin_to_zeny_format$[0],"1,000,000","10,000,000","200,000,000","1,000,000,000"; }1 point
-
getinventorylist; if ( @inventorylist_count >= 100 ) { mes "You have 100 different items in ur inventory."; close; }1 point