Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 05/16/25 in all areas

  1. I encountered to see some marketplace addon and thinking to make one too, and I saw some issues/ideas that I think I can improvised a little bit. By the way it depends on the theme sty/css so if its using bootstrap themes it looks a bit different. The example I show here is how it looks from 'default' theme FluxCP. And it might still being updated from time to time. And yeah, this isn't free release so if anyone interested to get this you can PM me at discord id: chaos92. This addon has item popup information so user doesn't need to scrolling down to see any important information. As you can see, information about forge items, and pet egg is shown too with their intimacy information. So you can buy/sell loyal intimacy pet eggs easily ! So as you can see, this system can buy/sell items just via FluxCP without need to login ingame. You can just easily claim anytime when you're ingame with the NPC script provided. Player can select their character that is in offline status and select any items they one to sell, and it will be added at marketplace section. Also, not all items are available to sell, I've whitelist items that doesnt have any trade restriction, and you also can add your own or remove any as u want. Bound and Expiry items for sure automatically excluded from the list, including your equipped items. And yes as you can see above, we have Tax System where u can set it and seller will be charged for it. Above is the screenshot from where you can see all your listings. You can see there shown some expired status item, means this addon support expiry system, as default 7 days (can be set it to any) so that its not a place where all items are gathered from the first day to ensure item listing is an active listing. Also can cancel and relist it back too if needed. And yeah this how it looks from default FluxCP theme. And just example from 'bootstrap' FluxCP theme. There will be also shown any items that player purchased with date, and which character that bought them. Also, Admin Panel that can list top sellers, top buyers and top selling items and it can be filtered within some range of time. Also admin can controls to cancel or mark item listings as expired from Admin Panel. This addon support custom items too it just that u need to add the item assets image in the designated folder. I also have some other features added such as minimum group ID, for example only VIP above can access this addon. Also the currency it can be any #points, not restricted to #CASHPOINTS only. I think thats all for now. Let me know if you have any idea or suggestion to improve this addon, in the future.
    2 points
  2. View File HD Hangul Damage Font Original RO damage fonts are so low-res and blurry, so here's my HD font for the Hangul Damage Font Place the files inside data/sprite/이팩트/ folder in your GRF. Please note that your RO client needs to have the additional damage fonts feature. The font used is TDTD온명조 Submitter amm0nition Submitted 05/15/25 Category Sprites & Palettes Video Content Author amm0nition  
    2 points
  3. Version 1.0.0

    16 downloads

    Original RO damage fonts are so low-res and blurry, so here's my HD font for the Hangul Damage Font Place the files inside data/sprite/이팩트/ folder in your GRF. Please note that your RO client needs to have the additional damage fonts feature. The font used is TDTD온명조
    Free
    2 points
  4. Version 1.8.9.7

    56503 downloads

    Hello everyone, GRF Editor is an open-source tool for editing GRF files (https://github.com/Tokeiburu/GRFEditor). It offers a wide variety of features and customizations. The software is very stable and responsive, it can handle large operations without lagging your computer. How to install Download the zip archive provided from the download link at the bottom of this description or directly from there: http://www.mediafire.com/?aflylbhblrzpz0h Install the application with GRF Editor Installer.exe; if you are missing a .NET Framework you will be prompted to download it. Once you are done, you can start the program from the link on your desktop. Key features Overall speed is faster (or at least equal) than any GRF tool. Common operations: add, delete, merge, extract, preview, save. Undo and redo for any operation. It can open any GRF file format. Clean and very interactive interface. Saving formats supported : 0x300, 0x200, 0x103 and 0x102 (through the Settings page) and conversion to the Thor format. Instant filter and search options (example : "map .gat"). File association and context menus integration for .grf, .gpf, .rgz and .thor (through the Settings page). Can rebuild separated images into one file easily. Drag and drop (with the ALT key, can be modified in the Settings page). This is a big part of the software; most of the items can be moved around within the application itself or from/to Windows Explorer. If drag and drop does not work, it is most likely because you've started the program using administrator privileges. GRF Editor does not requires administrator privileges to run. Tools Grf validation: allows you to validate a GRF with multiple settings. It can detect corrupted GRF entries, invalid sprites, empty files, non-GRF files, duplicate files and a lot more. Flat maps maker: generates flat maps from .gat and .rsw files. Useful to generate WoE maps or to fasten up the loading time. Patch maker: generates a GRF patch based on two different GRFs. Hash viewer: shows the hash code (both CRC32 and MD5) for files. Image converter: converts an image to any format requested (BMP, PNG, JPG, TGA). GrfCL: used to create batch files (.bat) which can automate tasks on GRF files. See the content in GrfCL.rar in the download for more information. This tool can be customized from the sources as well. Grf encryption The encryption feature has been enabled again. It's similar to what it used to be and it has been tested on client versions ranging from 2012-08-01 to 2024-01-01. Some error messages will be displayed if necessary. If you have an issue, copy the error message (with the code, if there's one) and send me the client executable with the cps.dll file generated by GRF Editor. There shouldn't be compatibility issues anymore though! Thor files Thor files are patches used by Thor Patcher ( https://github.com/rathena/rathena/wiki/Thor-Patcher ). Because of their similarity with the GRF file structure, they have been integrated within GRF Editor. The primary utility of this feature is that it allows you to add encrypted files to a Thor patch. All the other options can be achieved by using Thor Maker. You'll find the necessary steps below, but test your patches before sending them off to players (I've done a lot of testing on my end, but better be safe). If you're using SecureGRF, then make a new GRF, add the files and encrypt it. In GRF Editor, open the encrypted GRF you just made, use "Save as" and name the new file with a .thor extension. That's it, if you want to change the output directory, click on Edit > Edit Grf/Thor settings. You can select the output mode and the GRF to merge the patch with. Simply save again if you change these properties. If you're using GRF Editor's encryption, then make a new Thor file (File > New > New Thor) and add the files you want to patch it with. Right-click on the files you want to encrypt and use Encryption > Encrypt. Technical stuff Requires .Net Framework 4.0 to run (4.0 or more will work as well). Automatically converts file name encoding to the currently selected encoding (you can change the encoding in the Settings page). Data virtualization is used as much as possible to preview files, meaning the files aren't completely loaded. Right-clicking an item will bring up the available options with that file. Preview file formats: txt, log, xml, lua, lub, bmp, png, tga, jpp, db, ebm, pal, gnd, rsw, gat, rsm, str, spr, act, imf, fna, bson, csv, ezv and wav. Services are "crash ready", meaning that you will be warned about a failed operation and no work will be lost (the application won't close and crash). It tries to continue operating even if it meets unsual conditions. Operations can be cancelled by clicking on the button near the progress bar. The warning level can be changed to avoid messages like "Please select a folder first." When prompted with an error, use Ctrl-C to copy the current dialog's content. Some screenshots! 1) Previewing an act file, while showing the search feature 2) Preview of a model file (rsm or rsm2) 3) Preview of GrfCL 4) Preview of maps 5) Preview of Grf validation 6) Search feature (press Ctrl-F or Ctrl-H to bring up within a text editor) Got a feedback? I'd gladly hear you out and fix issues you have with the program.
    Free
    2 points
  5. Here's the file I downloaded last time ! For reference, it's not compatible with the May version. ExtendCashShopPreview.1337proxy.1337
    1 point
  6. Hi, so, I've seen a lot of servers using auto attack system, I noticed a consistent issue: poor user experience and Walk AI is horrible. Both of which triggered me to develop a new one for herc which hopefully have more intuitive experience for players (and server owners ). I initially planned to release to herc only but due to high demand, I've ported for rA peeps. Please note that rA version is in beta and bugs are yet to be discovered. I can fix asap when reported. The features are inspired by Ragnarok Mobile: Eternal Love. Here are few features: Monster Selection: Automatically detect monsters based on the current map. Configurable Potion and Buff Item Selection: Server owners can customize which potions and buffs items players are allowed to use. Human-Like Movement AI: Intelligent and natural movement, unlike the aimless wandering typical of other systems. Can utilize warp portals of the same map (ignores those that warp to different map). Extensive Customization for Server Owners: Allows server administrators to configure settings to fit the unique needs of their server. Player-Friendly UI/UX: Hassle-free setup and adjustments. Player can choose to Warp to Savepoint / Logout / Do Nothing when Auto Combat ended. Offline Battle: Players can enable offline mode, allowing their character to continue Auto Combat even after the client is closed. Duration and end condition still applies Server Easy Configuration: Loot Config: Do not loot at all - good for server that has @autoloot or @alootid Default config - character walk up to the loot, and loot normally Auto loot to inventory - servers that DONT have @autoloot nor @alootid but want autoloot for Auto Combat Duration Config: 24/7 - Auto combat can be used all the time Per character - duration is based on character variable Account wide - duration is based on account variable Per Gepard Unique ID - not implemented, extra modules required. pls pm me if you want this Rental Item - duration is based on item expiration date. Exp and Drop Modifier: By Ratio - modifies overall exp and rates for player while on Auto Combat By Value - increase/decrease exp or drop rates (how Battle Manual, Bubble Gum, etc work) Not Supported by default (will count as extra module if required): 3rd Job Classes Very old revision of rAthena Gepard related variables and usage To do / To improve: Offensive Debuffs - do you guys need this? FAQS: Is this the same as Shakto's Autoattack or built from it? No, the system is based from goddameit's system. And codebase is ported from modern game engines that uses similar AI. If you guys are interested, please add me in discord: jasonch35. Teaser Videos:
    1 point
  7. I've changed the UI for this site for quite some time and also some more additional tools. I've added Palette Duplicator. Its useful if you want to duplicate a list of palette but changing the palette file name easily. It will copy 100% the same palette pattern. For example based on screenshot above, I tried to duplicate that korean palette 700 list and it will becomes any name set as the base file name pattern. And another one, Palette Customizer. This tools u can easily customized any index palette easily for all selected palette. You can choose a reference palette and copy any rows do you want easily starting from row 0 to row 15. So if you already know pattern mount for some jobs, you can easily customize it, pick color from reference and place it at any index. If you have any suggestion or issue on any tools that provided in this website, you can let me know.
    1 point
  8. I'm not sure I get what you want. Try: //===== rAthena Script ======================================= //= Rebirth System //===== Description: ========================================= //- Go back to Level 1 to gain bonus status points //===== Changelogs: ========================================== //= 1.0 First version. [Capuche] //= 1.7 Added Grand Rebirth. [Racaae] //============================================================ /* CREATE TABLE IF NOT EXISTS `rebirth_system` ( `player_id` int(11) unsigned NOT NULL default 0, `name` varchar(255) NOT NULL DEFAULT 'NULL', `num_rebirth` int(11) unsigned NOT NULL default 0, `num_grand` int(11) unsigned NOT NULL default 0, `last_ip` varchar(100) NOT NULL default '', PRIMARY KEY (`player_id`) ) ENGINE=MyISAM; */ prontera,141,179,5 script Rebirth System 531,{ function checkItem; // check if player have all item required function colorItemrequired; // color the text. Red : not enough item, green otherwise function deleteItem; // delete all items required function displayItemneed; // display all items need at start function getItemReward; // give the items reward //function weightreq; // check if your current weight is highter than weight high novice if (.ranking_type) @rebirth_type$ = "#"; else @rebirth_type$ = ""; if (.force_sql) { .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql( "SELECT `num_rebirth`,`num_grand` FROM `rebirth_system` WHERE `player_id` = "+ .@player_id, .@rebirthed, .@grand_rebirthed); if ( getd(@rebirth_type$ + "num_rebirth") != .@rebirthed[0] || getd(@rebirth_type$ + "num_grand_rebirth") != .@grand_rebirthed[0]) dispbottom "The rebirth ranking was reset. Your rebirth count is back to zero."; setd @rebirth_type$ + "num_rebirth", .@rebirthed[0]; setd @rebirth_type$ + "num_grand_rebirth", .@grand_rebirthed[0]; } if (.grand_reset_max > -1 && num_grand_rebirth >= .grand_reset_max) { mes "You can only grand rebirth x"+ .grand_reset_max +"."; emotion e_gasp; } else { .@eac = eaclass(); if (BaseLevel < 255 || JobLevel < 120 || ( !( .@eac&EAJL_2 ) || !Upper ) && ( Class != Job_Ninja && Class != Job_Gunslinger && Class != Job_Soul_Linker && Class != Job_Star_Gladiator) ) mes "You must be max level/max job level to rebirth."; else { if ( getd(@rebirth_type$ + "num_rebirth") == .reset_max ) { mes "You have reached the maximum rebirth."; emotion e_gasp; .@s2$ = "^777777~ Grand Rebirth"; } else .@s1$ = "^777777~ Rebirth"; mes "Items need :"; displayItemneed(); } } next; switch( select( .@s1$, .@s2$, "^777777~ Informations", (.rebirth_ranking?"~ Rebirth ranking":""), (.grand_ranking?"~ Grand Rebirth ranking":""), "~ Good bye^000000", (getgroupid() < 90 ?"":"^FF0000[GM]^000000 Reset Rebirth Rankings") )) { case 1: checkItem(); deleteItem(); setd @rebirth_type$ + "num_rebirth", getd(@rebirth_type$ + "num_rebirth")+1; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_rebirth`, `last_ip` ) select "+ .@player_id +", '"+ escape_sql( strcharinfo(0) ) +"', '"+ getd(@rebirth_type$ + "num_rebirth") +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_rebirth` = `rebirth_system`.`num_rebirth` +1"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Rebirth!", 0; break; case 2: checkItem(); deleteItem(); getItemReward(); setd @rebirth_type$ + "num_grand_rebirth", getd(@rebirth_type$ + "num_grand_rebirth")+1; setd @rebirth_type$ + "num_rebirth", 0; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_grand`, `last_ip` ) select "+ .@player_id + ", '" + escape_sql( strcharinfo(0) ) +"', '"+ getd(@rebirth_type$ + "num_grand_rebirth") +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_grand` = `rebirth_system`.`num_grand` +1, `rebirth_system`.`num_rebirth` = 0"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Grand Rebirth!", 0; specialeffect2 EF_GLOW4; break; case 3: do { switch(select( (.ranking_type?"Account ":"My") + " status", "Rebirth", (.grand_reset_max!=0?"Grand Rebirth":""), "Cancel")) { case 1: if ( getd(@rebirth_type$ + "num_grand_rebirth") ) mes "You performed ^0000FFGrand Rebirth^000000 x"+ getd(@rebirth_type$ + "num_grand_rebirth") +"."; if ( getd(@rebirth_type$ + "num_rebirth") ) mes "You already rebirth ^ff0000x"+ getd(@rebirth_type$ + "num_rebirth") +"^000000."; else if ( getd(@rebirth_type$ + "num_grand_rebirth") == 0) mes "You did not rebirth."; break; case 2: mes "Rebirthing can be done when one reaches the pinnacle, that is, maximum base and job level."; mes "It reverts your base level back to 1 and gives you ^ff0000"+ .num_status +" bonus status points^000000."; next; mes "Items required each time:"; displayItemneed(); mes "After ^ff0000"+ .change_reward +" rebirths^000000, more items are necessary."; next; if (.reset_job) mes "You will be back as a simple novice."; else mes "You will maintain your job class, job level and skills."; mes "One can rebirth ^ff0000x"+ .reset_max +"^000000."; if (.ranking_type) mes "Rebirth count is shared between all character in the account."; if (.grand_reset_max != 0) { next; mes "When you reach the limit you can perform the ^0000FFGrand Rebirth^000000."; } break; case 3: mes "After rebirthing "+ .reset_max +" times you can merge all past rebirth into a powerful ^0000FFGrand Rebirth^000000 upon reaching max level!"; next; mes "The process will reward you with item:"; for (.@i = 0 ; .@i < .size_reward; .@i += 2 ) mes .reward[ .@i+1 ] + " " + mesitemlink(.reward[.@i]); mes "Also all bonus status points gained are forfeit since the rebirth count goes back to zero."; next; mes "Then you can repeat the process of Rebirths and ^0000FFGrand Rebirth^000000 for even more glory."; if (.grand_reset_max > 0) mes "^0000FFGrand Rebirth^000000 can be perfomed " + .grand_reset_max + " times."; else mes "There is no limit on how many ^0000FFGrand Rebirth^000000 can be perfomed."; break; case 4: mes F_Bye; close; } mes "What do you want to know about?"; next; } while (true); case 4: mes "TOP " + .rebirth_ranking + " of rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_rebirth` from `rebirth_system` WHERE num_rebirth > 0 ORDER BY `num_rebirth` desc limit " + .rebirth_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 5: mes "TOP " + .grand_ranking + " of grand rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_grand` from `rebirth_system` WHERE num_grand > 0 ORDER BY `num_grand` desc limit " + .grand_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 6: mes "Bye."; close; case 7: callsub S_GM; close; } if (.reset_job) { if ( Upper ) { // just in case the user change the setting... lastJob = roclass( .@eac&EAJ_UPPERMASK ); jobchange Job_Novice_High; } else jobchange Job_Novice; } resetlvl 1; resetstatus; // Will reset the statpoints //StatusPoint = .default_statuspoints; StatusPoint += .num_status * getd(@rebirth_type$ + "num_rebirth"); if (.grand_reset_points == false) StatusPoint += .num_status * (getd(@rebirth_type$ + "num_grand_rebirth") * .reset_max); mes "Done!"; close2; sleep2 10000; removespecialeffect2 EF_GLOW4; end; S_GM: if (.force_sql) { if (select("Cancel", "^FF0000Confirm Reset!") == 1) close; query_sql "TRUNCATE TABLE rebirth_system"; announce "[ Rebirth system ] : The Rebirth Ranking has been reset!", 0; } else { switch(select("Cancel", (.rebirth_ranking?"^FF0000Confirm Reset Rebirth Ranking!":""), (.grand_ranking? "^FF0000Confirm Reset Grand Rebirth Ranking!":""))) { case 1: close; case 2: query_sql "UPDATE rebirth_system SET num_rebirth = 0"; announce "[ Rebirth system ] : The Rebirth Ranking has been reset!", 0; break; case 3: query_sql "UPDATE rebirth_system SET num_grand = 0"; announce "[ Rebirth system ] : The Grand Rebirth Ranking has been reset!", 0; break; } query_sql "DELETE FROM rebirth_system WHERE num_rebirth = 0 AND num_grand = 0"; } mes "Reset done."; close; function checkItem { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) if ( countitem( .item_req[.@i] ) < .item_req[ .@i+1 ] + .@count ) { mes "You don't have enought "+ getitemname( .item_req[.@i] ) +". ^ff0000["+ countitem( .item_req[.@i] ) +"/"+ ( .item_req[ .@i+1 ] + .@count ) +"]^000000"; close; } if ( .@count >= .change_reward ) if ( .add_item_req[1] + .@count - .change_reward > countitem( .add_item_req[0] ) ) { mes "You don't have enought "+ getitemname( .add_item_req[0] ) +". ^ff0000["+ countitem( .add_item_req[0] ) +"/"+ ( .add_item_req[1] + .@count - .change_reward ) +"]^000000"; close; } return; } function colorItemrequired { .@count = getd(@rebirth_type$ + "num_rebirth"); if ( countitem( .item_req[ getarg(0) ] ) < .item_req[ getarg(0)+1 ] + .@count ) return "^ff0000"; return "^00ff00"; } function deleteItem { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) delitem .item_req[.@i], ( .item_req[ .@i+1 ] + .@count ); if ( .@count >= .change_reward ) delitem .add_item_req[0], ( .add_item_req[1] + .@count - .change_reward ); return; } function displayItemneed { .@count = getd(@rebirth_type$ + "num_rebirth"); for (.@i = 0; .@i < .size_item; .@i += 2 ) mes colorItemrequired( .@i ) +" - x"+ ( .item_req[ .@i+1 ] + .@count ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .item_req[.@i] ); if ( .@count >= .change_reward ) { if ( .add_item_req[1] + .@count - .change_reward > countitem( .add_item_req[0] ) ) .@color$ = "^ff0000"; else .@color$ = "^00ff00"; mes .@color$ +"- x"+ ( .add_item_req[1] + ( .@count - .change_reward ) ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .add_item_req[0] ); } return; } function getItemReward { for (.@i = 0; .@i < .size_reward; .@i += 2 ) getitem .reward[.@i], .reward[ .@i+1 ]; return; } function weightreq { if ( Weight > 50000 ) { mes "You have too much items on you. Your weight will be too high after rebirth."; close; } return; } OnInit: .reset_max = 10; // how many reset max .grand_reset_max = 100; // how many grand rebirth max (-1:unlimited) (0:disable) .change_reward = 6; // after the set rebirth, change reward .num_status = 10; // + X number of status points .reset_job = false; // character will go back to Novice? .rebirth_ranking = 0; // How many tops in normal rebirth ranking? (0=disable) .grand_ranking = 5; // How many tops in grand rebirhh ranking? (0=disable) .ranking_type = 0; // 0 = ranking by character. | 1 = ranking by account. .grand_reset_points = true; // Bonus status points will be back to 0 upon Grand Rebirth? .default_statuspoints = 48; // Default status points upon Lv1 in your server .force_sql = true; // Rebirth count are synced to sql ranking. // item required <item ID>, <number> setarray .item_req, 7179, 50, 7227, 50, 969, 300; // additionnal items after rebirth >> .change_reward // <item ID>, <number> setarray .add_item_req, 7179, 100; // Grand Rebirth rewards <item ID>, <number> setarray .reward, 674, 50; .size_item = getarraysize( .item_req ); .size_reward = getarraysize( .reward ); query_sql("CREATE TABLE IF NOT EXISTS `rebirth_system` (" + " `player_id` int(11) unsigned NOT NULL default 0," + " `name` varchar(255) NOT NULL DEFAULT 'NULL'," + " `num_rebirth` int(11) unsigned NOT NULL default 0," + " `num_grand` int(11) unsigned NOT NULL default 0," + " `last_ip` varchar(100) NOT NULL default ''," + " PRIMARY KEY (`player_id`)" + " ) ENGINE=MyISAM;"); end; }
    1 point
  9. Several factors 1. Resellers package everything (Client and Server). So you don't have to waste effort and mental energy if something goes wrong, but sometimes it does (there are scammers after all) 2. Instant Gratiffication (some people just want the out of the box experience without the hassle) 3. A lot of people in the internet just don't dig through stuff unlike us forum peeps I could think of other stuff, but these three are the gist of it mostly
    1 point
  10. The main storage (ID 0) is the only one that's always loaded. Extra storages (IDs 1, 2, 3...) are only loaded when requested, and only one can be loaded at a time. When the code requests storage ID 2, it doesn't load fast enough, so the lines that add the item and close the storage are executed too early. That's why the storage remains open the first time. The same thing happens when the player opens another extra storage, since storage ID 2 gets switched to a different one.
    1 point
  11. Hello, change storage to premiumStorage. You can try my changes. I can't test it with just the code provided. // @autostore [Cydh] if (autostoring && sd->state.autostore && !item->expire_time && !id->flag.autoequip && !sd->state.storage_flag && !sd->npc_id) { if ((!sd->autostore_weight || (sd->autostore_weight && get_percentage(sd->weight, sd->max_weight) >= sd->autostore_weight)) && ( (sd->autostore_type&1 && (id->type == IT_HEALING || id->type == IT_USABLE || id->type == IT_DELAYCONSUME || id->type == IT_CASH)) || (sd->autostore_type&2 && (id->type == IT_ARMOR || id->type == IT_WEAPON || id->type == IT_SHADOWGEAR || id->type == IT_PETEGG || id->type == IT_PETARMOR)) || (sd->autostore_type&4 && (id->type == IT_ETC || id->type == IT_AMMO || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2)) || (sd->autostore_type&8 && id->type == IT_CARD) ) ) { char output[CHAT_SIZE_MAX]; sd->weight += w; clif_updatestatus(*sd, SP_WEIGHT); int32 stor_id = 2; //Storage ID to autostore if (stor_id) storage_premiumStorage_load(sd, stor_id, STOR_MODE_PUT); if (sd->state.storage_flag == 3) { storage_storageadd(sd, &sd->premiumStorage, i, amount); storage_premiumStorage_close(sd); } else { storage_storageadd(sd, &sd->storage, i, amount); storage_storageclose(sd); clif_storageclose(*sd); } sprintf(output, "[ Autostore ] %dx %s", amount, id->ename.c_str()); clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], output, false, SELF); achievement_update_objective(sd, AG_GET_ITEM, 1, id->value_sell); return ADDITEM_SUCCESS; } }
    1 point
  12. Hello try lang search sa youtube halos lahat ng guide ginawan na ng ating mga kasamang pinoy
    1 point
  13. 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
  14. The sql table is working fine for me. Does any error appear on the server console? Stat Points Doesnt clear out after rebirth only the allocated stats. Changed. In what line I can edit the reward for Grand Reset, all I can see was the reward for the Reset after they reach 150 reset. It's the same reward. Is it possible that after grand reset all of the "STAT POINTS" earned during Rebirth can be wiped and start as new rebirth. Added config for this. GM selection to clear out rankings for Rebirths and Grand Rebirths. Added character log in SQL should be per character not per account ( Ex: char1 have 5 rebirth char2 has 3 when you check in DB char1 has 8 Rebirths already ) tried this but still same Added config for this. Drop the old table. //===== rAthena Script ======================================= //= Rebirth System //===== Description: ========================================= //- Go back to Level 1 to gain bonus status points //===== Changelogs: ========================================== //= 1.0 First version. [Capuche] //= 1.6 Added Grand Rebirth. [Racaae] //============================================================ /* CREATE TABLE IF NOT EXISTS `rebirth_system` ( `player_id` int(11) unsigned NOT NULL default 0, `name` varchar(255) NOT NULL DEFAULT 'NULL', `num_rebirth` int(11) unsigned NOT NULL default 0, `num_grand` int(11) unsigned NOT NULL default 0, `last_ip` varchar(100) NOT NULL default '', PRIMARY KEY (`player_id`) ) ENGINE=MyISAM; */ prontera,141,179,5 script Rebirth System 531,{ function checkItem; // check if player have all item required function colorItemrequired; // color the text. Red : not enough item, green otherwise function deleteItem; // delete all items required function displayItemneed; // display all items need at start function getItemReward; // give the items reward //function weightreq; // check if your current weight is highter than weight high novice if (.grand_reset_max > -1 && num_grand_rebirth >= .grand_reset_max) { mes "You can only grand rebirth x"+ .grand_reset_max +"."; emotion e_gasp; } else { .@eac = eaclass(); if( BaseLevel < 255 || JobLevel < 120 || ( !( .@eac&EAJL_2 ) || !Upper ) && ( Class != Job_Ninja && Class != Job_Gunslinger && Class != Job_Soul_Linker && Class != Job_Star_Gladiator) ) mes "You must be max level/max job level to rebirth."; else { if ( num_rebirth == .reset_max ) { mes "You have reached the maximum rebirth."; emotion e_gasp; .@s2$ = "^777777~ Grand Rebirth"; } else .@s1$ = "^777777~ Rebirth"; mes "Items need :"; displayItemneed(); } } next; switch( select( .@s1$, .@s2$, "^777777~ Informations", (.rebirth_ranking?"~ Rebirth ranking":""), (.grand_ranking?"~ Grand Rebirth ranking":""), "~ Good bye^000000", (getgroupid() < 90 ?"":"^FF0000[GM]^000000 Reset Rebirth Rankings") )) { case 1: checkItem(); deleteItem(); num_rebirth += 1; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_rebirth`, `last_ip` ) select "+ .@player_id +", '"+ escape_sql( strcharinfo(0) ) +"', '"+ num_rebirth +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_rebirth` = `rebirth_system`.`num_rebirth` +1"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Rebirth!", 0; break; case 2: checkItem(); deleteItem(); getItemReward(); num_grand_rebirth += 1; num_rebirth = 0; .@account_id = getcharid(3); if (.ranking_type) .@player_id = .@account_id; else .@player_id = getcharid(0); query_sql "insert into `rebirth_system` ( `player_id`, `name`, `num_grand`, `last_ip` ) select "+ .@player_id + ", '" + escape_sql( strcharinfo(0) ) +"', '"+ num_grand_rebirth +"',`login`.`last_ip` from `login` where `login`.`account_id` = "+ .@account_id +" on duplicate key update `rebirth_system`.`num_grand` = `rebirth_system`.`num_grand` +1, `rebirth_system`.`num_rebirth` = 0"; announce "[ Rebirth system ] : "+ strcharinfo(0) +" Successfully Grand Rebirth!", 0; specialeffect2 EF_GLOW4; break; case 3: do { switch(select("My status", "Rebirth", (.grand_reset_max!=0?"Grand Rebirth":""), "Cancel")) { case 1: if (num_grand_rebirth) mes "You performed Grand Rebirth ^ff0000x"+ num_grand_rebirth +"^000000."; if (num_rebirth) mes "You already rebirth ^ff0000x"+ num_rebirth +"^000000."; else if (num_grand_rebirth == 0) mes "You did not rebirth."; break; case 2: mes "Rebirthing can be done when one reaches the pinnacle, that is, maximum base and job level."; mes "It reverts your base level back to 1 and gives you ^ff0000"+ .num_status +" bonus status points^000000."; next; mes "Items required each time:"; displayItemneed(); mes "After ^ff0000"+ .change_reward +" rebirths^000000, more items are necessary."; next; if (.reset_job) mes "You will be back as a simple novice."; else mes "You will maintain your job class, job level and skills."; mes "One can only rebirth ^ff0000x"+ .reset_max +"^000000."; if (.grand_reset_max != 0) mes "When you reach the maximum you can perform the ^0000FFGrand Rebirth^000000."; break; case 3: mes "After rebirthing "+ .reset_max +" times you can merge all past rebirth into a powerful ^0000FFGrand Rebirth^000000 upon reaching max level!"; next; mes "The process will reward you with item:"; for (.@i = 0 ; .@i < .size_reward; .@i += 2 ) mes .reward[ .@i+1 ] + " " + mesitemlink(.reward[.@i]); mes "Also all bonus status points gained are forfeit since the rebirth count goes back to zero."; next; mes "Then you can repeat the process of Rebirths and ^0000FFGrand Rebirth^000000 for even more glory."; if (.grand_reset_max > 0) mes "^0000FFGrand Rebirth^000000 can be perfomed " + .grand_reset_max + " times."; else mes "There is no limit on how many ^0000FFGrand Rebirth^000000 can be perfomed."; break; case 4: mes F_Bye; close; } mes "What do you want to know about?"; next; } while (true); case 4: mes "TOP " + .rebirth_ranking + " of rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_rebirth` from `rebirth_system` WHERE num_rebirth > 0 ORDER BY `num_rebirth` desc limit " + .rebirth_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 5: mes "TOP " + .grand_ranking + " of grand rebirth"; mes "Name - Number of rebirth"; .@size = query_sql( "select `name`, `num_grand` from `rebirth_system` WHERE num_grand > 0 ORDER BY `num_grand` desc limit " + .grand_ranking, .@name$, .@value ); if( .@size ) { for( .@i = 0; .@i < .@size; .@i++ ) mes "^777777"+ F_GetNumSuffix( .@i +1 ) +"^000000 : "+ .@name$[.@i] +" : ^FF0000"+ .@value[.@i] +"^000000"; } else mes "^0000ff* the list is empty *^000000"; close; case 6: mes "Bye."; close; case 7: callsub S_GM; close; } if (.reset_job) { if ( Upper ) { // just in case the user change the setting... lastJob = roclass( .@eac&EAJ_UPPERMASK ); jobchange Job_Novice_High; } else jobchange Job_Novice; } resetlvl 1; resetstatus; // Will reset the statpoints //StatusPoint = .default_statuspoints; StatusPoint += .num_status * num_rebirth; if (.grand_reset_points == false) StatusPoint += .num_status * (num_grand_rebirth * .reset_max); mes "Done!"; close2; sleep2 10000; removespecialeffect2 EF_GLOW4; end; S_GM: switch(select("Cancel", (.rebirth_ranking?"^FF0000Confirm Reset Rebirth Ranking!":""), (.grand_ranking?"^FF0000Confirm Reset Grand Rebirth Ranking!":""))) { case 1: close; case 2: query_sql "UPDATE rebirth_system SET num_rebirth = 0"; announce "[ Rebirth system ] : The Rebirth Ranking has been reset!", 0; break; case 3: query_sql "UPDATE rebirth_system SET num_grand = 0"; announce "[ Rebirth system ] : The Grand Rebirth Ranking has been reset!", 0; break; } query_sql "DELETE FROM rebirth_system WHERE num_rebirth = 0 AND num_grand = 0"; mes "Reset done."; close; function checkItem { for ( ; .@i < .size_item; .@i += 2 ) if ( countitem( .item_req[.@i] ) < .item_req[ .@i+1 ] + num_rebirth ) { mes "You don't have enought "+ getitemname( .item_req[.@i] ) +". ^ff0000["+ countitem( .item_req[.@i] ) +"/"+ ( .item_req[ .@i+1 ] + num_rebirth ) +"]^000000"; close; } if ( num_rebirth >= .change_reward ) if ( .add_item_req[1] + num_rebirth - .change_reward > countitem( .add_item_req[0] ) ) { mes "You don't have enought "+ getitemname( .add_item_req[0] ) +". ^ff0000["+ countitem( .add_item_req[0] ) +"/"+ ( .add_item_req[1] + num_rebirth - .change_reward ) +"]^000000"; close; } return; } function colorItemrequired { if ( countitem( .item_req[ getarg(0) ] ) < .item_req[ getarg(0)+1 ] + num_rebirth ) return "^ff0000"; return "^00ff00"; } function deleteItem { for ( ; .@i < .size_item; .@i += 2 ) delitem .item_req[.@i], ( .item_req[ .@i+1 ] + num_rebirth ); if ( num_rebirth >= .change_reward ) delitem .add_item_req[0], ( .add_item_req[1] + num_rebirth - .change_reward ); return; } function displayItemneed { for ( ; .@i < .size_item; .@i += 2 ) mes colorItemrequired( .@i ) +" - x"+ ( .item_req[ .@i+1 ] + num_rebirth ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .item_req[.@i] ); if ( num_rebirth >= .change_reward ) { if ( .add_item_req[1] + num_rebirth - .change_reward > countitem( .add_item_req[0] ) ) .@color$ = "^ff0000"; else .@color$ = "^00ff00"; mes .@color$ +"- x"+ ( .add_item_req[1] + ( num_rebirth - .change_reward ) ) +" "+ (PACKETVER>=20230302?"^i["+ .item_req[.@i] + "]":"") + getitemname( .add_item_req[0] ); } return; } function getItemReward { for ( ; .@i < .size_reward; .@i += 2 ) getitem .reward[.@i], .reward[ .@i+1 ]; return; } function weightreq { if ( Weight > 50000 ) { mes "You have too much items on you. Your weight will be too high after rebirth."; close; } return; } OnInit: .reset_max = 10; // how many reset max .grand_reset_max = 100; // how many grand rebirth max (-1:unlimited) (0:disable) .change_reward = 6; // after the set rebirth, change reward .num_status = 10; // + X number of status points .reset_job = false; // character will go back to Novice? .rebirth_ranking = 0; // How many tops in normal rebirth ranking? (0=disable) .grand_ranking = 5; // How many tops in grand rebirhh ranking? (0=disable) .ranking_type = 0; // 0 = ranking by character. | 1 = ranking by account. .grand_reset_points = true; // Bonus status points will be back to 0 upon Grand Rebirth? .default_statuspoints = 48; // Default status points upon Lv1 in your server // item required <item ID>, <number> setarray .item_req, 7179, 50, 7227, 50, 969, 300; // additionnal items after rebirth >> .change_reward // <item ID>, <number> setarray .add_item_req, 7179, 100; // Grand Rebirth rewards <item ID>, <number> setarray .reward, 674, 50; .size_item = getarraysize( .item_req ); .size_reward = getarraysize( .reward ); query_sql("CREATE TABLE IF NOT EXISTS `rebirth_system` (" + " `player_id` int(11) unsigned NOT NULL default 0," + " `name` varchar(255) NOT NULL DEFAULT 'NULL'," + " `num_rebirth` int(11) unsigned NOT NULL default 0," + " `num_grand` int(11) unsigned NOT NULL default 0," + " `last_ip` varchar(100) NOT NULL default ''," + " PRIMARY KEY (`player_id`)" + " ) ENGINE=MyISAM;"); end; }
    1 point
  15. You need a client with date 2023+ if im correct.
    1 point
  16. You can also do a script call func base for much easier use for 1 item
    1 point
  17. Take an old client where reading data using cps.dll is supported, analyze how the resources are read, see how cps.dll is initialized. Initialize cps.dll, redirect resource reading to the symbol uncompress from cps.dll, restore the mention of cps.dll and uncompress in the client's hex code. That's it, now you can patch this exe through the GRF editor by creating your own cps.dll. You can start small - open the exe with any hex editor, write and save: 63 70 73 2E 64 6C 6C // cps.dll Now try using the GRF Editor on the updated exe and create cps.dll. You did it! But apparently, that won't be enough for now... but you know, I'm always ready to help!
    1 point
  18. try check this R> monster vs monster - Script Requests - rAthena
    1 point
  19. actually im working for auction house in panel now for my client ( let say, something ask me add custom request), sorry for late update but CP is always on progress
    1 point
  20. Hex edit: look for this 00 00 44 AC 00 00 and change it to 00 00 22 56 00 00
    1 point
  21. Yes, I noticed the the small differences in the pc.cpp file as well So I recompiled the src after manually DIFFing from that blob by Jhonvaliense, and everything works fine now Everything is working as intended now after I DIFFed everything from Jhonvaliense's blob @Everyone For anyone recompiling in the future Please do not use the commit here: https://github.com/AoShinRO/brHades/commit/1396b012600db9b0688f3cd3fdb9ac273d525bd0#diff-16a6f317c581ce365a41a9846cf48dc45c8d6ac0256a7c45849e6e1b37100ecdR13025-R13037 Please use this one instead: https://github.com/Jhonvaliense/ROClient_en/blob/main/20231220%2B CLIENT bodystylefix.diff They are functionally almost the same commit. but there are small differences in the pc.cpp file as mentioned by dark elf Thank you dark elf and amm0nition
    1 point
  22. After the fixes: Before (for reference): There's ~72 images in the current zip for ~20 buttons. The buttons are not perfect but more consistent than the original ones, that had random *** spacing, font size, and shadows. Installation: add to Data or GRF (can technically be used on a skin, but Quest UI seems to only be modifiable via data/GRF) data.zip
    1 point
  23. Version 1.0.0

    1586 downloads

    A small mod that allows you to display a custom icon and a title referring to the element and element level of the mob. It can be disabled by changing it in monster.conf // Show Element Info [Hyroshima] // 0= Off, 1= On mob_ele_view: 1 I have an observation to inform, if any of the information related to show_mob_info is enabled the mod will behave as disabled. // Display some mob info next to their name? (add as needed) // (does not works on guardian or Emperium) // 1: Display mob HP (Hp/MaxHp format) // 2: Display mob HP (Percent of full life format) // 4: Display mob's level show_mob_info: 0 Obs: i am making 2 diff files available: _A = Closest to current revision. _B = A little older compared to the current review The video quality is not very good (sorry), watch the preview video in fullscreen
    Free
    1 point
  24. Version 1.0.0

    119 downloads

    Edited Sealed Shrine Instance with different difficulties.
    Free
    1 point
  25. Version 1.1.0

    172 downloads

    Reuploaded: Edited Nydhoggs Nest Instance with different difficulties. (see attachments)
    Free
    1 point
  26. Version 1.1.0

    147 downloads

    Edited Orc Memory Instance to have multiple difficulties. (see attachment for info)
    Free
    1 point
  27. Version 1.2.0

    629 downloads

    Good day! I've been an observer since the beginning of time and I want to share this script hoping that it will help fellow human beings who need it. This was a paid script of mine and I hired @sader1992 to help me finish it in 2020. I'm hoping someone will improve the code in the near future with other stuff to give another flavor for Endless Tower. This works with the latest version of rAthena. Requirement: Y'all need this patch for +damage to work setunitdata script command monster stat recaulculation fixes #3968 About the script: It is simply Endless Tower with Easy, Veteran, Nightmare, Hell & Torment Difficulties. You can edit the values I pre-assigned: This part is for the difficulty settings and adding stats to the monsters: This part is for the rewards: It gives #INSTANCEPOINTS and EXP depending on the difficulty you're on. I assigned a monster (1613 : metalling) to show us that the stats boost really works: PS: I'm also integrating this to other instances. Maybe I'll post it if people requests it.
    Free
    1 point
  28. Version 1.0.1

    487 downloads

    Sunken Tower instance with infinite floors. The mob scaling is using custom values as I don't know how it is in kRO. Currently, the additional exp scaling and mob ATK scaling does not work without changing the source code. I will not be providing support for that.
    Free
    1 point
  29. you may change the default value of your SQL table. ...datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
    1 point
  30. 583 downloads

    just wanna share mob database I made based on Einbech Dungeon 3 - NovaRO: Wiki (novaragnarok.com) Mobskill is not official. video is attached, in .rrf extension file. einbech dun 03.rrf
    Free
    1 point
  31. Version 1.20

    386 downloads

    In this File: - folder with Malaya monsters act files with sound effects. (finally). - folder with Other monsters fix, this contains fixed acts for 30 monsters, Did you know that doppelganger screams when dying? have you ever heard it? I think not. Well here you have it, did i said 30 monsters with corrected sound? Have you ever heard zealotus actions? - Fixed Osiris idle snapping frame act. Bonus: folder with female lord knight class act frame with sounds, weapon attack spear and two handed sword. Please read the readme file, do not reupload this fix in other sites beside this.
    Free
    1 point
×
×
  • Create New...