Leaderboard
Popular Content
Showing content with the highest reputation on 05/17/25 in all areas
-
Hello try lang search sa youtube halos lahat ng guide ginawan na ng ating mga kasamang pinoy1 point
-
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
-
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
-
1 point
-
Version 1.8.9.7
57285 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.Free1 point