Leaderboard
Popular Content
Showing content with the highest reputation since 05/13/25 in Posts
-
4 points
-
2 points
-
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 amm0nition2 points
-
You can contact the video owner — he’s probably selling it. If you’re only interested in the maps and monsters: // Chapter 1 World Tree Song Prelude map: ygg_roots map: ygg_edge map: ygg_fruit map: mu_fild01 map: ch1_sf01 map: uknw_ruin map: uknw_ruin2 map: ch1_sf02 map: ch1_sf03 map: ch1_geffen map: ch1_gef_in map: ch1_vrgef1 map: ch1_vrgef2 map: hem_dun01 map: hem_dun02 map: hem_fild map: 1@ch1a map: 1@ch1b map: ch1_dw map: ch1_que01 map: ch1_gfn01 map: ch1_gfn03 ygg_roots monster --ja-- CH1_YGGRING,10,5000 ygg_roots monster --ja-- CH1_LEAFEING,10,5000 mu_fild01 monster --ja-- CH1_CHARCOARING,30,5000 mu_fild01 monster --ja-- CH1_VULRING,30,5000 mu_fild01 monster --ja-- CH1_FIRELOOP,45,5000 mu_fild01 monster --ja-- CH1_FIRAFFLESIA,45,5000 mu_fild01 monster --ja-- CH1_VOLIMPET,45,5000 mu_fild01 monster --ja-- CH1_FIRE_FLOWER,15,5000 uknw_ruin monster --ja-- CH1_NYAISE,15,5000 uknw_ruin monster --ja-- CH1_SHADOW_JAILER,15,5000 uknw_ruin monster --ja-- CH1_TULIP,60,5000 uknw_ruin monster --ja-- CH1_CALENDULA,60,5000 uknw_ruin monster --ja-- CH1_SCABIOSA,35,5000 uknw_ruin2 monster --ja-- CH1_NYAISE,15,5000 uknw_ruin2 monster --ja-- CH1_SHADOW_JAILER,15,5000 uknw_ruin2 monster --ja-- CH1_LOBELIA,35,5000 uknw_ruin2 monster --ja-- CH1_MYOSOTIS,60,5000 uknw_ruin2 monster --ja-- CH1_ANEMONE,60,5000 hem_dun01 monster --ja-- CH1_EX_ROBOT,60,5000 hem_dun01 monster --ja-- CH1_REPAIR_ROBOT,60,5000 hem_dun01 monster --ja-- CH1_DIMIC_1,20,5000 hem_dun01 monster --ja-- CH1_DIMIC_2,20,5000 hem_dun01 monster --ja-- CH1_DIMIC_3,20,5000 hem_dun01 monster --ja-- CH1_DIMIC_4,20,5000 hem_dun01 monster --ja-- CH1_IMMORTAL_CORPS1,15,5000 hem_dun01 monster --ja-- CH1_IMMORTAL_CORPS2,15,5000 hem_dun01 monster --ja-- CH1_IMMORTAL_CORPS3,15,5000 hem_dun02 monster --ja-- CH1_SKOGL,50,5000 hem_dun02 monster --ja-- CH1_FRUS,50,5000 hem_dun02 monster --ja-- CH1_LISTENER,50,5000 hem_dun02 monster --ja-- CH1_IMMORTAL_OFFICER1,25,5000 hem_dun02 monster --ja-- CH1_IMMORTAL_OFFICER2,25,5000 hem_fild monster --ja-- CH1_PEEPING,52,5000 hem_fild monster --ja-- CH1_SILK_FROG,28,5000 hem_fild monster --ja-- CH1_SILK_SNAIL,28,5000 hem_fild monster --ja-- CH1_IMMORTAL_CORPS1,12,5000 hem_fild monster --ja-- CH1_IMMORTAL_CORPS2,12,5000 hem_fild monster --ja-- CH1_IMMORTAL_CORPS3,12,5000 ch1_gfn01 monster --ja-- CH1_TOXIT,35,5000 ch1_gfn01 monster --ja-- CH1_LUNARINA,35,5000 ch1_gfn01 monster --ja-- CH1_BLOODY_SLASHER,35,5000 ch1_gfn01 monster --ja-- CH1_SHADIEST,35,5000 ch1_gfn01 monster --ja-- CH1_SUCCUBUS,18,5000 ch1_gfn01 monster --ja-- CH1_INCCUBUS,18,5000 ch1_gfn01 monster --ja-- CH1_ABYSS_KNIGHT,18,5000 ch1_gfn01 monster --ja-- CP_CH1_TOXIT,6,5000 ch1_gfn01 monster --ja-- CP_CH1_LUNARINA,6,5000 ch1_gfn01 monster --ja-- CP_CH1_BLOODY_SLASHER,6,5000 ch1_gfn01 monster --ja-- CP_CH1_SHADIEST,6,5000 ch1_gfn01 monster --ja-- CP_CH1_SUCCUBUS,3,5000 ch1_gfn01 monster --ja-- CP_CH1_INCCUBUS,3,5000 ch1_gfn01 monster --ja-- CP_CH1_ABYSS_KNIGHT,3,5000 ch1_gfn03 monster --ja-- CH1_TOXIT,35,5000 ch1_gfn03 monster --ja-- CH1_LUNARINA,35,5000 ch1_gfn03 monster --ja-- CH1_BLOODY_SLASHER,35,5000 ch1_gfn03 monster --ja-- CH1_SHADIEST,35,5000 ch1_gfn03 monster --ja-- CH1_SUCCUBUS,18,5000 ch1_gfn03 monster --ja-- CH1_INCCUBUS,18,5000 ch1_gfn03 monster --ja-- CH1_ABYSS_KNIGHT,18,5000 ch1_gfn03 monster --ja-- CP_CH1_TOXIT,6,5000 ch1_gfn03 monster --ja-- CP_CH1_LUNARINA,6,5000 ch1_gfn03 monster --ja-- CP_CH1_BLOODY_SLASHER,6,5000 ch1_gfn03 monster --ja-- CP_CH1_SHADIEST,6,5000 ch1_gfn03 monster --ja-- CP_CH1_SUCCUBUS,3,5000 ch1_gfn03 monster --ja-- CP_CH1_INCCUBUS,3,5000 ch1_gfn03 monster --ja-- CP_CH1_ABYSS_KNIGHT,3,5000 ch1_que01 monster --ja-- CH1_IMMORTAL_CORPS1,5,5000 ch1_que01 monster --ja-- CH1_IMMORTAL_CORPS2,5,5000 ch1_que01 monster --ja-- CH1_IMMORTAL_CORPS3,5,5000 mu_fild01 boss_monster --ja-- CH1_BULGASARI,1,650000 uknw_ruin2 boss_monster --ja-- CH1_GLUTTO,1,6500001 point
-
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 mostly1 point
-
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
-
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
-
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
-
1 point
-
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
-
1 point
-
1 point
-
Also can generate easily using https://x-files.amirazman.my/customfilegenerator/1 point
-
1 point
-
Hello. Change trade_unconditional: true to trade_unconditional: false. You can learn more about the functions of each permission in: /doc/permissions.txt1 point
-
I tested it myself, and it seems that the transaction completes without any issues.1 point
-
Found the fix for my earlier question for bodystyle and alternate sprites and turns out they are indeed in the client just at a later used it: Rune Knight JPN Alternate starts at 4332 and you can go higher by 1 for the other jobs. thought I'd quote you so you can see the answer since you were interested.1 point
-
1 point
-
Summary A flexiable job change script that is heavily inspired by the job system of final fantasy 14. This script allows the creation of diffrerent job templet, and allows player to freely change their job . Player can swap the following data based on the templet: Job Status Base level/Job level Skill tree (the script will remember which skill is allocated and what lvl it is) Unspent points The script menu There are three main function of the script. Change Class: Use this to swap to different class templet. It will not saved the current job info before swaping, if the player does not save their current job first, they might lost their skill, level, status, .etc. Store current class Use this to saved the current job. Every job can only have one templet (Each job_id can only have one entry in the db). If the current job level/base level is lower than the stored one, the system will give a warning and asks the user if they wish to overwrite. Change to novice Change the player into a 1/1 novice with Give the player the ability to muti class by making them novice, so they can choos other class The system will also grant a 24h 300% exp buff to the player, to help them level up faster (this can be changed if you don't want it) Download https://github.com/Someguy324/JobStone Importance The download file only contains the function it self, if you want to use it, you need to implement it youself (Adding it to a npc, or a item). This is my first script, and it is mainly used by mysel on a local server. I do not guarantee it will be bug free, or have great security. Additionaly, the way I implement skill tree storage is really junky ( every templets have their skill tree stored as individual entry in the db, EVERY ALLOCATED SKILL IS A ENTRY). So, PLEASE BE CAUTIOUS if you want to used it on a public server. You are welcom to modify my code in any way you want, I write some comment beside the code, so it might be easier understand how the code work. Please report any bug down below, I will take a look when I'm free jb_changer.txt1 point
-
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.zip1 point
-
1 point