Leaderboard
Popular Content
Showing content with the highest reputation since 05/16/25 in Posts
-
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 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
-
KRO : https://github.com/hiphop9/ROClient_en 2025-03-19_Ragexe_1742361965(EN) -PATH- @ Bug Fix(Recommended) Add Close Button Custom Window Title Disable 1rag1 Params(Recommended) Disalbe Filename Check(Recommended) Disable Help Message Disable Indoor RSW Disalbe Swear Filter Enable 44khz Audio Enable DNS Suport Enable Multiple GRF(Recommended) Fix NPC Dialog Scroll Increase Zoom Out 75% Read Data Folder First(Recommended) Remove Hard Coded Address & Port(Recommended) Restore Clientinfo.xml(Recommended) Restore Old Login Packet(Recommended) externalsettings Korea patch Show Replay Button Skip License Screen Translations client EnableWho EnableShowName AlwaysAscii CallKoreaClientInfo PlainTextDesc HideBuildInfo TranslateClient NoGGuard CustomItemInfoLub CustomAchieveLub CustomTownInfoLub CustomTipboxLub CustomMapInfoLub CustomOngQuestInfoLub CustomRcmdQuestInfoLub NoNagle OpenToServiceSelect GuildBrackets NoGravityAds NoGravityLogo FixLatestNCWin This is distributed for testing purposes only. Please do not request additional patches!! I am not a seller!! Therefore, if you plan to operate or commercialize a server, do not contact me!!1 point
-
You can use getunits, isloggedin, and party_addmember to display nearby players and allow the party leader to invite them directly from the NPC. You can use an NPC like this example poster to allow party leaders to post announcements filtered by level, class, or role, and other players can join if they meet the requirements. SPA: prontera,149,164,5 script Cartel de Reclutamiento 4_BOARD3,{ setarray .@jobs,Job_Knight,Job_Priest,Job_Wizard,Job_Blacksmith,Job_Hunter,Job_Assassin,Job_Crusader,Job_Monk,Job_Sage,Job_Rogue,Job_Alchemist,Job_Bard,Job_Dancer,Job_Gunslinger,Job_Ninja,Job_Star_Gladiator,Job_Soul_Linker; if (checkre(0)) setarray .@jobs[getarraysize(.@jobs)],Job_Summoner; mes "Ves un cartel viejo. Alguien lo ha reutilizado para otro propósito..."; mes "Parece usarse para ^EE8800reclutar miembros para grupos^000000 de aventura."; setarray .@roles$,"Dano","Curador","Tank","Soporte"; switch(select("Publicar un anuncio", "Leer los anuncios", "Alejarme")) { case 1: clear; if (!getcharid(1)) { mes "Estoy solo. No tengo party."; close; } if (getcharid(0) != getpartyleader(getcharid(1), 2)) { mes "No soy el líder de mi party. No puedo publicar nada aquí."; close; } .@party_id = getcharid(1); for (.@i = 0; .@i < getarraysize($@party_ids); .@i++) { if ($@party_ids[.@i] == .@party_id) { mes "Já hay un anuncio de mi party aquí. Nada que hacer."; close; } } mes "Penso un poco..."; mes "¿Qué nivel mínimo debería requerir?"; input .@min_level,0,MAX_LEVEL; clear; if (.@min_level > 1) mes "Nivel mínimo : " + .@min_level; else mes "Sin nivel mínimo"; switch(select("Seleccionar roles", "Seleccionar clases", "Cancelar")) { case 1: deletearray .@selected_roles[0], getarraysize(.@roles$); .@accept_all = false; while (1) { .@menu$ = ""; if (.@accept_all) .@menu$ += "^ff0000Desmarcar todos^000000:"; else .@menu$ += "[ ] Cualquier rol^000000:"; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { .@menu$ += (.@selected_roles[.@i] ? "^0000FF[+] " : "^808080[ ] ") + .@roles$[.@i] + "^000000:"; } .@menu$ += "Confirmar selección"; .@opt = select(.@menu$); if (.@opt == 1) { .@accept_all = !.@accept_all; if (.@accept_all) { for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) .@selected_roles[.@i] = true; } else { deletearray .@selected_roles[0], getarraysize(.@roles$); } } else if (.@opt == getarraysize(.@roles$) + 2) { .@valid = false; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { if (.@selected_roles[.@i]) { .@valid = true; break; } } if (!.@valid) { mes "Necesito seleccionar al menos un rol."; continue; } break; } else { .@index = .@opt - 2; .@selected_roles[.@index] = !.@selected_roles[.@index]; if (.@accept_all && !.@selected_roles[.@index]) .@accept_all = false; } } if (.@accept_all) { .party_filter_type$[.@party_id] = "role"; $@party_filter_values$[.@party_id] = "cualquier"; } else { .@str$ = ""; for (.@i = 0; .@i < getarraysize(.@roles$); .@i++) { if (.@selected_roles[.@i]) { .@str$ += (.@str$ == "" ? "" : ",") + .@roles$[.@i]; } } .party_filter_type$[.@party_id] = "role"; $@party_filter_values$[.@party_id] = .@str$; } mes "Roles confirmados. Anuncio publicado."; .@index = getarraysize($@party_ids); $@party_ids[.@index] = .@party_id; $@party_min_level[.@party_id] = .@min_level; $@party_leader$[.@party_id] = strcharinfo(0); if ($@party_filter_values$[.@target_pid] != "cualquier") .@announce$[.@count++] = replacestr(.@str$, ",", " / "); break; case 2: deletearray .@selected_classes[0], getarraysize(.@jobs); .@accept_all = false; while (1) { .@menu$ = ""; if (.@accept_all) .@menu$ += "^ff0000Desmarcar todas^000000:"; else .@menu$ += "[ ] Cualquier clase^000000:"; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { .@menu$ += (.@selected_classes[.@i] ? "^0000FF[+] " : "^808080[ ] ") + jobname(.@jobs[.@i]) + "^000000:"; } .@menu$ += "Confirmar selección"; .@opt2 = select(.@menu$); if (.@opt2 == 1) { .@accept_all = !.@accept_all; if (.@accept_all) { for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) .@selected_classes[.@i] = true; } else { deletearray .@selected_classes[0], getarraysize(.@jobs); } } else if (.@opt2 == getarraysize(.@jobs) + 2) { .@valid2 = false; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { if (.@selected_classes[.@i]) { .@valid2 = true; break; } } if (!.@valid2) { mes "Necesito seleccionar al menos una clase."; continue; } break; } else { .@index2 = .@opt2 - 2; .@selected_classes[.@index2] = !.@selected_classes[.@index2]; if (.@accept_all && !.@selected_classes[.@index2]) .@accept_all = false; } } if (.@accept_all) { .party_filter_type$[.@party_id] = "class"; $@party_filter_values$[.@party_id] = "cualquier"; } else { .@str$ = ""; for (.@i = 0; .@i < getarraysize(.@jobs); .@i++) { if (.@selected_classes[.@i]) { .@str$ += (.@str$ == "" ? "" : ",") + .@jobs[.@i]; } } .party_filter_type$[.@party_id] = "class"; $@party_filter_values$[.@party_id] = .@str$; explode(.@class_array$, .@str$, ","); if (getarraysize(.@class_array$) < 4) { for (.@i = 0; .@i < getarraysize(.@class_array$); .@i++) .@class_array$[.@i] = jobname(atoi(.@class_array$[.@i])); .@announce$[.@count++] = implode(.@class_array$, " / "); } else .@announce$[.@count++] = "de ciertas clases"; } mes "Clases confirmadas. Anuncio publicado."; mes "Ahora, a esperar que alguien se una."; .@index = getarraysize($@party_ids); $@party_ids[.@index] = .@party_id; $@party_min_level[.@party_id] = .@min_level; $@party_leader$[.@party_id] = strcharinfo(0); break; case 3: close; } if ($@party_min_level[.@party_id] > 1) .@announce$[.@count++] = "nivel " + $@party_min_level[.@party_id] + "+"; if (.@announce$[0] != "") announce strcharinfo(0) + " está buscando miembros " + implode(.@announce$, " ") + " para su grupo.",0; else announce strcharinfo(0) + " está buscando miembros para su grupo.",0; close; case 2: if (getarraysize($@party_ids) == 0) { mes "El cartel está vacío. Nadie está reclutando ahora."; close; } for (.@i = 0; .@i < getarraysize($@party_ids); .@i++) { .@pid = $@party_ids[.@i]; .@menu$ += "Party de " + $@party_leader$[.@pid] + " (Lv " + $@party_min_level[.@pid] + "+):"; } .@chosen = select(.@menu$) - 1; .@target_pid = $@party_ids[.@chosen]; clear; mes " - Líder: " + $@party_leader$[.@target_pid]; if ($@party_min_level[.@target_pid] > 1) mes " - Nivel requerido: " + $@party_min_level[.@target_pid]; if (.party_filter_type$[.@target_pid] == "role") { mes " - Roles: " + replacestr($@party_filter_values$[.@target_pid], ",", " / "); } else if (.party_filter_type$[.@target_pid] == "class") { if ($@party_filter_values$[.@target_pid] == "cualquier") { mes " - Clasess: Cualquier clase"; } else { explode(.@class_array$, $@party_filter_values$[.@target_pid], ","); .@class_str$ = ""; for (.@i = 0; .@i < getarraysize(.@class_array$); .@i++) { .@class_str$ += (.@class_str$ == "" ? "" : ", ") + jobname(atoi(.@class_array$[.@i])); } mes "Clases: " + .@class_str$; } } else { mes " - Sin restricciones de clase."; } if (BaseLevel < $@party_min_level[.@target_pid]) { mes "Pero... no tengo el nivel suficiente."; close; } if (.party_filter_type$[.@target_pid] == "class") { if ($@party_filter_values$[.@target_pid] != "cualquier") { .@my_class$ = "," + Class + ","; .@allowed$ = "," + $@party_filter_values$[.@target_pid] + ","; if (!compare(.@allowed$, .@my_class$)) { mes "Mi clase no está permitida. Qué lástima."; close; } } } else if (.party_filter_type$[.@target_pid] == "role") { if ($@party_filter_values$[.@target_pid] == "Curador") { if (!(BaseJob == Job_Acolyte || BaseJob == Job_Priest)) { mes "Mi clase no corresponde al rol que esta party necesita."; close; } } } if (getcharid(1)) { mes "Ya pertenezco a una party. No puedo unirme a otra."; close; } mes "Doy un paso al frente, decidido a unirme..."; .@result = party_addmember(.@target_pid, getcharid(0)); if (.@result == 1) mes "Ahora formo parte de esa party."; else if (.@result == -4) mes "El grupo está lleno"; else mes "Algo falló."; close; case 3: close; } OnInit: deletearray $@party_ids[0]; end; }1 point
-
Here's the file I downloaded last time ! For reference, it's not compatible with the May version. ExtendCashShopPreview.1337proxy.13371 point
-
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
-
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
-
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
-
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
-
1 point
-
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 amm0nition1 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
-
you may change the default value of your SQL table. ...datetime NOT NULL DEFAULT '0000-00-00 00:00:00',1 point