Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 06/11/25 in all areas

  1. Version 1.0.0

    205 downloads

    Since someone is claiming that they are the only one who has the right to come up with this idea, and it's become an issue - to be honest, I didn't know that something like this had already been released here. So, I've decided to share this work for free so that everyone can benefit from it. Just to clarify: this is entirely my own work. I didn’t copy any code from the person claiming they are the only one entitled to ideas like this. As for the monster GRF, I manually edited each one to extract only the dead sprite actions. Whenever an MVP dies on the map, a tombstone will appear at the spot where it died — but instead of just saying "Tomb", it now shows the MVP’s name like **"Phreeoni"**, **"Baphomet"**, or **"Ifrit"** Instantly see which MVP was killed Great for MVP hunters and competitive players Makes the game world feel more immersive Works with any MVP across the server Example: When **Phreeoni** is defeated, a tombstone labeled **"Phreeoni"** appears where it died — no more guessing!
    Free
    14 points
  2. This map belongs to the game universe expansion series. Made with attention to detail and inspired by the original! .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. um_fild05 Now you can visit the new part of the Hoomga Jungle! The map is a continuation of the Umbala Field 04 location and repeats its main features. The landscape also follows the outlines of the original art design of the location on the world map. The map seamlessly connects with neighboring levels. This map is also supposed to be the home of the MVP Wootan Defender, who was never featured in the original game. However, an ancient version of this MVP was added as a boss in Illusion of Luanda, but for some reason lived in the Comodo North Cave mixed with other monsters and even with another MVP Ancient Tao Gunka instead of in the forest area. Now you can fight its regular version in its native jungle zone and get a unique custom item. I asked the artist to draw a card and a custom shield for this MVP. MVP Wootan Defender MVP Wootan Defender Card Special Loot Wootan's Token - ID 25633 Wootan Defender's Shield Piece - ID 25634 Wootan Defender's Shield [1] - Custom All images and sprites can be downloaded in this topic: https://rathena.org/board/files/file/3844-w0w_custom_collection/ or here: Wootan Defender Card+Shield.zip P.S. You may not have noticed in the video but all the gorillas are doubled in size. In their normal size they look very weak the same height as the player. But they have good pixel art that does not lose its beauty when enlarged. It also allows you to double their HP stats and experience to make their farming at least a little more interesting. P.S.S. Also fixed the neighboring location um_fild04: 1) Removed official inaccessible gat points 168,137 and 185,138 2) Added seamless passage to the new location um_fild05 Please rate it if the map is good enough ~~ This map can be downloaded here https://rathena.org/board/files/file/4487-w0w_map_collection/
    8 points
  3. As shown on the screen, the fix files are clean, unpacked client files. You can apply WARP patches using these files, but some patches may not be supported. In such cases, you must modify the client manually — please do not contact me for support regarding this. Commercial use is strictly prohibited. Example:As of the 2023-10-xx client, WARP can no longer patch the clientinfo.xml file. You will need to modify it manually. Also, CPS is not included in clients released after 2024-05-16. In addition: 2023-12-06_Ragexe_1701399778_patched.exe (Restore clientinfo.xml, externalsettings Korea patch) — This file includes additional patches that I applied manually. 2025-05-08_Ragexe.exe and 2025-06-04_Ragexe.exe — These files have also been modified with additional patches and are distributed in a compressed state. They cannot be edited further.
    5 points
  4. Hello guys, This is my very first map created for Ragnarok Online. I've decided to create the latest DotA 2 map since there's really no updated version of a DotA 2 map elsewhere (at least when I searched ). This map is perfect as a battleground map or for any team-based PvP. It needs a custom script capable of controlling battleground units and events if you really want to mimic MOBA gameplay though. Hope you like it!
    4 points
  5. KRO : https://github.com/hiphop9/ROClient_en 2025-06-04_Ragexe.exe -PATH- @ Bug Fix(Recommended) Add Close Button Custom Window Title Disable 1rag1 Params(Recommended) Disalbe Filename Check(Recommended) Disable Help Message 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 Skip License Screen Translations client EnableWho EnableShowName AlwaysAscii CallKoreaClientInfo PlainTextDesc HideBuildInfo TranslateClient NoGGuard CustomItemInfoLub CustomAchieveLub CustomTownInfoLub CustomTipboxLub Customspopuplub CustomMapInfoLub CustomOngQuestInfoLub CustomRcmdQuestInfoLub Customachievementslub CustomQuestClassificationInfolub NoNagle OpenToServiceSelect GuildBrackets NoGravityAds NoGravityLogo FixLatestNCWin Restore model culling Headgears viewID 64000 ExtendCashShopPreview EnableProxySupport IncreaseMapQuality rAthena 2025-06-14 (66a4a2ab68ce85d781514c3c000433f981d6842f) https://github.com/hiphop9/rathena20250614 - emotion ui update for 20230925 clients - 20231220+ CLIENT bodystylefix - macro user report packet 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!!
    3 points
  6. Within this few days I've tried to see how packageitem.lub structure and is it possible to create generator for that. Yes, possible but I wont share the generator here, because Ive tried for renewal it takes around 15 minutes or more because of too much of groups in item_group_db (2777 groups) and also a lot of items. Btw, I'm using latest rAthena and latest ROTP by Chris to date (24 June 2025), maybe ill update this post if needed but since its for Pre-RE, I don't think there will be much changes then. I've tried to use AI to analyze data generated from my generator with ROTP latest packageitem.lub and below is the result for Renewal data. As you can see, the generator covered 96.4% packages for Renewal compare to latest packageitem ROTP and 86 of missing packages is because of unknown itemID and non existing group. I need to filter some group in rAthena item_group_db.yml because of some groups thats are not even in official packageitem.lub, so thats why the new packages is 0. There are 292 functionally different because of different prob/rates and also the item data inside that specific group compare to official one. Below is latest packageitem.lub from ROTP as default which is Renewal. And below is the generated one for Pre-Renewal by using ROTP Pre-RE iteminfo.lua data Since there isn't any released as I'm aware of for Pre-Renewal packageitem.lub so I'll share it here and you could try it. The data is generated by using ROTP Pre-Renewal iteminfo.lua and rAthena Pre-Renewal files. If the probability info didn't shown, recheck packageitem.lub does it have that itemID existing, and if yes but still not showing, try to add the itemID in the list in simplecashshopscript.lub. If there is any inaccuracy compare to rAthena you can let me know and I'll try to update it ASAP. packageitem.lubsimplecashshopscript.lub
    3 points
  7. Hexadecimal = BB8 (Decimal = 3000) max 64000 = FA00
    3 points
  8. This feature enhances the standard MVP death mechanic by replacing the generic "Tomb" label with the **actual name of the MVP** that was defeated. When an MVP dies on the map, a tombstone NPC appears at the exact spot of death, and instead of showing a generic label, it dynamically displays the **name of the boss** (e.g., "Phreeoni", "Ifrit", "Baphomet"). **How it works for players:** - When an MVP is killed, a tombstone spawns on the map. - The tomb now shows the name of the MVP, not just “Tomb”. - This helps MVP hunters and players identify what boss was recently defeated, even if they arrived late. - It improves both visual clarity and overall immersion in the game. I created a demo video showcasing how this behaves in-game. **Note to fellow developers:** After completing this feature, I discovered that someone had already created a similar concept before me. However, I had no knowledge of that existing implementation during development and did not reference or use any of their code. This version was built independently from scratch based on how I personally wanted it to function. While the **concept is similar**, the **implementation and behavior may differ** between our versions. I still believe this showcases a useful quality-of-life addition for MVP-related mechanics, and I hope it can serve as inspiration or a base for others who wish to implement their own version. Feel free to check out the demo video and let me know your thoughts!
    3 points
  9. Hello Ziu, I have just logged in as well after hibernating for several years
    2 points
  10. The 2023+ clients use new job IDs for the jRO costumes: JOB_RUNE_KNIGHT_2ND = 4332, JOB_MECHANIC_2ND = 4333, JOB_GUILLOTINE_CROSS_2ND = 4334, JOB_WARLOCK_2ND = 4335, JOB_ARCHBISHOP_2ND = 4336, JOB_RANGER_2ND = 4337, JOB_ROYAL_GUARD_2ND = 4338, JOB_GENETIC_2ND = 4339, JOB_SHADOW_CHASER_2ND = 4340, JOB_SORCERER_2ND = 4341, JOB_SURA_2ND = 4342, JOB_MINSTREL_2ND = 4343, JOB_WANDERER_2ND = 4344, You need to add them in the source. Open file \src\common\mmo.hpp. Find JOB_SKY_EMPEROR2 = 4316, then add the following code below it: JOB_RUNE_KNIGHT_2ND = 4332, JOB_MECHANIC_2ND, JOB_GUILLOTINE_CROSS_2ND, JOB_WARLOCK_2ND, JOB_ARCHBISHOP_2ND, JOB_RANGER_2ND, JOB_ROYAL_GUARD_2ND, JOB_GENETIC_2ND, JOB_SHADOW_CHASER_2ND, JOB_SORCERER_2ND, JOB_SURA_2ND, JOB_MINSTREL_2ND, JOB_WANDERER_2ND, Save the file then recompile the server. I've updated the example script for you: // callfunc "F_JobSuit",<Job ID>; //Change to specific sprite // callfunc "F_JobSuit",-1; //Change to 2nd job // callfunc "F_JobSuit",-2; //Change to transcendent 2nd job // callfunc "F_JobSuit",-3; //Change to 3rd job // callfunc "F_JobSuit",-4; //Change to 4th job // callfunc "F_JobSuit",-5; //Change to alternative third class costume // callfunc "F_JobSuit"; //Return to default sprite function script F_JobSuit { .@block_expanded_jobs = false; //Disable changing for expanded job player (true/false) if (getargcount() == 0) { if (PACKETVER >= 20231220) setlook LOOK_BODY2,Class; else if (JobSuit_id > 4331 && JobSuit_id < 4345) setlook LOOK_BODY2,0; else changebase Class; JobSuit_active = false; JobSuit_id = 0; end; } if (getarg(0) > -1) { if (jobname(getarg(0)) == "Unknown Job") { dispbottom "Unknown Job"; end; } callsub S_OK,getarg(0),1; } if (.@block_expanded_jobs && (BaseClass == Job_Novice || BaseClass == Job_Summoner || BaseClass == Job_Gunslinger || BaseClass == Job_Ninja || BaseClass == Job_Taekwon)) end; if (BaseClass == Job_Summoner) { if (Upper) callsub S_OK,Job_Summoner; else callsub S_OK,Job_Spirit_Handler; } else if (BaseClass == Job_Gunslinger) { switch(getarg(0)) { case -1: callsub S_OK,Job_Gunslinger; case -2: case -3: callsub S_OK,Job_Rebellion; case -4: case -5: default: callsub S_OK,Job_Night_Watch; } } else if (BaseClass == Job_Ninja) { switch(getarg(0)) { case -1: callsub S_OK,Job_Ninja; case -2: case -3: callsub S_OK,(Sex ? Job_Kagerou : Job_Oboro); case -4: case -5: default: callsub S_OK,(Sex ? Job_Shinkiro : Job_Shiranui); } } else if (BaseClass == Job_Novice) { switch(getarg(0)) { case -1: callsub S_OK,Job_Novice,1; case -2: case -3: callsub S_OK,Job_Super_Novice; case -4: case -5: default: callsub S_OK,Job_Hyper_Novice; } } else if (BaseJob == Job_Soul_Linker) { switch(getarg(0)) { case -1: case -2: callsub S_OK,Job_Soul_Linker; case -3: callsub S_OK,Job_Soul_Reaper; case -4: case -5: default: callsub S_OK,Job_Soul_Ascetic; } } else if (BaseJob == Job_Star_Gladiator) { switch(getarg(0)) { case -1: callsub S_OK,Job_Taekwon; case -2: callsub S_OK,Job_Star_Gladiator; case -3: callsub S_OK,Job_Star_Emperor; case -4: case -5: default: callsub S_OK,Job_Sky_Emperor; } } switch(getarg(0)) { case -1: callsub S_OK,roclass(eaclass()&EAJ_UPPERMASK); case -2: callsub S_OK,roclass(eaclass()&EAJ_UPPERMASK|EAJL_UPPER); case -3: callsub S_OK,roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); case -4: .@job = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); callsub S_OK,roclass(eaclass(.@job)|EAJL_FOURTH|EAJL_UPPER); case -5: .@job = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD); if (.@job > 0) callsub S_OK,roclass(eaclass(.@job)|EAJL_FOURTH|EAJL_UPPER)+80; } S_OK: .@c = getarg(0); if (.@c < 1 && getarg(1,0) == 0) end; if (PACKETVER >= 20231220) setlook LOOK_BODY2,.@c; else if (.@c > 4331 && .@c < 4345) setlook LOOK_BODY2,1; else changebase .@c; JobSuit_active = true; JobSuit_id = .@c; end; } - script #JobSuitOnLogin -1,{ OnPCLoginEvent: if (JobSuit_active) F_JobSuit(JobSuit_id); end; }
    2 points
  11. Hello, I don't see the variable being set in your item script. You can use OnPCLoginEvent on a NPC to reapply the appearance. Replace changebase with setlook LOOK_BODY2. Example using a function: Script: | callfunc "F_JobSuit"; UnEquipScript: | callfunc "F_JobSuit",-1; // callfunc "F_JobSuit"; //Change to evolution sprite // callfunc "F_JobSuit",<Job ID>; //Change to specific sprite // callfunc "F_JobSuit",-1; //Return to default sprite function script F_JobSuit { if (getarg(0,0) != -1) { if (jobname(getarg(0,-1)) != "Unknown Job") .@c = getarg(0); else if (BaseJob == Job_Priest) .@c = JOB_ARCH_BISHOP; else if (BaseJob == Job_Wizard) .@c = JOB_WARLOCK; else if (BaseJob == Job_Blacksmith) .@c = JOB_MECHANIC; else if (BaseJob == Job_Hunter) .@c = JOB_RANGER; else if (BaseJob == Job_Assassin) .@c = JOB_GUILLOTINE_CROSS; else if (BaseJob == Job_Crusader) .@c = JOB_ROYAL_GUARD; else if (BaseJob == Job_Monk) .@c = JOB_SURA; else if (BaseJob == Job_Sage) .@c = JOB_SORCERER; else if (BaseJob == Job_Rogue) .@c = JOB_SHADOW_CHASER; else if (BaseJob == Job_Alchemist) .@c = JOB_GENETIC; else if (BaseJob == Job_Bard) .@c = JOB_MINSTREL; else if (BaseJob == Job_Dancer) .@c = JOB_WANDERER; if (PACKETVER >= 20231220) setlook LOOK_BODY2,.@c; else changebase .@c; JobSuit_active = true; JobSuit_id = .@c; end; } if (PACKETVER >= 20231220) setlook LOOK_BODY2,Class; else changebase Class; JobSuit_active = false; JobSuit_id = 0; end; } - script #JobSuitOnLogin -1,{ OnPCLoginEvent: if (JobSuit_active) F_JobSuit(JobSuit_id); end; }
    2 points
  12. We added: -> Ripple XRP to payments gateway -> Solana to payments gateway get the updates here https://github.com/xpayapi/FluxCP-Addons If you have any inquiries, please let us know
    2 points
  13. Los scripts de Euphy y tr0n usan variables con OnNPCKillEvent y el color del texto es fijo. Para mostrar los números de muertes en color amarillo, necesitarás usar el sistema oficial de misiones (setquest / checkquest / erasequest), donde cada muerte cuenta para los miembros del grupo, pero la probabilidad siempre es del 100%. Para agregar una nueva misión personalizada, abre el archivo: import/quest_db.yml (o import/quest_db.txt si tu rAthena está desactualizado). Ejemplo: - Id: 7148 Title: The training course 'conquer the orc village!' - A real battle 1 Targets: - Mob: ORC_BABY Count: 10 Y el archivo en tu carpeta del cliente: System/OngoingQuestInfoList (o data/questid2display.txt si tu ejecutable del cliente es antiguo). Ejemplo: [7148] = { Title = "¡Conquista el Pueblo de los Orcos!", Description = { "Pueden ser crías, pero se convierten en feroces Guerreros orco. Caza 10 Bebés orco en el Pueblo de los Orcos." }, Summary = "" }, Luego, usa el ID de la misión en el NPC. Ejemplo: prontera,150,150,4 script Cazador Simple 123,{ if(checkquest(7148) == -1) { // Misión no iniciada mes "[Cazador Simple]"; mes "¡Necesito ayuda cazando monstruos!"; mes "¿Puedes cazar 10 Bebés orco para mí?"; next; if(select("Aceptar:Rechazar") == 1) { mes "[Cazador Simple]"; mes "¡Genial! Regresa cuando hayas terminado."; setquest 7148; close; } mes "[Cazador Simple]"; mes "Tal vez la próxima vez entonces."; close; } else if(checkquest(7148,HUNTING) == 2) { // Caza completada mes "[Cazador Simple]"; mes "¡Excelente trabajo! Aquí tienes tu recompensa."; getexp 5000,0; erasequest 7148; close; } else if(checkquest(7148) == 1) { // Misión activa pero no completada mes "[Cazador Simple]"; mes "¡Sigue cazando! Aún no has terminado."; close; } } moc_para01,39,36,5 script Gestor de Misiones#2024 732,{ mes "[^FF7700Gestor de Misiones^000000]"; mes "Hola, por favor selecciona una misión"; while (true) { switch(select((.hunting)?" ~ Misión de Cacería":"", (.collection)?" ~ Misión de Recolección":"")) { case 1: set .@huntmenu$, ""; for(set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1){ if (.@i) set .@huntmenu$,.@huntmenu$ + ":"; if (gettimetick(2) < getd((.@i+1) + "_hunting_delay")) .@c$ = "^808080"; else .@c$ = "^000000"; set .@huntmenu$, .@huntmenu$ + .@c$ + "[Nv " + getd("." +(.@i+1)+"_huntingmin") + "-" + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$"); } set @selection,select(.@huntmenu$); clear; if (.quest_repeat == true) { if(gettimetick(2) < getd(@selection + "_hunting_delay")){ mes "[^FF7700Gestor de Misiones^000000]"; mes "¡Lo siento, debes esperar 24 horas antes de repetir esta misión!"; mes "Por favor espera hasta ^0000FF"+Time2Str(getd(@selection + "_hunting_delay"))+"^000000."; close; } } else { if (getd(@selection + "_hunting_repeat") == true){ mes "[^FF7700Gestor de Misiones^000000]"; mes "Ya completaste esta misión."; mes "Por favor elige otra."; close; } } mes "[^FF7700Gestor de Misiones^000000]"; .@size = getarraysize(getd("."+ @selection + "_huntingmob")); if (.@size == 2) mes "Por favor caza y elimina a ^FF0000"+getd("."+@selection+"_huntingmob[1]")+" " + getmonsterinfo(getd("."+@selection+"_huntingmob[0]"),MOB_NAME)+"^000000."; else { mes "Por favor caza y elimina los siguientes monstruos:"; for(set .@j, 0; .@j < .@size; set .@j,.@j+2) mes "- ^FF0000"+getd("."+@selection+"_huntingmob["+(.@j+1)+"]")+" " + getmonsterinfo(getd("."+@selection+"_huntingmob["+.@j+"]"),MOB_NAME)+"^000000"; } next; mes "[^FF7700Gestor de Misiones^000000]"; mes "Recompensas:"; if (getd("." +@selection+"_huntingexp[0]")) mes "^0000FF" + F_InsertComma(getd("." +@selection+"_huntingexp[0]"))+" EXP Base^000000"; if (getd("." +@selection+"_huntingexp[1]")) mes "^0000FF" + F_InsertComma(getd("." +@selection+"_huntingexp[1]"))+" EXP de Clase^000000"; if (getd("." +@selection+"_huntingzeny")) mes "Zeny: ^0000FF"+getd("." +@selection+"_huntingzeny")+"^000000"; if (getd("." +@selection+"_huntingprize[0]")) { for(.@i = 0; .@i < getarraysize(getd("." +@selection+"_huntingprize")); .@i++) mes getd("." +@selection+"_huntingamount") + " " + getitemname((getd("." +@selection+"_huntingprize["+.@i+"]"))); } switch(select("- Aceptar Misión", "- Entregar Misión Completada", "- Cancelar")) { case 1: clear; if (isbegin_quest(getd("." + @selection+"_huntingid"))) goto havetaken; if (BaseLevel >= getd("." +@selection+"_huntingmin") && BaseLevel <= getd("." +@selection+"_huntingmax")){ mes "[^FF7700Gestor de Misiones^000000]"; mes "Misión aceptada."; set h_run, true; set currentquest$, @selection; setquest getd("." + @selection+"_huntingid"); close; } else{ mes "[^FF7700Gestor de Misiones^000000]"; mes "No cumples con el nivel requerido para esta misión."; close; } case 2: clear; switch(checkquest(getd("." +@selection+"_huntingid"),HUNTING)) { case -1: goto nottaken; case 2: mes "[^FF7700Gestor de Misiones^000000]"; mes "¡Bien hecho!"; mes "Aquí están tus recompensas."; if(getd("." +@selection+"_huntingprize[0]")) { for(.@i = 0; .@i < getarraysize(getd("." +@selection+"_huntingprize")); .@i++) getitem(getd("." +@selection+"_huntingprize["+.@i+"]"),getd("." +@selection+"_huntingamount")); } set Zeny, Zeny+getd("." +@selection+"_huntingzeny"); getexp getd("." +@selection+"_huntingexp[0]"),getd("." +@selection+"_huntingexp[1]"); erasequest getd("." +@selection+"_huntingid"); setd(@selection + "_hunting_delay"),gettimetick(2)+.quest_delay; setd(@selection + "_hunting_repeat"),true; set @selection, ""; set h_run, false; end; default: mes "[^FF7700Gestor de Misiones^000000]"; mes "Aún no has derrotado a todos los monstruos."; close; } case 3: end; } case 2: clear; mes "[^FF7700Gestor de Misiones^000000]"; mes "El gremio siempre necesita más recursos."; mes "Por favor, selecciona el área en la que deseas ayudar hoy."; set .@collectmenu$, ""; for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1){ if (.@i) set .@collectmenu$,.@collectmenu$ + ":"; if (gettimetick(2) < getd((.@i+1) + "_collection_delay")) .@c$ = "^808080"; else .@c$ = "^000000"; set .@collectmenu$, .@collectmenu$ + .@c$ + "[Nv " + getd("." +(.@i+1)+"_collectionmin") + "-" + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$"); } set @selection,select(.@collectmenu$); clear; if(.quest_repeat == true){ if(gettimetick(2) < getd(@selection + "_collection_delay")){ mes "[^FF7700Gestor de Misiones^000000]"; mes "¡Lo siento, debes esperar 24 horas antes de repetir esta misión!"; mes "Por favor espera hasta ^0000FF"+Time2Str(getd(@selection + "_collection_delay"))+"^000000."; close; } } else{ if(getd(@selection + "_collection_repeat") == true){ mes "[^FF7700Gestor de Misiones^000000]"; mes "Ya completaste esta misión."; mes "Por favor elige otra."; close; } } mes "[^FF7700Gestor de Misiones^000000]"; mes "Necesitamos lo siguiente:"; set .@size, getarraysize(getd("."+ @selection + "_collectionitem")); for( set .@j, 0; .@j < .@size; set .@j,.@j+2){ .@a = countitem(getd("."+@selection+"_collectionitem["+.@j+"]")); if (.@a < getd("."+@selection+"_collectionitem["+(.@j+1)+"]")) .@c$ = "^FF0000"; else .@c$ = ""; mes .@c$ + getd("."+@selection+"_collectionitem["+(.@j+1)+"]") + " " + getitemname(getd("."+@selection+"_collectionitem["+.@j+"]")) + ": " + "(" + .@a + "/"+getd("."+@selection+"_collectionitem["+(.@j+1)+"]") + ")^000000"; } next; mes "[^FF7700Gestor de Misiones^000000]"; mes "Recompensa:"; if (getd("." +@selection+"_collectionexp["+0+"]")) mes "^0000FF" + F_InsertComma(getd("." +@selection+"_collectionexp["+0+"]")) + " EXP Base^000000"; if (getd("." +@selection+"_collectionexp["+1+"]")) mes "^0000FF" + F_InsertComma(getd("." +@selection+"_collectionexp["+1+"]")) + " EXP de Clase^000000"; if (getd("." +@selection+"_collectionzeny")) mes "Zeny: ^0000FF"+getd("." +@selection+"_collectionzeny")+"^000000"; if (getd("." +@selection+"_collectionprize[0]")) { for(.@i = 0; .@i < getarraysize(getd("." +@selection+"_collectionprize")); .@i++) mes getd("." +@selection+"_collectionamount") + " " + getitemname((getd("." +@selection+"_collectionprize["+.@i+"]"))); } if (BaseLevel < getd("." +@selection+"_collectionmin") || BaseLevel > getd("." +@selection+"_collectionmax")) { next; mes "[^FF7700Gestor de Misiones^000000]"; mes "No cumples con el nivel requerido para esta misión."; } else { if(select("- Entregar objetos", "- Volver") == 1) { clear; set .@size, getarraysize(getd("."+@selection + "_collectionitem")); for( set .@k,0; .@k < .@size; set .@k,.@k+2) { if(countitem(getd("."+@selection+"_collectionitem["+.@k+"]"))>=getd("."+@selection+"_collectionitem["+(.@k+1)+"]")){ set .@checkitem,.@checkitem+2; } } if(.@checkitem<.@size){ mes "[^FF7700Gestor de Misiones^000000]"; mes "No tienes todos los objetos necesarios."; mes F_Rand("¿Olvidaste el objeto en el almacenamiento?","Tal vez intenta con otra misión.",""); break; } for( set .@delcount,0; .@delcount < .@size; set .@delcount,.@delcount+2){ delitem getd("."+@selection+"_collectionitem["+.@delcount+"]"),getd("."+@selection+"_collectionitem["+(.@delcount+1)+"]"); } mes "[^FF7700Gestor de Misiones^000000]"; mes "¡Bien hecho!"; mes "Aquí están tus recompensas."; if(getd("." +@selection+"_collectionprize[0]")) { for(.@i = 0; .@i < getarraysize(getd("." +@selection+"_collectionprize")); .@i++) getitem(getd("." +@selection+"_collectionprize["+.@i+"]"),getd("." +@selection+"_collectionamount")); } set Zeny,Zeny+getd("." +@selection+"_collectionzeny"); getexp getd("." +@selection+"_collectionexp["+0+"]"),getd("." +@selection+"_collectionexp["+1+"]"); setd(@selection + "_collection_delay"),gettimetick(2)+.quest_delay; setd(@selection + "_collection_repeat"),true; set @selection, ""; close; } else { clear; mes "[^FF7700Gestor de Misiones^000000]"; mes F_Rand("¿No fue de tu agrado?","¿Solo estás mirando?","¡Vamos a encontrar la misión adecuada para ti!"); } } break; case 3: close; } if (rand(3) == 1) mes "¿Qué tal una misión de " + F_Rand("cacería","recolección","aventura","ayuda") + " hoy?"; } OnInit: function AddCollection; function AddHunting; questinfo QTYPE_DAILYQUEST, QMARK_NONE; //Activate/Deactivate quest categories (true/1 - activated, false/0 - deactivated) set .collection, true; set .hunting, true; //Quest Delay (seconds) //24 hours = 86400 seconds set .quest_delay, 120; //Activate/Deactivate repeatable quests (true/1 - activated, false/0 - deactivated) set .quest_repeat, true; //Activate/Deactivate party support (true/1 - activated, false/0 - deactivated) set .party_support, true; //Max range for party support (+- x & y coordinations) set .party_range, 25; //Checks if quests are loaded (prevents out of index) if(.questsloaded==true) end; set .questsloaded, true; //Add Hunting Quests here (You can add as many required mobs as you want) //AddHunting("<Quest Name>",<Quest ID>,<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...); AddHunting("Prontera Field 01",11340,1,21,"608|609|501|502",1,0,2100,2100,1063,10); AddHunting("Prontera Field 02",11341,1,51,"610",1,0,27300,14700,1063,3,1113,3,1031,3); AddHunting("Descendencia de los orcos",7148,30,99,"610",1,0,27300,14700,1686,10); //Add Collection Quests here (You can add as many required items as you want) //AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...); AddCollection("Foliage Gathering",1,11,"502",1,0,2100,2100,705,10,707,10,7100,10,706,1); AddCollection("Herb Gathering",1,21,"611|612|613|614",1,0,2100,2100,507,8,508,8,509,8,510,8,511,8,621,3); AddCollection("Flower Gathering",1,31,"607",1,0,2100,2100,704,10,708,10,703,10,709,10); AddCollection("Vegetable Gathering",1,41,"607",1,0,2100,2100,515,10,516,10,535,10); end; function AddCollection{ set .collectionquestcount,.collectionquestcount+1; setd ("." +.collectionquestcount+"_collectionname$", getarg(0)); setd ("." +.collectionquestcount+"_collectionmin", getarg(1)); setd ("." +.collectionquestcount+"_collectionmax", getarg(2)); explode(getd(".@" +.collectionquestcount+"_collectionprize$"), getarg(3) + "", "|"); for(.@i = 0; .@i < getarraysize(getd(".@" +.collectionquestcount+"_collectionprize$")); .@i++) setd ("."+.collectionquestcount+"_collectionprize["+.@i+"]",atoi(getd(".@" +.collectionquestcount+"_collectionprize$["+.@i+"]"))); //setd ("." +.collectionquestcount+"_collectionprize", getarg(3)); setd ("." +.collectionquestcount+"_collectionamount", getarg(4)); setd ("." +.collectionquestcount+"_collectionzeny", getarg(5)); set .@argcount, 6; set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp")); setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount)); setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionitem")); while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){ setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount)); setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount,.@argcount+2; set .@size, .@size+2; } return; } function AddHunting{ set .huntingquestcount,.huntingquestcount+1; setd ("." +.huntingquestcount+"_huntingname$", getarg(0)); setd ("." +.huntingquestcount+"_huntingid", getarg(1)); setd ("." +.huntingquestcount+"_huntingmin", getarg(2)); setd ("." +.huntingquestcount+"_huntingmax", getarg(3)); explode(getd(".@" +.huntingquestcount+"_huntingprize$"), getarg(4) + "", "|"); for(.@i = 0; .@i < getarraysize(getd(".@" +.huntingquestcount+"_huntingprize$")); .@i++) setd ("."+.huntingquestcount+"_huntingprize["+.@i+"]",atoi(getd(".@" +.huntingquestcount+"_huntingprize$["+.@i+"]"))); setd ("." +.huntingquestcount+"_huntingamount", getarg(5)); setd ("." +.huntingquestcount+"_huntingzeny", getarg(6)); set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp")); set .@argcount, 7; setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount)); setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob")); while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1){ setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount)); setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1)); set .@argcount, .@argcount+2; set .@size, .@size+2; } return; } havetaken: clear; mes "[^FF7700Gestor de Misiones^000000]"; mes "Lo siento, ya tienes esta misión activa."; close; nottaken: clear; mes "[^FF7700Gestor de Misiones^000000]"; mes "Parece que aún no has aceptado esta misión."; close; }
    2 points
  14. Hey everyone, I wanted to showcase a custom MVP mechanic system I've been developing for Ragnarok Online using rAthena. The idea is to bring more dynamic, thematic, and visually appealing mechanics to MVP encounters — moving beyond the usual tank-and-spank format. DISCORD Takechiii#8303 DISCORD Takechiii#8303 🛠 What does this system do? Allows MVPs to execute custom attack patterns on specific map coordinates. Works on an 11x11 grid centered around the MVP (6x6 coordinate) to trigger precise damage zones. Each MVP’s behavior can be thematically tailored (e.g., feline patterns for Moonlight Flower, curses for Osiris, etc.). Easily reusable and expandable for other bosses or PvE events. This system is inspired by raid-style battles. It’s ideal for: Custom instances MVP events with multiple phases Progressive PvE challenges I’m still refining the system and adding new mechanics and visual effects. I’m open to feedback, suggestions, or even collaborations!
    2 points
  15. Version 1.0.0

    839 downloads

    The size of attachments (30mb) on rAthena does not allow to add map resources. You can find the full materials here: https://mega.nz/folder/8atXmYgC#yJEL_ssWj8D8XwmpgInYiQ Map list: um_fild05 https://rathena.org/board/topic/145721-showcase-umbala-field-05/ ve_fild08 https://rathena.org/board/topic/144005-showcase-veins-field-08/ mosk_dun04 https://rathena.org/board/topic/143959-showcase-moscovia-dungeon-lvl-4/ ttmoon https://rathena.org/board/topic/116150-showcase-ttmoon/ navayo (+nav_beach, nav_in01, nav_in02) https://rathena.org/board/topic/116200-showcase-navayo/ anrydrago https://rathena.org/board/topic/124265-showcase-miniquest-anry-dragon/ x_base https://rathena.org/board/topic/140494-showcase-x-base/ crimea https://rathena.org/board/topic/132870-showcase-crimea/ barcode https://rathena.org/board/topic/116040-showcase-barcode/ ice2xlake https://rathena.org/board/topic/124194-showcase-ice-twice-lake/ lv_beach https://rathena.org/board/topic/116553-showcase-love-beach/ yavin1b https://rathena.org/board/topic/116300-showcase-yavin1b/ mystvil https://rathena.org/board/topic/117187-showcase-mystical-vil/ crystal https://rathena.org/board/topic/116079-showcase-crystal/ 1@scp087 https://rathena.org/board/topic/116223-showcase-scp-087/ mag_dun03_ https://rathena.org/board/topic/127185-showcase-magma-dungeon-lvl-3/ b_book(1,2,3,4) https://rathena.org/board/topic/116491-showcase-four-battle-books/ ~ Keep calm and use it on your server ~ ~ Don't claim my work as yours please and etc ~ ~ Any requests/reports - https://rathena.org/board/profile/47250-w0wzukubg/ Thanks, Zuku ~
    Free
    2 points
  16. Version 1.0.0

    170 downloads

    Author: Nyani Version 1.0 ---------------------------------------------- Features - Unlimited Chain Quest (Randomized Kill/Collection Quest) - Automatic Quest submission - unless Collection Quest (Must turn in) - Automatic Quest Acquisition - Does not repeat previous quest (shuffles the quest provided) - Cancel Current Quest (Must talk to NPC) - Monthly Ranking - Automated Monthly Reward distribution - Chance to obtain rewards for quest submissions - Milestone Rewards every 100 quests finished ---------------------------------------------- Changelogs v1.0 - Initial Release Notice: No support will be provided - unless it is a bug on the current script Config // ========================== // CONFIGURATION // ========================== // 0 = NPC Claim Mode, 1 = RoDEX Mode .reward_mode = 1; // Mob and kill amounts setarray .MobList[0], 1002,1004,1010; setarray .MobAmount[0], 30,40,50; setarray .ItemList[0], 705, // Orcish Voucher 1015, // Garlet 1021, // Tooth of Bat 719, // Bear’s Footskin 729, // Coal 744, // Witherless Rose 746, // Evil Horn 728, // Cyfar 938, // Golem Fragment 1058, // Cactus Needle 1009, // Claw of Desert Wolf 1038, // Emveretarcon 1042, // Worm Peelings 1044, // Flame Heart 1046, // Mystic Frozen 1047, // Great Nature 1049; // Red Blood setarray .ItemAmount[0], 5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5; // Completion reward pool setarray .RewardList[0], 607, 608, 609; setarray .RewardAmount[0], 1, 2, 1; // 100-completion reward pool setarray .SpecialRewardList[0], 7711, 7712; setarray .SpecialRewardAmount[0], 1, 1; // Monthly rewards for top 10 setarray .MonthlyReward[0], 607, 501, 504, 505, 506,909,910; setarray .MonthlyRewardAmount[0], 5, 2, 1, 3, 2,5,10; // Reward chance settings (1-10000 scale) .RewardChance = 10000; // 100% chance by default .SpecialRewardChance = 10000; // 100% for 100-completion Make sure to run SQL queries! No support provided, unless it's a bug in the script's core features.
    Free
    2 points
  17. Version 1.0.0

    426 downloads

    This script has NPC shops that sell all available costume items in rAthena as of March 2025. Costumes are categorized based on their equipment slot (Upper, Middle, Lower and Garment) and distributed across multiple shops (150 item per shop), Ensuring a well-organized and accessible shopping experience. The item list is filtered to include only valid costumes from latest iteminfo_EN.lua (English Translation), preventing missing or invalid entries. if you remove the commented shops it will sell all costumes available in the database (item_equip_db.yml). Ideal for servers looking to provide a complete costume collection for players!
    Free
    2 points
  18. It's been many years since I last visited the forum. After the death of eathena.ws (closed) a few years ago, TT thought rathena had also followed the same path. But I'm glad to know you're still alive. Niceeeeeeeeeeeeeeeeeee
    1 point
  19. Zuku, I'm not finding the files to download the custom sprites for the items of the MvP.. is there any link to them? Thanks in advance!
    1 point
  20. These are banners I've previously made for private RO servers I've played.
    1 point
  21. I think it should be working, as usual dont try it at town since maybe some dev might try at prontera/town with @pvp or something. U can try with the 4 example given (if im not mistaken) and see the damage. Try at any field/dungeon.
    1 point
  22. @Racaae puede hacer lo de @JASHI11?
    1 point
  23. con el permiso de no ofender al autor del script, quisiera que me ayudaran a colocarle un comando como el del archivo adjunto que seria fusión. - actualmente se le habla al npc pero quisiera que se le agregara la opción @claim, para tener dialogo desde el comando con el script de codigo de canje. - el archivo andjunto es otro script que ya tiene el @claim por lo cuál quienes me ayuden lo podrian sacar de allí, en realidad yo lo intente pero no lo logre. - si es posible también modificar la opción de que el administrador pueda crear la clave de código en el chat de gm. //--- Coupon NPC 1.1.2 -------------------------------------------// //----------------------------------------------------------------// // ttt 000000000 // ttt 000 000 // ttttttttt rrrrrrrrr 000 000 nnnnnnnnn // ttt rrr 000 000 nnn nnn // ttt rrr 000 000 nnn nnn // ttt rrr 000 000 nnn nnn // ttttt rrr 000000000 nnn nnn //----------------------------------------------------------------// //--- Changelogs: ------------------------------------------------// // 1.0.0 Release // 1.1.0 Added code type feature (normal|md5-hash) // 1.1.0 Added prevention for typing 0 into Item ID or Amount // 1.1.0 Added a feature for gms to see available coupons // 1.1.0 Minor bug fixes // 1.1.1 Fixed a bug that caused duplicating items // 1.1.2 Added announce if player got a item //----------------------------------------------------------------// //--- Main Script ------------------------------------------------// prontera,146,173,5 script Coupon Jack 807,{ //Set code type (0 = normal | 1 = MD5-Hash) set .code_type, 0; //Set code length set .code_length, 16; //Set Min. GM Level to add new coupons set .code_gmlvl, 99; setarray .coupon_code$[0],"a","b","c","d","e","f","g","h","i","j","k","l", "m","n","o","p","q","r","s","t","u","v","w","x", "y","z","0","1","2","3","4","5","6","7","8","9"; if(getgmlevel() >= .code_gmlvl) { mes "[^FF7700Coupon Jack^000000]"; mes "Welcome " + strcharinfo(0) + "."; next; switch(select("Add Coupon:Show Coupons:Exit")) { case 1: mes "[^FF7700Coupon Jack^000000]"; mes "Enter Item ID:"; input @coupon_item; next; if(@coupon_item <= 0) goto L_error; mes "[^FF7700Coupon Jack^000000]"; mes "Enter Item Amount:"; input @coupon_amount; next; if(@coupon_amount <= 0) goto L_error; for(set @i, 0; @i < .code_length; set @i, @i+1) { set @random_char, rand(0,(getarraysize(.coupon_code$)-1)); set @new_coupon$, @new_coupon$ + .coupon_code$[@random_char]; } if(.code_type==1) { set @new_coupon$, md5(@new_coupon$); } mes "[^FF7700Coupon Jack^000000]"; mes "Coupon added."; query_sql "INSERT INTO `coupons` (`code`, `item_id`, `item_amount`) VALUES ('"+@new_coupon$+"', "+@coupon_item+", "+@coupon_amount+")"; set @new_coupon$, ""; close; case 2: mes "[^FF7700Coupon Jack^000000]"; mes "--------------------------------"; query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; for(set @i, 0; @i < getarraysize(.@available_code$); set @i, @i+1) { mes "Item: " + getitemname(.@available_item[@i]); mes "Amount: " + .@available_amount[@i]; mes "Code: " + .@available_code$[@i]; mes "--------------------------------"; } close; case 3: mes "[^FF7700Coupon Jack^000000]"; mes "Have a nice day."; close; } } mes "[^FF7700Coupon Jack^000000]"; mes "Welcome to the Coupon Codes System. How can I help you?"; next; switch(Select("Submit Coupon:Exit")) { case 1: mes "[^FF7700Coupon Jack^000000]"; mes "Please enter your Coupon Code:"; input @my_code$; next; query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; for (set @i, 0; @i < getarraysize(.@available_code$); set @i, @i+1) { if(@my_code$==.@available_code$[@i]) { mes "[^FF7700Coupon Jack^000000]"; mes "You get ^0000FF" + getitemname(.@available_item[@i]) + " - " + .@available_amount[@i] + " ea.^000000"; query_sql "DELETE FROM `coupons` WHERE `code`='"+@my_code$+"'"; getitem .@available_item[@i],.@available_amount[@i]; //announce "Coupon Jack: " + strcharinfo(0) + " got " + .@available_amount[@i] + getitemname(.@available_item[@i]) + "(s).",0; close; } } mes "[^FF7700Coupon Jack^000000]"; mes "This Coupon Code doesn't exist."; close; case 2: mes "[^FF7700Coupon Jack^000000]"; mes "Have a nice day."; close; } L_error: mes "[^FF7700Coupon Jack^000000]"; mes "Invalid Number"; close; OnInit: query_sql "CREATE TABLE IF NOT EXISTS `coupons` (`code` TINYTEXT NOT NULL, `item_id` INT NOT NULL, `item_amount` INT NOT NULL, INDEX `code` (`code`(32)) ) ENGINE=MyISAM"; } npc de tron.txt npc_LIL TROLL.txt
    1 point
  24. Hi Guys, I'm passing to expose my map RPD - Raccoon City Police Department City Topic for detail: https://rathena.org/board/topic/122711-showcase-rpd-raccoon-city-police-department/ Topic for detail: https://rathena.org/board/topic/119586-showcase-survival-the-infected-city/ Summoner's Rift in Ragnarok Online Topic for detail: https://rathena.org/board/topic/115996-showcase-summoners-rift/ PVP map Topic for detail: https://rathena.org/board/topic/117391-showcase-map-the-sacred-blood/ Dark Endless Tower map Gaia Village Topic for detail: https://rathena.org/board/topic/117689-showcase-gaia-the-enchanted-village/ Gaia PVP Pokemon Map Cerulean Market Under Market DUEL PVP MAP New City - Center Karin Dome Enmadaioh Map Training Island - Start Map Lobby Map
    1 point
  25. View File MVP Tombstone Shows Boss Sprite and Name! Since someone is claiming that they are the only one who has the right to come up with this idea, and it's become an issue - to be honest, I didn't know that something like this had already been released here. So, I've decided to share this work for free so that everyone can benefit from it. Just to clarify: this is entirely my own work. I didn’t copy any code from the person claiming they are the only one entitled to ideas like this. As for the monster GRF, I manually edited each one to extract only the dead sprite actions. Whenever an MVP dies on the map, a tombstone will appear at the spot where it died — but instead of just saying "Tomb", it now shows the MVP’s name like **"Phreeoni"**, **"Baphomet"**, or **"Ifrit"** Instantly see which MVP was killed Great for MVP hunters and competitive players Makes the game world feel more immersive Works with any MVP across the server Example: When **Phreeoni** is defeated, a tombstone labeled **"Phreeoni"** appears where it died — no more guessing! Submitter Mice Submitted 06/18/25 Category Source Modifications Video https://youtu.be/RUD2VJigr88 Content Author xJayx - A.K.A. Mice  
    1 point
  26. This python script splits mob_db.yml into two files. mob_db_regular.yml containing only the regular map monsters. mob_db_extra.yml containing all other monsters (e.g., instance, event, script, non-spawning). Use at your own risk and do not claim this python script as yours. split.zip
    1 point
  27. I did some research on the Domovoi monster (ID 2336), it has an official hat and cape. Tare Brownie [1] - ID 18628 Boss Brownie Manteau [1] - ID 2592 Also, on some servers it is a boss and the cape description says that it belongs to the brownie boss. Therefore, I also attach a card in the MVP style. Of course you should significantly increase his stats. You can also make Domovoi a miniboss. As you can see, there are five chests under the big trees on the map (mosk_dun04) that belong to brownies, so you can add 5 Domovoi minibosses to the map. I also asked the artist to draw additional custom items, so now the Domovoi also has a staff with an apple on top and its fur for quests on his hat. Apple Staff Domovoi Fur All images and sprites can be downloaded in this topic: https://rathena.org/board/files/file/3844-w0w_custom_collection/ or here: Domovoi Card+Loot.zip
    1 point
  28. I have updated it to be compatible with the latest rAthena version https://github.com/hiphop9/rathena20250614
    1 point
  29. Oh I remembered it now. It was WARP patch something about party / friend windows, just go check it out you will get rid this crash for sure.
    1 point
  30. He eliminado los comandos mesitemlink e itemlink que no son compatibles con rAthena 2018. Por favor, intenta ahora. Si aún no funciona: ¿Aparece algún error o mensaje en la consola del map-server al cargar los scripts? ¿O al utilizar el comando? Si te funcionó, ¡dale un voto positivo al post, por favor! - script CouponNPC#main -1,{ S_Start: //Set code type (0 = normal | 1 = MD5-Hash) .code_type = 0; //Set code length .code_length = 12; //Set Min. GM Level to add new coupons .code_gmlvl = 99; setarray .coupon_code$[0],"A","B","C","D","E","F","G","H","I","J","K","L", "M","N","O","P","Q","R","S","T","U","V","W","X", "Y","Z","0","1","2","3","4","5","6","7","8","9"; if (getgmlevel() >= .code_gmlvl) { mes "[^FF7700Cupón Jack^000000]"; mes "Bienvenido GM " + strcharinfo(0) + "."; next; switch(select("Agregar cupón", "Mostrar cupones", "Menú normal", "Cancelar")) { case 1: do { mes "[^FF7700Cupón Jack^000000]"; mes "Ingrese el ID del objeto:"; input @coupon_item; if (getitemname(@coupon_item) == "null") { clear; mes "[^FF7700Cupón Jack^000000]"; mes "ID del objeto " + @coupon_item + " no encontrado."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } while (true); do { clear; mes "[^FF7700Cupón Jack^000000]"; mes getitemname(@coupon_item) + "?"; mes "Ingrese la cantidad del objeto:"; input @coupon_amount; if (@coupon_amount < 1 || @coupon_amount > 10000) { clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + " no es una cantidad válida."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } while (true); do { clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + "x " + getitemname(@coupon_item); mes "¿Cuántos cupones desea crear con estas mismas recompensas?"; next; if (select("Uno", "Ingresar cantidad") == 2) { input .@coupons; if (.@coupons < 1 || .@coupons > 50) { clear; mes "[^FF7700Cupón Jack^000000]"; mes .@coupons + " no es una cantidad válida."; if (select("Intentar de nuevo", "Cancelar") == 2) close; } else break; } else break; } while (true); if (.@coupons < 2) .@coupons = 1; do { switch(select("Generar código aleatorio", "Ingresar código manual", "Cancelar")) { case 1: .@random = true; break; case 2: clear; mes "[^FF7700Cupón Jack^000000]"; mes "Ingrese el cupón:"; mes "Longitud máxima: " + .code_length + " caracter(es)"; input .@input_name$; if(getstrlen(.@input_name$) < 0 || getstrlen(.@input_name$) > .code_length) { clear; mes "[^FF7700Cupón Jack^000000]"; mes "Inválido."; mes "El cupón debe tener al menos 1 caracter y un máximo de " + .code_length + " caracter(es)"; } else { for(.@i = 0; .@i < .@coupons; .@i++) .@new_coupon$[.@i] = .@input_name$; } break; case 3: close; } } while (.@new_coupon$[0] == "" && !.@random); if (.@random || .@coupons > 1) { .@length = .code_length; if (.@new_coupon$[0] != "") { .@endchar = getstrlen(.@new_coupon$[0]); .@length = maximum(.code_length,(.@endchar+4)); } for(.@i = 0; .@i < .@coupons; .@i++) { for(.@j = .@endchar; .@j < .@length; .@j++) { .@random_char = rand(getarraysize(.coupon_code$)); .@new_coupon$[.@i] += .coupon_code$[.@random_char]; } if (.code_type == 1) .@new_coupon$[.@i] = md5(.@new_coupon$[.@i]); } } clear; mes "[^FF7700Cupón Jack^000000]"; mes @coupon_amount + "x " + getitemname(@coupon_item); for(.@i = 0; .@i < .@coupons; .@i++) mes "Cupón" + (.@coupons>1?" "+(.@i+1):"") + ": ^EE8800" + .@new_coupon$[.@i] + "^000000"; if(select("^0000FFConfirmar " + F_InsertPlural(.@coupons,"cupón") + "^000000", "Cancelar") == 2) close; for(.@i = 0; .@i < .@coupons; .@i++) query_sql "INSERT INTO `coupons` (`code`, `item_id`, `item_amount`) VALUES ('" + escape_sql(.@new_coupon$[.@i]) + "', "+@coupon_item+", "+@coupon_amount+")"; clear; mes "[^FF7700Cupón Jack^000000]"; mes F_InsertPlural(.@coupons,"cupón") + " agregado."; for(.@i = 0; .@i < .@coupons; .@i++) mes "Cupón" + (.@coupons>1?" "+(.@i+1):"") + ": ^EE8800" + .@new_coupon$[.@i] + "^000000"; close; case 2: mes "[^FF7700Cupón Jack^000000]"; query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; .@total_codes = getarraysize(.@available_code$); if (!.@total_codes) mes "No hay códigos disponibles."; dispbottom "==============================="; dispbottom "Código | Objeto | Cantidad"; for(.@i = 0; .@i < .@total_codes; .@i++) { mes "--------------------------------"; mes "Objeto: " + getitemname(.@available_item[.@i]); mes "Cantidad: " + .@available_amount[.@i]; mes "Código: " + .@available_code$[.@i]; dispbottom .@available_code$[.@i] + " | " + getitemname(.@available_item[.@i]) + " | x" + .@available_amount[.@i]; } dispbottom "==============================="; close; case 3: break; case 4: mes "[^FF7700Cupón Jack^000000]"; mes "¡Que tenga un buen día!"; close; } } mes "[^FF7700Cupón Jack^000000]"; mes "Bienvenido al sistema de códigos de cupones. ¿En qué puedo ayudarte?"; mes " ", "También puedes usar el comando", "^0000FF@claim <código del cupón>^000000 desde cualquier parte del mundo."; next; switch(Select("Canjear cupón", "Cancelar")) { case 1: mes "[^FF7700Cupón Jack^000000]"; mes "Por favor, introduce tu código de cupón:"; input .@my_code$; clear; callsub S_Submit,.@my_code$; close; case 2: mes "[^FF7700Cupón Jack^000000]"; mes "¡Que tenga un buen día!"; close; } S_Submit: .@my_code$ = getarg(0); query_sql "SELECT `code`, `item_id`, `item_amount` FROM `coupons`", .@available_code$, .@available_item, .@available_amount; for (@i = 0; @i < getarraysize(.@available_code$); @i++) { if (strtoupper(.@my_code$) == strtoupper(.@available_code$[@i])) { if (checkweight(.@available_item[@i],.@available_amount[@i]) == 0) { if (getarg(1,0)) { message strcharinfo(0), "No tienes suficiente espacio en el inventario para reclamar este cupón."; end; } mes "[^FF7700Cupón Jack^000000]"; mes "No tienes suficiente espacio en el inventario para reclamar este cupón."; close; } query_sql "DELETE FROM `coupons` WHERE `code`='" + escape_sql(.@my_code$) + "'"; getitem .@available_item[@i],.@available_amount[@i]; if (getarg(1,0)) { message strcharinfo(0), "¡Cupón canjeado! Has recibido " + getitemname(.@available_item[@i]) + " - " + .@available_amount[@i] + " unidad(es).^000000"; end; } mes "[^FF7700Cupón Jack^000000]"; mes "Has recibido ^0000FF" + getitemname(.@available_item[@i]) + " - " + .@available_amount[@i] + " unidad(es).^000000"; close; } } if (getarg(1,0)) { message strcharinfo(0), "El cupón " + .@my_code$ + " no existe o ya fue canjeado."; end; } mes "[^FF7700Cupón Jack^000000]"; mes "Este código de cupón no existe o ya fue canjeado."; close; OnInit: query_sql "CREATE TABLE IF NOT EXISTS `coupons` (`code` TINYTEXT NOT NULL, `item_id` INT NOT NULL, `item_amount` INT NOT NULL, INDEX `code` (`code`(32)) ) ENGINE=MyISAM"; if (strnpcinfo(2) == "main") bindatcmd "claim",strnpcinfo(3)+"::OnAtcommand"; end; OnAtcommand: if (.@atcmd_parameters$[0] != "") callsub S_Submit,implode(.@atcmd_parameters$, " "),1; callsub S_Start; end; } //Uncomment to enable clickable NPC //prontera,146,173,5 duplicate(CouponNPC#main) Cupón Jack 807
    1 point
  31. Its because these two most recent Client versions are still encrypted, not unpacked. What your Anti-Virus software can't parse, it will sometimes mark as a dangerous file. Anyway, I recommend anyone using resources from this thread that were posted by @Skylove to use client version 2025-03-19 for now, it's the only the one posted that allows patches to be applied to it via WARP. The 2 most recent released clients ( 2025-05-08 and 2025-06-04) are not that too different from what 2025-03-19 functionally provides. This also goes without saying, for future clients that will be further released, exercise caution and patience.
    1 point
  32. Hello, this is a SRC edit and custom sprite of MVP monsters. It just uses the frame where they appear dead. This is actually a great idea adding a small tomb next to the MVP. Thanks for the suggestion!
    1 point
  33. I'm planning not to upload it because I don't want it to spread and end up with resellers. But yes, someday I’d like to sell it if someone is interested. My intention is to make them custom, tailored to all tastes — it could be one based on Bio Labs or Thor Volcano, for example. If you're interested in the project, feel free to message me on Discord!
    1 point
  34. Version 1.0.0

    46 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
    1 point
  35. That is because the client now uses bodystyle to display job sprites instead of job. Run a query script in your database table "char" to copy the job column into the body column. Before 2023 clients, bodystyle's only used up to value 1 for alternate costumes. Now they can be filled with whatever the job ID and the sprite will display that. Your previous chars were still using bodystyle 0 or 1 -- which are Sprite ID of Novice and Swordsman UPDATE `char` SET body = class; Run this in query.
    1 point
  36. does it read any files in the ragnarok folder? for example if there is a file added, GarudaHS automatically eliminates the file I'll try to save the page first, and I'll try it in the future. thanks for this GameGuard
    1 point
  37. latest revision of rathena give error at line 47.
    1 point
  38. BIG EDIT: If your client supports it (~2022+), just use data\luafiles514\lua files\mapskydata. I found out about this a bit too late, but better late than never. So, here's the basic concept of how to make RGB skyboxes that don't rely on hardcoded skyboxes. I don't see enough people talking about it, so I decided to bring the concept up, as I just did it for two of my custom maps. You can have flat 3D models ~200 units under the main map with a texture, tiled to form a large square, and they'll effectively work as a customizable skybox, going alongside with "clouds2" (or "clouds") mapflag. Pros: Can use any texture/color Can be animated (in theory) Customizable Can be used in any map Not hardcoded/doesn't need to replace any map or skybox Cons: Horizontal camera angles might expose black edges Minor effort editing the map to add the new models Tips: Works well with clouds2 mapflag greywolf/illusion water rsm models are a good base for this, if you don't know how to make a custom model. You will need to change the bottom square texture to be invisible (or the upper one to be opaque), and preferably hex the path to be a new texture so you don't have to replace their textures. Don't use Scale over 5 on the model size (e.g. in Browedit). The tiles will stop rendering properly in some angles if they're too big. Usually a 5x5 grid of 5 Scale models of retextured "ilusion" water at y=200 is enough and produces some of the best results. It's what was used on the images below: I intentionally exposed a small black corner on the image to show it. 90% of the time or if you lock the camera, you can't see the black corners, though.
    1 point
  39. Looking at your gravity-esc maps is always a pleasure. please continue to grow the world of RO for us with all those immersive maps. Can't wait to include them into my server!
    1 point
  40. Instead of the default tomb sprite appearing upon MVP death, this modification customizes each MVP to display their unique MVP dead sprite on their tomb. This enhancement adds a more immersive and personalized touch to the game experience. Features: Customized MVP tomb sprites for all MVPs. Enhanced visual appeal and immersion. Easy integration with your existing rAthena setup. I've spent considerable time choosing each dead MVP's tomb sprite accurately reflects their character and enhances the overall gameplay experience. This is small but impactful visual upgrade. Let me know your thoughts! I'm eager to hear feedback and any suggestions for further improvements. mvp tomb.mp4
    1 point
  41. It's been a while since my initial release of those descriptions, and a lot of things need to be changed. A few mistakes here and there, but also plenty of mechanics changed on rAthena whose descriptions need to match that. Yes, I'm looking at you, Enchant Deadly Poison. Let's not drag this too long, yeah? Here's some patch notes: Typos fixed on the following skills: Shield Chain, Cart Boost, Cart Termination, Watery Evasion/Suiton Updated Cart Boost to account for the new interaction between this skill and Please Don't Forget Me(it no longer cancels the effect) Weaponry Research: Includes information about the Hidden Bonus(battle.cpp, line 3269) Raid: The debuff only applies in Renewal Venom Splasher: The timer information was completely wrong. Corrected and now also includes cooldown, additional information added on comments Jupitel Thunder: Was missing any information regarding damage Explosion Spirits/Critical Explosion: Corrected information, the SP recovery is disabled, not halved Blitz Beat: Corrected damage on information, improved wording Head Crush: Corrected ambiguous information about bleeding Shield Boomerang: Information about damage calculation Shield Chain: Massively expanded on the information and comments, including comparisons between this skill and Shield Boomerang Dispel: Clarification on the fact that MDEF reducing the chance is a myth that never existed Land Mine: Damage information completely wrong, fixed now including Mercenary version Freezing Trap: Added information on damage and scaling Blast Mine: Damage informationm missing, durations wrong too, fixed now Claymore Trap: Damage information missing, fixed now Gravitation Field: Included information about the secret property of the skill, where damage ticks count as auto attacks Throw Zeny: Accurate information about reduction versus players and bosses Final Strike: Added a a note, pointing out that Hercules uses a stronger formula for the skill Grand Cross: Greatly improved description Throw Kunai: Changed to reflect changes on rAthena(no longer misses, pseudo elemental) Throw Shuriken: Same as above(even more nerfed than kunais, why did you guys ever do this?) Steal: Massively improved description with more information and insight on High DEX/Low DEX Envenom: Improved damage descriptions Left/Right Hand Mastery: Recent information about the skill's inner workings Enchant Deadly Poison: Updated to the latest details of the skill, post the recent rework Next update I'll include the monster skills that were requested. I'd also like to expand upon this by adding quick reference pages in-game, containing information such as Status Effects, monster skills, etc. I updated the first post to have the latest version, but I'll leave it here as well just in case. skilldescript.lub
    1 point
  42. case MO_BODYRELOCATION: if(sc && (sc->getSCE(SC_SPIDERWEB) || sc->getSCE(SC_ANKLE))) break; if (unit_movepos(src, x, y, 2, 1)) { Hello. Solved it! Thanks @pajodex @Katakuri
    1 point
  43. - script Samepl -1,{ OnInit: bindatcmd "test",strnpcinfo(3) + "::OnAtcommand"; end; OnAtcommand: if (getmapusers(.@atcmd_parameters$[0]) != -1) { message strcharinfo(0), "Map not found."; } else if (getmapflag(.@atcmd_parameters$[0], MF_NOWARPTO) && getgmlevel() < 99) { message strcharinfo(0), "You are not authorized to warp to this map."; } else if (getmapflag(.@atcmd_parameters$[0], MF_NOWARP) && getgmlevel() < 99) { message strcharinfo(0), "You are not authorized to warp from your current map."; } else { message strcharinfo(0), "Warped to " + .@atcmd_parameters$[0]; warp .@atcmd_parameters$[0], 0, 0; } end; } just add the mapflag MF_NOWARPTO to any map that you want prevent player to warp into those maps. or change the warp atcommand to enforce random warp https://github.com/rathena/rathena/blob/master/src/map/atcommand.cpp#L600 mapindex = mapindex_name2idx(map_name, nullptr); x = 0; y = 0;
    1 point
  44. Heya, The issue is from your char-server. "intif" is for "interserver" and "interface", intif_parse_StorageReceived (which is for all storages, including inventory, etc) is a packet the char-server sends to the map-server, type 3 is TABLE_STORAGE. Long story short, it means it failed to load the storage data for your character. The char-server logs should give you more information about the issue, though. The... fact that you aren't seeing more information is strange. It's not an invalid storage index as you'd get an error such as "Invalid storage with id #". So this only leaves an invalid SQL query. Your storage table doesn't seem to match what the char-server is expecting. Make sure your storage table matches with what rAthena is using. You should have received an SQL error, though.
    1 point
  45. A mysterious frozen lake in the midst of forests and mountains in the sunshine. .•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•.•°'°•. ice2xlake Please rate it if the map is good enough ~~ This map can be downloaded here https://rathena.org/board/files/file/4487-w0w_map_collection/
    1 point
  46. - ID: 240500 Group: "AG_GET_ITEM" Name: "Jogador BETA" Condition: " ARG0 >= 3000000 " Reward: TitleID: 1035 Score: 30 [240500] = { UI_Type = 0, group = "GET_ITEM", major = 1, minor = 2, title = "Jogador BETA", content = { summary = "Seja BETA", details = "Teste o servidor em sua segunda fase.", }, resource = { [1] = { text = "Dado aos Jogadores que ajudaram o servidor em sua fase BETA. Obrigado!" } }, reward = { title = 1035 }, score = 30, } [1035] = "BETA" friend, I have no idea what version of rAthena you are using, or what date you are using, but I just got the same lines as the one you sent in the above Quote and works perfectly as you can see. Edit: In your 'achievement_db' file, the 'Reward:' and 'TitleID: ID'
    1 point
  47. Version 1.0

    3115 downloads

    DISCLAIMER: I DO NOT TAKE ANY CREDIT ON THIS. I AM MERELY BACKING UP HER FREE WORKS TO PRESERVE THEM. Note: The preview screenshot only contains 2 of the maps provided in this package, not all of them. Original Author: Najara This is a collection of town maps already released for free in eAthena from a great mapper known as Najara. I'm uploading her package of maps to preserve them so we can still use them when her original links expire. This package contains every one the of maps provided by him based on free releases ONLY. The package you receive is AS IS. I will not provide support on it. So if you're missing mini-maps and what not, you can make them yourself using BrowEdit and a little bit of MS-Paint. The following maps this package contains is: Crystilia Welgaia Flaris Jazeera Altzibar Lunette
    Free
    1 point
  48. the ROLSG is a simple tool yet effective when you don't have an internet connection. Probably when you're editing on offline or no connection. So +1 to this.
    1 point
  49. its in the GRF file and for pservers that is up how about the newbie that dont know how to use GRF? im here to help the newbie and these is a tool/app that is easy to use
    1 point
×
×
  • Create New...